libtorrent-rasterbar-2.0.5/0000775000175000017500000000000014152763504014672 5ustar arvidarvidlibtorrent-rasterbar-2.0.5/docs/0000755000175000017500000000000014152763504015620 5ustar arvidarvidlibtorrent-rasterbar-2.0.5/docs/stats_counters.rst0000664000175000017500000016777514152763504021463 0ustar arvidarvid.. _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.boost_connection_attempts: .. _peer.missed_connection_attempts: .. _peer.no_peer_connection_attempts: .. _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.boost_connection_attempts | counter | +----------------------------------+---------+ | peer.missed_connection_attempts | counter | +----------------------------------+---------+ | peer.no_peer_connection_attempts | 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 | gauge | +---------------------------------------+-------+ | peer.num_socks5_peers | gauge | +---------------------------------------+-------+ | peer.num_http_proxy_peers | gauge | +---------------------------------------+-------+ | peer.num_utp_peers | gauge | +---------------------------------------+-------+ | peer.num_i2p_peers | gauge | +---------------------------------------+-------+ | peer.num_ssl_peers | gauge | +---------------------------------------+-------+ | peer.num_ssl_socks5_peers | gauge | +---------------------------------------+-------+ | peer.num_ssl_http_proxy_peers | gauge | +---------------------------------------+-------+ | peer.num_ssl_utp_peers | gauge | +---------------------------------------+-------+ | peer.num_peers_half_open | gauge | +---------------------------------------+-------+ | peer.num_peers_connected | gauge | +---------------------------------------+-------+ | peer.num_peers_up_interested | gauge | +---------------------------------------+-------+ | peer.num_peers_down_interested | gauge | +---------------------------------------+-------+ | peer.num_peers_up_unchoked_all | gauge | +---------------------------------------+-------+ | peer.num_peers_up_unchoked_optimistic | gauge | +---------------------------------------+-------+ | peer.num_peers_up_unchoked | gauge | +---------------------------------------+-------+ | peer.num_peers_down_unchoked | gauge | +---------------------------------------+-------+ | peer.num_peers_up_requests | gauge | +---------------------------------------+-------+ | peer.num_peers_down_requests | gauge | +---------------------------------------+-------+ | peer.num_peers_end_game | gauge | +---------------------------------------+-------+ | peer.num_peers_up_disk | gauge | +---------------------------------------+-------+ | peer.num_peers_down_disk | gauge | +---------------------------------------+-------+ the number of peer connections for each kind of socket. ``num_peers_half_open`` counts half-open (connecting) peers, no other count includes those 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 | gauge | +------------------------+-------+ | net.limiter_down_queue | gauge | +------------------------+-------+ the number of sockets currently waiting for upload and download bandwidth from the rate limiter. .. _net.limiter_up_bytes: .. _net.limiter_down_bytes: .. raw:: html +------------------------+-------+ | name | type | +========================+=======+ | net.limiter_up_bytes | gauge | +------------------------+-------+ | net.limiter_down_bytes | gauge | +------------------------+-------+ 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 | gauge | +------------------------------+-------+ 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 | gauge | +----------------------------------+-------+ | ses.num_stopped_torrents | gauge | +----------------------------------+-------+ | ses.num_upload_only_torrents | gauge | +----------------------------------+-------+ | ses.num_downloading_torrents | gauge | +----------------------------------+-------+ | ses.num_seeding_torrents | gauge | +----------------------------------+-------+ | ses.num_queued_seeding_torrents | gauge | +----------------------------------+-------+ | ses.num_queued_download_torrents | gauge | +----------------------------------+-------+ | ses.num_error_torrents | gauge | +----------------------------------+-------+ 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 | gauge | +-------------------------+-------+ the number of torrents that don't have the IP filter applied to them. .. _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.num_unchoke_slots: .. raw:: html +-----------------------+-------+ | name | type | +=======================+=======+ | ses.num_unchoke_slots | gauge | +-----------------------+-------+ the number of allowed unchoked peers .. _ses.num_outstanding_accept: .. raw:: html +----------------------------+-------+ | name | type | +============================+=======+ | ses.num_outstanding_accept | gauge | +----------------------------+-------+ the number of listen sockets that are currently accepting incoming connections .. _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: .. _ses.num_outgoing_hash_request: .. _ses.num_outgoing_hashes: .. _ses.num_outgoing_hash_reject: .. 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 | +---------------------------------+---------+ | ses.num_outgoing_hash_request | counter | +---------------------------------+---------+ | ses.num_outgoing_hashes | counter | +---------------------------------+---------+ | ses.num_outgoing_hash_reject | 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: .. 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 | +---------------------------------------+---------+ This breaks down the piece picks into the event that triggered it .. _disk.request_latency: .. _disk.disk_blocks_in_use: .. raw:: html +-------------------------+-------+ | name | type | +=========================+=======+ | disk.request_latency | gauge | +-------------------------+-------+ | disk.disk_blocks_in_use | gauge | +-------------------------+-------+ 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_disk_jobs: .. _disk.num_running_disk_jobs: .. _disk.num_read_jobs: .. _disk.num_write_jobs: .. _disk.num_jobs: .. _disk.blocked_disk_jobs: .. _disk.num_writing_threads: .. _disk.num_running_threads: .. raw:: html +----------------------------+-------+ | name | type | +============================+=======+ | disk.queued_disk_jobs | gauge | +----------------------------+-------+ | disk.num_running_disk_jobs | gauge | +----------------------------+-------+ | disk.num_read_jobs | gauge | +----------------------------+-------+ | disk.num_write_jobs | gauge | +----------------------------+-------+ | disk.num_jobs | gauge | +----------------------------+-------+ | disk.blocked_disk_jobs | gauge | +----------------------------+-------+ | disk.num_writing_threads | gauge | +----------------------------+-------+ | disk.num_running_threads | gauge | +----------------------------+-------+ ``queued_disk_jobs`` is the number of disk jobs currently queued, waiting to be executed by a disk thread. .. _disk.queued_write_bytes: .. raw:: html +-------------------------+-------+ | name | type | +=========================+=======+ | disk.queued_write_bytes | gauge | +-------------------------+-------+ 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. ``num_blocks_written`` and ``num_blocks_read`` .. _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_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_flush_piece: .. _disk.num_fenced_flush_hashed: .. _disk.num_fenced_flush_storage: .. _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 | gauge | +----------------------------------+-------+ | disk.num_fenced_write | gauge | +----------------------------------+-------+ | disk.num_fenced_hash | gauge | +----------------------------------+-------+ | disk.num_fenced_move_storage | gauge | +----------------------------------+-------+ | disk.num_fenced_release_files | gauge | +----------------------------------+-------+ | disk.num_fenced_delete_files | gauge | +----------------------------------+-------+ | disk.num_fenced_check_fastresume | gauge | +----------------------------------+-------+ | disk.num_fenced_save_resume_data | gauge | +----------------------------------+-------+ | disk.num_fenced_rename_file | gauge | +----------------------------------+-------+ | disk.num_fenced_stop_torrent | gauge | +----------------------------------+-------+ | disk.num_fenced_flush_piece | gauge | +----------------------------------+-------+ | disk.num_fenced_flush_hashed | gauge | +----------------------------------+-------+ | disk.num_fenced_flush_storage | gauge | +----------------------------------+-------+ | disk.num_fenced_file_priority | gauge | +----------------------------------+-------+ | disk.num_fenced_load_torrent | gauge | +----------------------------------+-------+ | disk.num_fenced_clear_piece | gauge | +----------------------------------+-------+ | disk.num_fenced_tick_storage | gauge | +----------------------------------+-------+ 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 | gauge | +---------------+-------+ The number of nodes in the DHT routing table .. _dht.dht_node_cache: .. raw:: html +--------------------+-------+ | name | type | +====================+=======+ | dht.dht_node_cache | gauge | +--------------------+-------+ The number of replacement nodes in the DHT routing table .. _dht.dht_torrents: .. raw:: html +------------------+-------+ | name | type | +==================+=======+ | dht.dht_torrents | gauge | +------------------+-------+ the number of torrents currently tracked by our DHT node .. _dht.dht_peers: .. raw:: html +---------------+-------+ | name | type | +===============+=======+ | dht.dht_peers | gauge | +---------------+-------+ the number of peers currently tracked by our DHT node .. _dht.dht_immutable_data: .. raw:: html +------------------------+-------+ | name | type | +========================+=======+ | dht.dht_immutable_data | gauge | +------------------------+-------+ the number of immutable data items tracked by our DHT node .. _dht.dht_mutable_data: .. raw:: html +----------------------+-------+ | name | type | +======================+=======+ | dht.dht_mutable_data | gauge | +----------------------+-------+ the number of mutable data items tracked by our DHT node .. _dht.dht_allocated_observers: .. raw:: html +-----------------------------+-------+ | name | type | +=============================+=======+ | dht.dht_allocated_observers | gauge | +-----------------------------+-------+ 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_in_dropped: .. raw:: html +-----------------------------+---------+ | name | type | +=============================+=========+ | dht.dht_messages_in_dropped | counter | +-----------------------------+---------+ the number of incoming DHT requests that were dropped. There are a few different reasons why incoming DHT packets may be dropped: 1. there wasn't enough send quota to respond to them. 2. the Denial of service logic kicked in, blocking the peer 3. ignore_dark_internet is enabled, and the packet came from a non-public IP address 4. the bencoding of the message was invalid .. _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: .. _dht.dht_sample_infohashes_in: .. _dht.dht_sample_infohashes_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 | +-------------------------------+---------+ | dht.dht_sample_infohashes_in | counter | +-------------------------------+---------+ | dht.dht_sample_infohashes_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_find_node: .. _dht.dht_invalid_put: .. _dht.dht_invalid_get: .. _dht.dht_invalid_sample_infohashes: .. raw:: html +-----------------------------------+---------+ | name | type | +===================================+=========+ | dht.dht_invalid_announce | counter | +-----------------------------------+---------+ | dht.dht_invalid_get_peers | counter | +-----------------------------------+---------+ | dht.dht_invalid_find_node | counter | +-----------------------------------+---------+ | dht.dht_invalid_put | counter | +-----------------------------------+---------+ | dht.dht_invalid_get | counter | +-----------------------------------+---------+ | dht.dht_invalid_sample_infohashes | counter | +-----------------------------------+---------+ the number of failed incoming DHT requests by kind of request .. _utp.utp_packet_loss: .. raw:: html +---------------------+---------+ | name | type | +=====================+=========+ | utp.utp_packet_loss | counter | +---------------------+---------+ The number of times a lost packet has been interpreted as congestion, cutting the congestion window in half. Some lost packets are not interpreted as congestion, notably MTU-probes .. _utp.utp_timeout: .. raw:: html +-----------------+---------+ | name | type | +=================+=========+ | utp.utp_timeout | counter | +-----------------+---------+ The number of timeouts experienced. This is when a connection doesn't hear back from the other end within a sliding average RTT + 2 average deviations from the mean (approximately). The actual time out is configurable and also depends on the state of the socket. .. _utp.utp_packets_in: .. _utp.utp_packets_out: .. raw:: html +---------------------+---------+ | name | type | +=====================+=========+ | utp.utp_packets_in | counter | +---------------------+---------+ | utp.utp_packets_out | counter | +---------------------+---------+ The total number of packets sent and received .. _utp.utp_fast_retransmit: .. raw:: html +-------------------------+---------+ | name | type | +=========================+=========+ | utp.utp_fast_retransmit | counter | +-------------------------+---------+ The number of packets lost but re-sent by the fast-retransmit logic. This logic is triggered after 3 duplicate ACKs. .. _utp.utp_packet_resend: .. raw:: html +-----------------------+---------+ | name | type | +=======================+=========+ | utp.utp_packet_resend | counter | +-----------------------+---------+ The number of packets that were re-sent, for whatever reason .. _utp.utp_samples_above_target: .. _utp.utp_samples_below_target: .. raw:: html +------------------------------+---------+ | name | type | +==============================+=========+ | utp.utp_samples_above_target | counter | +------------------------------+---------+ | utp.utp_samples_below_target | counter | +------------------------------+---------+ The number of incoming packets where the delay samples were above and below the delay target, respectively. The delay target is configurable and is a parameter to the LEDBAT congestion control. .. _utp.utp_payload_pkts_in: .. _utp.utp_payload_pkts_out: .. raw:: html +--------------------------+---------+ | name | type | +==========================+=========+ | utp.utp_payload_pkts_in | counter | +--------------------------+---------+ | utp.utp_payload_pkts_out | counter | +--------------------------+---------+ The total number of packets carrying payload received and sent, respectively. .. _utp.utp_invalid_pkts_in: .. raw:: html +-------------------------+---------+ | name | type | +=========================+=========+ | utp.utp_invalid_pkts_in | counter | +-------------------------+---------+ The number of packets received that are not valid uTP packets (but were sufficiently similar to not be treated as DHT or UDP tracker packets). .. _utp.utp_redundant_pkts_in: .. raw:: html +---------------------------+---------+ | name | type | +===========================+=========+ | utp.utp_redundant_pkts_in | counter | +---------------------------+---------+ The number of duplicate payload packets received. This may happen if the outgoing ACK is lost. .. _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 | gauge | +------------------------+-------+ | utp.num_utp_syn_sent | gauge | +------------------------+-------+ | utp.num_utp_connected | gauge | +------------------------+-------+ | utp.num_utp_fin_sent | gauge | +------------------------+-------+ | utp.num_utp_close_wait | gauge | +------------------------+-------+ | utp.num_utp_deleted | gauge | +------------------------+-------+ 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 .. _tracker.num_queued_tracker_announces: .. raw:: html +--------------------------------------+-------+ | name | type | +======================================+=======+ | tracker.num_queued_tracker_announces | gauge | +--------------------------------------+-------+ if the outstanding tracker announce limit is reached, tracker announces are queued, to be issued when an announce slot opens up. this measure the number of tracker announces currently in the queue libtorrent-rasterbar-2.0.5/docs/index.rst0000664000175000017500000001326114152763504017466 0ustar arvidarvid.. raw:: html
Getting started * download_ * building_ * tutorial_ * overview_ * examples_ * features_ -------- Documentation * reference_ * `blog`_ * `upgrade to 2.0`_ * `upgrade to 1.2`_ * contributing_ * troubleshooting_ * tuning_ * fuzzing_ * `security audit (2020)`_ * `projects using libtorrent`_ -------- Contact * `mailing list`_ (archive_) * `report bugs`_ * `github page`_ -------- Extensions * uTP_ * `extensions protocol`_ * `libtorrent plugins`_ * `streaming`_ * `DHT extensions`_ * `DHT security extension`_ * `DHT store extension`_ * `UDP tracker protocol`_ * `HTTP seed`_ * multi-tracker_ -------- Bindings * python_ * Java_ * golang_ * node_ -------- * `Introduction, slides`_ .. raw:: html
.. _download: https://github.com/arvidn/libtorrent/releases .. _features: features-ref.html .. _tutorial: tutorial-ref.html .. _contributing: contributing.html .. _building: building.html .. _examples: examples.html .. _overview: manual-ref.html .. _reference: reference.html .. _`upgrade to 2.0`: upgrade_to_2.0-ref.html .. _`upgrade to 1.2`: upgrade_to_1.2-ref.html .. _troubleshooting: troubleshooting.html .. _tuning: tuning-ref.html .. _fuzzing: fuzzing.html .. _`security audit (2020)`: security-audit.html .. _uTP: utp.html .. _`extensions protocol`: extension_protocol.html .. _`libtorrent plugins`: reference-Plugins.html .. _`streaming`: streaming.html .. _`DHT extensions`: dht_extensions.html .. _`DHT security extension`: dht_sec.html .. _`DHT store extension`: dht_store.html .. _`UDP tracker protocol`: udp_tracker_protocol.html .. _`HTTP seed`: http://www.getright.com/seedtorrent.html .. _multi-tracker: https://www.bittorrent.org/beps/bep_0012.html .. _mailing list: https://lists.sourceforge.net/lists/listinfo/libtorrent-discuss .. _archive: https://sourceforge.net/p/libtorrent/mailman/libtorrent-discuss/ .. _`projects using libtorrent`: projects.html .. _`report bugs`: https://github.com/arvidn/libtorrent/issues .. _`github page`: https://github.com/arvidn/libtorrent .. _blog: https://blog.libtorrent.org .. _Java: https://github.com/frostwire/frostwire-jlibtorrent/ .. _python: python_binding.html .. _golang: https://github.com/steeve/libtorrent-go .. _node: https://github.com/fanatid/node-libtorrent .. _`Introduction, slides`: bittorrent.pdf 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. __ client_test.html .. image:: img/screenshot_thumb.png :target: client_test.html :alt: screenshot of libtorrent's client_test :class: front-page-screenshot :width: 400 :height: 239 The main goals of libtorrent are: * to be CPU efficient * to be memory efficient * to be very easy to use getting started =============== The tutorial_ is an introduction to using libtorrent (C++). Also see the `reference documentation`_. .. _`reference documentation`: reference.html .. raw:: html
bitcoin address for libtorrent donations contribute ========== If your organization uses libtorrent, please consider supporting its development. See the contributing_ page for other ways to help out. .. raw:: html
bitcoin:373ZDeQgQSQNuxdinNAPnQ63CRNn4iEXzg
support ======= Please direct questions to the `mailing list`__, general libtorrent discussion. __ https://lists.sourceforge.net/lists/listinfo/libtorrent-discuss You can usually find me as hydri in ``#libtorrent`` on ``irc.freenode.net``. license ======= libtorrent is released under the BSD-license_. .. _BSD-license: https://opensource.org/licenses/bsd-license.php 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`_. .. _`bug tracker`: https://github.com/arvidn/libtorrent/issues acknowledgements ================ Written by Arvid Norberg. Copyright |copy| 2003-2018 Contributions by Steven Siloti, Alden Torres, Magnus Jonsson, Daniel Wallin and Cory Nelson Thanks to Reimond Retz for bug fixes, suggestions and testing See github__ for full list of contributors. __ https://github.com/arvidn/libtorrent/graphs/contributors Thanks to `Umeå University`__ for providing development and test hardware. __ http://www.cs.umu.se Project is hosted by github__. __ https://www.github.com/arvidn/libtorrent .. |copy| unicode:: 0xA9 .. copyright sign .. raw:: html
libtorrent-rasterbar-2.0.5/docs/reference-Bencoding.html0000664000175000017500000005732014152763504022343 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

Bencoding is a common representation in bittorrent used for dictionary, list, int and string hierarchies. It's used to encode .torrent files and some messages in the network protocol. libtorrent also uses it to store settings, resume data and other session state.

Strings in bencoded structures do not necessarily represent text. Strings are raw byte buffers of a certain length. If a string is meant to be interpreted as text, it is required to be UTF-8 encoded. See BEP 3.

The function for decoding bencoded data bdecode(), returning a bdecode_node. This function builds a tree that points back into the original buffer. The returned bdecode_node will not be valid once the buffer it was parsed out of is discarded.

It's possible to construct an entry from a bdecode_node, if a structure needs to be altered and re-encoded.

[report issue]

entry

Declared in "libtorrent/entry.hpp"

The entry class represents one node in a bencoded hierarchy. It works as a variant type, it can be either a list, a dictionary (std::map), an integer or a string.

class entry
{
   data_type type () const;
   entry (list_type);
   entry (span<char const>);
   entry (dictionary_type);
   entry (preformatted_type);
   entry (integer_type);
   entry (U v);
   entry (data_type t);
   entry (bdecode_node const& n);
   entry& operator= (dictionary_type) &;
   entry& operator= (span<char const>) &;
   entry& operator= (list_type) &;
   entry& operator= (integer_type) &;
   entry& operator= (entry const&) &;
   entry& operator= (bdecode_node const&) &;
   entry& operator= (entry&&) & noexcept;
   entry& operator= (preformatted_type) &;
   entry& operator= (U v) &;
   integer_type const& integer () const;
   integer_type& integer ();
   string_type const& string () const;
   preformatted_type& preformatted ();
   list_type& list ();
   preformatted_type const& preformatted () const;
   dictionary_type const& dict () const;
   string_type& string ();
   dictionary_type& dict ();
   list_type const& list () const;
   void swap (entry& e);
   entry& operator[] (string_view key);
   entry const& operator[] (string_view key) const;
   entry* find_key (string_view key);
   entry const* find_key (string_view key) const;
   std::string to_string (bool single_line = false) const;

   enum data_type
   {
      int_t,
      string_t,
      list_t,
      dictionary_t,
      undefined_t,
      preformatted_t,
   };
};
[report issue]

type()

data_type type () const;

returns the concrete type of the entry

[report issue]

entry()

entry (list_type);
entry (span<char const>);
entry (dictionary_type);
entry (preformatted_type);
entry (integer_type);

constructors directly from a specific type. The content of the argument is copied into the newly constructed entry

[report issue]

entry()

entry (data_type t);

construct an empty entry of the specified type. see data_type enum.

[report issue]

entry()

entry (bdecode_node const& n);

construct from bdecode_node parsed form (see bdecode())

[report issue]

operator=()

entry& operator= (dictionary_type) &;
entry& operator= (span<char const>) &;
entry& operator= (list_type) &;
entry& operator= (integer_type) &;
entry& operator= (entry const&) &;
entry& operator= (bdecode_node const&) &;
entry& operator= (entry&&) & noexcept;
entry& operator= (preformatted_type) &;

copies the structure of the right hand side into this entry.

[report issue]

integer() string() list() dict() preformatted()

integer_type const& integer () const;
integer_type& integer ();
string_type const& string () const;
preformatted_type& preformatted ();
list_type& list ();
preformatted_type const& preformatted () const;
dictionary_type const& dict () const;
string_type& string ();
dictionary_type& dict ();
list_type const& list () const;

The integer(), string(), list() and dict() functions are accessors that return the respective type. If the entry object isn't of the type you request, the accessor will throw system_error. You can ask an entry for its type through the type() function.

If you want to create an entry you give it the type you want it to have in its constructor, and then use one of the non-const accessors to get a reference which you then can assign the value you want it to have.

The typical code to get info from a torrent file will then look like this:

entry torrent_file;
// ...

// throws if this is not a dictionary
entry::dictionary_type const& dict = torrent_file.dict();
entry::dictionary_type::const_iterator i;
i = dict.find("announce");
if (i != dict.end())
{
        std::string tracker_url = i->second.string();
        std::cout << tracker_url << "\n";
}

The following code is equivalent, but a little bit shorter:

entry torrent_file;
// ...

// throws if this is not a dictionary
if (entry* i = torrent_file.find_key("announce"))
{
        std::string tracker_url = i->string();
        std::cout << tracker_url << "\n";
}

To make it easier to extract information from a torrent file, the class torrent_info exists.

[report issue]

swap()

void swap (entry& e);

swaps the content of this with e.

[report issue]

operator[]()

entry& operator[] (string_view key);
entry const& operator[] (string_view key) const;

All of these functions requires the entry to be a dictionary, if it isn't they will throw system_error.

The non-const versions of the operator[] will return a reference to either the existing element at the given key or, if there is no element with the given key, a reference to a newly inserted element at that key.

The const version of operator[] will only return a reference to an existing element at the given key. If the key is not found, it will throw system_error.

[report issue]

find_key()

entry* find_key (string_view key);
entry const* find_key (string_view key) const;

These functions requires the entry to be a dictionary, if it isn't they will throw system_error.

They will look for an element at the given key in the dictionary, if the element cannot be found, they will return nullptr. If an element with the given key is found, the return a pointer to it.

[report issue]

to_string()

std::string to_string (bool single_line = false) const;

returns a pretty-printed string representation of the bencoded structure, with JSON-style syntax

[report issue]

enum data_type

Declared in "libtorrent/entry.hpp"

name value description
int_t 0  
string_t 1  
list_t 2  
dictionary_t 3  
undefined_t 4  
preformatted_t 5  
[report issue]

bencode()

Declared in "libtorrent/bencode.hpp"

template<class OutIt> int bencode (OutIt out, const entry& e);

This function will encode data to bencoded form.

The entry class is the internal representation of the bencoded data and it can be used to retrieve information, an entry can also be build by the program and given to bencode() to encode it into the OutIt iterator.

OutIt is an OutputIterator. It's a template and usually instantiated as ostream_iterator or back_insert_iterator. This function assumes the value_type of the iterator is a char. In order to encode entry e into a buffer, do:

std::vector<char> buffer;
bencode(std::back_inserter(buf), e);
[report issue]

operator<<()

Declared in "libtorrent/entry.hpp"

inline std::ostream& operator<< (std::ostream& os, const entry& e);

prints the bencoded structure to the ostream as a JSON-style structure.

libtorrent-rasterbar-2.0.5/docs/python_binding.rst0000664000175000017500000002105214152763504021367 0ustar arvidarvid========================= libtorrent python binding ========================= .. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none building ======== libtorrent can be built as a python module. The best way to build the python bindings is using ``setup.py``. This invokes ``b2`` under the hood, so you must have all of libtorrent's build dependencies installed. If you just want to build the shared library python extension without python packaging semantics, you can also invoke ``b2`` directly. prerequisites ============= Whether building with ``setup.py`` or directly invoking ``b2``, you must install the build prerequisites on your system: 1. All `the build prerequisites for the main libtorrent library`__, including boost libraries and ``b2``, and your building toolchain (``gcc``, visual studio, etc). 2. Boost.Python, if not otherwise included in your boost installation 3. Python 3.6+. Older versions may work, but are not tested. .. __: building.html environment variables --------------------- ``b2`` is very sensitive to environment variables. At least the following are required: 1. ``BOOST_ROOT`` 2. ``BOOST_BUILD_PATH`` ``b2`` is also known to reference dozens of other environment variables when detecting toolsets. Keep this in mind if you are building in an isolation environment like ``tox``. building with setup.py ====================== By default, ``setup.py`` will invoke ``b2`` to build libtorrent:: python setup.py build ``setup.py`` is a normal ``distutils``-based setup script. To install into your python environment:: python setup.py install To build a binary wheel package:: python -m pip install wheel python setup.py bdist_wheel build for a different python version ------------------------------------ ``setup.py`` will target the running interpreter. To build for different python versions, you must change how you invoke ``setup.py``:: # build for python3.6 python3.6 setup.py build # build for python3.7 python3.7 setup.py build customizing the build --------------------- You can customize the build by passing options to the ``build_ext`` step of ``setup.py`` by passing arguments directly to ``b2`` via ``--b2-args=``:: python setup.py build_ext --b2-args="toolset=msvc-14.2 linkflags=-L../../src/.libs" For a full list of ``b2`` build options, see `libtorrent build features`_. .. _`libtorrent build features`: building.html#build-features Here, it's important to note that ``build_ext`` has no "memory" of the build config and arguments you passed to it before. This is *different* from the way ``distutils`` normally works. Consider:: python setup.py build_ext --b2-args="optimization=space" # the following will build with DEFAULT optimization python setup.py install In order to customize the build *and* run other steps like installation, you should run the steps inline with ``build_ext``:: python setup.py build_ext --b2-args="optimization=space" install building with b2 ================ You will need to update your ``user-config.jam`` so ``b2`` can find your python installation. ``b2`` has some auto-detection capabilities. You may be able to do just this:: using python : 3.6 ; However you may need to specify full paths. On windows, it make look like this:: using python : 3.6 : C:/Users//AppData/Local/Programs/Python/Python36 : C:/Users//AppData/Local/Programs/Python/Python36/include : C:/Users//AppData/Local/Programs/Python/Python36/libs ; Or on Linux, like this:: using python : 3.6 : /usr/bin/python3.6 : /usr/include/python3.6 : /usr/lib/python3.6 ; Note that ``b2``'s python path detection is known to only work for global python installations. It is known to be broken for virtualenvs or ``pyenv``. If you are using ``pyenv`` to manage your python versions, you must specify full include and library paths yourself. invoking b2 ----------- Build the bindings like so:: cd bindings/python b2 release python=3.6 address-model=64 Note that ``address-model`` should match the python installation you are building for. For other build features, see `libtorrent build options`_. .. _`libtorrent build options`: building.html#build-features static linking -------------- A python module is a shared library. Specifying ``link=static`` when building the binding won't work, as it would try to produce a static library. Instead, control whether the libtorrent main library or boost is linked statically with ``libtorrent-link=static`` and ``boost-link=static`` respectively. By default both are built and linked as shared libraries. Building and linking boost as static library is only possibly by building it from source. Specify the ``BOOST_ROOT`` environment variable to point to the root directory of the boost source distribution. For example, to build a self-contained python module:: b2 release python=3.6 libtorrent-link=static boost-link=static helper targets -------------- There are some targets for placing the build artifact in a helpful location:: $ b2 release python=3.6 stage_module stage_dependencies This will produce a ``libtorrent`` python module in the current directory (file name extension depends on operating system). The libraries the python module depends on will be copied into ``./dependencies``. To install the python module, build it with the following command:: b2 release python=3.6 install_module By default the module will be installed to the python user site. This can be changed with the ``python-install-scope`` feature. The valid values are ``user`` (default) and ``system``. e.g.:: b2 release python=3.6 install_module python-install-scope=system To specify a custom installation path for the python module, specify the desired path with the ``python-install-path`` feature. e.g.:: b2 release python=3.6 install_module python-install-path=/home/foobar/python-site/ 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. lt::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::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. To get a python dictionary of the settings, call ``session::get_settings``. .. _`library reference`: reference.html Retrieving session statistics in Python is more convenient than that in C++. The statistics are stored as an array in ``session_stats_alert``, which will be posted after calling ``post_session_stats()`` in the ``session`` object. In order to interpret the statistics array, in C++ it is required to call ``session_stats_metrics()`` to get the indices of these metrics, while in Python it can be done using ``session_stats_alert.values["NAME_OF_METRIC"]``, where ``NAME_OF_METRIC`` is the name of a metric. set_alert_notify ================ The ``set_alert_notify()`` function is not compatible with python. Since it requires locking the GIL from within the libtorrent thread, to call the callback, it can cause a deadlock with the main thread. Instead, use the python-specific ``set_alert_fd()`` which takes a file descriptor that will have 1 byte written to it to notify the client that there are new alerts to be popped. The file descriptor should be set to non-blocking mode. If writing to the file/sending to the socket blocks, libtorrent's internal thread will stall. This can be used with ``socket.socketpair()``, for example. The file descriptor is what ``fileno()`` returns on a socket. Example ======= 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: .. include:: ../bindings/python/simple_client.py :code: python :tab-width: 2 :start-after: from __future__ import print_function libtorrent-rasterbar-2.0.5/docs/dht_extensions.rst0000664000175000017500000000461014152763504021413 0ustar arvidarvidMainline DHT extensions ======================= .. include:: header.rst 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 a lot 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: +---------------+--------+ | uTorrent | ``UT`` | +---------------+--------+ | libtorrent | ``LT`` | +---------------+--------+ | MooPolice | ``MP`` | +---------------+--------+ | GetRight | ``GR`` | +---------------+--------+ IPv6 support ------------ **This extension is superseded by** `BEP 32`_. .. _`BEP 32`: https://www.bittorrent.org/beps/bep_0032.html 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. libtorrent-rasterbar-2.0.5/docs/troubleshooting.rst0000664000175000017500000000112514152763504021602 0ustar arvidarvid================= libtorrent manual ================= .. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none The following troubleshooting chart may help in finding out why torrents fail to download. It is not complete, please submit suggestions via pull requests at https://github.com/arvidn/libtorrent or to the `mailing list`_. Ideally in the form of patches against ``docs/troubleshooting.dot``. .. _`mailing list`: https://lists.sourceforge.net/lists/listinfo/libtorrent-discuss .. image:: img/troubleshooting_thumb.png :target: img/troubleshooting.png libtorrent-rasterbar-2.0.5/docs/features-ref.html0000664000175000017500000005467714152763504021123 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

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.

BitTorrent v2 is supported as of libtorrent 2.0. This replaces the previous merkle hash tree extension.

features

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

BitTorrent v2

Starting with version 2.0, libtorrent supports BitTorrent V2 (as specified in BEP 52). BitTorrent V2 introduces a new format for .torrent files, which generally has a smaller info-dict than the original format. The .torrent files still contain piece hashes by default, but they can also be downloaded from peers.

  1. Files are organized in a directory structure, instead of listing full paths. Torrents that have a lot of files in deep directory structures will use a lot less space to represent that structure in a v2 torrent.
  2. Piece hashes are organized in a merkle hash trees per file, and only the roots of the trees are included in the .torrent file. The actual hashes are delivered by peers.

The hash tree allows validating payload received from a peer immediately, down to 16 kiB blocks. In the original bittorrent protocol a whole piece would have to be downloaded before it could be validated against the hashes.

The fact that each file has its own hash tree, and that its leaves are defined to be 16 kiB, means that files with identical content will always have the same merkle root. This enables finding matches of the same file across different torrents.

The new format for torrent files is compatible with the original torrent file format, which enables hybrid torrents. Such torrents that can be used both as V1 and V2 and will have two swarms, one with V1 and V2 clients and one with only V2 clients.

Another major feature of the BitTorrent V2 protocol is that the SHA-1 hash function has been replaced by SHA-256.

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 (multicast for peers on the same local network)
  • multi-tracker 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.
  • share-mode. This is a special mode torrents can be put in to optimize share ratio rather than downloading the torrent.
  • supports the Magnet URI extension - Select specific file indices for download. BEP 53.

disk management

  • can use multiple 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.
  • queues torrents for file check, instead of checking all of them in parallel. 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.

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 gzip 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, PCP 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 I/O

All disk I/O in libtorrent is done asynchronously to the network thread, by the disk io threads. Files are mapped into memory and the kernel's page cache is relied on for caching disk blocks. This has the advantage that the disk cache size adapts to global system load and memory pressure, maximizing the cache without bogging down the whole system. Since memory mapped I/O is inherently synchronous, files can be accessed from multiple disk I/O threads.

Similarly, for write requests, blocks are queued in a store-buffer while waiting to be flushed to disk. Read requests that happen before a block has been flushed, will short circuit by picking the block from the store buffer.

Memory mapped files are available on Windows and posix 64 bit systems. When building on other, simpler platforms, or 32 bits, a simple portable and single-threaded disk I/O back-end is available, using fopen() and fclose() family of functions.

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 system call. This means a single copy into user space memory, and a single copy back into kernel memory, as illustrated by this figure:

img/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:

img/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.

customizable file I/O

img/storage.png

libtorrent's disk I/O 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 disk I/O class can be implemented (inheriting from the disk_interface) that avoids the unnecessary step of mapping pieces 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).

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
{
        lt::session s;
        lt::add_torrent_params p;
        p.save_path = "./";
        p.ti = std::make_shared<torrent_info>(argv[1]);
        lt::torrent_handle h = 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 const& 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.

portability

libtorrent runs on most major operating systems including:

  • Windows
  • macOS
  • Linux
  • BSD
  • Solaris

It uses Boost.Asio, Boost.Optional, Boost.System, Boost.Multiprecision, Boost.Pool, Boost.Python (for bindings), Boost.CRC and various other boost libraries. At least version 1.70 of boost is required.

Since libtorrent uses Boost.Asio 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 and BSD.

libtorrent requires a C++11 compiler and does not build with the following compilers:

  • GCC older than 5.4
  • Visual Studio older than Visual Studio 15 2017 (aka msvc-14.1)
libtorrent-rasterbar-2.0.5/docs/projects.html0000664000175000017500000002262014152763504020343 0ustar arvidarvid libtorrent
libtorrent logo

projects using libtorrent

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

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 free and open-source cross-platform bittorrent client written in Qt, that is available for Linux, macOS and Windows and is released under GPLv2 license.

It comes with a powerful and easy-to-use graphical interface, as well as an embedded Web interface. It has a range of features such as an RSS downloader, scheduling rate limits, torrent queueing, automatic resuming, background downloading, and system tray icon with a password-protected lock.

Originally written by Christophe Dumez, currently maintained by sledgehammer999.

DownZemAll

DownZemAll! is a mass download manager for Windows, Mac OS X and Linux. It helps you to select, organize, prioritize and run your downloads in parallel. Based on the Qt5 framework, DownZemAll! is written in C/C++. It's a free (as in "free speech" and also as in "free beer") software. Its use is governed by LGPL License.

Tonidoplug

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

Folx

Folx is a torrent client and download manager for macOS. 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 (accessible 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++.

halite BitTorrent

Halite is a windows bittorrent client controllable 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.

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.

BitSlug

BitSlug is a macOS cocoa client.

DelCo

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

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.

libtorrent-rasterbar-2.0.5/docs/reference-Torrent_Handle.html0000664000175000017500000034744114152763504023371 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

block_info

Declared in "libtorrent/torrent_handle.hpp"

holds the state of a block in a piece. Who we requested it from and how far along we are at downloading it.

struct block_info
{
   void set_peer (tcp::endpoint const& ep);
   tcp::endpoint peer () const;

   enum block_state_t
   {
      none,
      requested,
      writing,
      finished,
   };

   unsigned bytes_progress:15;
   unsigned block_size:15;
   unsigned state:2;
   unsigned num_peers:14;
};
[report issue]

set_peer() peer()

void set_peer (tcp::endpoint const& ep);
tcp::endpoint peer () const;

The peer is the ip address of the peer this block was downloaded from.

[report issue]

enum block_state_t

Declared in "libtorrent/torrent_handle.hpp"

name value description
none 0 This block has not been downloaded or requested form any peer.
requested 1 The block has been requested, but not completely downloaded yet.
writing 2 The block has been downloaded and is currently queued for being written to disk.
finished 3 The block has been written to disk.
[report issue]
bytes_progress
the number of bytes that have been received for this block
[report issue]
block_size
the total number of bytes in this block.
[report issue]
state
the state this block is in (see block_state_t)
[report issue]
num_peers
the number of peers that is currently requesting this block. Typically this is 0 or 1, but at the end of the torrent blocks may be requested by more peers in parallel to speed things up.
[report issue]

partial_piece_info

Declared in "libtorrent/torrent_handle.hpp"

This class holds information about pieces that have outstanding requests or outstanding writes

struct partial_piece_info
{
   piece_index_t piece_index;
   int blocks_in_piece;
   int finished;
   int writing;
   int requested;
   block_info* blocks;
};
[report issue]
piece_index
the index of the piece in question. blocks_in_piece is the number of blocks in this particular piece. This number will be the same for most pieces, but the last piece may have fewer blocks than the standard pieces.
[report issue]
blocks_in_piece
the number of blocks in this piece
[report issue]
finished
the number of blocks that are in the finished state
[report issue]
writing
the number of blocks that are in the writing state
[report issue]
requested
the number of blocks that are in the requested state
[report issue]
blocks

this is an array of blocks_in_piece number of items. One for each block in the piece.

Warning

This is a pointer that points to an array that's owned by the session object. The next time get_download_queue() is called, it will be invalidated.

[report issue]

torrent_handle

Declared in "libtorrent/torrent_handle.hpp"

You will usually have to store your torrent handles somewhere, since it's the object through which you retrieve information about the torrent and aborts the torrent.

Warning

Any member function that returns a value or fills in a value has to be made synchronously. This means it has to wait for the main thread to complete the query before it can return. This might potentially be expensive if done from within a GUI thread that needs to stay responsive. Try to avoid querying for information you don't need, and try to do it in as few calls as possible. You can get most of the interesting information about a torrent from the torrent_handle::status() call.

The default constructor will initialize the handle to an invalid state. Which means you cannot perform any operation on it, unless you first assign it a valid handle. If you try to perform any operation on an uninitialized handle, it will throw invalid_handle.

Warning

All operations on a torrent_handle may throw system_error exception, in case the handle is no longer referring to a torrent. There is one exception is_valid() will never throw. Since the torrents are processed by a background thread, there is no guarantee that a handle will remain valid between two calls.

struct torrent_handle
{
   friend std::size_t hash_value (torrent_handle const& th);
   torrent_handle () noexcept = default;
   void add_piece (piece_index_t piece, char const* data, add_piece_flags_t flags = {}) const;
   void read_piece (piece_index_t piece) const;
   bool have_piece (piece_index_t piece) const;
   void get_peer_info (std::vector<peer_info>& v) const;
   torrent_status status (status_flags_t flags = status_flags_t::all()) const;
   void get_download_queue (std::vector<partial_piece_info>& queue) const;
   std::vector<partial_piece_info> get_download_queue () const;
   void set_piece_deadline (piece_index_t index, int deadline, deadline_flags_t flags = {}) const;
   void reset_piece_deadline (piece_index_t index) const;
   void clear_piece_deadlines () const;
   std::vector<std::int64_t> file_progress (file_progress_flags_t flags = {}) const;
   void file_progress (std::vector<std::int64_t>& progress, file_progress_flags_t flags = {}) const;
   std::vector<open_file_state> file_status () const;
   void clear_error () const;
   std::vector<announce_entry> trackers () const;
   void add_tracker (announce_entry const&) const;
   void replace_trackers (std::vector<announce_entry> const&) const;
   void add_url_seed (std::string const& url) const;
   std::set<std::string> url_seeds () const;
   void remove_url_seed (std::string const& url) const;
   void add_http_seed (std::string const& url) const;
   void remove_http_seed (std::string const& url) const;
   std::set<std::string> http_seeds () const;
   void add_extension (
      std::function<std::shared_ptr<torrent_plugin>(torrent_handle const&, client_data_t)> const& ext
      , client_data_t userdata = client_data_t{});
   bool set_metadata (span<char const> metadata) const;
   bool is_valid () const;
   void pause (pause_flags_t flags = {}) const;
   void resume () const;
   void set_flags (torrent_flags_t flags, torrent_flags_t mask) const;
   torrent_flags_t flags () const;
   void set_flags (torrent_flags_t flags) const;
   void unset_flags (torrent_flags_t flags) const;
   void flush_cache () const;
   void force_recheck () const;
   void save_resume_data (resume_data_flags_t flags = {}) const;
   bool need_save_resume_data () const;
   void queue_position_bottom () const;
   queue_position_t queue_position () const;
   void queue_position_up () const;
   void queue_position_top () const;
   void queue_position_down () const;
   void queue_position_set (queue_position_t p) const;
   void set_ssl_certificate_buffer (std::string const& certificate
      , std::string const& private_key
      , std::string const& dh_params);
   void set_ssl_certificate (std::string const& certificate
      , std::string const& private_key
      , std::string const& dh_params
      , std::string const& passphrase = "");
   std::shared_ptr<const torrent_info> torrent_file () const;
   std::shared_ptr<torrent_info> torrent_file_with_hashes () const;
   std::vector<std::vector<sha256_hash>> piece_layers () const;
   void piece_availability (std::vector<int>& avail) const;
   void prioritize_pieces (std::vector<std::pair<piece_index_t, download_priority_t>> const& pieces) const;
   void prioritize_pieces (std::vector<download_priority_t> const& pieces) const;
   download_priority_t piece_priority (piece_index_t index) const;
   std::vector<download_priority_t> get_piece_priorities () const;
   void piece_priority (piece_index_t index, download_priority_t priority) const;
   void file_priority (file_index_t index, download_priority_t priority) const;
   download_priority_t file_priority (file_index_t index) const;
   std::vector<download_priority_t> get_file_priorities () const;
   void prioritize_files (std::vector<download_priority_t> const& files) const;
   void force_dht_announce () const;
   void force_reannounce (int seconds = 0, int idx = -1, reannounce_flags_t = {}) const;
   void force_lsd_announce () const;
   void scrape_tracker (int idx = -1) const;
   int upload_limit () const;
   void set_upload_limit (int limit) const;
   int download_limit () const;
   void set_download_limit (int limit) const;
   void connect_peer (tcp::endpoint const& adr, peer_source_flags_t source = {}
      , pex_flags_t flags = pex_encryption | pex_utp | pex_holepunch) const;
   void clear_peers ();
   void set_max_uploads (int max_uploads) const;
   int max_uploads () const;
   void set_max_connections (int max_connections) const;
   int max_connections () const;
   void move_storage (std::string const& save_path
      , move_flags_t flags = move_flags_t::always_replace_files
      ) const;
   void rename_file (file_index_t index, std::string const& new_name) const;
   sha1_hash info_hash () const;
   info_hash_t info_hashes () const;
   bool operator== (const torrent_handle& h) const;
   bool operator!= (const torrent_handle& h) const;
   bool operator< (const torrent_handle& h) const;
   std::uint32_t id () const;
   std::shared_ptr<torrent> native_handle () const;
   client_data_t userdata () const;
   bool in_session () const;

   static constexpr add_piece_flags_t overwrite_existing  = 0_bit;
   static constexpr status_flags_t query_distributed_copies  = 0_bit;
   static constexpr status_flags_t query_accurate_download_counters  = 1_bit;
   static constexpr status_flags_t query_last_seen_complete  = 2_bit;
   static constexpr status_flags_t query_pieces  = 3_bit;
   static constexpr status_flags_t query_verified_pieces  = 4_bit;
   static constexpr status_flags_t query_torrent_file  = 5_bit;
   static constexpr status_flags_t query_name  = 6_bit;
   static constexpr status_flags_t query_save_path  = 7_bit;
   static constexpr deadline_flags_t alert_when_available  = 0_bit;
   static constexpr file_progress_flags_t piece_granularity  = 0_bit;
   static constexpr pause_flags_t graceful_pause  = 0_bit;
   static constexpr pause_flags_t clear_disk_cache  = 1_bit;
   static constexpr resume_data_flags_t flush_disk_cache  = 0_bit;
   static constexpr resume_data_flags_t save_info_dict  = 1_bit;
   static constexpr resume_data_flags_t only_if_modified  = 2_bit;
   static constexpr reannounce_flags_t ignore_min_interval  = 0_bit;
};
[report issue]

torrent_handle()

torrent_handle () noexcept = default;

constructs a torrent handle that does not refer to a torrent. i.e. is_valid() will return false.

[report issue]

add_piece()

void add_piece (piece_index_t piece, char const* data, add_piece_flags_t flags = {}) const;

This function will write data to the storage as piece piece, as if it had been downloaded from a peer. data is expected to point to a buffer of as many bytes as the size of the specified piece. The data in the buffer is copied and passed on to the disk IO thread to be written at a later point.

By default, data that's already been downloaded is not overwritten by this buffer. If you trust this data to be correct (and pass the piece hash check) you may pass the overwrite_existing flag. This will instruct libtorrent to overwrite any data that may already have been downloaded with this data.

Since the data is written asynchronously, you may know that is passed or failed the hash check by waiting for piece_finished_alert or hash_failed_alert.

Adding pieces while the torrent is being checked (i.e. in torrent_status::checking_files state) is not supported.

[report issue]

read_piece()

void read_piece (piece_index_t piece) const;

This function starts an asynchronous read operation of the specified piece from this torrent. You must have completed the download of the specified piece before calling this function.

When the read operation is completed, it is passed back through an alert, read_piece_alert. Since this alert is a response to an explicit call, it will always be posted, regardless of the alert mask.

Note that if you read multiple pieces, the read operations are not guaranteed to finish in the same order as you initiated them.

[report issue]

have_piece()

bool have_piece (piece_index_t piece) const;

Returns true if this piece has been completely downloaded and written to disk, and false otherwise.

[report issue]

get_peer_info()

void get_peer_info (std::vector<peer_info>& v) const;

takes a reference to a vector that will be cleared and filled with one entry for each peer connected to this torrent, given the handle is valid. If the torrent_handle is invalid, it will throw system_error exception. Each entry in the vector contains information about that particular peer. See peer_info.

[report issue]

status()

torrent_status status (status_flags_t flags = status_flags_t::all()) const;

status() will return a structure with information about the status of this torrent. If the torrent_handle is invalid, it will throw system_error exception. See torrent_status. The flags argument filters what information is returned in the torrent_status. Some information in there is relatively expensive to calculate, and if you're not interested in it (and see performance issues), you can filter them out.

By default everything is included. The flags you can use to decide what to include are defined in this class.

[report issue]

get_download_queue()

void get_download_queue (std::vector<partial_piece_info>& queue) const;
std::vector<partial_piece_info> get_download_queue () const;

get_download_queue() returns a vector with information about pieces that are partially downloaded or not downloaded but partially requested. See partial_piece_info for the fields in the returned vector.

[report issue]

clear_piece_deadlines() reset_piece_deadline() set_piece_deadline()

void set_piece_deadline (piece_index_t index, int deadline, deadline_flags_t flags = {}) const;
void reset_piece_deadline (piece_index_t index) const;
void clear_piece_deadlines () const;

This function sets or resets the deadline associated with a specific piece index (index). libtorrent will attempt to download this entire piece before the deadline expires. This is not necessarily possible, but pieces with a more recent deadline will always be prioritized over pieces with a deadline further ahead in time. The deadline (and flags) of a piece can be changed by calling this function again.

If the piece is already downloaded when this call is made, nothing happens, unless the alert_when_available flag is set, in which case it will have the same effect as calling read_piece() for index.

deadline is the number of milliseconds until this piece should be completed.

reset_piece_deadline removes the deadline from the piece. If it hasn't already been downloaded, it will no longer be considered a priority.

clear_piece_deadlines() removes deadlines on all pieces in the torrent. As if reset_piece_deadline() was called on all pieces.

[report issue]

file_progress()

std::vector<std::int64_t> file_progress (file_progress_flags_t flags = {}) const;
void file_progress (std::vector<std::int64_t>& progress, file_progress_flags_t flags = {}) const;

This function fills in the supplied vector, or returns a vector, with the number of bytes downloaded of each file in this torrent. The progress values are ordered the same as the files in the torrent_info.

This operation is not very cheap. Its complexity is O(n + mj). Where n is the number of files, m is the number of currently downloading pieces and j is the number of blocks in a piece.

The flags parameter can be used to specify the granularity of the file progress. If left at the default value of 0, the progress will be as accurate as possible, but also more expensive to calculate. If torrent_handle::piece_granularity is specified, the progress will be specified in piece granularity. i.e. only pieces that have been fully downloaded and passed the hash check count. When specifying piece granularity, the operation is a lot cheaper, since libtorrent already keeps track of this internally and no calculation is required.

[report issue]

file_status()

std::vector<open_file_state> file_status () const;

This function returns a vector with status about files that are open for this torrent. Any file that is not open will not be reported in the vector, i.e. it's possible that the vector is empty when returning, if none of the files in the torrent are currently open.

See open_file_state

[report issue]

clear_error()

void clear_error () const;

If the torrent is in an error state (i.e. torrent_status::error is non-empty), this will clear the error and start the torrent again.

[report issue]

replace_trackers() add_tracker() trackers()

std::vector<announce_entry> trackers () const;
void add_tracker (announce_entry const&) const;
void replace_trackers (std::vector<announce_entry> const&) const;

trackers() will return the list of trackers for this torrent. The announce entry contains both a string url which specify the announce url for the tracker as well as an int tier, which is specifies the order in which this tracker is tried. If you want libtorrent to use another list of trackers for this torrent, you can use replace_trackers() which takes a list of the same form as the one returned from trackers() and will replace it. If you want an immediate effect, you have to call force_reannounce(). See announce_entry.

add_tracker() will look if the specified tracker is already in the set. If it is, it doesn't do anything. If it's not in the current set of trackers, it will insert it in the tier specified in the announce_entry.

The updated set of trackers will be saved in the resume data, and when a torrent is started with resume data, the trackers from the resume data will replace the original ones.

[report issue]

url_seeds() remove_url_seed() add_url_seed()

void add_url_seed (std::string const& url) const;
std::set<std::string> url_seeds () const;
void remove_url_seed (std::string const& url) const;

add_url_seed() adds another url to the torrent's list of url seeds. If the given url already exists in that list, the call has no effect. The torrent will connect to the server and try to download pieces from it, unless it's paused, queued, checking or seeding. remove_url_seed() removes the given url if it exists already. url_seeds() return a set of the url seeds currently in this torrent. Note that URLs that fails may be removed automatically from the list.

See http seeding for more information.

[report issue]

add_http_seed() remove_http_seed() http_seeds()

void add_http_seed (std::string const& url) const;
void remove_http_seed (std::string const& url) const;
std::set<std::string> http_seeds () const;

These functions are identical as the *_url_seed() variants, but they operate on BEP 17 web seeds instead of BEP 19.

See http seeding for more information.

[report issue]

add_extension()

void add_extension (
      std::function<std::shared_ptr<torrent_plugin>(torrent_handle const&, client_data_t)> const& ext
      , client_data_t userdata = client_data_t{});

add the specified extension to this torrent. The ext argument is a function that will be called from within libtorrent's context passing in the internal torrent object and the specified userdata pointer. The function is expected to return a shared pointer to a torrent_plugin instance.

[report issue]

set_metadata()

bool set_metadata (span<char const> metadata) const;

set_metadata expects the info section of metadata. i.e. The buffer passed in will be hashed and verified against the info-hash. If it fails, a metadata_failed_alert will be generated. If it passes, a metadata_received_alert is generated. The function returns true if the metadata is successfully set on the torrent, and false otherwise. If the torrent already has metadata, this function will not affect the torrent, and false will be returned.

[report issue]

is_valid()

bool is_valid () const;

Returns true if this handle refers to a valid torrent and false if it hasn't been initialized or if the torrent it refers to has been removed from the session AND destructed.

To tell if the torrent_handle is in the session, use torrent_handle::in_session(). This will return true before session_handle::remove_torrent() is called, and false afterward.

Clients should only use is_valid() to determine if the result of session::find_torrent() was successful.

Unlike other member functions which return a value, is_valid() completes immediately, without blocking on a result from the network thread. Also unlike other functions, it never throws the system_error exception.

[report issue]

resume() pause()

void pause (pause_flags_t flags = {}) const;
void resume () const;

pause(), and resume() will disconnect all peers and reconnect all peers respectively. When a torrent is paused, it will however remember all share ratios to all peers and remember all potential (not connected) peers. Torrents may be paused automatically if there is a file error (e.g. disk full) or something similar. See file_error_alert.

To know if a torrent is paused or not, call torrent_handle::status() and inspect torrent_status::paused.

Note

Torrents that are auto-managed may be automatically resumed again. It does not make sense to pause an auto-managed torrent without making it not auto-managed first. Torrents are auto-managed by default when added to the session. For more information, see queuing.

[report issue]

set_flags() unset_flags() flags()

void set_flags (torrent_flags_t flags, torrent_flags_t mask) const;
torrent_flags_t flags () const;
void set_flags (torrent_flags_t flags) const;
void unset_flags (torrent_flags_t flags) const;

sets and gets the torrent state flags. See torrent_flags_t. The set_flags overload that take a mask will affect all flags part of the mask, and set their values to what the flags argument is set to. This allows clearing and setting flags in a single function call. The set_flags overload that just takes flags, sets all the specified flags and leave any other flags unchanged. unset_flags clears the specified flags, while leaving any other flags unchanged.

The seed_mode flag is special, it can only be cleared once the torrent has been added, and it can only be set as part of the add_torrent_params flags, when adding the torrent.

[report issue]

flush_cache()

void flush_cache () const;

Instructs libtorrent to flush all the disk caches for this torrent and close all file handles. This is done asynchronously and you will be notified that it's complete through cache_flushed_alert.

Note that by the time you get the alert, libtorrent may have cached more data for the torrent, but you are guaranteed that whatever cached data libtorrent had by the time you called torrent_handle::flush_cache() has been written to disk.

[report issue]

force_recheck()

void force_recheck () const;

force_recheck puts the torrent back in a state where it assumes to have no resume data. All peers will be disconnected and the torrent will stop announcing to the tracker. The torrent will be added to the checking queue, and will be checked (all the files will be read and compared to the piece hashes). Once the check is complete, the torrent will start connecting to peers again, as normal. The torrent will be placed last in queue, i.e. its queue position will be the highest of all torrents in the session.

[report issue]

save_resume_data()

void save_resume_data (resume_data_flags_t flags = {}) const;

save_resume_data() asks libtorrent to generate fast-resume data for this torrent.

This operation is asynchronous, save_resume_data will return immediately. The resume data is delivered when it's done through an save_resume_data_alert.

The fast resume data will be empty in the following cases:

  1. The torrent handle is invalid.
  2. The torrent hasn't received valid metadata and was started without metadata (see libtorrent's metadata from peers extension)

Note that by the time you receive the fast resume data, it may already be invalid if the torrent is still downloading! The recommended practice is to first pause the session, then generate the fast resume data, and then close it down. Make sure to not remove_torrent() before you receive the save_resume_data_alert though. There's no need to pause when saving intermittent resume data.

Warning

If you pause every torrent individually instead of pausing the session, every torrent will have its paused state saved in the resume data!

Note

It is typically a good idea to save resume data whenever a torrent is completed or paused. In those cases you don't need to pause the torrent or the session, since the torrent will do no more writing to its files. If you save resume data for torrents when they are paused, you can accelerate the shutdown process by not saving resume data again for paused torrents. Completed torrents should have their resume data saved when they complete and on exit, since their statistics might be updated.

In full allocation mode the resume data is never invalidated by subsequent writes to the files, since pieces won't move around. This means that you don't need to pause before writing resume data in full or sparse mode. If you don't, however, any data written to disk after you saved resume data and before the session closed is lost.

It also means that if the resume data is out dated, libtorrent will not re-check the files, but assume that it is fairly recent. The assumption is that it's better to loose a little bit than to re-check the entire file.

It is still a good idea to save resume data periodically during download as well as when closing down.

Example code to pause and save resume data for all torrents and wait for the alerts:

extern int outstanding_resume_data; // global counter of outstanding resume data
std::vector<torrent_handle> handles = ses.get_torrents();
ses.pause();
for (torrent_handle const& h : handles) try
{
        torrent_status s = h.status();
        if (!s.has_metadata || !s.need_save_resume_data()) continue;

        h.save_resume_data();
        ++outstanding_resume_data;
}
catch (lt::system_error const& e)
{
        // the handle was invalid, ignore this one and move to the next
}

while (outstanding_resume_data > 0)
{
        alert const* a = ses.wait_for_alert(seconds(10));

        // if we don't get an alert within 10 seconds, abort
        if (a == nullptr) break;

        std::vector<alert*> alerts;
        ses.pop_alerts(&alerts);

        for (alert* i : alerts)
        {
                if (alert_cast<save_resume_data_failed_alert>(i))
                {
                        process_alert(i);
                        --outstanding_resume_data;
                        continue;
                }

                save_resume_data_alert const* rd = alert_cast<save_resume_data_alert>(i);
                if (rd == nullptr)
                {
                        process_alert(i);
                        continue;
                }

                torrent_handle h = rd->handle;
                torrent_status st = h.status(torrent_handle::query_save_path
                        | torrent_handle::query_name);
                std::ofstream out((st.save_path
                        + "/" + st.name + ".fastresume").c_str()
                        , std::ios_base::binary);
                std::vector<char> buf = write_resume_data_buf(rd->params);
                out.write(buf.data(), buf.size());
                --outstanding_resume_data;
        }
}

Note

Note how outstanding_resume_data is a global counter in this example. This is deliberate, otherwise there is a race condition for torrents that was just asked to save their resume data, they posted the alert, but it has not been received yet. Those torrents would report that they don't need to save resume data again, and skipped by the initial loop, and thwart the counter otherwise.

[report issue]

need_save_resume_data()

bool need_save_resume_data () const;

This function returns true if any whole chunk has been downloaded since the torrent was first loaded or since the last time the resume data was saved. When saving resume data periodically, it makes sense to skip any torrent which hasn't downloaded anything since the last time.

Note

A torrent's resume data is considered saved as soon as the save_resume_data_alert is posted. It is important to make sure this alert is received and handled in order for this function to be meaningful.

[report issue]

queue_position_bottom() queue_position_up() queue_position_down() queue_position() queue_position_top()

void queue_position_bottom () const;
queue_position_t queue_position () const;
void queue_position_up () const;
void queue_position_top () const;
void queue_position_down () const;

Every torrent that is added is assigned a queue position exactly one greater than the greatest queue position of all existing torrents. Torrents that are being seeded have -1 as their queue position, since they're no longer in line to be downloaded.

When a torrent is removed or turns into a seed, all torrents with greater queue positions have their positions decreased to fill in the space in the sequence.

queue_position() returns the torrent's position in the download queue. The torrents with the smallest numbers are the ones that are being downloaded. The smaller number, the closer the torrent is to the front of the line to be started.

The queue position is also available in the torrent_status.

The queue_position_*() functions adjust the torrents position in the queue. Up means closer to the front and down means closer to the back of the queue. Top and bottom refers to the front and the back of the queue respectively.

[report issue]

queue_position_set()

void queue_position_set (queue_position_t p) const;

updates the position in the queue for this torrent. The relative order of all other torrents remain intact but their numerical queue position shifts to make space for this torrent's new position

[report issue]

set_ssl_certificate() set_ssl_certificate_buffer()

void set_ssl_certificate_buffer (std::string const& certificate
      , std::string const& private_key
      , std::string const& dh_params);
void set_ssl_certificate (std::string const& certificate
      , std::string const& private_key
      , std::string const& dh_params
      , std::string const& passphrase = "");

For SSL torrents, use this to specify a path to a .pem file to use as this client's certificate. The certificate must be signed by the certificate in the .torrent file to be valid.

The set_ssl_certificate_buffer() overload takes the actual certificate, private key and DH params as strings, rather than paths to files.

cert is a path to the (signed) certificate in .pem format corresponding to this torrent.

private_key is a path to the private key for the specified certificate. This must be in .pem format.

dh_params is a path to the Diffie-Hellman parameter file, which needs to be in .pem format. You can generate this file using the openssl command like this: openssl dhparam -outform PEM -out dhparams.pem 512.

passphrase may be specified if the private key is encrypted and requires a passphrase to be decrypted.

Note that when a torrent first starts up, and it needs a certificate, it will suspend connecting to any peers until it has one. It's typically desirable to resume the torrent after setting the SSL certificate.

If you receive a torrent_need_cert_alert, you need to call this to provide a valid cert. If you don't have a cert you won't be allowed to connect to any peers.

[report issue]

torrent_file() torrent_file_with_hashes()

std::shared_ptr<const torrent_info> torrent_file () const;
std::shared_ptr<torrent_info> torrent_file_with_hashes () const;

torrent_file() returns a pointer to the torrent_info object associated with this torrent. The torrent_info object may be a copy of the internal object. If the torrent doesn't have metadata, the pointer will not be initialized (i.e. a nullptr). The torrent may be in a state without metadata only if it was started without a .torrent file, e.g. by being added by magnet link.

Note that the torrent_info object returned here may be a different instance than the one added to the session, with different attributes like piece layers, dht nodes and trackers. A torrent_info object does not round-trip cleanly when added to a session.

This means if you want to create a .torrent file by passing the torrent_info object into create_torrent, you need to use torrent_file_with_hashes() instead.

torrent_file_with_hashes() returns a copy of the internal torrent_info and piece layer hashes (if it's a v2 torrent). The piece layers will only be included if they are available. If this torrent was added from a .torrent file with piece layers or if it's seeding, the piece layers are available. This function is more expensive than torrent_file() since it needs to make copies of this information.

When constructing a create_torrent object from a torrent_info that's in a session, you need to use this function.

Note that a torrent added from a magnet link may not have the full merkle trees for all files, and hence not have the complete piece layers. In that state, you cannot create a .torrent file even from the torrent_info returned from torrent_file_with_hashes(). Once the torrent completes downloading all files, becoming a seed, you can make a .torrent file from it.

[report issue]

piece_layers()

std::vector<std::vector<sha256_hash>> piece_layers () const;

returns the piece layers for all files in the torrent. If this is a v1 torrent (and doesn't have any piece layers) it returns an empty vector. This is a blocking call that will synchronize with the libtorrent network thread.

[report issue]

piece_availability()

void piece_availability (std::vector<int>& avail) const;

Fills the specified std::vector<int> with the availability for each piece in this torrent. libtorrent does not keep track of availability for seeds, so if the torrent is seeding the availability for all pieces is reported as 0.

The piece availability is the number of peers that we are connected that has advertised having a particular piece. This is the information that libtorrent uses in order to prefer picking rare pieces.

[report issue]

piece_priority() get_piece_priorities() prioritize_pieces()

void prioritize_pieces (std::vector<std::pair<piece_index_t, download_priority_t>> const& pieces) const;
void prioritize_pieces (std::vector<download_priority_t> const& pieces) const;
download_priority_t piece_priority (piece_index_t index) const;
std::vector<download_priority_t> get_piece_priorities () const;
void piece_priority (piece_index_t index, download_priority_t priority) const;

These functions are used to set and get the priority of individual pieces. By default all pieces have priority 4. That means that the random rarest first algorithm is effectively active for all pieces. You may however change the priority of individual pieces. There are 8 priority levels. 0 means not to download the piece at all. Otherwise, lower priority values means less likely to be picked. Piece priority takes precedence over piece availability. Every piece with priority 7 will be attempted to be picked before a priority 6 piece and so on.

The default priority of pieces is 4.

Piece priorities can not be changed for torrents that have not downloaded the metadata yet. Magnet links won't have metadata immediately. see the metadata_received_alert.

piece_priority sets or gets the priority for an individual piece, specified by index.

prioritize_pieces takes a vector of integers, one integer per piece in the torrent. All the piece priorities will be updated with the priorities in the vector. The second overload of prioritize_pieces that takes a vector of pairs will update the priorities of only select pieces, and leave all other unaffected. Each pair is (piece, priority). That is, the first item is the piece index and the second item is the priority of that piece. Invalid entries, where the piece index or priority is out of range, are not allowed.

get_piece_priorities returns a vector with one element for each piece in the torrent. Each element is the current priority of that piece.

It's possible to cancel the effect of file priorities by setting the priorities for the affected pieces. Care has to be taken when mixing usage of file- and piece priorities.

[report issue]

prioritize_files() get_file_priorities() file_priority()

void file_priority (file_index_t index, download_priority_t priority) const;
download_priority_t file_priority (file_index_t index) const;
std::vector<download_priority_t> get_file_priorities () const;
void prioritize_files (std::vector<download_priority_t> const& files) const;

index must be in the range [0, number_of_files).

file_priority() queries or sets the priority of file index.

prioritize_files() takes a vector that has at as many elements as there are files in the torrent. Each entry is the priority of that file. The function sets the priorities of all the pieces in the torrent based on the vector.

get_file_priorities() returns a vector with the priorities of all files.

The priority values are the same as for piece_priority(). See download_priority_t.

Whenever a file priority is changed, all other piece priorities are reset to match the file priorities. In order to maintain special priorities for particular pieces, piece_priority() has to be called again for those pieces.

You cannot set the file priorities on a torrent that does not yet have metadata or a torrent that is a seed. file_priority(int, int) and prioritize_files() are both no-ops for such torrents.

Since changing file priorities may involve disk operations (of moving files in- and out of the part file), the internal accounting of file priorities happen asynchronously. i.e. setting file priorities and then immediately querying them may not yield the same priorities just set. To synchronize with the priorities taking effect, wait for the file_prio_alert.

When combining file- and piece priorities, the resume file will record both. When loading the resume data, the file priorities will be applied first, then the piece priorities.

[report issue]

force_reannounce() force_lsd_announce() force_dht_announce()

void force_dht_announce () const;
void force_reannounce (int seconds = 0, int idx = -1, reannounce_flags_t = {}) const;
void force_lsd_announce () const;

force_reannounce() will force this torrent to do another tracker request, to receive new peers. The seconds argument specifies how many seconds from now to issue the tracker announces.

If the tracker's min_interval has not passed since the last announce, the forced announce will be scheduled to happen immediately as the min_interval expires. This is to honor trackers minimum re-announce interval settings.

The tracker_index argument specifies which tracker to re-announce. If set to -1 (which is the default), all trackers are re-announce.

The flags argument can be used to affect the re-announce. See ignore_min_interval.

force_dht_announce will announce the torrent to the DHT immediately.

force_lsd_announce will announce the torrent on LSD immediately.

[report issue]

scrape_tracker()

void scrape_tracker (int idx = -1) const;

scrape_tracker() will send a scrape request to a tracker. By default (idx = -1) it will scrape the last working tracker. If idx is >= 0, the tracker with the specified index will scraped.

A scrape request queries the tracker for statistics such as total number of incomplete peers, complete peers, number of downloads etc.

This request will specifically update the num_complete and num_incomplete fields in the torrent_status struct once it completes. When it completes, it will generate a scrape_reply_alert. If it fails, it will generate a scrape_failed_alert.

[report issue]

set_download_limit() upload_limit() download_limit() set_upload_limit()

int upload_limit () const;
void set_upload_limit (int limit) const;
int download_limit () const;
void set_download_limit (int limit) const;

set_upload_limit will limit the upload bandwidth used by this particular torrent to the limit you set. It is given as the number of bytes per second the torrent is allowed to upload. 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 (settings_pack::upload_rate_limit) will not override the global rate limit. The torrent can never upload more than the global rate limit.

upload_limit and download_limit will return the current limit setting, for upload and download, respectively.

Local peers are not rate limited by default. see peer classes.

[report issue]

connect_peer()

void connect_peer (tcp::endpoint const& adr, peer_source_flags_t source = {}
      , pex_flags_t flags = pex_encryption | pex_utp | pex_holepunch) const;

connect_peer() is a way to manually connect to peers that one believe is a part of the torrent. If the peer does not respond, or is not a member of this torrent, it will simply be disconnected. No harm can be done by using this other than an unnecessary connection attempt is made. If the torrent is uninitialized or in queued or checking mode, this will throw system_error. The second (optional) argument will be bitwise ORed into the source mask of this peer. Typically this is one of the source flags in peer_info. i.e. tracker, pex, dht etc.

For possible values of flags, see pex_flags_t.

[report issue]

clear_peers()

void clear_peers ();

This will disconnect all peers and clear the peer list for this torrent. New peers will have to be acquired before resuming, from trackers, DHT or local service discovery, for example.

[report issue]

max_uploads() set_max_uploads()

void set_max_uploads (int max_uploads) const;
int max_uploads () const;

set_max_uploads() sets the maximum number of peers that's unchoked 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 settings_pack.

max_uploads() returns the current settings.

[report issue]

max_connections() set_max_connections()

void set_max_connections (int max_connections) const;
int max_connections () const;

set_max_connections() sets the maximum number of connection this torrent will open. If all connections are used up, incoming connections may be refused or poor connections may be closed. This 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 settings_pack.

max_connections() returns the current settings.

[report issue]

move_storage()

void move_storage (std::string const& save_path
      , move_flags_t flags = move_flags_t::always_replace_files
      ) const;

Moves the file(s) that this torrent are currently seeding from or downloading to. If the given save_path is not located on the same drive as the original save path, the files will be copied to the new drive and removed from their original location. This will block all other disk IO, and other torrents download and upload rates may drop while copying the file.

Since disk IO is performed in a separate thread, this operation is also asynchronous. Once the operation completes, the storage_moved_alert is generated, with the new path as the message. If the move fails for some reason, storage_moved_failed_alert is generated instead, containing the error message.

The flags argument determines the behavior of the copying/moving of the files in the torrent. see move_flags_t.

always_replace_files is the default and replaces any file that exist in both the source directory and the target directory.

fail_if_exist first check to see that none of the copy operations would cause an overwrite. If it would, it will fail. Otherwise it will proceed as if it was in always_replace_files mode. Note that there is an inherent race condition here. If the files in the target directory appear after the check but before the copy or move completes, they will be overwritten. When failing because of files already existing in the target path, the error of move_storage_failed_alert is set to boost::system::errc::file_exists.

The intention is that a client may use this as a probe, and if it fails, ask the user which mode to use. The client may then re-issue the move_storage call with one of the other modes.

dont_replace always keeps the existing file in the target directory, if there is one. The source files will still be removed in that case. Note that it won't automatically re-check files. If an incomplete torrent is moved into a directory with the complete files, pause, move, force-recheck and resume. Without the re-checking, the torrent will keep downloading and files in the new download directory will be overwritten.

Files that have been renamed to have absolute paths are not moved by this function. Keep in mind that files that don't belong to the torrent but are stored in the torrent's directory may be moved as well. This goes for files that have been renamed to absolute paths that still end up inside the save path.

[report issue]

rename_file()

void rename_file (file_index_t index, std::string const& new_name) const;

Renames the file with the given index asynchronously. The rename operation is complete when either a file_renamed_alert or file_rename_failed_alert is posted.

[report issue]

info_hashes() info_hash()

sha1_hash info_hash () const;
info_hash_t info_hashes () const;

returns the info-hash(es) of the torrent. If this handle is to a torrent that hasn't loaded yet (for instance by being added) by a URL, the returned value is undefined. The info_hash() returns the SHA-1 info-hash for v1 torrents and a truncated hash for v2 torrents. For the full v2 info-hash, use info_hashes() instead.

[report issue]

operator<() operator==() operator!=()

bool operator== (const torrent_handle& h) const;
bool operator!= (const torrent_handle& h) const;
bool operator< (const torrent_handle& h) const;

comparison operators. The order of the torrents is unspecified but stable.

[report issue]

id()

std::uint32_t id () const;

returns a unique identifier for this torrent. It's not a dense index. It's not preserved across sessions.

[report issue]

native_handle()

std::shared_ptr<torrent> native_handle () const;

This function is intended only for use by plugins and the alert dispatch function. This type does not have a stable ABI and should be relied on as little as possible. Accessing the handle returned by this function is not thread safe outside of libtorrent's internal thread (which is used to invoke plugin callbacks). The torrent class is not only eligible for changing ABI across minor versions of libtorrent, its layout is also dependent on build configuration. This adds additional requirements on a client to be built with the exact same build configuration as libtorrent itself. i.e. the TORRENT_ macros must match between libtorrent and the client builds.

[report issue]

userdata()

client_data_t userdata () const;

returns the userdata pointer as set in add_torrent_params

[report issue]

in_session()

bool in_session () const;

Returns true if the torrent is in the session. It returns true before session::remove_torrent() is called, and false afterward.

Note that this is a blocking function, unlike torrent_handle::is_valid() which returns immediately.

[report issue]
overwrite_existing
instruct libtorrent to overwrite any data that may already have been downloaded with the data of the new piece being added. Using this flag when adding a piece that is actively being downloaded from other peers may have some unexpected consequences, as blocks currently being downloaded from peers may not be replaced.
[report issue]
query_distributed_copies
calculates distributed_copies, distributed_full_copies and distributed_fraction.
[report issue]
query_accurate_download_counters
includes partial downloaded blocks in total_done and total_wanted_done.
[report issue]
query_last_seen_complete
includes last_seen_complete.
[report issue]
query_pieces
populate the pieces field in torrent_status.
[report issue]
query_verified_pieces
includes verified_pieces (only applies to torrents in seed mode).
[report issue]
query_torrent_file
includes torrent_file, which is all the static information from the .torrent file.
[report issue]
query_name
includes name, the name of the torrent. This is either derived from the .torrent file, or from the &dn= magnet link argument or possibly some other source. If the name of the torrent is not known, this is an empty string.
[report issue]
query_save_path
includes save_path, the path to the directory the files of the torrent are saved to.
[report issue]
alert_when_available
used to ask libtorrent to send an alert once the piece has been downloaded, by passing alert_when_available. When set, the read_piece_alert alert will be delivered, with the piece data, when it's downloaded.
[report issue]
piece_granularity
only calculate file progress at piece granularity. This makes the file_progress() call cheaper and also only takes bytes that have passed the hash check into account, so progress cannot regress in this mode.
[report issue]
graceful_pause clear_disk_cache
will delay the disconnect of peers that we're still downloading outstanding requests from. The torrent will not accept any more requests and will disconnect all idle peers. As soon as a peer is done transferring the blocks that were requested from it, it is disconnected. This is a graceful shut down of the torrent in the sense that no downloaded bytes are wasted.
[report issue]
flush_disk_cache
the disk cache will be flushed before creating the resume data. This avoids a problem with file timestamps in the resume data in case the cache hasn't been flushed yet.
[report issue]
save_info_dict
the resume data will contain the metadata from the torrent file as well. This is default for any torrent that's added without a torrent file (such as a magnet link or a URL).
[report issue]
only_if_modified
if nothing significant has changed in the torrent since the last time resume data was saved, fail this attempt. Significant changes primarily include more data having been downloaded, file or piece priorities having changed etc. If the resume data doesn't need saving, a save_resume_data_failed_alert is posted with the error resume_data_not_modified.
[report issue]
ignore_min_interval
by default, force-reannounce will still honor the min-interval published by the tracker. If this flag is set, it will be ignored and the tracker is announced immediately.
[report issue]

hash_value()

Declared in "libtorrent/torrent_handle.hpp"

std::size_t hash_value (torrent_handle const& h);

for std::hash (and to support using this type in unordered_map etc.)

libtorrent-rasterbar-2.0.5/docs/dht_sec.rst0000664000175000017500000002367714152763504020004 0ustar arvidarvid.. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none 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 estimated 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 remain 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. .. image:: img/ip_id_v4.png :class: bw .. image:: img/ip_id_v6.png :class: bw 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: .. parsed-literal:: 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 requester'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. produces well distributed results 3. 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). 4. CRC32C (Castagnoli) is supported in hardware by SSE 4.2, which can significantly speed up computation 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. .. image:: img/complete_bit_prefixes.png :class: bw 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 extremely 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 integer) 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. .. image:: img/hash_distribution.png :class: bw The source code for these tests can be found here_. .. _here: https://github.com/arvidn/hash_complete_prefix 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. libtorrent-rasterbar-2.0.5/docs/todo.html0000664000175000017500000174737314152763504017503 0ustar arvidarvid

libtorrent todo-list

2 urgent 41 important 50 relevant 4 feasible 184 notes
relevance 4../test/test_dht.cpp:1250pass in the actual salt as a parameter
relevance 4../test/test_dht.cpp:2138pass in th actual salt as the argument
relevance 3../test/test_dht.cpp:118make the mock_socket hold a reference to the list of where to record packets instead of having a global variable
relevance 3../test/test_dht.cpp:127ideally the mock_socket would contain this queue of packets, to make tests independent
relevance 3../test/test_dht.cpp:1207split this up into smaller tests
relevance 3../test/test_dht.cpp:2607use dht_test_setup class to simplify the node setup
relevance 3../test/test_dht.cpp:3152use dht_test_setup class to simplify the node setup
relevance 3../test/test_dht.cpp:3251use dht_test_setup class to simplify the node setup
relevance 3../test/test_dht.cpp:3344use dht_test_setup class to simplify the node setup
relevance 3../src/ut_metadata.cpp:267use the aux::write_* functions and the span here instead, it will fit better with send_buffer()
relevance 3../src/session_handle.cpp:663expose the sequence_number, public_key, secret_key and signature types to the client
relevance 3../src/peer_connection.cpp:3097instead 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:3986once peers are properly put in graceful pause mode, they can cancel all outstanding requests and this test can be removed.
relevance 3../src/peer_connection.cpp:4666new_piece should be an optional. piece index -1 should not be allowed
relevance 3../src/session_impl.cpp:1133closing the udp sockets here means that the uTP connections cannot be closed gracefully
relevance 3../src/session_impl.cpp:1593the logic in this if-block should be factored out into a separate function. At least most of it
relevance 3../src/session_impl.cpp:2558it would be neat if the utp socket manager would handle ICMP errors too
relevance 3../src/session_impl.cpp:4106it 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. maybe just a queue of peers would make even more sense, just pick the next peer in the queue for unchoking. It would be O(1).
relevance 3../src/session_impl.cpp:4129peers 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:4375there should be a pre-calculated list of all peers eligible for unchoking
relevance 3../src/session_impl.cpp:6082use public_key here instead of std::array
relevance 3../src/torrent.cpp:404we could probably get away with just saving a few fields here
relevance 3../src/torrent.cpp:687assert there are no outstanding async operations on this torrent
relevance 3../src/torrent.cpp:1255there's some duplication between this function and peer_connection::incoming_piece(). is there a way to merge something?
relevance 3../src/torrent.cpp:3763this could probably be pulled out into a free function
relevance 3../src/torrent.cpp:4686should this alert have an error code in it?
relevance 3../src/torrent.cpp:4754this should return optional<>. piece index -1 should not be allowed
relevance 3../src/web_peer_connection.cpp:198this should be an optional, piece index -1 should not be allowed
relevance 3../src/web_peer_connection.cpp:412do we really need a special case here? wouldn't the multi-file case handle single file torrents correctly too?
relevance 3../src/web_peer_connection.cpp:497file_index_t should not allow negative values
relevance 3../src/web_peer_connection.cpp:676this could be made more efficient for the case when we use an HTTP proxy. Then we wouldn't need to add new web seeds to the torrent, we could just make the redirect table contain full URLs.
relevance 3../src/posix_disk_io.cpp:139this const_cast can be removed once iovec_t is no longer a thing, but we just use plain spans
relevance 3../src/kademlia/rpc_manager.cpp:70move this into it's own .cpp file
relevance 3../include/libtorrent/enum_net.hpp:164use string_view for device_name
relevance 3../include/libtorrent/stat.hpp:257everything but payload counters and rates could probably be removed from here
relevance 3../include/libtorrent/torrent_handle.hpp:497unify url_seed and http_seed with just web_seed, using the web_seed_entry.
relevance 3../include/libtorrent/tracker_manager.hpp:371make sure the udp_socket supports passing on string-hostnames too, and that this function is used
relevance 3../include/libtorrent/pe_crypto.hpp:72dh_key_exchange should probably move into its own file
relevance 3../include/libtorrent/torrent.hpp:1405factor out predictive pieces and all operations on it into a separate class (to use as memeber here instead)
relevance 3../include/libtorrent/torrent.hpp:1465factor out the links (as well as update_list() to a separate class that torrent can inherit)
relevance 3../include/libtorrent/web_peer_connection.hpp:118if 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:153to 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_/storage_utils.hpp:54remove this typedef, and use span for disk write operations
relevance 2../test/test_piece_picker.cpp:2808test picking with partial pieces and other peers present so that both backup_pieces and backup_pieces2 are used
relevance 2../test/test_storage.cpp:590split this test up into smaller parts
relevance 2../test/test_dht.cpp:1642test num_global_nodes
relevance 2../test/test_dht.cpp:1643test need_refresh
relevance 2../test/test_dht.cpp:2828split this up into smaller test cases
relevance 2../src/instantiate_connection.cpp:44peer_connection and tracker_connection should probably be flags
relevance 2../src/bdecode.cpp:818attempt to simplify this implementation by embracing the span
relevance 2../src/peer_connection.cpp:2526this 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:3271since 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:4911use 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/upnp.cpp:106use boost::asio::ip::network instead of netmask
relevance 2../src/http_tracker_connection.cpp:464returning a bool here is redundant. Instead this function should return the peer_entry
relevance 2../src/session_impl.cpp:591is there a reason not to move all of this into init()? and just post it to the io_context?
relevance 2../src/session_impl.cpp:753the ip filter should probably be saved here too
relevance 2../src/session_impl.cpp:3833make 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:5464this function should be removed and users need to deal with the more generic case of having multiple listen ports
relevance 2../src/session_impl.cpp:5504this function should be removed and users need to deal with the more generic case of having multiple ssl ports
relevance 2../src/session_impl.cpp:6344this should be factored into the udp socket, so we only have the code once
relevance 2../src/torrent.cpp:489post alert
relevance 2../src/torrent.cpp:1756add 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:4273use chrono type for time duration
relevance 2../src/torrent.cpp:4698abort lookups this torrent has made via the session host resolver interface
relevance 2../src/torrent.cpp:7727if 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/udp_tracker_connection.cpp:81support authentication here. tracker_req().auth
relevance 2../src/alert_manager.cpp:80keep a count of the number of threads waiting. Only if it's > 0 notify them
relevance 2../src/path.cpp:446test this on a FAT volume to see what error we get!
relevance 2../src/peer_list.cpp:536it 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:2002make the 2048 limit configurable
relevance 2../src/piece_picker.cpp:2599the first_block returned here is the largest free range, not the first-fit range, which would be better
relevance 2../src/piece_picker.cpp:3484it 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 failed without also locking the piece? Perhaps write_failed() should imply locking it.
relevance 2../src/storage_utils.cpp:358technically, this is where the transaction of moving the files is completed. This is where the new save_path should be committed. If there is an error in the code below, that should not prevent the new save path to be set. Maybe it would make sense to make the save_path an in-out parameter
relevance 2../src/storage_utils.cpp:550is 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/web_peer_connection.cpp:619just 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 pad files will make it complicated
relevance 2../src/escape_string.cpp:192this should probably be moved into string_util.cpp
relevance 2../src/tracker_manager.cpp:374implement
relevance 2../src/alert.cpp:1999the salt here is allocated on the heap. It would be nice to allocate in the stack_allocator
relevance 2../src/kademlia/node.cpp:681it would be nice to have a bias towards node-id prefixes that are missing in the bucket
relevance 2../src/kademlia/node.cpp:753use the non deprecated function instead of this one
relevance 2../src/kademlia/routing_table.cpp:305use the non deprecated function instead of this one
relevance 2../src/kademlia/routing_table.cpp:940move the lowest priority nodes to the replacement bucket
relevance 2../src/kademlia/dht_storage.cpp:87make this configurable in dht_settings
relevance 2../include/libtorrent/peer_connection.hpp:990this should really be a circular buffer
relevance 2../include/libtorrent/peer_connection.hpp:1080rename this target queue size
relevance 2../include/libtorrent/piece_picker.hpp:646having 8 priority levels is probably excessive. It should probably be changed to 3 levels + dont-download
relevance 2../include/libtorrent/enum_net.hpp:196this could be done more efficiently by just looking up the interface with the given name, maybe even with if_nametoindex()
relevance 2../include/libtorrent/proxy_base.hpp:298use the resolver interface that has a built-in cache
relevance 2../include/libtorrent/socks5_stream.hpp:153add async_connect() that takes a hostname and port as well
relevance 2../include/libtorrent/aux_/chained_buffer.hpp:60this type should probably be renamed to send_buffer
relevance 2../include/libtorrent/aux_/session_interface.hpp:127make this interface a lot smaller. It could be split up into several smaller interfaces. Each subsystem could then limit the size of the mock object to test it.
relevance 2../include/libtorrent/aux_/session_interface.hpp:136the IP voting mechanism should be factored out to its own class, not part of the session and these constants should move too
relevance 1../src/session_impl.cpp:5656report the proper address of the router as the source IP of this vote of our external address, instead of the empty address
relevance 1../src/torrent.cpp:1086make 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:8090should 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:130have one instance per possible subnet, 192.168.x.x, 10.x.x.x, etc.
relevance 0../test/test_resume.cpp:567test what happens when loading a resume file with both piece priorities and file priorities (file prio should take precedence)
relevance 0../test/test_resume.cpp:570make sure a resume file only ever contain file priorities OR piece priorities. Never both.
relevance 0../test/test_resume.cpp:573generally save
relevance 0../test/test_resume.cpp:896test 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_resume.cpp:1668test 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_ssl.cpp:399test using a signed certificate with the wrong info-hash in DN
relevance 0../test/test_ssl.cpp:501also test using a hash that refers to a valid torrent but that differs from the SNI hash
relevance 0../test/test_peer_list.cpp:968test erasing peers
relevance 0../test/test_peer_list.cpp:969test update_peer_port with allow_multiple_connections_per_ip and without
relevance 0../test/test_peer_list.cpp:970test add i2p peers
relevance 0../test/test_peer_list.cpp:971test allow_i2p_mixed
relevance 0../test/test_peer_list.cpp:972test insert_peer failing with all error conditions
relevance 0../test/test_peer_list.cpp:973test IPv6
relevance 0../test/test_peer_list.cpp:974test connect_to_peer() failing
relevance 0../test/test_peer_list.cpp:975test connection_closed
relevance 0../test/test_peer_list.cpp:976connect candidates recalculation when incrementing failcount
relevance 0../test/test_tracker.cpp:60test scrape requests
relevance 0../test/test_tracker.cpp:61test parse peers6
relevance 0../test/test_tracker.cpp:62test parse tracker-id
relevance 0../test/test_tracker.cpp:63test parse failure-reason
relevance 0../test/test_tracker.cpp:64test 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_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_flags.cpp:163change to a different test setup. currently always paused. test_set_after_add(torrent_flags::paused); test_unset_after_add(torrent_flags::paused);
relevance 0../test/test_flags.cpp:205this test is flaky, since the torrent will become ready before asking for the flags, and by then stop_when_ready will have been cleared test_add_and_get_flags(torrent_flags::stop_when_ready); setting stop-when-ready when already stopped has no effect.
relevance 0../test/test_flags.cpp:209change to a different test setup. currently always paused. test_set_after_add(torrent_flags::stop_when_ready);
relevance 0../test/test_upnp.cpp:156store the log and verify that some key messages are there
relevance 0../test/test_file_storage.cpp:1187test file attributes
relevance 0../test/test_file_storage.cpp:1188test symlinks
relevance 0../test/test_storage.cpp:1009this should take a span of iovec_ts
relevance 0../test/test_storage.cpp:1034this should take a span
relevance 0../test/test_torrent_info.cpp:430test remap_files
relevance 0../test/test_torrent_info.cpp:431torrent with 'p' (padfile) attribute
relevance 0../test/test_torrent_info.cpp:432torrent with 'h' (hidden) attribute
relevance 0../test/test_torrent_info.cpp:433torrent with 'x' (executable) attribute
relevance 0../test/test_torrent_info.cpp:434torrent with 'l' (symlink) attribute
relevance 0../test/test_torrent_info.cpp:435torrent 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:438torrents with a zero-length name
relevance 0../test/test_torrent_info.cpp:439torrent with a non-dictionary info-section
relevance 0../test/test_torrent_info.cpp:440torrents with DHT nodes
relevance 0../test/test_torrent_info.cpp:441torrent with url-list as a single string
relevance 0../test/test_torrent_info.cpp:442torrent with http seed as a single string
relevance 0../test/test_torrent_info.cpp:443torrent with a comment
relevance 0../test/test_torrent_info.cpp:444torrent with an SSL cert
relevance 0../test/test_torrent_info.cpp:445torrent with attributes (executable and hidden)
relevance 0../test/test_torrent_info.cpp:446torrent_info constructor that takes an invalid bencoded buffer
relevance 0../test/test_torrent_info.cpp:447verify_encoding with a string that triggers character replacement
relevance 0../test/test_fast_extension.cpp:1135test sending invalid requests (out of bound piece index, offsets and sizes)
relevance 0../test/test_bloom_filter.cpp:135test size()
relevance 0../test/test_bloom_filter.cpp:136test clear()
relevance 0../test/test_dht.cpp:472check to make sure the "best" items are stored
relevance 0../test/test_dht.cpp:3223this won't work because the second node isn't pinged so it wont be added to the routing table
relevance 0../test/test_dht.cpp:4080test obfuscated_get_peers
relevance 0../test/test_merkle_tree.cpp:233use structured bindings in C++17
relevance 0../test/test_merkle_tree.cpp:935add test for load_piece_layer()
relevance 0../test/test_merkle_tree.cpp:936add test for add_hashes() with an odd number of blocks
relevance 0../test/test_merkle_tree.cpp:937add test for set_block() (setting the last block) with an odd number of blocks
relevance 0../test/test_resolve_links.cpp:94test files with different piece size (negative test)
relevance 0../test/test_resolve_links.cpp:97it 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_transfer.cpp:166these settings_pack tests belong in their own test
relevance 0../src/performance_counters.cpp:40move stats_counter_t out of counters
relevance 0../src/performance_counters.cpp:41should bittorrent keep-alive messages have a counter too?
relevance 0../src/performance_counters.cpp:42It would be nice if this could be an internal type. default_disk_constructor depends on it now
relevance 0../src/ut_metadata.cpp:280we really need to increment the refcounter on the torrent while this buffer is still in the peer's send buffer
relevance 0../src/session_handle.cpp:476in C++14, use unique_ptr and move it into the lambda
relevance 0../src/peer_connection.cpp:1094this should be the global download rate
relevance 0../src/peer_connection.cpp:3498sort the allowed fast set in priority order
relevance 0../src/torrent_info.cpp:869this should be considered a failure, and the .torrent file rejected
relevance 0../src/magnet_uri.cpp:314what's the right number here?
relevance 0../src/part_file.cpp:294what 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:404instead of rebuilding the whole file header and flushing it, update the slot entries as we go
relevance 0../src/utp_socket_manager.cpp:199this should not be heap allocated, sockets should be movable
relevance 0../src/packet_buffer.cpp:157use compare_less_wrap for this comparison as well
relevance 0../src/session.cpp:538In C++17. use if constexpr instead
relevance 0../src/posix_part_file.cpp:346what 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/posix_part_file.cpp:432instead of rebuilding the whole file header and flushing it, update the slot entries as we go
relevance 0../src/session_impl.cpp:607come up with some abstraction to do this for gnutls as well load certificates from the windows system certificate store
relevance 0../src/session_impl.cpp:1472it would be nice to reserve() these vectors up front
relevance 0../src/session_impl.cpp:1953could this function be merged with expand_unspecified_addresses? right now both listen_endpoint_t and listen_interface_t are almost identical, maybe the latter could be removed too
relevance 0../src/session_impl.cpp:2261it would probably be better to do this by having a listen-socket "version" number that gets bumped. And instead of setting a bool to disable a tracker, we set the version number that it was disabled at. This change would affect the ABI in 1.2, so should be done in 2.0 or later
relevance 0../src/session_impl.cpp:2810this size need to be capped
relevance 0../src/session_impl.cpp:2835this size need to be capped
relevance 0../src/session_impl.cpp:3526have a separate list for these connections, instead of having to loop through all of them
relevance 0../src/session_impl.cpp:3559this should apply to all bandwidth channels
relevance 0../src/session_impl.cpp:4265use a lower limit than m_settings.connections_limit to allocate the to 10% or so of connection slots for incoming connections cap this at max - 1, since we may add one below
relevance 0../src/session_impl.cpp:4410post a message to have this happen immediately instead of waiting for the next tick
relevance 0../src/session_impl.cpp:4737it 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:5106factor out this logic into a separate function for unit testing
relevance 0../src/session_impl.cpp:5826refactor, move the storage to dht_tracker
relevance 0../src/session_impl.cpp:6212asserts that no outstanding async operations are still in flight
relevance 0../src/ip_notifier.cpp:41simulator support
relevance 0../src/disabled_disk_io.cpp:106it would be nice to return a valid hash of zeroes here
relevance 0../src/cpuid.cpp:131enable when aarch64 is really tested
relevance 0../src/add_torrent_params.cpp:78pre C++17, GCC and msvc does not make std::string nothrow move assignable, which means no type containing a string will be nothrow move assignable by default either static_assert(std::is_nothrow_move_assignable::value , "should be nothrow move assignable");
relevance 0../src/add_torrent_params.cpp:84it would be nice if this was nothrow default constructible static_assert(std::is_nothrow_default_constructible::value , "should be nothrow default constructible");
relevance 0../src/torrent.cpp:1855this could be optimized by looking up which files are complete and just look at those
relevance 0../src/torrent.cpp:1868this could be optimized by looking up which files are complete and just look at those
relevance 0../src/torrent.cpp:2604this 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:3682add one peer per IP the hostname resolves to
relevance 0../src/torrent.cpp:4362only do this if the piece size > 1 blocks This is a v2 torrent so we can request get block level hashes.
relevance 0../src/torrent.cpp:7249come up with a better way of doing this, instead of an immediately invoked lambda expression.
relevance 0../src/torrent.cpp:7485if the existing torrent doesn't have metadata, insert the metadata we just downloaded into it.
relevance 0../src/torrent.cpp:8810perhaps 0 should actially mean 0
relevance 0../src/torrent.cpp:8826perhaps 0 should actially mean 0
relevance 0../src/torrent.cpp:9123add 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:10698instead of resorting the whole list, insert the peers directly into the right place
relevance 0../src/mmap_disk_io.cpp:553in the future, propagate exceptions back to the handlers
relevance 0../src/mmap_disk_io.cpp:1024this is potentially very expensive. One way to solve it would be to have a fence for just this one piece. but it hardly seems worth the complexity and cost just for the edge case of receiving a corrupt piece
relevance 0../src/choker.cpp:255make configurable
relevance 0../src/web_connection_base.cpp:72introduce a web-seed default class which has a low download priority
relevance 0../src/utp_stream.cpp:1319this loop is not very efficient. It could be fixed by having a separate list of sequence numbers that need resending
relevance 0../src/udp_tracker_connection.cpp:633why is this a linked list?
relevance 0../src/torrent_peer.cpp:179how do we deal with our external address changing?
relevance 0../src/piece_picker.cpp:120find a better place for this
relevance 0../src/piece_picker.cpp:2073this 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:2217Is it a good idea that this affinity takes precedence over piece priority?
relevance 0../src/piece_picker.cpp:2571when expanding pieces for cache stripe reasons, the !downloading condition doesn't make much sense
relevance 0../src/piece_picker.cpp:3149should 5 be configurable?
relevance 0../src/torrent_handle.cpp:556support moving files into this call
relevance 0../src/storage_utils.cpp:293ideally, if we end up copying files because of a move across volumes, the source should not be deleted until they've all been copied. That would let us rollback with higher confidence.
relevance 0../src/random.cpp:141improve calling RAND_bytes multiple times, using fallback for now
relevance 0../src/hash_picker.cpp:311use structured bindings in C++17
relevance 0../src/http_seed_connection.cpp:424technically, this isn't supposed to happen, but it seems to sometimes. Some of the accounting is probably wrong in certain cases
relevance 0../src/merkle_tree.cpp:111in C++20, use std::identity
relevance 0../src/merkle_tree.cpp:320this can be optimized by using m_tree as storage to fill this tree into, and then clear it if the hashes fail
relevance 0../src/merkle_tree.cpp:368a piece outside of this range may also fail, if one of the uncle hashes is at the layer right above the block hashes
relevance 0../src/merkle_tree.cpp:448instead of overwriting the root and comparing it against hashes[], write a functions that *validates* a tree by just filling it up to the level below the root and then validates it.
relevance 0../src/merkle_tree.cpp:472this could be done more efficiently if bitfield had a function to set a range of bits
relevance 0../src/merkle_tree.cpp:513use structured binding in C++17
relevance 0../src/merkle_tree.cpp:553this could be done more efficiently if bitfield had a function to set a range of bits
relevance 0../src/settings_pack.cpp:293deprecate this
relevance 0../src/settings_pack.cpp:566it would be nice to reserve() these vectors up front
relevance 0../src/enum_net.cpp:144in C++17, use __has_include for this. Other operating systems are likely to require this as well
relevance 0../src/enum_net.cpp:315if we get here, the caller still assumes the error code is reported via errno
relevance 0../src/enum_net.cpp:321if we get here, the caller still assumes the error code is reported via errno
relevance 0../src/pe_crypto.cpp:60it would be nice to get the literal working
relevance 0../src/pe_crypto.cpp:71it would be nice to be able to export to a fixed width field, so we wouldn't have to shift it later
relevance 0../src/udp_socket.cpp:653perhaps an attempt should be made to bind m_socks5_sock to the device of m_listen_socket
relevance 0../src/file_storage.cpp:451maybe it would be nice to have a better index here
relevance 0../src/file_storage.cpp:1227this would be more efficient if m_paths was sorted first, such that a lower path index always meant sorted-before
relevance 0../src/file_storage.cpp:1319in C++17 this could be string_view
relevance 0../src/kademlia/item.cpp:143implement ctor for entry from bdecode_node?
relevance 0../src/kademlia/node.cpp:1173keep the returned value to pass as a limit to write_nodes_entries when implemented
relevance 0../src/kademlia/node.cpp:1201limit number of entries in the result
relevance 0../src/kademlia/routing_table.cpp:289This is temporary. For now, only report the largest routing table (of potentially multiple ones, for multi-homed systems) in next major version, break the ABI and support reporting all of them in the dht_stats_alert
relevance 0../src/kademlia/routing_table.cpp:314arvidn note when it's across IPv4 and IPv6, adding (dht_global_nodes) would make sense. in the future though, where we may have one DHT node per external interface (which may be multiple of the same address family), then it becomes a bit trickier
relevance 0../src/kademlia/routing_table.cpp:518this need to take bucket "prefix" into account. It should be unified with add_node_impl()
relevance 0../src/kademlia/put_data.cpp:92what if o is not an instance of put_data_observer? This need to be redesigned for better type safety.
relevance 0../src/kademlia/node_id.cpp:66it's a little bit weird to return 159 - leading zeroes. It should probably be 160 - leading zeroes, but all other code in here is tuned to this expectation now, and it doesn't really matter (other than complexity)
relevance 0../src/kademlia/dht_tracker.cpp:317pick the closest node rather than the first
relevance 0../include/libtorrent/hash_picker.hpp:143support batched adding of block hashes for reduced overhead?
relevance 0../include/libtorrent/performance_counters.hpp:485some space could be saved here by making gauges 32 bits
relevance 0../include/libtorrent/performance_counters.hpp:486restore these to regular integers. Instead have one copy of the counters per thread and collect them at convenient synchronization points
relevance 0../include/libtorrent/peer_connection.hpp:218make 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:1020factor this out into its own class with a virtual interface torrent and session should implement this interface
relevance 0../include/libtorrent/string_view.hpp:40replace this by the standard string_view in C++17
relevance 0../include/libtorrent/piece_picker.hpp:801should this be allocated lazily?
relevance 0../include/libtorrent/piece_picker.hpp:876it would be more intuitive to account "wanted" pieces instead of filtered
relevance 0../include/libtorrent/upnp.hpp:151support using the windows API for UPnP operations as well
relevance 0../include/libtorrent/proxy_base.hpp:207it 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/socket_type.hpp:60move to aux
relevance 0../include/libtorrent/peer_connection_interface.hpp:51make this interface smaller!
relevance 0../include/libtorrent/announce_entry.hpp:76include the number of peers received from this tracker, at last announce
relevance 0../include/libtorrent/identify_client.hpp:48hide this declaration when deprecated functions are disabled, and remove its internal use
relevance 0../include/libtorrent/socks5_stream.hpp:197we could bind the socket here, since we know what the target endpoint is of the proxy
relevance 0../include/libtorrent/torrent_info.hpp:712change the type to std::shared_ptr in C++17 it is used as if immutable, it cannot be const for technical reasons right now.
relevance 0../include/libtorrent/torrent.hpp:270make this a raw pointer. perhaps keep the shared_ptr around further down the object to maintain an owner
relevance 0../include/libtorrent/torrent.hpp:451make graceful pause also finish all sending blocks before disconnecting
relevance 0../include/libtorrent/torrent.hpp:1363this wastes 5 bits per file
relevance 0../include/libtorrent/torrent.hpp:1680this member can probably be removed
relevance 0../include/libtorrent/kademlia/msg.hpp:87move this to its own .hpp/.cpp pair?
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_/deprecated.hpp:47figure out which version of clang this is supported in
relevance 0../include/libtorrent/aux_/session_impl.hpp:264make these direct members and generate shared_ptrs to them which alias the listen_socket_t shared_ptr
relevance 0../include/libtorrent/aux_/session_impl.hpp:1062replace this by a proper asio timer
relevance 0../include/libtorrent/aux_/session_impl.hpp:1067replace this by a proper asio timer
relevance 0../include/libtorrent/aux_/session_impl.hpp:1074replace this by a proper asio timer
relevance 0../include/libtorrent/aux_/merkle_tree.hpp:85remove this constructor. Don't support "uninitialized" trees. This also requires not constructing these for pad-files and small files as well. So, a sparse hash list in torrent_info
relevance 0../include/libtorrent/aux_/merkle_tree.hpp:175make this a std::unique_ptr
relevance 0../include/libtorrent/aux_/pool.hpp:48ensure the alignment is good here
relevance 0../include/libtorrent/aux_/announce_entry.hpp:74include the number of peers received from this tracker, at last announce
relevance 0../include/libtorrent/aux_/session_interface.hpp:212it would be nice to not have this be part of session_interface
relevance 0../include/libtorrent/aux_/allocating_handler.hpp:312in C++17, Handler and Storage could just use "auto"
relevance 0../include/libtorrent/aux_/utp_stream.hpp:626it would be nice to make this private
libtorrent-rasterbar-2.0.5/docs/reference-Stats.html0000664000175000017500000002274214152763504021551 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

counters

Declared in "libtorrent/performance_counters.hpp"

struct counters
{
   counters () ;
   counters (counters const&) ;
   counters& operator= (counters const&) & ;
   std::int64_t operator[] (int i) const ;
   std::int64_t inc_stats_counter (int c, std::int64_t value = 1) ;
   void set_value (int c, std::int64_t value) ;
   void blend_stats_counter (int c, std::int64_t value, int ratio) ;
};
[report issue]

operator[]() inc_stats_counter()

std::int64_t operator[] (int i) const ;
std::int64_t inc_stats_counter (int c, std::int64_t value = 1) ;

returns the new value

[report issue]

stats_metric

Declared in "libtorrent/session_stats.hpp"

describes one statistics metric from the session. For more information, see the session statistics section.

struct stats_metric
{
   char const* name;
   int value_index;
   metric_type_t type;
};
[report issue]
name
the name of the counter or gauge
[report issue]
value_index type
the index into the session stats array, where the underlying value of this counter or gauge is found. The session stats array is part of the session_stats_alert object.
[report issue]

session_stats_metrics()

Declared in "libtorrent/session_stats.hpp"

std::vector<stats_metric> session_stats_metrics ();

This free function returns the list of available metrics exposed by libtorrent's statistics API. Each metric has a name and a value index. The value index is the index into the array in session_stats_alert where this metric's value can be found when the session stats is sampled (by calling post_session_stats()).

[report issue]

find_metric_idx()

Declared in "libtorrent/session_stats.hpp"

int find_metric_idx (string_view name);

given a name of a metric, this function returns the counter index of it, or -1 if it could not be found. The counter index is the index into the values array returned by session_stats_alert.

[report issue]

enum metric_type_t

Declared in "libtorrent/session_stats.hpp"

name value description
counter 0  
gauge 1  
libtorrent-rasterbar-2.0.5/docs/tuning.rst0000664000175000017500000003727114152763504017672 0ustar arvidarvid.. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none tuning libtorrent ================= 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 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. profiling ========= libtorrent is instrumented with a number of counters and gauges you can have access to via the ``session_stats_alert``. To get a snapshot of the counters, call session::post_session_stats(). This call should be made periodically, with whatever granularity you want:: ses.post_session_stats(); Then print alerts to a file:: std::vector alerts; ses.pop_alerts(&alerts); for (auto* a : alerts) { if (lt::alert_cast(a) || lt::alert_cast(a)) { std::cout << a->message() << "\n"; } // ... } The alerts with data will have the type session_stats_alert and there is one session_stats_header_alert that will be posted on startup containing the column names for all metrics. Logging this line will greatly simplify interpreting the output, and is required for the script to work out-of-the-box. The python scrip in ``tools/parse_session_stats.py`` can parse the resulting file and produce graphs of relevant stats. It requires gnuplot_. .. _gnuplot: http://www.gnuplot.info 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 settings_pack 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 bytes of 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 bytes of 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. 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 settings_pack::recv_socket_buffer_size and settings_pack::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 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 peer lists 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 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 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 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. 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. 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. Some of these macros may affect ABI (although they are not intended to). 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 shave off some size from the executable. For all available options, see the `building libtorrent`_ section. Look specifically for the ``TORRENT_DISABLE_*`` macros. .. _`building libtorrent`: building.html 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 cache for open file handles. 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 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. 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 advised to experiment with the settings_pack::mixed_mode_algorithm, setting it to settings_pack::prefer_tcp. This setting entirely disables the balancing and un-throttles 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. .. _`uTP`: utp.html 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 settings_pack::send_buffer_watermark. peers ----- First of all, in order to allow many connections, set the global connection limit high, settings_pack::connections_limit. Also set the upload rate limit to infinite, settings_pack::upload_rate_limit, 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: 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 settings_pack::allow_multiple_connections_per_ip. In order to always unchoke peers, turn off automatic unchoke by setting settings_pack::choking_algorithm to settings_pack::fixed_slots_choker and set the number of upload slots to a large number via settings_pack::unchoke_slots_limit, or use -1 (which means infinite). torrent limits -------------- To seed thousands of torrents, you need to increase the settings_pack::active_limit and settings_pack::active_seeds. 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 and/or SHA-256. In order to enable computing hashes in parallel, on multi-core systems, set settings_pack::aio_threads to the number of threads libtorrent should perform I/O and settings_pack::hashing_threads to the number of threads to compute piece hashes in. 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::post_torrent_updates()``. 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, performing the work asynchronously. 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. ``session::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. To use ``session::post_torrent_updates()`` torrents need to have the ``flag_update_subscribe`` flag set. When post_torrent_updates() is called, a state_update_alert alert is posted, with all the torrents that have updated since the last time this function was called. The client have to keep its own state of all torrents, and update it based on this alert. 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. 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. 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 are 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. libtorrent-rasterbar-2.0.5/docs/examples.html0000664000175000017500000026316514152763504020343 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

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.

simple client

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

#include <cstdlib>
#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include "libtorrent/session.hpp"
#include "libtorrent/torrent_info.hpp"

#include <iostream>

int main(int argc, char* argv[]) try
{
  if (argc != 2) {
    std::cerr << "usage: ./simple_client torrent-file\n"
      "to stop the client, press return.\n";
    return 1;
  }

  lt::session s;
  lt::add_torrent_params p;
  p.save_path = ".";
  p.ti = std::make_shared<lt::torrent_info>(argv[1]);
  s.add_torrent(p);

  // wait for the user to end
  char a;
  int ret = std::scanf("%c\n", &a);
  (void)ret; // ignore
  return 0;
}
catch (std::exception const& e) {
  std::cerr << "ERROR: " << e.what() << "\n";
}

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/create_torrent.hpp"

#include <functional>
#include <cstdio>
#include <sstream>
#include <fstream>
#include <iostream>

#ifdef TORRENT_WINDOWS
#include <direct.h> // for _getcwd
#endif

namespace {

using namespace std::placeholders;

std::vector<char> load_file(std::string const& filename)
{
  std::fstream in;
  in.exceptions(std::ifstream::failbit);
  in.open(filename.c_str(), std::ios_base::in | std::ios_base::binary);
  in.seekg(0, std::ios_base::end);
  size_t const size = size_t(in.tellg());
  in.seekg(0, std::ios_base::beg);
  std::vector<char> ret(size);
  in.read(ret.data(), int(ret.size()));
  return ret;
}

std::string branch_path(std::string const& f)
{
  if (f.empty()) return f;

#ifdef TORRENT_WINDOWS
  if (f == "\\\\") return "";
#endif
  if (f == "/") return "";

  auto 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 == nullptr || 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 == nullptr) sep = first;
  else ++sep;

  // return false if the first character of the filename is a .
  if (sep[0] == '.') return false;

  std::cerr << f << "\n";
  return true;
}

[[noreturn]] void print_usage()
{
  std::cerr << R"(usage: make_torrent FILE [OPTIONS]

Generates a torrent file from the specified file
or directory and writes it to standard out


OPTIONS:
-w url        adds a web seed to the torrent with
              the specified url
-t url        adds the specified tracker to the
              torrent. For multiple trackers, specify more
              -t options. Specify a dash character "-" as a tracker to indicate
              the following trackers should be in a higher tier.
-c comment    sets the comment to the specified string
-C creator    sets the created-by field to the specified string
-s bytes      specifies a piece size for the torrent
              This has to be a power of 2, minimum 16kiB
-l            Don't follow symlinks, instead encode them as
              links in the torrent file
-o file       specifies the output filename of the torrent file
              If this is not specified, the torrent file is
              printed to the standard out, except on windows
              where the filename defaults to a.torrent
-r file       add root certificate to the torrent, to verify
              the HTTPS tracker
-S info-hash  add a similar torrent by info-hash. The similar
              torrent is expected to share some files with this one
-L collection add a collection name to this torrent. Other torrents
              in the same collection is expected to share files
              with this one.
-2            Only generate V2 metadata
-T            Include file timestamps in the .torrent file.
)";
  std::exit(1);
}

} // anonymous namespace

int main(int argc_, char const* argv_[]) try
{
  lt::span<char const*> args(argv_, argc_);
  std::string creator_str = "libtorrent";
  std::string comment_str;

  if (args.size() < 2) print_usage();

  std::vector<std::string> web_seeds;
  std::vector<std::string> trackers;
  std::vector<std::string> collections;
  std::vector<lt::sha1_hash> similar;
  int piece_size = 0;
  lt::create_flags_t flags = {};
  std::string root_cert;

  std::string outfile;
#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

  std::string full_path = args[1];
  args = args.subspan(2);

  for (; !args.empty(); args = args.subspan(1)) {
    if (args[0][0] != '-') print_usage();

    char const flag = args[0][1];

    switch (flag)
    {
      case 'l':
        flags |= lt::create_torrent::symlinks;
        continue;
      case '2':
        flags |= lt::create_torrent::v2_only;
        continue;
      case 'T':
        flags |= lt::create_torrent::modification_time;
        continue;
    }

    if (args.size() < 2) print_usage();

    switch (flag)
    {
      case 'w': web_seeds.push_back(args[1]); break;
      case 't': trackers.push_back(args[1]); break;
      case 's': piece_size = atoi(args[1]); break;
      case 'o': outfile = args[1]; break;
      case 'C': creator_str = args[1]; break;
      case 'c': comment_str = args[1]; break;
      case 'r': root_cert = args[1]; break;
      case 'L': collections.push_back(args[1]); break;
      case 'S': {
        if (strlen(args[1]) != 40) {
          std::cerr << "invalid info-hash for -S. "
            "Expected 40 hex characters\n";
          print_usage();
        }
        std::stringstream hash(args[1]);
        lt::sha1_hash ih;
        hash >> ih;
        if (hash.fail()) {
          std::cerr << "invalid info-hash for -S\n";
          print_usage();
        }
        similar.push_back(ih);
        break;
      }
      default:
        print_usage();
    }
    args = args.subspan(1);
  }

  lt::file_storage fs;
#ifdef TORRENT_WINDOWS
  if (full_path[1] != ':')
#else
  if (full_path[0] != '/')
#endif
  {
    char cwd[2048];
#ifdef TORRENT_WINDOWS
#define getcwd_ _getcwd
#else
#define getcwd_ getcwd
#endif

    char const* ret = getcwd_(cwd, sizeof(cwd));
    if (ret == nullptr) {
      std::cerr << "failed to get current working directory: "
        << strerror(errno) << "\n";
      return 1;
    }

#undef getcwd_
#ifdef TORRENT_WINDOWS
    full_path = cwd + ("\\" + full_path);
#else
    full_path = cwd + ("/" + full_path);
#endif
  }

  lt::add_files(fs, full_path, file_filter, flags);
  if (fs.num_files() == 0) {
    std::cerr << "no files specified.\n";
    return 1;
  }

  lt::create_torrent t(fs, piece_size, flags);
  int tier = 0;
  for (std::string const& tr : trackers) {
    if (tr == "-") ++tier;
    else t.add_tracker(tr, tier);
  }

  for (std::string const& ws : web_seeds)
    t.add_url_seed(ws);

  for (std::string const& c : collections)
    t.add_collection(c);

  for (lt::sha1_hash const& s : similar)
    t.add_similar_torrent(s);

  auto const num = t.num_pieces();
  lt::set_piece_hashes(t, branch_path(full_path)
    , [num] (lt::piece_index_t const p) {
      std::cerr << "\r" << p << "/" << num;
    });

  std::cerr << "\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> const pem = load_file(root_cert);
    t.set_root_cert(std::string(&pem[0], pem.size()));
  }

  // create the torrent and print it to stdout
  std::vector<char> torrent;
  lt::bencode(back_inserter(torrent), t.generate());
  if (!outfile.empty()) {
    std::fstream out;
    out.exceptions(std::ifstream::failbit);
    out.open(outfile.c_str(), std::ios_base::out | std::ios_base::binary);
    out.write(torrent.data(), int(torrent.size()));
  }
  else {
    std::cout.write(torrent.data(), int(torrent.size()));
  }

  return 0;
}
catch (std::exception& e) {
  std::cerr << "ERROR: " << e.what() << "\n";
  return 1;
}

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 <cstdio> // for snprintf
#include <cinttypes> // for PRId64 et.al.
#include <fstream>
#include <iostream>

#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include "libtorrent/torrent_info.hpp"
#include "libtorrent/bdecode.hpp"
#include "libtorrent/magnet_uri.hpp"
#include "libtorrent/span.hpp"

namespace {

[[noreturn]] void print_usage()
{
  std::cerr << R"(usage: dump_torrent torrent-file [options]
    OPTIONS:
    --items-limit <count>    set the upper limit of the number of bencode items
                             in the torrent file.
    --depth-limit <count>    set the recursion limit in the bdecoder
    --show-padfiles          show pad files in file list
    --max-pieces <count>     set the upper limit on the number of pieces to
                             load in the torrent.
    --max-size <size in MiB> reject files larger than this size limit
)";
  std::exit(1);
}

}

int main(int argc, char const* argv[]) try
{
  lt::span<char const*> args(argv, argc);

  // strip executable name
  args = args.subspan(1);

  lt::load_torrent_limits cfg;
  bool show_pad = false;

  if (args.empty()) print_usage();

  char const* filename = args[0];
  args = args.subspan(1);

  using namespace lt::literals;

  while (!args.empty())
  {
    if (args[0] == "--items-limit"_sv && args.size() > 1)
    {
      cfg.max_decode_tokens = atoi(args[1]);
      args = args.subspan(2);
    }
    else if (args[0] == "--depth-limit"_sv && args.size() > 1)
    {
      cfg.max_decode_depth = atoi(args[1]);
      args = args.subspan(2);
    }
    else if (args[0] == "--max-pieces"_sv && args.size() > 1)
    {
      cfg.max_pieces = atoi(args[1]);
      args = args.subspan(2);
    }
    else if (args[0] == "--max-size"_sv && args.size() > 1)
    {
      cfg.max_buffer_size = atoi(args[1]) * 1024 * 1024;
      args = args.subspan(2);
    }
    else if (args[0] == "--show-padfiles"_sv)
    {
      show_pad = true;
      args = args.subspan(1);
    }
    else
    {
      std::cerr << "unknown option: " << args[0] << "\n";
      print_usage();
    }
  }

  lt::torrent_info const t(filename, cfg);

  // print info about torrent
  if (!t.nodes().empty())
  {
    std::printf("nodes:\n");
    for (auto const& i : t.nodes())
      std::printf("%s: %d\n", i.first.c_str(), i.second);
  }

  if (!t.trackers().empty())
  {
    puts("trackers:\n");
    for (auto const& i : t.trackers())
      std::printf("%2d: %s\n", i.tier, i.url.c_str());
  }

  std::stringstream ih;
  ih << t.info_hashes().v1;
  if (t.info_hashes().has_v2())
    ih << ", " << t.info_hashes().v2;
  std::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.str().c_str()
    , t.comment().c_str()
    , t.creator().c_str()
    , make_magnet_uri(t).c_str()
    , t.name().c_str()
    , t.num_files());
  lt::file_storage const& st = t.files();
  for (auto const i : st.file_range())
  {
    auto const first = st.map_file(i, 0, 0).piece;
    auto const last = st.map_file(i, std::max(std::int64_t(st.file_size(i)) - 1, std::int64_t(0)), 0).piece;
    auto const flags = st.file_flags(i);
    if ((flags & lt::file_storage::flag_pad_file) && !show_pad) continue;
    std::stringstream file_root;
    if (!st.root(i).is_all_zeros())
      file_root << st.root(i);
    std::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 & lt::file_storage::flag_pad_file)?'p':'-')
      , ((flags & lt::file_storage::flag_executable)?'x':'-')
      , ((flags & lt::file_storage::flag_hidden)?'h':'-')
      , ((flags & lt::file_storage::flag_symlink)?'l':'-')
      , static_cast<int>(first)
      , static_cast<int>(last)
      , std::uint32_t(st.mtime(i))
      , file_root.str().c_str()
      , st.file_path(i).c_str()
      , (flags & lt::file_storage::flag_symlink) ? "-> " : ""
      , (flags & lt::file_storage::flag_symlink) ? st.symlink(i).c_str() : "");
  }
  std::printf("web seeds:\n");
  for (auto const& ws : t.web_seeds())
  {
    std::printf("%s %s\n"
      , ws.type == lt::web_seed_entry::url_seed ? "BEP19" : "BEP17"
      , ws.url.c_str());
  }

  return 0;
}
catch (std::exception const& e)
{
  std::cerr << "ERROR: " << e.what() << "\n";
}
libtorrent-rasterbar-2.0.5/docs/reference-Settings.html0000664000175000017500000050240614152763504022253 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

You have some control over session configuration through the session::apply_settings() member function. To change one or more configuration options, create a settings_pack object and fill it with the settings to be set and pass it in to session::apply_settings().

The settings_pack object is a collection of settings updates that are applied to the session when passed to session::apply_settings(). It's empty when constructed.

You have control over proxy and authorization settings and also the user-agent that will be sent to the tracker. The user-agent will also be used to identify the client with other peers.

Each configuration option is named with an enum value inside the settings_pack class. These are the available settings:

[report issue]

settings_pack

Declared in "libtorrent/settings_pack.hpp"

The settings_pack struct, contains the names of all settings as enum values. These values are passed in to the set_str(), set_int(), set_bool() functions, to specify the setting to change.

name type default
user_agent string libtorrent/

this is the client identification to the tracker. The recommended format of this string is: "client-name/client-version libtorrent/libtorrent-version". 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

name type default
announce_ip string nullptr

announce_ip is the ip address passed along to trackers as the &ip= parameter. If left as the default, that parameter is omitted.

Note

This setting is only meant for very special cases where a seed is running on the same host as the tracker, and the tracker accepts the IP parameter (which normal trackers don't). Do not set this option unless you also control the tracker.

name type default
handshake_client_version string nullptr

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. This string must be a UTF-8 encoded unicode string.

name type default
outgoing_interfaces string  

This controls which IP address outgoing TCP peer connections are bound to, in addition to controlling whether such connections are also bound to a specific network interface/adapter (bind-to-device).

This string is a comma-separated list of IP addresses and interface names. An empty string will not bind TCP sockets to a device, and let the network stack assign the local address.

A list of names will be used to bind outgoing TCP sockets in a round-robin fashion. An IP address will simply be used to bind() the socket. An interface name will attempt to bind the socket to that interface. If that fails, or is unsupported, one of the IP addresses configured for that interface is used to bind() the socket to. If the interface or adapter doesn't exist, the outgoing peer connection will fail with an error message suggesting the device cannot be found. Adapter names on Unix systems are of the form "eth0", "eth1", "tun0", etc. 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.

When outgoing interfaces are specified, incoming connections or packets sent to a local interface or IP that's not in this list will be rejected with a peer_blocked_alert with invalid_local_interface as the reason.

Note that these are just interface/adapter names or IP addresses. There are no ports specified in this list. IPv6 addresses without port should be specified without enclosing [, ].

name type default
listen_interfaces string 0.0.0.0:6881,[::]:6881

a comma-separated list of (IP or device name, port) pairs. These are the listen ports that will be opened for accepting incoming uTP and TCP peer connections. These are also used for outgoing uTP and UDP tracker connections and DHT nodes.

It is possible to listen on multiple interfaces and multiple ports. Binding to port 0 will make the operating system pick the port.

Note

There are reasons to stick to the same port across sessions, which would mean only using port 0 on the first start, and recording the port that was picked for subsequent startups. Trackers, the DHT and other peers will remember the port they see you use and hand that port out to other peers trying to connect to you, as well as trying to connect to you themselves.

A port that has an "s" suffix will accept SSL peer connections. (note that SSL sockets are only available in builds with SSL support)

A port that has an "l" suffix will be considered a local network. i.e. it's assumed to only be able to reach hosts in the same local network as the IP address (based on the netmask associated with the IP, queried from the operating system).

if binding fails, the listen_failed_alert is posted. Once a socket binding succeeds (if it does), the listen_succeeded_alert is posted. There may be multiple failures before a success.

If a device name that does not exist is configured, no listen socket will be opened for that interface. If this is the only interface configured, it will be as if no listen ports are configured.

If no listen ports are configured (e.g. listen_interfaces is an empty string), networking will be disabled. No DHT will start, no outgoing uTP or tracker connections will be made. No incoming TCP or uTP connections will be accepted. (outgoing TCP connections will still be possible, depending on settings_pack::outgoing_interfaces).

For example: [::1]:8888 - will only accept connections on the IPv6 loopback address on port 8888.

eth0:4444,eth1:4444 - will accept connections on port 4444 on any IP address bound to device eth0 or eth1.

[::]:0s - will accept SSL connections on a port chosen by the OS. And not accept non-SSL connections at all.

0.0.0.0:6881,[::]:6881 - binds to all interfaces on port 6881.

10.0.1.13:6881l - binds to the local IP address, port 6881, but only allow talking to peers on the same local network. The netmask is queried from the operating system. Interfaces marked l are not announced to trackers, unless the tracker is also on the same local network.

Windows OS network adapter device name must be specified with GUID. It can be obtained from "netsh lan show interfaces" command output. GUID must be uppercased string embraced in curly brackets. {E4F0B674-0DFC-48BB-98A5-2AA730BDB6D6}:7777 - will accept connections on port 7777 on adapter with this GUID.

For more information, see the Multi-homed hosts section.

name type default
proxy_hostname string  

when using a proxy, this is the hostname where the proxy is running see proxy_type. Note that when using a proxy, the settings_pack::listen_interfaces setting is overridden and only a single interface is created, just to contact the proxy. This means a proxy cannot be combined with SSL torrents or multiple listen interfaces. This proxy listen interface will not accept incoming TCP connections, will not map ports with any gateway and will not enable local service discovery. All traffic is supposed to be channeled through the proxy.

name type default
proxy_username string  
proxy_password string  

when using a proxy, these are the credentials (if any) to use when connecting to it. see proxy_type

name type default
i2p_hostname string  

sets the i2p SAM bridge to connect to. set the port with the i2p_port setting.

name type default
peer_fingerprint string -LT2050-

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 truncated to 20 bytes and used as the entire peer-id

There is a utility function, generate_fingerprint() that can be used to generate a standard client peer ID fingerprint prefix.

name type default
dht_bootstrap_nodes string dht.libtorrent.org:25401

This is a comma-separated list of IP port-pairs. They will be added to the DHT node (if it's enabled) as back-up nodes in case we don't know of any.

Changing these after the DHT has been started may not have any effect until the DHT is restarted.

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. Rejecting multiple connections from the same IP address will prevent abusive behavior by peers. The logic for determining whether connections are to the same peer is more complicated with this enabled, and more likely to fail in some edge cases. It is not recommended to enable this feature.

name type default
send_redundant_have bool true

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.

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. If this is false, the DHT is used regardless of if the trackers fail or not.

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 on our subnet. i.e. it's a way to not talk to other people's routers by mistake.

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.

name type default
auto_manage_prefer_seeds bool false

if true, prefer seeding torrents when determining which torrents to give active slots to. If false, give preference to downloading torrents

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.

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.

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.

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

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.

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. To be compliant with the Multi-tracker specification, set it to false.

name type default
prefer_udp_trackers bool true

prefer_udp_trackers: true 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 tracker's tier is respected and there's no preference of one protocol over another.

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)

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.

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.

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.

name type default
incoming_starts_queued_torrents bool false

incoming_starts_queued_torrents. 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.

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

name type default
strict_end_game_mode bool true

strict_end_game_mode controls when a block may be requested twice. If this is true, a block may only be requested twice when there's at 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.

name type default
enable_outgoing_utp bool true
enable_incoming_utp bool true
enable_outgoing_tcp bool true
enable_incoming_tcp bool true

Enables incoming and outgoing, TCP and uTP peer connections. false is disabled and true is enabled. When outgoing connections are disabled, libtorrent will simply not make outgoing peer connections with the specific transport protocol. Disabled incoming peer connections will simply be rejected. These options only apply to peer connections, not tracker- or any other kinds of connections.

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. If false, any existing files will be checked. By setting this setting to true, the files won't be checked, but will go straight to download mode.

name type default
anonymous_mode bool false

anonymous_mode: When set to true, the client tries to hide its identity to a certain degree. The user-agent will be reset to an empty string (except for private torrents). 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.

name type default
report_web_seed_downloads bool true

specifies whether downloads from web seeds is reported to the tracker or not. Turning it off also excludes web seed traffic from other stats and download rate reporting via the libtorrent API.

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. 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.

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

name type default
smooth_connects bool true

smooth_connects 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.

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

name type default
apply_ip_filter_to_trackers bool true

apply_ip_filter_to_trackers 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.

name type default
ban_web_seeds bool true

when true, web seeds sending bad data will be banned

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.

name type default
support_share_mode bool true

if false, prevents libtorrent to advertise share-mode support

name type default
report_redundant_bytes bool true

if this is true, the number of redundant bytes is sent to the tracker

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.

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

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.

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.

name type default
enable_lsd bool true

Starts and stops Local Service Discovery. This service will broadcast the info-hashes of all the non-private torrents on the local network to look for peers on the same swarm within multicast reach.

name type default
enable_dht bool true

starts the dht node and makes the trackerless service available to torrents.

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, plain text otherwise

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.

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).

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

name type default
proxy_tracker_connections bool true

if true, tracker connections are made over the configured proxy, if any.

name type default
enable_ip_notifier bool true

Starts and stops the internal IP table route changes notifier.

The current implementation supports multiple platforms, and it is recommended to have it enable, but you may want to disable it if it's supported but unreliable, or if you have a better way to detect the changes. In the later case, you should manually call session_handle::reopen_network_sockets to ensure network changes are taken in consideration.

name type default
dht_prefer_verified_node_ids bool true

when this is true, nodes whose IDs are derived from their source IP according to BEP 42 are preferred in the routing table.

name type default
dht_restrict_routing_ips bool true

determines if the routing table entries should restrict entries to one per IP. This defaults to true, which helps mitigate some attacks on the DHT. It prevents adding multiple nodes with IPs with a very close CIDR distance.

when set, nodes whose IP address that's in the same /24 (or /64 for IPv6) range in the same routing table bucket. This is an attempt to mitigate node ID spoofing attacks also restrict any IP to only have a single entry in the whole routing table

name type default
dht_restrict_search_ips bool true

determines if DHT searches should prevent adding nodes with IPs with very close CIDR distance. This also defaults to true and helps mitigate certain attacks on the DHT.

name type default
dht_extended_routing_table bool true

makes the first buckets in the DHT routing table fit 128, 64, 32 and 16 nodes respectively, as opposed to the standard size of 8. All other buckets have size 8 still.

name type default
dht_aggressive_lookups bool true

slightly changes the lookup behavior in terms of how many outstanding requests we keep. Instead of having branch factor be a hard limit, we always keep branch factor outstanding requests to the closest nodes. i.e. every time we get results back with closer nodes, we query them right away. It lowers the lookup times at the cost of more outstanding queries.

name type default
dht_privacy_lookups bool false

when set, perform lookups in a way that is slightly more expensive, but which minimizes the amount of information leaked about you.

name type default
dht_enforce_node_id bool false

when set, node's whose IDs that are not correctly generated based on its external IP are ignored. When a query arrives from such node, an error message is returned with a message saying "invalid node ID".

name type default
dht_ignore_dark_internet bool true

ignore DHT messages from parts of the internet we wouldn't expect to see any traffic from

name type default
dht_read_only bool false

when set, the other nodes won't keep this node in their routing tables, it's meant for low-power and/or ephemeral devices that cannot support the DHT, it is also useful for mobile devices which are sensitive to network traffic and battery life. this node no longer responds to 'query' messages, and will place a 'ro' key (value = 1) in the top-level message dictionary of outgoing query messages.

name type default
piece_extent_affinity bool false

when this is true, create an affinity for downloading 4 MiB extents of adjacent pieces. This is an attempt to achieve better disk I/O throughput by downloading larger extents of bytes, for torrents with small piece sizes

name type default
validate_https_trackers bool true

when set to true, the certificate of HTTPS trackers and HTTPS web seeds will be validated against the system's certificate store (as defined by OpenSSL). If the system does not have a certificate store, this option may have to be disabled in order to get trackers and web seeds to work).

name type default
ssrf_mitigation bool true

when enabled, tracker and web seed requests are subject to certain restrictions.

An HTTP(s) tracker requests to localhost (loopback) must have the request path start with "/announce". This is the conventional bittorrent tracker request. Any other HTTP(S) tracker request to loopback will be rejected. This applies to trackers that redirect to loopback as well.

Web seeds that end up on the client's local network (i.e. in a private IP address range) may not include query string arguments. This applies to web seeds redirecting to the local network as well.

Web seeds on global IPs (i.e. not local network) may not redirect to a local network address

name type default
allow_idna bool false

when disabled, any tracker or web seed with an IDNA hostname (internationalized domain name) is ignored. This is a security precaution to avoid various unicode encoding attacks that might happen at the application level.

name type default
enable_set_file_valid_data bool false

when set to true, enables the attempt to use SetFileValidData() to pre-allocate disk space. This system call will only work when running with Administrator privileges on Windows, and so this setting is only relevant in that scenario. Using SetFileValidData() poses a security risk, as it may reveal previously deleted information from the disk.

name type default
socks5_udp_send_local_ep bool false

When using a SOCKS5 proxy, UDP traffic is routed through the proxy by sending a UDP ASSOCIATE command. If this option is true, the UDP ASSOCIATE command will include the IP address and listen port to the local UDP socket. This indicates to the proxy which source endpoint to expect our packets from. The benefit is that incoming packets can be forwarded correctly, before any outgoing packets are sent. The risk is that if there's a NAT between the client and the proxy, the IP address specified in the protocol may not be valid from the proxy's point of view.

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.

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.

name type default
stop_tracker_timeout int 5

stop_tracker_timeout is the number of seconds 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. If the value is set to 0, the connections to trackers with the stopped event are suppressed.

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 MiB).

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.

name type default
request_timeout int 60

the number of seconds one block (16 kiB) is expected to be received within. If it's not, the block is requested from a different peer

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.

name type default
max_allowed_in_request_queue int 2000

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.

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.

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.

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. 120 seconds is specified in the protocol specification. After half the time out, a keep alive message is sent.

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.

name type default
urlseed_pipeline_size int 5

controls the pipelining size of url and http 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

name type default
urlseed_wait_retry int 30

number of seconds until a new retry of a url-seed takes place. Default retry value for http-seeds that don't provide a valid retry-after header.

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.

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 failure counter is reset. If a peer is retrieved from a peer source (other than DHT) the failcount is decremented by one, allowing another try.

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.

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.

name type default
connection_speed int 30

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.

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.

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.

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.

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.

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. The first initial_picker_threshold pieces in any torrent are picked at random , the following pieces are picked in rarest first order.

name type default
allowed_fast_set_size int 5

the number of allowed pieces to send to peers that supports the fast extensions

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_suggestions which 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.
name type default
max_queued_disk_bytes int 1024 * 1024

max_queued_disk_bytes is the 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.

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.

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 16 kiB 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.

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 how many peers to unchoke. The unchoking algorithm for downloading torrents is always "tit-for-tat", i.e. the peers we download the fastest from are unchoked.

The options for choking algorithms are defined in the choking_algorithm_t enum.

seed_choking_algorithm controls the seeding unchoke behavior. i.e. How we select which peers to unchoke for seeding torrents. Since a seeding torrent isn't downloading anything, the tit-for-tat mechanism cannot be used. The available options are defined in the seed_choking_algorithm_t enum.

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
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.

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.

name type default
peer_tos int 0x20

peer_tos determines the TOS byte set in the IP header of every packet sent to peers (including web seeds). 0x0 means no marking, 0x20 represents the QBone scavenger service. For more details, see QBSS.

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 500

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.

active_tracker_limit is the max number of torrents to announce to their trackers.

active_lsd_limit is the max number of torrents to announce to the local network over the local service discovery protocol.

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.

name type default
auto_manage_interval int 30

auto_manage_interval is the number of seconds between the torrent queue is updated, and rotated.

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.

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.

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 can be used to save memory for paused torrents, since it's not as important for them to keep a large peer list.

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 mis-configured trackers.

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.

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.

name type default
max_rejects int 50

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.

name type default
recv_socket_buffer_size int 0
send_socket_buffer_size int 0

specifies the buffer sizes set on peer sockets. 0 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.

name type default
max_peer_recv_buffer_size int 2 * 1024 * 1024

the max number of bytes a single peer connection's receive buffer is allowed to grow to.

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.

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().

name type default
max_suggest_pieces int 16

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.

name type default
local_service_announce_interval int 5 * 60

local_service_announce_interval is the time between local network announces for a torrent. This interval is specified in seconds.

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).

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. 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.

name type default
num_optimistic_unchoke_slots int 0

num_optimistic_unchoke_slots is the number of optimistic unchoke slots to use. 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. 0 means automatic, where libtorrent opens up 20% of your allowed upload slots as optimistic unchoke slots.

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

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.

name type default
share_mode_target int 3

share_mode_target specifies the target share ratio for share mode torrents. If set to 3, 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.

name type default
upload_rate_limit int 0
download_rate_limit int 0

upload_rate_limit and download_rate_limit sets the session-global limits of upload and download rate limits, in bytes per second. By default peers on the local network are not rate limited.

A value of 0 means unlimited.

For fine grained control over rate limits, including making them apply to local peers, see peer classes.

name type default
dht_upload_rate_limit int 8000

the number of bytes per second (on average) the DHT is allowed to send. If the incoming requests causes to many bytes to be sent in responses, incoming requests will be dropped until the quota has been replenished.

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. Setting this limit to -1 means unlimited, i.e. all peers will always be unchoked.

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.

name type default
connections_slack int 10

connections_slack is the number of incoming connections exceeding the connection limit to accept in order to potentially replace existing ones.

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. utp_gain_factor is the number of bytes the uTP congestion window can increase at the most in one RTT. 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. 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 lost 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. Do not change this value unless you know what you're doing. Never set it higher than 100.

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).

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. 5 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 the listen_interfaces settings is updated.

name type default
torrent_connect_boost int 30

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. This may not be set higher than 255.

name type default
alert_queue_size int 2000

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. Once the alert queue is full, additional alerts will be dropped, and not delivered to the client. Once the client drains the queue, new alerts may be delivered again. In order to know that alerts have been dropped, see session_handle::dropped_alerts().

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.

name type default
hashing_threads int 2

hashing_threads is the number of disk I/O threads to use for piece hash verification. These threads are in addition to the regular disk I/O threads specified by settings_pack::aio_threads. The hasher threads do not only compute hashes, but also perform the read from disk. On storage optimal for sequential access, such as hard drives, this setting should probably be set to 1.

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

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.

name type default
aio_threads int 10

for some aio back-ends, aio_threads specifies the number of io-threads to use.

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.

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. Torrents that are considered done will still be allowed to be seeded, they just won't have priority anymore. For more, see queuing.

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

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.

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.

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

name type default
alert_mask int int

a bitmask combining flags from alert_category_t defining which kinds of alerts to receive

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.
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.

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.

name type default
proxy_type int settings_pack::none

proxy to use. see proxy_type_t.

name type default
proxy_port int 0

the port of the proxy server

name type default
i2p_port int 0

sets the i2p SAM bridge port to connect to. set the hostname with the i2p_hostname setting.

name type default
urlseed_max_request_bytes int 16 * 1024 * 1024

The maximum request range of an url seed in bytes. This value defines the largest possible sequential web seed request. Lower values are possible but will be ignored if they are lower then piece size. This value should be related to your download speed to prevent libtorrent from creating too many expensive http requests per second. You can select a value as high as you want but keep in mind that libtorrent can't create parallel requests if the first request did already select the whole file. If you combine bittorrent seeds with web seeds and pick strategies like rarest first you may find your web seed requests split into smaller parts because we don't download already picked pieces twice.

name type default
web_seed_name_lookup_retry int 1800

time to wait until a new retry of a web seed name lookup

name type default
close_file_interval int CLOSE_FILE_INTERVAL

the number of seconds between closing the file opened the longest ago. 0 means to disable the feature. The purpose of this is to periodically close files to trigger the operating system flushing disk cache. Specifically it has been observed to be required on windows to not have the disk cache grow indefinitely. This defaults to 240 seconds on windows, and disabled on other systems.

name type default
utp_cwnd_reduce_timer int 100

When uTP experiences packet loss, it will reduce the congestion window, and not reduce it again for this many milliseconds, even if experiencing another lost packet.

name type default
max_web_seed_connections int 3

the max number of web seeds to have connected per torrent at any given time.

name type default
resolver_cache_timeout int 1200

the number of seconds before the internal host name resolver considers a cache value timed out, negative values are interpreted as zero.

name type default
send_not_sent_low_watermark int 16384

specify the not-sent low watermark for socket send buffers. This corresponds to the, Linux-specific, TCP_NOTSENT_LOWAT TCP socket option.

name type default
rate_choker_initial_threshold int 1024

the rate based choker compares the upload rate to peers against a threshold that increases proportionally by its size for every peer it visits, visiting peers in decreasing upload rate. The number of upload slots is determined by the number of peers whose upload rate exceeds the threshold. This option sets the start value for this threshold. A higher value leads to fewer unchoke slots, a lower value leads to more.

name type default
upnp_lease_duration int 3600

The expiration time of UPnP port-mappings, specified in seconds. 0 means permanent lease. Some routers do not support expiration times on port-maps (nor correctly returning an error indicating lack of support). In those cases, set this to 0. Otherwise, don't set it any lower than 5 minutes.

name type default
max_concurrent_http_announces int 50

limits the number of concurrent HTTP tracker announces. Once the limit is hit, tracker requests are queued and issued when an outstanding announce completes.

name type default
dht_max_peers_reply int 100

the maximum number of peers to send in a reply to get_peers

name type default
dht_search_branching int 5

the number of concurrent search request the node will send when announcing and refreshing the routing table. This parameter is called alpha in the kademlia paper

name type default
dht_max_fail_count int 20

the maximum number of failed tries to contact a node before it is removed from the routing table. If there are known working nodes that are ready to replace a failing node, it will be replaced immediately, this limit is only used to clear out nodes that don't have any node that can replace them.

name type default
dht_max_torrents int 2000

the total number of torrents to track from the DHT. This is simply an upper limit to make sure malicious DHT nodes cannot make us allocate an unbounded amount of memory.

name type default
dht_max_dht_items int 700

max number of items the DHT will store

name type default
dht_max_peers int 500

the max number of peers to store per torrent (for the DHT)

name type default
dht_max_torrent_search_reply int 20

the max number of torrents to return in a torrent search query to the DHT

name type default
dht_block_timeout int 5 * 60

the number of seconds a DHT node is banned if it exceeds the rate limit. The rate limit is averaged over 10 seconds to allow for bursts above the limit.

name type default
dht_block_ratelimit int 5

the max number of packets per second a DHT node is allowed to send without getting banned.

name type default
dht_item_lifetime int 0

the number of seconds a immutable/mutable item will be expired. default is 0, means never expires.

name type default
dht_sample_infohashes_interval int 21600

the info-hashes sample recomputation interval (in seconds). The node will precompute a subset of the tracked info-hashes and return that instead of calculating it upon each request. The permissible range is between 0 and 21600 seconds (inclusive).

name type default
dht_max_infohashes_sample_count int 20

the maximum number of elements in the sampled subset of info-hashes. If this number is too big, expect the DHT storage implementations to clamp it in order to allow UDP packets go through

name type default
max_piece_count int 0x200000

max_piece_count is the maximum allowed number of pieces in metadata received via magnet links. Loading large torrents (with more pieces than the default limit) may also require passing in a higher limit to read_resume_data() and torrent_info::parse_info_section(), if those are used.

name type default
metadata_token_limit int 2500000

when receiving metadata (torrent file) from peers, this is the max number of bencoded tokens we're willing to parse. This limit is meant to prevent DoS attacks on peers. For very large torrents, this limit may have to be raised.

struct settings_pack final : settings_interface
{
   friend  void apply_pack_impl (settings_pack const*
      , aux::session_settings_single_thread&
      , std::vector<void(aux::session_impl::*)()>*);
   void set_int (int name, int val) override;
   void set_bool (int name, bool val) override;
   void set_int (int name, flags::bitfield_flag<Type, Tag> const val);
   void set_str (int name, std::string val) override;
   bool has_val (int name) const override;
   void clear ();
   void clear (int name);
   int get_int (int name) const override;
   std::string const& get_str (int name) const override;
   bool get_bool (int name) const override;
   void for_each (Fun&& f) const;

   enum type_bases
   {
      string_type_base,
      int_type_base,
      bool_type_base,
      type_mask,
      index_mask,
   };

   enum suggest_mode_t
   {
      no_piece_suggestions,
      suggest_read_cache,
   };

   enum choking_algorithm_t
   {
      fixed_slots_choker,
      rate_based_choker,
      deprecated_bittyrant_choker,
   };

   enum seed_choking_algorithm_t
   {
      round_robin,
      fastest_upload,
      anti_leech,
   };

   enum io_buffer_mode_t
   {
      enable_os_cache,
      deprecated_disable_os_cache_for_aligned_files,
      disable_os_cache,
   };

   enum bandwidth_mixed_algo_t
   {
      prefer_tcp,
      peer_proportional,
   };

   enum enc_policy
   {
      pe_forced,
      pe_enabled,
      pe_disabled,
   };

   enum enc_level
   {
      pe_plaintext,
      pe_rc4,
      pe_both,
   };

   enum proxy_type_t
   {
      none,
      socks4,
      socks5,
      socks5_pw,
      http,
      http_pw,
      i2p_proxy,
   };
};
[report issue]

set_str() set_int() set_bool()

void set_int (int name, int val) override;
void set_bool (int name, bool val) override;
void set_int (int name, flags::bitfield_flag<Type, Tag> const val);
void set_str (int name, std::string val) override;

set a configuration option in the settings_pack. name is one of the enum values from string_types, int_types or bool_types. They must match the respective type of the set_* function.

[report issue]

has_val()

bool has_val (int name) const override;

queries whether the specified configuration option has a value set in this pack. name can be any enumeration value from string_types, int_types or bool_types.

[report issue]

clear()

void clear ();

clear the settings pack from all settings

[report issue]

clear()

void clear (int name);

clear a specific setting from the pack

[report issue]

get_str() get_bool() get_int()

int get_int (int name) const override;
std::string const& get_str (int name) const override;
bool get_bool (int name) const override;

queries the current configuration option from the settings_pack. name is one of the enumeration values from string_types, int_types or bool_types. The enum value must match the type of the get_* function.

[report issue]

enum type_bases

Declared in "libtorrent/settings_pack.hpp"

name value description
string_type_base 0  
int_type_base 16384  
bool_type_base 32768  
type_mask 49152  
index_mask 16383  
[report issue]

enum suggest_mode_t

Declared in "libtorrent/settings_pack.hpp"

name value description
no_piece_suggestions 0  
suggest_read_cache 1  
[report issue]

enum choking_algorithm_t

Declared in "libtorrent/settings_pack.hpp"

name value description
fixed_slots_choker 0 This is the traditional choker with a fixed number of unchoke slots (as specified by settings_pack::unchoke_slots_limit).
rate_based_choker 2

This 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. Configure the initial threshold with settings_pack::rate_choker_initial_threshold.

For more information, see rate based choking.

deprecated_bittyrant_choker 3  
[report issue]

enum seed_choking_algorithm_t

Declared in "libtorrent/settings_pack.hpp"

name value description
round_robin 0 which round-robins the peers that are unchoked when seeding. This distributes the upload bandwidth uniformly and fairly. It minimizes the ability for a peer to download everything without redistributing it.
fastest_upload 1 unchokes the peers we can send to the fastest. This might be a bit more reliable in utilizing all available capacity.
anti_leech 2 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. This does not just take into account the pieces a peer is reporting having downloaded, but also the pieces we have sent to it.
[report issue]

enum io_buffer_mode_t

Declared in "libtorrent/settings_pack.hpp"

name value description
enable_os_cache 0  
deprecated_disable_os_cache_for_aligned_files 1  
disable_os_cache 2  
[report issue]

enum bandwidth_mixed_algo_t

Declared in "libtorrent/settings_pack.hpp"

name value description
prefer_tcp 0 disables the mixed mode bandwidth balancing
peer_proportional 1 does not throttle uTP, throttles TCP to the same proportion of throughput as there are TCP connections
[report issue]

enum enc_policy

Declared in "libtorrent/settings_pack.hpp"

name value description
pe_forced 0 Only encrypted connections are allowed. Incoming connections that are not encrypted are closed and if the encrypted outgoing connection fails, a non-encrypted retry will not be made.
pe_enabled 1 encrypted connections are enabled, but non-encrypted connections are allowed. An incoming non-encrypted connection will be accepted, and if an outgoing encrypted connection fails, a non- encrypted connection will be tried.
pe_disabled 2 only non-encrypted connections are allowed.
[report issue]

enum enc_level

Declared in "libtorrent/settings_pack.hpp"

name value description
pe_plaintext 1 use only plain text encryption
pe_rc4 2 use only RC4 encryption
pe_both 3 allow both
[report issue]

enum proxy_type_t

Declared in "libtorrent/settings_pack.hpp"

name value description
none 0 No proxy server is used and all other fields are ignored.
socks4 1 The server is assumed to be a SOCKS4 server that requires a username.
socks5 2 The server is assumed to be a SOCKS5 server (RFC 1928) that does not require any authentication. The username and password are ignored.
socks5_pw 3 The server is assumed to be a SOCKS5 server that supports plain text username and password authentication (RFC 1929). The username and password specified may be sent to the proxy if it requires.
http 4 The server is assumed to be an HTTP proxy. If the transport used for the connection is non-HTTP, the server is assumed to support the CONNECT method. i.e. for web seeds and HTTP trackers, a plain proxy will suffice. The proxy is assumed to not require authorization. The username and password will not be used.
http_pw 5 The server is assumed to be an HTTP proxy that requires user authorization. The username and password will be sent to the proxy.
i2p_proxy 6 route through a i2p SAM proxy
[report issue]

min_memory_usage() high_performance_seed()

Declared in "libtorrent/session.hpp"

settings_pack high_performance_seed ();
settings_pack min_memory_usage ();

The default values of the session settings are set for a regular bittorrent client running on a desktop system. There are functions that can set the session settings to pre set settings for other environments. These can be used for the basis, and should be tweaked to fit your needs better.

min_memory_usage returns settings that will use the minimal amount of RAM, at the potential expense of upload and download performance. It adjusts the socket buffer sizes, disables the disk cache, lowers the send buffer watermarks so that each connection only has at most one block in use at any one time. It lowers the outstanding blocks send to the disk I/O thread so that connections only have one block waiting to be flushed to disk at any given time. It lowers the max number of peers in the peer list for torrents. It performs multiple smaller reads when it hashes pieces, instead of reading it all into memory before hashing.

This configuration is intended to be the starting point for embedded devices. It will significantly reduce memory usage.

high_performance_seed returns settings optimized for a seed box, serving many peers and that doesn't do any downloading. It has a 128 MB disk cache and has a limit of 400 files in its file pool. It support fast upload rates by allowing large send buffers.

[report issue]

name_for_setting() setting_by_name()

Declared in "libtorrent/settings_pack.hpp"

char const* name_for_setting (int s);
int setting_by_name (string_view name);

converts a setting integer (from the enums string_types, int_types or bool_types) to a string, and vice versa.

[report issue]

default_settings()

Declared in "libtorrent/settings_pack.hpp"

settings_pack default_settings ();

returns a settings_pack with every setting set to its default value

[report issue]

generate_fingerprint()

Declared in "libtorrent/fingerprint.hpp"

std::string generate_fingerprint (std::string name
   , int major, int minor = 0, int revision = 0, int tag = 0);

This is a utility function to produce a client ID fingerprint formatted to the most common convention. The fingerprint can be set via the peer_fingerprint setting, in settings_pack.

The name string should contain exactly two characters. These are the characters unique to your client, used to identify it. Make sure not to clash with anybody else. Here are some taken id's:

id chars client
LT libtorrent (default)
UT uTorrent
UM uTorrent Mac
qB qBittorrent
BP BitTorrent Pro
BT BitTorrent
DE Deluge
AZ Azureus
TL Tribler

There's an informal directory of client id's here.

The major, minor, revision and tag parameters are used to identify the version of your client.

libtorrent-rasterbar-2.0.5/docs/tutorial.rst0000664000175000017500000002656514152763504020235 0ustar arvidarvid.. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none tutorial ======== The fundamental feature of starting and downloading torrents in libtorrent is achieved by creating a *session*, which provides the context and a container for torrents. This is done with via the session class, most of its interface is documented under session_handle though. To add a torrent to the session, you fill in an add_torrent_params object and pass it either to add_torrent() or async_add_torrent(). ``add_torrent()`` is a blocking call which returns a torrent_handle. For example: .. code:: c++ #include #include #include #include int main(int argc, char const* argv[]) { if (argc != 2) { fprintf(stderr, "usage: %s \n"); return 1; } lt::session ses; lt::add_torrent_params atp = lt::parse_magnet_uri(argv[1]); atp.save_path = "."; // save in current dir lt::torrent_handle h = ses.add_torrent(atp); // ... } Once you have a torrent_handle, you can affect it as well as querying status. First, let's extend the example to print out messages from the bittorrent engine about progress and events happening under the hood. libtorrent has a mechanism referred to as *alerts* to communicate back information to the client application. Clients can poll a session for new alerts via the pop_alerts() call. This function fills in a vector of alert pointers with all new alerts since the last call to this function. The pointers are owned by the session object at will become invalidated by the next call to pop_alerts(). The alerts form a class hierarchy with alert as the root class. Each specific kind of alert may include additional state, specific to the kind of message. All alerts implement a message() function that prints out pertinent information of the alert message. This can be convenient for simply logging events. For programmatically react to certain events, use alert_cast to attempt a down cast of an alert object to a more specific type. In order to print out events from libtorrent as well as exiting when the torrent completes downloading, we can poll the session for alerts periodically and print them out, as well as listening for the torrent_finished_alert, which is posted when a torrent completes. .. include:: ../examples/bt-get.cpp :code: c++ :tab-width: 2 :start-after: */ alert masks ----------- The output from this program will be quite verbose, which is probably a good starting point to get some understanding of what's going on. Alerts are categorized into alert categories. Each category can be enabled and disabled independently via the *alert mask*. The alert mask is a configuration option offered by libtorrent. There are many configuration options, see settings_pack. The alert_mask setting is an integer of the category flags ORed together. For instance, to only see the most pertinent alerts, the session can be constructed like this: .. code:: c++ lt::settings_pack pack; pack.set_int(lt::settings_pack::alert_mask , lt::alert_category::error | lt::alert_category::storage | lt::alert_category::status); lt::session ses(pack); Configuration options can be updated after the session is started by calling apply_settings(). Some settings are best set before starting the session though, like listen_interfaces, to avoid race conditions. If you start the session with the default settings and then immediately change them, there will still be a window where the default settings apply. Changing the settings may trigger listen sockets to close and re-open and NAT-PMP, UPnP updates to be sent. For this reason, it's typically a good idea to batch settings updates into a single call. session destruction ------------------- The session destructor is blocking by default. When shutting down, trackers will need to be contacted to stop torrents and other outstanding operations need to be cancelled. Shutting down can sometimes take several seconds, primarily because of trackers that are unresponsive (and time out) and also DNS servers that are unresponsive. DNS lookups are especially difficult to abort when stalled. In order to be able to start destruction asynchronously, one can call session::abort(). This call returns a session_proxy object, which is a handle keeping the session state alive while shutting it down. It deliberately does not provide any of the session operations, since it's shutting down. After having a session_proxy object, the session destructor does not block. However, the session_proxy destructor *will*. This can be used to shut down multiple sessions or other parts of the application in parallel. asynchronous operations ----------------------- Essentially any call to a member function of session or torrent_handle that returns a value is a blocking synchronous call. Meaning it will post a message to the main libtorrent thread and wait for a response. Such calls may be expensive, and in applications where stalls should be avoided (such as user interface threads), blocking calls should be avoided. In the example above, session::add_torrent() returns a torrent_handle and is thus blocking. For higher efficiency, async_add_torrent() will post a message to the main thread to add a torrent, and post the resulting torrent_handle back in an alert (add_torrent_alert). This is especially useful when adding a lot of torrents in quick succession, as there's no stall in between calls. In the example above, we don't actually use the torrent_handle for anything, so converting it to use async_add_torrent() is just a matter of replacing the add_torrent() call with async_add_torrent(). torrent_status_updates ---------------------- To get updates to the status of torrents, call post_torrent_updates() on the session object. This will cause libtorrent to post a state_update_alert containing torrent_status objects for all torrents whose status has *changed* since the last call to post_torrent_updates(). The state_update_alert looks something like this: .. code:: c++ struct state_update_alert : alert { virtual std::string message() const; std::vector status; }; The ``status`` field only contains the torrent_status for torrents with updates since the last call. It may be empty if no torrent has updated its state. This feature is critical for scalability. See the torrent_status object for more information on what is in there. Perhaps the most interesting fields are ``total_payload_download``, ``total_payload_upload``, ``num_peers`` and ``state``. resuming torrents ----------------- Since bittorrent downloads pieces of files in random order, it's not trivial to resume a partial download. When resuming a download, the bittorrent engine must restore the state of the downloading torrent, specifically which parts of the file(s) are downloaded. There are two approaches to doing this: 1. read every piece of the downloaded files from disk and compare it against its expected hash. 2. save, to disk, the state of which pieces (and partial pieces) are downloaded, and load it back in again when resuming. If no resume data is provided with a torrent that's added, libtorrent will employ (1) by default. To save resume data, call save_resume_data() on the torrent_handle object. This will ask libtorrent to generate the resume data and post it back in a save_resume_data_alert. If generating the resume data fails for any reason, a save_resume_data_failed_alert is posted instead. Exactly one of those alerts will be posted for every call to save_resume_data(). This is an important property when shutting down a session with multiple torrents, every resume alert must be handled before resuming with shut down. Any torrent may fail to save resume data, so the client would need to keep a count of the outstanding resume files, decremented on either save_resume_data_alert or save_resume_data_failed_alert. The save_resume_data_alert looks something like this: .. code:: c++ struct save_resume_data_alert : torrent_alert { virtual std::string message() const; // the resume data add_torrent_params params; }; The ``params`` field is an add_torrent_params object containing all the state to add the torrent back to the session again. This object can be serialized using write_resume_data() or write_resume_data_buf(), and de-serialized with read_resume_data(). example ------- Here's an updated version of the above example with the following updates: 1. not using blocking calls 2. printing torrent status updates rather than the raw log 3. saving and loading resume files .. include:: ../examples/bt-get2.cpp :code: c++ :tab-width: 2 :start-after: */ session state ------------- On construction, a session object is configured by a session_params object. The session_params object notably contain session_settings, the state of the DHT node (e.g. routing table), the session's IP filter as well as the disk I/O back-end and dht storage to use. There are functions to serialize and de-serialize the session_params object to help in restoring session state from last run. Doing so is especially helpful for bootstrapping the DHT, using nodes from last run. Before destructing the session object, call ``session::session_state()`` to get the current state as a session_params object. Call write_session_params() or write_session_params_buf() to serialize the state into a bencoded entry or to a flat buffer (``std::vector``) respectively. On startup, before constructing the session object, load the buffer back from disk and call read_session_params() to de-serialize it back into a session_params object. Before passing it into the session constructor is your chance to set update the settings_pack (``params``) member of settings_params, or configuring the disk_io_constructor. example ------- Another updated version of the above example with the following updates: 1. load and save session_params to file ".session" 2. allow shutting down on ``SIGINT`` .. include:: ../examples/bt-get3.cpp :code: c++ :tab-width: 2 :start-after: */ torrent files ------------- To add torrent files to a session (as opposed to a magnet link), it must first be loaded into a torrent_info object. The torrent_info object can be created either by filename a buffer or a bencoded structure. When adding by filename, there's a sanity check limit on the size of the file, for adding arbitrarily large torrents, load the file outside of the constructor. The torrent_info object provides an opportunity to query information about the .torrent file as well as mutating it before adding it to the session. bencoding --------- bencoded structures is the default data storage format used by bittorrent, such as .torrent files, tracker announce and scrape responses and some wire protocol extensions. libtorrent provides an efficient framework for decoding bencoded data through bdecode() function. There are two separate mechanisms for *encoding* and *decoding*. When decoding, use the bdecode() function that returns a bdecode_node. When encoding, use bencode() taking an entry object. The key property of bdecode() is that it does not copy any data out of the buffer that was parsed. It builds the tree structures of references pointing into the buffer. The buffer must stay alive and valid for as long as the bdecode_node is in use. For performance details on bdecode(), see the `blog post`_ about it. .. _`blog post`: https://blog.libtorrent.org/2015/03/bdecode-parsers/ libtorrent-rasterbar-2.0.5/docs/reference-Torrent_Status.html0000664000175000017500000013617214152763504023456 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

torrent_status

Declared in "libtorrent/torrent_status.hpp"

holds a snapshot of the status of a torrent, as queried by torrent_handle::status().

struct torrent_status
{
   bool operator== (torrent_status const& st) const;

   enum state_t
   {
      checking_files,
      downloading_metadata,
      downloading,
      finished,
      seeding,
      unused_enum_for_backwards_compatibility_allocating,
      checking_resume_data,
   };

   torrent_handle handle;
   error_code errc;
   file_index_t error_file  = torrent_status::error_file_none;
   static constexpr file_index_t error_file_none {-1};
   static constexpr file_index_t error_file_ssl_ctx {-3};
   static constexpr file_index_t error_file_metadata {-4};
   static constexpr file_index_t error_file_exception {-5};
   static constexpr file_index_t error_file_partfile {-6};
   std::string save_path;
   std::string name;
   std::weak_ptr<const torrent_info> torrent_file;
   time_duration next_announce  = seconds{0};
   std::string current_tracker;
   std::int64_t total_download  = 0;
   std::int64_t total_upload  = 0;
   std::int64_t total_payload_download  = 0;
   std::int64_t total_payload_upload  = 0;
   std::int64_t total_failed_bytes  = 0;
   std::int64_t total_redundant_bytes  = 0;
   typed_bitfield<piece_index_t> pieces;
   typed_bitfield<piece_index_t> verified_pieces;
   std::int64_t total_done  = 0;
   std::int64_t total  = 0;
   std::int64_t total_wanted_done  = 0;
   std::int64_t total_wanted  = 0;
   std::int64_t all_time_upload  = 0;
   std::int64_t all_time_download  = 0;
   std::time_t added_time  = 0;
   std::time_t completed_time  = 0;
   std::time_t last_seen_complete  = 0;
   storage_mode_t storage_mode  = storage_mode_sparse;
   float progress  = 0.f;
   int progress_ppm  = 0;
   queue_position_t queue_position {};
   int download_rate  = 0;
   int upload_rate  = 0;
   int download_payload_rate  = 0;
   int upload_payload_rate  = 0;
   int num_seeds  = 0;
   int num_peers  = 0;
   int num_complete  = -1;
   int num_incomplete  = -1;
   int list_seeds  = 0;
   int list_peers  = 0;
   int connect_candidates  = 0;
   int num_pieces  = 0;
   int distributed_full_copies  = 0;
   int distributed_fraction  = 0;
   float distributed_copies  = 0.f;
   int block_size  = 0;
   int num_uploads  = 0;
   int num_connections  = 0;
   int uploads_limit  = 0;
   int connections_limit  = 0;
   int up_bandwidth_queue  = 0;
   int down_bandwidth_queue  = 0;
   int seed_rank  = 0;
   state_t state  = checking_resume_data;
   bool need_save_resume  = false;
   bool is_seeding  = false;
   bool is_finished  = false;
   bool has_metadata  = false;
   bool has_incoming  = false;
   bool moving_storage  = false;
   bool announcing_to_trackers  = false;
   bool announcing_to_lsd  = false;
   bool announcing_to_dht  = false;
   info_hash_t info_hashes;
   time_point last_upload;
   time_point last_download;
   seconds active_duration;
   seconds finished_duration;
   seconds seeding_duration;
   torrent_flags_t flags {};
};
[report issue]

operator==()

bool operator== (torrent_status const& st) const;

compares if the torrent status objects come from the same torrent. i.e. only the torrent_handle field is compared.

[report issue]

enum state_t

Declared in "libtorrent/torrent_status.hpp"

name value description
checking_files 1 The torrent has not started its download yet, and is currently checking existing files.
downloading_metadata 2 The torrent is trying to download metadata from peers. This implies the ut_metadata extension is in use.
downloading 3 The torrent is being downloaded. This is the state most torrents will be in most of the time. The progress meter will tell how much of the files that has been downloaded.
finished 4 In this state the torrent has finished downloading but still doesn't have the entire torrent. i.e. some pieces are filtered and won't get downloaded.
seeding 5 In this state the torrent has finished downloading and is a pure seeder.
unused_enum_for_backwards_compatibility_allocating 6 If the torrent was started in full allocation mode, this indicates that the (disk) storage for the torrent is allocated.
checking_resume_data 7 The torrent is currently checking the fast resume data and comparing it to the files on disk. This is typically completed in a fraction of a second, but if you add a large number of torrents at once, they will queue up.
[report issue]
handle
a handle to the torrent whose status the object represents.
[report issue]
errc
may be set to an error code describing why the torrent was paused, in case it was paused by an error. If the torrent is not paused or if it's paused but not because of an error, this error_code is not set. if the error is attributed specifically to a file, error_file is set to the index of that file in the .torrent file.
[report issue]
error_file
if the torrent is stopped because of an disk I/O error, this field contains the index of the file in the torrent that encountered the error. If the error did not originate in a file in the torrent, there are a few special values this can be set to: error_file_none, error_file_ssl_ctx, error_file_exception, error_file_partfile or error_file_metadata;
[report issue]
error_file_none
special values for error_file to describe which file or component encountered the error (errc). the error did not occur on a file
[report issue]
error_file_ssl_ctx
the error occurred setting up the SSL context
[report issue]
error_file_metadata
the error occurred while loading the metadata for the torrent
[report issue]
error_file_exception
there was a serious error reported in this torrent. The error code or a torrent log alert may provide more information.
[report issue]
error_file_partfile
the error occurred with the partfile
[report issue]
save_path
the path to the directory where this torrent's files are stored. It's typically the path as was given to async_add_torrent() or add_torrent() when this torrent was started. This field is only included if the torrent status is queried with torrent_handle::query_save_path.
[report issue]
name
the name of the torrent. Typically this is derived from the .torrent file. In case the torrent was started without metadata, and hasn't completely received it yet, it returns the name given to it when added to the session. See session::add_torrent. This field is only included if the torrent status is queried with torrent_handle::query_name.
[report issue]
torrent_file
set to point to the torrent_info object for this torrent. It's only included if the torrent status is queried with torrent_handle::query_torrent_file.
[report issue]
next_announce
the time until the torrent will announce itself to the tracker.
[report issue]
current_tracker
the URL of the last working tracker. If no tracker request has been successful yet, it's set to an empty string.
[report issue]
total_download total_upload
the number of bytes downloaded and uploaded to all peers, accumulated, this session only. The session is considered to restart when a torrent is paused and restarted again. When a torrent is paused, these counters are reset to 0. If you want complete, persistent, stats, see all_time_upload and all_time_download.
[report issue]
total_payload_download total_payload_upload
counts the amount of bytes send and received this session, but only the actual payload data (i.e the interesting data), these counters ignore any protocol overhead. The session is considered to restart when a torrent is paused and restarted again. When a torrent is paused, these counters are reset to 0.
[report issue]
total_failed_bytes
the number of bytes that has been downloaded and that has failed the piece hash test. In other words, this is just how much crap that has been downloaded since the torrent was last started. If a torrent is paused and then restarted again, this counter will be reset.
[report issue]
total_redundant_bytes
the number of bytes that has been downloaded even though that data already was downloaded. The reason for this is that in some situations the same data can be downloaded by mistake. When libtorrent sends requests to a peer, and the peer doesn't send a response within a certain timeout, libtorrent will re-request that block. Another situation when libtorrent may re-request blocks is when the requests it sends out are not replied in FIFO-order (it will re-request blocks that are skipped by an out of order block). This is supposed to be as low as possible. This only counts bytes since the torrent was last started. If a torrent is paused and then restarted again, this counter will be reset.
[report issue]
pieces
a bitmask that represents which pieces we have (set to true) and the pieces we don't have. It's a pointer and may be set to 0 if the torrent isn't downloading or seeding.
[report issue]
verified_pieces
a bitmask representing which pieces has had their hash checked. This only applies to torrents in seed mode. If the torrent is not in seed mode, this bitmask may be empty.
[report issue]
total_done
the total number of bytes of the file(s) that we have. All this does not necessarily has to be downloaded during this session (that's total_payload_download).
[report issue]
total
the total number of bytes to download for this torrent. This may be less than the size of the torrent in case there are pad files. This number only counts bytes that will actually be requested from peers.
[report issue]
total_wanted_done
the number of bytes we have downloaded, only counting the pieces that we actually want to download. i.e. excluding any pieces that we have but have priority 0 (i.e. not wanted). Once a torrent becomes seed, any piece- and file priorities are forgotten and all bytes are considered "wanted".
[report issue]
total_wanted
The total number of bytes we want to download. This may be smaller than the total torrent size in case any pieces are prioritized to 0, i.e. not wanted. Once a torrent becomes seed, any piece- and file priorities are forgotten and all bytes are considered "wanted".
[report issue]
all_time_upload all_time_download
are accumulated upload and download payload byte counters. They are saved in and restored from resume data to keep totals across sessions.
[report issue]
added_time
the posix-time when this torrent was added. i.e. what time(nullptr) returned at the time.
[report issue]
completed_time
the posix-time when this torrent was finished. If the torrent is not yet finished, this is 0.
[report issue]
last_seen_complete
the time when we, or one of our peers, last saw a complete copy of this torrent.
[report issue]
storage_mode
The allocation mode for the torrent. See storage_mode_t for the options. For more information, see storage allocation.
[report issue]
progress
a value in the range [0, 1], that represents the progress of the torrent's current task. It may be checking files or downloading.
[report issue]
progress_ppm

progress parts per million (progress * 1000000) when disabling floating point operations, this is the only option to query progress

reflects the same value as progress, but instead in a range [0, 1000000] (ppm = parts per million). When floating point operations are disabled, this is the only alternative to the floating point value in progress.

[report issue]
queue_position
the position this torrent has in the download queue. If the torrent is a seed or finished, this is -1.
[report issue]
download_rate upload_rate
the total rates for all peers for this torrent. These will usually have better precision than summing the rates from all peers. The rates are given as the number of bytes per second.
[report issue]
download_payload_rate upload_payload_rate
the total transfer rate of payload only, not counting protocol chatter. This might be slightly smaller than the other rates, but if projected over a long time (e.g. when calculating ETA:s) the difference may be noticeable.
[report issue]
num_seeds
the number of peers that are seeding that this client is currently connected to.
[report issue]
num_peers
the number of peers this torrent currently is connected to. Peer connections that are in the half-open state (is attempting to connect) or are queued for later connection attempt do not count. Although they are visible in the peer list when you call get_peer_info().
[report issue]
num_complete num_incomplete
if the tracker sends scrape info in its announce reply, these fields will be set to the total number of peers that have the whole file and the total number of peers that are still downloading. set to -1 if the tracker did not send any scrape data in its announce reply.
[report issue]
list_seeds list_peers
the number of seeds in our peer list and the total number of peers (including seeds). We are not necessarily connected to all the peers in our peer list. This is the number of peers we know of in total, including banned peers and peers that we have failed to connect to.
[report issue]
connect_candidates
the number of peers in this torrent's peer list that is a candidate to be connected to. i.e. It has fewer connect attempts than the max fail count, it is not a seed if we are a seed, it is not banned etc. If this is 0, it means we don't know of any more peers that we can try.
[report issue]
num_pieces
the number of pieces that has been downloaded. It is equivalent to: std::accumulate(pieces->begin(), pieces->end()). So you don't have to count yourself. This can be used to see if anything has updated since last time if you want to keep a graph of the pieces up to date.
[report issue]
distributed_full_copies
the number of distributed copies of the torrent. Note that one copy may be spread out among many peers. It tells how many copies there are currently of the rarest piece(s) among the peers this client is connected to.
[report issue]
distributed_fraction

tells the share of pieces that have more copies than the rarest piece(s). Divide this number by 1000 to get the fraction.

For example, if distributed_full_copies is 2 and distributed_fraction is 500, it means that the rarest pieces have only 2 copies among the peers this torrent is connected to, and that 50% of all the pieces have more than two copies.

If we are a seed, the piece picker is deallocated as an optimization, and piece availability is no longer tracked. In this case the distributed copies members are set to -1.

[report issue]
distributed_copies

the number of distributed copies of the file. note that one copy may be spread out among many peers. This is a floating point representation of the distributed copies.

the integer part tells how many copies
there are of the rarest piece(s)
the fractional part tells the fraction of pieces that
have more copies than the rarest piece(s).
[report issue]
block_size
the size of a block, in bytes. A block is a sub piece, it is the number of bytes that each piece request asks for and the number of bytes that each bit in the partial_piece_info's bitset represents, see get_download_queue(). This is typically 16 kB, but it may be smaller, if the pieces are smaller.
[report issue]
num_uploads
the number of unchoked peers in this torrent.
[report issue]
num_connections
the number of peer connections this torrent has, including half-open connections that hasn't completed the bittorrent handshake yet. This is always >= num_peers.
[report issue]
uploads_limit
the set limit of upload slots (unchoked peers) for this torrent.
[report issue]
connections_limit
the set limit of number of connections for this torrent.
[report issue]
up_bandwidth_queue down_bandwidth_queue
the number of peers in this torrent that are waiting for more bandwidth quota from the torrent rate limiter. This can determine if the rate you get from this torrent is bound by the torrents limit or not. If there is no limit set on this torrent, the peers might still be waiting for bandwidth quota from the global limiter, but then they are counted in the session_status object.
[report issue]
seed_rank
A rank of how important it is to seed the torrent, it is used to determine which torrents to seed and which to queue. It is based on the peer to seed ratio from the tracker scrape. For more information, see queuing. Higher value means more important to seed
[report issue]
state
the main state the torrent is in. See torrent_status::state_t.
[report issue]
need_save_resume
true if this torrent has unsaved changes to its download state and statistics since the last resume data was saved.
[report issue]
is_seeding
true if all pieces have been downloaded.
[report issue]
is_finished
true if all pieces that have a priority > 0 are downloaded. There is only a distinction between finished and seeding if some pieces or files have been set to priority 0, i.e. are not downloaded.
[report issue]
has_metadata
true if this torrent has metadata (either it was started from a .torrent file or the metadata has been downloaded). The only scenario where this can be false is when the torrent was started torrent-less (i.e. with just an info-hash and tracker ip, a magnet link for instance).
[report issue]
has_incoming
true if there has ever been an incoming connection attempt to this torrent.
[report issue]
moving_storage
this is true if this torrent's storage is currently being moved from one location to another. This may potentially be a long operation if a large file ends up being copied from one drive to another.
[report issue]
announcing_to_trackers announcing_to_lsd announcing_to_dht
these are set to true if this torrent is allowed to announce to the respective peer source. Whether they are true or false is determined by the queue logic/auto manager. Torrents that are not auto managed will always be allowed to announce to all peer sources.
[report issue]
info_hashes
the info-hash for this torrent
[report issue]
last_upload last_download
the timestamps of the last time this torrent uploaded or downloaded payload to any peer.
[report issue]
active_duration finished_duration seeding_duration
these are cumulative counters of for how long the torrent has been in different states. active means not paused and added to session. Whether it has found any peers or not is not relevant. finished means all selected files/pieces were downloaded and available to other peers (this is always a subset of active time). seeding means all files/pieces were downloaded and available to peers. Being available to peers does not imply there are other peers asking for the payload.
[report issue]
flags
reflects several of the torrent's flags. For more information, see torrent_handle::flags().
libtorrent-rasterbar-2.0.5/docs/reference-Utility.html0000664000175000017500000005764614152763504022131 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

bitfield

Declared in "libtorrent/bitfield.hpp"

The bitfield type stores any number of bits as a bitfield in a heap allocated array.

struct bitfield
{
   bitfield (bitfield const& rhs);
   bitfield () noexcept = default;
   bitfield (char const* b, int bits);
   bitfield (int bits, bool val);
   bitfield (bitfield&& rhs) noexcept = default;
   explicit bitfield (int bits);
   void assign (char const* b, int const bits);
   bool operator[] (int index) const noexcept;
   bool get_bit (int index) const noexcept;
   void set_bit (int index) noexcept;
   void clear_bit (int index) noexcept;
   bool all_set () const noexcept;
   bool none_set () const noexcept;
   int size () const noexcept;
   int num_words () const noexcept;
   bool empty () const noexcept;
   char* data () noexcept;
   char const* data () const noexcept;
   void swap (bitfield& rhs) noexcept;
   int count () const noexcept;
   int find_first_set () const noexcept;
   int find_last_clear () const noexcept;
};
[report issue]

bitfield()

bitfield (bitfield const& rhs);
bitfield () noexcept = default;
bitfield (char const* b, int bits);
bitfield (int bits, bool val);
bitfield (bitfield&& rhs) noexcept = default;
explicit bitfield (int bits);

constructs a new bitfield. The default constructor creates an empty bitfield. bits is the size of the bitfield (specified in bits). val is the value to initialize the bits to. If not specified all bits are initialized to 0.

The constructor taking a pointer b and bits copies a bitfield from the specified buffer, and bits number of bits (rounded up to the nearest byte boundary).

[report issue]

assign()

void assign (char const* b, int const bits);

copy bitfield from buffer b of bits number of bits, rounded up to the nearest byte boundary.

[report issue]

operator[]() get_bit()

bool operator[] (int index) const noexcept;
bool get_bit (int index) const noexcept;

query bit at index. Returns true if bit is 1, otherwise false.

[report issue]

set_bit() clear_bit()

void set_bit (int index) noexcept;
void clear_bit (int index) noexcept;

set bit at index to 0 (clear_bit) or 1 (set_bit).

[report issue]

all_set()

bool all_set () const noexcept;

returns true if all bits in the bitfield are set

[report issue]

none_set()

bool none_set () const noexcept;

returns true if no bit in the bitfield is set

[report issue]

size()

int size () const noexcept;

returns the size of the bitfield in bits.

[report issue]

num_words()

int num_words () const noexcept;

returns the number of 32 bit words are needed to represent all bits in this bitfield.

[report issue]

empty()

bool empty () const noexcept;

returns true if the bitfield has zero size.

[report issue]

data()

char* data () noexcept;
char const* data () const noexcept;

returns a pointer to the internal buffer of the bitfield, or nullptr if it's empty.

[report issue]

swap()

void swap (bitfield& rhs) noexcept;

swaps the bit-fields two variables refer to

[report issue]

count()

int count () const noexcept;

count the number of bits in the bitfield that are set to 1.

[report issue]

find_first_set()

int find_first_set () const noexcept;

returns the index of the first set bit in the bitfield, i.e. 1 bit.

[report issue]

find_last_clear()

int find_last_clear () const noexcept;

returns the index to the last cleared bit in the bitfield, i.e. 0 bit.

[report issue]

hasher

Declared in "libtorrent/hasher.hpp"

this is a SHA-1 hash class.

You use it by first instantiating it, then call update() to feed it with data. i.e. you don't have to keep the entire buffer of which you want to create the hash in memory. You can feed the hasher parts of it at a time. When You have fed the hasher with all the data, you call final() and it will return the sha1-hash of the data.

The constructor that takes a char const* and an integer will construct the sha1 context and feed it the data passed in.

If you want to reuse the hasher object once you have created a hash, you have to call reset() to reinitialize it.

The built-in software version of sha1-algorithm was implemented by Steve Reid and released as public domain. For more info, see src/sha1.cpp.

class hasher
{
   hasher ();
   hasher& operator= (hasher const&) &;
   explicit hasher (span<char const> data);
   hasher (char const* data, int len);
   hasher (hasher const&);
   hasher& update (char const* data, int len);
   hasher& update (span<char const> data);
   sha1_hash final ();
   void reset ();
};
[report issue]

hasher() operator=()

hasher& operator= (hasher const&) &;
explicit hasher (span<char const> data);
hasher (char const* data, int len);
hasher (hasher const&);

this is the same as default constructing followed by a call to update(data, len).

[report issue]

update()

hasher& update (char const* data, int len);
hasher& update (span<char const> data);

append the following bytes to what is being hashed

[report issue]

final()

sha1_hash final ();

returns the SHA-1 digest of the buffers previously passed to update() and the hasher constructor.

[report issue]

reset()

void reset ();

restore the hasher state to be as if the hasher has just been default constructed.

[report issue]

hasher256

Declared in "libtorrent/hasher.hpp"

class hasher256
{
   hasher256 ();
   explicit hasher256 (span<char const> data);
   hasher256 (hasher256 const&);
   hasher256 (char const* data, int len);
   hasher256& operator= (hasher256 const&) &;
   hasher256& update (char const* data, int len);
   hasher256& update (span<char const> data);
   sha256_hash final ();
   void reset ();
   ~hasher256 ();
};
[report issue]

operator=() hasher256()

explicit hasher256 (span<char const> data);
hasher256 (hasher256 const&);
hasher256 (char const* data, int len);
hasher256& operator= (hasher256 const&) &;

this is the same as default constructing followed by a call to update(data, len).

[report issue]

update()

hasher256& update (char const* data, int len);
hasher256& update (span<char const> data);

append the following bytes to what is being hashed

[report issue]

final()

sha256_hash final ();

returns the SHA-1 digest of the buffers previously passed to update() and the hasher constructor.

[report issue]

reset()

void reset ();

restore the hasher state to be as if the hasher has just been default constructed.

libtorrent-rasterbar-2.0.5/docs/client_test.html0000664000175000017500000001165114152763504021031 0ustar arvidarvid libtorrent
libtorrent logo

client_test example program

Version: 2.0.5

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 hard coded. The command line arguments are:

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

You can start any number of torrent downloads/seeds via the command line. 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:

img/screenshot.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 resume 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 downloading parts of pieces. It may make it easier to determine which peer that sent the corrupt data if a piece fails the hash test.

libtorrent-rasterbar-2.0.5/docs/streaming.rst0000664000175000017500000001571714152763504020360 0ustar arvidarvidStreaming implementation ======================== .. include:: header.rst This documents describes the algorithm libtorrent uses to satisfy time critical piece requests, i.e. streaming. streaming vs sequential_download -------------------------------- Libtorrent's ``sequential_download`` mode and the time-critical logic can be understood as two different ways of managing *peer request queues*. ``sequential_download`` will simply wait until a queue slot opens up, and request the next piece in the sequence. This mechanism is even simpler than the classic "rarest-first" algorithm; it does a good job of keeping request queues full, thus saturating available download bandwidth; and pieces do arrive *roughly* in-order. However, it's sub-optimal for streaming: piece 0 may be requested from a slow peer, and fast peers will get requests for later-index pieces instead of retrying more-critical ones. The time-critical logic does more *active management* of peer request queues, such that the most time-critical pieces occupy the "best" queue slots, across all peers. It can be considered an advanced version of ``sequential_download``. The main trade-off is that it is more complex to implement and utilize. piece picking ------------- The standard bittorrent piece picker is peer-centric. A peer unchokes us or we complete a block from a peer and we want to make another request to that peer. The piece picker answers the question: which block should we request from this peer. When streaming, we have a number of *time critical* pieces, the ones the video or audio player will need next to keep up with the stream. To keep the deadlines of these pieces, we need a mechanism to answer the question: I want to request blocks from this piece, which peer is the most likely to be able to deliver it to me the soonest. This question is answered by ``torrent::request_time_critical_pieces()`` in libtorrent. At a high level, this algorithm keeps a list of peers, sorted by the estimated download queue time. That is, the estimated time for a new request to this peer to be received. The bottom 10th percentile of the peers (the 10% slowest peers) are ignored and not included in the peer list. Peers that have choked us, are not interesting, is on parole, disconnecting, have too many outstanding block requests or is snubbed are also excluded from the peer list. The time critical pieces are also kept sorted by their deadline. Pieces with an earlier deadline first. This list of pieces is iterated, starting at the top, and blocks are requested from a piece until we cannot make any more requests from it. We then move on to the next piece and request blocks from it until we cannot make any more. The peer each request is sent to is the one with the lowest `download queue time`_. Each time a request is made, this estimate is updated and the peer is resorted in this list. Any peer that doesn't have the piece is ignored until we move on to the next piece. If the top peer's download queue time is more than 2 seconds, the loop is terminated. This is to not over-request. ``request_time_critical_pieces()`` is called once per second, so this will keep the queue full with margin. download queue time ------------------- Each peer maintains the number of bytes that have been requested from it but not yet been received. This is referred to as ``outstanding_bytes``. This number is incremented by the size of each outgoing request and decremented for each *payload* byte received. This counter is divided by an estimated download rate from the peer to form the estimated *download queue time*. That is, the estimated time it will take any new request to this peer to begin being received. The estimated download rate of a peer is not trivial. There may not be any outstanding requests to the peer, in which case the payload download rate will be zero. That would not be a reasonable estimate of the rate we would see once we make a request. If we have not received any payload from a peer in the last 30 seconds, we must use an alternative estimate of the download rate. If we have received payload from this peer previously, we can use the peak download rate. If we have received less than 2 blocks (32 kiB) and we have been unchoked for less than 5 seconds ago, use the average download rate of all peers (that have outstanding requests). timeouts -------- An observation that is useful to keep in mind when streaming is that your download capacity is likely to be saturated by your peers. In this case, if the swarm is well seeded, most peers will send data to you at close to the same rate. This makes it important to support streaming from many slow peers. For instance, this means you can't make assumptions about the download time of a block being less than some absolute time. You may be downloading at well above the bit rate of the video, but each individual peer only transfers at 5 kiB/s. In this state, your download rate is a zero-sum-game. Any block you request that is not urgent, will take away from the bandwidth you get for peers that are urgent. Make sure to limit requests to useful blocks only. Some requests will stall. It appears to be very hard to have enough accuracy in the prediction of download queue time such that all requests come back within a reasonable amount of time. To support adaptive timeouts, each torrent maintains a running average of how long it takes to complete a piece. There is also a running average of the deviation from the mean download time. This download time is used as the benchmark to determine when blocks have timed out, and should be re-requested from another peer. If any time-critical piece has taken more than the average piece download time + a half average deviation form that, the piece is considered to have timed out. This means we are allowed to double-request blocks. Subsequent passes over this piece will make sure that any blocks we don't already have are requested one more time. In fact, this scales to multiple time-outs. The time since a download was started is divided by average download time + average deviation time / 2. The resulting integer is the number if *times* the piece has timed out. Each time a piece times out, another *busy request* is allowed to try to make it complete sooner. A busy request is where a block is requested from a peer even though it has already been requested from another peer. This has the effect of getting more and more aggressive in requesting blocks the longer it takes to complete the piece. If this mechanism is too aggressive, a significant amount of bandwidth may be lost in redundant download (keep in mind the zero-sum game). It never makes sense to request a block twice from the same peer. There is logic in place to prevent this. optimizations ------------- One optimization is to buffer all piece requests while looping over the time- critical pieces and not send them until one round is complete. This increases the chances that the request messages are coalesced into the same packet. This in turn lowers the number of system calls and network overhead. libtorrent-rasterbar-2.0.5/docs/manual-ref.rst0000664000175000017500000020272614152763504020414 0ustar arvidarvid .. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none overview ======== The interface of libtorrent consists of a few classes. The main class is the ``session``, it contains the main loop that serves all torrents. The basic usage is as follows: * construct a `session`__, possibly passing in the state from a previous `session`__. use `read_session_params()`__ and pass in the resulting `session_params`__ object to the `session`__ constructor. * start extensions (see `add_extension()`__). * start DHT, LSD, UPnP, NAT-PMP etc (see start_dht(), start_lsd(), start_upnp() and start_natpmp()). * parse .torrent-files and add them to the `session`__ (see `torrent_info`__, `async_add_torrent()`__ and `add_torrent()`__) * main loop (see `session`__) * poll for alerts (see `wait_for_alert()`__, `pop_alerts()`__) * handle updates to torrents, (see `state_update_alert`__). * handle other alerts, (see `alert`__). * query the `session`__ for information (see session::status()). * add and remove torrents from the `session`__ (`remove_torrent()`__) * save resume data for all torrent_handles (optional, see `save_resume_data()`__) * save `session`__ state (see `session_state()`__ and `write_session_params()`__) * destruct `session`__ object Each class and function is described in this manual, you may want to have a look at the tutorial_ as well. .. _tutorial: tutorial-ref.html For a description on how to create torrent files, see `create_torrent`__. .. _make_torrent: make_torrent.html forward declarations ==================== Forward declaring types from the libtorrent namespace is discouraged as it may break in future releases. Instead include ``libtorrent/fwd.hpp`` for forward declarations of all public types in libtorrent. trouble shooting ================ A common problem developers are facing is torrents stopping without explanation. Here is a description on which conditions libtorrent will stop your torrents, how to find out about it and what to do about it. Make sure to keep track of the paused state, the error state and the upload mode of your torrents. By default, torrents are auto-managed, which means libtorrent will pause, resume, scrape them and take them out of upload-mode automatically. Whenever a torrent encounters a fatal error, it will be stopped, and the ``torrent_status::error`` will describe the error that caused it. If a torrent is auto managed, it is scraped periodically and paused or resumed based on the number of downloaders per seed. This will effectively seed torrents that are in the greatest need of seeds. If a torrent hits a disk write error, it will be put into upload mode. This means it will not download anything, but only upload. The assumption is that the write error is caused by a full disk or write permission errors. If the torrent is auto-managed, it will periodically be taken out of the upload mode, trying to write things to the disk again. This means torrent will recover from certain disk errors if the problem is resolved. If the torrent is not auto managed, you have to call set_upload_mode() to turn downloading back on again. For a more detailed guide on how to trouble shoot performance issues, see troubleshooting_ .. _troubleshooting: troubleshooting.html ABI considerations ================== libtorrent maintains a stable ABI for versions with the same major and minor versions. e.g. libtorrent-1.2.0 is ABI compatible with libtorrent-1.2.1 but not with libtorrent-1.1 network primitives ================== There are a few typedefs in the ``libtorrent`` namespace which pulls in network types from the ``boost::asio`` namespace. These are:: using address = boost::asio::ip::address; using address_v4 = boost::asio::ip::address_v4; using address_v6 = boost::asio::ip::address_v6; using boost::asio::ip::tcp; using boost::asio::ip::udp; These are declared in the ```` header. The ``using`` statements will give easy access to:: tcp::endpoint udp::endpoint Which are the endpoint types used in libtorrent. An endpoint is an address with an associated port. For documentation on these types, please refer to the `asio documentation`_. .. _`asio documentation`: https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio.html exceptions ========== Many functions in libtorrent have two versions, one that throws exceptions on errors and one that takes an ``error_code`` reference which is filled with the error code on errors. On exceptions, libtorrent will throw ``boost::system::system_error`` exceptions carrying an ``error_code`` describing the underlying error. translating error codes ----------------------- The error_code::message() function will typically return a localized error string, for system errors. That is, errors that belong to the generic or system category. Errors that belong to the libtorrent error category are not localized however, they are only available in English. In order to translate libtorrent errors, compare the error category of the ``error_code`` object against ``lt::libtorrent_category()``, and if matches, you know the error code refers to the list above. You can provide your own mapping from error code to string, which is localized. In this case, you cannot rely on ``error_code::message()`` to generate your strings. The numeric values of the errors are part of the API and will stay the same, although new error codes may be appended at the end. Here's a simple example of how to translate error codes: .. code:: c++ std::string error_code_to_string(boost::system::error_code const& ec) { if (ec.category() != lt::libtorrent_category()) { return ec.message(); } // the error is a libtorrent error int code = ec.value(); static const char const* swedish[] = { "inget fel", "en fil i torrenten kolliderar med en fil fran en annan torrent", "hash check misslyckades", "torrentfilen ar inte en dictionary", "'info'-nyckeln saknas eller ar korrupt i torrentfilen", "'info'-faltet ar inte en dictionary", "'piece length' faltet saknas eller ar korrupt i torrentfilen", "torrentfilen saknar namnfaltet", "ogiltigt namn i torrentfilen (kan vara en attack)", // ... more strings here }; // use the default error string in case we don't have it // in our translated list if (code < 0 || code >= sizeof(swedish)/sizeof(swedish[0])) return ec.message(); return swedish[code]; } magnet links ============ Magnet links are URIs that includes an info-hash, a display name and optionally a tracker url. The idea behind magnet links is that an end user can click on a link in a browser and have it handled by a bittorrent application, to start a download, without any .torrent file. The format of the magnet URI is: **magnet:?xt=urn:btih:** *Base16 encoded info-hash* [ **&dn=** *name of download* ] [ **&tr=** *tracker URL* ]* In order to download *just* the metadata (.torrent file) from a magnet link, set the torrent_flags::upload_mode flag in `add_torrent_params`__ before adding the it. In this case, when the metadata is received from the swarm, the torrent will still be running, but it will disconnect the majority of peers (since connections to peers that already have the metadata are redundant). It will keep seeding the *metadata* only. Note that this doesn't prevent empty files from being created, if the torrent contains any. If you need to prevent that, you can either set ``file_priority`` to a long list of zeros (since the number of files is not known in advance), or set ``save_path`` to an invalid path. .torrent file ------------- To save a .torrent file from a torrent that was added by magnet link (or added any way really): * call `save_resume_data()`__ on the `torrent_handle`__, make sure to pass in the ``save_info_dict`` flag * wait for resume_data_alert * call `write_torrent_file()`__ passing in the `add_torrent_params`__ object from the `alert`__. The resume data format is very similar to the .torrent file format, and when including the info-dict in the resume data, the resume file can be used as a .torrent file (with just a few minor exceptions). queuing ======= libtorrent supports *queuing*. Queuing is a mechanism to automatically pause and resume torrents based on certain criteria. The criteria depends on the overall state the torrent is in (checking, downloading or seeding). To opt-out of the queuing logic, make sure your torrents are added with the torrent_flags::auto_managed bit *cleared* from ``add_torrent_params::flags``. Or call `torrent_handle::unset_flags()`__ and pass in torrent_flags::auto_managed on the torrent handle. The overall purpose of the queuing logic is to improve performance under arbitrary torrent downloading and seeding load. For example, if you want to download 100 torrents on a limited home connection, you improve performance by downloading them one at a time (or maybe two at a time), over downloading them all in parallel. The benefits are: * the average completion time of a torrent is half of what it would be if all downloaded in parallel. * The amount of upload capacity is more likely to reach the *reciprocation rate* of your peers, and is likely to improve your *return on investment* (download to upload ratio) * your disk I/O load is likely to be more local which may improve I/O performance and decrease fragmentation. There are fundamentally 3 separate queues: * checking torrents * downloading torrents * seeding torrents Every torrent that is not seeding has a queue number associated with it, this is its place in line to be started. See `torrent_status::queue_position`__. On top of the limits of each queue, there is an over arching limit, set in `settings_pack::active_limit`__. The auto manager will never start more than this number of torrents (with one exception described below). Non-auto-managed torrents are exempt from this logic, and not counted. At a regular interval, torrents are checked if there needs to be any re-ordering of which torrents are active and which are queued. This interval can be controlled via `settings_pack::auto_manage_interval`__. For queuing to work, resume data needs to be saved and restored for all torrents. See `torrent_handle::save_resume_data()`__. queue position -------------- The torrents in the front of the queue are started and the rest are ordered by their queue position. Any newly added torrent is placed at the end of the queue. Once a torrent is removed or turns into a seed, its queue position is -1 and all torrents that used to be after it in the queue, decreases their position in order to fill the gap. The queue positions are always contiguous, in a sequence without any gaps. Lower queue position means closer to the front of the queue, and will be started sooner than torrents with higher queue positions. To query a torrent for its position in the queue, or change its position, see: `torrent_handle::queue_position()`__, `torrent_handle::queue_position_up()`__, `torrent_handle::queue_position_down()`__, `torrent_handle::queue_position_top()`__ and `torrent_handle::queue_position_bottom()`__. checking queue -------------- The checking queue affects torrents in the torrent_status::checking or torrent_status::allocating state that are auto-managed. The checking queue will make sure that (of the torrents in its queue) no more than settings_pack::active_checking_limit torrents are started at any given time. Once a torrent completes checking and moves into a different state, the next in line will be started for checking. Any torrent added force-started or force-stopped (i.e. the auto managed flag is *not* set), will not be subject to this limit and they will all check independently and in parallel. Once a torrent completes the checking of its files, or resume data, it will be put in the queue for downloading and potentially start downloading immediately. In order to add a torrent and check its files without starting the download, it can be added in ``stop_when_ready`` mode. See add_torrent_params::flag_stop_when_ready. This flag will stop the torrent once it is ready to start downloading. This is conceptually the same as waiting for the ``torrent_checked_alert`` and then call:: h.set_flags(torrent_flags::paused, torrent_flags::paused | torrent_flags::auto_managed); With the important distinction that it entirely avoids the brief window where the torrent is in downloading state. downloading queue ----------------- Similarly to the checking queue, the downloading queue will make sure that no more than `settings_pack::active_downloads`__ torrents are in the downloading state at any given time. The `torrent_status::queue_position`__ is used again here to determine who is next in line to be started once a downloading torrent completes or is stopped/removed. seeding queue ------------- The seeding queue does not use `torrent_status::queue_position`__ to determine which torrent to seed. Instead, it estimates the *demand* for the torrent to be seeded. A torrent with few other seeds and many downloaders is assumed to have a higher demand of more seeds than one with many seeds and few downloaders. It limits the number of started seeds to `settings_pack::active_seeds`__. On top of this basic bias, *seed priority* can be controller by specifying a seed ratio (the upload to download ratio), a seed-time ratio (the download time to seeding time ratio) and a seed-time (the absolute time to be seeding a torrent). Until all those targets are hit, the torrent will be prioritized for seeding. Among torrents that have met their seed target, torrents where we don't know of any other seed take strict priority. In order to avoid flapping, torrents that were started less than 30 minutes ago also have priority to keep seeding. Finally, for torrents where none of the above apply, they are prioritized based on the download to seed ratio. The relevant settings to control these limits are `settings_pack::share_ratio_limit`__, `settings_pack::seed_time_ratio_limit`__ and `settings_pack::seed_time_limit`__. queuing options --------------- In addition to simply starting and stopping torrents, the queuing mechanism can have more fine grained control of the resources used by torrents. half-started torrents ..................... In addition to the downloading and seeding limits, there are limits on *actions* torrents perform. The downloading and seeding limits control whether peers are allowed at all, and if peers are not allowed, torrents are stopped and don't do anything. If peers are allowed, torrents may: 1. announce to trackers 2. announce to the DHT 3. announce to local peer discovery (local service discovery) Each of those actions are associated with a cost and hence may need a separate limit. These limits are controlled by `settings_pack::active_tracker_limit`__, `settings_pack::active_dht_limit`__ and `settings_pack::active_lsd_limit`__ respectively. Specifically, announcing to a tracker is typically cheaper than announcing to the DHT. `settings_pack::active_dht_limit`__ will limit the number of torrents that are allowed to announce to the DHT. The highest priority ones will, and the lower priority ones won't. The will still be considered started though, and any incoming peers will still be accepted. If you do not wish to impose such limits (basically, if you do not wish to have half-started torrents) make sure to set these limits to -1 (infinite). prefer seeds ............ In the case where ``active_downloads`` + ``active_seeds`` > ``active_limit``, there's an ambiguity whether the downloads should be satisfied first or the seeds. To disambiguate this case, the `settings_pack::auto_manage_prefer_seeds`__ determines whether seeds are preferred or not. inactive torrents ................. Torrents that are not transferring any bytes (downloading or uploading) have a relatively low cost to be started. It's possible to exempt such torrents from the download and seed queues by setting `settings_pack::dont_count_slow_torrents`__ to true. Since it sometimes may take a few minutes for a newly started torrent to find peers and be unchoked, or find peers that are interested in requesting data, torrents are not considered inactive immediately. There must be an extended period of no transfers before it is considered inactive and exempt from the queuing limits. fast resume =========== The fast resume mechanism is a way to remember which pieces are downloaded and where they are put between sessions. You can generate fast resume data by: * calling `save_resume_data()`__ on `torrent_handle`__. Pass in the ``save_info_dict`` flag. * wait for resume_data_alert * save the `add_torrent_params`__ object using `write_resume_data()`__ When adding a torrent using resume data, load it using `read_resume_data()`__. This populates an `add_torrent_params`__ object, which can be passed directly to `add_torrent()`__ or `async_add_torrent()`__ on the `session`__ object. libtorrent will not check the piece hashes then, and rely on the information given in the fast-resume data. The fast-resume data also contains information about which blocks, in the unfinished pieces, were downloaded, so it will not have to start from scratch on the partially downloaded pieces. To use the fast-resume data you pass it to `read_resume_data()`__, which will return an `add_torrent_params`__ object. Fields of this object can then be altered before passing it to `async_add_torrent()`__ or `add_torrent()`__. The `session`__ will then skip the time consuming checks. It may have to do the checking anyway, if the fast-resume data is corrupt or doesn't fit the storage for that torrent. file format ----------- The file format is a bencoded dictionary containing the following fields: +--------------------------+--------------------------------------------------------------+ | ``file-format`` | string: "libtorrent resume file" | | | | +--------------------------+--------------------------------------------------------------+ | ``info-hash`` | string, the info hash of the torrent this data is saved for. | | | This is a 20 byte SHA-1 hash of the info section of the | | | torrent if this is a v1 or v1+v2-hybrid torrent. | +--------------------------+--------------------------------------------------------------+ | ``info-hash2`` | string, the v2 info hash of the torrent this data is saved. | | | for, in case it is a v2 or v1+v2-hybrid torrent. This is a | | | 32 byte SHA-256 hash of the info section of the torrent. | +--------------------------+--------------------------------------------------------------+ | ``pieces`` | A string with piece flags, one character per piece. | | | Bit 1 means we have that piece. | | | Bit 2 means we have verified that this piece is correct. | | | This only applies when the torrent is in seed_mode. | +--------------------------+--------------------------------------------------------------+ | ``total_uploaded`` | integer. The number of bytes that have been uploaded in | | | total for this torrent. | +--------------------------+--------------------------------------------------------------+ | ``total_downloaded`` | integer. The number of bytes that have been downloaded in | | | total for this torrent. | +--------------------------+--------------------------------------------------------------+ | ``active_time`` | integer. The number of seconds this torrent has been active. | | | i.e. not paused. | +--------------------------+--------------------------------------------------------------+ | ``seeding_time`` | integer. The number of seconds this torrent has been active | | | and seeding. | +--------------------------+--------------------------------------------------------------+ | ``last_upload`` | integer. The number of seconds since epoch when we last | | | uploaded payload to a peer on this torrent. | +--------------------------+--------------------------------------------------------------+ | ``last_download`` | integer. The number of seconds since epoch when we last | | | downloaded payload from a peer on this torrent. | +--------------------------+--------------------------------------------------------------+ | ``upload_rate_limit`` | integer. In case this torrent has a per-torrent upload rate | | | limit, this is that limit. In bytes per second. | +--------------------------+--------------------------------------------------------------+ | ``download_rate_limit`` | integer. The download rate limit for this torrent in case | | | one is set, in bytes per second. | +--------------------------+--------------------------------------------------------------+ | ``max_connections`` | integer. The max number of peer connections this torrent | | | may have, if a limit is set. | +--------------------------+--------------------------------------------------------------+ | ``max_uploads`` | integer. The max number of unchoked peers this torrent may | | | have, if a limit is set. | +--------------------------+--------------------------------------------------------------+ | ``file_priority`` | list of integers. One entry per file in the torrent. Each | | | entry is the priority of the file with the same index. | +--------------------------+--------------------------------------------------------------+ | ``piece_priority`` | string of bytes. Each byte is interpreted as an integer and | | | is the priority of that piece. | +--------------------------+--------------------------------------------------------------+ | ``seed_mode`` | integer. 1 if the torrent is in seed mode, 0 otherwise. | +--------------------------+--------------------------------------------------------------+ | ``upload_mode`` | integer. 1 if the torrent_flags::upload_mode is set. | +--------------------------+--------------------------------------------------------------+ | ``share_mode`` | integer. 1 if the torrent_flags::share_mode is set. | +--------------------------+--------------------------------------------------------------+ | ``apply_ip_filter`` | integer. 1 if the torrent_flags::apply_ip_filter is set. | +--------------------------+--------------------------------------------------------------+ | ``paused`` | integer. 1 if the torrent is paused, 0 otherwise. | +--------------------------+--------------------------------------------------------------+ | ``auto_managed`` | integer. 1 if the torrent is auto managed, otherwise 0. | +--------------------------+--------------------------------------------------------------+ | ``super_seeding`` | integer. 1 if the torrent_flags::super_seeding is set. | +--------------------------+--------------------------------------------------------------+ | ``sequential_download`` | integer. 1 if the torrent is in sequential download mode, | | | 0 otherwise. | +--------------------------+--------------------------------------------------------------+ | ``stop_when_ready`` | integer. 1 if the torrent_flags::stop_when_ready is set. | +--------------------------+--------------------------------------------------------------+ | ``disable_dht`` | integer. 1 if the torrent_flags::disable_dht is set. | +--------------------------+--------------------------------------------------------------+ | ``disable_lsd`` | integer. 1 if the torrent_flags::disable_lsd is set. | +--------------------------+--------------------------------------------------------------+ | ``disable_pex`` | integer. 1 if the torrent_flags::disable_pex is set. | +--------------------------+--------------------------------------------------------------+ | ``trackers`` | list of lists of strings. The top level list lists all | | | tracker tiers. Each second level list is one tier of | | | trackers. | +--------------------------+--------------------------------------------------------------+ | ``mapped_files`` | list of strings. If any file in the torrent has been | | | renamed, this entry contains a list of all the filenames. | | | In the same order as in the torrent file. | +--------------------------+--------------------------------------------------------------+ | ``url-list`` | list of strings. List of url-seed URLs used by this torrent. | | | The URLs are expected to be properly encoded and not contain | | | any illegal url characters. | +--------------------------+--------------------------------------------------------------+ | ``httpseeds`` | list of strings. List of HTTP seed URLs used by this torrent.| | | The URLs are expected to be properly encoded and not contain | | | any illegal url characters. | +--------------------------+--------------------------------------------------------------+ | ``trees`` | list. In case this is a v2 (or v1+v2-hybrid) torrent, this | | | is an optional list containing the merkle tree nodes we know | | | of so far, for all files. It's a list of dictionaries, one | | | entry for each file in the torrent. The entries have the | | | following structure: | | | | | | +--------------+-------------------------------------------+ | | | | ``hashes`` | string. Sequence of 32 byte (SHA-256) | | | | | | hashes, representing the nodes in the | | | | | | merkle hash tree for this file. Some | | | | | | hashes may be all zeros, if we haven't | | | | | | downloaded them yet. | | | | +--------------+-------------------------------------------+ | | | | ``mask`` | string. When present, a bitmask (of ``0`` | | | | | | and ``1`` characters, indicating which | | | | | | hashes of the full tree are included in | | | | | | the ``hashes`` key. This is used to avoid | | | | | | storing large numbers of zeros. | | | | +--------------+-------------------------------------------+ | | | | ``verified`` | string. This indicates which leaf nodes | | | | | | in the tree have been verified correct. | | | | | | There is one character per leaf, ``0`` | | | | | | means not verified, ``1`` means verified. | | | | +--------------+-------------------------------------------+ | | | | +--------------------------+--------------------------------------------------------------+ | ``save_path`` | string. The save path where this torrent was saved. This is | | | especially useful when moving torrents with move_storage() | | | since this will be updated. | +--------------------------+--------------------------------------------------------------+ | ``peers`` | string. This string contains IPv4 and port pairs of peers we | | | were connected to last session. The endpoints are in compact | | | representation. 4 bytes IPv4 address followed by 2 bytes | | | port. Hence, the length of this string should be divisible | | | by 6. | +--------------------------+--------------------------------------------------------------+ | ``banned_peers`` | string. This string has the same format as ``peers`` but | | | instead represent IPv4 peers that we have banned. | +--------------------------+--------------------------------------------------------------+ | ``peers6`` | string. This string contains IPv6 and port pairs of peers we | | | were connected to last session. The endpoints are in compact | | | representation. 16 bytes IPv6 address followed by 2 bytes | | | port. The length of this string should be divisible by 18. | +--------------------------+--------------------------------------------------------------+ | ``banned_peers6`` | string. This string has the same format as ``peers6`` but | | | instead represent IPv6 peers that we have banned. | +--------------------------+--------------------------------------------------------------+ | ``info`` | If this field is present, it should be the info-dictionary | | | of the torrent this resume data is for. Its SHA-1 hash must | | | match the one in the ``info-hash`` field. When present, | | | the torrent is loaded from here, meaning the torrent can be | | | added purely from resume data (no need to load the .torrent | | | file separately). This may have performance advantages. | +--------------------------+--------------------------------------------------------------+ | ``unfinished`` | list of dictionaries. Each dictionary represents an | | | piece, and has the following layout: | | | | | | +-------------+--------------------------------------------+ | | | | ``piece`` | integer, the index of the piece this entry | | | | | | refers to. | | | | +-------------+--------------------------------------------+ | | | | ``bitmask`` | string, a binary bitmask representing the | | | | | | blocks that have been downloaded in this | | | | | | piece. | | | | +-------------+--------------------------------------------+ | | | | ``adler32`` | The adler32 checksum of the data in the | | | | | | blocks specified by ``bitmask``. | | | | | | | | | | +-------------+--------------------------------------------+ | | | | +--------------------------+--------------------------------------------------------------+ | ``allocation`` | The allocation mode for the storage. Can be either | | | ``allocate`` or ``sparse``. | +--------------------------+--------------------------------------------------------------+ storage allocation ================== There are two modes in which storage (files on disk) are allocated in libtorrent. 1. The traditional *full allocation* mode, where the entire files are filled up with zeros before anything is downloaded. Files are allocated on demand, the first time anything is written to them. The main benefit of this mode is that it avoids creating heavily fragmented files. 2. The *sparse allocation*, sparse files are used, and pieces are downloaded directly to where they belong. This is the recommended (and default) mode. sparse allocation ----------------- On filesystems that supports sparse files, this allocation mode will only use as much space as has been downloaded. The main drawback of this mode is that it may create heavily fragmented files. * It does not require an allocation pass on startup. full allocation --------------- When a torrent is started in full allocation mode, the disk-io thread will make sure that the entire storage is allocated, and fill any gaps with zeros. It will of course still check for existing pieces and fast resume data. The main drawbacks of this mode are: * It may take longer to start the torrent, since it will need to fill the files with zeros. This delay is linear to the size of the download. * The download may occupy unnecessary disk space between download sessions. * Disk caches usually perform poorly with random access to large files and may slow down the download some. The benefits of this mode are: * Downloaded pieces are written directly to their final place in the files and the total number of disk operations will be fewer and may also play nicer to the filesystem file allocation, and reduce fragmentation. * No risk of a download failing because of a full disk during download, once all files have been created. HTTP seeding ============ There are two kinds of HTTP seeding. One with that assumes a smart (and polite) client and one that assumes a smart server. These are specified in `BEP 19`_ and `BEP 17`_ respectively. libtorrent supports both. In the libtorrent source code and API, BEP 19 URLs are typically referred to as *url seeds* and BEP 17 URLs are typically referred to as *HTTP seeds*. The libtorrent implementation of `BEP 19`_ assumes that, if the URL ends with a slash ('/'), the filename should be appended to it in order to request pieces from that file. The way this works is that if the torrent is a single-file torrent, only that filename is appended. If the torrent is a multi-file torrent, the torrent's name '/' the file name is appended. This is the same directory structure that libtorrent will download torrents into. There is limited support for HTTP redirects. In case some files are redirected to *different hosts*, the files must be piece aligned or padded to be piece aligned. .. _`BEP 17`: https://www.bittorrent.org/beps/bep_0017.html .. _`BEP 19`: https://www.bittorrent.org/beps/bep_0019.html piece picker ============ The piece picker in libtorrent has the following features: * rarest first * sequential download * random pick * reverse order picking * parole mode * prioritize partial pieces * prefer whole pieces * piece affinity by speed category * piece priorities internal representation ----------------------- It is optimized by, at all times, keeping a list of pieces ordered by rarity, randomly shuffled within each rarity class. This list is organized as a single vector of contiguous memory in RAM, for optimal memory locality and to eliminate heap allocations and frees when updating rarity of pieces. Expensive events, like a peer joining or leaving, are evaluated lazily, since it's cheaper to rebuild the whole list rather than updating every single piece in it. This means as long as no blocks are picked, peers joining and leaving is no more costly than a single peer joining or leaving. Of course the special cases of peers that have all or no pieces are optimized to not require rebuilding the list. picker strategy --------------- The normal mode of the picker is of course *rarest first*, meaning pieces that few peers have are preferred to be downloaded over pieces that more peers have. This is a fundamental algorithm that is the basis of the performance of bittorrent. However, the user may set the piece picker into sequential download mode. This mode simply picks pieces sequentially, always preferring lower piece indices. When a torrent starts out, picking the rarest pieces means increased risk that pieces won't be completed early (since there are only a few peers they can be downloaded from), leading to a delay of having any piece to offer to other peers. This lack of pieces to trade, delays the client from getting started into the normal tit-for-tat mode of bittorrent, and will result in a long ramp-up time. The heuristic to mitigate this problem is to, for the first few pieces, pick random pieces rather than rare pieces. The threshold for when to leave this initial picker mode is determined by `settings_pack::initial_picker_threshold`__. reverse order ------------- An orthogonal setting is *reverse order*, which is used for *snubbed* peers. Snubbed peers are peers that appear very slow, and might have timed out a piece request. The idea behind this is to make all snubbed peers more likely to be able to do download blocks from the same piece, concentrating slow peers on as few pieces as possible. The reverse order means that the most common pieces are picked, instead of the rarest pieces (or in the case of sequential download, the last pieces, instead of the first). parole mode ----------- Peers that have participated in a piece that failed the hash check, may be put in *parole mode*. This means we prefer downloading a full piece from this peer, in order to distinguish which peer is sending corrupt data. Whether to do this is or not is controlled by `settings_pack::use_parole_mode`__. In parole mode, the piece picker prefers picking one whole piece at a time for a given peer, avoiding picking any blocks from a piece any other peer has contributed to (since that would defeat the purpose of parole mode). prioritize partial pieces ------------------------- This setting determines if partially downloaded or requested pieces should always be preferred over other pieces. The benefit of doing this is that the number of partial pieces is minimized (and hence the turn-around time for downloading a block until it can be uploaded to others is minimized). It also puts less stress on the disk cache, since fewer partial pieces need to be kept in the cache. Whether or not to enable this is controlled by setting_pack::prioritize_partial_pieces. The main benefit of not prioritizing partial pieces is that the rarest first algorithm gets to have more influence on which pieces are picked. The picker is more likely to truly pick the rarest piece, and hence improving the performance of the swarm. This setting is turned on automatically whenever the number of partial pieces in the piece picker exceeds the number of peers we're connected to times 1.5. This is in order to keep the waste of partial pieces to a minimum, but still prefer rarest pieces. prefer whole pieces ------------------- The *prefer whole pieces* setting makes the piece picker prefer picking entire pieces at a time. This is used by web connections (both http seeding standards), in order to be able to coalesce the small bittorrent requests to larger HTTP requests. This significantly improves performance when downloading over HTTP. It is also used by peers that are downloading faster than a certain threshold. The main advantage is that these peers will better utilize the other peer's disk cache, by requesting all blocks in a single piece, from the same peer. This threshold is controlled by the `settings_pack::whole_pieces_threshold`__ setting. *TODO: piece priorities* Multi-homed hosts ================= The `settings_pack::listen_interfaces`__ setting is used to specify which interfaces/IP addresses to listen on, and accept incoming connections via. Each item in ``listen_interfaces`` is an IP address or a device name, followed by a listen port number. Each item (called ``listen_socket_t``) will have the following objects associated with it: * a listen socket accepting incoming TCP connections * a UDP socket: 1. to accept incoming uTP connections 2. to run a DHT instance on 3. to announce to UDP trackers from 4. a SOCKS5 UDP tunnel (if applicable) * a listen address and netmask, describing the network the sockets are bound to * a Local service discovery object, broadcasting to the specified subnet * a NAT-PMP/PCP port mapper (if applicable), to map ports on the gateway for the specified subnet. * a UPnP port mapper (if applicable), to map ports on any * ``InternetGatewayDevice`` found on the specified local subnet. A ``listen_socket_t`` item may be specified to only be a local network (with the ``l`` suffix). Such listen socket will only be used to talk to peers and trackers within the same local network. The netmask defining the network is queried from the operating system by enumerating network interfaces. An item that's considered to be "local network" will not be used to announce to trackers outside of that network. For example, ``10.0.0.2:6881l`` is marked as "local network" and it will only be used as the source address announcing to a tracker if the tracker is also within the same local network (e.g. ``10.0.0.0/8``). The NAT-PMP/PCP and UPnP port mapper objects are only created for networks that are expected to be externally available (i.e. not "local network"). If there are multiple subnets connected to the internet, they will have separate port mappings. expanding device names ---------------------- If a device name is specified, libtorrent will expand it to the IP addresses associated with that device, but also retain the device name in order to attempt to bind the listen sockets to that specific device. expanding unspecified addresses ------------------------------- If an IP address is the *unspecified* address (i.e. ``0.0.0.0`` or ``::``), libtorrent will expand it to specific IP addresses. This expansion will enumerate all addresses it can find for the corresponding address family. The expanded IP addresses are considered "local network" if any of the following conditions are met: * the IP address is in a known link-local range * the IP address is in a known loopback range * the item the IP address was expanded from was marked local (``l``) * the network interface has the ``loopback`` flag set * NONE of the following conditions are met: 1. the IP address is in a globally reachable IP address range 2. the network interface has the ``point-to-point`` flag set 3. the routing table contains a route for at least one global internet address (e.g. a default route) for the address family of the expanded IP that points to the network interface of the expanded IP. routing ------- A ``listen_socket_t`` item is considered able to route to a destination address if any of these hold: * the destination address falls inside its subnet (i.e. interface address masked by netmask is the same as the destination address masked by the netmask). * the ``listen_socket_t`` does not have the "local network" flag set, and the address family matches the destination address. The ability to route to an address is used when determining whether to announce to a tracker from a ``listen_socket_t`` and whether to open a SOCKS5 UDP tunnel for a ``listen_socket_t``. Note that the actual IP stack routing table is not considered for this purpose. This mechanism is to determine which IP addresses should be announced to trackers. tracker announces ----------------- Trackers are announced to from all network interfaces listening for incoming connections. However, interfaces that cannot be used to reach the tracker, such as loopback, are not used as the source address for announces. A ``listen_socket_t`` item that can route to at least one of the tracker IP addresses will be used as the source address for an announce. Each such item will also have an `announce_endpoint`__ item associated with it, in the tracker list. If a tracker can be reached on a loopback address, then the loopback interface *will* be used to announce to that tracker. But under normal circumstances, loopback will not be used for announcing to trackers. For more details, see `BEP 7`_. .. _`BEP 7`: https://www.bittorrent.org/beps/bep_0007.html SOCKS5 UDP tunnels ------------------ When using a SOCKS5 proxy, each interface that can route to one of the SOCKS5 proxy's addresses will be used to open a UDP tunnel, via that proxy. For example, if a client has both IPv4 and IPv6 connectivity, but the socks5 proxy only resolves to IPv4, only the IPv4 address will have a UDP tunnel. In that case, the IPv6 connection will not be used, since it cannot use the proxy. rate based choking ================== libtorrent supports a choking algorithm that automatically determines the number of upload slots (unchoke slots) based on the upload rate to peers. It is controlled by the `settings_pack::choking_algorithm`__ setting. The `settings_pack::unchoke_slots_limit`__ is ignored in this mode. The algorithm is designed to stay stable, and not oscillate the number of upload slots. The initial rate threshold is set to `settings_pack::rate_choker_initial_threshold`__. It sorts all peers by on the rate at which we are uploading to them. 1. Compare the fastest peer against the initial threshold. 2. Increment the threshold by 2 kiB/s. 3. The next fastest peer is compared against the threshold. If the peer rate is higher than the threshold. goto 2 4. Terminate. The number of peers visited is the number of unchoke slots, but never less than 2. In other words, the more upload slots you have, the higher rate does the slowest unchoked peer upload at in order to open another slot. predictive piece announce ========================= In order to improve performance, libtorrent supports a feature called ``predictive piece announce``. When enabled, it will make libtorrent announce that we have pieces to peers, before we truly have them. The most important case is to announce a piece as soon as it has been downloaded and passed the hash check, but not yet been written to disk. In this case, there is a risk the piece will fail to be written to disk, in which case we won't have the piece anymore, even though we announced it to peers. The other case is when we're very close to completing the download of a piece and assume it will pass the hash check, we can announce it to peers to make it available one round-trip sooner than otherwise. This lets libtorrent start uploading the piece to interested peers immediately when the piece complete, instead of waiting one round-trip for the peers to request it. This makes for the implementation slightly more complicated, since piece will have more states and more complicated transitions. For instance, a piece could be: 1. hashed but not fully written to disk 2. fully written to disk but not hashed 3. not fully downloaded 4. downloaded and hash checked Once a piece is fully downloaded, the hash check could complete before any of the write operations or it could complete after all write operations are complete. peer classes ============ The peer classes feature in libtorrent allows a client to define custom groups of peers and rate limit them individually. Each such group is called a *peer class*. There are a few default peer classes that are always created: * global - all peers belong to this class, except peers on the local network * local peers - all peers on the local network belongs to this class TCP peers * tcp class - all peers connected over TCP belong to this class The TCP peers class is used by the uTP/TCP balancing logic, if it's enabled, to throttle TCP peers. The global and local classes are used to adjust the global rate limits. When the rate limits are adjusted for a specific torrent, a class is created implicitly for that torrent. The default peer class IDs are defined as enums in the ``session`` class: .. code:: c++ enum { global_peer_class_id, tcp_peer_class_id, local_peer_class_id }; The default peer classes are automatically created on `session`__ startup, and configured to apply to each respective type of connection. There's nothing preventing a client from reconfiguring the peer class ip- and type filters to disable or customize which peers they apply to. See `set_peer_class_filter()`__ and `set_peer_class_type_filter()`__. A peer class can be considered a more general form of *labels* that some clients have. Peer classes however are not just applied to torrents, but ultimately the peers. Peer classes can be created with the `create_peer_class()`__ call (on the `session`__ object), and deleted with the `delete_peer_class()`__ call. Peer classes are configured with the `set_peer_class()`__ `get_peer_class()`__ calls. Custom peer classes can be assigned based on the peer's IP address or the type of transport protocol used. See `set_peer_class_filter()`__ and `set_peer_class_type_filter()`__ for more information. peer class examples ------------------- Here are a few examples of common peer class operations. To make the global rate limit apply to local peers as well, update the IP-filter based peer class assignment: .. code:: c++ std::uint32_t const mask = 1 << lt::session::global_peer_class_id; ip_filter f; // for every IPv4 address, assign the global peer class f.add_rule(make_address("0.0.0.0"), make_address("255.255.255.255"), mask); // for every IPv6 address, assign the global peer class f.add_rule(make_address("::") , make_address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") , mask); ses.set_peer_class_filter(f); To make uTP sockets exempt from rate limiting: .. code:: c++ peer_class_type_filter flt = ses.get_peer_class_type_filter(); // filter out the global and local peer class for uTP sockets, if these // classes are set by the IP filter flt.disallow(peer_class_type_filter::utp_socket, session::global_peer_class_id); flt.disallow(peer_class_type_filter::utp_socket, session::local_peer_class_id); // this filter should not add the global or local peer class to utp sockets flt.remove(peer_class_type_filter::utp_socket, session::global_peer_class_id); flt.remove(peer_class_type_filter::utp_socket, session::local_peer_class_id); ses.set_peer_class_type_filter(flt); To make all peers on the internal network not subject to throttling: .. code:: c++ std::uint32_t const mask = 1 << lt::session::global_peer_class_id; ip_filter f; // for every IPv4 address, assign the global peer class f.add_rule(make_address("0.0.0.0"), make_address("255.255.255.255"), mask); // for every address on the local metwork, set the mask to 0 f.add_rule(make_address("10.0.0.0"), make_address("10.255.255.255"), 0); ses.set_peer_class_filter(f); SSL torrents ============ Torrents may have an SSL root (CA) certificate embedded in them. Such torrents are called *SSL torrents*. An SSL torrent talks to all bittorrent peers over SSL. The protocols are layered like this: .. image:: img/utp_stack.png :class: bw :align: right During the SSL handshake, both peers need to authenticate by providing a certificate that is signed by the CA certificate found in the .torrent file. These peer certificates are expected to be provided to peers through some other means than bittorrent. Typically by a peer generating a certificate request which is sent to the publisher of the torrent, and the publisher returning a signed certificate. In libtorrent, `set_ssl_certificate()`__ in `torrent_handle`__ is used to tell libtorrent where to find the peer certificate and the private key for it. When an SSL torrent is loaded, the `torrent_need_cert_alert`__ is posted to remind the user to provide a certificate. A peer connecting to an SSL torrent MUST provide the *SNI* TLS extension (server name indication). The server name is the hex encoded info-hash of the torrent to connect to. This is required for the client accepting the connection to know which certificate to present. SSL connections are accepted on a separate socket from normal bittorrent connections. To enable support for SSL torrents, add a listen interface to the `settings_pack::listen_interfaces`__ setting with the ``s`` suffix. For example:: 0.0.0.0:6881,0.0.0.0:6882s That will listen for normal bittorrent connections on port 6881 and for SSL torrent connections on port 6882. This feature is only available if libtorrent is built with SSL torrent support (``TORRENT_SSL_PEERS``) and requires at least OpenSSL version 1.0, since it needs SNI support. Peer certificates must have at least one *SubjectAltName* field of type DNSName. At least one of the fields must *exactly* match the name of the torrent. This is a byte-by-byte comparison, the UTF-8 encoding must be identical (i.e. there's no unicode normalization going on). This is the recommended way of verifying certificates for HTTPS servers according to `RFC 2818`_. Note the difference that for torrents only *DNSName* fields are taken into account (not IP address fields). The most specific (i.e. last) *Common Name* field is also taken into account if no *SubjectAltName* did not match. If any of these fields contain a single asterisk ("*"), the certificate is considered covering any torrent, allowing it to be reused for any torrent. The purpose of matching the torrent name with the fields in the peer certificate is to allow a publisher to have a single root certificate for all torrents it distributes, and issue separate peer certificates for each torrent. A peer receiving a certificate will not necessarily be able to access all torrents published by this root certificate (only if it has a "star cert"). .. _`RFC 2818`: https://www.ietf.org/rfc/rfc2818.txt testing ------- To test incoming SSL connections to an SSL torrent, one can use the following *openssl* command:: openssl s_client -cert .pem -key .pem -CAfile \ .pem -debug -connect 127.0.0.1:4433 -tls1 -servername To create a root certificate, the Distinguished Name (*DN*) is not taken into account by bittorrent peers. You still need to specify something, but from libtorrent's point of view, it doesn't matter what it is. libtorrent only makes sure the peer certificates are signed by the correct root certificate. One way to create the certificates is to use the ``CA.sh`` script that comes with openssl, like this (don't forget to enter a common Name for the certificate):: CA.sh -newca CA.sh -newreq CA.sh -sign The torrent certificate is located in ``./demoCA/private/demoCA/cacert.pem``, this is the pem file to include in the .torrent file. The peer's certificate is located in ``./newcert.pem`` and the certificate's private key in ``./newkey.pem``. session statistics ================== libtorrent provides a mechanism to query performance and statistics `counters`__ from its internals. The statistics consists of two fundamental types. *counters* and *gauges*. A counter is a monotonically increasing value, incremented every time some event occurs. For example, every time the network thread wakes up because a socket became readable will increment a counter. Another example is every time a socket receives *n* bytes, a counter is incremented by *n*. *Counters* are the most flexible of metrics. It allows the program to sample the counter at any interval, and calculate average rates of increments to the counter. Some events may be rare and need to be sampled over a longer period in order to get useful rates, where other events may be more frequent and evenly distributed that sampling it frequently yields useful values. Counters also provides accurate overall counts. For example, converting samples of a download rate into a total transfer count is not accurate and takes more samples. Converting an increasing counter into a rate is easy and flexible. *Gauges* measure the instantaneous state of some kind. This is used for metrics that are not counting events or flows, but states that can fluctuate. For example, the number of torrents that are currently being downloaded. It's important to know whether a value is a counter or a gauge in order to interpret it correctly. In order to query libtorrent for which `counters`__ and gauges are available, call `session_stats_metrics()`__. This will return metadata about the values available for inspection in libtorrent. It will include whether a value is a counter or a gauge. The key information it includes is the index used to extract the actual measurements for a specific counter or gauge. In order to take a sample, call `post_session_stats()`__ in the `session`__ object. This will result in a `session_stats_alert`__ being posted. In this `alert`__ object, there is an array of values, these values make up the sample. The value index in the stats metric indicates which index the metric's value is stored in. The mapping between metric and value is not stable across versions of libtorrent. Always query the metrics first, to find out the index at which the value is stored, before interpreting the values array in the `session_stats_alert`__. The mapping will *not* change during the runtime of your process though, it's tied to a specific libtorrent version. You only have to query the mapping once on startup (or every time ``libtorrent.so`` is loaded, if it's done dynamically). The available stats metrics are: __ reference-Session.html#session __ reference-Session.html#session __ reference-Session.html#read_session_params() __ reference-Session.html#session_params __ reference-Session.html#session __ reference-Torrent_Handle.html#add_extension() __ reference-Session.html#session __ reference-Torrent_Info.html#torrent_info __ reference-Session.html#async_add_torrent() __ reference-Session.html#add_torrent() __ reference-Session.html#session __ reference-Session.html#wait_for_alert() __ reference-Session.html#pop_alerts() __ reference-Alerts.html#state_update_alert __ reference-Alerts.html#alert __ reference-Session.html#session __ reference-Session.html#session __ reference-Custom_Storage.html#remove_torrent() __ reference-Torrent_Handle.html#save_resume_data() __ reference-Session.html#session __ reference-Session.html#session_state() __ reference-Session.html#write_session_params() __ reference-Session.html#session __ reference-Create_Torrents.html#create_torrent __ reference-Add_Torrent.html#add_torrent_params __ reference-Torrent_Handle.html#save_resume_data() __ reference-Torrent_Handle.html#torrent_handle __ reference-Resume_Data.html#write_torrent_file() __ reference-Add_Torrent.html#add_torrent_params __ reference-Alerts.html#alert __ reference-Torrent_Handle.html#unset_flags() __ reference-Torrent_Status.html#queue_position __ reference-Settings.html#active_limit __ reference-Settings.html#auto_manage_interval __ reference-Torrent_Handle.html#save_resume_data() __ reference-Torrent_Handle.html#queue_position() __ reference-Torrent_Handle.html#queue_position_up() __ reference-Torrent_Handle.html#queue_position_down() __ reference-Torrent_Handle.html#queue_position_top() __ reference-Torrent_Handle.html#queue_position_bottom() __ reference-Settings.html#active_downloads __ reference-Torrent_Status.html#queue_position __ reference-Torrent_Status.html#queue_position __ reference-Settings.html#active_seeds __ reference-Settings.html#share_ratio_limit __ reference-Settings.html#seed_time_ratio_limit __ reference-Settings.html#seed_time_limit __ reference-Settings.html#active_tracker_limit __ reference-Settings.html#active_dht_limit __ reference-Settings.html#active_lsd_limit __ reference-Settings.html#active_dht_limit __ reference-Settings.html#auto_manage_prefer_seeds __ reference-Settings.html#dont_count_slow_torrents __ reference-Torrent_Handle.html#save_resume_data() __ reference-Torrent_Handle.html#torrent_handle __ reference-Add_Torrent.html#add_torrent_params __ reference-Resume_Data.html#write_resume_data() __ reference-Resume_Data.html#read_resume_data() __ reference-Add_Torrent.html#add_torrent_params __ reference-Session.html#add_torrent() __ reference-Session.html#async_add_torrent() __ reference-Session.html#session __ reference-Resume_Data.html#read_resume_data() __ reference-Add_Torrent.html#add_torrent_params __ reference-Session.html#async_add_torrent() __ reference-Session.html#add_torrent() __ reference-Session.html#session __ reference-Settings.html#initial_picker_threshold __ reference-Settings.html#use_parole_mode __ reference-Settings.html#whole_pieces_threshold __ reference-Settings.html#listen_interfaces __ reference-Trackers.html#announce_endpoint __ reference-Settings.html#choking_algorithm __ reference-Settings.html#unchoke_slots_limit __ reference-Settings.html#rate_choker_initial_threshold __ reference-Session.html#session __ reference-Session.html#set_peer_class_filter() __ reference-Session.html#set_peer_class_type_filter() __ reference-Session.html#create_peer_class() __ reference-Session.html#session __ reference-Session.html#delete_peer_class() __ reference-Session.html#set_peer_class() __ reference-Session.html#get_peer_class() __ reference-Session.html#set_peer_class_filter() __ reference-Session.html#set_peer_class_type_filter() __ reference-Torrent_Handle.html#set_ssl_certificate() __ reference-Torrent_Handle.html#torrent_handle __ reference-Alerts.html#torrent_need_cert_alert __ reference-Settings.html#listen_interfaces __ reference-Stats.html#counters __ reference-Stats.html#counters __ reference-Stats.html#session_stats_metrics() __ reference-Session.html#post_session_stats() __ reference-Session.html#session __ reference-Alerts.html#session_stats_alert __ reference-Alerts.html#alert __ reference-Alerts.html#session_stats_alert .. include:: stats_counters.rst glossary ======== The libtorrent documentation use words that are bittorrent terms of art. This section defines some of these words. For an overview of what bittorrent is and how it works, see these slides_. For an introduction to the bittorrent DHT, see `this presentation`_. .. _slides: bittorrent.pdf .. _`this presentation`: https://vimeo.com/56044595 announce The act of telling a tracker or the DHT network about the existence of oneself and how other peers can connect, by specifying port one is listening on. block A subset of a piece. Almost always 16 kiB of payload, unless the piece size is smaller. This is the granularity file payload is requested from peers on the network. DHT The distributed hash table is a cross-swarm, world-wide network of bittorrent peers. It's loosely connected, implementing the Kademlia protocol. Its purpose is to act as a tracker. Peers can announce their presence to nodes on the DHT and other peers can discover them to join the swarm. HTTP tracker A tracker that uses the HTTP protocol for announces. info dictionary The subset of a torrent file that describes piece hashes and file names. This is the only mandatory part necessary to join the swarm (network of peers) for the torrent. info hash The hash of the info dictionary. This uniquely identifies a torrent and is used by the protocol to ensure peers talking to each other agree on which swarm they are participating in. Sometimes spelled info-hash. leecher A peer that is still interested in downloading more pieces for the torrent. It is not a seed. magnet link A URI containing the info hash for a torrent, allowing peers to join its swarm. May optionally contain a display name, trackers and web seeds. Typically magnet links rely on peers joining the swarm via the DHT. metadata Synonymous to a torrent file peer A computer running bittorrent client software that participates in the network for a particular torrent/set of files. piece The smallest number of bytes that can be validated when downloading (no longer the case in bittorrent V2). The smallest part of the files that can be advertised to other peers. The size of a piece is determined by the info dictionary inside the torrent file. seed A computer running bittorrent client software that has the complete files for a specific torrent, able to share any piece for that file with other peers in the network swarm The network of peers participating in sharing and downloading of a specific torrent. torrent May refer to a torrent file or the swarm (network of peers) created around the torrent file. torrent file A file ending in .torrent describing the content of a set of files (but not containing the content). Importantly, it contains hashes of all files, split up into pieces. It may optionally contain references to trackers and nodes on the DHT network to aid peers in joining the network of peers sharing these files. tracker A server peers can announce to and receive other peers back belonging to the same swarm. Trackers are used to introduce peers to each other, within a swarm. When announcing, the info hash of the torrent is included. Trackers can introduce peers to any info-hash that's specified, given other peers also use the same tracker. Some trackers restrict which info hashes they support based on a white list. UDP tracker A tracker that uses a UDP based protocol for announces. web seed A web server that is acting a seed, providing access to all pieces of all files over HTTP. This is an extension that client software may or may not support. libtorrent-rasterbar-2.0.5/docs/tutorial-ref.html0000664000175000017500000031067414152763504021140 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

tutorial

The fundamental feature of starting and downloading torrents in libtorrent is achieved by creating a session, which provides the context and a container for torrents. This is done with via the session class, most of its interface is documented under session_handle though.

To add a torrent to the session, you fill in an add_torrent_params object and pass it either to add_torrent() or async_add_torrent().

add_torrent() is a blocking call which returns a torrent_handle.

For example:

#include <libtorrent/session.hpp>
#include <libtorrent/add_torrent_params.hpp>
#include <libtorrent/torrent_handle.hpp>
#include <libtorrent/magnet_uri.hpp>

int main(int argc, char const* argv[])
{
        if (argc != 2) {
                fprintf(stderr, "usage: %s <magnet-url>\n");
                return 1;
        }
        lt::session ses;

        lt::add_torrent_params atp = lt::parse_magnet_uri(argv[1]);
        atp.save_path = "."; // save in current dir
        lt::torrent_handle h = ses.add_torrent(atp);

        // ...
}

Once you have a torrent_handle, you can affect it as well as querying status. First, let's extend the example to print out messages from the bittorrent engine about progress and events happening under the hood. libtorrent has a mechanism referred to as alerts to communicate back information to the client application.

Clients can poll a session for new alerts via the pop_alerts() call. This function fills in a vector of alert pointers with all new alerts since the last call to this function. The pointers are owned by the session object at will become invalidated by the next call to pop_alerts().

The alerts form a class hierarchy with alert as the root class. Each specific kind of alert may include additional state, specific to the kind of message. All alerts implement a message() function that prints out pertinent information of the alert message. This can be convenient for simply logging events.

For programmatically react to certain events, use alert_cast to attempt a down cast of an alert object to a more specific type.

In order to print out events from libtorrent as well as exiting when the torrent completes downloading, we can poll the session for alerts periodically and print them out, as well as listening for the torrent_finished_alert, which is posted when a torrent completes.

#include <iostream>
#include <thread>
#include <chrono>

#include <libtorrent/session.hpp>
#include <libtorrent/session_params.hpp>
#include <libtorrent/add_torrent_params.hpp>
#include <libtorrent/torrent_handle.hpp>
#include <libtorrent/alert_types.hpp>
#include <libtorrent/magnet_uri.hpp>

int main(int argc, char const* argv[]) try
{
  if (argc != 2) {
    std::cerr << "usage: " << argv[0] << " <magnet-url>" << std::endl;
    return 1;
  }
  lt::settings_pack p;
  p.set_int(lt::settings_pack::alert_mask, lt::alert_category::status
    | lt::alert_category::error);
  lt::session ses(p);

  lt::add_torrent_params atp = lt::parse_magnet_uri(argv[1]);
  atp.save_path = "."; // save in current dir
  lt::torrent_handle h = ses.add_torrent(std::move(atp));

  for (;;) {
    std::vector<lt::alert*> alerts;
    ses.pop_alerts(&alerts);

    for (lt::alert const* a : alerts) {
      std::cout << a->message() << std::endl;
      // if we receive the finished alert or an error, we're done
      if (lt::alert_cast<lt::torrent_finished_alert>(a)) {
        goto done;
      }
      if (lt::alert_cast<lt::torrent_error_alert>(a)) {
        goto done;
      }
    }
    std::this_thread::sleep_for(std::chrono::milliseconds(200));
  }
  done:
  std::cout << "done, shutting down" << std::endl;
}
catch (std::exception& e)
{
  std::cerr << "Error: " << e.what() << std::endl;
}

alert masks

The output from this program will be quite verbose, which is probably a good starting point to get some understanding of what's going on. Alerts are categorized into alert categories. Each category can be enabled and disabled independently via the alert mask.

The alert mask is a configuration option offered by libtorrent. There are many configuration options, see settings_pack. The alert_mask setting is an integer of the category flags ORed together.

For instance, to only see the most pertinent alerts, the session can be constructed like this:

lt::settings_pack pack;
pack.set_int(lt::settings_pack::alert_mask
        , lt::alert_category::error
        | lt::alert_category::storage
        | lt::alert_category::status);

lt::session ses(pack);

Configuration options can be updated after the session is started by calling apply_settings(). Some settings are best set before starting the session though, like listen_interfaces, to avoid race conditions. If you start the session with the default settings and then immediately change them, there will still be a window where the default settings apply.

Changing the settings may trigger listen sockets to close and re-open and NAT-PMP, UPnP updates to be sent. For this reason, it's typically a good idea to batch settings updates into a single call.

session destruction

The session destructor is blocking by default. When shutting down, trackers will need to be contacted to stop torrents and other outstanding operations need to be cancelled. Shutting down can sometimes take several seconds, primarily because of trackers that are unresponsive (and time out) and also DNS servers that are unresponsive. DNS lookups are especially difficult to abort when stalled.

In order to be able to start destruction asynchronously, one can call session::abort().

This call returns a session_proxy object, which is a handle keeping the session state alive while shutting it down. It deliberately does not provide any of the session operations, since it's shutting down.

After having a session_proxy object, the session destructor does not block. However, the session_proxy destructor will.

This can be used to shut down multiple sessions or other parts of the application in parallel.

asynchronous operations

Essentially any call to a member function of session or torrent_handle that returns a value is a blocking synchronous call. Meaning it will post a message to the main libtorrent thread and wait for a response. Such calls may be expensive, and in applications where stalls should be avoided (such as user interface threads), blocking calls should be avoided.

In the example above, session::add_torrent() returns a torrent_handle and is thus blocking. For higher efficiency, async_add_torrent() will post a message to the main thread to add a torrent, and post the resulting torrent_handle back in an alert (add_torrent_alert). This is especially useful when adding a lot of torrents in quick succession, as there's no stall in between calls.

In the example above, we don't actually use the torrent_handle for anything, so converting it to use async_add_torrent() is just a matter of replacing the add_torrent() call with async_add_torrent().

torrent_status_updates

To get updates to the status of torrents, call post_torrent_updates() on the session object. This will cause libtorrent to post a state_update_alert containing torrent_status objects for all torrents whose status has changed since the last call to post_torrent_updates().

The state_update_alert looks something like this:

struct state_update_alert : alert
{
        virtual std::string message() const;
        std::vector<torrent_status> status;
};

The status field only contains the torrent_status for torrents with updates since the last call. It may be empty if no torrent has updated its state. This feature is critical for scalability.

See the torrent_status object for more information on what is in there. Perhaps the most interesting fields are total_payload_download, total_payload_upload, num_peers and state.

resuming torrents

Since bittorrent downloads pieces of files in random order, it's not trivial to resume a partial download. When resuming a download, the bittorrent engine must restore the state of the downloading torrent, specifically which parts of the file(s) are downloaded. There are two approaches to doing this:

  1. read every piece of the downloaded files from disk and compare it against its expected hash.
  2. save, to disk, the state of which pieces (and partial pieces) are downloaded, and load it back in again when resuming.

If no resume data is provided with a torrent that's added, libtorrent will employ (1) by default.

To save resume data, call save_resume_data() on the torrent_handle object. This will ask libtorrent to generate the resume data and post it back in a save_resume_data_alert. If generating the resume data fails for any reason, a save_resume_data_failed_alert is posted instead.

Exactly one of those alerts will be posted for every call to save_resume_data(). This is an important property when shutting down a session with multiple torrents, every resume alert must be handled before resuming with shut down. Any torrent may fail to save resume data, so the client would need to keep a count of the outstanding resume files, decremented on either save_resume_data_alert or save_resume_data_failed_alert.

The save_resume_data_alert looks something like this:

struct save_resume_data_alert : torrent_alert
{
        virtual std::string message() const;

        // the resume data
        add_torrent_params params;
};

The params field is an add_torrent_params object containing all the state to add the torrent back to the session again. This object can be serialized using write_resume_data() or write_resume_data_buf(), and de-serialized with read_resume_data().

example

Here's an updated version of the above example with the following updates:

  1. not using blocking calls
  2. printing torrent status updates rather than the raw log
  3. saving and loading resume files
#include <iostream>
#include <thread>
#include <chrono>
#include <fstream>

#include <libtorrent/session.hpp>
#include <libtorrent/session_params.hpp>
#include <libtorrent/add_torrent_params.hpp>
#include <libtorrent/torrent_handle.hpp>
#include <libtorrent/alert_types.hpp>
#include <libtorrent/bencode.hpp>
#include <libtorrent/torrent_status.hpp>
#include <libtorrent/read_resume_data.hpp>
#include <libtorrent/write_resume_data.hpp>
#include <libtorrent/error_code.hpp>
#include <libtorrent/magnet_uri.hpp>

namespace {

using clk = std::chrono::steady_clock;

// return the name of a torrent status enum
char const* state(lt::torrent_status::state_t s)
{
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wcovered-switch-default"
#endif
  switch(s) {
    case lt::torrent_status::checking_files: return "checking";
    case lt::torrent_status::downloading_metadata: return "dl metadata";
    case lt::torrent_status::downloading: return "downloading";
    case lt::torrent_status::finished: return "finished";
    case lt::torrent_status::seeding: return "seeding";
    case lt::torrent_status::checking_resume_data: return "checking resume";
    default: return "<>";
  }
#ifdef __clang__
#pragma clang diagnostic pop
#endif
}

} // anonymous namespace

int main(int argc, char const* argv[]) try
{
  if (argc != 2) {
    std::cerr << "usage: " << argv[0] << " <magnet-url>" << std::endl;
    return 1;
  }

  lt::settings_pack pack;
  pack.set_int(lt::settings_pack::alert_mask
    , lt::alert_category::error
    | lt::alert_category::storage
    | lt::alert_category::status);

  lt::session ses(pack);
  clk::time_point last_save_resume = clk::now();

  // load resume data from disk and pass it in as we add the magnet link
  std::ifstream ifs(".resume_file", std::ios_base::binary);
  ifs.unsetf(std::ios_base::skipws);
  std::vector<char> buf{std::istream_iterator<char>(ifs)
    , std::istream_iterator<char>()};

  lt::add_torrent_params magnet = lt::parse_magnet_uri(argv[1]);
  if (buf.size()) {
    lt::add_torrent_params atp = lt::read_resume_data(buf);
    if (atp.info_hashes == magnet.info_hashes) magnet = std::move(atp);
  }
  magnet.save_path = "."; // save in current dir
  ses.async_add_torrent(std::move(magnet));

  // this is the handle we'll set once we get the notification of it being
  // added
  lt::torrent_handle h;

  // set when we're exiting
  bool done = false;
  for (;;) {
    std::vector<lt::alert*> alerts;
    ses.pop_alerts(&alerts);

    for (lt::alert const* a : alerts) {
      if (auto at = lt::alert_cast<lt::add_torrent_alert>(a)) {
        h = at->handle;
      }
      // if we receive the finished alert or an error, we're done
      if (lt::alert_cast<lt::torrent_finished_alert>(a)) {
        h.save_resume_data(lt::torrent_handle::save_info_dict);
        done = true;
      }
      if (lt::alert_cast<lt::torrent_error_alert>(a)) {
        std::cout << a->message() << std::endl;
        done = true;
        h.save_resume_data(lt::torrent_handle::save_info_dict);
      }

      // when resume data is ready, save it
      if (auto rd = lt::alert_cast<lt::save_resume_data_alert>(a)) {
        std::ofstream of(".resume_file", std::ios_base::binary);
        of.unsetf(std::ios_base::skipws);
        auto const b = write_resume_data_buf(rd->params);
        of.write(b.data(), int(b.size()));
        if (done) goto done;
      }

      if (lt::alert_cast<lt::save_resume_data_failed_alert>(a)) {
        if (done) goto done;
      }

      if (auto st = lt::alert_cast<lt::state_update_alert>(a)) {
        if (st->status.empty()) continue;

        // we only have a single torrent, so we know which one
        // the status is for
        lt::torrent_status const& s = st->status[0];
        std::cout << '\r' << state(s.state) << ' '
          << (s.download_payload_rate / 1000) << " kB/s "
          << (s.total_done / 1000) << " kB ("
          << (s.progress_ppm / 10000) << "%) downloaded ("
          << s.num_peers << " peers)\x1b[K";
        std::cout.flush();
      }
    }
    std::this_thread::sleep_for(std::chrono::milliseconds(200));

    // ask the session to post a state_update_alert, to update our
    // state output for the torrent
    ses.post_torrent_updates();

    // save resume data once every 30 seconds
    if (clk::now() - last_save_resume > std::chrono::seconds(30)) {
      h.save_resume_data(lt::torrent_handle::save_info_dict);
      last_save_resume = clk::now();
    }
  }

done:
  std::cout << "\ndone, shutting down" << std::endl;
}
catch (std::exception& e)
{
  std::cerr << "Error: " << e.what() << std::endl;
}

session state

On construction, a session object is configured by a session_params object. The session_params object notably contain session_settings, the state of the DHT node (e.g. routing table), the session's IP filter as well as the disk I/O back-end and dht storage to use.

There are functions to serialize and de-serialize the session_params object to help in restoring session state from last run. Doing so is especially helpful for bootstrapping the DHT, using nodes from last run.

Before destructing the session object, call session::session_state() to get the current state as a session_params object.

Call write_session_params() or write_session_params_buf() to serialize the state into a bencoded entry or to a flat buffer (std::vector<char>) respectively.

On startup, before constructing the session object, load the buffer back from disk and call read_session_params() to de-serialize it back into a session_params object. Before passing it into the session constructor is your chance to set update the settings_pack (params) member of settings_params, or configuring the disk_io_constructor.

example

Another updated version of the above example with the following updates:

  1. load and save session_params to file ".session"
  2. allow shutting down on SIGINT
#include <iostream>
#include <thread>
#include <chrono>
#include <fstream>
#include <csignal>

#include <libtorrent/session.hpp>
#include <libtorrent/session_params.hpp>
#include <libtorrent/add_torrent_params.hpp>
#include <libtorrent/torrent_handle.hpp>
#include <libtorrent/alert_types.hpp>
#include <libtorrent/bencode.hpp>
#include <libtorrent/torrent_status.hpp>
#include <libtorrent/read_resume_data.hpp>
#include <libtorrent/write_resume_data.hpp>
#include <libtorrent/error_code.hpp>
#include <libtorrent/magnet_uri.hpp>

namespace {

using clk = std::chrono::steady_clock;

// return the name of a torrent status enum
char const* state(lt::torrent_status::state_t s)
{
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wcovered-switch-default"
#endif
  switch(s) {
    case lt::torrent_status::checking_files: return "checking";
    case lt::torrent_status::downloading_metadata: return "dl metadata";
    case lt::torrent_status::downloading: return "downloading";
    case lt::torrent_status::finished: return "finished";
    case lt::torrent_status::seeding: return "seeding";
    case lt::torrent_status::checking_resume_data: return "checking resume";
    default: return "<>";
  }
#ifdef __clang__
#pragma clang diagnostic pop
#endif
}

std::vector<char> load_file(char const* filename)
{
  std::ifstream ifs(filename, std::ios_base::binary);
  ifs.unsetf(std::ios_base::skipws);
  return {std::istream_iterator<char>(ifs), std::istream_iterator<char>()};
}

// set when we're exiting
std::atomic<bool> shut_down{false};

void sighandler(int) { shut_down = true; }

} // anonymous namespace

int main(int argc, char const* argv[]) try
{
  if (argc != 2) {
    std::cerr << "usage: " << argv[0] << " <magnet-url>" << std::endl;
    return 1;
  }

  // load session parameters
  auto session_params = load_file(".session");
  lt::session_params params = session_params.empty()
    ? lt::session_params() : lt::read_session_params(session_params);
  params.settings.set_int(lt::settings_pack::alert_mask
    , lt::alert_category::error
    | lt::alert_category::storage
    | lt::alert_category::status);

  lt::session ses(params);
  clk::time_point last_save_resume = clk::now();

  // load resume data from disk and pass it in as we add the magnet link
  auto buf = load_file(".resume_file");

  lt::add_torrent_params magnet = lt::parse_magnet_uri(argv[1]);
  if (buf.size()) {
    lt::add_torrent_params atp = lt::read_resume_data(buf);
    if (atp.info_hashes == magnet.info_hashes) magnet = std::move(atp);
  }
  magnet.save_path = "."; // save in current dir
  ses.async_add_torrent(std::move(magnet));

  // this is the handle we'll set once we get the notification of it being
  // added
  lt::torrent_handle h;

  std::signal(SIGINT, &sighandler);

  // set when we're exiting
  bool done = false;
  for (;;) {
    std::vector<lt::alert*> alerts;
    ses.pop_alerts(&alerts);

    if (shut_down) {
      shut_down = false;
      auto const handles = ses.get_torrents();
      if (handles.size() == 1) {
        handles[0].save_resume_data(lt::torrent_handle::save_info_dict);
        done = true;
      }
    }

    for (lt::alert const* a : alerts) {
      if (auto at = lt::alert_cast<lt::add_torrent_alert>(a)) {
        h = at->handle;
      }
      // if we receive the finished alert or an error, we're done
      if (lt::alert_cast<lt::torrent_finished_alert>(a)) {
        h.save_resume_data(lt::torrent_handle::save_info_dict);
        done = true;
      }
      if (lt::alert_cast<lt::torrent_error_alert>(a)) {
        std::cout << a->message() << std::endl;
        done = true;
        h.save_resume_data(lt::torrent_handle::save_info_dict);
      }

      // when resume data is ready, save it
      if (auto rd = lt::alert_cast<lt::save_resume_data_alert>(a)) {
        std::ofstream of(".resume_file", std::ios_base::binary);
        of.unsetf(std::ios_base::skipws);
        auto const b = write_resume_data_buf(rd->params);
        of.write(b.data(), int(b.size()));
        if (done) goto done;
      }

      if (lt::alert_cast<lt::save_resume_data_failed_alert>(a)) {
        if (done) goto done;
      }

      if (auto st = lt::alert_cast<lt::state_update_alert>(a)) {
        if (st->status.empty()) continue;

        // we only have a single torrent, so we know which one
        // the status is for
        lt::torrent_status const& s = st->status[0];
        std::cout << '\r' << state(s.state) << ' '
          << (s.download_payload_rate / 1000) << " kB/s "
          << (s.total_done / 1000) << " kB ("
          << (s.progress_ppm / 10000) << "%) downloaded ("
          << s.num_peers << " peers)\x1b[K";
        std::cout.flush();
      }
    }
    std::this_thread::sleep_for(std::chrono::milliseconds(200));

    // ask the session to post a state_update_alert, to update our
    // state output for the torrent
    ses.post_torrent_updates();

    // save resume data once every 30 seconds
    if (clk::now() - last_save_resume > std::chrono::seconds(30)) {
      h.save_resume_data(lt::torrent_handle::save_info_dict);
      last_save_resume = clk::now();
    }
  }

done:
  std::cout << "\nsaving session state" << std::endl;
  {
    std::ofstream of(".session", std::ios_base::binary);
    of.unsetf(std::ios_base::skipws);
    auto const b = write_session_params_buf(ses.session_state()
      , lt::save_state_flags_t::all());
    of.write(b.data(), int(b.size()));
  }

  std::cout << "\ndone, shutting down" << std::endl;
}
catch (std::exception& e)
{
  std::cerr << "Error: " << e.what() << std::endl;
}

torrent files

To add torrent files to a session (as opposed to a magnet link), it must first be loaded into a torrent_info object.

The torrent_info object can be created either by filename a buffer or a bencoded structure. When adding by filename, there's a sanity check limit on the size of the file, for adding arbitrarily large torrents, load the file outside of the constructor.

The torrent_info object provides an opportunity to query information about the .torrent file as well as mutating it before adding it to the session.

bencoding

bencoded structures is the default data storage format used by bittorrent, such as .torrent files, tracker announce and scrape responses and some wire protocol extensions. libtorrent provides an efficient framework for decoding bencoded data through bdecode() function.

There are two separate mechanisms for encoding and decoding. When decoding, use the bdecode() function that returns a bdecode_node. When encoding, use bencode() taking an entry object.

The key property of bdecode() is that it does not copy any data out of the buffer that was parsed. It builds the tree structures of references pointing into the buffer. The buffer must stay alive and valid for as long as the bdecode_node is in use.

For performance details on bdecode(), see the blog post about it.

libtorrent-rasterbar-2.0.5/docs/reference-Alerts.html0000664000175000017500000071750314152763504021713 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

Table of contents

The pop_alerts() function on session is the main interface for retrieving 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. settings_pack::alert_mask can be used to specify which kinds of events should be reported. The alert mask is a combination of the alert_category_t flags in the alert class.

Every alert belongs to one or more category. There is a cost associated with posting alerts. Only alerts that belong to an enabled category are posted. Setting the alert bitmask to 0 will disable all alerts (except those that are non-discardable). Alerts that are responses to API calls such as save_resume_data() and post_session_stats() are non-discardable and will be posted even if their category is disabled.

There are other alert base classes that some alerts derive from, all the alerts that are generated for a specific torrent are derived from torrent_alert, and tracker events derive from tracker_alert.

Alerts returned by pop_alerts() are only valid until the next call to pop_alerts(). You may not copy an alert object to access it after the next call to pop_alerts(). Internal members of alerts also become invalid once pop_alerts() is called again.

[report issue]

alert

Declared in "libtorrent/alert.hpp"

The alert class is the base class that specific messages are derived from. alert types are not copyable, and cannot be constructed by the client. The pointers returned by libtorrent are short lived (the details are described under session_handle::pop_alerts())

struct alert
{
   time_point timestamp () const;
   virtual int type () const noexcept = 0;
   virtual char const* what () const noexcept = 0;
   virtual std::string message () const = 0;
   virtual alert_category_t category () const noexcept = 0;

   static constexpr alert_category_t error_notification  = 0_bit;
   static constexpr alert_category_t peer_notification  = 1_bit;
   static constexpr alert_category_t port_mapping_notification  = 2_bit;
   static constexpr alert_category_t storage_notification  = 3_bit;
   static constexpr alert_category_t tracker_notification  = 4_bit;
   static constexpr alert_category_t connect_notification  = 5_bit;
   static constexpr alert_category_t status_notification  = 6_bit;
   static constexpr alert_category_t ip_block_notification  = 8_bit;
   static constexpr alert_category_t performance_warning  = 9_bit;
   static constexpr alert_category_t dht_notification  = 10_bit;
   static constexpr alert_category_t session_log_notification  = 13_bit;
   static constexpr alert_category_t torrent_log_notification  = 14_bit;
   static constexpr alert_category_t peer_log_notification  = 15_bit;
   static constexpr alert_category_t incoming_request_notification  = 16_bit;
   static constexpr alert_category_t dht_log_notification  = 17_bit;
   static constexpr alert_category_t dht_operation_notification  = 18_bit;
   static constexpr alert_category_t port_mapping_log_notification  = 19_bit;
   static constexpr alert_category_t picker_log_notification  = 20_bit;
   static constexpr alert_category_t file_progress_notification  = 21_bit;
   static constexpr alert_category_t piece_progress_notification  = 22_bit;
   static constexpr alert_category_t upload_notification  = 23_bit;
   static constexpr alert_category_t block_progress_notification  = 24_bit;
   static constexpr alert_category_t all_categories  = alert_category_t::all();
};
[report issue]

timestamp()

time_point timestamp () const;

a timestamp is automatically created in the constructor

[report issue]

type()

virtual int type () const noexcept = 0;

returns an integer that is unique to this alert type. It can be compared against a specific alert by querying a static constant called alert_type in the alert. It can be used to determine the run-time type of an alert* in order to cast to that alert type and access specific members.

e.g:

std::vector<alert*> alerts;
ses.pop_alerts(&alerts);
for (alert* a : alerts) {
        switch (a->type()) {

                case read_piece_alert::alert_type:
                {
                        auto* p = static_cast<read_piece_alert*>(a);
                        if (p->ec) {
                                // read_piece failed
                                break;
                        }
                        // use p
                        break;
                }
                case file_renamed_alert::alert_type:
                {
                        // etc...
                }
        }
}
[report issue]

what()

virtual char const* what () const noexcept = 0;

returns a string literal describing the type of the alert. It does not include any information that might be bundled with the alert.

[report issue]

message()

virtual std::string message () const = 0;

generate a string describing the alert and the information bundled with it. This is mainly intended for debug and development use. It is not suitable to use this for applications that may be localized. Instead, handle each alert type individually and extract and render the information from the alert depending on the locale.

[report issue]

category()

virtual alert_category_t category () const noexcept = 0;

returns a bitmask specifying which categories this alert belong to.

[report issue]

dht_routing_bucket

Declared in "libtorrent/alert_types.hpp"

struct to hold information about a single DHT routing table bucket

struct dht_routing_bucket
{
   int num_nodes;
   int num_replacements;
   int last_active;
};
[report issue]
num_nodes num_replacements
the total number of nodes and replacement nodes in the routing table
[report issue]
last_active
number of seconds since last activity
[report issue]

torrent_alert

Declared in "libtorrent/alert_types.hpp"

This is a base class for alerts that are associated with a specific torrent. It contains a handle to the torrent.

Note that by the time the client receives a torrent_alert, its handle member may be invalid.

struct torrent_alert : alert
{
   std::string message () const override;
   char const* torrent_name () const;

   torrent_handle handle;
};
[report issue]

message()

std::string message () const override;

returns the message associated with this alert

[report issue]
handle
The torrent_handle pointing to the torrent this alert is associated with.
[report issue]

peer_alert

Declared in "libtorrent/alert_types.hpp"

The peer alert is a base class for alerts that refer to a specific peer. It includes all the information to identify the peer. i.e. ip and peer-id.

struct peer_alert : torrent_alert
{
   std::string message () const override;

   aux::noexcept_movable<tcp::endpoint> endpoint;
   peer_id pid;
};
[report issue]
endpoint
The peer's IP address and port.
[report issue]
pid
the peer ID, if known.
[report issue]

tracker_alert

Declared in "libtorrent/alert_types.hpp"

This is a base class used for alerts that are associated with a specific tracker. It derives from torrent_alert since a tracker is also associated with a specific torrent.

struct tracker_alert : torrent_alert
{
   std::string message () const override;
   char const* tracker_url () const;

   aux::noexcept_movable<tcp::endpoint> local_endpoint;
};
[report issue]

tracker_url()

char const* tracker_url () const;

returns a 0-terminated string of the tracker's URL

[report issue]
local_endpoint
endpoint of the listen interface being announced
[report issue]

torrent_removed_alert

Declared in "libtorrent/alert_types.hpp"

The torrent_removed_alert is posted whenever a torrent is removed. Since the torrent handle in its base class will usually be invalid (since the torrent is already removed) it has the info hash as a member, to identify it. It's posted when the alert_category::status bit is set in the alert_mask.

Note that the handle remains valid for some time after torrent_removed_alert is posted, as long as some internal libtorrent task (such as an I/O task) refers to it. Additionally, other alerts like save_resume_data_alert may be posted after torrent_removed_alert. To synchronize on whether the torrent has been removed or not, call torrent_handle::in_session(). This will return true before torrent_removed_alert is posted, and false afterward.

Even though the handle member doesn't point to an existing torrent anymore, it is still useful for comparing to other handles, which may also no longer point to existing torrents, but to the same non-existing torrents.

The torrent_handle acts as a weak_ptr, even though its object no longer exists, it can still compare equal to another weak pointer which points to the same non-existent object.

struct torrent_removed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   info_hash_t info_hashes;
   client_data_t userdata;
};
[report issue]
userdata
'userdata` as set in add_torrent_params at torrent creation. This can be used to associate this torrent with related data in the client application more efficiently than info_hashes.
[report issue]

read_piece_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when the asynchronous read operation initiated by a call to torrent_handle::read_piece() is completed. If the read failed, the torrent is paused and an error state is set and the buffer member of the alert is 0. If successful, buffer points to a buffer containing all the data of the piece. piece is the piece index that was read. size is the number of bytes that was read.

If the operation fails, error will indicate what went wrong.

struct read_piece_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage;
   error_code const error;
   boost::shared_array<char> const buffer;
   piece_index_t const piece;
   int const size;
};
[report issue]

file_completed_alert

Declared in "libtorrent/alert_types.hpp"

This is posted whenever an individual file completes its download. i.e. All pieces overlapping this file have passed their hash check.

struct file_completed_alert final : torrent_alert
{
   std::string message () const override;

   file_index_t const index;
};
[report issue]
index
refers to the index of the file that completed.
[report issue]

file_renamed_alert

Declared in "libtorrent/alert_types.hpp"

This is posted as a response to a torrent_handle::rename_file() call, if the rename operation succeeds.

struct file_renamed_alert final : torrent_alert
{
   std::string message () const override;
   char const* new_name () const;
   char const* old_name () const;

   static constexpr alert_category_t static_category  = alert_category::storage;
   file_index_t const index;
};
[report issue]

new_name() old_name()

char const* new_name () const;
char const* old_name () const;

returns the new and previous file name, respectively.

[report issue]
index
refers to the index of the file that was renamed,
[report issue]

file_rename_failed_alert

Declared in "libtorrent/alert_types.hpp"

This is posted as a response to a torrent_handle::rename_file() call, if the rename operation failed.

struct file_rename_failed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage;
   file_index_t const index;
   error_code const error;
};
[report issue]
index error
refers to the index of the file that was supposed to be renamed, error is the error code returned from the filesystem.
[report issue]

performance_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a limit is reached that might have a negative impact on upload or download rate performance.

struct performance_alert final : torrent_alert
{
   std::string message () const override;

   enum performance_warning_t
   {
      outstanding_disk_buffer_limit_reached,
      outstanding_request_limit_reached,
      upload_limit_too_low,
      download_limit_too_low,
      send_buffer_watermark_too_low,
      too_many_optimistic_unchoke_slots,
      too_high_disk_queue_limit,
      aio_limit_reached,
      deprecated_bittyrant_with_no_uplimit,
      too_few_outgoing_ports,
      too_few_file_descriptors,
      num_warnings,
   };

   static constexpr alert_category_t static_category  = alert_category::performance_warning;
   performance_warning_t const warning_code;
};
[report issue]

enum performance_warning_t

Declared in "libtorrent/alert_types.hpp"

name value description
outstanding_disk_buffer_limit_reached 0 This warning means that the number of bytes queued to be written to disk exceeds the max disk byte queue setting (settings_pack::max_queued_disk_bytes). This might restrict the download rate, by not queuing up enough write jobs to the disk I/O thread. When this alert is posted, peer connections are temporarily stopped from downloading, until the queued disk bytes have fallen below the limit again. Unless your max_queued_disk_bytes setting is already high, you might want to increase it to get better performance.
outstanding_request_limit_reached 1 This is posted when libtorrent would like to send more requests to a peer, but it's limited by settings_pack::max_out_request_queue. The queue length libtorrent is trying to achieve is determined by the download rate and the assumed round-trip-time (settings_pack::request_queue_time). The assumed round-trip-time is not limited to just the network RTT, but also the remote disk access time and message handling time. It defaults to 3 seconds. The target number of outstanding requests is set to fill the bandwidth-delay product (assumed RTT times download rate divided by number of bytes per request). When this alert is posted, there is a risk that the number of outstanding requests is too low and limits the download rate. You might want to increase the max_out_request_queue setting.
upload_limit_too_low 2 This warning is posted when the amount of TCP/IP overhead is greater than the upload rate limit. When this happens, the TCP/IP overhead is caused by a much faster download rate, triggering TCP ACK packets. These packets eat into the rate limit specified to libtorrent. When the overhead traffic is greater than the rate limit, libtorrent will not be able to send any actual payload, such as piece requests. This means the download rate will suffer, and new requests can be sent again. There will be an equilibrium where the download rate, on average, is about 20 times the upload rate limit. If you want to maximize the download rate, increase the upload rate limit above 5% of your download capacity.
download_limit_too_low 3 This is the same warning as upload_limit_too_low but referring to the download limit instead of upload. This suggests that your download rate limit is much lower than your upload capacity. Your upload rate will suffer. To maximize upload rate, make sure your download rate limit is above 5% of your upload capacity.
send_buffer_watermark_too_low 4

We're stalled on the disk. We want to write to the socket, and we can write but our send buffer is empty, waiting to be refilled from the disk. This either means the disk is slower than the network connection or that our send buffer watermark is too small, because we can send it all before the disk gets back to us. The number of bytes that we keep outstanding, requested from the disk, is calculated as follows:

min(512, max(upload_rate * send_buffer_watermark_factor / 100, send_buffer_watermark))

If you receive this alert, you might want to either increase your send_buffer_watermark or send_buffer_watermark_factor.

too_many_optimistic_unchoke_slots 5 If the half (or more) of all upload slots are set as optimistic unchoke slots, this warning is issued. You probably want more regular (rate based) unchoke slots.
too_high_disk_queue_limit 6 If the disk write queue ever grows larger than half of the cache size, this warning is posted. The disk write queue eats into the total disk cache and leaves very little left for the actual cache. This causes the disk cache to oscillate in evicting large portions of the cache before allowing peers to download any more, onto the disk write queue. Either lower max_queued_disk_bytes or increase cache_size.
aio_limit_reached 7  
deprecated_bittyrant_with_no_uplimit 8  
too_few_outgoing_ports 9 This is generated if outgoing peer connections are failing because of address in use errors, indicating that settings_pack::outgoing_ports is set and is too small of a range. Consider not using the outgoing_ports setting at all, or widen the range to include more ports.
too_few_file_descriptors 10  
num_warnings 11  
[report issue]

state_changed_alert

Declared in "libtorrent/alert_types.hpp"

Generated whenever a torrent changes its state.

struct state_changed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   torrent_status::state_t const state;
   torrent_status::state_t const prev_state;
};
[report issue]
state
the new state of the torrent.
[report issue]
prev_state
the previous state.
[report issue]

tracker_error_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated on tracker time outs, premature disconnects, invalid response or a HTTP response other than "200 OK". From the alert you can get the handle to the torrent the tracker belongs to.

struct tracker_error_alert final : tracker_alert
{
   std::string message () const override;
   char const* failure_reason () const;

   static constexpr alert_category_t static_category  = alert_category::tracker | alert_category::error;
   int const times_in_row;
   error_code const error;
   operation_t op;
};
[report issue]

failure_reason()

char const* failure_reason () const;

if the tracker sent a "failure reason" string, it will be returned here.

[report issue]
times_in_row
This member says how many times in a row this tracker has failed.
[report issue]
error
the error code indicating why the tracker announce failed. If it is is lt::errors::tracker_failure the failure_reason() might contain a more detailed description of why the tracker rejected the request. HTTP status codes indicating errors are also set in this field.
[report issue]

tracker_warning_alert

Declared in "libtorrent/alert_types.hpp"

This alert is triggered if the tracker reply contains a warning field. Usually this means that the tracker announce was successful, but the tracker has a message to the client.

struct tracker_warning_alert final : tracker_alert
{
   std::string message () const override;
   char const* warning_message () const;

   static constexpr alert_category_t static_category  = alert_category::tracker | alert_category::error;
};
[report issue]

warning_message()

char const* warning_message () const;

the message associated with this warning

[report issue]

scrape_reply_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a scrape request succeeds.

struct scrape_reply_alert final : tracker_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::tracker;
   int const incomplete;
   int const complete;
};
[report issue]
incomplete complete
the data returned in the scrape response. These numbers may be -1 if the response was malformed.
[report issue]

scrape_failed_alert

Declared in "libtorrent/alert_types.hpp"

If a scrape request fails, this alert is generated. This might be due to the tracker timing out, refusing connection or returning an http response code indicating an error.

struct scrape_failed_alert final : tracker_alert
{
   std::string message () const override;
   char const* error_message () const;

   static constexpr alert_category_t static_category  = alert_category::tracker | alert_category::error;
   error_code const error;
};
[report issue]

error_message()

char const* error_message () const;

if the error indicates there is an associated message, this returns that message. Otherwise and empty string.

[report issue]
error
the error itself. This may indicate that the tracker sent an error message (error::tracker_failure), in which case it can be retrieved by calling error_message().
[report issue]

tracker_reply_alert

Declared in "libtorrent/alert_types.hpp"

This alert is only for informational purpose. It is generated when a tracker announce succeeds. It is generated regardless what kind of tracker was used, be it UDP, HTTP or the DHT.

struct tracker_reply_alert final : tracker_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::tracker;
   int const num_peers;
};
[report issue]
num_peers
tells how many peers the tracker returned in this response. This is not expected to be greater than the num_want settings. These are not necessarily all new peers, some of them may already be connected.
[report issue]

dht_reply_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated each time the DHT receives peers from a node. num_peers is the number of peers we received in this packet. Typically these packets are received from multiple DHT nodes, and so the alerts are typically generated a few at a time.

struct dht_reply_alert final : tracker_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht | alert_category::tracker;
   int const num_peers;
};
[report issue]

tracker_announce_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated each time a tracker announce is sent (or attempted to be sent). There are no extra data members in this alert. The url can be found in the base class however.

struct tracker_announce_alert final : tracker_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::tracker;
   event_t const event;
};
[report issue]
event
specifies what event was sent to the tracker. See event_t.
[report issue]

hash_failed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a finished piece fails its hash check. You can get the handle to the torrent which got the failed piece and the index of the piece itself from the alert.

struct hash_failed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   piece_index_t const piece_index;
};
[report issue]

peer_ban_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer is banned because it has sent too many corrupt pieces to us. ip is the endpoint to the peer that was banned.

struct peer_ban_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
};
[report issue]

peer_unsnubbed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer is un-snubbed. Essentially when it was snubbed for stalling sending data, and now it started sending data again.

struct peer_unsnubbed_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
};
[report issue]

peer_snubbed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer is snubbed, when it stops sending data when we request it.

struct peer_snubbed_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
};
[report issue]

peer_error_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer sends invalid data over the peer-peer protocol. The peer will be disconnected, but you get its ip address from the alert, to identify it.

struct peer_error_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
   operation_t op;
   error_code const error;
};
[report issue]
op
a 0-terminated string of the low-level operation that failed, or nullptr if there was no low level disk operation.
[report issue]
error
tells you what error caused this alert.
[report issue]

peer_connect_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted every time an incoming peer connection both successfully passes the protocol handshake and is associated with a torrent, or an outgoing peer connection attempt succeeds. For arbitrary incoming connections, see incoming_connection_alert.

struct peer_connect_alert final : peer_alert
{
   std::string message () const override;

   enum direction_t
   {
      in,
      out,
   };

   static constexpr alert_category_t static_category  = alert_category::connect;
   direction_t direction;
   socket_type_t socket_type;
};
[report issue]

enum direction_t

Declared in "libtorrent/alert_types.hpp"

name value description
in 0  
out 1  
[report issue]
direction
Tells you if the peer was incoming or outgoing
[report issue]

peer_disconnected_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer is disconnected for any reason (other than the ones covered by peer_error_alert ).

struct peer_disconnected_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::connect;
   socket_type_t const socket_type;
   operation_t const op;
   error_code const error;
   close_reason_t const reason;
};
[report issue]
socket_type
the kind of socket this peer was connected over
[report issue]
op
the operation or level where the error occurred. Specified as an value from the operation_t enum. Defined in operations.hpp.
[report issue]
error
tells you what error caused peer to disconnect.
[report issue]
reason
the reason the peer disconnected (if specified)
[report issue]

invalid_request_alert

Declared in "libtorrent/alert_types.hpp"

This is a debug alert that is generated by an incoming invalid piece request. ip is the address of the peer and the request is the actual incoming request from the peer. See peer_request for more info.

struct invalid_request_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
   peer_request const request;
   bool const we_have;
   bool const peer_interested;
   bool const withheld;
};
[report issue]
request
the request we received from the peer
[report issue]
we_have
true if we have this piece
[report issue]
peer_interested
true if the peer indicated that it was interested to download before sending the request
[report issue]
withheld
if this is true, the peer is not allowed to download this piece because of super-seeding rules.
[report issue]

torrent_finished_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a torrent switches from being a downloader to a seed. It will only be generated once per torrent. It contains a torrent_handle to the torrent in question.

struct torrent_finished_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

piece_finished_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted every time a piece completes downloading and passes the hash check. This alert derives from torrent_alert which contains the torrent_handle to the torrent the piece belongs to. Note that being downloaded and passing the hash check may happen before the piece is also fully flushed to disk. So torrent_handle::have_piece() may still return false

struct piece_finished_alert final : torrent_alert
{
   std::string message () const override;

   piece_index_t const piece_index;
};
[report issue]
piece_index
the index of the piece that finished
[report issue]

request_dropped_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer rejects or ignores a piece request.

struct request_dropped_alert final : peer_alert
{
   std::string message () const override;

   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

block_timeout_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a block request times out.

struct block_timeout_alert final : peer_alert
{
   std::string message () const override;

   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

block_finished_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a block request receives a response.

struct block_finished_alert final : peer_alert
{
   std::string message () const override;

   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

block_downloading_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a block request is sent to a peer.

struct block_downloading_alert final : peer_alert
{
   std::string message () const override;

   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

unwanted_block_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a block is received that was not requested or whose request timed out.

struct unwanted_block_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

storage_moved_alert

Declared in "libtorrent/alert_types.hpp"

The storage_moved_alert is generated when all the disk IO has completed and the files have been moved, as an effect of a call to torrent_handle::move_storage. This is useful to synchronize with the actual disk. The storage_path() member return the new path of the storage.

struct storage_moved_alert final : torrent_alert
{
   std::string message () const override;
   char const* storage_path () const;
   char const* old_path () const;

   static constexpr alert_category_t static_category  = alert_category::storage;
};
[report issue]

storage_path() old_path()

char const* storage_path () const;
char const* old_path () const;

the path the torrent was moved to and from, respectively.

[report issue]

storage_moved_failed_alert

Declared in "libtorrent/alert_types.hpp"

The storage_moved_failed_alert is generated when an attempt to move the storage, via torrent_handle::move_storage(), fails.

struct storage_moved_failed_alert final : torrent_alert
{
   std::string message () const override;
   char const* file_path () const;

   static constexpr alert_category_t static_category  = alert_category::storage;
   error_code const error;
   operation_t op;
};
[report issue]

file_path()

char const* file_path () const;

If the error happened for a specific file, this returns its path.

[report issue]
op
this indicates what underlying operation caused the error
[report issue]

torrent_deleted_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a request to delete the files of a torrent complete.

This alert is posted in the alert_category::storage category, and that bit needs to be set in the alert_mask.

struct torrent_deleted_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage;
   info_hash_t info_hashes;
};
[report issue]
info_hashes
The info-hash of the torrent that was just deleted. Most of the time the torrent_handle in the torrent_alert will be invalid by the time this alert arrives, since the torrent is being deleted. The info_hashes member is hence the main way of identifying which torrent just completed the delete.
[report issue]

torrent_delete_failed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a request to delete the files of a torrent fails. Just removing a torrent from the session cannot fail

struct torrent_delete_failed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage
   | alert_category::error;
   error_code const error;
   info_hash_t info_hashes;
};
[report issue]
error
tells you why it failed.
[report issue]
info_hashes
the info hash of the torrent whose files failed to be deleted
[report issue]

save_resume_data_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated as a response to a torrent_handle::save_resume_data request. It is generated once the disk IO thread is done writing the state for this torrent.

struct save_resume_data_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage;
   add_torrent_params params;
};
[report issue]
params
the params structure is populated with the fields to be passed to add_torrent() or async_add_torrent() to resume the torrent. To save the state to disk, you may pass it on to write_resume_data().
[report issue]

save_resume_data_failed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated instead of save_resume_data_alert if there was an error generating the resume data. error describes what went wrong.

struct save_resume_data_failed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage
   | alert_category::error;
   error_code const error;
};
[report issue]
error
the error code from the resume_data failure
[report issue]

torrent_paused_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated as a response to a torrent_handle::pause request. It is generated once all disk IO is complete and the files in the torrent have been closed. This is useful for synchronizing with the disk.

struct torrent_paused_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

torrent_resumed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated as a response to a torrent_handle::resume() request. It is generated when a torrent goes from a paused state to an active state.

struct torrent_resumed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

torrent_checked_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when a torrent completes checking. i.e. when it transitions out of the checking files state into a state where it is ready to start downloading

struct torrent_checked_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

url_seed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a HTTP seed name lookup fails.

struct url_seed_alert final : torrent_alert
{
   std::string message () const override;
   char const* server_url () const;
   char const* error_message () const;

   static constexpr alert_category_t static_category  = alert_category::peer | alert_category::error;
   error_code const error;
};
[report issue]

server_url()

char const* server_url () const;

the URL the error is associated with

[report issue]

error_message()

char const* error_message () const;

in case the web server sent an error message, this function returns it.

[report issue]
error
the error the web seed encountered. If this is not set, the server sent an error message, call error_message().
[report issue]

file_error_alert

Declared in "libtorrent/alert_types.hpp"

If the storage fails to read or write files that it needs access to, this alert is generated and the torrent is paused.

struct file_error_alert final : torrent_alert
{
   std::string message () const override;
   char const* filename () const;

   static constexpr alert_category_t static_category  = alert_category::status
   | alert_category::storage;
   error_code const error;
   operation_t op;
};
[report issue]

filename()

char const* filename () const;

the file that experienced the error

[report issue]
error
the error code describing the error.
[report issue]
op
indicates which underlying operation caused the error
[report issue]

metadata_failed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when the metadata has been completely received and the info-hash failed to match it. i.e. the metadata that was received was corrupt. libtorrent will automatically retry to fetch it in this case. This is only relevant when running a torrent-less download, with the metadata extension provided by libtorrent.

struct metadata_failed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   error_code const error;
};
[report issue]
error
indicates what failed when parsing the metadata. This error is what's returned from lazy_bdecode().
[report issue]

metadata_received_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when the metadata has been completely received and the torrent can start downloading. It is not generated on torrents that are started with metadata, but only those that needs to download it from peers (when utilizing the libtorrent extension).

There are no additional data members in this alert.

Typically, when receiving this alert, you would want to save the torrent file in order to load it back up again when the session is restarted. Here's an example snippet of code to do that:

torrent_handle h = alert->handle();
std::shared_ptr<torrent_info const> ti = h.torrent_file();
create_torrent ct(*ti);
entry te = ct.generate();
std::vector<char> buffer;
bencode(std::back_inserter(buffer), te);
FILE* f = fopen((to_hex(ti->info_hashes().get_best().to_string()) + ".torrent").c_str(), "wb+");
if (f) {
        fwrite(&buffer[0], 1, buffer.size(), f);
        fclose(f);
}
struct metadata_received_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

udp_error_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when there is an error on a UDP socket. The UDP sockets are used for all uTP, DHT and UDP tracker traffic. They are global to the session.

struct udp_error_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   aux::noexcept_movable<udp::endpoint> endpoint;
   operation_t operation;
   error_code const error;
};
[report issue]
endpoint
the source address associated with the error (if any)
[report issue]
operation
the operation that failed
[report issue]
error
the error code describing the error
[report issue]

external_ip_alert

Declared in "libtorrent/alert_types.hpp"

Whenever libtorrent learns about the machines external IP, this alert is generated. The external IP address can be acquired from the tracker (if it supports that) or from peers that supports the extension protocol. The address can be accessed through the external_address member.

struct external_ip_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   aux::noexcept_movable<address> external_address;
};
[report issue]
external_address
the IP address that is believed to be our external IP
[report issue]

listen_failed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when none of the ports, given in the port range, to session can be opened for listening. The listen_interface member is the interface that failed, error is the error code describing the failure.

In the case an endpoint was created before generating the alert, it is represented by address and port. The combinations of socket type and operation in which such address and port are not valid are: accept - i2p accept - socks5 enum_if - tcp

libtorrent may sometimes try to listen on port 0, if all other ports failed. Port 0 asks the operating system to pick a port that's free). If that fails you may see a listen_failed_alert with port 0 even if you didn't ask to listen on it.

struct listen_failed_alert final : alert
{
   std::string message () const override;
   char const* listen_interface () const;

   static constexpr alert_category_t static_category  = alert_category::status | alert_category::error;
   error_code const error;
   operation_t op;
   lt::socket_type_t const socket_type;
   aux::noexcept_movable<lt::address> address;
   int const port;
};
[report issue]

listen_interface()

char const* listen_interface () const;

the network device libtorrent attempted to listen on, or the IP address

[report issue]
error
the error the system returned
[report issue]
op
the underlying operation that failed
[report issue]
socket_type
the type of listen socket this alert refers to.
[report issue]
address
the address libtorrent attempted to listen on see alert documentation for validity of this value
[report issue]
port
the port libtorrent attempted to listen on see alert documentation for validity of this value
[report issue]

listen_succeeded_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when the listen port succeeds to be opened on a particular interface. address and port is the endpoint that successfully was opened for listening.

struct listen_succeeded_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   aux::noexcept_movable<lt::address> address;
   int const port;
   lt::socket_type_t const socket_type;
};
[report issue]
address
the address libtorrent ended up listening on. This address refers to the local interface.
[report issue]
port
the port libtorrent ended up listening on.
[report issue]
socket_type
the type of listen socket this alert refers to.
[report issue]

portmap_error_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a NAT router was successfully found but some part of the port mapping request failed. It contains a text message that may help the user figure out what is wrong. This alert is not generated in case it appears the client is not running on a NAT:ed network or if it appears there is no NAT router that can be remote controlled to add port mappings.

struct portmap_error_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::port_mapping
   | alert_category::error;
   port_mapping_t const mapping;
   portmap_transport map_transport;
   aux::noexcept_movable<address> local_address;
   error_code const error;
};
[report issue]
mapping
refers to the mapping index of the port map that failed, i.e. the index returned from add_mapping().
[report issue]
map_transport
UPnP or NAT-PMP
[report issue]
local_address
the local network the port mapper is running on
[report issue]
error
tells you what failed.
[report issue]

portmap_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a NAT router was successfully found and a port was successfully mapped on it. On a NAT:ed network with a NAT-PMP capable router, this is typically generated once when mapping the TCP port and, if DHT is enabled, when the UDP port is mapped.

struct portmap_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::port_mapping;
   port_mapping_t const mapping;
   int const external_port;
   portmap_protocol const map_protocol;
   portmap_transport const map_transport;
   aux::noexcept_movable<address> local_address;
};
[report issue]
mapping
refers to the mapping index of the port map that failed, i.e. the index returned from add_mapping().
[report issue]
external_port
the external port allocated for the mapping.
[report issue]
local_address
the local network the port mapper is running on
[report issue]

portmap_log_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated to log informational events related to either UPnP or NAT-PMP. They contain a log line and the type (0 = NAT-PMP and 1 = UPnP). Displaying these messages to an end user is only useful for debugging the UPnP or NAT-PMP implementation. This alert is only posted if the alert_category::port_mapping_log flag is enabled in the alert mask.

struct portmap_log_alert final : alert
{
   std::string message () const override;
   char const* log_message () const;

   static constexpr alert_category_t static_category  = alert_category::port_mapping_log;
   portmap_transport const map_transport;
   aux::noexcept_movable<address> local_address;
};
[report issue]

log_message()

char const* log_message () const;

the message associated with this log line

[report issue]
local_address
the local network the port mapper is running on
[report issue]

fastresume_rejected_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a fast resume file has been passed to add_torrent() but the files on disk did not match the fast resume file. The error_code explains the reason why the resume file was rejected.

struct fastresume_rejected_alert final : torrent_alert
{
   std::string message () const override;
   char const* file_path () const;

   static constexpr alert_category_t static_category  = alert_category::status
   | alert_category::error;
   error_code error;
   operation_t op;
};
[report issue]

file_path()

char const* file_path () const;

If the error happened to a specific file, this returns the path to it.

[report issue]
op
the underlying operation that failed
[report issue]

peer_blocked_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when an incoming peer connection, or a peer that's about to be added to our peer list, is blocked for some reason. This could be any of:

  • the IP filter
  • i2p mixed mode restrictions (a normal peer is not allowed on an i2p swarm)
  • the port filter
  • the peer has a low port and no_connect_privileged_ports is enabled
  • the protocol of the peer is blocked (uTP/TCP blocking)
struct peer_blocked_alert final : peer_alert
{
   std::string message () const override;

   enum reason_t
   {
      ip_filter,
      port_filter,
      i2p_mixed,
      privileged_ports,
      utp_disabled,
      tcp_disabled,
      invalid_local_interface,
      ssrf_mitigation,
   };

   static constexpr alert_category_t static_category  = alert_category::ip_block;
   int const reason;
};
[report issue]

enum reason_t

Declared in "libtorrent/alert_types.hpp"

name value description
ip_filter 0  
port_filter 1  
i2p_mixed 2  
privileged_ports 3  
utp_disabled 4  
tcp_disabled 5  
invalid_local_interface 6  
ssrf_mitigation 7  
[report issue]
reason
the reason for the peer being blocked. Is one of the values from the reason_t enum.
[report issue]

dht_announce_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a DHT node announces to an info-hash on our DHT node. It belongs to the alert_category::dht category.

struct dht_announce_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   aux::noexcept_movable<address> ip;
   int port;
   sha1_hash info_hash;
};
[report issue]

dht_get_peers_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a DHT node sends a get_peers message to our DHT node. It belongs to the alert_category::dht category.

struct dht_get_peers_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   sha1_hash info_hash;
};
[report issue]

cache_flushed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when the disk cache has been flushed for a specific torrent as a result of a call to torrent_handle::flush_cache(). This alert belongs to the alert_category::storage category, which must be enabled to let this alert through. The alert is also posted when removing a torrent from the session, once the outstanding cache flush is complete and the torrent does no longer have any files open.

struct cache_flushed_alert final : torrent_alert
{
   static constexpr alert_category_t static_category  = alert_category::storage;
};
[report issue]

lsd_peer_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when we receive a local service discovery message from a peer for a torrent we're currently participating in.

struct lsd_peer_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
};
[report issue]

trackerid_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted whenever a tracker responds with a trackerid. The tracker ID is like a cookie. libtorrent will store the tracker ID for this tracker and repeat it in subsequent announces.

struct trackerid_alert final : tracker_alert
{
   std::string message () const override;
   char const* tracker_id () const;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

tracker_id()

char const* tracker_id () const;

The tracker ID returned by the tracker

[report issue]

dht_bootstrap_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when the initial DHT bootstrap is done.

struct dht_bootstrap_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
};
[report issue]

torrent_error_alert

Declared in "libtorrent/alert_types.hpp"

This is posted whenever a torrent is transitioned into the error state.

struct torrent_error_alert final : torrent_alert
{
   std::string message () const override;
   char const* filename () const;

   static constexpr alert_category_t static_category  = alert_category::error | alert_category::status;
   error_code const error;
};
[report issue]

filename()

char const* filename () const;

the filename (or object) the error occurred on.

[report issue]
error
specifies which error the torrent encountered.
[report issue]

torrent_need_cert_alert

Declared in "libtorrent/alert_types.hpp"

This is always posted for SSL torrents. This is a reminder to the client that the torrent won't work unless torrent_handle::set_ssl_certificate() is called with a valid certificate. Valid certificates MUST be signed by the SSL certificate in the .torrent file.

struct torrent_need_cert_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

incoming_connection_alert

Declared in "libtorrent/alert_types.hpp"

The incoming connection alert is posted every time we successfully accept an incoming connection, through any mean. The most straight-forward ways of accepting incoming connections are through the TCP listen socket and the UDP listen socket for uTP sockets. However, connections may also be accepted through a Socks5 or i2p listen socket, or via an SSL listen socket.

struct incoming_connection_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
   socket_type_t socket_type;
   aux::noexcept_movable<tcp::endpoint> endpoint;
};
[report issue]
socket_type
tells you what kind of socket the connection was accepted
[report issue]
endpoint
is the IP address and port the connection came from.
[report issue]

add_torrent_alert

Declared in "libtorrent/alert_types.hpp"

This alert is always posted when a torrent was attempted to be added and contains the return status of the add operation. The torrent handle of the new torrent can be found as the handle member in the base class. If adding the torrent failed, error contains the error code.

struct add_torrent_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   add_torrent_params params;
   error_code error;
};
[report issue]
params

This contains copies of the most important fields from the original add_torrent_params object, passed to add_torrent() or async_add_torrent(). Specifically, these fields are copied:

  • version
  • ti
  • name
  • save_path
  • userdata
  • tracker_id
  • flags
  • info_hash

the info_hash field will be updated with the info-hash of the torrent specified by ti.

[report issue]
error
set to the error, if one occurred while adding the torrent.
[report issue]

state_update_alert

Declared in "libtorrent/alert_types.hpp"

This alert is only posted when requested by the user, by calling session::post_torrent_updates() on the session. It contains the torrent status of all torrents that changed since last time this message was posted. Its category is alert_category::status, but it's not subject to filtering, since it's only manually posted anyway.

struct state_update_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   std::vector<torrent_status> status;
};
[report issue]
status
contains the torrent status of all torrents that changed since last time this message was posted. Note that you can map a torrent status to a specific torrent via its handle member. The receiving end is suggested to have all torrents sorted by the torrent_handle or hashed by it, for efficient updates.
[report issue]

session_stats_alert

Declared in "libtorrent/alert_types.hpp"

The session_stats_alert is posted when the user requests session statistics by calling post_session_stats() on the session object. This alert does not have a category, since it's only posted in response to an API call. It is not subject to the alert_mask filter.

the message() member function returns a string representation of the values that properly match the line returned in session_stats_header_alert::message().

this specific output is parsed by tools/parse_session_stats.py if this is changed, that parser should also be changed

struct session_stats_alert final : alert
{
   std::string message () const override;
   span<std::int64_t const> counters () const;

   static constexpr alert_category_t static_category  = {};
};
[report issue]

counters()

span<std::int64_t const> counters () const;

An array are a mix of counters and gauges, which meanings can be queries via the session_stats_metrics() function on the session. The mapping from a specific metric to an index into this array is constant for a specific version of libtorrent, but may differ for other versions. The intended usage is to request the mapping, i.e. call session_stats_metrics(), once on startup, and then use that mapping to interpret these values throughout the process' runtime.

For more information, see the session statistics section.

[report issue]

dht_error_alert

Declared in "libtorrent/alert_types.hpp"

posted when something fails in the DHT. This is not necessarily a fatal error, but it could prevent proper operation

struct dht_error_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error | alert_category::dht;
   error_code error;
   operation_t op;
};
[report issue]
error
the error code
[report issue]
op
the operation that failed
[report issue]

dht_immutable_item_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted as a response to a call to session::get_item(), specifically the overload for looking up immutable items in the DHT.

struct dht_immutable_item_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   sha1_hash target;
   entry item;
};
[report issue]
target
the target hash of the immutable item. This must match the SHA-1 hash of the bencoded form of item.
[report issue]
item
the data for this item
[report issue]

dht_mutable_item_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted as a response to a call to session::get_item(), specifically the overload for looking up mutable items in the DHT.

struct dht_mutable_item_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   std::array<char, 32> key;
   std::array<char, 64> signature;
   std::int64_t seq;
   std::string salt;
   entry item;
   bool authoritative;
};
[report issue]
key
the public key that was looked up
[report issue]
signature
the signature of the data. This is not the signature of the plain encoded form of the item, but it includes the sequence number and possibly the hash as well. See the dht_store document for more information. This is primarily useful for echoing back in a store request.
[report issue]
seq
the sequence number of this item
[report issue]
salt
the salt, if any, used to lookup and store this item. If no salt was used, this is an empty string
[report issue]
item
the data for this item
[report issue]
authoritative
the last response for mutable data is authoritative.
[report issue]

dht_put_alert

Declared in "libtorrent/alert_types.hpp"

this is posted when a DHT put operation completes. This is useful if the client is waiting for a put to complete before shutting down for instance.

struct dht_put_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   sha1_hash target;
   std::array<char, 32> public_key;
   std::array<char, 64> signature;
   std::string salt;
   std::int64_t seq;
   int num_success;
};
[report issue]
target
the target hash the item was stored under if this was an immutable item.
[report issue]
public_key signature salt seq
if a mutable item was stored, these are the public key, signature, salt and sequence number the item was stored under.
[report issue]
num_success
DHT put operation usually writes item to k nodes, maybe the node is stale so no response, or the node doesn't support 'put', or the token for write is out of date, etc. num_success is the number of successful responses we got from the puts.
[report issue]

i2p_alert

Declared in "libtorrent/alert_types.hpp"

this alert is used to report errors in the i2p SAM connection

struct i2p_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   error_code error;
};
[report issue]
error
the error that occurred in the i2p SAM connection
[report issue]

dht_outgoing_get_peers_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when we send a get_peers request It belongs to the alert_category::dht category.

struct dht_outgoing_get_peers_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   sha1_hash info_hash;
   sha1_hash obfuscated_info_hash;
   aux::noexcept_movable<udp::endpoint> endpoint;
};
[report issue]
info_hash
the info_hash of the torrent we're looking for peers for.
[report issue]
obfuscated_info_hash
if this was an obfuscated lookup, this is the info-hash target actually sent to the node.
[report issue]
endpoint
the endpoint we're sending this query to
[report issue]

log_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted by some session wide event. Its main purpose is trouble shooting and debugging. It's not enabled by the default alert mask and is enabled by the alert_category::session_log bit. Furthermore, it's by default disabled as a build configuration.

struct log_alert final : alert
{
   std::string message () const override;
   char const* log_message () const;

   static constexpr alert_category_t static_category  = alert_category::session_log;
};
[report issue]

log_message()

char const* log_message () const;

returns the log message

[report issue]

torrent_log_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted by torrent wide events. It's meant to be used for trouble shooting and debugging. It's not enabled by the default alert mask and is enabled by the alert_category::torrent_log bit. By default it is disabled as a build configuration.

struct torrent_log_alert final : torrent_alert
{
   std::string message () const override;
   char const* log_message () const;

   static constexpr alert_category_t static_category  = alert_category::torrent_log;
};
[report issue]

log_message()

char const* log_message () const;

returns the log message

[report issue]

peer_log_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted by events specific to a peer. It's meant to be used for trouble shooting and debugging. It's not enabled by the default alert mask and is enabled by the alert_category::peer_log bit. By default it is disabled as a build configuration.

struct peer_log_alert final : peer_alert
{
   std::string message () const override;
   char const* log_message () const;

   enum direction_t
   {
      incoming_message,
      outgoing_message,
      incoming,
      outgoing,
      info,
   };

   static constexpr alert_category_t static_category  = alert_category::peer_log;
   char const* event_type;
   direction_t direction;
};
[report issue]

log_message()

char const* log_message () const;

returns the log message

[report issue]

enum direction_t

Declared in "libtorrent/alert_types.hpp"

name value description
incoming_message 0  
outgoing_message 1  
incoming 2  
outgoing 3  
info 4  
[report issue]
event_type
string literal indicating the kind of event. For messages, this is the message name.
[report issue]

lsd_error_alert

Declared in "libtorrent/alert_types.hpp"

posted if the local service discovery socket fails to start properly. it's categorized as alert_category::error.

struct lsd_error_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   aux::noexcept_movable<address> local_address;
   error_code error;
};
[report issue]
local_address
the local network the corresponding local service discovery is running on
[report issue]
error
The error code
[report issue]

dht_lookup

Declared in "libtorrent/alert_types.hpp"

holds statistics about a current dht_lookup operation. a DHT lookup is the traversal of nodes, looking up a set of target nodes in the DHT for retrieving and possibly storing information in the DHT

struct dht_lookup
{
   char const* type;
   int outstanding_requests;
   int timeouts;
   int responses;
   int branch_factor;
   int nodes_left;
   int last_sent;
   int first_timeout;
   sha1_hash target;
};
[report issue]
type
string literal indicating which kind of lookup this is
[report issue]
outstanding_requests
the number of outstanding request to individual nodes this lookup has right now
[report issue]
timeouts
the total number of requests that have timed out so far for this lookup
[report issue]
responses
the total number of responses we have received for this lookup so far for this lookup
[report issue]
branch_factor
the branch factor for this lookup. This is the number of nodes we keep outstanding requests to in parallel by default. when nodes time out we may increase this.
[report issue]
nodes_left
the number of nodes left that could be queries for this lookup. Many of these are likely to be part of the trail while performing the lookup and would never end up actually being queried.
[report issue]
last_sent
the number of seconds ago the last message was sent that's still outstanding
[report issue]
first_timeout
the number of outstanding requests that have exceeded the short timeout and are considered timed out in the sense that they increased the branch factor
[report issue]
target
the node-id or info-hash target for this lookup
[report issue]

dht_stats_alert

Declared in "libtorrent/alert_types.hpp"

contains current DHT state. Posted in response to session::post_dht_stats().

struct dht_stats_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = {};
   std::vector<dht_lookup> active_requests;
   std::vector<dht_routing_bucket> routing_table;
   sha1_hash nid;
   aux::noexcept_movable<udp::endpoint> local_endpoint;
};
[report issue]
active_requests
a vector of the currently running DHT lookups.
[report issue]
routing_table
contains information about every bucket in the DHT routing table.
[report issue]
nid
the node ID of the DHT node instance
[report issue]
local_endpoint
the local socket this DHT node is running on
[report issue]

incoming_request_alert

Declared in "libtorrent/alert_types.hpp"

posted every time an incoming request from a peer is accepted and queued up for being serviced. This alert is only posted if the alert_category::incoming_request flag is enabled in the alert mask.

struct incoming_request_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::incoming_request;
   peer_request req;
};
[report issue]
req
the request this peer sent to us
[report issue]

dht_log_alert

Declared in "libtorrent/alert_types.hpp"

debug logging of the DHT when alert_category::dht_log is set in the alert mask.

struct dht_log_alert final : alert
{
   std::string message () const override;
   char const* log_message () const;

   enum dht_module_t
   {
      tracker,
      node,
      routing_table,
      rpc_manager,
      traversal,
   };

   static constexpr alert_category_t static_category  = alert_category::dht_log;
   dht_module_t module;
};
[report issue]

log_message()

char const* log_message () const;

the log message

[report issue]

enum dht_module_t

Declared in "libtorrent/alert_types.hpp"

name value description
tracker 0  
node 1  
routing_table 2  
rpc_manager 3  
traversal 4  
[report issue]
module
the module, or part, of the DHT that produced this log message.
[report issue]

dht_pkt_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted every time a DHT message is sent or received. It is only posted if the alert_category::dht_log alert category is enabled. It contains a verbatim copy of the message.

struct dht_pkt_alert final : alert
{
   std::string message () const override;
   span<char const> pkt_buf () const;

   enum direction_t
   {
      incoming,
      outgoing,
   };

   static constexpr alert_category_t static_category  = alert_category::dht_log;
   direction_t direction;
   aux::noexcept_movable<udp::endpoint> node;
};
[report issue]

pkt_buf()

span<char const> pkt_buf () const;

returns a pointer to the packet buffer and size of the packet, respectively. This buffer is only valid for as long as the alert itself is valid, which is owned by libtorrent and reclaimed whenever pop_alerts() is called on the session.

[report issue]

enum direction_t

Declared in "libtorrent/alert_types.hpp"

name value description
incoming 0  
outgoing 1  
[report issue]
direction
whether this is an incoming or outgoing packet.
[report issue]
node
the DHT node we received this packet from, or sent this packet to (depending on direction).
[report issue]

dht_get_peers_reply_alert

Declared in "libtorrent/alert_types.hpp"

Posted when we receive a response to a DHT get_peers request.

struct dht_get_peers_reply_alert final : alert
{
   std::string message () const override;
   int num_peers () const;
   std::vector<tcp::endpoint> peers () const;

   static constexpr alert_category_t static_category  = alert_category::dht_operation;
   sha1_hash info_hash;
};
[report issue]

dht_direct_response_alert

Declared in "libtorrent/alert_types.hpp"

This is posted exactly once for every call to session_handle::dht_direct_request. If the request failed, response() will return a default constructed bdecode_node.

struct dht_direct_response_alert final : alert
{
   std::string message () const override;
   bdecode_node response () const;

   static constexpr alert_category_t static_category  = alert_category::dht;
   client_data_t userdata;
   aux::noexcept_movable<udp::endpoint> endpoint;
};
[report issue]

picker_log_alert

Declared in "libtorrent/alert_types.hpp"

this is posted when one or more blocks are picked by the piece picker, assuming the verbose piece picker logging is enabled (see alert_category::picker_log).

struct picker_log_alert final : peer_alert
{
   std::string message () const override;
   std::vector<piece_block> blocks () const;

   static constexpr alert_category_t static_category  = alert_category::picker_log;
   static constexpr picker_flags_t partial_ratio  = 0_bit;
   static constexpr picker_flags_t prioritize_partials  = 1_bit;
   static constexpr picker_flags_t rarest_first_partials  = 2_bit;
   static constexpr picker_flags_t rarest_first  = 3_bit;
   static constexpr picker_flags_t reverse_rarest_first  = 4_bit;
   static constexpr picker_flags_t suggested_pieces  = 5_bit;
   static constexpr picker_flags_t prio_sequential_pieces  = 6_bit;
   static constexpr picker_flags_t sequential_pieces  = 7_bit;
   static constexpr picker_flags_t reverse_pieces  = 8_bit;
   static constexpr picker_flags_t time_critical  = 9_bit;
   static constexpr picker_flags_t random_pieces  = 10_bit;
   static constexpr picker_flags_t prefer_contiguous  = 11_bit;
   static constexpr picker_flags_t reverse_sequential  = 12_bit;
   static constexpr picker_flags_t backup1  = 13_bit;
   static constexpr picker_flags_t backup2  = 14_bit;
   static constexpr picker_flags_t end_game  = 15_bit;
   static constexpr picker_flags_t extent_affinity  = 16_bit;
   picker_flags_t const picker_flags;
};
[report issue]
picker_flags
this is a bitmask of which features were enabled for this particular pick. The bits are defined in the picker_flags_t enum.
[report issue]

session_error_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted when the session encounters a serious error, potentially fatal

struct session_error_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   error_code const error;
};
[report issue]
error
The error code, if one is associated with this error
[report issue]

dht_live_nodes_alert

Declared in "libtorrent/alert_types.hpp"

posted in response to a call to session::dht_live_nodes(). It contains the live nodes from the DHT routing table of one of the DHT nodes running locally.

struct dht_live_nodes_alert final : alert
{
   std::string message () const override;
   std::vector<std::pair<sha1_hash, udp::endpoint>> nodes () const;
   int num_nodes () const;

   static constexpr alert_category_t static_category  = alert_category::dht;
   sha1_hash node_id;
};
[report issue]

num_nodes() nodes()

std::vector<std::pair<sha1_hash, udp::endpoint>> nodes () const;
int num_nodes () const;

the number of nodes in the routing table and the actual nodes.

[report issue]
node_id
the local DHT node's node-ID this routing table belongs to
[report issue]

session_stats_header_alert

Declared in "libtorrent/alert_types.hpp"

The session_stats_header alert is posted the first time post_session_stats() is called

the message() member function returns a string representation of the header that properly match the stats values string returned in session_stats_alert::message().

this specific output is parsed by tools/parse_session_stats.py if this is changed, that parser should also be changed

struct session_stats_header_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = {};
};
[report issue]

dht_sample_infohashes_alert

Declared in "libtorrent/alert_types.hpp"

posted as a response to a call to session::dht_sample_infohashes() with the information from the DHT response message.

struct dht_sample_infohashes_alert final : alert
{
   std::string message () const override;
   std::vector<sha1_hash> samples () const;
   int num_samples () const;
   int num_nodes () const;
   std::vector<std::pair<sha1_hash, udp::endpoint>> nodes () const;

   static constexpr alert_category_t static_category  = alert_category::dht_operation;
   sha1_hash node_id;
   aux::noexcept_movable<udp::endpoint> endpoint;
   time_duration const interval;
   int const num_infohashes;
};
[report issue]

num_samples() samples()

std::vector<sha1_hash> samples () const;
int num_samples () const;

returns the number of info-hashes returned by the node, as well as the actual info-hashes. num_samples() is more efficient than samples().size().

[report issue]

num_nodes()

int num_nodes () const;

The total number of nodes returned by nodes().

[report issue]

nodes()

std::vector<std::pair<sha1_hash, udp::endpoint>> nodes () const;

This is the set of more DHT nodes returned by the request.

The information is included so that indexing nodes can perform a key space traversal with a single RPC per node by adjusting the target value for each RPC.

[report issue]
node_id
id of the node the request was sent to (and this response was received from)
[report issue]
endpoint
the node the request was sent to (and this response was received from)
[report issue]
interval
the interval to wait before making another request to this node
[report issue]
num_infohashes
This field indicates how many info-hash keys are currently in the node's storage. If the value is larger than the number of returned samples it indicates that the indexer may obtain additional samples after waiting out the interval.
[report issue]

block_uploaded_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when a block intended to be sent to a peer is placed in the send buffer. Note that if the connection is closed before the send buffer is sent, the alert may be posted without the bytes having been sent to the peer. It belongs to the alert_category::upload category.

struct block_uploaded_alert final : peer_alert
{
   std::string message () const override;

   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

alerts_dropped_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted to indicate to the client that some alerts were dropped. Dropped meaning that the alert failed to be delivered to the client. The most common cause of such failure is that the internal alert queue grew too big (controlled by alert_queue_size).

struct alerts_dropped_alert final : alert
{
   static_assert (num_alert_types <= abi_alert_count, "need to increase bitset. This is an ABI break");
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   std::bitset<abi_alert_count> dropped_alerts;
};
[report issue]
dropped_alerts
a bitmask indicating which alerts were dropped. Each bit represents the alert type ID, where bit 0 represents whether any alert of type 0 has been dropped, and so on.
[report issue]

socks5_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted with SOCKS5 related errors, when a SOCKS5 proxy is configured. It's enabled with the alert_category::error alert category.

struct socks5_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   error_code error;
   operation_t op;
   aux::noexcept_movable<tcp::endpoint> ip;
};
[report issue]
error
the error
[report issue]
op
the operation that failed
[report issue]
ip
the endpoint configured as the proxy
[report issue]

file_prio_alert

Declared in "libtorrent/alert_types.hpp"

posted when a prioritize_files() or file_priority() update of the file priorities complete, which requires a round-trip to the disk thread.

If the disk operation fails this alert won't be posted, but a file_error_alert is posted instead, and the torrent is stopped.

struct file_prio_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage;
   error_code error;
   operation_t op;
};
[report issue]
error
the error
[report issue]
op
the operation that failed
[report issue]

alert_cast()

Declared in "libtorrent/alert.hpp"

template <typename T> T const* alert_cast (alert const* a);
template <typename T> T* alert_cast (alert* a);

When you get an alert, you can use alert_cast<> to attempt to cast the pointer to a specific alert type, in order to query it for more information.

Note

alert_cast<> can only cast to an exact alert type, not a base class

[report issue]

operation_name()

Declared in "libtorrent/operations.hpp"

char const* operation_name (operation_t op);

maps an operation id (from peer_error_alert and peer_disconnected_alert) to its name. See operation_t for the constants

[report issue]

enum operation_t

Declared in "libtorrent/operations.hpp"

name value description
unknown 0 the error was unexpected and it is unknown which operation caused it
bittorrent 1 this is used when the bittorrent logic determines to disconnect
iocontrol 2 a call to iocontrol failed
getpeername 3 a call to getpeername() failed (querying the remote IP of a connection)
getname 4 a call to getname failed (querying the local IP of a connection)
alloc_recvbuf 5 an attempt to allocate a receive buffer failed
alloc_sndbuf 6 an attempt to allocate a send buffer failed
file_write 7 writing to a file failed
file_read 8 reading from a file failed
file 9 a non-read and non-write file operation failed
sock_write 10 a socket write operation failed
sock_read 11 a socket read operation failed
sock_open 12 a call to open(), to create a socket socket failed
sock_bind 13 a call to bind() on a socket failed
available 14 an attempt to query the number of bytes available to read from a socket failed
encryption 15 a call related to bittorrent protocol encryption failed
connect 16 an attempt to connect a socket failed
ssl_handshake 17 establishing an SSL connection failed
get_interface 18 a connection failed to satisfy the bind interface setting
sock_listen 19 a call to listen() on a socket
sock_bind_to_device 20 a call to the ioctl to bind a socket to a specific network device or adapter
sock_accept 21 a call to accept() on a socket
parse_address 22 convert a string into a valid network address
enum_if 23 enumeration network devices or adapters
file_stat 24 invoking stat() on a file
file_copy 25 copying a file
file_fallocate 26 allocating storage for a file
file_hard_link 27 creating a hard link
file_remove 28 removing a file
file_rename 29 renaming a file
file_open 30 opening a file
mkdir 31 creating a directory
check_resume 32 check fast resume data against files on disk
exception 33 an unknown exception
alloc_cache_piece 34 allocate space for a piece in the cache
partfile_move 35 move a part-file
partfile_read 36 read from a part file
partfile_write 37 write to a part-file
hostname_lookup 38 a hostname lookup
symlink 39 create or read a symlink
handshake 40 handshake with a peer or server
sock_option 41 set socket option
enum_route 42 enumeration of network routes
file_seek 43 moving read/write position in a file, operation_t::hostname_lookup
timer 44 an async wait operation on a timer
file_mmap 45 call to mmap() (or windows counterpart)
file_truncate 46 call to ftruncate() (or SetEndOfFile() on windows)
[report issue]

alert_category_t

Declared in "libtorrent/alert.hpp"

error

Enables alerts that report an error. This includes:

  • tracker errors
  • tracker warnings
  • file errors
  • resume data failures
  • web seed errors
  • .torrent files errors
  • listen socket errors
  • port mapping errors
peer
Enables alerts when peers send invalid requests, get banned or snubbed.
port_mapping
Enables alerts for port mapping events. For NAT-PMP and UPnP.
storage
Enables alerts for events related to the storage. File errors and synchronization events for moving the storage, renaming files etc.
tracker
Enables all tracker events. Includes announcing to trackers, receiving responses, warnings and errors.
connect
Low level alerts for when peers are connected and disconnected.
status
Enables alerts for when a torrent or the session changes state.
ip_block
Alerts when a peer is blocked by the ip blocker or port blocker.
performance_warning
Alerts when some limit is reached that might limit the download or upload rate.
dht
Alerts on events in the DHT node. For incoming searches or bootstrapping being done etc.
stats
If you enable these alerts, you will receive a stats_alert approximately once every second, for every active torrent. These alerts contain all statistics counters for the interval since the lasts stats alert.
session_log
Enables debug logging alerts. These are available unless libtorrent was built with logging disabled (TORRENT_DISABLE_LOGGING). The alerts being posted are log_alert and are session wide.
torrent_log
Enables debug logging alerts for torrents. These are available unless libtorrent was built with logging disabled (TORRENT_DISABLE_LOGGING). The alerts being posted are torrent_log_alert and are torrent wide debug events.
peer_log
Enables debug logging alerts for peers. These are available unless libtorrent was built with logging disabled (TORRENT_DISABLE_LOGGING). The alerts being posted are peer_log_alert and low-level peer events and messages.
incoming_request
enables the incoming_request_alert.
dht_log
enables dht_log_alert, debug logging for the DHT
dht_operation
enable events from pure dht operations not related to torrents
port_mapping_log
enables port mapping log events. This log is useful for debugging the UPnP or NAT-PMP implementation
picker_log
enables verbose logging from the piece picker.
file_progress
alerts when files complete downloading
piece_progress
alerts when pieces complete downloading or fail hash check
upload
alerts when we upload blocks to other peers
block_progress
alerts on individual blocks being requested, downloading, finished, rejected, time-out and cancelled. This is likely to post alerts at a high rate.
all

The full bitmask, representing all available categories.

since the enum is signed, make sure this isn't interpreted as -1. For instance, boost.python does that and fails when assigning it to an unsigned parameter.

[report issue]

int

Declared in "libtorrent/alert_types.hpp"

user_alert_id
user defined alerts should use IDs greater than this
num_alert_types
this constant represents "max_alert_index" + 1
libtorrent-rasterbar-2.0.5/docs/dht_store.rst0000664000175000017500000003543114152763504020355 0ustar arvidarvid============================================ BitTorrent extension for arbitrary DHT store ============================================ .. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none 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 each other. 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: .. parsed-literal:: { "a": { "id": *<20 byte id of sending node (string)>*, "v": ** }, "t": **, "y": "q", "q": "put" } Response: .. parsed-literal:: { "r": { "id": *<20 byte id of sending node (string)>* }, "t": **, "y": "r", } get message ........... Request: .. parsed-literal:: { "a": { "id": *<20 byte id of sending node (string)>*, "target": **, }, "t": **, "y": "q", "q": "get" } Response: .. parsed-literal:: { "r": { "id": *<20 byte id of sending node (string)>*, "token": **, "v": **, "nodes": **, "nodes6": ** }, "t": **, "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: .. parsed-literal:: { "a": { "cas": **, "id": *<20 byte id of sending node (string)>*, "k": **, "salt": ** "seq": **, "sig": **, "token": **, "v": ** }, "t": **, "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: .. parsed-literal:: { "r": { "id": *<20 byte id of sending node (string)>* }, "t": **, "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: .. _BEP5: https://www.bittorrent.org/beps/bep_0005.html .. parsed-literal:: { "e": [ **, ** ], "t": **, "y": "e", } In addition to the error codes defined in BEP5_, this specification defines some additional error codes. +------------+-----------------------------+ | error-code | description | +============+=============================+ | 205 | message (``v`` field) | | | too big. | +------------+-----------------------------+ | 206 | invalid signature | +------------+-----------------------------+ | 207 | salt (``salt`` field) | | | too big. | +------------+-----------------------------+ | 301 | the CAS hash mismatched, | | | re-read value and try | | | again. | +------------+-----------------------------+ | 302 | sequence 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: .. parsed-literal:: { "a": { "id": *<20 byte id of sending node (string)>*, "target:" *<20 byte SHA-1 hash of public key and salt (string)>* }, "t": **, "y": "q", "q": "get" } Response: .. parsed-literal:: { "r": { "id": *<20 byte id of sending node (string)>*, "k": **, "nodes": **, "nodes6": **, "seq": **, "sig": **, "token": **, "v": ** }, "t": **, "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. 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. 3. sign or verify the concatenated string 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: * NaCl_ * libsodium_ * `nightcracker's ed25519`_ .. _NaCl: https://nacl.cr.yp.to/ .. _libsodium: https://github.com/jedisct1/libsodium .. _`nightcracker's ed25519`: https://github.com/nightcracker/ed25519 libtorrent-rasterbar-2.0.5/docs/contributing.rst0000664000175000017500000000532014152763504021063 0ustar arvidarvid.. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none 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`_. .. _`mailing list`: https://lists.sourceforge.net/lists/listinfo/libtorrent-discuss 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 (like the rate-based choker). Additional fuzzers are also always welcome. Find a libtorrent interface that's not already covered by a fuzzer (see the ``fuzzers`` directory in the root) and add a new fuzzer to it. Alternatively, improve an existing fuzzer by producing inputs that gets coverage deeper in to libtorrent. .. _`github`: https://github.com/arvidn/libtorrent/issues 2. 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. Each heading in the online documentation has a short-cut link to file a new issue against the documentation. For updates, please submit a `pull request`_. All documentation is in restructured text (rst_). All documentation is spell checked with hunspell which can be invoked via ``make spell-check`` in the docs directory. If words are missing, please add them to ``docs/hunspell/libtorrent.dic`` 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 updates, 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. For an overview of the internals of libtorrent, see the hacking_ page. For outstanding things to do, see the `todo list`_. .. _hacking: hacking.html .. _`pull request`: https://github.com/arvidn/libtorrent .. _`todo list`: todo.html .. _rst: https://docutils.sourceforge.io/rst.html libtorrent-rasterbar-2.0.5/docs/manual.rst0000664000175000017500000017152214152763504017641 0ustar arvidarvid.. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none overview ======== The interface of libtorrent consists of a few classes. The main class is the ``session``, it contains the main loop that serves all torrents. The basic usage is as follows: * construct a session, possibly passing in the state from a previous session. use read_session_params() and pass in the resulting session_params object to the session constructor. * start extensions (see add_extension()). * start DHT, LSD, UPnP, NAT-PMP etc (see start_dht(), start_lsd(), start_upnp() and start_natpmp()). * parse .torrent-files and add them to the session (see torrent_info, async_add_torrent() and add_torrent()) * main loop (see session) * poll for alerts (see wait_for_alert(), pop_alerts()) * handle updates to torrents, (see state_update_alert). * handle other alerts, (see alert). * query the session for information (see session::status()). * add and remove torrents from the session (remove_torrent()) * save resume data for all torrent_handles (optional, see save_resume_data()) * save session state (see session_state() and write_session_params()) * destruct session object Each class and function is described in this manual, you may want to have a look at the tutorial_ as well. .. _tutorial: tutorial-ref.html For a description on how to create torrent files, see create_torrent. .. _make_torrent: make_torrent.html forward declarations ==================== Forward declaring types from the libtorrent namespace is discouraged as it may break in future releases. Instead include ``libtorrent/fwd.hpp`` for forward declarations of all public types in libtorrent. trouble shooting ================ A common problem developers are facing is torrents stopping without explanation. Here is a description on which conditions libtorrent will stop your torrents, how to find out about it and what to do about it. Make sure to keep track of the paused state, the error state and the upload mode of your torrents. By default, torrents are auto-managed, which means libtorrent will pause, resume, scrape them and take them out of upload-mode automatically. Whenever a torrent encounters a fatal error, it will be stopped, and the ``torrent_status::error`` will describe the error that caused it. If a torrent is auto managed, it is scraped periodically and paused or resumed based on the number of downloaders per seed. This will effectively seed torrents that are in the greatest need of seeds. If a torrent hits a disk write error, it will be put into upload mode. This means it will not download anything, but only upload. The assumption is that the write error is caused by a full disk or write permission errors. If the torrent is auto-managed, it will periodically be taken out of the upload mode, trying to write things to the disk again. This means torrent will recover from certain disk errors if the problem is resolved. If the torrent is not auto managed, you have to call set_upload_mode() to turn downloading back on again. For a more detailed guide on how to trouble shoot performance issues, see troubleshooting_ .. _troubleshooting: troubleshooting.html ABI considerations ================== libtorrent maintains a stable ABI for versions with the same major and minor versions. e.g. libtorrent-1.2.0 is ABI compatible with libtorrent-1.2.1 but not with libtorrent-1.1 network primitives ================== There are a few typedefs in the ``libtorrent`` namespace which pulls in network types from the ``boost::asio`` namespace. These are:: using address = boost::asio::ip::address; using address_v4 = boost::asio::ip::address_v4; using address_v6 = boost::asio::ip::address_v6; using boost::asio::ip::tcp; using boost::asio::ip::udp; These are declared in the ```` header. The ``using`` statements will give easy access to:: tcp::endpoint udp::endpoint Which are the endpoint types used in libtorrent. An endpoint is an address with an associated port. For documentation on these types, please refer to the `asio documentation`_. .. _`asio documentation`: https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio.html exceptions ========== Many functions in libtorrent have two versions, one that throws exceptions on errors and one that takes an ``error_code`` reference which is filled with the error code on errors. On exceptions, libtorrent will throw ``boost::system::system_error`` exceptions carrying an ``error_code`` describing the underlying error. translating error codes ----------------------- The error_code::message() function will typically return a localized error string, for system errors. That is, errors that belong to the generic or system category. Errors that belong to the libtorrent error category are not localized however, they are only available in English. In order to translate libtorrent errors, compare the error category of the ``error_code`` object against ``lt::libtorrent_category()``, and if matches, you know the error code refers to the list above. You can provide your own mapping from error code to string, which is localized. In this case, you cannot rely on ``error_code::message()`` to generate your strings. The numeric values of the errors are part of the API and will stay the same, although new error codes may be appended at the end. Here's a simple example of how to translate error codes: .. code:: c++ std::string error_code_to_string(boost::system::error_code const& ec) { if (ec.category() != lt::libtorrent_category()) { return ec.message(); } // the error is a libtorrent error int code = ec.value(); static const char const* swedish[] = { "inget fel", "en fil i torrenten kolliderar med en fil fran en annan torrent", "hash check misslyckades", "torrentfilen ar inte en dictionary", "'info'-nyckeln saknas eller ar korrupt i torrentfilen", "'info'-faltet ar inte en dictionary", "'piece length' faltet saknas eller ar korrupt i torrentfilen", "torrentfilen saknar namnfaltet", "ogiltigt namn i torrentfilen (kan vara en attack)", // ... more strings here }; // use the default error string in case we don't have it // in our translated list if (code < 0 || code >= sizeof(swedish)/sizeof(swedish[0])) return ec.message(); return swedish[code]; } magnet links ============ Magnet links are URIs that includes an info-hash, a display name and optionally a tracker url. The idea behind magnet links is that an end user can click on a link in a browser and have it handled by a bittorrent application, to start a download, without any .torrent file. The format of the magnet URI is: **magnet:?xt=urn:btih:** *Base16 encoded info-hash* [ **&dn=** *name of download* ] [ **&tr=** *tracker URL* ]* In order to download *just* the metadata (.torrent file) from a magnet link, set the torrent_flags::upload_mode flag in add_torrent_params before adding the it. In this case, when the metadata is received from the swarm, the torrent will still be running, but it will disconnect the majority of peers (since connections to peers that already have the metadata are redundant). It will keep seeding the *metadata* only. Note that this doesn't prevent empty files from being created, if the torrent contains any. If you need to prevent that, you can either set ``file_priority`` to a long list of zeros (since the number of files is not known in advance), or set ``save_path`` to an invalid path. .torrent file ------------- To save a .torrent file from a torrent that was added by magnet link (or added any way really): * call save_resume_data() on the torrent_handle, make sure to pass in the ``save_info_dict`` flag * wait for resume_data_alert * call write_torrent_file() passing in the add_torrent_params object from the alert. The resume data format is very similar to the .torrent file format, and when including the info-dict in the resume data, the resume file can be used as a .torrent file (with just a few minor exceptions). queuing ======= libtorrent supports *queuing*. Queuing is a mechanism to automatically pause and resume torrents based on certain criteria. The criteria depends on the overall state the torrent is in (checking, downloading or seeding). To opt-out of the queuing logic, make sure your torrents are added with the torrent_flags::auto_managed bit *cleared* from ``add_torrent_params::flags``. Or call torrent_handle::unset_flags() and pass in torrent_flags::auto_managed on the torrent handle. The overall purpose of the queuing logic is to improve performance under arbitrary torrent downloading and seeding load. For example, if you want to download 100 torrents on a limited home connection, you improve performance by downloading them one at a time (or maybe two at a time), over downloading them all in parallel. The benefits are: * the average completion time of a torrent is half of what it would be if all downloaded in parallel. * The amount of upload capacity is more likely to reach the *reciprocation rate* of your peers, and is likely to improve your *return on investment* (download to upload ratio) * your disk I/O load is likely to be more local which may improve I/O performance and decrease fragmentation. There are fundamentally 3 separate queues: * checking torrents * downloading torrents * seeding torrents Every torrent that is not seeding has a queue number associated with it, this is its place in line to be started. See torrent_status::queue_position. On top of the limits of each queue, there is an over arching limit, set in settings_pack::active_limit. The auto manager will never start more than this number of torrents (with one exception described below). Non-auto-managed torrents are exempt from this logic, and not counted. At a regular interval, torrents are checked if there needs to be any re-ordering of which torrents are active and which are queued. This interval can be controlled via settings_pack::auto_manage_interval. For queuing to work, resume data needs to be saved and restored for all torrents. See torrent_handle::save_resume_data(). queue position -------------- The torrents in the front of the queue are started and the rest are ordered by their queue position. Any newly added torrent is placed at the end of the queue. Once a torrent is removed or turns into a seed, its queue position is -1 and all torrents that used to be after it in the queue, decreases their position in order to fill the gap. The queue positions are always contiguous, in a sequence without any gaps. Lower queue position means closer to the front of the queue, and will be started sooner than torrents with higher queue positions. To query a torrent for its position in the queue, or change its position, see: torrent_handle::queue_position(), torrent_handle::queue_position_up(), torrent_handle::queue_position_down(), torrent_handle::queue_position_top() and torrent_handle::queue_position_bottom(). checking queue -------------- The checking queue affects torrents in the torrent_status::checking or torrent_status::allocating state that are auto-managed. The checking queue will make sure that (of the torrents in its queue) no more than settings_pack::active_checking_limit torrents are started at any given time. Once a torrent completes checking and moves into a different state, the next in line will be started for checking. Any torrent added force-started or force-stopped (i.e. the auto managed flag is *not* set), will not be subject to this limit and they will all check independently and in parallel. Once a torrent completes the checking of its files, or resume data, it will be put in the queue for downloading and potentially start downloading immediately. In order to add a torrent and check its files without starting the download, it can be added in ``stop_when_ready`` mode. See add_torrent_params::flag_stop_when_ready. This flag will stop the torrent once it is ready to start downloading. This is conceptually the same as waiting for the ``torrent_checked_alert`` and then call:: h.set_flags(torrent_flags::paused, torrent_flags::paused | torrent_flags::auto_managed); With the important distinction that it entirely avoids the brief window where the torrent is in downloading state. downloading queue ----------------- Similarly to the checking queue, the downloading queue will make sure that no more than settings_pack::active_downloads torrents are in the downloading state at any given time. The torrent_status::queue_position is used again here to determine who is next in line to be started once a downloading torrent completes or is stopped/removed. seeding queue ------------- The seeding queue does not use torrent_status::queue_position to determine which torrent to seed. Instead, it estimates the *demand* for the torrent to be seeded. A torrent with few other seeds and many downloaders is assumed to have a higher demand of more seeds than one with many seeds and few downloaders. It limits the number of started seeds to settings_pack::active_seeds. On top of this basic bias, *seed priority* can be controller by specifying a seed ratio (the upload to download ratio), a seed-time ratio (the download time to seeding time ratio) and a seed-time (the absolute time to be seeding a torrent). Until all those targets are hit, the torrent will be prioritized for seeding. Among torrents that have met their seed target, torrents where we don't know of any other seed take strict priority. In order to avoid flapping, torrents that were started less than 30 minutes ago also have priority to keep seeding. Finally, for torrents where none of the above apply, they are prioritized based on the download to seed ratio. The relevant settings to control these limits are settings_pack::share_ratio_limit, settings_pack::seed_time_ratio_limit and settings_pack::seed_time_limit. queuing options --------------- In addition to simply starting and stopping torrents, the queuing mechanism can have more fine grained control of the resources used by torrents. half-started torrents ..................... In addition to the downloading and seeding limits, there are limits on *actions* torrents perform. The downloading and seeding limits control whether peers are allowed at all, and if peers are not allowed, torrents are stopped and don't do anything. If peers are allowed, torrents may: 1. announce to trackers 2. announce to the DHT 3. announce to local peer discovery (local service discovery) Each of those actions are associated with a cost and hence may need a separate limit. These limits are controlled by settings_pack::active_tracker_limit, settings_pack::active_dht_limit and settings_pack::active_lsd_limit respectively. Specifically, announcing to a tracker is typically cheaper than announcing to the DHT. settings_pack::active_dht_limit will limit the number of torrents that are allowed to announce to the DHT. The highest priority ones will, and the lower priority ones won't. The will still be considered started though, and any incoming peers will still be accepted. If you do not wish to impose such limits (basically, if you do not wish to have half-started torrents) make sure to set these limits to -1 (infinite). prefer seeds ............ In the case where ``active_downloads`` + ``active_seeds`` > ``active_limit``, there's an ambiguity whether the downloads should be satisfied first or the seeds. To disambiguate this case, the settings_pack::auto_manage_prefer_seeds determines whether seeds are preferred or not. inactive torrents ................. Torrents that are not transferring any bytes (downloading or uploading) have a relatively low cost to be started. It's possible to exempt such torrents from the download and seed queues by setting settings_pack::dont_count_slow_torrents to true. Since it sometimes may take a few minutes for a newly started torrent to find peers and be unchoked, or find peers that are interested in requesting data, torrents are not considered inactive immediately. There must be an extended period of no transfers before it is considered inactive and exempt from the queuing limits. fast resume =========== The fast resume mechanism is a way to remember which pieces are downloaded and where they are put between sessions. You can generate fast resume data by: * calling save_resume_data() on torrent_handle. Pass in the ``save_info_dict`` flag. * wait for resume_data_alert * save the add_torrent_params object using write_resume_data() When adding a torrent using resume data, load it using read_resume_data(). This populates an add_torrent_params object, which can be passed directly to add_torrent() or async_add_torrent() on the session object. libtorrent will not check the piece hashes then, and rely on the information given in the fast-resume data. The fast-resume data also contains information about which blocks, in the unfinished pieces, were downloaded, so it will not have to start from scratch on the partially downloaded pieces. To use the fast-resume data you pass it to read_resume_data(), which will return an add_torrent_params object. Fields of this object can then be altered before passing it to async_add_torrent() or add_torrent(). The session will then skip the time consuming checks. It may have to do the checking anyway, if the fast-resume data is corrupt or doesn't fit the storage for that torrent. file format ----------- The file format is a bencoded dictionary containing the following fields: +--------------------------+--------------------------------------------------------------+ | ``file-format`` | string: "libtorrent resume file" | | | | +--------------------------+--------------------------------------------------------------+ | ``info-hash`` | string, the info hash of the torrent this data is saved for. | | | This is a 20 byte SHA-1 hash of the info section of the | | | torrent if this is a v1 or v1+v2-hybrid torrent. | +--------------------------+--------------------------------------------------------------+ | ``info-hash2`` | string, the v2 info hash of the torrent this data is saved. | | | for, in case it is a v2 or v1+v2-hybrid torrent. This is a | | | 32 byte SHA-256 hash of the info section of the torrent. | +--------------------------+--------------------------------------------------------------+ | ``pieces`` | A string with piece flags, one character per piece. | | | Bit 1 means we have that piece. | | | Bit 2 means we have verified that this piece is correct. | | | This only applies when the torrent is in seed_mode. | +--------------------------+--------------------------------------------------------------+ | ``total_uploaded`` | integer. The number of bytes that have been uploaded in | | | total for this torrent. | +--------------------------+--------------------------------------------------------------+ | ``total_downloaded`` | integer. The number of bytes that have been downloaded in | | | total for this torrent. | +--------------------------+--------------------------------------------------------------+ | ``active_time`` | integer. The number of seconds this torrent has been active. | | | i.e. not paused. | +--------------------------+--------------------------------------------------------------+ | ``seeding_time`` | integer. The number of seconds this torrent has been active | | | and seeding. | +--------------------------+--------------------------------------------------------------+ | ``last_upload`` | integer. The number of seconds since epoch when we last | | | uploaded payload to a peer on this torrent. | +--------------------------+--------------------------------------------------------------+ | ``last_download`` | integer. The number of seconds since epoch when we last | | | downloaded payload from a peer on this torrent. | +--------------------------+--------------------------------------------------------------+ | ``upload_rate_limit`` | integer. In case this torrent has a per-torrent upload rate | | | limit, this is that limit. In bytes per second. | +--------------------------+--------------------------------------------------------------+ | ``download_rate_limit`` | integer. The download rate limit for this torrent in case | | | one is set, in bytes per second. | +--------------------------+--------------------------------------------------------------+ | ``max_connections`` | integer. The max number of peer connections this torrent | | | may have, if a limit is set. | +--------------------------+--------------------------------------------------------------+ | ``max_uploads`` | integer. The max number of unchoked peers this torrent may | | | have, if a limit is set. | +--------------------------+--------------------------------------------------------------+ | ``file_priority`` | list of integers. One entry per file in the torrent. Each | | | entry is the priority of the file with the same index. | +--------------------------+--------------------------------------------------------------+ | ``piece_priority`` | string of bytes. Each byte is interpreted as an integer and | | | is the priority of that piece. | +--------------------------+--------------------------------------------------------------+ | ``seed_mode`` | integer. 1 if the torrent is in seed mode, 0 otherwise. | +--------------------------+--------------------------------------------------------------+ | ``upload_mode`` | integer. 1 if the torrent_flags::upload_mode is set. | +--------------------------+--------------------------------------------------------------+ | ``share_mode`` | integer. 1 if the torrent_flags::share_mode is set. | +--------------------------+--------------------------------------------------------------+ | ``apply_ip_filter`` | integer. 1 if the torrent_flags::apply_ip_filter is set. | +--------------------------+--------------------------------------------------------------+ | ``paused`` | integer. 1 if the torrent is paused, 0 otherwise. | +--------------------------+--------------------------------------------------------------+ | ``auto_managed`` | integer. 1 if the torrent is auto managed, otherwise 0. | +--------------------------+--------------------------------------------------------------+ | ``super_seeding`` | integer. 1 if the torrent_flags::super_seeding is set. | +--------------------------+--------------------------------------------------------------+ | ``sequential_download`` | integer. 1 if the torrent is in sequential download mode, | | | 0 otherwise. | +--------------------------+--------------------------------------------------------------+ | ``stop_when_ready`` | integer. 1 if the torrent_flags::stop_when_ready is set. | +--------------------------+--------------------------------------------------------------+ | ``disable_dht`` | integer. 1 if the torrent_flags::disable_dht is set. | +--------------------------+--------------------------------------------------------------+ | ``disable_lsd`` | integer. 1 if the torrent_flags::disable_lsd is set. | +--------------------------+--------------------------------------------------------------+ | ``disable_pex`` | integer. 1 if the torrent_flags::disable_pex is set. | +--------------------------+--------------------------------------------------------------+ | ``trackers`` | list of lists of strings. The top level list lists all | | | tracker tiers. Each second level list is one tier of | | | trackers. | +--------------------------+--------------------------------------------------------------+ | ``mapped_files`` | list of strings. If any file in the torrent has been | | | renamed, this entry contains a list of all the filenames. | | | In the same order as in the torrent file. | +--------------------------+--------------------------------------------------------------+ | ``url-list`` | list of strings. List of url-seed URLs used by this torrent. | | | The URLs are expected to be properly encoded and not contain | | | any illegal url characters. | +--------------------------+--------------------------------------------------------------+ | ``httpseeds`` | list of strings. List of HTTP seed URLs used by this torrent.| | | The URLs are expected to be properly encoded and not contain | | | any illegal url characters. | +--------------------------+--------------------------------------------------------------+ | ``trees`` | list. In case this is a v2 (or v1+v2-hybrid) torrent, this | | | is an optional list containing the merkle tree nodes we know | | | of so far, for all files. It's a list of dictionaries, one | | | entry for each file in the torrent. The entries have the | | | following structure: | | | | | | +--------------+-------------------------------------------+ | | | | ``hashes`` | string. Sequence of 32 byte (SHA-256) | | | | | | hashes, representing the nodes in the | | | | | | merkle hash tree for this file. Some | | | | | | hashes may be all zeros, if we haven't | | | | | | downloaded them yet. | | | | +--------------+-------------------------------------------+ | | | | ``mask`` | string. When present, a bitmask (of ``0`` | | | | | | and ``1`` characters, indicating which | | | | | | hashes of the full tree are included in | | | | | | the ``hashes`` key. This is used to avoid | | | | | | storing large numbers of zeros. | | | | +--------------+-------------------------------------------+ | | | | ``verified`` | string. This indicates which leaf nodes | | | | | | in the tree have been verified correct. | | | | | | There is one character per leaf, ``0`` | | | | | | means not verified, ``1`` means verified. | | | | +--------------+-------------------------------------------+ | | | | +--------------------------+--------------------------------------------------------------+ | ``save_path`` | string. The save path where this torrent was saved. This is | | | especially useful when moving torrents with move_storage() | | | since this will be updated. | +--------------------------+--------------------------------------------------------------+ | ``peers`` | string. This string contains IPv4 and port pairs of peers we | | | were connected to last session. The endpoints are in compact | | | representation. 4 bytes IPv4 address followed by 2 bytes | | | port. Hence, the length of this string should be divisible | | | by 6. | +--------------------------+--------------------------------------------------------------+ | ``banned_peers`` | string. This string has the same format as ``peers`` but | | | instead represent IPv4 peers that we have banned. | +--------------------------+--------------------------------------------------------------+ | ``peers6`` | string. This string contains IPv6 and port pairs of peers we | | | were connected to last session. The endpoints are in compact | | | representation. 16 bytes IPv6 address followed by 2 bytes | | | port. The length of this string should be divisible by 18. | +--------------------------+--------------------------------------------------------------+ | ``banned_peers6`` | string. This string has the same format as ``peers6`` but | | | instead represent IPv6 peers that we have banned. | +--------------------------+--------------------------------------------------------------+ | ``info`` | If this field is present, it should be the info-dictionary | | | of the torrent this resume data is for. Its SHA-1 hash must | | | match the one in the ``info-hash`` field. When present, | | | the torrent is loaded from here, meaning the torrent can be | | | added purely from resume data (no need to load the .torrent | | | file separately). This may have performance advantages. | +--------------------------+--------------------------------------------------------------+ | ``unfinished`` | list of dictionaries. Each dictionary represents an | | | piece, and has the following layout: | | | | | | +-------------+--------------------------------------------+ | | | | ``piece`` | integer, the index of the piece this entry | | | | | | refers to. | | | | +-------------+--------------------------------------------+ | | | | ``bitmask`` | string, a binary bitmask representing the | | | | | | blocks that have been downloaded in this | | | | | | piece. | | | | +-------------+--------------------------------------------+ | | | | ``adler32`` | The adler32 checksum of the data in the | | | | | | blocks specified by ``bitmask``. | | | | | | | | | | +-------------+--------------------------------------------+ | | | | +--------------------------+--------------------------------------------------------------+ | ``allocation`` | The allocation mode for the storage. Can be either | | | ``allocate`` or ``sparse``. | +--------------------------+--------------------------------------------------------------+ storage allocation ================== There are two modes in which storage (files on disk) are allocated in libtorrent. 1. The traditional *full allocation* mode, where the entire files are filled up with zeros before anything is downloaded. Files are allocated on demand, the first time anything is written to them. The main benefit of this mode is that it avoids creating heavily fragmented files. 2. The *sparse allocation*, sparse files are used, and pieces are downloaded directly to where they belong. This is the recommended (and default) mode. sparse allocation ----------------- On filesystems that supports sparse files, this allocation mode will only use as much space as has been downloaded. The main drawback of this mode is that it may create heavily fragmented files. * It does not require an allocation pass on startup. full allocation --------------- When a torrent is started in full allocation mode, the disk-io thread will make sure that the entire storage is allocated, and fill any gaps with zeros. It will of course still check for existing pieces and fast resume data. The main drawbacks of this mode are: * It may take longer to start the torrent, since it will need to fill the files with zeros. This delay is linear to the size of the download. * The download may occupy unnecessary disk space between download sessions. * Disk caches usually perform poorly with random access to large files and may slow down the download some. The benefits of this mode are: * Downloaded pieces are written directly to their final place in the files and the total number of disk operations will be fewer and may also play nicer to the filesystem file allocation, and reduce fragmentation. * No risk of a download failing because of a full disk during download, once all files have been created. HTTP seeding ============ There are two kinds of HTTP seeding. One with that assumes a smart (and polite) client and one that assumes a smart server. These are specified in `BEP 19`_ and `BEP 17`_ respectively. libtorrent supports both. In the libtorrent source code and API, BEP 19 URLs are typically referred to as *url seeds* and BEP 17 URLs are typically referred to as *HTTP seeds*. The libtorrent implementation of `BEP 19`_ assumes that, if the URL ends with a slash ('/'), the filename should be appended to it in order to request pieces from that file. The way this works is that if the torrent is a single-file torrent, only that filename is appended. If the torrent is a multi-file torrent, the torrent's name '/' the file name is appended. This is the same directory structure that libtorrent will download torrents into. There is limited support for HTTP redirects. In case some files are redirected to *different hosts*, the files must be piece aligned or padded to be piece aligned. .. _`BEP 17`: https://www.bittorrent.org/beps/bep_0017.html .. _`BEP 19`: https://www.bittorrent.org/beps/bep_0019.html piece picker ============ The piece picker in libtorrent has the following features: * rarest first * sequential download * random pick * reverse order picking * parole mode * prioritize partial pieces * prefer whole pieces * piece affinity by speed category * piece priorities internal representation ----------------------- It is optimized by, at all times, keeping a list of pieces ordered by rarity, randomly shuffled within each rarity class. This list is organized as a single vector of contiguous memory in RAM, for optimal memory locality and to eliminate heap allocations and frees when updating rarity of pieces. Expensive events, like a peer joining or leaving, are evaluated lazily, since it's cheaper to rebuild the whole list rather than updating every single piece in it. This means as long as no blocks are picked, peers joining and leaving is no more costly than a single peer joining or leaving. Of course the special cases of peers that have all or no pieces are optimized to not require rebuilding the list. picker strategy --------------- The normal mode of the picker is of course *rarest first*, meaning pieces that few peers have are preferred to be downloaded over pieces that more peers have. This is a fundamental algorithm that is the basis of the performance of bittorrent. However, the user may set the piece picker into sequential download mode. This mode simply picks pieces sequentially, always preferring lower piece indices. When a torrent starts out, picking the rarest pieces means increased risk that pieces won't be completed early (since there are only a few peers they can be downloaded from), leading to a delay of having any piece to offer to other peers. This lack of pieces to trade, delays the client from getting started into the normal tit-for-tat mode of bittorrent, and will result in a long ramp-up time. The heuristic to mitigate this problem is to, for the first few pieces, pick random pieces rather than rare pieces. The threshold for when to leave this initial picker mode is determined by settings_pack::initial_picker_threshold. reverse order ------------- An orthogonal setting is *reverse order*, which is used for *snubbed* peers. Snubbed peers are peers that appear very slow, and might have timed out a piece request. The idea behind this is to make all snubbed peers more likely to be able to do download blocks from the same piece, concentrating slow peers on as few pieces as possible. The reverse order means that the most common pieces are picked, instead of the rarest pieces (or in the case of sequential download, the last pieces, instead of the first). parole mode ----------- Peers that have participated in a piece that failed the hash check, may be put in *parole mode*. This means we prefer downloading a full piece from this peer, in order to distinguish which peer is sending corrupt data. Whether to do this is or not is controlled by settings_pack::use_parole_mode. In parole mode, the piece picker prefers picking one whole piece at a time for a given peer, avoiding picking any blocks from a piece any other peer has contributed to (since that would defeat the purpose of parole mode). prioritize partial pieces ------------------------- This setting determines if partially downloaded or requested pieces should always be preferred over other pieces. The benefit of doing this is that the number of partial pieces is minimized (and hence the turn-around time for downloading a block until it can be uploaded to others is minimized). It also puts less stress on the disk cache, since fewer partial pieces need to be kept in the cache. Whether or not to enable this is controlled by setting_pack::prioritize_partial_pieces. The main benefit of not prioritizing partial pieces is that the rarest first algorithm gets to have more influence on which pieces are picked. The picker is more likely to truly pick the rarest piece, and hence improving the performance of the swarm. This setting is turned on automatically whenever the number of partial pieces in the piece picker exceeds the number of peers we're connected to times 1.5. This is in order to keep the waste of partial pieces to a minimum, but still prefer rarest pieces. prefer whole pieces ------------------- The *prefer whole pieces* setting makes the piece picker prefer picking entire pieces at a time. This is used by web connections (both http seeding standards), in order to be able to coalesce the small bittorrent requests to larger HTTP requests. This significantly improves performance when downloading over HTTP. It is also used by peers that are downloading faster than a certain threshold. The main advantage is that these peers will better utilize the other peer's disk cache, by requesting all blocks in a single piece, from the same peer. This threshold is controlled by the settings_pack::whole_pieces_threshold setting. *TODO: piece priorities* Multi-homed hosts ================= The settings_pack::listen_interfaces setting is used to specify which interfaces/IP addresses to listen on, and accept incoming connections via. Each item in ``listen_interfaces`` is an IP address or a device name, followed by a listen port number. Each item (called ``listen_socket_t``) will have the following objects associated with it: * a listen socket accepting incoming TCP connections * a UDP socket: 1. to accept incoming uTP connections 2. to run a DHT instance on 3. to announce to UDP trackers from 4. a SOCKS5 UDP tunnel (if applicable) * a listen address and netmask, describing the network the sockets are bound to * a Local service discovery object, broadcasting to the specified subnet * a NAT-PMP/PCP port mapper (if applicable), to map ports on the gateway for the specified subnet. * a UPnP port mapper (if applicable), to map ports on any * ``InternetGatewayDevice`` found on the specified local subnet. A ``listen_socket_t`` item may be specified to only be a local network (with the ``l`` suffix). Such listen socket will only be used to talk to peers and trackers within the same local network. The netmask defining the network is queried from the operating system by enumerating network interfaces. An item that's considered to be "local network" will not be used to announce to trackers outside of that network. For example, ``10.0.0.2:6881l`` is marked as "local network" and it will only be used as the source address announcing to a tracker if the tracker is also within the same local network (e.g. ``10.0.0.0/8``). The NAT-PMP/PCP and UPnP port mapper objects are only created for networks that are expected to be externally available (i.e. not "local network"). If there are multiple subnets connected to the internet, they will have separate port mappings. expanding device names ---------------------- If a device name is specified, libtorrent will expand it to the IP addresses associated with that device, but also retain the device name in order to attempt to bind the listen sockets to that specific device. expanding unspecified addresses ------------------------------- If an IP address is the *unspecified* address (i.e. ``0.0.0.0`` or ``::``), libtorrent will expand it to specific IP addresses. This expansion will enumerate all addresses it can find for the corresponding address family. The expanded IP addresses are considered "local network" if any of the following conditions are met: * the IP address is in a known link-local range * the IP address is in a known loopback range * the item the IP address was expanded from was marked local (``l``) * the network interface has the ``loopback`` flag set * NONE of the following conditions are met: 1. the IP address is in a globally reachable IP address range 2. the network interface has the ``point-to-point`` flag set 3. the routing table contains a route for at least one global internet address (e.g. a default route) for the address family of the expanded IP that points to the network interface of the expanded IP. routing ------- A ``listen_socket_t`` item is considered able to route to a destination address if any of these hold: * the destination address falls inside its subnet (i.e. interface address masked by netmask is the same as the destination address masked by the netmask). * the ``listen_socket_t`` does not have the "local network" flag set, and the address family matches the destination address. The ability to route to an address is used when determining whether to announce to a tracker from a ``listen_socket_t`` and whether to open a SOCKS5 UDP tunnel for a ``listen_socket_t``. Note that the actual IP stack routing table is not considered for this purpose. This mechanism is to determine which IP addresses should be announced to trackers. tracker announces ----------------- Trackers are announced to from all network interfaces listening for incoming connections. However, interfaces that cannot be used to reach the tracker, such as loopback, are not used as the source address for announces. A ``listen_socket_t`` item that can route to at least one of the tracker IP addresses will be used as the source address for an announce. Each such item will also have an announce_endpoint item associated with it, in the tracker list. If a tracker can be reached on a loopback address, then the loopback interface *will* be used to announce to that tracker. But under normal circumstances, loopback will not be used for announcing to trackers. For more details, see `BEP 7`_. .. _`BEP 7`: https://www.bittorrent.org/beps/bep_0007.html SOCKS5 UDP tunnels ------------------ When using a SOCKS5 proxy, each interface that can route to one of the SOCKS5 proxy's addresses will be used to open a UDP tunnel, via that proxy. For example, if a client has both IPv4 and IPv6 connectivity, but the socks5 proxy only resolves to IPv4, only the IPv4 address will have a UDP tunnel. In that case, the IPv6 connection will not be used, since it cannot use the proxy. rate based choking ================== libtorrent supports a choking algorithm that automatically determines the number of upload slots (unchoke slots) based on the upload rate to peers. It is controlled by the settings_pack::choking_algorithm setting. The settings_pack::unchoke_slots_limit is ignored in this mode. The algorithm is designed to stay stable, and not oscillate the number of upload slots. The initial rate threshold is set to settings_pack::rate_choker_initial_threshold. It sorts all peers by on the rate at which we are uploading to them. 1. Compare the fastest peer against the initial threshold. 2. Increment the threshold by 2 kiB/s. 3. The next fastest peer is compared against the threshold. If the peer rate is higher than the threshold. goto 2 4. Terminate. The number of peers visited is the number of unchoke slots, but never less than 2. In other words, the more upload slots you have, the higher rate does the slowest unchoked peer upload at in order to open another slot. predictive piece announce ========================= In order to improve performance, libtorrent supports a feature called ``predictive piece announce``. When enabled, it will make libtorrent announce that we have pieces to peers, before we truly have them. The most important case is to announce a piece as soon as it has been downloaded and passed the hash check, but not yet been written to disk. In this case, there is a risk the piece will fail to be written to disk, in which case we won't have the piece anymore, even though we announced it to peers. The other case is when we're very close to completing the download of a piece and assume it will pass the hash check, we can announce it to peers to make it available one round-trip sooner than otherwise. This lets libtorrent start uploading the piece to interested peers immediately when the piece complete, instead of waiting one round-trip for the peers to request it. This makes for the implementation slightly more complicated, since piece will have more states and more complicated transitions. For instance, a piece could be: 1. hashed but not fully written to disk 2. fully written to disk but not hashed 3. not fully downloaded 4. downloaded and hash checked Once a piece is fully downloaded, the hash check could complete before any of the write operations or it could complete after all write operations are complete. peer classes ============ The peer classes feature in libtorrent allows a client to define custom groups of peers and rate limit them individually. Each such group is called a *peer class*. There are a few default peer classes that are always created: * global - all peers belong to this class, except peers on the local network * local peers - all peers on the local network belongs to this class TCP peers * tcp class - all peers connected over TCP belong to this class The TCP peers class is used by the uTP/TCP balancing logic, if it's enabled, to throttle TCP peers. The global and local classes are used to adjust the global rate limits. When the rate limits are adjusted for a specific torrent, a class is created implicitly for that torrent. The default peer class IDs are defined as enums in the ``session`` class: .. code:: c++ enum { global_peer_class_id, tcp_peer_class_id, local_peer_class_id }; The default peer classes are automatically created on session startup, and configured to apply to each respective type of connection. There's nothing preventing a client from reconfiguring the peer class ip- and type filters to disable or customize which peers they apply to. See set_peer_class_filter() and set_peer_class_type_filter(). A peer class can be considered a more general form of *labels* that some clients have. Peer classes however are not just applied to torrents, but ultimately the peers. Peer classes can be created with the create_peer_class() call (on the session object), and deleted with the delete_peer_class() call. Peer classes are configured with the set_peer_class() get_peer_class() calls. Custom peer classes can be assigned based on the peer's IP address or the type of transport protocol used. See set_peer_class_filter() and set_peer_class_type_filter() for more information. peer class examples ------------------- Here are a few examples of common peer class operations. To make the global rate limit apply to local peers as well, update the IP-filter based peer class assignment: .. code:: c++ std::uint32_t const mask = 1 << lt::session::global_peer_class_id; ip_filter f; // for every IPv4 address, assign the global peer class f.add_rule(make_address("0.0.0.0"), make_address("255.255.255.255"), mask); // for every IPv6 address, assign the global peer class f.add_rule(make_address("::") , make_address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") , mask); ses.set_peer_class_filter(f); To make uTP sockets exempt from rate limiting: .. code:: c++ peer_class_type_filter flt = ses.get_peer_class_type_filter(); // filter out the global and local peer class for uTP sockets, if these // classes are set by the IP filter flt.disallow(peer_class_type_filter::utp_socket, session::global_peer_class_id); flt.disallow(peer_class_type_filter::utp_socket, session::local_peer_class_id); // this filter should not add the global or local peer class to utp sockets flt.remove(peer_class_type_filter::utp_socket, session::global_peer_class_id); flt.remove(peer_class_type_filter::utp_socket, session::local_peer_class_id); ses.set_peer_class_type_filter(flt); To make all peers on the internal network not subject to throttling: .. code:: c++ std::uint32_t const mask = 1 << lt::session::global_peer_class_id; ip_filter f; // for every IPv4 address, assign the global peer class f.add_rule(make_address("0.0.0.0"), make_address("255.255.255.255"), mask); // for every address on the local metwork, set the mask to 0 f.add_rule(make_address("10.0.0.0"), make_address("10.255.255.255"), 0); ses.set_peer_class_filter(f); SSL torrents ============ Torrents may have an SSL root (CA) certificate embedded in them. Such torrents are called *SSL torrents*. An SSL torrent talks to all bittorrent peers over SSL. The protocols are layered like this: .. image:: img/utp_stack.png :class: bw :align: right During the SSL handshake, both peers need to authenticate by providing a certificate that is signed by the CA certificate found in the .torrent file. These peer certificates are expected to be provided to peers through some other means than bittorrent. Typically by a peer generating a certificate request which is sent to the publisher of the torrent, and the publisher returning a signed certificate. In libtorrent, set_ssl_certificate() in torrent_handle is used to tell libtorrent where to find the peer certificate and the private key for it. When an SSL torrent is loaded, the torrent_need_cert_alert is posted to remind the user to provide a certificate. A peer connecting to an SSL torrent MUST provide the *SNI* TLS extension (server name indication). The server name is the hex encoded info-hash of the torrent to connect to. This is required for the client accepting the connection to know which certificate to present. SSL connections are accepted on a separate socket from normal bittorrent connections. To enable support for SSL torrents, add a listen interface to the settings_pack::listen_interfaces setting with the ``s`` suffix. For example:: 0.0.0.0:6881,0.0.0.0:6882s That will listen for normal bittorrent connections on port 6881 and for SSL torrent connections on port 6882. This feature is only available if libtorrent is built with SSL torrent support (``TORRENT_SSL_PEERS``) and requires at least OpenSSL version 1.0, since it needs SNI support. Peer certificates must have at least one *SubjectAltName* field of type DNSName. At least one of the fields must *exactly* match the name of the torrent. This is a byte-by-byte comparison, the UTF-8 encoding must be identical (i.e. there's no unicode normalization going on). This is the recommended way of verifying certificates for HTTPS servers according to `RFC 2818`_. Note the difference that for torrents only *DNSName* fields are taken into account (not IP address fields). The most specific (i.e. last) *Common Name* field is also taken into account if no *SubjectAltName* did not match. If any of these fields contain a single asterisk ("*"), the certificate is considered covering any torrent, allowing it to be reused for any torrent. The purpose of matching the torrent name with the fields in the peer certificate is to allow a publisher to have a single root certificate for all torrents it distributes, and issue separate peer certificates for each torrent. A peer receiving a certificate will not necessarily be able to access all torrents published by this root certificate (only if it has a "star cert"). .. _`RFC 2818`: https://www.ietf.org/rfc/rfc2818.txt testing ------- To test incoming SSL connections to an SSL torrent, one can use the following *openssl* command:: openssl s_client -cert .pem -key .pem -CAfile \ .pem -debug -connect 127.0.0.1:4433 -tls1 -servername To create a root certificate, the Distinguished Name (*DN*) is not taken into account by bittorrent peers. You still need to specify something, but from libtorrent's point of view, it doesn't matter what it is. libtorrent only makes sure the peer certificates are signed by the correct root certificate. One way to create the certificates is to use the ``CA.sh`` script that comes with openssl, like this (don't forget to enter a common Name for the certificate):: CA.sh -newca CA.sh -newreq CA.sh -sign The torrent certificate is located in ``./demoCA/private/demoCA/cacert.pem``, this is the pem file to include in the .torrent file. The peer's certificate is located in ``./newcert.pem`` and the certificate's private key in ``./newkey.pem``. session statistics ================== libtorrent provides a mechanism to query performance and statistics counters from its internals. The statistics consists of two fundamental types. *counters* and *gauges*. A counter is a monotonically increasing value, incremented every time some event occurs. For example, every time the network thread wakes up because a socket became readable will increment a counter. Another example is every time a socket receives *n* bytes, a counter is incremented by *n*. *Counters* are the most flexible of metrics. It allows the program to sample the counter at any interval, and calculate average rates of increments to the counter. Some events may be rare and need to be sampled over a longer period in order to get useful rates, where other events may be more frequent and evenly distributed that sampling it frequently yields useful values. Counters also provides accurate overall counts. For example, converting samples of a download rate into a total transfer count is not accurate and takes more samples. Converting an increasing counter into a rate is easy and flexible. *Gauges* measure the instantaneous state of some kind. This is used for metrics that are not counting events or flows, but states that can fluctuate. For example, the number of torrents that are currently being downloaded. It's important to know whether a value is a counter or a gauge in order to interpret it correctly. In order to query libtorrent for which counters and gauges are available, call session_stats_metrics(). This will return metadata about the values available for inspection in libtorrent. It will include whether a value is a counter or a gauge. The key information it includes is the index used to extract the actual measurements for a specific counter or gauge. In order to take a sample, call post_session_stats() in the session object. This will result in a session_stats_alert being posted. In this alert object, there is an array of values, these values make up the sample. The value index in the stats metric indicates which index the metric's value is stored in. The mapping between metric and value is not stable across versions of libtorrent. Always query the metrics first, to find out the index at which the value is stored, before interpreting the values array in the session_stats_alert. The mapping will *not* change during the runtime of your process though, it's tied to a specific libtorrent version. You only have to query the mapping once on startup (or every time ``libtorrent.so`` is loaded, if it's done dynamically). The available stats metrics are: .. include:: stats_counters.rst glossary ======== The libtorrent documentation use words that are bittorrent terms of art. This section defines some of these words. For an overview of what bittorrent is and how it works, see these slides_. For an introduction to the bittorrent DHT, see `this presentation`_. .. _slides: bittorrent.pdf .. _`this presentation`: https://vimeo.com/56044595 announce The act of telling a tracker or the DHT network about the existence of oneself and how other peers can connect, by specifying port one is listening on. block A subset of a piece. Almost always 16 kiB of payload, unless the piece size is smaller. This is the granularity file payload is requested from peers on the network. DHT The distributed hash table is a cross-swarm, world-wide network of bittorrent peers. It's loosely connected, implementing the Kademlia protocol. Its purpose is to act as a tracker. Peers can announce their presence to nodes on the DHT and other peers can discover them to join the swarm. HTTP tracker A tracker that uses the HTTP protocol for announces. info dictionary The subset of a torrent file that describes piece hashes and file names. This is the only mandatory part necessary to join the swarm (network of peers) for the torrent. info hash The hash of the info dictionary. This uniquely identifies a torrent and is used by the protocol to ensure peers talking to each other agree on which swarm they are participating in. Sometimes spelled info-hash. leecher A peer that is still interested in downloading more pieces for the torrent. It is not a seed. magnet link A URI containing the info hash for a torrent, allowing peers to join its swarm. May optionally contain a display name, trackers and web seeds. Typically magnet links rely on peers joining the swarm via the DHT. metadata Synonymous to a torrent file peer A computer running bittorrent client software that participates in the network for a particular torrent/set of files. piece The smallest number of bytes that can be validated when downloading (no longer the case in bittorrent V2). The smallest part of the files that can be advertised to other peers. The size of a piece is determined by the info dictionary inside the torrent file. seed A computer running bittorrent client software that has the complete files for a specific torrent, able to share any piece for that file with other peers in the network swarm The network of peers participating in sharing and downloading of a specific torrent. torrent May refer to a torrent file or the swarm (network of peers) created around the torrent file. torrent file A file ending in .torrent describing the content of a set of files (but not containing the content). Importantly, it contains hashes of all files, split up into pieces. It may optionally contain references to trackers and nodes on the DHT network to aid peers in joining the network of peers sharing these files. tracker A server peers can announce to and receive other peers back belonging to the same swarm. Trackers are used to introduce peers to each other, within a swarm. When announcing, the info hash of the torrent is included. Trackers can introduce peers to any info-hash that's specified, given other peers also use the same tracker. Some trackers restrict which info hashes they support based on a white list. UDP tracker A tracker that uses a UDP based protocol for announces. web seed A web server that is acting a seed, providing access to all pieces of all files over HTTP. This is an extension that client software may or may not support. libtorrent-rasterbar-2.0.5/docs/contributing.html0000664000175000017500000001410614152763504021221 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

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 (like the rate-based choker).

    Additional fuzzers are also always welcome. Find a libtorrent interface that's not already covered by a fuzzer (see the fuzzers directory in the root) and add a new fuzzer to it. Alternatively, improve an existing fuzzer by producing inputs that gets coverage deeper in to libtorrent.

  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.

    Each heading in the online documentation has a short-cut link to file a new issue against the documentation.

    For updates, please submit a pull request. All documentation is in restructured text (rst). All documentation is spell checked with hunspell which can be invoked via make spell-check in the docs directory. If words are missing, please add them to docs/hunspell/libtorrent.dic

  2. 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 updates, 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.

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

For outstanding things to do, see the todo list.

libtorrent-rasterbar-2.0.5/docs/img/0000755000175000017500000000000014152763504016374 5ustar arvidarvidlibtorrent-rasterbar-2.0.5/docs/img/ip_id_v4.png0000664000175000017500000001330114152763504020577 0ustar arvidarvid‰PNG  IHDRX,(ã=¤2PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@ÈÈAiáÿÀ €@À€ÿ0`€‹@€ÿ€ÿÿÔ¥**ÿÿ@àÐ333MMMfff™™™³³³ÀÀÀÌÌÌåååÿÿÿð22î­ØæðUðàÿÿîÝ‚ÿ¶Á¯îîÿ×ÿdÿ"‹".‹Wÿ‹p€Í‡ÎëÿÿÿÿÎÑÿ“ÿPð€€ÿEú€ré–zðæŒ½·k¸† õõÜ € ÿ¥î‚î”ÓÝ ÝP@Uk/€€€@€@€€`À€`ÿ€€ÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿ€ÿÿÀÍ·žðÿð ¶ÍÁÿÁÍÀ°|ÿ@ ÿ ¾¾¾ßßß???¿¿¿ŸŸŸ___‘˲' pHYsÄÄ•+5IDATxœí ¶£*E¡ß…“ó—ùOáÉWPT EAÏ^݉‰ Î… ` ¼>ê÷Í1W9o#Ós/uí`@yÅ{p'¼oÕûf€¨«j÷*aÉ£Ê*>üÔûf€¨«ÐÒ$GÛ”U&œ5£zW%klìx7L/¢Êć~§ñ­8=t½Ž=ôò+Ñ#éË͡թ©“”¢yçn î^ÖÆWBÑñåûÈWáØ¬6qÖ\”ÂT)²B]u]ëƒÔ/¬¿òª±¼Ý€Ù!`”Kµéa ý”u’k ŠEKÛN“Ý)ÀÝOÀÛñÀ^Ø®Ùf‡¦½Uå®Ýsàïï¯Àj,/Gùñv0˘Λ˜`b忦kÔšñŒÙ¼ý¼ìú•vï°°.Üs@¨Š•X_´±ÌfXÆÊjK¤™4Õ‰úo%ÝJyû x;Ø] 캸ºÊ+N©ŠeÖ¦©e»@ûûEay;°ÕSVlèÅ?±J®r<2;xû p÷e±"ø¦°®ÙsàÏÊ*§°6=H­ãè0©ªýµ‹Ó嵡ù1R¹ûÙ>s³%2)dj«ÙªF­S¸Oç|a±àÁJX=þ# »ªb«qÛƒÔ:ŽÊÅ‚‡¥é…åíÀ–OY¹5à»vúrúÜ›1¹S€÷ô–mËZ,s¥d|U±ŒÕ¸íA*{?ñìY•Çòç|QXf‡€Þ-¨À&¿ŸxèÚÿ¼­ û x²[x6Öà kp¯”ÈJV«±]ÞÛØÄ:óªÎ/sðEk¾+l¥ º¡už²ÊO’F!4fx³S€÷<Ö–½+´{x;#Øgöø È*oûàßÛØÄì«üû\ýœ/ Ëî ·hì8–’)“AãÜlohv pŸÇz²¶ãXÞÎöCúžAU±„µö µÂÆû°2ñ¿ØVË–¬n–{Dzè åpÃÊÄ—¡ÿ‰Æà/¯&Ðê_þŒ©5Þ%Œ÷* [V3÷ØXž©u•CXÍeà 5ÛX•q¤*vƒ°Ö¤ÖqT Ž®§ØCX…¡*vƒ°¤Þ#Õ“t…%§*Vb5–—# ‰V+±ËËQlÚÆ‰Ñ<”#Z’Ã¥ªÚËÑcÀÆJ€*,oëhc²}ë 4YAXÏD¼²°Üýa5ð3Cérôå娸qEn¦w1Œc|í …öTölL‰o•<]U;[!žÊ´Ý ›XCX WäfzoÅРñ56'ö™4¡ÅJ’¡ÅPÔ”[Â#ðcRw=G`Ƹ"«çœY_csBa=•ÂBÖ{Bè\8ŠN?[oâ=HÅiûÃéÌ. ÃÐïãk<Ÿ-[x;Û»Ân=¢˜®*F¨F®§qÄFˆñ mÙ•«Í@X¢Ô»ß(]܌ײ=;ð`‹µàÂVŽ¢²>ýOy#Æ…ô ]u˜è 0ú‘Ý™ö”¾Æ¾°Öó36„u¦­rrÃt›!KUÄÐ:Ï 7|AXOÚX4Ue¶±î¤¼]Ïs¢6V% ëØ59Ø·~AXqK¨Égc»&K°é]ܨ*–±#\“%+ÏÁ/ØXp¯¬2 +Â5Yž]¹:AXwÛXé}`y6V{ìš,X=ƒþDWx«°„ªîÿÛyÔ5™-–(Ïž£ïq§½îñ¤k2 Lþ‚°®ä)U±„µ·¸­cÃ;±Þäšüä‹j¬IüùÅm×&Œ÷Kâ-ºÀ½ˆ”Ms≯Æö×q¶šS³Ç‘k2cl=¯û]afa­ «Íˆz‡¥³)®‰®Æ¡S·ƒ+Gì^{Ç5™…l÷O+'sýHUgˆ®F=ÍqØzN³yí×ä`òÖÊP#T#wþgå 6V&â«Ìªb”KM«½hãྠ¬6Ö®ª¼ˆUÝdcµãz¡´«ùBWx½°âçDÐÚªFÞÅ]a·Úh÷z¾ ¬«¡XV9óáP^5–—£Â)ɲš)¯¿`c]H•$ãdŠcR±èÎ'gB_fcÅÊê_ª¬òÛXãd¼‹Õ£H#0þ˽9%70Âi„é(ÌÄj3q,Äñ˜?L$¤RJ„Ò•W2-G_¢2U1B5êÇÅÑ«&·Ç¤Ýgm,"Õ©ŠHm€ôȃ”Kë‹P"ºÕ¿TUÝÿã«q yrÇ£&%Gõ]]~øÀœˆ„•xíRÏù}Ž•êAú¾—IUÎG¡ªrñò°©:…™Ð,-«§ò‘±+ x|\{ǃ´¹¶+,ÛT"rUøÙ÷Rqã=ÄVcU^N7!y²ÐÌå£kïx—7TÄ~um÷ou€4™/k‡êû@ u€”âóžÆ—…õU±«Ü=¡+ê'‚¼HUŒtWØ÷w½œ/+1jp¡ˆœÆQ^ÇS^Ž®gY]±„u‚òr”™wu† Õ¨=¬Ö;æìäÍQÉÔ=¾¾M¼i¬k²öµ~¢1I9ZRQ?ay«¬(ãX‘·ƒÆsÔú‰Æ$åhIEÂRé}`E?‘<@zN{Žú~¢I9ªQ])Õ…åz)ìѯ¦_c’rT5ïí5ñ6VüŸ/Ìã’rT4„I3o¹ô‰ï ãç>$¬rú Âl«wªŠåiNv…•¯A:©ê0Ü?uôGu ½µÔ%y~Ùxk«dS—ÐV•Ó(’MX¾ŸèÁAîݺÀ™lÂòüDrçè *lºÿ‘Σýaq„¨Š•Ø>Ô(,jc•šâ+m,ú:ïi”'õH} z‡°fÖyO£2aÁ² Cš¥Ãáó¾€ÞX}ÒChó?+õØXñ}à·+I|‹…uÞ=„ªâ"Tk&aw‚+iJŽäl[a9×y'¸’¦åè!î?H¾j¤¸’Þ“£+Àøz$ùª‘âJzIŽò7÷KUíDü¶ªXNaµÿ™Kr”[Xë¶j3⑪`c™P)<þè9ºKBXçx°`Y‘É/¬Û»¼Ð¶Æ¡o+÷ ã}§±ZFDc5C %.ïJš”£%9„µßz)} l¬êÎöâõz泬 ¬u@ò]a¥t`¯Ÿƒôš}ÆmžÆg‰®Æ‘f©ÈèÆ*yk›u€4‰‡…uKëÍÑM] „õæöúu@X¸Y]J¤EZmfű+)9GN5÷IUrŠàŽöáØ•ô’Vbcu»åË%•ôæù<0ÙšÝYÛñØ5nÝ$Ž]I“rt ˜Â•‰øg…bú×ÈFz½·Çþ3I9:T•øG:SŸÆÛÄz?òøKÊÑj«mUuqKU0Þ·¡<„–“U_",·±Ú¸ÓXÁxß&^XãÐÿˆn3~*åx*UŪʃ´•=Åÿ¬årYN)ÃR#çâöMÚÛdŠ2Þ1z÷˜ÊG®¤÷åãë7q£°r{F˜aU…"FÝÂxßæ†q,›ÊÃt6«uÄÈÆ Æû67ŒcÉ”@Q>¡ÖÌ©q, 9€ûíÜ3ŽEáò ª'¸g‹Âµ6VŒªtDºª`¼osÏ8…+…•wgï;¼Øƒ´à.Âz€krT°ª¾A|5bQømVƒlú('åh›¢Æ¾IÖEA–lú('åh‰mµ©²º¿ŸøñãXªþ‡w…Û>ÊI9Z¢ª9¡¬Çr©'§yY^bÓG9)G!*é!¬m]Y¤ÝtÌJÊÑšJdõ È6Ö¹EA6\I“r´÷EA¸+ìùé»ÂlŠßÙ& *ï¸y+¦+$»&ÿ§VŸýø/´úl-¿õäôŽU‰|2ï5ö€0ÞúªÉÉ]蚌™¥B6ÞÛóÉ]åš U u¸á¤ÛÌ–rBŽVªÚlµsílã}‡;Hi íj¬6ª9ßÎ6yß!þ‘NA«&×h¯{@X3#oÊX53« ¾+¼káäý«ã©M%TåèWØÎ60Þw¨GX‡]à\Í7ílã}‡‡„µt%uæèeO˜!¬L,]I]9‚aUkåJê²ÌÑË«¯ðˆ°V®¤ÞI÷CÑ;ÛÀxßáaµKÿ'G´.°"6V6|¿ÕÁ‹-++G‚eU9 kÓƒô¿ÿ¢ó¬>‹—S/÷{ZöŒ÷Ä>°¢~â<*¬°ijX‘°`ceÃw%]9¦jË ÂÊÆÂ•tufŸªUõ êymªj 6a•´³ Œ÷ªÖ~[U‘°`c=ÀfŽ^ÔBX°‘£ÉêÔ!,ØëÕñ´°ÚÕt²uŽJÝÙÆû K»’º,¿ˆn¬*l¬ÌWRï‹—öVfŒ+©÷=z©ª¾Á³ÂjÐ_ÐU•üSê‰XONŸ¶±¶„•ÒVUTxV~ÂJì+*<+?kaWð„˜<=ðN , dš7iLl˜R¤oï©]ª‡žš]±¥E´éPËÇÍ ©|lDjùL9ü­’~œàr·±q×nÎ1±~íôŸš¢Nkè[±-=¢Øóªí£#Út¨åãfT>sŠÄòû¶ýýXJÙä$¸Üm$}›"¬àRJG—j™²½‰8Šß¹žH²…M‡Z>nIåc#RËG¬ñ"¹l²’T͊ߘôxH.v_Šߥ𬷬/žZ>2É”òáiåã/å‰]p¿(ÄŸqʯÄÞS ±+lÝ´(¥n"vDˤ“T>2ƒ)å#"&”OÛÛ%Ϩ±ÙàÎ+ ùWœôç1rÎ,9­†[FäÒÆ¢ÉY¤“T>"bRù¨Ž—Z>¿n^òŒX6ùH–ì#R„5 ã4ÞŒ¶Ø´Z¢E¨„%H]šL'¥|dÄ”ò‘SÊÇþÉPË&©]áOþòÛl,7-êþë|ŽMʯL'¥|DĤòQ)Šjù˜ðg÷¦¿ŽTã=ÝÑ:µ41Èe§m,jª*„ò‘SÊG¥˜V>ܹB—»&i¸A¼$·Xô0gY_BWhÒ!——AJù˜ˆÔò‘2ò—%”M>‚ËÝF“lcým¬!aØ@F¿“`¼Ût¨åãg8@*¡–O#m²!­l2ræ‘Nâ]aZŠªGKè€UhÚóŽ9bný 2šœ"kô# ”²q}åžÁ œ=Žÿ½ò™[úÛ¥­UŠ‚o¢9_m +ü½ö:í<¦­UÊ¢a-VBH[«”;1{YT±òä„ítqR OöA‡sRUP>t½sŽ™™f} éÿît…&¶ýbîˆÕ< ©¯Äµ*@YˆšëYYˆšu "NŒ½z—‹ ™sМsúë¶Õ„›»Â2±[¶Xè åô¯Ôµ*@Yp½~Ьgî–™Þ›E†¸×4ñÖ;§¿þ™/Ô+,›1OXC7Ú‚ÒתE!Å1U«U˯­´ÌD?hVÃ, ïgÎÜuuà ËF²äM¡èЧÿr6¨ìy!¬ú13ÍgÓû7B­{Ò™Ž–{Nþ7óî¸{ aÙ|LMœháÒתe±j±ÄGcc™Ë6Bayç¸)ªÅš3Òµ"|)›‚³¬l,õ­z3så•Õ…å³6–èÖÖ6–sé•°~¿yi èª~ÄÈÀ8µ²­Z%£qsçßÊ(&¨\ÜÊ…§Ôía¬°ç®ªg‹5¢ j{g¥»FcÝ9wîœüíßþ­ŒËÊÊŠ”ËeéèèŸÏ'gÏž•x<.ý×-ÃÃÃò[¿õ[rãÆ éëë“ÕÕU” ‡ÃòꫯJ ¥¥%ÙÚÚ’£GJ"‘xÜKâ‰'Ÿ‹xÄ“Ÿ;ùÇüG¹|ù²,--ɉ'äÚµkrìØ1ù“?ùÙÙÙ‘f³)ßþö·¥V«ÉßÿýßKWW—øý~ 2??/û·+ÓÓÓ211!¥RIþìÏþL†‡‡Åï÷ËÕ«WeaaAÒé´Äãqéîî–x<..\S§NÉsÏ='ñx\>þøcùøãåÿð=âÉÏ­ø<¯'?orýúu¹pႌÉòò²T*9v옼ôÒKòÿã”B¡ Ï?ÿ¼¬¯¯K*•’J¥"òÑGÉÉ“'eeeEü~¿tvvÊßýÝßÉÄÄ„ ™šš’`0(###2??/===R­V¥»»[¶··%™LÊW¿úU { <ñä Ï€xò #ÍfSŠÅ¢4›M‰Åbâ÷ß¹˜N§¥Z­Joo¯4 ‰ÅbžqðÄG<â‰'žxâÉÉ=Õ@êõºÔj5 ‡Ãâóù¤^¯KµZ•`0(@@†4 Q/¯ÙlJ z½¾÷WªÕªˆˆøý~©×ë …Äçó=îµðÄOŸ4½|Ü›o¾)'Nœð ˆ'žx"""333²¼¼Ü’÷ûý{5WW¨¿¶£ëšÍæž2l4âóùóÞé8íâêBŽA÷A¥ÑhH2™”sçÎÉ~ðyå•W¤««kïZ¨loo‹ˆHWW×ÞyÑÉÜ}NÕjµåZѽŸk $ìŒhá ¿»ÒÑÑÑò/B‘ÇO<ñäNrýúuéïï—ÁÁÁ½úèG}$çÎÛKç௭­Éo¼!ò'"Á`P|>ŸlnnÊw¿û]ùƒ?øéèè÷ß_–––ä÷ÿ÷¥Z­î EdOÑ~ðÁ²³³#_ûÚ×ö B½^—\.'?úÑä›ßü¦D"‘=íóùäêÕ«ääÉ“Òh4$—ËÉ•+WäK_úÒC¿wwwåÒ¥KrúôéÛþæóùöôjOOÏmç^Úum8Þ÷\~¿ÿ@}}'ñ:Ñ=ñÄ“C+¹\NÞ|óM9vì˜Ôj5™œœ”7ÞxCezzZ|>Ÿ Ê… ä7~ã7¤^¯Ëðð°D"Y^^–ï}ï{rýúuùö·¿-ÝÝÝrîÜ9YXXZ­&ßþö·¥££C¥³³S¾ñoH³Ù”ÿñ?þ‡üê¯þªœ?^DÔx”Ëeùæ7¿)»»»róæM™ŸŸ—D"!™LFb±˜looK,“õõõ½lÍûï¿¿gl’­-‘DB$¸&æ\‡Y<â‰'žZÉår2;;+óóóröìY‰D"rìØ1Y\\”ëׯK>Ÿ—x<.KKK2<<,;;;rãÆ Éf³²µµ%ëëë effFΞ=+«««’ÍfåÇ?þ±\¹rEeeeEDD=û#GŽH:–ùùyY__—‰‰ Éf³’N§%ÈÑ£G%‰H£ÑóçÏËÐÐŒK6›•P($o¾ù¦¼úê«R¯×%›ÍÞ1%ßÙ)ò$÷¦zÄO<9´2::*ÿú_ÿë=:™ÞÞ^9qâ„T«UùÚ×¾&ù|^‰„äóy‰D"òòË/K¹\–O>ùDÎ;'ÿê_ý+±´y£Ñ§žzJz{{åå—_–D"!çÏŸ—ááá½s~ó›ß”|>//¾ø¢lmmI2™”B¡ ýýý266&ròäI)•J255%FC*•Šˆ¨Êåròì³ÏÊW¾ò•;Fz]{…N<â‰'žZ‰F£ræÌéííÝû]±X”ï~÷»òÛ¿ýÛ266&Ÿ~ú©Ü¸qC¾ùÍoîÕ3^|ñŽÏg³Y9þ¼|ãßh©G J³Ù”?øƒ?hQôÓÓÓ’ÏçåË_þ² ïsssSÞÿ}ùÍßüM ƒ‰DdddD|>ŸÌÎΊˆÈøø¸üéŸþé^ú hm³)"÷Ó™ð„ôU{ÄOéèèo|ãR,å;ßùŽär9™šš’÷ß_Ž;&kkk222"~ø¡üʯüŠ|õ«_•f³)o¼ñ†üò/ÿ²ü¯ÿõ¿öº¹‹Å¢üîïþ®\ºtI¢Ñ¨¬¬¬H<—ÍÍM‰D"²¾¾.‰DBº»»¥V«I£Ñwß}WþÝ¿ûwd{QdóºÜ›ahŠôž‰>`TÏ€xâ‰'OŒlmmÉüü¼„Ãa¹|ù²œ>}Z666¤P(ÈO~òùøã%‘HH"‘H$²× —L&åÊ•+233#ÓÓÓÒh4¤X,Êúúº¬®®ÊÎÎŽˆh jttT2™Œ\¿~]677e||\òù¼¬¯¯K8–¡¡¡=xìw¿û]‘‰‰ Éårâ÷ûåwÞ‘/}éKâóùd{{[úûû%1$ï½÷ûô‡EjO@/µg@<ñÄ“C+ÕjU>ýôSI&“Òl6¥^¯Ë /¼ õz]¢Ñ¨4 ©Õjrüøq‰Åbòõ¯]z{{å­·Þ’P($—/_–r¹,Ï?ÿ¼Äãq ‡Ãrüøqééé‘íím”µµ5‰F£réÒ%9~ü¸looËóÏ?/™LFzzz$ŸÏËææ¦œ>}Z†ŒI>Ÿ—ßýÝß•z½.ÅbQúúú$J©T’r¹,O=õ”\¾|YR©”¦Áî'-ÕÔ{/ ‡š'ðP±ñz„žxò`Â[|ˆuÍÉÆÆ†¬¯¯·(Ñýhøi†£y¯X,J$Ùû¬ÛïáóùöšùN£Ñhù;ÿ¶V׺yÛµðr¹,µZmo\€{Üû•f³)]]]2::z[#áa/ñÄ“ŸÙÜI&÷ï'x’¥¯¯Oúúú÷exr€üœm7O<ùÅ”žžŸ¿èÓÃ/žñÄ“Ÿ¹ËpEO<ù\ÄÛvžxâ‰'žyŒ÷Õ‰žÉdäæÍ›255%©TJÊå²\½zUêõº<ýôÓróæMi6›R.—¥§§GÒé´ŒËøø¸ˆˆ‹E róæM ‡Ã’ÏçåܹsÒÑÑñ¸×ÂO<ñä±I<~T*rùòeI&“299)ÍfSnݺ%«««òôÓOK6›•ÙÙÙ‘¾¾>ÙÚÚ’P($O=õ”ø|>©V«Òh4dccCÒé´ ÈÊÊÊžn¿W¹/²±±!÷w'/¼ð‚üÁü„B!YYY‘ .H:–ÿðþƒüò/ÿ²¬¯¯Ë¯ÿú¯ËOúS—ÍÍM9yò¤üèG?’ÑÑQ¹q㆔Ëeéìì”jµ*ú§*Ï<óŒ”Ëeùàƒ$•JÉÑ£Gexxøq?SO<ñÄ“Ç"‰J¥"‹‹‹ò¥/}iïoårYÞyçÉd2òoÿí¿•`PUùßüÍßH½^—ÿôŸþ“ŒŒŒH2™”þþ~I$277'ï¼óŽÄb1ÙÙÙ‘……ñûý’N§%K0”_|QþÅ¿ø÷|÷• ‡ÃÒÛÛ+¥RIÞzë-Éd22;;+_ÿú×eeeEz{{¥\.ï]x,“ÎÎN¹té’¬­­í§^¯K8–©©)©T*{¿ƒ2<<,cccÒé‘ûxâ‰'¿ÀdhhHÆÆÆ¤«««åo>ŸOR©”4›M¹xñ¢|úé§²°° O?ý´”Ëe‰Çã ¥V«É‹/¾(KKKòÊ+¯È;ï¼#+++Rû¬ØRÿŒÂybbB‚ÁàÞÏ÷*¾fóÞ³n¤°Ž=*?üáåK_ú’T«U™˜˜P($7nÜL&#‘HDR©”ø|>ééé‘+W®È‘#G¤««Kü~ÿ^ +‰H.—ÛKa½ùæ›râÄ zÜÏÎO<ñäÐÈ~ðyå•Wö ÑIOOÌÏÏ‹Ïç“cÇŽI,“T*%étZ¤V«ÉØØ˜”J%™˜˜k×®IGG‡=zTšÍæ^ kppPÒé´?~ü¾RX÷e@>oñ ˆ'žxâÉíÒn@‹x(,O<ñÄOH<â‰'žxâɉg@<ñäç@J%‘Fãq_…'¿hâO<ù9\Λ‰îÉ/žñÄ“Ÿéìñ{o³'_°x3Ñ=ñäç@¼¶)O‡x>‹'žxâ‰'$žñÄO<ñäÄ3 žxâ‰')ù¼"á~Ñä‰5 …‚ÈÎÎã¾ O•ln>y³~¤Zõà¿B¢Q‘pøq_Å/O¬‰Dô¡yòó!]]"À㾊_<ÙÙy²à¿»»v½‡i~F0ø‹¹ŸXüb>°ŸW E|¾Ç}¿xÒÓ# =w)•Ô€4›"™Œ==nñ`¼žxâÉ#ɤþÛlŠôözNÇã–'6ñÄO~qÅçÓÆÉÏÓ€ÔëZkõä`ñ ˆ'žxòÈ¥XqfÅ=‘ò°5–JE$›}ÜwñùŠg@<ñÄ“G.íÑA£¡ðG-ͦ*êÏ£˜ >\‡(ôh P`?yb H³éÐ<ùÅ‘JåÉ‚9G"­°Öz]£’G-Íæ£?n¹|çfS#‹»é¿_Ð~ßo4îÝ0‹z=‡±ÞóÄBÁËOz²¿4Ÿ²zœâÂWŸD …Dº»oÿ}­öp x~¿"É…r­Vu߃wïéˆDüœÍ¦ö=í'ûíÝXL$?œ‘ȋŠÇ÷xrX¥Ù|²¼õ{‘Dâq_Áç#÷û¬šM5¤€)ðbQ~ð!µÙö¶{`àΟóùÔ€<¨ø|"ûÏfE::ôj5ub1ýüaŒ>Dž`rXôI‘jU_Â'…Üõ¾îöìmLôä‹z4îU™‡B÷ׇÒhèì“Þ^ûÝ£j(t¹Ÿ zž‡­k´ãqÝ»‘ˆ¦ÑcÄÑ.OˆúðäQË“ÖÜhö?¨Ôëêuzòè¤\Öÿ>/ Ô{w•p<¾¿Úݽ¿:)žþAéóf¿…Ô¡+•DVV4ú8ìFÄ3 ¿ òyu ^à¿ÿúÈÏ÷ði'I>gS«iD€Äã_Ìl’öóî'Åâƒ9I¥ÒþŽ…ßo{£¡)'Œ ãXãPHßÏLÆ3 žü‚ÉîîÝ_쟯5ïý0R©¨‚ðûÕË{’äaõºÈÖÖ£½¿_óöH±øù€[¨}tÞý¤»ûÁœ¤h´µæDÆ%pm¯ƒ`@J%ýÌîîýÖ¡i!Å5f@ˆg@ýÌÆ†ÕôZï´Á ¥Œj5­Óø|º6ͦþ ÃÕhhq¥î÷«¢u‘_~ÿÁL½M×±(EæçíïBëóYTT­j„ÁX‚5ð5›ºS)Û“î9ÖÖì³ÓÓºÒÃ,‡Ö€lnÞÙ3k4<*“‡‘löÉj¶£à}XÒc÷#[[û£PÐ>ŸõO|R.ßÛ³®ÕL»û£»ûÞU¥ÒÁçi_÷~#3dÁ zñͦ®Mû>Å8ärv¼hT?³_:®PPq¨Vo¯¯Äb"ããzl H.§ÿTÀÞÝUE¿¶fQR2©k°»«ë‰Xs"àŸO¯Å5x»»ºÆÁ þ7<üäìóCk@R©;7¹•J‡;=qØ¥§çó‡°~áͦ>÷/Âyدú ÒÛ{÷Ô¹ñÏë> …Ö´Î~Òh´*eï•¶ãN…ìÞ^ƒ¾Þé~ëu‘¥%óÆÛ÷i¹lï=ç"õ³ß~‡5r"¨×­è-¢×CS-Mw·•;©¥®Bš­³ÓÒ¬KKúûRIS¯ë¿‰„:ÆkkzŸO¯iyÙêQ…‚î­^ôýOR­¹[~–¡'&_D±ûójÔ{X¥¾»kžå¼~77ÿ0r·µn6ïnÐïÖm}§¿Çãú¾”Jw>F0¨Ê¶ÙTÅy¿,‰ÄÁ)znÈét¿~¿yà¹\ëÚ•ËzÑhëËrYÑJ>Ÿî7—[+2àAG‡C¿_ÓrËöÑBû5V«ªÐA\MLèïü~ý·³SäÈ[óx\×ÒçÓsF""ýý­Ï­·WG½É=W¹|¸il­¹›Ü‹ok°»«?ïçñ6­çwË-fï÷þæóª0!3lw;:ôûÅ¢þ¨.éëÓÿ‡õçz½!åóxkËRLí÷Åu%ûG@À775Ї5¢Èfõ9bL@£e³ÖϽ5ÖO ©±ªT4réè°”Ña®ƒ<±ä^$›ý|f|Ñò$¼ŸšýPÈrÖÁ Í×~Ð5~XJñHÄ”ÒAÒÕugèq<~»7íR¨ãM·+m÷w‘ˆ*ÅîîÛ D{êÐíÖFñ#¤bÚSTõº)ëzýö†Ó`Ðjná¡fT¯ëóÂ[‡õÚóy‘™­MÐÈ—Ë)-ˆˆEƒƒzì|þö¦AöF{ªÌ5D¬3÷<‘Ökqi4:FûߢPÑ㮬èZz(©@àöq ~¿zÚ¬c4ªÿ-.ê3wS= ’jµV'ŽÂ´ˆ)Q×ÙˆFu îD?²½­×Þ¾ÞÕª*è£Gõﲤ•ˆØ«û/ÑÏW*úßÍ›·ï "G•ËzüZM¿»¸¨ß-—E††ÔÐd2º&ÛÛz~ È÷+kÆÄqÜ Ðl6[ô+?W*i4Òh4ötp£ÑÝÝ]©ÕjR­V÷Õ¹Fcï³éíýäžÊ¨ï¼ó޼ýöÛò­o}K¦¦¦$›ÍÊo¼!@@^zé%ùö·¿-CCCR©T$ J(’R©$[[[òOÿé?•P($©TJnܸ!]]]òãÿXªÕª„Ãa)•Jò‡ø‡222"FCvvv$ŸÏKGG‡„RûF¦Ùz]7Ôýà»Hâý†Ïu"7›š:ØÆúó–P¨UÁ5­Þ1i‹z]_îG•vršHèz¶?Ç»Qvçrw®+<¬$“vìZÍŒ^6¢@@ïexØšAa¤Üh!Óÿ0žÕª®©›z$ߟËéÿÓ?ÜùÝèîÖï@<˜ËYmƒH¢£C¯š”'üÛh¨Â÷ùÔ r"ZK l!JþÈ»g:Û××õZm­|>ƒà é1 ½¾jUÓTccº.¥’ÞG¥¢÷ÒhmqQ¤££)~Y::ª íJ³i$—ËÉ_ÿõ_K,“?þã?‘O>ùD¾÷½ïÉýÑÉøC)|æÄb1ÙÞÞ–ÑÑQ¹pႼôÒKòÊ+¯HµZ•X,&·nÝ’F£!o¿ý¶ô÷÷K6›•©©)ù½ßû½»î¡{2 }}}²¹¹)ËËËräÈééé‘’¿ø‹¿ÙÙY•\.'·nÝ’ÁÁA—H$"þç.…BAž}öY9þ¼LLLÈÎÎŽ4 —¥¥%yíµ×dddDÊå²|øá‡ÒÓÓ#'Ož”#GŽì{=Ù¬uˆ>iò ¹ãǺ>hýè k=h£š» SØíZ¹@@_àz}ÿâéÎÎíQBûš¹kà󉌌ÜÎãÄg3U´…‚^ʼÑÐßõô˜§ì*U¦ÓÅã·¿ ®!]Äý¸k@:‰Ç['ñùýª×ÖôßÎÎÛ;¢I½e2zÞDÂd}>½¦C$utXÄ#¢Ç¤~Ôhè9³Y½^j"úóò²5ÙYpÝÜQÜÎŽE]]zL¿_ÿgG¿KÁ»ÝÉ„jh¨õ9úý…Л12¢û,7C‹Y3!p`×(jlÊe}‚A+Ê;fõ¶ÍM«…¼õÖM©VWdvvI¾ö5w‡¥»»[>þøc)•JÒÑÑ!‰Ï,èÏ~ö3ù›¿ùyõÕW%‹É7$“ÉH¥R‘ÉÉIyçwä7Þžžéíí•óçÏË3Ï<#ÙlVfff$™LJ&“‘o|ã⻋ò ¼þúë¯ßí¥œžžÞ³`õW%£££²ºº*¿ù›¿)ãããR«Õd{{[žzê)‘©©)©V«2::*ÝÝÝòå/Y¾þõ¯ËW¿úU©V«266&§N’P($_ùÊW$‘HÈÊÊŠ<ÿüóòÌ3ÏHòýû॥b­ÕZ=‘ÏKüþ'#­zåa¤ÝÝ ø@¿»ûàkDÈŸÏ›‰x§käºH½´ŸŸ4Ó¢Ú­­Öuƒ¼ZÝÿ~PÀµZk3ˆíGÖ¥^·cÖ€Øþ.äóæ)çóú|þÞ ¸DœkkÖuÍuùýª|]§zW¥¢ÊsgG¯ÅZ©èÚSlÎfõgŠã<+·Ðßh´F*¤nèe¡HžÍê9‰B¨Ðd‰èµnnê}ÌÍz+—3tpeÒw==z=¥’þ=Ñïçó".ˆ<û¬E:››fººlà°ÔjúýÕUû,½!ðlÖŽÁsóùH¿ûdhhPºº&¥RÙ’‰‰Qéøì ¹råŠ Êôô´ÜºuKjµšLMMÉsÏ='ÉdRòù¼ƒAùò—¿,FC¥··WB¡ Ëøø¸üöoÿ¶¼üòËrêÔ))•JòÊ+¯H8–“'OÊ™3gîú¾ùš÷P€¨×ëR«Õ$ÈÚÚšô÷÷‹ßïÿgO™|[£Ñ`0(FC€Ôj5 …BR­V% Jà³7«úÙ®ðù|Òh4$ ‰Ïç“7ß|SNœ8!CÄ~_ ‹º¡;uÀ“"Œíìê²tØÝ˜o]dÊÃD—¤.ð†ËeS<í‚—/N ÑY»1©×ÍÛDj5U±Øý8¢X]ËžUÀäÿ݈ŭéàÁvvÞ9ý'S»q#µB¶²¢ÇÄ½Ó³Í iA†DQߨÏèV«ÖuÞÛ{ðÚܸ¡Þ>ž~&c)F®Ï]÷ögksS¡²¤Œ²Y}æpcù|-…BÖ‡á^+ŒŒÎñ¸=5NÀvY+ùŽ{füÇ~áyÞÿòÕ¯¾"‰D×g¿oÊîAÙþ ÍÐÕÕ%>ŸOü~ÿžN®×ë¤ÙlJ z½Þ¢·Ñ½FCªÕê¾úúNrO)¬@ °w0"ŒƒþÞþ{Ù³šHèâÒ>/Zo¼™/‚¾ ”áã”lÖý܉†/JŠ; /6Û‰h¡'Ï‹*¢ç%•s,3™Ô—´·× ûa?£€2!UA?ÁAÇïêº= Âû… nв£Î€bo6-ý×ÑaPQ^#P`Á ®ÑúºÈ©Söwà£(ÜZÍ”=é­JÅÐExø}}A5ú÷JEÏÕÓ£×ǵ¬­éçÛ9«ŠØh:ìëÛÿ3ì‹în3‘ˆ¥ô,Õîúttè~¿Ö††´chÈê6é´c`À¢%RG…‚«ž‹P¢Q}Ö‹‹Z¡Ÿƒ½†AƘõq/<ŸhT×=Öû'Åข1‡Öñù|{zµgŸ¼*~»®=È(øýþ½ãu܇÷vËÌ?_bäQu5ßI>ÏùµÚýAU»»MÑ·+`WèNÞÚÚ¿3Ù-x»Ò"úRE"Fö‡¸\GD"wjpóûù ½{´ B*Éíºv™_÷—žcgÇ”òì¬Õ; úرÅ5Ba›2m6­v“Éè}<õ”Bž»÷¸GѲ¶féDŸOi>¨‘ðlEô¼DVýý·GÙ¬î™ö ,vð,s@P_££ZÌO&ížêu5[[Æìî·ññÖ&I”2Ñ1†ÝÝzž‘,kÜlêÚ$“­Äž¬ßÎŽ¦«¶·[£:wW*f0 «ÅÄb†ëê²½îó=ø`¬/B<ò9 ÔáùüçÏëOXüyD÷[T?(´µÕº(o]« «C ˜±vÏÕÙÙÍ”Jö3õ"”ðÎŽ]Ï¡ÙùôSëSá¹RÏ£7£jNj*5y·†H÷þˆºººôvw-íÓѡϼZÕc¯¯·F³i4&‡öa„0úa¥½Ã×EРŒ]ÃC*b?éèP†§L”G§2µ—ƒÐ_í/¥ßoåì¯v#HJ¥T2#R­Zó››Ã&Q.âg?Z ¢¨8ºº æšÏ[a¥_­ê}õõé¿Å¢*ÿ‘‘Ö¦À|^•V¿å扆‰^„‰X‘›uqsõ§N™WœÉè:µ77ºkE¿F¥¢k±³cãnék‘•Ím:Ê×¥f1ø;{ÁçSã,¢}±˜÷{¤s9½·þ~½†jÕàÇõº>O"(÷>¨F"­i)"Þ ÒzÀ}y¦ëåeMÌÏ‹?®^ê.Ì® …t¬¯[ô•L~þàž•'*!4­q­²KáÜ.¥Òç7žò~h¨Elýeƒ_­ÖÊC´ß9‰&ÚÔÌý ë@¼ |«UÍ+Óaʨh¥bJGÄšåvv¬7%·_G=Çqç~ƒÙ±¨‡D6kX« »»f|æçÕ“ž›kMð_>ožv©d¤„å²ÞãÀ@«2/Lánm©]Z2 H   ":©¯O ä.½kÚh{Û®›È€}DSŽSw·þZxŒ5Ê´Q#ïÐúº¨Ñ úú¬.ñá­[­ Œ¤ŸB!K ‰¬X.Q‹Ë Z=1¶:Q븻k{ˆç _=@¡`Ñ~¿®3©ÞfSŸ=ъϧQ õŸ'ºý°¡ÞÒAì¥äO¥ÆAhƒDºÊÚ¥¥Šz7罟´¯?W«ªܹ¥’‹´Û½¤DDÔn—JE_‚ÝÝÛóä÷s|0úí÷ÍK×Ñ¡/$Ç£‰Í‡ÀêúÝçÀ”»vCŸË,{ô¨yò®Rl¿×¹9õÞ‘Ý]UL@: Íñ3¹®ÑPïÝ¥§ .·wá ø9ÆÏ<™T%Fw4ÓúºõrpÿÔxz{Í8 Ztlv`@ÿÍç­×=;«÷—NÛú¦ÓzÖ^Äæd X f"u´³£{×5œÃíÈ&jkõº]«ˆÑ„ˆ”˜ˆ*—ÓcÓŒ…üò²Á‰k5½ßÅE«OårvîxÜ A,¦ÆâìY­ÇŒŽÚ01þ%5º¾nˆ0zO¨áF‡ù‰Ja¹£<Ég¢<ÚåAfG œ&\¼€!Reà"bJ%ËÙÏÏëu Üÿy¡¡>HÀ»»ë'¢/Øø¸¾@¤@œÞ»x}š¥ÒiUœÍ¦¾Xx®Á Íq> Ïá°q q=(+¼0”á~ÏÔRû3Ã˱7ŸçÞ)XrŸàïÁÞ)%ZØÚÒç°µeïØhØÃè úòOMµ¦‘€ð¢ \„zg§~o{[_,^v6«kM#ÞzµjEè=† $Õ²±aýDxnª'Òã FHZJshʹZ©Xj(lXˆCk:ã\*龸ÓÞÆàRƒ eF¤Á}cÄ#íêÞÙÑûL&­*uà°nê0“±s)Q§ééÑï”JªÔAú|f<\n­ÑQƒÓÉ>D …W.[ofÆöe8¬ÇÐsÞj,›ZÒÞàµßÿƒ|pQl(;<ý{1"÷Øwë¹—®dVM\;M†®VÓ¿‘æÚÝÎâ{Y37v×°½ÌÍ·’zàœ®¡Fa·#Ú©@€*«¥&Q*µÖ«0¹œ~¾½Æ‘˯T©ÔêɻԤB¸·û™ßÇbÖ!¢Çéë³ô V”)Ø`··mwµª}Ñ™:ç~o` µQŽkæÙ'“j,âqËo3jÕ]S¼ýãÇÍ»eB ›”ëJ: /˜nõDÂê;î³úä‘3gÔ˜f2FáA1Ú}.tP×ë6ƒÔœ»þºžááÖ®óýÞC ÞºPÈ"bØs/_Ö5ÙØÐgÑեƛ½@äEÿÎß§Fµ±¡×ŸL±"ïJ!QDD_.};½7t¾—Ëö¯«3؃Üë /˜¡gî;ÎV,¦Ïctôp¦®Ck@ðbï ìG@'byöýÛï'Ðìçùâº^s ö똣ÎuSÈ%\n?>?ãщèùr9}YÁ¦ßË}ú³&äýᢰ½mÍs‰„!( âݵ¯5Ƥ£CdrÒróx•ÝùÔí÷‹¡rèrä(Òf&* å÷«ât£¾ßÓ£/"‘‘H"aç¥ðM“ž‹Ë'R‰DL ö÷·R¦ÁV*æŒtw«"ÙØhQºµe×ÑÕuûº‰¨R¤Ž: c™JYôká÷ëÚÐQ$JØ¥?vLßjÝÝú]x¢(¤ #o½®ŸÃñ µ?kŒ<õ¶ííV@ƒ»×\ÒHèF"ë5á=óûf$°™!DÏìüÖÖZ©\D××g ÆôýzîDBÿƒŠÝIÊ÷Ø1{wpãqÝkíƒÁÖ!Òw8 @Ç¡yq‘‹VW9̃ó­¹×)h"f¹yÐQßë÷÷ƒàí7ÇÀ…C"x£<¿ƒRmû‰Ë JâݳDLa±ÑñͶtS¯®ZúltÔ¾—ËB¤ÝˆâÅt^òÒxÄ ©µGs6Ý.êbÑR\xµ _¨€¾C‘º”!}}z°ÂBiAš¢·WÿžÍêÏDuxÆ;;ºnûMŠªõºÖ S(e÷ûxût£ÜEZ{¨9íW¤Äx–Ë–î#:áƒvj4Ô@Søîë3V[jI w::, Æ ¥Ü}Ú\îÅE‘?6…ÒÙiȤdòö”Ig§ÓEýe³"/$–g ,†…ˆŒ„ ‘å¸Q>€ƒµµVcC…A9{V~w·~¿¯Ï‹ãq«Spl¾ÇˆÙdRÏwü¸þû쳜èéÑõ[ZROσÅà,ö ÆrsÓš ‰60.««ÖIÔ +Ñ‚h H+Éh$º¿@XÁðœ1´Ì*aκ‹H{ ÌN÷,‡Ê€b‹º)ÚÕˆX.Áãi¡)"x&÷"®"FÈ×?ˆ$·ƒ´»{û=ºÍv É€ŽÞivv½nì¤äÉk‹X§z{ PNräîñÄŠ˜‚FI»kŒ‘ÛuË,në†Fa¹ŠrkËz0œ¡Mh‹D¬[·RQ[ Is4—Q†ýUD÷÷MckËˆí¶¶,EÃËÜÕeÓéPª"ö̶¶ŒR„Æ·ímK͸ût   Œ´ë,¸³Ó3=ŒàÝÂy£¡÷R¯[ÚÓ –—ísD$##z nú„g×á%ýŠq …ô½ØÜ4ÄU*¥Ê»«KAB¿ßŒh8¬pgÇj9z/ccjXh$-ÍGQ¡&Bƒ`±h)Z€8@îìX?«ìårY:¨D šV‰L™ŸB(2“ »ºôs8#3j`‰„5k‚²»~]Ïc3DЬìÆËËf¨›*BøLÚƒy®´ÿŽ4…«é>eÁéOpy‡î$(öß¹ðnÙ¼Ô|¶]€ò·åe›ÆFÆPW@q=KŽÑ~MóXOßðYŒðhR_.õÓÐvvlÄk£au”pY·sܽ6º¡;:Œ•”ëÅìë³®}šEQ\œkmÍrýx˜Õª#‘нù é‘•3zî}Qðu»žoÝj…"‹­J8›ÕŸ)æç󖇇长>”€z¢Ë˪$0®­¥Ö²±a© œ*œxšfgõ3ëë•àüäóꩳÎúûDBCŒô‘%µØhy–yuýAXåuSŸÔ¶·ÕcÏå z b+‘0úxÈñÆyGqëu5@ÛÛ­FrgGï©\¶(Œ¨)›µèñÖ-sâXW@ »»z/õº$2«%2ó´\Öëp#Aˆ+WW­»=VƒµÉâ¢Cbl€.onêó4#GDŠþ ª9Œ0ÞCe@ÚÅí›p;KÛóñü¯©]Ù»ÅX<˜;= Òw²øù¼5͹s•ww ·¼¬?g2¦¬)&b(¶2£™tˆ›Þp¯ ƒÂKDDú†œo±haõ~B7²ˆyÀz_®ñ¤hÚnÄ`„M¥t£ÏΪÇE•4Z»aw øö¶®Q>oJWÄðøSS­Œ«Ù¬¾híÞ{O^=äÒñh“ÉÛÙ3nã£ß¯Þ0chhV£±0›mí ÆÈ¹@¢$Œ±ˆõ¸‡‡õg·1ŽP¢LNªj4LÉS7Ñ5FiööÚ¹ý~0¼x¾ôL0;Ä_(¤ÏŽÔ̓٬þ ¹»oK¥VtÆIDõÞ{úÙÎN½¾®.õ²IAné÷ëž™Ÿoúâq£&aý€›×ë}PÙØÐs èçØÛDv8gɤ¥¼Øû…Âd`@×Th@ÆÎò^SóºqC¯óêUýQë /è燆Œ€‘=†)Ÿ·½랃B…hù0Ç9ÄEtóH°Ä(ŒƒI(V·ÏB¤µ˜ÛÛk銇™<ç*Fpçx‹LGÛˆÅ,±‚¡êƆȉú7î•‚œDîbã‘néî¾½@>}¿<xlÔ-Hâý»½%(¹Pèv ‹±1ó$E¬ëÚ¥GùºyR;µZ+Ú„ûÉf ÕBž?“1dÏ–ˆ*=¯;r€û¥^·wà{ 82½GÀ6)‚óù`Pלh®P°4) w’{PN««†‹DŒ"BAêN¤P¸"7j\.xayY Ë,5?¥’5â±/ˆª:;5’K&U¹ÇbzmnÆ€1h#¨C¨9lnZ¿ ÑßÄ„E‡¤®xPÐ&šÔc²ö­»ºÔè…‡ÃÚÕe£TÒãØ !°§Ç”uµjÎÈȈEº±˜¡×Hï±FðXñ]æ HH&Õ¸2[„n56Ë$›Õïô÷[êì ´õã–Cg×Üè€×í¾’ $uŠ­®”J­ÐÖö´†›wåö‹VÜ"4”nÆŽ¼¯›&ÀSìéQ‘J™'<0`°ËŽ›; b5#ZC1¶Ã;:ZóÊ™ŒÝ‘ ‘‘ ¥øNÃÏ#ÖN\(¢çqiDìg:“ñ¨HÅÄbæ¡c`h8sY…QzÔ¹"CU10 ˆ²Û<êÖZH!Ð?Q«ÙŠïD_í]ñôy¸½Eé´qMÑ覶HoPO¢X‹W/b ¼…‚!uvwõÿ1¦¹\k?{ø.u:5ĺӗ”úóÅE«Ålmé±ln#l—ÔŽ—Ï{rzPz ã€á!o ׊Ç-Ä…B6aMÇ‘Kàærô€!ߺ´d0\WP` nÜëÑÕ¾AIW ÍmnZ¤@³p]ŒtµªëDŠ‚œ®;—Bļp7•Íš"rן‰dH•À{Ä  —)–è‹ÁJÕªåáÝù ɤÁžÛ;èQì©”åìaXfý–—õ¼äÔëu«ù@ó“R@‹YQÅÍ}ñÌX£FÃ&R×"µäÖÍ66,B‚KÄ Öo½e=%¤a‹¥7dž‚5Ï””+{”ÈÜœy퉄œ6梻]ÛôH­®je¼¾nµ`¿ì…ZM•<|gÌ@o e΄HÒ|¼s¤™]ĤKhX(X ‹40ïœß¯Åo(ÛGG ñ·½m½i·nÙ~โ4Dd2–Bƒ­€kZ}ë–^ûÚÚ´ŒŽÚDÂÃ"‡Ê®aᇇ[=Îpøà´á%B²P0Å^t77ŠWЇíÂVS)£Op'Ša¸\¯Ò­YPlÛÚ²¼'/äAD}¦ño&c(!‘Vøh(d!5ü9ˆ[g .ÂgẼL&u  =ž¶Ko§ Íí§`KÑäÐ~´ß0ä¦Rº~é´ëöϤӚv€db9žQO¥"ÂaýŒ›KQº²b†–—’}R,ê1oÜÐç¹±a°ïåeKÿñ/5…DBïýÌݳª”:;-%qó¦Ems¢9·ùouÕ ,5—fSI(<à¶îx¼uî u ø¶H¹ZS¡Ãž^©×^3vZÒ¼t¢óN@–è>ˆRÖ× ™´â‘#º×FG­~ÖÓ£õ, ´tqçr  è5-ƒ $Rå{¼s8ÛÛºÖ©”áÅEKI‘BÎdLA“jÜÙy÷]}Ž‹‹ÖwCÝipPïÃZ63cq,ÙÃb(N¶¶,•<2¢Ï^,I o©dfg§íÃlVäÚ5kèϽ>!"êìTÅIú€Q)·Ë›(´ùsº…i£FäNÐö‰çCJŠŽeÖOeB÷2r£¡^æÊJ«ÁkÏ‹G* €»VÀUݵ+Õà…Ã6½oiÉj5äîAY]Õó»\QxŸ(FC×hpДQ {=±˜AbãqkäÜ++æ‘ÑÀ\(Xý(°zF ¯6·9ßDg ØB!UXnƒ)lÀôBÐ{±»«F'ŒTÑé«ÎN=w¡`çPG€g g ptqSÜ'b¹yÓž÷À€Õ^j5N`[À1Àù  €ˆÕùØËPÒ€Öã~Hý‘ó.‘"‚¾ÑPïÒŠPû.fƒ™{&09ìîê߀ÏÌXÑ#…!J\­êÞÀ¨ÚÍ7^&c„–ÐÛÓ «©Âi9~üðE ‡²ˆÞNéM¨+t'»i|¾uötût> …ÝÝ3ìëk!° ©· þœ¨Ý¸©€áç|î< Rô 6*T¤u¸ð¿`P_ b¹lJ/´»[=çjU_Ð'P´!Àlf a=ý8ѨuSø]\´u Öä ÔP¶û|ª¨á'"'ì¢tp äÞ Óç1:jÏ9R±° ÅYw´;t 7ªè––t½××mRÝêjëÌŒ9y·(Ïó&H‘¿^7Ú}vD-kkºF]]ú/„€ Îb1ý.¹t˜uAé`D)àÒ?T*‰|ô‘È+¯´Þ3i¯¹9ë…èé±´éR¡äáñʉŒˆP]#žÿêª># Ô2é©SºF—.Îñãæ]“:ã½êìlev a‘º½ ¼Ÿ››Æ·ÕÙ©{ Øp(d})¤‹@©ƒºÞD¤/¾hì¸DÞD̃ƒú7·ó&^ØHwã,,.ê5yuµ•XD÷ï×ð°>ãÇ­ëþ0Âx¡˜„ì7“šf­`Ðè®QNw*6¡ÄØ0}}·+,>a%¤z4•µ¯´Ý€"a‚ÁÛØ°|®K7Nh‹òD\ÏénRó^U)bìè„íèÐ{qÔn(1p¼¸ š’èîÖ¿Ñćr ¢q)8ææT»l» Ɉ„܈„gÍúñ/\cPCôöZ¤¸¸hk‹’£ta:­×NTÔþŒ³Yk ‡µ0Ëý‡BŠ*ã{·né±:: í3:ÚêxPoà™\º¤iR²ssæUêÚR$'u'=LÜ=((*¦ò|‰BÝÁC§O«Qœš²áQnTJq}~Þê-DÀ†~[Z2n5j8O¤1@—.m i#j7ÌÈ8rD4Ž ‘=H:®arÒ2ô1g-Ìì¬Á’yoâq]ãåeñKzvV׆4+N½6ÇŽé½MM©3Añœ´ðà E?Ež>­,è«ãÇõ~––ŒZˆt"ÏüØ1½ÞùyËT`°,â<ìÃó] +•JI§³b )\eJƒb,¹]6+Eôv!] éƒ$CJŠb-uÀ\6Uè50(ím(Øüx*™Œ½èD3„Ìl,Ò ü oŒzç¡ß….e·¯b|ÜÖ‹Yx²„ânÑ!'-b,¯xÇäî£QkÚÄX£0j-(:” ™(ŽusýàÕ2Ö“ŸÛ)Dð&9/Š,›m…ò‚@sk¤$wvôÞX'`ؤÄè`‡UYW*Æ)‰˜b`?â cD€¶‚¢+—Uù€6ÛÜԵé¡™“ÈkpP ^/54¤n¤ðèw»¶éwóû†±Ó{„“ '{ º ÷&ªÃˆC“Ë©B-Õh ˜Ñâ\¶&Àh›MÝ»ÀßEŒ>$µ¤TJ÷5³ØS)ýo|Üž-F\ļcäám­¦/&]¥@-Ý’c£¤é̱±”ƒƒ¦DÂaC‰˜²v ñ@4Qîð HDys˜Tçú¬€&»éî5óÿ}}F¸ÇÐÖ–yÁ4ÓñSºÂé*öûÕ;$…(¢ß60t)¬†ÄV+ÏÕÎŽæµK%3\tÁ¨Œ·:L/¤/€žŒ‘3,p-aÐ(ŽOLè¿@ƒc1K%ÁU«?#ù|FiAJ%ËõÓ­L݆¼>iwzhПÆ9îkyÙ^6ÖŽ‰ ó8¨I éwRÅ9I=_¼¨JÛíq¡ÎR¯[Ëì¬~ÿÄ ‹æx_;:tÝØ‹7.-é}]»¦Æ–h7ž ÷åF[óóöœÖ×õsO=¥{„X¤sãqý7•Rb}]Ïè½ [´ŠÓBê‘Ȉ&Ε£>¹rE¯{{[äÂu>Ö×§ebâðE ‡Î€¤R)‰D:eaÁŠ…ƒ'ÊåÆKR¥Ã@”ÜlC__+Ûn¿Þ#ÝꙌ¾Ãå²^/µ)¢!êŒDt¤ËšMëÇèû%Rç}§©—4ñð°FiD..™ Nèéш'“ÑûÅÈ€â1Æâ¢­y±¨†…g½³céÓÞ^‘túp6^ýõ×ßÿ}¹uë–lmmI a@Í_°¸EtZøÛgU`@àYÂC%¿‰æ"¹°‡x£¼ Ì €7n}yÙ¹Û‡â4—Q˜-—ô ¢-=nšŠB&á.}==­é2Òkté’Vàëï×ϧÓ6u-›5Hm½®J€Ü<3i2ŠÊxK¤Ëˆè¸ö|¾•Åwcðòxð"zÏx‹À$Y º¬¡Ûƃvò`pˆ&ø )/Pœã§4tmM•Y¿QP”ËúYº¥Q¾äÈGG­î½®®ªwÈU s(¤é# ;û“Z{d©:ÆwKz†7/Ýä •Ü&4Bç¾>k–£÷Àeî%ÏËuƒÄ‹":"ˆ‡ßÝmÆÂÍù¢ôPHÅ¢ž—gâ÷kW÷ø¸-šI?áqF"úúýú3)”LZÃaOÉe®_7åƒâ-ÆZÑg1?o4hÛ»ºd/e 7C§Ö×õùÐ\FC"½G±˜Í_[3ƒ‹Ó43£×‘LªF‰ï.­'¤¯OïmuU?÷É'FôwýºŽÑQ»E)”LZ€ô)“?C%¿µ¥u½n ËÔ¸®\QE •kÙÕ¥¿gOI/¸‘”2tõ€`VV ¹88h}/(éÙY‹x8çà ^£ß¯ŸÂÝ彪Õl2!´ðDe•ŠõšA‰S©h´‘Në{22¢ë ‡;V–„ÕÕi9ujTÂáCh@ü~¿|ÿûß—wß}W‰„LNN>–‹q ðV3H;;‚RT$ì¯T ¿îÎÁæ…á\” œ Ú&ÍãÖ`PÆÔ+@2‘º"ÖÞļ˜œýåËú LÉ[Sá¾\æ]^toFò>Ȭ¤ÁAë!@Élnš²\_Wý6(+¢éþ~Ûûœ—ô–ˆF DÐýý¦p{zlü,‘ ¤Ué*O&R‡ä#‘640™Œ~†z^z!67õœô¸°w(HÓOCº3Ÿ×Ï‚âb`Ö•+úÝ‘*NÒ=IS" ™Œu§Œˆ<óŒÍæÀ˜ÐûÂÀÁ¾«ÕŒ´“( È1@“•]?ö ¿Ô"}/j?‰;P,¶éºqÃÞ—x\dyyZ&'ŸÙSy‘HD*•Ь¬¬<¾‹ñÛæïî6>|k¦áM2!9/`©dœ>.íx2i$eù¼Í½‚H:†Qœ ¹ÜèÐÕ8@Y‘Óv½l:´IeˆØ,4s# ȱBÍgpPv_DµKØè/""Ñ„ª„º“:…Ä`P ‚ÛôEòÖ-+jƒT‹Ç‚®sjM§N™qì겨*‡ÕUK“PôÆCØP+€"¢£ÃûtwëÿSŸà{Ч3@@š0¶çN4Ka|½n£`ôQ8;;6j¥|ú´¦eplººô{ • à€î‚µƒc 4k!c>¯çÚÞ¶w–„®.M--Ù §?T„³Q(èÚ lyV€†‡íSëíÕï]º¤=4¯%mnÅ5/"…ímý}SÀˇ†4’bXQ=&—/«çÎÄ@¢€BÁRŠkkºf°OŸwN×xmͦŽizWăŸ~j5«jUaÁ.tü°Iàõ×_½ÑhÈÊÊŠär9ùÊW¾")æ{~Á²°0/±XJJ¥Î½ðÞíæ¦P'bðÉJÅ" zq¼{KAQ„& †çÅñx©(úùýVg!w Ê ¼=ò*ˆ'Å KqÞ”×Bä€'IÓ9g—8Îí¸§ðìâéQkkF¨‡Ò /°QŒ7$|™Œnz ®IcÐA‹rmk˨\£J?]ê"zŒÁAK5À¥Eƒ”dµª &5ÅEç3÷rýº"Ö *Ÿ¯•±`pÐÒx›‹‹¶æ\ è¢ë× & K} öÈY F©ÁÈÕ±1=×§ŸªŒgNtâFÄøaøæEcJ¼§Gÿ>6¦Çøè#KeA»?8¨?50TªTÒçC¯È,@DîÀ›™øÇõÀ&¢ë@a¿Qy`@ï“:è¬dRk+™Œ*cî§»[¯ ü! ’RIëW¯êž¶9-L@¤&Cçw>¯Î†ß¯Ÿ™Ÿ·=ÒæGÒz.2á}Ä=‘†#‹Q¥¹”k¢tŸ%{‹÷‘gvó¦®-ÏqfæpF ×_ýõwß}Wfff$Kww÷(¬¦Ózíóùnû¹ý3íÛï8îßçææ¥¿?%ýý’Lê"//[Ü«ˆÕ¨OlnZN‘b/0UÒ(^Ð(Êùs9ÝLÐd¸·èÎå༤.^4´5 5FK(R ™î$<¾‡§GSÙÀ€} ¤‹P\Ðe …ÈŠb'ëƒ×îŽa]X0$°Þ¹9ýÛÔ”þ XaaÁ¦Å‘`.tµª üȃæ‹F? ©ñ๖J‘@%O݉YàÌÚ é¹`ŒÅ˜`L×ÖŒ-•;5 š$鳈F­AÐíQ¡*Q ÊáÔ)½wœ„BA£9 ±˜±öîîê= ©Òá™ÌÎZ¼ÛÔÉ^NG:m}3.ìwxXÏâ¢^Ç©SV¦ðKÔ´»«‘ûž½FÄZ:ìäI}FLÈœžn¥ßç{³³^ ‚zÐr£¹/j ¤zAk./ëz޽ ¼·8JLµ„vŸ‘Çì7JpÌÍéq¿º!ƒ‘JY¤ 5,œolÌ8âÒi½>wž: ¢ù¼¶þ~u.§3þöFBôè£ÔÅû}æ®$™LÊòò²ÄãqyñÅ%ìÎ+udffFþþïÿ^Âá°ô÷÷K±X”óçÏË»ï¾+ãããòþÏÿ‘›7oʇ~(+++òî»ïJww·4 ²°° •JE¾ÿýïËåË—åÖ­[rá•h4úYHtuÅ%hŠßïÛë„eƒSdÆ»¦€ETW 9|Æ“G%ÌÎçíÞHó ôI‘Æ %E~¨ãò²)`w^é"F±²!ÝîfŠæît6˜›‹åee£Qr§²a܉Œ ]öljŸO½AjK03} D ò:;«?Ó'Q¯ëï1€¤/; E¿¾HtM Vw"eȰ£xÜR!}}Ö¸è÷Û=uE£Æå’@2‚h4ш˜'ƪr ˜x´ ¢@>ÅbFm.b´*ŒkFˆ®çZ îFjdlÌR¯Ôa€¨“Þôù4­"bT ([  H’~‚pr`À¢IÞ xÄ€qJ©VÓç>:jJrtT¯ãÖ-‹¦@Îq×®é熆¬ÞH}ÐTèÆ©)kæº@ª@q{CnÜ0$ÓÚš99õº ȰBZ È„ž­™ƒ.3_}kËhîÃam>dý35Xýý­çÛØ°Ú‘'h)ÆíH14¤Žû‹T=(ÇŽø¡»[S¡CCMiH,Ö”ÕÕÛ3 ù|^þîïþN–——åøñãÒl6å£>’7ÞxC†‡‡åí·ß–?üP>üðCI§Óòî»ïÊîî®tvvJµZ•|>/™LF._¾,?üáemmM~ò“Ÿìéö{• ˆH"‘ßû½ß»ë‡C¡,..J8–³gÏJ<—z½.›››ò—ù—òï|G¾õ­oI:–ïÿûÒ××'étZnÞ¼)Ï<óŒ|ï{ß“‰‰ ÉårR­Ve``@²Ù¬œ_“Jå–|ù˯îéb¿ß/•JEÞ|óMù¥_ú% …BÒÛÛ+‹‹‹òÞ{ïÉù/ÿE^|ñEI$òÎ;ïH©T’µµ5ùïÿý¿Ëàà d³Y™•ÙÙÙ‘H$"ápXJ¥’œ={öþ"U^ ©×ëâóù aÒéôÞIßzë-éì씋/ʯÿú¯K<—R©$…BAÆÇÇ娱cR(¤ÑhH(’gŸ}VN:%Ï=÷œär9I¥RröìY)‹òÚk¯IOO,//Ë3Ï<#O?ý´twwK¥âßSZ43A¡°»kE)z"ÈÓƒýGAÔëÆ‚éOq‚΀Æ1¼RNLÖÃT«Vðä|'ºkùi("66Þ'©«xÜBðõuK#¤R­õòÉîøÕPÈê-\×¾»«Ê#Œb¸vÍ@x½ l¦§­Nžã‘Ú©VUAc(HrÝ Î@¯ÄÙÝUåìΛ¸u«•ú}~^_²`Pÿ#OÝ„s-,¨‚áÙa‚PÔšŒZ Þ"9}¢Óþ~Uˆkkª8ñ&AZuwëßÝQ¥De°ò^¿nõ–fSï•c"ßJEÏúÌ&&Œ¬Ú(Ä9LssÖ¸¨ç‚éäéUÙALIÍ 2Fq û"ÅH˜T+pÔx\÷°[ú÷O>1ã?ýI¤[76Ì)`Ï[ú/ù¿ÿWïíÜ9cÎÆ™¢™„°sRV8#¤¦pö@uuYŸûdmÍz¾­®ÅÀ°DB‘JE‘x\צ ú§¨ÝÅãz.FO—ešxžK­”TjPF¥RÉÊä¤E …BA®_¿.¡PHÖ××ennN677e||\Ž?.õz] …‚ø|>ùò—¿,…BAꟀ'&&ä•W^‘©©)I$R«Õä…^J¥"§OŸ–“'OÞ³ñ5?K‚?^.]º$¿ú«¿*瀴Éîî®är9éêê’k׮ɸø¸„B!‰Åbâ÷û¥P(H¹\–F£!±XLJ¥’tuuI>Ÿ—x<.‘ϰ£ÛŸ5uøý~©V«ÒÝÝ->ŸOÞ|óM9qâ„ µ d¢(Œ×:Ö[—rœÆC¼ÀÁAË«!ÄÈðr0C#}LŒ0´†‡ÚF­f„jô2lnZ·)!y.gÅl64ÜDR)t«º4!.JŠð s(Ü[gøà ¡ˆ^@‚‘žãåÀóraƒA=Ö'ŸØ<f%œ8¡ŸûðC»ö£G­åÎê¨T,7OÃØØ˜zÝ'§§ÕhPŸÖk¾yS#™ ƒSV kF±”AHÔ5\C‚cSt”"=ƒŠDôtŒC91at1<£õu‘çžÓkK§­±­»[ﯷW£· ½^P@\#ŽÅÎŽ=k #\Zêu]¢(rú»»ÙÙ±æA¼uúà;Ë嬀M‘´ÑÚš*oŸO 9)¬ZÍ ØÜ7NÊÔ$w?û™Õ™hÈ.ŸÏ+Úé¹çŒÂccCä§?yá«{RÿÁ°f29Â#e¶µ¥ÏçÊsb\ úuˆ2‰ž©å YZŽ{Zx×H³[TËû§ͳº–©”ÍÛ¡àÿÿhõÌ×^3òÌ>yùe‘O?ý¼òÊ+ÒõYþºÑhÈææ¦Äb1Yû¬©ippP€„Ãa©T*R,¥Z­J4•jµ*‘HDªÕªø|¾½ã”Ëe) ÇeggG’ɤ„Úkï%yçwäüùórêÔ)9vìØþ$K0”ÁÁA‰F£‡÷"–p8,±XLâñøÞÿ‰Åb-üZÒÑÑ!ápX¢ÑèÞ÷ÝFB ¸ôg@‘Aú +¾¹i):Ð>»œ? ú;¼v¸šhîâer©Ä]/è€æB÷3"ê­Ðì‡Â‚2„ù‰„aâñÎÁ¢Óe»ºªž8Ý˹œáîéM€a%L‘zcC•7M:m9s ʼ07nØßéSÀ;Ä€ˆX¾œÞåõI¥,ÅÇ= ¨rõù4º¡†iƒ®RÅs'uËéõÓˆèóiÊoryYOÚ€h§¯›Ô—;‘ziÆ¥%}&]76¬¹ n#Œ¬ˆÁ)ñŽAâ@ûÎ,øbÑ šxÅCCÆÙ‰XmŽäO~b$гðœÝ^œDÂÖ‰‚ðúºÑÖ“Æ(ŒŒXÏÐÊŠy½85LÝî=1¡ÏgmM¿Kw=CÕõ\•ЦŸëΧã~|\÷Vw·9+©”†K÷‚1Ìz_xôð@‰(é!#w ÝçÎÙ°0رËe5¦Ô‡¨5šp÷ M¶×®©ƒÂñìï×ç–ÍZŠ™”7û¿¯Ï¢5 å4p2[ˆ">\aããÆ1æFQíkº.·néw£I±• ËçóI,“P($ÝÝÝÒÝÝ-¡PHŸmø`0(ÑhTâñ¸tttH4•P($‘H¤¥ ÷ô3úú~dO« H¹\–X{ õ(rEtó‘’aJZg§y}d#2!{c]è¬)º‚¶ 7JèM!Ë…ôÑy+b¤w‰“'õçÅEýDøðBºº¬pLç)#iib¨ÊŽ~úð|€HŠXÄÑ ³¾GG­oÈ0¹Z”7¤ýýúyòÉÏ=§ÿ¿ºª÷‚Bœ›³4÷…B»yÓ^ìÈ3ã||*¥ŸõåO§õCCö¢ŽÚ¼mŒ+Qàè¨È³Ïê‹G6=8.OJ.%ü@÷¤Óº^O?­ˆ8"\¢š[·TÁ ©â™ÕçýüóVƒèìÔu9rÄRýýúïÜœ®áè¨ÁPSÌAa°ÓÚšÈÙ³–N±ˆ†þ™åe‘W_µ¨ ®ÙYUä§OëúÖjÖÙ=4$òƒ¨¢¶ÅÿÅ‹6ìÒ%›UB# „JÅN;;VKžk$6Ðc/,èg‡‡­f2óÛIgQ{aðQÑ h?œD<{¨u>þØú‚\”œˆÍBážÞxC[}°«Kä+_1…?9iõ¥Ý]Õ1ÝݺÞѨ9& °¶·Õ`]¹bŽë©Szݤ­à #‹Aä¶ÒȤRª×ˆ™»Î?Œ²¼ñÆòé§ŸÊ?ù'ÿD!€ù‚åÆy‰FSâ÷wî¥!@瀦€L.‘0VMŸO ÍrîKwQ/1¤ʽV3´ðØ­­V˜*£3)’1pªÑ0yiÉ ¶W¯ÌqlÌèÀõg³¶!WVt3g2–¡‰ ô Å:R_ïyÆÑØçbðÁ ïìXAߥÿrE_ÊLF¿72¢Ç¸tI×9Ñ¿‘Óí鱦0<*ˆ/Aï ØljøŽFFT!ROû©·×žÈpðÀ_‰y–==ú™XÌæ50œ‡ÉŒCC6¬‡\4hH ‰ðDTáÂXˆ¼óŽ) èÅi ¥Áº^¼K‹Bã%eÅ®.#ñÐAaù'?þqkÚ„µ¥f od¤µ¦åRäóz/"¦ €Áƒúl®_WÅ;2b()¢\󀻞=kˆ¼bÑíðä©oѤ·²¢éMPw Ö˜vÉèÖÁA]Û«Wu=h8±w}{[¯“µÕóÎÍé=p¸Õ Pœž¶´Z$"òÿþŸÞ‡ SN¥´ÿcmÍt]äÔixGI=SK¡ÿ §ýèQ»ÿ }æ[[ú>ãÜ0ŠŽ9~7>nÄžì‡JE×(YY9ÄT&Ô,ººº¤§§GƉÁ¿`YY™—žž”tttîåw)$BŠÈ| òÍᰱꫫ–êìÔ‡ˆçÆFƒþaeź”Á»yVòÒ33æá9«[©ªåÆ kºc“቞s J¿n–…õ`˜õ Òƒô÷ÕýÒ’¥Á(ÞCŽM×=^úñãö’ÃG50 òþûªt˜òæ6»‰²ëÌ£n …t=y0^Dy(¶½®µ5£½ :ÀC†ÝUÄH]4 uš'ñÎ\´W½®ÿb(ГžÛÙ±y/ccêíÒ» ¢J)Ô8èІ–c(bNI£¡Ïú %Ø BH§uÝ!iŒÇÄocCŸÃÑ£¹îïWå¹²bùøîn=JÃ(¢ûø/`jDÊýý¦ü¹FC++¶§¡ß!¿zU×bhÈiÀ˜GG 92¢×˜N÷ï Ó"§§­ÖÔÓcѨKšk™ëÎÌRRD¸¯½¦×ATO1<Õû¤çÉï«kµ¼¬ïôø¸þ.¶¶€HD×È8 ·ãã6ZšBüð°±5ˆ`G¤ÈHfdÄfÁª¡V³Åü¼®Üèè!§sÿàƒä§?ý©\½zUúûûåôéÓåbææt"aGG瞇ã2lòòc¡Áe3ê C_h>s'î‰XÎ2¨L}P3,.Z„qåŠ ˜¡Œ¡M½½¶šMKuÑ@ÅùÜÙ4"’¶#êÁ»ÞÝmxh˜ÄSfN4÷FM…)v" †‚lþâ¢*Øra%&]Á ¡ÁAKc¤Rf™©=7gý°Ð‚6òùlM‰ž(ÀR0%DnE§/¢×º³£µ £äí)þÒoR¯z"48‡€Å¢¬è3 "ú} ðùD˜¼ìDÉVP…¸C 탌+ ƒÆ°¦±1=£RëuMÏP„f l4j#Wñ€a%€Ûëùçum°ôÑGzüÞÞÖÔ™ËǼn<øÑQ{‰„ÕwææD^zÉš8ˆ /-YÇx©¤ÎµI& ^¿n3ÐAÄd¼á>kPkôªœ9cõ4®…qÀ@Ãau˜ØƒÔJÝžÞcV˜"ˆ®úûÍH0§TÒ”,郎Ï?oà"ü¥¥Ö^5—§ucÃЗ8w~”7ìpÎD¼þúë¯G£Q‘×^{M¤§§ç±\̼$)éííܳ΄ÍPJ¸´ã++º¸x t-3G˜'^óŽ ²74da¼£>² SêÀ€¥. R$ …6CÄÒ@C¯_·ÍNÕÙiƒg@ª€æB‘Ñ $bu6×Õ«VÜO&fš&GfŒŒè9ÇÇ­3–â+èÐ!4æQ€1%bM’D*ô'át1ö(k(3( ÓŸ<éÈé¬†Ë ¤ kFíˆÈbnÎ";¢Tö]÷xûD©Œ¥ ãà ó„A?Ñ8©w­ÓÔ7Hž:e“ kÊÜ10 Ç@á6“6Zó)•ô9 é÷á»:~\Ÿ{³©ÏÙ¥"‡ÞcNÃ"Ôð™ŒÕÛ˜IÒÐ çÉï×=:9©×81a)Xš'™ºH4ï‘a¹lïÊÔ”9Yp|‚ŒFõpØžÃá’1bdÜáf++ÆmG3'5®±1ëp§†HT;nŸ‘×ü¼¡¬xÑM¬©8úÂúû‡”b>¯ï%³Y}VÏ>«kµºª5ÃééC<‘pzzZþëý¯róæM9räÈc«ÌÌÌKµª¤§Ç$!0uãÞ¹‚c:9îhT£‡ñqKmõö*ú¢»»u¸ ›³gõ!NMY±Bñ‘#†8¢êk˜¢T•´!2Þ¼K›A½A‘M!ð¨&õ ê##ÖÀHÑ’ºÉêjë<‘BÁfo€"‚·” !=üŒ÷…G ü÷…֑¤Hz{U!lmÙ$2ÂdŠñ¥WddÄzkؤå.^TÔŽˆqq¡„EŒÚ†á`D.@gËe=×à ®G:m  ]¡`cR™˜H„—HX·üü¼ñX ûiOö#‘,„Ï>«Ç»yÓà÷±˜®é&†ÄÅãÆØÀ$mI‚޹pA×vdDÏ=3c©MÂZ±¾n‘&cÀ‹‹ú{§O[í}zù²‰P¶ŒÛ¹°ƒ^ýõ׉„LLLÈÀÀÀc3"šÂêîNI&ÓÙÒÜE“‚3žÞ i w2üT¤*} è66L¹—Åñ€£Q}Ñ¡Äv©¶A;ƒŠb¨ …na:­/Xx® %{ë– BaSìî¶âc4ª?ú©oaÁ®ivÖ ¶³³Æ3„á gŽ×¥Èä¤Í¸•Å|mú70DÐì¯-‰KGN-†û ÉpwW¿³½­Ê^+ŠÕ¼¸(%úLðtñúET©Ò¬™y Ô™`fv1ýPzPã" !ÅG”æ²ïŽŽ- òê"¦¤k5ý>Ô6ׯ·®1ˆa](˜ZÍEÔÊè~n4ônn¸ôYo¯EbŒÄà  ‚ºzÕ©mHAéÒËÀûåó‰üð‡Ö¹M)³9€ÑÓ“CDŒ# ê3¯TT9BÑO¤ ¤—”b£¡û¸;ïëü¼± ,.ê:œ:e“#›ÁAÝknÎÒG´0 ¤»[¸ ã± EÞ|Ó¸½¨MQ'%»°¹i©ÂRÉ¢"ö ÎÄÑ£FIäGšŠK%5h4G éõ÷öŠ|ÿû­Â2@Z ÈôÀ€¢°FF©¹}É)óóó24”’±±Î½œr"aÍmðPáñ2X¨£C_ò¥%}á.^Ôã^ Š×Šb'7Ù×gTÔDT¹Ÿ8¡Ÿ'÷JÏž4EvÃP‘"™›ÓÏ>­¿Ãœ8Ñ:Ê–\j*Ù¬aÓYËlÖ<°ž=7Åth$PÒñ¸~ŸyÔ¥’^çø¸¡Ö€'S”ßÚ2@G‡¥ ]Úúñq}>ׯë3?sæ³°4àʊѱ\½ªQg<®Þ(³ÎéF¸.úˆŽ34ÛȈ¥éßèÚ5nÄ ïHDÿžVÅB} P(-¨í îè0è3#n€ÕlÚ+àìD€ rþ1`0h½#8J ÅxVêT«ú=œº»El^ µ„RIßfiôõµ:]gÎèµ?n†RKå*«uöôè½”J†¼â;0"u‡w‹ô&©":èAi1awisÓŒ3ȬRÉú<>øÀ"ùTÊ {(¤)FŸO¿ë–¥Óa :ºu˸Ï! ýÃÜp<žyFŸ1pvàí¤ÐHG®¬LËØØ!5 û"ùyEa…Ã{t~¿¾ø¼„"Ö—ñ ;DSo¯…ÉpeRQ…A³yc`‚££¦è?ùD½ºÌé®fl.]Öäœiî‰CêæÊãÅ¢X¿½­)$føýú"S;!Ÿ<8¨óÃÍXp}tàÂWÅ: šñ6ÏŠôi=”h#À tW*¶f¬©ˆ*À‘}áA1@ëéÑ V…½´d}%ɤ!w ê†o«P°^Ò_é´uÉz|Ž]V^àÌäÐò²¡ÈÀóÏÌèšðsW—EvLï£6² CÆu€ ¢w>%rÿ]]ÆZ°±aÃ̘ÁQ«é,M!ߺ¥kév–ùÄia-––ôopÂQT'R؂ɓD  ï¨÷ Ü®]SCÅ>™FmAc¶ÉISœÐÕPãõ€뺰 çc.É‘#­£w«U‹4y¦¤3™,É9ççõONZ!Ÿ´ÏÇë1i¼œ´~šO?5”S0hssÈ@ژ͔™aRÀ}a.€\‘ž2Pn““öŒ(α¬­Y{Ao¯ÍG@탔óêê!Fa=î‹@t¤m<Þ¹×T6?¯ðÔ)UÂëÈ«R”…@Í¥!pá®(_wÌÜœ!’8N6k$j¤[,?:4dp@¢ MD( š0(rñKK–öbŽé‹ÅEK ¹ŒÁ KPFtÓTåRØ—JzÚQ`§s–ñ×®ÙËÉÈY`Óä¦;:Ô;ƒ²›‰y¤DNœ°´Ñ©È¥%KÍÍ)X#+¢ ôôiƒ7S+ÚØ0ÃéÒЈéå6o<Ðk©T4O>1aM”õº*®£GõgÒfºi4›3)Ä‹õºÑ¤Ã=µ¼l}¤Gæç[g@Îú `yïjÕ:Ö@çÁ£;¿vdŸO½}P‰gÎØ;ÿÑ5¢Bˆ?aàAª˜ 8BD«~h© ¼ùK—t= 3¯ç"j[_oGFôó.Û7ûŽ/F@@Ñ‚Q¡0~íšð…1ãB=8p_ŸêR´»»"×®MË™3£{ä@YX˜—p8%óó{Ì™õjñHD S/bÈÂDŠgÔ5®^5¢³?´f)ò(}´Z¸Ò‰·r劥!Ü‘¨`õÅÄ1ÒxÙÕAY06¦‘ MIѨÁNÙÐÌ„ -cV³Y ÿ¡… +úncQK Ñ¢Gz/Òi«ÛÌÌXöƒR¸xQÓ'‰¬¨{ 2 ‘äì¬E|Çëg3]­-}áˆ@½€¨šŸoÅóþðCƒi‡BzíCCæù“*D3&,Ë33ö, ]l4,MWò‚î?¢Xø•à›ŠÅTãÀ@Ú 6„rYÉ ¦bÑž+ô;4¥` #h¢ƒ”ZY±ÆEjM¤Þ67m€ °ÖqvNŸ68òȈFtõSÇà«×õ9AÈL˜z)Þ3PŒè…#*LA¤ÞÍ=™N©kQëdM··µns옮ǵ5ãFûøc+~[F!“±L5¦RÉH6AÞÕjæ¼’F±{ Wˆž$ 4ï=Q‘ìêª1àÌѶ³c”@8¿‡…õ¸/™—ÎΔ=Ú¹ç  Â-”NëÃÝØ°Æ»ÕUK“”Jº‰xOU±hº­-Ý,`üÄT*YQØï³ÏZƒY(d¤„++–ö 8×C¡tfŒ†Å£¥ðJŠú †‰0tÍêjëü‡……VD^5ÄÏì¬z2èÖg^ýPb0Ïî!—ú%5Æ\ROthS—€ÌÎ5Êü¼®õìlëD¸ë×õ˜xÁ==Æ}†b¥@ÌÄCz>è±`(©†Q°óûuÀø'¦&†—Ñì«7IbPàk-S.›€fZÑJ2iÈ#þÃc%-ÅÌŠÖx²DRì-:ºI‰ÐX¢Š=>3£÷ëNìî6o6ˆ1´Sä±õ%Rîî¶ÚÚñã†Ð#åIÊKÄúB %\_W§šJÖšM¡_äA –HTŽ {ã­·ô™ßĤÁà+£ƒžzÜ¥KZÇŠ àÃíÎwáYðü:;u]D4}6œ" øÛ&&Œ†Æí£ŠÇõxn ô+üžÈ6—3²H> ÜÚ¯C´ÜÑ¡ûŠwØwq‰V Ô„È<);Ò›@—Y¨Yès:zÔê¤Ö‚Aý†–÷‚QȬaÖùÉ“–’ìèÐ00í Ý_¤¨áŽƒb‰çëh–—­ÆDó*ÍÁdLØ»¤å@QŽÙH]h‡ÔQóŠèw•…@Nê”ÍMKéˆØæ#¼Ãú‹˜Å¦'ƒ‡„!åÁÔ>áý/52aÔÅ}®ÆKÀ"ða}à8f2æR³ºqâ&&º\f¡ETÔ676<ï]enNQX¡PçІBòÀ€n¦hÔz:@E@–ž´!;è&x™@8U«–æ¡ypaÁ¼ÎõuU¤ø.Å;^€™Ý”×®é ™ÏëïP€Á ¦jðÁ­Ó9OÎÏwzZ_@(Þ)fS8{V7,Þ2Ðz>< &­ÑGŸƒu–– QF ý04Œ}ò‰zhßéz¦K˜f3úPþ4ŽŒØ½6›úŸ[3á™`,ÝnøñqSjé´ÞÃ⢡¦HIRœ…˜ï“OŒe—ü?Ô/ ÅâqU¢äóYë;Á9éíÕs-/ë½;ÖÚ@Êü œj܃Ġÿ†ZæÆ ëâ&òÁèŠXT‘LGDŸñ™3Æv i$´÷ ›¢ù/R¥ L{{»uæ|û8€\®u#)8 ¡šœ4Hðð°e ÐÖÍ}ã†þ<<¬ï‘MSÓ¤XåŠÎé8~\¯çÊýÞ+¯ }zZ#;‚‰ì“IËðŽxíT(èþ…Œmš!qµš¾÷Ì#Á™˜›3ÔY¿¡ñ@óU*ÆëÅó%-Èñwv,ʃj‡÷Va†É¤ÕWÖ×1ûã¾d~~^âñ”‹ZDïîÖð‘4ÑÆ†><@óóúÀ`¼Qà"Dï˜"7;kÚO>±0™f|¼×[·¬ˆ"È#èKˆR58¨®t¢6úòçrúy6‡ˆ¥Þ( ’Ÿ^^¶ú8rðûPnÌÎê±ðà‹XJƒ¿ñâQĤSýÆ ËóonZªØ23D,"„-9Ÿ×cà½1º—Æ-Š„„⑈ÑjÐÌ28j.×JéM#JH4)GÖ§"SŹ»«{„üüö¶>»PH"9p(òéwY]Ug€hÈï·€8.ƒƒVp§jörYŸ9F ÏulL4Eþ`ÐRlt¨]¬®ªÒ¾yÓœ¥±1½ÆéiU´ {Hgù|VÌ'r":…“HJ{ Ú'Oˆ%Ÿ×÷ÏC©²¼¬×»1Óînc7` ðqR¬Ÿ|bQÄꪮ;Ù˜‚鯚˜°õ"}‹é3 5B€k Þ.ÒG:;¦Ç%úÑc ëµ0»ݰ½m:ƒþ¨þ~=&õ¼XLמ‘Űb_Z²4m*epåÍMáX‘&d-飢g~þÓ¹?î‹@ffæÅïW/^ xüDB70ÝÍÍV„I¡`‘H#x¡°úÔTÒi56ÌI¾pÁÈÖ˜÷!¢Jlÿؘ*$æ £-#,™Úvë–z0/½¤.u ~ä{A‘›æXîœî‘½6·(f2ƒ¤wÔ “çèÖ…:„B)´ð¤hh8DÙT«ú6ðÀ€ÍNgðè%(°AÜ,/[ý‚^<@rÒ æfg-µG0hìÄ)PjÓ½¿¶fýÁ êìTã|3x±( cÜèø/ƒ®`E F´¾n} ö(š±1{&ŠU|…f2ú¼ÜÔf6kðSR¨¤eˆÄ¨¿aXHA‘“'-BAÚMaÒ[DýަG—r„È$XpìFF,ýF” ì~yÙÒ²¤:AûA+ þ±cúo¿õ¥Óú°53c©l8ÖhXú'´.u6j~Œ `4iRÖ¤äÑ£Æ<9iõ-æ¡àŒÑÀèó¬<Ñï°7™yô|cÃöçµkf¼ ôĹa4õÆÆ´Œ{䎲¸8/ÊÆKÃÑÑ£º©xᘻÝÕe–ºP°"ë•+Æ‹“ɤs~Þò—ôAÓƈ·ÉüØJáæGÓøÅLm~Gˆ % Š ô‰Kì˜NëïðJAÑÅ‹çL3—Óz‚ˆ^kµª¯§V³M ˆA9.5L¦¡s9Ï{ô¨Á;I€ßçe„ãIÄ©Ÿp¤ˆHNž´ÚQ¥bÄ(&?]…Ûˆâ}8¬ž<ÍšÀO#õÈ!ÈÑ{þÇle…Ho{[¿{ô¨pІKÝÜÚ2ˆ÷º¶`ûWV,º¢10Ÿ·ç vlLÏ93£ÇÈåŒ"†Q.9ó=òy›•±³cÊ+Ö뛚Rd=Ö RÏï·1¯"V8N§ Õ•Éèg¨¹@/Bœ†?Œ;—T JwmM¯óÜ9ëiâ9AOÂP1èáI?'Ú>9izg,›ÕŸ©- °EŒ×®»ÛzžX ÁƆuÓ¨ˆ±'õG‡†ÔBê”-4K~ü±=Cj'ô¨D£êpÂR6行çñèQ‹Øvw5ÂÓwë³ñ>î‹@æç祿?%{ðÁÞ^}™(´öÂ Ž¤]œ©”5“Á;ã¦h„£Ó£DA /†™ÀêÒh&bÅ;R(æ*“gŠ!a8üÿÛ»ÎÚXùIDATÛæµ&–ªrCÞéiû~µª×üÖ[ÖGòÁ¡˜ÐMH1´MlôgA^^¶\y8Ü:çœÁGׯ[­…ÆCø•®]3âDxªè˜›3/³^×B3÷Šüá‡FGF—©‹ ¢†‡ß 4üT¡®;r˜ƒ£Q½Ïþ~U¾¤8èHƘ‚®c0ã™/At4Þ—.éþd¨Jº®™ÿÅ]ê(RR¯++j··5šš›³>ˆgŸµ9&##6Kuì˜)Ùxܦ’kç~ˆ¢™˜yhÈ(z؇~¿5ëQKbvA‘S«K¥,ÂF‘ÃCÆLh}Hq’*>zTß‹tÚÞ3ººçætœ:eF›gœËéýC0zîœñår&X[3T& Ë0[Ó³ë;×Ý­×¼œšÐâ¢5qBÆ Jˆ/ý>¼ßÚ¹GÞ3ô¤ "úQoT'ÚCaÝUæææ¥·W¹°@½ÔëÖµ"&äçŧ° ‡¨Þ^ýò+Wôa ÚxOR,0²®­é ´ ¸ˆuÈž>m_h \>¬'tƒ} …TI»0ã`Ð\Àû~úSK¹;fùš™|p~ÞØlEZÓE4ì2çrºn““¦¡29yÒÂ{ÈøÀ½ÏÌX݆ëïî6¨- †Ì7‚7E³'ÔÕ.2M¢ô‰ àH'LfŒ·”˜¾8«^µ²bäzŒË%µ31aý¯ƒd BdA$„qš 2ê^`¯xîx9®»tÉ É‹‹ZOxúi½¿k×l–4)BÁÐ)SSš Õëg £Û„Æ:0ÓºùlV-9s¤Û™Œñµ\3]ܰ͊˜ÑuÖѡʬ\VƒÜßo)ÉhÔFÚRXØ1ççß Â¿JÅ” #Æûè#Uð„ëx`ôìîšb¥‹š~‰înóPAÇd³ÖYOgðؘê(}}ºŽ¼( IËÔëÆwDÍ€—[D•/ pZÕꪦ'I«I.-Yžš2© òÂóô ­ÇÛ‡ˆ.0È)óês9ëg  îó §‚b+>œÖýØ1#ø„‰~,h½¡Ø8rÄ&†fZÒg ¥ X„ÃjeE÷(Æ‚Èt[.§?Ó­ ‡õ÷ì'êFL]$j$%µ»kÝÜ]]F‹R((ò /Ÿ4±KÈžcá$£Ge|\ë I=ß¼iýÛÛVOb.<Ñ7{0ë6=­ŸŸš2’NÒn}kKßM8¨ººôü[[ú3]ß"ö/ç O'ŸoeFˆÅ¬ÿˆú%óR¨Ë‚¤í88h5U;]'ŽóÓ JƤ^7–äÙY¯ˆ~W™Õ$ÔœŒ;~•›ùŒmåaе91aJkxØÆ^ž:eJ6>ú7®^Ue:9i ¬W¯jÚ…â:¡+SÆ(Àô‘M¸õ²¾nQcX‰@€I2cÊ6ãæ¦~§«K¯÷«_5%AW7³8†‡­ï¢V3Î ‰x^³³ºv ¥˜Á:߸ÑÚ@þ–®æímSì Áâ3©TëHØRICÿŽ3BÐÐÐ{²°`ÑÓÔ”A& l¦§ÕèÀ…äN¯ûÿÏ`¤==fd(øÒgÑÕeëêQ./ë½Ó Ç}àMf³V³¢VÀÌ{Œ9{cÃÐÌ q==q¥;‰‘ ñˆêuU|Ì󨨰š3'˜_á²¼=AÞ‡qgÆó`µ^YÑße2z/GŽèç@Ïmlèg!\Ñcb¬Ãa­Ç¹½G™Œö.Ñ!~ê”1œ œ?{©”1œ;×:’AÄ Þ˜ Rµ²b ¾ímC©U*úž°à9np Qú8+@ÌÉŒÁÄ9Î?0 cDéO é[[úÞ’î¥>F–€g5;«ÈÉ“ž¹£,.ÎK,–¿¿S¶¶¬x×Ña!)=äXñÒiݨ„‹4Ì1„"7 w@·¶ô%¾~Ý u…‚yíɤ¾¬P‘ XÈÊÕtZ•2 €²;.¢QžR8lè•ùy£°èë34ÐÛÕUSJ`èi<ƒ3‹®\è€,^½ª†‹Â;ÍQ¬óè¨Ë]Æu èKzë–’!¼yÓR: žÈ=Ó• ûî®õPO ‡ËYîWDüDxÛ(˜ýìà ®ÝÒ’Íc'ŠèëSÇàèQ㈚5øu¿%%¥È^c¶ ΋ˆþíèQ=…oK{ÑœÖÕeõ'RŒD¾¤dZĬ&ÒÁ†‘¡‡I‹¤ýŠE£©a8Õúºþþ"erÕß9cC¬ŠE+Ô‚¤¨žÏë>†”wб¹—/˜å‚Ô£VQ¯ëþòùÔ)fKý ƒHýÍmTe¸ÃÝpP Ý—}}Æj ‘Iˆ¬ßؘ½C(|ž/©çjÕöc©Ãaã«‚òˆô¿Ç¸@㿺j œ[#X¤Nä2öù’Zv¡ÍÀ´ÓiÒÇ^'ú]åÚµyi4R²»Û¹WHGበXj©=0VµÙ4åíΤ^Y±”ÅLÆŽˆy%`ýiFDvnS“émŒó„Rf` Åõº¾4ÐZ Tf¡˜‚4^¤yããÆŸµºª÷›HX*íÈ=/Í›t7“Êd4Ê;qB×Ú–gž±~Wùf³6ß‚Žl¢¸TJ³)–—­öl³PÐkëêÒµ§ØH”À\õÑQõj7ƒa?p-.êñ¡çøPú37Çf»‘›ñÐÙ©ÊŸô/;Bm‡´à€wßmeQ€„®ˆ™ÁÕ7ül0.f¢)Ö¡!ƒ7³§ø}g§¥Þ@V‰ÍLµª†˜TÜèèíCº@{ñÌ€éâìó¦yãÇõÚ1¼°ëÒB>Ѷ s-}ãë§Á¯·×8¿ L¡8M„šê榡£HÁee2QÁF•^ pؘ˜®Iÿ °~ÈEIS6›zíôü 8„¬@ÜÙï;;"é´×‰~WYY™—DB />&ue³º±˜$X.ëïü~ë`†•wsÓF„ÒmÊp$&–PÔ¢1¨æo”J­Lš¥ñ&?ùÄ6´Ô@8}>›ª<ÍóôÓÖ¯Bž )uˆ! ]rɼ|éÛ* U„ˆ…òÌÛ€Ž„Â|*e†– …¶ºjTŠÒ¤Q`‘ˆÞÝ·§XTe@®ré’'IûMN T÷}ö¬*‡TÊÒIÔF€øNOëuÓ  _tÓ_¼hjŽÕÙi5˜‘EÄårFnG)´ó™ŒÞ'õhÖÕóMOÒêÓO NK“b  Ï€(b2|W ïvwõÞ€'ÌΗ©U†0áh0â×ÅAŸì¹œeÖíòe+êRåH¿)B"CfŒGßQs¢ßçæMKq‰èõ/.Ú¼Òœ€1h˜…ušwŸ^Œ6Æ âRR^"ýÿàu8Žѵ$ÊØØ0‡ÂmÐåù1‹!bNÒÜKó/Ž+ÑI:méëõu›!CíÑnH­ÏÎZ/›Ò2â™èû"[·æ%™LI½Þ)~¿y°™²±I]áí'6ÄžÜ2ch{{õANO¡}"æb––ôsxfÌa‡› ã½ùÙ³ª4ÆÆlfé$æMÐ;²±!ò ­³ÜÔpO¼w<ÍBÁR é´5÷A«ÆsÑ]ÌÆO&Õ(ÒéL2¹k×TIŒ[ê…:@o¯® ðBÖ€¯/jrRׂÔµ#·fm5DŒ¤TLQg³VT•Ú9ãzÝŽuäˆÑœ¸{ ¦J1¦ÐzÝȯ_7M¥ŒY%Z€R…fHR‡·k^¤RI¯ï­¹¸ÀhGnÝRåpýwã†~%§Q“:éz¦¡^·ŽxÎ3=m€ ¸Ï*$i%ýFŠC—}KÅ¢Íe¡exXß1ÐŽ³³ÆàBª‰lR““V¸…l é2g ØkÌíØÜ´çF$‹Jâ;àú6˜¦HÄC½‚ˆŠÚéÊŠ^'„¥¤«¨5‘Î¥FEzÒùpqLR•.ß›6_z(¬»ÊÌ̼ƒJ¦kjo¯ydgÎè"Œ˜gꀂÎÎÚç.\Ðÿ?rÄF‰蕹9K[¡„áÅ¡Ç/ñêU}ñèh…B„ÍJ³Òô´¾LDD px‰˜’B¹¸¨Ê‡Jêj+h˜¹9S¼Ä¤ó@ì€tòùô³¤×vvtmé†õ7›µ4 ÝÑ ù‚KèÊ3RÌ”(­¾ü~²ímmåŸÒؘ^Ô t@Þ1øjiÉæ)Ðà83c^é hÇ™Ú9$¹ú©)KM0çúhR ™ =iDÖ‰?6óøqkTd6G.§×°ºª×ðÜsæY_ZÒÚ ÀD¹4IâÈEC‰ÒhX$´Þ Uµj šPшX®¸k>¯ÏàÈpÏnçÿ榽S¥’ceÅÒ87§F*´q–„Á4qÁ¥õÁZéï×ÏÒ¼75¥qqQ¯‘æ(&ºHæBª¡HŽ×\.ë9|>}1‚A]‹ãÇm*"QŒ¨’ÿ…8Ÿ7Å05e‘M*¥Ç#ß̼s”ÐÙÉIý;Œº46úñq›¯Í¨zÝRL@@ÇÇm^y_jF"ú]pö T(4C<—ËY­*wz1èk ñî»AQŽ#M_tt  :eF™^"Xwþ:5)=^&càJͦÎñfxsaÞ{OSYÔƒ0P§ˆX¡zhÈCDÔPŽŒŒèõ\¹b#y]0H/(Ñ!_ìë³”})ÐÐÿJµ "DÍ…¹tõONÌ•)…"V òÛÙ±ÈrnÎÒ岞Ÿ¾ €Ô¬˜÷NÃ%u8šKá¿›µ(”š„ˆˆž@–Q¼îë³q Ô:\oŠ÷¬ Pqj"~žÆ`ÞGš€¹Çím‹Œ]âGπ܃ÌÎÎK³™’……Î=4 Þ=C„HÑpG˜þÓŸª89i^yã[·Ì“ƒ¼Ž´Ã™3VÆ ¥øµ¸h…rÐÀiÔßo³®¡Ma28n`Åǵ6¹]f0ô*Ÿ7Åšƒ¹&Å¢y¦xe•ŠÂëîn͵3©¯”æCjäšA…àÁë¿GŽèu Ù¬òSÄkkzÞÍM ÷#ý¬ÇxýäK%8D´‚a€òúu›µšÈçÓˆArïD¦Ìä¦Óšïnl¨ò˜šÒÏœ8a}8(Ïk×Ôë‡Ä°JE£%”2H>|NóóúÜ€r’¾ RK$¬G€I‘ˆpQܤ ð|I×$AŸ=Ju^ZÒó;f)^ÆàÒ7Cžˆö:,-ÙžÕk,—+‹AP 1¶¥’õXŒY݃FÒÉICH1^˜H‡TT(dÏ2›5ôµ7êB¼ƒî *wD3 P é$(cà½cÎN&#ŠE}nâ©å1ó£—0Ž3Œ ÑÇåË6 ‹õK šxw¤ûtié 6 ÙlVVWW%K b±( R©T$‰ÈÆÆ†är9Éçó’Ïç%“ÉH¡P …Bþ fÑh4¤ÙlÊêêª ©T*’Éd¤³³Sü~¿Ü¼©EôÉÉνáJ@åxùD¬^ÀÌŒ±1+¬ñð‡†Z•}  5†‡Õ ݸ¡EÕsçTQloë9À×£ÈªÒØ¨Ëú·…Sïˆ ‚Éç Ï.b ¤ÚòyóL:;íe÷ù,åëu>óŒ^Ó'ŸèZ0¹[^~f_çr6æT á6 (ãé0'¯ ñ yv¨­lÄHàÞ^ã$ÂØ±F|T Ȩ‘½/jôñ Ø„¶þ~=çÉ“ú7H™6‰"gÖꪥR)}^ "/¿lÈ¡K— z[/ f:úNž4dpÐrY¯^!ý¤H ‹ø@Êå²D"©Õjò/ÿå¿”Ó§OËÎή\º´,/¿¼+Á`¯twwî9‡†ôZ®]Så•Í- D¼0¤¥èŽž™Ñ‡‡Â ÝÐÙ©ÆclLSÀ1Æ5—Óó>­/ÇÖ–¾´xªÝÝj ðtgfD¾ô%=çò²5Òa67U½úª*WI“6bº"/!0Iîþ*a¿Õ@ç<û¬5Ò¼ºˆf1ò¬f³ÖiÎ ñöÛº633ú/Œ®SSºé/^Ôïç&ÅBî—Fo½%ò«¿ª×Lª€¾Ším5ˆ0ÏÌhSæW¿ªJ»»[#”7Šý++æ%9bˆ˜ ÔIÈfõ™=ªÇÓ>rÄ<ÙXL?i*êFÃÃúóæ¦>“dÒfȳg(”’2Ùdºwj@ÁñȳY3È  ‡‡uÿz‡õÿ76ôï@Î1Àœ‡®ç®.?ˆ‘Â<Ë‘3¼€7h¶s‹¼ÔYFí ƒJ‘:$阮.Ûwá°€"–µÅÜuR”0І’%"–O4(“Ú lṲ̀AX—BÄ ÚPÁÀÁGs¥ßosUèÅb¶ S<‰ú¡L¡§–wrd$Ò”ÙÙe©V·eccC|Ì™‘íímùÿþ¿ÿOvwwåÏþìÏÄï÷Ëææ¦ü·ÿößäþèäþÏÿ)ÑhTººº$NK>Ÿ—§Ÿ~Z.^¼(/½ô’œ8qBJ¥’ôôôÈ{ï½'ÝÝÝòñÇKGG‡øý~—óoþÍ£‰@ŠÅ¢\½zU¤^¯K"‘7ß|Sž{î99þ¼looËè訤R)ùÊW¾"étZ¥¯¯O¾óïÈÍ›7¥ÑhÈ;ï¼#¥RIÒé´ìîîÊøø¸ÌÎÎÊ /¼ ÃÃÃ2??-±XHÒéˆôõE%îØKaî¡k³»ÛH‰Ö×[‹[XðùykŒZY1¨âÖ–m°è ©éë3J>³ºjs”I«LMYŠáÙgõ8DØ{{O‹F¹‰ =$pt b Ý´««"ßûž¦&&ôo £º»-Ú&HÊlcCóá°ðÅ㪸¡Oa0Ñ I[°Î("Rj å)íõòe£taBÁ@ÆÎîîê µ:)£GõÿÁÄ3W(*Moxp¥’^#3Y66ô¼Ì¯žš2:؈0¤á°Õ‚@uÑ F‡qo¯ÍÙ|åŠ1× èíµ½›Ë$ OØò²îƒgž±&AxÒæçÍS§– ¬®*Ÿd2‰ÅbÒÑÑ!ù|^~åW~å®Ä×lº%ŸýåêÕ«róæM9yò¤¼ñÆòÏþÙ?“……yùå—¥X,Ê{ï½'ÙlVFGG%‰H:–ÑÑQYXX¡¡!I§ÓræÌéêê’p8,|ðˆˆ$ Y__—¯}ík’H$ä?xSšÍÒÑ1$GŽhMãÜ9‹(˜eþÉ'6ë|lLÍQÌÁþá2;0`4x¤%˜ß V^Ä;Ð).ûà=öÉ“j@L‚¡`í„|?s ææTðy°Þ„¸~¿È~d Or>ˆ$×Ö Bgïä$Ï^>à£ôˆ0ù ÏšéFÃè¶éŠÕÉŠî@«ÉI3Ä'OÚdÄ©)C͉˜R½yÓ¨òñÔ™ÅθTr礵R)#ÝãÚ £ˆ§§j{Û¢<"1Ô~€'‹èqÓŠP|Ïf-¢ŠÇ[0‘Ö`}ûûM..êÚv  léãÌŒöÌ¡nG˜-ÔAÐèÖ×g^þÊŠîÑçž3 & œ66Œ9x<‘'ý5ìMÒ+Œõíè°èBÄŒ Q aŒ„[W)‚¬«ËÆ+g³úÿ0cØ‹§Î³¢¸Ìþ*•ZŸ+mPÙ`zÿ"Æ„M- æfW@zaÜ1P°SëÀ‰ÙÙ±câ"‡SKpižÐtÀ1D%""?øÁä•W^‘®®.) ò“ŸüDzzzdeeE€LLLHgg§ŒÉÕ«WåÆ""ròäIYXXd2)•JE†©ÕjòÒK/I©T’R©$}ô‘LLLÈÊÊŠŒŽŽÊ3Ï<óh Òl6¥Ñhˆßïo §•üÃ?¼)ss'äµ×†dmMøK_²9ד“ºø Ö}Nqü½÷4Ê…ôzûmý÷ìY}ETÉ1e ’C(}ð*¬^ÐÊË/ëƒåüÉOôå„BäÚ5ý÷Ø1Ý}¤Ê V3%ƒï÷ëFž˜0”ù[:”ñÞ67õsð‰Ø±àGâ¥#· ßVOnÜ«Wõ3ÝÝzÞ3g,<†±OöØ1ó‚©süèGª„Ÿ~Z¯ƒˆƒ73«U<Ü3ÆÏö™gÌ ¥áíÔ)½Ÿ\Nï§§G¿ë „'©&}£¡×Ü×§Çgm–—õ¹’ö£ž¾ Ÿ¯•š\Ä@==†h"Euýº~n{[¿÷ÒK6r•{ŒŸ;Óø.ZZÜlZ^|zÚ¢(R(oØ Æ =EýÖ–:O nbH4¢#àîÅ¢MD ã`â¾@ñQ òöù¬‰•½æÎ¾KÍÂaK}E‹±v €Ð9޲Ïdl†=°w ×D ÇŽµÒæÐ¿ÂÞ‚Í›z(È)4¬ü8“1'ˆwkyÙ ù¼ë¤ŒÓ›†a„W‹H¦]67­Å0°ý ˆ+Ï O~B§/Pî …åóù>7ã!¢¥vvÆ eøpê"¶À †ºuKÚÎŽ*>r–ÐV`ÍGG–¨ŠbeáX¦û.L±4Æ--™Ç´¶¦›ûäIýÿ‹õ8©” ‚¢`Š"O$ZÇŽ†Ãê±ÃpJQ¾ZU#ê÷[Á{hȼ*ß禓ï&÷TDÿ¢„š˜lJÒ å²n0òª°^†Ã:ƒ ¯ÏKî¬r²€F jx)\ês3ͦ5Ò F-äâEýÜÉ“­]ñ:»Øæ$§wS8·Ñ§ YNý€††Œ{ \}:mÍ@Ø´½mÞSêJ%5¬t×ëúóĄѬ@‘LZ:l~^ - ‹¤mΞ5d ½6xµtÄƒŠ¢6‚~ò¤Í…¯ÕŒý8³ô) (÷O>±{¦ÉëæMëd?zÔ¼A溇Bºè°?zÔ ê'OùÏgÆo•Æ?Ò\PTÐ0ư+ éw¼)µ ¹4ûqÔ”ˆ0€¤ÓA Z§V³z°Xê0$ó<Ü1««6펱¹®ÔëæMcl†‡m)%þc¼@*eÔèËIµììõ4R¹ Ÿ›É*­\¶fM”7QéTÅáð७пƒqåQø ’ŠÅlØ`¢IEò¬ˆ˜_ÒlªçÙ‹XM6kPnÀœÎ,Ž "ލ‹Ÿ‰¢!x„Oë°É¡ë SwîÁAEÌ«ž˜Ð…|óM}ñya ýÛè¨)ΙCʇü;¹É¤nZ(—™ ¾³£…àÙYóö\‚¾lÖè)‘y¨ð’1‰®·×ˆûú4*`¶ÈÅ‹6§ìûì¬nb¦ÎU*F긻«½„ÄKKš.‚êÍ7ÍÛBù-,ˆ<ÿ¼Ÿ!\?K%CºQf<'MX ™b1C‰Ðu¼°`¨šåâqý;³ä3ë~§ LZƒ‡—Hl½®×94d{€0ž4k2®xbšÛ($“ ‚SltÔ¨8˜ŽwSI{Ð?@ ”Ë™—Í>A!á¥CHHQ”=H®ž¦HzŒ€²2º—ÚŸ§F„÷ÍšAí ™7œLê>ôû[§cÒ9NnuÕ"`fR$?OO”éÔ#ÉšàŒ¹ft\»(5cáÕãìA"IªÇÉí« bàwÂÝ‚:¤‡¨2S`†j{"¿ß ˆ `’ Ë Kc`*er#Y¤éÝèÔPˆžˆ¶——æRUöïËââÜòEÉüü¼d³));÷^*(Xp`yɤÑoðÀ 7|î9U&ã㪬wvŒ‰”½^×ïîìèçà–¢H„†;j++êCöñÇú²ƒGamm©XZ²±¬»»6¡ eå†ÖxZù¼\%<2¢/ÜÚš)Âe ´tì‡B =1†[:”ËekŒƒÒED_’Ý]õÐi„‚%·Òkkjü\èæéÓÖõ>>n‹ŽtHá:;?ˆw.gœZ|È(EÞJÅ(-˜ìà€1£ÌWDŸ#|jtŸs^ ê[CC­äî½ ðP–KKºg!ؤ^€Þæ^ttèߨo1[~eEÁÔ˜|ýJG‡5ÐÒ}>0`kCßÎ4õPÚ¸Ï#-¢ŸgøÚñãÖát4û¿ñ=Öø3h$"]<½ˆÈTÊ”3)8ÎEó+ íâÒŠ0³ÝŸp>÷žÔÅþF0ªfjãí #*èćic¿ZÉa‘CÌÎÎK­–’3g:÷º=ñ4†† ¡BQzÌ­¤¼P¨ŒÏd` óŠE›á Öþ™dR+ÞÏè¨A€]v\F²òBONZž¥KÑ}gÇ:–ý~ã†b¨i-¦Ñá-MMmöúºQ¦C:8=mh2#4ÕÓÕesˆ ¨ýpïͦÁD‰üHQÐTÆnl˜g”H˜wxá‚1W±4kïõ $‘° yŒ&uuœBé´QjC  óìþÑcR³B  €®œ|=Ù\±hiTÌšGÁ’ªB¹BGƒ2£ÀÌ=áu’þÀà"™pàf"ÚÆ…ú¨¹A4 5 ~ƉÅðñŒ‰ˆêE,5HM†&ó0ˆ®¨QÂUåöKp¿9ÏxùÌ•w Ì< ®“&LwT{íÔçX[×H£ØÇ†¾nzÊý1êFÜ»´ j8¼;.BÒíÿ ñ³= ^‚ãåvô“ú:H\Ú~†½gñ È=ȧŸÎK8œ’¾¾N¹u˺SIð²’ï9BŠfú>ÀgþjŒ(ü†KÁVÛ@Àrü¹œ¦Ï˜Î&#Ýqù²Q:@ûÝßo“Ñè<œ4¤ÎÄDë8P"à«é´åʤ¾ÿ¾ýÅï*w”.˜u¼_flPød ¡nˆDtÍ(¨G£Ö#ƒâJ$ÌX0"teÅzn¨­Ð¸†¡@Ó7 b—¤S˜ÃAꎚˆ,(Dˆ>iL¥¬k<¶._@ |`™ð£aH)ŒÓS"bQCè9m…€Í—ô ÊšÎ~À(RICÍ–ÖÃÓò’Láýí^5iE¨çI]á$à츟g°?£t‰Hx?Üž•váÙð= u?îGÈ]Cîz–k ]Vm÷^ݹêîus.Þ#·æÒnqb0ænjÓÒu|GÃi@UÆ6*3 Kj{[ Áp¥ÓºF£Ð?28hÓðèp>sÆHOž´F5z)D,óÔSª8fgJ3#˜{7¯½½­×Kñ•AÐ&Ð1;4$ò³Ÿégð¶NÒÏ0pHļ4¹þTʼñÙY{ÑážQÏœÙç®G„‡úì³z}‹‹ÆÕå$Ö€u1ƒÄÐ)<5wÍ ¼@¡à±..û1籚JmlÌ(+¸v"9©w-s(œC– ÿ©"è&xQ®D=4øRy„¥8š(†&tÔóYH é™pë)èH‰±.âMäî($wR † $Q.‘†»v8untÉ5±¶Ÿ›þ®w¿€à ïâ8ˆXZ°=ú€â…ýÃ5{)¬{ùùy …4…Eç.F% …©Y©¤J’9p儞‘ˆaäáüa´,›»ñ(]äpX°ôÍ10‡™éL\åtë–ž>¿_ë8Švã'bÊŽ¹Ó¼ð³³V_aöƒ‹HarCˆ\ ¼;w„ôÒü¼ÕcÝ‹ñ$½¹ÙJ×ÒFĨË1|P‰»é" ‰XZ’È“Þ “ôP,¥à;3cž<fZˆX'/ÛË2#‚¢V@úIÄjWÄöŠ‡Ï¬­™Âìì´!Wt™±ô¨;ˆ]Î3èmP¸ ®`6f½©± ÙwôÒ QX¤•ðŒ9°ÿA_áX ¸è]~œ~R>¤5LÐ}ÀLÞž¦!íIí²PعÅ};ý ×(µŸƒHËEWí—R¨·§“¢AÁ³Ÿö“ƒ¾+ÒŠ;¨Æã\Ä3 ÷ ·nÍK±˜’cÇ:÷èÌ Ù™³ * ¨XDÉÑÂÈ …ùn(ß}>ý[­fi™BÁÒtÈÒ£@ú``@7îü¼5}Q?'‰‹œ¾ˆ)t¦·¹ƒhðHèp±îl"ƒ§Ø7P¬@›‹iOFG‡yÿ0ðf2†‹Ç³‡xŽH‰Înšã¸'^(ŒH³iÅWú K¡·EAâ­âÁCZHꦷWg2"‚ÃÀÿó}‹ØÈs»çk÷ YgRl(RÒg[[†ãwÔ’èÀ³'­Ã¼X)¬ƒ®×m>D(d o.§û£Aw¾ˆHår¦hq˜ƒ‚·¾½­×L*åFÔç"’ˆX݉”¤šPöì37õÉD>€D¢nîŸýèÎùÞÏËv ¥;`ª=]—˜ˆQ£c0q&÷“vƒÑ^OâÞà;Û¯'ã qç~ì'FEw7!br£¹v9¬äPÕ@hÛߨ0†U }†¾X¤¤ðràÒ_\Ô¢04xÄž³gm´,0UЦtßâáÕë"¿ò+ú;>x“««ÊÔ;4dÈ …Ëåe=?\@„ìF R„‰‚¬@3EŒÎB¤µi Â, ójIÅÁ{EÕ××:l‹Æ?"5jB0ÓOz‰YÔ#È{onZg6MZ4D=j)'XS ûŠnÖjúPÈo9ßÌŒ<Ö\?ëS(XJ $ô! shCÁs-Ð^¬®ZˆôÖ–  ,¤@]ˆµrk¥’Üg(²¿· ó‚ˆH Á˜‹X¿L»²†*ÃUHDÖ.C-Æ‘nzC¾­ÁMžèˆ2Ñûh딨[ØÏ¸ ßUØÕEx³ˆJ¨ÛÜ©H°çÝÚ@ '´F÷#Éäá人›*BWx,¦ ÊP:BI›Œ·ò1±B:ý¢æ S'€·Ç ýá`ªVµfÁô7 Í ‘¯ÝÞu ½žþ~KÃÆ3Ú‡^¼K…›OÇ»£™‹—eè*^Ú™5rxX¤óD¬÷ÀíN¦[…Æ\ÈìøŽKÌ­85ê)¤ðèwAñ‚2²ù.Ôø̦ÏEŒ”qlLI´&bÝÑ®cFG¯^#šT'&,m†ÇÊìó±1;>“#I-ò¢g2j©7ä ’±Â>„~<#ziøÙU’\S6«ßƒÞßU¢8/Ü”(®Pÿq÷ûžÞ îü»{}ôñ¸N u Œ"ÑBv/ÞýÝXÈéxPiŸññ0Ç‚³j¿¦@¢µ»Æ÷»¿ûýÎaÿÃâÑ ›e€¥Ÿœ´IM#ó˜ø$æêªE4¼ ‰„þ Ýz±¨Š8!éÝ]›ÂÒ­-k¨ÚÜ4OÆ¿µ5Mm¹ycêäÿé•À³£ëW¤UŠèõà 슋Ê´ü=éÒ[„ô®ÑŽDÔø€â¡V°³£¿§€ {-Pe"8‘VæV(=\#Fê ¢-•²Ñª]Î*R("RŠ uDt¬¬X݈çÊ÷rB›Á\zÍ+¸A¤ëJ,fFZÄ®6^˜^¡ÆÆ;ÐgÂÃ¥%«7„€Í–^¾Y¯ZÍUV.Ñß„q±"æÀð;öÞ~ÐUH†<¨ÀLð(e¿ÆËG-¤ë+”öqÊ¡ œÀÓã%2' "&Ê¡ñúÝã€RqyøàC­T,‡O.Å(! ;4¨c:m¹òPH• ãOáç"W-bƒ™ŠE+Â5:ëèQC¹ÍO"ƬJ: zRGÔD »OÓÚÐuγ° ß¼©×Û0Âú (jÆÈ’óG¹“z£MO (úL¥K§pµj1ž½,íCíäŽ0÷BÖ‰ØÜ“þ~ƒÅº©Œññãú3ŠÚÍÙãI3ÓAÄ¢Bž#uëXŸvn-š$1¶Ô3\^Ħؑºm7VìymG´Ô”4¬ ‰|ÐŽL"Uæ žÎz¢èÙYÝCœy˜<=éÏG)úxûÉ~ëöy—Ç0XðåP]*m Ì}öGjchH coÛycÄÃ,tèÀóC;!ãö¶Ãá3"¯í>L¡Æ I‘Î`šÉH‘U*Ö±‰¨— Ó¬ˆrYA÷ :‰œ¶ˆ¡Ð UÆ—/·N*9%bQ5˜îîÛ1ê¼Àj\6Urý¼,<f7ÀT*i„V«Y÷=ði—ÛÇç³ÑÃæ¦­Uo¯¥aººôY2÷aò ^< 5H««Ö=O¡œt‘+ͦ^3ýÐÅ3ªWDn>¯Æ… 2ÉlÈZ0&›mU0֡Ѱé}û=‹v^&·˜ÜÞ· bi¯ö¿»4ðLµ ìí¿EF„á%Ÿuσñ¿Wq׆AqJ¨%ºç"ê}”öç]ä­÷$É¡Š@𔡯ƻFçóª„Æó)y^”5]žBiB$7Í”0X~ù>ÅH ô==¦Œ ½¦ãÇmâÊH‡b,Í^“Ói}AOœ°*Æb{[S)##Æ'Ä÷ ýJ”¾‡D¸¸¶¶ âJtE>ÚEoÁ»s§?6„ è÷¥áœDµšu¼·£ZÜ ifÔTˆnhhlŸºF# ¯ˆDÒiÝo%×Ñaˆ"WùŽŒ´"„ƒàŠXêÎ=?5$ ÚCC­{j(¸Ý㰶¦×À÷ÚÜ~¿s<ÁP"‘V—›Z¢¶u?âîI{®ír/_Ò€-ŠE½ö÷£·Æçž»}žø“"íµ•'A•,Þ*wÆ4Ó™MÑ"9¼AŠÏÔB ׃„1l<ÒR oÜ-µ w|©ˆ)³BA7,†Ž[G‡¥lð ï‚ô‹}<ó'Oêwàèb®:„‡®ap ™££zÏyÁh<ÛÖ)bœ\ù¼*BЦ®A)És¯J÷¼Ô­Ö×­O¡«Ëf Då²}Pt(Œ8†ÃíßڲȅèBÄö+®"‚Å-η#yH‰’–CñÒÏàÎwÉ ï&Ð{ì×Gì_ƒ`޹;ü~„Èñ^„ÆÏ»}†w¡V»c†à€t¾ögˆsãÉ'‡Ê€ ¤a8e–9#eQÜLùˆ1/­¯ÏÒ(ñ¸¾ÌxÖèɋəާRªäÍ(¸±@eãqC"Q‡!ýC±(1ý;;¦ì€SŽëwÝE0h\Z`ðÝú[F½ööêçÖ×Í Ò¹Mʉ.t ù¤Þ8¹tFŸâ=By¿^.sBPÇkýçN4Ѩ9?Q–ˆA‘»“ä¨{0®½ÓùNBdì‡dÂH¡xIû¹‘nûçïõü ´¢ˆ7á8 ^7)E îÃDn·ùa"éÃv]KU „b¬ˆÍN ñˆHwŒèK DRÄ D¤“›šJ¡ Æˆ$^RˆÝ@Ôp¿>ŸÖˆ &„Ð<<Ƥ¬ÃccºŽ==6¯”’;Û£ózÜÏÓæwDn—?Æj¿ïQ7BQX§.S/h;ŠînÄÑÞA±»{‰ØÚ±¹i}>íIß~R*Ó1½(¼÷" øîõów÷ZDöC­=¨Ð`{˜*OT•)•Œ3Š`aÁ”/Q(œ SíéQ%²´dÍ}‰„ÒH"¦)ÎÍéyQʈ KuQƒ6ß»½ã–°ˆÝ%ıoÞÔÔý©”Á;)¦1+rÎg:ܧ§õ?Ò;6¦Ý÷ô;*bÞ)? Ú~ÊÍõ´(°ŠXO@»`d÷+”‚Šs ­+Dm®ìÇaD i~¾5rߑϧNÇ Âæ¦Íqž¬vÆAo¿~"çö4ÊA׆¸<^îïö‹|’GUàÝïZîG¤‘îa…´ðAòE¡¨~åPbšwǃ¦›Ü;Xlr¶¥’uÓžËÙŒq¼Cõ…Ð@HNß%À±¢6yíHD¯ÃàzíÓרØá°FKúý©)½& –ü Êz3\Ð5¸);ŠøwŠ܈ëIU8]®@ñâ®ýÃDN÷#ª.ò â:yû­'.‡*!eàvî&F§AcŸK‡ÀÐ{(!˜±z T%t޺컳³6»Xl=G.gó@9Q¸„ \Ä& Y©ˆö(Ôòy ÌÀ)¼Ã“äÖnÚ½¹žûîAR«œÙçÓã}1¢ÝC¤à÷šÛsËÌáʃ½–âù~è-ž×Ah¢Rɦ5ŠXS'×u7ï,â ωnó'UÜ™"î<(¤öqȢƕ‡]šP=Q9t¯ˆÛüïÕÀ€¾ [[Vô¥Ø=6fýPj“u»ƒñÀ›Mk:CªU#ìê2…Ç÷1 îµ¹è¡ím=_;'Qµjˆ*·{—ŽìýdR_ŸM+9œØyÝðœt3¨Ý§X4´óåE åÄ}»ý í±#†ÆØîn½&úgüö;ÞAÅu„y.¤0JÙÝi_¹ó-®ã ë|’å^ ía’ûéÌ>¨PÞÞýþ°k€~ñDåP¦°ˆ(j5óà‰.ÆF’Ž ·ˆ›Ž¢Ybr¯Ç£Ÿ†ãPÏi¿vR\îÜ­ÀI4úy£i¼F´Ã#÷Ó™}Pjª½{ÿaåa %ïGšM9äè±Ce@`Wš²‚5óÈ£#È1QŽ\.UW)º#S).2( /öS ´Ú ³ÚyŠÐP­$‘ˆ~%Y(ØüXO]"C£A‡ø¶àƒàœ¬м\Vxð訃fÉýŒ•û;j5DZwÊ‹»ÝÁ^¨öžâù~÷ù øþ/‚8ï få~ µ°ç{eÍõäþå .ýýè×·4›"ͺýÿn^¤ñ™n«äE*Û">¿H£*RÜ FE*¹Ã¹w•å8¬¶ûyäíIg‘J‚"„"+ƒœØ„ò;v̨Ù)Ö3<‰kúëvÄ2sz?* ”bW—*׃å%b=ÈÖ–å¬Ý¡Cw ßá·b(Sw·ö~ ¨ÊåÛ©¼ö”Ü~EEwr?ÝÁ.S¯» ƒ¤SûA”9ž‚×ënÒN|x¿’ͳ²'÷&D÷²ß¾¨ôiáýö^£&Rß)çDšnŠº)R\©Æð°»#R-Š?kþ¬•D"ŸíÃFM$Ú+úŒÀ3>(í¹ñÓÃÙËr_¤éÜÏç»íg÷3îß}mO¶Ù¶ü.gðâKK]¸ù{=(Aüè‘Àhtt˜ŒÂw7#Ô⤉ôÚìs.</&´r÷¶Ú sí9Y—*½]r¿.D04ÏäL½Ì%/‰9é.ë0ǽýªât¯÷ ÏÓ´GwXt¢œ»~ûÑ’»ó3îWyÀ°z¯ò°ÑORñú°Èail65h|ÆXP)‹4¶Eje‘zE¤°ñYKÀ–hÊÉ/푽ôSSD|¢ÆÀç‰õ‰tt‰?Ó9¾€Hà.Š/°ßuÝ®kùÙýûmÇrN´ßg|÷ñ2Ý—™™™‘7ß|S^~ùe9{ö¬‹Eyë­·dccC~û·[þïÿý¿F¥\.K½^—R©$¿ñ¿!ÉdRâñ¸,//K4•Ÿþô§R¯×%ËÎÎŽüÖoý–ô~ö†Õë i4ŸåôÍ}vï‰YÌ0ë2½ ºo׫¼›âŠÅZ½ WéRcñû-ºI&­ßãNžÑAõ’ýd?åä v¿@‚ùÏ­ktvÞ9áA¯ë~å~Öa?ÙܼÝs‡…Ö%•¼_9¨IðóØzxäa:âï&®ÞlTEª%‘Ræ³T’O~iKqFDüŸíÃjY$Ö«Š=Ú#IŠtOˆtt«1ð?‚H³ÙlJ£Ñf³y›¢ÏçóòÿðÒÝÝ-¿ök¿&ÍfS>úè#ùàƒäw~çwä“O>‘\.'•JE:::dyyY¾üå/Ë©S§$H¥R‘b±( róæM’•••=Ý~¯r_$ Éâ⢄Ãa9{ö¬Äãq©×ë²¹¹)ù—)ßùÎwä[ßú–¬¬¬H z½.ÿù?ÿgÙØØ§Ÿ~Z¾÷½ïÉÄÄ„är9©V«200 ÙlVNž<)½½½²¹Yë×,##=rìØ)9~üÿoï\~Û(¿7þÌØcÇ·8—:×6mÓ¨—_CQÓЋZØÐ U,PÙ²AB,üìABT ‚X !•@ È·”F¤j¨ª^“4›8qìø>ã™ñÌoñÎk;©“8©SÛÉûY´¾NÞÄö<>çyÏ9½ëÖ6P£˜šç+ó 4=DO8+C]:£ÜP{jL¯ W7k¢•ûùåß8Eß…ŽÏ¥Ï¡í@¨x•šÔÏÓB‚ö«¥ÏP޵6¬l!Ï`γÖÿzÐ2ÄK0ó Ê"yœès)ðàn+Ëæ¼Vt`œ^ò8€‡ÛbOKQŒŽŽ"›ÍâÉ“'8yòdá>žç‘Ëå022‚W_}‚  ¹¹¡P£££¸|ù2Ž?ǃx<‡ÃŸ~ú W®\A{{;âñ8?~Œ]»v!NCE8Ȳ¼u’Íf!I$IÂ_|sçÎ! á7Þ@8F8ÆÜܺ»»qèÐ!ܼy±X @{÷îŻヒ––ŒŒŒ€ã8ìÛ·wîÜ)D^¯„£G ««ºÎ¯{2£u täl9hjÓQ®tž8±½Ús+¥tT,½^:wšÞVIƒ¸XŒ­dß 'WºE¹ÞvÒ0ªƒi10 KË£j>›y5ØDrÂ×Ur¿ÓGî³9‰(À$©&±‰‚ã‰xT#¥TK~ÿýw ÁgÕ'†X,I’°°°ƒ°Ùlp8…•¦iEªªÂívCUUpW8Ž¢(Èd2p»ÝH§Óðûý6ÛÝ€l5ÿûß:; l/;–´tγ¢ÛÖÚrJë8èìòrPQ©§Â±J…f;°Úün ÝÅUom½ëcä‰É X¼K–Ç`’(ÁÈ[°DvÑ­¬byÌJóÙæ$^ÅæøºÚGºu¬z¡®þü´ƒêjym:ªÔf+nÝ]I2YÜ=DSTk|èö_š"¢×kÙÊb'eå´À•ЂHF}@?sºBRGP„%Â`䄯eHô ˆä¶¼NÒFHDàé k=8¬looüha'QWBga”ƒ¶\O¥Š³-Ê Hé7ÙJÒåÆ`Òh$‘(¶Vgl ÖŸi;Rš2Ê«dçýúoèÄ€†AD ³@NúJpHÅí¥y•ˆƒè¤¶¢ÙìðX~ðBŒgÆ‹¥®N´ÃîZ¬7_z£Åe+ÚÒjc:÷z-X•ñ΢‘^ïÒŠg€D ¤hÌÔsÈD›@îçíÄ7Èóy;ð€o7 µáp¬¬¿i°^[Œç§®„ÎÌ^ ºë(“!äõŠÁ––Èî(Úd#é•}¹Êlà ·Wû[t>O|¶Mµ¾ ­ÞkÙ¼Ôx.EËèÁЈù¬+¤--XS³Äk × T@;$b@»8ò˜•…kLå¨+YÉZ•Æ4J mÉ›šÊë´Ê»m¡ËUfó|õѶ®¯Ÿí Û]¾íÁ«µ}©&«™ÏjФŽ8Ù9уC!ݤeI ‰·‘ðõ(A Q9GÚgpÌSbT‰ºµŠîh7ÝÒ1™åK#š´­XÕÆžnÅïM@2ª‹,¯?Pj-6úzÓ/f¾Ä[ŽDJœ\Íçˆ×ÀÛW7Ÿaž Žæ~²…uåÚê­–±½©{Y­=”¶/wÂ-×:¼Þai«­£_$ʵÙ^i>+K¤Iž’ ÿç­^J‚»øC%ÑÓg¥c»ŠÛT™ùÌhêJ@6Ò<­RA(WÐÇ`¬Åjæ³.“Ô‘%·—¶µÐ2%æ³åQ¸ÛHMƒk©a\%¢€âs™00•ºE©þ´/·›‰£È2Ú$&³¡j†¤“8žE9ó™§ì#-·9–¥¤VšÏLÛº—ky óÕª“7B2IÒ`¬’yûSj>ç5)¤­9êœõ¡+Ÿa’èÂeµŒ›Hê&3ŸŒJ¨+)¥´êüy`#JriLZùlš%m·A Ûž©|vO‚·“4’«uù±J+Ÿ9ž<ŽE ÆÆ©[aÕÉÛ“R:¯Y…m–©¬+D²‘’GÖ6U%AêÀÁ m·~r¹\å3dz¨ÁØJêV@v"TåüÌÚå…mFžÔ-˜1¤3kœ®BRH6'鞃 a8ÜÄcK&º+*Ÿ™ñÌ`ÔÛ^@©¢»ªœË®Ëjµ]h¤'ÓÙÌ“ˆ -1òi‡T’¡_Á4Hƒ™.Îjpx¬êhpï8ûró™ã-q(iÕÍDÁ`0ž¥®D“é¿€l€ˆ¡“ÈF°Z}¸wžNk[ªåÆ{ZpŠ¶Ã–_Á=[õÌ„Á`06OýGÁßô%‘@Nø¶MnÉåøæ4ƒÁ`0ªFýÈHÏÀ~Àá{þc1 ckaE ƒ±)˜€0 cS0a0 Ʀ`Â`0ŒMÁ„Á`0›‚ È ‹abb¢ÖËØ&&&‹Åj½Œª“H$ððáÃZ/£ê˜¦‰;wî@UÕZ/¥êd2Ü»w¯ÖËØQT$ ñxÓÓÓÐ4 Íf199‰p8 ]×±°°€ÙÙYÌÎÎÂ4MÄb1ÌÌÌ`rrétºpÃ0`Âá0æççF133ƒ|>_É2–L&ƒH$Rëel ‘H™L¦Ö˨:²,#×zUÇ4M<}úº®×z)U'—Ëann®ÖËx!äóyÌÌÌ  ¯ëÜÜ&&& ( ’É$"‘¦¦¦Íf¡ifgg155…ÙÙY†Qxžae?F*•Âôô4’ÉdE먨ä¿ÿþÃÏ?ÿŒK—.áå—_†a†®ëèééÁ·ß~‹ÁÁAD£Q¼ùæ›øòË/¡( š››qþüy$“Iôööbtt»víÂØØE(ŠÐuï½÷<]×111D"³QæÐ®Çq‡ÃXXX@sssá…Ûð<™™är9d³Ùmõš-.." áÁƒÛê53M³³³xðàDQ¬õrªJ"‘ÀÓ§Oqÿþýmó^Èk¶´´®¤uF2™Ä?üUUñÑGçyÄb1|õÕWxçwðÍ7ßÀårÁív£»»v»?þø#$IÂÐÐ8Y–0::Ц¦&ŒÃét‚çyôôôàƒ>Xwm H[[DQD4ÅÇÑÑÑX,†W^y¿þú+8ŽÇqèîîÆ¿ÿþ‹¥¥%œ9s‚ à믿†ÝnÇàà nܸݻwc~~Ç¡³³wîÜA6›9rsssÈår•,«aðûýðù|P¥ÖK©:}}}à8nÛ½fÜ–¯ÙÀÀxžßvi,Qqøðám÷^4M$©p› èêêÂøø8fff Š"Òé4öîÝ‹ééi„Ãa……x<är9Øl¶Â7¿ÖÖÖ-ù¾Hhn5›ÍÂï÷#NCEø|Û‹Æ0 ,..Âét¼9»ÝEQÐÚÚ žoÜ}'ÉdŠ¢Àív#™L¢©© ñx¼á?o©T v»ªªBUUH’„T*¿ßx<Ž––8eÆu ªªB–e8ND£Q477#‘HÀëõB–e8ø|¾BеïÍ õÂâ8¶-œ ;<<Œ«W¯âäÉ“¸téÒ ÿcT›ééi|ÿý÷H&“Èçó0 £ðFÿðñ{÷îZ/qÓ¤R)|ú駈D"p»Ý𦡥¥ü1ìöºj³V1øì³ÏpôèQŸÇåË—ñôéSx<$“Iˆ¢Y–188ذŸ7MÓðùçŸãÈ‘#¸}û6"‘œN'r¹œN'²Ù,Î;‡·Þz«ÖKÝ0ׯ_Ç?ÿüƒÓ§Oã?þ€ªªÈår°ÛíÈçóðz½øä“Oj*þuõ)§;³æççk½”ªàv»Áq‚Á ÆÆÆ it]‡ËåjøK###xøð!Òé4ÚÚÚÇáv»¡ª*òù|à H2™D"‘Àøø8¢Ñ(LÓD.—ƒ$IïL©G Ã@,ƒ,Ë…B$ ÑhMMM ýy.— ‹‹‹xòä R©Òé4@Ãÿ~~¿©T .— ‚ Àn·# -‹ôk½›®®>ågÏž…ÝnÇK/½Të¥TUU qøðaìÙ³‡<Ï#›Í¢§§§ÖË{.^ýutuu! !›Í" bqq­­­ ™. ôõõáÂ… ðz½“Ùét"‘H ¯¯¯ÖËÛ4v»¯¿þ:ÑÒÒ‚ùùytvv" U”ë®Wr¹ÚÛÛ!Š".^¼Y–á÷û‰DÐÑÑP(„ãÇ×z™›Â4Môõõ!bÿþýØ·oöïß`0ˆ¥¥%ø|¾eÆz-ØÂ`0 ¥qAƒÁ`Ô& ŒI"‘@&“A.—í[·Öì†N§166VxL:ÆÍ›7·}c=êÊa0^W®\ÓéÄ… ð÷ßÃáp`ttýýýˆD"hkkéS§Àqþúë¯BÎùîÝ»8qâ~ûí7x<ô÷÷×úWa0jÆŽD’$¤Ói$“ILNNBE|÷Ýwðz½ECCC‚Ýn‡®ë°Ùlxüø1®_¿ŽÞÞ^ð<Ï"ÆŽ‡™èŒI(Âøø8:;;qÿþ}tttê"dYFGGŽ;€lí½{÷.îÞ½‹£Gbaaƒƒƒ »]™Á¨L@ ƒ±)þøUXm“˜%tEXtdate:create2021-12-04T23:07:49+01:00É@ìT%tEXtdate:modify2021-12-04T23:07:49+01:00¸TèIEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/our_delay_base.png0000664000175000017500000010426714152763504022073 0ustar arvidarvid‰PNG  IHDR KF?É#PLTEÿÿÿ¾¾¾ ÿ |ÿ@ÍÀ°ÁÿÁ ¶ÍðÿðÍ·žÿÿÀÿÿ€ÿÀÀÿ pÿ `ÿ @ÿ€@€€€`ÿ€`À€@€€@€€Uk/P@Ý Ý”Óî‚îÿ¥ € õõܸ† ½·kðæŒé–zú€rÿEð€€ÿPÿ“ÎÑÿÿÿÿ‡ÎëÍ€p‹ÿ.‹W"‹"ÿdÿÿׯîîÿ¶ÁîÝ‚àÿÿðUð­Øæîð22ÿÿÿåååÌÌÌÀÀÀ³³³™™™fffMMM333@àÐÿÿ¥**ÿÔÿ€ÿ@€‹0`€À€ÿ€@ÿÀ AiáÈÈÀ@îîÀÿ€ÿÀÿ   ÿÿÿ//õtRNS@æØf IDATxœì] šë(¯Ì’´—»€öþWqÿ9‰A’~$éFõÍtl’©¶“óØ …BaQ<>m@¡P(| OP( ŸÂãÓ …§ðø´…B¡ð)<>m@¡P(| OP( ŸÂãÓ …§ðø´…B¡ð)<>m@¡P(| OP( ŸÂãÓ …§ðø´…B¡ð)<>m@¡P(| OP( ŸÂãÓÀÏ;üIÔ*ރǧ (,NmE€…/ÂãÓ@`áKñø´…¿€Ÿ;Û×ÿ???’ñ^…Ï‹û_Ö@VÜàG¡pŸ6 ðИÀ2VâÕ”e€#‹ —áñi –AYËèžW\üé顦¼"Àµx|Ú€Â@ŠÙy.WTÅ…Âõx|Ú€Â@’{¨’=OŠáÈBáZ<>m@á/€=°høÓ¶²ì!ˆº¸ñíñRA oÀãÓþ*’÷ëøýÁBáÍx|Ú€ÂÊ(â+|OP( ŸÂãÓ …§ðø´…B¡ð)<>m@¡P(| OP( ŸÂãÓ …§ðø´…B¡ð)<>m@¡P(| OP( ŸÂãÓ …§ð”‹ï*ýˆ¯°Ë¯·ãïsÖÚ …Â4ÞÆ;‘úLjÚÏT‚ð5õê' …Â4ÞÇ;œ1ÖûÕ’t‹ …Âq¼‡wC+óß|ë†ÈŸ±ÜmE¿|^( ·óÎ1ܤίτ”WP¿mÉ­`ý©T°P(HXV¸šw0 Ó¬!O¹{4š,2À±ÊB¡°RxŠw0³~˜H¹Uvèm·¿/, ’îàŒÇÈ®~‹Q"YÖ„ÍQW …Bß¼’w0Yû®£­"ÀB¡ á°Â…¼ƒñ¸Y>@`¡Pø+<Þ¯²°P(H …¿l÷xuéCCùx¿Ê"ÀBáþR …)dBèG??à/b„Ï@áÏ"Š …Â|j ®š‹=á¨,qñ I …)|Ê<2Î*uâãíx¼_e`¡p ûÃçÇÏþ±ÿ¯¿>±±:¼L¶k5÷¿¼®ñß Éò[•fQX(œÂ‹x$}é/ÀêŒÏ|al“RXUðe²Æ´Î×ÎF[`Šú² …,=O÷¿,!Ä(ÊŸaaBÈ#“è÷E|¼÷«,,NågûiåÙróúcëªÔì§mÍ"À$Š …SPÔõóÃÎFh7¯ìuämsÈ“yd`E€…Â)ؽèÏÖ˜hߨòM4P7“àmª-çûi}6Ùññv<Þ¯²°P8…|%yé`övEó"ÀB¡0…kCè`êvUsññv<Þ¯²°P8…¿BE€…Ba )„Š …Âl‰ùÜËíUA­“÷Cmâãíx¼_e`¡p 1C$@X)q±^ƒI¢°P8…ï Àú1„c(,NA…Pú—ä(¨VgÿËeê/Ëý„?†ð)ˆ¾ …d¹ßÚ0ßscgà«#½Ž•Ù¿2’ù1„"ÀE€…Â)88ü¥õå7VÑ!@A¦à (&À}), 9¸`;Çé“×mFœª¢*žB`¡p ‰-°JöPM¼Æü©+˜T³0"ÀBᢇ Ñ/ð‡ }+«¿Ë«¨òŸú1„Ã(,Na.„¦foÒPX(¦0B'ªà~ E€…Ba ? ¯.}h(ïWYX($Š …²(, Ë¢°P(,‹"ÀBáƒpÿáîÂ[PX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY }Ú€ÅQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …@ðj`¡PXE€…BaY …eQX(–E`¡PX_N€?ÿƒ8yþ÷ñRxŒpBˆÚE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡PXE€…BaY …eQX(~®ü ±"ÀB¡°,Š …²(¨ßç}7jÄ ŸD`¡PXE€…ÂoA¥Ë—£°P(,‹"ÀB¡°,Š …Âüýx`¡P8ƒ_Í„E€…BaY …eQX(–E`¡PXE€…BaY …eQX(–E`¡Pø"¼÷µÂ"ÀB¡°,Š …ÂïÆ‰¤±°PX ¿ú»k£°P(,‹"ÀB¡°,Š …²(,–ÆEwéÅ"ÀB¡°(¨°P(|‚ò¾ô²°P¸¿tƒø÷Q(P~Z(ü $C¹°P(,‹"ÀÂoF¥ìwàÝ£ú>}FS`¡Pø(>¹Š …€i¶°P(\€_t7‚™ZX(áQž‹"ÀB¡ð¥¸Ÿb‹ …²(,tü…=M!@M°ƒ"ÀÂעµp=Š ë 8´¢°P(܃_°ü …oÀ鲫*,þ4îæ•7ñÖejê`¡Pø½¸”q‹ ×ãÜûù%X|$Ãî_26E€…?‰Å™ÃAŠF`¡ð>]ôˆÚŠÿ]), sxÓJ¨ž …wa’ËÞ’&¿” …pßÞºTX(.ÁåDyHà ‘*.,þnÏÖ(ÿ}7ÜÑ), ŸÇGm“òV$ÀZ+=ÔÈ ñ׆hª?—<=:‚/ÁL`E,þ >MÈCý3’_Ÿàáy ߇Kyåh‹ëqÊõÄÄ?‰´ÖCßà$…_‹ßî>ãìëbÉçdxBÁõzR`á—á}tzìŸÞ8ißUœ8¤»°E€…oÇoÏ«þ4>59G~ µ),܉o%¯oµëWãÞA½FzÝ,~ ¾‰¥g~ìåðÛ2°àÞQ(,üI|y,‚Üß÷ å)gòÉE€…Â/Ä øc?xOóM)PWXø»x/KÛž°ñÃ$xÑÒ_Òêp"ÀBá·àÝŒw­¾7H£ð K¯N~[âbœHónÁkŦñîº,‹·ÍÝ79Ém9úÍÝé—®õ+ÏÓ}.,þ8&Xaúé‚ý~š¾HêsZË­(,V$­Aƒ?Û*ü;ø"Gý"Sþ<ô=þ™7–¯Tü1ñ3?}`QXø+øÛ´{èŸÏˆÚ£KÅF&_[‰«ãÒ\¯Š ÷°áwpl`…yçã'©ëÄ«‘à¶b?6¯=‡Œû­øó?ˆ“×鯓ç+³Í¥” Ì.ÆpÇY¦ÛAŸ=Üõ#W§ß‹LÉ-Q±UQ¬pï`<ââ§ }åŸä½Œ}˜z² îj¡p_Çj‡ :M‚×í¢G{Ü+¿u"®KV¸ƒw0cû…ˆf‡¶àG‘îß#À¯¸¯0âkQ£13,é¬íõûªoZV¸šw0#u¹ËïéÏžŠJ^Þmý±¸c ºPø~D_ðŸ•r¾ÎiÝb;ñü#ÑÆyD‚ÙàÞÁxŒ»ÄEp~}&¤\ ·`ÿh»ötXËøš8=ïs(É+¸Ï„ûžßS_´C/ïÍi é0ίàŒG\ìÒÉ×Mþ [à‚ôNïçéþÍÚMÑ)ÊjÕ¥­Ñ;ŒúKo±²äk6èEè«yã3Ò•ÒD6ªîIöê`!Âôw·¾þK™Fg•O²Üô£ßII¶zÇl9A.äŒÇÈ.q‹QÒD›š°9êjáoá–`¹HèÑîÕpDmhË9ófJp%l 3’ñ_¾x%ï`<åLñU(üf|I\ˆ›{5Ã'žD&œ»y7P—­î°ÂíJ7ËxþÍ0¾¿hÔî5õ+ÒØÑÝÄk1ÿÊálË }.-z¼_ee€oG~ÿs¿ŧl¸Qï/ùM›w}Š ¿ß@nyŒž,Ü(ýI—¨¸å= Ã(,ü¼+žNê1›°ôsßÑû†ðÖÛÞ'L°`JÙèÇE€…›ð ü §ƒén}¥ÑùšC²Þ ¼ž©|)Щ/×>Ó V4ï~#n Åo¢¤øåæwŒYæÎ®}Qù¸%'ú0nZXøbÜ’¸Ü¥÷è×Þ(³góò¯Åø]•s6½‰ôÏl«3:‹ Ãßx:|–ñnMp®køÑɺB9–QXø(>Ç— ;Úü ˆ_0–"Ž¿Ø ®˜¯"ÀÂ<ênÜÅÜ“ŠŠo ±Ã ×Ÿá£Ýì3o§ Ê­B·°ðk±0Ëy¹áÜpý‰Áþª]êx=Ž€:Ea`á}8÷¦ÚÛãûÎäêäCQäÇoGÞðäæ"Ñ“>3«­°ðY¼‹Öb=™Íå• p4®{Ã}Fç¹ aGͧòöá÷ÄÖ€íÄ£VE€…ß‹ü%Ùà¬ÂË}‡äì«uÓÜ.ã”8ýLc¾±¨"ÀBá gÇû%·½ð>ðìÙŠ ›Õ6|Œr\›,,|áKܼ0Â÷OÔ¹}`ËZŽçµôä¤w\ûÍCs€6Û'’½éBŒ"À¯Ä;8µ f_9§×:yg6Ù£SO©ð[pÜ.í͉ Þ¡6WOEb/wd§øž1ë6¦­VÒê?’v®‚·q齊Æq­þÌÊdB‚F£ õ)y®ÖÃ$œ\-ySñT…‰Zã¶}†Š·S÷dÿúý÷ã#ñÆð‚eœ^œ¸Ÿ¦¥\1¦N矷`ê¶±è#4f—’V@`¿!ªáØ.gºÞoÀ«RŒ¸0ؾ'ž%ÌO…Þ3N±Ânk1ÈCžÄwˆ«Ñ*ò:-,Œ@ðð˜€Äåt 0^õ£¬v9kÛ;ö˜0'f~éŽYíKœÿ@)T:cJà—ÃÙjý–Œêjäûü©é¡g—1ÈÇÚçpúW¥.êÑ¡Žq¶÷&¨ð—âF¯=xGˆðåâÂh˜ï²hæ¹BÌSˆ.mõ„Õ&]Þš»ÒÄÖ£ð7â-Þ(AËé7å ð8ÄXîT_ï¨)ÉŸš¯ëâ„ú‹ NzÆ/#‚“8ÒÛ™üéF3Biço.y-§Y &Ù´3Y×HÅA˜ ι_é ’Û!Í™Žk^ˆ/Þœ¼×wŒ!6%ëHµLÚq  øŒÎcvìÍf÷m{¡°p'æ=ýtF’¬Iøä6•1bÐ¥‡ÒÌÁ¶³¹¬½ëzÚÐÁ2”’$ì¦Gàjr?/¬'+]ÓÉ{†êÀ¶çPÎ7®N ÑõæK¯áåï/œÙÏ#)ªÜ''-qEüžüû<.N]>44W¨ýÆ›úGË‚Š†~‰ý÷…8–½i0WE,4$î®]’[¯|C{OÞXnK:®Z>ÎÓÃ@f¢O©¬3“¸:/ éÛ ±Ñ¦;WÁ—ÿþÞŽ#“üËÜ~IU»sz¦Hi ú›cGá¾é²Ò@œ½äÜ¿ôÅ^±~ÈÛ¦v%'S*,, ÷8™—Eó¥´$ãƒBa–nÆ¿{s€Ä†Äo‡F –2~»ƒCW¸"ô"ù•ùgî;Z”ZOÀ œÀËù×d>О!\r÷òTã¹ÍÂa›V$Àëïj]·«ÿöA™½Su:㘨öqv:ÿÄdKg+{wìù'òN¨œe¼kàœž·7…Ò%aÿ1öìêÞ'ô:L_“ò¼Ûd®Ä#Óu…B¼BšHýÂ;éÙµ°a4ßÎ$—à}YÒ©è¾±NxÝF{`›Êý%ãpö¾Àd{²G×â!-£J~9¶ÝT)üƒ˜¦®ûé¦ï>º†dˆxä+¤£·©¦Úͦ}oˆ0‘1™o¿$vнJ;ˆ›Ü.F€_)7à@¿Î Å•yPÖL³ß3ïg³µ~a”Ǿ ³ õRÂx‚fiI³ý€KçVSE¹ÿ>#À†ÑÒr>b®9,í÷Ä5ˆÝ »4¼å5Š/–ti«CwØÜ¢(;9'áýÆ9ɹ ÷FW%À_Š”Ã\pë*Û`X㎠'â‘Ìaxej{vĨÖÛON“áÁ¸11†šÏ®d©ÖFÌ\), X^ÈVÏ62†ÙÆÙdäÒœy˜…¡Pd×ÃÝ\j«÷‰-Ù$5Ç)9*¢¦ÍŒHòÒ"À_ˆß¾óÀ¨«¹ü×I×0`-ah»r“u®¹I“Ú&juNbEèÄÕÁrP²mpU™h“‘w˜'Š3H­ÆoÃ`Ïä_›)¿£å9U³tp< /Ÿ$å'GÝÙ€·£#†HwÙÈ œéä|“®2ÇÌ\F„)F•1"àÏ~©ð(ná·‘Ëp±….fÕáöiJÐQ´NÔÞ º¡²ù~ú Ûÿ½!qé?„y ‚U`nÃŒ«0–S]ø“Fã ¯m:\Ò§*Çé[1Hì²CtUZË =;î¹+!kÚôvJÓ—#ÇX¹0ÄWÄÙa#÷T®Äi±3;¸Ë Â)µûM §3ÂR+„£É¡¬ìLIË}^š[œÚ¤UÕ¹=Å‹? ä°ø‚¹œúšÔAªxçþþ+™¸x {¢ÙtÞ”`’ú™ Š…d’?Gi`K6¥„™ãâx6øÞ¼s‹Û7À‹ÁÙöz…?`Ãw›·Õ…ƺ2½ÁÜlÆw¾¡žóšëù<º'º¢lq|â»Ãc„Û­Ï'7è³Ëö¥ªïè‡Ý˜^nˆÇ%~9‚Çî—+ÏöB-(“¡Ø gׯþØXŒ­L€—¸þÛ©ó›¸:gËÑ<0ÍyN´ 9b 3Yâ­ƒícÒ Oç¨apgåÌZ2·k•'=Ù#>>>… '£‰à0Ìfk |.$£©]NBÂñf3>>)þnòvè%V›Ucx«ilW¢å LÊ2©˜oô9+;ña ¤+ «ÎéDR‹Ç8åKïÑy…ˆùi zBóͼ¥d˜3¹wŸÜl WãgÇ©®ó€–ä$:žùƒpt„j"¦!3¶˜»ÓDfX¤c¦ñ-»ÏËØäT‡Þ˜¥þkz»»dC¤s¢fÒìÌÄæ.-öªÝ¾(ÔF±&,sU35`n.X²§`1̯h˜¹å0%ó”{ ÊnÄ1Þ©-ÈL!}‰:óu¯ó›Ð©]åü"Qè–C§ÊèÔJg+/F€A‚|éæoã3¤w :kÖYóqûw±m.o&ó÷:œbIpWn˜¹&¼ú7zü­ Ò•Úq\»(+’l9X¾¥¤Änì—u^¨®>–#Àwàâɾ-€cgmHQì²WªVNµ=l+¹'c©–ùÛP¡ò †_ݬ4¿º·*-q»æ;Å´@ÓŸE€÷¥j³nô椪sl0—#/—³º—z´„û§há`7ø-˜TŽ5…3“쬵Ó•/æÀ–qþyÈ¢0U‡I³iUø1xSžqBÇä¹Å †óRÝHe¶ììZ`LÒÑ2¹Ã‹¨3 Ö#æ ÁIÈËŽÃqsëúö§Ûq& ò\äó!ûËd–õýŸK& ÷‰êñ…S8 í͉äÞ¶‡_ZœOÊš’èfÅ!›ÍÅ’ÊQ†®4»Îe $XóU”ûÎ9 $b—ýA£~@¶Þ^ðoúeãSg`S1é_FF|ÁM¬ÏÉò^ëĦ$Wõì€f«Ë·ÃòDŠÖP²å*)]ÉŠ'ü -güvM/uì§fƒé̹—™æîËg€ß•ÝSý=‘yŠpÈeHX^Pûô\B0#¹ ã‰4xtnùx ¼›Ós}´O#¦“`¸ŽŒNæóâܨN2(&íI ôÅèQLåPKHSG‰ 2â•Щ¢[£…ñJyH~ŽßØ&ûcÛt—á\"dVãLuèl­Bà8K_Ý®Ï~Þ,éJ•©{ìÙŒn¾‹ƒžIs°äxÜÌî5WGÔ·)É¿þ—yG bÌÕ£«ƒÖ‘€ÿÔŒXXgaü@pÏ€”f™£QÍYÉw58´® ®l•–8Ÿ“z 4” lÓ¹P×–9á‹Äz¦½Œeé¶Í ›p»IKà5pfh¼æ‹@Õß!y‡é$‹~â<»¶C"ß?±1‰*Ç„G™ASiÜ8Ú&úýŒ4ÿÛqåi»ŸÂ 1xÛ½1lQÃõÆ1t9ÎÙ’J0ÄÕ7s©õ`˜úLÐÆðb£|/› Y~Ò—:É9_¨MìДçü[BÀ²$úW5bZ~kaROïÂØ”ÿ*®L€×äc‰VùÅ ¸¼—è'ôqN<”e 3)NT×y”9²` ^RêœGüÃ>øBX;Ld~~—&×%SÒP¼™˜EÒÆŸ´lUïãIkàûqì‹æÓmvg Ÿ]ŽÀ”‚‡Aa"I‘õgmP~ó (sB×+´5ÇÏ<·ÿÄë²Ý΀òÁö–4f¾ä¹å{ç_=%6&ÝçùÛ¤[Ÿt²{¶ù!6—RøeƒtQ›+’Î8oŒÇ§aÞQeZ|ü³+à_b’@ææÈÃÉšŸö>³=˜*[ËÝÕfa<óg³§ù¼ŒÐªs=M_,qÐw2Awk;ŠP¢ vÔ8EõÓ@§:JlÜ%Cñ…µ•ä°œÈÙ={fªŒ•±Ð]ÑýÐï7ê•Pv ¡Û²-L€ò‘s:ÆÞ•Zj×>äÜœžV€—÷Í:yNØTò„•F ˜ÁÉÒi§ ÞýØë ÅéÂàþ©gœ9Fv”w#…OI[ˆÙ¡kj³Ø›Í´Ù€Îˆúm/©“–&@wüÌô$Û呌£·`Ê”ÌIu³•‹âìÃ^ªX>x IDAT8?Ѐ­ÐÌ|qô•1ÜTP;RîHõhÑežö`ÁÓS;¬ ZoTsÓoå<þLÅ=ä‹Ñ¶$ÎFÉäãR ƒIy©WÆ´|]'eš’‘ÓŽÂ×Ëò†‚“¢ñVö<÷åÿ#µNéãø:ûù¦[vn½«r¨HNÒš8‚§ºd-y àw’µ‰*0ëÌP®1Óåa¥o˹ ‰?ά Ð=ÉS ÞXÔèE#Ài£gD^%#PÖùø=À÷aüàåˆ3,PsJlXf<ðŠ^©Ž`ŸQP3*~Œ“1"Aê.·þX•|J_¶›úÈ,Ó L%í©OHúª²ƒ±µdNßpÇÌÞ—Šeà9+ é„ãBi¶Á…D,ÇN¦ž³5d´$è$_$¸}Íb'Ø&_å ‹T2uaO­T’E溔ɀ$/2ãTBHH!\ýÕÆv·B· )˜Ï"c¾” ÞŸ'ÀŸwqü=À á„˜Á “Cf¸ë¦Sÿµ§#²°¥3Ü~좮ËìÐùS­¹‡Wœ*‰8̬1õ÷(ñàû_h …“­£Äl›zc^|À. KܱÁ,å¶²‚w*÷{˜±è/È~>ùDÁw†\ e䤿µá[üèdC¾’¶}š±ÌÚé;ä™±^¿…i‘¢+–†§|bŠÚæÏˆ·6úÄ“Ò Â_Ëa?à ‡†*sÙô¶+>»ñìÌþžB7›Ð䯉?ž ¿°|žÿûì1®$O òV&Wà󆸋²­7+9•wDróðаî?59h„zÉN%LSÀÉ•Sšü+;>"ƒtÊtŒKðn*(5®ù¤ÆY4ÐzAEï†Æà»öÀ5üΊ3lz€yúèµlëG/V5ü"> )2ãìš‘ËP\õ ¾âW’ÖFk’ ¢ `¸ u®SB'úén ä ^6ïb(»¤¼8h̨zbñ0ÿFˆ¬ùyü·~‡Ê?ˆš›¼mz“&ŒbnÄ'öúq ,e¯§Tõ,^OJ÷ (ÐÂ]ªÇ„ëóʘäL$’>·´ÆÝ!}ÅlJC®@…ÑWySÜ-¥.~UÔFCm­›+—%a4ì=}~ä!\=Á•K˜ bNò]v$äÈ5½4ÌêÅ â‰;5Lš‘öäeœym* .Dc¡u!â Þ*úíþk„·õlåÐpÔD½¾[Âþ²b§ÇâÙúç ðmøxhÖSAg½ › ÕÛóužÕfÖ„i2S2ëù´IA('©i,ŸG¥|"Ô7á3êÄ Ö‚¿¹@ù驯¾Íη$´§ºÛ›÷ÅÑpòÓàû¾ œS2^'å§]–ò Bõ¨,/ê?ÓiwWˆŒj[eøƒÌñu9Icµ¡v‘?Üyr%nr€Ì^¿ü¢ôYÀ§P¤K¡Àâב(Ï.C@ |":?Ø£ ¡`ÈM¡f€) =Ó†nEÄ˃72šªŸ×¼ÌX½Ž~ÿöø•âŸÅD‘zdÜ.K:‰r˜z°iS_c64£´y4ÉË^*VR-bÓ]ux(·ÐÒ{uõ…ˆ)¥Ú†="uï¥FÖgİ'#Ý¿±A+&߈c\«v}ˆ1£ïRzÆlÒSSnþq|þë* wjð<ú47ž·€¡ŠäÔˆÞ€#g‘`QWu»ÊãÀëÑæd-IA}Çlo;¹!.k÷z8 •/nÜUbž—J6\ÍÒyènX¨ˆøÇîÆX '!^LFÿP&JõÄï6,F€G—¯ùÑa2wÕ.ŒÔ$% •?Qqc#5Á) T(¯GÐ7f´àÄ ™BÉTŠL™Í< ðbI¦&R@ª…) g^Ï–¦X­ý|cã¡ð#ö \•IJ¿pš=FÑJI &¥Ì&ÖÍ6\©_â¶€1Õ¦—æeÁ¢²ÿΟ0âLw²”PnÔh`É(ƒKÑëH²Â¥„⑪Õ-Ðæ{ڵО”aÁàò•ÐGFœÐ]·h7ÒæsãZ ]ârÄdO=ŒØD¨ H—Dl‘¼ªÈþMN¼Ž<±Ä¸Ûp6(Fc­»«TËœä0øB½±²òµ‹ y¿vàh6ƒBÊèHLcLmý(™3'Ç'Ä#Uˤ”»¶ž˜¾²ÔfÁnë%À9ÕÿØ_P°…Sœ ù#5r]ã›.¤+Ëdž,tª“zК3’}túcUpÓX#ô~nÚMô¯4h—–">q)Èð–/ÈŽ”!“ºWQôhùJ‰á2ÍèÒ–´âÿñ6¸’pBrYØ 52£³ÿá­W”vÚû‹,~6wˆå  ñàªÞóx"«¯AäÜŠˆ³FhÃlí­•X‘ôvæqþ·A#‘c†ÂÑ 'Äž |üüNœZr²_hE`8ÂY¢?Æ2'^$ÅÚÕ®KЖ[nÇîå¾.V•dMêÿëåÅ´–7[^'ïz4ªñØ~~~î§Û§&xU­n¹w>j,†Q3$×ÛD­Œ¥åDEE¾=»ßª_ó­UÜS8sÎ{½ã¸§~• .cïâyÕå4Á+ bö¾g/“>Ú Hùµ$FD²ªrÀˆ¢›þû9(Èð\mú+XûÏàÛþet_IŸ¬„ï öpè½ó¡Xo•55rÖvÀ¥ÌIÅ~–L¥”ºÈˆ×ŒÇ46±?“—zà8Ñl/[FÝ$Q¾p̼é©+¬pLb&c¯ÂsˆÌ1ŠI&\Ug†Š^”©+{wŠB)¢ç:Š|©ûi F8õgÙ@´t&ÆDòeA±!¨…šØG Á¿à{>HQmñßHÂ1® H¬ªÈ­pÛDÀ½³ŒP@öVúÈ[I?Ó7ËŽž,ɽ$ú´ŸÙ§÷ĨªU‘ü_ êK¸¿òЮÉðÄç pòËÇ1ʽÓI¾s}T3s T×S­¡L]fŸ€‰P ·üå™%)I׌Çm@ï¼°A‹ÀŠãL·]Éÿª+|‘wS [ÝPO€oCëªYáÚÐicøÐ79•¶A®™?‡Äç­Ñßó¯’>pð² ÒÌ‹_ñƒq«$(_—ãñ©¾N-´2tt¥@ˆ®¨çл«+·UÐr çÆ°Ný¢„*Ó6}lªiBÈji*5tߦv'NMðŸ'À/Ø7ÄK–ªåWEÛÚµŸ&ÖÙ;ciØsW4"=<µïyJÍ·Ø KÖL²¯æM’¹fÎÄ ó‹£$Ùƒé¾Ø…A‚ú·-£kŠì?¬Äëût­»Rùñ&y4l¹~„—yl¤k’ô BÇO|œ¿áà Þ}fg‚’«Ë0‚·æíÖ‘â²z^ í>Åùvj …É ö~;hëj0ÿ³!+a•áé^à)eNd;¦AµÁ˜#õ ÅÔnÞ€:¯ó ¼Ø³f™ŠÈbÑRT°×åo À7©ü1CéM^%#$f7ø‡žm,ÇÌÙ>DmÇeü‚¿‘ÍAPºUP97ÁÀS‹C´ÙËp 0:üQÞÅ °M'ý*Ë{å]Ìs3\ÿX©?ðɬ·¤´«½™o£Sù.0ž*sqåô;'“¨Æ„d›>N€oz z›êê<¶ê^ˆŒ¾ZrÿôümëUym}òƒvî颯[Èx˜nï›BˆüæŠ@ˆôûìÛ¶ƒJN7PHù"…¡F¡“µÖ„ B×Ú° g²Ýòx>¶•߯älʆÙa9iÔ€åƒ"å¶ïÑà»·À³Ôt&bÌÂ6' .—9² ‚Zªàp–ÐýÔ[½¡~´,‡êüR×;A¸, fBFí~ä|¥Ë0>\LÚ’ÁéÏûñ­„Ù¯µ›¾¦ ¸-R?2}rmãì2d*áᜠí-ôê±ÿº"< OÚµy{¯A»úbh=ŒÁ›T8Âú˜äŸK$ü—jm©äPë_voÊp®†KGß%Óí[u7b»È‘$e V½†PûKžµj x¯ZkµwM¾ö!çÆ¦¸àLÀÀz+%òvÕ@—i×V -Ý𬫲ö¿Ï ûÕûñOI÷έ„áqB8ë®833CçaçvEní¬¨Ïî›|í`Øwáñ¾PÐ äZheÌÎ\°ê(©ÖØátj](O >À7«Û’e-o¢ˆ±®q&@!˜•%‰Úõª×^R㼤·î4È$ÕVRwÙÌäsQ¯wwV#@ˆ`ÔhãÓ2+O0w:°Ô±ª‘`Q*åµÊ‡Å„a¤Õ'žEÝG=Gµ=MÑ|=TÁ¾sì6‡6Ð.y¿áÇŒ‰äö–Vxß æÜQ…åðCþ/QÌ´x°5IúJåõîûýõBå~Ý= ;+>fÎÏdc»Œ›‹ ßÿ¼Í ùcÃЗ®gª ÜŸì›™ÿ,qE1—¡¥?¢¦‰m·8Æ`¥˜jm¢¯ÉSQnaùFÊjx·!s‹ ó*Ͷ½î¦ÁxTRoà*å mT;ÚÌ,ên"Qä;ˆn„($°~s0lö7ìÉ®•'Àx3Š„ãß',õ˜RyN[Íà\³·ÄpxÈ܇Øu) ’©¸ äHÈ—½¾:þãT—Ñ?ÕŒ¢©ÑÄ8tn¦Ä¡e>ìxÓ1 ?wÌ’J] ‚¡õ—/o$câ"Mí/C! Ú0‰ì–\¬™Y80¢@`‰‰¯Õ¿+ßA€oø9,øâÎ$hSWLÄUy"˜£Œ~OŠ0½AnÀd%(_Ò«+Ù>ëÓ¯ŽôFx)ˆ´›KŽ90@J½^É‘§ó íêüÅËÆv¸w‡/9¬Ú†B8á5ùi¸Í±ÌÑÈク”íÉB½;ç‡ ðêÙ‹ÐÛ†çeÛÐðzn/š~'ðà„'+±«ðÈfà7îãÔÄÓÌ.8Fàs«£#‰T;iŸžsÒWL ¾¸ð¿.ÝÝ`ÇlÄ-‹”b«Œ!óF•geÌËñ<ºÙÌàõ§ß1Š(.Z‡É1qä%6‹ …3p¢ÿˆÃœ 㡵Žû­çû»1›\„, ${ ‰èøQx12`Nÿ¢DˆÏóÿ[aqAgû­üÀ °O@ÑÚ’ÐÇ E Ù·+uñ£7íšã2oZøva)„€K•K¤Ì…°ù«ÈD¹¼íǺš*“VªPæéŽÏNC+H›ÜbÄÜ«Ôlúê^¨¤t­¯®bIrïÍÓÄŸR™´ùÓª÷ýæŠÙOtUÐFŒ”Y)î"‘¹ÛÔè³j†CŸæ\õé‹òÁ{€£`óhD\™ú_à]  ¬ÅÏÛæ…É$Î4Z¿*™1í¥Ÿ„:¸k'‚Bxï$ëù{]° Ó´ZgL0™õ C¤YB• 9—Í_Ä ^ Ò†ÉN`nê©Û̉œyJÿˆÖ tÎ )uúNQÓcƒ6[¨#,F€æ1ÓD _1ýˆ›Ôdéµ/¼ˆ„m<óíŠãc¦±º |*²뺲Ík„Ã[’^÷¥.ÄØä>¢åIÔ7 e©”5îlcî•¥AB*²KŸøñÀ<@7GääpØe•6ãÛ&…·ÓÜnÃІ–/!n©×`’4]‰W¢zäI¢)c9ãºžÓ UkÙ%™V™—éKYoA¿ÓÝÖáŒõ"ÐJc4*˜×ŒS+-š(CØjÈÄýSQ <@Ц8å$R[aûÐ]ºq“ÄÉÒðo>·€ÚÔ"`hJ  6ÃJ§l¤æ‹Äß^m9´Ã8›_:¬Àô"ÈO½ëHªœDT&¯˜Éu^X+ ¡€5µ¨N(øñ$hmL¼JÉa¨0—UAˆ—‘-sô‹PÓA›ZU >}î÷T¿¼Vlã…l–e§äÜÚ[°ä ç¬ø*¡\N5á—òˆyòuì•ȸ­‰a=Uaðü»º'Fä¿ã„ '8lÔ°Ÿª]ý‡Õ³¨Àf>gú¡N™yà’ y¥‡¢‰Eœ€3±¥‚àqȆ–¢ŸH²•q m°P·'kz&ñÆÕ˜zO¬~.©‘£ó^$ž;ÁJ…o¡f÷þ·¹ #`äJ’7_«`‡³Ì‰5(ØÍ¾AÜL ¯“W"GxîЧ½Ƶª' 2T$4ýX¿çƒ~lM%S'FD²¤ITïÌ<1z´^äÖ§G°7Ù[ Æ9jWLde‡¦zݵ ™j]@Dïè%¦µßøF;¾ÃÀˆaY̯^ðD‡ õ`™¨ç´"ú*oiÝ/k¸÷¿ñ½4P\ û–XÈ1ÖôÜ[ ÷®€µD1"yi›bö^ur\ Ÿ/%5»È3i§X;ü©ÛŒ" „ÏâÝٴφô çÍ©2ìëÌ…5š%]øy¶$Ž‚P¹v8° ©Œ)§b$ Ð1ƒH×WçžžîÀdÂÓ{˜©µ°±õÑMïN$Á–f$eà ª(XðóËÈB§:B]{¡ÈH‚¾¤Þ³Æ‘.7”ü:ÄœP©or¤ z¿€KÛXMfbIèe¸G*D–$@Ïï¼A†Û`ý§^É” &7.I¹¯çY¾3Z·1 0›ßj óG2/ º¸ÉñoÚ¥})ÆÂái ˜b)]÷éßg÷j˜x¿Ñ£…ÉÈd¢eZ·ï”…RÞ-ùv·ìI3 ø§0¹õ=&ì»ÜœÎ‰µC¯_”¢ê1 IDATyÓ¹×Ö$@9ˆ´—ÂaÛ\_ ×(ÖÆ½‡Mì?~y@±­µŠ?ˆ}›åE×9Là3ædiÚîØûýmßê~›Sß‚ì¾öÜêi`Agåïy!}% 5׬£:)±K>Ó9”ÚC ?3]›,4;7sÝX°/Ù¨¹µ•.¥ÜÔt‘)‚H_K`´:lœ^HúÕ–E1Ø–ðÆ‹$µH»‚ÉE$² âºE°’=GÄm|,ÖD¶©=0ÎbÞ£BA°Ô÷ óHÄÕ¬:±þÚî¨ ÖY¥njÚÍ$¦ë%T®*ñAKP3Ê #l‡ƒ›3^ îÍÌ@w¥¯ãåy~2ë»± N;³æö¿Óìx|¿ˆÜQq‰wßPÞmbW±`ÛR)XÕ¨_¬Ž’$bHÆ‹}¸B2wÔâ¹]ÈÔå\Çæ"©U°íù×ã‹Æ©¹ëà™´[±à½Ý ϳFöØVBÌÍí#ÕÃýXª`öî–#@5ÃöþñÁõC3-á…ŽŸz–aGqލï2,xån›{7‹¬zÅmV01ÙºXufl6]šÚ.¶±¥1ÄÒV»êÄÄ*:Íé±4&Ëö®P㨶°Å˜”¨Ý´EAÎ#´{H‚]k(ÄqËåqD¼¶ãµP†„u br™¾¢H4ƒî Ì?¹†Þ#¤åÝOAp;¼.Ú[0–àzQ‹9 ’Šúa·‰l½·þõŽà*Œí¨3"Ȩ#=>rØ}E—ðbb˜O­A;Qù¤…wî TŸyž"G£«‰UŒÖ>žˆ.M/€JxŽZ¬E€¯GPÚ5´‰ÍžqîAq Å1#ð±n÷Ô~k»5¡!ϳZU+€>¼—cˆý¯JŲ¥#noÀ¦Y'yd0[L©‘¥G„òáGÓ“’•x9A‰cÃê’ˆð$ýÒ:7Xÿ¥;)¼…óêJ¿Ÿgc5ÉÂâr¿¾*ê¹Æq~aÕáN XgR4x-¡q$md£6©B×…®î˜¡CÇi†}ïJ[Ãs~5ÔÚ¯ø³Ž÷Ú›`l£91kÈ@ƒ,f¬þºÀ&wL„ûUT‰ª»<è/®eBPüƒ]þˆ^èYäj£µ­Q4å  ç>¶(>?6öÃñ]ÚC •:¢<ÐXá:žŒø\‘a(t,0"Iœ¾D‰Ø´€Åj†û;Y´·™ˆÙRn¨¦,ýIŽ™LÓ¦Ï<×Âs/hå]²Ölaÿ]g6ZHJÃtîÌ5Ü}‚L-ÜkÖÇ °ÝA)x°‚ /¶Ø%áò%ÜŒïhÚìy^×ÿ[£|á(À@|­]Ê÷І–ÈQ’£—i%y·‹ l±°KNÿ ñO~[åXñR«*¹Y¬ªFª6¨È¨)7Çúfo;¡æ*Ì8²Æ“`Û˜€í·D@­'Ö#@ןÜ1#8!á#ÚÊïZÌH—Äö„a·Ð±Æðî´^Ép3±A¬´±S{#Pek•!Ñt/†;Ôg’¾ÚM­¡Ž ÈjÊCGÞ£Ä3%¶kmnÀ5q…ÕÑÓ˜Xc¤Û€Á$Ö­`óÅ{Ò-4:-í(.F€ìÆ z žóK0ÝÞ« BM²)ã““fM•ŽBz0º,bBSFGõ-÷Zˆøp~Ì7­ÔŒ‰ª:·Ý[ô¹ÌÈn© ÕG³O×ðÌ[psw2“Dæ[-:)Ûñ´¾EOF³ò+ŠÑô´ô8vÓ€¥ŸE‹ w07›ï$âUKùÛàn‘™ÎÞ*GL¯Úøj–•=¾geã-0ǫ̸ÓX-Í7v°R‰«=²¾O¨¢_·t„m¦ßœ»Qð¬Ñ¦HÓã•bð™öÁÁ…¢7Þä"D²Xtm' a®N¬&‰fº;ø™ˆë;ò˜Xÿ'Ð%FZC½ˆd£Wìû|.ÉÙ@ãíA’²´¡AAF…vü7« tÇøþƒ»´øg޳Z6é$ØÈÁeWNâ6”bGÓBp k|{ÐsQò›lGòÐM²,Gª™J~Üu[†üâ6kc‰ˆ1” t˥Ě·Õc z- V ÝP=53 %by"G*í° Ÿ1^ '•ù«/®J€xD%b×aY†ØÐ×3â"oÖè#æ0 °tÓÞ/ dµ®CÙÌìOÎæ¬!²"¦à©^ªmÝÞd¦ÂÆ`\. ½PΚžn-ñ üi¦ÓMÜîj”ìu¦ñ‰Ô«“º§ÅX»^%¢Ì·î–ÒÆ;ü¼i W®ÖµÅM ;${Í…qå.ìÌÆ6Ðã%~ñã6«È|øm¬kÐNL|Kmy ¼^gaœÞö©@=ÎjtU {KƒZ2r˜CPɽŒ GAí¶ÇœPCE’†Ü_Ú'œ8¬¡¨Ç÷lcb;Ò¤>+±"ÛêöM6þÐ Ötÿ\‰¦îÔ­H{±Œû½À¡á>+AöO[ŸÁV„HÒÜ0Ñ'†DÇž¬ê¼-¦×zRXÒ¯¯y²ž!2]aÖ¹ìÄÈ“6ñ =.Þ4Bv´»‡û.]MŒÈ)¼Ú,E€/ÀµD-"̈́Ũrª¶W•öjoÔ¥¤±ËlOu×¶w UÀÈæÁ:фþÕE’-6Õ€høw#Q©g`7Ú„µÞrà  ¾}ètD’™Ý¯€~è:|ö™æŒ÷Sœâ'.ŽƒÆ2¡faá—¯(€+ÅŠˆÖ¹`¸ãê—œ&}QtëŽËÚÄEWtäkbžIµ@¶â `¤ë!1ŸÁ'ÏV0x&zP ÆÂ½ÌÜTÓ­BFŒµU'¤tqx{.ŽH[ŸíŒIÜp—J€\ÔV—¿ˆƒdú^ãUËVÉL;®††Ä/H€ÿaÀw˜$ýº˜DcjÐDÞàfÕ5Ÿ¯ù÷U×s‹ÐI¡Ýˆ„B{à‘h%æGÝÆ[Ÿø[8ÂH¡IT’|$— œ¬aŽ\×÷âìfœU'Ä€Û îaº Z‡ÜÄ»‘mµ©±ÜX¯}å,éôY"—ÀÒG×e>ºÆË”>0¡ÀCaþc¤bÀóȨêÂÚ›aR® W¿H/h½3f?4²L< 4£+Â0³Ï1cCì?,Öå¿è.ŸºÜq’•A„3¶EŽXèFÒfTlæ_X’ffW  Ž~ÀŽ`e›‹ºä GX.é^‰ágû6ôP­çéZHÛþ$A‘A`c£& …àˆš¡!Ì$Iq(:tt±ddhÓÐìTQ„\«j’°¡(mbö~«˜ .YîÁïõãÐå0‰b]ó—"rÅdÂú((}ìLÍg‰Ÿ‹¶Ü½ý·@…KêÁ”.ºëcÒ =æ<Ú+Úý{4ðhŸL 2c…25=0Ni€6óÉK}Âæ É^ö¸^÷ w&&ýzB<¬Û£/E€ÿÁ¬ zBD¹:S¾ËˆS´¼éCUWSè¾îdJ`5ß^5Sïré›Üš6Û5+Èm’5Q„&I åP¨Ðj;4‘8‹ÁçÌÛ9_šÏùO\µómú(—»µÁß f ¼H{j}ñæ6‘°c¢W£—Nô¿Íþßš­¾ï=CL°ˆ;ÿøvŸ*ÿ1ÜrÈ&ÍceÄä¢Aj&v¡›œ¢æ{¬†ÇXŠYm<’ÌM„ýJé€=—š…e A¤¢GÌt‰(^$ÿ…ÓåЫ¦5‡âÅ™S¨ËäWeœ3Ò!Ϙ7ÙØu’mHv ›ÉÎ8-›0-©_­ñIÌ 5³e![è° ºÅE8}‰æŒÛ©(tMìŒý«H¯5,líR¯¤ïè-{ãþ¬-7I‰x7Ñ’¬y(–+¸LEÛ²1x9Ç¥C‚6ñG“­3^—˜4ù!áylFBªAlƒÏ”µr[ ¨2“V ‘_ëœÌo~aÐ.€T½¯ˆ*„›d +‰,N_ƶ´³W–&@ä×£/ª}ª‡¤ÙÂis}X±Tb«À+Íí«2cBÞDŽ¥9HÀ=²Qí(kÌE¼ºy8lcéÀe#‡*"nI×ÏÐD8kälrå”C«DKžs,ÝÀñ~%¤Ìgåó îSOüÏŠ8â’¹‰;û|8‰NL¯ h Id1n¥X!sYÛàšZé »t²Mä£ô`š’BâyõÅgódë‚ÛIΘŠr›º•¿F°~àqâ†Æ|ë] 9ÐøF@YêhrœŒà)6Ìò2óš“#a¿&£ÇImߢ¨Ðf†LæVÑPÓ¦8zù@G“&²‘¤í¼¼³+KL+®ÄpEèBÊP²2ØB~J‘üeVµwu?âqƘ2±‰®K^3DLmÀX=†N¤»Sm¦‚?–,¡Ù*íPº,_Øm§áBåy7"'LX´mH°¶t Å«a«-J€lðe„º±ÊôîÀÖß™¨ºO'¬ 2»T?4õÞ¦ß<Áöž)[€y ö¿S³•µ8¨"¯ù?ì!Y›i)-¶afRþ¸êõ¿Cjõ0®ËÐØ‘ÛlÌÖ‡–9Wͨ¦ðY0#jNÑ;Mâ1 ð5qÜÓaRݘNNU+M®I€!¡¸Qc¢0òk-ZWÝcΩŒB1’nœñճދ/¬60Yhùbh*LZKŸböŸíl®ATʯBh”'hÂó.L|îLC½ßØ…¡D÷ß#Rþ„~Ž.ÆΘ;𻱆¦Q íqØÞ^Ý6qe+ œE±4·¨Ò3-û²ô5»è ŸqbÃ]_vŠfˆ‘šã¿”Hc¾1^D’Ó‹Hþ%Л­b9 …¸nbç#¦#®û‰Ly=‰zÜDz¯µÁ x8ü{-ÿ]}¦OŒnž§­~»FÓìªeÞPõÇ&„æºsݱ"þÚdBEfzÐã~Mî4U5]Ö墌•òD‡I-…&±YÞ MVûÛ/pwH¿"çht¥CFª°¡"¨õÂ@ò€÷Ū‚f5®c£¦†×8Šœ5¿ó£ž™Òèæ¬Ú‰v“…!’Ðglö30}çwöyŸ¶ÔÁ°yÛ‚h™ý¯aF=^štù‹U§és\f¯ëÎ%ÓÌ n^©Õ1 âLµ7©Ï+ŒÚUÈêv²©õ‡/ ±ö¿ß„èì“hØY[Âu@õžO‰cœb+qØYöÄ„·{¥bì÷ÛÙýbî} ¾Ñ=÷œ à“žô¢•Ð2YvOÑN¡Ï‘©‹[…˜´Äí:e ÙêÈ"%L'°>ŠKE˜Â]1öVÍ ÑìCcéÒ3PŽ·ÈßY‚Î-–d`®6J”Ì*»¬‡Ïz`©ºäÅ~áÔâÝvêõ±ªRö€‡9ˆ¯¢N€¨Ã»{’)bQç·%+`Öw?"ý7ð'oB”FÚ'0.žalE°ïלîzã ÆÀ &ÈU,…0‚ngÈ>>ð†#¡µzY›`Ë1n´<êT€äè¬*¾9ñÃÑ(‘”oük0»Rsf÷ZŰ"\7`¬9À£•c-KÓÖË›‚W…·9ÐlŠsƳѻÎtÅ(°xoÃÐõ)ǘ3´ÄÆ‚$Dþô®˜í+ņnt×d…ña TG™i"0' åÈ·}úb5˜Û”IíÃ!}^K-^8‘®>;pÛr(Ç ›Ç!"G‘8#’œ"øP¥·A+L(a]<°F«6b[eë#iï¨+CZñšhÁÙÿ:CHvGƒ ðç%IÖ‰²,_Â:úaª8ö¬7#Y/PêUÒ½Õòe…8oíEULŽ}×.F€ΖơÄ ›5ùTÖ¼`Úl;e9ÑZ"­™•!G†Œ†—.²Y0¯Ïà ºº¸¯¾ÿ‘wà¹ô÷ÖtHàõÍSzî†Q¿—ñá#`’ÖÏœò–¸è‘Ó­T£_š–Û-íÂhEµV‡ú®€¶$úi^ûôݺ‘¢o;²uOS ¡¨¤¤Â¤[ê~´ .Ä^ä ^–C†ùQÖ¯¹Ë†&U®€›Ë•ðö ºÖÒÐwgY0Õöq¬±—[îÐ,–£åŒÓë]ðv sÑJŒ™‹¬` SqÄá  ¹­e.°2¤ªŒïc´Bâ³/oêVfÍ´“ šS辬ˆ·^lxyª‰" ð1éë v±!’€U¿z*ÙЬ}4ý~ඤOöÔ™o½6ú¡š$Ƴ_#ësš¬¢çÅ0ŸÓ\͸=#qíi¿íWÿè³ñÖ‡Œ%ØnY0'=½€óRê ¢°!*Äž*LY%AÁ´+âGßošÓJzµkmŒy€ÅÞ0ô ‚ $í“–%4"¶Cd«ÁBuâ|£•‰‘ì%bƒ«Ú‘¾ÀeAub–ðXš¶’` /jSpn'wŸZ0ƪ%r¯] vü½7€’ÏÖÝJ-A„ï-“-;V#Àÿ`–Gp®¹QÐBòæ.ôsF×^Y¡ø"‰üi©Ð;¢€%“œZó5-R§äZâOÈ1¼,Ép°ä´}›OòiK¦‹Z€¶ßÕo*h^0ãÏžý™Ø oÆ”ÿ ÃUÀ»¤o½8û‘$å °z:ƒ ± Y‹‡ŽÂ/GQk _’_‚[Ô©wpK #o{ä®@íÒm”:ø®¾¦mð v\²§˜í@Ô CÚ¦øk\>LI)¼ífŽ=‹Ôö´tyÌÄz´XrŠß<­÷›m¥ð\œë@©ßèµÜÀ÷~8[åpHp…kÈKž¯E€{$@—ÕÇóo-‘ZÍuç]*uJœ©Ä52[äË/“bŠWm…]˜ÎTêJ± ·µ ©.£?…Zä4Ê)ãúH5q§δr RgÔí”:Ѱa»ôˆ5 @ªkš=oÃæ;p4[ééCå Æ²J̘‘åI[o1ìŽkY/½Ø¨Ù6gÖ›ï€ìU,˜cH!v7ÕÞ¾¦Ãú]DÇ„-#-rÀ†·zà¨C›Lk^ŸÀ@G«+ ,¿B\< ‚'þÞ3eH—3˜O3‹s®GÍÌ¡ípZ“Ϙš"…G%ÑØ¦•p_y¤'KÈÁ%5îβ ‰GÔÄêÚR(ƒµ/^˜Šsc¡õV³5r[å5¨¶Ê̜홳!–g¤)‹¿ª·ßŽsœ^³“K³À¶°"9 ™ 郯õmíÞˆ%w_—šeÀEÖ¦8"2D»œPDN¹C·Í>óp¶™bÓ°0Z‹Ÿ:j,°ïŸîÍ!Ñ<£ƒŽ†ØJ„2ñç¤ãí!RO?šûšç œúÆo†ÙÎaŽ%~ÍV‡ÛŠDø§²gàèšGLB›3Fdl"lb¸G¯.ÅÎó #.[––‡cH}BÉÖ“s:Ö"@ÝaS@"ºµmKV_8ÊÄëÐwÖqûóLo!UH÷d{uެ>Hñd„«va|á Âh5>³rM¤þB¢SœæEèf©]6ÏQ±þ§pa…šm°ëÅÐŒ dž:Ç*†»ÐDÊòiJ2›DÛ.žáRÈìœ ðÀÇ´³¹+­Þó; ¤×¥x&º5]þñ¤àóžªÖcçf£ngO¼QÃرin:¨0rìG—OËd±ŸL†—Uñj¸Í¸ž®ÐŽðZ¦×Mµê“Â×Zôæ"þØD”9ÑM;]§îPgÔeÀ¨ÎfëèmI¬:û¾‡i; º&ˆô5Ưí)5dó"37ðcAÿ”­ü%†¼ÎÉþ{”~”Ðà|U‰õ+e€9o´l± þ‡}èœwÖ_• q‰ë›çnÈ`= ®Á`p9 ­dý±òK€ëÙ‘Ë å®ùFºD¤`XÒ6Á‚™˜jDfBÔb¶C ”†O‚LsD¶ÝÓÁö6tؘj7>ÂÊ_‡µ/9#Êz×lƒ•à`J×1·=P¸±ëƒ©ióa2Ôªm¯ÁXÉœà}æô‹Aó[V˜iB« V—¶ø‰h#Ì¡­¥àŸ)Þ¢a†ÆŠSOKÒ#µm`TT‰¸9Ìk£‘óö«I_œ3j©ìO”o~ÒRý¢•ðß_ù¾ ,oN7†ô1)<ûê*_Yî|ƒØV–ÌïcŽy磰tQ=î®t“²1”ËbÏPx3’L7Œ °Ü¿hÍåjV·- BâaÛA/µ)¤4ƒ§‰ Y“*Q¥¾Wïר•ÅrøÄ`D‚"îãÁÔ…,ÅoõísRY,pdÁ‡2"}ÇFt‚˜$îÍèK*lq×(%Qg*ð+Îdì(Y‹;MøOè½xU×­CEVz—cJÜGàÚ¼B¿ é)ÞrÜòr*\‹õ¤¥µD»0ž{ÉR¸O˜jäÕ„ ܇Ò4ÇŽ—ûhc¡ñþ¤S3tw®NeöÔÈ':·@Ð[*@u<èUf$ ±EóŒËÄÝ\ü¥Ȳˆy yŽ,^J抲 ä9ná/;í’Ý+øZæ±nvrO013šžc`¯1 7&¢ aRQ—ï%¹d4¨cÓ—„«v¾ýä”+èr±¸Ž2wÖ¨~ ¹DÏi ³•Kì2gÍÆCÀ›Ø`)dvyòá5ga€ÂÀÊýç‡+Z|“×#@>¶ÐY[Ù×aÔËoöËPø»b›W…å ÄOEõMù övù€ª‡øjâö[}_o›Ž ¸…CAZµ0_óRð6Ðs݃F+ì¤pÄ=†M75Ö)ÓcÀXLªB‚kySÔÊñÅÝ÷¥/E€ˆ„ä¢Éïc‹û>j©$Þ¸KÛvvèÁaêŠ(fAlIó@ ô⣤Û Ø èÆöfýÄ¢¤ ¤zˆÈH›lIÖ]€µó|"*eåD¾9Ê)äèQ0œÆK¶-½*nÏNøõ’¬$–£Lvœüæ,E€ÿ@Ü`d6xÍ«òYwП.¸û ÷Eᤪ —ž|h"­ ×e|‡ ‹BEÂbç Š#C?ŒàDcë’„&Å5öxU2W<ýªOiáä8Ò°fžÁ`%LŒ6ñ18´´œC¬²­G€ N:U¼Y'½Žª·œ†NZx /cü½‰ÃmÌÜÏð@SÕΣ½[–[óƒZÀ¢‘85ƒâ-J±’D»)Zîq«ÇSƒsO¾!­ιZ˜C^òÊe«ÉsËÉÓL縤ºâÍèH§¥•9‚tPÏGÕÚ6 YC2v[-C¥É7|i*E’™,/ªwpE+ÑžÀéûœô ®:CM0ê’¬)ÌÙ©6(°À¢Cì®ÚÏcÇAæoTw,ÌwRâ\ÀÈD–ÎP®•¨‘ãÑLÜi|+þüâäuúßÇóäu‘•ÙæRÊëƒ|ÁCyÒziŠ™^&J¥ÝáÆIA’ ü‡d:LJ6‚ñ6¨óñ¾Jô©"UpáïH[ûÍ —C’"ÞÓ1™eË€O ÃQ Ù +» &d2òqÐÓZÉûuÜÀ;Y?Ïÿå•’÷2f™©ÇªôrYQNÎÀ­ØìéÃç‘›¤ùr÷ !ÿë÷ E™rýÎfùP7QÒW˜ß*³7³ _nkÎþ“Ö†dK8J\ÿBÃt¤µ>cnvÂÏ\…Т8ÆSë–§ˆ€Y)˜QeÚÄK€¼Ö–Ç ®IV¸ƒw0q±QÑì`†tBÞ:鸿ŒÅRòŒäøR² ovÀ[†é#² áæõŽÄªº_íâr®ÈP˜,¨QqµK¬áfÂK)jh‘ehF€ÉÇ7=õ­×¾îõ¥AhÂogÍ/¼w>[G-eÔE-Oöf˜Ú€-ðÕ¼ƒñX®“È]~ç_©Œ[÷ó:ÒøóCÿþ—š<~èþ Ê ÜÂ{²€ÊD¶½íèK%fQG(Š[w¸dÚPg’žÅ{"d–v¤z«‚¹î“âZü*“Ó±ÀýÙhÅñaàjm. é½ZÔè–è83'y[Z/¡!½JöÏÚÅÞÀ;±‰\ç×gBÊ«p ö¶kl•Ç«Ø4…^Móß…v#“d]AU"”ôK¦¾´ÞO±Ú9¿ûÊLHƒÃ?*å#i¶$6€Ž‰æÁ ‡ wŽÙX«»D¶‘0/øKæ`P`ÚëƒO“ƒPK¶È¡»ÛøÈQr¼qVHœ^Á;„iÖ=ûTU:Ck“Í=@¶“ñÌ6›`QGáäDÏÖ}ã>&°]ò 3¯›/öªä"´‡õ±É7W”ý$;*Œpâ^0ņߵ5r=XÐ@ŸÊ2Áá°~¾‘wlë_9–„3žÃÑ©ZþtmÒ¸‡)C©ñ|žâŒG\ÌHWJ“w!M*:|òô$÷‘£ i½BP?Œ[p7]::ö×Á\+AÂbÌdšl´-/ªz©7c$­Wƒ¦8Óoc„}içV ‰«örYiëH‚? 5m®ýMv,ÒQòú´së h,ñxÕ¸FPŠBçœ5ŽcÇËŽ‚óäBÞÁxÄÅû^¼}CúmHS6ç]£æ$üŽ(bà “ó†ˆ=%õ¿(3³ÉÂomŒ|‹Ø¸¸×’ Ë’¾áÖEš`5;@Q}0œQ3@¹ƒF£înƒ¾¡;¨šˆ¡pä=³ eÁaK/ÆpH¬7à{€WòÆcPÎ_…þ|8çkƒÇ’P}oã±k&gÃ¥›m×燉ŠuI¦†¤׺/èXv3*Øäl)ˆ;(᲌ÍBeƒzÙ@sg {¦¸Õ`¥aÏí¯Á›Œk{¦ [£µpOË:ÖÐá— yãq³|€×£ç™e¸—µÜ‡;ªb¹Œrû´—[¯R>yäÀ„–5ŽØžMsŽ!$÷ø#»qÓàÑ¢žÃî¦$HŸ#Åǃ¸·Ç3<Œ}pNUª3ã)½xm™7Ý¡On“¸›è<<Þ¯òyPPŠø¾Ä«:újÁÆçÓ¦¨Ükxß'• ¤\)•9Ü ‘«kã¶³#²Ö‹"~MŒ¤Jjœo±B‘AU\`êe Ê©µríŠÅf‰DýîxXד/aé‹›šŽ¡¼Nñâh:0L,E€»×ƒŒƒTl&!|5E’m~`î͹-„)X:mC ™ñ0êºøB,[©˜ˆØ)\«Ñ™èò΢ca¬C‹ôåvÅ‹©ì5Uç²Yœ'”צøflMºáÄ·ÑF/U\‰A¸ãX¥=î9ðœ¦1©il‹œm㩚_è¶;+­+e³Üãj£M>jØ@§ù4l·Ìº¡V½„šq6Ÿ$¬,2)ÑİÛfNƒ»ºUN÷Nò)%+ |ªѪ§÷Ù°r07ž\•Ê?©‡¡kßêâf¥ÛŽÉè ìÄn¬ëk"íýÃh¢Ä®42¯Sƒu¹Dæè2ÑMËù×›³k¸@ò)Ó­« ExÙ„t룆-E€¿O…òÁ†gPõè–•³s¦Ù´cœ‡ì"}¬È‡Ô¡%jËȸ&€/†Ðâ4‰š] ‡ã¯Qp¥Ú }3B¾­}<–Æ +˜çD,F€-Å  .‹2àM€ò pBZI2Có4;5þIvîù“rŸn m»¼¿¦¨¯3›d¼·…\£ëœ2K'’ÂQ¾zåãpµ@Ë¡1píÌ0 'ó—£.\Ó½á„PC‹ ó{°L f$\‡AÓJÅ*¶LQ¯E›^É4Tc•`mæ·’å±w»™–g3 Ë´}!Ê™CÖ3g‘Ã+¦ÔÑ©A3ªáéÜ÷ç 1ÃÆN…`(’‚ƒö'v9|fJ›7úÕqÂðkbwa¬¶µÓûù~»«?îõu6ÑmÈ<Øf5tl´ÖöÈk»ÈïlðSêä:öŠ®’ù Ä¥G&†ß^¬"v‘*ì›ÎV>%õðZ’l}ák ‚|(ì|€ø—ßô}-5žJ‚¢åòeñ³ ‚“í¾‰ÁMI4"Hæ¾ÑÇXP Ô¤t4;µpV%~rO”+U“rTk÷ÊŒÐLÝ[Çb·¸Û‚È€ÕÐñ½žfÁ¯ò†HØ%ÁŽè&½/&ë%æf—¦TCµ2IlߣÍz'¢6ÒGòa‡¿¶{ ÕÇÍS¨W‡xèfÃËŒ kÂ.e[«rA–åOÏHøœ‰e.E€ È:ù\A½ ‰d5ä[4´±zÊ3L‚eFaû‹R45¨c¥ÿerSMBåMÔéAÄLÒ¾ÓÞôt©kœµ%W „ÕÃiqš…tŸ+Áã%³„!såùJ³ c:R:=l¦Ð K HE‚á1ùá´§ŸŽÈ¦–x{ÍÚ¦0Â*@@†ñÍ_h?¸ÆØ_FüëÈrZ¾º/ÀÿÂN¥gÕ«vmÃèϰfÎ×cšcÂWÔ߇ÅØ|ñO{¢ÜÒpâÔ|s"ÑÓ\ðR"”Ç™4J]P•(LX¾,ÛLÏ"î2ãîî§ TÏZ#ÛüJ5„/‡­rËökÒµ“­‚úœ£ô`k §Dâ—^WÕêŒv¢w~Á}C‘_¨RÎzͲ5õæÈ;–„;~\*_=Nma!™¹Õ|G Þhx÷jÀ<.ArÎ÷¨É˜ºãó+s»¬?« ç¡Ø_©ãÓaØÌ½Oed½w ¤tHCÉnGÃuÄ´çPxYœ¸¸š¶Au`”3œì›mNÁeµ³«ÄÜ25¶íõg²KWbBY¾ê«æj¸ÈVQ0Î¥ô©ñ ÚŸµ¶}.æÑWÕ^ŸÅ‚Víæiú^ÒØtãБ۠Ûb¦ïx0ü˜±Câ;°g\Åm“ίŽÅwÊ¡üò&øòóÇpÀÓä §jNÄV"@uü·^R0¹£W‰KeœÖ‹P0H!üõµùT²Z å:>Iv&¾–ùÙDwXøTŠ-¿X=‘Þ‚™J'«×²Çõ¤xŠÿoZ¨n–‰š¯D€íÈÏå^çD„äuÕF?K¾»'k{Úç™à\š H¿0T8¹4ðæ©eBë™Qel ³º"æ,”iÙoÁ±—¯Ð{mã% ð‰8Ù&骴'c0õH&^ÚBB‚J•)2~}´Æ¯¸ý~à1Ѳ‡)×ãÏÙ'}ÕMêÆõ.å¹Lòü%@†³Ã+ûð+ÆãÖ"ÀÜ*à®&š¾òÍüKH¬bÀ½¬‚åN´ÀÔ¡#Žë¿µ2ÈÁ%•°™3°@ŠŸ^sá¨ÂÁD:W=hÍÖ† §š–ü© Ì LbŠ-`Åé€x´MÐÍN»wJÀC± ÚæâûDã‰Ìê†ûJÞœ7êÊ´:‰•^Ý|ªgjdþöëûïã·”-Nû?zµ §Á2˜™ú©´nï‹9­ž ~žäŸ3 }æ¥ HÓ鎜^ÖŽ¨ò×±¼¬á*œ¶ázÜ'{5t}ÎMÏøÛž{°ð6)¥ŸÖGÑÚ/£Ü…·Þ¼v@„¹õ\>tHÐ|íóíŽCMGÚ€ã–ÞÔÇôä¬,Xá#ì?¥«à¦Bu´Í’@¿_ÊÊ2«8d‡Î"W„ò2´ìêÝÙ0uŒ9æëS­LJ˜’•JŸ79EWƒøT º‘4cš›séä_Á‚øôÂ-34S‡?î`jy‹6û‹ç7Y=K›“9Ëya:Ì8Jr½—;®ƒte΂ںÆ]E 9ñÒr³ò+ô]`êåN/°Ê Æ?*¯¾ûï õa{4÷€3`)ømjFÆNV)¢9K® ‚# ]Ö‡ïâØIU<>bW““3Õ38IdŸH%s:W#ÀMçoýœ¼f'jèÕ;]Ëù–qóJ~ûDž¥,U§ҧ!S9p$0sÙ' £qq>©¾Tô<¼ø´ 9ÉpPÙ'رa%l4GŒ~ž°kdç'•4ò“CjRŠŪ•dCÔ³¹d®FÒæ+~ .+áÊÕr¦oV¼Ÿú%?€ÄÞhRÀ´”ÕÐ'Qš¥0.¦—Æ”9Bÿ]ë`Ÿ‡,šÔrï:–óí/~»u˜U;½›%ñº_ò1Ö#@;511X2½·õ¬lP/¿ µjMÃAºè_¹oÞšl &MI™o §f˦j™æ¢û˜U¯“s›Ëk¸è—0Z Ó‰•ÐK¹S»F÷GB{™#'d´c’!4ÂRéÅÙ°"k|¾åW!5YGŒöÖ¤v|ÇH\àGóê>•Pd5Ã0Ò£¦)VÂgñå¶­²"¼—µ5®eÙlrwŸª{X×ÉÝãµÇ“ð£8?H5XðWþ+ C¬D€íÈî)ð´{¯¾i¨{Þø÷MAåM²Ž;Mb[Žl›A³fjC˜o‘Ï™½ïT¥$bw,µ—8Ž qB._T¿#ûú,E€ûìg6zÃ’Ù«n#ÿ±žr“ՓÜkR:·›h=æn5à½Éé¬úæ^ØÓŒk_ˆ3·A¾K`´”Iêo¼öÂÚ©/Æj Lh>2í9«Ë;b…+è¶&ÚÎãvŸîë`ÿ5l° #À`‘àÿ ”89ªÖ½<ãSt¬,¸Hú"¼›3¹ç›«¤+J+'älœi>;(á?3xË®ù’!ý ¤œ·Ñ¯¹Rø»{ûN™ëQ›ýó¹a°[>ê¡g<û@Rë–}0Âä×µ£NNÑÏØÞÒù»”¼uæîV¶þ÷wOôøM{ô£0‰ŸbÁ¥Þ-$Óäfó:OÀÝ’9ÍÙ`úïËÍÓú¹î½³Ùè…zïÄ7®)¿+àóC‘Žü EÑf© ‘-¨v=þÃÃC¼ÃÁOn+ôþÎP>–ŸåbT|¥Åá]‹„=Y¥×!Þ`Ð #Àxã3•ßÍÄÞDÕÿú® òÕ¤!M|”þÄ9ðæ/ñéËn˜^ïàG†h¸Í/¬F€O€M÷s/ ôpá¿—ЧdÅs†Ùkñ¤/Ã1iFó=çÛ^£d> ¾Ø€oƒ1öRë#@¸¡Iìår%¸\3ëÇãóHF”ØŠ)tÉíü×·øöD5’ÿ0Uá£XŠe ;®¬s$ï8h*͹`—¨ªoÓ•eµ÷Àª<›*«â!j=‹c=,Œ°žÛ^dˆãtåãIj4sê¥pGSÂ+ð¾ûÌ ¾K —dQ¼WñS8À‰Wxþ¬ŒÙ8<—Qï!JNŽ×•ÜD_CŠOÙr?3÷Î`)Ü> ‘È}X˜Ç9ãÛ\ù$-!åòº£& bÒ„,çg¾!xÄŒ5ùç×özIô<Ù+´÷¦çî2%=äÝw”ƒ3"n ŠËod*Žr$ÿ‚1¹l£QØÖ"@ûëV>ßÉü.x@1H6ó‰Ç)/?ÑøpS2—èÃ{SÞ@ ),E€ùoâÏmG'`~z&­áîí܉ûœ^b‡3åÌæ> é3IÐð.ƯÃý#¿¿Kà?Ü¿µçŸóÏô­©Q¡×àÙðqq3KßÁ 8 ½àì8ï]ƒ¥pt ê=ônu]WøÌí·#j®;寧¹g:‡T³÷æáVàáwMçîäR8ùQfJ¤ëæ &܈O•Ä{i•]ïäà2Š*_‘1Žn*Î ÕU?ƒ¯7ð7a%ÔÛ6ãH‰,ff_9ã¨+¼šý³q¾yÇÛÎh™´8mÉ©'>×·|Þlão+à~`a.¾“3‹SwÛ2©Ôq|eÜß"úƒòmº¿ª›ëੜbÜî¢ÙwvŒ‰-Þ‘œK.ÇÜ*pg@y·“õ~7þd§&±{xàÚW›¤òÌös·ÁU¿7=‘8¤5~·õ—c)|âd*”~Ú‘Nc໩}´÷„!ßüf[?¿Y{\qÍ£“À–·5ú6ü‰N\€ ð…[ã[ålyß$ãj§áûOK rñBáX—9æî9ÝÿJEü¬ùÉþVþ¨Svãƒßa…#ƒœkó]¼û]Ö¬‡e Ý·Û€?ÆêH¶öØkBƯxA/\8Ju=Ýêì/2uË „y1f2 É N÷—_s&š]ˆ%&aÞíÏ·“×<>Ñ|þÉ ”Qdð«PÓ¥±<λÄŸ#œW•ÞkG·.0ç‚AûuÁûë ^+àÌÓ›œøì“ÜSfE?Dý…HxC?r¯îŽã¿"žƒó‹~3®Æõo³ $Ž'ªwðñÿ¬L€×„qòE½÷*JgM3/Ó8w*?‰/YG~¥ÒBÃJ8÷¶ß6ø7’&…MÕ>õîo§ß¥ÉU~Û³œOäÜÅM `%D7Ï®}w6ÌœhF’üón#‘ßþ¬6cÜõOÁ ¿uð"ˆ®:ÿ´Ä’Úî皃ûåüÓœŸû|éæûð;t1¼ðqÁ}¦ŸÑžyžqªö½R®Ã·ÙSø,F€É×Ý’7ìfÜ»~+®è|~ëh®€/ž›u ÐÛ®’úŒpÛMýÄ}½ß|ç‡uÝëû_Y¿«àºØq†ŒŽ=T™PcnæÙËò꺽@Ïèâ›±s Ñû_à–L8ÃÝ×õøð „Bá,F€ƒÝîð1Ç™—˜±úèyËgê´Žk_4*.ÅZxU˜Í¿¢|m€Ïܧ¼LŽóCª/Ĩqz;Ö"@ßÙn}qdž»Nã›Âên[¾©¯W ús3Ö%ÀïÁ½ßN¹ ôѼ÷Â_„…ÏaQŒcà†WÿnÃøŸi:hì™>ÂWŒ¾hÐ …%Àð^x¾úU–/ü¯5ú L(üu¬L€ÛÕÙÿ†Ç{£÷/Ö +…¿‡Å0’W="9ßî ¯H~ïÀwYSø‹XŒ Ê®n ÑE¢ÿ­Ý\dLïÁ§ï^½E€‡øÎI1²oSvÙƒŠ"–Â/EàøæˆÛà†}ìÅø$»³îE À·}Å÷Jx½¯ÿÇ­pßíËàù阒ðÙ¯ÌÝ+µPÐøuž¶þÃö[¦þ·ØY(¼k À9FøäCýF¬ÑËÂoÁÂxÍ«-7>³½š+æ¾Ì{‰ö¢»ÂwâÿžXНû1,ùyî©pP+PÔrj ×Áÿ,E€ïWùÂY"‹ðàP_õû€…—òދûþau¼à»q_ŒQŽZ8‚ÌïGÌz ËàÌoÅü­Ó35Þ!â×i>Šßgqá ҬǰžBø æÖà•ò¿Kæ»ñúðëñußöønÌz E€—ï)<ý&ÜeÚw¹ð[q’õV%ÀDX~ÿ·tçô~;NóÁ¢¸ü¹Nþ¹’¸"×ÃX”`xÝõ›7 è¡ð‡pÙ&7Æ—àÏÿ N^§ÿ}Ç{ –.#œ¤y*¥ÜµõÄTª~å§Ï#M€;rªþ¿½»ÁN 0ú–4{™ý¯b¦;Q@5UÅ»÷œ™t¢‘Ê_ó@m±O'ïÛB ¶ ΪöƤ÷ã\þ0\?|äòæºj¸o8y°IDAT¾rÅ1×4ômq•Ò¾™õ=À‚³ª½>áý<—£‘“_ß™üË%ðIòñá—q’ï‘rfoôRœUíµé†ÉOp»ú>æàAmx¶™þ ‘R'oná$ÈÁYÕ^ovÀñfžñ´ôx•‡Ÿ÷èKýÜÏý½ýì¼/¦ Ïd]å®z| p“à¬jo޹A½fƒ¶P±z aÙ"8«ÚηÿÀ®_Rº—ʀݤ=¥ñ¾€ÇýÕŽßäÎ_ªmÇ÷2¥ódo$€3îy0ZÚÕ«½©Îè!ðÔù»wÕY%}$oN¡kìê-À—¶Ö¿[ó ÓÍ÷œIöÁ†ú9²÷:|âw]SC2Q½%gd_ï%§b™ûŽžxØËàï|«pGó~§§¿IØÍÒ) å{‡B)²·%„$oYÙ×ÛÎ{ÖÂ9’D²ü0–í ßðÝI²ÜÃHJóàû’•,Ù8¼Kô Ê7|ÄN›¾Œú àK‘K^Âäãñ‡ÞeÖo9­/ØÑ+BgÜu(Ì ·„©^]oZ9¡{Å ¼JöNGá)Á;+|‡s$±«×„?Öì)ßi ݽ~ ýÒ»îõ@Gðph™žxü&ÉÂ*—‡3=V à;,¢k=^$€Ô·´À>ž@j“=>Ðc-dë<6Ñc)Ê"—­ ÉÉû@rR= €¤àD.pºG$‚Þ‘‚r ‹\r@ö§y$%€ìžé `UŸÏâD.Å Ÿ“=ŠÀ÷dÜïŠ#y'€¼Ç¾'"€<±|`Oø¨NY#zœš2q9Ä©xôAgz>Ça‘K°sîÑ3ì”èvÉ\¸'€§'|°DŸ+zfDðà<‹\x“–çèü–V¦xð‘~øïhO¶$€É-/pµ>%€ï8ò|°âÁî0ɃÃ`vö €Æ>$€Çr:é)€ÁOi>Ȧ§~~o'Tð 3ÜaKV¹Pƒnuó¢åàKŸ»X3ÕƒÂðñ•Wæzp8»Îêá;݃“Àï _éšêÁÉtÀõE.Ѓ¾¸¼ÄU>èPO”<`¦·¾Y ¯®xø6Ôú àÿQ$à#tKn Ð-º%€@·è–Ý@ [tKn Ð-º%€@·è–Ý@ [tKn Ð-º%€@·0©ZÓ×´;ª5®&UkÚbãšvGµÆÀ¤jM[l\Óî¨Ö¸˜T­i‹kÚÕW“ª5m±qM»£Zãf àð¿Ù;?ïþy3^öÿÛÉe÷Ÿ>¿•Og>T­i‹kÚÕ÷fÚºóX{2Öðýßü#oyrÙå½»ëý\e~+¥0ÙÕ×´;ª5î|Ú=ºóX{a´áîa6ÈÏ{óè `ˆZãšvGµÆ½Ÿvëî<ÖžÍu³y¹ýÙédc×7—Y‡ûÌíÞßðk~Ó¾~ï‚N·2àòæºj¯õê˜î´_ 2 ãæ'ýž.Éç#?/1Àè˜î´çC\or¾ŽÞôÝ®èûkq€oÇu§=dzˆñfi‚o®ùðÓ^pXwÚ˽><ÀvïNÛùöÒjÑDiÑDiÑDiÛ,rNøöDTþ¡OŠåSë›[jÚñarwoŠž¶µ¡Q‘GÎKTaè¡Î¸µ¾¹¥¦8RaäðiÛAÛ™ÈûÓ˜©ò+t5 àW™ÊWúU=8íÈñÓ¶ƒ¶3ñýXÆã·û ÃôyÕɇ¾ YbÜñIM¦ý*5í%)C‰_‡ëXAÓ¶ƒ¶3qÙQIïç·~öâiÝßC3kÚýüð¶'IG¾®‚îkí íL¤Ý¿1 —ÿg^D\ü&³*³ª{Ý›^•H-[ZZºW½¨E/{×»Zöº²$%ßˬæôÈG$A0óäóhææ6›éÜ õ{ÃÜÃ#@>òeÅ ±p3½ªW¯^½çžsþóåüÿÇøÝwßeyyMÓXYY!›ÍrxxÈÔÔÍf“;wîðÿãäÁƒض¦i4 ÆEQ–——ÙÝÝ¥×ëû­X,’N§q]—z½~ì·©©)TUÅ4M:Oœ7Žc^D*• ¶m“J¥hµZd2VVVN=6—Ë‘Ïçq]—ýýýc¿U«UlÛ`4=ñûi¢( sss¨ªŠëº8ŽC³ÙäððMÓÈd2t:gÞ“eYÔj5,Ë¢Ùl211ÁÊÊ ®ë2==M»Ý¦ßï;~rr’ jµûûû„a(Ïd2LOOsÿþýËWòJ^É+yšè©TŠùùy&''¹{÷.SSSd³YÇazzšJ¥ÂÎÎÓÓÓìïïó7ó7´ÛmF£ý~ŸápÈÔÔ½^O.ö—.]¢×ë‘Ífñ<ÅÅE<Ï£Ýn“Ïç™™™¡Õj‘ÍfY__§V«aš&®ëò£ýˆýý}òù<ƒÁ€R©ÄçŸÎh4âìÙ³¤Ói©T*4›MJ¥»»»,--Q¯×¹pá7oÞ$ŸÏ“N§‡\¹r…(ŠÈçóDQD*•¢Ûí2==MEôz=Òé4‹‹‹4 ŠÅ"=bzzEQX__çƒ> Š":†aÈÅÚó<Òé4Ùl–n·Ë™3gøâ‹/(—Ëò:}ô{{{¼ûî»|ñÅLLL0°mß÷QEQ°mÓ4ÙÙÙajjŠ|>O«Õbvv–r¹Œ¢(ìííÉëEQÄÒÒ¶m³°°À7¸|ù2ÛÛÛLNNrçÎ&''Y]]Åó¼¿ôœ{%¯ä•üW":$;Ô nܸÁ÷¾÷=z½ž\øòù<ªª2Èçó†A©T"ŠÅ¢Tš¦qxxHµZebb‚8Ž™˜˜ Š"†Ã![[[¤ÓiªÕ*ù|žZ­FE¬®®†!¾ï£ª*¶msáÂâ8FQ\×err’^¯Çää$Åb‘ùùyòù<ŒF#t]§\.Ë]»èo*•"Žc†Ã!¹\ŽÙÙYJ¥FƒZ­Æöö6Žã°ººJ*•¢V«‘Éd˜˜˜àÑ£GA€¢(hšÆôô4ªªDZ\ä!±°2™ ƒÁ€\.‡ëº ‡C2™ ¾ïãyµZÁ`@£Ñ}5M“(ŠÐu0 ) ìîî¢ë:ûûû ‡C,Ëb8R©T0 ƒv»ÍÄÄï¼ó‡‡‡äóyîÞ½Ëää$=¢ßï3==eY¼öÚkèºÎúú:£Ñè/=×^É+y%ÿ•‰~ppÀgŸ}Æòò2óóó(ŠB«Õ"—ËÑl6¹{÷.ÛÛÛØ¶M½^çÚµkt:Ç¡ßïc¾ï†!AÍfÙÞÞf4‘Ífé÷ûd³Y¹cö}Ÿ»wïÊë9Žƒ¢(èºNÇ|úé§(ŠB.—£ÛíÐëõ‡ÌÏϳ±±A¯×“ÇÇqŒªª Ç¡ÓéP©T¤u1( ¬­­±»»KEø¾mÛôû}©PR©Qqÿþ}æçç¹pá¶m£ª*Š¢E·oß–ÖN¯×öm:´Z-LÓÄó<Ç!•J`–eñÅ_pxxH½^Ç÷}i]ôû}ŠÅ"[[[ôz=¢(¶m<Ïcff†^¯G±XäÁƒT*z½<@×u4M#,Ëâý_ÿWÂ0DQ,Ëbee…B¡À‡~$VÍ+÷Õ+ùç’g¹ž¿[ú•üuŠ’J¥â8ŽYXX»Øq7G§Ó!›Í255Å燇hš†ïûhšö­Ü"¶mK—PaâºîSÛ†AÏ5ùt]— ±išOÄež%–e¡iQë£ëºèºŽïûßxÇqÃPÚ ËãiçÌd2†Á•+W¸qãÃá0 QU• Ðu(ŠPU•(ŠˆãX*¡`…kв¬ƒ¿FÉf³,--Ñl6Ñuµµ5LÓ$ CLÓ”c(ÆãyžÓ³¤R©099Ƀð}Ÿ8ޱ,‹8޹|ù2<Àu]ù=ÏãÌ™3t»]ööö^úžu]§T*Ðï÷Ñ4óçÏsýúuy=±‰»té+++Çâcß•”J%fggyøð¡Ü0jš ß1抢pá†Ã!Ùl–û÷ï†!•J˲P…ÑhÄîî.–eqáÂi%‡aH††ªª ‡Ã'úbÛ6¹\Ž8Žé÷ûŒF#¢(zfÿ5MãâÅ‹ Êå2ׯ_—k˜eYr-{e©¿˜èâÍÌÌðÞ{ïñÅ_ÐétŽT.—ùðù{÷.¹\UU)‹bÿðÿð“öÛ<¨Y‚ æ‹*¸g)±çíÃ`0øÆsAðÌsöz=9wîœT6Ãájµ*ãp8äàà€óçÏÓjµ0 ƒ••–——ùÝï~G«Õzá±ûk•‰‰ Þ{ï=>|H†LLLpöìYööö888`qqQ.òwîÜy*pâyejjŠ……¤«µP(°¿¿ëºÔj5–——i6›Ôj5\×¥Z­òé§Ÿ~' D¸tÓé4étšõõuëºté[[[œ9s†v»Íää$›››ÿEÆ~ff†wÞy‡ÅÅEÇa0 i­V‹½½=æææxðà>$›Í’Ïç1M“……éF6M“G±´´Äîî.ù|žùùy¤p]—t:¢(üò—¿”ž!ù|žsçÎQ(°,‹¯¾úŠû÷ï?³ÿ–eqõêU>ùäR©ù|žüàt:Òé4ív›8ŽùíoûÊè•<UüÇ÷]VWáºO.ì£ÑˆÕÕŠÅ<ù|–8¹qãklÛ Óiÿò§¿Vñý€/¿üŠ••5Ö×7Ž\P4lÛ!—/ày>ëëë„ÔøAH&“%F%—Ëÿ¥»ÿ…Ïõë_ðÙgBU!—ËÐéÇq¢ªÐl6T*¥—¾^ø(JŒç€l6Íìì4Íæ®;ÂuG”Ë%Tòù ÅbŽTÊb0è1 _úúÀÑFAGÓTÒéŠårˆ¨TŠd³i,+yÇÑwߥ¸®ËgŸý‘z}^¯Ct:-ƒ>«««ÇÆ<ŠB%"Š%b0èõú>…BË2嚆ª3õQ”Mƒ3gð¼ÍæŒ3ŽËp8 “qPH§Shšúý㘇²µµEE,,,P($ 3Š" …©×{%O¥Tz+Îd1ME;fEÇ1†¡aYQ¤bY®ëáy.†a`&Ýn÷(è-Ú ÿÿŸg8Òh ëù|–nw€ã¤5›É EÉù†Ãäß_›D±ÆÙ™›üÝ»ÿTÕ§’ еCº*QÓìÚØfH1ãÇ aº³ß2è 5 -fqÒ¥?ÒpìÁH£˜MγÝ0ñCE*úv_g¦ìRÎô†vlL=ÂÔcL#ÆõÎL8M×h*üô1ÿßÿ}Ç $B×(þŸ¨j±ØÆ±B>sÈLe…î @!s€ë§°Í>Q¤Ódéxç¨Tàþý£5…|úåé;tª”ruúÃ,º–ìãXáöÚ›¨ZHyþ zÍ9²åu6^ÇwS¤ »äª<Í¡#ÜAÞÁéÒƒÖ›Á9¤Rpþ|ÌÝ» ®«`¦º§ox6¦ÓÆí•Q5ÍL&ž™jÑß‹¹ÚwîFrÁQ¸0¼E:êÑSÒ( ä‚6‘¢ Æu£Æùá-þ”ýæF+øŠÉY%ŠU––bÂÖ×Rñ€÷z¿§¡W©ûÔ…à•†Q¥4P£Æâñ3ŸeÇ,/+d³ðàAò../Çt» °µ•¼ªŠDS&í’öŠ(!Õ¥k„¾…föˆC ÍìãrèGc£#ö|Hè§äó܇oÞ°\¸ Ònoó?ÿÏÿúýõSq¾’}zZazZemc $Ž“…ùý÷“ïr98Šå†à8É‚lÉ÷–««É‚œÍ&mfg“ã’E½ZM~«VE°´”œkqöö’ÿ·ZÉ÷ׯ'JȲ RI~EI”‚çÁòrrmEIÎ¥ëÉ=d2‰ÂZZ‚¤ÝÑ©©DQåóÉõ>ÿü¯ÏQPh÷uîo9dS.›uˆb…8zlIÍN¸ F*;ü@!Œ¼£ÏRÖgä)ì4áþfЬ2pU¾w±K>ÐêT ¾—¥’ó #…îP'—ŽP€¡«¡«°²krõ\f×"ŒtMìœÇúª€x¹•ïp …eð8?æñ¹Uj¥=\?Cµ¸ª†ºG«WÆ4<ÒúyÑ>é^kdœ.õÖ4“¥möšÓä3‡Xƈ0Òy°u… RIepûeR¹}tsh(ŠŠ•î)í`:-4ÝcЮ‘ à¦/þ–ƒ7ñ·/Ï' ·ë&×.Ï}Mqæ&{>DQb*‹Ÿ&fªCk˜Î!ƒöQ™À£Q¢|ªÕä˜ééäúôYÜÇ_›(¨¤,¨äJYŸ«b›½¡FÖ !†B&ä cuBâXÁõU45Æ&‹>#O%Š&]<_¥Ý×QUPU…”áùsºF ¦õ¶‰¦&»Ï\:Åc0Ò0ô];]A¨Êø"ÿŽ<¯Jª{¼}ш"]‹è ÊŒ<Ëpy)TU!ŸWÙØ`láPɤú€†ez4ÚS Ü<Š¢Fa¤FŠú†5" RXN—TöE ˆ#ƒöÞE¢À ;±‚?Ìagin¾Žn£)×°íÇs·±œÀV#ƒÎþâÈBÓ]š›W1N~‚"–©0=^ìTÀŠ}Öí³¨qˆ¯&¾ùuû,á$-ÍÃÔeœxH_ÏÑÔ+䢪¢Ç*®“ÍB·§à«6«ö9Úz‘¡–¡«Q‘šÂŠFèq@¬Çdr:£áØX?幈÷w0xlÁ kÞu%ø¬é(uÞÁ"þ(KèÛ¸ýVª‹ïfvªdÊhúˆ8´¿ÕÜRèõTl[ù«Û þ×$Jµúa\(\ ŠN7[Ç¿‹"a–>ýwHv(íšÇ\°òX±K7IO;'Ê«ÓI<>ï¸i,Îó´ó‹ßÆûò×&q¬PÈ4¹¸ð%š1.@íË…;}üóh\TZ=V_cnÂESÁ Fžš(£±ãä³9ºžª@¤¢(àX§#SÖwcî®ý—ˆd°¬wQ“ñEM!FQã#ËB!FA!%FSUÊ•dãqüùƨjGÇCL?¹5U”H£ÊñT”ˆ8RþˆQ”'¿Ç 5u4†ÏU,&›Ÿ$¦¡Ê¾>€†®’N?¹¡QãˆHQOý[‰“‡_ Ñië”8&V×d*•Ä4Úí£yô›"%&>:—GÄ(äŠ*ÃA,­§çñ^…á“ëÃ7=ãÇ–¥Jò|äo c1£UUðý>ëëÿ™ ø— aÿk•Ç‘¼WòJ^É+y%¯ää›ño¯ä•¼’WòJ^É)òJ¼’WòJ^É+ùVòJ¼’WòJ^É+ùVòJ¼’WòJ^É+ùVòJ¼’WòJ^É+ùV¢‹º‚WÐ4ìµ ^ÿîÛŠhÿ4²²ñó¡ ydOÀ%Äòq›Çÿ%Kè±ó=MbPµ2ø,jÁÐ{<Ãöù€lO?1ÏÔæñq¸Üø}>ëz¢Ÿ§=?ÑVüv|üO?¯S1_E9Æ¿tÚ’÷y4vÏšGâºßu^É+y%¯äå%I  ÏÏÏ3==ÍÔÔ¯¿þ:×®]c00??O³ÙäìٳܸqCR’[¦JUU¹rå ûûût»]Éš**òÅq,kŠh:”¦c…B5fMÁA¡“ÊBࢂ•‚î!®‚•Žé*„AL:æìٳܺu‹ (MÅhÆ^ÝÓbB\ÌTŒ×*1QžáÖ­[O, Žãpùòenݺ…çy(Š") Óé´d» «'A½®ªê©ãËaH&޹¡ë„qÌòò2­V‹ƒƒ¹š6ä&bm…T6æ`+ùÞ², ÃtÚ†aàyž,DeÛ6£ÑèTªê™™T5á&ÚÛÛc_^Ï0 t]G=J¶ñ}ŸL&Ãòò27nÜ5[*• ÷îÝ“”â—/_fccƒn·{ŒYÓ4._¾L£Ñ`{{€¥¥%úý¾¼nDzh׿ææ+%òJ^É_‘(ŠB£ÑàÆr}Ô5MCUUÉd2\¸p™™ƒ·nÝÂ4MÒé4¥R‰ÍÍMúýþ ¿ØQqéÒ%¾÷½ï±··‡eYA@†d³Yö÷÷Y__§ÕjQ¯70-˜\Œt`b>Æ©4·&—"JSq’œ¨aB}]¡ßN’§æ/Ƭ~­ÐnÄÌÎÎDZ¬ø7s>ÂLA@B· vJS1¾—üÿÎïû”Kòù<Ýn÷˜…aY¯¿þ:gΜÁ÷}666¸ví—.]â7Þ Õj¡( ét€n·‹ªªT*mžŸìÃi×}Y÷æ+y%Í¢\¼x1ž™™‘XX$¢âXhš&ËqŸºØ! ·ÌÉ—`¼Ržªª˜¦)Ï'7Ù‘£hE(jb]Da²C÷(”8ù´Ã˜¾¢ k€ùbLgGÁ7 òâ(¡Ÿ>{ö,>L4]0³B€¡B'ñ‡„>&›«ËæŽ"J¥R²Jš¦i²d¬(?«( ‹‹‹2 dÅÀñq2>~BbÀˆc4`¤(ÄQtÂ…¥¢(ñ‘ÒHÆDÓE˜0k²2¡x¦iJ—•p¡‰êkð8æ!b_º®ËÂWâžÄó}î1ñÜ4M;¶À‹g*(³E‘Õ#Åd³YF£®ëR©TpG@’®º£¾‹Bg'ã7bžˆù%îçä|ÿ^´;ãßö¬NžëäuÄ}iš& ,‰ñ8YiS¼O§Éøu^)‘Wò×,Š¢P¯×¹~ýúcV±X¤X,bY–,‘©ë: 4›Múý¾|™;αÊvSSSœ={–?üáø¾Ï÷¿ÿ},Ë’—§P(pýúuVVVˆ¢HZAP.—eÙY±¨xžG0 Â÷;>›šÊå äŸLƒz¬r9X Cà¦ñz°ªi4»*³qHËWÙÕTú$‹U:N@àõQ@€ÂuC'Ç|<ô1X‘ F|fy”ÏL°±±AÌÌÌpåʃwîÜÁ0 Çazzšk×®ÑëõH§Ó¨jR'E”ë4 CZ(¶mË ÓÉñKÓÕ  EüÒ4ñAÖ›0ì˜Ù 1†B~"¦w¥)xt]Á"Ÿ]DzJa±X¤V«qíÚ5J¥ÛÛÛxžGñˆÿ^Äc„Õáy…B>ø€Û·o#6£ÑˆÛ·oÓï÷©Õj²¼ïûOT ô<ÅÅE._¾,­®;wîàº.ÓÓÓœ9s†7n°°°@·ÛÅ0 r¹–eI÷Y:–ÖÜh4¢ÛíbÛ6ï¾û.ÛÛÛ\ºt‰k×®±½½Íìì,.\8ª×a“J¥¨×ë|öÙghšÆÂ‚´p’Ú¡Tår™K—.I…/b8–e†!Åb‘?þñloo³¼¼Ìôô4<À0 ¦§§é÷û4›MY*õÓO?Ų,Z­AÈëœ?^Z[b~Œ<ŠÅ"Ÿ}öÙ«˜Ï+ù)ú•+WøWÿê_±¿¿O¥RawwW¾Tº®sñâEnݺÅÁÁ£Ñè‰]¬X8Óé´ô‡‹—£P(°³³ÃÊÊÊæÿ믿N¥RAÓ4ƒ÷îÝ£ÑhÐï÷ …BÑŒ–ÃÛ‘†«( …©("ÇØqÌ| i5¦­¨üçñ3ˤ«(”Ëe¬W4 (ÇIÛ* Ä çÀ(E1_´Zhº.ð«W¯J D,8ív›K—.ñðáC:çÎã7Þ Óé`†\øF£º®S.—¹qãÆã'D‹c¦ÃˆB‘Šc<’2¦º®G-Bm)Æaï*x£˜ÀMvýï¼ó\¸pÛ¶i·Ûììì077G¹\¦X,ò÷ÿ÷ìîîòýïŸr¹Ìµk×èt:t:cÖÒää$©TŠ©©)îܹÃìì,«««ôû}^{í5¶··QU•Á`@¯×;£ˆb7årYÆ2„õwõêU:ŽãÏç¹rå Ýn—óçÏóë_ÿ€f³‰¢(|üñÇ8ŽÃõë×9<<¤ÛíÊ0;;K¹\¦Z­ÒívFT«U©Òé4¶msíÚ5Òé4—/_æÓO?ebb‚N§#­)1ÿΟ?O¯×Ã÷}|ßgbbB:ŠÅ"÷ïßgssÓ4)•J¼ùæ›d³Y|ß§^¯sîÜ9|ß§Ûí’J¥¤ËWX^€ a©ˆ˜Ü¸YYYaccã/½¼’Wò¢onnrïÞ=z½ív[Ö9?<<$ŸÏóÕW_ÉÚÎã/ <Þ)g2t]çáÇ8ŽC½^'“É099ùD]h±ÛÞÞ&Žc&&&ØÚÚ’.è) ®¢ðO†N]U™>rÜÓt®Ô>ÐQòqÌM]e"Tp°¼ív›………Ä—E¸ŠB:Ž©†!E¡¡ª …GšF-Š(E!~6 qÌp8$ CÖÖÖ°m›ÝÝ]ŠÅ"›››xžÇŸÿüg¹èŠÚØ{{{†!ãµ´¹¹Éîîî1×˸„ŠÂ}]#© Ž(‚å+0èÀÞŠB$è3bhn+GŒÂèºÎþþ>£ÑHÆ4¾üòKâ8&“ÉÐív‰¢ˆÕÕUšÍ&Nç˜ QXׯ_gkk‹©©)\×¥ÙlÊû\__gss“r¹ü„ûQˆXlwwwÉåròû­­-|ßg{{›\.G«ÕbggG^CÂ0”Aýn·+¯£( ý~Ÿv»Í£Gh4LNNâû¾¼§0 %r0Ž“ØÐíÛ·988 —Ë=áκqã†:A€çyܽ{—Á`@©T¢R©ppp€¦iloo“ÏçF4›M¥R‰z½N·ÛÅu]2™Œ´:ǯãy[[[2.$‘õz|>OµZ¥Ñh¼²>^É¿HQ.\¸ÏÌÌÉd¤ùD D’išT*Â0”‹ÿÉ\‘T*EÇ'‚â;füEQ…¹¹9¤KD(M×1L“‘ð‡s”ú¡ª¤ŽòWÔ0ÄhwØ×T&''åbÐétÈårrñW5-‹(ŠŽYRõ-ŸÏ“ÍddàØuÝc÷˜Í>.Û9ÿ)•J ‡Céê»ú“÷.þ?.OVMv¿£ÑH–}|žÇUù]óô`îÓþ>ùÜÆ¿Wœ|N§±Ÿìú“ãÓÏ'ÿ>Ùî´>žvþgÒOìc×>í>O‹C<ï5žl‘ö¯ä•ü5Ë©1¹¹9^{í5Ç¡V«%_ê:ÿÛÿö¿EßûÞ÷¸~ý:W¯^Åó<P]^^æÁƒ˜¦)wÁ?üá Ã_üâèºÎo¼Ááá!¶m£ª*¹\Ž»wïâ8ëë먪ÊÅ‹QU•ŸÿüçèºÎÕ«W9<<$›Í2¹xñ"¿ûÝï°,+1óã˜Ë—.177G»ÝFÓ4þé·¿¥R(ðïþÝ¿ãáÇr';33ð,‹­­-Eáûßÿ>[[[ܽ{—jµJ±XDUU …‚ ”ONNR©T¸~ý:»»»˜¦ÉÇÌÍ›7ÙUUåððPþ|°Oþ©åɧ$Ï÷d›±*{<¹È?ëz§-ȧýöÔ~>Ç÷¬cžÕ¿ç«gôýEäi÷ù2÷þ¬ûx¥^É­¢W«UÞyç®]»ÆÞÞår™z½Žç%Åìûý>‹‹‹T*îܹƒã8\¼x‘¥¥%¶¶¶$H wÆ‘*gΜauu•sçÎÉs7ch$aÖÇqL6›åõ×_çÎ;ÌÌÌpçΆá FGQ„ªªÌÎÎ’ËåØßßg¢ÏóX]]嫯¾âêÕ«ÌÍÍ1;;ËÁÁAH÷Ñp8$›ÍEŽãð“Ÿü„íímªÕ*ׯ_'•JÑh4p]WÆ¢(" CºÝ®Ìo8M¾ëò˜¯ÊmþË—Ó`ȧY=ßÄ(ðM2þÞýsÊIvÿh²¿BíyXþ9äŸóÞOc!ù&Ñoß¾M:–Îf³I½^çÌ™3¸®+! Íf3 H+ ®ë²µµE.—ömΞ=KEôz=\×åÌ™3òïèhq?<<Ä÷}ÇÁ0 –——‰¢ˆ~¿ïûœ9s†0 Y__g4Ñét¤«ivvöX›­­-Z­¶mcÛ6/^”)öÙlV‚vvvd.ˆ Ü¾ìK—.¡( <Öápˆã8˜¦™$ÎÌàû¾ÇqhµZ\¸pA"ž|ß—JF z†Ç2Â]וŸOk#‚«ßÔFÜ$“|>;ÞÆ²,‰¨{Z›gõQdÏÃU¿©ÈÌ_Ìž§Í_ãø 8²aÇÚŒ_{¼£ÑèØu«^¯£ªª Л¦)c™L†t:-ç’¸Žp%kš†çy¸®Ëh4’×4M“^¯Çh4¶mÊå2+++b-6€©TJ¢Ì†Ã¡ à+Š‚®ë²¿"i<È/\Âãy9âù¦R) 9___ÇqÒé4Ãá^¯‡ã8Çij{‰ëеFlã8¦T*¡ë:ò˜0 å3 O»ÝFQéRïõz§¶ã)Ö5±ˆ¦R)®\¹B½^çÑ£Grþˆc3™ Š¢0 ŽÍõT*%Ç' Cƒ©TJ¸¬^ºt]拉{cáû>…BÓ4Å"ÇÓ"Â0D×u|ßǶíc)ãc.ò¶ž¦˜öâÅ‹¤ÓiÚí¶\‹Å3²m›L&ó]ßÜÜIJ,þõ¿þ×¼ýöÛ²ƒbÀÇóæææ$n]Q–——åà£Nt]— d—Ëå',”“mÄ]\\DÓ4æççQU•³gÏ>Ù/˜DÑ×7ß|ógÕxΊø. CÞ|óMÙÇqËf|€Åo'û&þ£qÿ·X˜Æ9ùy²Íø¤ø¦6'w{Ϻ޷i3¾À¼È}}›6­ã'6J©TêØ\Z__'›Í’ÏçåõTUe8Jú˜L&#ߣ?üá†Áûï¿/”µµ5~÷»ßñöÛoKWm&“‘Ê·Z­²½½ã8AÀÖÖ»»»r£¥( Ü¿_Âíßxã TUåÖ­[‹E\×¥^¯³µµEµZ¥T*ÑëõØØØ8ïZZZÂ0 ÖÖÖ8<<IJ,&&&ä"Öh4ðËsçÎá8wïÞŲ,fggñ< ¹˜V*†T€ÅbQº·EߪÕ*ÿÃÿð?ðùçŸóóŸÿœt:M¿ß—)sssr.èº.ÇrnnN.âN‡½½=&''Éd2ܽ{÷XîR.—£X,JE»³³C«Õ"NÓëõ8þ<Õj•û÷ïK¥%éÉ9ŸÍf)•J2ÿ«^¯KJ:–ì"b³#î%•JIËûßþ·,,,pûöm‚ à“O>‘F@>ŸçÒ¥KR™I’J¥ð<ïØ.HˆÐŒº®?— 4.'SÞE~Èó´1 ã}Ÿ'¯÷,ç‘6'?ë'ù/Õæ›Ú~›6 ÷õ—?±;Õ4M~/”Èx¦Xôűb÷.Î!v™º®Kn1Ã0ä9TU•Ç kGü.úròºb'-,!ã9&ã»Õñ~ (§Ø( Wíxåx"éɶã4±ë¿'Ÿl+ÆKlæâ8>†ìïÓ×g:ççŸâ7ñÝøâ}Ò"ñkŽŸëd?NÞëøØ'½ž–˜zZ¢ñÉñOPWÄãÏsüžE›ÇD²Ç¿;9Nã°sq¼aIŸöœàˆÊd¼ƒ§eç>ís\¾M›çmû¬6ßtŽ—íã_ËXO‹U<븓?­'Û?mœO^û´ßNžã›b§Í§ýÿyûö<×|Ú÷Ïó¼ž'æõ¼`“söYç=í™'æßÉçð´1Ñ…™ÞétdpX¸…žåšwÜôþ¸gùãÇÝb!¬ŸñcÅ§ðžæ·L¾r{Z±«ƒD›Žß‡ëºÒTo#|žŠ¢<áÃ÷Ÿ—~4qCâ…Ñu]úÌDÒ`¯×#“ÉP¯×ŸØ…/P"2¾ ‰›Êår¼õÖ[|(K<|øz½À›o¾Éî›ˆy0¾¨g³Y‰4ÝÝÝ%›Í²¶¶&ω;¾\.Ë ½çy Ù ;wîwïÞ•¹h§YÍbóq\9—ç1ú£gXÑãëÉ÷}|ÃòS(Øt:}L‘F£cï‹ØdëãùóçY^^¦Ûí²¿¿ÏÜܹ\EI²h}ßggg‡?üÉdX[[caaŸýìg2yîEDQ®^½J±XäÂ… †!kZˆ@ ÈÁxÖ94M“4årYæ†4ÈG}Ä—_~IE’÷I,Jív›Z­Æ•+W€„Sê믿æüùó¨ªJ&“áîÝ»§>°íím,Ë:6———)—ËrAûÅ/~!¶oÛ¶Y]]å7Þ ›Í²¸¸Èh4"›Íb|ðœˆâ>Òé4étZ2à^¼xMÓ˜˜˜àÎ;LMMIŸ¼Pv'åÑ£GT«UÚí6ù|ž×^{ÃÃCÎ;ÇÎΎ̬ÖI:fqq‘½½=>øà©„ïÞ½Ë7¨T*¤Ói.^¼Èôô´¤"ùÕ¯~E'Yño¼ñŽã°²²ÂÜÜ_~ù%Fƒ¥¥%t]—Ê[ŒÁ'Ÿ|"-ˆ¯¿þšsçÎaÛ6ü±¤?Iœ¿ýío_ ú\.—Y\\”¨©k×®ñàÁùûÅ‹Éçóär9úý>¿üå/åË-Æo_"®†Ã!¦i²³³C¹\fooOrzýüç?+gzzšééi†Ã! üÓ?ý“ Œ ¾0ñ Ú ååe®_¿N6›¥ÙlR.—1M“7ÞxƒT*E«ÕâÁƒ¼õÖ[hšF¹\¦ÝnóÅ_ ª*Ùl–ÙÙY>úè#®_¿Žªªôû}Êå2óóó†Áh4âÓO?•ï›`P…üàT«UÇ¡×ëÑjµX]]åwÞassSÒÝd2Z­o¿ý6år™/¾ø€‰‰ >øà¹É¨Õj¨ªÊ믿ν{÷H§Óüìg?;VWF¼/?üáÙÜÜäË/¿dii‰Ë—/³µµE&“áܹsLNNR­V1 C*,±!—“óåõ×_çàà@"×æææž`Ó8{ö,¹\ŽÍÍM&&&$‡ÛßüÍßHEÑh4¨T*2/í4·^N“§1>¼è¹N‹]œ&'ùíNžãäs€£ zÅÔ÷묮¬²´¸1ä²9rÙ_ßøš­Í-6Ö6X[]ãÌ™3~€7JÜßFÄqL·Óåàà Av Íe%µÅxÅ«g#,Óbuu•(ЇlooãŽÜä%ïõét:Ôjµcn&yóºNÊN±²ºB§Ó‘&có ‰ë¹Ò uRD®È¸ ‡CR©”Ü5=kbœ¡,VWW) ‡CI9"²ßEаÇE(¼­­-F£­V‹‰‰ ÙG±#:)éLF~ïyý~Ÿ X[[“Ô,½^\.'iê÷ööØØØ`~~žÎ;'!‚õzN§C·Ûe}}]’ —‚`&³Xèz½‡‡‡,,, ª*ív›~¿/wŸ·nÝ¢ÙlµZMBÆgff¸yó&Žã<“õöyÄu]ºÝ£‘K¿ß{âÙF£#RIKæ3 IƯGÇ :Õê;;;¬®®Ê`úöö¶d "(YTUåÒ¥K20~xxÈìì¬Ì·* â8ŽÜH ‡C&&&8<ÿØ {»‹f&È“˜8©Á1L4¤j¨ %dž£UW‰¼ÕR‰üèqýW 0Q@7u¶Î"ÕR Ü#ez!ª¦ë1¸Æ!Q1QÀu]:ÝY'K¡\`s}]Ñ 1lƒX !11q‡qrýQ„¦kL/O³õ`‹(|ÜUU1uêädÂ5aª*–¦Ñõ}LUÅ‹"t‘O0f¦m›éJ…[[2.4î¶fæ8’#ŸÉI§ÙÚÛ“9+Ç`É'Q'åÜì,[ƒ#ÿêI—h3q±ang2¹ËŽQË öYAm3žS‘Íf©ÕjÒÊ錣ˆD,Áqœ±‹Ð(¦¦¦¸yóÖ©¾tUµˆãEÑQ”8~ì‡VUMþù~A*cš6ºž#ŠB\÷8d1éG™ÙÙEÖÖî0õŽýf6¾?BÓÔ#×U0ñýa8@ÓtyãÖ©@WyžÇôô´¬›#\^ãxþ“9B¡ ýxtÜMê8Žô£’(SÄÓÆ¡÷âÝ>0››ãÑ£GòÜãî¿ñ˜”xþ¦iÊ„_ñŽÌÍÍÉDeýˆ¸ôÌ™3|õÕWº+æì8êh<€+X¼;Ž7Áù&îm_¤Šª@Óç4 4.ã1Fñ¾×ßñ1O“ñÑŠ’ä®E:þÌEìQœÿ´>ý%Dïæºäçò”.”l Ð3:qÓÿ^Ÿ(ˆp†Ž\Ðs—rØÓöc¿/˜!©ÀhsD÷v£jàÌ;xM«jqð›4G£üƒ2Ñ0"èÉõ~{@j6…ßõ!‚áF²k&úûÉ.5R#²W²x©¹‘›(8Œmp‚^@o¯GGäßÈyƒÒýPÇoùØÓ6΢CäGø-gÎ!†tïtIͤ~Ó§e¶P3*QûñĘ´l¦‡?í^Þ)UP°4ýÑˆ× EþÔ¨“Ò4BbVz]Â8¦¢éD­ö7ššã;^Ã÷IõKMX ã“õ¹^šv› Mc äNx‚18Þ~ûmTUeee…¥¥%r¹>”×?VÈ÷¿ÿ}Òé4?ýéO¥"úfÛ6o¿ý6Ýn—­­­cAL€Ÿüä'¸®Ë¯~õ+4MãïþîïŽ*,–¹}{×uh6ï3 ©V§0 •fS@gâ8$ž'†¨ªA¹Ü²bÚí˜zÝ%•š Žc,«ÈááMºÝ(ŠF¡ð6ºž!Š<Âð6‹‹ó|ýõ×G˜ù)Êå÷iµÑõ*…Â<ž×f0ØBÓÒLNþˆfók #‹ë6(—ßÁ÷;ŒF <¯…®§xÿýE¾üòËc/ÿôô4?üáùÇüG¶¶¶NËñ¿Ã0djjŠýèGüú׿>Öf܆!}ôÛÛÛœ?ž .]ºÄçŸ. &ƒ àÌ™3,//«w³³³#Ëìì¬d8ræÌISÈJ˜çÏŸguu•\.Çþð©f¡-..JB&“‘ ÷`0`Ÿ·Þz‹ßÿþ÷’øõ¤ú¢.Í7ÞxCþ_”1ØÜÜ|‚}Âó<>üðC&&&ØßßgooÙÙYéŠk4 ‡CÚí6Åb‘f³I©T¢ÝnS(¤2˜ššâðð¯¾ú MÓøÞ÷¾G»Ý–ÏèwÞáàà€K—.ñŸÿó¦Ûíòî»ï2 ¾ÑÍÿÏ!ºØY»}— t4KÃoúÄALÐ P … 0*ްj–dŒyq³Ä—BôŒŽ»ï2Ú¡Ú*FÁ@³5tG'5Ÿb°:@ÏêXU TÐ3:Ö„Åpk1èŽÎ ;xÜ‚n@Ðð»>…«MAK%Ö‰b(ø-Ÿh{1FÖ öcŒ’AäG‰ÅcªØ“6a%DÑTKŪYý€ô™4e@ØOú´¿à£0ÄÖ4,U#¥iL9)ˆaÊqPi“1 &l8ô<^+ØèyÃ`ç]ª¢ «ÏŸÇrš´|ŸšúÏùb R©ù|þØÈ«Èäž™L†N§C³¹K>ÿ:ÅâëŒFœ;·Ìüüÿø{hš¢èèzŠ~M³ˆ¢RiŽ|Þ'›]$Ž{„aŸÁ`‹8Éå–évaYe2™yúý-¢(fffK—.R¯×Y]]%Ÿ¿„ªj„aÓÌ“NÏáû£óDÄqˆm—ÉåÎÍõ€Á`M³ÉfÏÐnßÇu÷ê¸ ´P(`Û6ù|žçzvãmNŽß¸œˆ¯T*[Òï÷©T*Ry„aˆeY2‰RUUŠÅâ1Kq8277'ÃΜ9ƒã82éí4·°ˆ‚€ ¨T*ܺu‹\.'ùB.“ÉP©TðÛ>Ñp 'ÊÂȸû.ª‘Xq3ÜCZ×Z‰%b«hŽFØ?âàR"/b¸5Ds´ä<ƒ°âÖ]kƒDñ8‘¡9£ÍQâÆò"ôœŽW2622†Ž®¨Üm·Q…»äsô‚KU©»#¶}¢#eÚô< ¦IÝ=÷øÅ1²ý·•‚arè}³E‘Dƒe³Ynß¾MÇÇ)'% Cnݺ%¡´'ess“¯¿þúÔ:£Ñˆ7nHe% È›››Ôj5R)ö CÃH³¶¶ÁÞÞ.áNëd³ËÔëDÓ<ï]ÏñèÑ6‹‹%î߀çYD‘¦™ ‡{ÄqÄx^‹n÷ÃáŠbÒh¨|úé§2NÓí>Ä÷'èõÖI¥j´Z7ˆ"ÿè~‡t:±í ¾ß¡ÕºƒmOÐë­á8“ôûŒF >TÈfsÇîwccƒt:ýDläYò¬ñ;9–Ô[ÙÝÝåàà€F£ÁÔÔ”<Æ4Mnܸ!a»–eÑn·%5P©Tb}}¹¹9¹Œã„"d<üððt:M½^gffæ© ÈkkklnnJN:á Ç€)â¼Ö¼¶¶vÌJµivvvdѲ—•ÑhÄÎÎŽtÏß¼yS’›žQZ`uu•Z­ÆÊÊ Žã°³³#]µ¢Ô³çyÔëu¶··ÙÛÛ£ÕjIx¬ÈD°ïf³Éìì¬,è···'+ž‹Eƒ[[[qå œû¿Ÿ‹kÿ¶†¢)„Ãd1F>Ù¡x-E=òAš šõr»Þ;ÿ¯;ìþÇÇ“DÏëI\C…ØO€žÑ‰£XZ)á(DOëxMؼhšÕPñ;>‘¡YÁ çÓÓÉy5±$ÂQˆ–J”BÐ @³hôt]AO'.-ÍI”©¢&ÊÌ;ðPtgÉaðh@>îKJÓHi:Í£9¥iªJZ×iŒF-‹~Ñ ºÏ`Ì=‘Öu&í{ÝçǬnÖuvG/br6›cg8 " 8—ËI:|×u%Œtbb‚\.'ÑWý~_.P§ö1›EÓ4¹‹¦i”J%YËã¤äóy¬UU•™™™#þ¨4½ž‡ï«¸îIþK±†®§ñý¶]!躃ªŽ€@âÛM3¦9¨ª!-‘¤_Ž3Ät»+(Êq7ˆãÌ¢ëÃá¾?þ¼T #C'Õj‚`ÈôôA£Ý>Àu€‚eUðý6Qä=÷Xœ&Ok#àä"÷F丈\W¯V«žËåÐ4M沈ÜÇqh·ÛÒÕT«ÕX]]=rýY2n2ž# ¸étZòßÉy~TðK,Îã\PFC’­Š6…BAŸ›Í&ÀüE®–hsxxÈÔÔkkkßÙ¢*ÆAXQ§Pòù¼´®EŸEñ¹ápxŒvD|žì_&“‘y‚ \€h8FÄx„ÕZ(PUUŽÉ_Rt¿íÓþ¢b( Öh©DAÔþ›±ÓøUˆÃ˜â{Eœç;³B YÀS³)ô¼ŽßôQ %QbaL8 I/¥©ÿ²Ž=mc–ÿg÷Vòâ¦f7Wþ­<ƒ•™sÿ|HØIŸI“^NCfÙ$&ÆÝsn zA' f/gE•×éßïã,8ÄaLäGØS6á0¤óu«f%Šcu€jª%ã˜r)_`!áç;[ô‚€‹ù P³S솼Q,ñÉþ–¦QŠ-²ºÁÍü8bÖI3 Ÿ²Ò5ò¦ùR $ˆ"fR÷ºù]&“áÃ?ä믿æ£>âÎ;d2¾þúk–––Èf³T*.^¼ÈÇùío{ê¹EáoÿöoÉd2üûÿ«,,,ð“Ÿü„_üâÇ ² E äïÿþïQ…·Þz‹z½N*esóæŠR¡ßßÀ²ÊLOd³Š¢†°¶f šfÉK;3Óö¡×˰» ë)|¿K*U£Û}D£ñš–bzúGD‘G¸”Ë o¼ñ¿ùÍohµZ ¯Q*½I¿ŸÄ¹Êå·´Z71Œ,ssÿŠò5/β¿_ç7^ç“Oày&©T EQI¥&i6¿d4zl½---ñãÿ˜Ÿþô§ÇJÏÅ‹év»ÌÌÌÈÒÀ½¸¸ÈÍ›7eNDÇ’¡[çÅb'bÅb‘Ï?ÿœÛ·o˾½ýöÛÒ*b‡‡‡LNN²»»ËÕ«WùéOÊÇ©ÕjüèG?’…íþáþ~¿ÏÔÔóóó²ÐÛÕ«Wùõ¯M:>Æyõ2¢ª*?úÑ$¨accƒ_ýêWO÷Þ{ï1==Íúú:ÛÛÛœ9s†F£A>Ÿ§ÝnsùòeZ­¹\޽½=ªÕ*½^©©)™ÔY*•ØÛÛã³Ï>#ŽcΞ=K»Ý¦Ùl’ÍfùðÃi·Û¼öÚküûÿïi6›¼þúë Zô¯@¨"Ð1š•øUKÅ;ðð=TKÅȨZòÝw-FÑ è%‹§–ÑÐ -¥aU-T#A^™&‘1ö´¢+ XM£Ø‹Q …(LÜMVÍBKih¶–î÷ô‰°$Æ%”UìljòTAKkXKZVÕÂ;ðÐ3zÒ—Q” ÅƤ麨ŠBÆ0(š&à ÀÖ4J–EF7𢈼ib©ßcÊqpŽo†ªâ†/>ñ_ÄpB†a(QaB„»ibbÛ¶%ïÒÔÔìîî2==-ÙaŸÚ·#ó|¼(׸ æiT "KYøÜ£Ðb†ÃªjÉ,†>¥R‰óç/09YczzLfÇI\AÐ'Š–T',N‘z2€-ø¾Dà¼^¯S«Õ¨V«’•X° çóy 3VU•|>O¥R¡T*qxxÈÄÄétZBi¿K{ÑOßyÚ<¹ÃÃCi™w»]öööð}ŸJ¥Â‚T"_§T*É\5Wd euu•ÙÙY‰"ìË¢‚åîî®Ì?ùK‹²ü]ŽË•ѳz—=ÚýkV²˜†ýÅ8‚Щ`ä¾™èðYrÒ…eOÙÄQFQâNJë2¢è ª­BÂ~ˆ–Öp÷\ˆ!5ŸJb5Gm5GÃo%1“È‹0òá0ïš“`œ;†xÄeM$r=“¸°Œb Pm•Ø1'LúûƒÈ°k6ý•>‘;ÅՓ؇%‹²­j˜šÊ( ÑKÕˆˆIk:ëƒ>–ÍÎp@Ç”-‹²i³¾IJ¦EÞ4Yy·×I9—ÍqàºÒí‰?|qq‘ I.‡G‘N§¥»b<±ñ4)—Ëhšv ‰#Ä0 ¹óqœ(›ýшP@Wãdz…qŒ½ÜË¢( щ+{žÇ½{÷ä‹Üh48wîgÏžåÞ½{LLL›››’™ùÂ… 2p/, 0 eV¾ p Ã=r£$ Ç 7†¨†Š¢+ØS6‘Ñþ¢ j²Ã/~¿˜׿£ˆ¢+äÞÌ¡ 0Ú¡¥5Šß/â·|ŒBcpÎ8ݳdbLC¡u­€]³éÞ>ÚG‰;,’ ¼3ç¹!…XU ³lBúúDVDöRÕPÑ3:›:_uÐlô™4ЦàÌ;ÒâèÜè guÒKiz÷zÄA¢€F;_¨$’eo4¤íy¼S®P±l Ue­ßãµ|‘ˆ} EÁ‹"Þ*:ün7Š˜N¥9x€¥©ät“-¾9kÿiÒõ}¦S-ï›]“®ë2==ÍÄÄŽãP©T$ìðiÇI}÷ÓÍÂÂü1¾ïó“C’9ÿ½ï}OÖrÉÄ¥àû=Òé9L3\¸`399ÁhäÇ:wë¶)S,,ÄÔj#‚ÀÇugÙÞ€ápÇ™Â4 ììü#¦Y`jꇌFÁˆsç.ðÞ{oóÓŸþ”½½=*•÷Èf—èvbY%&&Þg4j!¾lÊåwqœ¼ùæ9ºÝ.SS5~ýë›FŽJeßï‘JMâûm‚àñ¸-..òñÇãº.wïÞ}®g÷´ñ+—Ë ™U.\MB:??ϵk׎KÓ4Þ|óMYKDXŠ¢0==Í… øä“OŽL*‹ÌÌÌÈÚ#¶mËÀ±mÛLMMQ¯×)·B¡ÀÒÒÅbÓ4¹uëµZ™™VVVxóÍ7 ܹsç…æ±¢(”Ëe=zôÒ1+W®ËåX[[“|fétú :@˜ß~ûm ¿­T*’A@{'&&øÝï~G¥Rammóçϳ¶¶F¼÷Þ{@‚ªó}ŸjµJ.—c}}Á`Àää$­VKºs—––(—˲°Þ`0àìÙ³¤R)éÐuk×®133ÃW_}%ãZãt5—/_–VeYLNNR*•(—ËÌÌÌpሢˆJ¥B³Ù¤Z­òðáCÒé4»»»Ü»w]Ñ“ ¡guìÉd÷þ¡ 2žŽB"7JbÏÈy¦_^9QÎ3Š“ëDG®¬8±‚â0&FÄQœXEƒp\ß9ã hJ»ˆ“ØÃŠl †›CüC¯é%A÷#7aÐ ‡!ŠšôßÝw1²‰‚!΢“¸¿t%þ*A/ ò’Ìpcˆ‘70 F‚eß{Ëópô!Ý £ëÔG#,UÃÒ4TîKUQP¨»–2YlMÇ<Â8ÂÔ¾…?ó%a<¯©ªë<|øÉÉIVWW)—ËÇËžÖæÁƒ§î {½{{{Oв;ïyžtoضÍáá!¥RM[=:†0ôHN¯ ëa¨cšY†Ã&šfÐnïãûI΄ifyø°ïˆc8Žè÷7‰ãE ž×BUmT5#9ÁŽf,¾ßÅ÷»Øv×=”H è÷·˜˜È’N'üPÝnÁ …i–‰¢ÝîC ¶'÷žk,ž&Okt% 8¨XEIên·+y­ q¡ ØÞÞ–mÁk%ˆAÇßÝqveMÓØÛÛ#“É055%-Á“5ÞÆ4MZ­–dO¨×ë’ëKWþ%EÄ¢D…Ã|>ÿÄg|žŠœ˜f³I·Û¥X,Jé8NBÛt´¨û¾/8³Ù,étZºwggg¥ëK¸èŠÅ¢$´„ 1¤2JEü](èõz² «®ë,--Iþ?{øð¡dyÕeÇ!Š"¦¦¦¤â´m[ºÎƒ$Ú¬V«2€¯TR³—³‰â8‚¿%Ö@ä'JCBьǓH°ŒŠÉ¥k s/ú#ÿ/ÚïýÃí/›¡ªuÄ ‰‚¦h„j˜Ä5@ºÎôœN4JzÍÔð{É®Æ*[ÄJŒ×ðd¢a4JOĉ²SH‚ç¦Bì%î©È‹ÚŠ–„bŒ£8É…((ɽÆ`U—˜ˆYU‹Ñöè˜ÑCUñ(Hü(B?¢_Ð]Q1U•”®±;’Ò4úA@LâÒ*š›ƒg'ôKÖHÕ‹& ŽËŒãpèz ž&v¤KKKªj (>ŽcËŠýþU5‰ãM3 ‚É|‘…®(*ªª ª!¾%ÔhZ7Ñ4û¨M,ÛªªÍìì4¦©J¦Ûn·‡ª&Ç&çÕQU“0<÷Xœ&Ok“(Ê­8N÷/@ "¾133ãG¤e!h3}¹ ÔÂRl¼ÙH¸·† ¶æq D Zñ“ñ AÞù¢V„¦i,..²²²òÒˆeY’¦Eüó<ïÔy.\}"F$¨vÄÜçwXYYaooB¡@'%ÃcöÉú b\ƒt ŠäY+§4y6‚Ê=•J+“0^Š@€PF£‘̣ɗã1©t:-Óx)‹qúÁoæû>J©TŠ———i·ÛÌÌÌðÉ'Ÿàû>~øaÂÕé ª*wîÜÁ¶m®^½Êµk×ð<³gÏ&ôFîˆÅÅEîܹÙ¥3¬®­Bœì”rù\²ëÉ&ŸNÚ‘;™éZí„dO˜Z÷îÝ£Ýn“Éd¸rå Ÿ}öará²Ù,×®]CUU>þ›iµZ|yýË—š4¯ä•¼’Wò]Ë‹£ÿ¥Šù|žt:Í™3gøâ‹/ÃÙÙYɦ¹³³#IÔ ‚`ˆÉ>…B\.ÇÛo¿µÜ¤v°çyôz=ö÷÷) d³YæææŽ±²†‰¯¯ßïË`ŸÔˆdAèW*•H¥RX–ÅÌì ¹|Žë_]ÿ¯þA½’WòJþeÉÿÖ$]°W¶Ûm>J ±¨ªÊ£‡ˆâãlš&óóó4 if‰B3šš æææh6›á!²GÛí6ŒF# õ DÂL<ý_ý5³3³¤R)IGI¢“(âÓëõ(•ÿ£‡èv»ÿ»xP¯ä•¼’Wò×&Êä¿›Œ o%þ9ÁGq‰ÇÃ榨I"žf>ÆnǪ`ÁãØ‡¢>.H//¦(ìüý/:2¯Ú*º¦S®”ÙÛÙC3µ$)0ˆˆ†º£ãw}ÉK±l«§uPN,T’\–aDäE íÊm Q»‰ý$g$ŽbI‰"b:ª®zI]Ï$Ð^EW "¡I9âÒô'^Ó㈿CToTG®9KUÑ[Óhy.Žn0|L5¡°wÇ|µ†ª’Õcùß$†¢¢« ×:–M‹Nࣖ×4M?†ðïŠàœˆ{yž÷Lö`Ó4¥ßõ‰‰wçy'åi1Äï†Aðì˜$žá¢ªŠ’ ¯s/Ù¨ª…ªG”(b>›XVˆwŸ8§e•Ñ´®{@ŽûÅTÕ$Š?Ä€0M¯×–}5Œ,Aðþûsq¬ˆ:q~Aæ7^@Ì•T*%+kŠxÇxÓ4e ×²,Z­–,=Ç>wÁ{˲ŽmHÇïç»?dž§Á«Á¤˜£©TŠf³)cCÏó,Å;&žçø{5Nó/8匸ž(-ü—=5—š¶Pm•áÚ-­G1Õ¿«õ_Ô%ò*÷fŽÔLêÛÃxh_o'Ðà#IÍ¥°§l|Í'?™GKix‡º£'¨«E‡ú¯ë¤æR„½õ0x” 3£ídqR4…Â[èŽNñ{Eˆ@uè».A/ÀÝsQ4…âûEb/ƪYôô0 &QCR³©„Îýf7¡±bF{#ì™dqó›>EÓâJ¡È½N›KùŸÔ÷ã˜Ö¦04•a²7òz¡ÈûG …‰Ò¸ÛnÄ1óN‚fzR0MЖŽNû¹Ûœ”¢•$#>KFL¥R|ðÁ¬¬¬pñâE©TŠÏ?ÿœóçϳ³³d2•J…v»M¹\–Ê@ÔrÙÝÝeyy™ÅÅEnݺÅ_|A.—ãý÷ßgccƒ3gÎð‹_üÏó¸råŠTÜù|þTš•.ÑU3A!…£Ð ‰ü¤Ž†Ûp‰ƒ„JUÔ„Î}g„=i¿TÈI­Ä(ˆÐ3Gu9j6VÕJXqÍ„J„ˆ„j}Êf¸6$ŽbTS•4(qtƒž{”â5™åLÂÑÕKH}|Faˆª(¤tQ&H+MGWULUc*ë$ˆ,U¥d&4 wÄ¥|õ^nàãè:»/ˆ¦Jˆ^ÇÛñ=ªvêØw";¸T*1==-wb ¢i[[[\¸pA²ˆž&¢6´ar‡:.¢íiç$vðx7,j¥'ÕçvÉå&(.2077ËÙ³gŽÜ¢6žÇÃá6qœÐªçr3”J¶=ËhÔ! G„ˆÒéÚíÛ˜fÛ®1lE SS3ÌÎΰ¾¾ÎÊÊ Ù왣Ìó–UÀ¶kF†^o…(òñý.µZ‘óçÏsîÜ9‚ ùNÓRXV‘V놑=R<狧ɳچA¹\&•JqxxÈüü<¹\NRµ 7µ‘ÃQ«ÕH§Óñ#Î577Çþþ¾,vÉ¢?77G6›•ä†ÝnReÔ²,F£•J…V«u”ÀiHjö¥¥%¦§§éõzÇJ¶çq ’JEX´ŽãËåd¤èÃw)ƒÁ@RÜ?í¹ôz=&''%©cE,,,0q‡ùùyÂ0dggGŽýòò²L˜‡ìV«U‰ÌÊd2”ËeYljjJÖ›ït:ôû}òù¼„äþ%EIêaƒÔtJfc+Š‚b)ä®äPÍäá¨ÆwGç.$cº·»ÄÄ„ý#o0Ú¡ÜJ`´"ûÛ?ôZ?’n2¿íc Ü]¬·WF'ôõeî‰Pª¡Êª†~Ëgÿçû莎žÓñ“<Áê@Ö”(^ã¯õ ‡!fÉd´wdù(‰å |ªJLÌ×­&* a£© îˆáQ͆;âA§-]G 7aë}:÷(Ž â—ƒ,æ “ú ÷’¦i´ÛmîܹÃúú:†a`Û6Ùl–z½Ž®ë¬¯¯Óï÷%Ûèi†!_~ù¥dg=)âܧíž]×åóÏ?—;[A‹±³³ÃÄĦÒïoE.†‘åÁƒ‡¬­­J¥C×]¢Ùü#ºîày- #Ç;™-±²ò%a˜"Ž}4Í¢ßß ŽÃ#WD“Vë®Û@Q vvTZ­]Ì{»}Ë*ÓïoaÛƒ]éŠ Ãíö]jµöövùꫯ©Õjìí=DU'·$]¼a¯Ë½¶¶†¦ißHÍþ¼ãçû¾´.feeER‹×ëuæææäñAÐh4ØÛÛ“EÞÀúú:kkk(ŠrŒÎ=êõº„ÎÖëuIyÓívÉçóÇ(ld­ðû÷ïsóæM n™F£ñĈët:™óP*•¤‹®Ñh°µµu¬oß…AÀïÿ{iEœ&"¾»¿¿¢(²Ô®p9‰ÒÀ½^Oº¤¶¶¶X__—™ía’ËåH¥Rܸq×uHCSxžG£ÑŠpÕ ·âÁÁÁ©™ùÿœ¢•?.ÿO…· ’…WKi HÅ’ ¨j¨2kû$‰à‹Jã7 zw{IR^1)èû S®ÈáPt%© Øö¥ëIµTü¶Ÿä|ÍUW¾®ÞQì"§'ŸÙÇŸ‚ž(±vâ –%rUKEKkø‡¾¼~äGh¶–\‡¤wà¡§uF[#¢Q„‘K QRšvo4$ˆb"b\—AAcª*{ƦÒpú’ ŽÙ dŸ‚BZ×_È…¥©‰ýÑ{ “½lY4=oÌç,êÊ ô<¶Òé´Üm¹®+_–§‰({Z¶ºðï¶ÛíS±ûé7å.PÐ1ŒF¾0láºMºÝ­V‹zý€f³N¿¿ëåyô˜8pxx€ëvé÷wQUýhµé÷·ˆÃ©TU5h6£ýðý†‘Æ¶Ë ‡;ŒF ‚ wt?ªªsp°Æêê*F㈷¨J¯×d8ÜAQ4L³ÀhT"bNç¹óžgü‹ÈüK¢\®¨s!ªQŠRºqÓéth·ÛÒbmÆÓ^¯'ÏÿHjËw‡2GAÔÈ”ñ‚%XÜËîî.†aív[–Ì „$+õˆx¯D¸P"‚´Q¼“¢&½à6ûK‰tÚ_·>ªµaR“¦ÿ°¢)˜eó17ILãR¾À¡ëâFg³9T`ÆI³;r¥Xä÷û{˜ªJÇ”,‹Ouü(¡sï/ÆtœÒ4ò†ùR‰„£0dÖIsçq”……J¥,--INŸ¹¹9¶··ùÍo~sj;UUùøãI§Óü/ÿËÿò„¢Y\\ä_ÿëÍ/~ñ ɽ%Ä4M~ô£áº.ÿá?üâ8æüùóLLL ë½Þ¶=‰ad1Œ ù|–Û·=âXE×S(Ѝ ®ñø I¥búý;;!š¦ãºMR©)l»Êþþ'èz†ééãû=‚`ÄòrÄÛo¿É/ùK(•Þ¢X¼L·»B*U£RyŸÑhŸfóË£¶?A×oqåÊMΟ?Ço~s‡Á Æq&â2“4›× ÃÇVÙÒÒ÷wÇÏ~ö³'¨íŸ&Ï?UUùÁ~€çy„a(ŸÝW_}ÅÒÒ‹E™˜Íf¹zõ*{{{ôû}LÓdrr’\.'Ý•¿ÿýïqGRÀÏÌÌP«ÕÈf³ôû}éjµ+jµ¿úÕ¯ŽUKœžž–W®\‘µAt]gkk‹·Þz‹Ÿþô§ÇîgrrRòS VfáZÚÚÚ’tî©TŠõõõ—N$Ìf³¼ñƬ­­199Éþþ>“““|þùç§_«ÕP×u¹pá³³³LMMqÿþ}ŠÅ"ív[RT«UF£333t»]i}lmmÑh4XXXàüùóܾ}›O>ùÇqx÷Ýwi4,--ñ÷ÿ÷ ‡CΜ9#Aù|þT+ôŸK$»Ø±kކžÕqë.þ¡žÕ1Ë&zFÇ;ô¾3–ßô“˜GÛÇÈX“VBâǨ)5aä=R.VÙJ2чɢ.²ä%ÉOþH R¡‚×ôð[>£Ýa/””%";]P¡hé„\Q1”Ç4ñ1h¶†–yŒú²&,ÜzBØhV’ ûÉðCŲðˆ´n0aÙŒÂ[Ó±5 [ÓèûiÃÀP5=—²iáhI&©ª@ø-ÆõeKxcè¹§ÉÁÁétÇq¸ÿ>år™ÕÕUŸYLJìxŸ† ‚@îÎNkÛëõ¤å"XLò=“ h¡(:Ž3I¤ÓµÚ¦™Ã¶ËØvõˆ¢]Ãó:D‘®©V'PÕªª†.Q0&Öˆ¢hhš…¢èø~²Aqœ®;"“I\N¦™Å÷ûGtîeâ8@×ÿxè÷·Éå2”˦§§‡¸nÓÌ¡ë)ºÝ‡ ‡{Øv剱;ìç~vÏ?tŠ¢ˆF£A±XäððÅÅEIe23Uþy ¨éû>ÙlVÒ»Ïψã˜T*%wþ®ë²¾¾.­’qIêÊ?¦…T Žã`YÝn÷XœådÇqäïŽãHº÷煮­‹q4ÚäääS+ üƒƒòù<£ÑÛ¶ÙÞÞFÓ4²Ù,2awwÛ¶1 C"W†$DÜÝÝ¥Óéàû>‹‹‹²‘X«Õ˜šš’(º8޹ÿþwrßßV”³ÿ·³ñÄ¿šHÜUA$Kê†*Ieý %)óú2"èÜõŒŽàáŠÃ¢$¢9š¤hõ;´´–P½÷‚Ä•u˜@êìé$ ?Ú¡h o0 N”‰¢'qEMŠTEn$iQ¢ Qš­ôƒ¤öˆ¡e4 ÷Õ­ZbÑhNò›=mÓÔ?V1gØšF×÷QP05CQ¥{ÈÒTéªÚôÉ&MÏ%Œc †É„msÿèÜ‹¦IÎ0Yë{ß¹lŽýÑö3`³ÙìH_Z÷îÝ“,¡ÏZô²Ùì1Wɸ|›Š„­V‹L&sä6qˆ"÷ˆ}„¢ÄxžärË~}D;2B×e@¡áà ƒ¢¤ˆã]OãR}@!•ª†.Š¢¢ëš0¹GtiL³ iÙƒ`DGŸ ëyΜ™#“1¹sçööš@rl‚ÄJ¡ë6®Û|î±8M¾©€˜ &XÛ¶e=öN§Ãìì¬,MœÏçÑT’š\(ŠÁ`Àüü¼l#ø¶Ä&B×uY#ÆóŸg0È|5Çq$?™mÛ´Ûm–––¸sçÎKsi I1E‘¤9ÍM$jÅ÷z=2™ŒTºâÞ4M“Pf¥VE²äŽK­VãöíÛ’ÏJ¸+• ÝnW*XÍgUþK–¶Õ#/©Á1nÕ‹dæb"è?H\6¨ 'ÔË*!=•>›ìRú’ݦY2òÄaBžhMZôîô°'í%æ=,a1ä®ä¤ ÌïúÄ^ °§Ô“»ëbMZ !ã( ›%3A|MÛ VI-’3ï$pÝVÍ"r“Úéö´»ïBxÄÑ¥)ÇHZשÙ)¾v ãS3©Ú61°?²”Ér¿ÓÁ‹"ЦŠdMsý[ Hb^¾&ºzÄßõ,5?–——©V«Ü¹s‡……€§Ò\Ë19²\NS ŽãpîÜ9nܸqê9æææð}Ÿ»w* ¨ªzD%ï0êt»Qý(Ç#Â4!Š|Úí»(ŠJ:½€¦uX\ÌÓl‘Ùehµú¤Ó3hš®§9<¼)GUUÍ#´UD§sT*᳈ãtzŽlv‰Nç¡t¨ªE.·ÈÖÖŽ“ä+$u6æÙÛÛÁ÷;˜ftz–^oõ‰q:wî_ýõ3ë«<ïø ]Áiåû>SSS4›M …‚ôí I¥Rrg,Ð?Ââ®—ÍÍÍc •`ø¤Œ‚ô¯T*ɪ|žç‹™«!—ˡ뺌­išF½^gyy™ápˆçyärIa®ýý}2™„Ô2Žc&&&˜™™! Cö÷÷Y^^æîÝ»ß c¡P× ÷Ó6I‚w}}]RÛ_ºt‰ÑhÄÝ»we®ÌåË—%ûn:&—Ë1 ( ܸqƒÁ`@µZeff†ÕÕUÇáµ×^c}}\.ÇÎÎN‡©©)&&&¤‚´íår™­­­çž;ߥèqKbÀáVRCC5Uœ‡È‹èÞ風 á ¤ø~1‰C|‡tî™ ’rºª¡Rü^1±€lwÇÅ9ã$A켎žÕQS*‡Ÿ& ’U±¬'%m¢‘ÔÙs ¼ÍJª j »f£ç“BR‚ºÞ,'÷a–LܺKÐ pÙ«j%ÖÊQ%DÍÒ(¾_¤w·GäF kû± ç\6Ï\:Íz¿OÛ÷x§T¡dYؚƣn—Kùƒ @WTFQÈ[¥ÿ´»Ë( ™L¥ØÁÒ´¦ª’1^®>KËó¨Ù)î7ïž`˜˜˜ ×ë=U(ŠÂûï¿O†¬­­=ñ‚ÏÎÎòæ›oÒjµ¸uëÖ±ß,Ëâ7ÞÀó<îß¿OضÍÜÜ®;¢ßwÉdf1Œ„.ûµ×²ÌÎN¹¼ nÜE±÷)¦˜˜ˆ(•Êxž‹ï/±µåÇ.ƒÁ6©Ô$ºžf{ûçXV‰jõF£}‚ÀåìÙó¼ÿ~Bç¾½½M¥ò.éôÎCL³@>ÿ>®Û`oï4Í$—»@&cqõêF£ù|Žú§›èºC¹ü6®{€mWêÇê©ÏÍÍñæ›oÒl6Ÿ›ÊüYã'ÈEQ®n·K¹\–Å¥Nº{Òé4…%u±ûÖF>Ÿ—üNŽã055%c¥RIΕ•Y}\ضÍââ"årÓ4%ûî¹sç¸ÿ>¯¿þ:ÍfSÅE¬-ŸÏ³±±A|ðÁär9éR}ýõ×eÜæ»pcyž'ÝOår™sçÎqïÞ½S‹¢?ž‹/Òëõp]—~¿®ëôz=vwwùÞ÷¾G*•’TõgΜauu]×¹qãårY*QQ¤ ’àü›o¾‰®ë¤R)>|(-› .Håöö6ªªR­Vi·Û"bzAÇŽì¤!IaœÎ=ò„Òw ãÃ8ÙÕÇ$Æ(¤ÿ žÓ—“áî¸9ƒ°—ä©8…1:÷0óŽvGøÍÄšÐ3:fÅ”´ðA;ùŒã˜pp´ˆ —¥ô4GKèÜÛ>î~‚Æ">ò‡)‹ÁÚ=—(1EQð½ãnŸº;BWRº†£;¬ôºøq„¡¨„qÄÎp€¦((Jb‘̧ÓXZ¢L¼0”ñ¿—|¶¦ˈ–hš&Km>xð@–!}zßbö÷÷I¥R§þ~xxÈööö©Ö‰x9D9Qñ"011emEáQÜBe4ri·ÛGAÖ]/Ñïï ªíö¾_òù¦ƒô,ª©&µ=ŠI}õph}QþVÑÚÕN²Ö#7’1«œÔDüTpæú+ýùIO׎ÜAîµ}LBgb¨I6º¥%Ô&#©FHãiGÓ™rR<|DÎ0ÈèÛÃo_Pj9›eg0|*» °»ÎT*%Ý‚"Ã}†õò²T&Ÿ~’ÎÝu=ÂP' ‡Ò…•@rUTÕÄ0&é÷×дqìùÿ‡†~”¬¡ªš–BÔøˆãðèžSضƒi*t:múá§W1ÍaèÊØ‡Ø‘hšÉÄDM‹ÙÞÞ!.âû Q”Á‚H^s…õ]S™ˆZã5åE D<Ϲ¹9ÖÖÖŽÅ>ÆŸ“XœDgELOOóðáCIA"2×e¸ eЍê'úd†\dE|FT%×T&š¦ašæ±8Ž¢(²nº¨(ò"¾“‚R¬!êc„a(kgœ6¿Õý¸ NÄQ`A@ÑEüFXL‚2EðE‚¤PÒ¢>‡p‰‰ç->E! Ãç®fù]Šî·}º·»h)áæ0Y„ƒˆòGeâ ¦ùû¦ŒdÎe’LôïPRs)ôœþ81°Ô$×ì!åÌ;üþ€Ô\ 5¥Bˆ¬hVL¼/Q:¦JþÍ<ÃÍ!ƒ•FÉ ½˜& ’ò¼Š¡à5¼$Ã>NrAP’øIÐ 0 ДI!«Ô\ŠhѽÛÅYJ*#úm-¥¡§u‚N@Á4¹ËÓõ}æÓ~µ»E¼W®àEŽ®³?r¥PäÏÍ)MgÖIÅ1›ƒ>áQMtå³Ê U%¥½\ýôSÎ;'_lQºôiÅvÞ}÷]Òé4¿üå/Ÿx±«Õ*?øÁøío++£ QU•>ú×uùÝï~‡¦i|ôÑG¬­­Q­NpçΣQŠNç©T•tzˆ¦)´ÛÚÑ «“É,‘Í.}Åd~¾i†t:!õúÇ™<Ê¥(pxø5½ÞŠ¢R(¼F¡PäìY…ßþö¦Y£Óy@{XV…‰‰÷ñý½ÞªªãyF£=²Ù,?þñßñ»ß}Î`à`Y!ùü;„á€Ñ¨~”—’"žåððÖ1R«ÕøøãùÍo~sjå»ÓäiãwþüyINÚl61 ˲Èår’;jccÇq¨V«¼÷Þ{´Z-TU•AÙT*ÅÎÎ ²Tê­[·p‡¹¹9Øßß—J©Z­Êœ”T*ÅÞÞ |úé§xžGµZeyyÏó¨Õjlnn’Éd‡äóyYºø7Þà·¿ý-ÛÛÛ’}`~~ž·ÞzKÂ^ņEäZ¼ùæ›|úé§§ºæ¾ˆyº´´$ù§Eá믿~âX»ýꫯ¤…¤„õ'V®ëJú‡Ò4™™„é@pbåóyiær9Þ}÷]®]»F«Õâµ×^£Z­²³³C&“áüãKßïËŠ®Z*á($èø‡>~ËGµU‚N$óu|T]Åïø˜3 L‡n¬p’½˜EÑ‹Ñ3:ÙKYkŒ²UK »fÑ|œ'¤+É.PX^Ó“@ÍI²UͲ™ä·ï#7™$FÞ {1K÷vW‹Ò줲¡5‘(8ˆ±Û6‘‘9Ÿ¡¿Ò'èI-õN€FØšFJÓÉÓ¢å%É„“vŠ¥L]Q)ZU;… ´}Ÿ+…" wD?(š;/hI$ÏË)ãÈÆ)…¬˜Åu]Çazzš8ŽYXX V«Q,Y__ªÑ4‰‰ IAqÒ )•JäóyJ¥Ò Ä4M*•ŠôGAÀ`0 ŸÏÓnwh6÷Éç_£TzƒÑ¨Å… óÌÏ/ò«_í¡i6Š¢£ë)úý #CLLÌ“ÍzôûgPÕ>aØg0Ø$qm]¢×ÛÀ²*äóg· C\nTê<¾ß¥ßß X¼‚¦Ù ‡»˜fŽLfÏk³»›Ä CǶkd³gŽñûhšE.wžn÷qa<ï1 K$¯‹ÅçV O?€ê÷û,..211Áþþ>‡‡‡ÄqÌ믿.“‡Ã!Fƒ\.Çää¤ä—êt:˜¦‰ïû\¾|Û¶ebäââ"333ʺçø¾/©;Ä"\*•h·Û2Nb¥R‰õõuÊå2+++Ôj5jµ7oÞ¤R©P*•ØÞÞ–÷3 $T±X”‰}sssܸqƒJ¥B¹\þN¡¼B ÃàÂ… 4SÈÁÁFƒÙÙYöööxã7$åO§Ó‘(µ©©)Ö××ñ<©©)Î;ÇÁÁ©TŠV«Åôô4ÓÓÓ’K,•JqíÚµc¤µ¢Œôi¥‚ÿ’¢ß-þOö¤šs:öŒ-k+JP·'mì©$¾`ä_.p+2Ñ…˜e¿ã´‚¤¤¬‘ìÝ]7Qlí¢$ÛÜo'T$Þ~’nä„›j‚–˜r~ËÇš´ˆÝ‰5Ú1XM’Ý]Wf¢‡ýÑå5=Âaˆæh 2LÑö¿P§xž´Î-©j¨9^ÝKPbšÆ„m³3Òõ}:¾cèÄÄøQÄz¿Ç( èAñU¶ýÄ2ð£KSɼ ¯£é¤tƒç€?M¦Sý  sÊd ÁÎÎŽÜY®­­Iª…[·nÑn·Ÿš+\%ÂWR|ßOÊO³Ù”@µÖÿÒ¢û‡>­Ï[¨¦*“刡úoªÄ~Lý—uYÛ£øv‘ÔüKйŸ6°k"¡uíHͤ’øG"œ%‡ú?ÖIͤ1H ÆžI˜yP {)Ëp#‰¨–Jþ­<ЦHeèî» 7‡½€ “óoæq÷Ýλ›À†‰š=c #:7:X“΂Ãp#¡{1‹¦äË‚$ä½òÿ¸»Eümm SU…!;ÃoKü¾¾¥ªMG×ùê°IÇÌ8Î1>ªç[ÓÈ›æK)0Ž™vŒ%0f³Y>úè#>ÿüs>øàîܹùsçøãÿÈââ¢äF¼DO£sW…þð‡¤ÓiþÃøO˜Üóóóüä'?á¿øÅ1¤$H˜óoþ ®ëòŸþÓBQÞ{ï=vwwÉf3ܼ¹K•è÷×°¬ µšãX¬­ÅÄ1G yŒaä‰ãd›šêaÛ1ÝnŠŸ÷ß/áº}=*Ònßçàà 4Ífrò‡@LŒ(•T®\¹Ä'Ÿ|B§Ó!Ÿ¿@¹|•~EѰí*®Û Ý¾‹ad™ýwÀל??Å»˜æk [èzšTjE1pœ„Êd4z¼{\\\äÇ?þ1?ûÙÏX]]}®g÷´ñ;wèY­V¥q‡ÝÝ].\¸Àõë×±m[*ƒR©ÄåË—1 ãX]‹\.ÇÍ›7¹xñ"·nÝ"—˱¶¶–¬Å"W®\AÓ4ɼ,Ü2kkk\¼xñ‰˜ÎÅ‹Éç󨶮ëlooS­V1 ƒýý}®^½ÊÏ~ö³c÷3??Ïôô4¦iR(¤2FìììpõêU~ó›ßN§ÙØØøNˆ®ë|üñÇ„aH³Ù$‚S©L*• —.]beeEn® …‚tù‰¤Í³gÏR¯×QUõ(ŽW•JvÜ¥'*®Þ»wÍÍM,ËâÝwßåÏþ3FƒwÞy‡Z­Æýû÷)•Jüú׿~é{}YQÕTbqHÔÑ݇wàáz¨†š(•ÜÆ·w—<õaåtüŽO81‹&FÁ@Ïè¤fR¨V²ó·&¬EtW´!¦êIü’"QA/¡s·ªÄàÖ݄֤¸ÆC‘è2@Óœ¢*øÝåe'!*F’â7æ_sÂ$FOXb1ëýª¢0aÙ„qRöjÊqÈ™&a“7MlM§̧38z¢ØlMc¾)¢¢ðÂ÷“2¬‰„b§%v{bç733C³Ù”E\×}&•´pŒ£PÆEdÚêú“ðe±³çÉp‚`±×ÛGÓL²Ùe¢( V›àµ×ÞÄq¦ÉfÏNÏËdÀ(r‰"ŸtºÆäd|þ,Ž3¦™¸®‡ë¶°¬2Š¢Jªõ•S.OÉ|Ç™9B_õ°¬†‘Ŷk@‚Ê‹yæçX\|ó}ÕE×ÓØöƒÁ®ÛÄ4‹Ï=O“§µé÷û2¸-(À几%I|B„%#‚캮S*•0M“¥¥% …étúX±86›M2™ ¦iJ2Äååe,Ë’µ2„4 ²Ù¬ Ôçr9Z­³³³d³Y¹Ë>í~R©étúŠLX Žã|§tîÂ-å8Ùlö©T&‡‡‡ìííI¦êsçÎñæ›oʘR­VãìÙ³åfÙl–ÅÅEòù<óóó´Ûm9{ö¬ÌJ‡Ä}—Ì­Z­Æáá!©TJ>¯¿Q–ÿ/ËqéƒR’4ç&,µq'ì¼GÕþT#!XT´$ý2rÒ…•šK%|TG°]¿pdýÿ™ûï.¹®3Íýo»ôHX’ èdJªRW©LOO¯þ,sÍÜûï|†û5¦WO÷tßÛ#KI¥’Dш €ð@zþøsÿر72Hè’Þµ°@"ódFœˆ8ûì÷}žß£âb¯™º¥“ŽR’A‚U¶­ É' R…s·Êq?Æ®ÙâqË‹¼&f-I?Áð 1ÛØ‹ÐL wZ ÈÍŠÀ¹K´‰f lKåØM›Á½VÃ" 2œ–Ãàá@øEÆå†¦‘ç`:Žn iÂ-nŽ“ “<Ã7LúL{>ëÃQ–ÑrÜ—‡j8ëdÔËÖ¹R™vž0Ú¶ÍÙ³gi·Û eá8õzœ@Q½ðŽOÞ]êÉr‡¹¹9Ö××OmÌÌÌ$‰Ê¡¸pá»»»ã€¤mÒ´B–EØv×`ƒEž[”Ëç8<¼†izã xÓ25Ue}½Mž{T«¾ï±¹Ù%IÂð`Œ™8KuÐ4ÏÓÇÊ­îXBÜÄqêŒFÛ8N$ç©Â’¸î çÏÏÓjøè£/0Œ&Ãá†úÞ0<Ä4KXVápó™s±¶¶öBºñ79­VKq™â8Vø—R©¤è¯N‡••¾øâ ò11AÇLLL¨ÙËÓeY¾ï£iƒÁ€ééiEU±È†¡ð(éºN¹\&Žc …‚Z¨V«ªDZj W*fffØØØÀqâ8Æ4MJ¥I’¼þÿT™2ÂU^ÀsCDÛZK¥îey¦.Я»ä¼%‹2òXp§Ð ò'Ù[vÃ&bD¶Ð²P,<Þ¼H4K&YœíG˜eoÎ#é%¯iÊß!$y*žkt C£ΔƒnëOp%ä  Yp¸¢é¨(½&EÓdÒólø†€IDAT8BÃ`'1LEÖFÑ2ñ “`DÉ*°? ˆÍ×0XôÎ=ʲ—Æ’ÄYFðŠmüs@|VVV888Pˆji sGEuWºHlÅóJf6œú»Ç¾€ç)gž>NÞ5‹ãJd™FìdžÃdÜ7 A°KšFXÖ"šfŒ¹V:‡hZH¿@£1‹¦é8N‹ ¸‹@¾‹LBAdet:_bÛ–ºFQÏ› R9O¯÷ˆ8î*ÿˆ¦Y†ÅíÛ_rëÄñr¹F¹|ž Ø%1 ›åå 666O=/sý¼ó'v@Í$¤ÄTæT†¡Øf‡‡‡Šyfš&ƒÁ@]ˆ³,S»†ãvÙâ’;ùµB¡€a Å|*—ËLLL(õW¯×S»$Û¶q‡ÝÝ]Êåò3ž–ÃÃÃgæ§½Ï^ÆCóMJ¢]¤wæ´j6›LNN*lÉææ¦š!É×Aþ¿<ïëëë'â}gffh·ÛêñË]¶|ýÒ4%ºÝ.jöøºgß¶Ìt”Ò»ÝCÓ4†«Cqñ44ì–¸`·ÿØPÅ0£þ½:fÉ|­3ÍÔð|¬ªE|î‰y„Y9…3ö~¹‡ÝŒ,ÝÔ9úìH\ì§ú·û”.–°ªVÅ¢÷UÞÍy*#ÙWØ’p'døhHÜýxÍÐ(ž/Š™H/Áviü°A¤XU 2Ѷë}ÙêZÎèßí JCÌLr`Î/`j:MÇe'ah?œ˜$ÌRê¶Ãê`À›Õ¿ÛÛÁÒu’,c¢æñ/{;DYƬïÓ~ ˆOÙ²_ÉH8HfüÎŽãpþüy>ÿüsxôè333loo3==Íp8¤ÕjÑív&ckkë¹ ˆ®ë|ï{ßS(ë§w‹‹‹üøÇ?æ¿øÅ3øÛ¶ùáH†üÿÇÿ¡Ll¥R‰<ÏØÙ‰Ç(“†á±²"ä¡×® cœwn’$CtÝ&Mcc\7#¦ØØHyÿ}‹££’¤‰m7ØÞþ–Ufzúo‰¢#â8`eå<|ð?ýéÏØÝÝ¥ÑxJåÝî}\WxB‚`ýý1M©©ÒnߤX\$Ž»øþ Ýî=l»ŠçM‘¦#VVèõú'.ÆËËË*Òöi4ûóêyçorr’r¹¬ÕsssÊ›°µµÅÜÜ¿ýíov$Ïsþê¯þŠb±¨ZAyž³½½ÍÔÔwîÜáâÅ‹|úé§ø¾ÏƒÈóœïÿûjž!Mp>¤R©pëÖ-Z­–j³hšÆ;#®ë ‚  ÝnS¯×I’Çqxüø1o¿ý6?ùÉO¸}ûöË]C4f³©Â­^µLÓäêÕ«‹EÇáþýû§ÆèºN£Ñà7ÞP-Ö™™EÙ•-º7ÞxƒG©Úìì,ƒÁ@%9º®Ëìì¬2ÌÞ¸qƒ¯¾úJÉæ888àâÅ‹,..ò§?ýI9øÿܥ˹‡nëØu[Á £½H%þ¹S.NËʥלH¨éƒû¢vD¦Ø-[`ãÇÅØu[´°z VÍRE@¹Å㣘èHHr½ÝõÑã½[=ÒaJ:JO`Øó±ÃØ,šx‹¢÷šôâÃ˜Þ qL6ʰ[6ánHžåj/Ýv04Aãb‘òX $Ï1uvâ¦&‚¥Š–…7Æ—ä_ÇKŸ»W¼ Ñ´'nV™½´´¤ÔW«««J«>(‹,..Òëõh·Û/ü°æyÎÑÑ‘R<]Òƒ0:%ÏDÊ;¥wA~Ðâ8¦X,¢iƒñî¡äc•‘i:˜¦ãÔ M³ÃC²,&Ë ´Z ¢(#MGôû]’$e4Ú ËâñNEÈt£H\øl»ÂÁÁêE뺋Hƒ8îs 6°¬"–UT´Þ8î`Û@£Ó¹ÇÆÆßø\<¯žwŒTÈ¥iªÂ†d‘Ü)<ýÁON‡ÃÃCºÝ®Ú‰ÈáøÓw¼ò˜n·«äÀº®sttD£Ñ Óé(ù¶$õÊ™I·ÛU¤ZÙÂ2 ãkwÿZ•$ [[[Ñëõž Sì÷ûìíí‘$ «««LLLP©TTð™’ߺu‹ÃÃCt]Ç4MªÕª/ìîîŽñ<ŽŠ –NõZ­†ã8hšÆòò²2NNN>7&á_»´sÿÏsùÄ?N rAL‘±¡bî‘ÅOP&šl¿B==Ñ,P1<ƒ<ÐÂ<ËEÎGŽRQe±Þj¦F:Ûki0Lº‰À‘˜š’ðæQ®ð+¦oŠªf“©@Âkb`žŽRŒÔ,M¨À )0p']š4îÄ›õ<Ô»nP4MFi‚c “D-úøOšåc”‰FaŒñÆè÷!Éô¼j¨¯«ªeS²¬SM€ß´VJe¶GCúã°ìÙJ|B’$,,,pxx¨.L/"ï ^„s÷<]×OM$”=áç¥ð ²,Sj öxí!iêeÁx·¡iIb¢iÅâ"ÎW†Kš†c|ÈbÑ£Ó ižžçÓéÄq ˜VbÀ# MKT+A×l»¢*e’+I®iúxÞš¦Óë=ÆqjãïµHÓi*)æñ!è׋ÓêyÇ •¿ ¨¼ )ã•/,,pçÎ…¨‘»yá“;ƒã­•ÅÅEnß¾­Ð(OãØóŒA2Þ,ÌH{)ΤCù2fI(ºÜiWáQH…^³5 +A>_Dwt•|˜ç9…ÅfQDÙzsž˜Ÿ¤9NSìÆò8'ÍsFiJŶ™ö ìŒF$yΛÕÓžOŲÔÿï@˜ÂA¤)9bãÆK =ÓÀ5L:ñË%¯–ë’墕%¥‘r²¿¿ÏÛo¿M†ÌÍÍ©íb±H¹\fnnNʼn>¯._¾Ìììì©FÂjµÊ|@»Ý~æ.ZÓ4®^½JµZeggÃ0øîw¿«¶ôA`¡iuÂðË*á8`šYf“çŒM6Õêű„vŠV˧Xt±, ȹté,F“8^ HSÑ ,(—Wpœ&iºC«Õ ×ë{Ù>õúÛøþ4IÒÇ0läbÆ;ãáxFž'ÔjoâyÓ€œrœo¿}Q ɪÕj¼ÿþûÏüû‹êyç/Žcå[HÓTa[­º®sæÌu“ Û333,,,àyÍfSµ¦Îœ9C’$¬¬¬¨Á¸&OOO³´´„ëºLLLŒ}5.ËËË$I™3gÔ€]ˆB&''™™™Á÷}•fX(˜šš"ÏsÞ~ûm5¨Õj\¾|™r¹Ìââ¢rÛ¿ÿþû4›"°Ë4M¾ÿýï3 ÔóyÕ9Èââ¢ÚILMM111A³Ùdkkë™ï=sæŒ""‹EµøJE™ŒÞm6›”J%&''ÙßßWj8˲8{ö,ÃáPq®ªÕª:g¾ïséÒ%ö÷÷‡œ={–¥¥%åèÿ¦Ô‚ÿ‘ejšFt‰ ŒÍt0ƒâ¹"Y”1\¢i?Ø–ózg –†U´ð}å ÏÓœÒÅ£õþ’O°`øâ.Ê(þNlu­êX‘B9æÂÙÞŽñf=¼E/÷”¢+Ü ÉåÄÉØ“ )°t§;Ž0'šÂ}oxbÁÉFBDP}§JÿnŸt”ŠÌ’á“»óå -×cµß'#g©XÂ1Äîäv·Ã™R‰Ã(D×4†IÂÛµ:no1JSZ®ËöKFÓZºþ­¾Ç«…L¸;Ǽ$Y–Ñh4¸xñ"ï¿ÿ>¿úÕ¯pGňFQÄòò2{{{/$ †ÁÙ³gñ}Ÿk×®=saœžžæÌ™3lnn>Óºp‡³gÏÇ1_~ù¥êçONN2ètº”Ë籬«$IÀ[oÕ˜çŸÿy]wÐu‰2Ù¤P¨$!33u|?& ϲ¶°¼œ²··†eUi6ßccã§8Nƒfó]†Cáh>sf…>¸ÊOú3Ö××i4ÞÅó&éõ`YÊåsDÑ!ÛÛ¿AÓ |š4 )—WÈó]·évïbõúÛ ‡[ ~|á™™áÌ™3¬¯¯ã»Ê?Y¶msþüy•”÷Å_( a©TRß'w$·nÝâòåË8ŽÃêê*†apùòeæææTúžÜ ÈcnܸÁ¥K—°m›õõut]çÒ¥KÌÍÍÑétNàþßzë-ŠÅ"·nÝR{Ó4y÷Ýw¹}û6.\`}}ýý}Ο?ÏÊÊ wîÜQÞ ©BªÕjœ;wNy”vww_(Èx™:Ô% •Ïk-JuÞÊÊŠj--..2i·ÛJùvöìY>|Èh4byy™ååeŽŽŽâgzzZͪ<Ï㫯¾âOú“ÚJ3¥\T?ùä“çR®ÿµË”‰€vÝéãVRÜxoÖSl)t^û Ä"îŠLÙ6<-¢ÑêH€ û iâ|alLs²xì,3EÛÍ‚ ÑáXCPtdžÄè z ":·l’o%–$§C1+1<áN·jƒÌ¢Øé¶~bN°èšFɲÐ5µÁS×04(ËX•ªMc/˜õ}$•¦ Ó„’e±~³»OYù+¾ÓbøT JjÖøì³Ïh6›¤iJ«ÕbssSõ·'&&NÍH•¦)««« ºøtííí±ººzª<2Š"?~¬2½MÓÄu]•Oíûë$IHžG†M§ÓVÇôÔߟ£×{„®Ûc#_‰ÃÃZ­Âƒ·èõr67A×a8|@’¤c¢éˆ0l{èºChܼyK™ ð®[Á>ž7A¿ÿHµ¯ÒtH¿¿†e•Á`Û®1íáûSDÑýþk4ÐÝÝÝçž‹çÕ‹Îßñ×`mmME †¡Z3ÇïÔåÝ»\¤U:À766Ô ì´c6660 ƒ~¿¯è¾ò˜ã%qòSSS(ºÁÍ›7‰¢ˆ‡*wµTeu»]\×¥Ùlª3˲¸yó&aòèÑ#ºÝ.õzý•> ²¤‘r~~žíímÒ4}î°z4±»»«‚·Z­{{{loo“$‰ºñùðÃɲŒz½Nš¦jÞØh4ØÜÜT3 I^‹®œ˜¦ÉÒÒ’ÚÉK÷ý_Biçþßçò©?¥264C{‚ï`,•ÕÇæ;í5âÜÇ‘µº+¤™ÉH0¯tKG³Æ(ùñ Û±Åj6B ¥Ûe‚†o2ATX’¾ð„dI†U±ʤ'rö“Çâ¹ëŽ®x\º5Îá®X$½DÌHL Ñgð` ôæç.¥µ¶.|!¶¡Ó‹c<ÃD…;‰³L]þ¿ÊÄ£L^rçr¼Î}ÈðXßXb£%G”[f)ï ÃPõq_4yUœ»¼Ó•[{9Ô Ã„45H’>š¦#_ˆ<ƒnÇi2maš…q{É!ÏC CÇ‹æxž‹çù ‡‡§Õ×#_G91M“4M•@¢Õj)”‰¼›•½zÃI‹RÆ*=sss<|øPÍDŽãÊå{El%¢ý4ÌÊñ‚œ#Èù–¼Ê¯—7Ÿض­ŽFÌÏÏóèѣׂs—rq)%—72§½Gåãs ñ>ÌÕÏ:þ\d<îñ×Ëó<‹ðôëhš&…BAý|y.äù¿½óu•·c:Ÿw0pu$2Á“œÖß¶È’Œý_í«¤üFwöõÐxýE1ûH‡)î¬ËÁ?€•w*$ÝD<Ž(Ç_òÙÿ;‹*›äY®ð%Δ#L„ˆ…­üF™,Êp']úwûxsž€(î…ø >I?!ØHG)ÅóEÂí™Ý/»"õ°dR~³ šÀžHIïVÂr4DÃ3„iñè žãr¥Ær±ÈO·6³Œï6[B²›gì#®Të|´¿‡kL CÓ¸×ë’æ9ÞË#òÝ dZlóí ×ãѱ\uVÓl6y÷ÝwÙÚÚÂ÷}®_¿Î›o¾©¼®ërëÖ­îB~ðƒP(øïÿý¿?󜙙áïþîïøðß¹Ã3 ƒ¿û»¿# C~ñ‹_ ë:ý×=F>Ô¹ys‡(*ÐëÝÃó&©T,Kg_'Ëòq¦GcìÐ4“V«ƒmgt»;;!ï¿?Cž§l.gB˜ åÖG‰“ÌVÔ.ɪYb‡cj"Q±h Û:¦n¢ê°å8-«>Æ“ŒC¥²D„N™%a®Ô-wÒ%é'Î G䕌 Hɲ° ƒªmÓ‹cÁ™r]Š–Ežƒg˜*÷ã0 ¸\©³1ÐO±¼äNB×ÀÐ^m7؉#&ÜÓ{©R!Òét¨ÕjLMMÑëõðgÎ,±°p†?ÜF×%ÎÝe0Ø@×EðU­6G¥S(,Ç=Ê嘽½ Ò4gœßÃqê ³ ëdÌÎγ²²ÂÖÖ=¢\>?PêcÛ|–8®3¬‘e I21ÑäÍ7/cšX[ 1Øqjt:·qœ–U>Aã-—ËÏ=Ï«?Ó49wî®ë²¶¶F³ÙTÜ¿qîܹßÇ1gÏžU­"yç<99©¿r×!(ÇCæææ¨V« ¨Øl6ÙßßgqqQ¥è¯ápH±XTrl™%R.—UÞˆŒ¯=þØF£Ãá‡Òjµ˜››S‹Y¡P R©¼Vœ»ôst»]ö÷÷ŸA²È:<|ÈÒÒ’r%¿¨]¦)ׯ_?5 ÆúóÏ??Ç×®]#IÕ~é÷û ¾ç8Þ¦!–UäáÃÇlll0˜ä¹I¹¼ÂÎÎg˜¦Oµ1Í2wï®±°PçÞ½¯ˆc‡›73<Ï¡ÓY/n9QÔ¦Ó¹Kì¢i6»»:¿ÿýï ©Û½‹ë6é÷Wñ¼ ÚíëdY<~¾#ºÝ»LOÏpxØæ«¯>Zôûñ¼IF£Ý1ò$ÏIž”œ½Œ1ìEç/I~ùË_Òh4Ô JÞïîî2O´ àÝnsíÚ5šÍ¦ {’ ¶Ì)™U¸,Ëèt:lll¨$½~¿?FÍl±³³sjÎËíÛ·I’„7n$ ×®]Ã÷}LÓ¤Ûí>³³,‹~_/÷÷÷év»Ü¾}[Ɉûý>ÌÎξÒgáxÅq̵kׯ)—Æ3ÏCÖ`0àñãÇhšÆÑÑ¥R‰É!Š"ö÷÷ÑuZ­Æh4âÑ£GJ¹µ¹¹I«Õb8Ç1aªÙ‘eYÊ_S(NM}SµÞÿèÒÎý¯çòÉ;)”VcikžäŠyDOà…ŽŽá¾Zˆ‘œèŽÀ…®fk„[!裞ŽÚS̲ ›%S Áãc8÷–-ÔU[â"h–Í'ø±*Kwt6) \Šîˆa;)¤aª0îy$~®Y¹çÑ~„Y0UîºfkŠŸå/û  ÎÀ3 ¦©¸R5Û3Ý`/ h:.½8¢`Z ’˜þ±pÁ4™ò^.ÒöuÌ@VJe¶FCÉ׃ççç ‚@Å$NúEwBòÎð4•išêŽõ´9Š8v:•-Á}½^HëÁš&ûâÒ»¡M|\w’$`š>†‰ú6±Ĥß_UHÓ,àû3t»÷Ðuí)ŸÅ–U`0ØPs ` c¬`yž#11¡¾2C]Î$êÆu]ºÝ®òƒPÈïMDZϥRIÍdöööTËì›òÀdéºÎÒÒÒk™T«UÇQ7/rqZ«V†zÉL÷§=1Çÿv]Wí8ŽûZZ­ƒÁ@}ŽŽÏMÇ¡Ñh°³³Cš¦ #¿þ—`¼4㎘h–&pî®LþO“dQÆþ¯÷›*Í©}PÃ_ò_Ë.Äqý Â[ðÔ"àÍyXK ²©À¹ÿbwÚH z_Š ­7ë‰a6BÉU}·JïVÒ¥Ýë]J—KŽAtáÍx$ý„áã!é Å[ôˆcŠŠ}r$x[M›Æ_ ”‰ ¦ÊFëœ ‡ÂrÁú¥ ”Éî“»÷·k ΔJü×µU†i¾)‚¥6†CÞªÖùÝÞ¶®“æeËæÓƒ}âlຓìíýÓô™™ù1i*Ì…FÎ;ï\áÃ?¤ÝnS«½E­öƒÁ*Y–Òl¾OìÑn_Ç4KÌÏÿ;¿À÷gÃ*• c5˜96Â;ï,ðé§Ÿž¸«]^^V8÷Ž¿Éù[^^V°¾ùùyt]guu•ååeÖ××¹tIàé›Í¦Z J¥/^dww—ÅÅEµó(•Jܼy“‹/òÅ_P*•Î}~~žf³ÉîMT«U•_Q(øðÃOø'æææ”âHŠ0Μ9ƒišloosõêU~ò“ŸpïÞ½—zëºÎÄÄ«««¯¼€\¸pA™_e 7{ºÊå2/^Tí´4Mi6›Ø¶­P&N‡ .(N–ô½Èœ›r¹Ìúú:“““J©uëÖ-…ˆë­·Ô.æí·ßfvv–7nÐh4þBpîR…” 7¸f )o´‰üo«j éêaôÚZXY f+è0x0ÀnŒQî%w·ë¶jKÙM›,ÌÄ€|ÊUHv €T •¦kŠU•§âŽÀ®Ù ¯šÂ¸Ë,v³bâL9"7ij«f‰V9΄C´/†çNÓQó’ã•æƒ8¦bÛÔl‡Ã($ËsЦ…o˜c©®­E“ž§pî–®+¨áËÕ«õ|Ã,ýFé6 ƒ©©)öööTÐÔ‹Ž‘úçõ¦¥ºä´c¥E>Ž0<@×- …y²,£±—qœž7…ïOãº-@Ì+²,ƶLNN`Û“XV‘,rÊ ØN†a¸D‘¸A)—[@N¥"TYŽÓ M‡Äq×xÛ–£Ñ6–UÄu[‹Ë¤©˜XV Ë*Ñéõzv»ÍüüIÛQ…ÂìXžk`Û`š‰Âœ[VÛ®)|šÇ’]±àØvƒBafl ¼ƒã4‚},«4æbu)  ….b˲TûæeZX§?9¼Ã8ŽÕ Ê÷}µ«èõz,..rãÆ òIrîÜy>øà]~úÓŸ²µµE³ù>Åâ"½Þl»F³ù]ÂpÝÝßãº.ï¿ÿ>Ž,’¦#§N·{Ë*Òh¼Kwð¼i¢¨}"O}qq‘ï~÷» ƒgÐöÏ«?;é7ð<×ué÷ûœ9sFõâ¿Vo¿ý6£ÑÛ¶Y]]ennŽ^¯ÇÔÔ.\à_þå_ðÿüsõ{J¥sssJu&w*/^äáÇ\¹r…^¯wÂe-Óø,ËRß7Þxƒr¹Ìýû÷¹råŠ ={]m¬ÉÉIvvv¨T*Ê xÚ"=Q—/_Vå¹¹9…+iÈ2ö6%é÷ûjÿ&¥ï7oÞäË/¿T²ßõõu‚ `qq‘••>ùä*•Ê7ž—ý,]Ó5²8Ã,˜8δƒÓrˆ"’^‚Ý´ñæ=¼aª{]3IÐÕmt Ì„fÁX÷(%îÆäiN´ bîP ¶‚!æ9'óäâNÊ,™øË"©M¨È:êÅ*=Oþ},ÜÁ,šøK>΄ƒfiDû‚ –ôDvºÝó,NvÝÐÕLEÖ”ç“æ9eÛfÖói‡"`ª=¾pî#,]´¶TQó¬â,Ã1^ÞÓñªù9ö8›ä´ê÷ûôz=æççI’DµX¤2åé‹ÐÓ•e»»»JAòtu»]vvvNE2È$ÂÝÝ]²,S4ÙÑhDµZò"Æ]Ì.’$%Ž#d“m—‰ã>ºn1í’e ahP¯×èvÃ}Úí½1:b•(êÕ\iEmò<DBžü çyBw‰¢ŽÓ ÷HSñúVWcÛE Ã#Ëbâ¸GaÛe²,¦×{Èp¸‰ëžœÈ^úËà)^tþ@d‰Kf¿ßg8²¿¿OÇÏìrÇQ2éãäW¹#888xæ˜ùùy¢(âàà€b±¨P&²-µ¹¹ù f%MSEæ½ÿ¾šHÙëööö3b‹¹¹9ÕZ“Þ—n·ËÁðÑìììa{{[Íñ$Y¶2%†%MS677U»¬^¯+ÍÊÊ ›››lll(&Ü_Biçþ_çòÉÿiRÍ>4SSkšöç>^Üuëõ Ld∅ 7Ï@5SÌ]òô ŸKÎì–[2ª¹DŽâc‘ îUåX5AN‡Bvgøb6‚†@©Œ=/O&v:Án ¨Þ¼ÇðáI¯£ëã¼sñf¶ÆW3S× ÓG70us߉Щ Ö‚i2íù/…s¯XEÓbã¥Î–JlF§ÊxåE[¢Lä]™4I“Ó‹ÞÈrÈzÚ÷hš¦ÔBße"be‚ $ˬ1u×D +Ët4ͦXœ¥Û½a¸c”‰Kž¸®Åp¶­ãºÃaBÈsqL³8þ™eCà b[Ó l»Jž§äyªP&Rìy.¦Ù$IrF£M§Fžgcw¿ø†áº¢ÿ~“sqZ}Ý1•JEù3¤9ð~­­ëYÊÎhÄÕ*:<ÀÖuf|Ÿ$ÏØHóœªm¿´žÊÐtìW샚šNÕ²O, Åb‘+W®°»»Ë™3gxüø1®ërûömÞ|óMÅó1M“õõõS·ö²Þ~ûm|ßç7¿ùÍ3ìF£ÁøC~÷»ß=#‘Ô4ï|ç;DQÄþð•nøèÑ#&''¸}{— pèvïàº-…ÂGG_X@Z­õWÅoûÛFÓó¢-Öl6é÷û277Çáá!žç±¹¹©2%@äK絤jµ{{{LMMñÅ_œ8fjjJes/,,E‘2Ç™¦‰eY\¿~­­-Z­ËËËìììðÆo°µµ¥TIrgqppÀ›o¾ÉïÿûÃ቉ †ÊÓi 2|ë­·øôÓOU{íUKÞì,,,077‡ã8loosëÖ­g¾wii‰sçÎqíÚ5,•V’Ú†¡J^,—Ëܽ{WåÉÜÜkkk躮BÀvvvÔño¿ý6úÓŸèt:\¹r…Z­¦0'üñ+?ßW-S35’AB܉ wB¢½H³H8»¥RÉ,™"³üuyÇ2r6:ŒH‡)΄ƒ7ã©áµ3!rÊí–U±÷C!¿-™báç}”ß,Ó‰;DíH´ãšâð’¤j—’EiíGøË>Þœ‡3å@&p(º­«VVg”.—ÜÆÇ^B’g,‹½0¤bÙø¦‰®iLº.ŽaP±m¾Ò˜t}&ݺ½8æ­J_nm1L¶ÃÖKnIMý‰²ëۖĹßÅÈ`œ‰‰ E-‹´Z-òöî»ï²¿¿¯‹R©¤È¹ËËË*QÑu]Þ{ï=¾úê+fggi6›'$I”â«Õj)àcµZåË/¿dvvV¡ç_× Ä0 Þyç•éîyÞ© H»Ý¦Ýn³¸¸Èþþ>.\`qq‘n·K§Ó¡P(0TDtÌÍÍqöìYÚí¶2]NOO+™eYܽ{—O?ýT.¥QÆü¥xL2qÇgOÚ¾!˜Ti®°þ’/ð&cŸÈkŹgÐù¢#²7Ž¡F’A"<'@ÿ^_°¹º1Y v š¦)ŠTl¥£”Ãß ¯ÈŒK°ÊADføK"oD:ËÐÅŒ$nÇ$­„, JÒ[PÃãÜËý{} ß]´ÃäãÓ‘ñº9GQHÑ8÷ýžòXdÀý^—8K±t½ `ÒõÐÇï÷îØ?ò2(á½~µ£dYôžÚšK ¿ßçÎ;ê">55Åúúº¢ºº®û‹]š¦Ü»wO9¡Ÿ®íímîÝ»wjPO†Ü½{÷ÎÝ0 u7ìûE]²,Ä4=vvöc©£Ìqtô%†á1mbše¶¶:œ9SãÁƒ cÛíÞ· 4â¸Ïp¸Íp¸…®;t»Ÿþ'ÕŠ KÊp¸…çMÒíÞU*,Éj’øŠõõ›DQápÏ›&v¶ÆTÕ“Œ¨ÍÍMîÝ»÷R²Ì?^™xxx¨æC399©¾×ó<6660M“¯¾ú Û¶‡”J%EØØØ`zzúÔ÷Êýû÷Ñ4^¯§vrÎO(º¶msïÞ=:Ž"Ýüñ$Ïsnß¾­f²ätkkKFI“œ¡<ü*•¦©èºþÜ÷ùh4bkk MÓØÛÛ£ÑhððáC5÷“4…[·n¡iõz]ñ唺mjjJF£‘jMəФaonnªÙÉ_Bû ŽãÜu1[ÐMÑ&2|qw› 5«pÁW©§#mÕÌ!»)¹‘(ñº­·ãs‰sOúBA…†âeé¶. ЦÈîÐ<Î1ËcæVW´mŒ‚˜È¹îêŽA܋ŀ>{2[‘‘ºþÒIœ»†˜yغ®%†¦á®aÐŽ"ЦEšgL‹£("Ìž –¿ÎÝ£L‚Wʦ'g §¡$¯G2’äŽâEØ ™ÈvîD¢,Žã»—ŒÏ•HF£A¿ß÷Øc’Ä Ž;ã³,ãE7±¬ axˆe•IÓÓô€MËO *„ŒWg4Úå ÎÝÅqãtÁü©ç4a¸„áIr<ªWÃ0ŠE‡,Ëèõz8NÓ,ŽïGÔjUƒ“ˆ]×Lj–on&ü¦çOŠ|ßW yÇÌÌÌ(”‰Ä„Ëï•ó)G•Ѭ333ʽ.UQI’¨–•ÄžDQôÌ<ã8¾CâVÕ’’Œ§£££gžÏÓ˜ô§¿¦ë: <~üø•g O×qOÍÓU(ð<ÃÃïý½–e)œÌñ*•JÄq|ª÷Å4M¥ä’ ‡r§•çù©QÑÿÚeƇ1GŸa¸†@™ødÐú‡y’³÷Ë=åî®\­àÍ{¯µ…Õøø°î}¸‡në4~Ø é%h–¦vûîãÍz‚²›Ãàž8qîŒK¸R}¿ÊàîÿŒ¸°ë"Á°ö˜ã„Û!Þ‚@™I_¨«¬ºEëïZt>ïˆ9Pa|L’ ÄÊœPžu¿ìâ/ „Ëhs„á Ãât¼U­±\,óÿÛ\c˜$\(W˜/H²œÝ`Ä•Zßïí⌉½Žapó¨M’çLû>ÙK‚]àlÛ¯´€sêÂ%?¨Çÿ®V«¼óÎ;\»vééieHûÓŸþôÜÿ£ýˆB¡ÀÿùþŸ§ªxþáþ_üâúè#úý>¥ÒYšÍ÷v0 Û±º½Þ},«ÄììÿD–}ÁÙ³“ܺµ…ë^!vÃ6ŽÓÄ4m¾÷½E>ýôÓm§……~üãó³ŸýìþüEõuçïG?ú‘ºÐKŠ­çyLNNòÑGáyžZ VVVT$­Ì ¯V«4›Möööh6›|üñÇ'P&ËËËÔëu5(NÓT!nÖÖÖ¨×ëܼyS=Ÿãÿwß}—ápH£ÑPaP{{{¼óÎ;üìg?{æù¼hQ•78Íf“µµµ×º€ø¾ÏøÿÕÕÕSÑéSSS\ºt‰»wïª,ôr¹Œçy¨ÏÈòò2‡‡‡'^ éåh6›¬®®R­VI’„z½®v–®ëòï|‡O>ù„ƒƒÞ}÷]&&&xðàµZ_ÿúׯí¹~Û2UËj($ºéH8¸ãvLžŒMzÖœ»7ÿú¢5](±r„ÿB·u@´k¶ŠÓu&±C0„?eøp¨$¼Çƒ<“…Ç’p;Äž2d̓ÍcŠ2GWXx«n©]Ý´ÖÅ;gÒ!îÄÎÄÜd˜ª]’,Û0ÈÉ©Z6®n0íùTm‡‚igº¦Q³Å{…ê%1-÷ë_OMÓ˜ŸŸ§^¯3==Íp8äÂ… /Ìd–[oPôô" hdz² ÃPACòÎXjý‡ÃÝîåò•ÊF£}fggX\\¦ÓÙA×]t]xAF£m¥˜*•¦i4R,k†~¿ƒã¤ôû⸋çMqttÛ®â8 ƒu@§ÕšQó‰~¿O±¸H–%ÄqÛ®áºMLÓ£×»O–E„áSSUVVÎEó¬¯cœ»mW9<¼ÁÑQ…Z­vbyѹx^½è˜4M•2IfLHY¶\Hd(5ÏÌÌ ¥RI- R}T©Tð}_ÉIe ‡Cel‹ã˜­­-dô<8ŽŸ+óÞÛÛcii‰ƒƒfgg™ŸŸW³§ðß´Ž·Ä^WÉçã8§ ‡ÙÙÙ¡V«±ººÊ;ï¼Ãìì,;;;ø¾O©TR¯‘DúT«UΞ=Ëöö6ÕjUe£´Z-e0”­1Û¶Õ¼©ÙlÒëõXYY¡T*ýÅÌAL2U«b ¥“«+ù¬nëÂð7öZh¦öZg y’ÓýR¸7ó,'é't¯wjD35•ÓžvSÒ¡@°ËT¨ Ãážðh$~Bt Üôq3x4`¸*‘FÁ~[Wm°h/¢s­C¸ŠdDCCòaª*Y”aÕ-!&бØnØÊ•.ë«ÎÑX+P&¿Ù٢†©kì#¢,Å5Löƒ¯:GDcÄnPsœ—š¤yNüpî{ß`“ç9¿ùÍoh6›ÌÏÏóøñcÖ××_È-ʲŒÏ>ûL¥Ú=]«««èºÎãÇŸùZ†|üñǤ©ÐJØÞÎÎΑÐë="ËB,«ÄíÛwxðàÝ®Ež[”Ëç8<ü|ŒsïbY%nÞ¼ÃÌLÇ?!Ë<®]é|GGÂý-$ôÛ× ÃC4ÍbcCçà`vû€££8NƒápÇi2¬+ùošt:·˜œœc}}ƒ/¿¼†® ô»ë6I’qÜáÎ;ÏdxÈsðMw_wþò<çîÝ»\¿~jµªÚ\ƒÁ€~¿ÏÎ΋‹‹'Î÷ææ&Ãá4M988P,§~¿O¥Ra_±´ä1[[[ªo;;;†A¯×S§U¯×S†É½½=>ûì3õ¿Ì9xú=ó²,±¯«n·ËÿøÇç^¬ƒÁ‰ùÏW_}ŃþEfx´Ûmt]WÿóæMúý>{{{ìîîR¯×•G'Š"õyÉó\ݤ™¦©¼5årùµz_^¥LÍÒpZÎÿ‡%îjíšXý’A¢8Xr.ò:K*¢ W𮢃H8À㌤/ò>¢}±P¤Ã”¸«EL݃ÍÐpg…7éŠÇl–LHh1 E8VžäêwÊV•j£‘.†g©p.Ž>bU,µ#²ªÖ/Š®«©nÑ¿°S®‡¡k˜šÎn0bÚóÙB VŠ¥kÜíuÉÆoøašPÊ_ÎUgÙK|O«QrÒägš¦šwÔëuúý>…BA Y766(‹ …±êéñoò,ˈ¢è¹-Ù”$Žãñœðw ‡›èºE¯'¿O$Š ë¤iH¡0G–ŤiHš†¬¯¯Çâ¸bq ]70ÍÃá 'ÏS†Ã …yòö÷obš†z£Ñ–U¦X\¢ß_%Ž;ÇP:&yóÕWŸsçŽ Or(•–‚=F£mtÝ& í¼Ô¹x™ó'úBvl+Ÿ‡œ#A@Ç »(æ˜<ײÅaª?Ç/¤2D¾FÒË “õö÷÷Õcs]—J¥¢¾./’r—iš¦ Vzz¦V,Õ<¥Ñh`Û¶ÂyÈŒ©{ Èôô´Úù>oÎW«Õh4J, ã~åù—ðC-DZʾ"ééiöööNàÜå9 ‚€n·Ë`0PbÃ0èt:¯Mqöªe&ý„î.𮉻uG(¦þÝY”qø»Cåɨ}·†yÆ|­»³,\àyò$z],Xq'¦°\`ï—{8Ž`[ÏÅ Êuéßw@º«S¼PòãQ†;íRÿ~]ì ªdì  ¡I'A÷tÝ`øxˆUµˆÛ1ÅóEå5qZi˜Ò½ÞÅ®ÛbÆrošà‡;!ÓäÍj;Ý.KÅ"¿ÝÝÁÒu¾×šÀÑuR`mÐçÍjßííbé:i–Ñp\þ°¿K4Fªw_2Á5 *–ÅÖ+Œ@FiʬïóÕ1œ»ëº¼ûî»üñdee…Á` T9óóóLOO³µµEE”Ëe®_¿~êÏÖu]EÚþïÿûÿþ̇pii‰ø‡àç?ÿ9·oß>ñ5Û¶ù7ÿæß†!ÿù?ÿgò<çÌ™3Ôëut]ãèh‡RiË*ašE–—EÏþÆ€<70MMJ+]·HÓ˜……ÏË[ll$|ðK§³4qœ;;ÿ<Ž¥ý1qÜ#IVVÎóÞ{WùùÏÎþþ>Æ;T«éõày-Z­ï»|†i˜žþ;,ë+®\Yæ‹/öˆãyúýûŠœe1ž75^О¼pËËËüøÇ?æ§?ýé3hûçÕóÎßÌÌ ­V‹ééiâ8f}}Çq(—ËpñâE®]»†išê‚çû>ï½÷žr‘///+c·Û¥ÕjñÉ'Ÿ iš:ƶm®\¹BµZUb‰íímŽŽŽh6›œ9s†?þñܽ{—J¥ÂÕ«WU+T. N‡n·Ëââ"ëëë\½z•ÿëÿú¿¸sçŽz>­V‹……†Ã! ܹs‡ÅÅEÊå2kkk\½z•_ýêWxž÷Z‡èõzÙÙYºÝ.†að/ÿò/Ï|mÛÌÎΪv¢®ëŠ^,qîGGG\¾|™ÕÕÕ1‹ÍSm`É ÛÜÜT$ÞZ­ÆÍ›7Õ98wî½^ýý}•xøÅ_P¯×ÿ"`Šºn=iYYS·ÊÖ(aY N¬ªõÿñš+Osâv¬.ØÒE®iI?Á®ÛBb;L±›óàøñdQF:HqÞœ˜yÈÝHÿnŸ4¡QšþdåÖ M¸ÐÇ”¤ŸEJ¢”ðÊèÛp/|”ÌPs”8ËT´¬¥ë4‡I×£ÇtãC[7èÆ1¾abi:aHÕ¶ñÆ(““:¢o^¯z’å9Oÿ9«˜EÓ4677ñ}Ÿ……ö÷÷ ‚€b±¨0Ï}MÇSÏ»3Œ¢ˆÃÃÃSïîò<§Ûí*U’DÉ %ŠG–uÑ4× ÏE¹^o`YEl»‚ã41 m†GcÉ®ðd™äÁpÜoÞŸK]·Ð4}¬îÏ«©€iúÄqŸ8à8ͱ^´ñÒtÈ`°I©T¤V«Q.7I’QÔŶ+cBï}F£ígP&/:Ï«ç†!žçÀŠÜ¾}[!J:Žºx%IÂÁÁÕj•n·«|$q+âîñcfff‡©?ý~Ÿ X[[S™ßò±J•V»ÝV ‡lßH—ÌÞxúùø¾ æ$·oßV¡Yòy½î;òãÉ‹ÏÛÙôz=…kY[[cvv–ÉÉIE¶m›ÉÉI?~¬’-Ë¢Ùlª “½½=&'')‹T*ƒŠŠ®V«j)3ë‡Ã!_ 2ý×*måÿ±’·~ÜR™ä ib‰asfÊ‰ŽÆkK$”%}2û#‹D Iþ>Í(“4LI{©Êg9ÎݪX$ýDñµ%í¬4H±*–Œ:m ‰T‘i†’¥išHgLsÜIWíβ4Ûñ<Ç9¶®S³IŒg˜ô’X€†5 ]ÓÔâàŒ±îÓbc8 8–ófäT,‹ ×ãîK Lª¶MÙ²X})ßJ©Ìn0¢{¬Õ$“î¤|Sÿfff”aKJeOýy%1ݧõeÄçÑÑÑ©¬¬R©¤úöòÎNš³z½>iêŽ} "mPÓ2âØ£L–9:ºa¸¤i€aøhÚr¹@»ÝCÓ\|?Çó|‡$I¤œá®Û"Ït]°u #! ÊÂ0¾iÒr=¢,å|¹Ê^`è®aga–’#ðî®aœJÅ}^¹†cjæòmªåºb–rÌâygÏžU9ò.êÁƒ !塞ç½0Øfee…‰‰‰SÕZ¥R‰+W®¨»Û§ëòåËêÂaW¯^%MSfgg  ¨†{†ƒaˆ‹FšêdYB’8b¹|ÃppÝõºëš†ÅhaY³dY…Baž0<$MŇÞu'™šZáÍ7§yôh (E¼Ñ¦Z½ŒïϨ Y”Ñ¿ßGÓî¤öAMaG^[eg" Œº+v†oløK>ánˆY41 &†opø±òÚ ›î.å¹2VÉ¢¸R$ 3âv : âκ  œûq¢ÜiÙuÙ OÙD3…tØ,ˆ- V¬½_8÷Q&†ú£'w;uÇáÍjÕAl4q “KÕ*{=.V*ô’CÓ% o×Jüjg‹ M™òaxÈÎÎ?£ëÅâ233:ï¾{‘78ôzw1 —zý‚`Z­F±X<ñœå¹ØÝÝýÆòÌç?ÏóTf½dP­®®ª0)™±]*•˜œœdjjJa3Ç¡V«qæÌŽŽŽTbÞää¤Y^¸pïÿû*«þÚµkœ?žB¡ ”DGGGÔj5&''i·Ÿ [Μ9Ãââ"AÐï÷©V«ÄqL¥RáÎ;¼ùæ›ìì윸³¶m›©©)vwwÒß÷}Î;§Ž9::R†Ä×UyžÓl6Y^^æÑ£GÏxS@¨°’$áÂ… ôz=êõºz~ív[™C/\¸ÀƒFdYÆÒÒÝnWíD@øzäs»uë×®]#IŠÅ"¶m+ÜÌ… øøã9sæŒÚ þ9ËÌÉÉcA©T2`ÜŽA)2dŠŒ×>ÑpWÌò8rÛ1Ü0 3‚ͳd’ jÄ/ûÂ;’ädI¦vDY’lÄÉ'>Nò`'`´1¢°\PÆ?Y†o`×mú·ûâ{7œiGÌJ,ñxÒ0Å®Û °J–ÂÉÇG'ïüwƒú&¶n0ãùd€mè¬öûÄyÆæpˆÐÁ^0_( Øbš¤)…o¡cÕ7gé³þ ÙÛö<ÝÝ]Â0¤X,²µµEµZ¥Z­rýúõ¶[Ò4ecc×uOUc²¾¾þ º£@ÖO L<ÏcŸÉÉIÿq‚aˆ(ß<&Ǹ-¢wÑÁ_<‰2aê34$ÏÐwSÓ±tA’຦Q4-ö€,ÏU"á·A™”-‹‚i±õŠ8÷§Q&º®« ƒtËDÀn·«ú³²gþ"©®mÛèº~jÿX*P†ÃásqîRª*Û*ò.8 cÒÔ I†èºx!2ò\G×-\w‚Á`ÓôÇ8w‡, °,ƒ(ŠÈsm¼KÃÊ(ê _LÃpqÝ"…‚ÆÁA›ôÄ«á854M'IFc”É „¦Ù4›54-ÇVÑ4“,‹Æ-¯ËòÑ´Œ( ¾ñ¹8­žwŒeYŠW&ž¡Pãq?ƒ%‘3-Ù¾:%ß?77ǃ€'(ó'¨û'п(Š0Mó¶]>6ù³t]W4MSYîO£Y$`0Š"57‘*09p–À‡¾6V¡P@Ó4…Á?í}nÛ6–e©…|.²=%Ͻ”òú¾Ïh4:Ax&Eñ¾ÌO<~Ó4Op¯$ÆDþÜ×•Âø*eÆG1Ý/»¢×¿&pîY’Ñüë&yšsðÛÁÂÒ t±„;õÍݲßè…:S€\,Y˜a–«*¥ç¾èqøÛC¼y£ \óÁ†øðIuTžˆCõÝ*Ï;JEU}·Jž wºfj„û‚6¬´û¦FåJ…p/¤°\³––#Ú]c$|:JéÕ!Uƒ”¨-ŒŠfÉTÃ|€ùBßçû{¤yÎ…r…,ÜÞªÕøx×0p ¡êy<è“ŽÓ _vûmé:þ+ºou4š®ÃêàÉóíF£Áû￯THŸ|ò çÎSþ™œö"œûw¿û] …?ûÙÏžnNNNò·û·üú׿fssóäãÒuþæoþ†0 ùõ¯aüð‡?duu•V«É­[;„¡G·{Ï› X 0MvÛóœ<*•s‹‹$ÉM³i4ްíŒn7go/Àó&Ç©ÑnI¯÷M3¨×¯R.—9w~ó›?á8Ót:·É²Ï›¢ÕúQԡߌa8DQGír¦§ÿ–0¼Îìl•04(•Þ#IzÁ>QÔÆ0<|–££/' Èôô4?úÑøðÿ±4óyçïÌ™3'²:$¦½T*±¹¹I³Ùä³Ï>£\.«€>ø@EËöû}Å›ŸŸgŸ©©)®]»¦ yžsåÊêõ:‡‡‡ ‡C5ÐoµZ*HéÖ­['ÛÅ‹ñ}_ñÑLÓd~~žv»Íþþ>o¿ý6¿þõ¯O¼§Z­+++©Ás«ÕR^“·ß~›?üá”J¥×ÚÂzçwè÷ûJbüé§Ÿ>ó=‹‹‹\¸pëׯ«¨`×uÇÕ#EãššR ¹»wïR«Õ”fffFE&$IBµZemmv»ïû|ðÁ|úé§´Ûm®^½J½^gww—b±xª´ø_»LÝÑž#é%"ïÂ5D"`,Üáº%h¸vÝÊ§×ØÆÊ¢ «d¡›ºH4…´ÖªXŸQ±B^«la7m¡ºÊ1y .~y"`ŠRyåÍ{øË"W7u±ød¹"Ú‰c4]êY˜m±x:-![–øgÒ!¥ÎÐiOrKŽ- ³¾Ï„ëQµmúqL˜eT,‹‹å*÷µ.e˦åºhˆÙÃÕ;sªZöKï$ MÃÒ^m7xGLºð¬’k4©ÁàÌÌ ³³³ Ò4eee…^¯ÇÄÄÄ qî2QM W­VÃ÷}…s8^¶m«þ¸TI:l§Óáðp‡Jå jµ·‚6çÏϱ°°Ì/¹3–À¹†O–%4 ”Ë•Ê2ÐãÜ7ÈóŒrù<½Þ#§A©´Äh´IššT*ó¸î9¢¨Í`°Fµz]·H’>¶]¡X\ Šºc)pF–åÌÌLñî»—ñý˜õõÑh Ãp(•ÎÒíÞ#Ëâ1þðÔsñMç¿ ˜šš¢Ùlbš¦2ÞɹKžçÔëõ-9”Þßß§Ùlª¡y³ÙÄqšÍ&årYÍäϘœœT9êsssX–Åp8d}}7Þxã™ÇÖëõ˜››c{{[ñ¯Ö××ùþ÷¿Ï­[·¨V«Ôjµï)MÓˆã˜áp¨¹f³Éää$7oÞTǼNœ»|¬ËËËjntZ(äÖÖo½õ ÒëõT+obb‚µµ5â8fjjŠóçÏ«LÃÃCfff˜žžVYï¶móÉ'Ÿ¨`žç*§}~~žõõu•‘òºá‘/[&Ž5m •+†Ùy”ƒÅóÅ'8w÷5ãÜA…; W‡d÷2ìºM:J'+é pÒIÄÐZ¾Gr„S½b©J:JÅP¼d3|4í¬ Ò0Å›óžøXÆÏAÓÅb•k‘XX·èÝì .—'¼ FÁ ¸o,vIÑÞÉyÊÃ~Ÿ^££Q±m’,#L3þeoÒ”A’`ë:{aÀæh¨"iÛ‘ð…¼Î=‡ì_ŒŠeÓ~ŽòËóø÷ïßWѢϫ4M¹yóæ¸åôìïX__çÆ¬¯¯?óµ ¸q㆒ˆJé鯯SSSx^Nìe¼VW7ØÛÛ%LòܤT:ËÞÞ1M_Qy=Úfi©Î;¿$ í±ÉÐf4úJ% FѽÞ#F£m¶¶| #gÿ3¥¸ê÷’$}ƒ5\w’vûæx–I2¢×»ÏÌ̽^û÷¿ Ëš «xÞƒÁ:A°‡hcD™¬­­Q*•^¸›û¦ç/Ïs†Ã!·oßV»Å ޤ\.«à(Y÷ïßW³MÓøê«¯Þä8Êä8ÎýáÇʤë:·nÝ¢×ëÇ1½^v»ýŒúî8þD:Ûƒ8AðÌ1ò.^¶wLÓäæÍ›Ü¸qMÓˆ¢ˆííígPó¯ZƒÁ€»wïbÛö©s:@-–š¦qxxHµZ¥Óé(¾”öÙg ç.9W³¾¾ÎÄÄĘ’ ¨¼rt<²R©°¹¹©Ç÷îÝû³/ #mÿݤº˜j–˜Xe±Ž;±šIè¶þ$ƒü[Ö3>’Iž=I4|ÝÒIG‚}%= ¦oŠ<äÎ}<‘>»n«¬u£h(“ f Ÿ‰áOpî:XU‹¤›¨ø[Ã50Jña,¼1Y®Zxña,pîË>ÃBÍ%±íq–ã™Gcc—gšNÑ4Ùj¶Ã0M(š"ƒãøÜáÏ…s_)•Ù O Q$Ðn0(l»äY–¥ LòŸ¼§R,ÑuýÔ…Æ0 ¥q?M»_.—ɲŒ~¿®ëLOOÓétƉˆq¬E‡ø Jôxð N·{ŸýýO0 éé¿Å²RÎžÍØÛK(ϳ»ûâ¸Kµz‰zýê˜Ö ž÷a¸ÏÑÑM,«ÄÜÜÿŒ¦]çâÅ9¾ürøÈp¸†axxÞ$ºnðþû |úé''î´%–ä'?ù‰ÊèøºzÞù;{ö,…BAµGdy©Tbkk‹ÉÉI>|ˆïûÔj5æçç¹uë.\àððÑhÄüü<,//«Íþð …qóƒü€?ýéO,..*EÐqbóýû÷•²ëñãÇ´Z-Þ|óM²,c~~^-fràÛÛÛ\½z•Ÿþô§Ï¼¾®t]§Õj±ººúÚÙ”Ãûßÿþ÷Ï|O½^çÒ¥KT«U• _«ÕTØZ¹\¦ÓépþüyvvvÐ4ÕÕU&&&Ô®K’|[­– ¡º}û6«««X–Å;ï¼Ã§Ÿ~Êþþ>ï¾û.““"bybb‚Ÿüä'¯å¹¾Jé²e•Åbçù‰üpÌ<#ƒ}%çfÅDw„tw´6ÂvÅ® ÍÄ€=¡O욡){e$ûe+ôŠQ;IÒÕ Mí&@$úÉÅF÷tœ–ƒábÖ2a«Ý‡3áD˜eS<– SÁZAš¢k–®¤)UÛ¡j‹œqÇ0h¹.EË"Î2*¶£ô∿ †àRÎû²¥½"Î}”ˆ„Äã%ïŒåAÓèt:X–E©TRƒÒç>6M#Ë2uGût†¡bVO;V¶¯dÏ]ÞÉ&IÊp¸‡aÇyšÆ4› Ο¿„çMR,.P(ÌQ(Ì¢µ”ež7ÁÔÔ$…Â"®ÛBÓtÂ0ÇÓVÐ4Ë*bYEF£ÞØm=‰®;Øv`̱ H’ŽÓÀ4=>•¦£Ñ.Õj™¹¹Yææ.‘e1qÜ#Vjt»Ùßß{¦§þ¢sñ¼zÞ1R™´··§"`777UNÅáá![[[Jëº.®ërïÞ=Õ†±,‹V«…aj‡"å¾Õjß÷™œœ¤ßï«Á|–eÊëà8žç©çh4RTÇÕF2ÜkzzZ-N/ƒ´?^§½Ç^¥¤@ Š"îÝ»wê÷)tûÎÎgÏžå7ÞÀó<šÍ&Fƒ3gΨ›'©ªZXX T*)ÁÌÌ “““,--)( ò¨/•ðç.íìÿr6oü !ÔOã6Ržæ"C|l Ô-ýɰ¹òjæµ§[XvK°¥âN|ÂÓaL…Ñl”©áµ¢{‹Y”n…Âü7é·Åω#¡¾Ò5±ÕmaPcÝ£ýHˆFª¹äs7\1ópZýû}쪻“.ƒ‡² Ã5„ïã(Šp }Ì¿ns[> CÓq ƒ4ÏñM“ÕAŸI×cs8$Î3šŽCÝq¹Óí|ãóX·*¶Í×h{=]çJe£ƒcíÛ¶Y\\¤Ýn«Ö…\H]“““¤iÊþþ>†a(Gn­Vcgg—,+“¦!¶]¶ ‡ qî×0 —$`šE cÀÄD•ÍÍ6àQ­fø¾Çæf$‰ÇhRi‘8îQ¯ÛAÎ`‘$Ò4À¶ë8N Ý$’ç©Â’Øö$çÏÏÓhø|üñuL³Ép¸…ãÔH’axD¥R¤P(ž.Ës±¹¹ù1ÝÏ;Fƒr¹¬Ú‹QÑëõ”äT¶ÏŸ?ÏãÇÕ]²4ôÉ“¼AbŠN§ÃÂÂ_~ù¥â6éºN†dYF†Êì†ËVèÌÌ GGGX–E’$*IP²¦d›kkkëÔË•iš¼ñÆ|ùå—¯ e"’£ÑHyaNû½žç)òÄĶm«ÖR±XTç_&HJ ¢\hå¢-oš¤dX*çäk,i¾Çñ)/Êãù×*ÆÊ¥\àÑóL –#0Ú»!™)ÚKvõõ™udi†¦˜EÈß¡{b$ÕX£µ‘À–$9á~¨Zhyœ£!ð#Ña$þ_9èfÅÄi õ”išBä é.Ëð 1÷(¤ýo^pfFG˜%á#R v‚'ñš™|f)šÓbg4"jãÈ(1Øh:ëÃYžã&[£¡ÊóHò\¡Ý¿i¥y¦òD¾õ¹× ÍNþ^™?nÛ6¾ï«dµ{÷î155¥xF²gþ¢ò<ï¹/Ã0ªä´D.Tâq ŽP·ÛÅuGÈd‡ÃMÒtH$@®îÈööɲ×mçég’Ðï÷0Í”^o˜¦ß7qÝ:ÛHuEõ™˜XbvÖàã?CÓ,…9‰ã.…Â,•Ê¥ñ@}0N<ôåå ~ÅíÛÇC*•IªÕKŒF;DQÓtɲIvvNªÎdtéqgò×Õ‹Îß`0P±±£!óÍ¥ÒKšï¤—Dî<ŠÅ¢ÊM—C\‰¬‘)‚‹‹‹ìîîª÷œmÈ’ðÄ㪨 ”)P¢;¤ç¨P(°»»«2È_¶òø@e‰<­ÄZXXàG?úišrëÖ­“ÏÍqøþ÷¿¯”Wiš2111†Î¥¬¯(汬ºnsîœÃäd‹( É2“¯¾Ò‹8îQ*Ù$IÄÒRŠç¥Á,›› 2íàû38N­­±í ÓÓÿ†4mãû Õê ¥Ò›loÿŠ Ø£Ù|ŸRé ½Þ§A«õ]‚`½½ð}Ÿ¿þëò³Ÿ]#ÏH’>ž7I·{Û®àûSÄñߟ"IºŒFO¤ÓKKKüèG?"ŽãgÐöÏ«ç¿f³I­VÃ4Mƒ¦i2==ÍÄÄ×®]SiÙ†ºtéN‡ÑhÄýû÷™ššR’]Ã0X[[#MSâ8¦^¯spp@«Õâðð÷Þ{8ޱ,‹ÝÝ]677Ǭ²€wÞy‡ßÿþ÷|þùç .^¼Èõë×¹zõ*«««¤iª™ .°ººÊÛo¿M†*lê›–¦i4 6Èás1 ¦  Âma6D‡dˆ¹JÓ;±±“ ÅÓJó KÓ¥){ሒe15މ½ßë1Ht4"±ØšÎ~à†Â¹g9ßÊÓñª²wCÓ”^–d5=zôˆƒƒ¶··i·ÛLOO³³³£¼ònöy%i¡ûûû§nÿ‡Ã!»»» N¡ K¼…„ãɼ ž–1ŒáxfQŸ Ó40M Ó´qœ*y£ë&A°Ož'¤©K£Ñ`41³QtDžgãð©M3‹˜f]7I’QÔÁ¶+c¼ý}†Ã-\·uâùöûýçž‹çÕóÎ_’$JU«Õ”ÔµÛíªÿ–Îñ0 éõzôû}’$Á²,¾üòK¶··yøð!ÛÛÛDQD­VS¿Ç4MVWWÕöÖÖ–ºÀIB®®ëìî¤Ú •z( ´Çã^÷ööþ"¤© Ðñå²x=³? ÔðñãÇ4 5g’`ÅJ¥Âõë×ÙßßWm;u[­VÙÝÝUžÓ4ÙßßW»‹Z­¦Zde²¿¿O’$AðZ}/ß¶´sÿë¹|âŸ&ö#ÍÔP›³xŒs?Ø×-ã5|C!Dò4‚U°Ä"!qî*iЀl$ÞdÒxwc•4¨išÂ¢H“$9J¾+w’õeŒ'òÞ‘X´Ô¹°tò,Ç™t6ñóoÎS2^sŒ' ²CÓÇCuy]vMƒ$˰u]Èz-“­Ñ[×& 9P4M¦<Ÿ{/s¯X6%Ëb}øj8÷íÑþ1Ù¤’ËÞöh4¶m–––ØÜÜTrEÉ4zQËE ÖÓ–=á§Ñ²äFú êõ:ƒÁ`Ìê‘e6ibº9¦i–5O·{ÃpÇ(—<áû.½ÞPexX–GšÆjÐ.þ­Œ¦é8ŽNDQ<–øf躅mWHÓÐ^p¹ P𱬠â†Ã5l»F–EcôÉP=M3I’'Dj)–ù'ߤžwþdÛP"8ŽãHäßa²°°ÀãÇÕLâø€Û¶mÕ†J’D‰&fffÊäø7Š"\×U’Þ8ŽÊ$Ë2Õ“U9ó8žÞ'ññ—ó¢’syÕu••îÝ»÷Úf R< iÚsßçR¾,¿|¿K?”PKt‹ÜµKõ™Ë×KF8Kш$>È,ùÞ¿ó8µøÏUf2H­0Ña$0)®¡¨ÁIžsGL¸.K…ŸîeWk l]'É3vƒ€‹• ×Ûmt4¦\0K%)99%Ëzi=•¡i˜¯xbh%Ë:±€HÍ{³ÙäâÅ‹ìîîræÌ>úè#Μ9Cžç fggÙØØP”ÓJÒx÷»ß=sa¬Õj|÷»ßåüã3ÚxMÓxûí·‰¢ˆO?ý]×y÷Ýwyüø1““Ü»·ÏhdÓíÞÁ²J8N€¦åŒFæøx„ã4¨TÎE] çRé`š)ÅbÈþþ+W±,‹ÕUŸýý/‚@£P˜SAUð³³Sã4¹ Óô©×ß&Ëz½‡äy$E[ñýïŸ/¿ü’ZÍek«@µú3í2mc ±¸=}.¾óïðÑG}cHÞóÎßh4b4qéÒ%z½ž"¼JC^³ÙäÎ;ja Ã¥¥%&&&” ±ÙlrxxˆmÛ¬­­±´´ÄƒÔ….Ïs¦§§•;znnŽ$IØÛÛS_o4ܹsGzÛí6sssÌÏÏ«ö•tYK,ÉåË—ùøãÙÝÝUÏgvvvœD©+ª1îííñÆoð§?ýI¡[^µ–——•Ivvv–R©ÄÎÎÎ3mV­Ç³gÏríÚ5%(7;ý~_qÁªÕªÚܽ{WÝ I”‹4ƒJ¯‡ÜeH*õçŸN¯×ãòåËT*?~ÌÔÔŸ}öÙkyίR¦ŒŽ"‚MaÈ3ƒôBJ ®t„›žH'|m,M×pšδ£\âº'²@Fk#üy_-pº£c•-þE|`ä€ÄPÛ(ˆïÉ3P”3wZH ßõ8{rŒoàι¸Ó®þŽwDvÃV*¬t ‚¦*W*ôïõI‡)VÕÿ>® M™ð\ ¦I”f, XºNŶ¹Óí°Pó]Óè' WJu~¹½É(Mi:.Û/y7aê®ñj,¬v2ázlò»åÝëp8T(pÙž¨ÕjcG¸÷ÜÄ0 –––ðQO¦iĽ˜Ñº0ZKG!ZY(Œˆƒû±@Y:º#v3ÇË7Löƒ€‚iR¶t6GCLMc}8 Î2÷8QCc/1ãy˜šÄIÙ²^ eÂø•x•*šýäôT£ÑPçôáÇLLL°µµÅÔÔyž«ùó*MS>|¨RÙž®>|xª1 C>|xeâ86;;ÛLNNáûëã¶Sˆi:¶Ç­‚œ<7Çwù"‡CPyKìï©Tª¬­}A· ëë`:ƒÁ}’$4’dHì3í¢ëáƗ_~©A°¦éÁ.®;I¯÷@µ¾ƒ=TIŠ;;ˆ¢*£Ñž7M2n¶]ÿ÷ÉsqüÂùuõ¢ó'K×uþøÇ?R.—•¨Ýn³ººÊ‚ú¾©©)â8f0(Ž“t†‡aÈêꪒãÊ:îv¿uë–š‰A bXŸÆ  Ö××U+KÞTÈöÖýû÷Ÿ9FºÕ÷ööèt:*±O¶Êu"]þ2EîÎŽ?öãs ß÷•°@þ{¡PPnü§KJœå9yúód†rÀÿ¹Ê\ÑWøqùÇüó?ÿ3ív›w¿ó.fƒ(ŠØÚÜziIÝו¶÷Ô ô¢×{üZ<Þ$ËvmŽNÿYÇ ‰Ç–Y4IµôÉòôïÏNþwN~œ(Û^VŃøÿº_»Øÿ5Sž÷Ò{ !ãµ^iÑИôüS͈’k(©¥ëº|úé§LNNŽ™T®]»öÜŸÿÃþb±Èûoÿí™áæìì,ÿ÷Ï/ùËgR Ãàïÿþï ßþô§€N½þ]\w‡³gëܸ±C1ÍGLMM1 0 ƒ,Ë1MߟÆ÷§IÓM3 Ãòo½õ– †º}û6.\àÑ£GT«U•ÌwÚûCºÍ%ÞýÞ½{¬­­ú˜,ËâßþÛ ù„ƒƒÞyçšÍ&?ûÙÏÃ+W®àºî©í_«ÌB±€fh”ª%r=Çõ]´-¦ç¦¹sÿŽ@J¼êÖCÖëRžÑíÇçßè0]{²ëù–•E+íøò*U0Í—žè¯ˆsïÆcÉñ —®S(T¬ìp8äòåËÏå`*@G=}=ÇÛ"²DËÊé¤iFšŽ(—=úýGGÛ”Joqùò›î3??Ïüü>üp]wÇaQƒÁæø"™P(̦Åâq<¤PHØßß Ž‡‹ót:·±íž7Åp¸N–iÌÎα°°ÀÚÚ=¢TZïºúØvߟƲÊôûȲ„801ÑàÒ¥KhÚYÖÖ„dØ0½îë¡HÅ1í%«b‘GùK/<ª4ðf<‚í@©¹^ùyhbØ~ð cžaâ:‡/i@<^3žÏQPaVyž†¡Ê0¸sç÷ïßWaBÏ;&vwwOííF#Â0äÑ£GÏ|$Ñuss“vûM3°¬ íö¥’K¯wD%ôzû ÛÛ;¬­=¦Ûí‡Øv…½½?’eÃá&YÓï‹Üvûa¸Ë`°Iš&ìì¬1îǽñnE;ÜûDQÀööªjÝeYD–ôûÑu›Á` Ø#Iúä¹èë·ZUL3åÓO?"ŽCz½‡ãhÝ‚`Ÿ4 ÐuëÄ]ÒXO;Ï«¿¯;fmmr¹|ê KšÙdo_­ñ´cšÍ¦bsI£ô‡œVÙ±ººÊ;wèõzìííñøñãSÛ9/*)`ØÞÞ~­s(ŠÔc”©€ÇKJiÛí¶?loosÿþ}ööö”WçúõëìííDZRÉɯKüÑÑJ1) ¸®«Â¥:«««ª­{çÎN}lÿZeî_ØçÚ[×ÐßÕEx”£+þ“Ž=!†g(^Õ·* òÿOOvµÖ8{Ê£\8ÝuaòËFBŽn ymÒKžd³ƒt’ÇÎt‰@Ñ=]ÇÙ"º#ñÉà î„ 1¨ï'˜%ÍÒˆö"šOra`¬Š9ˆ4;fø–¦Q²lâ,Ã7MvÆ-¥²ea‹°p=vG#ÁÄ"gǪՋ£—N ³”^òêwýç\| …‚Š‘õ<µµ5¦¦¦0M“ÉÉIâ8~nV´¬^¯§âqŸ.)~žI«ÛíªùŠ®C£Ñc8ÎZ0ˆã.››;lnhZ6¾phhšN¯÷ˆ4áyÓã‹{†iŽÈ²C²,¢Ó °íQT@ÓlF£GˆJB·{ŸBa€;èú“~øp¸‰®Ûøþ ƒÁú8 wüö3 ŠÅ>_}õ7nd„áßÏðýÂpŸÑhM31 ›Ñèä…;Š¢ž‹osþ\×UØ‹ã­%‰Íh·Ûêb+³Ð;Åb‘n·«bi£(RL¨£££ï¹ƒÈ²Œ‡†!„aH»ÝV ›D™Kþ“„-Jƒ®ëŠ,ûûÇß®ëªÅarrR©’vww™ššbww÷Äóyåº.Åb‘v»ýÜT©T¢Z­òøñcÒ4U¹K“ù.oÛÛÛ¬¯¯«™ÉÄÄ›››êFìø\©ßï³½½­òU$õ·ßï+Пsñ0#¡Ûî¢ç®»bˆ4ùÆ$Y”±ÿѾò_Ô¿SÇŸõ¿õ ¥i¹òØÒå’PMub²(£x¾(.ÐaFÒK(,ØýÅ.î´+îø5è^*wÖUÃ5(_.Óþ¤Md8M‡Â™š­áNºäY.P&«CsïˆÅ²ñÃÃGC̲Iõ—¦ é¯3áÝë]ì¦Máláƒ!š¡a7„;½hY\­×¹ÞnóA£É϶6 ³”³¥20ëØ y«Vç_vw°u4Ï©Ù<Ø#Î2æüÂ×îž.Ï0¨ZöK·¾ŽW˜¥ÌúnŸq\YYáêÕ«DQ„mÛ e"¥˜2úô‹/¾xîký×ý׋EþãüÏ\èùÇüG~þóŸsçÎI_„eYüøÇ?& CþóþÏäyÎ… iµ±,“›7wñ¼Il»ŒeUXXÈ)—Ëܾ‘ç:†á[4º.Áss#år™ jµš:fvv–©©) …ŽãpttD»ÝæÒ¥KjnòÉ'ŸpïÞ=jµo½õ>djjŠÍÍMΟ??vç‹”ÂÍÍM®^½ÊO~òîÞ½ËÊÊ o¿ý¶òSü§ÿôŸ‚€ééiåÕØØØàwÞáW¿ú¾ï¿Vœû{ï½ÇÌÌŒrÈøá‡Ï|O¡PPø|9™˜˜À²,ö÷÷U‚æ¥K—Ô¢Q(˜ššb8*©TbåyN­VãÖ­[Ü¿Ã0¸|ù2A°¿¿Ï•+W˜ekk‹J¥Âù/ÿåµ<×W)]·uqaGÄŽá„»!ñaŒé›Ø5Ó5…)-×¾ÕŸgÖ:jw“'¹Hì ÿ‰Yòd”¨¼ô4Hq&…ûPr^ãÜ NËÁØÍ„Ýá#áÏ3áxW¿ÞI«ja8áŽH64K&VYd’äYŽ=!Ð.º­c7l!i6Äω² CÓ°u8Ïh8MÇa”$x†‰ošx†É I(Y¶nÐŽBš®ƒ?öqšNš¿üÿUçRq–¡?§.·Üý~Ÿn·ËÄÄ»»» ÛÝl6i·ÛÏlc³×óî²,SÒÅÓj0œhÉž½iZÄñ!šfâû3dYB±XdffÛ®âº-ÅbQ±¬dŠã8LMMaÛ6SSS*s¾Z­211qbfR.—Õo~~žõZÉ×õÏ]ÚÊÿ}%oþ›¦h#Åc|Gš£ÙB—Âå­iâBo^ͼö4ÊDÃÍ¢©<yœ«ÅE3„0 2•×.%µî¬ [ÚÄX˜ “\¡Ûó,ǪX‚Ì[; %˵4‘GR4º> .—á ‚¯Ý²> ä}œáN œ{å8ºNËué™WÃ4Q Š'j€£ ‰ùú`@ÕvØÒ<§jÛ´÷D°Ó×UͶ)[6ß~ {®Tfo |º¤DQJ2'&&Ôݧ„v:ÆÚ–Ëe Ã8u¡1 ƒf³ùÜ:™×ívµôèèˆR©H»Ý!M}ikY#4-'Š$Îý,‡‡×Çòݦé£iCjµûûÀ£XÌñ}½½IÑ"šÊü¬­ÃÚ|ÑÒ)bÛU¢èÓ,¦Cò<#IÄ.¸Ù¬cš3„¡A¯wÇ©#u‹$É8îcš†á¢›¦I£Ñx.7ì´úºó'S%¾Dò¬,Ëb0°´´¤€}2S\Pyž§è¹òµ>::b~~^S.—)—Ë Â0¤X,ª¶Œ¤íæy®ñ­V‹^¯‡ïûE‘K)®ëºŠ-%ß’—5 Ð4Má@$D²§–——¹uëÖkC™Hà¤eYôûýç¢LdN|†T«ULÓT7>…BAaî¥xA"Jd‹°ßï+G¿|^Ò+âû>Íf“ýýýBIJ~Yìýÿˆ2³$S¡LÑ~$.Ö±h%‘Ãàá@\ÈuíµcL gÄÜà¾ø:Sö¤˜]da†3éпÓÇ™hötôä ¢"ëÜ0Ü;ù|Òá“ï Gâk¦ož0æqN'Od½ÇJþ[Ô;¯(ŒÀ@,¨ºFNN˜e¬‡L¹®ÇN› Ï1-›†#ÂqvF#æ î÷züÿ™ûÓ/¹®óÜüyˆyÊÌÈy@b œD –,Ó–åºîºªþî^ÝUýõþ?µêºVùV-K²&‹’xeR Ä $9‘1Ç™ûÃŽ½‘ $@€€M¿kqId扌8qöÙïû<¿ÇÔD°T?ŽÂÝøwOYÆK#àŸ,]Ó0ôÓÿ¶¼Ñ‹­×ë,..²¶¶Æôô4ÃáPõËŸU8Žsêây‹‹‹Êéþd5›M•‹ €F£N¹ŒF&Ãá=<Ï`4 Õ0Ë´Z׌\nfŒQÏáû= #"Ÿ÷iµú4ó¸®GÎrxxMžUtÝ Ÿ?¤t:ŸaÛ¾ºxdYŒïO“Ï/ÐíÞCÀÅgL×âx†vû!𦓦!ŽS'—›c8Ü!ްío¼!° ÇgËò\ôûýîiÕùKÓT]`â8VFÀ³gÏrïÞ½‹Îñ÷g8²²²‚aÄqL¯×£R©0OÓétÔ{/a†a0I’„ùùyîÝ»§ÇRj,ÿ–¦i4›Mµ;ÚÝÝeaa~¿¯v4òówü3vÚù‘Ïõu–<—/_æàààT©´D³\½z˲’Ýq…Ä—xÓ4©T*ܽ{×u‰¢Ã0_²çdŒ°øLéÔj5e¢\XX P(¨¯ÓZ—ÿÞ.yh€IDATefqÆðÑ,Í®ÑL ÝÒñçæ¼{½‹¦k$ƒ„ʬŠõÚP&š©‘?ŸGCS(ùêU2tu‚íY0¨¬’…U°Ð]ÖćÐi8t®½ø];ˆ6ÝKÏpŽw—È »j ô˸ÎKÌår¬z´£ˆ÷juªŽƒ£ëÜïõ¸P*3JÆÀÅ4åJ%ǯw¶ Ò„¦ç³û’~ÛÐÉ¿¢t±†L¹ÞWª¿d/Ö¶mõ!ï½÷ØØØ8Œôä1o½õ¾ïs÷îݧ”5sss¼ûî»t»]®_¿~âgŽã¨ùËÝ»wav~~ž0 #|– **c¢Ñ˜âãÐu ]·1 ‡Ñh_¡L&ñ¼˜ X`c#æÍ7aƒv»ŽaäÙÜü¶]abâ{ceÕˆ3gÎòþûïðÓŸþtü¥}\nŽn÷.¶]¦ÑxŸÑè€ÝÝߎq%o`6…Â2I2ĶK´Û·1MŸzý°Åää$»»»'.Šóóó¼ûî»´Ûíö]=ïü=«fggyçwT¿þ´’3y!¬Õjœ?^!=ž%ãqÁ›žž¦Ûíªø³n0|ßçÊ•+ª­sëÖ-Þzë-Z­Ö‰aý‹”¦iŠ<ü:«X,òöÛo³¹¹yê"AŸçÏŸ§ßïS*•˜››SÙú;þ¼B™Èèß^¯§dºº®377‡išäóy®_¿ÎÕ«W•|WPÍÎΪèaÇq¸}ûö7îF75MàÜ­’…;墻cÂæAš ÞJ¤G¤¯•ƒ•%¤—eî”K2Jèßï‹ '['S‚@´Ÿú ÉHd¤k†˜mdI&à‹£—˜¼†ç¯YÚ %À~0ÂÒur¦IδXë t‰5šo†˜šŽ®ÁÞhÈB.kèiB˜¦ íþRçï_‹c„/0thŽ,ËRwQÒ¥ü¬J’„íímå|~²ŽŽŽØÜÜ<õbÇ1ÛÛÛê®Lºxi4êØö:iš‘$&¶†!ý~MKHSÇ)(ÕÓp¸ƒaä-šÍ27nì2†È»Ì5’$EÓt²,!ŽÁ!ºî’¦.kkÔ…)IF„a›0<Âq ‡;$I0~Î}úýGXV𠂃ñ æ×$I´Û÷Y_וòæÉsñUª¶=Ï;fkkK¡ÞŸ÷Þíííñî»ïòèÑ#ööö‚à¹q³R‰uåʪժ5>«Â0TÊ*ÏóH’„ÍÍÍ—R¢ý[×h4bkkë¹(‰iôè‘bgÉ”H˲°m›?þ˜8ŽUü$Y7 îÞ½«Ò7“$¡Õj©ÝTµZUÁ`gΜassÏóØØØ`rròÔÅüß»´Õÿu5›úû)…@× ‘¯¡›cB”ŠÁó˜Ç!ÿû×­'g 2ßœ AÔ]<(Äœ¡bo•(h×mtkŒ2ÑNÕ˜ù3gÒ8wénâ¦EFè&£äñb“‚fkd¡x>þ¢Ïàþ@ý- ц²tàXŽ·¥ë8†Á0IptSÓÉY&»CÕïœi2åyÜí¾¸?¦hYäM‹ÍW”(“!ƒääö_>‰uØmÏóh6›úè©;<]×ùîw¿Küö·¿Å0 ¾ûÝï²¶¶ÆÄDƒ›7wÜqæGƒZmˆaht:i*ü ùü…Â2QÔC×*•6¶Ðé$ìîyç9t]çÁƒWé÷:¥Ò§B’D„áÌÌ4¹uëÖx]¥^ÿqܧ×{€¦ ?Êh´G>ŸçÃ?ä³ÏþL>Ÿgm-¡Tz‡$1í1ícš¾?ËÑÑuàñ299É÷¾÷=~ó›ß¼0PñYçouuÛ¶éõz4›M@Ì æææTèÑgŸ}¦\éY–1??ÏÌÌ NG]˜}ßW´åÅÅE666ð}_ýååeŽ”Ãòb±H¡P`mmååeþð‡?Ðn·™˜˜`yy™íímÊå²ÊÇm™0 988àÒ¥K|ôÑG'ÌŠ333,--©;s¹ –»¤·Þz‹?üáŠüºêÂ… ‹EE> Ù³´´Äêê*Ÿþ9†a0>¿Ýn+N½^' Còù11¡Þß/¿üòD~¤¹œ‹èºŽeYܼySí|¯_¿ÎÞÞ“““¯ô]8^²eº··G¿ßê9ɇln ÞÚþþ>Õj• T°–Ä·ñÅ€Xô¥[Ÿr¹Ìúú:ìì쨨Zùy“ò^©àÚÚÚâw¿ûÛÛÛ*ì›.1ùL ·y˜ªYˆô{ĽXÍ@¤BëUê©HÛ1Ew…©/K2µ¤C$!?Z‘šÀ8wM`I’^"‰1z%KÇØg[¼>3g Óa'ÇL‘Cb>ŽìÕ]]9ÕeÞz–d"cd<‘8wK×ñ “Q’à:q¯4gšèš†«†EË"LSò¦E; ûS8÷3…"›ƒšÈžw.—S[îÃÃCr¹œÂ:ȹ†”9>o‘wM§I/%sI¢°Ÿ,é]é#¨$1Æ<)™30þ@k&–U N=I†cgz€¦¥*œJÑ|z=Á`‡Çs ×2úýGý»}¬¢…Uz5éèþ¿ìÓ»9¾ èPýNoÖÃp ü%Ÿüj^´­NÝ¡ò^…áúoÖÃ,˜bî16æVsŠ}e×mj߯©¶›¿èSº\›ñ(].‘;“í¬Pì2’~‚Uµ¨¿Žné ©R¼XĮژ9“âÅ"ΤC°àÍz"~7̰+6Y,v@yÓä»If|ŸK•*kýi–ñS,Š4=ß4ùþä­0 `Y”,›¹qBa ,æó*÷E«dÙT祌OVÙ¶)Ú6‡a€ã8üð‡?Äq¾ûÝïÇ1o½õ‡‡‡œ9s×u©Õj VVV¨×ëÏòøòýÍßü o¼ñ·nÝzê‹=??ÏþÏÿ™ÃÃç”D¦iò÷ÿ÷ÌÍÍqûömt]ç¯þê¯ð}Ÿ……y:Ç™'ËR …ejÌÍÍÇM\wߟ&—›¥X\%ŸŸÇ÷gX^®277E±¸B–Íòï¼I½^%ŠÎÕZÛèºC³ùC\·i¨T2¾óo³»»K†‹g™˜øîx˜©Q*Ã0|‚à€R©Äÿü?ÿÏ Ο?ÇhäS.MÓ1 Û.ãyS”JgŸÊY\\äüÿGö÷÷_X‰õ¼ó§i~ø!•J…ÕÕULÓäƒ>`4qñâE’$¡T*©÷nvv–wß}Ã08þ<‹‹‹$IÂåË—) \¹r…(ЍT*J9µººªÒ/]º„mÛÌḬ̀¼¼Œiš|ï{ßcwwWÉ[¿õ­o177Ço¼AÇœ9s†\.Ç¥K—˜šš¢X,òᇲ¿¿âõ,--qöìY<Ïãí·ßF×uÞzë-¦¦¦( üõ_ÿ5N‡r¹ÌÎÎÎk]@|ßçÇ?þ1…Bá–^Öìì,W®\A×uå&_^^fee…|>Ïòò2¥R‰>ø€R©ÄÔÔiš²²²B¹\frr’¥¥%EÖœœäÂ… DQ¤L—ßùÎwhµZ >øà.]ºD.—ãÂ… /Œ½ù·,]÷Ä`:¥w!ºFt‰ù‡¡©h×`ïë_¬N­’ž˜§aÊpcˆfk˜ž‰7ç)I±ÓpÔÎÛ÷þD·t2• „jÊp ¬ª…Y21ó&†+†Ýº­£ÛúcÕS•Æh•Äâ¨Ûº˜õL»âoØ:î¤KÔŠ°k6v]˜å¼&VJ*‹(MÅEÙI¾aÐô|J¶M–AÙvÖd>—WE×0žRB}U 0À«õ|{q„3VvˆD¿XÉ¥4Q:kŽŽ”3ýöíÛ ‡Ãç¢Ä‡§ ûå±Ä]/ùûÇÄäó ‚^oÃp(WIÓ˜©©I.]zߟ¡X¿H±¸J–¥c‚nD>?ÅÔÔ$åò9r¹9,Ë!Âð×­£i:¶]¶ËD‘PLÕëMÊå2õz]¼Ç¹YÒ4$ŠzØveŒtmI+.‹,--±´ô6Y–E]L3‡çM0l-¥Îz‘sñ¬zÞ1¦iR(¨T*²²²‚çy”J%ØÚÚ:¹”í+¹[ØßßW½ö¹¹9jµù|þ:£ßï+_Ð;wð}_®ëªùˆ e’nóJ¥ÂÑÑApûömæçç)‹dYöÔgJº®›Í¦Úß¾}›¹¹9J¥’:æßë!A’žwzäA«Õb{{›b±ÈÁÁgÏžåí·ß¦\.Ól6i6›¬®®â8¶mcš&Åb‘ååeªÕ* j2;;ËêêªZhä{ü$ @þ\‚¿éÒVþŸ+Yåƒ VQ¤þéŽXP O ã®À{ ‰Y‰]}ñùiõd Ë®ÛÂS¡ ¹3á¨!·fi覸è'ƒ„d TRÃõ!dà/ù$Ä`;@35ì†-ø]c0¢Uß,ÎpŽ  »:É !Ü ÑLá®ötGÇp …?9¾pÚ5›þí¾XõîÍq•µqÚö}vvVÍb ÃàÂ… ìîîR­VÙÜÜ"Iʤi€eð¼>†½žÈ(W9<ü3†áó8òØö€f³Ìúú!YæS©$ø¾Ç£G’$VqµÅâ‚@ ä}_ÇqÚíθmÐÀqª Û8N•8e±Â’,,Ì3==C>Ÿãã?G×ë ÔïÁ–•Ç4ó'"m]×ennN¡º_¤¾êüÍĮ̀þ¹D¢iý~Ÿ .ðÙgŸ)­l%Éc$‹L.4Ò5-©ÕjÊ%óóóŠæ+ Î’2;99I­V£Ýn«}†t»]F£‘B€är9Ö××O´<+• “““ܽ{—b±¨R*³½½Í‚2ß½®Ò4ééiõ™²¤ÌVâ[¦§§±m›N§£p/artt¤ZŽQ© )¹XW*•,([GGG”Ëefffxôè‘ÂÒ˜¦I«ÕR7ßt™š¡a•-tóñÝ|–f¢Ý“eÄmqFy㯫ìšîŠlq«0VVé(U¦$ݽ¦3ÚaWÅÅ;îÆª-Œµ›piNT‚€8ɂ㟧£T´±@ ׯŽxl³`ìè¦XL÷XK8Ï ñÜ厨Çôz]Š–…gô¢ˆ hz>9]ÌAv†C|ߤ„¦‰c<èu‰ÇC°Q’¼4–$JS†¯áˤã\’píÚµ§~ž$ õzÝÝ]t]g0011¡ßÏ}ìqüYõ²ªy7f9â8e8Ü&Zôû ‘¦Â¬4n“$¹Ü<¶ ͦN§“±»»G–ôz{”ËÓ¤i†mWi·ï pî Ãá.ùüýôS …‚bñœ¦’533C.—;õNiaaýèGüüç? ßaÛ6?øÁ‚€ø‡ MSfgg)•J@Æþ~J¡0ƒm0 Ÿ•¡Rùüó!``šBÊÇ#*‡•qAOÓ„áp’˜÷ß·9:Ú%Iê8Níí_cYE¦§?$ ÛDш3gÎñþûWøéOÆÞÞµÚ;”Jgétîáºuo1í±¿ÿ ¦™cjê¸îMÞzk™«Wšc¨bßFÏ›"Ž$Éã÷mii‰?üŸýìg/Ì7zÞù1¯×ë*fµÙl*)ôoû[jµšRP]¼x‘sçÎñùçŸsöìY\×åáÇ”ËejµçÎã£>¢V«qÿþ}uQ\]]ekk‹sçÎáû>£ÑH¡Ýkµÿý¿ÿ÷¯Gb<\×Å4M±›zøð!—/_æ'?ù‰ÊÕqA={ö¬ò%åóyu×ÿàÁ®\¹Â¯~õ+\×}-™è Z€W®\!ŸÏc_|ñúÓŸžú=Ã0˜˜˜À¶m•/ù^²yttÄo¼ÁÚÚQáº.ÓÓÓôû}•ïº.333jq¼~ýºzO¥æàà€ .(vV.—ã¿þ×ÿúʯõUK×-A®Õ, »bc•…w"Ø ˆÚ‘@œLº85‡¨½6o¥âŸ‘@¤¸Ó®@– 5nïEíHì>† q/Æ®ÙJ1<ÞŒå¹fÞÄ›÷„qpWäônôˆ1HNàܳT¨A ß l… 7†Díˆd ¤Ã èXwÔüÇ®ÚO #|£$¡æ8L¹GaÈQ§Â‘~x†‰©éìb˜~_òu$ì¯CöþUwmÒƒ!ïÆ¦¦¦ØÞÞV¸çU†'ÌgÇKÊOk¿¤iª˜HÒµ,{ô¾ŸºhšãÔÆîn‹|¾€eyXVÇ©¡iºnÒnE!Åb‘Z­Fk¤©@ŸÄqÂp¸IšÆhš¦™ãç-nP§D«ÕR=pð‰¢.qÜÃqêÄñM“ê¥ýþù|žR©„çÆÞ¶]BÓ :» Û¸nýÄë‡Ï<Ϫç?-ÀN§C’$Ü¿_1©†ÃáSHÙë—ê+™×-=2ÔéxÍÌÌ0HS¡l“m—ƒƒºÝ.GGGOíLÓäîÝ»Š@+fP¡ZNƒnNOOÍf“ÃÃC¶··9<<$I,Ë:g|]%[§N‡n·ûÌ»}™¢˜$ >djjŠjµJ¯×SÈõz½ÎíÛ·UKJrÕœ˜˜Àó*Ô½7ëÑ¿×?!)ö K×& :Âå­kâƒfŽn kyÓdc8À7LºQHŠÀ’LºÞKáÜ˶MÁ´Xô_ø˜'ëL¡ÈÎpø•ɆÁà8‹‹‹ÊMû¼¼@… 6'ÑuR©D»Ý>õ®QâÁŸ”ñú¾O¯×'MåÑu)Ñ5Ñ4‹|~‘££/ÇH’€bÑW}ùv»‡¦9xxžÏÑш8©€'Ç©’e)"Œ*FÓb%00 Ë*‘$4ÍãÜ3Ò4¿¦ 3xžÉÍ›w°,!Ù5 {¼ëžÊy‘sqZ}Õ1µZM?y±‘80 YXXàæÍ›êûaÛ6¾ï†¡jÁHŒºì¿?¦T*)÷´4|J„ÇqÄÈñ¦mÛ ~)óA…P‘»—ãÇ uœ|óñ—––ð<ïÔ¸Ñb±¨0 OÞyjšÆùóç ÃÏ?ÿ]×yóÍ7yøð! îß?`8´étn¡ë–%f Ibe)ƒÁ–•§X\% ÛdYމ‰6¦™`Y>}–—°mÃp98¸zl©áyM²,¡×ûŒJ¥ªä®šfR.Ÿ2:{èºAISqxÿýwøòË„¡a˜‹+hš1†.nâºEr¹Y:»'^o©TâwÞáÓO?}a8âóΈH¿ß§ÙlÒ—J%%–5??O½^W½u×uÕb½½½M¥RáàààÄ1…B‰‰ z½ž¢ t:ÇQáJwïÞ¥ÓéÐh4XYYQ®m©s]WùFö÷÷9þ<üãO´<åçm}}™™¢(RsÝÝ].\¸À_|ñÚI¼rçÓh4HÓôÔÖââ"KKKüùÏF×uµP”J¥éÌ/—Ëܾ}[ ÃàܹsÊŒ(3HäûiÛ6ËËË\½z•^¯ÇÙ³g)‹¬¯¯399ùÌ4ÐÏ2A¸µ³8c´!†Äº­“[Í‘†)ƒ‘ ØRX»n¿>7º¥K%Œ¼Aÿnÿq°T’Q8W`¸1Ä_ôm0s&¦obä /îhíŠMgCÜÉe‰Ø=é–Æc‰®3åˆ]Ì@d:!€Y2)¿[ê3[Çi8¾Ø‰9uGe£$#Ñú*¿S¦wK´Ã¬Šh·edÔ‡ÍAŸY?ÇíN{¬¬ò˜ô<\ÃàV§Í™±âI×4†qÌåj•_no1J&\÷¥£i-]éõ'«"«}4R-y‡go¾ù&GGGjð:==Íìì,ÛÛÛôz½ç™ Ã`uuß÷¹zõêSwpR⸽½ýÔÐqVWW‰¢ˆk×®©;Ò©©)F£!N—Bá,–u…8¸t©Âôô,}´®;躅ax ›äóeâ8`f¦ŠïGÁ ¬¬$ìí­cÛUêõ÷ØØøé˜uõ.ƒÁ6I³²²ªf =¢^Ï›¢Û½‡m—(W ‚vv~ƒeYÌÍ͆çÏŸãúõ{{Ýî- Ã¥V»Ìp¸ƒe°¬QôXq733ÃêêêKÑuŸwþä9l44›Mƒºˆ†ÁÇ) êwƒ `qq‘7nP.—YZZRÏennŽË—/óñÇ«vŠD™,--qýúuJ¥‹‹‹loo«Ù›o¾©2Cd¨Ôh4" CƒßûÞ÷Tª^.—ãË/¿äÂ… lnnžX@.^¼È•+W˜¥P(ðù矓Ïç9þ<7oÞäüùó¼öTB&†á3ïô¥ŠììÙ³111¡°/­V‹|>O¯×cuu•{÷î1Y^^fqqQ)Òd{nnn˲ð<7nðç?ÿYɪe¦}­VãÍ7ßdaa˲¸zõê7îF732‘ºW±ÑtM9£#Ñâñ¦=sÒ'M¿¯^ôn÷Tþøðá b61XF)ÃGCÌœIÜ‹IG)^ÞS8÷4J1r5oø†!&þ¼À–Œ¶G°ý{}rK9‚ýàÄóO kt[,\q/Æ*ZÄc¸ 1mWlú÷úJÙ¥™šh!Úl¦¦S¶m‚EKìh ú†¾a¦ 냾úÓ»£3~[×% Ã$¡`Y/…2¯ž_|UåL‹ÁøâœËå¨mwwW})el©¤¦nmm©ÈÓge€¸s\__W-“'kŸ‡žŠ‰Ãõõõ”SÏóØÛÛcjj Ï{D’„¤iŒaØt:]t}ƒ4MH’ߟ¦ßˆ®[ ›˜fv;¢V+òàÁ-z½”­-ÐõŒ~ÿ>qœŽ)ª#‚àˆÑH,DA sãÆ µ€…áº.Pí®;A¿ÿPáÜûý>kkk 4M§ÕÚ$ ‹ŒFûxÞaØ¡×['ËRl»Â`ðøÜííí=ó\<«žwþջߨØ`8ÒívÙÞÞfnnÏóN|v¤‡CJVå1Fƒ/¿ü’O?ýô)åt`OOOÓn·ÙØØPÁ$IØÚÚR굉‰ E~ðàžç±¾¾®Z9’•¶¶¶öTKôÁƒ8ŽÃææ&SSSLOO³¿¿ÏÍ›7Õ1ÝnWyN^WII§ÓQêª'KFþjšÆÖÖ“““²µµ¥Ò³,S0ÑjµªZUÝn—Z­¦^—y¤ ‡CuªÕªÈE]×u•¡þ¡´Õÿße2¾(+œûØû‘ÿ¶8wõ¸ŽÉãÛ,ËHÃÝhMÓˆŽ"%Ç…'P&:X[+± š¥¡Û )óE¬’%æ)íqŸU¥0ƒ$HÐMÝ^ÝÔÉȰËöc—¡á/>Ù—ŸžžæÞ½{J$ g²×.ƒŒäýìì¬RaÉc$ãJÓĹ=Þß—ˆr9<–;17zŒ3—±±b¾Õ{j¦c N“fDÃ0T›m82??Ïýû÷_›].²RŽ|š]¥„Xž'ù~ÏÌ1 CÉÿŽŒ-b‚ãï¥ÌÁ‘ ŠÄÅAðçµ":ŸuÐ=ẸÛÏâŒúëdQÆþ¯÷Õ½øFQÌ"^ã.¤p¾ >ÓIó^ T”â/úüËY;Œáº¸h:SÁÎx€iê/…ü¶fläVr¤±ØÅø >q/&Ø Hú 11š¥Qy¯B°Px³@çjoÎS^oÎ#&t¿ì’[Ê‘ ƒÃ3°Š–XЀ(K©Ø6ïTëüËî6Išò½‰I,Ý`˜Äì ‡\ªTùÃþ.®a3-4à^¯K’eL¸./k*wtñ8DZà/[: ×c­ßSbõ¾ üÅ_ü…âü|ñŬ®®2Ç»‡>·ûÝï~—\.Ç?ýÓ?=µÐ4›M>üðC~ùË_>%–è’ øÅ/~®ë|ÿûßg}}Z­Ê—_î9ºÝÛ¸î$¥ÒÓ488ÐÇT¶]&—›ç›[ÔëGØvJ§;;ï½7C–%Ü¿_àððÎm4ͤV{ËÊ‘$!IrƒåeažFøþ4Æ·ÆÞ“‡†O1<² 4›†WY\¬’¦>ùü;DÑ£ÑÁ8GÝÃ÷§iµ¾8aœ™™á‡?ü!?ÿùÏ_¨ø¼ó'ñ÷a*®i𬭭199ÉÍ›7)‹j±h6›,--Ñn·ÕÝüÖÖ–ÂÁOOOóç?ÿ™b±¨þÆÄÄ+++ŒF#‚ Pj9ÙŽºxñ"·oßf}}]Ý,,,ðî»ïªõ~¿¯ðî\¾|™_ýêW'Œ§FCÉÈåç.ß—f³©h¿2juff†3gΰ»»{b1F¬¯¯ã8sss|ñÅT«U&''¹~ý:…BR©tâ˜3gÎ077§ä²333ÄqÌìì,×®]#ŸÏS.—_+Î]*¡Îœ9£äë§- ìîî255Åææ&o¾ù&óóóìïï+©r†Ôj5=zDÇLLLpöìYööD†Ìþþ>Íf“©©)%•Öu]ͤ2KºØggg•ºQb~¾É2³THWíŠSwThS–ˆTÂüù<†#$dº£¿Þâ"µ#¢£ˆ4L1<±€hÚø‚?žÅDG/üÒ‡wc¬ÒØÅ®A°ì"Ë$J!E àœPleY¦2Î5]#¥„G!É0aðp âtM‘ˆx|¾2|4m°QŠY2 wOöõ¯·8 ‘N¨k|yt„®i¤dšF/ŽèF®a°?±>蓌·«a@åkàÜ“ìÕ>@ÐVÿ—Õlò˜D3D°”n c¡Uw(a+T3ÝÑ_›D–Y4Õb€VÅþqÞ‡™7+oŠ<èÎýx¤í –ݰIƒ1Îý…ÎØù$½q4§©á/ù î NÄçz†o˜„âKS²l MÃ/5Ç¡GäLZìë_æL“)÷›Á¹o 'žË³jnnŽÁ`@»ÝVñ²Róÿ¬*‹Š«õdI“ÕÁÁÁ©½Ür¹Lš¦t:t]gvvvÜÈÑí†D‘N쫞úã˜UÓÌE=<¯Aõ1͆1b¢(& ªÕ*žçÓéôzNDÚzÞ4ÑíÞCÓNŠr¹9L3Ç`°yÂË:–UIJ" ûN¦°íApÈh´è¸n0lŸ˜˜¦I­V{!,ø‹ž¿ç#¦îß¿êïÉ=‰~—^ÉÉI…s²„I3Vøs¹p+«Z­b–e±¿¿O½^gooï¹ÇœVº®³¸¸øÚœèOž‹Á`pªâ°R©P,ÙÜÜT;xß+KzB …{{{O=¾¥Íæ_“¦Q4¢^׸|ù"¿úկƮì‹T*oÑï?$ËRjµw ‚=Z­/°¬ss¦}ÁoÌqõê6º~–~ ]·ñ¼I@Ãó¦8<üóxAµ´´ÄßüÍßð“ŸüD ¶¿ªžwþžUsssüÝßý¿ÿýï±,뙋Á™3gÔÀVbüÿûßS¯×Y[[;õ˜••\×UAJÍf“ßþö·§òÕ@ ÿîïþ2â­­-Þ~ûm~ò“Ÿ¼4¦\×u&&&xøðák]@òù<ÿ÷Ïúú:¿øÅ/žúy©TâÂ… cÄŽØu×j5ÇaŸB¡@§ÓáìÙ³jg•Ë嘜œd8*qˆ •’J­7nðàÁ,ËâòåË|úé§ìïïsåʦ§§ÙØØ R©ðÿø¯íµ~ÝÒ%}Wx%…6܉Z"ÞÖ* Øbx¾Ö–†FeŠÂ+纥«¹DЬ4è·é*$»fÇù¿weaö”-Í[ªdÛÔ‡0IÑ5ªã3EàTѲqtƒv2åùø¦X¬-]'H¾Îëxµžo$˜/Ð7– › ˜œœTyÍÏÂ\?F¶QNû¹D>œö3‰¹?—j€áð]·˜™Y"Š¢±wá ®[Ç÷gðý&ž7h*¼ÉqãöWÛ.‘¦Ù¸¿½eåÑ4Ëò1M(7(ÅbÃÐ)—Ë8N$E}§†®› Íž$CƒÊåÍæÍæ*q,ÐïÂûQ¤×{Àh´‡ãÔžzÍÏ:Ï;¿¯rÌó0’ú*ÛC†aP*•žû·¤ƒ}4qÿþý¯ ;Ò4ÑhDEÔëõ,­¯S¯ÛH(SÆ8ŸVív›ÝÝ]Çakk‹ååe \.—©T*,,,Ðï÷U+Ö÷}fggñ}_‘®›Í&õzÙÙY ÃP’dô%n€fØßßW’v9ù¦K[ù¯dõï×1òÂ.ñº#d¼É yŒs×5Ì«™×žlaÉV™\ÄÌ‚©ðîš¡¡™bAK† I?Á𠕉îÍyÂù¼–ŽšyJYî?ð<¿‹…³ú÷ú ;¢ •3MzQŒ¡k8ºAFF– Ǹ;Fø¦ÉÃ~Ÿ†ë°=gUÛ¡î8Üz ”IÕv(Ù÷ŸƒùªZ-ÙF´^‰P«Õ°,‹©©)®_¿®åžw¡¨T*˜¦ùÔ¶Ä.crr’S[Fƒ8ŽV~qq‘ƒÜ´¿@’äqœˆjµ0&ËÂhd!pîg8<üÃp‰ã¦™C×4E¶·ŸB!Á÷}vvº$I4&ëŠU÷Ñ4ÛËŠé÷c|D Û®Œ"q<$ËÕʲí:gÎÌS©¸|úé5L³Æh´‹m‰ãaØÁ4}•«þ乨ÞÞ~ávÔW¿ÓÊ4M¦¦¦h·Û,..òÅ_<µ›Ð4f³©| £ÑHÝ4<©)†Ã¡ò2LNN*Ôû³jrrò„ÌÕó<¶··_ˆ v|€,M¯×®]{­8wj·^¯w‚D|ü|Jsåh4Rß¹HKJ¯×C×uòù¼2ÊtÆv»­d™DZÂË÷Xʱ5MSyë§=§ï2ز(#<Õ,ÊÈ-çÒC34Ðyå,ãe7l%ËU.xÜWü·(#%Ø›Áƒ΄ÈóˆŽOô¾-‘ßìb'¤êù޶F8“Ž‡Â¡î/ùBVDà`+À*[JñìŠÌ;ÚÇË…Küñ“¯G×4lÝ`Œ zÞ¡j»ô㈭áßg­× ÖØ 2~îÙ×H7O²Œ0}µíàóîÚòù<A@±XäÞ½{ÌÍÍÑëõ(—Ë4 vwwŸ»€‹EÇyæÒh4žÙ'/—ËDQ¤ÀÕj•ápH©Td0€ÑȤݾO¯`bî$âŽ, ;d™0Š™HÏÓ ‚ÇÑi·˜žžû@j´Z_ª74MC …e £ÝþxœéÇòùeåFOÓ€4|]·qÝ÷ïßfsS'z¸î,•Ê› ‡;Äñ¦é“ËÍÒïŸ|Û¶­Z‚/³€œvþdƸĸKžU¹\VŠyÁ“5==M¡PP}|éÛ(‹*Îñcêõú‰P«4Mñ}ŸF£¡v024JÖÔÔ•J…8ŽÕà¼R©Ðn·ÙÙÙannî)@äää¤zïåk’»;;;¬¬¬pçÎF£Ñk*ËÝÜË ùiëf³Éôô4×®]Ãu]ÿ”Ùïò9Ù¶=~æ¹ÿ¾ f“³½ýý}†Ã¡ú]9‘~¹ Hº5ˆùш$ S÷…i¸.€š© T˜Òþ¬- …£”ÊiûšÚX…óÁ¿²táçТ= S¼i`7À_ö…Úª"5[ãè“#ÜI—Îõñ]{*€‰27Ü™X¬ìšM2HÜueXì%¡×™p(½%ú™Á”XPÒ@,8fÞ$·”£w«G‹©ã;Ÿœa²˜Ïóh 7ÔÐ(X«Å"Õ~7J’ì±ÙðŠïó›m‚4eÚ˱ÿ’.tÇÐ)Z/®ÛyººQHÓóOÝ8ŽÃ™3g ¬¬¬E…BÃ0(—ˬ¬¬°¿¿ÏÏþóS[×uÞ}÷]|ßgmmí©;Ñùùy¾óïׯ_êo¿ÿþû„aÈÇI’„J¥2¾ ‹‚¾?‹eå“óç=Ÿ|ÒEÓ,tÝF×mÂðˆ|~8Y\Lñ¼„ ˜ec#æÊƒƒ-úý:¦YbkëçØv™©©0Ççþ­o½ÃO~ò¶··©×ß#Ÿ_¢Û’ßFã‚`ŸÝÝßq%ïàûEÞ~{•«WÛt»ºÝÛXVZí¢¨;v¥ÈS_XXà;ßùƒÁàÊüyõ¬óW©T(—ËréÒ%¥Þ‘Æ;9È}Ò¹-“‡Ã!ÌÍÍ‘ËåØÜÜT„Þjµª†¼Åb‘ÙÙY*• išR*•¸s玺€NMM±»»{ÂYže³³³8ŽC.—ãÆ‹E.\¸Àýû÷¹|ù2ý~Ÿ/¿üR“¦)ÓÓÓ ©­U¶m0}“¸ \ûówc!·Æ@ìºÒ$%<ñ—|ÂVH°Ê®†À§b3\ªLø,ËN(°@ìl]gÂu1Æwöw»¼q<ë^0Rîô½Ñ€Å|×0 Ò$KqŒ¯ÑÏ|Å÷ÂÔtâgHÓ4Ŷm>|ˆïû”J% dš&ÛÛÛÏEodYÆÞÞž2H=YÝn—ÝÝ]…?^q³··G†cc ïR«U1Í5ñüMiøKÕs–éc哘“ˆ 'Ÿ(r™™)rûv— qtĸݲN’¤cG{F’„„a ]wÑõ Š'"j;„aÇ©$I8~Îz½G4|ß'ËZDQo™Û I†t»÷Ȳ×­3n?u.z/ÑŽ|Öù“AM2Q0MS¥”+•J*$Œ¬¹¹9F£GGG¤iŠaìííÑív‡LLLpûöí'I<Ï£Ûíb۶·K¼H±X| ÷?;;Ëp8doob±HÇܺu‹|>ˆà©'w`Ò4;;ËÑÑ‘âkÉÁõîî®rØ¿ŽšŸŸ§×ë) ‰<‡§U¿ßgMÓX__çÛßþ6¦i²±±¡¼4¹\Ž?þñ„a¨æHÒhX.—¹wïFCÍ3$¸+…gee…­­- …››› óM/ ÚêÿºšMþݤš}hæç>vŸgQ&îÐÇ×7Ýz=(¹PI®fh¡X\€z°uV@Îì†n>F™˜¹ñüDƒnÍcQ¢1¦>̰*e’ŽR5€—ʪ,ÍTºDÛ“ŠÉhûñÁ›õÄ®íØ"bé:®a0”ˆj44 à LlÃÀÔ4ò¦Åöpˆ©‹ü 1?iz>w^bR²lò–ÉÆàëJ­Šl?CÆ+~’G577§ªr‹.{ÞÏ*yWxZr¡¦i 6wÚ—Àó<_*5ô->ŽHS‹$¡ë6š&ZXiª£ë6¾?K·{ÃpI’Ãpɲ!žgÓï gºãèxžG¯†åç0Í<º.æri:DÓbµ@iš‰m—ȲxŒðç>Ëdˡٜ²4½›=5ûð}̼IÔŠÐtÒ[%ŒœØMXy‹Â†kC•ý¡Û‚Sb^’©˜×$b®wc’^‚U²È-ç°Ë™?›°ÅXìâNŒ¦kß* c ò¥·J/?–[eëñùH-²ž˜§ÈZθP,óhÐ'Ê2.W«Ôl‡IÏCÓàÝjý`„cä,[7è'1ïnë:‡á‹åaƒÚ[/dx¼&\áŒ?-D^¼åÛ¶mÎ;ÇÑÑ gò¼Lô·ß~›ÅÅEÖ×ןº0Öëu~ðƒœˆó”¥ißþö·©×ëlll`?øÁÐ43gV £Aá8uòyÏsIÓºn¦™£\¾ˆm—ñýšÍ<ÕjÇ)2™\¾|މ‰ ¢h‰(êÇ]@£T:G±¸‚ë6дææfUæ†m—i4Þï(FXVa|q’ËåøðÿdwwklžL¨TÞÁó&,‹qÝï¿ÿ&íöá‰EµÑhðýï_õÂ_¤žuþ¨T*T*J¥’ ~šŸŸ§\.+Êq>ŸW³)Ù¾*—Ëjç°°°À… ( ª•™ÏçÙÝÃÿÙÙY¥RIɺ%!ضm–––‡'|Bq†!õzK—.1;;ËÌÌ µZ Ó4yÿý÷iµZO#yÍ"YZòñäàooï•ïÈe~‡œQ|øá‡Ïœã­¬¬ðî»ïÒív•Þó…ó’0Á®ÚèŽØ‰Ä]ÑN+¾Y¤·OÒO0K¦ ¶‘>éy”,›£0 I3j®ËR¾ÀíN›ißg{8@×4zQÄ[å¿ØÞd0N1|Yœ»9Vz½JIœûWÅâjšÆåË—•éi0œ@aœV†a(ò«¤­¯‰‰ ¦¦¦˜˜˜xêË)qQñé§Ÿª‹H­V£ÛíÑjP*] Z½Bv¹xq…ÙÙ~ýëÝqëÉÄ0ÊÄuë$IÈää¹\Äh´Œe ™™‰ÙÝ}ˆaxT«o±±±…ëÖ©TÞd0Ø"MWx÷Ý·FãHßËØv‰n÷>¶]¤PX! [loÿZå@ÌÍÍsáÂynÜÙÚJéõî`åò›ôzÕ]åñ…wrrR‹ÓâO«g?‰0™šš¢Õj©áë;ï¼s¢ u¼½”¦©Ê÷–-0ØT«Õ(‹J®*ï‚å1µZÁ`ÀÖÖ³³³ Ç¡iµZM-8Ç?KW®\QϯV«‘Ëå¸~ý:sssܹs繄ƒg•Œ¹}•Ï癞žÆ0ŒSý,Ò¿¸¸Èþþ>çÎcaan·K»ÝVðÑÅÅEE˜››cee…V«¥Â°šÍ&³³³Ø¶mÛܺu‹?þñjç"£o=ÏãÂ… 4›M,Ëâ“O>ù2Ѧ1<Á¢ÊÒL˜çtð|tOWÛ×½x€˜I8 ‡$±µÉ Qœ©þ½>º«u#ÒQŠáæM–f$A"v©Pl ׇ$ƒoÆ#j‹ã‡ëC!‡Oo;iºh×鮎Wöm8úã‘ò™ž@™X%‹Þ¦o¢b OÞù¯÷{„i‚¡ @a?Ž0C?fw»¢,Ãvƒ“‘§¡z±ð¼4Îýߌ‚iÑ} h–eüéOR¹ä·nÝbaaáD¿öÉJ’„»wïªöÄ“µ½½ÍÝ»wO}Œ ¸{÷î œ»išlnnÒlN‘ËeDQ4 0M‡½½†Ã!QYf’Ï/ptô%¦éÒïocšvvº,/W¸ÿSú}µ5°,ƒ^ï6q,¤ˆQÔc8Üa8ÜFÓz=Ï>ûLí †Ãm²,e8ÜÆó&étî¦âµ îß¿O©T"Žc67o†ƒ-|¿Éh´Ç`°ÉýûšêßËÚÚÚzæ¹xV=ïüÀ GQ¤òºÿå_þEÅúJJî“%M‚rÈ^,ét:Ôj5Úí6FCý®¼X?|øPýû½{÷þ_¢áOû,}úé§LOO“¦)wîÜQé“·oß>õ˜©‹ i¯×ãÎ;§î>@ w¶··Ñ4½½=e´ÜÝÝUÂ$IøéO ˆ™FEt»]©T* Ï5Ò0U»¸#Ð)fADÝ¢‰¿¯™š‚4궘ÇH&VÜñ»þâIœ»¥ë¤Y6–ñ޳DÆÞ×08 Cò¦I’eã¶S@pìÿµpî¯erç(y¡Äx˃ä.îîî*¹áób5eâÜiR_Ù×~ƒ'Kâ´eß^fM }D’cÿűxIDj ãTö±¬‚БմMËTNC.—Ãu=ápOoÎ8k†Ã-ž¼cr݆á‡'”TW!1ôNÛ®ŒÃ£º*gÝ²Š¤éH ßE±ý:3'ÏŸeY ï"ßùÞÉ׆!ÍfS¡Ldß_öÞ%†\Êä¥\Wª¡d†¹ìÃËÿ/‘äR>,ÑìRi$´ãFF™wßn·•jé¸p" C,ËRm­\.§îÈogggY[[{m ‰L=”ó‰ÓZ‹¾ï«Äͯú»¦iªÌóãU(°ñ´còù¼š I¸¨ün>ÏcóïUftqôÇ# ×PôÛ,ÉhüMƒ,ÎØûÅž —.—ðf½×º )^,ª\t»f ˜âxHCsßÿÕ>ÞŒ'L‡ô;í2ÚQ~·Lÿ~ŸüÙ<ÃGC÷ø >… ’‘àhiºF°0Ü’èBíex•÷* ŠßŽ"¼y¸3Úst˜Ò¹ÖÁ_ðÉ’LÌ‚<1£‰#*¶ÃÅr…v2ŸËó³­ FIÂÙb‰¹\Ž8MÙx«Rå÷{ç^¶ml]çËöq–Ñô<^öcïEëÕP&SžÏ½žúË¿üKÖ××¹rå kkkT*~ó›ßpáÂ5ôœžžf8Òétè÷ûÏ´ýÁ~@.—ãÿñOU×üèG?âç?ÿ9kkk'~f†B™üÓ?ýº®ó½ï} Êå×®íÇEz½{¸îµZ€ãXlmAš‚izäó ¸nƒ4‰‰®›Ñé˜loG¼ÿþqpï^‰VëGG_ ë6®›Äq@¥bpîÜþð‡?Œ‰µËÔëïa‹ŽS&évïQ,ùÏÿù?óé§ŸR¯×¹ys Ï»Ìh´K´pœ>ºîàûÓ~F’Û!ošÄ© òVm!5ÜFœ/•yÐïÑ"|Ó|鈦½z&z7ŠhŒqîÒ[*•ÈçóÌÌÌ(¸LI[\\IJ¬±)~.zÜ0 lÛVABO. BꚊC‘w´2cBní]×e0ÐélS,6(•Î3î377sç®ë "ZNYS,NS«%Øö4ƒAÏKØßïE=|švû:¶]Æuë È2‰‰šÍ&Ü¿Ÿ|~‘4‰¢ŽSÆu'1ÍÝî=Â0T É³gWIÓÖ×GDQÃù$GG×±¬üXf¼ÿBçâYõ¬cƒ"ÈÊÙr¹L†T«Ueø;ŽÁj´ŽãÐét œ9s†|>aär9<ÏSª)Ö¹¹9òù¼º»–»†8ŽÉç󸾝ž“ îÝ»§\èµZR©¤²7¤¤·Ûí*‡¶ëºŠd+‡ù“““j÷#ýI¯³$¬p4155uêrxxÈÎÎÕjUÝxÍḬ̀³³C¡P ŸÏ“$‰R_ðéÈ(âR©Äöö6ÓÓÓ4 Å ‚€íímõç©×ëqáÂ%þsGä[e‹dVd¤‰Õê–NéRI´r4A¢}Ý39óHF é(%KÄ<DÛj´-ûa+^PÈÜdì®]µE°Sœ1|8$¦˜y“áæ4J&ÞmºÂsbŽåºÿ~?Æ,šÄíñÿvctKþ—PÌ@ÂýP‹íª}BÖ{0ÆlD©``ýfw›šã`h:†¦±Œ% ža°Œ¸ÕiŽùW{£Çy©HšeÏôp¼h•,›ýq{C×u9::¢×ëqtt¤29vvvÐu­­-ÖÖÖˆãX}¡ŸUI’ð§?ýé™[í‡bÆS»39<—팽½½±™¯Ži&ôz"NÖ¶ ܺu‡{÷îÒéØd™I©´ÊááïÆþ6¦YàË/ï03SáÁƒOIÏ>Kñ}—££{$‰PöÁ!GGׄ‡dsSçðpS ¼Ž¾Äukôûã…fK9чÃ!ׯ_£Ùœfss‹/¾ø M«Óï¯áºu¢¨¯pñÂù¸ÖÖÖ”—àEëYç/uá“RÞÝÝ]5ÇØÛÛcgg‡……uLE@Óloo+?I©Tbww—ÙÙYÕ‹ã˜ÝÝ]îÝ»‡¦i˜¦©’+‹Å"årù„JHÆ$ öÃÃC’$áü£Êý>žÒjµøùÏ®#}ÿú¯ÿªÚK¬¯¯3??ÿZgr±êõzÏôçôz=õú»Ý.7oÞäÁƒÊ‘^*•ÃÃÃCN Ã7nÐív988`gg‡Z­Æáá¡R€É–£¦iJ„`Û6›››üÓ?ýÊÀùM—©[:Δ£fº££ÅšÂ€$£D©£LÿÕ$¼§U Gt(†¹ÁN€Y2Z¥#L„áÁØLØOèõÛ*îÅ CÿÎI"o°-.Xò1•aîL8ÊG’Å™j‡ÉdÃ`÷é‹îŠÁýš©©X\Å«G- ¦EÁ²Ú Ñb ]ÓØ ™r=‚€œebh7ÛGªmÕcò_¡jz²Â4¥¿öú´’™èqóç?ÿù©Ÿ{ž§´QÑn·©Õjê‹ó¼’±Ó*I… ?­ŽC줡+‚ñ€Ñ&އ ‡› ‡&íöãH[Ðè÷×I’¹ÜÌ8‘Ð Š†Y§™W%ìñu. _|ñ Z…Ïbs•ËeªÕ*÷îÝ#Ë2õ¿rg º®ãº‰#eéÒ£355ÅÎÎŽŠ&>ƒ; ”¬ùèèHÑžåKù&ÊŒ{1/:h†Æpm( ~:Lý§)Ò0åà£5`¯|P!·”{m»ÍШ|P`çŸvÐ êwÞ]Ó4¢N¤pîΤƒ]žŽögâƒìN»ôn¿LÐ,˜ ó8ý*=^é³X+íš­€·*óþñÑC:QÄ•J)ÏC6†.•+üvwÛ0ˆÓ”šãðñþQš2›Ëщ^ÎÏá%Ë~¥LôQ’0ãûÜxÎ]î2äö\öøgggÙÝÝåã?>õ8]×ù‹¿ø òù<ÿÛÿö¿=5l_XXàoÿöoùçþç§ð¶móá‡ÿðÿ@–e¬¬¬P«Õ0 nwgLÕ-`š…²éúõÐ1 MÓɲ]7I’˜¹¹ž—1ÔØÜLxï=nwŸû÷ë8Nƒ0Í<ÓÓ=ö…ŒXYYåÝw¯ðÏÿüÏP«½M¹|n÷>ž7A£ñ-F£]þ„iæ™™ù,ëK.]ZâóÏw‰ãz½»@6¦Ǽùæ<£Ñ§ ß·ã8÷E™?ïü=«æççùñÌÇŒa*ßüÉ÷íûßÿ¾Úùíîîrþüy>úè#êõú3ñõz]í<¤$7Ë2¥Ò’¥i?üáU¤k¿ßg~~žGqåÊ~ò“ŸpëÖ­—úkš¦B™^ç]y¡PàG?ú=âg?ûÙS?w]—ùùy•?¯i“““˜¦Éþþ>Åb‘££#Þxã …äñ~\á{H’ýþ&…BjµJ©4I‰¢.¶]Â0ŽŽî²µµõT°</³yÞù{VIº±tJŸVRY•eGGGLNN†áSX’ã¥ë:SSS*oaab±x*ìOÓ4ÕŽ‹rM¹Ú»Ýîמeü[àܳ,S3¡ÓªÓé¨DÆG1;;«vxr‡555Åúú:ý~_ͦi*Ïää$…BAµ…å¹.•JضM–eJ6/M†ò¼Ó¥ùÿœÉ6ÃtÍ{#Æ÷4H•ÌVÓ4%ïýºõ”Œ7?ö–Œ‘&Y*ü&š!¬ûcDIŠ¿­+ˆ;íBÆsqîš¡)y0÷z2LN´·¾êñcC#w&Gÿ^ÿD:¢£x†Á0‰Ñ5)ñLKÓÉÈpt]ÓÈ™&}Š–E+ I²Œ’e3áºÜ~ ”IŶ)X6û_ç~¦Pdw4¤ó!)]XXàæÍ›Š™ô<¯ž–œ&I¬­VëÔíx±X$MS…Ân6›´Ûmòù<ív‡4õH’`ŒG¡iQd…Â2­Öc”Éh05 \ÎqpÐEÓ\|?Ã÷}Äq¨$¹®;AšFãE+Å0bF£`<äõ±íòËîǃñS\`L³ÈÒÒ¹œÅµk7±¬*aØV¿Ç|ßS\¯'Ï…ŒB}‘úªówZI9´4·}ùå—§.îòB'e¾ï?÷yç†a(‚ó“d]Y…B]×ÕM,×uÕÍÉW} 3 Ãàüùóܸqãµ·v¤Qò´yŸ” *ÁÑ4Mõ»¾ïJh”Ò`)y–™+¹\N S’$!IF£žçQ­V9<ÿüó§~w~~ž……>ûì3¥´’yÂØ©aº\ðïܹƒïûj—·²²Âöö¶2wzž§f?¦iÒl6iµZt»]–——O䨧Sef©dÊ’ŒáÆP¨¯lÉ' 3±€èñ ¦ú­ª®¿†6V–dØ5«j‘%ƒµº¥Sy¿¢\ï£íþ¢/2>Š&fÞD÷tZÿ]¸UíºMçÚø®=òÛ`7ƒòh,ÝÍx3fQ˜ ÷Di„U¶Ðmܲ˜é´[m¼9òÛe‘r,!1 St[§ò^…î­®Êm>¾°t]y*ò¦‰kB®Ûëq¡T¦G˜ºÎ(I¸œ«ñë-FI¤ç±û’~[×ɽäàýÉ: C&]÷T”¼aÌĮ̀§F£q"M×u …Â3[†üø¾ÏÍ›7Ÿº[š™™áÒ¥K´Z­§.€®ërñâEÂ0äæÍ›Äq¬×A0¢ß’ÏŸÁ²„LòâÅSSÓüþ÷-4M Ü Ãa4ÚÁu'H’€¹¹¾K››?Ãq*40íÇgάòþûïðÓŸþ” êõ÷ÈåfètîaÛ%êõ÷ ‚vv>B×- …Uff,Þyç<×®õ88ðèvoašµÚÛÁõzí¯yvv–K—.±¿¿Ï7^è½{Þù;^Õj•ÑhD½^§\.sñâEua“Ç1år™8Žñ}Ÿáp¨õŠÅ" üþ÷¿W²Zi.œ˜˜`ccß÷Y^^i¾Ï矎®ëOíNÇazzÛ¶™ŸŸ'IµØÜ¾}›‹/²¿¿O«Õ" C…)•JjÑyóÍ7Ñ4B¡À­[·¸téív[]ô_µr¹œ"OA @‰§•$õJ¿J¥Ra~~ž0 •ɱÓépþüyîÞ½«òAèt:'vsssX–¥|'Ÿ}öqS,Õ‚455Å… X^^ƶmnܸñ»ÑMƒaiÒÓqˆ#‘Ï1%8Rêîÿ5=_·é éî¶îº“¢µÔ»ÝÃ*Zh– î޶F"Ç|ŒV÷KÇpî±XhÔ[ ‡É0!‹2Õî’Òݤì.eì<n öDîHtÑ¿ß-»Tœ—4ك̂)¸]†¦ÚhÇËÒu®‹¡é¤€ml ÄYÊæp€¡ihÀîhÈœŸÃ/&A’¨yÈËÔ«~v<Ã8áˆ?ùØ"×ayy™8Ži4lnnªP jµzê]™¬$IØÜÜÄó¼S[­V‹SaŒQ)$¶æú¾ÏÁÁ¸î£±|VÃ0LƒGG- "M3§Â`°‰¦™cåTž~ß`r²ÀÆÆ:ƒAÌÞžTw=ãÜ5Ò4"Ž{c¯KÛܽ{ç˜tµO†-\·Á`°Iš>›ê÷×™š*ŒÓ-¢($ð¼)âx@§ó€õu1ð=¾s;<ûN™š†c ãqD§®aëÂ2ˆc\ÃÀÐ4r¦Å^ îDâñ›ï&MßãîK$Œ-‹œi±5|œ{­ÁPáWŽ—ìïJE³Ùd{{[ ²å–ûy8Û¶ÑuýÔ^­4CIùâ“%‘ ’¶Z.— 8ŽC„$‰IÑ4MK2\ M³ðý)úý‡†?t;¤éÛ6‚,h ÇñÃtœ`(ãQ½ñÌ„±L79öüt§ h$ÉHáÜcPljµ*º.|¶]FÓ Ò4ç¬gX–¦¥„áè…ÏÅiõ¢Ç8ŽsÂ)£Qggg¹{÷. ð'Æ8rYú+ä D C277§¤ªÇñ%’Öœ¦©êÍËYÈñ’Ç<‰?—þih”ó5ùœ¤[]þ s”¿Ç1‹‹‹Ü»wï•UXòµK´º<_§=®eY “/Ÿ”ØÊ9ôâHúîñ´Aù2ÎV¢ÜåÏ¥ASŠI¤Àà?νx±ø_tC'êDt®v÷B†‡øóÝqðÑÃ!£õ†o`æ_ÎTìÊï•ñšÃuqb‹‹ø >VA$–®”<àN»è¶XLâ®8qþ‚¯Œˆ0^XRÄ…].4ÙÉÿo×ÅÜ%é&âwåçâøwp| ‰ø'îÆjП¥Þ¬§®d/•¹\©ò°ß'ÎRæüÊejŽ‹­|»1ÁAàÝêE[€ 3 é{˜ÚËáÜó–ð¼Hžù³ªáºXº~êýøP/Žc.]ºÄÒÒ­V‹ÙÙY&&&(‹ÏÍ|ç;ßáÌ™3§ÊE'''ùÛ¿ý[ž2jéºÎøCšÍ&kkk˜¦É_ÿõ_cš&««g Ls ×°¸8ãØ‹EêõÅbž p°í •Ê%\w‚\n޹¹"““5<¯A(W1Í¥Ò¹qˆÔšfP­^¡PXÂuëØv—³gWÕ Úó&i4¾m—IÓ×m ëqÜ£P(ðŸþÓÿÀþþÞ8‚U£ZýŽSA×-4MÇó‹çŽH’Ç-Ëf³É~ô#öööN ÌŸWÏ;ÇKî äìêÇ?þ±J&”~‰F—»÷Þ{MÓxë­·ˆ¢ˆ7ß|SµS¤÷C#ß×÷Þ{Ã0XZZbvv–‹/Ž©…!ò¹«üðÃYXX V«áyñÁááá8ã>SÏGþãöãHw]×™››cww÷•ïÈ?¾mÛüÝßý¾ïŸê­YYYá½÷ÞSþÇq¨V«Š–;11çy¬®®R.—™žž¦×ë155…ëº ¯†!•J…|>ÏÜÜœ2æóy¾õ­o)dÿåË—9wîœ á¼IÉQ²Û#9Œï½Ü*¬›:©ñ w)™›SÇUu –EÙ¶éÅçK¥1ÊÄâ¦Ö¦lÛãü 8ŠBÞ,UÙèÇ1eËyé„¡iXÚ«âÜC&]õÁó/Z¦iŽà¦jw\¼x‘G=G«žŸa¨ Ãi8÷jµª¤‹O~9mÛ¦R©(©°4ÚI:ìááÅ⛼ñÆÛ´Z‡4›M–––Æm,—Ï>KÐ4Ÿ~ËÊ‘$1õú<ÅbD¯·„¦õH’>ƒh#•JçèõÖpœÅâ2ý¾ÏÎ.rùò´Z-ÖÖÖ(—ßÀ0†Ã-l»H>¿@v·•1¬ÙlòÆ("66B†Ã áX\¥Û½K–ÅXVž0<<õ\¼(ÊüyçïY%/RÇÛW§U’$  X«ÕÔÍ„4ýv‘>þóáp¨2B=ztêßx˲¨V«\½z•Z­F¥RùZ9òo¿Î’IœÏR;°··ÇÌÌ ÛÛÛ¼õÖ[ÌÏÏÓjµèt:äóy…Byøð!Q©Ì”ƒƒ•L(³ÕåŽÌq>ýôSµHfY¦¤½ËËË*Þù?ÊĨ¼_ù/;ébM¼Y»"ZCš¦a8Δƒ7íaæM¬â« nÕÄÝ¿†B£§QÊpcH܉mHGEBI/!jGh¦F°@Šˆ—}r¶ñeU,²ðåŽ9Q"¯}/8±‰ÓŒa’Љ"\Ãà~¯K7Žy4è3Lb:QDoÜÝ ð ¡ÎвG×É[ÖKí@|ÃÄ5 ^È9íùôâø+e¼òCztt„ïûܾ}›õõuÚíö©nax¼EoµZlnn>õsÙšº{÷îS­™ƒ°³³ÃÞޞʑÞÜܤX,ÑnÇaØ¡PðØß?PnÞÃÃ6Ãa™ÃÃÏ€ŒÁ`kLÖÝ#—3¸yóKz½}†Cq·:nûc¿H„iæ7I’ˆ98Øäà@@ sbB¿ÿËÊ3l‡ãŒs1è—ß?ÿùÏ„aL¯wËÊûcôIˆi悃:Ϫ¯{Œ®ë<|øB¡ðÌ…§Ñh¨ä»(Šð}Ÿ•¯þ,#¡l¹looÓjµ¸sçÎ3%¹qcÜ¿ŸápH»Ýfmmí…wa²¤ekkëµ^På Ì£G8::zæëèt:ìïï+2ïýû÷9<ûL̓d K†_­¯¯ãº.ý~Ÿ½½==z¤TWrÖ(•hGGGìììðùçŸÓn·_8;æß²´ÕÿUÌ@Ð…çCâÜÍ‚hUEHáÕuK\¬W(åÑÊ]ÆÚÊ6”á"ŠVÜ)Ã7È¢ Ã7C1+ד3#'H¾¤cô¼#ÕRY–©z<Íîú,Îci˜9SìÀŽ"WLVÞ,˜DGÑcœû3wllåyÓÄÐDÌíA0¢lÛ “„¼iщB†Ç†’ßÎýL¡Èæ`pê D–DÃÉ^yÇŒF£çjÑåðö4iª®ë úwÚ—¾P(¨®;‰®xÞ‡‡Ÿ1=ž-..*”ÉiÔ×ÓêyçàwÞaooZ­ÆÚÚgΜa}}·Þz‹ßÿþ÷Ôj5µT*Î;Çöö6+++†¡óö÷÷™™™áË/¿úôô4Åbñ)|¿ß'—Ë‘ÏçÕnñöíÛŒF#&&&(•JOáOúý¾4ËvÌÔÔ³³³ }þ$ž¾ßïãyžšÝLNN’Ë嘙™¡P(¨c^×üC*œö÷÷ÆEÆô>Y­V‹µ 9sæ —.]"ŸÏÓh4˜˜˜`eeE}¦eœ±D½ÈyI³Ù¤Ùl²¼¼Œïû u#_—Ü1âû¾úN¾n„ý×)måÿµ’U¿SÅ*Z$A¢òÁu÷1‹J³4%…µÊ¯69ÞÂ²Š–@¤‰¿Y”‰ t$¼!º©‹dA['$ă³`2ÚCtÁ' ‚-!±õç}ÂC±è%÷骶—]³‰{±ˆ¶V%ƒoÖ#l T{¤ÊG¢šò¿8u‡ÞÝvU,΄Cÿ~ÿd±á¸äL“ƒ0@GÃ6tt4Ò,ÃÐ5<Ã$NS|Óäa¿Ç”çñh ðïuÇ¥ê8ÜzÔðɪÙ%ÛVÆÅ¯S«…"‡aðÜ9Цijh'ù=7nÜ ÑhÐétžë]ÌŸÓzí¶m333Ãæææ©=üf³IÇìíía«««ìííÍ»$I‘4 ±¬<®ÛG×Áó\ÒÔ"Ž—iµ>Ã0<¢¨‡eå1Œ““e66ŸR)Å÷=67;$ILŽq-KDQM3p]ÛŽétº ‡C§†ãTw±íòe’Œ[i0;;ÃÌÌ,¾ïñ‡?\Å0ê ‡›Øv…8î†-L3?n=>'Ò`'½//R/rþ¤¬6 C|ßW­V«ÅÂÂW¯^%Ë2fggrf8R©T”9Q¶,MÓdqq‘Ï?ÿ|¼¸V©T*ÊL'Û™òB'‡¿Ç9R•JEÝiKÙªlýH¯Ïæææ‰H¹\¦^¯«vÍþþ>årYåÌø¾Ïîî.‹‹‹|ñůìHŸœœÄ²,õ¼$£ë´Ï¹|Κ¦1 Ô±²e[(AZÓ4ŠÅ¢š)IIúáá!årYí`$Ò]bñ§§§ÙÜÜTÒy]×Uzã³æ2ÿže¢!v’{¥‰Ù€¼B´Xø@¬Ò«-'*yr§¡;ºÊ(7 qáNF vÞf´1®ÙdQ&¸ãZ¥hÄJÒO”Á0ì„"+=ÉÄcçuµûHƒT¨Ë:baDC9ß5]d ž!P(ã ôÁƒNÍa´#²I솭¼(®nPs†q‚¦A?ŠHY+‡¥ëèì ‡Tl‡`D’e¸†¡€8MÖäE+ÊRF¯øeÑ41üq¡˜››SwDív›b±È½{÷”9Lb½§Ê=¯,Ëz¦ÁK×u<Ï{&NªLÄó¡B¢nbÛEF#ƒÑh(ê2ƈ݆ؗ™æi‘Ï—I’M³°m“££#t=¢Ûݤ^ŸÁ4MÏÑÑ‘‚ìµZ-H’么ï,ËNüî“5 žiœK’„ÃÃC•ZGná…Jf€¦éØvY¼ŽñÏ ÃÆ0\§B–¥hšE¦i*zÇA“$}z½ö8”iƒ4 ÆŽv}Ü’:B„MÙßßS³zïE]\·6ÞHÌÉ€~ƒ\Nܽ[–3n[u°íÝîƒM§qê¹¾D¶ËóΟø[]åè Nôä®Pº©ûý¾š9ݹs‡^¯§ÚˆOþ™™uS ع\Žn·«Úp2ÒvrrxœJ(gEº®sóæMEñÝßßj°,‹ápÈÂÂý~Ÿ^¯Çp8TÇH…Òëö€ÌÍÍ1 ˜žž~&k¬×ë±··G†<|øF£¡vòuT*®]»¦R u]§X,*´‰œUÙ¶ã8j¾(•s™OßjµÔûño°ÙÒVÿ—Õlâo'„äõY(‰V×x}2Þq¾!ˆ¼É˜m5Øǧ›“4JEÛi|a‘U®" =K29«[ºúwt1`×]]ÄÓV,á/i Ö—‘3H‡âÍÖlMaíÓ(UãN¹ 4I î¬Ëàþ€,Î05‚e$)ºA’ª¼rCÓÐш³G70t‘¾9àèýX8Ñ ¦Å¤çqç%pî%˦`Y<¼œfþx)ÙèűšuDQ„mÛ*pzzZÁídÆv’$ª·þ¬s— zêƒ7î ˶Ɠ%3¿¥ZEfB{žG¿? MÒ4À0t=D´°t4Í&—›§Ý¾‰a¸ãßñȲ!¹œK·ÛGÓ\WÃu=ºÝ€()¦•m—ƨq8д˜(ŠÇ-Û.©”C¹‹’\]÷˜ŸŸÆq nß¾‡mWÆ¿kÇÒ4À²<À£M'À”Ï:§ÕW?9Œ–s‰‚‘-’……nݺ¥ˆráyq“ËåVüÉcr¹œÂ—ÈlrYAœXL<ÏSÙr“­,ù\¥y±ÝnŸ¸áÄ_yœü™Z8ŽC¿ßgii‰Û·o¿6*¯L8”‘Ïú ›¦‰®ë'Ð,Ò£#ozäë”ÀGùÜu]'uƒ"ç.²ÝhÛ6…BAí"¥Dü8^æ›.£t¥ô_¬’E2JÜwb‚@H_ögmƒp?DwõW޵=a$DHq ß ·œÃªˆÝŽ] -Ã7ÈŸÍ3XàN¸jÇ!‡×· ¯Jñ­"fÎTÝ›œ†C$ä–s˜yS©µ’a"œï«yРôVI¼é¢…Eþ’U´mŒðf=u¬ÓpÄ¢e¤ˆ0©²ms¦Xdk8 Î2ryêŽKÃóH²ŒK•*ûÁK×ñM &1PµÃx9#¡iâG/™dx¼®K–‰“S† ‡C …çÎSúÿ½½=(—Ë8ŽÃÊÊ iš>·ûæ›o2;;{ª³¸R©ðÁ¨VÆñÒ4wÞy‡J¥Âöö6†aðï|‡,ËX\\d4²ÑõAp€m—p Ë2ISÐTÐS¹ü–UÀ󦘘ð)=,+Çhž·TÇCó¶ÊÉç—˜œ\å­·¦yøpè)Ž•iæ¨ÕÞVpD&•©EªÑx—ƒƒMºÝŒ4©T.áyM4 ’dˆëVxç7ètOèþ«Õ*ßúÖ·ž™ŸqZ=ëü-..*ÌL±XTj¥©©)5—xÙ–™ššbjjŠÉÉI<ÏciiIÑ‹Å"+++ ‡C|ßWÇLNN*ðb.—Syé³³³8ŽÃÜÜœÚ-Äq¬h²gΜ¡Z­ªAøùóç•*ìÊ•+´Z­7%Fƒ3gÎ`Íf“ÉÉI¦¦¦¨V«dYÆÛo¿M§ÓÁ÷}ö÷÷_¹¥³¸¸Èää$ÓÓÓT* …‚ 8{ê;èû¸®ËÙ³g9sæ ív[å~˜¦©Ô[Ò\šÏç)‹ÌÍÍñèÑ#‚ `uu•F£¡°÷|ðý~ì#rY]]eccƒ(ŠnøÆè²LM×[B©4Ú ƒŸc?—' S¡xÒ…Üp œ†óZÛXš©aWlܦ@è®P\™y“á£!þ¢ÏðÑÃ7p=3orø;aƱÊÃGcÃS LáAHáb¸“Sì†M©Pê«QÂàþ@eŠdi&pﮇ;ãŠVž¥‹…lrL!ŽRµã)])Ñ»Ý#$*£]V&4=›¦P[½Y®e)MÏçV§Íb>ÏA0ÂÐ4úqÌ[•*¿ÜÞd˜$4\—í—Œ¦µt ÷k|W+ ˜p½S½$«««œ9s†[·nQ*•Tä¦išT«U¦§§ñ}ÿ™¾Ã0”,ñOúÓSÆf³Éââ"=zÊQë8ËËË„aÈ矮¾8R?ßnQ,ž£Z½B ¸|¹ÊÌÌ<ÿò/{ãTA Óôè÷7ðýiâ8¤Ù¬âûA°Œç¤é€~ÿ¶]¤V{›Ÿâ85jµ+Á6iS*ýÿÛû³'9®4O{|w}Í}ØwvUqª¦ººçëùæBÒ¥Lf2ÓµL2æFfš[]è/›énk›±f7«Šµ‘ݵpI;rC®±¯¾ëâÄ9È2I€@w•¾ÁkVVqÂÝÏ9ïû{Ÿß)r¹Kììü‚áðÕêk¸n^ï.–U P8K4ÙÙùåDµ5E(Î’¦ºnÑíÞB×*•+ ‡Èd„$õ°ªGŽÅúúúyO?]×ÕC¶ÙlÒn·™™™!Žc¥Š“rRW®\QÔ]Y —õJ¥ÂÅ‹U_ˆÜ©\¾|×uÙÝÝUXÿJ¥¢VÊRÊzø³I܉¬HŠn.—ã믿fuu•õõõ#õ†ñxÌÂÂÝnWMT &Ðëׯ³ººÊîî®Â½?kHpèÔÔ”Ú™]¿~ýØEÐ… T_‹ïû¼öÚkX–E’$\¿~3gÎÐl6yçwØÜÜT}5RÙB6|îÜ9¾þúk•Š• •išNlœ?™ ãÑ0ÓTíªèƒ0\C(¤:bUïλôºó°f;IDAT»·ï`!û$‘ÂøÁX¤°&)%ÍÔ”Oˆ™5‰zñ8ʨ‰Z+ DÏFà nØ ‰Ç1ñ & Æ;cÂN¨|DâA,h½“Ð4‘š‹ú£Íþ®SwmŒ”­n2ÒÞÁxGtã­£+ÿŒa²?öÉ™†¦±9`j:-? LbÖ}’4E×4öÆ#æ¼ ¦¦1Ã("o JïSÜ3Dδœ@ô”úön·«¼îÝ»§&’{÷î)ßqÇ1kkk*Õõhìííqÿþýcß#îß¿OÊÁÍqÕ7ÉlE"ídš­V‡8¾?I§ŒÈfévï`ƒÁ¦™§Ñwî|I¯—’¦â{÷zwIÓx¢·17÷rd³íö ’D¤ |¿¦ õ—çMÓïßSé+ai»eå‘]ìRò›ÉÌâû-úýMîß©ÂÃFK»»»Ü¿ÿÁ”O3~¿!©°ò7”y÷ ެÔ766(‹ÊñQ¦UÊå2›››Ü¿Ÿ^¯w¤ïgssSÉ}óù¼2‡*—Ë4 %´8333ŒÇcöööØßß§Ýn3;;«¨¾÷îÝ{ì¹Sšžžf0°µµE’$lnnªc:ηò½ž6666HÓ×uOÄõ”J%r¹FCõd†A»ÝfooÓ4iµZT«U¶··•ÄWb_dwýÎÎsss ‡CUo‘År©@üSHWÚÙÿt6ý³¢V0©¤Iªj‰Ÿ(” Úóù«`MüÍCVº“S$¾hØÓm!ñ Û¡’Ï‚˜ô¤{ šÀÀÇþ¤PzoMM…aŠY&QQG<@$ÞðDˆ¦‹:H4ˆD $M…É RRáÌJ†ÁÝÁC’/â#ÛºŸÄ¤€£ëšŽcÚ­ôûÈZ&Mß'LõøÿN(k‚2yÊËá8÷!Ãcòƶm+KNYøÇj+-Ù¾)ç,W¬'áܳÙì‰òK×uU¾W®ˆÅ¶Þa<ŽHƒ0ì£i:ò‡HSÐuÇ©2íN §ü‰k¡aHlvŠa¸†‹¦é̈ø ºîL Á÷÷[ù9N]·'i¯£õ]·1Í,ml»„axDÑ@ù¬çóy‚ 8¢Jû¶±8.N:Ʋ,e{Ø>Uæòeþ0ÊDbLä˜Ë¼YJ”Éüü¼"+Ëc$ª\Ž“<·ëºôz½#>é>ŽàÒ=Ï£×멺ɣ6·²GBîndzHîJ†Ã!‹‹‹ÏE…¥ëº’‹kê!ìÑ*-9†ò·8ÎòWþT^Éß?›Í*I¼4Ê’÷ÙáÚØó¶ê}^!P&Ÿ´1<ƒáúPÔ ¢”úë$QÂÁÏÄÓQ¨uoÞ{®»ÜYAßug\¢®Ð=ËO$dV2üâw^ÀIQøgÖM„NWñj‘áÚñƒ1fÞ¤üf™$JR‡`?`¼3&ÄDˆ>Ò%ú7û/ ;¡8w”´2‹2ùªKöT–ÄOð÷} ÏÀ*Z¢?‰Sù<ó^–ßìï’ïNÏ`ë:Ã(fw<âJ¹Â?íïáùÉ.åv¯K”¦L{ÞS©£‹÷Ùá»O SžÇýc˜:ù|žþð‡ôû},Ëâ·¿ý-«««Ê$Žcúý>_~ùå‰ïÿýïŸ\.Çÿïÿý±`nnŽŸüä'üìg?;²q3þä'?a<óþûï£ë:ï¾û.T*e¾új—0ÌÑëÝÆu§)•„×ÇÞžN’¤˜¦‡çM‘ÉÌM ˆ&õzÇIèvuöö\·JšF8N•vû+:¯Ñ4‹©©·'^êij°ºzŠO>ùdâ]½D½þ&ãqc²ÛÈáû­ \1ÏÜÜ_Ðl~†m—ðýªÕ×ðý&¾ß zX–Ë[o­ðÉ'Ùm,,,ðãÿ˜÷ßÿ‰I´'ßêê*žç)‰¬D°g³Y®]»Æk¯½Æ­[·(‹êÁ¶ººJ.—c4qæÌ²ô<û÷ïséÒ%>þøcJ¥’:ÏéÓ§)•Jj’‰ã˜|>çyÜ»w3gÎpûömnݺ¥Ž¹pá‚*¦K÷Ã0 ©T*4 ®^½ÊÏ~ö³#˜òz½ÎK/½Äþþ>a⺮ÚIðꫯòë_ÿZ¹%>kÈ èÌ™3ÌÌÌÐëõ‡|úé§Ç¾¾^¯3;;K>Ÿg}}]y®Hùo§Ó¡^¯+„¾”¤¿ÿþûÄqÌÊÊ Õj•_þò—X–Å»ï¾Ëþðvvv¨Õj¼þúëüüç?*…Þ¿fè†kˆž‹nHuR nØB$°ì??”‰ŒxcfMáöW{I;ŸÃÌ› MB*@‹™Ó…21CH‹eLš!Í‚‰;ë ~Ödò° fÞ;«ÉGšXiš¨¡ Z¯·è‘=•Ewt̼‰;íõ"A*®ÙÄy<S®GÅq¨ØeÛÆÕ <Ãä\¡@Ýqqtš#ðîašp¾XT5Œœ)ð&OõÃißMú{8ºa@Î<¾94¶··ÙÝÝU7I·Û¥ßïS*•ÔMrR†A6›Už×†D1ÎÅË+Ìl6«VÒÃáL&C¯×§ÝÞÁ0€$‰ˆãŽS¡X<ÏÔÔ÷Ñu‹0ìa.¹Ü£Q“á°O±X|â±8)N:f8âºî_ól6« ¡VVVTQ÷ð1ß¾±±A>Ÿ'—ˆ!sssT*•v‘éáp¨ŠóKKKœ?^•$Ç>JanµZ”J%¥žÇd2.^¼H­VS…~9ÑH³*Ïó¸xñ"õz×uXÞ>¯Çܽ{—Á`pdâ<«««¼ñÆ Z­§OŸæå—_Vž•J…b±ÈÛo¿ÍÙ³gYZZ"ŸÏ«˜ü~…BAÝS½^™™J¥’Ú}?z½ü)…Q~«üŸ3˼Y»bã-‰‡¤në覎™3qç\¼«h=?C©I˜Yñ~ÁA ˜UÁ~ÀhS@ƒƒ@ôkô"ÂŽHa ñwFnâ6ˆÑ«`¶C̬(Àû{>ãí1ÃûCâaÌhk$L¡&8wÍÐÂe¶Å™ ƒ;ÂfHÔ‹ð÷|ŒŒÁhCtŠJ/×' îü8fEô£CÓè„!;£·{]úqH+èEh°=¢iûþ˜(M15¢m=šÝ3LãéL¨9/C' ” ëp˜¦I¿ßWEÙ(µê–eÑl6O$‚ÊôÓÁÁÁ±RñuïÞ½ÇÒq†¡j83M“jµÊæææ$5Ò"|¿i: ‡û£Ñ6I3n2ï†]’$@× †ÃDÑ0³»»N£ÑÀ÷}Ò4"Ž}úý5t]ÔW|ÂÎchYÒ4¡Ùü˜8èõî¡ëãñ>£Ñ>¾?R‹Ãcáû>÷ïßâ\÷Iã—ËåTšªÛí²··ÇÎκ®³½½Íõë×ÕjxggGcYFƒ½½=Æã1;;;hšF£Ñ Ùl²½½}/•F[[[ìììðé§Ÿ*Œ»üÿGžç)• l\¿þúkúý>¬­­IyÊÔ¥”Ët’<¦ÙlªIoggç¹5ÖI ¤4“:N…µ²²B†Ü¼ySa`ØÜܤÙl2 ØÙÙa0pÿþ}vvvØÞÞFÓ4Õ+R*•ê]ʨTú8MSvvvþdk ¦ád–3‚95AŠ¤Ñ¤a¡T’} ºûl+Þã"hÐÈtt!ÍÕm]ÍG1fAÐͼIØ ¥ß¹Y0IÆ ƒ{1Ñ´Š= µKoIQSI‚‡*¬Ñ戰B,ê!A#@wtÆ;c‘΋Sü1‰ n ¿t3kªÞ²-è0 hÙØ†ÎƒÁ˜ºãÒ ²“ÿç­‡nà™OFó“˜^ôlU 'z ‡C%§Üßß§Óé`kkkT«UƒÁ±7ÕáÇûù}Ÿ½½½q(ÍfS¥½Ò4eooo‚†Hˆ"0l1ï¡i:í¶Ì;khšN¿(âyÓ„á€$ ‰ã1ׯï†á¤)²‚ad0 ›Á` !Ç étn‘ÍΓ¦)ÛÛ·ÐuM­…WÇóf 6U]˜ÔRZ =)#ªÕÛž¥ÕÚŸ|VÓ´3Yú¶±xšñkµZª+{<‚ P½ ²Ñ­Õj©‡m»Ý¦×ëE¶ms÷î]e6 ÔµpxBèt: uŒçyt:#ç±mûˆ€bgg‡ÕÓsé¾µµÅÔÔÔc»Úííío5Ì:ŒÒ^!Å ívûÄöÇŒïûÔëuÇáîÝ»ª¿ãð{|öÙgêsÊžœdͧÕj)›â~¿O¿ßǶmÚíöŸìä`†ÝÎgtSg¸6Àô¿Ÿ& ~q TOQJù­2™•çƒs—‘=•%‰ú×û‚;ëŠnó ÈQáÜg]¡Ó4º_ˆ×[ðÜP¸\`xoHîlŽÖïÎ=³’¡ðrx v1îœK4ˆ® ‰zÂ}Q34ŠW‹´ÿÐ&êEd–3®ˆû1A3À™qHÆ kq’=epw ¤ÇUÑ.ã•r…Sù<·¹N/ y¥\aÖËÛ£¡Â¹ÛºNœ âï„IÂB&{¢ê¤ð ƒ’e?S=Hb2Yn<Äqee…¥¥%>þøcªÕ*¦iR¯×ùüóÏ}½¦iü›óoÈf³ü×ÿú_Sb­¬¬(ùá<9ˆBðO~ò|ßçoÿöoIÓ”K—.Ñh4°m‹¯¾Ú%“™Â²òØv™ÅÅ„|>ÏÍ›ÂïÜ4=@C×M@'Ib†x^Ê`Pb{;Æ0,ŶrÝiö÷?Â4³ÌÍý9q<" ÇÔj)¯¾z…Ÿýìg´Z-ÊåË”Ë/Ó﯑$!µÚŒÇû´ZŸcšyþŠfósçe¸Ûïah˦† ᮇD’¦DϘóÕ'¬®ã¢Z­²¸¸H£Ñ X,rûömfff‚@ÉÃ0üÆ ¤Z­>V0–! ¤½^ïØ›sjjJ½¿ì[7\• °Lúý»¤i2iôK1MÑãÑj]#Mc(N?Ù{#A—š¦Ñjµ( DQÄÂÂÂcÅú\.G.—Sý$(&ë&µZµµµ#“±Ê“Æ… TÏSš¦Ç^£’|úôi²Ù,_ýµê›‘8©¬’ò^‰Ê—õ)F¸sç†a033C†ÊÑpzzšF£ñ§;$‘H¥I*ìZMÍÒð=’ ¡ûeWù“—ß. NÔsLcYe±eMCaúäL;ªAÏßõɜζC¬’…U°Ð] ægÊ¡û¥Xµ›“Ê÷*´?i ŒI üÏi»f«÷ÞªTÁáô•;ã*é$~(VQL i"^W~§LÿFŸ$iµñƒ‡j‘œi13™$â4åõj•ÊD¾{¯ßã¥b?I05 I¸šÉòËÝmü$a6“aÿ H2C'ÿ·û2:AÀ¬ç«äÊf³ ¤X«Õh·Ûd2Æã1o¿ý6™L†µµµ œº®sõêU2™ wïÞ}lU¹´´Ä›o¾É`0૯¾:òoŽãðÚk¯)•QÇÊÉ-|F£˜lv ÛΑ¦/f™››a4’¦_}¥6¾ß ›] Š|VVfð¼ß_bk+"MF£m««çyë­×xï½÷ØÞÞ¦V{ƒ\n‰^O€ëõ·ØÛûÃp(•.“Ëe¹zõÃájµÂ|1ah½>©¹ÌàûÍ#~êËË˼ùæ›ôz½#(óoŠ“Æ¯X,ªÕ­VSþ Ôëu®\¹òXº'MSÕóÉdXYYQ„|ðÉfBÙ;’ËåX\\¤Z­*?Ó4U*æêÕ«|òÉ'êa;Ä[ðÈ]ÈbFFx É8¡«Ov%KØ U!ßÈD½‡Å©\ž¥l–_îî$ —Še,]Ã6 öÆ#.Ë|Òl`ë:ó™ Qš²=ª"úÓn¾-MÿN»–Ãah:%Û>v‘ž nÔ¥¥%Ξ=Ëúú:+++J£þMzW¯^%›ÍòÁ¶RÕ4wÞyß÷ùè£ÐuwÞy‡µµ5¦¦êܼ¹ÏhäÐíÞÄuëd2#tz=sò@‹ÉfÈçÏE}tÝ¡\î`Y1ÝnÄÁÁˆLfV™RµZŸ3l:…Â9\·2ñI¿ÆÜÜ ·nÝšø¤”©×ß$ŠFôû÷‘*/ß?À4³LOŸVë #ƒeUÈå^'“ñ'M„{XV†×_?Å_\£Ñxøpššâ{ßû¿þõ¯Ÿ¨xÒøÉžK—.)/ ˲T}Âu]îÝ»§XO °(ù|žL&£~óNŸ>­¼'nܸqä˜ùùyŠÅâ~Öîc,..òùçŸ?Öž¦)¯¿þºòÒ‹‚ƒƒ._¾Ì‡~Èöö6•J…«W¯²¾¾ÎÌÌ }ôI’¨4Q†ìííqåÊ~÷»ß)ã¥ïsssÊM°X,Òh4TzªÓé›ZlµZضÍÕ«W'2ò›ª/Fú  å«"UkµZ>úHɘs¹¿ûÝï°,‹7ß|“/¾ø‚ÝÝ]jµ¯¼ò ~øáŸ,ÊÄÔ,hvCü}_ø~8¢‘/ ÕuEzÇ™yŽ8wòó˜Y“Þž@‹$àλXE‹áºðq¦t[8&ZeKìRaI;¼7u޲è±J–ü†¢bU,ìšáJ•%ÕSVÙÂ[òZÑ0ž²…í´‹YØ“4þéI˜¿˜gpw ºÑ' Ž2¦]—ªãªò™|ž8M™Íd¸Ñi3åzL{Ð C^.inû ㈊í°ý”ˆ¡kØú³M í Î}køÍ»]×9wîaª‚b¹\þFÅ‹Ìçzž§V\‡£V«©ÿ=:8ŽÃôô4a*ÖÒx<¦\.Óëõh6÷)_¢Ry… èðÒK§X\\æƒöÐu]70Í ýþ¶]"ŽCêõ%òùáð4¦9$Ž ‡›èºE©ô2ƒÁ®[¥T:Ïpø€$‰Y^>Ík¯½Ì`0`mmJå ¦™c<>À² äó§‚;;L¾³7ñL?‡ðX.„ºnS*]¤ß¿¦iäry‡Â‚z½®Æâi&“ÆO†LIÙìÎΧNR+[Q‘ÏçqGÌ%9Öu]Μ9C«ÕÂu]U‘î¦i233Ã;w˜ŸŸWxõééi¦§§›@@ÓenzzšÕÕU¾úê+fgg¹v4™ ,ËÂ4MeýZ«ÕøòË/™™™¡^¯«ÚÃw0 )•Jd2å{" º333ÇN çÏŸgzzš úý>/¿ü2¶m†!_~ù%§OŸ¦Ùlò½ï} lÛæààà\q4±ººª Ô’$¡V«)c-)Pø“@HDo„3ã\¹«C‚ðÀÐ…©’áJZû\k t>í(Ýx“D%"w=ýÛ}tG'ì†*¥i"Íc¬Š%j%û¾’";ÓÂ~7ì„b·¢ƒ™1‰¹P~‡¨;i,ì‹Ëx{¬¥|8'˜y“þí¾j²Ô=]Õˆd¬ úŒâ ¡ÀºÓëaêC‘b¸ÕëàÇ1–®³7Sw]dKJ7 )ÚöSáÜS }Æ#oÙtŸÀ*Iîܹ£¼–eÑéth·Û,//Ÿ¸”ʵ½½=•ê2 ƒN§ÃÁÁº®«š†ô,é÷ûÔëu,ËRtäµµ5jµ£Ñˆv»Íp8daaf³I£Ñxî ³çÚÙÿt6ù_g„Ó_¨>é< "UÑ MàÖŸ!d Dúj$¡¸¥Ë *J)¯¬‰è¶®¼ÒeÁ¹óÍ.­g%š%ì„®0‡2sç.ûC4K4+¦±¨ƒè®Ž™ØÃ6”8‰^3ǹ;ºŽ­ /⦮ãè­À'oYDIBÖ´è„ãößçnNpîãgŹƧ°$žB¦0䮣\.«•Ùx<þFuÈ7YÚ~›ë£–¶µZ^¯7!͆œIå}< M3±í¾ßRö³Ûî"·/ŠÅY ÃC×MF£=äi.®[#MÅ„ñèŠÉu§0Mñø@¹NÎŒa¸èºP+EQÇ©bY9Uxa„ô¨¼õ»XÚ~Û1ù|^Õ@|ßW}Ò–xvvVáÜe‘=MS•‹—«ù p]—$I˜UÝë2-&ë²/ññÉq¸v k ’Õ%ûF<ÏSRãÖ¶ò3d³Y5^r'bÛ¶:¦ßï3??ÏÚÚÚ3Õ@ï ÃP •Ãáð؇x©TRýÒûãÛÎ/ÇHîÈóù¼rl”ׇl¢5M“b±¨„ Ša†ÍöÇmtGg´6RåS9E¦ìÿt_t|§)¥WKx‹Ïçž=›UXtRØÿÙ>š©Qz½DØ&PñX¨®ö¾/H¸ÑÍ9¸%n\wÞe´!^35*ß«àïúØU›ÞõÅ«E_<ð–<¢^ÄxkL4ˆÈŸÏ£Yš¨›|Þexˆ·è‘;—EöNˆ7ïcº_tÉ,g”ñ•áØeûÈ.¤`Ù¼\.ó›½]â4åGӳ؆Î(ŽÙ¸RªðÑþ.ŽaP¶mÃàËv‹(M™Ëdˆž²Ý5 ¶ýLHšÂlÆãÎ1L«\.Ç[o½¥$´}ôËËË ‡C¾ÿýïS(X__çw¿û݉ïÿ£ýˆl6Ëßþíß>Vl_\\ä/þâ/xÿý÷s54M“÷ïþ¾ïó?þÇÿ@Ó4þìÏþŒP(äùê«]â¸D¿×¢Vóñ<›ÍMñDq<Åq²=M5ffº8NJ¯ç°»bÛâxŒëÖévoÒl~†®;LO¿‹¦éD‘O¥¢sñây>úè#úý>…Â*ÕêëŒFÛ躅ãÔðýÝî-,+Ï¿§Ùü×­1L\w°¬®[Ç0,Þyg…?üá÷GŒ –——ùó?ÿsþáþáÊü›â›ÆDoB¥RQª9q‹E>ûì3å&™¦)SSS\¾|YË¥˜Äƒ\¾|™þç¦Z­*”ÉéÓ§©V«är9nÌçó”Ëe¶¶¶(—ËüêW¿:by¼¸¸¨pòËËË •>55¥Ðìÿøÿ¨&6)?~ã7ØØØÀ0 æçç±,‹ápÈÎί¾ú*¿úÕ¯BåY&Ã…êË—/+ùzÇGäÈ22™ŒJ?f³Y¥ “õÁjµJ«ÕbnnNoù¾ÏÔÔÿ÷OÇ,--133ÃOúSlÛæÝwßåw¿ûÝD6^ãÍ7ßäý÷ßÿ“Maéº' ÓÉ(Q8tMÓ›çŽ.VÿÒ ãyEØ ±Ë¶’ ÛUñßQ7™rð–=‘2Ò…”8R‘R[zˆs×-]ÙÍšy»f‹Ôס°«6î¼+Œ¢\Í©)»nc—'µ‘ŒU¶°J–ÀÇO;xóš.ºÑ)‡°b×lsÅ%3¦)ÔV†AÍqÄçCc)“£dÛ AÉqð&X“•\žÌ©íçlÒ´ïÖ€x8úQˆ{BÅó<%ŸÌårÌÌÌÐjµÔ†á‘<úã–®òÒÇ¥2å8ùåá㤒EÆcŸnwÃp(ÎÇss³¼òÊd³‹ gÉçOS,žŸàJ"’$$—›evv†Jå"¹Ü ¦é‘$>aØÅu§&õ"ŽS! …bªV›£Z­R¯×Èf—&]ël»‚ã”Éd„C£ø¶°¬¹Ü2Õê«“ZAÓÌL ·i·›T*•'‹“âÛŽ‘¨‘ÃÔÝ8ŽÕÊZ*™…H·,‹L&C±X¤T*õzL&£ìje <ÏÃó}šW_}•~¿O«Õb~~ž3gÎé ±m›—^zI})Û=\q]W¡é[­³³³Ôëu¥Ô*—ËÏí»=ïÐÎü_Ϥå7Ë©ÏOl,Ã3„ `7u4|–),»j+ó¦4I•§¹UÍ{r‚Ð,3‰‡±¨y­‡ý§3ÄÃgÒ‰ž3Ñ,M=𥭜4â¡ànEÃH~ÍœIÐ Ð-1IÚU›h¡:º§“)VÅbp{€]³IÆ vÍfxo(“˜õ<²¦ÅþxŒ®k˜èšè74ŒiÄ ži²Öï³ÉpÐ'H¦\—’ípó  †2ªŽCɶÝ=¶Çó˜¦F¯g“¦&ÅâYÏ0MoòÏcYCææJ¬¯7IS$Ž0 —0ꑦ1ãñ>š¦O|Î[hšE&£ã8±"²ºîÔÄíðŽS L"Æc1FÙì"ž7‹ifh·¯ãyuúýu\·F&»’"ù|žµµµ'‹ãâIÆ P(¨žÙÿÑl6Y]]å³Ï>SM„Žã(—@¹Â/—Ëôû}e+»¼¼¬Ž‘+ïápH’$ìïïS((‹ôz=r¹;;;G:¸ ÃPˆšápÈÌÌŒr¶´,‹l6Ëúúúʳ®ëŠh qð‡?§´X^^æóÏ?n©˲¨T* sœPáwÞAÓ4¾üòK¥Þ’ü¬N§£ÒkËËËŠ¨àû¾ÚÉ…aÈ‚bdA@µZ¥Óé(¿ééiÖ××ÿ„ 1)h¦`Aiú¤÷¡,ÒEQ?xíPÆsˆ !0îv]LH²\3„’*l‡„P4ú팱ʖàau#•B‹‡ñ‘Æ@ÝщG1ý}Œ¬íزÚ,À‰QJœV2N„ÊǬv3‚•%»ÑƒF€¥‹ýðÞ«d1Þ sª²¥j72¾Oœ¦tÀ˜q Ð4Ã`w4Â124Ÿ\" éw&ëã8VX“'0IFÏ~³øÜp–e©¦AÃ0è÷ûäóynß¾­2—.óÃ'…L‡2o~’¾]jéeH­|ø›ØˆÑhßoÐëÅÕ“hV**Ÿlv‘4IÓÙÞÞ&Žƒ]rµ2ºãôKt»w&ÇÇŒF;d³âáÛl~…i*ÿ=à8eòùÓôûkè¢ì1IÓ„vû ÒTx¤›f†|þ4ã±À¹ 5Vé‰÷ðXº®ó½ï}l6Ëù/ÿå±"äòò2ñÁOúÓÇ$’¶móÃþ øë¿þk’$ayy™R©„®k4›»äósXVÓÌrú´A¹\æÚµ`LŠæÆÄ Ê"ŽC––ËËËlllpõêU>øà\×}æ"úá(•Jœ;wŽL&ÃW_}u¬¥í`0`ff†r¹Lœ?žùùy¦¦¦Ô‚«ÓéàyÛÛÛLMMâžÉúâÆÆ†JÏÌÌpíÚ5µã9sæ Ýn—ƒƒLÓäܹslmmaY?üáiµZüÝßýÝsùÎß%tÝÒUÇ·U¼)«háøâa^}VÅàϹ!Ò4ܰÄî`¸6é+MôŸØ‘:Šû±Ú-=š® "t[ €ABÔöú7ûB"$Gpîº+PïA3 ìˆóë–®ÔXò§î(ï»j;q’’2åzÔ—½Ñ˜Þ˜hë:Ý0$c˜˜šÎïS´l<ã!Ùø»T3žý“¦<¶j‹¢H™üHsYÌÜÜÜdgg‡ñxÌÔÔÔ‰“‡xo±úm·ÛÇ® }ß§Ùl›~‘«ÞN§sÄt(I’Éj¯‹¦µT‚m; %,+ƒeåqœ*†a£i&¾ß"IB4-O½^#I,’4"ôG¤qÌhøHÐ4]˜š èLVÒ%•§¡Ð Ã>aØÇqjªÄŽc8|€eå°¬¶]šx»Øv]7i·o³½ýà1É©‹§‘kž4~¾ï“Édh6›d2†*V¯¯¯+UÕ£¿yDQ¤$¾·oßf<³¶¶¦VÃ#IRiuëÖ-|ßçæÍ›´Z-õÙ$jD×uúý>ûûût»]F£‘j´,‹v»ýX/G†ÊÁ¯X,Òl6)—ËêšÇüKàÜeííÑñ’1Éår4 ¥È2M“ÍÍMt]Wv»»»» ‡C¶¶¶TMÏ÷}Â0TÈžz½>Ù!‹IEÚËÝÜÊÊ ³³³ŒF#ªUaM eÖÌÐVÿ«éÔO¦Ð]1‘è–¨H„{Ä k‚Æ3§±ŽÃ¹§‰h L¢DIcuGÅ4Cˆu?!ê‰ "êNv3TÆDÆ+')–}Òþ6'X%‹x6ÂݪΖfiªç# …´OcÑW2Ú©?{óÂÈ*IŠuÑ>ŽctMÃÐ4â$Å6t’TÀu4r–ÉÖpHÖ4é K2ízO…s/Ù6Ób}8xâcÕ|Ýñ舻išÔj5úý¾’êÚ¶ÍÜÜ›››ª‰¬T*Ñï÷¿Ñ]Ts.”xiíùhHªL[LOO«‡y¯×'I\Õb>š–†šf‘ÏŸ¢Ýþ ]wI’1†‘† Z­>ºî‚b9á !Žü ‰r+tt=B×>\ Ãö‹„aÃpˆ¢!Â}p<»Ü¤ÃÝ ×»‹ç‰‚¼¦9Ÿuñ0r]çÈäûmcq\œtL6›Åó^ºç‹EF£+++#p÷qø)ÉuGuwK ®œèäç’H•f³y$%ýÝ%µW>€åÂÆu]ºÝ.§NâæÍ›Ï­R*•ÃPÝÇ-t¤ñV¯'0ýRî.ë3º®+OÃ,r(|Éìì,7oÞ¤P(¨s%I¢vù†a¨ÔÄ×X–uDüÇ3 o ÝÕñ÷|ÌŒð¼(\.@ƒ¯àPÓ5Ü9÷¹ÖAd8ÓBeE£ Uué½Ñý¢‹;ëª:† Ã3” ËÈ¢SüÎ@(¦ê6Þ‚'SŽŽá„íð(ÞÐðeYªè)}ŸOŠ••<Ïãã?~l’Ïç¹rå Ÿ~úé±;™³gÏ_|ñº®sáÂÖ××™šªsï^“ÑȤ׻iꆤhšN’Dôûë†G¡p–0ìbòù.†¡ëÍæ¬u ‡|9G«uMM ¶]"“™#Mz½OÕ R ·(²ôzwMg.¥ÒKôz·'<.ƒ7Þ8˃;;Û“É£J&³H¯w´Á®P(påÊ>ùä“'†æ4~år˲<±^¯«æµÍÍMòùüc–ºKKKT*å’ÏçÎ}ooJ¥ò˜bnnNù¯Ëê^¯ÇÂÂûûûT*îÞ½K£ÑPrW ìv»ªv‘$ Ùl–ƒƒ.\¸À§Ÿ~ªš ¥;lj&±ó{{{\¸pA±ŸgX–Åüü<º®ÓëõŽ•J/--á8ŽJaÍÏÏsãÆ –——ÙÜÜ$ŽcÕÔ9Èd2jA$w5ssst»]6779sæ ¦irÿþ}å[/å΃Á€ùùy¦§§U:MÒ‹§üþµÃ$ß'RQ$6Ä >{&K$ÂÂu’*[åS8ß)4(\)™nœ4ìš­T`ãc2+ü]3gbfMŒŒAóŸ®ØtˆU»îèdV2¢‡£âL;ä/æ…¯zÖýÎ]6#jBþ›;—ÙrˆûBž«™ά£&ÓÄ`ÅÒ%‘‰øxKtž×]K×¹R®p¯ßcE¤À©\Ž’íp§×å\¡H'fS£(âj¹ÂÏw·Ç1Ó®÷Ôý–®“5ŸÍÜ«Ô]½C«+ÉêyðàI’Ëå8sæ ƒÁÇqX]]¥Ûí²³³ó2^Ã0¸pážçñå—_>¶‚›››ãÂ… ìïï?6¸®Ëùóç Ãëׯ«´Úìì,ãñˆ^¯O>ËÊÇ!—/™]à7¿i ë6ºnc.Ãá6ŽS!Šæçkd2!¾šÍMŸ43lá85jµ7ØÚúG§B­ö&£ÑqsæÌYÞ|Sô&lnnR«½ŽçÍÑëÝÁ¶‹ gñý&»»¿B×-r¹eÒ4&Ÿ?ÃéÓpæLž¾À0\*•«ŒÇ{ØvÓÌñS_XXàÂ… ìîî>ñrÒø9ŽCµZUòÐ……jµq³²²‚aj’§OŸfwwÛ¶©T* [’ÉdT «P(¨f;9¸®KµZe}}×u9uꔚ€$,Qú¹ìííqêÔ)¾øâ u>MÓ¸zõ*·nÝâÒ¥Kloo™@$*¥P(P«ÕÔJ>›Írýúu.]ºD«ÕR“æóÉ^³m›;wî<&-–Ñëõ( Ê•qzzZ¹+†ÁÜÜœr%ÜÝÝU㺴´¤ ð÷ïß'“Ɇ!õz½½=ƒ"+Û¶Íh4"Žcòù¼œ?žN§ÃÍ›7ÿh°E3E¬ê­’õ0E•BØ= î¬+P&aªMÏ3w$cñ€Žþ¾U.…IÀcÞ$êG$~B&ŸQ8÷$š¤©|QmŒð÷|2§&òÞ=ÁöЇ1™Såd(#MRâALšˆÉ+êE¢SÝŸtÇOltíŠ- óbÓ MôÈLÂÒu¾ÏÍn‡¢mS´m,]g<¦åøqÂÖp(ÆìÇ,d³ØºÎ8ŽÅb'³ÏÓy‚<ëE“1 ƨ^‚ Pн µ—8†\.§<NòC¡¢ÚÜÜÄuÝcI¦FƒÍÍM%~ô3lnnA™xžÇþþ>ÓÓÓxÞq,pì†aÑë 0ŒÒTt™g2%úýutÝb8ÜÆ4ót»!µZõõ; ñ„¾›(ĺX±û„aß?@×]ÂÐ<’ ‚.†áâûM²pccƒÁ` Èóóó !r8,Ëb{{[©«@< G£ jÑ i¶m+ ±mÛê»J<‰ïû¬¯¯«ês‘òÈþD å1’’ð¼"MSÅæš››{̯FÆp8Äó<îß¿ÏÒÒÝn—Á` ¬˜‡Ã!½^ÝÝ]F£‘’Q'I¢lmEjÔ P(ðÅ_°°°@.—S`r×%{eä$cš&Ï]}ö´!P&ÿA Ldíƒ4KÌæªðü¼qî“÷“µ&]Mׄ3¡&έ[ºbP…m‘+•u’#( e[ “Ú‰;ùsú°.b•l1êD 瞌t['öc€w…X7uRRì² þÆãX(´–¢L4ħ)º¦MòÑ®aLþÍ`…¸†®idM‹_XÙJéîwA™,2yZãá8e"å…2-·æææ”µ¦ã8 rÜä ‹šº®+FÐq¯Éd2 ‡Ãco‰Ï‚@¥¤qï‡Ä±A Ñ4MK&ï¡¡iÖäá¾…ifH’×uCÃЂ4ÕÐukÒ±.Šæ‡Q&–•Ÿäõ[“zˆúÔ8NMç>Š2]·±¬Â䨕J™ °ðý±ÚqˆÏ«‰çIÆâ¸8é‰9ŒÝ—hù`“¢ˆ»w塀L É””¬7ÈšÊüüü#$y.y­È¿—~èrñ!¥·iš*I®üwÓï÷þDÖtdª¬«HÄŠmÛʳ=“É0XZZRrÙç²è/qø'ÉÕemB¾Vö©È±ð}ÿ±ßôQÛ¶ŠEžW~_9¾²æ£ëºº·äkž×wþ.a†­îç] Ï`´1Âȉæ¾Ú¿©‘Æ)_6ÀbþbwÖ}ö³Þ’‡U°0s"½ÔüM#kP~«LŠzH&d–34~ÝÀ[ð0rÄ0Úœ<§ª£ OÛþ¸MÔ0‹&å7ËbrDZ*Øð÷|¢‰÷ƒfh¯‰Ç1Þ¼GÿV³` o?"³˜!Åô®÷Ô®&l†Á’ª´’„—KeV²9Þßy@Ǽ^­aj:qš°;s¹Tæ·û¸†AÆÌ¢¡qoÒ Rwݧ–aÙºNÖ´€ï>èhÔ]—µC¾ê²H.£Z­òúë¯Ç1çÏŸçÓO?Uøï¯¿þúX úÒÒ’ÊuÛ¶}ìNeff†ûoÿ-|ðÁc@@]×ùÑ~Äx<æƒ>À0 Þ}÷]Ö×שժ\¿¾‹ïgèvoáyÓäó#,K§ÙÔI’Ãð(sd³Kd³cΞͰ··O’Ät»){{>™ÌÔd7P¡Õú‚^ïšfP­¾ŠiæI’€(ºÎ©SK\»vñxL&3K­öAÐf0XÇ0\‚ ÍpøÓÌ1;ûcÂðóóeöö2¼óÎÛ\»Ö`{{0lcÙì<­Öµ#asssüð‡?äç?ÿùO¿3gÎÉd¨V«Äq¬üÜå,kR²éM6.//ÓjµTŠäÁƒT*U øøã¤rVVV(‹ ‡C–——év»ìîºªêe}ô‘Ú5AÀÅ‹©T*loo³°°ÀÁÁ JQvåÊ~ñ‹_°¹¹ÉÔÔçÏŸgooééi~ýë_“$ /^dqq‘ 888à•W^á£>Réµç.\`vvVk†­ÕjÌÏϳ¸¸H† ‡Cå’¸¶¶Æêê*×®]#›ÍÒjµ”¹X,*Ì;åÜêêª ¸®«Ç›››LOOsîÜ9~õ«_ðgög ‡C>ûì³çö}¿k˜º+VæñH4ÑEƒè¡x(€†š%|Æíš;ç>—4Vâ Å“™žäfAäó ×À¨žÁpM¸:SŽ êæLœºÃèÁH(«yr¤‘HÅÙUQCI¢7²†¨dÅÄvB´±¸ÐÒX¸J¯ÝÖÑM³lâκéè83ñ &{:ËPŠ1ÊÊà „*Ê3MJ–MO ÑÝé9ËB£C⨻.Ð .•J쌆ô£ˆ¢e=õNB×4LíÙvƒí0`Úõ¾ñ5gÏžåÌ™3´Ûm¥a—v›J;eHy¦t0<.d®¸T*=6Hu‹\FQÄ`0 —ËÑívi6w(/S._f¯t[*H¿þž/Šæ®°ÍíÝ葌ŒÜ¤ÖÐrÛ°’ŒJáH!êE¢geOleÃ.‹¦ÄѺ¸xûZoÁu‹CuÍèöñÎX½f Y°ÄŸ$¾¨³Œ7ÇÂ>7H0 &ÁþÑ´Ìí^—V¦ YÓä~¿Ïý~Ç004aÑ"]gß³5ªV3(=-Î=å©»×’eÓ ¾‘ðÉ'Ÿ°¿¿¯ªù|žƒƒ*•Ê7Þ°²ãù$Ãææ&×®]{LB_ÿÅ_†á7=¹ó<÷&ã,kk“<³Aššäó«ìïÿ†‘%Z4›66Ö)•Jܾ}‡ °I’ðöTš*ÚôzwvÑ4‡ƒßþöŸU‘º×»C <‰çMÓnI’ˆEDèõî0;;C·ÛåÚµkÌÌL³¿¿†¦M14&È“Ó<ŠsßØØ ›Ížˆ šñK’Dí$!÷àà@M&ÃáðHŠP®~†aðù矫.êÁ`@>ŸW*,‰G‘çñ}Ÿñx¬0'išÒjµèõz8Ž£:ÕeܸqƒR©Äýû÷©V«´ÛmjµšJI@" þ¼··‡çyJ¹ô³ŸýŒééie7;ÙÞÞfnnî™î…GCNÀ‰é«µµ5¸qãÍf“ýý}ŠÅ"·oßVòßh4hµZŠÄ{X•%'él6‹išŠ&»Óÿ’þ°µµõGŸ<´³ÿQXÚj†&òþ%åý=*jš¨MÈþŒïö˜ÑÙ.mme'|šŠ4–¤òšYÁ¬’v¶pÈÒv[ Fd­"„ŠË*[B¶› j†7é)éF â…Ô7 ¬¼…fjø{¾`uÅ¢.£AC˜keNeÞ=ji›3M –ÍîxDœ¦”l ÛÐiŒÇ”‡A‘3-zQxž˜5MfÜ}œûj¾ÀöhxÄ‘PbÂ%ÂDÚ Çó}Ó4‡ß¨A—éãdº’‹Ôl6ÕîKŸì^¯‡®ëÌÏÏ«nÝÁ u|¿Áaœ»˜ÏŒ‰Ê©ëÖˆ¢†‘Á0Æ@¬šæl»ˆad&…ö-5‰FfHLéõî¡iGÅ ™Ì¦™a4Ú& ÿ^ú¤‰P`U†Ã!³³³ÄqN§ï®[›x™O<ÇÅIǸ®{¤ñRúNȈDˆÌÌÌ(êm>ŸW“ˆ¬yȆÃ^¯‡mÛDQÄÌÌŒ"øJ3©Ãý2õ) «Úíö‘th&“QÌ-ñ{iª–Òh4¨V«Êýð1Òö5MS%/–æL’x;;;û\;Ñåj_.‚Njò, Êö@Þ'rçuØŽöÑ–G?g¡PPý3²ASöãÈ1888 MS•®ûSðI7ÃNH瓚¥1\ª‚õôÿ2-pî?ß÷h¥7J kþ¼Â®ØBB;ŽqjŽhôócâ‘€'fO ”‰;ç*cï+qãz ƒ{õ>ÕTé~Ùepk€fi^.OõIzÌßõmŒDª®+¬i‹¯ šùóy:ŸwTêÊ™rpç\â‘@™8Ó™•Œè’·u¬ŠudâW+~¶#ºIëŽËb6‡k쌆\)WøÍžÀ¹WR‡¼iñI³A˜&Ìg²GúBž$<Ó øŒ8÷(I˜÷2Ü<ÔÀ˜ËåøÞ÷¾Çƒ8sæ 7oÞ¤T*qíÚ5N:…®ëÌÌÌP,¹sçŽÊË>š¦ñÃþl6Ëûoÿí±bûòò2ù—Éûï¿ÿ˜ÂDz,þò/ÿß÷ù»¿û;%õÜßßÇó\¾ürM«1là8Ufg#òù º®Eëëi ¦)RlI’27×Çó ßϱ½aY´èyÓôzw98ø†á17÷ãIýçZÕ¸rå¿øÅ/& šKT*¯0ˆtFµúãñíö—XVžÅÅÿ€¦]ãüyÑ qåÊe~ó›ÛçM£i:ž7C³ù)ãñÃÚÑ©S§øÉO~Â{ï½§êß'ß™3gTšHÚÙîììÍfùôÓO¹råŠjX““Á… Ž‹%çL6ÃÕëu>úè#åV( ±W¯^åÞ½{,//«‡e>ŸW×Êõë×|Ÿ×_]A2¥»Ü¡J4û{ï½wĈêìÙ³”J%¶¶¶XZZ"¦¦¦”…¾Ê|@6›}fœ» ]×ùñ¬\oß¾ÍÆÆÆc¯;sæ §Nbzzß÷•Åó›o¾©dÉŸþ9µZF£A>Ÿ§ÙlªÅ‘L3Ê:ÒgŸ}¦ºòe½ñîÝ»¸®Ëo¼Á/ùKF£?þñ1M“¿þë¿þ£û„è’¾›F)†#òˆº#÷‚–°·µ š®=æÂ÷<Â*[J¢«;b—‚Q¥[bW`×mÑ¥¸s®r+”»@5j†&|Û5ð÷|!åÝJ¹“‘„ Ñ Â©9DC±#ïŒIügÊQ»gÊ!h_X•GµR`}0ÀÔtjRn'¨89Ó"Hж£tÀÙL†Œ)&k[×ñã§¿ðµgĹâó ¶¼¡K¥’J[Y–Åìì,Ýn—\.G.—S¨é?›¦©UÔq©.]× Çþ›¦i„a¨:©%˜Ï0 ’$e4:˜ô]¬Ç!Õj… Î333Ãüü2¹ÜÙì< äµIàySLOO‘É,à8•‰£^€ï7&Ò[±ƒ0Í a(VÅâ¶m)‰¨çÕ‰ãQ4Àq*躃㈋ãÃá.¥Rùù9.^¼Hø~ËÊaÛ%úýû c娱x$ùIã7 TOÁaÕN»ÝV,¦Gqî{{{JÞ›ÉdŽt¡K8£læ“!éa†ÚqJü£¨y9¡I)®üóôô´2zrpp@>ŸgnnŽáp¨:ígffŽóÍCuÛ¶YYY¡ÙlâyÃáR©D>ŸçÎ; ‡Còù<Ùl–n·{,¦DFµZÅ4ÍcQØrRÚÞÞ>V <55EÇ4 ÃàôéÓP*•Øß? Žs$I0y8ÐuðÀ0²˜æ©©"ÛÛ- Cš œ»˜`‰”W#—[šàGtGòbúýþéRÆqJOô"q<$Mãɱà8S¬®.R©x|ñÅ—LMM±¶ö]/EC‚ ƒee0Œ,ãñÃ1±m›™™™Çâ¸8iüªÕ*…BA¥£d¿„LQår9eÕúÅ_¦)•JEÕeZJ¨Îî*:ÎcÇHÄÈaçC×uFär9öööŽ4V«U•& ‚D/¡ƒ‡Ó¢årY!Oâ8fwwWù‚ض­üiVVVøòË/ŸÛŠ\^2õwœÚ0ŸÏóÖ[o±µµE»ÝVc%ÓYòïy½^ñx¬R}Ò{}4)qB>Ÿ§Z­òé§ŸªIÑó¼Éb¦¨Ù2µöǤðÊ0IEoG§*­“„ ÙZV\H»ctC“GéÙ&cÃÝÐ…4W‡ì©,i"ŠøñXt|ÖFØu›¨6ÓX |v5KÔDÇ8!l†˜E“ìŠx/™v2ñÝ$%M„P@vá›S¸6Ä*Z$zÂhm„3刉KNú,¾ó–EÕq¹Õí2Šcâ4eÚóÈ¡±;1íz¬$©¨yìGD“|’>½»yœ¦ɳÝ,š¦‘š^O Úëõ·&Š/ZíM:¯ÉåVˆ¢ÁÄ.÷–U V›!Šú,//Ñn·-­¬¬ðî»ïâûþs¾iü@ô–DQD­V£V«qöìY~ûÛß*¢m¥RQµ†J¥BµZeoo\.§|:²Ù,/^¤T*ñá‡*å¬ÌÏÏ+Ó©ƒƒ²Ù¬2•zå•WøùÏ~ì÷yã7¨×ë|ýõ×”Ëe^zé%îß¿Ï+¯¼Âh4z ïÿm¡išÂÓ×H¹\fqq‘sçÎa¹\ß÷íö¸ÕþåË—•uð`0P¶¯¾ú*7nÜàå—_&ŸÏ³°° ÈÒ*ÇIʧ«Õ*ü±¢¿ñÆ|øá‡ªÓ|aaµµ5ÕÈ{éÒ%Ö××ÿ¨]躦k‚\ë85Gùn@©Wm¼yO”ñs- §IJØ šî¬+ÒHPCIĈUÿ°bLQÇ8Ô¹u#¥’ŠG1™• º­ãïøÊ†7î‹Øá²A§Šð›YÉ ;“c&͉²/Æ®Ùø{¾Pi•,±k‰D;Ø÷GäL‹ùL†ƒ±À¹÷£Œ£ëšñº†;Á¹Çi‚õ]r¸Ï˜55M킾-$DqjjŠEý¶c†Ãá±¹Ú~¿ÏÞÞÞ‘©Œ8Ž988PªÃ0p]W©T c4yÿÜäö°c^×Ml»Hû†E§#ìw%³i8†‚ Iš& ›“ŽvQÖ´m E×sììlé™Ã.aØÃqªø~Kí@¢hÈp¸‰iŠ: h„aŸ hcÛEÒ4¦Ý¾£šäžt,NŠo;F¦_¤r­ÝncÛ6­V‹ýýý#5«î;wîÇ1ëëë$IÂp8¤ÛíªÔÖác<ÏS2T8÷v»M>Ÿ§Õj›NÒ4F£¡L•nÞ¼I¿ßW)™?VQ¸Óé(‰­ïû4 öööh4‹Åc‘Æ[ƒÁ€v»ÍÎÎ¥R‰õõuÆã±òq—ãkkk îÝ»G´ÛmƒÁ€ ,ËRðÎ`gΜQå\.Çòò²rqü“¨œýgÓéÿeÍž LL4I•ï¸ì‘È‘G‹ÇOGP&<ì-IÁÚ2Œ%f]þyuu•[·n}çˆì[‘èù>OrœŒ×0 Ο?¯†+ººŸ%~y@ÿ†hì+½Z&V% ÇGÓ5 — b7`é˜Y“ü…<£û#œ¡èÐM]y‘»s.ÉHLº©Sx© |Cœ)‡ÜÙvÙ&³’Á]p13¦°í54ò/届Ù³YÑ…ßM‰¹s9ìšXqfÏd±ŠÂÊÖ[ò.)§îõ#ÒàáÍ^w]Ίl†DiÊk•*ó™,Ç!MáÕJ•}Œcèd Kׯ1)Ps\l]?RÌþ¶Èš&Óxj'ÃÃQŸÔ'úÇL Õj•K—.Q*•¸pá‚"©Z–…iš,--Øã!ãòåËÊ9î¸÷ÿþ÷¿O³Ù|ìFÐ4·Þz‹jµªVb?øÁÐ43gN3Ùèz hã82×uHob-cšÊåKXVÓœcf&K©”Ãqòø¾ÁÕ«çXX˜&ŠN=¢¨h « gpÝ:izÀÜܬz¨ÙvaBä&ŽG˜fvòðcšêõ·wÐ4×…üàM Îx IâºU^{í%Æ‘¼z­Vãûßÿ>F㉽N¿Ó§O3==Íìì,Žã077Ç‚©¯®®Òjµ¨Õjìíí0??Ï©S§˜¥V«‘ÉdXXX`yy™(ŠYrå1µZM~%êaal6Ëòò2ãñøHŠsqq‘ååe˜¥^¯sùòe²Ù,º®óÆoÐjµŽ³°°ÀË/¿¬j,333œ9sF™-½û6&w¬ß%â8& C–––XYYQM{²qœq“ô‘Ÿ§^¯3yùå—IÓ”K—.)ø4M™ššB×ujµšš0òù<ŽãðòË/Óï÷Uóàòò2qÓétTšïÁƒAÀ¥K—ÈçóEtÍÝÞA3Øo4HG(œ¢^„‘5„¼õ;¦±o¸âQ,ÒCSß¿ÕWètt(¾Vd´.|8Fë# Ç@Ÿ’âÆ‡ ¡¬*XªÛ\Ä¥z+MRÌ‚ çJº¯ïú$¾0‹ò=a eëDíˆ`?À[òÈ,gÎ}ÊAw Ò‰Ô— — nˆ1VÑ"î?ÜnGi‚©i˜ºŽ ,d²XºNɶ¹itXÈfÙÐ5~r%_ág;Å1UÇaç)Q&¦®áèÏ6™·Ÿ)×;£EÑÄBVçìÙ³ ?-QÒiš277wbß‚a,//ãy¿ÿýï+DNOO+ƒG‰²Žã(¾Ð'Ÿ|¢ Âèj@»Ý¤P¸@µú A0àòåU–øå/÷Ñug‚2É0lâºSÄqÈÌL‰l6d<>ƒmX\ŒØÛÛÀ02T*WÙÚz×­Q©\f8Ü&IbN:Ã믿ÂOúSÖ×שV_ÅqÊôz÷°íùü*AÐbg瀎ã”ÉdÈçÏrîœÁü¼ÍíÛ_båòË ض­R<2„üXX¡>)‘÷¤ñKÓTÉh¥$´Ùl233C­V#—Ëá8ÎijÇJ &˜²û¥—^bff†^¯G&“Q54M©×ëT«UÆã1½^O9Êö£)–$Ivdvv–/¾ø‚N§Ão¼Á×_ÍÊÊ wïÞU›¼%T±P(ÐívY\\¤^¯sýúu–––ØÜÜTʤg ¹‘ö§OŸæîÝ»Ç.‚._¾ÌÒÒÅb‘^¯ÇÖÖù|žr¹¬0>KKK,--áû>jÇöæ›o’Íf‡Ê*akkK![Þzë-~ýë_«FQÓ41MSëõºú-þ˜aÊÔ‘3å ;:ºk@"jš®á-yB™5yØŠÏ+ȧ ³:òKþ;àжS%CÓa´1R}vÝ&îÇ„½ˆxWt§qÊàþÝÓ {!ÉXÔj4MLI xZ`xbw”&‚mvCâaÌx{Lh]ùW—(IÈ›Ža°9`ê:ëƒ>Q’r¯×%JSLÎ}ÆÍLXV1ƒ(¢ø”(ÒÃãþÝ"oZôOPýÈôB³ÙäÓO?%“ɰ¾¾®'ß&#Œã˜»wï‘mŽÝÝ]îÝ»w¬Ä×÷}•'–iÛ¶ÙÙÙaff†Lfsâðçcš6F“ ð‰"H“\n‰Nç†áMêööœ9Sbmíz= °,ƒÁàî¤óY# ŒÇûŒF{èºÃ`×®}®&¿ÑhÐ÷pÝiz½;‡ÒYCúýu,+$lnÞÁq¦étv0ŒÆãƒÜ¿¯«<¹ŒÇâ¤8iüdŠC®˜‡Ã!ÔëuK”΃2dÈææ&I’¨bºã8t:‚ P«üÃçÑ4M=X¥º¨T*)‡¾Gwù`ÞÞÞfooÑhÄîî.išE·oß~lG;55¥:Ó%jmmÍÍMÂ0äÎ;´ÛmEIxÖ¬*“ñÚÚÚc*0¬®®²µµE«Õbkk‹B¡ ¨À²èÝjµh6›ììì¨ú…Dµ‡Cµ0Ëård2>ýôÓI´Ïòò²jº”=%ý~ÿ±›?Vhÿ—ÿt1ýÉÿnžF'$—1°í£¼«‘c[:†¡©G’¤„QŠ®A¦d<Mƒ0L@Óˆ¢Ãа-MƒÁ0&NRŠy‹ö§m÷‡´Ê{BOÕ0Mí¡<÷P\ÓÄNC­€¬' zNÞ"Ñ@Ç$)ôG1…œ)Hñ\|2©›Ã„Á ¢:çú1ã^„ihxÿ?LH“ÝÐct “ž—Ži'¤4ù³]´Ú!ºÿôEÊÇ×tÊâ©eÛ !ÏsÙ,iàY6{ýÞÃIVÓ0ÑÈ[Ö·r©¤^ V,Rð<îîì|ëÊk{{ûØ›`*›¥Œ'7Œlˆ’§ô°NÓ”Z­v¤0*s¹²1줂©üÜÇ^|ß°‚zôß$Îúá øð9R…s×uÇ©0íñp)#P sÛ:š&šìÿ܇ÇU#‡ÿýñÏnÛ¥ Ѹsè|G_{Ü÷þ.«É“Þçð¸Ë?ŒÑ5%¹ÇÈ×>zŒ¬3T*•‘ÿ}øZ<|þG9és?ZÃç>üúÃ(y¾jµúL)¬ãÆï¸ïðhLMMÑív¶ý¸q8<¦‡ãQ¤‰ã8 …Çfr äµ*Çã½ûÐþãÿùLúø«9®ÝèRÈY,Îx¤¤´òY“›÷úœYÊ’õ 2žI¥hÑéG|z½C¹`±þ`Ä_|¿N!oñ»Ï[èºÆÝõÓ5‡·_)3ò~õ»¹¬ç”K6A”°×˜©9líŽ)-[Ç25Ú½ˆå9ZÙ&S¾¾+¶Ý~D­bsýNŸbΤT°0 ±Ÿðî›UZß]kqõb‘õ#je›½¦Ï¥³2®Îµ›=\[gýÁˆBÎd¯ésù\¥¹ ÃQÄO?:P±—Ïx°7æ­+%4]ãÃ?49½”e¶î0¾¼Ù¥R²Ù=óõVµÖ*£á€sçÎñÙgŸ±°° VVÝ<;;Ë;wxåêUn|ý5•J…Û·o3 X\\Ä0M\ÇQBÉ$êv»Jz933ÃíÛ·•ΩS§”½å7Åõë×…~ï{ßc{{›{÷îQ(øÑ~ă&¾Ý.ÓÓÓüÍßü ƒÁ€K—.‘$‰2ö‘>ÍþçÎ;wŽà'^Ä‹xÿs„¹¹7æw_´‰â”þ8fo’šÑ4ÈçLÏ LRþp½ËüŒKwdS)ÙDIŠåè4{!­ADx“ý1AšÒǬïŽé"º£ˆÝ¶OÃ…Ó9ö›>½AÄpSÎ[aÂæöˆqF ¾ÓºDQÊoþÐ$—1±m»C2žÁnçӈ¢„Œg²½?ƱuâDL|7îõy°g2EL׿§=zýˆÂŒË^ÓgÄd<“ÍÝ1Ž£ÓéFllX˜qÙØñÒjž JðÃËÔÑu ÏïßëGô†B=õ»Ï[TçWyåÊ:Ž“¾ ¯¿þ:º®³³³Ãýû÷™žžÂÉd²¸¸¨ÜÔ …õz]mU%&}gg‡ÝÝ]^zé%¦§§U*›oµ¿)Nú÷ñx¬0âµZb±¨Üâ¤]©”jJ;Ô/¿üR¥&dŽ÷8W¼ñ"^ÄÿöÃ\Y,sjyš81ùd=ƒN/¢Z²0M0Lˆ“”RÁ"—1)-z}ÁJS¸úR?ˆéöC†£ÓÒYœñ(äLŠyËÒ¨–mJy‹±SÌ›„QÂò\†plþ0¢Z¶ „{Cê‡RÁ¦Õ X]ÎR-Ùó-ßOð<áî7Uµ cLv1å‚EQ¯ˆ×wû¢øÖhè:¬m Yšõ„3]˜q 6¶ÇÔ+6ß½B¥ÔÊ;û>a˜ÐíGhÀîÁÏÕ™Ÿöù1õ²CÆ3¸t®Àz£Ë—¿û=ý~WÉ!777i6›JBÙét¸{÷.ApïÞ=Â0Ti¥(ŠØÚÚb0077ÇÚÚšÂmw:ƒ·nÝRîk­V‹0 Éç¥k^ð­Lª“¤ý~_õ4 >ùäÕÅÜl6Uã“|»wïÒëõÔÄÕh4ø›¿ù›#ôÔñ"^Äÿ<¡ýÿ?ÿ¯ôÿôüßóŸÿóÿ›÷Þû¡x8.½«ÉڪƠ2Á“ÿx4ŸÈ×êßïpvùÑ÷¢”0Lð\C«ë“ósÜáóŠf²G^§AšÈÏ’„ žcˆy8I½NAÙ7Òj?x'3¸K’ æ¼h!Y ý#Èõþ$!9@ý#È÷9Çû“p×ÍŒDEªb û|ùáÍUqóć>V£·gÁî•ã*–Yo¨Ÿ¶±”,ÚP¹!Ã-°îî‰DF¦wÒ÷]¸î!qÔÄÖäüݤȜNúñ7S’ Ú[AÎh— §˜¤¹ ûb'‘©\ü(Žt²ÝO߿ˡ&ŒTÙDë8¬´SU° dlà–§“~‘•x¦RÒ‡ ~x+ÚxǬH†¦º ÈH‘‚ˆ¬› Štù타  Œìél?(!_jX„ŒB?(ƒJ~œîw\ÎɬÁЧà\Øad<A€}×ó–ƒ=9P„½©Œ„EúrAÖ6b×àw7dm5 VôårO­˾{nOÇøêñ3g}؇ÿ‚X¥ ¤9,4jßù=âÑh°âÞ|Ù9„ÜRÏS/c—¡ý`EsÜöAKÀD'Ý\K,{Ûh°¢yPFæQUMÓÅýÇ­+^Á/ÚÀÖMxž^Å_^ãFaÁ¢ ë™ìƒŠ½Œ0‚Š d¥›©yKPÝÌÈ”ÈlAŠ÷RŒ Û'öœr h?OfÌo@ÆÄ—CHÇ +î,f°"QIG?¢ÎÂq+•td]Æäs§Î×w>KˆL}B0ŠòR|ÖÈA}³ÝÄþâ½|g²ø?ï ¿È}[¶kptŸ'³F–4 XA<ßù~7!2ñ Á2==+, B¤ÓÕ]sÄú!Ýè-È>¢×x¾3Îe^Õ¥ø¬‘E‚ðFašÏ“Y#Ë B§o…µŽM‡ò .ߵ⢟Î~85„ '‘‚(.Å',õ£Â^‚ÈŸQ˜Ÿp‹ÚódÚH ²?¡Á¢ D+¬N}&«šeô£_'ýRbqU“é7KÅøw·Ã*XÕ¤r òd¤ªÈòÄ¿—ïâì2(#‹#ë òîí‡LAˆ*êõ@JôýeÈ[Õ„‹W“j‚5©‘@tSIþåÕ"QZŠO‰ðñ—"ô  Œ,ެ#ˆ?d BQ§À*÷ƒ}"‚‚ º„H Š2s)ˆÊR|ÒHŒ ‡HI~PF–E‘quwC¤ D ð ¦û DhApÍ!ý‘ë ‘‚(,Å'D òÖýø@AY D ÙÃÝù1Ðä®°À~ôêƒ\Ä  ó^^õš²­”›@†é. Kæ¢ ¶ øEž"¸Ý<ñ¡O‡•ðö,°Ð·€Ãºl m°Åb'}ÖHXòzWØK"!*@ òªR`œË]«$ŒH:~ô^´!? ÆW%?PðF!#3#!‚¼Ÿ+X#õAð T'³F"ý  d8‚¼V?jЭ“ŽO AøñÙR2"å‚Ôõ…HA4•â³F– ò:øÁ>HŠÎ“Y#‹ýøý—‚!)ääG Ø!ý(óãÕÀ B:R$Èkû—ôúC¨ zJñY#KqùÁ>HjΓY# üx9Û BF"_—õïºVßáî.Ú01üè¼h‡»ÏL® ¯†~ È[´Á¾GK)>id¶‡¯‚ŒÔY×ÅÚ¾æ¢ °Í³í!,™äý¶×áË·€wðfS°h?'}ê}¾¹ƒW ý¨ÂCA楥 ¯ÓׄHgl?Pä.Ú`õAÀ{ô€ÉÏÈPd¾É{ùºõ£Âƒy£Pù©§#² g=(‘O»+ÂtëƒàH{šùq)¯Zu@() • W=4õÐBQ^Ý+ˆ,ò#a/cý`$ ͧžŠÈ²ö#z/å•§ý  Dm ,—í ,öAH.3øAAH6-q–WÊ:èˆDqu¯!²Ô˜½tëá„}$Ôžz*"‹Ûˆ½Lôƒ‚9Ô/°<åUÛ‹}’E?¼?™BuF!‡»«d?Pä-ÚÀ9éj#‚÷Ò[^ý§b®sÒ±;ô‡ÎSOE$¢ í¥_qOY¿Ì(Ä/ÚÀM­ÍRùw¼C´=Ôò55îm8/€eÛñ_¢€Ê=IŒ'&ÆzÏ(ˆ^êúñ–ä ‘‹6€ägä)ä‡g/Kô¨pà ¸hÃD‘U)j>” bbN–XZ¨Z`‰+¯ª÷A~~ÜžÿD sùÑF˜&„‚(¡¢ CvÏ¿ˆD_u¯ çÇe/Ëõ`$ e§žŠH`ûqÞK@ó¡TF ¤õ ,¡åUƒ>HÌÏ)ˆªù!¶ûÑæ*;éƒPK©zÀ)ˆ®ê^C$Ôk/Q~h샘ÈO ¢ ò#±íǾ—°öC£ ±§>K,ùÔ)°Äv?>4ꤷH •©äG•T„D2¥(ÊûàìƒHD òÙK¬û Æ3åð<‘Š‚„7 Ÿ¹µøH™$_æýSu>R£À’Ý=ÿÒ©bVm(ˆ*¢@ŽôßtÛ]®j"y³àC/OÒms#Ðùó‹ ¡„<žŒ±,ðÈ÷[ÃÃHjÒ`éQÈùVqà8òyÔmA†Y»@Î¥N˜ÚÚ "«W+Õ1‘£)ˆL¦n>pˆj¢£È•¹úŒ\ý}à`(È‘{y‹ÜË+É'}mÞøÒ –W-:éq )ˆ<èÇ£ÉU¬¨ …D“_½Ã>Èh‘'=‘'=„x(È`‘çæyn>dx%D BrayµÑâNz£‚‚½ó BÎÐ<"ÑQäJ‹t—WE‘îòJÚW…‚Œéi>J"=͇°¯KÞŒÂÊŸQHÒayu¢ÅB×ÌoFaÍO¹%©ðêÕ…^óA.bPþ°ù¨Føôv 5¹,ûƒ_´á)`Æþýæ‰}æ=mÁà[ýÛS¾‰X´Á%PƒäÉÈ$B H^d°ýsà Èž“ÎK ðK{÷ãȹìu±(ˆЂŒ G7A~e/óÊ~Ô„«»« ’Q^I9ð&¤¯îŸŽw@HäM’Ó|9ð6¤wÒSH} Ö@åU·N:>”€d ?(ùôcˆ«»hîV5)JÈEG‘+#òNøÈh=dx#ÂëbÅœü¤gämß|ˆ8ðVˆ„Dƒª°Æ+¯ê÷A¸xµ@‚ §G£N:[áÐÚˆ¼Š¥£È•y/HLd¢¼ááîì¤ËŽŒh@î#“»¼á;éÎ ! ¤.ˆ kÔòªAÄ-mýÐK.Ú ‡rAÆ»º‹æ¦ré…4Y´AG‘Û?2F`džý¼!™ëbYOä¢ ¸Í3éKé¯|üö”o¢mð}Ó„DPXa ^^=11·óAÜß5w"Õ)õ³bé*ˆ¹}©N™ £û"µÄú–evqÆNzŸÈH?Ü‘E啎×D°áœtÁ‘%‚”5:^K"Çb‘ *¬)Ê«}¸Ï¦ ]È÷cð«W+­:é‹%“lAæÐ†HAt¹]#£ý8GüÐñZ‚H_Ý=)!ï€FA 啎×ÄýU¬»nK¬dX3•W-:éH2y‚Ì䙚A&¹zF¤ :ŠÜŽ‘ ~l‘8=t¼– (ˆÆÈ A€Í‡Ž×„HAH˜ôkÂòŠ}yId>=:  SÝIdF?PÜÞ×EM̾JÈ@G‘Û-2É'¾¼ÒñZ‚Hjb~¦(ˆAð͇Ž×DúX¬K‰…_´›Ðf¹|ï¢÷îöÚ”¯©q3ŽÄ7΄}Î\v1\<11™‹6Pnœý˜ð nKD^ÅÉ?fäI;=Æ9ð>¤žÞ\´¡wäQÛæcœïCù|(–XMIôc^ª÷AL¿UMˆŸƒ ôÃO«N:…í»ç 9KG‘Û%Ò$NQ¼DUd²£x7¸.–*vAX^ÝÀ>ÈŒ¬‚°ûq ™Í®{1\KSäO?Æ8ð~ÜVäÊŠr"3üãÀ;"ò*qó„Ý8ôAZ%Hþ¡‘Pé )ˆŽ"·yä’ãÇÞÎQ™åÇÞ•äÓû·ªÉþD–XXØ=O¡Sd]Õd&iÃB=’h!ˆó&ÈE®j’¶(I&Ó.OÒms{Ð8o¥7hAžGµòGf—Wb¼u$ Ò4r /úæ|?^¿-™ŽHy‚°“žGîGÓæû1/ çR烬e×ÅÊ ÷“éG-i”0 7å•—¿ÞéEòêîHFG‘›£‡+²ÐþÞ)„È S:޴Ȩæãù.m?ºx¯H"¢6g•Aõ>Hä|) AI÷ƒ~äÑ “wêS[ò¯^ýA?z"ò*–Ž"7:2ÞCäzï¼LÁ^Ëæ¤ÅJJÈCÇ;™R^Ù‘?Æz-;~'=%–W,°²iÒ¡ ¥õÎÿ  ™P Ðíˆ\›WG‘{™|u÷ùFú1ÊkÙ ^Ū™Þ||"홤7™§·Õ´°ÄòP\^±À*¡Õh^ç8'ý–Ì›çoú¢ÕP ’ ù  x@åEžf쮾ú>|ù’p”jßžòMä`D'üœôÇ|¿‘˜öCÅk9^'ýÁ+w~¹—óº%,°Š9—}dö«XôC8 ñO˜²Å™S´—u¯è‡ DÎ(TPä.ØÈŸV$J¯eHá‹‹6xX°‘kó±GÂù¯e¥HÁ$jÖíŒ%¶Àr,+Ê«˜ôF ú€ âZu—‚Óê*‡»_¡ó rÑáEîŒ<–W¿H¤Â_Ëz‘ 8$  §æƒ‚ˆCd "`åþÐXZÜ(dÄÎχâмŠÕ ˜ ¾ÏŒ¢ ’`$‘ÝÂH—‘`?$¿–U#Ap¨IVûQé.¯žøöCðkY7„HA*°üÉÉ D×ѼÓ.Ú@?ÔÐu>ȬsÒ1~>Ò™~H#ïô®,ˆØ"÷ HndàÏŸxAľ–µ#Adw·K¬ymX_>óRÞŸ¾$¥Ú·½¹½˜Qø˜±Ä‚XöãÅ ÈCAâè~°ÿ…‚´áGàgôC$™wÒë^æɼø‘y[^‰t½“›0e~øÄ«W )ˆ°"×#HTdZó!ìÀUG‚|FaäG´ /ˆ¯‰‰L,¯d¸îH\8+4uåUex£°ù‚°wÞ“tÿç¤×ý”[IйɿÌ;Çœô€áȬòJЫ‘}‘j’ù ¹‚ä5‚\}$€ øEäl–Ìç¾_~Ö ›Ì55¬Íý¢ ŸÇ¿Æ#·šûAÚðÄÄäžÞ3²dú\B”‘;'=2!ü…‘wzø" ôqàcD‚È]›7.!ïÀmóá‰,i>Dø ‘ DŽÅ’Ë+å´èƒø—MPK®ؽ ù4ÄDWQìî9v7HDŽÅê]äÆéq,ö£÷ BäŒÂÎï@dóqŽt?tœz:"A°“~åÕ´èƒÜ=à6A!ì~ BuA:Î(ì—"gö+rSü°"Qw?tT÷:"Að*–MRû±Gš§žŽHy3 ctÁîÇH4Í;Q„ƒK†¢Õp÷iZ6ÄHAz¹é~|"±~è¨îuD‚ÈžQXsU“ï@Fûñ n?tœz:"AdžÞuçƒ4'³{Îî‡`š w÷µ Æóo¥°û1 ]‡šØæèXÕd áZ`q’×[ÀaqSqs¿ªÉ¶qýDUdÉ‹ ,aõ~ã÷RIu¯#ñZ`ú­å<™6D~DÓÚ¼YŒÐºì~ˆä\îU,«‚Ù‘š ýàÕ+ôšP AnÊ+2 "W¤KzdLy¥£Ÿ6Ä‚,é‘Q啎ódÚH"Á’^`±¼öA"IöƒÝ!  q¤ûáÿ¯^͇HAé’ß|è(ŧ1º k™R^é8O¦!R‰Ë«q`$†4AØ; ý …ˆU‘Z~ÜGºîòJG)>m$ ò#½ùÐqžL "ïô¶§ZÉ-±R ,–W£Ñµ¢bNz‚ÉåO_A4̉„Íñ‘ß‚l%~ц'"e‰~ðËÿÓwàiOüJOp^ äíQ°‰üüÂ礟ÚdöØDÄ^2²Z$‘‚ ˆ-°xó|P@ÎJ,ÌŽ€AøÙÒ‰®‚ˆ_´!ÒNý 7 z£ð"ˆ3²¬¼ÒQŠO bLA® ˆ+²°ùÐqžL B¤ ¥DX,¯Æ¦oš'F®›88ÄK¡¼ºKvD R&¿Óc$¤¼ÒQŠO bJA0啎ódÚH")â¾Àby5샸¹õƒW¯æ€‚¸¹„W¯H ")ßçÇ ôCG)>m$ˆÁñ¶ßÈ`y•Ú~è8O¦!R|ÂË«‰èÝ9š—~•΂ˆîôZ^‘YÈRµÉ•? Èß|è(ŧ‘=£pDÌ¢ K৯Àsßy{ÊEß,Ú`$öAíË«ùxbbZYÑ/{çÒU‡À„~ ˆ$G~¯ßòÊYT^þD1²N$‘7 ‘‚¼‘e͇ŽódÚH"ÉàÆ',¯F¦w˜€À-¯^Í ±ñøxõ 1ˆ$Yþ{?Α?t”âÓF‚WcyuŒ„”W:Γi#Aˆ$§dz¼šöA6è¹BA6®‚ðê!R4ù~"qzè(ŧ1¢ ®æc6:Γi#Aˆ$‰³,¯Èìƒ|¹øx,õ˜ˆ¾‚Èù¶“ ôƒ@ù!ž òýð—WO|y¥£Ÿ6„ÈŽ¹N~"ñ͇ŽódÚH€eð‹6ÄoûËwˆ>ûÇM·Mùš‹6ü!aNú¡aƒX<11ÃÂ+¸¤ª;é¶ È):„È˼‘/W‚JÞTFŠCóÂ]–WäL÷>.!úAL/Èæ»ç¤"‰’$Nu3#Å¡V4?”¼©Œ‡HAbø ÂòЏ™¼òõƒÝâcnA~~ôøÕd*D r/ÿG?tÔÍŒ‡NA’ýPò¦2R"¹ãÏv?H™û »䎉¡¤"¹‘ÉðCGÝÌHq(îžã‡’7•‘â9a*ÈÂî9‰ {¤— ÔƒÄÐ[ÒUM–L¸< 76E«šÇ¿Rð~¬ùOïO²Ë+d6Œ "·“^–ðzå ’_^éxS)ŽüNzAÂ+Ü€xa÷ƒDr.S«8KOÈôƒW¯H])Iø[`:GêA:Ð\¿¦ïüpÉ_臎º™‘âh-HŒŽ—«¸¼Òñ¦2Rù|@AzÅòФ¢±ò¢¤ ù}¾Mª ¼zEúÑPx?òcôÐQ73RÍy%´öËj>t¼©ŒG+A¶L+°X^‘LtõArýHÜBVT B?ˆRZb}zyœ _ù¡å•Žº™‘âh ˆõéå‘ ÈçåÂ6:ÞTFŠ£þ„©t?>°¼"Eô탘XA¬ò*E^½"…ôÛ‚Øz¤ø‘ºC„ÔPbmxg"`Æþýæ‰} 8¬ûͳû´ÙT_´áT'Å7 Ïôýa$#«PQS”7 <@ÎÕäÜ  ¤%]¹_´árŠ~TºQx¹ •䇎"—‘¢#AÔäz™–‚0²m$ˆ‚8îò±À"éÜI$8îòÑÒ±‚¸î‚S¢´ ÎAT©~è(r):Xç ªäöCÇ;ÀHÑ‘ °‚¸²À"íØñŒQ§¤òñŒQ§D18A|s82ÑQä2Rt$” Þ)€9 H…Îe$#;Å|üS)#5Gb†»cýür1r¶ÈìO¹Ý?'=°Â‚‰ðñ¡ŠÙaFöŠŒ:TEæ.Ú°?ÓVX  “ERýY› „ L± „„†~€~B!„B!„]à¯håÞÀ¼ D `ûÝa5Vtiä¾1屿ÝûÛnûúû¢ ïq‰5fÅþ݇¸íµtݹ6×'Ÿ¸çì­ë™¾_U ü/‚߇\ßMìÏý-OüƘ-¯(r ÛÏ_³?7ïaÖwßFe¬_˜Çiÿ®ûf¶Gúvú¢Üþu{|¶éOESáž!Zí¶ v\q¬uÂìÛÒÈmkì¯r“*fާod¨ýzYçîöZÚݾ·Þxç眙Ëöa‘üW"ñ%ÖzBñþÿ¤î;·q…¯€9'ÇS/sº·*ѯëá$6§3Õ<®¯Àí«a b·lo¯‘ØF ¢1ñodBæãµyßEÐþNÉì´Kj‚ Ç?÷–µ‡Ÿn‡˜ý¾DºýpD¶ôC Ð~òÑéO[Ñ©¼e¸BANmÆö•ÝŽÊ8î‘ëÏ̱p-äðQ›gݬÿ³¿cµ‡‰ û·¬Vâò¯Ë -ë˜ïão¹<âð¯ußÚÏ ätú™ýßÛÜÁÓ#í¿á§Ä}r»NÿÓ }Äu2ë:]xì„Üâdûéñ‘×äq˜KW*È5ÍÞŸÓ.R›íô3×ëVU³T×Ë‘aÿ–ó2.—´ußìçÒûÜÚ‘­;|´Á¿fÚc=‰í®´1SÄ–iý–ÇÚ/9FÒÎÉ„ŒÏsBPB!„¢‘ÿ»i{¢½IEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/read_disk_buffers.diagram0000664000175000017500000000240014152763504023361 0ustar arvidarvid "copy into peer's" "encrypt in place" +------------------+ "send buffer" +---------------+ "(no copy)" +---------------+ | "receive buffer" +----------------->| "send buffer" +------------------>| "encrypted" | | | | | | "send buffer" | +------------------+ +---------------+ +---------------+ ^ | | "read() from file" "write() to socket" | | "(copy)" "user space" "(copy)" | - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - | "kernel space" | | v +-------+-------------+ +-----------------+ | "kernel page cache" | | "socket kernel" | | | | "buffer" | +---------------------+ +-----------------+ libtorrent-rasterbar-2.0.5/docs/img/troubleshooting.dot0000664000175000017500000001402314152763504022335 0ustar arvidarviddigraph no_download { node [shape=box]; node_peers [label="Do you have any peers?\n(torrent_status::num_peers)"]; node_unchoked [label="Have any of the peers unchoked you?\n(peer_info::flags & peer_info::remote_unchoked)"]; node_error [label="Does the torrent have an error state?\n(torrent_status::error)"]; node_paused [label="Is the torrent paused?\n(torrent_status::paused)"]; node_end_error [label="The error string in the torrent describes what\nwent wrong in the torrent. This is typically\nindicative of a fatal error that, once resolved,\nrequires you to call torrent_handle::clear_error()\nto clear before resuming"]; node_tracker [label="Do you have any trackers in the torrent?\n(torrent_handle::trackers())"]; node_auto [label="Is the torrent auto managed?\n(torrent_status::auto_managed)"]; node_outstanding_reqs [label="Do you have any outstanding requests to any peer?\n(peer_info::download_queue_length)"]; node_interested [label="Are you interested in any peers?\n(peer_info::flags & peer_info::interesting)"]; node_tracker_peers [label="Did any tracker return any peers?\n(tracker_reply_alert::num_peers)"]; node_dht_enabled [label="Is DHT enabled?\n(session::is_dht_running())"]; node_dht_nodes [label="Do you see more than 5 DHT nodes?\n(session_status::dht_nodes)"] node_peers_for_sure [label="Do you know for sure the torrent has peers?"]; node_peers_connected [label="Were any of the peers connected to?\n(peer_info::flags & peer_info::connecting)"]; node_end_wireshark_tracker [label="Wireshark the tracker announce\nfrom all your peers and make sure\nthey all send identical info-hashes."]; node_connect_speed [label="connect_speed, connection_limit, ip-filter"]; 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(settings_pack::download_rate_limit)"]; node_dl_disk [label="Peers are blocked waiting on the disk.\nThis typically means your disk is overloaded"]; node_dl_socket [label="The peer is listening on the socket,\nbut no data is coming down"]; // 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 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()."]; node_end_no_peer_source [label="You don't have any peers and you don't\nhave a way to acquire peers. You either\nneed a torrent with a tracker or you need\nDHT to be enabled. The DHT will not help\nfor private torrents"]; node_end_dht_broken [label="The DHT is probably not working correctly.\nYou might want to add a DHT bootstrap node\nthrough session::add_dht_router(), or have a\ntorrent with DHT nodes in it, or peer\nconnections of peers that are part of the DHT\nnetwork."]; node_end_no_peers [label="The torrent you are trying to\ndownload may not have any peers,\n and all peers you may see are stale\nand not responding anymore."]; node_end_supply_demand [label="There might be a much higher demand\nthan supply in this torrent. Waiting\naround will probably get you unchoked\neventually."]; node_end_flash_crowd [label="The torrent might have a very large number\nof peers and only very few seeds. This sometimes\nhappens with torrents that gain popularity\nvery fast, much faster than the initial seed\nand early peers can keep up distributing\nto. Typically when this happens all your peers,\nand you, will get pieces in lock-step."]; node_end_no_download [label="This means the torrent is configured to not\ndownload anything. If you want to download,\ntake the torrent out of upload only mode. If\nthe disk the torrent is downloading to is full,\nor if writing to the disk failed in some way, the\ntorrent may have switched into upload mode\nautomatically"]; node_peers -> node_error [label="no"]; node_peers -> node_unchoked [label="yes"]; node_error -> node_end_error [label="yes"]; node_error -> node_paused [label="no"]; node_paused -> node_auto [label="yes"]; node_paused -> node_tracker [label="no"]; node_auto -> node_end_queued [label="yes"]; node_auto -> node_end_stopped [label="no"]; node_tracker -> node_tracker_peers [label="yes"]; node_tracker -> node_dht_enabled [label="no"]; node_tracker_peers -> node_peers_for_sure [label="no"]; node_tracker_peers -> node_peers_connected [label="yes"]; node_peers_for_sure -> node_end_wireshark_tracker [label="yes"]; node_peers_for_sure -> node_dht_enabled [label="no"]; node_peers_connected -> node_connect_speed [label="no"]; node_peers_connected -> node_end_no_peers [label="yes"]; node_dht_enabled -> node_end_no_peer_source [label="no"]; node_dht_enabled -> node_dht_nodes [label="yes"]; node_dht_nodes -> node_end_dht_broken [label="no"]; node_dht_nodes -> node_end_no_peers [label="yes"]; node_unchoked -> node_outstanding_reqs [label="yes"]; node_unchoked -> node_interested [label="no"]; node_outstanding_reqs -> node_bwstate [label="yes"]; node_outstanding_reqs -> node_upload_mode [label="no"]; node_upload_mode -> node_end_flash_crowd [label="no"]; node_upload_mode -> node_end_no_download [label="yes"]; node_interested -> node_upload_mode [label="no"]; node_interested -> node_end_supply_demand [label="yes"]; node_bwstate -> "?" [label="peer_info::bw_idle"]; node_bwstate -> node_dl_limit [label="peer_info::bw_limit"]; node_bwstate -> node_dl_socket [label="peer_info::bw_network"]; node_bwstate -> node_dl_disk [label="peer_info::bw_disk"]; node_dl_limit -> "Your download rate limit may be set too low.\nKeep in mind that it is specified in bytes\nper second." [label="yes"]; node_dl_limit -> "mixed mode?" [label="no"]; node_dl_disk -> "e" [label="yes"]; node_dl_disk -> "f" [label="no"]; } libtorrent-rasterbar-2.0.5/docs/img/storage.png0000664000175000017500000004023114152763504020550 0ustar arvidarvid‰PNG  IHDR,Y4ãQ@`IDATxœíÝ{PS×¾ðµU”„‡Ê;¡bUT’”€F$UèÈ«X`¤·=:ŽŠZµsl+ãµW­­Ž¯q®Öât®õL;Ø™:>êëTzà{èA½ÊŒb±\×ÇI"‚¸HPºïûœLº×6!ÉÎãûù‹lö^kí¸ãbíìßïǰ,K¤0Bê€ÿÂ$’Á$’eÿ‚a©Æà øÊÀÃâ½Æ‡|þ¨ð|¸’Á$’Á$’Á$’ñÖIH¯×›L&îç“'O °sBBBOOÏ mÚŽÃ>þøã±cÇÊd²óçÏ»¢}/ÅØ?Ç0Œ·<§×ë/\¸#fç„„„›7o³S“É´eË–’’’!Õ××k0"""!ÈäE×3€ßò²•К5kBCCçÍ›g±X¸-³fÍbÆ~³{÷îñãǯ^½ÚþXƒÁ™™ùäÉÁ–yí<|ø0--mÁ‚r¹œÛøøñc…BqìØ1†a233¹ÝöíÛ¡T*‹‹‹¹-YYY§OŸŽ‹‹“ÉdF£ñÌ™3£F2›ÍJ¥rôèÑUUUÏŸ?ÏÍÍ•Ëåááá‡æŽ:xð`tttPPPNNwjtË>ˆµÃ{éi Cbbb[[[]]]PPÑhä¶_¾|9??ß¶ÛÔ©Sìœ>}zMMÍ¢E‹ž5©©©Ü¯æÎ{ïÞ=–ewíÚ5nܸ   U«V±,ÛÚÚjÕ믿Îí¼cÇŽˆˆˆððð-[¶p/ß|óM¥R¹yóæ+W®°,«Óé!öEQíOðÙ³g½½½9992™,,,¬¸¸¸¿¾xíн777Ï;÷7ÞÉdö»Ùknnž5kÖ¼yó‚‚‚ Û¡û¢[! É ×3ýpÝHÄ F|ƒ¼ÏK]cô'Nä5¶wïÞððp…BñùçŸs[.\xêÔ© &¶´´°Ô'œÈ=¤GqÉ$D׫œ„è:ܼúÙ7oÞT©TÍÍÍF£Q¥Rݸqc×®]EEEÛ·o_·n]qqñþýû¹=y¾ûí·¾¾¾O?ýtÏž=öíÛ*jÓ}Ñíн Öüæ12™¬¶¶¶µµU«Õ ºº/1ÕÄa¨¯çþþsÏxèZüxèÏ—àµÊûÄ9±b=ýÉgñÃIÈ%qBt½j{}}}Ü‚u¸évbcc !iii÷îÝ#„èt:‹Å¢P("##+ÔB~ûí·>ø@§Ó­\¹’UÔö½+ŠAk~B¦M›–˜˜HIMMmnn¶Z­¼vf̘A%¦e:C˜ ®kÖ¡/‚õàékÕö[Û'ÎYëýäˆç’èzÕ2™¬¹¹¹££ãÖ­[¿üò ·‘®ÃÍ«Ÿ_YYi6›Fã•+W!#FŒ þ÷ñìÙ³eË–-\¸›ˆPEmº/š`ïtÍoZccc}}}{{{UUU\\œ`;´A«‰Ã0qvÙÿ, z0CE¾èkLð笊õô'Àa.™„èzÕcÇŽMKK‹‰‰Ù°aÃÌ™3Y–¬ÃÍ«Ÿ””´dɵZ­Õj—-[¦V«é¾èÊÜûÛßNœ8‘““ì»~ý:]Q›î‹nGLï‚âââ ãââRRR´Z-ÝŽcÕÄÁ)¸ÿ^¹kÃÍ]sgúáП/ú£?q‚M9P±^ð“ à0Ïz:ΘL¦Å‹_¿~]êÀà×ópî‰ u$ƒv„O¿¼ ;ü—Û>íþöß €xX Ïò®ëÙ»F .⇗ 3&|üñÇcÇŽ•ÉdçÏŸ~kz½Þd2q?šk !!¡§§g€^¼xÁØáýöÍ7ß¼sç!äÈ‘#±±±±±±ÿõ_ÿ5@kÎ=Sôs Þs;ÎzèÅ‹ÑÑÑ---½½½½½½Ão055Õh4ŠÜyúôéÏž=t·}ûöíÛ··ñâÅ‹ï½÷˲ …â×_ýõ×_cbbþþ÷¿ 6âô3gqâõìC­Ñh\±bÅP»ù¹p 1#tì,|›w]´NᒕЙ3gFe6›•JåèÑ£«ªª!;wŒŒˆˆØºu+·[VVÖéÓ§ãââd2/ÍÍš5kBCCçÍ›g±X¸-³fÍbÆ~%´{÷îñãÇs½Ù †ÌÌÌ'OžˆùóçÏ÷ìÙ³sçNBÈ_ÿú×Å‹'$$$$$,^¼¸¢¢Â¥g ÒãÇ űcdž±=9I_uý±ÿ\ìÛ·/""B©Ts¿åmyøðaJJJFFFppðªU«úk“÷¤GøüùóÜÜ\¹\~øðáþ΢¿Ï2ø2û‰8oîììÔh4¶—‚YèHlƒÁ˜˜ØÖÖVWWd[ ñò#ÐñÛÓ§O¯©©Y´hÑ“'O$½:tèÐgŸ}Æý¼wïÞO>ù„ûù“O>¡×LNøàƒóçÏÜN~~~ppð믿>sæÌ–––‹/ÚþÓO?íééÉÊÊ äîYs7»¸/`;::f̘ñ믿ÒÍ>þœ÷&ÔÕÕ-X°€·Û—_~©T*•JåW_}åê3§sâõìCmkkkBBB@@@rr2·…¾êhôçbÿþý‘‘‘r¹üí·ßîéé¡·p÷÷^}õÕrf ~y#lnnž6mZppðîÝ»çÌ™SPP@ï#ØŽ¿ñ®‹Ö)'>Ë»®gÏ-2€¸™g^.…ï'@2X Ïò®ëÙ»F .⇗›VB&“‰+d2°ììl†aÖ­[ç†! 48‘gÝŽ+---++“pK—.ýöÛo%€_qÉ$Ä?å~îêêÒét„ÞÞÞùóçËåò+Vp¿ãMGtÓè(kú(zz ‹7‡¦¥¥-X°@.—cÁàöÊ'=¸|ùòk×®½ûî»ëׯ¿zõêŠ+xõí[[[û‹ñ.++[»v-÷³`Å{/ÊZð(:[06Û>=BÞY˜Ífg¼[à*κžÝCêÿ ÀSH}%º›Kê iµÚÛ·owvvBjkk“““ÉïëÛwuuÙb¼ !\Œ÷Œ3xíV¼§»ãU¼<Š·}Ý,=B…BaÝÝÝNy»j¿rÉí¸ÄÄÄ3gÎèõúäääS§Nq“¯¾½˜ïþ*Þó𢬢#±Í!ï,`8\2 iµÚü1;;;++ëòåËIIIô>IIIK–,Q«ÕZ­vÙ²ejµúäÉ“ Ãdee=z”a˜8Vñž>ŠÞ‡ÞRZZÊ0Lzzúñãdžٱc=BW¼Wþ qBà³p=x>ÏzDü &!ø'½^o2™¸ŸÛÛÛçÌ™óøñcî¥ÙlNMMR‰H10 €€mÛ¶mÚ´)""‚{ýá‡Z¶`¨0 ÿb†a—vA—µ&T ôgŸ}¶wï^îWûöíûì³Ïâ<”““c ç¡ Éó·dzfÍšÐÐÐyóæÙǘ_ºt)//Ͼñ¥K—–——#2œÌ>hˆø_œø0Á빿‹ßÕìËZó¥;;;_yå•çÏŸ÷õõ%&&>}ú”‹¾qã†F£ijj¸^!ù½mã1 ‰‰‰mmmuuuAAAF£‘eÙŸ~úéøÝþ[o½uùòåá¿6. Vð@ô¢ÇYË ¶ÿgð,KAAAEEEww·B¡à6ò¥ƒƒƒsrrΞ=ËÕo íîîæ…Es¡Ó/½ôÒÀ#±’ç^ÒÛãÇç§©©I¯×‡……………ÅÇÇs{vttŒ?žn?<<¼½½}hïÀ€p;ü÷g½eøèT°¬5(ýþûïÿéO:räÈ|ÀÈ ‹ž>}zee¥˜Š×ö…äéÀmzzôèСC{öìqb+!ða¸ž<VB~DZ2öÈ¡®€•ø¬A¯gî©\ó&“iË–-%%%ï¶~ýúùóç¿õÖ[¶-'Nœ¨¬¬Ä·D0X ?â¾DôëásgÆNgŸò@§Ó¡ ¼2ö?V(ÇŽc&33Ó6 û< 9ÀuxáΊœœàõL_öîᆌ Ë—/¿víڻᄏ~ýú«W¯®X±‚¥r(p{Ú—±gY¶¢¢bùòå¶—‚yC\À_؇97<ˆõŒŒ Z­ööíÛ„ÚÚZ®¢1/‡‚tž…‰'"‡¸nÇ¿àþ좷 ߺ3cBbbâ™3gôz}rrò©S§¸Iˆü>‡‚ †aL&“ÕjåȦó,äP—Á$þÅ~ò𱌠Z­öÇÌÎÎÎÊʺ|ùrRR½]Æž¢ÑhŠ 4܉÷¤©³ZœàõÜßÅïjnVåe{ÆzàÞBh*¸ VBà/èuýݾcèÔb±äææ†„„¨ÕêÞÞ^n#¬úÚk¯:tˆb V-++ã‚U !\°jddäÊ{ÛÕÕÕ%¦wú(‚òÞàFȘþ‚eYâö¤¥¶`Õšššüü|«Õ:f̘ŒŒŒŒŒŒîîn½^¿dÉ¥RùþûïçççËd²/¾ø‚;VݱcGKK‹R© ;ÞQbz1bï(‚ÐTp#¬„À¿pwÜðmGÚòÞ"{§!4ÜhƒÏò¢R¬ŠÐTp¬„Àq«"©Gá¡ÁªM÷ÀJ|®gχ•€0™LÜÍ<ª¸¸8***<<|ûöí¶(ï ®€Iü—ÛOð.=:zôèÍ›7oݺõÍ7ß455qÛ‘C\“ø#núqÃwBÞ˜1!**êÎ;J¥R¡PDFFr³r(€«ØG®dL"x=Ó—½{xWÆ–e­VkaaáÙ³g¹—È¡.‚•ø û›oÎÊ•à«?~üoÿöoùùùo½õ·r(€‹ cø Ö.c‚ý—òÆŒ V«577÷È‘#öµY‘C\+!ð/ö÷Üð`‚7fLøñǯ]»–œœÌ½?¥¥¥9Àe'>Ë‹®g̘@Cp¬„$æ™hÈ¡®€•ø,\Ïž+!ðÈ×à«0 ÿBÆ„á0™L+W®t[wÈ×à«0 ±ÿ…{FΥݹ3cÂÎ;³³³ccc?úè£ÐÐЫW¯r¹¬Üÿ×ܲe ·ÿæÍ›‹‹‹¹N#""”J%÷RoÌ?V(ÇŽc&33Ó6û¾!YYY§OŸŽ‹‹“ÉdF£QðÝX¿~}HHÈ‚ æÎ{ÿþ}Áñ _ƒ/³b• cøúòvǨ?nȘ°k×®¢¢¢íÛ·¯[·®¸¸xÿþý7oÞT©TÍÍÍF£Q¥Rݸq£½½ýå—_¶Z­===“&Mzúôi]]N§3›Í­­­)))÷ïßlœ7f–e+**–/_n{I÷Ųì{ï½7gΜ†††žžž¾¾>úݸ}û¶J¥2›ÍÕÕÕ2™ìÞ½{‚ãA¾†`Uð¬å½-KAAAEEEww·B¡à6r9 Ìfs^^ÞÆm‚ƒƒ¹Œ ÝÝÝ\BÈ2&èt:‹ÅÂå|«¯¯çŽŠ%„¤¥¥Ý»woÆŒ™™™çÎëííÍÉÉ mll¬©©‰ŽŽæZ¨­­8q"Ý2oÌô‚}¬]»vêÔ©ý½---)))QQQQQQ†k‡ò5ø0ÜŽÿÂýñå¶oƒl9 ~øá‡gÏžY­VBHFFÆwß}W^^^RRÒÒÒByÿý÷ÿô§?9räƒ>à¤3&TVVr;`ĈÄ.+D|||ee¥Ùl6W®\IHH „lذ¡¤¤ä믿ްa!dêÔ©z½Þ–2.''G°ezÌ Ã˜L&«ÕÊ=´-Ø!„ËBÔß»e0::: Ã;wúò5ø0LBàÜ6I›1!))iÉ’%jµZ«Õ.[¶L­VsMõõõ7.>>ž¢R©òòòÔjuPPÐ;ï¼ÃM“<‚cÖh4< á¾ìkÐw#99Y£Ñ(•ÊÍ›7«Õj†aǃ| > qBà³¼èzöŠŒ .ÕÜÜìŽ×rkk«í“þúë¯sûìØ±#"""<<|Ë–-,Ëré«çÍ›TXX(ج˜vX–]¸pá©S§&L˜ØÒÒ"¸eïÞ½ááá …âóÏ?çzç©`_ñññ¿ýö›ý¨~ûí·—_~ùÿþïÿ†øož“ø,ÁëÙmÓ2&Ð-³"ŠpF™LV[[ÛÚÚªÕj ƒ`ËŽóæm¡3&ÐgJ÷Å"‡‚OÃí8ðö7ßèǽ†c€N-KnnnHHˆZ­îííå6r9^{íµC‡BlÊÊʸŒ ä_™"##‡TÞ›×2ÍV„;&&†+ÂM™6mZbbbDDDjjjss³˜7S°[1ï1cÆp5^y[l"##þùçÚÚZúL»C†Iü÷g½eøèÔÍå½+ÂÝØØX__ßÞÞ^UU'ز˜vÈï‹yÓ[3&ðÎ”î‹ ‡‚OÃ$þÅ~òpà î̘àp¸Â¸¸¸””­V+8ŠyÓÄ”§û"È¡àÓ'>Ë‹®g 3&˜L¦Å‹_¿~ÝÍýr(ø*¬„$æQ$É r(ø*¬„ÀgázöíííÙÙÙßÿ=âc6›sssËËË4?„•€/C)x:ÞC>Îz^@rƒ^ÏôGÀ ØÜ±cÇ›o¾©T*7oÞråÊ– =pàÀüÇp þû¿ÿ;w ¯‚LÁóaŸ%x=÷÷˜ë °¹k×®¢¢¢íÛ·¯[·®¸¸xÿþýt(h{{ûË/¿lµZ{zz&MšôôéSÁRÙ4™‚‡CyoðôÓØÎz>›ð›'[À&÷’.qMÑét‹E¡PDFFÖ××ÛBA !\(èŒ3233Ï;Çå ,•=èP[æP̘SRRxÈ»C) ß ¿àþì²ÿÙYízЀM.¿€mR ݰaCIIÉ×_½aÆþÚ¡!È<&!ð/Ü£nS혀MÁPP­VÛ××7nܸøøx‘홂ÇÃ#Úà³½ž¹y×¼K!ȆI|–_]Ï===2™Œ·ñùóç£FIü½o{{{nnîŸÿüçððpBÈ£Grssÿò—¿àvp0 ÏÂõ àùð8ÍÇ{øðaZZÚ‚ är¹mqðàÁèèè   œœ‹Å"Ø]VVÖéÓ§ãââd2™Ñh䌈ˆP*•ÅÅÅ„ºez„;wîÌÎÎŽýè£BCC¯^½J·C;sæÌ¨Q£Ìf³R©=ztUU!dÖ¬Y ÃØ¯„htË]]]—.]²–²téÒòòòþ’À‹ñœ? !Á뙾ìÝÃ=å½ËtÀ!ÁAdv†ÎÎNFÃÛxùòe.¯MYYÙÚµk¹Ÿ[Fž¿‚Œ à/샜$Äö¿œ²X,ÝÝÝ …‚ÛÈá6›Íyyy7n´•÷æÊ{wwwóòˆ,ïí@¦ÁÒÈÎ †`ËȳàWp;ü÷g½eøèÔÍå½ÉÐ3Ž—ÁAdv¶Œ< ~“øûÉÃÇÊ{ÓÄd: GèX;´ÒÒR†aÒÓÓ?Î0ÌŽ;Nž<É0LVVÖÑ£G†9pà€`ËȳàWðtø,/ºž%,ïí™gÁ`% 1*ïí!½£˜·ÿÀJ|®gχ•pVîÇðúréQÈÎ -¬„Àg!c‚ “É´eË–’’’öqbî ‰9S‚ì RÃJü‹ý׃>`=|nΘÀk™Pù?~¬P(Ž;Æ0Œ­êsð<|ø0%%%###88xÕªUÜF:ËÝ×Î;####""¶nÝ*ò(úLé÷™ ;ƒ'à…;8+r@rôåí†QÜ“1ײ`>‚ŠŠŠåË—ÜŽ³rðF™LV[[ÛÚÚªÕj Key ûºyó¦J¥jnn6*•Š{z{Уè3¥ßgÙ<2&€¿`Y–¸ýœ›3&ðZv]¦šÈ¾¦M›–˜˜HIMMmnnNNNæeyl9===66–’––vïÞ½3f z~Ÿ !ÈÎ 9ÜŽÿÂýñå¶òÞnΘÀkY0Ã0&“ÉjµÚ€v ‘YëëëÛÛÛ«ªªâââ¸öYhñññ•••f³Ùh4^¹r%!!AÌQDèLé÷Ù$‡Iü‘Û¦"wfL [ÌG ÑhÄŸ¯çÔÔT£Ñ(ø«7ß|“b{ªÍ¹¶mÛxîÜ9nˉ'ìŸXs¸÷¶¶¶W_}Õö“Édš={v{{»S† ÂJÀ¿”–––•• ¼ÉdZ¹råP[îëëûꫯêëë-Kvv6·qéÒ¥ß~ûíz´mÛ¶M›6qÁ³„èèè?üÐ6Þ “ø/7Ü#rs°êš5kBCCçÍ›gÛaÐRzÁ€Vw–÷¦CnRêËì—EÄo_€ï¼žû»ø]Í Áªƒ!11±­­­®®.((Èh4ö@:h)/ÌÓÍå½yï‹RŸ†`Uðô¢ÇYË Ö3Ê{755éõú°°°°°°øøx".€ÔYû8F°eÞûCRêÓ0 ¿`í2&Øoq)[°jMMM~~¾Õj3fLFFFFFFww·^¯_²d‰R©|ÿý÷óóóe2Ù_|ÁH«îر£¥¥E©Tö×—R©¬®®îèèøÇ?þÑÐÐ@þ@zñâEÛW)4Á}laž]]]ááábÚqŒ`ËôûƒR†ï„À¿Øßð±`UN§V«'L˜PTT¤R©X–¥HE™òÂ<ÝYÞ[ðýAH©C°*ø,/ºžý$Xu8Rê«°Ê{‹R_…•ø,\Ïž+!_æÒ"Ü4Ç lÓPrÛ`%>kÐëÙ͵…¤âáE¸¡ä¶ÿÀJü÷5÷ŒœK;rsÆ1ûð2Ž.žÍ#X¨›Î@gC GHïƒüþÅþ‰U‚Œ àC¯gú²w7dLèo‘E¸íG(X<Ûž`¡nö÷ùè¾è Žùü ‚UÁ_؇97<ˆõŒŒ "÷áe(?~<=B1ųéB݃öÕÓÓá`ÆäGð+¸þ‚û³‹Þ2|têÎòÞbö¡‹p Žˆ(ž-X¨{à¾è G~¿‚Iü‹ýäácè}Äd( G(òÔx…ºéüt_ôs1 ?‚_ÁÓqà³¼èzöºŒ ®.Ôüþ+!‰yxÆI u#?‚ÿÀJ|®gχ•H“H“H†¬ê†¯8øæ$ƒÛq LB LB LBžŠ€Ã$’Á$äѸeCà«0 €d0 y.äߟ‡I$ƒIÈCÙ/ƒ¸ ÒŽÀ0 €d0 y(Þ·Aør|&! &! &! &! &! &! &! &! &! &! &! &!ðDííísæÌyüø1÷Òl6§¦¦>yòDÚQ€Óa&“iåÊ•öµmÛ¶M›6EDDp/£££?üðí[·ºgHà6˜„|ÇÇÓÒÒ,X —Ë ¸ûö틈ˆP*•ÅÅÅ„Ng±X¸_uuuét:ºÇ+ŠcÇŽ1 “™™ÉmܹsgdddDD„m&ÈÊÊ:}út\\œL&3‚[x½Ó#ì«««ëÒ¥Kyyyö£Zºtiyyyww·“ß5 žMü¿‘Ñh ¼víÚ£GbbbÌfs]]N§3›Í­­­)))÷ïß_¾|ùµk×Þ}÷Ýõë×_½zuÅŠ‚MUTT,_¾ÜöòæÍ›*•ª¹¹Ùh4ªTª7n°,ûÞ{ïÍ™3§¡¡¡§§§¯¯ÞB÷Nî‹eÙŸ~úéø=ª·ÞzëòåË"ß ð £¤žÁ™^yå½^O™2eJwwwcccMMMtt4÷ÛÚÚZ­V{ûöíÎÎNîerr²˜fÓÓÓccc !iii÷îÝ›1cF@@ÀÚµk§NjÛ·…î=%%…7BÁî:::ÆOooooõF€—Àí8Ÿ2räHû—S§NÕëõ­­­Ü_999‰‰‰gΜÑëõÉÉɧNêobÆd2Y­Ö¶¶6BH|||ee¥Ùl6W®\IHHàv åh¿…î!Ý!dܸq‚Ï ´µµ………‰~3À `òe*•*//O­V½óÎ;V«U«ÕþøãÙÙÙYYY—/_NJJL9xðà–-[¸7oÞÌe@à%D =|ø0%%%###88xÕªU‚- &Mèíí?¾\._±b…ÈS8sæÌ¨Q£Ìf³R©=ztUU!dÖ¬Y ÃØ¯„hƒžýþ8–T‚>wBÈúõëCBB,X0wîÜû÷ï‹€ïp|, ‰{þ¦NÚÐÐ@o¯¯¯Ÿ4i˲ííí/¿ü²Õjíéé™4iÒÓ§Oé„ôáF£Q&“ÕÖÖ¶¶¶jµZƒÁ@·ÌRIx‰l‘FƒêììÔh4¼—/_ÎÏÏ·ßRVV¶víZîg1gÁ ½?Ž%•àûíÛ·U*•Ùl®®®–Éd÷îÝ9Ÿ•BÈÑ£G·nÝúÚk¯:tˆb±XrssCBBÔjuoo/!düøñ™™™çÎ;uêTNNNhh¨-!BddäÏ?ÿ\[[Ká ÃØî€M›6-111"""55µ¹¹™nY—X!22rÊ”)]]]®;qÁ³ ñÞÁv¸¤111\R b—Bb̘1#FŒ Ï½¥¥%%%%**J§Ói4ñã𘄀B222¾ûî»òòò’’’–––K—.uvvÞ½{÷‡~xöìgºaÆ’’’¯¿þzÆ ¤Ÿ„¶dt¶;`õõõíííUUUqqq‚-ÓIèÄ ."x4ÞûCYLR úÜ£¢¢ CGG‡Á`¸sçŽøñø LB@¬Vë¢E‹d2YttôìÙ³cbbRSS[ZZ&Ož\SS“À}¢ÕjûúúÆOD'Dˆ‹‹+,,Œ‹‹KIIÑjµ‚-ÓIhOŸ> üûßÿ.þ¼JKK†IOO?~ü8Ã0;vì8yò$Ã0YYYGeæÀb΂~è1‹I*AŸ{rr²F£Q*•›7oV«Õ ÃŽÇsðˆAñt^'d2™/^|ýúõá7uîܹ‹/–”” ¿)ÔÜܽ²²’Æ-Ó¶ƒ¶,ò¼FŒÁµß_;J¥²ººº£££¶¶¶¡¡ ļ&!ês”c5¿é€MÁPPÚ ›tËth*½…> ­V›ŸŸ¯ÓéärùÂ… ŸÒ,À@4÷üñnÇ]¼xÑþ"ùôÓOOœ8a¿å?ÿó?Y–Ý¿dd¤\.ûí·{zzèf¹ûi¯¾újPPЪU«¸|ðÁùóçè‹eÙO?ý4,,,""bïÞ½âjmmMHHHNNîoÞ˜{zz²²²¹o­l7úÀ=ðtœ§óê8!'–÷Ÿ„Ûq /þ+ÛOxõJ``X ¿0™L\-Ÿ B¯×›L& Àaò;&“iåÊ•þÙ»¥¥¥eeeRÀ_`ò)tZ^‚:­€ýú --íþýût;>LKK[°`\.·={-&ÑoÁ¤ƒ&Gxþüynn®\.?|ø0·ÏúõëCBB,X0wî\ñ¦o „ôööΟ?_.—¯X±¢¿ÞikÖ¬ 7ožÅbá¶Ð}Ñï<ˆ"íÃy0¨!ýñÒ &à¥0©©©ÜÏsçνwïÝŽÑh ¼víÚ£GbbbÌf3+.ѽ¯wñÉX–­¯¯Ÿ4i˲·oßV©Tf³¹ººZ&“Ý»wOdúû³hmmìý}bƒÁ˜˜ØÖÖVWWd4ûêoÌ0°QRO‚àL¶´ÜK[‚îemmíĉ8¼¯¯O°BÈ+¯¼Â-˜¦L™ÒÝÝMþ•hÀl6çååmܸQ°ÁA÷±%G „pÉf̘ÁëÝb±TTTtww+ BHKKKJJJTTTTT”F£¦ögÑÕÕ%Ø;簾&½^ß__ô;bàvœ¯±O+ ˜ €—V@&“577wttܺuë—_~l‡2räH^Gb Ðûðz“áÒ¥KwïÞýᇞ={fµZ£¢¢ CGG‡Á`¸sçNgJãE½ÛS*•ÕÕÕµµµ ô5hB aòe*•*//O­V½óÎ;V«•¢Ñh “H“H“Hf”ý D¥ ¾Æoï5>?ÿ䆷ã@2˜„@2˜„@2˜„@2˜„g2™ôzý »egg3 ³nÝ:úWz½Þd2¹`hÞÁë'!“É´råJ©G1ÒÒÒ²²2©Gà‰¼lÚ½{÷øñッƒW¯^Myüø±B¡8vìÃ0™™™Ü>;wŒŒˆˆØºu+·%++ëôéÓqqq2™Ìh4>þ<77W.—‡‡‡>|˜Ûgýúõ!!! ,˜;wîýû÷ !ûö틈ˆP*•ÅÅÅý§··wþüùr¹|ÅŠýõN[³fMhhè¼yó, ·…î‹7fÇß2OÆÚá½ô@S§Nmhh°ßRQQ±|ùrÛË›7oªTªææf£Ñ¨R©nܸÁ²ì{ï½7gΜ†††žžž¾¾>ÛÎõõõ“&MbYööíÛ*•Êl6WWWËd²{÷îÕÕÕét:³ÙÜÚÚš’’rÿþ}z0F£100ðÚµk=Љ‰immìeÙ²²²µk×r? †ÄÄͶ¶ººº   £Ñ(ØWcçù"ÂVõpGݺu«ÙlÎËËÛ¸q#½Cccczzzll,!$--íÞ½{3fÌX»víÔ©S¹},KAAAEEEww·B¡ „´´´¤¤¤DEEEEEi4®šššèèhîÚÚÚ‰'ÒݽòÊ+Ü×BS¦LéêêìwHSS“^¯ ‹ï¯/Þ˜Á0 Ã"à÷¼ìv\FFÆwß}W^^^RRÒÒÒBaÆd2Y­Ö¶¶6BH|||ee¥Ùl6W®\IHHà µ5réÒ¥ÎÎλwïþðÃÏž=³Z­QQQƒ¡££Ã`0ܹs‡2uêT½^ßÚÚÊÍÕ999‚ã9r¤ýËþz·§T*«««;::jkkèË~Ì>É›&!«ÕºhÑ"™L={ö옘BˆF£yðàAHH÷PRRÒ’%KÔjµV«]¶l™Z­¦ÛIMMmii™|˜’’’‘‘¼jÕ*Bˆ`n‚Õ«WÍ;7==Ýd2Ù¯iÒÒÒÎV@÷õðáô´´ Èåò‚‚î(:[mÐÞEfj yZƉÙG®’¡{ÓÙŒF£L&«­­mmmÕjµƒÁ¶³-7Á`HJJzüøñ­[·är¹Ñh4©©©ÜnsçÎu8[Ýo³ÙLg+à±Ïh ¦wV\¦šGe|WàC4¤Ï—³Hüÿ x?W_¢ŽgL ³(ŠiÓ¦%&&BRSS›››'OžÌËMÐÔÔ”šš>eÊ^›}}}ÄÑl£GæõÅÛ§»»›ÎV x^bzôÝ s%ÏËøþS8Ì åê¿'˜ ±±±¾¾¾½½½ªª*..ŽÎM T*¯_¿ÞÞÞ~óæÍÆÆFBˆL&knnîèè¸uëÖ/¿üBÍV@÷EïCg+ ‰ì]d¦OËø -Ç'!ÁÜqqq………qqq)))Z­–ÎM Óé’’’¸|Ó¦M#„Œ;6---&&fÆ 3gÎdÍ @÷EïCg+ 3ˆìÝL žŸñÀÍœ'd2™/^|ýúu‘ûëõú .pÿƒS ãƒä<-NÁI0n¸~ðˆ¶8ã€gî$ôñÇ;V&“?>&&Fü2ˆrýúu,ƒœåÀ]]]mmm›7o–z, Ì+V$öŸhnËÉ“'mÁÝàlÚ„úúú¾úê«úúz‹Å’í¬1 rgP'HÁ? ~¢—.]úí·ßÚöqV¹z|Ê€ãø$tæÌ™Q£F™Íf¥R9zô說*""Ð’nG0ô’DZ NÁ-¼N: U°/gá²ßJ= ‚ŸèY³f1 c¿¢‰ ‹F˜6ô‹×6¤ £ÎÎNFc{9¤@Kš-ôRcA¼-t'ÐJ÷ žà‡¨¿OœTãéï͹|ùr~~¾ý‚»¦í¥ÜpÅ:³¼·˜@Kzéľx[èΔ”^@«C§ Œ^ôxæ2Èa"⦠ýqæÓqb-i‚A¦4‚:é-‚!œ¼€Vº/‡ÙþœämqWŸ È°h„iCœ9 ‰ ´¤‰ 2%uÒ D&ûYÁc¿¢•––2 “žž~üøq†avìØáXp7´a(jàLžö!ò´ñ¸´]ÁªàMzzzÊ‹/\×#´½VB΄´=àK°/¦×ëM&“«âåtï‚Iúåy x9À»`€4¯³€Î9BY³fMhhè¼yó,‹àQD(› ï(ÚÇSRR222‚ƒƒW­ZÅm¤s:Ð<”““Ã5ެ „Rà€?0À‡H’Ï×:4¯-gsÄ`0$&&¶µµÕÕÕFú(–ʆ0ÀQ6F£Q&“ÕÖÖ¶¶¶jµZƒÁÀm·Ïé@gL¸qã†F£ijj²µƒ¬ â¹á¢ågLð–pºAóæ7áåijjÒëõaaaaaañññýň@%hÚ´i‰‰‰„ÔÔÔæææäädÞtÆ„žžžôôô—^zi€}UAB¿›„X ÊË9¢T*«««;::þñ444»L¶£ÆŒC~Ÿ >JPccc}}}TTTUUÕÿøGz.cÂÅ‹#""¸-µµµ;vìhiiQ*•ýíÂwB@ˆ¸¼bò›èt:µZ=a„¢¢"•JŲ¬cG 2..®°°0...%%E«ÕÒ9èŒ Z­6??_§ÓÉåò… >yòY< bÜqBÃd2™/^<¤Ê™0Lˆ_†I†Ë=EÁcbb^! ÕcùÎRÀÃyþí8“É´eË–’’’!uÑ××k0¸ïùw+//¿pá—_~9¤ÆAZ¸n"²ä6늂ïܹ3;;;66ö£> ½zõª`¨,/|UL@«`€-]&Ü“BHDD„-4õÒ¥K„[·n:uêæÍ›¿üòË…  }ÔÛo¿m_<--R]]}ùòåúºsçÎÙ³gïܹS[[{üøñÐûŒ9rúôé«V­²X,»wï¾zõj@@À÷ßßÝÝýßÿýߟþ9·O]]ÝáÇïß¿_]]}óæMz =ž‘#GÖÔÔìܹóÁƒ?þøã£G~ùå—¿ýíoÿû¿ÿ»wï^ÁÓ×ByoıøÁ’ÛÎjYL¸¨N§³X, …"22²¾¾^0蕾3h@+¡lé2áà6CX ¹:y€ÏsÝ'Ù)D–Ü>‘E¸GŒAìþü¥Ë{“…¯¶··WUUÅÅÅ n¡ñlé2áà6¸ÿä@Émš³Š‚Óƒ^yá«ôzúè#4M›ïªH$ ó|W@"™>ÌÀÀ.— ›ÍF?étš%K–pîÜ9^ýuþüÏÿUU9þ<‰D‚ææfÇ|W]"Y0H"¹æÐ4§Ÿ~šÕ«WóÒK/qêÔ)Ö¬YÃSO=Eee%V«Ã00 ƒ]»vqážxâ )@$’Q(ÒWr-²sçN‚Á •••tvvâr¹p¹\Äb1’É$&“‰x³Yα$’ÉD"‘H$ÓBÑ%‰D2-JZŸkšF.—Ãb±Íf±X,är9L&º®£(Š\êK$ÉE×u Ã7–~ªêÔ×%ú¿øÅ/8{ö,>Ÿ*++ ƒ”••Çñx<<ùä“X,R©™Lf¾Ÿ—D"‘\“¨ªŠÓé, Ã0øùÏŽËå"‰ …(++ãܹsTUUÑßßϺuë¸ÿþû§|­’H$áĉôõõxï½÷ðûý„B¡¢ññ±ÇCUU^zé%œN'&“i¾Ÿ£D"‘\S(ŠÂàà ·Ür ÅωÁ`S§N¡ª*ƒƒƒhšÆ{gÏç#›ÍΞY±bƒƒƒÜ|óÍÅÊ RQQA$¡¢¢›Í†¦i8N¶oß.UZ‰D2ìÝ»—t:]ü]×uTU%“ɰnÝ:úûûiii! èïïgýúõÓºVI£ü7ÞȦM›.k‘ª«ùÇ@8Õ)(ó]‰dV9~ü8Á`pZºû™À0 E󻪪¨ªŠ®ëűñbEAQ”¢]Àd2]QäÃ00›ÍlÚ´iÂë=òÈ#Åë躎Ùlg™% “ÉTTIÙl6¬Vkñ˜dæÐÐØÏ~Ö²;ö)ÿ‡0cf kæûV$’YÃ0 NžâöÛo§¦¦]×Éf³(ŠBoo/lÞ¼€l6ËÞ½{Y·n^¯W¦©Nسg+W®'´E)ŽÛ£)|6ѱR‘z¦F–,?ãg,eé”Hš4ò!TH"¹ª1 »ÝNCCN§sV®ñÆopþüy¬V+º®ÓÙÙ‰aTUU‘Íf9uêO>ù$uuu¼÷Þ{8B¡;vì ¼¼œššŽ=ÊñãÇ1 ƒx)@©üŸé¨ ttj©%Nœ œÌNÇ’H®ÚÛÛÉf³$ ^zé%***Xµj‡Âb±àñxŠê³ºº:öîÝ‹Ýn§¢¢MÓˆÅb¬_¿EQÐ4_|‘¡¡!î»ï>’É$Ùl–Ý»wSSSƒÕjeppeË–¡¢²œåäÈ•$@lLq¥\¤›nL˜¨¦z¾«rY‚)£ “«d/{¹‡{Æ40+VlØÈ‘›ï[‘H£gè«z.>öéOš®®.ª««yä‘Gж‚*+‘Hà÷ûXºt)=öŠ¢póÍ7S]]M"‘ ºººhßhjjBQR©+V¬ ¬¬Œ¡¡!jkkinnÆãñ ¢RFÙ|?ª’¸&v¢2Hà|W£$ܸ/yN˜0ðÁ|WU"™7TU¥½½ÞÞ^@ þ©TŠÍf‹Fl]×Ñ4­(Òé4¯½ö™L†\.7FhìØ±ƒ§žzŠ}ûöñì³Ïb±XèééÁëõRSSC"‘àСCÔÕÕ‰D¨««+ÚG’É${öìahhˆîîn"‘û÷ï'‰ë[WWG]]åååhšFuu5ŸûÜçØ¾};Éd’²²Å!4F³ V qâ˜1Ïø’ì'pà`5«çû%É Ñ××Çüc@€Þ{ï=þèþˆ7Þx·ÛÛí&›ÍòÈ#àr¹ˆF£ìß¿—ËÅŽ;hnnÆ0 Ün7¯¾ú*÷ß?V«•'Npã7²oß¾âÞ·`0ÈÙ³gæ7ÞàñÇgûöí8p€ .0<<Ì /¼ÀC=À+¯¼‚ÍfC×uâ±8º®ãp:8rä·Ýváp]×y÷ÝwùÊW¾Â²eËÐtSij—Weø^šýõóò”ÙÁ¢Dù Ÿ™Ñr tôIçÈñ°™Í8˜ßpÝ ¤H‘&}å…I$W1»A"‘àìÙ³Øl68yò$‡¦µµ•l6ËÐЙL—ËE*•¢££ƒcÇŽ‘J¥ŠžRn·ŸÏG}}}q·öÐÐçÏŸçäÉ“ìÙ³‡eË–ÑØØÈ±cÇhhh`pp°è[UUE&“AÓ4***Èf³¤ÓiZ[[‹+ ]{v òЃ‘J¥ˆÅb¼ûî»Ô××c·ÛbÙ²e(ŠJ·’œ®]Öj6óô\pg‚%@ttR¤f¼\…(Q &vË‘ãE^¤•Öy ƒ ²œåôÓ?©Í&I’a†‰§îRQI‘"D/Þy½ÉÕÇv°ŠUTQ5¯õ0 ƒææfî¸ãš››yþùç©®®¦­­ UUY¿~=‹¥¸ »`_°Ú­<ñ…'ð•û°Ûí(ŠBCCCñ§Ï磿¿ŸOúÓ8N~í×~T*E `Æ ¬[·]×±X,D£QL&†a°lÙ2>õ©O¡( ëÖ­£©©‰d2I]]f³#g°»y7wq-©Š«¦êêjî¹ç|>ª¢PîðÌ÷«.‰#@räd®Iúéð>ïÓM7¤HM( Žsœ(Q’$çû1`ÁB 5—¼ÿÚh#IrœQP¨£Ž8ñù¾ÉUÈ›¼I B€”——³nÝ:ìv;?þ8v»}Ò}i†a€‘ʾ€•ÆJtC/nêhhhà•W^áú믧¹¹™¾¾>8Àƒ>Ȇ °ÙlãÊbïÞ½lß¾%K–ÐÔÔD6›åÀ”••QVV†bV0-5aÆL]¤Žî¾njkkyâ‰'Ð4'N\vCd8  Ì’×ò´˜S¢¡1È T`Å:明Ž/6l3*@B„¸“;é cRϤ8qîã>†¦‘ƹ|$ÓÂŒ2L¼óß„©øü ŒâjäRž]’kƒ:¨¥v\?¼Q¢¤IÏ«ÛèD¨ªŠËåºä9o¾ù&çΞ£×ÖKƒ¿×Û_ÇÀàæ›ofÓ¦Md2ž}öY^yå•b†Ê;}ûö±mÛ6^|ñEt]Â@QøÄ'>ÅbáÍ7ßà…^àÃ?äÖ[oåÂ… lÛ¶ÞÞ^~ùË_âv»Ñ4 ± œä$à søèa¶ßµh4JOoÁ`›ÍÆüÁLXÿx~þsðùàÞ{… YÌ©9ËYžæiîã>6°aÂs’$ÑÑQgÈAÌŽ&šè§Ÿð0~iXð|š©k^) ƒ NxÌÀ ‡衇zÆÏtôâj*HÿÉÿä+|…rÊçûÖ$ €9þàvng;ÛKþÞ0Ã8p,Jñ½{÷ÒßßOÇPª/Ð{¬—|•+WH$Ø·ov»;wÒÔÔDOO‰D‚Ý»wóî»ï’J§¨\R‰ÑØ|ÿfÀï÷ÓÑÑÁñãÇ9yòdQ¥ÕÕÕE*•¢¾¾žt:MVÉÒ¾·Ü`ç£NÒ©4{ú÷plç1*̸Ü.n¿ýöIëoµBC”•ÁB þ1§$Mšë¹ž(ÑqÇ {R¤ˆ¥‚н¶_1NÔBFG§Š*:è˜ð¸††'4N¨¦20ðáã8ÇÑé-,éŠdA0Ì0­´'ކVòÊ4L˜5¬¡Ÿþi{4žç<6lÔP3§÷ü¹Ï}ŽÞž^ÕâØ…cüú£¿NC}n·P{½^¾øÅ/‰D(//'‘HàõzyôÑG©­­åË_ú2‡ËóÊ™W¸ùÜÍœ0Ÿà#>â··þ6BkñÙÏ~MÓ‡Ã444ÐØØÈ’%K°X, ä/‹ýh©j~èav4ì@ÐØàÙÀòUË©««›´þ Üv¨ªø»P˜S!‚3 ㎠¢¡-š~6æçh¢‰$É)uînÜE/®óœ_4›’$sCŽĉ“!S²ãH?ýTRyE+õ=ì!FŒ/òÅ¿¯l6Kgg'MMME[EaŸGCC DˆmÌbÏØÉõ䊑jUU¥µµ•;vPUUEEE?~œ›o¾™––úŒ>¶4ná×îþ5™áÄI<§§§‡­[·Ž±d³YvîÜIuu5‹…Aó -+[H“fi|)Ñ¡(úëŸ\Ï=ê=ôë+ÆœŒ…¢¶Íœ !Ö³ž}ì%CfŒþ5GŽjª‰g|„,Y^âE¶qǬ „fÌôÐÃZÖÎå#C„KYJ#à ªÜ&#™ÿãÅ‹N”(!B4Ñ4¡s‚–üɵCaRa`!R²10¨¦š~ú§}írÊé¡»d;gŽ'9A Ë/k{éééáë_ÿ:üÇLGG.\ “Éà÷ûEÜ©à0§§î¦£ºƒþçûù“?ýjkkÉf³¼ôÒK<÷ÜsÜtÓM(ŠÂ–-[xï½÷زe /ýò%ÞWÞ'çÉòÏü3mk#cÉð£7D}¦ž×^{pã7rá¶nÝJ{{;ÃÃÃTVTò‘öÁX>úR}v¼¹ƒ®Á>”fʾJëMkñdªé1µ£å4vïÞ;}ûH&“†Á’%KŠù‘B¡aö¦÷sðÍÃ47ð›¿ú%²é =‡ñ÷`·Ùðz½\ýõâFü~xà!”ËYÃïü¹ëÏ™I`8&1há‚Ö‹rÑ=§Is*xžƒï÷°b[Kq`ìÓû±^¨À¡x)L”zéåoù[~‡ßa)KÇ”ó/ÐJ+ËY€{ØGÛÏ@,ÈÑÄ Z­+ÇœŸ#Ë©áîQW‘ åæU€XRv†;2ØWX© ×¢T˜Æ¼.ºø.ßeeªªjLæ1Ä’pМ^Fu¥žZBåav?È-ÚPÜãâ0ó²ïF²piÏvÐߣ/Â0R¶‹…UÂ>ö±‡=DC:÷X>†6¬OK€èœ\àcÉ{ÉE§ÐJœá ×sý„ßÉå4‚Ç5R7eÆô…BL©sçÎáp80 Ã0غu+±XŒµkײtéRÊÊÊÈårdÒub齫©¯]†mƒ›ì7ÑÝÝÃá@×un¼ñF‚Á >Ÿ¯˜š{Ù²ed26]¿™f%I°g€ÎóçÙ}á¡*Öø7`R2lܸ‘M›6‘ÍfF×uMMMx\ŽÄÏP“l¢Âð1¦¹qU.èâŠI¥ººšT*ÅÙ³g…HµO!w6‹rö,Á`pÂü#³Éœ aBرSfõbVÇëõûè£R­Ä¬Ž]·sž iˆ.¥‹U?ë4iV³zœ1~ˆ!Þâ­1:‹j¢Úã£CsÑCh⇠ª\å D'>>g(à´Ú©rWNE¹Ø'Ž;†n›ƒ}ê^nµzP€r‡‡jŸsC=$H2ÄPþˆd¡RÈ+4ã¨aˆï©êå'©£‰ã|œ•¶åS$H`’=?çç 3ÌQŽâ6USåòs&~~Âó;餌²IÕ®`RLøåÅ®“Nžã96²qB{ßy:8eœ·GKQÖ¬YC0$•™µ´´‹çd Em ±ô–%øÌ~ªRu˜)V®X‰ŽÎðð0ÍÍÍ,[¶¬˜(Ê0 êêê0 ƒ@M'‡;© ÔpÃÍ7°KÛM¥@CcIcú¨˜ZK–,A×uÊËˉÇã¤âIR¦$­+[Q“–—Õ±BYÁ‘þsÔlóSéóÓTVMNÓŠu™*†a°|ùr<Ïœ†tŸ3#Fµ$'1À™1áÁ3΀ž&…'9Á]l„^ԆƜ{„#lbaÂÓªcˆÐ´ ×3E”(Ò“.çîç>üÔpžÁI÷\üY†ãÙ–#G Ü2Ïœ< Ñ(lÚTº‹f,»vÁ 7×ÎRf?~t ꨿ä†Ó0aÞç}̘YÅ*Ò˜0ÐÙÍnna#拆÷xjØÆ¶‰ï2ìe/kh!NœIgrd)£*++ ƒ”••Çñx<<ùä“€Ø@F1›Í8Îâæš¨§‘ž v¡kh„Si àRœäÈ’$ 1bøð‘FÅ@'K–±bXŽÂ†¹9Ê)Ç…‹±üð[XرӗW )ù†PØØ˜"ŠJ-uÓ**ÕTÏØLB¤©´ÓE׳iZeèèhhÔR‹žŸ9]|܇oRŸþnºùþ…ÿ™‘{’,,Lª §ÓÆŽänb}ñs 0aÎDZcg»¨§ž³œå0QÍÒ1@AÁ‚…HÞö¡ ÐM7µÔóòW:–Mø,—Q¥Í…}3wåÑaí§BI­ã —Ëa±XЏr¹&“ ]1õÍf3™ÌåÝJAÌnÓ“¸ *(4ÐÀ?òcæaräP° €>êå‰Y@9ò!m´±‹]´!vª&IN˜liôwk¨!I’ƒWîT±`¡‚ŠâŒ=W‰M% c¼‚ är:zÖ›hÔ!Bl`6ì@P0a"Mš!†ðãSV=õle ñ|˜’)tt2dx†gh§Zš°ãÚ°aÇN'´Ì€•Ì?B¥›ÆÌä›Ô2Z–ªd=ö^t³N:›%’Žáw^ÚW¸`ÛL˜TÝ&BŽuÔ±œ¥”S^’;z)Ž}ôs<Šƒú–WRZšl,N}¹2Î œ!ÃjV"D”(&LÔSÏìb)«1ca€\ù¾­£3¤ cM;Ð:(BX 1D–l^]^ˆ7VpØûâ44WA¡™f†› KÜ{"Y˜$H&=a쫈áTü,oœÜÃáðI44N^àõS»‰¤ãWœ£'Dˆª‹ª±Â*e´ûb êç8ñË ‘ *8Ʊ1ŒutlØ(§œ[¹ÍÊ&Î…:é8ÂûttºéÆŽ$Ilù?B==Œ†Že”TU¡gxˆ×Ž}HNî¹…>×N;ç9O;í”áÍON áqJ„jPQònÕW†a:tˆ×_ƒŽÛLØÕÕÅ™3gxöÙgùñÌÓO?͇~È÷¾÷=>øàÞzë­i]wN\44‚ å÷sô‡Â tŠSü-‹ŠŠ +^Êø5~•\¸QQòÞ H+VLù?]t±žõEÕ•;**ƒ ’%[L°TH™{ˆC”QFŒ[ØRÔM:qQNù”|ÅSù?£Õf ÐDÓÓãŠpö…çRï­Â­Š2²d ÚI¯µÔ"\tÓ=Å©¢gÉè®nÁ¶°Ÿý¼ÌËxñò âĉ1¡ÑÑ)§¼(säø6ßž–—šda £S†·h§(¸®¼Æk¼Ê«˜ 3Kì X +ËiAAÁkwÙi=…vZ˜t\Œ Ó„êР~2'+Ö 7_L=õÔPÃ^ö^¢Žb° Ø}¨ÆX¶ø€÷y>ª¨bk~ãr€ËX–_Y)¤Hå÷ˆq)gˆñbt\/>†¦™f>ÎýTÀ@ÇŠ.ºòÎÖ³ˆ(ŠÂ† ¸çž{ذaÃuT!âp(bÙ²eÜ}÷Ý\wÝu444pûí·ÓÐÐ@kkë´®;';ÑŬlj÷¸F ¢RG2¨¨èh¬b%7±–c'Gpâ ›.V²jÌÌe+øßá|¢hoÐщÛjQòêž,Yúé#@€U¬â'ü„;¸ƒP~E3ttܸǹ/–SN”èŒìl/¤©ÝÁ À‚=oì¼~ü 2È­ÜÊ]ÜE+¢Á8qÒGß8µAEuDˆPÑ£MruP˜hT§í´“$G5KyŒÇh£…Ü.yÝ1Q;-+VÎqŽ:ꊙI£DK¾¾3+YÉ~öÕ²9rÄY=[ï…žädQ×”ÿS(÷s|–ùýiýô³Œå(Wß Ä®ŒF#¿Ió8Çi¥•mlã]äШ¢ uÆ{‘¢(E׉Òú>ôÐC†ÇãaÍš5Å­‡ƒd2‰Ã1½UМ¬@’$É’Ð@¦£s'wr/÷gþ…²ÝtgÉ>üX±ŽS ­bÙÈZÖRM5uÔqˆCôÑ[ܰ£¢REUñ”SNM´²zF|Í ¼ÊTÔiíl¿˜zpæÿ\|>úŠïRH•zø+ ³¶gy–øhÌù5@ˆ œã\ÞybÆž“d~žA^"D°aã3|†•¬BA²ãD/½X° ¢ò2/sa‚ÍÀ2“N@†æü¢¸Ú>Á‰|~›Òl‰ÕØè¬‰1bX°Lèh2šBªÞû¹±À‹7¿ÇÌÈ{ŠzòS5¯²p$oçYÅ*œ8Ç„`“>3ýôÍiVGUUñz½”••Ív»¯×‹Åb)þœs² ‡¯¨r²b¥'/„ÊÊ‹ÆEYøTTüøéÌÏh „*¥Ž‘Ì]Š¡ðyãó˜SqVQO=+X1¹ÎÔe)Š2f÷º¦kBwxÑì¤Õo2£üDåc(8†Rê\C)Öëb²d¹‹»Š«=ïA!\-ánîæûóÆ£:ž¼›aÁkMxa€_ñsB9A3Ícº ÒH#**}ôqŠS<Æc¼Áĉ—ìZ)Yxèº>F%¥¡QAKX‚'û§8IÈ‘+ºÕ{ /··sD9BL‰Cˆ€˜¹{©3@††ðÚ«ì%B„ÓœÎïÖî¶f²—]ùfÉ6Â#ý9߇ \† òÎ)“'Ž/wpÇo©‚‡Rñw î7î§\¶ÊÎr=¿&N¬¨ yØx˜*NÓ êùѼYüyxæl¤3ï…PP€hx#;MÇ¿ÝF'TÿŒ6æÅ3I^:ö>g;ÇœcB¥+ÚÏùÓÁ1OEåB¨wÎîåa¦‘±ÑÈd&žIq¨{|¼›³œRsÂÆéã}ìì:Pòr^E¡ÿdŠH|bc¥;å”cÇûÎá´ØÐ 'šiƆ -hƔى¯ 0ñü‘wHg³|ŽÏÑ@}± Ïy‹l þŒ?áô95r˜±c/ëë©§–Zª©«L²ø&#¸¬ÓSYˆÚ4Æý;EŠ1L˜Çâœ<ÒK(çiž¦/¿ qÚD6:6zpûpÏÝÁ`j˜$IîäNs˜·y=ÿ§R¤0r oÙË`Í’%Ab‚oãñQA‚DÞÝ®€’G=™KèOG¯@ Œ|9¹â&¨]ì*î·H(îØ-|¯ƒ¢D¨¥¶ºyªÅÜñs†F’$>|dÉ2Èà˜w4Ÿ{Ab1øå/a`àÊ˺Ö裦QïRA#G–LÑe: 2H%#Ñ 8ă‡4itt’$i§}’I‰ +kóþˆ?âs|nF öÐ3÷§B†ì˜~>ÀÀ¶M¨Ä‰SG=~ü“®è,XpटEHæ4œ»Ú…æSE5tbÁRRN ;6:¹@ˆPI"âEÙǼF&}s~ÉÅèTS=F•c`àÈÿ)“ùpœ]¥[';jp⨴G¬£#|Ц *²b+&ĺR Á'-Xò¹D’ÅûõâÚªj†‚£GE> ¹ ™£o¡…)(ŸW²Ú .:UÚN!Rv¡ß\®^M4ñÑ@›Ø„e”YA%Iê’±ÙFïùJ(NðlØ(› v׍IíƒÓCás|Ž;¸c\þ¢±gA 5Å•ŠŠB‚8]“„ZèÌ›tä'–’“Â@ \KXzÙå#ˆ¥âØY…‚ŽŸÊ ;Œhp£½02dˆ+† Ña.Ά¨¢bÇŽ†N`Qo[ªo ‡84íŽìÇÏílƒ)ØjJAAa?û‹aò]¸pà˜7;È’%"ÆÚµSKå*™>ºèšv¼³ÂFÔÑ+ÂÎr>2dJR‡^*U •J.mOL“¦žúâ¦ÄéÄ—ºR•maÃòåžW%þb!•5¬åÂE¨‹…¹±h*jnD*gµÉÜÔu€Ì,gyI³z3f–°ä"ÖÔ)¨Ìšhâ»|—3œa)KÙÃ2dÆ4˜4é¢7J^\8‰/IˆèhùáÓoÄÎQñvfŠÂÌmý¨ßó‰¢@M L3V§ä"t ,XÇ€©"U û1šB’jÈ’å'ó“¹é´O¥èxù3)nBœ  ̉ÍOÏïi+lIðâ®i11'Äs` z@>ÕÁd„óC½ Ð_ò‹Öи™›ù$Ÿ,ùºؘ!/f:ô_¶¡\¬ µa#J”>úŠÁË)/úªpãfˆ!¬Øò¡Yì¸p[­LcN7MÄB4¦KfSÞˆ>]bÄðâ#@Ô|TZ+Vrä袋06°aN"ذÑMÀ¤}GE¡ŸþâSC»";ÐT0cæ^î)Úf aáÏrv°B ™¹Qaå7ÖÐ Ÿî›4ÓdE¨˜¦YD­¿ÌõĬé8Ʊâ§::ËYÎ#<ÂqŽSIe±±eÉÕ9nÜùœ…‡«PMõ%ÀˆšmâA:K–!†ædãÞD[äŒKEסĠÔóNÁöp37O{’ÐKï¤6Ì•´ÑÆnv$8Æ£r&8Âv±kÌgäí<"œúyÎçUÒc#nûó‘- IæÔ)Ø+¯•;¹ Þbb·1þ‚¿c=ÈÁ’\ëç“y³˜±p–ss:»UQ/y=¡ãO‘âïø»¢Ë°ŽN -ÜÊ­E»–W9 /jÁ‹—c%F¼d·ÈBúËñç ƒ|† ÃgŠ÷cÁB’$;Ø1ëuZlô÷CGÄY2ÇR'rF^(tÑÉ˼ÌyÎ_Ö¿šÕÜÂ-%'§*ɇ<×ÑŠ©e 2ˆ3ËX6ÆóPØ|$ˆÓI':Ú‚w—ñ¾Ü"ÒD^Ô¶LWã2WÌ‹)RìH×Y›O5ÒÄF‰b`ÇwQ.ä‘óF–Á cr&¢l%;.}§/Ÿà8)#œß\5Zhæ0'9É£< Œp›(Tµ‚’ßÙ:w¨y}¸oQ¨¨c„¼ wqòáÖlq ª°y3¬\ ~ÿ•—·P±`æ&nÆ„™ ™IW WÊèç"ÕÁÈpu„#$HàÃ7®ï§{']tQGÝ$ÂQ„虉`§3E¡ÿ…ñQI¥\ŒÆœ;&ÕDZ»2ï¨é`ÃN -—  ÛØF -ô—`p[¾ë¸®èûn s7Ýèè¼Ç{cfQaÂÅÍ‘ ZjÑÑ Îçžxös)—Ëk«õê ÔI[ØBuôÑ7Î>g·r+UT]ÑuìØ&mg!B|’O’"•W5œgÊo—ü€òOMÄäJ\fšzꋉô.¶í,Tævmg8,6nhXÍ4÷’UCã|‚›¸ñ’înåÖb$Ú+Ñõù[}ôÑAUT7+ihDˆ°žõDˆ,ˆøRa—LÇ[PFæ!—³dáÐF-ù¤S£10¸•[¯ÈÆ`ÂÄ—øu*©×;è Nœª¨"I’(‘âygïuÔMØ· ÈGú½²\=3I€2hh%§úo®1ozN¬%ú‰ {ÈÀíî6aâ-Þ¢všh*†S•W±b-ÚR.N‹;pžó—f"QW ]tQñI®-Zie«f¥l…Zj‰“dt,<€Wx¶1YIÃDhb)g æ“Òµ’)aØBr±b-†…1c“¶b¡RÒ $“ÉN§Ñ4t:]Ìf¥iÙlvÂ$îW 2ÔS?ê}d—./¦ÿÂAC£Žº|VÄ~v³»¸ÃÛ…‹øè2>b³Ï¥ÔVãÃ'ÕX×8£séÌ&…ýô1Ì0vìlcPH—Ì·\[Q 8qr#7^¢L6zé!A¢XÆ|Rð K“æa.fD\È”´9}ú4/¾ø"^¯—p8Lee%Á`²²2âñ8‡'Ÿ|€l6K4Ål6ãt:'L¯¸Xè§7îbðF ¾Àðà!B„#ÁŽý’žd<RI˜05Ô"ÅQ޲‘"ß4^ܸy†g¨%¨$’™f!¨I§C!é(<ÅS4ÓÌ–Ân7:çÈh.í²/²Úq"…ße³ÎýôãÁ3k+»™¦$âóùH¥Rd³YNž<Éðð0~¿ŸP(„ËåÂårñØca³Ù`×®]Øív6oÞŒÇSZ:Ê…Fuìg? °‚€+Y @ĉÓLsI™ ͘ñâʼn“ïðþÿ¶¼š)ÒeŽFA„¸Ž›“Ù¾‚BŒ2‹v°‘LN]ø,Ê=ª 37ZY\œ†`*X°"I˜ð‚YM{ñДŽ‹’Hgg'[¶lÁét¢ª*ÕÕÕ RQQA$¡¢¢›Í†aÔÕÕ±}ûvÌ+Цd5¡ê2€h:N, £å°›­¤ritC¤ÚŒ¤â„’QLŠJ<›"ËIÅHeÓ¤r4]¨Ea8%§kDÓ †‘|’ù7”Š¢ëùH†Îp2ŠÇæ"‘M‘̦NFÁ0ˆg’ÅÀ|ñLŠ¡x•2{9ƒúélޤ%M"3’"ׄ +úMCDô8YCè[UE%”Œ¡cʦŠ‹ÍP6\„‰‘T²”©Ø4AÂ@œæ2ùŒTTNi§iJ5!ŽŽfh¤sâZ‘t<ÏfU%“Ñùf´,Cñ0i-KN×N„Iç2€ª¨„“1tC'œŒ1l‹`6™QU9]ç´é ¹ŒÎ°!ü˜U±ŠÌé ""@DIPi·ÎãN"ÉTQ³fÔ„…´>Ò#Å~˜BÉ(º¡IÅ'cDÓ rºÆp"B"+Ú,“d8Án±‘̦1 }NUƵ«BÒ*EQHdRØÌV‘×'å§âhºÎp"ŠY5‰·(€Åd!šŽ“̦J„Igunb#ªj!nJ’Îf ŰANÕ%£dµ,¡d‡ÅŽaè(Š’ÿëi¼N'›£ÛÄ «Âp® Ö¸••^îÜ‚Ãb#“Í Žrú{“üCè笫]ÎéÁ l¬_Åp2ÂOö¿LSE-å±a67¬ Î ?¤ÖSI­·’Áx#.:ˆª¨|pþ+MhºÆáÞ3è:Á’ŠZ:sQt¯½'Ná_'Œxg‡º0©*K+jEHEa8–¦¦ÊI ©Y$ S‹P6A‹¯€ ‡‡ÎPÏ|ô&uÞ~W9]cMM /{—®ð åU¬®n&˜Sáðâw•1”s°û¤Èí£¨ø]e¼qêC‚‰w¯¼‰55Ë&"œ Šå Ȧè‰r]ýJšÊkèîåÌP'ªª²ºº™P2J<“DUºÂýXM†a¢éº¡3¦l¨“ßÁ»ñ((”;ÜD³q|n/çœøàØ)aCÈeiŽ„G× Í «éõÒ ¢Õ?‰\Šh»Ž²ÄÌþ¾ãøiÀf¶Ž©s_,H:—¡+ÜO­·’JW9fÕ„¦køœeôE‡xïÜ!–øjè‰ §w9/=ÑA><˜­Íב̦ùþ‡¿àm·bVUj<~N tp~¸›þØ0uÑoöeMM ·-ÛˆiÏÒJ £í6›ØujµZÇ› …•´Õ,+~¶±ag†.P[ œŸõÀ k8Ô}š•&:†{Y]ÕL•ÇG$gWÇa2Z–Ÿ õ+'½^$'š{+¼vª¢pWpWѲœè`}í ÞÏ$Ñt¡üÀj6™ÙP/t]¡~²©íjõÞ*z£ƒljXMOtˆÆòjÖ×­ &æ§³a#ÎÚšÊnvÿˆÕÕ˨öø©öŒl8?܃ßUNÇO(úëëW`-¸2ðιj\&7ëëV`2©d2¹bn…ʲú¢"”üʪ&N và¶9ØÔ°šÃ½giöÕQíñszàå¡2\¸Îp/ZÇ<£“ç)³»ÙØÐÊ`,Ä;g÷O§0  §³(šÊ†úU¨ŠÂ@l«Ù2¦ û€•´¾ðÝ %#¸p±²n e¡ruÛœl¨_Å©Á ,ó×Óì±Áyín–újY[»|\9ëWÑà@×qVU-eye#ï;P>wË.Ú JFÙsá74¶a3[ ¸'ŸyXMœV;‘Îc¸­œv67¬&“˲¡~û;LDX_·’áT„ñãdõ›Ÿ©ŒMµõ¡~ºÃƒ†AÀUΚš‚AþQÿ1Q%Ãu5+qÚìãê|}¾ÎV„ŠÉiµ³©a5GzϲÌW?᳨+ pf°Ý0ðÚ]h†FN×ðÚÝ”;<Üд€]'Hk–øj9ê¡©¢¦¸¢Y¨Ì«h+lGSPŠiZ¡²UáâL¬¥&¤Wòß,_„2*eaeu1õJ=›”MŠQ,LõýÑ×»¸ì *uÉsœ8/é2Rϱ›øÆ|2]5®BÞL)þ>ö}Œî"ìgÿ4/(YHLÔv&øp‚ãʘÿ]ºwN%K±U葉1јàÃ'B†(ÛRJ¯sé77ùsû,s"ÞÎÓex8,T V²’,9tôy\²¨(ôчJÙ%ÏÔ1Æd_\ Äãb@p^>&‘Ølâ¯äêÄ„)Ÿ7hñz‹yÛ‘˜ø¤êüðñX,¤Ói:;;©ªª¢··—ºº:ºººXµj6l˜òuçD€tÐAÍ%6Åhyã¹qæ(5 y*)lgƒjjx•—XÁÆE2*T ^zI„¹ï>ñóRD£ðì³ÐÐÛ¶Á"öF¿,º¡_³é54àÎÒ5#é ç Ã08pàCCC´··sçwŽ9vèÐ!Ìf3õõõ:tˆÎÎN‘›)¤¼¼œÓ§O/\2éMCQÇ—Õr¤sTeጮv QA8‹;æ'CEɇ×.xÍ,lL&¨¨‹E=¼ ø|PVvu§Î5)*>gËâ]fåЂoZÊfÌ ÚP] Š¢°f°¥¸\®qjr«ÕÊÐÐétš††êêê8}ú4µµµ$ ¦—~Þ-4v³{VÝŒa( ÚeíZÀ†zê.›уæ|Dá…¯ž´Xà¶Û„0(%®Ýwß-ÏÕÜ$-&3Ÿh»uÑèÜ/ÆŒ™!ñ⦉¥,¬à$s‡¢(E'ÛE:WÃ0¸çž{Ð4 UU1 ·ÛM<§¼¼œP(Dyyù´®;ïdôXœMx6¡àçò¹((l`‡8{ÉóDÊÞÅ5k½œÚêb®Û‡èw‹·ç™±PE5‹~1[¨ªJMM͸Ͻ^ÇÎá˜~²:ùÄ(Â…×AW>·ó\RIe>HD²°)äÎÌ¡-jA¸XYÀ$¿'ÛýɵƒA¥1w¹S q¡  Nï$qˆ$’¹ÀÀ ™e´±¥ÄálÂì WÐÉŒQÿ^k,X¢*jÞ.¢äWˆ¦ãÅP%W;&Ue0aVæàzª¢NÅJ¾–ŠJ+­œãÜ|>&‰¦ÒÓåà¶:ŠÎ;Š"Â*Tuz=M”·°3Îsb 2D¥[ù ÃÀcsòÐÚ;ðÚE¶3§ÕÎ]ËoÀ¤¨ùØ;W7.›¿«Œ±(ŽÙ!º¡p—sÛ²M ÅC 'KKUAÚÈc"¹v®çU8±s˜v.7'Ö {[·àsŠ}N *±aj¼~–é9ƒÜÛºeÁïŸ-f}’#‹ å”O­bªŠÏé-òS•r‡GI›—G5÷¸mNten„¥I5p•‹ð*×Ê–\¸pQAEI*XpŽZ€p$p[KÜ]:.«c$,Ñ5Æœ¨°®$äòµŒ \vO†D"¹B®~­ø¬pŽêó=Å.íú.\xð,겉äêåš -‡>· ]׉§ãäó(”Žnèd´±Ûô”üçÙ‹ÊRQYÚ’ „ŒÉ2¶ô+#§kÅ,’ʼnŽF}3–LÊÀ –µ>+(":ÅDåguø¨Ü<³ËÌ.M }}8woZ>ïʬ=ÓY`^ˆˆ}5·«³jâÆÆ5Ôxü%ÅÞ2 ƒ¯Ÿ&¼vט¨uÞn›³4ýk¾¬×m; t°ÑtPÆêfQh ¡¨þ3 ƒ2»‹{[·Œ ùb`൹زt=NëØMA×7¬¦µjé=³¶êe¬¬Z¹æ¶kÖz<‹;¤„äÚC¹š£LÎ2WË£›¿ˆ¢LÛïZ"‘H$óÏ5iD—H$É•SÒ DÓ4r¹‹…l6‹Åb!—Ëa2™ÐuEQ0—#["‘H$W %úÏ=÷}}}TUUqúôiÁ`²²2âñ8‡'Ÿ|€l6K4Ål6ãt:Yä™"%‰D2 — †a°gÏr¹ ›Í²sçNü~?¡P—Ë…Ëåâ±ÇÃf³100À®]»°ÛílÞ¼‡gú±æ%‰D²p¹¬Q…›nº‰Ó§O³jÕ*††† RQQA$¡¢¢›Í†aÔÕÕ±}ûö¢J+'Ãp\ÕD‰!ƒ•)fk’H$‹ž’TXŸøÄ'J²d2™ù¾Éa`PF9ƒt³ŸýÜÄMó]%‰D2Ç”ä…e2™°Ùl¨ªZüiµZ1™LX,i@¿1'6²qÆÂcH$’ÅÅœ¸ñ&³™EßE"‘H$—gNH(¡Üqù0‰D"Y<̉1©&ìÛ|ß«dPPšïjH$’y@îD—LdÈÈœ%É5ˆ´~K®3flؤ!]"YÀ;v “ÉD.—£§§‡êêjº»»©¯¯§««‹––ZZZ¦\® ‰D²ÈÑuÇ 9wî·Ýv[ñ˜a¼ýöÛX,:::èèè •Jáv»‰D"¸\.V®\É¿ÿ÷ÿ~Ê×]PĘàÓ.˸|ÈäB:«‰Ò ùŒI¾7æB“›Ò½“|>r™ÉgùÓ»ª1ú?ÆØÏ/ŸkA®8S}g—>t1Šfº¦“ Æ„5¼|Šcâß§˜[dÚ=Î(mlšj}E¡¹¹™¦¦¦â\.úûû±X,¸ÝnÜn7Š¢`·ÛÑ4²²²iÝÑsÒ†Rq鳬&Kñ¡:-öIscXKÈb1™±™­¤s—ÞØè0ÛÐtr‡{ÜõTE¡+2€aèc^†ÝlÅ’Ï&¨*")–Ãb/žã´Ø0)S7-e´,©‹êk‘dŒJgN«Øéq=íÛ´’r¾EQÐ UQÈhYbA\6ç%³“((œî%œÒçÄpJ² 1ìJ‰móríʤ¨”;<˜M¢ 9-v<6ç˜L™ÓŤšŠ}Ȭš‹8“Ñöœù>§**½Ñ!úbAì–É#"((hº>¦]k†Nwd`J^¢£ëW*v³³jÆbÒ.96ÙÍVÌ&át4•k(Š‚Ç#î¡ð³xšÆ–-[Ð4 ¯×K<Ççó188H ```€ªªªi½«Y Š®àè«€ÚK‹ÜšÚ°˜,|úºMÚ ç]Šõµ+P…×Nîºäy÷­ÞŠ®ëÜ׺¯Ý5æX•Û'ÐEdw.¿¾˜vÖç,Ãks±¤¢·Õ ÀCkïÀezü/¯ÝM$óÙR_-e7O1 áÅÏåÞU7c3O=ŒÈèû¨pxx ívÜ6mÕ˨+ à¼L®–ÆòœV;ý±aÎ wqFðãŸr=$sCNÓYÃÜ%¶Í˵«Zo%ß|ð©t•ððú»Èi9Êî+®ëR_mQ5ûë¨+«`]m‹ðèTU>}Ýǰ™-XL^ÖÕ.çGÞ¡µº™Mõ­“–[é.ç¶ÛÆ´íU%T¹}\—™áNR¿RýÍR\£M66úåÒŠ:Ö™ñ\5™L,_>>[©Ï'Æ¸ŠŠÒïýbŒ kô [áô–tÞd8­¢\nA]f½‚ñ׳˜ÌÔ——ÊžQ‚Æ¬šÆ ˜éîw±›­$³©1Ÿ9,öbÒ­É’oyíÓë°cîÃd¦Ú#S™Ã]Ò `·X©/«Â¢Z¨ŒV¢K/¬M·ÑE‡¹“rKIç_®]YLfÊ«‹¿WÌà>¯Ñ‚Ëf¶/ô¥8F¨ T{üxínìfk±ïO„Õd¡*ßÎ ¸mNÜ6ç´ëW*ž‹&¨“M…ó˶éÆ+‘\äÈ‘Aƪ“Ì,³.@Ò¤‰•ù¾%‰ä*cÖȃ5Ž¡r±#‘H$W³>ªëè”;ÝØÌ—÷ž’H$ÉâaÖˆa4ûê¦l¨’H$ÉÂfÎôJÒ"‘H$WÒ0!‘H$’i!ˆD"‘H¦… ‰D"™%íD×4\.‡ÉdBÓ4,Kñw]±¢d^t‰dá$(CîKfœ’Fýï|ç;$ –.]ÊÙ³g ƒAÊÊʈÇãx<ž|òI²Ù,Ñh³ÙŒÛyåqq$É•'N 5ó] ÉUFI¤¡¡ƒòÌ3Ïàp8عs'~¿ŸP(„ËåÂårñØca³Ù`×®]Øív®ß|=ŠKú_I$ó é )™aJ uuutvv²}ûv†††¸õÖ[¤¢¢‚H$BEE6›7^WWÇöíÛ‹*­~m`ÞnÎ0ŒòZH®£”Ü! è²\u”$@6nÜȺuë°X,d³ÙIm ™Ì ÖV_V5­Ðê’Ò±Y,ØB”J3,Ž¢’yÀb2³*°dFò…H% “É„)Ÿ8Æf£„Õj-[¨lnX=ßU¸ê)s¸Ùä]‡’S¥‘LŠÓbç¾Ö­ó] I óî»ïR[[ˆ .é uU»N)—Í)™ äs–\ÙF;vì ÒÓÓC `É’%“ž{U ‰D"‘”ŽaÜwß}œ>}šžžŽK›¤‘H$ VŠ&“‰7ß|“þþ~À%ó¥-Zýýý9r„¡¡¡ù¾‰D"‘Ì&“‰úúzTUÅëõ^òÜ¢yûí·ùñÌîÝ»ç»þ‰D"™GÞzë-Ξ={Ù#Å£uuuƒA–.]:ßu—H$É<`š¦±uëVΜ9ƒ®ë—<¿¸éèèàÔ©S Ì߯?‰D"‘Ì<…MÕý¢(¼òÊ+˜Ífjkk/»I¸¸©©©!™LâtỂD²˜0 ]×QUMÓÆËf³¼øâ‹¤ÓiÜn7Á`ªª*º»»¹å–[X±bŘóo¸áÞ|óMZZZ¨««»äuÍétEQ¸óÎ;I&“óý,$‰D2 ÃàÀ rþüyîºë®â±T*ÅŽ;ˆÇãÄb1L&áp˜²²2TU'@ªªªxüñÇKº®ÄÎçžz —ËÅO<1£7ÖM7* w·ºD"‘,vEaýúõ(ŠÂÞ½{ÇlÜTU•ªª*R©†aÍfiii!‹ÑÐÐ0ayš¦a&“é’›@Í ÔW>ø Ï?ÿ|˜x<~ÉóÍ<ôÐCó]wÉ"%A‚·y‡4³Žuó]‰Dr¼óÎ;†‡‡ñz½Äãql6•••ñ*ñH$ÉÕH[[PZâ’Hww7ßøÆ7Ðu‡ÃªªèºŽ¢(†Ûíæk_û&“‰P(ÄñãDZZ­,[²LʉD"YDL%}Iäí·ßfxx˜T*…ßï' WV«•l6K.—Ãd2¡ë:™L¦(\äD"‘H®NJ >ú(«W¯fxx˜h4J}}=ÝÝÝTUU …p»Ý8Nr¹>Ÿõë×ã±Ù…çi ‘H$’+§$bµZÙ°aØÏ.ç,‘H$’«õÊ‹H$ɵˆ ‰D"™R€H$‰dZH"™TT$Bd¾«"‘Hæ)@$WŒ¸qSC ]tÍwu$É!ˆdFPQñá“i‹%’k)@$‰D2-¤‘H$É´DrÅhºÆp"B2›žïªH$’9D ÉSW 7:ľÎcÒ"‘\CH"¹bê˪ØXߊªª 0ÇšD"™-f=¡”äÚ@é%‘,@4MãÝwßÀn·388Huu5]]]lÞ¼™††é'·’D"‘H9º®sðàA‚Á ííílÛ¶­x,óÃþ•+WÒÞÞN*•"ãt:‰F£<ñÄÓ¾® ‰D²ÈQ…U«VaV«uLR(‹ÅB}}=¡P§Ó‰ÃáÀï÷“Édðù|Wt])@$‰d‘£( N§ ø³€Çãáw÷wÉår8b±eeeƒAjkk¯èºR€H$ÉUNUUUñÿx½Þ+.WzaI$‰dZH"‘H$’i!ˆD"‘H¦… ‰D"™%ÑC¡‘H„òòr†‡‡ñù| ãõz‰ÇãØl6*++çû^$‰D2‡”$@:ÄK/½„Éd"c2™ÐuEQ0 ·ÛÍ×¾ö5L&¡PˆãÇcµZi\ÒÈ ƒÔÑ4ß÷)‘H$’¦$p8œ¬V+Ùl–\.W,™LUQ4È¡ŠªR.#‘H$’EDIDQ6oÞÌÇ?þqº»»©¯¯§»»›ªª*B¡n·§ÓI.—Ãçó±~ýzÌf3ýôS• `Ç>ß÷)‘H$’¦$ÒÚÚJkkë˜Ï6oÞ<ßu—H$É<"½°$‰D2-¤‘Ì2ÈÂÅÀ@C›ïjH®BfU€(ºÊÐPŒŒ–ïû”Ì2ŠÙ¤9'Yh jCœÍµ£Êù¢d†™ÕeIÛè=• ˜ŒÌ÷}Jf»ÕÊFÇz,QÇ|WErJÚÄrë2U&ü’Ì,³>%±›¬HǵßY.g¹ Å5ßÕ\…ÈÞ.‘H$’i!ˆD"‘H¦… ‰D"™R€H$‰dZH"‘H$’i!ˆD"‘H¦… ‰D"™R€H$‰dZH"‘H$’iQR8w‰D"‘,^r¹Äd2‘H$ôôôÐÖÖvEéÈ¥‘H$’EŽ®ë=z”P(ÄÙ³gÙºuë˜cÏ?ÿ<ßùÎw¨¬¬Äf³‘N§±X,ÜsÏ=|ö³Ÿöu¥‘H$’EŽ¢(Ô××S]]M*•BQFgf2B¡µµµØl6TUEQl6Û]W ‰D"Yä(ŠBEE@ñg»ÝοøEîºë.r¹Éd¿ßO?ÍÍÍWt])@$󊦮ƒÅ2ß5‘H®^E¡©©iÌg555W\®ô’̺ÀŽ•9Ç$’EGI+P(D8Æçó144„ßïgxx¯×K<Çf³]‘%_rm¢iÐÓÁ d2r"‘,6J o¾ù&û÷ï'N“Éd0™L躎¢(†Ûíæk_û&“‰P(ÄñãDZÙlx++™M21 Üu—X}¸d¾#‰dÑQ’q8x½^"‘ƒƒƒD"‘âêÃjµ’ÍfÉårEÁ’ÉdPÃ0¤ø\§s¾k ‘H¦KÉdݺuTUUqáÂêëëéîªŠP(„ÛíÆét’Ëåðù|¬_¿³ÙL(Åél¯! ¹à”H®!J Û¶m+þãÆlÞ¼y¾ë.Y`$ýä, øæ»&‰d.n¼’!ƒÝï¹±Z¡¹Žù®‘D"™m¤‘Ìn7Ü´-‚Ŭâp¸ç»:‰dD2cØÊ‡±˜Ì€ ɵ€ÜH(™A¤Ï„Drí ˆD"‘H¦… ‰D"™R€H$‰dZH"‘H$’i1ã^X Ú|ߟD"‘Hf‰ ]tñ¯aÁL‚ q(2¾…D"‘\ų10¨£ŽmlÂ…QŽósK"‘H®Bf\…¥¢bÅŠ3,`È­É|Ò«õ’1d/”Ì<³jD7 ƒå•,÷7Ì÷}J$×$†ap¤ÿ ev™pE2óÌªÑ eþšýõó}ŸÉ5‰nè,µ,aYyã|WEr"Ýx%’«éÂ"™-¤‘H$É´D2ƒÈŒ„ɵ„ ç.™1²Ñr0ËŒ„ÉBÂ0 Μ9ƒ¦i¸\.Âá0~¿Ÿþþ~š››ñx<Ó.[ ÉŒ‹Áo–aµBã§eFB‰d.1 ƒÓ§OF9uê×_}ñX*•âí·ßæøñã$ t]G×u Ãà¾ûîã‘G™öu¥ KrE;á0Xœ ÖoNJá!‘Ìn·›ŠŠ Ün7Š2¢K6›Í¤R)V­Z…Íf#›Í‹ÅÈård³Ù+ºfI+T*E,ÃårÑ×ׇßïgxx¯×K<Çf³QYY9ßÏO2ô÷ÃK/ÏûNÄXµÖH "‘Ì%Š¢P[[ @0sÌ0 Ö®]‹×ëeË–-„Ãa===´µµ]ÑuK |ð;wîdÕªU¼ýöÛX­Vt]GQ ÃÀívóµ¯} “ÉD(âøñãØl6œ>/Š4ª^ÕTWÃB™*—§ÔJ­¨D²°Z­lÛ¶mÜç+V¬¸â²Kêíeee$ zzzˆF£Äb±âêÃjµ’ÍfÉår˜L&t]'“É **† ŸpM°|¹ø¹RE‘ï\"¹V(I€˜L&Ö­[ÇòåËijj¢¾¾žîînªªª…B¸ÝnœN'¹\ŸÏÇúõë1›Í ÅC©ù¾E‰D"‘Ì% õë׳~ýz6oÞ<æ§D"‘H®M¤ÖæÀžïZH$ÉÄ\3Ä0@ÓÄÏÅÀþýð¯ÿ5¼ðd2ó]‰äêB×Å_É•qÍxÞz ¢Ñù®ÉåÑuèë»–.«u¾k$‘Ì/鴘Κ{÷ÂÉ“‹gB¹P¹fH{;üŸÿï¼3;F×gn¥ ªpÇð7·Ü2ùy±Xi1“™ÙV(§NÍ|¹’…Mo¯ø;WÄãðïÀŽ3ÓŽ 8xŽ+ÜGwÍ3çÄ0 ™œú  A$Rú5..¿±6mƒóLÍdF_ïÜ9xõUÑ8g»jj&//†×^*®drì±TJ|Ï0ÄÏW^õ›IÁ©iðþûðÜsbµ$YœLÔW.E8 ßúüà³»š]¯în±Yõ[ßQJùÞ¥îÉn‡[o…{ÕýéÓ¢žÓ¹ÏÞ^Èåfç9Î6s.@á™g §gâãÝäèLÂóÏÃË/‹Áñrœ< .Œ-Ãl æÎ;Åÿ'Â0Äl§”YN,&:Sá{pâ„øþL ‰çôÃŽ ëÛoC 0¶„ÃbPÿéO¡³SÔ§£Cì¿T§Êd&~¶é´ø;úýÄã (P[+®ÿÆ“3¹E‡®ÃÏ.fâ¥`â]ÿýß‹ÿÛퟗJÁž=W6Q+”Qøyê47‹IÕÅuÝ®Óé‘ï]|^alùðC1ž”:!M08Ò£Q8|Xôý_þRôÇÑ}e"ësþ<üèGpôèâT§Í¹ Å øÝ]g2ð· ÿò/pæÌH4 X²V®¼üŒ¡¯þôOáé§áŸþI4¤ÁAø½ß*¬ÉM_ŸXA<ý´xC¡ñ3k]fhHÔñûß÷ ªP_/ïXìÒõK&Ç7î\nìlnp¾ùMøÅ/Äóºx™‹‰ÙØO*ÊSG½ÅtZ‹¾>1ÐðÙÏŽ¬¾F30 Ê×uøàqÿƒƒcëõÖ[âoA=wü8üã?Â{ïÁ׿.”—^+u`qñæ›ð•¯PÊ`ªëâß{/|æ3`±Œ=žË‰vðÁ¢ý:Tú ‹mç{÷ŠUN{;lÝ ÿê_Á¯þ*øýcë³g+ TÕûö-?m6}âüy!8§2ó…àþO1‘M$„ðýOÿIô›åËEÙ—*ïüyøïÿ~ö³‘{Ý»W”70°8ûÏœÇÈfÅwø°|x`äØk¯‰tãb@=yRüϱ̻ñÆ‘A0†®.1+)ƒwk«ˆÆÜÓmm¢œÑèºèëêÄ*&}µ­M¬j].Ñ>-1Ø{<¢-¿þºèsÀÈ=|÷»âÚögâó@@”ö,ÜtÓˆ¶áÜ91 „cÊÍ7ôåKÙ/®÷ùóbܺåX½Z|ÖÑ!V'OŠþ¸v­›¼^p»Eß*ÔãèQñL}T<—övq¬±Q”‹ï\,œ*s*@ 3xŸOÌtÿ×ÿ|~"·ÝôG¢Á8B²76ŠYòŸþ©0,ÿÛ+÷wß3á?üC10&bsþ¼øþç?/:Æ–-âåþ»'f/| ^з¿-ô©¿ù›¢^.—¸Öè†æ÷‹Ïûï‹ÎÑ×'À 7À§?-Û-îåàA¨¨"ƒñ×¾&ßêÕ¢AlÛ&êü…/Œ<“C‡„ PUq¼¦F4¨'ž€O}Jt¤dR,s››aãFq¼¢B”£ëb¥ÕÖ&že8,:£Û-ž×Úµðÿ žÁoÿöÈJÄé ùÅE,«•+E9ûö‰Ï?ýi13²XD9••b@(¬Ì¢Qñ|ïºK†n_Œ ˆwù¥/ÁÇ>6ò¹aˆ÷üþ|ñ‹b7 1Ë/´k·[´ó'D{-+m&}vÅ xøá‘ï<ðÀØñÄ Ño{ >÷9Ñîþâ/„– £Ch¶n+¯WLV@ôeߨ\3… Ø?ÿ3lÞ,úŒ¦‰ï´·‹1¡ èV¬ýchHÔ½¼\8Ô¼ð‚XƉ;á¾ûFì´6›(Çá}îþûEî髎çÜvÜ~;¬Y#ƃÿñ?DÚÚD¹7Ü ´Ãân'NÀ²eâ{7Ü ®õê«b¢øñ‹~kµ.üUɬ ‹W¯Š ½ýKÀ±£ðù_² ØÖ®h[?ø>,m†·wÀ¿í0‚§àƒ¡º>Ü O= u àôˆån¥*ð‰O‚Ý[VA:¯¾þ*èéB««v}ç;àÏÿ;¬j=Ý`s@ËJرRI0Y¡ó‚X®~êaøÊýpâ8ôôÁ©3bU´¤ V®†íwÃæÄ}¿ø2>"ÔUÃ!p¹ááGá¶m°a“øn( /ôô‹¿a Àï¢qèè‚7Þ†·Þ“'àè1P-ðþ.øÌgá!ƒŸü3|÷ïG:ÊgŸ@x,ð-bŒz'šÊÀüÏ¢½$Ó¢=†#pÓ ÐÕ#ÚnW8vèضmƒ?úwB`¼»S ¤×_ÿêwÄ@þò«¢­Yà)×ù³?íóSÕ"úò~û€Å»÷ÁûïApX3[ı@µøN.?“Âí×bý4•„ HÁ-·» Þ|ž}F‚¶µ¢ “ …ŸüT Ü[·Â—~n¾^~ ž~*«„zöG?„`†‚bE_é‡ç_®?üŠ.Í-b ú‹¿„[¶ÂÍ7 ”N‹¿£^Sœwø¨(n/¼ó®¼ùº¾ö&œ=#úÓOò6Ë“'E¿þpÂ5UóÝz.ÍÌ \NXw³s2Š=<a ƒáaøàïa›ü8lXïü œ>®_Î.Ãò$x;ÁzöþçáS+ ¹Üç þ!ð¬Uà¥oBø]èì…­7Áƒ¿ç ø¿ÿ6n»^†Û·ÁÍËál,À=uà^;߇&X½̧ :7¬‡¿úŸ†·‚ð[¿6ðœƒÖuŽÁ¾ ç;áÃÂð۷ÇïÃ3"fn¿w'ÔôCÇ!RihŽCÛzØùC8xHt–/ü äÖ@[%¬ÈGÁg xÒðÉ¥°:!} äÂÐõ ìf¨ìƒÞ×!˜„¬[ÝÐT Qæg×Bpt¾/Ÿ„s+ ž€¦_ÇŸþ1ãºÞÍÐÖwTÀ¡0œzþê—bðèÜ Þ Ð’€O,ê П÷ŠŠ-Ø…I5Ay ¹KkA`è8{ΠD³‰ÓÇá‡?«úàzüýßÁé³Båú§ß€úFxp9¬5ÁŸþ¡¶ZÀR«êàôNxá„@#G!ó ¸Î;¿½-Ðà²Nøë_ó1¸k;|ï›ðâsðåCu-ìܶóðÕOÁç?&VºÀãÛiq +3ÐÇ9øÙÓpä°Xi{<°ÆüÔÕ‹Õtî4ÖÀÙðj =pýpâi¨†Ý¿| ‚ËáO>Ÿ[# àáwak3wˆ>lè°ýcµÁñ§!™ý üöoÁõ[àýçáÃ@âC({D”ãÇ¡¡Žý<ýÇð[¿ ký°2 Ÿ[ÍKàõ·a飼‚3Gà¾(ï€ Íð~¼þ×â}”õXxôš±¹îF0ŘÁ¹™áaÞüú×Ù`6™Hd’ '£Ô—U‘Õ ~ñœ˜ÙlÚ( q»÷‚Y…á 4-óíb9Ø? dP[›Pãœ;+Ô7§N‰†_[+ì55I =îòåpè#1X—ûàØI¸õfaséí‡;·‰åëóÏC: +[aõ 8xÖ¯3žTZÔç|Äó{,Nœ‚/<)TX÷ÃÝ÷Š2_zU”ïñˆYÝÐÔÕÂÏžƒ[nª&«z»…º­®qˆÄ`÷qŸMÍðØ#°s—(E³Pç-m ã¯*äòû;Å,çðahi5m°gŸ°I´®ö¿?ï!¢À × •ÞÙ³b•ˆUÛ-–îkÖŠÙÓ‘#ðÊë°²¶ß%Ô[f+˜MLˆwóÞ{pê¬x6mmPî‡ÚXÞ2ªžŠÂ`lUUñ9˧KÉUˆn\õÑP^…ɬrâ8üòU¨© 1‘Û¹Sô¥7ß«eU«ŒÚ±*PUðû`ÓÈä„êåµWÅŒÛé}rÝZ±’ÿàø`/ܶE´Óà¼øhÜ~‹;Ü믋~»b¹Ð$ìÚ±¨èw6ˆ1Áí³ôºz8u^xüPS ‘¨Pµ® ˆÅáõ7Àf…l ršX µ´ÀŽw„äcwÞ¡Ò'Ë;oþýpÇ6aÛéêýòv T“°§œ>-V=m«ÅJ#‘HìØùžXíÝ»4]Ø ï».èïë6@…R áµèp µŸÓ)l¨š&Æ¥Þˆ„ †2Úþë“Üz¿wJ6‘½{÷R^^NKKˬ·¯™]¸\BI¸};˜Í$ã!ú†{©ohåÅçà«ÿz|êoA[¯ýw8z2>¸¾¼7ŠÁ¼k/|ûð™­pÚé%ðÅ'!>o¾,ÔR^€oþ7hj„ý_øÅ1ZZüxœ`»ô8‚ Ü x¶‚)j#¼pºü°ê ðÎYØr³"?þ+ÑÈ}V‚qÄwÁþ§ éSðO?ê_Ï— ý¼Š'OˆÙÆQÞê‡üæ“â±ì4 ýéÑ£°úøÎȤàKwÃ_ëañ÷d.ØáW>/„ˆNrôüíÑI_ïƒrþî+`;ÿð«ðûOÂÝw‹%w4 ( Ùà‡?ß-:ã7þ«Äö÷p¶ ~ë“°æ1h±ƒã°j;8W T6˜À©€X{ ~ðGBu÷Í Žz0UKǾþà@“ Ÿ¯~Ö®¤4 ]£³ã0õMkˆÄÌ<ómxîl½îºl÷AïOà_Þ…ò'ᙟ 5O“íÂÞæp@À}ïƒÇ ý›]ßýœk‡¾^h6àG_… û¿+Ÿ9bÊ pÿ@Øð"ëDx¯þï?Âÿ>Ÿý8¶CÌß:ƒÐ? «ûàsw ;‰? g»áûÿþÑZ<Ї߻Z~UôW% ö[ÅdI5 §–óça‰ºVÁ#Â*[ í>°´@õðï°îWá›ß‡[ï…ªG„êùg¯C$ öß ¡ RgàùïˆqEQÄÀß°v¿ ;p; BçíÂÞrçï@eüøÇð½ðµÇáK¿μ …Áíeyn„W_Çð×{\L?¶jòm ÓÿñÿñL¦iííí,[¶ UUIfSDÒ1|ÖJžzJxBý«ßO|B4Êú:ñ ×­ƒû…â³ÃÖ-Â-v÷‡ð/OË) ¹6›ÐY¾ô¢ìyX šo¾o¿%ô•¿ó;ð‰‹Á¶¬L|v&¿öù`å !¤êë…ð2tÑ ?x_Ø2jkÄì ±Qè6««CÔó†Àé«…/}I,YŸ}F¬îþ˜XYùý0Ðíç y©0†5Ô‹:ö÷Áoý¦¸?Ÿü$|ëˆû¸ázQ×á XÕBüüYèî:æ'ŸÌÏ Ï‰NË21ckkFðW_ rÓFTBCƒX-]w¸æK/ cÿç?‡?ꀻî‚[ 3CE¬Z~übæç÷çªÝâ9¬Y#ŒžMMPQ>þý%˜• §·Ô&#™e à+ÔO}y¹¬Ê‘ÃÂSq _ ø-lm·ß.V»--BC°g<òˆPá64äW.Õð+¿"l+WŠUj8,ì 6«ðNºëNÑ¿³YÑW®ÆñŸþ“èw7Ý$Î=Žý[¶Šó—·§¯Äõb1Ñ5 6\'VÕ]¢/|ê!±ÊyëMak¸n½XÑdÒÂΈ•A,*¾»ë1vlÚ$Æ—K<ƒcGáÐAQÏ®}÷·Å½ÞŸ˜ü À=w‹BE¹“Â!ø¯ßŸù4`!¼b9,]Ïý\ôµª*ñ\kkEÿcˆg²t‰è_{v OMC÷uß}Âûq*ôôô`·Ûñö8˜%f]¶e³bŸÀ?ýüîï O §³Ð¸Å~†íÛE£>~\x„<òˆhܱ˜ØôsÝubÙ Ï‘în¡“/ÌÒ{LxEìÙ#~7™F®ßÑ!f›7 ¯¥‚Ñ×džFé¼ ¬±QtõQ¡úæ7…çÄþÏâåïÝ+¼ªZ[…ˆÅÄyønÁSdpP»E‘õ¾î:1ø?ø Øðwð hœ}}bÖó‹_ï§o~S”ãt ¥(ÂCíwW\Ãló÷_œ£ëây”•‰{ËåÄ÷Ö­>ûv»üo¾Y4Ôÿï…úªà–Yðö8{¾÷=áRýƒˆzýô§Bxÿú¯O¾yL²°1 ÑF¿ðÑvÙ»°l™0Ø~ùËâ}WVŠ Ì-·ˆ6ì÷‹ó6mƒÙêÕ¢Ì{ï;ºO‚ŸüDôÕ>}ø¹ç„»ëŸþ©øþïþ®4S)ñwýzá©ô³Ÿ‰~×Ü,öz€XMD£¢¼ï~Wôù÷ï„K{Á«ëØ1Qïúz1†üèG¢.••B×Ô$ßù/Â0ý•¯¯ÁÛn÷]P ¹\ÂCëç?ÆõýûEÙ[· wöG}äOþDô§ï_ô3M}ÁåÏäÓŸõå—ÅóݸQ¨ÙOœÏIÓ„jlãF1ŽX­¢Æ «U¸ìcâó¦&1žÍ@ÒÀYeÖHAÊçrÂ¥®0€†h¡PïÜsø»}ûˆøò—Eƒ¸ûnñ€½^1ð66Žu=lküO:vÜ®‹F»m›è‡h€ÁàÈà|ô(|ãðÿþ¿#¤ðýpX ð/¼ þ»îzÍDB¸Ú¢¬¯] î¿÷{¢îo¿-ʽqïþûÅÏÂ@m·‹ÙEMn»w‹º57‹Ù¿Ç#íO~RÌØví¶ˆ÷ß1úû…:`ô$ãþû…`QÑIÛÛÅÿ³Yq½¦&ñD‡8uJÜ×hWÁ5kĽ=ÿ¼XBoÚ$ê`±;Ždñ¢ë¢-lß.úˆ~õ՝л¡a¤ÀH›Ñï¸c|™.—P‘Úíb°»ùf1X^¸ &#ÃÃB€,] ¿ök¢¯Ýt“hó^¯p8ÑGOü “©Ÿÿ\¸óºÝâœB€Ñ¥KGνé&±±·¦F´ßB{¶XDü„r¹„›þh ¦º3gÄÀÿµ¯‰>ØØ(&±…k>òˆxv55âY|ýëâÿ›6‰ÍÏ^¯øüË_?ËËÅD¯®N\÷ÏþL¢êê‘{­«» DZ[Åÿo½u¾[Ìå™u¢(¢±~ûÛâ¥VŠ"¤ñßÿ½XÚ$úèFd³Áãün±ˆß~xüF¦†ø7ÿfìgííÂÕðF®ñî»bfýÄbÉ‹¥i8,Óè—Y[ ÿá?ˆN¶nhTŸûœhÜ bÃÞÀ€˜ÑÜwŸh(‘ˆX}躚…™ÎDþÜ^¯¨ˆÙ^6+ªŠB TUÁC‰çW[+V<­­#ϲø2G½MGtØÂÿ/¦®nb`2 Ç…ï_x§¬Y#ê$Y܈ ÷¿-´+WŽ´Éª*ñ÷J=ðè_Û·‹~¢o™ÍbòUèk0ù>‡²2±Â°ÙF&“qË-ðÇ,úÌèM‹UUB8Z,b¢õ‹_5ï¯üŠøŽªŠë·µ¾õëÅ„vtÝL&¡åøøÇÅ5zzÄıʨ°±Æ 6›M<çLF<›¥Kń੧ÄXTS#î³ÀBß÷q1scžQFf1î¹Ìwf Eƒ©Ë5?ËlËðÕ«Eã.ÌVÖ­»t9.×äÇkkÇ6U£—® a·s§´K—ŠºG£¢¡}ðÐÉ66Š{ñÊ„Jëg?³£ÖÖ+ \.±‡‰¯%Yd(bÀ¼÷^1[ž/ÕHa%_*UUÂqä²·—W3Ùl“{,)Šð—-›øœ%Kfï>`ìÊÈ皇®®±*ÃÅÈìÑsÇ Ÿî¹ŒL&a0kmƒühÛC)e``€x<ÎÒÑkÒY¬ë­· ýð­·Ž¨½**„qnýzáõr©ÙNuµ0úíÞ=V€e2N:E[[ʦ;“ÍÄæ“žž4M£a‘÷ºd2ɹsçhkk›ƒ«)äÒ>øþ±+è™ ³³“ÉDíD3©9Âl¯…Zv²f®ª“¯dâñ8.\ u´n–PU¡&6ŒÒV0 ™+ŠÆ«ë:]]] Ž áDöL§L¼ð¬xç:y‹Í&$üt^R$ahhhÎêêt £åÅöŠš1[¹œðUUñýûoG–Ú¹\Ž®®.fp¿è¥™Å%y8& ÎÍ}Ì"Ùl–îé$˜¡a…7þy¿òy¿ó;B…5“ƒAÂcÀúè#úûûùýßÿ}š Û¸ †aðÒK/qôèQt]'‹qß}÷qï½÷ÎwÕ¦L<ç™gž¡»»]×Éf³üëý¯©žªÏô ½½ÿößþ.— Ã0øÔ§>Åí…¥‹ˆ“'Oò—ù—Üxãtvv¢ë:_ýêWguÀš R©ý×ßï'™LÒÕÕÅç?ÿyn¼ñÆù®Ú”Éår¼ýöÛ=zÃ0°X,|õ«_Å]Ø™<Ą̃1 ƒ .088H(š‹ç5+X,ƒƒƒEcz<ŸïjMEQp¹\x½^z{{b```¾«5-, ìß¿Ÿx<ŽÅb!‘HÌwµ¦Œ¦i¼øâ‹ Ðßß×ë㟘¨¬¬äÞ{ïåµ×^#™Lb·Û¥-$—ËÝö{{{Q…áááù®Ö´p8ƒA6nÜÈ‹/¾ˆÅb™U[ÛŒ “ÉÄ#ø ‰D‚ÆÆÆù®Ö”1 EQX½z5[·nåüùóÜ|óÍó]­ißK¡}V 5ÓÝj?¨ªÊ¿øEÖ¬YC<'.Ê™.€ÇãÁãñðøã“N§Q¿ß?ßÕš2‡ƒGy„H$BYYlذa¾«5-Òé4mmm\ýõX­Vìv;^ïìEÇžqˆD"‘H® ¯•["‘H$óŠ ’kŠ¡¡!2™ áp˜#GŽ\òÜþþ~Úº}ñïɵÎâó”H¦‰¦iüå_þ%wÜqÕÕÕؤ¾½Ää21ÖE^ÏÎ2*oò@‘dŠÍ\ :ùí= *—¤ÒÍ%,±5AYUÂÆY~{ˆÊ%íšÉ§„eÕ kÚI~Ë‚%6õ¬—^dü‡aäI#ßË“Ç~PgƒØÅ[$•Ýz´LZIQ)êofÄìlÍùR(ê|ñ=±Ýqͪ6žª³µ°Š(GXËž–ð"ãå<òíz¾±ËæF0ß/ÒÖ:H­“¸J¦¾Y¿íƒø&[y¾ºª9ŸÿŸ¸l7Ç5nŧ³µ°Šh aq1U¥ˆúcZ™õÆê§f—É®U{tS4ß•%ÿÁd»Ƭ¬e2Û×l„eê2P¢lǰëCȨ[*ƒ^o¬ÛíZ÷¨y˜D™ëo¶=ÍdkÌqŽ‘ÉŒ:ΖÎÔ‚h†°ôaêéÞVã´ß˼—]ê›m2Ù®çÛÇì/߸‡¨ }P ¢t¦6¶Æ2)‚}%¶¯ß–OåütÆÇ²O3Ù®yÛ™[c9ÇÙλuP²P†N kÜ Ëñ±ÆÁ–t„ì]æh“´^d­¤v>Ö84Ö‘ÌÊÚõ±œãT®kwÃj¸õ×>H ‰ï°øc¯.øcYÇË{-?â©P­“ø \ú›Ù‰vXgÛØW5çˇAF'/*u¥³µ`þìE_POÕXv?ÖÔ8ä»¶Lvm¯ú“TÒ"UÑ1¥¿eµíÇ2]œë¥uÖN?–sœ=¤£³/•(„Ša| ófÒÉ7&;€(d´8Á8tÍÈÕéq¢e´8ˆ—ê¬u^å 6ªàIkê [iL)¬¶g S:²§®°„%^á[x©$"tdO]a «5¯ã!($"$³¾tnO5ÐÍ „N"ßµ´ô´jhî_SÈÀË(#,{ê s ¡+ó´ãE‰õYtË]8Ãêc©©+L;(ŸewC›bÇ‹ë³èYÂr§®àŒr*ÝAÚ¥Øñ¢Äú,z–°Ü©+8½iyÉ!8ó/£– Úñß{ãh?)Nólº61ø)W¾Öy¾°þÕR µØqz™€IÌצœQ5Þºv ‰ ùÌ¥]/n˜Y.À^TÀYöÀdl&n3SºéÿnN9ø·PMèP{Î2z.Óu¥}Ÿþ¯í[9q|Ó˜åœEœeÌ$–fZXùà¢j**ÏoûXz™ÝA㎷š{Ó.šêyù·­”ƒª¥œEœeÌÒfr\°òÄÇ)U™_!'ÞR“ä,eGuòÈ-,g™€f7ÞªþO•+£“ôr΢ÌþØL îV–…VU5ù…å 5IÝÜ™^ørv< ¦>™ý³s3÷fQÈRWµ¢”•Z/W#°Gç\a5äÆNXÄ 4NeeýJÙðGš$á#¦¾g™€Æ®±ÔOJ7}·ììúq­ÆÄrÎ8†#,S—ÔX:§³lTÕd/Ð@©Nrƒ)dÇÃÐË ö-#V*˜gþ9ÌÎzP›Ea™õ k´…5Ú9c/«ìÚmŸhÖK褱]þèÚ¤¦°:O)·µ>vBýØYã­â'A+ºZ=Q¼^.À™u„ež ÍÎòæ‡ضeFVÜ'çr‹÷™¤V'ì=ïz™µî@kú±¤ôÝ¥3Îô‡z¹{dÖ–ÉØôc9Ë#˜N/<@«ª)&,:‚T|MÜy¶¿Ä·›Â§â•U1aÙzÚÔX‹ýÿcÕÇ›¡Ú@õ›_Aj?„l¯‹ëQüóxV+%},7‚To‰iO…ÕyJ¥£êæPTœBÂÚGš$ácÍI>Vuòø°°¢TÕÖ>‚tMBés‰TUSOÖbð[Y j)ÐZìx(ÞÛçI˜ôÈ èÑM-•¢ªEë'R…嬭2¶^‘(+ëêÄB$ ËÞP?ŒÞAè¤6ðÈ¢‹©&âð™0ŠÜ.ßüskl$*RÙ Ñ·ÞS'T•Rž¼ç©ë‹­d ]ý„En>Â?7&ÖX'H̘t|uJVMBòN©ÅÚÃ!ðãÒn@wCnt(²ñ`‰5Ö ©Lk$¼÷3m •q½[?8á8‚”%BWç)Õécɨ¤±åÑ1:ÖØEã]³‰v6O…ý°‰d:µ9¶(ò@b>!"‚tâšÂN^´~ƾŸ'(j¢–MêºÁè¦Ðæ_>‹¢LŸÆa–ш¡£Ž#H¹Kùƒ€BëG4g¼™"ÖØÖÍdŸ¸½÷¿UU¶E1,HqU5ÑÂ*¹øŽºB ±šæã÷Äû)_Yqª‰†ó~Mâ^U·úXå©ÅŽâÜ*,ª²zаŽC“ª›õ3ºkÚ@Mn+"4™<Â*Ì¥ªj²hDhrãÓ„U§ô8çýjYeVDh²¡þ®°®¿èÁ[Ïð±ºãÐd÷õ£BvÔ˵’¢ºã/èúÐd1Åûw…u!×zë®M:ê²VnîTUSLXþÐd9—ß^Xï M¾íC´€·YpÇä¶ž^ 8ï·m`Ý>V7÷¬Ù…zr „&Ó—ýLSX¾/µÉ#¬±ç¯nS3GP9B“éË~FX¥¹Ùµ2D¨zÍqôØ89B“ÉËBX9¸õ9Ð%º@™õÿj;ªó”~ð±Šñãì0¹‰¯±äkµyN´£:yTç¼ßÒ¹žÑÇê¦ý¢»yøLSX  ¾qÕSaϧ·,Âg„•ªÀ•Z ´šPÖgQ—_eQMy~ÆÇÊI­ªâd™â8‚ôÛoBçËבUu¿ht5-Î;Ÿ}ð ƒô8‚t:¢Ÿµ–š³8/µÉ#,%…ƒÒˆRÝ°Ëæ3ÂÊBÍm "©ƒôø„¨R*+žÈ*¡@ÕÄC³&w¤2=ÅŽêêù÷jŸ7$u61¤G¤‚ö³ ü’o`Ô¦º_4¾ #;H"H9Ý|ÞŽ‡ó¢Q›LÂŠå ‚T°×g0‚‹ªj0#öãŽRQï}¦Æ:ÃCÜ*‡Ä¦p7w¨'ÇPi7™|ÆÇJ¦oýï…œ÷@é(:²È³|T'ëœwKUwý.gÎLŠ mˆy´=9ú#Hûô—)ÞDR!W0jã•U.aÅužæ3ЧP˜Ø¤½LjéqÌ{a;¾B!Ïê¼RIö±îXº:O©¸óþtY%=Äú®×ØQ<Ê:ïž6ðW‹<íZ¡_´–&¨šˆÃÒU¡Q›€·TFXÕ”g-vÜJº»^Ú?Oö=Ž Âï²~•w&–øÒ\svzùØx;ªó”ò;ï'¼õše•Òõ8AÚZ5‘vT'Ì멬âóÝ6oÕý¢É¤GGŠnÛÿ™¦0˨;²z®°ìx?Ýq©t´ó®x]¨ˆ÷±b»°Ž"H·AZ‰v¼ŠSûd•ÒÆ.ÒtAzBXÕÕóyœ÷·VV‚ë#H=MáWæ 5©|&Dsÿþ®6÷äý»%‚Î{ãi鿬®j.$¬@©ình‹ÛQ-ä¨Í=Ýã)$¬@©ì íŠÛQ'¾ªêzK SHX¡9HÓ‡tª«çO&Ò/TUSOMñaIUmSYÕdî‰ñŠçýµ¼ô¨Mõ3+zž÷s¼[XtÕ;Û@EÒ[: 1ïgø ¬¡õÿv„ò­®žOHô9ìï–UB)æy?“H¯ksq˜ð|¬ˆ7¡½¤¦—ÁЍ9aÇ“ *«ó¯€>+1í©ðx#o© í–<öÓ7¼NX¼½–øó;È\ þR8ú±ÂÊ–µ¹…Ìê 5z£9/ž*¢dVç 5Ñ2c»4…í[_¦8ZÖ¦2sË%F†²Ç/ à‹ ]?ùû>/}ý+¢²ªN·;ï±x"H°&î¼_},hm.‹ 5M¡ÇÇzú¤Ïš$´ðGRiì²ržR㼿2æÝ®¬Â>ÖWHê Mœç݉ 5£b竞 7m œwN´°âV¦h¬§Bב2£ÂÇšßãc%zVÕ)àna±Í÷ÁûR3¤óªIAà°{H„n6cƒöñoB3Li%ž í3äï -`ÇýÂr‡‘XÖ¦‚ßåšÄZš Zì q#~kÿªSÀÛ…U‹!{rÊê3TSžµØ±ÅŸ‚·M¤?ÛÌqi÷˜Uìÿ|•Õùl?Cîšâ8‚”wµ&Bß#¬M¬gô¨ œwÎõ¤ßHÒ¹]e•« ¬Nw ‹K¡ë‰H*7»ãR±qÞŽ øÛ9V𬒉+ä¯MÍ>¡;Ž íÓ}¬+)VU}Œø!¥b]ìXa ‚” «ÒÐäUU<Ñ«*8 B‹—Uã„%*+:‚”Y5‘v\%,»²ú/Ôcçý01^XÓ8ÌÑa3RO ßí¤¢ 4?ÊʪÀ…ž5eêIƒR†þ&ÆxËF»Þ6G¤2))‚ôнž™B1ïÒ6½),d•B DòªœwzÔ¦Ð5?Cæ~,“c ‚t¬iH§À¨ œwNæ~¬ÓÜÓFmJQîVt?Ö9®=ñ ºB³’¿«°?BÏ#„Q›ìäïÇ*`G®Úz#*•H‹ ÎûoäïÇ:iGÈ,…¼¯ªxbQ8ï͇"Hé‰ônhkSÀíÎ{aŠÚAÏÏ¿ª$ñ:òIA"–YU1|ûŸƒ¯BV5•Õ§È>)ˆŠM^ç²õoDÛñKmÕ-ÄgˆïÇ’JØ òmбÉ&9°mÇér ··«:gèn+rR›ìF"Ó§ìH Ê6°:Ü-,å]M Ò鸙F}6NÙM•²úÉ>Öñ¤ lÍ—7NÙú×ï&á©p`QO…„•V!Û£6&‘œ÷‚ðmÎ5…¡Ðä„ÐÚETûÐÚET N|œõEhòyîsÞ}9òÎEu^öÝÎ»ì ˜5¹±ºÚàÆ9;¼À[¯‰d罋ËÒ‰Dölœ²ÃFm*#µ»!"lFf™sHç°BöVVÕµŸ!wi;ʱ²Q›°°ª³èn«ÖY“ŸÖV§€»…5±ö¶Y“ýÀa¯•ø¦°ìÄɧò„¬ê¥š@¿äÐdÝ:‰ÛöêZˆ¯ðŒÐä]QU=jçs…°¼1¥çìð 0Ÿ5ïZªSÀs…å)=cÇFm@s…°ü1¥évÀ[ å…å)¶CÖ¹gz¬ªk!>CyauÞ@šh;ž5jçsÉS¡'ô/ÁŽ÷´Õ)àÃÂzÚ¨ h®ÖÙRgÎYóñï_‰PK|äù(·®¥Ë먬vunžumà¼ä:aˆ }æ¨ œwÎuÂJŒ %gH{Á \Õ)àñÂJÒyö¨ h*ŠnX71j󪥪BëÚÀy/H]ÂzŨ œwNMÂzO÷z€êðva±OÈê3ÔAŠQ›wq°vkSv_×Î{An–Š) ÚñÜQ8ïœ;„¥cJ½v¼ ƒÝKu x‘°tL)iÇ›Eõ%îVG\Vîðˆ*hä³ë³è–»P RXÞªªºaý–XBX°ºaý–X޽°À˸CVõtøƒ—a"@X x Ô»ÑNº·ßk\ΤçTáÏã@e­;"Ñœ@eç¶3Ê$’F-ÙÍ^‹L"e‘¹–ç6C¨Û$÷ufH0hM¤ êB·¨ Ý¢‹!§»µÓ÷¡Ì:eî–ÿÔ™êœqèøÂež ‡qÙtÍ ”Qvn;£Ö3)£¦¡ëæÙc‘I¤,2×òÜ&cu›Ô™„Eã`6ö™DÒ ½4È:Á_nANwk1t>É)‘8:üY0ötâį»y±Ãœ@eç¶3Ê$’FÉéP<™DÊ"s-Ïm2†P·Iî£,2óýP™DÊ ³2È>Á_nᕇdž¼C@bÒš}Alß(®KÂBF±Q,`”µ¨[Œêv¨kÑC(‹Ô>Ê¢Ù­†HdöQY'Êí"zësÿ“ð8ò•£Z¢)ììs¶…¬{G#Nð%«Q<ÑgT7´öaT"i‘¾i‘1„²Hï£,æž­kÇoëmHdöQ­'„Êí"˜õ¹CüEx œÓãö¯ç´û#D"þ!K~‚×(žè5J¶¤Qs¿N ¶³H%R™kQ™DÊ¢uaQßÚ~ׯ “HdöQ™Äp¹]CPX¢nõ8q¯tïìºùu„÷&…ÅO÷­8Ág”Hô%½F™¢,’EEXd®EYd)‹Ì¾€E~ƒD"eÙG K'Ëí"BM¡lí“},ûj…t¶±Ï[œà3Š'z’gzÒ;É5Ûy"aÑz-Â"“HYd鵈 ≤vô'u‹tb¸Ü."伇C¨CuÞKÞ4åc‘gËÖð±ÆÎ–éën=Sse”›ÛÆ(“HÕ 7g¤-2‰”EæZÞÛt(,Ê¢IwšR™DÊ ³2È=áfaéž ýgÊÖÎS!Ë=Ä`Æz‘µ›K8sU!-Ò‰ž(ýlçùe…Ež9éÊ H=êu»°|;®/>½ÁBL„¾1÷:î~…ç„Óùކςy¶N³vù…EïW¡®½¥Sz~ð4j–=·‚g~ð4˜Šÿf²]’¯›x"ßæ¡Þ£:š¿´©Þ»ûÁJkô+Nˆ»Õê³Í޵!–/-ô¡'À£à%Í'ë1²à%?©ƒ'Lƒü3úp™Më¡s3Zi~Ýf’o·ˆ³™-,}vÓlk¬–7†ü]+ïŒàY05YϪëm(íë zFæTM¬sÒÔîYï¶°ôÙMãkì'3wÆ ð,„8–b5j™‡É«~«N´ªa•…“Æëw¹a Ëœd~…\GËñ"¨oÆ ð0˜ú\]ïyq„:;Ñz‰–&þ“¯¾{„eìXª8QÃ9'粫±øÚÇÒ5–©„a9iÌ:)ªÆZ é;q¼gÆ ð4v>–Ü+¿´¯#ý¨–“f|,Þ˜í},+ë°f9M©w~ð,xÏÀ´T¢®;)­þpç>ŠSô¡ªsx*T³ÃòÇÃXaò©Á;¿xV?VÓrÏhyÜ_;›ZÕ5õk_Õz¨”…fú±äÄÝÛ~,½Ñlà¨ZÊ7¿€ð?ó£éúOLIEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/troubleshooting.png0000664000175000017500000125523414152763504022347 0ustar arvidarvid‰PNG  IHDRño=é"›bKGDÿÿÿ ½§“ IDATxœìÝyÜÖcÞ?þ×YW¥E‹Òb™±Ý4u›B7f(Yîꎸ”¥ÆX2Cõ CdϾŒlÃpßLÙrYŠ|ñÆ’Û3M–!”Jª)Déê:ø¹¾ÓºÚNåù|<Î?®ã<ŽÏñ:Žãs~þèáíS(‹Å«KE­R'€õ"^XÍñÀjVVê¥4a„L:µÔ1€¨Í7ß<:u*u ÖE¼ÀÚUW]•{ï½·Ô1€¨C9$¥ŽÀ ˆøÁSD”Byyy©#°Õ*uXß(â€ÕL/¬fŠx`5SÄ «™"^€kÔ¨Q …ÂRŸZµj¥Y³féСCN8ᄼüòË¥ŽY£G^j_.\XêH¬cf̘‘ /¼0;ï¼s7nœÖ­[ç¿øExàRG`=§ˆ Ä>ûì³üßÿû“$={öL±XÌâÅ‹óÆoäüóÏÏo¼‘wÞ9¿úÕ¯òù矗8íÚuà¦X,¦gÏž¥ŽÂ:ê¸ãŽËÕW_óÎ;/3fÌÈĉ³Ùf›¥W¯^9ýôÓK€õ˜"^€ï¡Úµk§U«VéÙ³gž|òÉüö·¿Ím·Ý–Ã;,Åb±Ôñ`rÅW¤[·niذa¶Øb‹Üzë­ÙtÓMsÅWdÖ¬Y¥ŽÀzJ/À:à’K.É®»îš|0wß}w©ãÀ:cìØ±ùå/¹T[ݺuÓ®]»,Y²$o¾ùf‰’°¾SÄ °( 9ñÄ“$7ÜpC‰ÓÀºïÝwßM’l´ÑF%NÀúJ/À:b=öH’Lœ81‹/®nŸ3gNœ­·Þ:uëÖM³fÍrÀä©§žúÖëÍ›7/…Ba©Ï°aÃ’$•••KµrÈ!5šoذaÕc¿Î$>úhu{‹-j¼3gÎLïÞ½Ó´iÓ4oÞ<Ý»wÏ;ï¼³TŸÊÊÊŒ5*]»vMëÖ­S¿~ýl¿ýö>|xªªªViíüq -¶Ø"uëÖÍÆoœ^½zåÕW_]¡ü+’-IF½T†÷Þ{ï×½²kùWW\qEu¿Í6Û,/¾øbºté’ 7Ü0 4ÈÞ{ïñãÇ/3®&{²"}ÿuío¾ùf=ôÐ4oÞ¼ºmöìÙY´hQÎ>ûì´mÛ6 4ÈFm”=zäÁÌ’%K¾õþøÇ?æwÞɶÛn›víÚ}û¡ÀJRÄ °Žhݺu’¯ 3gÏžä«¢ÖŽ;æÎ;ïÌðáÃ3{öìüùÏNƒ Ò¥K—ÜrË-ßx½¦M›¦X,f¿ýöK­Zµò÷¿ÿ=C‡M’”••¥X,¦S§N¹ãŽ;rï½÷Öh¾¡C‡¦X,¦aÆK͹ÿþû§X,f§vZ©=4hP ”?ü0yöÙgsØa‡-ÕçÑGMŸ>}Ò¹sçLž<9S§NMÿþý3xðàœvÚiK­}ÿý÷ÿÖµßyçÕkŸ1cF:vì˜{î¹'7ÜpCæÎ›?ýéO™;wn:uê” &|gþÉ–$x`ŠÅbzöì¹ÌºG•'Ÿ|²zÝ+sŽËsÊ)§¤X,¦C‡™7o^˜aÆeæÌ™yæ™g2wîÜtîÜ9O?ýtõ˜šìÉŠöý×µüñ9á„2uêÔLœ81µk×N’œx≹æškríµ×fΜ9™úè[¯;xðàTUU媫®Zª}üøñùàƒR^^¾Zç[Ç{l:uꔆ ¦sçÎéÞ½{^|ñÅê¢æ¯íµ×^2dHš5k–-Z䤓NÊᇞáÇç“O>©îwÊ)§|ãÚ?üðÃeÖþþûï窫®Êþç¦Q£Fiß¾}î¾ûî‹ÅœtÒI+´†ÍöMëÞgŸ}Ò­[·eÖ]“sü. ,È 7ÜP=çÎ;ïœÛo¿=_~ùe¸R{²²ûwÚi§e¯½öJƒ ²ë®»¦²²2-Z´ÈO<‘öíÛ§k×®©_¿~Zµj•Ë/¿<Ûn»í7®ë§?ýi***râ‰'æ¯ýk:vì¸Â{5¥ˆ`1cÆŒ$I:uÒ¢E‹$É<$éÖ­ÛR}ëÕ«—.]ºä‹/¾Èc=ö­×Ýwß}³ýöÛç¶ÛnËœ9sªÛ/¿üòœtÒI©S§NuÛê˜oUükÑ妛nš$™>}zu[÷îÝóÔSO-3¶C‡Y¼xq&MšTÝÖ¥K—ì¸ãŽË]û AƒRVVVÝ6zôèÔªU+Ý»w_꺭[·NûöíóòË/gÚ´ißš¿&ÙþÙ¿®{óÍ7O²ôºkrŽß¥aÆÙa‡–jÛ~ûí³É&›äµ×^«¾k²'+»»ì²Ër3î¿ÿþyþùçÓ¿ÿLœ81K–,I’¼ùæ›Ùk¯½¾qmO>ùd†žM6ÙäÛ7V‘"^€uÄsÏ=—$éÔ©SêÔ©“E‹eþüùÙ`ƒ ²á†.Ó¿U«VI’™3g~çµ ”Ï?ÿ<7ÜpC’ä­·ÞÊ“O>™þýûW÷Yó­¬&Mš,õw­Z_ýgpUUUÕmóçÏÏÙgŸí·ß>Íš5K¡PH¡PÈ©§žš$ùüóÏ—ºÆÉ'Ÿ¼ÌÚŸyæ™{ì±Õ}¾^{UUUš4iR}ͯ?¯¼òJ’äí·ßþÖü5ÍöMë®[·î2ëNVìWDÓ¦M—ÛÞ²eË$ɬY³j´'«² 6\n–믿>#FŒÈ»ï¾›.]º¤qãÆÙÿý« Í Ôñ¬ªªªrýõ×'I~ó›ß$ùêí·Mš4ÉÂ… óé§Ÿ.3æ£>JòÕ›N¿ËG‘V­Zåºë®Ë¢E‹rå•Wæ—¿üeš5kVÝgeæ«U«V¾üòËeúΛ7ï;3­¬=zä‚ .ÈqÇ—·Þz+UUU)‹ùÝï~—$)‹KõïÝ»w6ß|ó¥Ö~ÜqÇ-U¨\¯^½4mÚ4eeeY¼xqŠÅâr?{ï½÷jÍVS+rŽ+bΜ9ËÍ2kÖ¬$_óÖdOV×þý³B¡¾}ûfܸq™7o^Fb±˜^½z媫®ªÑz`MPÄ °2dH^xá…tÐA)//¯n?è ƒ’$?üðRý-Z”'žx"õë×Ï~ûí÷ׯW¯^N8á„Ìš5+W^yeî¸ãŽ 8p™~5¯M›6ùð×ê;sæÌ|ðÁß™ie,Y²$ãÇOëÖ­3`À€l¼ñÆ) I’/¾øb¹cÊÊÊ2pàÀêµß}÷Ý0`À2ýzõê•ÊÊÊŒ?~™ï.½ôÒüèG?JeeåjÍVS+zŽßeáÂ…yñÅ—jûË_þ’éÓ§§C‡iÓ¦M’šíɪîß¿jÚ´iÞxã$I:uÒµk׌=:…Ba™ûók•••iÛ¶í Ï«B/À÷PUUUfÍš•1cƤK—.¹ì²ËrôÑGçŽ;î¨.üL’‹/¾8[n¹e ”±cÇæÓO?Í[o½•Ã?<3fÌÈðáÃÓªU«šó„NHýúõ3tèÐì³Ï>Ùf›m–éSÓùöÝwßLŸ>=×]w]>ûì³¼óÎ;8p`Z¶l¹ê›´µk×Î^{í•™3gæòË/ÏìÙ³óÅ_ä©§žÊ7Þøãú÷ïŸ&MšdèС9ðÀ³é¦›.wí[o½uŽ>úè<òÈ#™?~æÎ››nº)çŸ~®¸âŠ”••­öl5µ"çø]š4i’3Î8#&LÈ‚ òÒK/åÈ#Lݺu3|øðê~5Ù“UÝ¿åùõ¯×_=‹-ʬY³rÙe—¥X,¦sçÎËô½ùæ›Ó°aÃüö·¿­ñ~ÀÊPÄ Pb5ÊŽ;î˜$3fL …BÊÊʲí¶Û欳ÎÊvÛm——_~9ÿýßÿúõë/5¶uëÖyñÅsØa‡eÀ€iÞ¼yvÙe—,X° ãÆËqÇ·Â9Z´h‘#<2Åb1ƒ^nŸšÎ7lذ{챹袋ҲeËuÔQ9õÔSÓºuëÌ™3'…B!§Ÿ~ú7fš8qb …BÆŒ“$ÕÅ©IR(r饗&IvÜqÇtïÞ=I2jÔ¨üñ¹öÚk³É&›dË-·Ìˆ#røá‡'IºvíšwÞy©y6ÜpÃôïß?Åb1'Ÿ|òr³´lÙ2/¼ðB<ðÀœxâ‰ÙxãÓ¶mÛÜÿý3fL=ôÐïÚâζ2ëþÚŠœãwiÔ¨Q®½öÚœwÞyiÓ¦M~þóŸ§Y³fyòÉ'ó‹_üb¥ödEû.oíÿ\¸þµ§Ÿ~:mÛ¶MŸ>}²ÑFå'?ùI}ôÑÜ|óÍ9ãŒ3–é_UU•b±˜b±¸R{5U(ú×(଼¼û,7ÞxcþñäÐC-u,jÈ9À÷"^€¸Ñ£G§Y³fùýï¾;eee¥ŽÄJXÕs¼âŠ+R(òÚk¯åÃ?L¡PÈСC×PZXÿŠÅb±Ô!J¥¼¼ùä“RGÖ²ÓO?=£F*u ¾§ñ¬¤W_}5;ï¼söÝwß4nܸÔq€µì¸ãŽË!CrÖYg•: ßCŠxVÂ'Ÿ|’=zäàƒΉ'ž¸Ôw5Ê{ìQ¢dkßÚ\ïêœë‡vN¬~[o½uxà\xá…¹çž{J€ïE¼+á²Ë.ËÌ™3söÙg—: PB:tÈ!‡’“O>9•••¥ŽÀ÷ˆ"^€*‹¹å–[²ë®»f“M6)u Ä:è L›6-?üp©£ð=¢ˆ †^{íµ|ôÑGéСÃRíW\qE …B,XñãǧP(¤P(¤¬¬l©~sæÌÉàÁƒ³õÖ[§nݺiÖ¬Y8à€<õÔSÕ}F]=¾P(äÍ7ßÌ¡‡šæÍ›W·ÝrË-ßÙgöìÙI’?þ8 È[l‘ºuëfã7N¯^½òꫯ~ãœï½÷^z÷î¦M›¦yóæéÞ½{Þyç¯÷»,Z´(gŸ}vÚ¶m› d£6J=òàƒfÉ’%+»Âs=úè£éÓ§O:wîœÉ“'gêÔ©éß¿œÓN;m…s:´úû¶ÿþû§X,f§vZ©5|­sçÎiÞ¼y&Nœø­í5=šæþ×ë<8¿ýío3sæÌ\}õÕ¹ýöÛsÄGdРA¹à‚ 2cÆŒœ{î¹¹å–[rÎ9ç|Óq.××{Þ¡C‡Ì›7/̰aÃ2sæÌ<óÌ3™;wn:wŸ~ºzÌŠÞ·5黢¿™šœg’lºé¦Iþß³E¼56cÆŒ$I“&MjC† Éû￟«®º*ÿùŸÿ™F¥}ûö¹ûî»S,sÒI'-7ë±Ç›N:¥aÆÙgŸ}Ò­[·¼øâ‹Õo÷]]žx≴oß>]»vMýúõÓªU«\~ùåÙvÛmk|­½öÚ+C† I³fÍÒ¢E‹œtÒI9üðÃ3|øð|òÉ'«5÷?«Éªªªª ‡W¤ýkkú<Ž9æ˜ì´ÓNiذaúöí›öíÛç‘GÉàÁƒ³Ã;¤Q£F9þøã³å–[æÿïÿ½Òó,X° 7ÜpCõZvÞyçÜ~ûíùòË/3pàÀê~5¹oWöÿ¦ßLMïÉÆ§P(T? QÄ Pc .L’Ô©S§Æcxà$I·nÝ–j¯W¯^ºté’/¾ø"=öØ2ãvÙe—ï¼ö7õ=ztjÕª•îÝ»/ÕÞºuë´oß>/¿ür¦M›¶Ì¸Ž;.õ÷æ›ož$™>}úwf©‰ý÷ß?Ï?ÿ|ú÷'fÉ’%I’7ß|3{íµ× _§{÷îyê©§–iïСC/^œI“&­®È˨Éþù ±+Òþµ5};ï¼óRo²É&ËmßtÓMWiΆ f‡vXªmûí·Ï&›l’×^{­º¶&÷íÊÞãßô›Y™{²¬¬,_|ñÅwo?Šxjhƒ 6H’,^¼¸Fã-Z”ùóçgƒ 6Ȇn¸Ì÷­ZµJ’Ìœ9s™ï6lø×_^Ÿ¯ç¬ªªJ“&MR(–ú¼òÊ+I’·ß~{™±ÿú¦áºuë&ù걫Óõ×_Ÿ#FäÝwßM—.]Ò¸qãì¿ÿþÕÏ+jþüù9ûì³³ýöÛ§Y³fÕk<õÔS“$ŸþùjÍýÏV׾͚>Æ/õw­ZµR»ví4hÐ`©öÚµk¯ÒœM›6]n{Ë–-“$³fͪÑ}»*÷ø7ý®Væ<+++S¿~ýíë7E¼5Ô¦M›$_.O¡PXn{½zõÒ¤I“,\¸0Ÿ~úé2ßôÑGI¾z{èêR¯^½4mÚ4eeeY¼xqŠÅâr?{ï½÷JÏñMë­Éø¾}ûfܸq™7o^Fb±˜^½z媫®Zá¹zôè‘ .¸ Çw\Þzë­TUU¥X,æw¿û]’¤X,Ö(w­Zµòå—_.Ó>oÞ¼UZÚV“Ü¥0gΜeÎ"ùªx7ùª˜·&÷횸ÇkzžŸ|òIŠÅbõ³E¼5öïÿþïI’iÓ¦-÷û ,UD¹ÝvÛåøC’ä ƒJ’<üðÃKY´hQžxâ‰Ô¯_?ûí·ßjÍÛ«W¯TVVfüøñË|w饗æG?úQ*++Wúúß¶ÞÑ´iÓ¼ñÆI’:uê¤k×®=zt …Â2ûôMs-Y²$ãÇOëÖ­3`À€l¼ñÆÕEº_|ñÅJånÓ¦M>üðÃ¥ÆÌœ93|ðÁ*­aM«IîRX¸pa^|ñÅ¥Úþò—¿dúôééСCu!lMîÛÕ}×ô<¿Þﯟ (⨱:¤eË–yíµ×–ûýÏ~ö³¼õÖ[™:uj&L˜wß}7{î¹g’äâ‹/Ζ[n™AƒeìØ±ùôÓOóÖ[oåðÃÏŒ32|øð´jÕjµæ½øâ‹³õÖ[çè£Î#<’ùóçgîܹ¹é¦›rþùççŠ+®HYYÙJ_ÿÛÖ»¢~ýë_çõ×_Ï¢E‹2kÖ¬\vÙe)‹éܹó ÍU»víìµ×^™9sf.¿üòÌž=;_|ñEžzê©Üxã+•{ß}÷ÍôéÓsÝu×å³Ï>Ë;3¦eË–«´†Î;§yóæ™8qâ µ×TMs¯mMš4Égœ‘ &dÁ‚y饗rä‘G¦nݺ>|xu¿šÜ·kâ_ÑóL’W_}5ÉW{_SÄ PC…B!Ç{lþüç?gúôéË|õÕWç§?ýi~ò“Ÿ¤wïÞ>|x~ò“Ÿ$IZ·n_|1‡vX æÍ›g—]vÉ‚ 2nܸwÜqI’‰'¦P(d̘1I’úõëW¿Yök+Ò'IZ¶l™^x!x`N<ñÄl¼ñÆiÛ¶mî¿ÿþŒ3&‡zè7^oèСÕk¾ôÒK“$;î¸cºwï¾Bë]O?ýtÚ¶m›>}úd£6ÊO~ò“<ú裹ùæ›sÆg¬ðÞŽ5*Ç|®½öÚl²É&ÙrË-3bĈ~øáI’®]»fçw^áÜÆ ˱Ç›‹.º(-[¶ÌQG•SO=5­[·Îœ9sR(rúé§×x •••)‹)‹ßÚ¾²ç±¢¹¿éú/½ôR …B{ì±,Y²$…B!—\rIž{î¹ …<ýôÓY°`A …BÎ=÷Ü>ç¯5jÔ(×^{mÎ;ï¼´iÓ&?ÿùÏÓ¬Y³<ùä“ùÅ/~QÝoEïÛšô]ÑßLMÎ3Ixàlºé¦éÖ­[÷€õW¡ø¯ÿ ðR^^ž$©¨¨¨Ñ¸ùóç§}ûöéÞ½û7¾éXÚ;ìÙ³ggÚ´i¥Ž²Ú¼öÚkÙqÇsçw¦OŸ>5»²ÏÖ ÞÄ °š4i’‡z(÷Þ{o®¿þúRÇJàÝwßM¯^½2dÈð°þSÄ °’vÜqǼôÒKyä‘GòÉ'Ÿ”:°–ÝtÓM¹ð sá…–: ßCŠxVÁ[l‘±cǦqãÆ¥Žò½S(¾ósî¹ç–:&«hEιQ£F) yíµ×òᇦP(dèС¥Ž¾Ê.½ôRoàà••:ë§b±Xê¬Î–Ï›x`5SÄ «™"^XÍñÀjVVê¥6qâÄ”———:ÆÒ’%K2}úôl¾ù楎Âj4eÊ”4oÞ<7.u”﵉'f·Ýv+u ÖE¼ÀZ§NJᩪª*S¦LÉo¼‘/¿ü2Íš5K£FJ‹Õ`É’%™ÿüó4iÒ$›o¾y6ß|ó4lذÔѾwvÛm7Ï €õX¡X,K€†Å‹ç®»îÊù矟©S§æ¨£ŽÊ9眓M6Ù¤ÔÑXÍ^~ùåŒ1"£FÊG}”víÚ¥_¿~éׯ_Ú´iSêx°¦U(â`«ªªÊ}÷Ý—3Ï<3ï½÷^úôé“óÎ;/[n¹e©£±†-Y²$&LÈÈ‘#s÷Ýwç³Ï>K§NR^^žÃ?<o¼q©#Àš ˆ€5çëâݳÎ:+o¿ýv>øà\tÑEÙf›mJX¸paüñTTTäþûïOeeeºvíšòòòôêÕ+5*uDX]*j•:ëŸb±˜‡z(;ï¼súô铟þô§™ûäÒK/ÍÏ~ö³RÇb3mÚ´Üwß}©¨¨ÈøñãÓ¢E‹ôêÕ+}ûöÍî»ïžB¡Pꈰ"*¼‰€U2~üøtîÜ9{î¹gêÖ­›^x!?þ¸$‘?™ IDAT^VÊf›m–æ¹çžË”)SrÊ)§ä™gžÉž{î™-¶Ø"Ì+¯¼Rê˜ð¼‰€•2qâÄ\xá…;vlvß}÷\xá…ùÅ/~QêX¬§&Mš”ŠŠŠŒ92ï¾ûnÚµk—òòòyä‘Ùf›mJþU…"^jäõ×_ϰaÃRQQ‘ÿøÿÈù矟.]º”:?UUUyþùçSQQ‘Q£Få£>J»víÒ¯_¿ôë×/mÚ´)uDHñ°¢þú׿æüóÏϽ÷Þ›]vÙ%gžyfzôèQêXü€-Y²$&LÈÈ‘#s÷Ýwç³Ï>K§NR^^ž#Ž8"-Z´(uD~¸ñðí&Ožœ‹/¾8wÜqGÚ·oŸ³Î:+‡rH …B©£Aµ… æñÇOEEEî¿ÿþTVV¦k×®)//O¯^½Ò¨Q£RGà‡E/Ë7eÊ”\rÉ%ùïÿþï´mÛ6çœsŽâ]Ö óçÏϘ1cRQQ‘Ç{,eeeéÒ¥Kúõë—ž={¦nݺ¥ŽÀúO/K{ÿý÷sÑEåþç²Í6ÛdÈ!9âˆ#R»víRGƒ›;wnÆŽ›‘#Gæ‰'žHÓ¦MÓ½{÷”——ç€HYYY©#°~RÄ ÀW¦Nš+®¸"7ÝtSÚ´i“!C†äè£VäÈzcÚ´i¹ï¾ûRQQ‘ñãÇg“M6É!‡’òòòì¾ûîÞ2 À꤈à‡îã?ΕW^™áǧeË–9óÌ3ï²Þ›2eJî¹çžÜzë­yóÍ7óãÿ8={öÌQG•wܱÔñX÷)âø¡š={v®¸âŠ\sÍ5iÞ¼yN9å”üñÙ`ƒ J ÖªI“&¥¢¢"#GŽÌ»ï¾›víÚ¥¼¼5jT>úè£ì´ÓNéÛ·oz÷îÖ­[—:"ëE¼?Ÿ~úin¸á†\rÉ%©]»vN<ñÄœ|òÉÙpà K ¾w–,Y’ &däÈ‘¹ûî»óÙgŸ¥S§N)//ÏG‘-Z”:"ßoŠxÖw ,Èu×]—K/½4•••9á„2dÈ4iÒ¤ÔÑ`°páÂ<þøã©¨¨È}÷Ý—%K–¤k×®)//O¯^½Ò¨Q£RGàûG/ÀúêóÏ?ÏÍ7ßœK.¹$Ÿ}öY~ó›ßäôÓOOÓ¦MK ÖYóçÏϘ1cRQQ‘Ç{,eeeéÞ½{úöí›ýöÛ/uëÖ-uD¾ñ¬o¾üòËÜvÛm9ï¼ó2þüsÌ19ãŒ3ÒªU«RGƒõÊܹs3vìØŒ92O<ñDš6mšîÝ»§¼¼<p@ÊÊÊJ€ÒQÄ °¾X¼xqn½õÖ\pÁ™5kVŽ:ꨜ{î¹iÓ¦M©£ÁzoêÔ©¹ÿþûSQQ‘ñãÇgÓM7ÍÁœòòòì¾ûî) ¥ŽÀÚ¥ˆ`]WUU•ûî»/C† ÉÔ©SsÔQGåœsÎÉ&›lRêhðƒ4yòäŒ5*wß}wÞ|óÍüøÇ?NÏž=sÔQGeÇw,u<ÖE¼ëª¯‹w‡š)S¦¤OŸ>9÷Üs³ÕV[•:ðÿ›4iR***2bĈL™2%íÚµKyyyúöí›­·ÞºÔñXsñ¬kŠÅbÆŽ›³Î:+ùË_rðÁ碋.Ê6ÛlSêhÀ7¨ªªÊóÏ?ŸŠŠŠÜ}÷Ý™5kVvÚi§ôíÛ7½{÷NëÖ­K€ÕK/Àºdܸq9í´ÓòꫯæàƒÎ\í¶Û®Ô±€X²dIžzꩌ1"£GÎ矞ÝvÛ-ååå9âˆ#Ò¢E‹RG`Õ)âXŒ7.C† ÉË/¿œnÝºå‚ .È;ìPêXÀ*Z¸paüñTTTä¾ûîË’%KÒµk×”——§W¯^iÔ¨Q©#°r*j•:ßì¹çžË^{í•®]»¦iÓ¦yñÅóÐC)à…õÄl=zdĈ™>}zþð‡?$IŽ=öØ´lÙ2‡zhzè¡|ùå—%N @M)âø?~|ºté’=÷Ü3uêÔÉ /¼Ç<;í´S©£kH“&MÒ¯_¿<ôÐC™1cF®¾úêLŸ>=={öLëÖ­«¿[²dI©£°ñ|Lœ81=zôÈ{ì‘E‹å©§žÊã?žŽ;V÷™7o^ …ÂRŸaÆ%I*++—j?äCªÇ}üñÇ0`@¶Øb‹Ô­[7o¼qzõê•W_}u© ‹-ÊÙgŸ¶mÛ¦AƒÙh£Ò£G<øàƒŠa-iÞ¼yú÷ïŸçž{.ï¿ÿ~Î9眼ûî»ù¯ÿú¯üøÇ?ÎÀóÜsÏ¥X,®µL£G^êùòÞ{ï¥wïÞiÚ´iš7ožîÝ»çwÞYfÜœ9s2xðàl½õÖ©[·nš5k–8 O=õÔZËP Šx¾^ýõzè¡ùÿøÌ™3'ãÆËsÏ=—½öÚk™¾M›6M±XÌ~ûí—Zµjåïÿ{†š$)++K±XL§NrÇwäÞ{ïM’̘1#;vÌ=÷Ü“n¸!sçÎÍŸþô§Ì;7:uÊ„ ª¯â‰'æšk®Éµ×^›9sædòäÉiÛ¶mzöì™gŸ}v­ìðÿl¾ùæÕE»“&MʱÇ›G}4{î¹g¶Új«œ~úéyã7ÖxŽ<0Åb1={öL’ 4(ƒ ʇ~˜Q£FåÉ'ŸÌa‡¶Ô˜™3g¦cÇŽ¹óÎ;3|øðÌž=;þóŸÓ AƒtéÒ%·ÜrËÏ P*…âÚü_°°”I“&å¼óÎ˽÷Þ›]vÙ%gžyfzôè±BcÿÏÿù?Ùo¿ýr 'äú믯n?~|z÷î)S¦¤N:I’£Ž:*üãsÇwäðïî;sæÌl±Åù÷ÿ÷¼ôÒKI’­¶Ú*mÚ´Éøñã—šo»í¶ËM7Ý´ÜÂb`í›4iR***2bĈL™2%íÚµKyyyúöí›­·ÞzÍ{àf̘1y衇ҽ{÷êöòòòÜ{ï½ùøãÓ¢E‹$ɯ~õ«ÜvÛm¹ë®»Ò§OŸê¾‹-ÊV[m•üã™2eJZµjµÆò”H…7ñ”Àäɓӯ_¿tèÐ!“'OΨQ£2a„.àM’}÷Ý7Ûo¿}n»í¶Ì™3§ºýòË/ÏI'T]À›$£GN­Zµ–*¸K’Ö­[§}ûöyùå—3mÚ´$ÉþûïŸçŸ>ýû÷Ïĉ³dÉ’$É›o¾©€¾GÚ·oŸsÏ=7ÿûßóì³ÏfŸ}öÉïÿûl³Í6Ùyç3|øðÌœ9sÍß±cÇ¥þÞ|óÍ“$Ó§O¯n{à’$ݺu[ªo½zõÒ¥K—|ñÅyì±ÇÖXF€RRÄ °½÷Þ{9þøã³ýöÛçå—_ÎÿüÏÿäµ×^Kyyy …B¯7hР|þùç¹á†’$o½õVž|òÉôïß¿ºÏ¢E‹2þüTUU¥I“&) K}^yå•$ÉÛo¿$¹þúë3bĈ¼ûî»éÒ¥K7nœý÷ß¿ºø~©U«VöØc ><Ó§OÏã?žvíÚ嬳ÎÊf›m–=öØ#øÃòÉ'Ÿ¬Öy›4i²ÔßuëÖM’TUU%ùÏž 6Ø n¸á2ã¿~ûîš,4(%E¼kÁ|ã?>ÿöoÿ–Ç<7ÜpC^ýõôë×/µj­üÊuÄG¤U«V¹îºë²hÑ¢\yå•ùå/™fÍšU÷©W¯^š6mš²²²,^¼8Åbq¹Ÿ½÷Þ;IR(Ò·oߌ7.óæÍËèÑ£S,Ó«W¯\uÕU«¼ÀšS»víì³Ï>1bDfÍš•x [mµUþ×ÿú_iÙ²ezôè‘#FdÁ‚kúè<òÈ#™?~æÎ››nº)çŸ~®¸âŠ¥rýú׿Î믿žE‹eÖ¬Y¹ì²ËR,Ó¹sçÕšX;š6mš~ýú塇ÊÌ™3sõÕWgúôééÙ³gZ·n~ýúeܸq©ªªZ­ó^|ñÅÙrË-3hРŒ;6Ÿ~úiÞzë­~øá™1cF†žV­Z­Ö9¾/ Åb±Xêë‹9sæäòË/ϵ×^›FeðàÁ8p`6Ø`ƒ5:oÿþýsóÍ7çé§ŸÎÏþóåö™;wn.¼ðÂŒ=:S§NMÓ¦M³ãŽ;æÔSOÍ>ûìSÝïµ×^Ëïÿû<óÌ3yÿý÷³ÁdÛm·Í1Ç“cŽ9&…Ba®X{¦Nšûï¿??~|6Ûl³ôêÕ+åååÙ}÷Ý—ú½Oœ81:uZjü™gž™aÆ-ó\èÖ­[ÆŽ›ä«çâ°aÃ2f̘L›6- 4Èn»í–ßþö·þÇÀú¬B/Àj0wîÜ\sÍ5¹úê«S§NœrÊ)0`@êׯ¿Væ¿õÖ[sýõ×祗^Z+ó럿ýío¹çž{r×]wå­·ÞÊ[l‘Þ½{稣ŽJÛ¶mK`]£ˆ`U|öÙg¹þúësÉ%—¤víÚ9ñÄ3xðà4nÜx­æØu×]3pàÀ~øáku^`ý4iÒ¤Œ92#GŽÌôéÓÓ®]»”——§_¿~Ùj«­J`] ˆ`e,X° ·ÜrK.ºè¢|ñÅ9á„2dÈ4iÒd­ÌË-·äá‡ÎÈ‘#sûí·çª«®Êßþö·”••­•ù†ªªª<ÿü󩨨È]wÝ•?þ8;í´Súöí›>}ú¤U«V¥Žð}¥ˆ &-Z”?þñ9çœsòÙgŸå7¿ùMN;í´4kÖl­æ¸å–[rÜqÇ¥¬¬,íڵ˭·ÞšŸýìgk5ðòdÉ’<õÔS1bDFÏ?ÿ<»í¶[úõë—>}ú¬õ7|Ï)âX_~ùen»í¶œwÞy™7o^Ž=öØœqÆÞB ü -\¸0?þxFŽ™1cƤV­ZÙgŸ}R^^žƒ>8 6,uD€RSÄ ðm/^œ»îº+çw^¦M›–£Ž:*çž{nÚ´iSêhß óæÍ˃>˜ŠŠŠ<ú裩[·nºuë–¾}ûfÿý÷O:uJ ñ,OUUUî»ï¾œqÆyÿý÷ó«_ý*gŸ}v6ÝtÓRGøÞš3gNî»ï¾Œ1"Ï?ÿ|š5k–nݺ¥_¿~éÒ¥K …B©#¬-ŠxþÙ×Å»C‡Í”)SÒ§OŸœsÎ9Ùzë­K `òÁäÈÈ‘#óòË/g³Í6K¯^½R^^ž=öØ£ÔñÖ4E¼IR,3vìØœuÖYùË_þ’ƒ>8^xaþíßþ­ÔÑÖy“&MJEEEî¼óμýöÛÙb‹-Ò»wïüêW¿ÊvÛmWêxk‚"^€qãÆå´ÓNË«¯¾šƒ>8\p¢2€5dÒ¤I9rdFŒ‘3f¤]»v)//O¿~ý²ÕV[•:Àꢈøá7n\Î8㌼ôÒKéÖ­[Î?ÿüì¸ãŽ¥ŽðƒPUU•çŸ>¹ë®»2gΜtêÔ)åååéÓ§OZµjUꈫ¢¢V©ÀÿÇÞÇU]%þ_‘]Ü@Àriµ1tÌÒÂQ\¾J[FV.M3©™“VÖwÆ6S'£Ç8_·™Ê2œÓR³&'­´ÒÄ’)7HÜA@Îï~ÜÙî… äõ|<øÃsÏ=Ÿ÷ùœs?ç<êžÇ ¾¥¦¦ª_¿~ŠŠŠ’¿¿¿víÚ¥äädð@=rqqQxx¸”••¥>ø@:uÒsÏ=§…‡‡kÉ’%:þ¼³£Ô‡x4;vìPdd¤úôé£ââb}òÉ'Ú²e‹zôèáìhФ¹ºº*22RË—/×O?ý¤uëÖ)88X?þ¸­åË—ëÂ… ÎŽ `3ñ¸êýûßÿVtt´îºë.è£>Rjjª~ó›ß8;à žžžŠŽŽÖš5kôÓO?iñâÅ’¤GyD!!!ŠWrr²ŠŠŠœœ jâpÕúúë¯5bÄõîÝ[§NÒ† ”ššªþýû;;À-Z´°ÚÍÎÎÖܹs•™™©aÆ)((HñññÚºu«Œ1ÎŽ PŽÅð_-\eöíÛ§?ýéOZ»v­ºvíªY³f)..ÎÙ±røða­[·NË—/×_|¡ÐÐPÅÄÄ(..NáááÎŽ I‰âpÕ8pà€^~ùe½÷Þ{ºùæ›õüóÏ+66V‹ÅÙÑudß¾}JLLÔ{ï½§ï¾ûN7ß|³FŒ¡Ñ£GëÆotv<Ðtqˆ@ÃôóÏ?ëܹsjÓ¦Mµuøá½òÊ+úûßÿ®ë¯¿^3gÎÔØ±cåââRI ž}ûôÎ;ïhùòåÊÊÊR—.]§|P;vtv<дpˆ@ÃS\\¬ØØXjñâÅ•Ö;|ø°^zé%ýýïWûöí5sæL=òÈ#ruu­Ç´€†¦¤¤D;vìPbb¢V®\©S§N©wïÞŠ‹‹ÓèÑ£Õ¶m[gGW?ñhXJJJ¯+VÈÍÍM,÷ë‰'NœÐk¯½¦„„ê™gžÑÃ?,777'¥4T………úðÕ˜˜¨uëÖ)??_½zõR||¼F%???›ÛúöÛoõÏþSÏ<óŒ,K¦WDg'€RÆýîw¿ÓÊ•+%I‹E³g϶¾ž““£™3gªC‡zï½÷4gÎeddhâĉàTÈÃÃCÑÑÑZ¾|¹Nœ8¡uëÖ)88X?þ¸­¯]¼x±Ú¶V®\©Y³fiøðáÊÍÍ­‡ô 1ã—x43fÌмyótùך\\\´cÇmÚ´I¯½öšš7o®'Ÿ|RS¦LQóæÍ˜И={V6lPbb¢6oÞ,oooÝsÏ=Š‹‹Ó Aƒäîî^î=×^{­>,777uèÐA)))ºñÆ4‰âÐ üñÔìÙ³uåWšÜÝÝuÝu×éÔ©Sš1c†~ûÛßÊÓÓÓI)W£ãÇ+11Q‰‰‰Ú±c‡4dÈÅÇÇ+""B‹EŸ}ö™î¸ãë{ÜÜÜäîî®wÞyG÷ÝwŸÓ€ŠC¼œ/!!AS§N­ôu‹Å¢;wêöÛo¯ÇT€¦èûï¿×ªU«´råJíß¿_×^{­F­cÇŽiÕªU***²ÖµX,’¤§žzJ/¿ü²\\\œ4<âà\ÿûß5~üør¿À{9wwwEGGëÿøG=&4uûöíSbb¢V¬X¡£Gª   Âz®®®ŠˆˆÐªU«PÏ)@Å!^Îóî»ï*>>¾Ê¼¥,‹¾øâ uëÖ­’ð_}ô‘"""ª¬ãîî®víÚ)%%E]»v­§d KtqvMÓ?þñ7ή÷<÷Üsu€*¬\¹RîîîUÖ)**ÒñãÇuûí·kÍš5õ” 4dâPï6mÚ¤Q£F©¤¤¤Ü¯ðº¸¸ÈÃÃCnnnÖ2777]{íµ*))Ñ™3gê;.  +**Òš5kTTTTmÝââbhäÈ‘š8q¢Š‹‹ë!!h¨,æÊÿš”×^{MéééÎŽ  ÉÉÉѧŸ~ª’’Y,ë!^WWWy{{Ë××W>>>òññ‘···|||äéé)‹Åâää€ãL›6M½{÷vv 8û°Æ!++Kiii5zo›6mÔ»wo5kÖÌÁ©4&¬û@“•èV}p5KOO×Î;Õ«W/gGÐäåå)##CíÛ··Ð-=¬ëáááìx@½X»v­âââ8ÌöaDAABCCküþŒŒ uéÒE®®®L ±`Ýš6ñõêÕK‰‰‰ÎŽ@“À¯JãrìÃàêÆº4m.Î\m8Ä 8‡xã/à`âM–,K™¿ùóç—©Z®Î¬Y³œ”¸i[½zµºuë&OOOëX|óÍ7v·“””Tf< ê -œ­.ÇyþüùÖvCCCÖneV­Ze½^óæÍëüzŽ”••¥—^zI·Ýv›üüü¤¾}ûjݺuÎŽ4Zí_\\\ °°0=öØcúüóÏÓaX·.ÆW3ö0…C¼ ÉÊËËÓ—_~)I6l˜Œ1š>}z™:GÕþóIÒ]wÝ%cŒ^|ñÅzÏÚÔ¥¥¥iôèÑ0`€rrrôý÷ß×øðäðáÃeŒÑ°aÜ I]ŽóôéÓeŒQXX˜ÃۮȨQ£dŒQDDD½\Ï‘&L˜ ×_]úÓŸ”••¥;w*44T111š9s¦³ãREû—¢¢"8p@³gÏÖtÛm·é¡‡ÒÅ‹œ¶öX·.ÆW3ö0…C¼hðeŒÑ”)Säãã£Î;ëÈ‘#úÕ¯~Ué{|||^)Tdþüù2dˆ¼½½Õ¡C½ùæ› ÑüùóuâÄ gÇ® ®®® Ô°aÃôÑGé©§žÒ[o½¥Ñ£GËãìx6iˆëvCÌT—šZÑp8rî9²-ö0ÁÍÙ€ê9rD’ÔªU+''`”””reÍš5S—.]tìØ1edd¨mÛ¶NH\ÝæÌ™£O>ùD6lЪU«4zôhgG€F…= Gá—xÐà]ºtÉÙ8Pff¦$©eË–NN\,‹~ÿûßK’þú׿:9 \=ØÃ°‡xj¨¸¸X«W¯VTT”‚‚‚äéé©®]»*!!A%%%’¤³gÏÊb±”ù{ñŭ<66ÖÚvNNŽ&Ož¬:¨Y³fjÓ¦bbb´gχe“¤¤¤¤2~øá9R-Z´P«V­4tèP:t¨V}©Ì©S§4mÚ4uîÜYÍš5S@@€¬íÛ·—Ë·~ýzI’§§§,‹zõêUi»óçÏ—ÅbÑ… ”––fÍäææVaýìììJû|¹ÚŒIi&‹Å¢ÐÐPíÚµKóðÍ IDATòõõ•———ú÷ﯴ´´Z]Ó–ºWŽwFF†FŒ¡V­ZYËNž<©ÂÂB=ÿüóºé¦›äå奖-[*::Z6l¨ö@õ‹/¾hm+<<ÜZ¾yófkyëÖ­+ÍTÕ¼ÜåóÇÃÃC¡¡¡ŠŒŒÔ[o½¥üüürõmg[æeeÞ}÷ÝrŸ‘ììl›Ç§Ô4|øpùûûËÛÛ[}úôQjjjµ×—jþ9µ¥ßöŽmeÞ~ûm:tH7ÜpƒºtébS¿Ø¯ôsºsçNYËíyÎÙúìªÍºÑ×íê2Ù³—©jí]¶l™Më³­ý²wmµw *cËØ4µý³-µ‡³g9jî–¶W[ž ¶Ì=[ÇÅÖy\›yÂ@Ð¤ÅÆÆšØØXgÇpš/¿üÒH²éï®»î*óÞääd#ɼüòËæôéÓ&''ǼñÆÆÅÅÅLŸ>½LÝAƒóý÷ß—ËлwoóÞ{ïYÿ}üøqsíµ×šÀÀ@³qãF“››k¾ùæÓ·o_Ó¼ys³cÇŽjûeO6cŒ6l˜‘d† fvìØaòòòÌ–-[Œ§§§éÙ³g™º¬²/+V¬¨6_VV–騱£ 4ÉÉɿܹs&##ÃÄÄÄ‹Åb–.]Za¾üüüjÛ.åíí]nÌ*jóò>oÛ¶Íøùù•ë³#ÆÄcÂÂÂŒ···éÝ»·õš»ví2·Þz«iÖ¬™ùøãktM{ó•ö½oß¾fûöíæÂ… fçÎÆÕÕÕäää˜ñãÇóᇚ‹/šììl3}út#Él߾ݦ¾Vvÿ{ôèaZµjU®Üž9X:‚‚‚Lrr²9þ¼ÉÎÎ6/¼ð‚‘d,XPe»•³½ó2,,Ì„„„Xÿ]\\l¦M›f¢¢¢ÌéÓ§­åöŒÏwß}gZ´haBBḂ~hrssÍW_}e `:tè`<<û̦¾\$™Õ«W;;€šîÃJ÷/Æ «´N~~¾usüøqcŒ}Ÿw{ž]u¹n”rƺ]U¦šîe*[{m©SÓõÞ–µÕ–1¨Œ=cÓT÷Ï•qôΖ:u1w+bÏs¡ª¹gï¸TÕVMçIm÷0¬û@“¶†C¼4qâ­þÌþóŸJñöëׯ\ý±cÇwwwsîÜ9kÙÖ­[$óØc•©›ššj®¹æSTTd-{ðÁ¤r‡a³²²Œ‡‡‡éÑ£Gµý²'›1ÿýr~rrr™òØØX#©Ìô?øàƒJûb~þùçjó7ÎH2+W®,S^PP`‚ƒƒ§§§ÉÎÎ.—¯.ñ^Ùç1cÆ”ë³#ÆÄ˜_}J2_~ùe™ò¯¾úÊH2aaa5º¦½ùJûþþûïW˜³cÇŽæÎ;ï,W~à 7Ôù!^[æ`éü©è0Ä Aƒ*<ÄkË8Û;//?Ä{æÌ3pà@3eÊS\\\æýöŒO\\œ‘dÖ®][¦î±cÇŒ‡‡‡Í‡xíùœÚÛïšâuuu5íÚµ3“'O6ÇŽ³©W+ó T]â½xñb¹C¼ö|ÞíyvÕåºQÊëvU™jº—©líµ¥NM×{[ÖÖêú[{Ʀ©îŸ+ãè=œ-uêbîVÄžçBu‡xí—ªÚªé<©í†uhÒÖ¸Øòk½(oèСھ}{¹ò°°0iß¾}Ö²ˆˆuïÞ]o½õ–N:e-Ÿ7ož¦N*777kYRR’\\\4tèÐ2íé–[nÑ矮£G:,ÛåzöìYæßíÛ·—$?~ÜZ6`Àuíڵ¾<þøãrww¯2›$­[·N’4dÈ2劈ˆP~~¾>øàƒjÛq„+û"©lŸ1&¥¼½½Õ­[·2e]»vUpp°öîÝ«¬¬,»¯YÓ|·ß~{… ¤;vhâĉڹs§.]º$IÊÈÈP¿~ýlêgMÙ2KçÏàÁƒË½Ó¦Mš:ujµíV4Î5—ºãŽ;äââ¢×_]®®®e^·g|6oÞ,I8p`™ºÁÁÁºá†Ê]»2ö|NëóóøÑG)!!AÁÁÁi@åJ×wwwµnÝZ’}Ÿw{ž]õ¹nÔ÷º]™š>;+[{m©SÓ~Ù²¶:‚-cÓT÷Ï•qôΖ:u9w/ç¨çBMÇ¥"µ™'ìaÔ‡xjèܹszþùçÕµkWÈb±Èb±èøƒ$éâÅ‹eê?ù䓺xñ¢þú׿J’<¨ýë_?~¼µNaa¡Î;§’’ùûû[Û,ýûâ‹/$Iß}÷C³•ò÷÷/óïfÍšI’JJJÊ”O:µ\_>úè#Mœ8±Ê\—÷±yóæòõõ-÷z`` $);;»Ú¶áÊ>»¸üò•šÒ>;jLJµhÑ¢Âò¶mÛJ’Nœ8a×5k“ÏÛÛ»Â, .ÔòåË•™™©ˆˆùùùiРAÖCu©º9XÝü±µÝÊÆÙÞyyæÌ >\¡¡¡Ú´i“Þ}÷Ý2¯Û;–¹¹¹jÞ¼¹|||Êe(#¶²åsÚÐ>'55U’Ô»wo¹»»Ûõy·wm©Ïu£¾×íŠÔæÙYÙÚ[]ÚôËÖý]mU76RÓÞ?_©.öpÕÕ©ë¹{9G=j:.WªgT„C¼5­^xA&LÐÁƒURR"cŒ,X I2Æ”©?räHµoß^ùË_TXX¨?ÿùÏš0aB™/Ð{xx¨E‹rssSQQ‘Œ1þõïßß¡Ùìuÿý÷+00°L_|ðATû^ùûû«  @¹¹¹å^ÿé§Ÿ$ýò‹Xµa±XjõþRŽ“R§NªðþŸ8qBÒ/5í¹¦£óI¿Ü»x@[·nÕÙ³g•””$cŒbbbôÚk¯ÙÔ†‹‹‹~þùçrågÏžµ9GEª›?uÕneóÒÍÍM[·nÕúõëÕµkWM˜0A»ví*Ó®=céëë«‚‚ååå•Ëpúôi»údËç´&ý®«±à8%%%Z¸p¡$éw¿û$û>ïö®-ŽX7âº]Y¦úÚË\yMG¯÷WrÔT¥)TcZÑ5ëkîÚó\¨jîÙ;.U}nëû~€Ä!^€¹té’ÒÒҤɓ'«M›6Ö/ŒçççWø777M™2E'NœÐŸÿüg­ZµJ“'O.W/&&FÅÅÅJKK+÷Ú«¯¾ªk®¹FÅÅÅÍf/=öØcÖ¾¬X±BS¦L±ùý÷Þ{¯$iãÆeÊ µmÛ6yzzjàÀµÊèååUæ á7Þ¨%K–Ô¨­ÚŽÉå Êò”¤¯¿þZÇWXX˜Úµkg÷5™Oúåׂ8 IrwwWTT”’’’d±XÊYeÚµk§cÇŽ•)ËÎÎÖáÇmÎQ™Òùóþûï—{­{÷îzâ‰'jÕ®=óÒ××W!!!òññц äãã£áÇ+++ËZÇžñïö<»±n4Äu»ªLõ±—¹’£×û+9r *ÒÔ÷Ï©ë1­H}Í]{ž •ͽšŒKUó¸¦÷›= €Úà/@ ¸ººª_¿~ÊÎÎÖ¼yótòäIåççkûöíZ´hQ¥ï›8q¢üýý5kÖ, >\!!!åê¼òÊ+êܹ³~øamÚ´IçÎÓéÓ§µxñbÍž=[óçÏ—›››Ã³Ùë±Ç“§§§fÍš¥ÈÈH]wÝu6¿÷•W^QÇŽ5uêT¥¤¤(77WÔ˜1c”••¥„„Ö*߯ýkú¨¾úê+êĉš;w®Œ1ºûî»mzÿ€tüøqýå/Q^^ž:¤)S¦¨mÛ¶vå¨Héüyâ‰'´qãFåææêèÑ£zì±Ç”••UãC¼µ—:tÐÚµk•““£˜˜ZÛµu|^~ùeµlÙRS§NÕ–-[”——§ýû÷kìØ±òññ±»O¶|NííwMÆvéÒ¥òööÖSO=ewT¯¤¤D'NœÐúõ롹sçêá‡ÖŠ+Êü*¥=Ÿw{×–Ú® qÝ®*S}ìeêª_•qäT„ýsyu=¦•]³¾æ®­Ï…Êæ^MÆ¥ºÏ­½÷›= €Z3 I‹5±±±ÎŽáÞÞÞFR™¿yóæ•©R®Î³Ï>kŒ1&''ÇLš4É´oßÞ¸»»›ÀÀ@3nÜ83sæLkÝ=z”»îþð#ÉìÝ»·Òl§N2Ó¦M3:u2îîî¦M›6fÀ€fË–-6õÍÖlééé•öïÊò!C†”»Î„ Œ$óÉ'ŸØ”ër'Ož4S§N5;v4îîîÆßßß 8ÐlÛ¶ÍZgݺuårH2éééÕ¶àÀÓ§OãíímÚ·oo.\hŒ15îsmÇÄcÂÂÂLHHˆÙ¿¿8p ñõõ5žžž¦oß¾&55µ\}{®iKÝŠú^ÑWˆöìÙc&Mšdn¾ùfãååeZ¶lizõêe–.]jJJJlêëÙ³gÍøñãM»v팧§§ 7»ví2=zô°^wÆŒ5+çO»vį́Q£ÌÁƒ+íkMÚ­h^®\¹²\ ,¨ðš÷ß¿Ýc™‘‘a†nüüüŒ§§§éÙ³§III1Övy䛯ÁÛ>§¶ôÛÞ±½Ü¢E‹Œ§§§™>}ºÍ¹¯f’ÌêÕ« @Möaí_,‹ñ÷÷7]»v5¿ýíoÍçŸ^éûíù¼ÛúìrĺÑ×íÊ2Ùs/mY{m]ŸmíWMïYuý½RM®Ãþ¹f¹=5w«bÏs¡ª¹gnÛ;O±‡aÝš´5cŒh²âââ$I‰‰‰NN‚ÆèÍ7ßÔÂ… µ{÷ngGiºu릓'OêèѣΎ‚&„ÏiÃc±X´zõj1ÂÙQàdìÃàêǺ4i‰.ÎN€ÆkÑ¢Eš6mš³c¨ŸSpñÀfË–-Ó½÷Þ«¼¼<-Z´HgΜ᥀†Ï)4 â€]’’’ ÿû¿ÿÓªU«äæææìH Þüùóe±X´wï^;vL‹E³fÍrv,\Åøœ€óñ_f`³ñãÇküøñÎŽÑèLŸ>]Ó§Owv 4|N aà—xã/¨•üQ÷ÜsΟ?ïì(ÂêÕ«Õ­[7yzzÊb±Èb±è›o¾qÊuKÿBCCëüúuáßÿþ·¢££,???ÝyçJHHÐéÓ§íªä¬¹‹Æ%))©Ìó¥  ÀamÏŸ?¿^Ÿ[«V­²^¯yóæe^›9s¦V¯^]çÔûT j¬gP÷8Ä jlÏž=ºí¶Û4`Àùùù9;NÈËËÓõ×_¯¡C‡Öº­´´4=Z PNN޾ÿþûz9ˆVÙu¿þúk………ÕùõëBZZšÂÃÃURR¢´´4eeeiÊ”)š1c†žzê)gÇk®†¹‹Ægøðá2Æhذao{úôé2ÆÔÛskÔ¨Q2Æ(""¢Ük&LÐÓO?­çž{®^²°_SاµÅzuÏÍÙ@ãtþüyEGGë¾ûîÓïÿ{gÇ©3Æ•””¨¤¤¤Öm%&&Ê£)S¦ÈÇÇG>>>:räˆR6ÌëÖ¥eË–©¸¸X¯¿þº:vì(I9r¤þõ¯©°°ÐÉ醫aî^ |||Ô­[7¥¦¦:; ¨sçÎZ·nºwï®®]»jĈÎŽà2UíS›Ús¹>ûëÈk5µqrÖ3¨{â52wî\eggëùçŸwv”:åëë«C‡9¤­ÒC­ZµrH{ ýºuÉ#IÊÎÎÖõ×_o-_¸p¡³"58WÃܲ°°0ÅÆÆêÉ'ŸTLLŒÜÜø:ÐP4•}*à¬gP·\œ4>Æ-[¶LwÜq‡‚ƒƒ§Ñ¸téR“ºn]Љ‰‘$=þøãÊËËsrš«ßÕ8‡G¸÷Þ{uôèQmܸÑÙQüìSû±ž@Ýá/°ÛÞ½{õÓO?),,¬Lùüùóe±Xd±Xª]»v)""B¾¾¾òòòRÿþý•––V®½œœMž½LÝï¾ûδhÑ„„„˜?üÐ:&‘‘‘¦M›6ÆÃãLýñãÇóᇚ‹/šììl3}út#Élß¾½\¾Š|ôÑGÆËË˼þúëÖ¾ :ÔYë 2ÄH²þÝwß}6µÍÜm˜s·²ûPÓûcvïÞmòòòÌòåË$3xð`3lØ0óå—_šÜÜ\³hÑ"#É<ñĵ곷··¹ë®»*{óÛ¢²ëõèÑôjÕª\¹=s¡´ïAAA&99Ùœ?Þdgg›^xÁH2 ,¨²ÝmÛ¶??¿JÛµõž^ùÜ*..6Ó¦M3QQQæôéÓÖr{îoEϲ¯¾úÊ 0ÀtèСܳ¬Ô¹sçŒ$Ó§OŸ _¯Œ$³zõj»Þƒ«SMöa¨ZuûÔªžËö>lY¯ëj-³u ¯ª¿¶°gïVÕµìÙ_Ú’ÛžõΞ>سW©‹ý]uuêbŽSóõ ¶aÝš´5â ‰«ÉᑹsçIfáÂ…¾f$™/¿ü²LùW_}e$™°°0kÙƒ>h$™+V”©›••e<<سW©Ëý]euêr޲ž@Ýà/°[óæÍ%IEEE•ÖiÑ¢E…åmÛ¶•$8qB………:wîœJJJäïï/‹ÅRæï‹/¾$}÷ÝwvÕ½’··w­ú[ÿ2ÿnÖ¬™$©¤¤¤Ú÷–ö«yóæòõõ-÷z`` $);;ÛImsîÜ9=ÿüóêÚµ«¬÷øøƒ$éâÅ‹Öì¹¹¹jÞ¼¹|||ʵP®láÂ…Z¾|¹233!??? 4Èz ¡:”ôßû"I>>>Ú´i“~õ«_iéÒ¥zòÉ'uéÒ%%$$hüøñv÷Ÿ¹ÛðænE÷¡6÷ÕÏϯ̿]\\äêê*//¯2å®®®eî…#û\›üu¡º¹P]ßmm×ÅÅÅ®v+»§gΜÑðáêM›6éÝwß-󺽟Ѫže¥ŸýÊËÓÓ³Ê:ê-ûÔŠÔæoËzí赬6k¸=j»w+eëþ².8ª—«ëý]U󥮿(ëÔ ñ»µk×NÒ/_Ư̩S§dŒ)W~âÄ I¿ŠòððP‹-äææ¦¢¢"c*üëß¿¿]uùûû«  @¹¹¹å^ÿé§Ÿ$ýò‹^õ%::Z/¼ð‚&L˜ ƒª¤¤DÆ-X°@’¬ãêáá!___(//¯\;¥c}9‹Å¢x@[·nÕÙ³g•””$cŒbbbôÚk¯U›­U«V’¤o¿ý¶LyË–-õᇪS§Nzíµ×Ô»woy{{+..Îîþ3wmãì¹ëŒûZ“>[,–zÍïâ⢟þ¹\ùÙ³gíj§¢¼Uõ½®Ú­l¹¹¹iëÖ­Z¿~½ºvíª &h×®]eÚµç3ZÕ³ìôéÓ•æ?þ¼Œ1Öu€óU·O­ê¹\ßëZ}¬e•õמ÷Ûºw«êZ¶î/mÍmÏzWÛýgEË>ÄV¬gPw8Ä ìö«_ýJ’tôèÑJë”9P%I_ýµŽ?®°°0ëÄcbbT\\¬´´´rm¼ú꫺æškT\\lwÝÆäÞ{ï•$mܸ±Lyaa¡¶mÛ&OOO 8°^²\ºtIiii ÒäɓզMë!Šüüürõ,IÚ¼ys™òììlë¯æ^®E‹:pà€$ÉÝÝ]QQQJJJ’Åb)×ÿŠ”Þ« èÌ™3e^k×®¶nݪ-Zh×®]ŠŒŒ¬ÑÁæ®íœ=wq_íí³——W™CF7Þx£–,YRgùÛµk§cÇŽ•)ËÎÎÖáÇíj§"¥}ÿý÷˽ֽ{w=ñĵjמyäëë«ùøøhÆ òññÑðáÕ••e­cÏý­ìYvòäIeddTš½ô^—®‹œ¯º}jUÏeg¬ku½–UÕ_[سw«ìZöî/mÉmÏzWÛýgeÃ>ÄV¬gPw8Ä ì¦¶mÛjïÞ½•Öñ÷÷×3Ï<£ôôt]¸pA»wïÖØ±cÕ¬Y3%$$Xë½òÊ+êܹ³~øamÚ´IçÎÓýq' IDATéÓ§µxñbÍž=[óçÏ—›››Ýu“W^yE;vÔÔ©S•’’¢ÜÜ\ÿú׿ÖÁƒuäÈ¥§§+33S}úô©³ü ÐñãÇõ—¿üEyyy:tè¦L™¢¶mÛ:¬ïO<ñ„6nܨÜÜ\=zT=ö˜²²²j|ˆ×Þ{z¥:híÚµÊÉÉQLLŒ ­íÚz+z–íß¿_cÇŽ•O¥×Þ³g¤_î;€†¡º}juÏåÚû¬ÙµkW¹òW^yÅ|úé§åÊÿ÷ÿ·F}>pà€éÓ§ñöö6íÛ·7 .´;¿=Ξ=kÆoÚµkg<==Mxx¸Ùµk—éÑ£‡µ/3f̰{.TÖ÷víÚ™Q£F™ƒVy¯ím·¢{ºråÊrm,X° ÂkÞÿývßßËŸežžž¦gÏž&%%ÅDDDXÛ}ä‘Gʼ'..΄„„˜ŸþÙ®q’dV¯^m×{puªé> U«jŸZÝsÙ–ç‘-ëT}­eÆTý|­®¿Õ±gïVÕµìÝ_V—ÛÖõÎÞ>غW)å¨ý=óÅQsôr5]Ï`Ö} I[c1Æ€&+..N’”˜˜h×ûÎ;§[n¹EC‡-÷ ZݺuÓÉ“'uôèQ‡åDãsÓM7)??_?þø£³£ØŒ¹ ÀV{÷îU÷îÝõÞ{ïiÔ¨Qv½×b±hõêÕ1bD¥CcQÓ}ªVÕ>@YµYÏ`Ö} IKtqvÐ8ùûû+99Yk×®ÕÂ… N’­–-[ª¨¨¨Lù?ü C‡éî»ïvR2¨;™™™Š‰‰ÑÓO?Í' bŸ ؆õ ê‡x@uïÞ]»wïÖ¦M›tþüygÇ“œ9sF“&MÒ‘#GtñâE}öÙg9r¤üüüôÜsÏ9;8ÜâÅ‹õÒK/饗^rv•`Ÿ Tõ ê‡x@­tèÐA)))òóóÓüùóe±X´wï^;vL‹E³fÍrvÄ Y,–jÿþøÇ?:;fƒ¤­[·êìÙ³úÍo~£€€ÝsÏ=ºþúëõÙgŸ©S§NÎŽhæ.2ƼáyõÕWùÅB ¸|ŸŠ²X[ ±ž@}psvpõ˜>}º¦OŸîì61Æ8;ÂU#""BÎŽQ+Ì]4dŒ9ÀÑX[¨ü/à`âŒC¼€ƒqˆp0ñææìÀùÖ®]+‹ÅâìMû0€«—Åcœ8OzzºŽ9â츊]¸pA{öìÑ矮={öèÂ… j×®ÂÃÃëìxVzzº^ýu­^½ÚÙQÔÀwÞ©ÐÐPgÇ€“±CSÃþE*,,ÔâÅ‹µk×.cÔ³gOõíÛW·Þz«\\\œu„uh²9Ä ‡ËÌÌTrr²RRRô¯ýK—.]R¯^½­èèhuéÒÅÙ½5kÖhäÈ‘âë? ±`ÿò_çÏŸWRR’ÞyçmÛ¶MAAAŠ‹‹ÓC=¤nݺ9;À1ݜߥK—”žž®””%''kÿþýjÙ²¥"""´téREGG+ ÀÙ1€ÁÏÏOñññŠ×áǵråJ-Y²Do¼ñ†ºt颸øx=üðÃjÓ¦³£jÁÅÙÐ8>}Z‰‰‰ŠWëÖ­Õ§O%&&*22R[¶lQvv¶Ö¬Y£øøxð•¸æšk4cÆ }÷ÝwúôÓO®_|Q¡¡¡ŠŽŽVbb¢ŠŠŠœPâ€Í233• ¨¨(iôèÑÊÌÌÔÌ™3µÿ~:tH ŠŒŒ”»»»³ã†‹‹‹ÂÃõxñb8qBï¾û® 4räHiÒ¤IúüóÏ`7g@ÃuéÒ%¥§§+%%E6lзß~«–-[*""BË–-Ó=÷Ü£-Z8;&pUñôôT\\œâââtôèQ­X±BûÛß´dÉuéÒEñññ7nœP~‰eœ:uJ‰‰‰ŠWëÖ­Õ§O%&&***J[¶lQvv¶Ö¬Y£øøxðu,44T3fÌÐÁƒµ{÷nEFFjîܹ QTT”–/_®üü|gÇT€C¼Pff¦¥víÚiôèÑÊÌÌÔÌ™3õí·ßêСCJHHPdd¤ÜÝÝh’zôè¡„„;vL+W®TóæÍõÈ#(88X“&MRjjª³#.ãæì¨ÅÅÅÚ¹s§RRR´~ýz8p@­ZµÒÝwß­eË–iذaò÷÷wvLhÞ¼¹âââ§ãÇ+11Qo¾ù¦–,Y¢›nºI#GŽÔC=¤k¯½ÖÙQ Iã—xšˆS§N)11Qñññjݺµúôé£ÄÄD 0@[¶lQvv¶Ö¬Y£øøxðDpp°¦L™¢={öh÷îÝ0`€.\¨N:)**JË—/×… œš$ñ\Å233• ¨¨(i̘1ÊÌÌÔÓO?­èСCJHHPdd¤ÜÜÜœ@-ôèÑC :zô¨’’’ ñãÇ+$$DñññÚºu«Œ1ÎŽ Mÿçà*R\\¬;w*%%EëÖ­ÓÁƒÕºukõïß_ûÛß4|øpùùù9;&€:äáá¡èèhEGGëôéÓZ»v­-Z¤¨¨(]sÍ5=z´&Nœ¨N:9;*\Õø%^€FîäÉ“JLLT||¼Zµj¥>}ú(99Y÷Þ{¯¶lÙ¢¬¬,­Y³Fñññàš˜–-[jâĉúâ‹/ôÍ7ßhôèÑzóÍ7uýõ×+<<\K–,Q^^ž³cÀU‰C¼Ð¾}ûôꫯ*<<\ŠWVV–fÏž­üQûöíÓœ9s)777gÇÐÜrË-š3gŽŽ?®>ø@ÁÁÁzüñÇÕ¶m[1B[·n•1ÆÙ1àªÁÿ¡h ”ššªääd%%%éðáÃjÓ¦ ¤)S¦hàÀüÊ.›¸ºº*22R‘‘‘:s挵|ùrEEE©}ûö3fŒÆ¯ë®»ÎÙQ Qã—x¨œœ-_¾\#FŒP`` ¢¢¢´uëV=ZŸ~ú©²³³µ|ùrÅÅÅq€@hâĉJMMÕ¾}û4f̽ýöÛºþúëuÛm·iÉ’%:þ¼³c@£Ä!^€dß¾}zõÕW®   Mš4IgΜÑìÙ³uøðaíÛ·OsæÌQxx¸\\øêÇéÒ¥‹æÌ™£cÇŽiË–-êÒ¥‹žxâ jĈJNNVqq±³c@£áæìMYAARSS•œœ¬uëÖéÈ‘#jÓ¦ ¤)S¦hРAòõõuvLMˆ‹‹‹"##©7ÞxC6lÐ;ï¼£aÆ)88X÷ÝwŸyäÝzë­ÎŽ ‡xêYNNŽ6mÚ¤””mÞ¼Y¹¹¹êÒ¥‹ÆŒ£¡C‡ê®»î’ÅbqvLP‹-¯øøxeddhåÊ•zûí·õÆo¨Gzàtÿý÷«uëÖÎŽ Ž‹³4ûöíÓ«¯¾ªððpêÑGÕ™3gô /èÈ‘#Ú·oŸæÌ™£ððpðhn¼ñFýñÔ¡C‡ôé§ŸªGzöÙgªèèh%&&ª¨¨ÈÙ1 Áà—xê@~~¾ÒÒÒ”œœ¬þóŸ:zô¨Ú¶m«jÊ”)ú¨ÂÃÃ5tèPî² àºÒ¥KY,Y,;vLkÖ¬Ñòå˵téRùûûËb±èñÇ× 7Ü`ï¨Ðìí 5ËÎÎÖÂ… ,oooMŸ>]gÏžÕüùóuüøqeggkÁ‚ f/€ëšŸŸŸæÌ™£C‡iÇŽ Öþðùøø(,,L)))ºxñ¢½c@³a/@”––*##CñññêÕ«—n¿ýv½ùæ›êÛ·¯Ö¯_¯üü|¥§§+>>^¾¾¾öŽ ÍÎÑÑQÁÁÁZ¶l™N:¥µk×ÊÕÕU'N”···âââ”™™iï˜Ðäœì ¥;zô¨¶lÙ¢ŒŒ ýóŸÿTii© ¤É“'+<<\C‡å.»P 777EEE)**JÇ×êÕ«õ׿þU‰‰‰ò÷÷—ÅbÑÔ©Såíímï¨pÍq'^€_°ÙlÊÊÊÒ¼yó¤Þ½{kÖ¬Y*--Õo¼¡cÇŽiïÞ½Z°`‚ƒƒYÀ õЫW/Í™3G‡ÒÞ½{ªE‹©W¯^ SRR’JJJì®ñH*))‘ÕjU\\œüüü¤•+W*00P7nTaa¡¬V«bccåããcï¸Ðª*!!AÇ×ÚµkåêêªiÓ¦É××WqqqÊÌÌ”1ÆÞ1àª8Ù;€½9rD[·n•ÕjUzzºÊËË5hÐ =õÔSŠˆˆÐ]wÝÅ]v  ¹ºº***JQQQ:yò¤RRRôî»ï*11Q PLLŒ{ì1õîÝÛÞQ Á¸/h3l6›²²²4oÞ<©OŸ>š5k–$iéÒ¥:~ü¸öîÝ«yóæ)00¼ÐŒ|||¯}ûöiÿþýŠŒŒÔ;ï¼£~ýú)88X‰‰‰*..¶wL¨7ñ€ëZII‰¬V«âââÔ«W/é½÷ÞS`` 6nܨÂÂBY­VÅÆÆªgÏžöŽ   èØ±cJMM•žyæùøøÈb±(##CÆ{Ç€Ëb/¸îüðÃJLLTDD„<==5nÜ8eee)66V{÷îÕ÷߯eË–)""B...5¶ÿñÇåààPí1þ|IREEEµò‡~¸j»Ó§OëÙgŸUïÞ½åìì¬=zh„ Ú·o_µý—••é¿þë¿4`ÀuèÐAžžžŠˆˆÐ¦M›TYYÙ´ןÏÇ~øA111êÚµ«ºuë¦ððp>|¸Æ6gΜÑìÙ³Õ¯_?9;;ËÃÃC<ð€¶oßn‡€¶†ë4„‹‹‹"""”œœ¬¼¼<-Z´HÙÙÙ SïÞ½5wî\åää4Yû|>p5XÄ Z=›Í¦¬¬,Í›7OAAAêÓ§fÏž-IZºt©Nœ8¡½{÷jÞ¼y ¼âþºví*cŒF-GGG}÷Ýwz饗$INNN2ÆhÈ!Z½zµÞÿ}IRnn®¬ääd½óÎ;*,,ÔǬÂÂB 2D»wï®Úÿ3Ï<£¥K—ê­·ÞÒ™3gôÍ7ßhÀ€ŠŒŒÔŽ;šàázfŒQdd¤$iæÌ™š9s¦Nœ8¡õë×ë£>Òĉ«ÕÏËËÓàÁƒµfÍ%$$¨  @Ÿ~ú©:tè ­X±ÂÝm×/h,OOOÅÆÆ*++Kû÷ï×ĉµråJÝrË- Vbb¢ŠŠŠ®i›|>p5XÄ Z¥ââbY­VÅÅÅÉ××WAAAJJJR`` 6mÚ¤ÂÂBY­VÅÆÆÊÛÛ»QmÌž=[6›Mo¼ñFµò;wêèÑ£ŠŠŠª*{þùçuäȽñÆzðÁÕ©S'hݺu2ÆhÆŒUu·mÛ¦€€………ÉÍÍM^^^Z´h‘ú÷ï߸ƒü?O>ù¤† ¢Ž;*44TcÇŽÕ¿ÿýoTÕyþùçõý÷ßkÉ’% W—.]Ô¿­Y³F={öÔ³Ï>«S§NÙ± -áú  èĉÚºu«|||4cÆ yyy)::Z2Æ\³öø| 1XÄ Zï¿ÿ^‰‰‰Šˆˆ§§§Æ¯¬¬,ÅÅÅiïÞ½ÊÉÉѲeË!ggç«noÔ¨QºãŽ;´råJ9s¦ª|Ñ¢Eš1c†Ú·o_U–šš*GGG…‡‡WÛ‡···”••¥ãÇK’ÆŒ£]»v)66V{öìQee¥$éàÁƒ>|øUçFÛ5xðàjÏýüü$I'Ož¬*Û°aƒ$iìØ±Õ꺸¸($$D¥¥¥Úºuk'ø®_pµÚµk§ÐÐP%''+//OK–,ÑÉ“'¦o¼QsçÎÕ·ß~{Õíðù@c°ˆ´X•••ÊÊÊÒ¼yó¤¾}ûjöìÙ’¤·ÞzK'NœÐÞ½{5oÞ<6I†™3gª¤¤Dï¼óŽ$éСCú裧¬¬LçΓÍf“»»»ª=>ÿüsIªúâøÛo¿­¤¤$åää($$D]ºtј1cª'åîî^íù¥Åì6›MÒÿŸ«®®®êܹsí½¼¼$IyyyMœà?¸~Áµäáá¡ØØXeffê믿ִiÓ´nÝ:õïß_AAAJHH¨¶·¡ø| ¡XÄ Z”ââbY­VÅÅÅÉ××WAAAZµj•µiÓ&Êjµ*66¶ê ûMéÑG•———þû¿ÿ[eeezýõ×5uêTyxxTÕqqqQ×®]åää¤òòrcj}Œ1B’äàà )S¦(##C?þø£RSSeŒÑ„ ôÆo4yŸÐv¹¸¸ÈÝÝ].\PQQQ×O:%é?wh ¸~AcÝvÛmš7ožrrr”žž.½ð êÕ«—¢££eµZUQQÑ }òù@C±ˆØ]NNŽ!OOO?^ÙÙÙš5k–öîݫÇkÙ²eŠˆˆ¨º3WsqqqÑÓO?­üü|½þúëZ½zµâããkÔ›0a‚***´sçί-\¸P7ÞxcÕÄ»víªH’Ú·o¯°°0¥¦¦ÊÁÁA|ðAÓvmÞøñã%©Æ\+++Ó¶mÛäææ¦Ñ£GÛ#@­¸~ÁÕpttThh¨’’’tòäI-[¶LgÏžUdd¤nºé&ÅÇÇëË/¿¬×¾ø| ¡XÄ š]ee¥2335wî\¨_¿~š;w®ÜÜÜ´|ùr>}Z™™™š3gŽíWO?ý´ÜÜÜôÒK/)44T7ß|s:¯½öšúõë§'žxB›7oÖ¹sçTXX¨eË–é•W^ÑâÅ‹åääTUúôéúꫯTVV¦üü|ýéO’1F#GŽlή¡ zíµ×Ô§OÍœ9Siii***Ò¡C‡4iÒ$åææ*!!¡Yîr P_\¿àZqww—ÅbQzzº¾ùæ=õÔS²Z­ºóÎ;¤„„\v|>ÐÆcïàúWXX¨mÛ¶Éjµ*--MgÏžUß¾}®ˆˆÝÿýjß¾½½cÖ)66VË—/×'Ÿ|¢_ÿú×µÖ),,Ôþ𥦦êرcêÚµ« ¤ßýîw ­ª÷å—_êÏþ³þõ¯éÈ‘#ruuUÿþý5mÚ4M›6MÍÕ-´bÉÉÉŠ‰‰©Qþâ‹/jþüù5æÑرc•––&I:sæŒæÏŸ¯7êøñãêСƒî½÷^ýŸÿóX(š ×/h‰l6›víÚ¥U«ViÍš5*//WXX˜,‹ÆWëçT>¨§ñ€&“““Sµh÷“O>‘ÍfÓ½÷Þ«ˆˆ=ôÐCºí¶Ûì±ÞÞ}÷]½ýöÛÚ»w¯½£’þÿ"¾þZ ®_ÐÒýôÓOJMMÕªU«´mÛ6yxxèá‡ÖôéÓ5hРªz|>PO)NöN®•••Ú½{·ÒÒÒ´iÓ&}óÍ7òôôTHHˆV¬X¡‡zH]»vµwÌFùË_þ¢Ù³gÛ; ‰téÒE‹E‹EÇŽÓš5k´|ùr%&&Êßß_‹E?þ8ŸÔ›£½€Ö­°°P)))²X,êÞ½»† ¦””………)==]yyyJNN–ÅbiU xW¬X¡ñãÇëüùóúË_þ¢³gÏ*::ÚÞ±ÍÀÏÏOsæÌÑwß}§—^zI%%%š?¾zöì©ýû÷ËÑÑQ/^´wL-wâ –““#«Õª´´4}òÉ'²Ùlº÷Þ{5wî\EFFjÀ€öŽxM¤¦¦ÊÃÃCþþþZ·nœœøª´57Ýt“~øá999ÉÏÏO7Þx£&Ož¬.]º(**JS¦LQpp°½chŒ1ÆÞ!@ËVYY©Ý»w+--M7nÔÔ­[79RááኌŒ”»»»½cmJrr²bbbÄ×@kÁõ ®''NœÐßÿþwýíoÓ¡C‡äïï/‹Å¢©S§ÊÛÛÛÞñ´ )ŽöNZ¦3gÎ(%%E‹EݺuÓ°aÔ’’¢Q£F)==]yyyJNN–Åba/ MñõõÕœ9stðàAíÝ»W¡¡¡Z´h‘|}}¦¤¤$•””Ø;&;c/¨’““£„„………ÉÛÛ[“&MRNNŽžþy8p@‡VBB‚BCCåäädï¸Ø]`` tâÄ ¥¦¦ÊÃÃCÓ¦M“,‹222¸5ÐFñ×4Új—9< IDAT°ŠŠ íÙ³GiiiJMMÕÁƒÕ½{w1Býë_É]v¨EDD(""B¹¹¹JNNÖÊ•+¦[o½U<òˆ¦Nª>}úØ;*€fÂxhc ”’’"‹Å¢nݺiذaJIIÑèÑ£•žž^õEc‹ÅÂ^¡gÏžŠ×_|¡ýû÷kܸqzçwtóÍ7+88X‰‰‰*..¶wLMŒE¼´ÙÙÙZ¸p¡ÂÂÂÔ³gOY,åææê…^ÐÁƒuøða%$$(44TNNNöŽ Àu# @ ,ÐñãÇ•šš*=óÌ3òññ‘ÅbQFF†Œ1öŽ   ðW7®C.\Pff¦¬V«RSSuôèQuïÞ]<ð€Ö¬Y£Ñ£G«K—.öŽ @›áì쬈ˆEDD¨°°Pï¿ÿ¾&???Mš4IO=õ”úõëg郞îÄ ÀuâôéÓJJJRtt´¼¼¼¦ŒŒ Mœ8Q;vìЩS§”””¤¨¨(ð`GžžžŠÕÞ½{µÿ~Mš4I+W®ÔÍ7߬   %&&ª¨¨ÈÞ1\%ñЊeggkáÂ… –···âââtöìY½òÊ+:zô¨²³³µ`ÁËÑ‘¯ ÐÒhÁ‚:qâ„ÒÓÓåïﯙ3gê†nPtt´¬V«*++í@#8Ù;¨¿ .(33SV«U6lбcÇÔ£G3Fñññ3fŒ:wîlڵk§ÐÐP…††jéÒ¥JNNVRR’zè!ùúújòäÉš6mšn¹å{GPO,â …;}ú´6oÞ¬´´4mÙ²EEEEò÷÷פI“®¡C‡ÊÁÁÁÞ1À5ÒµkWÅÆÆ*66Vкuë´råJ-\¸Pš2eŠ&Ož¬nݺÙ;*€Ëp´wPSvv¶.\¨àà`yyyiúôé:{ö¬^}õU;vLÙÙÙZ°`‚ƒƒYÀ ÀulÀ€š7ožrrr”žž.½øâ‹êÕ«—¢££eµZUQQaï˜jÁxhJKKµsçNY­VýãÿÐñãÇuà 7hôèъט1cÔ¹sg{Çvâèè¨ÐÐP…††ê­·ÞÒÆµjÕ*EFFªgÏžzøá‡õÄOhàÀöŽ àÿa/v’ŸŸ¯-[¶(--M›7oÖùóçåïï¯G}Tááá:t(wÙ5¸»»Ëb±Èb±èèÑ£Z»v­µtéRùûûËb±è‰'žP=ìhÓ퀶$;;[ .Tpp°¼½½5}út={VóçÏ×ñãÇ•­ (88˜¼àŠn¼ñFÍ™3Gß~û­vìØ¡àà`ÍŸ?_~~~ŠˆˆPJJŠÊË˼ß/¿ü² Òm ‹xhB¥¥¥ÊÈÈP||¼zõê¥Ûo¿]o¼ñ†úöí«õë×+??_éé銗¯¯¯½ã€VÊÑÑQÁÁÁZ¶l™òóóµjÕ*]¸pA111òööV\\œ>ÿüózíkÏž=ºûjÕª&N \ßœì€ëÍ©S§´uëV¥¥¥ióæÍ:þ¼üýý5yòd…‡‡kèСÜe4777EEE)**JÇŽÓš5k´bÅ %&&Êßß_‹E=ö˜¼¼¼jÝþ½÷ÞSEE…,‹öï߯×^{MŽŽÜC h(cŒ±wZ3›Í¦/¾øB²Z­Úµk—ÜÜÜ4räHEDD(<<\>>>öŽ à:“œœ¬˜˜ñõÐZpýØ_VV–µnÝ:kĈŠUdd¤œ%I.\Ð 7Ü ¢¢"IR»ví¢ääd¹»»Û3>ÐÚ¤ð_áÐ%%%²Z­Š‹‹“ŸŸŸ‚‚‚ôç?ÿYÚ¸q£ eµZË^Ð"jÙ²e:uê”Ö®]+WWWMš4I^^^Š‹‹Sff¦6mÚ¤óçÏWmSYY©íÛ·ëÞ{ïÕ÷ßoÇô@ëãdï´GŽÑÖ­[eµZ•žž®òòr 4HO=õ”"""t×]wÉÁÁÁÞ1.ËÕÕUQQQŠŠŠÒ±cÇ´jÕ*½÷Þ{JLLT·nÝÔ®];UTTTÕ///×áÇ5hÐ ¥¦¦jøðáö ´"܉€:Øl6eeeiÞ¼y RŸ>}4kÖ,IÒÒ¥KuìØ1íÝ»WóæÍS`` x@«ãçç§^xATZZšÎž=[mï%ååå***RXX˜Þ}÷];$ZîÄ ÀÏ”””hÛ¶mJKK“ÕjUnn®z÷î­Q£Féå—_Ö¨Q£äââbï˜×Ü×_-GGGÙl¶Z_·Ùl²Ùlzâ‰'ôÅ_èÍ7ßT»víš9%Ðz°ˆÐæýðÃúðÃeµZ•žž®òòr 4H±±±ŠˆˆÐ]wÝÅ]vÀuïoû›*++ëU÷wÞÑ×_­ÿùŸÿ‘»»{'Z'ñڛͦ/¾øBV«UiiiÊÊÊR‡4räH-]ºTêÙ³§½c4›¬¬,8p Þõ+++õñÇëî»ïÖæÍ›Õ·oß&L´N,â´ ÅÅÅú裔––¦M›6)//O}úôQXX˜^~ùe5J...öŽ  99Y111öŽÑfUVVêСCêׯŸ½£ZcŒ½#@‹Ã"^Àuëûï¿Wzzº¬V«>üðCUVVêÎ;ïT\\œ"""hïˆàX¿~½½#´zÆ•””T=/--Uee¥$©¢¢BeeeuÖ³ÙlrrrÒ]wÝ%GGÇæ °»Ý»wkÉ’%öŽ-‹x×ÊÊJíÛ·OV«UiiiÊÊÊRÇŽ5bĽõÖ[z衇äíímï˜à‹ŽŽ¶wÚ4ñ@íXÄ hÕŠ‹‹õÑG)--M7nÔ©S§Ô·o_…††êå—_ÖèÑ£åììlï˜ÚñZœœeddÈjµêÃ?Tee¥î¼óNMŸ>] ´wDm‹x-^ee¥vïÞ­´´4edd(++K Õ[o½¥ÈÈHyyyÙ;&Ta/ E:{ölÕÝvÓÒÒtöìYõíÛWáááZ°`~ýë_ËÙÙÙÞ1 VŽöÀ%999JHHPXX˜¼¼¼4qâDåäähΜ9ÊÎÎÖáÇ• ÐÐPð€&wçwÊÁÁ¡Þ   jÏ/\¸`ï.’ššÊ\neÖ­[W5^®®®öŽsÕ/^\ÕŸ^½zÙ;Î5Åùm ‹xvSYY©ÌÌLÍ;WêׯŸ^yåyxxhÅŠ*((Pff¦æÌ™#{ÇmPJJŠŒ1U¸¸8IÒæÍ›«•ÇÄÄhܸq2Æ(22ÒΩÑçÏŸ×-·Ü¢ððp{G‘dß<ÌåÖç‘G‘1F!!!öŽÒ`µÍõçž{NÆ 8ÐŽÉšç´-,â4«ÂÂB¥¤¤Èb±¨{÷î6l˜RRRªôôtååå)99Y‹E]»vµw\´:uRppp£·7ÆÈf³Éf³]ÃT×y®ö˜5…–˜©)µµþÖ¦¥{׿´Nö¸þåääÈjµ*--MŸ|ò‰l6›î½÷^Í;W=ôn»í6{G¨aß¾}õ®»nݺ&L‚æÐ¹sg>|ØÞ1ª´´<@Sa®®g,â\s•••Ú½{·ÒÒÒ´qãF8p@ݺuÓÈ‘#µbÅ =ôÐCÜeÀuÍÑÞׇ3gÎ(%%E‹EݺuÓ°aÔ’’¢Q£F)==]¹¹¹JNN–Åba/hòòò£®]»ª[·n ¯õn“§OŸÖ³Ï>«Þ½{ËÙÙY=zôЄ t'àúì#55UUƒ*::Zݺu«*[±bÅëHúÏïƒfÏž­~ýúÉÙÙYzà´}ûöµyiµ)++Óý×iÀ€êСƒ<==¡M›6©²²R’´xñb988¨¸¸X;wî¬Ú¯““S£û}áÂ…Z·ýá‡ê5¦иqãäîî®:èî»ïVZZšBCC«öõä“OÖÙï_¶{µy~éJÇì—šc.×7Óµšw ™ë9¿®46 ƒ_úùëØ±£† ¦ÌÌÌ:ë×wlêsÎÕ6...êÕ«—BCCµråJ•––^Õ¹W[ÇŽ[uN1B;wîl–~þÒ¸qãªe®zmÛ¶mrppÕj­*›9sfµúÕöWŸó«¢¢BëׯWXX˜¼½½åææ¦;î¸C ²ÙlUõ®v^š€ ‘>l–,YbBCC“““qrr2C‡5 ,0°w<¸®­_¿ÞðõКpý‚¦`yg$™Í›7×Y'22ÒH2‘‘‘f×®]æüùófÛ¶m¦K—.fðàÁÕêž]¯:¹¹¹¦OŸ>ÆËËËX­VsîÜ9sðàA3aÂãàà`–/_Þà6kóä“Owwwóᇚ’’“——gž{î9#Élß¾½ZÝŽ;š¡C‡^q\êÓïÒÒÒZ·ýù˜¦§§77·cúí·ßš®]»___óá‡VGhh¨éÑ£‡qqq©3c]™¯&ÏåÔ÷˜5×\¾R¦¦˜wWªÓØó«¾cs¥1¨Mms쫯¾2£F2½{÷®1ÇÒ‡úžs—ÆÂÛÛÛX­VóÓO?™¼¼<óꫯIæÍ7ßlÔ8ür®8и»»›#F˜ÌÌLSTTdþýï›_ýêWÆÙÙÙ|üñÇMÚϺ¼ýöÛF’Y½zuµòÇ{ÌH2111ÕÊ7lØ`BBBª•5äü²Z­F’ùãÿh ÍéÓ§ÍÒ¥K£££yî¹çjäk̼º\ç@’ù騷òòr³cÇ3gÎsë­·I¦[·n&**ʼ÷Þ{æÇ´wDh3ør$hm¸~AShé‹x­VkµòI“&IÕ­N:µÖ…`¹¹¹ÆÅÅÅ^1SC÷q)ß?ÿùÏ+ö¡®:—ª­]»¶Zù… Œqss3yyy j³6}úô1÷Ýw_òþýû7zo}ú]×¢Ù_ŽéÃ?\cL£¢¢Œ$óþûïW«›ŸŸo:tèpMñÖ'ÏåÔ÷˜5×\¾R¦¦˜wWªÓØó«¾cӘŖuͱ'N—s¬!}¨ï9wi,Ö¯__£î˜1cj]ÄÛ˜soàÀF’Ù½{wµò¯¾úÊH2lÒ~ÖåÌ™3ÆÙÙÙŒ3¦ª¬¤¤Äxxx˜›o¾Ù¸¹¹™Ÿ~ú©êµñãÇ›÷Þ{¯Ö>×çü²Z­føðá5rLž<Ù´oßÞœ;w®Z9‹x ÅHv¼ªÛø®{JII‘ÅbQ÷îÝ5lØ0¥¤¤hôèÑJOOW^^ž’““e±Xäîînï¸-ÆàÁƒ«=÷õõ•$:vìx…Ô^çR›®®®êܹs×½¼¼$©ja[CÛü¹·ß~[C† Ñ{ï½§IÒ°açñãÇ7h_Íðs¿<ÆÎÎÎ’ªiQQ‘\]]Õ©S§Û{xx4ºíÆäiªvšb._ISÏ»ËÍu©áýjª±¹Ò»á†tèСjõÒ‡úœsW‹º4öÜëÖ­›j”ßpà :yò¤òóóåééyÍûy%‹E©©©Z³ffÏž­U«VÉb±häÈ‘zî¹ç´zõjM:Uk×®Uxxx­ãU[Þ_ž_’tîÜ9½þúëÚ°aƒŽ?®ü±Ú6%%%õÊ h~,âèÂ… ÊÌÌTFF†6lØ C‡©{÷îzà´fÍ=Z]ºt±wLh³<==µxñbª}ûöUåÎÎÎzùå—«ž—••iúôéöˆP ×/@ý¸¸¸¨k×®:þ¼JKKåäÔð¯ø_‹}4¦Mwww;wNEEE5ñ:uJÒî~yµ4eÊM™2EåååúøãµxñbM˜0A¯¿þºfÏž]­®½¹¸¸¨sçÎ***Òùóçk,ÚËÏÏ·S²Ú]«cv-ça]™šsÞý¼Í¦>¿:Wšc………5ê7¤õ9ç®4×ڥŹ¿té|ºá†š¤ŸW2vìXyzzjÕªUš2eŠöìÙ£÷ß_nnn5j”>üðCåææê½÷ÞÓÿøÇ†wüg"""´cÇ%$$hâĉêÞ½»´dÉÍš5KƘý´ Žö°‚‚%%%)::Z^^^ “ÕjÕøñãµcÇ:uJIIIŠŠŠb/Ø™“““yä999©¬¬¬êqñâÅjÏ%iÒ¤IvN Àõ Ð&LPEE…vîÜYãµ… êÆoTEEE“.Ý©òƒ>¨V^VV¦mÛ¶ÉÍÍM£G¾êvºvíªH’Ú·o¯°°0¥¦¦ÊÁÁ¡FÛ:tÐÅ‹«žßzë­JLL¼ê õÀH’¶lÙR­Ô÷œ»4ÿüç?kìsРAš5kÖeûÐçϟח_~Y­ìÿ÷uòäI 8P={ö”Ô4ý¼gggÅÄÄhß¾}zñÅ)777IÒ”)STYY©—_~Y¹¹¹9rd£û_YY©;wÊÛÛ[Ï>û¬zôèQµH·´´´ÖmZÊÏC‹x MÉÎÎÖÂ… ,///ÅÅÅéìÙ³zå•WtäÈeggkÁ‚ –£#R€–dâĉվ|Yooo :´™\×/@ý¼öÚkêׯŸžxâ mÞ¼YçÎSaa¡–-[¦W^yE‹/¾â%¯Å>“»OŸ>š9s¦ÒÒÒTTT¤C‡iÒ¤IÊÍÍUBB‚¼¼¼®I[Ó§O×W_}¥²²2åççëOú“Œ15ÅÝu×]:tèŽ;¦Ý»w+''GÆ »&âü£<==5sæL¥§§ëüùóÚ¿¿üñkz—ØkáZ³k5/—©9çݵîW]3µÍ±¯¿þZ“'O®qgÞÆô¡>çÜ¥±˜5k–>øàéøñãzúé§•››{MñvìØQÏ<óŒ>ýôSkïÞ½šnÜ8uîÜYË—/×£>zU¿oo×®†®¼¼<-Z´H*--ÕöíÛõ—¿ü¥ÖmZÊÏC€$¸n•––šôôtóì³Ï???#ÉôèÑÃL™2Å$''›Ÿ~úÉÞõd³ÙL¯^½Œ¤ZÎÎÎæw¿û½cTáúÍaýúõ¦¹¾ÿî»ïÖ:—‹ŠŠªêìÞ½»Æë/¾ø¢1ÆÔ(;vlÕvgΜ1³gÏ6}ûö5íÛ·7=zô0£F2éééõÎWŸ}Ô–ï—ǯ>u.)((03gÎ4}úô1íÛ·7îîîfôèÑfÛ¶mÚ_möíÛgâââÌm·Ýf:tè`<==ͽ÷Þk–/_nl6[µº0Æ 3;v4~~~æí·ß®w† 6ÔxýÑGmô˜1Ç7:t¸b¿¯užº4ä˜5×\®+Ó%×jÞ5dn6öüªÏ1»Rëòó9æææflÒÒÒLHHHU;Ó¦MkPŒiØ9÷˱èÙ³§yä‘GÌ¡C‡ê}Œëšë‹-ªzîëëk>ûì33bÄÓ©S'ãææfî¿ÿ~“™™Ù¨±jh?¯ä–[n17Þxcí{ì1#ÉdggW+oÌ\9}ú´‰‹‹3~~~¦}ûöÆËËË<öØcfîܹUu«Úhì¼j¬æ|?€V&ÙÁch1Ž9¢O?ýTÑÑÑÚþôéÓÚ¼y³ÒÒÒ´eËÉßß_ ×}÷ÝÇ]v •zá…´xñb•——×úú矮Aƒ5s*€ºqý‚¦–œœ¬˜˜ñµx´ Pii©Ž9bï(pÍð~ uJ᯲Ђ¤¤¤èöÛo׫¯¾Ú í²³³µpáBËÛÛ[qqq:{ö¬^}õU=zTÙÙÙZ°`‚ƒƒYÀ ­ØÄ‰ë\Ó·o_À€‡ëmQ^^ž<==küüûá‡tøða9ÒNÉÐÜøË,´ÅÅÅš6m𢣣U\\¬ììl?~¼Îú¥¥¥ÊÈÈP||¼üüütûí·ëõ×_Wß¾}µnÝ:åçç+==½êuÀõáŽ;îЭ·ÞZ£ÜÙÙY=öXó¸®_´UgÏžU\\œŽ;¦’’}öÙgЉ‰Q—.]ôûßÿÞÞñÐLXÄ v–­   %%%I’Œ1rttTZZZµzùùùJJJRtt´¼¼¼¦ŒŒ =úè£Ú±c‡N:¥¤¤$EEE©sçÎöè  X,µoß¾ZÙÅ‹c§D—Çõ €¶ÆÛÛ[úñÇõë_ÿZz衇tË-·è³Ï>Sß¾}íÍÄÁcìÚ"cŒ–/_®3fÈf³©¢¢¢ê5GGG………éõ×_WZZš¬V«víÚ%WWW :TáááúÍo~£^½zÙ±{8räˆúôé£K_ûqppЯ~õ+íÛ·ÏÎÉjÇõ šRrr²bbbÄ×â°Þ N)NöNmQAA,‹¶nÝ*›ÍVãu›Í¦mÛ¶éöÛo—ŸŸŸÆŽ«^xA#FŒ›››ZŠ›nºIwÝu—>ÿüscÔ®];M:ÕÞ±êÄõ  ­r´whk>úè#(##£Ö¼—TVVêÍ7ßÔÑ£Gõç?ÿY>ø x’$‹Å¢víÚIúÏûEtt´\×/pí¤¦¦ÊÁÁ¡êqáÂ{GÂÜyçÕÆìJ   Æø:°xñâª1ìÕ«×Ë×'ñ@3©¨¨ÐË/¿¬ÐÐP¨¼¼ü²õœœôõ×_7S:@k-›Í& :T¾¾¾öŽpY\¿¸Þœ?^·Ür‹ÂÃÛ½íqãÆÉ£ÈÈÈfo—’’"cLÕ#..N’´yóæ° §^ IDATjå111㦚“öœëM¥¹úôÜsÏÉ£Ö«p}b/4ƒ#GŽè¾ûîÓþðc.{ÞKÊË˵aÃcš!! 5ñööÖý÷ß/cŒ¦Njï8WÄõ Ð2uêÔIÁÁÁöŽÑ*]ú_}~Ï×X-q|Zb¦¦ÔšúÛTs²)纽Žosœ¿\âdï õHNNVLLŒ½c@›RPP GGþfØ_S-&çú¸zO=õ”žzê){ÇZ%þ³À~¸lÛ¸~i›xßÅõ¦sçÎ:|ø°½c •Ø·o_½ë®[·®Qm4Õœ¼çúõØ'@ËÅ"^Ð`ëׯ·wh5ÊËËuàÀ•••éâÅ‹*))Ñ… tñâE]¸pA¥¥¥Uÿ>þ¼.\¸ ²²2«¼¼\;v¬¢¢¢ìÝ´Q»wïÖ’%Kš¼®/€†+--Ubb¢âããíhušëý À•qضpýÒ6ñ¾  M3õ´~ýzßh[šúýŸë àêœ8qÂÞ€V‰÷Àþ8Û.®_Úž¶ü¹222ÒHªz :´êµŒŒ #ÉlÚ´©ª,>>¾ZýòòrcŒ1ùùùfÆŒ榛n2íÛ·7Ý»w7ãÇ7_|ñEÕ¶6l¨¶í÷ßo¢££»»»ñôô4cÇŽ5ß}÷]UýE‹U«éÑ®]»&íSJJJµç0QQQÆÓÓ³ªìôéÓÆc ̬Y³Lß¾}MûöíM×®]͘1cÌG}Ôè~_òÍ7ߘÈÈHÓ¥Kãææfl¬V« ©Ú×´iÓê<¿l·´´ôªòüR}ÇçÒxÔ·úÌ¥«ÍÔ˜q«m,_¾¼Þs¥%# g$™Í›7×Y§¾c\ל4Ƙ .˜ßÿþ÷æÖ[o5nnnÆÃÃ懛7šŠŠŠËflªý^îøž={¶Fù«¯¾jŒ1¦¼¼¼Zùo~ó›jûòõõ5Ÿ}ö™9r¤éÔ©“qss3Ç7™™™õê“1Õç°³³³ñõõ5!!!æÝwß5%%%U9Ö­[gBCC———quu5·ß~»Y²d‰©¬¬¬Ñß__ßË–7´ß-MK~?;Kv¬cm/€ÎÇÇÇÞ„ë´%©©©zûí·%I«W¯VfffÕkÿûß«Ê/Y²d‰6lØ cäää¤ÜÜ\ =üðÃÕrÆÅÅéé§ŸÖ±cÇ´gϵk×N’”——§ÁƒkÍš5JHHPAA>ýôSuèÐA!!!Z±bE£ú-Iß}÷† ¢½{÷êý÷ßW~~¾Þ}÷]%$$諯¾’‹‹‹Œ1UmÔæ—íÖU^Ÿ<µièøü¼””íØ±£F;õKW“©±ãVÛ<¨O†ô«¹Î‘¦r¥1®kNJÒ3Ï<£¥K—ê­·ÞÒ™3gôÍ7ßhÀ€ŠŒŒÔŽ;.ÛnSí÷rÇ·k×®2ÆhôèÑrttÔwß}§—^zI’äää$cŒ† ¢Õ«Wëý÷߯Ú×Àõã?*>>^óçÏW^^žþõ¯©°°P#GŽÔ'Ÿ|rÅ>]šÃk×®­šÃYYY>|¸üq-[¶L’´eË=òÈ#9r¤¾ùæ;vL±±±š={¶æÌ™sÙ¾×¥¡ý´,â  <òÈ#rvvÖªU«ªÊJKKµqãFÝ|óÍÚ´i“ŠŠŠª^KJJ’Åb©zþüóÏëÈ‘#zã7ôàƒªS§N кuëdŒÑŒ3jm÷É'ŸÔ!CÔ±cG…††jìØ±ú÷¿ÿ­‚‚»÷éçæÌ™£áÇ«C‡ºçž{TQQ¡îÝ»ëùçŸ×÷߯%K–(<<\]ºtQÿþýµfÍõìÙSÏ>û¬N:Õ¨~¿ð úñÇ• °°°ªcºfÍ_õñihžkÝÎÈ‘#^£ÆÎ¥†hì¸Õ5êS§%ž#M¡>c\—mÛ¶) @aaarss“———-Z¤þýû_U¦¦Úï%³gÏ–ÍfÓo¼Q­|çÎ:zô¨¢¢¢jlS\\¬wÞy§êXéïÿ».^¼¨øøø+¶yi'$$(<<\;w–———^zé%3¦ZÝáÇëù矗‡‡‡ºwï®3fhÒ¤IJHHÐO?ýÔ¬ý´l,â  xzzêÁTzzºòòò$I7nÔ=÷Ü£ßþö·*--Õ?þñIªºƒè„ ª¶OMM•£££ÂÃëí×ÛÛ[ÊÊÊÒñãÇk´;xðàjÏýüü$I'Ož´{Ÿ~îî»ï®µ|Æ ’¤±cÇV+wqqQHHˆJKKµuëÖÛÕ§ß[¶l‘$=ºZÝ=zhÀ€µwº‘šr.׎¯¯ov;—¢±ãV×<¨O–xŽ4…úŒq]ÆŒ£]»v)66V{öìQee¥$éàÁƒ>|x£35Õ~/5j”î¸ã­\¹RgΜ©*_´h‘f̘¡öíÛר¦cÇŽºóÎ;«•ÝqÇòññÑ—_~©ÜÜÜ˶yi?ðÀ5^Û¼y³fΜ)I ×öíÛkÔ8p ÊËË•}åÖ¡1ý´l,â ‰X,UVVjÍš5’¤U«VÉb±hâĉj×®V¯^-IZ»v­ÂÃÃÕ©S'IRYY™Î;'›Í&www988T{|þùç’¤o¿ý¶F›îîîÕž;;;K’l6›]ûôK;v¬Qv©ß®®®êܹs×½¼¼$©jñÏ]©ßeee***’««k­™<<<êìsc4õ8ÔÕŽ££cµv®f.Õ×ÕŒ[mó >uZò9r­]iŒ/çí·ßVRR’rrr¢.]þ/{÷e™ÿü= à QQ“P³-Ã2-\PÐ)Ó<¤æ©¯»«äRk¹ë~¿éÚUj­}³­èZ;™áv%†æYª/¨­¹©i?Á´“ º"è€À|~t1Ë0§ç™y†àýº.®Kžyæ¾?÷á¹?÷ ó8á;v¬ù†UWyªÜ¦²²²pãÆ ¼öÚk€’’ìß¿óçÏ·y~dd¤Íã:u\ºtÉn]ÎæpS•••X¾|9úõ뇨¨(óœ{ê©§7nÜpÚ6GÔ¶›ˆˆ|oâ%""""""""""" µúЄŸŸ¢¢¢˜˜ˆ… âÈ‘#ÞÓ+òòò,ú¥¦¦ÆÛ!YøðÃÍó3((ÈÛá‘ ¥¥¥øË_þ‚ûî»áááèܹ3†®éèH½Ó§OC§Óáðv(DfÌ÷0oQÛb뽨5kÖx¼^¾ÏC¾ÆÑ>¹¿å?ÑÑÑxï½÷P^^ŽC‡!##±±±HIIÁþýûQZZŠwÞy=ö˜ùyz½‘‘‘ð÷÷G]]DÄæÏÈ‘#]ŽM§Óµh›”Ðëõˆˆˆ@MM ªªª¬¿xñ"€_¾iU-½^°°0ÔÔÔ ººÚêqG7øyƒ«ãÓœ–sÉ^Lž7{|ùñ%:3fÌÀÞ½{qõêUäååAD™™‰—^zÉ«å:ëßiÓ¦!66¯¾ú*jkk±víZÌœ9Óî ÷—/_†ˆXo¼¶oæµÅÙnj„ X±bæÍ›‡’’˜L&ˆ^~ùe°ƒjÛMDD¾7ñ‘GUWWã믿¤§§CDPWW‡S§Ná¹çžÃ©S§pß}÷aöìÙnÿ¯Ô­MFFDéééÞ…Ȧ)S¦@DœœlõXuu5z÷î´´4/DFDÎÌ›7ýë_ñ?ÿó?(--Å¡C‡Ð­[7dffbéÒ¥Þ¯ÝÚ°aàË/¿Ä·ß~ëåh|óLËq”ïíáø´=ÌDÔ–Øz/*;;Ûãõò}ò5ŽöyÌý-/00“'OÆÑ£G±lÙ2¤§§Ã`0f̘††üùÏFii)FeñÜÌÌLÔ××£¨¨ÈªÜ^x=zô@}}½Ë±ãæÍ›æßo¿ýv¼ùæ›m“'Nlß¾Ýâxmm-öíÛƒÁ€ÔÔTÕåÀ¸qã;wî´8^VV†’’—ÊôWÇÇ­æ’£˜<9nöøê5âK"##qêÔ)@@@ÆŒcþHšUK—ë¬õz=.\ˆK—.aíڵظq#/^l·¼šš>|ØâØ7ß|ƒ . 11]ºtqOãþôÓO­»çž{ðä“O¢¡¡EEEèܹ3-Z„˜˜óÍÈF£Ñy£PÛn""òm¼‰—ˆˆˆˆˆˆˆˆˆˆˆZ\‡‹ôôtìß¿O?ý4Þ~ûm<úè£nÿÏÔDÞŠaÆùL9ž&"0™L0™LÞ…šðôüi-ó“~±fÍŒ?!!!èÙ³'6lØ€¸¸8¬Y³Æç¾U¦=0™Lx÷ÝwqÏ=÷øÏ ½d›–y¦-¬]¾ÖîÚ&æ ""e|-/¾“'µ·öz sË›1c ''Çâ›i322†œœL›6 ~~–ñþùç‘€Ç;vì@ee%®\¹‚7ÞxÏ=÷Ö¬Y—ãº÷Þ{QRR‚ŸþÄÙ³g‘””äÑ6)ñüóÏ#>>YYYضmªªªPRR‚©S§¢´´ëÖ­Cll¬êr`ÕªUˆŽŽFVVöìÙƒêêjœ8q³gÏÖô[bµàÎø4§Õ\r“'ÇÍÓí²ÇQ{ÿýï£OŸ>ˆÇ… ´j’G<ñÄ8~ü8jkkqéÒ%¼øâ‹—n²×²\%s|áÂ…0 øãÿˆÑ£G£W¯^vË‹ˆˆÀ³Ï>‹ƒâúõëøê«¯0}útbݺuNãiœÃO>ù$¶oߎªª*œ;w .Dii)ž|òItèÐ#FŒ@YYV¯^ŠŠ Fàõ×_WÔn%Ô´›ˆˆ|œ)”››+®üyá믿’žžnóq“É$÷ß¿>øÀÝ0[ôôt F£ÑÛ¡BBBdèС>SŽ–’““E¯×{; RÀÓóÇç'©3fÌ _|ñ…â縚ÿ}¥|_±cǹõÖ[åðáÃ@bcc¥®®ÎÛaµ maíj‰60ß“-®äÖ¢½ä"_æÉëÐÙ{Qîp–—½ñ>O[Øï¨ÑÞÚë.5ûf̘aÆáÿþïÿ´·ÕÈÈÈÀÖ­[a4äípÈE¡¡¡èß¿? }¢-=………¨©©ñv(ä„§ç/ÎOR§W¯^8sæ Nœ8;ï¼SÑs\ÍÿJyº|_ñÈ#àW¿úþû¿ÿ‰‰‰8~ü8¶nÝŠ|ÐÛ¡µymaíj‰60ß“-®äÖ¢½ä"_æÉëPÉ{Q®r–—½ñ>O[Øï¨ÑÞÚë.5û,wß}·ÊgŸ}f>WÍ8«]‡Í÷¦Nž<)‹-???‰ŠŠ’þóŸŠÚÚÈÕüï+åû‚ÿýßÿ•‘#Gš///—€€ñ÷÷—‹/Z¯åzfOkÚ#¹“gÅ#¢ýµçõÝÝüæ,ßÛ£ÕøØÂ| Ýœt%ÿ»›7Z‹öˆ|'¯C{ïEyúu‘ˆº÷y´Ø×9‹Ií^NÉk ­÷«ZîïQ“¿ÕîGÔì•ÎÖÚçµDîçëJò5¥¥¥@fÏž-?ýô“\¿~]¾üòK4hDGGË™3g¼"Q»—““#RUU%ûÛߤwïÞRWWçð9‰‰‰×Bz†+íöÌÇDDvmæêHDDDDDDDDDDDŠyò&Þ7nXÝÄ;kÖ, ›6m²8·¦¦Fºví*ƒAÊÊÊÖ½k×. .´8^XX(qqqróæMó1µõi}ƒJ~~¾Åñ©S§ ‹›±òóóeĈVeLŸ>]¤²²Ò|lïÞ½vÛÞ£G‹?úÏœ9SXÝ´PZZ*z½^ à´jbsÔî‡~تÝjÆÑO¯£ÆÇÇË!C¬Ž÷éÓGõM¼žêãI“& ùè£,Î=þ¼èõz—nâu§ÞK—.Ipp°K7}úé§6W3Ï]‰KÍœQ‹VóGM9ö8*_‹5Û×ב_>@¾þúk‹ãÇ’˜˜h>¦fœÕ®ÃÎæ{S:t.]ºÈ¢E‹äüùóŠÚÙ?lí¾{ï½WÞ}÷]‹c'N²fÍ«óµ\ÏìiM{$wòŒ£xD´¿ö¼±¾k‘ßå{{´[˜´›“®äwóFkÑò‘¯óÆM¼ž~]$¢î}-öuÎbR»—SòZCëýª–û;GÔäoµû5{`¥ó°¥öy-‘ûùº’|ÑÞ½{eâĉҳgO ”ØØX™6mšÍÿð‡ˆZ^NN޹ûî»åÈ‘#vÏ]½zµùoŒ?Ë–-kÁhµ£¦Ý¾†ù˜ˆÈ®Í~ """""""""""ò¥¥¥€€€ÜrË-€-[¶Æoq®^¯Grr2ŒF#víÚå°Ü””ôë×o¿ý6._¾l>¾zõjüîw¿C@@€ù˜õ¹càÀ¿ÇÅÅ.\¸`>–––†‚‚«ç&&&¢®®'Ož4KNNÆ=÷Üc³íYYYð÷÷7ËË˃ŸŸÒÒÒ,Êíܹ3î¼óN9rçÎs¿šØšjÞîîÝ»°l·šq´Ç›ã;vìX8póçÏÇ¡C‡ÐÐÐ(..ƈ#—ãÉ>Þ¹s' 55ÕâÜ®]»¢OŸ>ŠcÔªÞ˜˜ôíÛ×¥z dó¸šy\E«ù£U9öhqùú:Ò($$ýû÷·8Ö¯_?tíÚÇŽ3ç45ãìê:lo¾7·ÿ~¬[·]»vUÜNÒÆñãÇqúôi<ôÐCÇgÏž ذaƒÝçj±žÙÓšöHö(¹öÑúÚóÆú®E~s'ßÛãÎø0h7']gÌDÔVyúuQSJÞçÑb_猫{9%¯5´Þ¯j±¿sFiþvu?¢„ÒyØ’û<æ~j’““ññÇãûï¿Gmm-ÊÊÊðþûï#!!ÁÛ¡€¹sçBDPWW‡cÇŽáÞ{ïµ{nvv6DÄâgåÊ•-­vÔ´›ˆˆZÞÄKDDDDDDDDDDD>¡°°0xð` ¶¶••• BXX˜Õù±±±€²²2§egeeáÆxíµ×%%%Ø¿?æÏŸo>GËú\añ»Ÿß/Ê1™Læc•••X¾|9úõ뇨¨(èt:èt:<õÔS€7nX”ñûßÿÞªí_|ñæÎk>§±í&“ æ2þõ¯NŸ>í0~µ±Ùkw`` U»eãh·Çwýúõx÷ÝwqöìY$''#<<cÇŽ5V)Oõqmm-ªªª„ÐÐP«çwêÔIUœZÕåR½!!!VÇÔÌsOÅåJ,€vóG«rµÉÝk̗ב¦"##mo¼V.]º¤zιºÛšïä[þþ÷¿£ªª !!!ãúàƒNž<‰þóŸ6ŸëîzæLkÙ#Ù£ôÚ·GëkÏë»–ùÍÕ|o;ãÃ| ]>ðdþ'"jZr]tö>–û:{ÜÙË)y­¡õ~ÕÝýJò7àú~D %óЗ÷yDDDDDD¤oâ%"""""""""""¯3™LX¿~=à7¿ù €_¾ $""555¨ªª²zÎÅ‹üòÍÎL›6 ±±±xõÕWQ[[‹µk×bæÌ™7â¹RŸŸŸnÞ¼iuîÕ«WÆäª &`ÅŠ˜7oJJJ`2™ "xùå—"bqþäɓѽ{w‹¶Ï›7Ï⃛z½‘‘‘ð÷÷G]]ÕÿVÞø3räHMcSKÉ8ÚÓã«ÓéìÖ¯Óé0cÆ ìÝ»W¯^E^^D™™™x饗—ã©>Öëõ CMM ª««­¿råŠKåº[oãgµªKéqâD›­·¹5kÖ˜ëïÖ­[‹×ßšäååYü 555Þ‰|€¯\CÌDD­ oâ%"""""""""""¯{æ™gðÏþ'NĤI“ÌÇ'Nœؾ}»ÅùµµµØ·o RSS–¯×ë±páB\ºt k׮ů±xñb«óÔÖ×¥Kœ?Þâܲ²2üôÓONcrECCŠŠŠÐ¹sg,Z´111æ-F›Ïñ÷÷ÇâÅ‹ÍmÿðñhÑ"«ó233Q__¢¢"«Ç^xáôèÑõõõ苦Òq´ÇÓãlñaÍÛo¿o¾ù&€_¾ååÔ©S€€€Œ3Æü æñØ+ÇÓ}Š”””——ã»ï¾k‘›ð¼U¯-ÙÙÙ$&&z¥þÖ$##"‚ôôto‡B>ÄW®!Gù‚ˆˆ|oâ%""""""""""¢g2™péÒ%lݺÉÉÉxñÅñøãcãÆߤñüóÏ#>>YYYضmªªªPRR‚©S§¢´´ëÖ­Cll¬¢:.\ƒÁ€?þñ=z4zõêeuŽÚúRRRpá¼úꫨ®®Æ™3g°xñbó7vh­C‡1bÊÊʰzõjTTTÀh4¢  ¯¿þºÝçÍŸ?øãÿˆŒŒ ÄÅÅÙl{BBüqìØ±•••¸rå Þxã <÷ÜsX³f üýý5M-%ãh§Ç÷Þ{ïEII ~þùg¡¡¡n—¯¦Þ'N`öìÙš~ nž»—š9£öšswþ¨-ÇGå»»f·†u¤QDDž}öYÐ>¨ÉÿÌDÔxòu‘ZZ­ûž|­æÍvÙãÎ(Éß®ìGÔî•ÌÖØç1÷»FD`2™`2™Út½¡¡¡6l˜OÄ¢•üã,^¼¡¡¡HHHÀÏ?ÿŒ»îº«UÔëhLÈuÞìWŽ)Q;!DDDDDDDDDDDD åææŠÚ?/„„„‹N'Ò¯_?ù¯ÿú/9räˆÝçWTTHVV–ÄÇÇK@@€DDDHjjªìÛ·OuüóæÍòùçŸkRßÕ«WeîܹҥK1 2lØ09|ø° 0ÀÜÖ?üávë:xð Uß,[¶LDÄêøøñãED¤¼¼\,X Ý»w—€€‰•Y³fÉÒ¥KÍç0Àª®§žzJȱcÇìÆsùòeY²d‰ÜvÛm 111’’’"{öì±ûœ¦”ÆæJ»›R2Žöxr|O:%III"Ý»w—õë×›;zô¨,X°@î¸ã –èèhyà$''GL&“E½ŽÊñtKFF†„‡‡‹Á`ʶmÛ$99Ù|þœ9sdË–-VåL›6M“zƒƒƒeÈ!òùçŸËˆ#$88Øé¸Úª×ÞZ¥fžÛ‹+99Yôz½ÕùjçŒÒX´š?jʱÇQù"î¯Ù­aILL”¸¸8ùöÛo%55UÂÂÂÄ`0ÈðáÃ¥°°Ðê|5sNɹj滈È믿.ƒA²³³U·µ‘+ùß—Ê÷†ŸþÙb|î¿ÿ~«s¾ÿþ{›cé‰õÌ_Û#igœ­]Z_{-½¾«©SDy¾o©ñ±…ù@»9©6ÿk‘7Z‹¶˜ˆZO]‡¶Þ‹Z½zµˆxöu‘«yI‹}¯Õ”ä­÷DžÚßÙ£&«}NÍXÍ<ôô>¯¥r?_Wªgïý§–"C‡õj ZËÌÌb4[e½ZŽIãšHÎû5==Ýcó¦-^gí…¯\C¾/µÅ|LD¤‘Í:)°yófLž<­õÏ 6lÀúõëñÕW_y;rDZýèÛ·/ŒF#~üñGo‡baôèÑ(,,DMM·C!¹³Žôïß8wîœ"óMžÎÿ­}Ñ0·R{Å|о1ÿy¯CjiÌßÞÃוêùÂûO¡¡¡èß¿? ½ƒÖ222°uëVFµºzµ®‰ÿá¬_=9oÚâuÖ^øÊ5ä ù¢Q[ÌÇDDù‡Ÿ·# """""""""""j)¯¿þ:–,Yâí0ÈMǶ¥¬¬ ÑÑѨ««³8þÃ?àÌ™35j”—"£¶Œë‘%^Ô^qî‘ZyyyÐétæŸÆ›¦šÿá‡0yòdDFF¢cÇŽHKKÙ3g¬Ê;uê222$%%Ù¼™Ï^½._¾Œ%K– !!z½ݺuÃèÑ£ñöÛoÃh4êëë‘››‹1cÆ sçÎ0 èׯÖ­[“Éd.kÍš5Ðét¸~ý:ŠŠŠÌuúûûÛåêÕ«Çt:V®\i®·éñ‡~Ø\Wyy9-Z„ž={"00111ÈÌÌÄÑ£GIÓ¶"** ãÆCAAUÿmݺ`0 ÓéðÀ8,[iŸÙã¬^­ÆD‹XQ2VÍçFqq1yätìØÑ|ì­·ÞrzNEEuc«¤¼æ”ôkSeeeN¯k-ÇÔ®ô™ÒõJÉ:¸w]«O¥õÔÖÖbùòåèÛ·/‚ƒƒ &à“O>ACCƒêþ³¥%Ö@¥ù‚ˆˆ|”·¾˜ˆˆˆˆˆˆˆˆˆˆˆZŸÜÜ\iM^ÈÉÉ‘ŒŒ ©ªª’¿ýíoÒ»wo©««óvX¤DZm+--2{ölùé§Ÿäúõëòå—_Ê Aƒ$::ZΜ9ãí­$''‹^¯÷v¤‚–ëHbb¢ÄÅÅi¡oótþomû‹¶€¹•Ú+æjŠù‡ÈûxRKcþöž¶øº2==]ˆÑh´y<==]8 ÕÕÕ²gÏ1 2pà@‹sOŸ>-‘‘‘'»wï–ªª*9~ü¸¤¤¤HÏž=m¾ÿd«ÞÒÒR‰—Î;K~~¾\»vMÊÊÊdÅŠ@^~ùeÉÏϲjÕ*¹r劔——Ë+¯¼"~~~’mUWHHˆ :TUŒ;Vüüüä»ï¾³:ðàÁòÁ˜¿pá‚Üzë­+Û·o—ªª*9qâ„ >\‚‚‚äÀvënÞöØØXÉÏÏ—ÊÊJ)..–ÌÌLÑét’““ã4fGÔö™=öêÕrLÔ–¥fMT;Ví>|¸Èõë×åСCÒ¡C)//WtŽ«cë¨N{”Îõ¦×õ¾}û$<<ÜêºÖú:SÃÕ>S²^)]g´¸®›Æfo<ÕÔ3wî\‰ˆˆÝ»wË7¤¬¬L²³³€¸Ü¶®!O­®ä oàþžˆÈ®Í\‰ˆˆˆˆˆˆˆˆˆˆH±ÖöÇלœ þþþr÷ÝwË‘#G¼¹€ãØöíÝ»W&Nœ(={ö”ÀÀ@‰•iÓ¦Ùü ‹7mÚ´IXüÌ™3ÇÛa‘Z¬#«W¯¶ÿeË–y ZßÓ?lÝÞ1·R{Å|@M1ÿy¯Cj)ÌßÞ×_W:»‰7??ßâøÃ?,,n&œ4i’>úÈâÜóçÏ‹^¯W|ï¬Y³€äææZ?vìX‹›xGŒauÎôéÓ% @*++-Ž»rïÞ½{€,\¸ÐâÜÂÂBéÑ£‡Å¢3sæL 7n´8·´´Tôz½ 0ÀnÝÛ¾iÓ&‹ã555ÒµkW1 RVVæ0fGÔö™=ŽnâÕjLÔ–¥æ&^µcÕØÞO?ýÔn™ÎÎqulÕiÒ¹Þüºž:uªÕu­õu¦†«}¦d½RºÎhq]7ÍÞxª©'>>^† bUFŸ>},nâUÛ¶®!O­®ä oàþžˆÈ®Í~Ê¿³—ˆˆˆˆˆˆˆˆˆˆˆ¨u™;w.Duuu8vìî½÷^o‡D.à8¶}ÉÉÉøøãñý÷ߣ¶¶eeexÿý÷‘àíÐ,L™2"bñóÖ[oy;,R@‹u$;;ÛjüW®\éh‰<¹•Ú+æ""¢ö‰ù›¼aàÀ¿wïÞpáÂó±;wRSS-ÎíÚµ+úô飸®-[¶ÆgõØŽ;••HKKCAAÕ9‰‰‰¨««ÃÉ“'×iOrr2î¹ç¼ýöÛ¸|ù²ùøêÕ«‘••ó±¼¼<øùù!--Í¢ŒÎ;ãÎ;ïÄ‘#GpîÜ9‡õ5¶}üøñÇõz=’““a4±k×.—Ûãé>Ó²|OÆêêX 4ÈiÙöÎqul•Ôéªæ×u\\Ëëº%®3{\í3%ë•ÒuF‹ëº){㩦ž±cÇâÀ˜?>:„††@qq1FŒaÕFwÖO­Zå ""òÞÄKDDDDDDDDDDDDDDDDDDDDDD¤‘ˆˆ‹ß&“ P[[‹ªª*!44Ôêù:uRTOmm-*++„°°0‡çVVVbùòåèׯ¢¢¢ Óé ÓéðÔSOnܸ¡¨Ng~ÿûßãÆxíµ×%%%øâ‹/0wî\«¸M&"""̱4þüë_ÿœ>}Ún=ÎÚ (++s¹-žî3-Ë÷T¬îŒUHHˆÓòmãÎØ*©ÓUͯk?¿_nÇi¼®–»Îšs§Ï”¬WJÖ-®ëæÍ¥õ¬_¿ï¾û.Ξ=‹ääd„‡‡cìØ±æ›v•´QÍz¢õ¨U¾ ""ïâM¼DDDDDDDDDDDD>æÇă>ˆk×®y;”V!77ýû÷‡Á`0Àáĉ-Ç~h®;((¨EëvÕš5kÌ1wëÖÍkq´Æ¾óE¾2žîÈË˳ø RMMÓç,]º¹¹¹-ù2æMu¼•7mÕÛÚ×­/¿ü&L@×®]Ž!C†`ݺu¸r劷Ck“|aÏG¾…û"â>H[ŽÞ£aÞÕž^¯GXXjjjP]]mõ¸Ò×z½¨©©AUU•Ãs'L˜€+V`Þ¼y())Éd‚ˆàå—_ˆˆÅù:Nak,Mž<Ý»wÇ«¯¾ŠÚÚZ¬]»óæÍ³¸1N¯×#22þþþ¨««³ú¶ìÆŸ‘#GºÜö‹/øå[-]¥¶Ï<]¾£1ñT¬ZŒ•+uzzl›ru®ÛÒR×Ysžì3¥ëLK͵õèt:̘1{÷îÅÕ«W‘——Aff&^zé%EmTÓZ¯Zå ""ò.ÞÄKDDDDDDDDDDDäCŽ=Šûî»)))÷v8Q]]Þ½{#--Íí²ŠŠŠðè£"%%åååøî»ï¼r#Д)S "HNNnñº]• Abb¢Wãh}ç‹|e<Ý‘‘‘AzzºâçÌ›7Ï<ó þô§?y02òeÌ›êx+oÚ«÷›o¾iµëVQQ† “É„¢¢"”––bñâÅøÃþ€§Ÿ~ÚÛáù„Ö>wµŒ¿­óV_q@Ô¾µ‡} QKsô ó®gŒ7°sçN‹ã(..V\ÎĉŸ~ú©Õc÷Üsž|òI444 ¨¨;wÆ¢E‹c¾yÐh4Ú,7887oÞ4ÿ~ûí·ãÍ7ßt¿¿?/^ŒK—.aíÚµøðñhÑ"«ó233Q__¢¢"«Ç^xáôèÑõõõëjlûöíÛ-Ž×ÖÖbß¾}0 HMMu³-®ô™§Ë·7&žŽU‹±RË“cÛœ«s½¹–¼ÎlñdŸ)Yg€–›+jꉌŒÄ©S§3fŒù?”lÚWZõŸ'Ö@­òyoâ%"""""""""""ò×®]Ä ðÐCá·¿ý­·ÃñÉd‚Édr»¬üã,^¼¡¡¡HHHÀÏ?ÿŒ»îºKƒH‰ÈBCC1lØ0MÊJHHÀ–-[ð—¿ü›7oÖ¤Lj=˜7ÕóVÞl‹ùú­·ÞB}}=þú׿">>!!!˜€¨ýr´l k®-Ù^-ëjoãÔ0ïzƪU«¬¬,ìÙ³ÕÕÕøöÛo1}út„††*.çùçŸG||<ž|òIlß¾UUU8wî.\ˆÒÒR<ùä“èСFŒ²²2¬^½0(((À믿n³Ü{ï½%%%øùçŸqðàAœ={IIIŠbš?>"""ðÇ?þˆ‹‹³wBBüqìØ±•••¸rå Þxã <÷ÜsX³f üýýµ=++ Û¶mCUUJJJ0uêT”––bݺuˆUss®ô™§Ë·7&žŽU‹±r¥NOmsîÌõ¦:ßÿ½Óú=ÙgJÖ™ÆóZb®¨­ç‰'žÀñãÇQ[[‹K—.áÅ_„ˆ`Ô¨QVmÔ¢ÿ´^]Éjæµ!"""""""""""R(77WøçÏY¶l™øûûËùóç½J«‘™™)Äh4z;INN½^ïí0TILL”¸¸8o‡Ñ*ûÎùÊx:"C‡µûxzzºêëzÒ¤IÒ­[7©««Ó"DjÆÓùßÕò™7ÕóVÞtTokX·l™9s¦/¾øÂÛ¡´ ¾¶çSËYîk |¹ ®îøú–Èû<±ôåõÊZ²½ZÖÕÞÆ©µqô¯æÝ–Ìë[¶l?Ó¦M“ƒZ_¶l™ˆˆÕññãÇ›Ë+..–ŒŒ ƒÁ ”mÛ¶Irr²ùü9sæØ­·QEE…deeI||¼H—.]dÊ”)RRRb>§¼¼\,X Ý»w—€€‰•Y³fÉÒ¥KÍe0À|þ©S§$))IBBB¤{÷î²~ýz‡}ÐÜSO=%䨱cvûóòå˲dɹí¶Û$ @bbb$%%EöìÙ£xLš·=""BRSSeß¾}Ç €Oì}y½ò„–l¯–uµ·qjm½Gã«y—yˆÚ¢«W¯¢k×®˜6mrrr¼µ"Þš;ÌÇDDvýÃÏÛpìØ1\¼x‰‰‰Ç׬YNN‡nݺáðáÃHNNFXX‚ƒƒ1räHY•W^^ŽE‹¡gÏž DLL 233qôèQ—ÎÍËË3Ç¡ÓéP\\ŒGy;v4«¨¨pÚÎæå4~°ùñ~ø“'OFdd$:v숴´4œ9sƪœ­[· t:xàó9—/_Æ’%K€ÀÀ@DEEaܸq(((p§3§NBFF"""‚¤¤$‡–••eqþG}¤ªQÚõõõÈÍÍŘ1cйsg ôë×ëÖ­ƒÉdr»ï”hZfpp0 „mÛ¶aôèÑæþ˜;w.V®\i³wîÜi>~Ë-·X•¯äñdÙZpå:W:‡”öãzvýúu™ó÷÷·sYY™â9Ü¿À®]»4è-j ˜7[GÞTR¯-îäGëÔÖÖbùòåèÛ·/‚ƒƒ &à“O>ACCƒâ¶%$$ <<ÇŽÃ>èöBÁ¹ë›s×Ýø•æ>­ÇFé¼Pr=8kƒV}ÕHÍõ܈û¢öÅÙ>ÐÙš«$o(Ysßzë-M×eOåg´È€òý›³²\ym­Õþ®)WöfJûÀÓmT³?tå=æ]"¢–!"X´hÂÃñbÅ o‡C­ç‘òÂ×ÿQ+•››+üó‚g¼÷Þ{@V­ZeóñÄÄD ‘ÁƒË¤ººZ>,wß}·ÊgŸ}f>÷Â… rë­·Jll¬lß¾]ªªªäĉ2|øp ’¸t®ˆHzzºáÇKAA\¿~]:$:tòòrÅím,Çh4Ú<žžžnnçž={Ä`0ÈÀ—SZZ*ñññ+ùùùRYY)ÅÅÅ’™™):Nrrr,Î9r¤DGGËÁƒ?}ú´DFFJ\\œìÞ½[ªªªäøñã’’’"={ö½^ïr,ëׯ²qãF‹2fÍš%dòäÉÇ·lÙ"ÉÉÉnõabb¢ÄÅŹs~~¾yî^¹rEÊËËå•W^???ÉÎζ(Wmß)a«Ì'NÈèÑ£%&&Æf™!!!2tèP«ã Ž;ZS{x²l%l§«×¹’9¤eÿ;ªß¾}ns‹ˆTVV IJJRÚU¤‚§ó¿+å3oZ÷å¼é¨^Ûë–»¹ÅÑ:4wî\‰ˆˆÝ»wË7¤¬¬L²³³€XÅgËþýû%88Xþú׿šÛ–––&uuuæsÆ/Ì?=ô¢²9w[ÇÜU¿£Ü§õب)OÍõ 4»ÓW®ì+D\ßðõ-‘÷ybèh½R›7”äC-×å¦åi‘c”Ð*¨Ù¿)‰[Íkk5mP»P³7ÓªÜi£šùæê{4¾šw™×‰¨­)--•¡C‡Ê‰'¼ µ2Þœ;ÌÇDDvmæêHDDDDDDDDDDDŠñ¯žóâ‹/ Y¿~½ÍÇ€|ýõ×Ç?.$11Ñ|læÌ™6o---½^/ pé\‘ÿ|˜ôÓO?u©Í˱÷!ÿüü|‹ã?ü°°ºiÄ^97½nÚ´ÉâxMMtíÚU ƒ”••™>\¢¢¢¬>­ÇFMyj®woâõÔ¾¢‘+û¾¾%ò>Oì­Wjó†’|¨åºÜ´<-rŒZå5û7%q«ym­¦ j÷jöfZõ;mT3ßÜyÆó.ó:‘÷1ÙµÙDDDDDDDDDDDDäu555€€€»ç„„„ ÿþÇúõ뇮]»âرc(--äååÁÏÏiiiçvîÜwÞy'Ž9‚sçΩ>·©Aƒ©o¤ ´ø½{÷î€ .(zþ–-[ãÇ·8®×둜œ £Ñˆ]»v™öÙg¸rå lq¾­ã;w¦ZœÛµkWôéÓÇ­X¢££ñë_ÿ{öìAYY`ëÖ­¸ÿþûñ›ßüF£ü1àÊ•+øì³Ï™™i³ÜéC51§¥¥¡  ÀªŒÄÄDÔÕÕáäÉ“æcjûN {eÆÄÄ oß¾.•Ù”«×ˆ·ËÖ¢%sÈ“ýß¼þ¸¸8«ú›ò÷÷‡Ñht«Nj=˜7-ùrÞt…¹ÅÞ:4vìX8póçÏÇ¡C‡ÐÐÐ(..ƈ#œÆ¶aÃTVVbÚ´i~飭[·bРAøðÃñÄO˜Ïýì³Ï0lØ0tèÐÁy£›àÜm=s×ÝøíÇFMyî^jxz_Á}Qû¡dhÚ¼ÑHI>Ôb]nJ‹£„V¹@ÍþMkjÚàÊ^@éÞÌ“} ´jæ›;ïÑ0ï©Ã›x‰ˆˆˆˆˆˆˆˆˆˆˆ|@PP ®®Îî9‘‘‘6wêÔ péÒ%ÔÖÖ¢²²&“ Ðét?ÿú׿§OŸVuns!!!nµ×™ˆˆ‹ß&“ÉésÛ„°°0«ÇcccÀ|“¬µµµ¨ªªBPPBCC­o wbyì±ÇÐÐЀ>øðÞ{ïá±Çã>Š:`ãÆ€M›6!--Íf€ë}¨6æÊÊJ,_¾ýúõCTT”yþ<õÔS€7n˜ËUÓwJ8+3**Ju™ÍËwõñfÙZÕãlyºÿ›×ïççgQsõõõ0 nÕI­ó¦%_Í›®Ò*·ØZ‡Ö¯_wß}gÏžErr2ÂÃÃ1vìXóM=Δ””øO¿@hh(vìØ»îº 999øý¬[·sçÎUÝ~ÎÝÖ3w݉p/OÛµå¹{=¨áé}÷DíÖ> IDAT‡’} -îä %ùP‹u¹)wsŒRZå¥û7Oðt>S²7<ÛJÚ¨vèÎ{4Ì»DDDDDDêð&^""""""""""""Ð¥K¿|àϞ˗/CD¬Ž7~X°S§NÐëõˆŒŒ„¿¿?êêê "6FŽ©êÜÖD¯×#""555¨ªª²züâÅ‹~ùWÊ CMM ª««­¿råŠÛ±Œ?ÑÑÑxï½÷P^^ŽC‡!##±±±HIIÁþýûQZZŠwÞy=ö˜ê68£6æ &`ÅŠ˜7oJJJ`2™ "xùå—À€¨½q¶t´æ¶tÞh‰ìîú¬U.PºS·Ò×ÖjÛà %{3@}hÝFµûCWߣaÞ%jykÖ¬1ßß­[7§ÇI;yyyÿ!BMM·C²òᇚãküÏNßž¾[{óã?âÁĵk×K—.Enn®—£""j›x/‘¸ë®»çγ{NMM >lqì›o¾Á… ˜˜hþð\ff&êëëQTTdUÆ /¼€=z ¾¾^õ¹­ÉĉÛ·o·8^[[‹}ûöÁ`0 55Õ¥²Çعs§ÅñŠŠ »K`` &OžŒ£GbÙ²eHOO7»ÉŒ3ÐÐЀ?ÿùÏ(--ŨQ£\jƒ3Jcnhh@QQ:wîŒE‹!&&ÆüA\£ÑhU®Ú¾SÂ^™eeeæoKl®K—.8þ¼Õù?ýô“Õ¹j¯O–í*OÖãJÿ[|PùöÛoÇ›o¾éRýû¼q-¥¶yS[žÌ›ji•[ì­C‘‘‘8uê cÆŒ1(·yûmiì«—_~ÿþ÷¿-ëÒ¥ öîÝ‹ÈÈH>|£GvéÆÎ]å|iî:â(÷i=6jÊSs=x"7çʾà>€¨½q¶t´^y#ox:»»>k‘ Ôîߔĭ浵»û;g”ìÍ\éO´QÍ|sõ=æ]ï©®®FïÞ½‘––æíP¨…eggCD˜˜¨è8i'##"‚ôôto‡b×”)S "HNN¶8îËó×ckOŽ=Šûî»)))Ì›7Ï<ó þô§?y9:"¢¶‡7ñù€ÄÄDtêÔ ÇŽ³{NDDž}öY|¸ZùòeY²d‰ÜvÛm 111’’’"{öìqé܃ «µ¶lÙbUÆ´iÓl–¿lÙ2«ããÇ·Y9xð ¹®ŠŠ ÉÊÊ’øøx ˆˆIMM•}ûöYÅ•””$QQQràÀEÇ‹‹‹%##CÂÃÃÅ`0ÈÀeÛ¶m’œœlŽeΜ9.ÅÒ¨wïÞÒ£G1™LÇgÍš%ääÉ“ÇÕöáêի힯&æòòrY°`tïÞ]$66VfÍš%K—.5—;`À—ûN‰¦eË!CäóÏ?—äädÑëõVç_½zUæÎ+]ºtƒÁ Æ “ÇË€Ì1üá0Ÿ¯æzòdÙŽ8OW¯sGsÈYÿ1B‚ƒƒ­b=uê”$%%IHHˆtïÞ]Ö¯_ïVý""“&M’¸¸8¹yó¦ª~#e<ÿ]-ŸyÓ÷ó¦£z­[îägëÐÑ£GeÁ‚rÇwHpp°DGGË< 999V9בm۶ɯýk¹å–[Äßß_"##eèС²víZ©ªª’Hpp°Eûêê꜖˹ë»sוøÙË}ž¥óBÍõ`¯ Z÷•Ú}…ˆëû¾¾%ò>Oì­¹Jò†’5WëuÙS9Æ-rˆúý›³¸Õ¼¶VÓµïÿ¨Ù›©íOµQÍþЕ÷h|5ï2¯“!!!2tèPo‡¡Z㚤ô¸=­µý®Ò¢½ééé@ŒF£FQiÏÞ{ájçGKòåØÚºeË–ÙÝO‹ü’ï»uë¦è½¬¦˜‰ˆìÚ¬‘›7oÆäÉ“Á?/xFee%î¼óN¤¥¥Y}KGÿþýQQQsçÎy):¢ÖgôèÑ(,,DMM·Ci—úöí £ÑˆüÑ£õ;v ÷Üs>øàL™2Å£uµWžÎÿ®–ϼIδÔ:¤%Î]"Ûì]Ïîìøú–Èû<±$Ò÷f–|9ï2¯“¡¡¡èß¿? ½Š*öÖ$µkUkm¿«´hoFF¶nÝ £Ñˆ   £Ó޽÷Â}9—ùrlm™ˆ K—.èÕ«—ÝëbÓ¦M˜:u*òòòžž®¸læc""»þáç툈ˆˆˆˆˆˆˆˆˆˆèÈÏÏÇG}„õë×{;""§ÊÊʺº:‹ã?üðΜ9ƒQ£Fy´þ³gÏ"33Ï<ó oàm‡˜7 ðþ:DDÚQ{=s@Ô~qHÔòÚZÞÍË˃N§3ÿã‘GAÇŽÍÇ***åååX´hzöì‰ÀÀ@ÄÄÄ 33Gµ*÷Ô©SÈÈÈ@DD‚ƒƒ1hÐ lÛ¶ £G6—;wî\¬\¹Òüû°aÃÌÏß¹s§ùø-·Üb7ÞÆ›ô<ÑŽÚÚZ,_¾}ûöEpp0¢££1aÂ|òÉ'hhh°Û§W¯^µˆE§ÓaåÊ•€úúz‹ã?ü°ùy—/_Æ’%K€ÀÀ@DEEaܸq(((0Ÿ£¶¿ìY³f t:®_¿Ž¢¢"ósýýý-ÎS“3MËÐëõèÖ­F·ß~F£ÑÜ/¹¹¹3f :wî ƒÁ€~ýúaݺu0™LŠëRJËö+™{o½õ–¦ó³y?üð&OžŒÈÈHtìØiii8sæŒêöªQVVæ°N@ù¸ªmO£¦ëLHH’’’\ºAYÍÚ¦–’ù¯El®öµ£¹¨„+óÕÝkD«ë²¢¢ÇŽÃÅ‹‘˜˜h·ýû÷ìÚµKq¿‘^ú `"""""""""""j…rss…^ð¼ï¿ÿ^Æ/•••æc‰‰‰çŨˆZŸäädÑëõÞ£M+--2{ölùé§Ÿäúõëòå—_Ê Aƒ$::ZΜ9ãÑúŸ~úiÙ´i“Gë ÏçwËgÞlß¼½is—Ú3µ×³»û¾¾%ò>Oì‰´Ä½ÙøzÞuµüôôt Ç—‚‚¹~ýº:tH:tè ååårá¹õÖ[%66V¶oß.UUUrâÄ >|¸ÉÌe>}Z"##%..NvïÞm>wôèÑcó=ª:t¨ÕñHÇŽíÆk4=ÖŽ¹sçJDD„ìÞ½[nܸ!eee’-¤  ÀiŸ¦¦¦ŠŸŸŸ|÷ÝwV räH‰ŽŽ–ƒ:=®tþk›«}íh¾:ãê|uçÑúº|ï½÷ÌýfOee¥¤¤$EýÒˆ¯³‰ˆìÚÌÕ‘ˆˆˆˆˆˆˆˆˆˆˆã_[ÞêÕ«€Åϲe˼–MÍã´õóç?ÿÙÛaR+áÎ|Ú´i“Õ¹sæÌiÙhÈׯ­½{÷Êĉ¥gÏž(±±±2mÚ4›Ö¤ÖÉW?lm ófûÔÖ!Î]¢_´äõÌ×·DÞÇëÐs˜¯ÝÓšöf­…¯¾®l¼ÑéÓO?µùøÌ™3€Å§"¿Ü¤¦×ëeÀ€æc“&MòÑGYœ{éÒ% n‘›xµhG||¼ 2ĪŒ>}ú(º‰w×®]@.\hq¼°°PâââäæÍ›æc³fÍV7ˆ×ÔÔH×®]Å`0HYY™ùxKÜÄ«6&GeäææZ=6vìX‹›xGŒauÎôéÓ% Àê?©h‰›xÕ¶ßÙÜSrŽšùÙ´¼üü|‹ã?ü°°ºSË›x›×9uêT«:ÕŽ«šöØ[gΟ?/z½^ñM¼jû|øðáeuƒª­ãJ翱¹Ú׎æ«3®ÎWw®­¯Ë_|QÈúõë¶U§ÓI¯^½žÓ÷÷DDvmöù¬ììldgg{; EDÄÛ!PâÎ|š2e ¦L™¢a4Þåë×Vrr2’““½æÍöª-¬Cœ»D¿h ×3‘/`¾vOkÚ›‘6 dóx^^üüü––fq¼sçθóÎ;qäÈœ;wݺuÃÎ;©©©çÆÄÄ oß¾8yò¤g‚oB‹vŒ;ûÛß0þ|<þøã8p :tè€ââbE1¤¤¤ _¿~xûí·ñÜsÏ¡cÇŽ€Õ«Wãw¿ûÌçnÙ²0~üx‹2ôz=’““ñÞ{ïa×®]xì±Ç÷»´ˆ©±ŒqãÆY=¶cÇó¿ÓÒÒ¬ÆñþûïãäÉ“STTtÍãÔÕ>¯Éñ_Ùnô9t#Ž×Km³¶ÏËîÝ»KRUAò¥üøãr:Uë~=Šxø™3f¨¼¼\;wî¼è±èèhõîÝ[ååå’¤)S¦H’>ýôÓjë\¶;f÷îÝ•——wÑúGŽ©øUj2Ž;jÿþý’¤fÍšÉl6kÆ 2™Lúøã¯i{-Z´ÐÂ… uüøq½ð úðÃvÑz:ûþrܲ²2mÛ¶M­ZµÒ¤I“ª–×Öþjݺuµbà*66öº2]Ê…1>ùä“‹1b„/^¬ŠŠ íܹSîîîzì±ÇÔ¥K—ªbÓ’’’ͧ¦êzþ5U“ãóz\i¾µ­®_×˽Ϝ/‡ &IÊÍͽì:Þk/¬ øõ(âàgž}öYyzzꡇÒ–-[túôi)&&FË—/×êÕ«åââ"Izæ™gäææ¦E‹Én·ëìÙ³úþûï5wîÜËvHœ8q¢òóóõꫯêìÙ³ÊÌÌTXX˜ºvíjØ<$iÁ‚úî»ïTVV¦ãÇë¹çž“ÓéÔøñã¯y› .T«V­´lÙ2ùúúªÿþ—ÌÕ·o_-Z´H›7oÖ™3g”‘‘¡Y³féèÑ£²Z­êÖ­[Õúµµ¿FŽ©ŒŒ åääh×®]ÊÊÊÒØ±c¯+Ó¥\cñâÅúøãuæÌåææjáÂ…:zô¨/^¬¦M›jܸq*((ÐóÏ?¯“'Oª¤¤DŸþ¹Þ|óÍͧ¦êzþ5UÓ㳦®4ßÚVׯë¥Þgöîݫٳg«m۶׫åË—+55U¥¥¥ÕÖ?}ú´üq}üñÇ:uꔼ¼¼ôÒK/iÁ‚r8’¤ððp=ºªã<ð€yä‘ZŸÇž={ôÆoèÿø‡²³³Õ²eKÝzë­š7ožæÍ›WÕéòZX,½õÖ[úâ‹/t×]w]rÂÂB­\¹R7nTnn®Z·n­Ñ£Gë‰'ž¸¨høZ÷WTTÔs8p@óçÏ××_-777EDDhá…וér~9FçÎu÷Ýwkùòå0`€¤ÿtO]¶l™>ùäÈÍÍMS¦L‘»»{Õ¼¼¼¬¥K—VÿOú“:vìxÉå+W®¬óù_Ë9TÛç٥ƻ0ß_—÷Üs6oÞ|Mó½’ëÙæµ¾®¯¾úêuÍççï3çϟװaÃôôÓO륗^Ò¶mÛ$IóæÍÓ Aƒ®x|Ôä½í®»îÒ÷߯?þ¸ZæË-¿Úñ¿zõêZÉököµtécñZ\ïñúËmÖä©­óò‚?ýéOzî¹ç”­=z\ôx`` ¾üòK:t¨F×/5ý{ ˆ"^pÍ.üó4>u}³5Fàö9À8\O})â½Ñ|}}/YÄ{³{çwôÚk¯)--Íè(€Ÿ9}ú´†*??¿‹:ïÙ³G#FŒP||¼‚ƒƒk4n}ÿ{ ²ÕnŸvpS T`` Ñ1€+***Ò'Ÿ|¢ääd}úé§úñÇ5|øpùùùiÆŒ9r¤ÑoZ÷ÝwŸÎœ9£Ï>ûÌè(®/PS;wîÔÛo¿-›Í¦òòrMŸ>]óæÍÓ„ ŒŽvÃqs$ !ã:°qjŒ×/………zûí·µvíZñ Á©¬¬”ÃáPdd¤¼½½åéé©åË—ËÕÕUk×®Uaa¡RSS®[o½Õ踆¿¿¿Ú´i#›ÍftÀM ²²R))) TïÞ½õôÓOkôèÑÚ±c‡ÒÓÓ®Î;¸f^^^Љ‰Q^^žžþy}ùå—9r¤¼½½«³gϵ(!!A&“IÛ¶mSYY™L&“~øa£cÕ© 6ÈÕÕUo¼ñ†äââbt$à’L&ÓU"##މ¤±}úôÑæÍ›Õ¾}{IRtt4x Ž˜œN§ÓèÀÕüôÓOÚ¶m›6oÞ¬M›6©  @ýúõ“ŸŸŸüýýu÷Ýw«Y³fFÇlôæÌ™£C‡)55Õè(€*##Cñññzçw”››«1cÆ($$D³gÏVëÖ­ŽW¯$%%)((HÜþ ®_.æp8«÷ß_Íš5Spp°,X #F­Áà¸Àxü=€Ë²Ñ‰õÖ‘#G+¹¹¹iúôér8 Uzzº233eµZåëëKo=¤/¿üR‡6:  )--•Íf“ÙlÖ Aƒ´víZÍœ9SJMM•Åb¡€7¥ ÝyóóóéÎ 7!ŠxP¯¤§§+::Z>>>êÓ§/^,IZ³frss•––¦ÈÈH 2Äस”I“&ÉÍÍM6›Íè(€Àáp(,,L={öÔìÙ³Õ²eK%&&êðáÃŠŠŠ’§§§Ñ€¢cÇŽ²X,ú¿ÿû?¥¥¥ÉËËK‹/V=ª¯¿þÚèˆ.aõêÕ2™L2™Lòðð0:Îݨ¬‰‰‰ºãŽ;ÔªU«ªí}ÿý÷u¶=€úŽ"^ª´´T))) “‡‡‡† ¦7ÞxCC‡ÕÆUTT¤äädY,¹»»WѬY3͘1C FGÔSÅÅÅŠÕwÜ!oooÙív=ñÄÊÍÍUrr²äââbtLÀ0ºóæååiõêÕÚµk—¼¼¼èÎ ÔC?þ¸œN§†nt”«ºYwîÜ©™3gjâĉ:qâ„~øá‡z_ÜÜXœ={V ŸŸŸÑQht(âÀ wòäIÅÅÅ)00P]»v•ÙlVJJŠ~øa¥¥¥éСCЉ‰‘¿¿¿Z´hat\ÔPpp°¾þúkíÛ·Ïè(€z¢²²R))) ”»»»–.]ªßþö·Ú±c‡öîÝ«ððpuéÒÅè˜@½r¡;ïwß}wÉÃ舀¡Ú¶m+£càgl6›œN§ÂÂÂÔ¶m[yzz*''GÆ 3:Z£çt:UYY©ÊÊJ££ÐèPÄ €"++KV«U>>>êÖ­›,X ââb­X±B¹¹¹JOOWdd¤¼¼¼d2™ŒŽ‹_aܸqêÑ£‡l6›ÑQËÉÉQtt´úõë'³Ù¬¬¬,½òÊ+ÊÏÏWLL 7[×è—ÝywïÞ-oooy{{Ëjµª¸¸Øèˆ œœIR§N N‚_j×®233õÉ'Ÿ€F‡"^Ô‰ŠŠ ¥¦¦*""B”§§§V­Z¥~ýú)!!AÇ—ÝnWXX˜zöìit\Ô¢&MÈç¨H IDATšèþûï׺u댎0@ii©l6›Ìf³n¹å­Y³FÁÁÁ:xð ÒÒÒd±XÔ¦M£c Ò…î¼{öì©êÎûÔSO©G TJJŠÑ4bFG¨w(â@­)**’ÍfSHHˆ:uꤱcÇ*99YÓ§O׎;TPP ¸¸8¨mÛ¶FÇE ÖþýûµgÏ££n‡Ã¡°°0yxxhöìÙjÙ²¥•­¨¨(õïßßèˆÀMåBwÞüü|Y­V8p@f³YC‡Utt4ÝyqÓZ½zµL&“Î;§;wÊd2Éd2ÉÅÅ¥Úz………Z²d‰<==Õ¼ys¹ººjÊ”)úüóϯy[?£E‹òð𯯯Þ}÷]•””\õù'NœÐc=¦>}ú¨yóæêÒ¥‹f̘¡o¿ý¶ÚzåååJLL”Ùl–»»»Zµj¥Ûn»MV«U•••Uëmذ¡j¾&“IP`` :uêTµìäÉ“×4·ýû÷ëž{îQ‡Ôºukýîw¿ÓÎ;¯krmܸQ’ÔªU+™L&=ú’ûòr¯GMæw­ûöRêb;eeeúóŸÿ¬Aƒ©uëÖrss“¿¿¿6mÚTUܼråʪñ}||ªžûé§ŸV-ïܹóesfgg+((HíÚµS§N4gÎëðáÃò÷÷W»víÔ½{wÍŸ?_gΜ¹ì8¥¥¥—\~øða©cÇŽêÔ©“üüü”™™yÑþÛ¿¿¦M›Vuìüæ7¿ÑæÍ›åëë[5ÖÃ?|Õ׀Ƃ"^ü*YYY²Z­U7Íš5KYYYzòÉ'uàÀ¥§§+**J>>>jÒ„O5£GVŸ>}”`t@:uê”bcc5räHy{{ë³Ï>ÓÒ¥K•““£ääd\t5€ÚÕ¡C‡jÝy}||´bÅ ºóâ¦õøãËétªM›6ºóÎ;åt:åt:U^^^µNAAF¥øøxY­VÐ< E‹iÅŠ:zô¨"##µvíZ=ýôÓ—çrË-Z¤E‹)//O‰‰‰Ú¾}»fΜYí9?üðƒÆŒ£´´4}ôÑG:~ü¸ÞyçY­V}÷ÝwjÑ¢…œNç5c4Ü%€©¨¨ÃáPdd¤†*OOO-_¾\®®®Z»v­Nž<©ÔÔT…‡‡ëÖ[o5:. b2™¤øøx9N£ãjQee¥RRR¢=zhéÒ¥6l˜ìv»öíÛ§ððpuíÚÕè˜@£t¡;o^^ž¬V«222ªuç-**2:"pC<ùä“:tè^~ùeùùù©}ûöºõÖ[¯îÝ»ë±ÇÓ±cÇ®i «Õ*???µk×NݺuÓ²eË4yòäkÊ­_|Q¿ÿýïÕ¶m[ :T r:zôÑG«­?nÜ8=ùä“ruuUçÎõè£jÖ¬Y²Z­úñÇ/¹ððp7N­[·Öoû[•——Wëäz9§OŸÖ3Ï<£;ï¼SmÛ¶•···>øàýûßÿVXXØuÏáJûâz^Ëͯ¶rÕæv¶mÛ¦¡C‡Êl6«U«VêÖ­›žþùZý?ɼyóäåå¥6mÚhΜ9:t¨¶lÙ¢%K–èŽ;îPÛ¶mª¾}ûê“O>©ñø?ü°ÆŒ£6mÚÈ××W÷Üsþõ¯UëîüÔSOéÔ©SU_îzaŸÄÇÇëܹsµ6Wn&ñàª~úé'%''+44TòööÖûï¿/___Ùív())I!!!êСƒÑqQOëÈ‘#úꫯŒŽ¨¹¹¹ŠŽŽVÿþýe6›µwï^½üòËÊËËS\\œ|}}Žàÿ¹Ð÷Ûo¿­Ö·gÏžtçE£°~ýzIÒ=÷ÜSmy‹-4a•””hëÖ­×4Æ”)S.zlË–-Z´hÑŸ¿aÃ5iÒD~~~Õ–»»»kèСr8ÊÍÍ•$ùùùéóÏ?¿hŒáÇëüùóJOO¿ä6~ó›ß\1Ãå´lÙR¿ýío«-»í¶ÛÔ£GíÙ³GG­ñ®äz_Ëͯ¶rÕæv&Ož¬/¿üR‹E»wïVEE…$éÀ7nÜ5g¹ooïj¿÷èÑã’Ë{öì©üüü?jÔ¨j¿÷êÕK’ªõé§ŸJ’&MšTmÝ.]ºhРA5Þ&‹ÑP?eggkëÖ­JNN–ÝnWyy¹î¸ã…††*00PC† 1:"ê¹;î¸CC† QBB‚FmtÀu(++Ó¦M›«mÛ¶ÉÝÝ]š?¾† ft<×àBwÞçž{N‰‰‰zã7d6›5xð`ýáÐüùóåææftL Ö”••éôéÓjÙ²¥ÚµkwÑãݺu“$\÷ךAÒ¿øòàÁƒòððÐéÓ§õ /hýúõÊÍÍÕ©S§ª­÷ÓO?]òùmÚ´©q6IêÔ©“L&ÓEË»víªüü|?~\nnn5šÃåüš×ãRó«é¾½µ±×^{McÆŒÑ{ï½§ &H’ÆŽ«ÐÐPMŸ>ýšr\Mûöí«ýÞ¤I5mÚT­[·®¶¼iÓ¦ª¬¬¬ñø¿œgóæÍ%©j¬²²29sF-[¶TÛ¶m/z¾««k· @c@'^TIOOWdd¤¼½½Õ·o_-Y²D’´fÍååå)--M‘‘‘ðâš*11±ªë aHOOWDD„<<<4sæLIRbb¢²³³eµZ)à  Ýy¿ù楥¥iìØ±tçEƒv©"Té?Ý];tè ÒÒR9sæ¢Ç;&é?ÝT/çjc\M‹-Ô±cG¹¸¸èüùór:—üùÝï~'Iò÷÷׊+4þ|edd¨²²RN§S/½ô’$ÉétÖ8Õ\(Ný¥ãÇKúO1oMçp9µñzür¼ÚÈUÛÛ1™Lš3gŽRRRtêÔ)mذAN§S3fÌЋ/¾Xmì&Mšèßÿþ÷EÛüeñv}Ó¢E µk×N¥¥¥:{öìE_8~@uñ4b%%%JIIQXX˜<<<4lØ0½ûî»òòòÒÆUTT¤äädY,–ªoÃjâPAA¾øâ ££®âÔ©SŠ•———† ¦ 6èñÇW^^žìv»Ô¬Y3£c¨ºóæççËjµêàÁƒ2›Í2dˆ¢££UXXhtDàªZ·n]­ràÀŠ•¤ªÎ§üqµç”••iÛ¶mjÕª•&MštÅñ/ŒñÉ'Ÿ\ô؈#´xñâ+>ÆŒ*//×Î;/z,::Z½{÷Vyy¹***´sçN¹»»ë±ÇS—.]ª ”KJJ®¸ëuöìYíÙ³§Ú²ÿû¿ÿS~~¾†®îÝ»×hWS¯ÇÏÕV®ÚÜNÇŽµÿ~IR³fÍd6›µaÙL¦‹æÝ½{wåååU[VPP #GŽüêÌumÊ”)’¤O?ý´Úò‚‚edd €z"^€FæÄ‰Š‹‹S`` ºuë¦I“&içÎzøá‡•––¦C‡)&&FþþþjÞ¼¹ÑqÑÀõïß_#FŒPBB‚ÑQ—PYY©ÔÔT…††ªgÏžZ´h‘<==e·Ûµoß>…‡‡óEÀM¬}ûö—ìÎëááAw^Ô{#GŽTFF†rrr´k×.eeeiìØ±’¤gŸ}V}ûöÕ¢E‹´yóf9sFš5k–Ž=*«ÕzÕÏ»ÆX¼x±>þøc9sF¹¹¹Z¸p¡Ž=zÕ"ÞgŸ}Vžžžz衇´eË>}ZEEEЉ‰Ñòå˵zõj¹¸¸¨iÓ¦7nœ ôüóÏëäÉ“*))Ñ矮7ß|³Öö×ϵiÓF<òˆ¾úê+;wNiiiš={¶š7o.«ÕZã9\Mm¼¿¯6rÕöv,X ï¾ûNeee:~ü¸ž{î99N?¾Ú¸'NT~~¾^}õU={V™™™ S×®]uæºöÌ3ÏÈÍÍM‹-’Ýn×Ù³gõý÷ßkîܹ×ÜM€Æ†"^€F ==]ÑÑÑòññ‘»»»,X ââb­X±B999JKKSdd¤¼¼¼ª¾á¨-ÁÁÁú裪uÅ+//OÑÑÑ0`€ÆŽ+‡Ã¡—^zIÇŽSRR’|}}¹&™_vçýá‡d6›5xð`ºó¢^zùå—uûí·kðàÁ ’ÕjÕàÁƒ%Iîîîú׿þ¥™3gê±ÇS§Nô›ßüFçÎSJJŠæÏŸÕñ/Œ¤G}´jŒââbíØ±C½{÷ÖêÕ«e2™´gÏåååÉd2iÙ²e’¤®]»êŸÿü§¦M›¦GyD]ºtÑ Aƒô·¿ýM7nT```Õ¶ªW^yE=zôPß¾}§Y³fI’Ìf³¼½½µ{÷n™L&mܸQ’ÔªU«kþüþó¬;vÔ‹/¾¨'Ÿ|Rîîîºë®»äêêªíÛ·ëî»ï®zεÎáBÇÙ_æÚ½{w^k_Möí¥ÔÅv¾øâ 4HÁÁÁrssÓàÁƒõé§Ÿê­·ÞÒSO=UmÜ•+Wêá‡Ö3Ï<£®]»êÁÔÒ¥Kåîî®ÂÂB™L&EDD\2ç²eË”––&“ɤ­[·ª¢¢B&“IQQQJMM•ÉdÒ_|¡sçÎÉd2)22ò’¯ÏìÙ³/;¾$™L&EGGKúOçi???I’§§§víÚ¥Q£FéþûïW·nݪ'Ÿ|R}ûöUÓ¦M¯¸ïhŒLN§ÓitÔ®ŠŠ íÚµK›7oÖúõë•‘‘¡.]ºhòäÉò÷÷×”)SÔ¶m[£c¢‘ÈÉÉÑ-·Ü¢äädÝsÏ=FÇ€F«¬¬L›6mR\\œ¶lÙ¢.]º(00PóæÍÓí·ßnt<\‡¤¤$‰Û@CÁõKÃãp8«øøx?^÷Þ{¯,‹&L˜Po¾ø‡ã ê‡Aƒ©¤¤DÙÙÙFGø{ —e£/ÀM¢¨¨H6›M!!!êÔ©“ÆŽ«äädMŸ>];vìбcǧ€€ xqCõêÕKÿõ_ÿ¥„„££@£´wï^EDDÈÃÃCÁÁÁ*--ÕºuëtäÈY­V x\Ö…î¼yyyZ³fMUwÞ!C†(::Z'Ož4:"à*((›››ÎŸ?_mùáÇ•™™©ñãÇ” €ú‹"^€,++KV«Uf³Yîîîš5k–²²²ô—¿üEÙÙÙJOOWTT”|||êMg 4NÁÁÁÚ¸q£JJJŒŽÂéÓ§+ :Tëׯ×ÿøG:tHv»]jÖ¬™Ñ14íÛ·—ÅbÑ×_­´´4Ýu×]Z¹r¥<<<¨””:ï@#Q\\¬ÐÐPåääè§Ÿ~Ò?ÿùO©}ûöúŸÿù£ãPïPÄ Ð€TTTÈáp(22RC‡•§§§V¬X!WWW­]»V'OžTjjªÂÂÂÔ»wo£ãU‚‚‚TRR¢?þØè(pÓª¬¬TjjªBCCÕ³gO………©G²ÛíÚ¿¿"##¹>ð«]èΛŸŸ¯5kÖ(33Sf³Yƒ¦;/ÜäÜÝÝ•’’¢S§N鮻««î½÷^ 0@ÿüç?Õ¯_?£#Pï¸WöÓO?iÛ¶mÚ¼y³6nܨcÇŽ©_¿~òóó“ÕjÕÝwßM'=Ô{]ºtѸqã” ûï¿ßè8pSÉÏÏ×û￯·ÞzK™™™òòòÒªU«4gι¹¹ÀMª]»v²X,²X,r8ŠÕÊ•+õôÓOëÞ{ï•ÅbÑ„ d2™ŒŽ ¨E&LЄ ŒŽ@ƒA/@=”­­[·*99Yv»]ååå=z´/^¬{ï½Wƒ6:"PcÁÁÁzä‘GtúôiuèÐÁè8РýûßÿÖÖ­[õþûïkýúõj×®ô׿þUÇ7:€FæBwÞÕ«WkݺuŠ•ÙlÖÀ5wî\Í›7O;w6:&ÜpMŒ€ÿHOOWdd¤¼½½Õ·o_-Y²D’´fÍååå)55Uáááð¢Áºï¾ûät:µiÓ&££@ƒµoß>EDDÈÃÃCÓ¦MSqq±âããUPP ˜˜ xêBwÞ´´4¥¥¥éî»ïÖªU«äáá¡ÀÀ@¥¤¤ÈétnŠx RRR¢””………ÉÃÃCÆ Ó{ï½'///mܸQEEEJNN–ÅbQ·nÝŒŽ üj;vÔĉ•`thP~üñGÅÅÅÉl6kÈ!Š×C=¤¬¬,Ùív¨yóæFÇ€j.tç=vì˜Þÿ}Ël6kРAŠŽŽÖ‰'ŒŽuÎÅèɉ'´eËmÞ¼Y[¶lÑO?ý¤#Fèᇖ¿¿¿FŽ)“ÉdtL ÎëøƒŽ?®®]»ê5‡Ã¡ØØX}øá‡ª¨¨¿¿¿ìv»&L˜Àõ€£U«V P@@€öîÝ«¸¸8EGGëé§ŸÖ½÷Þ+‹ÅÂç7-ŠxêXzzº6oÞ¬äädíÚµK-Z´ÐwÞ©•+W* @=zô0:"pÃL:U-Z´Ðúõëjt¨wŽ=ª¸¸8­]»V?üðƒ¼¼¼´jÕ*Íž=[:u2:ü*C† QTT”"##•œœ¬ØØX™ÍfÝzë­z衇ôÐC©K—.×5vRRR-§×j×®]FG€z‹"^€ZV^^®Ý»wËf³iÆ :r䈺té¢É“'+,,LS¦LQÛ¶mŽ ¢M›6ºçž{”@/ü?úüóÏ«õë׫mÛ¶ TRR’FŒat<¨u-[¶¼¨;ïsÏ=§?ÿùÏš:uêuuç ªÃÄp}LN§Óit€†®°°PÛ·oWrr²6mÚ¤Ó§OkÈ!ò÷÷—ŸŸŸî¼óÎÝpÜÌÖ¯_¯ûï¿_GŽQÏž=Ž†Ù¿¿Þ}÷]½óÎ;:yò¤Æ¯9sæ( @­Zµ2:€¤¤$‰Û@CÁõ ®¤´´´ª;oJJŠ  yóæiîܹêÚµ«ÑñàzØš ¡ÊÊÊ’Õj•ÙlV÷îÝ5kÖ,eeeé/ù‹Ž9¢ôôtEEEÉÇLJ^àg~ÿûß«}ûö²ÙlFG€îÇT\\œÌf³† ¢?üPsçÎUff¦ìv»BBB(àÐ(]èÎk·Ûµwï^͘1CÏ=÷œzõê¥ÀÀ@¥¤¤P Á¡ˆàUTT(55U2dˆ<==µbÅ ¹ººjíÚµ*,,TjjªÂÂÂÔ«W/£ãõV‹-4mÚ4%$$n‡Ã¡ÐÐPõìÙS‹E®®®úì³ÏtäÈEEE©OŸ>FG€zcðàÁŠŠŠR^^ž>øàËl6kàÀŠŽŽÖñãÇŽׄ"^€+8w““«ŠnÆŽ+›Í&³Ù,»Ý®‚‚%%%)$$DíÛ·7:.Ð`뫯¾Ò?ü`t¨3²Z­ºýöÛåíí­ÔÔT-[¶L¹¹¹JJJ’¯¯¯L&“Ñ1 ÞºTwÞçŸžî¼ Šx~áðáÊ•¿¿¿ÜÜÜ4}út¥§§kñâÅÚ»w¯233eµZåëë+£ã Ò„ ÔµkWÙl6££@­ª¨¨PJJŠÕ»woEFFj̘1r8JOOWxx¸:wîltLhp.tçÍÍÍ­Ö÷Ö[o¥;/€z‹"^ÐèUVVÊáp(22RÞÞÞêׯŸ–,Y"Izë­·tâÄ ¥¦¦*<<\ƒ68-pspqqÑ}÷ݧ„„££@­8pà€"""Ô³gOMš4IùùùzõÕW•——§˜˜9ÒèˆpSøywÞ}ûöé¾ûî£;/€z‹"^Ð(•””(%%EaaaêÕ«—¼½½õÞ{ïÉËËK7nTQQ‘’““"WWW£ã7¥àà`}÷ÝwJOO7: \—’’Ùl6™Íf effÊjµÊ××—âà&¬¤¤$nˆPg*++•’’¢ÀÀ@¹»»kéÒ¥ºýöÛe·Ûµwï^…‡‡«K—.FÇèÖ[oUTT”rrr” é?Ýyûô飈ˆeggœ@CC/0Tee¥‡"##åíí­¾}ûjÉ’%’¤·ÞzK'OžTjjªÂÃÃ5hÐ ƒÓ¨+3gÎÔÉ“'µ}ûv££¸Éäää(::Zžžž2›ÍÊÊÊÒ+¯¼¢üü|ÅÅÅÉ×××舀zærÝyûõëGw^5B/¸áJJJ”œœ¬ÐÐPõêÕKÞÞÞŠ‹‹“———6mÚ¤¢¢"%''+$$D;v4:.€ _¿~5jTU‡ø5JKKe³Ùd6›uË-·Èjµ*((HTZZš,DŠI IDAT‹Ú´ictL@p¡;onnnµî¼·Ür Ýy\E¼à†8~ü¸ââ⨮]»jÚ´ir8š?¾ÒÒÒ”••¥˜˜ùûû«yóæFÇ`€   ýõ¯Uii©ÑQ4P‡CaaaòððÐÌ™3%I‰‰‰:r䈢¢¢Ô¿ƒªæÍ›Wuç=pà€æÌ™£wÞy‡î¼®ˆ"^PgÒÓÓ-¹»»kÁ‚*))Ñ /¼ ÜÜ\¥¥¥)22R^^^FGPëܹsÚºu«ÑQ4 §NRll¬FŽ)ooo}öÙgZºt©òóóe·Û £cn" PTT”rrr.Ù÷ðáÃÆPo˜œN§ÓèàæPZZªÔÔT%''kýúõÊÉÉQ×®]5iÒ$ùûûë÷¿ÿ½Ú´ictLõظqãÔ½{w­[·Îè(ê±ÊÊJmß¾]qqqúè£Ô¬Y3M:U!!!š0a‚L&“Ñ"))IAAAâöÐPpý‚›ÙÁƒõöÛoëwÞÑÉ“'5~üxY,MŸ>/—/xÀ¯RXX(›Í¦uëÖMf³Y)))š5k–vìØ¡‚‚ÅÅÅ) €^W¬M›6éìÙ³FGPåææ*::Zýû÷—ÙlÖÞ½{õòË/+//Oqqqòõõ¥€`ˆËuçíÝ»7Ýy€FŒ"^PcYYY²Z­2›ÍrwwWHHˆŽ=ªåË—ëÈ‘#JOOWTT”|||(¤P#÷߿Ο?¯Í›7@=QVV&›Í&õéÓG/¿ü²üýýõÝwß)--M‹EmÛ¶5:&’¤æÍ›+ @v»] Ñ;ï¼#OOO™ÍfÙl6•——À B/¸ªŠŠ ¥¦¦*""Bƒ–§§§V®\©îÝ»+>>^ÇŽ“ÝnWXX˜zõêet\ XçÎ5a„ªn%¯ôôtEDDÈÃÃC3gÎTii©Ö­[§#GŽÈjµê¶Ûn3:"WÔ¿ÿ+vç=tèÁ Ô5ŠxÀ%;wNÉÉÉ Q—.]4vìXÙl6Mœ8Qv»]GU\\œÔ¾}{£ã¸‰kË–-***2: €ìÔ©SŠ•———† ¦ 6èñÇW^^žìv»Ô¬Y3£cP#¿ìÎk±XôᇪÿþUÝyÏŸ?otLu€"^PåðáÊ•¿¿¿ÜÜÜ4}úteee)<<\ûöíSff¦¬V«|}}åââbt\7©éÓ§«iÓ¦Ú°aƒÑQÜ•••JMMUhh¨zöì©E‹ÉÓÓSv»]ûöíSxx¸ºuëftLjEÿþý©Ã‡këÖ­ruuÕÌ™3uË-·Ð¸ qw Xee¥¾ùæ%''kóæÍr8ruu•¯¯¯Þzë-Ý{ï½êر£Ñ142íÛ·×äÉ“•˜˜¨‡zÈè8êH^^ž>øàÅÆÆ*++K^^^z饗4sæLµk×ÎèxÔ©¦M›Ê××W¾¾¾ÊÍÍÕ‡~¨×^{MÏ?ÿ¼Æ/‹Å¢iÓ¦©Y³fFGð+Љ€F¦¤¤DÉÉÉ •‡‡‡¼½½'///mÚ´IJJJRHH¼ ¬mÛ¶éØ±cFGP‹ÊÊÊd³Ùäïï¯[n¹EÏ=÷œ|}}µgÏ¥¥¥Éb±PÀ ht<<<®C‡UëÎÛ»woEDD(++Ë舮E¼4ÇW\\œÕ¥KM›6M‡C‹EiiiÊÊÊRLLŒüýýÕ¼ys£ã€üüüÔªU+}ôÑGFGP öîÝ«ˆˆõêÕKÁÁÁ*--ÕºuëTPP ˜˜Ý~ûíFGÀpºó&%%éðáÃZ´h‘âãã5`À™ÍfÙl6?Þè˜j€"^nRéééŠŽŽ–ÜÝÝõßÿýß*))Ñ‹/¾¨ÜÜ\¥¥¥)22R^^^FG€‹´nÝZS§NUBB‚ÑQ\§Ó§O+66V>>>:t¨þö·¿iáÂ…:tèìv»Ô¬Y3£cP/Ѹ9PÄ ÀM¢´´T))) SïÞ½5lØ0½øâ‹êׯŸ6nܨ¢¢"%''Ëb±¨{÷î5ÿÔ©S2™LÕ~V®\)I*//¯¶üþûï¯zÞ‰'ôØc©OŸ>jÞ¼¹ºté¢3fèÛo¿­6~YY™þüç?kРAjݺµÜÜÜäïï¯M›6©¢¢â×í RPPvîÜ©ììì‹Û°aCµ÷Ç+((H;vT§Näçç§ÌÌÌ‹žWXX¨%K–ÈÓÓSÍ›7—«««¦L™¢Ï?ÿüFL h‡BCCÕ³gO………©G²Ûí:pà€"##Õ»wïÇù\Þ¹sç$‰ktÐàp\»ŸwçÍÎÎÖ¢E‹´nݺzÓ—ÿWF/ Xaa¡l6›BBBÔ­[7™Íf¥¤¤hÖ¬YÚ±c‡ 'µhÑâWm«cÇŽr:š4i’š4i¢~øAË–-“$¹¸¸Èétj̘1úðÃõÑGI’Ž=ªQ£F)))I¯¿þºŠŠŠô÷¿ÿ]EEE3fŒvíÚU5þ#<¢5kÖè•W^Qaa¡öíÛ§AƒiêÔ©Ú±cǯÊ aš>^V«U'OžÔW_}¥Ö­[k„ Z»ví ™p3ÊÏÏWtt´ú÷ï/ooo9­ZµJyyyJJJ’¯¯¯L&ÓuÍù\^›6m$‰ktÐàp\Ÿž={*<<\YYYUÝygÍšUÕ÷RðuÿWfr:N£C€k—••¥äädmÞ¼Yÿûßåââ"ùùùé¾û‡Gnÿ³Ï>Ó¤I“´páB½öÚkUËwîÜ©   :tHÍš5“$=øàƒzï½÷ôá‡jÖ¬YUë¨OŸ>6l˜ÒÒÒ$IýúõS÷îݵsçÎjÛ8p bbb4nܸ:€úiþüùúæ›oªÞ+~iÚ´iÚ¸q£’““åççWµ< @}ô‘Nœ8¡Î;K’æÎ«wß}WëÖ­SpppÕºeeeêׯŸŠ‹‹uèÐ!uëÖ­n'Ü$þýïkëÖ­zÿý÷µ~ýzµk×NZ¸p¡†^ëÛã|.–””¤   mݺ•ktÐ \¸~q:\ãµ$//O|ð^ýuåææjüøñ²X,š6mZÕç€ÿ—d£/õ\EE…RSS¡ÁƒËÓÓS+W®T÷îݯãÇËn·+,,¬Î x%iâĉºí¶Ûôî»ïª°°°jùóÏ?¯G}´ÚMA6lP“&MªÝ„'Iîîî:t¨‡rss%ý§ãæ—_~)‹Å¢Ý»w«¢¢B’tàÀn±àà`9edd\q½Q£FUû½W¯^’þÓô‚õë×K’î¹çžjë¶hÑB&LPII‰¶nÝZ±›Ú¾}û¡^½ziÚ´i*..V||¼ S'¼?Çù\ŒktÐqü:ºó:t¨ZwÞ^½zÝÐî¼|.."^ê¡ââbÙl6…„„¨sçÎ;v¬l6›&Nœ(»Ý®£G*..Nj×®Ý Ï·hÑ"ýôÓOzýõ×%IÚ¾}»,KÕ:eee:}ú´*++Õ¡C™L¦j?_ýµ$éàÁƒ’¤×^{MqqqÊÊÊÒ„ Ô¾}{Mž<¹ê=Óï~÷;õèÑC‰‰‰W\¯C‡Õ~oÞ¼¹$©²²RÒÿÿžÔ²eËK¾o^èÔSPPP±›Î?þ¨¸¸8™Íf 2Dñññš;w®233e·ÛPuÞÕ5ÎwàÒ¸F ×ø@íhÒ¤‰|}}•””¤ììl-^¼X 0`€Ìf³âââTRRR§ø\\Œ"^ê‰C‡)66Vþþþrww×Ì™3•••¥ˆˆíß¿_™™™²Z­òõõ•‹‹‹¡YxàuëÖM¯¾úªÊÊÊô /èøƒ\]]«ÖiÑâÿcïÞ㪪þÏDD¼_PÔ¼Lj^2ƒ¼e© ^&ð– VšMSj¾*}fúMVVZ6“]¦À¦ «A˜'ÉC¥š£©A–Éä=o y7H@õûcxDDp`sù¼_¯ýûì³÷wí³öÞkïÃ:ËSMš4‘»»».]º$cÌU§aÆI’l6›¦Nª¤¤$;wNñññ2Æh„ úË_þbUQXÌn·ëž{îÑÇ\¡õxzzªqãÆÊÉÉQfff‰×þùgIÿíÀÿIIIQDD„Ú¶m«ˆˆ5mÚT‰‰‰:|ø°-Z¤Ž;Z±ŽwÔU´Ñ@mE(»¶mÛjÞ¼y:xð ¾üòK5mÚT3fÌŸŸŸ"""”ššZ)Ûå¾(‰N¼X¤  @)))Z°`Ô¹sgÍŸ?_^^^Z¶l™N:¥Í›7kÞ¼yêÖ­›Õq‹ñôôÔ#<¢'NèÕW_ÕG}¤Ù³g—Xn„ ÊËËÓ×_]âµÅ‹«C‡ÊËË“$5iÒD»wï–$yxx(((Hñññ²Ùlúì³Ï*·@ªµÉ“'k÷îÝÚ¹sg…Ö3~üxI*qNÉÍÍÕºuëäå契#GVh@mpüøq-^¼X7Þx£”’’¢^xAÇŽSll¬e³Ù¬ŽyM廓h£€ÚŒ6>P>WŽÎ;oÞ<}ùå—êÕ«—åÒÑy¹/J¢/UèÂ… r8ŠˆˆP»ví èèhùûûkõêÕúù矫iÓ¦©I“&Vǽ¦GyD^^^zú駨ßüæ7%–y饗ԥKýîw¿Ó_|¡óçÏëÌ™3ŠŒŒÔsÏ=§%K–Uøá‡ÖÎ;•››«'Nèå—_–1FwÝuWU @53pà@uìØQ111ZÏK/½¤N:iΜ9JHHPff¦öîÝ«{ï½WÇ×Ò¥KÕºuk¥j–üü|%%%),,L:tТE‹t×]wéÛo¿Urr²fÏž­æÍ›[Ói飼h£€ÚŠ6>Pq…£ó8p@‰‰‰êܹ³þð‡?¸|t^îK€âlÆcuj³'NhÍš5Š‹‹Sbb¢.]º¤¾}û*88X!!!ò÷÷·:b¹…‡‡kÙ²eÚ¸q£î¼óΫ.sæÌ½ð Š×Ñ£GÕ¤IõíÛWO>ù¤‹–ûþûïõöÛoë_ÿú—>¬úõë«k×®š1c†f̘QíGüP¹æÍ›§•+Wê§Ÿ~’ÍfÓ¶mÛ4pàÀbËüéOÒÂ… Kœ/î¾ûn%$$H’NŸ>­… êÓO?Õ±cÇÔ A 0@O=õÿô‡:i÷îÝZ¾|¹–/_®“'Oê®»îÒÔ©S*///«ãIÇ;p ±±±š4i’.ÿ÷Úè :+l¿\‰6>`ôôt­X±Bï¼óŽ:$…‡‡kêÔ©z.À} P$ŽN¼T‚ÔÔT%$$ÈáphË–-òòòÒ]wÝ¥3F¾¾¾VGt‰÷ß_o½õ–’““­Ž –Û±c‡n½õVmÛ¶Mýû÷·:P£effjÕªUZ±b…Ö­['???Ýwß}ŠˆˆP§N¬Ž  ®Ö‰—6:¨Î®Ö~`½‚‚­_¿^QQQZµj•6l¨°°0=öØcêÕ«W™×Ç} P$ÎÝêÔ999Ú¼y³‡>ùä;vL:tШQ£4oÞ<1BžžžVÇt¹wÞyGsçε:€: oß¾êÑ£‡bbbèÄ ”SJJŠ¢¢¢ôñÇëÒ¥K3fŒ>ýôSýö·¿•›››Õñ¸mtee·Û¨ÀÀ@?~\ÑÑÑŠŒŒTTTT¹Fçå¾ø?v«PS:uJÑÑÑ S«V­¤¤¤$Ýwß}Ú´i“:¤ÈÈH…„„Ôš¼ï¾û®Æ¯¬¬,½óÎ;:{ö¬Â¬Ž Ž ÕÊ•+•ŸŸou ÆÈÈÈÐÒ¥KuóÍ7+ @›7oÖÓO?­cÇŽ)66V!!!tàjÚè\¥M›6š7ožöï߯ÄÄDuîÜY>ú¨Ú¶m«ˆˆýðÃ%ÞÃw@鉀28xð ‡ôÕW_ÉÝÝ]ƒÖóÏ?¯{î¹GíÚµ³:b¥‹WÓ¦M‹FÄtwçëUcÊ”)zöÙgõ¯ýKÆ ³:PmåççkÆ ŠŠŠR||¼¼½½¦åË—ëÖ[oµ:€J@€«93:ïý÷߯ Hâ¾(Íc¬@u•ŸŸ¯­[·*!!AñññÚ³gZ´h¡Ñ£G+$$D£F’Õ1 ÎèÛ·¯úõë§ÈÈH«£ÕÎÞ½{õñÇë½÷ÞSZZš¨iÓ¦û‡ZµKll¬&Mš$þýÔ´_€š­  @ëׯ/ñÃa>ú¨z÷îmu< :Šãçm¸ÂÙ³g•””$‡Ã!‡Ã¡sçΩsçÎ ֻᆱAƒÉn·[ê¤É“'kñâÅzã7T¯^=«ã–ËÉÉ‘ÃáPTT”Ö­[§¶mÛêþûïWxx¸:wîlu<P‹\>:oFF†>øàEEE•::/‰ÿ0@ÒO?ý¤¨¨(…„„È××WS¦LÑÁƒ5þ|íÞ½[ÐÒ¥K5xð`:ð€…¦L™¢sçÎ)))Éê(€¥RRR¡V­ZiêÔ©jÚ´©>ýôS>|X‹-¢/¨T¾¾¾š7ožöíÛ§ÄÄDuîÜY>ú¨Ú¶m«ˆˆíܹÓêˆ@µÀH¼€:©  @;vìÃáPBB‚RRRÔ¬Y3 >\Ë–-Ó˜1cÔ¤I«c®Ð¡C 8P111úíoku J={Vqqqzë­·´sçNõèÑCúÓŸô»ßýN-[¶´:¨ƒ¸6† Ô.\ÃáPDD„Úµk§€€­X±B·ß~»•‘‘¡ØØXM›6¼PMž-X°@;wVPP<¨7ß|SiiiŠŒŒÔàÁƒ­ŽpU…£óÆÆÆêÈ‘#ú¯ÿú/­[·N·Ür‹¥_ýÕê˜@• / ÖIMMÕâÅ‹5xð`ùúúê÷¿ÿ½$éõ×_WZZš’““µ`Áùûû[œP¾¾¾:t¨bbb¬Ž¸TNNŽâââ¤nݺiÙ²ešöØcE£ó~÷ÝwVG\ÆfŒ1V‡À”ÃáP\\œ¶nݪzõêiðàÁ ÖĉåççguD@ ‘1F VGœRPP õë×+**JŸ~ú©êׯ¯±cÇjÚ´i ´:€(66V“&Mÿþj Ú/JsöìYÅÅÅéõ×_Wjj*£ó ¶ˆc$^@µ•ŸŸ¯Í›7kþüùêÞ½»ºt颅 ªsçΊ‰‰Ñ‰'”˜˜¨Ù³gÓê É“'ëË/¿ÔéÓ§­Ž\ÓÑ£GµxñbuéÒEAAA:xð Þxã ¥§§+::š¼ ÎkÚ´©ÂÃõk×.%''Ëßß_sæÌQÛ¶m5#ñª•3gÎhݺur8r8:wîœ:wî¬àà`…††jРA²ÛùJ€ô믿ªuëÖúË_þ¢ððp«ãÅäääÈáp(**JëÖ­“¯¯¯¦M›¦™3gê7¿ùÕñÔ@ééé Ö¥K—Šæåææ*33S-Z´(¶lß¾}]Õ®‹‘x”Ei£óÞ{ï½jذ¡ÕñgÄщ`¹ƒÊáp(!!A7nTAA  ?^]»vµ:" š Ó©S§´~ýz«£’¤ÔÔT­X±Bï¾û®Î;§aÆ)<<\ãÇ—»»»ÕñÔp½{÷Ö®]»®»Ü /¼ ?þñU lèÄ  ¼RRR¥+VÈÃÃC“'OÖÃ?¬¾}ûZ ¸:ñª^AAvìØQÔq7%%EÍš5Óðáì±cǪqãÆVÇÔŸ|ò‰BCCuäÈùùùYuÔ¹sç«wÞyG;vìP÷îÝ5}útMŸ>]­[·¶:€Zä•W^ÑÿøGåå啺ŒÍfÓÔ©S§*Là:ñ¨¨Âç0o¼ñ†víÚÅ輨îèÄ ¨.\кuë” Õ«W+##C;wVpp°BBB4dÈyxxXPÃäääÈ××WÏ>û¬fÏžmuÔ!Z¿~½¢££õÏþSîîî7nœ¦M›¦áÇËf³Y@-tôèQÝpà ¥vz±Ùl ÐöíÛ«8€sèÄ À•®6:oDD„n½õV«£…âìV'Ô^GŽQTT”BBBÔ¬Y3?^)))ŠˆˆPjjª8 ¥K—*00¼€r©_¿¾Æ§˜˜«£ Ž8vì˜/^¬ßüæ7 Ò¿ÿýo½öÚkJOOWtt´éÀ  Ò´oß^ Ý~õùqssÓ´iÓª8XÃßß_‘‘‘JOO×+¯¼¢­[·Êßß_ŠŠŠRVV–Õ1/À¥RSS• ‡Ã¡-[¶ÈËËKwÝu—BBB4fÌùúúZPˬY³F£GÖþýûÕ¥K«ã ÊÍÍÕêÕ«­/¾øB-[¶TXX˜fΜ©Þ½{[@óöÛoë±ÇS~~~‰×ìv»ÒÓÓÕºuk ’\#ñ¨l…£ó~øá‡rssÓ”)SVŠ£/ Brrr´yóf9ý÷ÿ·ÒÒÒtà 7häÈ‘ Öˆ#äééiuL@-–——'???=þøãš?¾ÕqP‹¤¦¦jÅŠúûßÿ®³gÏjذa ׸qãäááau<uÔ©S§äëë[¢¯›››†ª¤¤$‹’\xT•sçÎ)66Vo¾ù¦~øáùûû+<<\S¦L‘ÕñPwÄÙ­N¨yN:¥èèh………©U«V RRR’fΜ©äädýôÓOŠŒŒTHHx•ÎÝÝ]&LPLLŒÕQP œ?^QQQ P¯^½´jÕ*ýáÐO?ý¤ÄÄD…††Ò€¥Z´h¡ÀÀ@¹¹¹•xmêÔ©$€ê§I“& ×Î;•œœ,=þøãòóóSDD„RRR¬Ž€:‚‘xN9xð ‡âââ´uëVyzzêöÛoWpp°&Nœ(???«#ê°7jèСڵk—zöìiu,ñ1 IDATÔ0Ú²e‹V¬X¡?üP Qxx¸†.›ÍfuD(æÃ?Ô< ‚‚‚¢y:yò¤7nla2€kc$^V*÷­·ÞÒÎ;Õ£GM›6MááájÚ´©ÕñP;ÅщpUùùùÚºu«´jÕ*íÝ»W-[¶Ô¨Q£¢Ñ£G«aÆVÇ@Ò:avèÐA3fÌгÏ>kuÔiiiúðÃ¥ƒÊßß_áááš2eŠ|||¬Ž¥úõ×_Õ¢E åääHúϨôÁÁÁZµj•ÅÉ®N¼ª‹””EEE•øA·ÀÀ@«£ v‰³[P}œ9sFqqqš6mšš7o®;î¸C‡CãÇצM›”‘‘¡èèh…††ÒP­Øív………é£>²: ª¹ÜÜ\9………©cÇŽZ¼x±õý÷ß+99YááátàPíy{{+88X’þó#L÷߿ũ æð÷÷Wdd¤ÒÓÓµtéRíÙ³GAAAêÙ³§/^¬3gÎXµ#ñ@wðàA9%$$hãÆ2ƨÿþ ÑøñãÕµkW«#à”íÛ·«ÿþJIIÑ­·ÞjuT3ÿþ÷¿­÷Þ{O§OŸÖ]wÝ¥ððp7®¨Ô$ñññš0a‚Œ1jРN:%///«c\#ñ¨Î Gçý裔ŸŸÏè¼p…8:ñ@“ŸŸ¯ï¾û®¨ãnJJŠš5k¦áÇ+88XcÇŽUãÆ­Ž @¹tíÚUãÆÓË/¿luTçÏŸ×Ê•+­¯¿þZ7Þx£î½÷^=øàƒºá†¬Ž’››«-Z(++KÓ¦MÓ|`u$€ë¢/€š ð™Òßþö7}ÿý÷êÑ£‡¦M›¦‡zHÍš5³:j:ñ@]pá­[·N Z½zµ222Ô¹sg+$$DC† a:@­ðôÓO+::Z‡’Ýn·:,RÚ¨)Ç—Íf³:*(66Öê@µñÎ;ïhÆ úÓŸþ¤›o¾Ùê8@µÐ¾}{ 8Ðê€RЉ@MÃ輨 :ñ@muøða­]»V‡C‰‰‰ÊËËÓ-·Ü¢àà`………©GVGÀå~øáÝ|óÍÚ´i“luT¡ôôt­X±BË–-ÓäïﯩS§jêÔ©ŒRËÐp-'NT\\œÕ1¥ /€šªptÞ·ß~[ß}÷nºé&=ðÀŒÎ €ë¡/Ô&©©©Š‹‹SBB‚¾ýö[5hÐ@Æ SHHˆÆŽ«Ö­[[€J×»wo :To¼ñ†ÕQPÉ.^¼¨µk×jÅŠZµj•|||ªßÿþ÷ºå–[¬Ž‡Jb³Ù´råJ………Y°\AA^~ùeÍŸ?ßê(@µ*Itâ€jŒN¼jFç@ÄÙ­N(¿ììl%%%iöìÙj×®zõê¥åË—Ëßß_Ÿ~ú©Îœ9#‡Ã¡ððp:ðêŒI“&iåÊ•ÊË˳: *ÉîÝ»5þ|µoß^ãÆÓÙ³gõñÇ+##C‘‘‘tàPgØív=ñÄVÇ€:Åßß_‘‘‘JOO×Ò¥Kµoß>©GZ¼x±NŸ>muDT#tâ€æäÉ“ŠŽŽVXX˜Z·n­   %%%iæÌ™JNNÖO?ý¤ÈÈH…„„¨^½zVÇ ÊM™2E§NÒ† ¬Žúå—_­   ÝtÓMúøãõàƒêÀJLLThh(mu’»»»Õ NjÔ¨‘ÂÃõcÇ%''ëŽ;îÐÂ… Õ®];………)))ÉꈨèÄ 5@jjª/^¬ÁƒË××W?ü°Îž=«çŸ^iiiJMMÕ‚ äïï/›Ífu\,Õ¥K(&&Æê(p””EDDÈÏÏOjÚ´©uøða-Z´H;v´:"ê¸ÂÑyÓÒÒ´téRíß¿¿èÇè n£/TCùùùÚ¼y³æÏŸ¯nݺ©W¯^zõÕWÕ¹sgÅÄÄèĉJLLÔìÙ³Õ¶m[«ãPíLš4IŸ|ò‰rss%I™™™Z±b…î¾ûnýú믧Ãõ?~\‹/V×®] Í›7ëé§ŸÖ±cÇ«ÀÀ@~¸ÕNáè¼ß~û­’““uçwjáÂ…òóó+×cuLT!›¡Õ™3g´nÝ:9­^½ZçÏŸW=¢àà`Ý~ûítVÀIéééjß¾½ž|òIíÝ»WŸ}ö™.^¼(IÊÊÊ’···Å q¥üü|mذAQQQŠ—···ÂÂÂôðëoß¾VÇC5b³Ù´råJ………YPÍ„††J’âââ,N¤£GêÎ;ïÔ¥K—Šæ]ºtIÙÙÙjÔ¨Q±e_Õ JüòË/Љ‰Qdd¤¾ýö[uïÞ]Ó§O׌3Ô¢E «ã rÅ1/XèàÁƒZºt©‚‚‚äëë«{ï½WÔ³Ï>«Ã‡+55U‹-ÒàÁƒéÀ € G³_°`<<<ôòË/+!!¡¨¯$Ùí|MZìÙ³GóçÏ—ŸŸŸFŽ©³gÏêÝwßUzzº"##éÀ‹ ¹å–[d³ÙœžŠý““cuj¼øøø*Ù§K–,)ÚF»ví*eu‘«>¿ªªÕe»åS”µ~ýúVÇ©ru½üPµoß^>>>JKK+šNœ8¡ÌÌÌbóÒÒÒ4`À«ã@¥)7%%¥Øè¼íÚµct^€:€o§  åçç+%%E ,PÏž=Õ¥K=ÿüójÚ´©Þ}÷]:uJ›7oÖìÙ³Õ¡C«ãPcüøã WóæÍuÇwhùòåÊÍÍ•1¦Øˆ?¨²³³§   ÝtÓMúè£4}útíß¿_‰‰‰š6mš¼¼¼¬Ž‰Z"..NƘ¢)""B’ôÅ_›?iÒ$7NÆ;ÖâÔÕCVV–n¼ñF—{UµOŸxâ cÔ§OŸJÝN]ãªÏ¯<ë©IõÏU&Ož,cŒ†nuKÔõò@m5mÚ4¹»»_s›Í¦É“'WQ"°–¿¿¿"##•žž®×_](zF¶xñb:uÊêˆp1:ñ@%»pႇ"""äçç§€€­X±BJLLÔñãÇ«iÓ¦©qãÆVÇ FjÑ¢…ôË/¿HÒ5;î2º½uRRR¡V­ZiêÔ©jÚ´©>ýôS:tH‹-R§N¬Žà2ƨ   Ê·Ý°aC <¸Ê·‹êÃÊú\çÞ{ïU~~~©¯Ûl6õë×O;v¬ºPP øøøwÈ!.—{(€êçÚ?muP~~¾ÜÜÜ*´ŽÃ‡kíÚµr8JLLT^^ž  Ç\cÆŒÑM7Ý䢴@’Z¶l©Ï?ÿ\ýû÷×Å‹¯¹¬ÝÎo——1F .Ô°aÜî\—‘‘¡•+Wêïÿ»~øáõèÑCO?ý´f̘¡-ZTrbÔuß}÷ÓËÆÄÄTb’šÉÇÇG°:ê(êµCÛ¶m5hÐ mݺõªËìv»¦M›fA2¨> Gç]²d‰þñ(**JAAAêÖ­›|ðA§Ÿ£:uJ&LP\\œZ·n]Éà ¾€ÿeŒÑÒ¥Kõûßÿ¾\ïOMMÕ‚  N:iîܹ’¤×_]iiiÚ¼y³æÍ›G^*É-·Ü¢wß}÷ºË1oùäææêþûïןÿüg-[¶ìšËæçç+))IaaaêСƒžyæ 8PÉÉÉJMMÕ¼yóèÀ uÄÔ©S¯y/~Ï=÷Ta¨¾ GçMNNVrr²Fީŋ;=:ïû￯M›6©_¿~Ú³gO&ÀµÐ‰ôŸ_¦¾ûî»5gÎÅÆÆ*??ÿºïÉÎÎVRR’fÏž­víÚ©W¯^úàƒäïï¯O?ýTgΜ‘ÃáPxx8¿v @™:uª"""äææVê2tâ-»S§NièÐ¡Š•$ÅÆÆ*33³Är{÷îÕ‚ Ô¹sg9RééézóÍ7•žž®ÈÈHùûûWut B2224iÒ$5iÒDÍ›7WppðUG=yò¤fÍš¥Ž;ª^½zjÙ²¥&L˜Pl$àøøxÙl¶¢iÏž= SóæÍ‹æ:uÊéõ•æÊí>|X“&M’š7o®©S§êìÙ³:tèBBBäãã£6mÚ衇*v\_¹žœœœbÛÙ½{·Æ§Æ«AƒêׯŸXôž™3g–yŸ.Y²D6›M¿þú«¾þúë¢u¹»»_ÿ»"ßÝwß]”oذaúúë¯K,W‘}-IyyyZ¹r¥‚‚‚äëë+///õîÝ[K—.½êHsWrÕçµpá¢u\>Rúš5kŠæ_íÇNŸ>­¹sçªK—.òôôT»ví¨åË—+;;»ÄòÎ×s½õXUÿ ¹ú˜.ÍååðööÖwܡ͛7—º|yr•·NIÎ×ï+·yèÐ!§ösY˨¹BCC¯z/n·Û5lØ0žŸÀUøûûkéÒ¥JKKÓŠ+töìY©{÷îZ¼x±NžøÀ„††š† »ÝnüýýÍ3Ï}Šæ¹b_;3tèÐóï¿ÿ~ãááaΟ?ïTnW}^eéÄ;}úôR§Q£F]µ¯³Ÿ_iʺ+꟫éÒ”VŽ´´4ãééY¢åÍU‘:UÖú]Ú~ž8qb‰ý\Öò;‹N¼P}}øá‡Æn·»·ôðð0çγ:Ô8™™™fÙ²eæ¶Ûn3’L·nÝL@@@©?jøÌ3ÏX .‹µ;5\/Ô2GŽÑwÜ¡… ª  @ùùùE¯]¼xQ111úÃþ n¸A½zõÒo¼¡^½ziõêÕ:sæŒ5{ölµmÛÖÂR€Òøúú*>>^6›­ÄkW›‡’Þ{ï= :T™™™ºtéR±×Œ1úá‡ôÍ7ßháÂ…JOOWLLŒFŒ!»¯¡Q{ÜvÛmÅþöóó“$¥§§Í‹—ÝnWppp±e}}}Õ³gO¥¤¤èرc%Öݯ_¿«n³¼ë+M@@@±¿ ïa®œïççW¬\ײfÍIÒÈ‘#‹ÍoÙ²¥ºwï~Í÷:³O+ª~ýúêß¿±y½{÷VÛ¶mõý÷ßëøñã’\³¯ƒƒƒµaÆóûôé£K—.)55µLÙ+ãó*ͪU«$I£G.ñÚ_|¡9s攘ïªÏ¯"ë©ìúçêcº4¥•£mÛ¶êÚµk‰åË›«"uª¼õûÊýܾ}{IÅ÷sY˨ùƧzõêýíîî®1cƨqãÆ¦€š©aÆš9s¦¶oß®o¿ýVƒ Ò·ß~[â^¡çŸ^>ø`©¯ r¹[ªÚªU«4}úteggë¼{¹#GŽè«¯¾ÒôéÓ5fÌÝzë­tø †4h^}õUÍ™3GƘ¢ù\ӯͣ è¹çž»ær Ò¬Y³ª(Põ®ìPPØI½  @’”››«óçÏ_uÙËíÛ·OíÚµ+6ÏÛÛ»ÄrY_i5jTìo»Ý.7775hРØ|77·¢r]Knn®233U¿~}5lذÄëM›6½æû¯·O]¡yóæW=×·jÕJééé:qℚ5kæ’}}þüy½úê«Zµj•Ž;¦sçÎ{ýÂ… eÊîêÏ«4…u­~ýúòññqú}®úüÊ»žÊ®®>¦Ks½r´jÕJ{÷î-¶|ysU¤N•·~_™±°ÃÖåû¹,åÔÞÞÞ3fŒV­Z¥K—.)??_÷ÝwŸÕ± ÆëÛ·¯zöì)»Ý^ê=UAAV¬X¡Ã‡+>>¾Ä}*?  ÎÈÉÉѬY³4aÂeee]óצ=<<4cÆ =ûì³ò÷÷§³5Ô¬Y³4uêT¹»óûÆÎÈÉÉÑäÉ“µpáÂë.{éÒ%ýýïWnnn$ª'OOO5iÒDîîîºté’Œ1W† fÉú*ƒ§§§|||”““£¬¬¬¯Ÿ8qÂ%Û©È=XagÇ+fkÕª•ËöuHHˆžþy=ôÐCÚ»w¯ dŒÑ_ÿúWI*ö#UÁn·ëâÅ‹%æ_ÙùÒÓÓS7VNNŽ233«*^…Uvý«ªcðzå8sæŒ%¹®TYõ»¬åÔ÷Ýw_Ñsy///=ÚâDP;DFF–úÃÅ…òóóµiÓ&õïß_G­¢dèÄ  ŽøñÇuë­·êoû›¤ëî“——§O>ù¤*¢€JööÛo«{÷î²Ùlü0Ç5?~\ƒ Ò'Ÿ|âôˆŠçÏŸ×gŸ}VÉÉ€êm„ ÊËËÓ×_]âµÅ‹«C‡ÊË˳l}•¡°³Åš5kŠÍÏÈÈpÙè™ 4(Öµ[·nŠŠŠrê½YYYúþûï‹Íûᇔžž®>}ú¨M›6’*¾¯óóóõõ×_Ë××W³fÍRË–-‹®3ÙÙÙNeuµ6mÚ(--­Ø¼ŒŒ 9r¤Ä²ãÇ—$}þùç%^ëÛ·¯üñÊ YA•]ÿªê,­§NÒž={,ËU¨²ëwY˨F%IRXX˜êׯoq"¨ù6nܨ}ûö9õ#;yyyÚ¿¿üýýõÝwßUA:H?7 j½cÇŽiË–-VÇ`¡¤¤$½ÿþûÊÏÏwz”cŒ¶nݪ÷Þ{O 6¬ä„uKXX˜ÕÔ0±±±VG@-¡§žzJ999Ô©«8|ø°^xá…RG¯¼œÍf“ÝþŸß‹.((ÐóÏ?oy‡ÂšlРAj×®Õ1P/½ô’6nܨßýîwzóÍ75hÐ åçç+..NÏ=÷œÞÿý2îêõU†_|QIIIš3gŽ7n¬êСCzòÉ'åë뫌ŒŒ oãÖ[oÕÖ­[uôèQ;vLÔwÜáÔ{½½½õè£jÉ’%êÕ«—~üñG͘1CõêÕÓÒ¥K‹–«è¾vssÓСCµ~ýz½òÊ+zðÁåíí­mÛ¶éwÞ©ð>(#FèÍ7ßÔ›o¾©éÓ§ëçŸÖÿøGµjÕJ999Å–-,ÿã?®† êÎ;ïÔùóçõâ‹/êøñãÕ¶oe׿ª:¯VŽ#GŽhîܹjذa‰krUŸ*»~—µü@uÇ=à¼~ýúiݺuòóóãØœÔ¾}{ 8ÐêRx×{ã7$IîîîE?¼cŒ‘1F%¾ÍËËÓÉ“'5`À=ùä“êÝ»w•gê2ž@ej¹•+WILLLLLÕd€²²ú¼ÅÄÄÄT™ÓÊ•+­>ÍÖ8åÝoï¿ÿþU?ƒÌÌÌ¢e¶nÝZâõ?ýéOEÛ½|ºûÞwúôi3wî\Ó¹sgãááaZ¶liFŒa¯¹néêícgÖWšÒÊðÍ7ß”˜ÿÒK/™M›6•˜ÿÌ3ϘU«V•˜ß}÷mgÏž=fܸq¦Q£F¦AƒfРAfãÆfèС¦AƒÞ§»wï6wÜq‡ñöö6íÛ·7o½õÖ5ËýÊ+¯­ÇÏÏÏlß¾Ý 6Ì4lØÐxyy™!C†˜Í›7»t_cÌÉ“'MDD„iß¾½ñðð0­[·6Ó§O7óçÏ/Êãïï_éŸW¡sçΙ™3gš6mÚ///3xð`óÍ7ßÿ¢åçÍ›W´ü©S§Ìœ9sL§NŒ‡‡‡iÓ¦™?gËYÚz¬®®>¦Ksy9¼¼¼Ìm·ÝfÌðáËÖ7cÆŒ ç*or¶~—w?—µüΘ8q¢™8qb™Þ¸ÂõÚ|LLLLLL™jCûfâĉ–ïG&&&¦ê0ñ<ê¤X›1N;PCÅÆÆjÒ¤IN¾  öúå—_”““£¬¬,eee)77Wçϟׅ ”››«³gÏ*''GÙÙÙ:þ¼rssÕ·o_ÝÿýVG¯8(/›Í¦•+W2’7\â•W^Ñ“O>iu @ç·òb¿UoÝ»wWvv¶>luÔAÔ?„††J’âââ,N‚º†ö ༂‚½úê«Ü›Nª-í›ÚRŽÚ(77WžžžVÇêî ÎŠs·:T•F©Q£FjÕª•ÕQ€Ežxâ «#@—‘‘¡=zè矖‡‡GÑüC‡éÀü*õ€šÍn·kîܹVÇü/:ðT>»Õ ªØl6«#@­pöìYEDDèèÑ£ºpá‚¶oß®I“&©Q£FúÿïÿYµõ€šÍÍÍÍêT:ñÀi¾¾¾JJJÒ¹sçtçwªiÓ¦3fŒn¼ñFmß¾];w¶:"j1ê &q·:j–áÇkøðáVÇ@EýÔŒÄ ¸x®àëë+›ÍVlÚ½{w±e&Nœ(›Í¦´´´bóŸ~úébï0`@±¿srrª²(ÕJ||<û¢–ˆ‰‰)úëׯouT²ãÇë…^P@@€5j$___ 2D«V­²:”ªaÆ%ÚsK–,©ôíÒÞAeY²dIQ½j×®e9jr;ÐUÙi¡4\*Ou9VêMíàÊg‰‹-ªÊè,tµûV»Ý®¦M›ªOŸ>zä‘G”’’buLKp}DmnÿU6ŽŸêgUçÁ®t­çÁœ§V /À222%Iš3gŽŒ1êÞ½{ÑëùùùZ·n$iíÚµÅÞ»páB>}ZMš4ÑÅ‹µmÛ6c4vìØª+€²²²tã7*88¸Ê¶9nܸj¹/Pv“'O–1FÇ·: ªÀC=¤×^{MÏ>û¬Ž?®mÛ¶©]»vš0a‚æÏŸou<¸ª¬¬,íØ±C’4vìXcôÄOTúviïToV´]å‰'ž1F}úô±4GMnº*;m#”†k@å©ìs •ׇòÔ›š|=«­\ù,ÑÙkIyëõ¨>®vßzéÒ%íÞ½[Ï=÷œvïÞ­€€=øàƒºpá‚Åi«í*T—{àòªi퉶ùK IDATK¸Ïªσ\éZσ9O¬@'^€«5j”$iÍš5%^ûŸÿù]¼x±Ô×5dÈyxxTnÈÿÕ°aC <¸Lï1ƨ  @Õ"PWÖ§šZ7˛ەå]²d‰î¾ûny{{«cÇŽzÿý÷åçç§%K–èĉ.ÙÔ$ÕñšR3U¦êÖFÝBÛ¨n«kçÛº *®®¬7<ÓqW–·ªŸ%^«\«\´‡€êÍÍÍM­[·Öرcµ~ýz=õÔSZ¾|¹¦L™"cŒÕñP‹Õµ6@e«iíKW©Ž™*ÓõÊ˳ƒÚ¥:Öï꘩2UÇòVÇLpçi@Us·:@uÔ¾}{ÝtÓMúñÇuäÈuèС赵k×êá‡VTT”’’’”ŸŸ/77·b¯9ÒŠØNóññÑ¬Ž HHH(1¯^½zêÑ£‡ÒÒÒ´gϵjÕÊ‚d” m`¸m# ö©iׇ𖷮¨êg‰å­Ô fY´h‘6nܨիW+&&FS¦L±:'p½Ï zã< °#ñ”¢´4Ö¬Y£Ýu×]:{ö¬¶oß^ìõ/¿ü²è½P[|¸|||Ô A 6L_ýu…¶é̲Wîó={ö(,,LÍ›7/šwêÔ©«–¡,ïu6·³u¬ÐîÝ»5nÜ85nÜXÞÞÞºãŽ;´yóæëîÿÒ8SÏœ©O®>V*Rל-WY¶UÞcÜÙ÷>}ZsçÎU—.]T¯^=5mÚT£GÖ† ®[Ö>ø@P×®]Õ£G§öTµµ½ãŠó¾3íŽwß}×¥m“+·yèСkî3W·ËºýÒ,\¸°hƒ.š¿fÍš¢ù-Z´(Q޲¶SKãìu½ªÛWîßÇkÒ¤IòññQóæÍ5uêT={V‡RHHˆ|||Ô¦M=ôÐCÊÌÌ,w9Ë“½"Ç!m£º¡2®Î“®:WIÎ]+ûœæŠsà¹sçŠí›Í¦… í×ËçOœ8±ÔõTöõÁÕõÆêg:u½=q=}–XÞsBa=¸^¹\]ß/¿Ö6hÐ@ýúõSBB‚‹Ö5sæÌ íS*ºoÛ¶M—.]*š_Þg{彆:³½²¶!œåªvUyË^ÑçÆ•ÑæsU[¨¬×ŽÒ®Ùe½×¼¼>yzzª]»v ÔòåË•]jÞ?ü°D¹322œþœœ-OEÚU5­}YˆgS•ß–äÙux\79ÉùkpyŸƒTæw±®|®Z™ÏŸ*ò¼Ù™ûȲ+}–ÍyPé @-·råJSžÇ ÙÙÙÆËËË4nÜØ\ºtÉcLLLŒ 1Ƴÿ~#Éôïß¿è=K–,1>úh‰u;ÖH2cÇŽ5[¶l1YYYfݺu¦Q£Fæ¶Ûn+¶¬Ãá0’Ì‹/¾hΜ9cNž}Œ···8p`Ñ6¿ùæsóÍ7›zõ꙯¾úª\Û,k¾Â²2ÄlذÁüúë¯fÛ¶mÆÍÍÍœúè#§ö‹Uׇkm§´zSZÞÊnãО¸¾Š>K,ï9áÊzël}«H}¿Úµv×®]&00дlÙ²\Ï‹\eâĉfâĉ–mu—+ï[/—m$I&==ÝSþg{—+Ë5´¬Û+k¢4•Õ®5jÔ5ËþñÇýíŠ{öÊló¹ª-äìµ£´kvYÊXXŸ|}}Ãá0¿üò‹ÉÈÈ0Ï?ÿ¼‘dþú׿-{eû///ÏÌ;×™3gÎÍwõw5®hWÕ¤ö%ϦJßg®hKºâÙAmißTv9xüêò1w9W}—\Z¦2¾‹½’+ž«Vf[¤¢Ï›¯uY–:U‘gÙ®8O—σ ÎŠå¿¥@­W‘Nc#GŽ4’̦M›Œ1Æ<øàƒæÍ7ß,z½K—.Æn·›Ó§OcŒ 2 %ÖSøE‡Ãá(6ÿÞ{ï5’Šuàt8fèС%Öqÿý÷sþüùbó]Ù¡S§NfРA%–íÚµ«Ë¿Ätf_<ðÀFR‰49~ü¸ñôô4þþþNeêÓ§‘dvìØQlþÎ;$Ó§OŸrm³¬ù ËþùçŸ;•»,ï-K–²Ô±ÐÐP#ÉüóŸÿ,¶lZZšñôô,×?e–¥ž]¯¯«ŽWÔ5gËUÖmUF'ÞéÓ§IæÿøG±ù999¦mÛ¶ÆËËËddd”xŸ›››iÓ¦™5k–IKK+s&:ñ(/Wþ3tmmï¸ò¼ïL›Å•m“Ë×wå>›8qb‰}v½ò^Ëõþ‰ÖÙí—¦<Þœm§.e¶²|¾Vµ ÷ïgŸ}Vl~Ïž=$³qãÆbó;uêdºuëVîr–5{yʶŒáŸ¶Ê«&tâ­ŒûWœ«\q?æÊsZEÏk×®5’Ì#|¸úöí{ղϙ3GîîîEó\qÏ^™m¾ªj *íš]–2Ö§Ñ£G—Xþ‹/¾Ðœ9sJÌß³gú÷ï/»Ý®×^{MnnnÅ^wõw5Uñì¨:µ/y6U\e|6<;°σÿO]9æ YyåêöSEž«Vf[ÄÏ›K»,Kªè³lÎÓ€ª@'^€k(ü'»µk×ê‡~PýúõÕ¥K—¢× ¿X»v­6nܨ€€y{{—º¾ÆûÛnÿÏ㙂‚‚¢yçϟןÿügõîÝ[M›6•Íf“ÍfÓ“O>)Iºpá‚k wo½õ–¢££uðàA >\5Ò¨Q£Š¾dr¥ëí‹ÜÜ\?^jܸqÑ~(œ¾ýö[IÒÿgïÎ㢮öÿ¿†UvÁQÌ ÍL½îK)‰R¹d7Á›• Y`Y×ïµÍýâ•®’· —D»‰‘Z¡Y¹>SS Ü Ä=YÎï~Ìu„Ïgæ3|†áõ|<|ÜÛg>sæ}>s>ç¼Ï™9̹sç$½^ëÖ­ë=Þ®];Àõë×e½¦1ñ5ÔFSßsåÆ"µUTT ¤¤­Zµ‚³³³Þk'—RíL©{E©¶&¥^J·kCÔÆÐªU+¸¸¸ÔyÜÓÓ——g²ˆˆÔdÉùN}Œé÷¥ä,Jä&w»÷šÙÙÙÐÍ—MI×—’§ê#÷ýU;tuuÕùo+++X[[ÃÑÑQ縵µµÎ5—SO¹±›C~F–É”ócú*Sƒrû4cúÀZÑÑѸ}û6>üðCÀÙ³gñÝwß!22RrÜiªñAJ»ÑÇ”ï-ó éŒYKTsMðn]¿ÆÆZwwwÓIÔ‚8p0pà@ØÚÚ*º¶'e 5‡µDSäU¯¾újºÿøã˜9s¦ö¥æ ¦Îùš"ª¥o\—3×l¨=Õ§  ÁÁÁèÔ©vïÞ7êvvvøæ›oðõ×_×yÜAAAX´h"""pöìYÔÔÔ@•+W„:çk4£_óM›†={ö °°)))B $$+V¬\†ìííѺukØØØ ²²Bˆzÿ >\Ry·nݪsí€ÿ}!¸]»v²^SéøŒ!7©mÌÞÞ...(//Giii×ÍÏÏ7(^9í¬¡ö¤Ô½¢Ô{)¥^†¼–¡÷TCõussCyy9JJJê<~íÚ5þc""Kd©ùŽ9õûM‘')™+ÉÊÊ wîÜ©s¼°°Pïs¤ä©úÈ}ÕÎ %§žrc7§¼žš%û¹s%È›¢O3¦¬5eÊxzzbõêÕ¨¨¨ÀòåËñÜsÏ™ÕF¦·L™ã0ŸÎ˜µD¥úS··ÆÆZ)›ï‰Hššš$$$^zé%ÊöÉRÆPC^ÏÂXrûÐððpx{{ëÔ=""Bg£Rc‘©s>%r!cÇ9s͆ÚS}lll°gÏìØ±}úôADDŽ=ª}Ü9ƒy•©qmªaÍ5—$Óàz°®–tÏɃåæ0æô4Ä”¹ˆRëÍ÷Î#å~oÜֲ‰ˆˆôá&^"""""""¢FŒ;B¬ZµJûkµœ1hÐ äææbýúõFoâ­®®ÆÁƒѾ}{Ì™3mÛ¶Õ~øSVVVïsu>LêÙ³' zýÖ­[#33`kk‹Ñ£G#%%;wî”T†’ñ„„„ ªª ¬óØâŋѹsgTUUI*«¼¼\ç‹pêÔ)äææ" :týšJÆg,©±Èmc?þ8à믿Ö9~óæMdee«œv¦¯=)}¯(ñ^J­—Ü×2ôžjèy“&M€:×»¢¢{÷î…ƒƒC½ýYUUüýý}m""sf©ùŽ)ú}c˜:ORò=PR‡““£s,//—.]Òû©yª>Rß_sÈ!§ËÝÐöÊܨeRªÿ1dN£9ã`SôiÆöÀŸ_ìœ={6®_¿ŽåË—cÓ¦MˆŠŠjôyM©)Æ-Sç8Ì'¤3d-QÉ>¡)Ú›¾±6//gÏžUôµˆZ²ùóçã§Ÿ~¤I“¦=®TŸ,u •ûz†äÆ0¤µ±±ATT”¶î[¶lÁœ9sêœgìXÔ9Ÿ¹1c‡Ü:Ö¶§]»vÕy졇Âܹsu޹¸¸ÀËË ÎÎÎøòË/áììŒàà`\½zU{ŽÒ9ƒy•©qmªqæ’Krí@}\þŸ–pÏÕ2d –›Ã˜Û{PSæ"J­7ë›GÊiSƬe³Ÿ&"¢¦ÂM¼DDDDDDDD¨ý²]uuu½¶öÃGGG<øàƒF½–µµ5† †¼¼<,]º7oÞDYYöíÛ‡5kÖÔûœ‡~gÏžÅåË—qøða\¼xC† 18†¿ýíoøå—_PQQëׯcÉ’%B`Ĉ’ž¯d<ï¿ÿ>üüüð׿þ»wïFQQòóó±víZüãÿÀ²eË`cc#©,777¼ñÆ8|ø0þøã¤§§cêÔ©°³³C||¼A¯©d|Æ’‹Ü6öÞ{ïÁÃÃÑÑÑHKKCii)2220uêT8;;¯Ôv¦¯=)}¯(õ^J©—Ü×2ôžj¬¾>>>ˆŽŽÆW_}…’’œ={Ï>û,®^½Šøøxxzzê”÷ÑGÁÉÉ ¯¿þz£¯MDdî,1ßQºß7–©ó$¥s`¥Œ3¹¹¹X½z5JKKqáÂDEE5øK’RóT}¤¾¿æ’JN;–»!핹QË¥TÿcÈœF)RÇÁ¦èÓŒíkÍž=X°`F…nݺI¿ M ©Æ-Sæ8--Ÿ(((@=àããƒÜÜ\Yå²–¨dŸÐí­¾±öôéÓxþùç›ìפˆ,QMM ®_¿Ž;v`äÈ‘X²d þú׿bÓ¦M:¿ô¦dŸ,e •ûz†äÆ0´ŒŒ„››,X€àà`xyyÕ[wcÆ¢¦ÊùŒÍ…Œ;äÖ±¶=Í;;wîDII ®\¹‚Ù³gãêÕ«u6ñÞ­k×®øüóÏqãÆ „„„ ¢¢B[¦Ò9ƒ±y•©qmªé꥔÷€kæƒëÁ-ãž»›!c°ÜÆÜÞƒú˜2Qb½¹¡y¤œ6eèZ6ûi""jR‚ˆˆˆˆˆˆˆÈÂ%'' c–A …6lX½?~\3f̨óØáÇo¾ù¦BÔ9>~üx!„7nܳfÍÞÞÞÂÖÖVxzzŠ3fˆ¸¸8í¹Ú×ÈÌÌC† NNNÂÛÛ[$$$4XŸíÛ·×yí)S¦!„8q℘5k–èÕ«—pttâÑG}ô‘¨©©‘t½ôÅcȵBˆ[·n‰˜˜áëë+lmmEÛ¶mŘ1cDZZš¤x„" @xyy‰ŒŒ 1vìXáââ"ÄСCÅêœ/ç5¥œ[_Ý¥¶I9Ï•·Ü6–••%‚ƒƒ…«««pppýû÷_}õ•9r¤öü^xAR}„×ÎjßJß+ƶ59õ’óZrïq©Ï»y󦈎Ž>>>ÂÖÖV¸¹¹‰±cÇŠ½{÷Ö[Þš5k„ƒƒƒ˜7ož¤×¯±ý1µ\Drr²äóœœêŒK—.BXn¾£D¿/%ïP:71ôš)•úúúŠ™3gŠ:1xð`qôèQ¨-'66V{¾ÔW©õÚk¯ âäÉ“zã1vÎÞT9Ÿ!¹P-9¹J}c¶Üëo{êСƒxúé§ÅÙ³g…B|öÙgu^såÊ•õÆS;*ùY1yUsË/kqmJÙ\²–Rk–’ߘ²\æ=W¹ã“ÜFéÏb»î†®«š21f½YÊ­vXMfË–-Úz·jÕJípš\\\’““Õƒˆˆ$`ŽCÍÕ²eË´ùV§NT‹ÃRò>¥êÁ<Ì™¹Ü¯úú/séפ2e¼rËnn׎šFJJж]h4”——+VvS·9s鿈¨iq¾nSŽJÑ׿3·ùŸæx-î½wš'sMJàxADM¡¡y)Ç3""27ñ‘Ö‰'Я_?Œ3®®®j‡c¥¥¥èÞ½;&L˜`tYÄ3Ï<ƒ1cÆàÆ8þ|³ùr…Rž~úi!0räHµCQEDDæÏŸ·ÞzKíPˆˆ¨-!Ç!Ë5oÞ<! j–’÷)UædÎÔ¸_ë›këë¿Ì¥_“Ê”ñÊ-»¹];jÁÁÁB`âĉЗÝÔmÎRò "’Žóuã™rPоþ¹Íÿ4·kQß½ÛÐ<™sh2Ç "j* ÍK9ž‘1¸‰—ˆˆˆˆˆˆˆˆÅÅÅ ÂSO=…—_~YípLFššÔÔÔ]Ö¶mÛ „@TTœáçç‡Ë—/ãP Rº—³³3lVeùùùaûöíx÷Ýw±uëV"#""¥5”ã(9¶4MY_s·‰”ÄWNÙ÷*,,Ô©¯F£Á;ï¼£ãîã¡¡¡^ï»Û“££#yä|õÕW5j”¶œ™3gjÏ—Òo’‹Z/SÜ›ú4Õ=~wìííÑ©S'Œ5 ëׯGYYYóóòòd—+wíjãÆuÞŸ¼¼<òÆR¥×™ˆ¨ùà|]^}å2š7U~ZKîüLŠÆ®¹Ô\Rn¾'w<¯eì˜+µ>R×KôÝ»wkhžÌ94ÉÅñB^}Ãõ]ý¤ÖÉе`%ÚªJ®Ãš2_0f­Z©µŠúÊ–š·p<#""ƒ"""""""" —œœ,¸ Ò° 6â½÷Þ«÷ñ€€áää$(:$JKKÅÑ£GŃ>(ìììÄ÷߯=777WtéÒExzzŠ;wŠ’’qúôi1tèPѪU+qèÐ!ƒÎBˆ‰' bèСbß¾}â?þGŽÖÖÖâÆ’ë[[NYYY½Ç'Nœ¨­gZZšpppýû÷—\ÎÕ«W…ðôô©©©¢¨¨Hdee‰¡ÑhÄG}¤sþðáÃ…‡‡‡8|ø°¤ã]9×555UûÞççç‹7nˆU«V +++1oÞ<×=wîœhݺµðòòß~û­())¿üò‹3fŒèÚµ«°··—üÔš9s¦pssß~û­¸}û¶ÈËËóæÍľ}ûtÎurrƒ ª·9õh¬,¹íR!ŠŠŠ1dÈÙ× %aLD† ’““e?¯±§¡ñ@îx.%OQr ¿»<©¹KCõ•ÂÇí† mÚ´1¸rs49q!/Ç®=ßËËK瘜vªvÞ'ÄÿÚlHHˆHOO¥¥¥"))I?þ¸˜8q¢8~ü¸())kÖ¬Äܹs ®³Üz¨‘Ú¿µtr¯›Ü~§±þZî!·Ó¿+u¿&$$bÓ¦M:Çg̘!ˆððpãÛ·o#Gެ7î{çÈõõ_ ×Gn¿©ôû ÜÜÜÄðáÃÅDII‰Þ×—Ûæä”­ïÚ;VXYY‰óçÏ×)àÀuÞÛúÔמNŸ>-F%Ú¶mkt¿iH."§^¦¾7õ1å=^[§öíÛ‹ÔÔTQ\\,òòòÄ¢E‹±råÊËÝ»w¯puuÕ[®œöw›«ªª111bôèÑ"??_{\N›0U¾*BCC z.‘1˜×ÉÃùºôúJ%g04?6U~Z_n#÷š+5‡¿·ÎúÚ„œk(g<7Ř+¥>R×K»w…hxžÌÏR c)ù!õàx!½¾Rp}Wÿq¥ê¤o¨d[•B‰uXSæ Æ®U+µVaè¼Ô˜ñŒó"¢k+¿-EDDDDDDD›Æ·dÉ@$$$Ôûx@@€ Ž?®sü—_~D@@€öØsÏ=Wï¯^½*ìííE`` Aç ñ¿~víÚeP=ï-Gß&ÞÔÔTã¡¡¡@ÂúÊ©ý’ógŸ}¦s¼¼¼\tìØQ888ˆ¼¼<íñ¡C‡ ww÷:Üê;ÞØus]SSSŰaÃê”1uêTakk+ŠŠŠ´ÇÂÂÂñùçŸëœ›““#ìíí úr¥xì±ÇêïÑ£‡ì‹¥Ö£±²ä¶ËZFtëÖ­ÞÇèOì‰ÈP†~©¡±§¡ñ@îx.%OQr ¿»<©¹‹±_ò2Çq»¡Çëû”œ:ÈÍÑ ÙÄ+5Ç®=ÿÞ/5Ëi§jç}Bü¯ÍîܹSçxïÞ½ñÃ?è÷ññ={öÔ9&§Îrë¡FÈ/mÆM¼rúÆúk¹c„¡ü¤ôïJݯ·nÝvvvbܸqÚc·oßîîî¢[·nÂÁÁAk›4i’øôÓOëÛ”›xåô›J¿µ¯ï—ë{}¹mNNÙµçß{í¾ùæ@Ìž=[çø„———¸sçN½×ánúÚÓõë×…£££Ñý¦!¹ˆœz™úÞÔÇ”÷xmêëóÆWï&Þ{Ë}öÙgõ–+§ý×¶¹‚‚1vìX%ªªªtž/§M˜*ß°”M.Ôü0¯“‡óueçë ½f}〡ù±©òÓúr¹×\©9ü½uÖ×&ä\C9ã¹)Æ\)õ‘º^ÒØ½[«¡y2?K‘ÏRòCêÁñ‚ë»Mµ¾«T ÙÄ+·­J¡Ä:¬)ó%Öª•X«0f^jèxÆyQ‹µÕ DDDDDDDDÔâ•——lmmõžãä䄾}ûêëÓ§:v숓'OâêÕ«€””XYYa„ :ç¶oß½{÷ƱcÇpåÊÙçÞí‘G‘_Iú÷ï¯óßÞÞÞ€ÜÜ\IÏß¾};`üøñ:Çííí1räH”••á›o¾ÑÿþûŸꜯïx-}×AÎu0aöíÛW§Œ€€TVVâÌ™3Úc_ý5`ìØ±:çvìØ=zô¨7–ÆŒ7‡Bdd$Ž9‚êêj@VV† &¹9õhŒ¡íÒÆÆeee’_‡ˆˆLOJŽ£Üñ¼–”¾ÿþ{„„„ȯ”‘ é7•|[µj…4úú†´9©eë3fÌôéÓëׯǭ[·´Ç—.]ŠW^yER>¤¯=µmÛþþþuÎ7´ß”CN½šêÞTŠ”{¼¶N?þxçïÞ½ÑÑÑ–ëå奷\¹×*++  €••þùÏÂÚÚZçq9mÂÔù™7Îו¯7ôšõ†æÇM™ŸÊ½æ¦šÃëkr®¡!ã¹’c®”úH]/‘zï64OæšäàxÁõÝ{™j}WÍ:™r.kÌ:¬)ó%Öª•X«0&oáxFDDrq/¡U«V€ÊÊJ½ç´nݺÞãíÚµ\¿~(**BMM ÜÜÜ ÑhtþýüóÏ€sçÎÉ:÷^NNNFÕ·1nnn:ÿmgg¨©©iô¹µõjÕª\\\ê<îéé Ú/E£¾ë ÷ºáí·ßFŸ>}àîî®=ïµ×^ܾ}[[nII Zµjggç:¯[ÛäJHH@RR.^¼ˆ‘#GÂÕÕãÆÓ~X)•Ôz4ƘvYUUYq‘iIÉqêcÌx.%OQb ¿›1¹‹æ6nB©:(EJŽ­ÜvªvÞw7WWWÿ¶²²‚µµ5uŽ[[[ë´c9u–[æ–ÍÐ~§¡þº)æ|õïJ߯ӧOGuu56oÞ Ø°a¦OŸŽgžyÖÖÖØ´ià³Ï>Ä ê}MS3¤ßTò}lÓ¦ 4M£¯oH›“ZvC¢££qûöm|øá‡€³gÏâ»ï¾Cddd£Ïm¬=¹»»×9ßÐ~S.)õjÊ{S)Rîñ†ê$µ\+++Yåê»VF§N°{÷nlܸQçq¹ë‚¦Î7ˆÈ¼q¾®ì|½¡×¼w Ï›*?mÊ<£1úÚœ9¶Üñ\É1Wj}¤®—H½wš'sMrp¼àúî½Lµ¾«VL=—5t0]¾ §lS®U›·p<#""¹¸‰—ˆˆˆˆˆˆˆˆÐ¡C~X¢Ï­[· „¨s¼öK¤íÚµƒ½½=Z·n TVVBQï¿áÇË:·9±··‡››ÊËËQRRRçñk×®øó/½šêõå\×   ,Z´8{ö,jjj „ÀÊ•+@ûžÛÛÛÃÅÅååå(--­óºùùùÅ«Ñh0mÚ4ìÙ³………HII!!!X±bEsõ‘ZÆÊ2´]C¡½—ˆˆÈ<4–ã444õxÞ¹QCc©Ôç›Ó¸]ËÊÊ wîÜ©s¼°°Ð¨:È%'ŽZRrl}ä¶Sµó>%È©³Üz0´lrû†2FÒ?HEÉûuüøñðððÀ† pãÆ 9rÁÁÁðôôĘ1cðÝwßáêÕ«øôÓO1}út£b7”1ýæÝ ëõå÷¾¾!mNjÙ ™2e <==±zõjTTT`ùòåxî¹çê|©µ>µ§{7Òoš‹H©—š÷¦)ïñ†êdªrõµìÙ³;vì@Ÿ>}£Gê”+g]Ð\ó "jœ¯ë2v¾.—’ùñÝ”êß›Ã5—3Ç–;ž+9æJ%u½DÊç‰ Í“9‡&¹8^èâú®éÖwåÖIî<МڪT¦Êä”mʵ còŽgDDdnâ%""""""""<ðÀ€+W®è=§¼¼\çKpêÔ)äææ" @ûEHHªªªpðàÁ:e,^¼;wFUU•ìs›“I“&vîÜ©s¼¢¢{÷î…ƒƒÆŽk²×—z]«««qðàA´oßsæÌAÛ¶mµ –••Õyîã?øúë¯uŽß¼yYYYÅÚºukdfflmm1zôh¤¤¤@£ÑÔ¹~ŽŽŽ:†öìÙ‰‰‰²ëÑPY€aí2''Àÿî%""2å8 jŒç¦Îª¯æ8n~™¯v,®•——‡K—.U¹äÄQKjŽ­ÔvjyŸRäÜ›rëÁ<Ð2Òï4FîaHÿ •’÷«ÂÃÃqâÄ ¼ù曘8q¢öE¦M›†êêjüýïÇÕ«W1bÄ£c7„±ýæÝ ëKKKqòäÉ_ßÐ6'¥ìÆØÛÛcöìÙ¸~ý:–/_ŽM›6!**ªÑçÕÒמòòòpöìÙ:çËí7 ÍE¤ÖK­{Ó”÷xmvíÚU籇zsçÎ5ª\9íßÅÅ^^^pvvÆ—_~ gggãêÕ«Úsä´ sÎ7ˆÈô8_×eì|]SäÇwSª7çk.÷ÊÏ•s¥º^"åóĆæÉœC“\/tq}×4뻆ÔIî<ÐÜÚjcL™/(µV­ÄZ…¡y Ç3""2ˆ """""""²pÉÉÉ‚Ë «©©íÚµƒ ª÷ñ€€áææ&FŽ):$JKKÅÑ£GŃ>(ìììÄ÷߯=÷ÚµkÂÏÏOøúúŠ]»v‰ÂÂBqëÖ-±fÍáèè(’““ :W!&Nœ(ˆ²²2£ê«¯}ÇcccqüøqIç_½zUøøøOOO‘šš*Š‹‹EVV– F$&&êœ?|øpááá!>,éxc×AÎu1b„ –,Y"nܸ!nß¾-¾ûî;ѹsg@¤¥¥iÏ=þ¼ððð^^^âÛo¿%%%âÌ™3bìØ±¢]»vÂÞÞ¾Þxâææ&†*Nž<)ÊËËŵk×ÄÂ… ñÎ;ïèœ;nÜ8áææ&.]º$:$lllDFF†ìz4V–Üv)„›7oÄöíÛe_ƒ–„ý1 @½ýocËqäŽçRò%Çð†ÊÓ—»4T_)ÌqÜBˆ—_~Yÿú׿DII‰8þ¼˜íñÛ·o @ÄÆÆÖû\}q××5t\¹ý¦Òïc@@€prrƒGŽiðõå¶99e7vínܸ!„F£'N”|}…¨¿=:uJŒ7NtéÒÅè~Ó˜\DJ½L}oêcÊ{¼¶N:t_}õ•(..—/_/¾ø¢ðôôÙÙÙF•+§ýßÛæ¾ÿþ{akk+}ôQQ^^.„×&L•o„††ŠÐÐPƒžKd æuòp¾®ì|]îk*•+•ŸÖ7ÎȽærçð]óÆÚ„œk(g<7Ř+¥>R×K»w…hxžÌÏR c)ù!õàxÁõݦZß•['¹ó@%ÛªJ¬Ãš2_0v­Z©µ Cç¥ÆŒgœ7µX[ùm)"""""""²xÜ4&Ío¼!lllDNNNÇj¿4‘‘!ÆŽ+\\\„ƒƒƒ:t¨8pà@óoݺ%bbb„¯¯¯°µµmÛ¶cÆŒ©óAŽÔs>¬ýñÝÿäÚ¾}{2¦L™Roùo¾ù¦BÔ9>~üøzË óAßÍ›7Ett´ðññ¶¶¶ÂÍÍMŒ;VìÝ»·N\C† îîîâСC —s¤¾7nܳfÍÞÞÞÂÖÖVxzzŠ3fˆ¸¸8mùÚó³²²Dpp°puu¢ÿþ⫯¾#GŽÔžÿ /H~ONœ8!fÍš%zõê%…‡‡‡xôÑGÅG}$jjjtÎÍÌÌC† NNNÂÛÛ[$$$\†Ê’sýj……… ///qçÎÉuo‰Ø‘¡ŒùRCC9Ncã”ñ\Êø¬ô.7w‘Z߯˜ë¸]XX(fΜ):tè ÄàÁƒÅÑ£GE`` ¶¼Ú grê 5G3$!¤çØK—.Õû~ !=ïT3ïÓ×f=Zçøûï¿/öïß_çøßÿþwÙu6¤MòK[†‘{ݤ¶9ýµœv(µ0´WzžÖ½{wѹsç:ýâŒ3qæÌãúæÚúú¯Æú5}¤ö›J¿wÇëåå%~úé'1|øpáìì¬wmDj›“[¶Ôk!ˆ~ø¡Ñëz¯»Û“£££xì±ÇÄ?ü † &ëœ/§ß46‘R/SÜ›1õ=~o:tè ž~úiqöìY!„ṡ”kõÙgŸÕ)cåÊ•õ¾æ”)S„òÚ„Òý—–³É…šæuòq¾®Ì|Ý×4&?V2?m,·‘3¦ÈÃë»æRÛ„Ü9vc㹩Æ\©õ‘³^Òн+DÃód~–bKÉo ­Ç ®ïÞ=73Õú®Ü:ÉO*ÑV¥PrÖ”ù‚1kÕJ¯U2/5f<㼈¨ÅÚªBY°­[·"<<\iXQQz÷î &`Íš5:õíÛ7oÞÄ•+WTŠŽÈ|ùä$$$ ==]±2ýýýQVV†ììlÅÊ”Ëõ"Ëضm›Ê‘PKÃüD>Î׉š§†î݆æÉü,Åp–’ßZŽD¤kÆŽgœ7µXÛ¬ÔŽ€ˆˆˆˆˆˆˆˆÌƒ››RSSñùçŸ#!!Aípˆš…‹/"$$óçÏç—NˆˆÌs"2æDdÎÖ¬Yƒ˜˜ÙÏËË˃‡‡*++uŽÿþûï¸páFŒ¡Tˆ1´^DDdž8_'jžôÝ» Í“9‡&cp¼ jÙÌi­‚ホx‰ˆˆˆˆˆˆˆH롇Bzz:vïÞââbµÃ!2{k׮Żヒwß}WíPˆˆ¨ÌqˆHỉȜ¬[·“&MBii)Ö¬Yƒ‚‚ƒÑ¥  ³fÍÂåË—qûömüôÓO‡««+Þzë-…#o˜’õ"""óÄù:QóTß½ÛÐ<™sh2Ç ¢–Í\Ö*8ž‘1¸‰—ˆˆˆˆˆˆˆˆttíÚ_}õ\]]±lÙ2h4œªvŠ8räˆÞÏì‰HYùùù¨ªªB»víÔ…ˆˆˆÀM¼DDDDDDDÔx{{ã©§žÂüÒÒRk7ì–––¢¬¬ `eegggÜwß}ÜÄÛÄ„¸~ý:²³³‘››‹šš888ð¥»TWWãàÁƒxààáá¡v8dŠŠŠpüøqœù¤Úá…(**Brr2âããñí·ß"00‘‘‘˜>}:Zµj¥vxDDZü%#RRee%î»ï>ÄÄÄàÅ_T;ÕýüóÏX»v-6oÞŒÌÌL!** ƒ R;4"¢&qãÆ ,Z´_~ù%rssáææ†!C†àí·ßFß¾}QXXwwwç,Z´ ,@UU•Î`Ÿzê)|þùç’Ê€””Lš4Iûüß~û ±±±øæ›o`mm">>~~~€eË–áµ×^1xð`ÜÿýøÏþƒððpdee!==QQQÜÀ[ÚöYUU¥r$dIÜÜ܉ӧO#-- ¾¾¾x饗еkWÄÅÅá÷ßW;D"""Å:tÅÅÅ3fŒÚ¡˜…‡~k×®ENNâãã‘••…Áƒ£_¿~HLLÔþ1$""KtõêUôïß[·nŇ~ˆüü||ÿý÷ÈÏÏÇÀqøða´nÝBŒ7VVV8þ<,XàϹºÄæÍ›µ›Q¥” ÁÁÁB`âĉ€èèhDGG#''ÉÉÉøî»ïðÌ3Ïhã7o„prr Aƒ „€B»V°`Áíãw7n„ ¬s ¾þúk<ýôÓ1b~ýõW\¾|‘‘‘ˆ‰‰All¬A×µöš;¶Ák¶iÓ&nà%""j¦V¯^K—.áý÷ßW;¾¾¾øâ‹/ðå—_báÂ…j‡CDD¤*ÄÇÇk×~?޾}ûj×~ËËËÕ‘ˆˆ¨Åà&^"""""""2[wîÜÁ™3g°mÛ6,^¼Ó§OG¿~ýàââ 2qqqسg0mÚ4lÙ²ééé())Á… ––†øøxDFFbÔ¨Qhß¾½ÚÕj‘***ššŠÉ“'£}ûöxíµ×àëë‹´´4\ºt |ðzôè¡v˜fÍÚÚP]]­r$d‰4 F…­[·ââÅ‹ˆˆˆ@RRºuë†t( IDATI“&i½‰ˆˆÈ¤¥¥¡k×®Ú_5¤?¹ºº"22'OžDzz: ///Ìš5 §NR;D""ÅÍŸ?ÙÙÙX±bžxâ 8;;£wïÞØ²e „xå•W´çΛ7555X±b…NDNN *÷n3gÎÄÀáää„Q£Faüøñ8zô¨Î/çšÂ°aÃ0þ|¸»»ã¾ûîÃ+¯¼‚gŸ}ñññ(..6¸Ü˜˜½×ìÒ¥K:׌ˆˆˆšüü|¼û;w.ºvíªv8u 2kÖ¬Á¢E‹°qãFµÃ!""R]íÚï©S§°ÿþ:Ø9;;[퉈ˆ,7ñ‘êôýª®ƒƒC½¿ª»|ùr¤¥¥áÂ… Ú_Õݺu+.\ˆ°°0¢U«VjW‹;v QQQèÔ©‚ƒƒ‘››‹Õ«W#77III5j4Úa6 ÖÖÖü%^29ooo,Z´ÙÙÙøì³ÏpóæM 2=öRRRPSS£vˆDDDFùöÛo1nÜ8µÃ0kÚ_çý¿ÿû?ìÙ³>ø úõ뇤¤$TVVª"‘"RRR`ee… &èoß¾=z÷îcÇŽáÊ•+€‘#G⡇ÂúõëqëÖ-í¹K—.Ett4lll *÷nýû÷×ùoooo@nn®qmÀ„ °oß¾:ÇPYY‰3gÎ\ö˜1cЧOŸz¯Ù+¯¼[[[ƒË&"""õ¼ýöÛ°±±A\\œÚ¡èõüóÏ#&&8tèÚá™ÁƒcëÖ­¸téæÎ‹M›6Á××£GFjj*„j‡HDDd‘¸‰—ˆˆˆˆˆˆˆšÄ;wpñâE¤¦¦bñâŘ5k WWWí¯êÆÆÆÖû«ºÅÅÅõþª®¯¯¯ÚÕ¢z\¾|‹/F=Я_?ìÙ³/½ô.^¼ˆ 22NNNj‡Ù,ÙØØp/5[[[„……aÿþýHOOG·nÝŠ=z >>åååj‡HDD$[AA~þùgŒ=ZíPšwwwDEEáܹsHKKƒ¯¯/^xáx{{#..¿ýö›Ú!¬¢¢EEE¨©©››4οŸþpîÜ9ís^}õUܾ}~ø!àìÙ³øñÇ1sæL£Ê­åææ¦óßvvv`Ò?¦TTT„·ß~}úô»»»6Î×^{ pûöm£ÊŽŽ®s;ûî;DFF;5½ÌÌL$&&âÝwß…«««Úá4hÉ’%;v,&Nœˆ .¨‘YéСbccqáÂlÙ²0qâDôìÙ‹/F~~¾ÊYnâ%"""""""EÝû«º“'OFïÞ½áàà???<ù䓈Çŋѻwo,Z´Hû«ºõþª®ƒƒƒÚÕ¢F!)) £GF—.]°dÉ >û÷ïÇ™3g°páBtéÒEí0›=kkkTWW«µ@HJJBVVƸ¸8tíÚ .DAAÚáI–––>|¸Ê‘4/VVV5j¶nÝŠììlÌ;›7oF·nÝ0zôhlÛ¶l†ˆš{{{´nÝ666¨¬¬„¢ÞwáááðööÆêÕ«QQQåË—#""...F•+—F£iðq+++ܹs§ÎñÂÂÂ:Ç‚‚‚°hÑ"DDDàìÙ³¨©©+W®£gÊ”)ðôôÔ¹fÏ=÷ÜÝÝ*—ˆˆˆÔƒûï¿Ï?ÿ¼Ú¡4ÊÊÊ 7n„——‚‚‚êÍ…ˆˆˆZ:;;;„……!-- xüñÇñÎ;ïÀËË Ó§Olj'Ô‘ˆˆÈ"p/ÉvçÎdddà¿ÿý/Þ}÷]L:ýû÷¯ó«ºßÿ=1uêTlÛ¶ gΜAEErss‘––†µk×"**Š¿ªÛLUWWcÏž=˜>}:¼¼¼‰V­Z!99yyyX»v-¬v˜…¿ÄKjóóóC||<.\¸€éÓ§cåÊ•ðññAll,®]»¦vxDDDJKKÃ#<ÂCFèØ±#bccñÛo¿!%%ÀŸ›Úºv트¸8\¹rE剈¤ AUUÖ®]‹üãX¶lllltž 777,X°ÁÁÁðòòR¤\9~øaœ={—/_ÆáÇqñâE 2Dûø˜1c››‹Õ«W£´´.\@TTÚµk§S޵µ5† †¼¼<,]º7oÞDYYöíÛ‡5kÖß½fÏž ,X°£FB·nÝèÑ£|||››«Øë‘òª««1wî\<ùä“=z´ÚáÈÒ±cG|ñÅøñÇ1oÞ<µÃ!""2{®®®ˆŒŒÄ©S§°ÿ~øúúâå—_Öþ!ÇììlµC$""jv¸‰—ˆˆˆˆˆˆˆPPP€cÇŽ!)) qqq ‚ŸŸZ·nþýûcæÌ™HNNFee%‚ƒƒ‘€ýû÷£¸¸.\À®]»°|ùrDFFbذaðôôT»J¤°ëׯcÅŠèÓ§xàü÷¿ÿÅ‹/¾ˆ‹/"==QQQhÓ¦ÚaZø zõê…ððpÄÇÇ£W¯^ÚÇßyçÌœ9ï½÷Úµk‡3fàµ×^CûöíqëÖ-h4ÄÅÅ’““1kÖ,üë_ÿBÇŽáãヤ¤$<û쳀ѣG£_¿~X¶l4 Nž<‰œœh4,X°@ïñ»Ýwß}˜:u*„ˆ‰‰ÑB ¦¦555òÞ8"""jr}ô233±téRµC1È#<‚ÿüç?Xµj>ýôSµÃ!""j6Œ­[·";;sçÎÅæÍ›áëë‹Ñ£G#55•È‘ˆˆH"à¨IDDDDDDÔbäææ"##/^Ä™3g‘‘Ó§O#//ÀŸ›±ºuë___ÜÿýèÝ»7î¿ÿ~øûûÃÚÚZåè©©UVVb÷îÝøøã±k×.8::"<<Ï=÷F£vˆ-NÇŽ‹¨¨(µC!ª×üÕ«Wãƒ>€µµ5^{í5Ì™3j‡FDD„ýë_xóÍ7qëÖ-ØÚÚªŽÅûù矱víZlÞ¼UUU BTT ¤vhd4 ’““ëÝ`IDæé“O>ABBÒÓÓÕ…,\XX`Û¶m*GBDd9JJJУG<ýôÓX¹r¥Úá%66«V­Â?ü€GyDípˆˆ¨ mݺáááÜtj¤;wî`ÇŽHLLÄÞ½{Ñ­[7¼ð ˆˆˆ€‡‡‡ÚᙫmÜÄKDDDDDDda*++qùòeí&ÝÚ »'OžDii)ÀÝÝ]»I÷î »>>>ܘIÈÌÌÄúõë±~ýzܸqÄôéÓ1eÊ899©^‹Ö¹sgDEEéý¥"s‘ŸŸU«VaåÊ•hÕªbbb {{{µC#"¢ìÉ'Ÿ„µµ5¶oß®v(-Jqq1¶lÙ‚„„üòË/ Ddd$çdnâ%j~ €¨¨(í/ü™ 7ñ)ïõ×_ǺuëpîÜ9´iÓFípŒRSSƒ   ?~éééèØ±£Ú!Qá&^åeeeáÃ?ÄÇŒªª*„……!&&}ûöU;4"""sÃM¼DDDDDDDÍUEEΟ?ŒŒ »§OŸFEE C‡Ú_ӭݰûàƒ¢]»v*GO榸¸)))ذaöîÝ ///L™2ðóóS;<úÿ|||ðâ‹/âõ×_W;"I®]»†÷Þ{k×®EÇŽ±hÑ"<ûì³üƒDDÔ䪪ªÐ¦M¼ÿþû˜={¶Úá´XÇŽCbb"6lØ;;;„‡‡ãå—_FŸ>}Ôšnâ%2ëÖ­ÃÎ;±aÃlܸ+V¬@FFlllÔ,7ñ)ë·ß~C¯^½°téR¼òÊ+j‡£ˆ‚‚<òÈ#h×®öíÛ;;;µC""¢&ÀM¼¦SRR‚Ï>û «W¯Æ©S§´ÈqÚ´ipppP;<"""sÀM¼DDDDDDDæ®   Î¯êfddà·ß~ƒ¶¶¶ðööÖnÔ­ýß^½zÁÑÑQíðÉŒÕÔÔàСCذa6mÚ„êêjaÚ´ixâ‰'`mm­vˆtîÝ»ãùçŸÇo¼¡v(D²\ºt ÿøÇ?ðÉ'Ÿ`àÀXµj~øaµÃ""¢äÇÄСCqîÜ9tëÖMípZ¼‚‚$%%aÕªU¸xñ"1gÎ<óÌ3°µµU;ù„ó@jÜÄKD¤¬ÐÐPœ>}§N²¨ùZff& €©S§"!!Aípˆˆ¨ poÓ8vìâãã±e˸»»ãùçŸÇßþö7tíÚUíЈˆˆÔÄM¼DDDDDDDæ"77·Î¯êž:u ×®]¸¹¹¡[·nðõõÕÙ°ëïïÏÍ–$Ë•+W°iÓ&$&&j¿0?mÚ4L:mÚ´Q;‘‘‘†­­­Úá‘L}ûöÅ„ ðÎ;ï¨ ‘Ñnß¾%K–`ñâÅèÒ¥ âãã¹¹ŠˆˆL¢  mÛ¶Err2žzê)µÃ¡FTWWk¿Ôµwï^tìØS§NÅË/¿ŒN:©™ þ/éÃ_â%"RƧŸ~Š^xÇGŸ>}ÔÇdjjj0qâD¤§§#==^^^j‡DDD&Â_âU_VV>ùä$&&¢¬¬ aaaˆ‰‰Aß¾}ÕˆˆÈÔ¶q/‘JJJð믿âôéÓ:›v³³³!„€ƒƒüýýáïï¯Ý°ëïï=zðÉdòóóñùçŸãÃ?ÄÉ“'Ñ«W/<÷Üs˜1c<==ՌЯ_?Œ5 |ðÚ¡)æÜ¹s˜;w.vî܉°°0,_¾ÞÞÞj‡EDDdÛ¶mxæ™gpýúuxxx¨ÉpîÜ9üç?ÿÁºuëPRR‚‰'"22#GŽ„F£Q;ÜÄKDd¼²²2ôìÙO<ñÖ¬Y£v8&WTT„ÀÃÃûö탽½½Ú!‘ p¯ù(..Ɔ ðá‡"##=ö^zé%<õÔS‡‰ˆÈRm³R;""""""¢æ ¸¸Xû‹¦qqq ‚ŸŸZ·nàÅ_Ä®]»àììŒçž{ÉÉÉ8}ú4JJJðóÏ?cóæÍX°`BCCñÀp/)®ºº{öìÁäɓѾ}{¼þúë0`öïߌŒ ÄÆÆr¯°¶¶FUU•Úa)ª{÷îøê«¯°sçNœ8q½{÷ÆêÕ«QSS£vhDDd!ÒÒÒпnàm†ºwïŽ>ø999ظq# 0zôhøûûcñâÅÈÏÏW;D""""""‹óÁ °° .T;”&áææ†””œ9s¯¾úªÚáY¬"›KŠ© HJr¬L0sÁ¥$Œ$Űàh© Všæ£f==Ú¦¨ô)Á±\0mµ—PÖDÜRÁ]dqa½}úTþûÄO@[[[v|j…þúë/¬_¿ß|ó ®^½ŠgŸ}“&M„ `dd$;52ggg<ýôÓX¾|¹ì(DM¢¤¤_~ù%.\¥R‰ððpØÛÛËŽEDD-œµµ5|}}ñá‡ÊŽB )) aaaظq#JKKáææ†   8;;ËŽFB¡ÀÀѵkWÙQˆˆ¨™9|ø0È‘x‰ˆê);;¶¶¶X¸p!æÌ™#;Î#µeËxyy!22'N”‡ˆˆGâmÞrrr µZ7nÀÃÃÓ§O‡‹‹‹ìhDDDa ‹x‰ˆˆˆˆˆ¨Uºyó&N:ußb]}}}ôìÙ³Z±®´´´dǧV®°°›7o†Z­ÆŸþ kkk¼þúë•O&%Í5dÈôë׫V­’…¨I¥¤¤ ÉÉɘ?>æÍ›]]]Ù±ˆˆ¨:qâlmm±ÿ~Þì£aòó󅤤¤@©TB¥RñF­„§§§ìDDÔŒ=û쳘={¶ìDD-’¯¯/8€ŒŒ ´iÓFvœG.00_ý5þüóOØÙÙÉŽCDDˆE¼-Cqq1vìØµZ¸¸8ôïßS§NÅĉahh(;Q}±ˆ—ˆˆˆˆˆˆ4ÛÊuÛµkX[[³X—š½ÄÄD„‡‡cÓ¦M(..†‡‡üýýñüóÏC¡PÈŽGÀ°aÃ`kk‹¯¾úJv¢&WVV†•+WbÁ‚°³³CDDúôé#;µ0«W¯Æüùóqýúu>Bƒ%&&B­V#22zzzðööÆôéÓÑ·o_ÙшˆˆˆˆˆZŒ¤¤$<õÔSؼy3^}õUÙq¤())ÁóÏ?üü|üñÇ,""Ò ,âmyþù¹ï믿ŽY³f¡G²£Õ‹x‰ˆˆˆˆˆH3äææâôéÓÕŠuOŸ> 011A¯^½ªêÚÛÛ£G,Ö¥f­  ›6m‚Z­Fbb"lmm1yòd¼ñÆèСƒìxôˆ9Ý»wGxx¸ì(DÌéÓ§áçç‡#GŽ`ñâÅx÷Ýw¡­­-;µîîîP(ؾ}»ì(ôäææ"""+W®ÄéÓ§¡T*q=ÄsÏ=‡ÒÒR8p U?<öüùóprr¨Q£°aÃÙqˆˆ¨‘°ˆ·åºrå ¾þúk¬Y³.\À°aȱcǶê÷,DDÔ¢°ˆ—ˆˆˆˆˆˆZ–ÜÜÜ uV¬keeÅn©E©x¢èÆQRR‚—^z *• Çg[nÅ^xá<öØcøïÿ+; Ñ#UZZŠO?ý~ø!žyæDFF¢{÷î²cQ3WZZ |òÉ'˜6mšì8ô•——cïÞ½P«Õضm,,,àç燩S§r”"""""¢DGGcüøñøã?ðÔSOÉŽ#ÝîÝ»áææ†µk×bòäɲãQ#`oËWVV†Ý»wcåÊ•ˆ‹‹CïÞ½ñöÛoÃßßFFF²ã=‹x‰ˆˆˆˆˆ¨yª©X7==/^˜šš¢gÏž,Ö%’ŸŸ¨¨(„††âèÑ£xâ‰'àççXXXÈŽGÍÀK/½SSSDDDÈŽB$Err2&Nœˆ . <<¯¾úªìHDDÔŒíß¿Ï=÷Nœ8ÙqH’œœDFF"$$ÙÙÙ6lT*^~ùeèèèÈŽGDDDDD$]qq1úôéggg¬_¿^vœfcÞ¼yX±b<ˆþýûËŽCDD Ä"^ÍrôèQ„††bÆ ÐÑÑÁøñã1sæLØÙÙÉŽFDDTñ‘\5릥¥áÒ¥KX¬K­CŨ»ß~û-ÊÊÊàææ•J…#FÈŽFÍÌË/¿ lܸQv"iîÞ½‹¹sçbÕªU˜8q"¾úê+>Y™ˆˆj´páBDDDàìÙ³²£P3pï( {öìA—.]0qâDLŸ>]»v•ˆˆˆˆˆHš¥K—bÉ’%8~ü8ºuë&;N³QVV†Q£FáܹsHHH@»vídG""¢`¯fÊËËÃ7ß|ƒ+Vàܹs6l1vìXÞWFDDÍ ‹x‰ˆˆˆˆˆèѸ|ù2ÒÒÒ––VY¬›‘‘ÜÜ\@‡`oo;;;888ÀÎÎöööèØ±£ääDM#//›7oÆš5kœœŒ>}ú`Ò¤I€¹¹¹ìxÔLyzzBKK ›7o–…Hº­[·" =ö¢££aoo/;53„££#ÂÂÂdG¡f&++ ëÖ­ÃÚµkQPPwww¨T* >œ7vQ«råÊôîݳfÍ¢E‹dÇiv._¾ŒþýûcðàÁün†ˆ¨…c¯f+//Ç®]»*âØ³gOøûûC¥RÁÌÌLv<"""ñQãÊËËCzz:ÒÒÒššŠŒŒ ¤¤¤àÚµkþW¬Û·oßÊ"ÝŠ¢ÝöíÛKNNôhTŒº»aÔ——sÔ]ªãûï¿—…¨Y8þ<|||œœŒððpŒ?^v$""j&nÞ¼‰öíÛ#** ¯¾úªì8ÔL!&&jµqqq°µµÅäÉ“ùp%"""""j5T*vïÞÌÌLÉŽÓ,íÛ·®®®Æ´iÓdÇ!"¢zboë‘™™‰5kÖ`ݺuÐÒÒ‚ùPh""’‰E¼DDDDDDT?%%%8qâ222*GÖMOOÇ_ý!ÚµkôéÓööö•ÿZ[[ËŽNôÈݼyÑÑÑX½z5RSS¡T*¡R©àããcccÙñ¨™8q" °cÇÙQˆšÒÒR,X°Ë–-ƒJ¥ÂªU« §§';IöÝwßaüøñ¸rå ‹1©V’’’†7¢´´nnn ‚³³³ìhDDDDDDM"##ŽŽŽøïÿ ___Ùqšµ>úÿþ÷¿qèÐ!ôïß_v""ªñ¶>ùùùˆŠŠÂòåËqüøq8;;#((ÐÖÖ–ˆˆZñу•––âܹsU u‘™™‰²²2èêêÂÆÆ¦J¡nŸ>}`gg---Ùñ‰¤ªu722ººº?~<¦L™'''ÙѨ…òóóõk×ðÃ?ÈŽBÔìDEE! ŽŽŽØ²e :wî,;I4eÊ$''ãðáò£P SqcWHHRRR*Â4aÂŽJEDDDDDeÔ¨Q¸zõ*ø½îC”——ÃÕÕçÎÃÑ£GѶm[Ù‘ˆˆ¨ŽXÄÛz•——cïÞ½Æø^6 IDAT®]»`ee•JXXXÈŽGDD­‹x‰ˆˆˆˆˆèÿäääTY÷èÑ£¸}û6´µµÑ½{÷j#ë:88@___vt¢f#77[¶lÁÊ•+‘žž^yÃ÷k¯½Æ/ô©Áüýýqþüyüüóϲ£5KéééðððÀíÛ·±}ûv(•JÙ‘ˆˆHkkkLœ8K–,‘…Z°{̤§§ooo̘1²£5ÈÎ;ñÒK/á÷ßÇàÁƒeÇi²³³áèèOOO|õÕW²ãQ±ˆ— ++ ëÖ­ƒZ­Æ;wàéé‰wß}ýúõ“ˆˆ4‹x‰ˆˆˆˆˆZ£ÜÜÜj#릤¤   Ð¹sçj#ë:99ÁÐÐPrr¢æI½{÷",, ;v쀡¡!|}}€¾}ûÊŽGdêÔ©ÈÊÊž={dG!j¶òóó1aÂÄÅÅ!<<'N”‰ˆˆ±¬¬,ôîÝ›7"S£ÉÍÍEDDV®\‰Ó§OC©T"00>>>ÐÕÕ•ˆˆˆˆˆ¨NJKKáèè{{{DGGËŽÓ¢lÛ¶ ˆŽŽ†§§§ì8DDT,â¥{`Ó¦M•èwvvFPP^~ùeèèèÈŽGDDš‡E¼DDDDDDš,??YYYU vpéÒ%€™™Yµ‘uŸ|òI´oß^rr¢–áæÍ›øæ›oŠÌÌL8;;C¥RÁÓӲ㑚1cRRRðÛo¿ÉŽBÔ¬•––böìÙX½z5.\ˆE‹A¡PÈŽEDDHHHæÍ›‡ëׯ³À’Uyy9öîÝ µZmÛ¶ÁÂÂ~~~˜:u*zôè!;Q­cΜ9HOOG¯^½dÇiqÞ|óMÄÄÄ 99]ºt‘‡ˆˆj‰E¼T!öìÙµZ­[·¢S§NÀôéÓyÿ5&ñi‚’’œ8q¢ÊȺ8sæ „h×®lllªìZ[[ËŽNÔ"%%%!,, ß~û-´´´àãヷß~ŽŽŽ²£‘†›5kþøãþøcLŸ>]vjÊÊʰ{÷n¬\¹{öìA—.]0qâDLŸ>]»v•ˆˆˆˆˆ¨Š   DEEáĉü¬´1hÐ |òÉ'xçwdÇ!"¢Z`/ÕÖÝ»wÏ?ÿ©©©P*• „tuueÇ#"¢–‰E¼DDDDDDÍUNNNe¡nÅ¿III¸sç´µµÑ½{÷j#ë:88@___vt"Rñ¤ÍuëÖ!??îîîP©T>|8 …ìxÔÊ|ðÁؽ{7Ž=*; Q‹’ššŠ^x¦¦¦øñÇYPCD¤Áâãã1xð`dff¢wïÞ²ãP+“••…uëÖaíÚµ(((àßDDDDDÔ¬dff¢oß¾X½z5T*•ì8-Þ'Ÿ|‚%K–àСCèß¿¿ì8DDô,â¥úˆÇÊ•+±mÛ6´o߯¿þ:f̘KKKÙшˆ¨ea/‘l¹¹¹ÕFÖMIIAAA sçÎÕFÖurr‚¡¡¡ääD𫼼{÷î…Z­ÆÖ­[Ñ©S'øúúr$%’nÑ¢Eøþûï‘––&; Q‹sæÌŒ3EEEˆE¯^½dG""¢&°hÑ"¬_¿gÏž•…Z±¢¢"ÄÄÄ@­V#..¶¶¶˜|8~þùgŒ9RvqáÂ8::ÂÛÛkÖ¬‘‡ˆˆ€E¼ÔŠŠŠ°yóf,_¾ÇŽƒR©„J¥‚¯¯/ dÇ#"¢æ‹E¼DDDDDDM³gÏ"%%¥ÊÏÉ“'Q^^###888 _¿~•ź}ûöE‡dG'jµ±jÕ*DEEÁÈÈo¼ñ¦NŠž={ÊŽFTÅÒ¥KŽS§NÉŽBÔbݺu îîîHJJÂ?þˆgžyFv$""j$7oÞDûöí±iÓ&xzzÊŽCTE~~>¢¢¢‚”””Ê›»&L˜###ÙñˆˆˆˆˆHƒ•••ÁÉÉ ÝºuÃÎ;eÇÑ8ßÿ=<==±mÛ6¸»»ËŽCDD÷Á"^jl‰‰‰FTTÌÌÌ0yòd¼ýöÛèÖ­›ìhDDÔü°ˆ—ˆˆˆˆˆ¨! pâÄ ¤§§#118vì®]»èܹ3”J%ìííѧO(•J<ñÄÑ“¨())ÁöíÛ¡V«[[[¼õÖ[ð÷÷ç ÔÔl}ñÅƹsçdG!jÑnß¾W^y‡Â?üÙ‘ˆˆ¨|ÿý÷ðööÆ•+W`nn.;Ñ}%&&B­V#22zzzðööÆŒ3ààà ;i µZiÓ¦áØ±c°··—G#Mž<»víBZZ:vì(;Õ€E¼ÔT.\¸€ÐÐP„‡‡#77 Ä AƒdG#"¢æƒE¼DDDDDDµ•““SY¨[Q´{üøq”——£]»v°±±©,Ôµ··Gÿþýaaa!;6ýÃåË—ñÍ7ß $$ÙÙÙxá…„áÇC¡PÈŽGô@+W®Äþó\¼xQv¢¯¸¸>>>øå—_ðóÏ?óKT"" 0uêT;v ‡–…¨Vrss•+WâôéÓP*• „tuueÇ#""""" PPP€Þ½{ÃËË ÁÁÁ²ãh¬[·n¡_¿~P*•ˆŽŽ–‡ˆˆjÀ"^jjEEEؼy3V­Z…„„ 0AAAðòò‚žžžìxDD$‹x‰ˆˆˆˆˆþ)//©©©UŠu;†[·nø¿Ñuïa×ÎÎZZZ’“уTŒt6mÚ`Ò¤I˜={6ºwï.;Q­­Y³ .¬ñˆ¦¬¬ ¯½ö~úé'üòË/xæ™gdG""¢èÙ³'^{í5|ôÑG²£ÕIyy9öîÝ µZmÛ¶ÁÂÂ~~~˜:u*zôè!;µ`ï¿ÿ>Ôj5²²²øê&¶gϸººbË–-xå•WdÇ!"¢`/=J‰‰‰FTTÌÍÍáçç‡3fÀÒÒRv4""’ƒE¼DDDDDÔz•––âܹs•…ºE»ýõ„011ƒƒCe¡®R©Dÿþýadd$;:ÕRqq1vìØàà`8pýû÷ÇÔ©S1qâDÊŽGTgáááxï½÷póæMÙQˆ4Fqq1^}õUüþûïˆÅSO=%;ÕCVVz÷îß~û Ï=÷œì8Dõ–““ƒÈÈH„„„ ;;Æ ƒJ¥‚‡‡´µµeÇ#""""¢äÌ™3èÓ§–.]Š   ÙqZ…7ß|;wîDzz::tè ;݃E¼$ÃÅ‹†äççÃÝÝï¼ó.MDÔú°ˆ—ˆˆˆˆˆZ‡ÜÜÜjźGÅíÛ·¡££ƒnݺUêVŒ°kee…B!;:ÕÃ¥K—°fÍ„……!77˜>}:\\\dG#jo¾ùÓ¦M«žˆGQQÜÝÝ‘€_ý²#Q­Y³ï¿ÿ>®_¿]]]Ùqˆ¬¬¬ »wïÆÊ•+±gÏtéÒþþþxûí·Ñ±cGÙñˆˆˆˆˆ¨ðòòBRR222 §§';N«——<ÿü󈌌”‡ˆˆîÁ"^’©¨¨›7oÆçŸŽÔÔT(•Jâµ×^ƒŽŽŽìxDDÔôXÄKDDDDD𥤤'Nœ¨,Ô­(Ú=}ú4ÀÌ̬²X÷Þv $''¢ÆœœŒ+V`Ó¦Mh×®¦L™‚©S§ÂÒÒRv4¢F±aüñÆ(..–…HãܹscÆŒÁéÓ§qøðatéÒEv$""ªƒ—_~åå娱c‡ì(D.++ ëÖ­ÃÚµkQPPwww¨T* >œ #""""¢:tÎÎÎØ¾};^zé%ÙqZ•]»vaìØ±Ø¶mÆ';ý,â¥æ">>+W®ÄÖ­[Ñ­[7L™2077—ˆˆšÎ-Ù ˆˆˆˆˆˆê+77ñññƤI“0`À´kט0a¶lÙøúú"&&999¸qãFåï¨T*¸¸¸´úÞÍ›7ãÉ'Ÿ„  ÒÒÒšd]Ÿþyå:ºvíÚ$먫昉êF¸¸8¸¹¹¡ÿþ8pà–-[†³gÏâ£>bïC´ökÀýDEEUfmÓ¦M£-·¡û@WW¥¥¥–G“±mS…ÚìØ±¦¦¦5jòòòaJÍÇs²nî×i¶5…ÒÒRìÛ·®®®²£5 ,]ºÙÙÙØ°arssáêê ;;;,[¶ 7nÜ‘ˆˆˆˆˆš!fΜ‰çŸž¼¼øâ‹˜8q"Þ~ûmäææÊŽCDDDÍŒ‹‹ ¢££‘™™ ///,]ºÝ»wÇ”)S‘‘!;5ñQ³W\\ŒôôtDDDàý÷߇››{ì1˜››cðàÁX¶l.^¼ggg„……!!!HOOGtt4/^ 777tîÜYö¦4ŠÂÂBØØØ`ìØ± ^Öàãパ#GâêÕ«8yòd“¼ûî»BÀÑѱÉÖQWÊÔ˜ûº&M½|MWTT„ˆˆ888ÀÕÕ¹¹¹Ø±c233CCCÙ›¯Æøñã!„Àðáë½ÖcÐÐ} «« !ÊÊÊêõûÍÛ65•ºÄÄÄàÚµk?~|«.šç9Ùøê²Oï×5×m#’íðáÃÈËËc/i<}}}xzz"66‰‰‰2d>þøcXZZÂËË ”‘ˆˆˆˆˆš 6 !!Ÿ}ö™ì(­ÖªU« ¥¥…wß}Wv"""j¦zö쉥K—âܹsøâ‹/ðûï¿WÞµsçNŽMD¤atd """""ºWNN222žžŽÄÄD$&&"33eeeÐÓÓC¯^½ T*1kÖ,ôéÓÏ<ó :vì(;ö#%„@yy9ÊË˼¬-[¶@   ´mÛmÛ¶Åùóç!¥fhÌ}]×å·mÛO>ù$âãã›dÝ-Ù¥K—ŠÕ«W£°°^^^ؼy3dG{$x ¯©¯ ¢«« ())¶¶ö#_SbÛny4µ¯êÑ£vî܉çŸo½õÂÃÃeG’‚çdã“ÙiºØØXtïÞ¶¶¶²£=2NNN ÃgŸ}†¨¨(„„„ÀÙÙJ¥*• &L€‘‘‘ì˜DDDDDôˆÝ¹s ,Ào¼¥R);N«ejjН¾ú îîîðôôÄèÑ£eG"""¢fÊØØ*• þþþØ»w/‚ƒƒáîîŽ^½zaÚ´ið÷÷çg½DD€E¼DDDDD$Eaa!RSS‘’’‚ääd¤¦¦"55yyyP(èÑ£úõë‡W^yýúõC¿~ýЫW/hiiÉŽ.±±1N:Õ(˪(ž°°°h”åišÆÜ×2–¯iŽ=ŠåË—#** fffð÷÷G`` ºté";Ú#Åk€|2Ï]ÿ}œWRR‚6mÚHÉÐTض©90`¢¢¢àîžz *•Jv¤GŽçdãã{?¢¦‹‘#GÊŽA$E»ví R© R©˜˜µZ™3gbΜ9ðööÆŒ3ZÍC¯ˆˆˆˆˆøôÓOqãÆ ,Y²Dv”VÏÍÍ ^^^ð÷÷GZZLMMeG"""¢fLKK #FŒÀˆ#™™‰5kÖ`þüùX¸p!üüü0{öltïÞ]vL""ª'ÞýNDDDDDM.''qqqƤI“`oo 4ï½÷þüóOXYYáÃ?Dll,®\¹‚Ó§OcûöíX²d ^}õUôîÝ›¼M ¬¬Lv¢*//ÇÎ;áêê '''¤¤¤`õêÕ8{ö,–.]Úê x¯-OÅH¼¥¥¥’“4olÛÔÆŽ‹ùóç#((III²ã´h<'‰¨)ݼyGŽ«««ì(DÒ)•J„……áìÙ³˜7oâââзo_ 0())‘‘ˆˆˆˆˆšPNN>ûì3ÌŸ?;w–‡¬^½%%%˜7ožì(DDDÔ‚ØÚÚ"88ÙÙÙX²d ¶mÛkkk¸¹¹!..Nv<""ªÞODDDDD¦´´iiiذaÞ{ï=¸ºº¢C‡°´´„««+V¬Xüü|xzzâ»ï¾Ã©S§——‡„„DDD ((#FŒ@ûöí-Ó矅B…B®]»âÈ‘#>|8Œahhˆ¡C‡âÀÕ~ïêÕ« D= §§‡:ÀÃÃÇŽ«×¼Û·o¯Ì¡P(™™ ///XXXTN»víÚC·çŸË¹{÷nÓÏž= ooo˜ššÂÂÂcÇŽ­2êWÅü;vì@¡P`àÀ•ó\¿~³gÏFÏž=¡§§333Œ3ûöí«ýxˆãÇãÅ_„‰‰IÇcܸqU¶ËÅÅ¥òµ={ö@¡P`çΕÓfΜYeþ†¹Õv_ÿý÷ßðöö†±±1,,,àëë‹ÜÜ\œ={nnn066Fç΀‚‚‚‡.¿¢ÍÞºu ¨|½bôÍÖ¢°°jµööö7n &&G…J¥‚A­–Ãk¯uÉ2nÜ8˜˜˜ÀÈȃF|||µùîw  ¨¨ .ÄO<CCC˜››ÃÍÍ 111-`Û°aC•å* \ºt©Ú|E¼ÁÁÁlÛlÛT×}W¡6Çýa}Ucm_mŽUCÚ`mλ?ü...ðööF^^Þ}÷7ûž“ó þ£"cmú¡‡©K›"Ò{öìAyy9†ZïþïQ\‹ˆ¥Ž;bîܹÈÊÊBll,¬­­ñæ›oâñÇÇû￳gÏ>òL7oÞ¬öÞëã?ð¿ÏïþꫯVþ^mû¶†ü=FDDDD¤)æÏŸsssøùùñýw3Ѿ}{¬\¹aaaüœˆH²[·nûGjQLMM„3gÎ`ûöíÈÍÍ­A­VãÎ;Mžß½5ADDDDDTùùù"!!A¬_¿^ gggahh(ѧOáëë+–.]*bbbÄ•+W¤æuttFFFâÙgŸ………âÈ‘#¢_¿~BOOOüú믕óæääˆîÝ»‹N:‰]»v‰‚‚‘––&† "Ú´i#LMû¢>ýPMï]ëÚNˆ4Å”)SÄÓO?]eZ]®Su½µTÙÙÙbéÒ¥âñÇZZZbĈ"::Z”––>Ò£FZZZâäÉ“Õ^{öÙg«ôÅuéÛêò÷‘&JJJZZZ"**ªrß7ãÆ666Õ>#%"¢GgóæÍûGjñ:$Æ/tuuÅc=&–,YòHîÍäw/DD Í"^"""""z¨ììl+V¬X!|}}EŸ>}„––– LLL„³³³ aaabÿþýÍò‹'GGG@=z´Êô””@8::VN{ýõ×k¼ÿâÅ‹B___(•ÊzÍ+Äÿ}˜µ{÷îmÏà *vîÜYeú«¯¾*T+Ú¸ßr*Š6mÚTeúÝ»wE—.]„¸téRåô!C†33³j…÷›^q<þYhQÓñ¸~ýºÐÓÓ£G®œvûömaff&zõê% D~~~åk/¿ü²X¿~½¨«úñîÚµ«Êt{{{@üöÛoU¦[YY [[ÛZ/¿µñ&$$___¡££#{ì1±hÑ"qíÚµF[>¯¼<ˆ§§§ ¾ûî»*Ó³³³…¾¾~­‹x­¬¬Ä AƒªÍÛ»wïñæææŠQ£F‰   ‡Þ@ÿÇâìÙ³•ËaÛfÛ~ºì»º÷õU ݾº«Ú´ÁúžwB±gÏ¡­­-ÂÂÂ8ÏIž“SÓ¾¨O?TÓ{׺¶"Mamm-,XPeZ]®Su½µt¥¥¥"&&FŒ1B( aii)-Z$._¾üHÖÿóÏ? âí·ß®2=>>^XZZŠâââÊiuéÛêò÷‘&zî¹çÄÀEyyyå4¾ÿn>Ο?/Ú¶m+/^,; Q«UQÄËþ‘4Å… ļyó„………hÓ¦iiiM¶>~÷BDÔ ,â%""""¢ÿSRR"ÒÒÒDtt´X´h‘;v¬èر£ ˆÎ;‹±cÇŠE‹‰èèh‘––VåKÀæ¬bT´štéÒE999B!LLL„–––ÈËË«6¯“““ Ο?_çy…ø¿³Zœø°‚Š~È5kÖ,@$''×j9&&&@•B… ¾¾¾@½Š*8::Š6mÚÔØ~þy<„øß“‰µµµÅÅ‹…BlÚ´IŒ=Z,_¾\ß|óâÅfff¢   ^™êSÄûÏ›\]]]qëÖ­*Ó]\\„±±q­—ߊxËÊÊDLLŒpvvDÿþýÅúõë«|!ÒXx à5àAŒ€¯oß¾µ.â}ë­· :ôÀÂÀŠkÎñãÇEï޽Ř1cj•5))IYYY•ËaÛfÛ~ºì»º÷‡õU Ù¾º«Ú´ÁúžwæÌ™#Úµk'Î;÷Àuðœä9ù 5í‹úôC5½w­k;!ÒYYY¨þ¥ºöMy-"jÎNœ8!æÎ+,,,„žžžðôô±±±Mþy_ß¾}…¡¡a•÷*îîîbéÒ¥Uæ«KßV—¿Çˆˆˆˆˆ4Íwß}' …ˆ¯öß7Ÿþ¹Ð××Ç—…ˆ¨Uª(â‚ý#i–»wïŠõë×W<áìì,bbbýs^~÷BDÔ ÑZ """"¢VéæÍ›øõ×_ŒÉ“'ÃÉÉ FFFppp€¯¯/~øátêÔ ,Àï¿ÿŽ›7o"'';wîÄâÅ‹áéé {{{( Ù›Rk¦¦¦5NïØ±#àÊ•+(**B^^ÊËËabb…BQå')) ••U§yÿÉÈȨ‰¶òLLLªü_OOP^^þÐß­Ø®6mÚÀØØ¸Úë:u\ºt©A-,,jl?÷ “&MBYY6n܈ŒŒÄ¤I“àããmmm|ûí·€M›6aìØ±hÛ¶mƒ²ÕE»víªü_KK ÚÚÚ044¬2][[»Vû¿5¸uëÔj5žxâ Œ7fffˆERR&Mš]]Ý&Y/¯¼Ô¤¨¨hÓ¦M¿W‘§6BBBÓ§Ocøðáh×®FmÛ¶Õ8nn.Ƈ®]»âÇĆ Ý*ÿ IDATº@IIIå4¶m¶íÚxؾkÈq¿Ÿún_CŽÕÃÚ`}λ K–,A×®]ñÆo@qßùxNòœ¬‹Æê‡šâ&j ~ùåá™gž©ñõÚöM}-"j®lll°téRdggcÆ ÈÍÍ…««+ììì°lÙ2ܸq£IÖ;sæLܾ}kÖ¬œ8q{÷î…J¥ªœ§®}[]ÿ#""""ÒÅÅŘ7o^{í58;;W{ï¿›   ØÙÙaÆŒ²£µzìI“èëëcÒ¤IHMMEll,ÌÌÌàîî[[[ãöíÛº>~÷BDT?,â%""""jrssàà`Lš4 ööö°°°ÀСC±xñbdeeaðàÁXµjöïß¼¼<$$$`íÚµ˜1c\í×–èúõë5\Tܸ߱cGèëëÃÔÔ:::())¢ÆŸ¡C‡ÖiÞ–D__&&&¸{÷. ª½~ùòeÀc=Ö õäååÕ8ýÞãQáÅ_„¹¹9"##qõêU>|ãÆC§N0räHìÝ»/^Äúõë1iÒ¤åj.ZR|m]¾| ,@·nÝ0kÖ,Œ5 YYYعs'FŒÑäëç5 vZÛ5@__ÆÆÆ¸{÷. «½^—›Ö |}}‡›7obûöíBÀÃÃ_~ùeµùutt‡;v oß¾À‘#G¸ŽŠ"÷ÒÒÒÊilÛµÓÚÚv]Õç¸?¬¯ªïö5屪Ïywo®uëÖaß¾}X¿~ý}çã9Y;<'ÿ§±ú!Mm'D‹aÆA__¿^¿ÿ¨®ED;¾><==‹ÄÄD 2ü1,--áåå…ƒ6êú&L˜€N:aõêÕ(**Â_|×_fffU2Õ¥o«ëßcDDDDDš"88.\À¿ÿýï_çûïæCGGaaaسg¢¢¢dÇ!"jÕØ?’&R(1bvî܉ãÇc̘1˜7ozôè÷ß.\x$9øÝ QÍXÄKDDDD¤A„8yò$¶lÙ‚ùóçc̘1xì±Ç`nnŽÁƒcÅŠ(,,Äøñã±cÇœ?¾J¯J¥‚‹‹K½o~mîîÞ½[­H#55999pttDçÎ(--Ū-cÙ²eèÖ­[eñT]æmI^~ùeÀ®]»ªL/**ž={```€Q£F5h………HNN®2­¦ãüï‰}ÞÞÞ8vì>øà¸»»ÃÀÀàë닲²2,Z´/^İaÔ«¹044Dqqqåÿmmm¡V«%&ª¿Ó§O#((VVVP«Õ˜1cþþûo¬Zµ ÖÖÖ,¯µ×Ú®cÆŒüôÓOU¦_»v ™™™µ^Ž©©)Ž?àŶ®®®Ø¾}; Eµ} ÆÆÆ°´´DÛ¶mƒ¶mÛbܸq¸xñâ}×QQÄ{ïH¼lÛµ×ÚÚv]Õõ¸?¬¯jÈö5Õ±ªÏyw¯búôé˜9s&²³³kœ‡çdíñœüŸÆê‡4µÝOii)öíÛWW×-çQ\‹ˆZ'''„……!;;ÁÁÁÈÌÌ„³³3 µZ[·n5xúúúxûí·qåÊ|ñÅøöÛoTm¾ºômuý{ŒˆˆˆˆH\½zÿþ÷¿ñî»ï¢{÷î5ÎÃ÷ßÍËÓO? Ìž=û¾ $"¢¦Çþ‘4]ïÞ½Œ³gÏâwÞAdd$zöì ///üñÇM¾~~÷BDTADDDDD-RII‰HKKëׯsçÎcÇŽ€ÐÖÖÖÖÖbìØ±bÑ¢E"&&F\¾|Yvd©…‰‰‰>|¸8xð (,,GŽýúõzzzâ×_­œ÷òåË¢gÏžÂÚÚZìÞ½[ܼyS\¿~]„†† CCC±yóæzÍ+„îîsçNƒ¶ç~˹ßô¹sç âèÑ£µšÿâÅ‹ÂÊÊJtêÔIìܹSäçç‹ÌÌLááá! …P«ÕUæ:t¨077‡ªÕtGGGadd$\\\ÄáÇx<*àêê*; Q«¤¥¥…#F ::ÿý7fÍš…7¢gÏžpuuÅ–-[PVVöÐ儆†böìÙ 1‘fÙ½{7~þùg|þùçµ*àøþ»¹ÑÒÒBpp0öìÙƒ˜˜ÙqˆˆZ-öÔšÙØØ 88999X²d ¶nÝ kkk¸¹¹áСC²ãiñ="gΜÁ÷ßùóçcôèÑèØ±#,--áêꊕ+WâöíÛxíµ×ðÃ? ''7nÜ@|||•ßÚ~GDÔÔ.]º„Å‹£[·nø×¿þœ|×®]ƒ¶¶6lmm¡T*¡T*aoo¥R 333Ù‘‰ˆê,>>Ë–-î]»Ð«W/L›6 S¦LA›6mdG#jUÊÊÊ ££ƒï¾û¯¼òŠì8D`Á‚ Å™3g`ll,;Q«Ð«W/Œ?ü±ì(DôEEEˆ‰‰Z­F\\lmm1yòdÀÜÜ\v<""""¢çæÍ›°±±ŸŸ>ûì3Ùq¨‘|ôÑGøì³ÏpòäItìØQv"" ooo°|†¨ö²²²Œo¾ùÚÚÚ@PPP³舨™ÛÂ"^""""¢Z*++ÃñãÇ‘‘‘ôôt$&&âàÁƒ¸qãtttлwïÊ‚]¥R '''ÊŽMDToåå娵k>ùä>|ÎÎΘ;w.ÆŽ …B!;Q«¥££ƒÈÈHøøøÈŽBDøßsVVV˜3gæÍ›';‘Æ;sæ ¬­­ñ믿bÈ!²ãQ-%%%!,, 7nDii)ÜÜÜ0sæL 4Hv4""""¢cöìÙØ°aNœ8SSSÙq¨‘ܹs¶¶¶pssCHHˆì8DD‹E¼Dõ—›› µZU«VáÊ•+ðôôÄ;ï¼'''ÙшˆZŠ-Z²5G¥¥¥HOOGDD‚‚‚àââ888`„ زe ÌḬ̀páBìß¿ùùùÕæg/µTwïÞEhh(lll0nÜ8tíÚüñâããáææÆ^"ÉôôôP\\,;ý¦¦¦˜6m¾øâ ÈŽCD¤ñ~úé'aàÀ²£Q899!,, ÙÙÙFff&œ1`À¨ÕjܺuKvD""""¢fíÔ©SX³f >üðCðj,Z´jµýõ—ì8DDDDÕ˜™™aîܹ8sæ ¾ýö[œíÛ·—ˆ¨9a/i®ÒÒRdddTì&&&"99EEE066Fÿþý+‹uœœ`kk mmmÙ±‰ˆ™¿ÿþ_~ù%Ö®] CCCL›6 077—ˆàñÇÇÌ™3ñÎ;ïÈŽBD÷¸rå ºwïŽU«VÁßß_v""tðàA8;;㯿þÂOûì39r-[¶Ä¤I“0uêT4oÞ\v<"""""ÊÍÍEûöí1|øp¬Y³Fvª%#FŒ@RRùãôDDZÄA¼DµK¥RáÀG||<^zé%a̘1011‘ˆ¨¶q/é¿§ìž8q·nÝ‚‰‰ Ú·o_jÀ®‡‡4h ;2‘^‰‹‹Cxx8öïß777Ìš5 cÇŽå“kˆ TçÎ1`À,]ºTv"*Ç믿KKKDGGËŽBDT§Ü¿666ؾ};|}}eÇ!" ’““±eËlÞ¼9992dàíí …B!;‘ÖÍ;ÿþ÷¿‘œœ Ùq¨–\¼x:uÂÎ;y„ˆH‹8ˆ—Hž3gÎ ""»víBëÖ­ˆ)S¦ÀÊÊJv4"¢ÚÂA¼DDDD¤_ž°{êÔ)dffÂØØ:t(5`×ÝÝæææ²#é¥Ç¿f¸dÉœh×®6lØ ; U 44;vì@ZZŒeÇ!"28ëÖ­Ã»ï¾ A¡P aÆpssCxx8ºvíÊã+•rÿþ}DFFbíÚµ8þ<ÜÝÝ€±cÇ¢aƲãiäĉxå•WðßÿþC‡•‡$™8q"Ž=Ф¤$(•JÙqˆˆ Ê;wТE T9ï Aƒ°ÿþZHEDO+((@dd$–-[† . {÷î ÁàÁƒ¡P(dÇ#"Ò&â%""""í+((À¹sçpúôiœ:u §OŸFRRT*еkWtéÒ]»v…»»;š4i";2‘Áºÿ>¶nÝŠ°°0ܹsãÇÇܹsѦMÙшHG [[[|ñŲ£Q®\¹‚gŸ}‡B¿~ýdÇ!"28QQQ=z4žþóñ ÞFÁÛÛýû÷ǘ1cиqcII‰H9s7nÄöíÛ¡T*áëë‹éÓ§ã…^ˆˆˆˆ¨JBôèѦ¦¦8zô¨ì8$QZZ:tè€uëÖaâĉ²ãœ7ÞxDqqq¥óýç?ÿÁرck)•GÇcÅŠ8rä:uê„9sæÀ×צ¦¦²ãiñQÍ¥¦¦"..®ÔSv=zKKKtêÔ©ä »=zô€“““ì¸DDuBFFV¬X 6ÀÔÔÓ¦MÃŒ3`cc#;éØðáÃÑ AìܹSv"ª„——Zµj…ÈÈHÙQˆˆ NLL úöí[å|;wÆÉ“'ù"*Wff&¶nÝŠ7"55îîî˜1cFÍãé­;wbܸq8uêÜÝÝeÇ!ÉÞ~ûmüôÓOHJJ‚±±±ì8DD¥¢‹|’™™nݺ…FÕb2"ªÌÙ³g±bÅ DEE¡eË–ÆÛo¿ÍvJD†Žƒx‰ˆˆˆH3ééé¥ë?~·o߆©©)\\\àåå…îÝ»ÃÝÝ;v„‘‘‘ìÈDDuʵk×ðÉ'ŸàóÏ?GÓ¦MŒÀÀ@XZZÊŽFDµÄÏÏ………øúë¯eG!¢JlÙ²ï¾û.ÒÓÓamm-;‘A9sæ <<<*ÇÔÔ¿þú+Ÿ¬IDUR©Tøá‡°qãFìݻ͚5Ä 0eÊ8::ª½œ#GŽÀÛÛ[wA‰ˆˆˆ¨ÞËËËCÇŽáíí-[¶ÈŽCz %%:tÀ®]»0räHÙqˆˆ ÊÇaccƒ¼¼¼r_711ÁðáÃUËɈH×®]úuë°~ýz!0a„„„ eË–²£UñQÅîß¿óçÏ— Ø‹‹Ãüh×®]É`]wwwxxx Aƒ’Õ]üñV­Z… 6ÀÎÎÁÁÁ€¹¹¹ìhDTËÆììlDGGËŽBD•¸ÿ>ììì°víZLœ8Qv""ƒòÇ ]»v¾ndd„+V`æÌ™µ˜Šˆê‚ôôtlß¾k×®Å7ЫW/`øðá•>ÕêæÍ›hݺ5&OžŒÕ«Wó XDDDD¤‹/Fxx8®\¹{{{ÙqHOŒ5 W®\ÁÙ³g¡P(dÇ!"2(o¾ù&vïÞÂÂÂ2¯) ìÛ·o¼ñ†„dD¤®û÷ïcëÖ­Gvv6F…¹sç¢C‡²£i‚ƒx‰ˆˆˆè qåÊÄÇÇ#..gΜÁåË—¡R©`oo_2X×ÝÝÝ»wÖ†»õ IDAT瓤ˆˆjÉÅ‹Ž]»v¡uëÖ ”)S`ff&;I2yòd\»v ßÿ½ì(DT…aÆ!//‡–…ˆÈ Ü»wMš4)÷5SSSxxx ..FFFµœŒˆêŠââbùäà¥r}ðÁøùçŸqìØ1ÙQˆˆ Љ‰ |}}¡T*KM/,,Ę1c$¥"¢š022‚Nœ8_~ùM›6Å!Càææ†mÛ¶¡°°PvD"¢rñI¼DDDDuLQQ’’’¸¸8œ9s—.]‚öööðòòB÷îÝáîîŽ.]ºÀÌÌLvd""‡ððpìß¿Ÿ¿HD•zÿý÷ñý÷ßãÌ™3²£‘þñ 77ß}÷ì(DDÅÉÉ iii%ÿ›šš¢_¿~ˆŽŽ–Šˆê3gÎ`ýúõصk6lˆììl•šÇÔÔ8xð ^yåII‰ˆˆˆ¨.èÓ§rrrpüøq~6HòôôD›6m°{÷nÙQˆˆ ÊÏ?ÿŒ×^{­Ô4ܼyÆÆÆ’R‘6?Ë—/Ç®]»ààà€wÞyS¦L•••ìhDDíá ^""""—žžŽ3gΔ Úýõ×_‘——KKKtêÔ©dЮ§§'lmmeÇ%"¢§ÄÆÆbþüù8~üxÉà]Ù±ˆH-X°_ý5.\¸ ; ©açΘ0a233ѤIÙqˆˆ †‡‡GÉ–( 4iÒ—.]‚ädDTŸ\¸p®®®P©Tå¾nll SSSìÙ³ƒ®åtDDDDTìÝ»ÿøÇ?ðóÏ?ÃËËKvÒc»ví¸q㜜 '''Ùqˆˆ †ÈÈÈð¿f›>}:V¬X!9i[ZZV®\‰-[¶ÀØØ&L@hh(ìííeG#"Úc$;©ïÁƒˆ‹‹CDDüýýáèè 6 ÑÑÑh×®V­Z… .àîÝ»ˆ‹‹CXX|||8€—ˆH¨T*DGG£k×®èÓ§6lˆãÇ#..Žx‰¨JJ¥²c‘š !bcceG!"2(OÞËB`Ó¦MÀKDµnÇŽ•>‘¥¸¸ùùù2dÖ¯__‹Éˆˆˆˆ¨.(((@HHüüü8€—ª4bÄØÛÛ³ïAD¤!…B7ß|J¥PXXˆÑ£GKNEDºàè興ˆ¤¥¥áƒ>Àž={àää$%%ÉŽGDõñé±ÔÔTlÛ¶ AAAðòò‚µµ5zôèððpܹs&LÀ·ß~‹[·náâŋضmðüóÏÃȈ—zDDúF¥RaÏž=xñÅ1tèPØÙÙáôéÓˆ‰‰§§§ìxDd ÌÌÌŸŸ/;©©iÓ¦èÖ­8 ; ‘A±µµ…‘‘LLLàïïüã²#Q=SPP€7¢°°°Òù„P©Txçw !D-%$""""C·zõj\¿~K—.•… €©©)¦L™‚M›6áÁƒ²ã”Ñ£G—üPv›6màáá!9é’ BBBðÇ`ãÆ8yò$ž{î9øøøàäÉ“²ãQ=Å‘DDDDzâÞ½{ˆÅÂ… áããƒfÍšÁÙÙ“&MB||<ÜÝݱiÓ&\¸péé鈎Ž.™·I“&²ãQ% ±mÛ6tìØ~~~xþùçqáÂDGGóƒ"ÒŸÄKdxˆƒB¥RÉŽBDd0¬­­¡R©Ð¬Y3DDDÈŽCDõÐ×_ììlÞ³lÙ2Lœ8EEE:JEDDDDuEvv6–.]Šàà`8::ÊŽC"00=ÂöíÛeG!"2(;wÆ3Ï<xë­·$§!¢Úbff\ºt ûöíCff&<==áåå…èèhþ #Õ*…àQ‡ˆˆˆ¨Öáüùó8vìNœ8'N %% …...èÖ­<==Ñ­[7¸ººÂÄÄDvd""ª†‚‚DFFbÑ¢EøóÏ?áçç‡yóæ¡}ûö²£‘Û°aÞÿ}¿LNDò$&&ÂÍÍ §OŸæx9r¤ìDd~ÿýwüþûïxíµ×`kk+;Q½·gÏ-ûÓO?ÅñãÇu¶üê:wînܸ¢¢"Wúƒ, … …B!ТE xzzòÞ>Õšàà`¼üò˲c‘Þ}÷]|õÕWHNNFãÆeÇ!2iÒ$;v /^„B¡§NÑ×þ)iÇã{Îýúõƒ¥¥¥ì8D¤#UõcbbðÉ'Ÿ 66nnn ÁÈ‘#all\‹)‰¨ÚÃA¼DDDDµ ;;ÇÇñãÇÓ§OãÁƒ°²²‚§§gÉ€ÝnݺÁÚÚZv\""ª¡‡býúõX¶lîÝ»‡I“&aΜ9hݺµìhDTlݺÓ§OGnn®ì(D¤&!Z·n€€ÌŸ?_vé <==ѪU+ÙQˆH]½z>D§NdG!ª×þúë/œ8qB§O$9r$Nœ8OOO­C„(,,DQQQ©¿‚‚‚Rÿ?žÇÒÒ²ä /DDDºôÕW_!** £F’…ˆÔtéÒ%¸ººbݺuxûí·eÇ!sîÜ9tîÜGÅ믿.;Nb(ýS"ªžÜÜ\œ8q½{÷–…ˆtD“þñ¯¿þŠO>ù_}õœœœ(•ÊZHJDõÐþì+‘¤¦¦"..gΜA||<Ξ= •J{{{xyyaÉ’%ðòòBçÎadd$;.iInn.Ö­[‡åË—ãÁƒxçw0{ölØÙÙÉŽFDuˆ™™òóóeÇ " ( x{{ãèÑ£ÄûÿÍš5‹_.&¢J%$$à…^@ƒ dG!ª×vïÞ ___¯ÇÓÓS§Oû%""ªËøF"ÃŒçž{&L… ››ºvíŠÍ›7s¯°JT·ýðÃèÕ«—ìD¤#šô_zé%DFFâ?þÀªU«0}útÌ›7S¦LÁ¬Y³`ee¥Ã¤DTq/Q =xðgÏžE||<âââpüøqܾ}èܹ3ºwþúë°µµ•—ˆˆt 77[¶lAXXrss1qâD¼ÿþûhÑ¢…ìhDT)•JA¥Rñaˆ HÏž=1eÊäååÁÜÜ\v""½çáá!;‘Ö9r‡Æ÷ßcccÙqÈ@Mž<Ó¦MÃÊ•+ù]$"" p/=ÍÉÉ øàƒ°nÝ:¬\¹kÖ¬Á´iÓ0cÆ X[[ËŽHDu¿åGDDD¤¡?ÿü;vìÀ»ï¾ 777XYY¡GX·n7nŒ  !!÷îÝC\\"""0räHÞ4'"ªƒrrr޶mÛbÞ¼y5j®^½Šˆˆà%"133HNBDšèÕ«òóóqâÄ ÙQˆˆˆˆˆˆˆˆˆH‚ââbÌš5 C† AŸ>}dÇ!6zôh˜™™á?ÿùì(DDDDu‚.\ˆ””L›6 «W¯FÛ¶m„7nÈŽGDuñU¢¸¸‰‰‰X³f ÆŒƒÖ­[£mÛ¶˜8q"Ξ= oooDEEáÆHKKÃŽ;0}út¸»»ÃÄÄDv|""Ò‘'ï.Y²“'OƵk×;;;Ùñˆ¨ŽS*•€üü|ÉIˆHmÚ´A»vípôèQÙQˆˆˆˆˆˆˆˆˆH‚7âòåËøä“OdG!×°aCŒ37n„Bv"""¢:ÃÆÆ .ĵk×°xñb|ýõ×h×®üýýqåÊÙñˆÈ€qd Ñ>|ˆ_ýñññˆ‹‹Ã±cÇFÁÓÓo¿ý6¼¼¼Ð½{w˜››ËŽKDDµìöíÛX½z5""" R©ðÎ;ï $$M›6•ˆê>‰—ÈpõìÙ“ƒx‰ˆˆˆˆˆˆˆˆê¡œœüë_ÿ´iÓо}{Ùq¨˜2e Ö¯_¸¸8ôèÑCv"""¢:¥Q£F Â;#ÈÈH,Y²;vÄÀñ¯ý /½ô’ìˆDd`ø$^"""ª×îÝ»‡ØØX„††ÂËË ÖÖÖèÑ£"""`nnŽùóç#!!÷îÝCLL .\ˆÞ½{s/Q=sëÖ-,\¸ÎÎÎX³f ‚‚‚píÚ5„……q/Õ:>‰—Èp½úê«8}ú4Û¯rssƒB¡PûÏÃãÔÿ=’½ ¤§öíÛW+u¥¶ÖCµcùòå%û²U«V²ãÔKÜuÏûõÏ$[TTÜÜÜ`nn^R/\¸ ;–ÎDFF–lgƒ dÇ!"ÒK‹-BAAæÎ+; Õ®®®ðððÀ¦M›dG!aÿµ~`ÿµ~ºzõ* "##eGÑ •õ)YVµ¯¢ûãõõ¾¹R©„¿¿?.]º„}ûö!==ðññÁñãÇeÇ#"ÂA¼DDDT¯\½z[·nÅÛo¿gŸ}Mš4A¿~ýpèÐ!¸¹¹áóÏ?ÇŸþ‰ôôtìÞ½AAApww‡‘/›ˆˆê£'ï®]»3gÎDJJ .\ˆ&MšÈŽGDõŸÄKd¸<==‘ŸŸsçÎÉŽB娳g„%€C‡•šîëë‹¡C‡B!C†HNMº”››  <¸Ú˨­ºÂ:Y·Ìž=B¸ººÊŽRoqÔ}º>ïkãB5Ãs£~«ëm$>>£GFß¾}‘••…«W¯¢U«Vuz»ýüü „€···ì(DDz)55«W¯Æ¢E‹Ð¬Y3Ùq¨™,9é3Ùˆˆˆˆ´)55±±±ˆ‹‹ÃÑ£Gñ×_¡aÆxùå—1aÂxyy¡G%O/#""zRff&>ýôS|öÙg°´´Äüùó1}útXXXÈŽFDT‚Oâ%2\ …]»vÅÉ“'eG¡§hòtäÈÈH&!}bii‰””Ù1ˆˆHËjã¼ÏsQåêz¹~ý:”yÒb]ßn""*ß±cǰwï^ìß¿¦¦¦²ãPÓ¨Q#øùùaÆ ˜1c …ìH¤Eì¿ÉÇ6R7èÓ~Ô§,€þå14ÞÞÞðööÆñãDZtéR 8:uÂܹs1bÄ^›Q)ÄKDDD«¸¸—/_F||ï?9ÿ“çI“& +++ñý÷ß‹‡Š›7oŠÙ³g âèÑ£jeÕFýÖ¤¾V÷¸£NûÖFyTuÎäõšþ_¯i³<.ß-Zˆèèhqÿþ}qóæMñÑG båÊ•¥æÓt?¨[&åm[e¯Uçú²ºçFmÔ“òòž?^ôíÛW8::–›·"Úl/ÑdÿiºÎêÖm3”~6Q}óàÁѺuk1eÊÙQ¨X½zµhذ¡ÈÉɑŠéCÿ´*쿲ÿªi¹T7û¯e×£í6ò4]÷ 5-_]-[›}JMTÖWš¶Ú˜¦YªSG×®]+”ùÜa„ €ðõõ-5}ïÞ½ÂÛÛ[­<å}FQÙt} oýã«W¯Š€€abb"œœœÄ† DAAìXD$Çnâ%"""½‘››+~ùå&z÷î-4h {{{1räH±aÃqáÂÚ%"¢jûóÏ?ÅŒ3Dƒ D›6mĪU«Ä£GdÇ""ÒHNNŽ 8 ; U“ƒƒƒ—C}ûð´"š|*::ºÔô1cÆ¥a?¾ÜÑ322„™™™pwwW+Weà?þ@~×®]¥¦?zôH´lÙR˜››‹›7o–ÉðàÁ*·±¢y4Ý®ŠÊlĈeʬªí­Ìãõ<}¾|þùçñÓO?•šîää$:tèPáržüâÂÈ‘#ñÕW_•š733SXXXT:ˆWº"DÍ·[õDGG‹×_½Ì2Þ|óMajj*îÝ»W2-66VS§N-5o\\œhÓ¦(,,,™¦º®I¶Šè2sUíâ»ï¾«pÝjA£¢A¼š”MUY5­ÏÚ:–iëXPÕ@¥š\]]qüøñRÓÏŸ?/WW×’iÚ®Gú‚ƒxÿ¦ÇòòÎ!NNNâ•W^)³ìöíÛkü%èšÔoMêku;ê´om”‡º_‚æõšþ^¯i³<.ßòúýû÷/Ä[Ýý n™h:ˆ·:×—Õ=7j£žT”÷ÆÂÌÌLkƒx5ÝOÑdÿiºNâ%¢Ê|øá‡ÂÒÒRdddÈŽBõÀíÛ·…™™™øâ‹/dG1húÐ?­ û¯ÿÃþ+û¯O.Ïû¯åÑußPÓòÕÕ²µÙ§Ô„&ƒxµÕÆ4ÍR:zûöm¡T*EÿþýK¦=|øP4mÚT<óÌ3ÂÜÜ\Ü¿¿äµaƉ/¿üR­<Ä«=©©©bÆŒÂÌÌL´mÛV¬ZµJ­ºHDuÊn#I’››‹ØØX,\¸}úôµµ5zôè7ÂÞÞHMMEzz:vïÞ€€<ÿüóP(²£‘ù믿„öíÛcß¾} CRR‚‚‚`ff&;‘F”J%   @r"ª.777$&&ÊŽAZÔ¥K—Rÿ;88ÒÓÓK¦íÛ·FFFûl¥ïU§®hƒ:ëM÷ƒ®Ê¤&×—šÒF=©(oË–-Ѿ}{­e­î~ªˆ:ûOÛë$¢úëÆøôÓOñᇢE‹²ãP=`mmAƒáË/¿”…ôû¯ÿÃþkõ°ÿZ9]Ô ]÷ uYoô±OYµÑÆ´ÅÚÚDLL nÞ¼ øæ›oЭ[7¼ûî»ÈËËÃÿû_@vv6~üñG >\fäzÉÉÉ HJJÂ!C GGG„ê× IDAT‡‡#//Ov<"ª%ÄKDDDµæþýûˆEhh(¼¼¼`mm>}ú`ûöíh×®6mÚ„k×®!%%Û¶mC@@œœœdÇ&""–™™‰ÐÐP¸¸¸`ïÞ½¥ï6hÐ@v<"¢jQ*•P(ÈÏÏ—…ˆªÉÍÍ çΓƒ´ÈÊʪÔÿFFÿûøE¥RòóóqïÞ=¨T*XYYA¡P”úûõ×_ÉÉÉÕÎðx 4€¥¥e™×íìì äü'5lذÊå—7OM¶ëé2{ü#ËL[7n\ê###âÔtcccµÖŸŸœœ4hÐ5*ózÓ¦M+}UuE[ÔYϽ{÷0þ|¼øâ‹hÚ´iÉ~›3gàáÇ¥–ñÞ{ïááÇø÷¿ÿ ¸rå ~þùgLš4©dmÕuM³UD×™+k;3gÎ,³î~øje¯Hu˦¢6¬I}ÖűL×Çmš5kVîK6oÞÀÿî=誑~ªÉ±|íڵضmRSSáííÆ£ÿþ%_ŒÕDuë·¦õµºÇuÚ·6Ë£*¼^Óßëµ'Õ¤NTU¾êÎWÙ~ÐE™ÔôúRS5­'Uå}|~¬©šì§ŠTµÿt±N"ª¿BBBмys̘1CvªGÆü©©©²£ž`ÿ•ý×êbÿµjÚ®ºîê²ÞècŸ²&j£i›¿¿?Š‹‹±sçNÀöíÛáïïÑ£GÃØØ;vììÚµ ƒ.·ì©v´mÛHKKÄ °hÑ"8::báÂ…¸ÿ¾ìxD¤cÄKDDD:sóæMDFFbêÔ©xá…ФIôë×ß}÷<<<…¬¬,¤¤¤`Æ ð÷÷G›6mdÇ&"¢:àñà]GGGìܹaaa¸rå ïQ¡T*ù$^"æææ†¤¤$þªn=bff†&MšÀÄÄ………B”û׳gÏ*—UÞ@²Çë°²²Â£G““Sæõ¿ÿþ´úômnWE*Ú^YÌÌÌ`ii‰G!77·Ìë™™™ZYOml·>úè#Lž<W®\J¥‚+W®!JÍïëë‹Ö­[cÍš5ÈÏÏÇŠ+0yòäR_âÒVÐ4[Ej3óÓÆŽ ;;»Rë?~|¿l¥­²4¯ÏµÑæ+bddTîõïÝ»wµ¾®§Ý»w¯Üé˧yóæRˆ ‹B¡À¸qã‹»wïbß¾}B`øðáøôÓOk%ƒ¦õU›Ç§i£<´uÎäõš~\¯Õ¤NTU¾êΧ‹ýP™ê^_jóܨI=©*ovv¶FëÖ·ö¢é:õ­¿BDúá×_Å®]»°lÙ2˜™™ÉŽCõÈÀaggW2P‡¨&Ø-ý×ÒØÕ~Ñuß°:å«‹ek»O© 2ïõV·Ž4ÖÖÖØ¾};²²²pâÄ :vvvèÛ·/~øádddàË/¿„¿¿¿–SSuØÙÙ!,, iiixçw°jÕ*8;;s0/QÇA¼DDD¤5999%OÚõðð@Ë–-ñæ›oâÔ©Sðöö.´{öìY¬Zµ Æ ƒìØDDT‡<=x÷ã?æà]"ª“”J%ŸÄKdÀž{î9ëÕ/4“î >EEEˆ/óZxx8Ú´iƒ¢¢¢*—caaQêK:tÀÆÆ 8p Ô{òóóqäȘ››£_¿~5ÙŒ2´µ]©l{e0`àðáÃ¥¦ß¼yW®\ÑÊ:t½ÝÅÅňG‹-0cÆ ØÚÚ–|9¤¢011APP233±bÅ DFF–ûD¡šÖ‰êd«Hme.™™¦NZ²î;v ((H£eØ·o E™ó·.©[_uqÜy’6ÊC›çL^¯U6÷AMëÄãò=xð`™×:wîŒY³f•š¯6÷Ceªs}©ís£&õ¤¢¼·nÝBRR’FëÕ·ö¢é:õ±¿BDòÁÓÓÇ—…êŒ=[·n­Ñ`E"€ý×§±ÿúØý]´]÷ 5-_]-[›}J]‘u¯·ºuT©TÂ××çÎÃܹs1dȘ››Æ‡ââb,X°èÕ«—ÖsSõÙÚÚbáÂ…¸zõ*&Mš„+VÀÅÅ+V¬¨ð òDd¸8ˆ—ˆˆˆªíþýûˆŽŽFpp0ÜÜÜФIôïßGŽA¯^½pàÀܽ{ ˆˆˆÀÈ‘#amm-;6ÕAOÞݺu+,XÀÁ»DT§™™™ñI¼DÌÙÙÆÆÆÄ[Ï|üñÇpvvÆÄ‰qèÐ!Ü»wÙÙÙØ°a-Z„åË—ÃÄĤÊå¼ôÒK¸rå ®_¿ŽãÇ#55=zô(Y‡““fΜ‰ýû÷#''W®\Á˜1c‘‘ˆˆØÙÙéåvU¤²í•eéÒ¥°¶¶ÆÌ™3ƒÜÜ\\¸po½õ–Öž< ëí666Æë¯¿Ž›7obÙ²e¸uëòòòpôèQ¬_¿¾Â÷ÀÊÊ óæÍÃСCáààPfžšÖ‰êf“™¹"S§N…¹¹9æÍ›‡Þ½{ã™gžÑxOÒvÙš×g]·ùŠôíÛéééX³f rss‘’’‚   4oÞ\ëëzZÆ 1mÚ4œ233ñÉ'Ÿ@Q«_ S·¾êâ¸ó´š–‡6Ï™¼^«m_·Ô¤N<.ßY³fáÀÈÉÉÁ_ý…©S§"##£d¯ŒýP™ê\_jûܨI=)/ïï¿ÿŽ7ß|5Òh½úØ^4Y§>öWˆH®¨¨(;v «V­âÓºIЉ'â?þ@\\œì(T°ÿZû¯ì¿>MÛmD×}CMËWWËÖFŸòÎ;hß¾=œœœžž®Ö{4YŽ&Û£­,@Íêè¸qã›6m*õ´Ý¡C‡ÂÒÒ›6mÂØ±cadÄ!dúÈÆÆüqÉ“y-Z„¶mÛ"<<œƒy‰êADDD¤¦ˆ˜˜±`ÁÑ»wo¡T*Ñ®]; vïÞ-nß¾-;&Õ#™™™"$$D˜››‹æÍ›‹°°0ñðáCÙ±ˆˆt®eË–âÓO?•ƒˆjÀÑÑQ,]ºTv )ˆ¨¨(Ù1*´uëV Ì_NNNÉ<Ç/óúܹs…¢ÌôAƒ•¼ïöíÛ"88X´k×N˜šš [[[Ñ·o_£v¾Ë—/‹=zˆ† ŠÖ­[‹µk×–zýÖ­[bæÌ™ÂÉÉI˜šš +++ѯ_?qäÈ‘Jó?ý‘‘:óh²]Õ-³ª¶÷i­çôéÓe¦üñÇâ—_~)3}Á‚bïÞ½e¦;¶d=IIIbèС¢qãÆÂÂÂB¼òÊ+â§Ÿ~¯¿þº°°°Ð›í®l=YYY"00P´nÝZ˜šš ;;;1aÂZ2¯»»{™uÍ™3G‰‰‰æ©i]¯n¶Šh+³&íâ±É“' â§Ÿ~R;ï²eË*ÜŸê–&YÕ­Ïš”UEªÛ&îÞ½+&Mš$ìíí…¹¹¹ðòò§OŸîîî%󇄄híðä>ppp§N={ö5æææâµ×^qqqÕ*›êÔ#™¢¢¢tžoĈbĈ:]GEtqÞ¯ìrîÜ9(:vì(,,,„µµµðôô›6m*•ªÒ¬Úªß©Û–krÜ©ª}פ<«èœÉëµÒôézMWm¤¢òµ··~~~âÊ•+•Χî~дýÇ×Úõåc597Ö¤ž”—×ÜÜ\téÒEìß¿_x{{—¬ãí·ß®ri£½T¤ºuZ“ujZÿuÐï~6Q}‘——'ÅøñãeG¡zÎÕÕU­ó0•%³Zö_Ùeÿµîõ_ËSQßÐÛÛ[˜™™•™_ݾ¡&å[Ë®iŸòöíÛÂÙÙY´iÓFܸq£Ò2­l?V¶u·G[Y„¨yÓÅÅE´iÓ¦Lœ0a‚ .^¼¨VžŠ>£¨ì³ }QWúÇYYYbÁ‚¢qãÆÂÖÖV„……‰ÈŽED5³[!„ """*GQQ‹ØØXüòË/ÈÏÏG»víлwotïÞÞÞÞå>½‚ˆˆH—²²²°bÅ ¬^½5Bpp0f̘sssÙшˆjE»víˆÙQˆ¨šúõë|þùç²£Ô:…B¨¨(Œ5Jv"­{öÙg‘——‡k׮ɎBzbëÖ­X»v-dGÑë3ÀîÝ»áëë ]~­`äÈ‘€={öèlDD†ŠçcRûÙDúáã?ÆG}„¤¤$´nÝZvªÇV®\‰… "##²ãöO‰H_õîÝqqqxôè‘ì(Dz­®õoݺ…5kÖ`åÊ•033Ã{géÓ§óÈ0íá³Ð‰ˆˆ¨Dqq1Μ9ƒððpôéÓ7†‡‡"""дiS|öÙg¸víRRR°aÃøûûs/Õª¬¬,„††ÂÑÑ[·nÅüùó‘––†à%¢zE©T"??_v "ª$''ËŽADÕpóæMX[[£°°°Ôô´´4¤¤¤ W¯^’’‘>Z¿~=‚ƒƒeǨë3‘|<¾ÌÌL„……!44”xIº±cÇ"//{÷î•…ˆˆˆˆjÀÆÆ .DJJ ¦NŠ¥K—ÂÑÑáááÈËË“ˆ4ÄA¼DDDõ˜J¥ÂÅ‹±qãFŒ5 666ðððÀÊ•+Ñ´iS¬Zµ )))HOOÇîÝ»€6mÚÈŽMDDõPff&fÏž GGGlÛ¶ K—.åà]"ª×ÌÌÌPPP ;Õñ¶;wî 00ׯ_ÇÇqêÔ)øúú¢qãÆøðÃeÇ#‰6oÞŒaÆ!77ëׯÇ;wôþßYŸ‰ˆˆäãù˜ˆÈ°Í;–––xï½÷dG!BóæÍ1`À|ùå—²£‘<9˜wâĉX´hÚ¶mËÁ¼D†ƒx‰ˆˆê™ÔÔÔ’A»¶¶¶xá…0oÞ<äåå!44 ÈÈÈ(´Û®];Ù‘‰ˆ¨ËÎÎÆ|gggìØ±K–,AJJ ‚‚‚8x—ˆê5¥RÉA¼DÎÅÅÿý7îÝ»'; i¨E‹ˆÅÝ»wñꫯ¢iÓ¦xã7àââ‚S§Nñ~aß¾}hÚ´)Ö­[‡ÈÈH˜˜˜ÈŽT!Ög"""ùx>&"2l‰‰‰Øºu+ÂÂÂаaCÙqˆãÇÇ‘#GpãÆ ÙQˆˆ¨"##¡P(päÈäççC¡P`Ò¤I²c‘$666 CZZZÉ`^>™—Èpèï'ÆDDD¤©©©ˆE\\~øáܸq5‚§§'þùÏ¢wïÞèܹ3ŒŒøÛDD¤?rss±víZ„……ÁØØóæÍÃôéÓaaa!;‘^033C~~¾ìDTíÛ·\½zîîî’Ó‘¦¼½½áíí-;é¡I“&Ü—¨XŸ‰ˆˆäãù˜ˆÈpÍ™3®®®3fŒì(D% „Æ#** ÁÁÁ²ãQ5ùùùÁÏÏOv "Ò3¶¶¶ Ã{g+V`Ñ¢EøôÓOŒ3fðá(DzŠ£uˆˆˆê˜ôôtìÙ³ptt„³³3‚ƒƒ‘‘‘éÓ§ã—_~Avv6bbbwwwà%""½ñàÁDDDÀÙÙK–,A`` RRR¼DDOà“x‰ Ÿ££#”J%’““eG!""""""""¢jøöÛoƒU«Vñ»7¤WÌÌÌ0lØ0ìÚµKv""""ґǃyÓÒÒðÖ[oá_ÿúŸÌK¤Çx×€ˆˆÈÀeee!22“'OF»víààà€ñãÇ#558vìîÞ½[2h×ËË ¦¦¦²c•RPP€7â™gžÁ¼yóðÖ[oáÚµk ƒ•••ìxDDz‡Oâ%2|&&&pttÄ•+WdG©“¢¢¢àææsss( ( \¸pAv¬z'22²¤ü4h 5ËòåËK²´jÕJj}ƶ£¾Ú®ßnnn%ëSçÏÃãÔÿ=ÒyF"}§Oç%uéËùËËNûöí«³ÇÊF•97,_¾¼Ô<<ïSy ±½óXID²bΜ95jzôè!;Q£GFBBïAý¹fª/xmX¾ºÜ'í«ï÷-êûö“f*ÌËc-‘þà ^"""óðáC>|³gÏFçÎagg‡qãÆáÒ¥Kð÷÷Ç?þˆ;wî &&|ð^~ùe˜˜˜ÈŽMDDT®ÇƒwœœŒQ£FáêÕ« CÓ¦MeÇ#"Ò[|/QÝðÌ3Ï %%EvŒ:'>>£GFß¾}‘••…«W¯òKI’øùùAoooÙQ0{öl!àêê*;ŠÞbÛÑŒŒú½gÏ!Jþ‡*5Ý××C‡…C† Q{ù¹¹¹pqqÁàÁƒuµ uËOÿéÓyI]úrþ2IJSG]>VæææâìÙ³€!C†@Ù³g—¼Îó>UÄÛ;•D$ËÚµk‘––†¥K—ÊŽBT®^½zÁÎΑ‘‘²£Зk¦ú‚׆å«N?œôOmÜ©ï÷-4Ý~C¹_Eº×¼yó2ƒy]\\ÁÁ¼Dz€ƒx‰ˆˆô\qq1Μ9ƒððpôéÓÖÖÖ0`öîÝ‹®]»"** YYYˆ‹‹ÃÂ… ñÚk¯ÁÌÌLvl""¢JbÛ¶mèØ±#¦OŸŽÁƒ#99°³³“ˆHïñI¼DuƒƒƒÒÓÓeǨsr B£FàììŒëׯã…^H¯±í*• *•Jv½Õ¨Q#xyy•ûËHUÖv5UWÚ:Ïûµ«ºuP›u—ˆˆ´ëÎ;X¼x1‚ƒƒáìì,;Q¹Œ1jÔ(ìÚµKv"µÔöõ/¯·uGËV3é’.··6îèó}‹Ú¨Kšneû¤¾Õ}úŸ'óŽ;ï¿ÿ>Ú·o¯Ñ`Þ¤¤$§$ªøX>"""=”ššŠØØØ’¿;wîÀÎί¾ú*>ûì3 0­[·–“ˆˆHc*• _ý5æÎ[ò‹oóçχƒƒƒìhDDE©T"''Gv "ª!{{{;vLvŒ:çúõë€fÍšINBdXØvôÛ¹sçÔž·ºOر´´äâk€åGT?Ô•¶Îó>QÍ,X°ÆÆÆ •…¨R£GÆêÕ«qîÜ9¸¹¹ÉŽCDDu@mÜ©ï÷-4Ýþºr¿Š´ïñ`Þàà`|úé§ ÅŠ+ðÞ{ï!00 4(÷}7oÞ„»»;6lØ€±cÇÖrj¢º‹Oâ%""ª¦‚‚­-+33{öìA`` áììŒàà`ܹs!!!HHH@FFvïÞ€€à%""ƒ£R©°gÏ<÷Üsðó󃛛.]º„ 6p/Q5ðI¼Duƒ½½=222dǨsŠ‹‹eG 2Hl;DDDõÏûDDDÕ—””„õë×cñâŰ²²’‡¨RžžžprrâÓx‰ˆÈ Ô÷ûõ}ûIûæMNNưaÊ:TødÞ°°0<|øþþþØ·oŸ„ÄDuñi¨¸¸ááá=ztµ—ñàÁÄÆÆ"44hѢƌƒ3gÎÀÏÏ111ÈÎÎFLL BBBàîî…B¡Å­ ""ª=±±±ððð€ŸŸ:uê„K—.a÷îÝpvv–ˆÈ`)•J­þ°ÉѲeKdgg#//Ov½wûömÃÙÙJ¥M›6Å€pôèÑ’yöíÛ…Bo¾ù`nn…BOOÏ —»|ùr( ( ´jÕ §OŸ†··7,--aaaž={">>¾Ìû²²²0cÆ 8::B©TÂÖÖÇ/÷I™êÌû8û㿤¤$Œ5 Íš5+™vëÖ-äççcþüùxöÙgaaakkkøøøàÛo¿Uëý¢¢"DEE¡OŸ>hÑ¢ÌÍÍñâ‹/"""*•ªÂuêÁãóŃ_²n“JËOFVm쳺BÓó’:õ¯¦Çº¯¾úªÆç/M3ê_T·ìÊ£‹ëMÏ»UµÝ§U÷X©k' tíÚû÷ïGïÞ½K–5iÒ$ʽ*š^3W÷ZGº¹xñârÛÒáÇK¦ÛØØT¹MÚ¸ÑÕu²¦uPÓ÷©{ ¨ •ÿGƱ’ˆ Ó{ï½¼õÖ[²£UI¡PÀ××»ví*÷|Fõ×åË—1hР’þˆ6î…—G{ê\ÿV÷š½¼{ª¡¡¡j]oëêÞaetyoüÉe›™™¡U«VèÝ»7¾øâ‹RŸSÕdŸk»^›™ªSöåկ͛7W9Ï­[·ÔÞ.]ôCkrïPÛ÷F*Z~y÷-Ôý,­ºûSW}üÇtõYgEû¤¦y©njÕª"""påÊ :´Ô`ÞÇHOOǺuëðÿØ»óð(ª¬àßîìû‚@A6!Q@DqH0Á„Q†ÍÁ—ÍÁÁù9#*¸ (èȈâ;‚€P#D› Y†U‡DP”%…,ç÷‡oÚtz«[]ÕUœÏóäQª««Nݺ÷Ö­s«"aĈغu«Æ‘3ÖDcŒ1Æ$;sæ Ýwß}€üüü¨ªªJÒ÷jjjèðáÃôÆoРAƒÈÛÛ›Ðm·ÝF“'O¦uëÖQqq±ÊÑ3Æc®•••E½{÷&ƒÁ@IIItìØ1­CbŒ±&cÆŒtÿý÷kcÌI$ôóÏ?kŠK ôôtÉëçååQÇŽ)""‚222¨¤¤„rrr(55• -[¶Ìlýääd@’÷MÔ¯_?ÊÎΦ²²2:tèõìÙ“¼½½iÏž=¦u/]ºD·Þz+EDDЖ-[¨´´”N:E±±±äëëKÙÙÙ²Öm{ll,íÞ½›nܸA *(( ‰'RHHmß¾ÊËË)??ŸfÏžMh÷îÝ3##ƒÐk¯½FEEETPP@ï¾û.Fš={¶Åúõñ$''›Ê%++‹üüü¨OŸ>fëþøãJQQQ´}ûv*--¥'NÐ!C¨C‡äãã#é\È=ßRb$úí\GEE™-‹'£ÑHgΜ±X¿_¿~´zõj‡q'$$ØÝƧŸ~jú·ÒõB‰øî§qÛ‰wÉ’%ÀbŸO=õ Q£F™-߸q#ÅÅÅ9ŒMjÝW«}ŠÖogÛªTS¦L!”™™iskmdçÎlµX«ÎÔïËmÿ©©©tøða*++£O>ù„ÐСC)99™Ž=J¥¥¥´téR@³fÍ2Û†h{  xÀay7nG®ŽUÉ:˜žžNj?V––FiiiŠnS´ÝŠÔ?%ú:%®_"1‹Œ”º¦«9î½öIm»Îô•¢Ç`­œO:Eƒ ¢–-[J.g{Ž=jŠGê1Ø"Ræ¢ý¹­óÓ«W/jÑ¢…¤øœm—jÖW{Ç舽³5ÜWjßW*Eô>›1&ßÎ; mÛ¶MëP“ìøñ〾ýö[­CÑ=5îOõ&::šBBBhàÀ´wï^*--U$n‹HŽÂÞøWî˜ÝVNÕÑþÔÌÚ¢fn¼~Û‘‘‘”‘‘Aׯ_§üü|š7o E‹ ·=JÞ‡»"&¹eo¯~9ZGî<÷¡Jä•ÈÈÙ~ÃÏl•­ÚóLrîñ]1×ië;rsîŠïÅüúë¯4}útòõõ¥öíÛÓâÅ‹iâĉäååEF‹1cL–uü/cŒ1&ÑŠ+ÈÏÏÏl`jo@zöìYúàƒhĈJ(22’FŒA|ð]¸pÁ…Ñ3Æc®óí·ßRll, AƒÑ‘#G´‰1Æšœçž{Žz÷î­uŒ1'?žH~À ©<­È{Íš5fË+++©M›6äççGùùù¦år_â@G5[~âÄ @ÑÑѦeO>ù¤Õ‡ÑóòòÈÇLJzõê%k݆±oݺÕjœ;v´úKºví*ù%ÞX,;v,yyyQII‰Õx222Ì–§¥¥ÓÃ(DD#FŒ ôÙgŸ™­{ñâEòññ‘ü ’Üó-%F"ëöoÛ¶ÐÔ©SÍ–ïÝ»—¢¢¢èæÍ›ãÞ±c‡Ím´oßžª««MË”®JÄßp?ÛŽH¼………äííM ¦eåååF;w&???º~ýºé³áÇӊ+Æ&)tÀM IDATµî«Õ>Eë·³mU*‘—x·‘ÇÜj±Vœ=©ß—Ûþ·lÙb¶~÷îÝ }ýõ×qtëÖÍl™h{tö%^WŪdt×—xEÛ­HýS¢¯Sâú%³È@©kºšãÑkŸÔ¶ëL_)z ¶ÊùÊ•+äïﯻ—xEÊ\´?Wâ%^gÛ¥šõÕÞ1:bï{¢ål ÷•Ú÷•JᇔsššêÑ£ 6LëPv×]wYŒå˜¥æò/Ú¿¿Ùrgsᶈä(½Ä+gÌn+§êhjæmQ37^¿mkcÆ„„ÓK¼Jœs"eïÃ]“ܲ·W¿­#wž@‰ûP%r‡JäFäl¿ág¶ÊVíy&9÷ø®˜ëä—xÃ÷Çòœ;wަL™B^^^d4MïI4|‘×ßߟ<¨u¨Œ¹³uF0Æc̮˗/#11O=õ***P]] ðööFVV–Ùzëׯǔ)Sо}{têÔ þóŸqíÚ5<ÿüó8|ø0òòò°nÝ:Lž<QQQZcŒ1¦ŠììlÄÅÅáÁ„——<ˆ¬¬,ÜsÏ=Z‡ÆcMŽªªª´ƒ1椈ˆF\ºtIëPtmãÆ€ÄÄD³å>>>ˆ‹‹CEE¶mÛæô~c¶¬GhÓ¦ Ž?޼¼<À¦M›`4‘””d¶ndd$ºwïŽ#GŽàÂ… Âë6tï½÷Z1!!ÙÙÙ˜gúJ{Û;µlÙ·ß~»Ðþ\A¤Ì]5~oÈÙv©f}U‹åÌ}¥ö}%cLŸJKKMÏ5ôÑGá¿ÿý/Þxã ¢bÌ9£GÆúõë­ÖmÖüøúú¢oß¾f˜ۢͅTŽBî˜ÝVNÕ5s‡¶¨™¯ßöСC-¾Ÿ™™‰™3gp}®LÊ}¸+b’[öRê—­uä—÷¡®Èºâ~ÙVÙj1Ï䈹ÆDÜzë­Xºt)RRRàááañy]]ªªªðÐCáèÑ£DÈXÓÀ/ñ2Æcv¬_¿ݺuCVVˆÈì³›7obóæÍ˜6mî¸ãDFFbܸq8sæ þô§?áàÁƒ(..FVVæÌ™ƒ^½zitŒ1Ƙº¾ûî; 6 <𪪪°{÷ndeeY$7cŒÉWWW‡k×®áÚµkøå—_pãÆ ”––âÈ‘#øî»ï°cÇìØ±ß|óÖ¡2Æxyy¡E‹¦b˜¥ªª*”””À××AAAŸGDD€é¡pg„††Z]ÞªU+À•+WLñÔÕÕ!$$ƒÁìç?ÿùàÇZ·±€€«±,Y²Ÿ|ò ~úé'ÄÅÅ!88 ¦ÉGJJJðâ‹/¢G 3ÅòÜsÏÊËË­~/$$ÄìßÞÞÞ~»>¿§ÒÒRøúú"00Ðâûõeèˆ3çÛQŒŽÌœ9åååø×¿þÈÍÍÅ®]»0yòdI߀?ÿùÏÛøæ›o0qâDÓ:jÔ ¥â·FN¼ãÆCmm->ýôSÀÊ•+1nÜ8<öØcðððÀêÕ«kÖ¬ARR’Õ:Ó˜”º¯Vû”S¿m«jhÜFŒÆß¦‰¥´gGäüÉiÿÁÁÁÇæáá³åfÇëL{”ËU±ê±º’h»•Sÿ”êëä^¿Dc–:Pêš.²ÏƤ–‰×>gúJ{Û;……… íÏU¤”¹+Çï9Ó.Õ®¯JS¢œ¹¯ÔG_ÉÓ§­[·¢{÷îÈÈÈ0-+--ÅK/½„gžywÞy§†Ñ1&ÏèÑ£QPP`õ%HÖü´hуÁb¹Ü\¸=Jå(äŽÙíåTmQ;whoŸjäÆm[Îq+ÅÑ}¸+br¦ì¥Ô/kë8s\J܇º"wèŠûe{e«Å<“-ZæJqæÌ|þùç6éKmm-*++1hÐ œ>}ÚÅÑ1Ö4ðK¼Œ1ƘÅÅÅ;v,FމëׯÛþðÃÈÎÎÆ#<‚íÛ·£¨¨;wîÄ_ÿúWôéÓÇêo£aŒ1ÆšŠ“'ObäÈ‘èׯ ±cÇìÝ»·ÙüEÆs•ýû÷ÃÃÃáááG‡°hÑ"œ;w½{÷Æ}÷݇ÁƒcðàÁغu«Öá2ÆEDD 77¹¹¹8rävíÚ…ŒŒ žøú?>>> Aee%JKK->¿|ù2€ß~3¹³ -~‰ðÛKÀoÛøøø 44žžž¨®®Yý8p ÐºR <ñÄرcŠ‹‹±iÓ&RSSñöÛo;üþ°aÃ0oÞúJƘ>8qgΜÁ#<‚àĉ˜?>ªªªð÷¿ÿ]ëð“¥S§N¸çž{ðùçŸk Ó’’«ËåæÂíÉQØ7«1f·7ÞV3whkŸjåÆm»ázJ宕ºwELî’—eï4åÜ¡+ΧhýÖrî Ð_^Œé׋/¾è𽇚š”––bÀ€øùçŸ]cM¿ÄËcŒ5²}ûvtëÖ ëÖ­`?ÁCDøë_ÿŠ7ß|ƒ†ŸŸŸ«ÂdŒ1Æ4óÃ?`äÈ‘ˆŽŽFNNÒÓÓ‘¸¸8­CcŒ±&©_¿~èܹ³¤u‡®r4Œ1g¼ÿþûhß¾=ÂÃÃáïïƒÁ€S§NáŸÿü'ºuë†Þ½{#..<ò.\¸ u¸ºQß·mÙ²ÅlyUUvîÜ ???ÄÇÇ;½ŸÊÊJ:tÈlÙÉ“'qéÒ%DGG£uëÖ€ÔÔTÔÔÔ`ß¾}ÛxóÍ7Ѿ}{ÔÔÔ¯+Ehh¨éo/// <›6m‚Á`°(ŸÆjkk±oß>DFFbúôéhÙ²¥iâ¾¢¢Br ¶ :ðÕW_™-¿zõ*rrr$oÇUç»1L:W®\Á[o½…Õ«WcÆŒBÛðôôÄŒ3LÛX»v-¦OŸn±žÒõB©øm×ÛÛ£F±cÇð / 99Ù”7}â‰'P[[‹¹sç"//=ô¤¤Ö}µÚ§hýv¦­ê‘³Ç#õûZ´Ñúíïïoö¢Y·nÝðá‡*“±6µ:(‡h»­jôu¢¤Æ,:Pâš®ö¸»öiÙvm±UÎùùùÈÍÍÕ"$‡¤–¹h{jݺ5.^¼h¶n~~>~ýõW¡øä¶KWÔW¹uÐÞ÷”¸nr_©m_ÉÓ¯ú¿~ûöíCLL Þ{ï=Ìš5 -Z´Ð02Æœóè£bÆ Ây'Öô”••áøñãf˜ͅÛ"’£°5þUkÌno¼­fîÐ5scõÛ¶ö ¡ï¾ûnÌš5 €r¹k%ïÃ]“;ä%EÙ;Þ¦ž;Tû|Ê©ßZÍ}úÌ‹1ýùᇞžnóž5T]]ÂÂB 0yyy.ˆŽ±&„cŒ1FDDååå4mÚ42 d4 €Ã///šÈ××—æÎ+|ýdL/rrríÚµKëPtKûS½‰ŽŽ¦€€êß¿?8p@±\¸-"9 {ã_¥ÆìR÷§fîÐ5sãõÛnݺ5}ùå—týúu:þ<ýéO¢ˆˆúå—_„Û%ïÃ]“óPŽÖQjž@Î}¨¹C%r#r¶ïè3"õç™äÜã»b®ÓÖwäæ$Üß˳aÃ6luíÚ•|||L÷AäççG÷HžžžÔµkW*((Ð:|ÆÜÅ:‘?/ØŒŒ1BëcŒièêÕ«8xð ÊËË…¿ëçç‡ÄÄD¢bînýúõZ‡Àcv&L˜€œœ«¿Ù±Þ/¿ü‚×^{ ÿþ÷¿Ñ¥K<ÿüó;v,ŒF£ £eŒ±æíòåËˆŠŠBmm­ÕϽ½½1eʼûî».ŽŒ1&*66ûöí³Ùž=<<œœŒÏ?ÿÜÅ‘¹ŽÁ`@zz:FŽ)ù;………˜?>6oÞŒ .Àßß÷Ýwþò—¿˜þbÓ¦M›¬þEòýû÷ã¾ûî³»ý˜˜\½zYYY˜5k²³³QSSƒ{ッ¾ú*xà³õ‹ŠŠðꫯbÓ¦M8þñå—_rss1gÎìÚµ ÕÕո뮻0wî\,Z´;wîL˜0}ô‘Ý8¥œokef/Æà¹çž³º~C“'OƲeËðõ×_ãøƒÝ8mùË_þ‚ àøñãèÙ³§Õu”¬ÎÆ/¥íˆÔùz]»vEUUÎ;gvNÆåË—ãûï¿ÇwÞ))F‘º¯tû¬'R¿¥Æ[TT„{ï½ÕÕÕØ¿?Ú´i#©<–/_ŽñãÇ[,/--E`` ñ62qâD‹z0f̬ZµÊé¾Gäûδÿ””ôéÓÇlù믿ŽþýûãÁ4[>wî\¼ôÒKÄêANN&Mš„ÿüç?ÇóÏ?©S§ZmGcÆŒÁÿüÏÿh«³ç¬¡uëÖaÔ¨QvûgÕÏÕ+S½.I©‰öuJ_¿¤Æ,u pøðaYegÚãŽzR®}¶Ú®R}¥­¶.2vª©©ALL ^ýuÌ;Ä7Lß½fš},X€Î;Ë3דRæ"í©¤¤³gÏÆ–-[P\\Œ^½zaÑ¢Exúé§qäÈÀœ9sLõÆ9cµë«­:舣ïÉé·ã¾Òu}e\\<ˆââbxxxH9=’ɹÏfŒYwíÚ5„‡‡ÛüÜÃÃxûí·1räH¡±5czгgOüáÀ{ï½§u(º¤Öý©,\¸Ð4fŠŠŠÂÆ1gÎ:tµµµŠä­ÉQØÿ:3f¬çT·ÕÊÚ£Fn¼þ¾¤ñ¶o¹åÄÆÆâ•W^A—.]d·-J݇×Ç®fLõä–=`^¿Dòúrç œ½u&w(š•šß±·}à·¼Ée«f[’{¯Ö\§­s²jÕ*§âuWjß7—÷Î***pãÆ ”••™þ{ýúuܸqÃ⯄‡††"66^^^E˘>Y¹§XÏ/ñþƒÁ€ûî»mÛ¶Õ:Æc.VUU…³gÏ¢ªª 7oÞDUU•éÿoÞ¼iõ¡ZƒÁƒÁ"!>>AAADÏôèÂ… 8pà€ª51Ƙþüç?cñâŨ««Cff&Ì>?þ<.\ˆ>ø­[·Æ_ÿúWL˜0Añ‡KcŒI“””„mÛ¶Y$ÄëíÚµ tqTŒ1QëÖ­ÃèÑ£mÞ3zxxà£>ÂSO=åÚÀ\H׿Ä{á­Caûøã±dÉÓƒùîÆÝãgŒé;¿ÄËš‡¦xí»ýöÛQQQ_~ùEëP¬jŠeΘڊ‹‹Ñ¦MŒ3Ë–-S|ûz¼ÏfÌ]}óÍ7ˆµ»ŽÁ`€¯¯/vïÞ¾}ûº(2Æ”ñòË/céÒ¥¸xñ"ÿÒn+øþ”1Æsojßó{gÀÍ›7-^ðõõõE÷îÝù—1»ï‘¬÷Ô" ½š5k'3cŒY¨©©AQQ‘é§°°ÐìßEEE=z´ÅoÇgÍWýCMŒ1¦g/¿ü2-Z"‚‡‡æÌ™ƒøøx à­·ÞÂ;#V­ZáÝwßÅÿøGxzò-$cŒiiâĉغu«ÕÏ‚ƒƒùž„171|øp´hÑW¯^µúy]]Å/WaŒ¹ÎÒ¥Kñì³Ïj†lî?cŒ1&Ê]¯}ùùù¸óÎ;qùòe³¿RqîÜ9œ={cÇŽÕ0:ûܵÌÓ aúôéƼyó´‡1æÀ±cÇàééió—izzz" [¶láx™[JKKÃK/½„ììlôïß_ëpcŒ1ÆÜ¿wƳÇÞ{$ü6cŒ1性§'Zµj…V­Zi cŒ1¦ˆ%K–ॗ^2ý»¶¶'OžÄŠ+púôiüóŸÿDxx8Þxã <ýôÓðññÑ.XÆc&IIIGaa¡Ùr///¤¦¦ò/[`ÌMxyyaÒ¤IX¸p!ª««->‰‰Add¤‘1Ö<}ôÑGزe V®\‰U«VáÚµkn5ñîîñ3Æc¢šÒµïÚµk˜2e ^~ùe´hѧN´iÓŒ¿ÿýïZ‡gҔʜ1-\¾|?ýôvîÜÉ÷ûŒ¹“'OÚüëQ^^^hݺ5vìØ.]º¸82Ɣѽ{wÜqÇøüóÏù%^ÆcŒ1Æs!£Ö0ÆcŒ1Æs•+WbÚ´iË žþyüûßÿÆ‹/¾ˆÜÜ\̘1ƒ_àeŒ1ñôôÄøñãáíím¶¼¦¦©©©EÅ“ãé§ŸFmm­Årooo >\ƒˆš¯… Â`0àøñã¸xñ" þö·¿is±M›6!,, ï¿ÿ>Ö®]ëv¿ÃÝãgŒ1ÆD5…k_dd$vìØââbüá@XXyätéÒÄm·Ý¦uˆfšB™3¦•ÈÈHìݻݻw×:Ƙ‡¶ú‹÷<==ѳgO>|˜_àenïÑGÅgŸ}"Ò:ÆcŒ1Æk6ø%^ÆcŒ1Æk&6oÞŒñãÇ[Œ«««CAA^{í5Ì™3~~~DÈcÌ‘‰'âæÍ›fË|}}1hÐ "bŒÉѾ}{ 4ÈâÁ÷›7o"))I£¨š§Ù³gƒˆÌ~æÏŸ¯uXÌ…&Nœ"Buu5Ž?Ž{î¹G넸{üŒ1Ƙ¨¦tí‹‹‹Ã† ðóÏ?£ªª ùùùXµj:uê¤uhfšR™3ÆcöÔÕÕáôéÓË=<<˜˜ˆo¿ý-[¶Ô 2Æ”õè£âÂ… 8xð Ö¡0ÆcŒ1ÆX³Á/ñ2ÆcŒ1ÆX3°sçNŒ1uuu6×!"¼ôÒK/‡1ÆÓnݺ¡W¯^0Këyxxàá‡æ_¾À˜š:u*jjjÌ–ÝrË-ˆ‰‰Ñ("ÆcŒ1ÆcŒ1Æš¯ü•••fË ¦NŠ 6pž5111èܹ3>ÿüs­CaŒ1ÆcŒ±fƒ_â•!&&ƒAòOïÞ½ÍþÝ8ÑÃÔ±víZS™ûúújŽ$ .4Åܶm[ÍâpDz¥—²nªÒÓÓ???S9Ÿ:uÊágŒ1ÆSÇwß}‡aÆ¡®®Îê_á­GDÈËËÃÿþïÿº0:Æc¢&Ož ƒÁà·¾ûÑGÕ8"ƘIIIhݺµéß^^^HMM5µo¦›6mâü~ÂçÓ=ñycõxn‡é‘Þê%÷™Ìô2ß«—ö§§ç+ôR&jÓªÌ-ž [¸p¡Ù:ziŒ1yNœ8aÊÍ F¼óÎ;x÷ÝwM¿X“±¦âÑGÅúõëí>?À˜+ðV¿ôrnܱì}ïdþüùNïS/çN+œczÃïŸ5Ü÷0)8³ SýÍkýÏ”)S™™™fËG…””’““5ŽÚ9eeeèÒ¥ ’’’´E’Ñ£Gƒˆ§u(’Íž=D„èèhMãpDze¯¬Õ®ëJo_omsß¾}xì±Ç0dÈàÌ™3¦›@{Ÿ1ÆcLÇÇ AƒpóæMÔÖÖ:\¿®®sçÎEEE… ¢cŒ1&ÇèÑ£áåå0xøá‡5Žˆ1&‡‡‡¦L™OOO@MM 5ŽŠ5ÖTòûM‘œ¼(ŸO÷ÔÏ›ÞòþzáÊy4>L*½ÌïÖkŽ}&s-=Í÷ê¥ýééù ½”‰Ú´*ó²²2=zœœ "ÂìÙ³MŸë©}0Æä9yò$<==áááooo|þùç˜6mšÖa1¦ŠÔÔTœ;wÇ×:ÖÌñV¿ôrnì•»äðDÞ;Q‚^ÎV8?ÆôHí÷ÏÜ¥?lʸïÑ7½´~‰—IFD¨««C]]Ö¡°f"00ýû÷wù~Õ®ëö¶/ç˜õÖ6ë™3fÌ@`` :uê„óçÏã®»î²û™´ªCŒ1Ƙ^äææ"..•••/ðFxyy™ýÖèàà`Ü}÷݈Ǚ3g\.cŒ1‰‚ƒƒ1bÄÀÀ¢qDŒ1¹&NœhúKžžžnõðcZS:Ï*GsË?ª}¼Z–§ÞÎ¥ÞòþÍ‘ú¦>w>—zŒ]1©IÇ늘\=ߢ;áöÁ˜û;v쪫«ˆ;w"%%EëSMŸ>}жm[lÞ¼YëPSŒïÓ˜º8Ú¼q›gìwܺŽû=Ƥ&w~çÊSÓ½»©cÇŽI^wíÚµ*FâZAAA8{ö¬Öa0¦:µëºÒÛ×[Û<þ< E‹BŸ1Ƥۿ?Þ~ûm­Ã`Œé\yy9víÚ…ÊÊJ³åžžž@pp0‚‚‚húñööTVVâ•W^Ñ"lÆ,¬_¿^•íòõ”¹»‚‚@aa¡é…^ÆÜ™Zý½ÞEEE!11_|ñ €€€­CbÌmè-/ʘ’¸~kÏcŒYÇó½ŒÙÖ”ÛçYs±sçN _¿~X¼x1/^¬uH¬™qežÜ`0 )) ˜;w®ËöËcJr‡^s}ï„1ö;WôîÐ2¦%½´~‰—1Ƙ¢ÿ•?©Ÿ1Ƥ;þ<>ûì3¤¥¥i cL§ª««qòäIÜrË-¦të_ØõññÑ:<Æ$¹pá8 ÚöùzÊÜ]Ë–-„6mÚh cNQ»¿·fÿþý¦kõ Gøâ‹/жm[¬[·NëpíÚµC¿~ý´ƒ1ÆcŒ1¦3<ߢmM¹}|öÙg¸ï¾ûжm[­CaL5ÕÕÕðóóÃý÷ßÏó©Ìå´È“À°aÃðÁàüùóh×®Ë÷ÏcŒ1ÆcÍ 1""@éé鲿?eÊ@™™™6×INN&ôóÏ?ÓÈ‘#)$$„ÂÃÃ)11‘Μ9c±þ•+WhÚ´itë­·’——ÝrË-4|øp:zô¨i7ÓÏéÓ§iĈnZVPP y{¶4ÞOEE…é³ÊÊJúûßÿNݺu#??? £¤¤$Ú¼y3ÕÔÔ8Üvuu5­]»– Däëë@EL§ IDATKwÝu-^¼˜jkk~¿Þÿû_JNN¦àà`ò÷÷§þýûÓ·ß~Kqqqäããc±þÕ«WiÖ¬YtÛm·‘——…††RBBíڵ˴Ný9«ÿyàLŸíرƒÐ_|aZ6cÆ ³õׯ_oöo©ç>::𢢢dÅ,§LEË®1©õPj\ ,0Û^ý‡‡‡Ù~©Óõ—µ­ºÞxù¹sçhäÈ‘Hááá4vìX***¢Ÿþ™’’’(00"##iâĉtýúu‡Û—zÌŽÊÞV¼Rëž5RÏ[ã}ÖÿôíÛ×îgõDÎgöàííMQQQGü1•——Ë.OkÛ·ÕÖ”(ãk×®YÄ8oÞ}(##ƒâââLÛš0a‚PLjçýåö%Rê³è¶EóØõ¬Í£É-_)mNJ#7ßï\1^KKKS}üÑ”¶/:ßÚ¸^®\¹ÒbûyyyDäܧZ×:WÄÔœ®‹ö¨1ϧÅÜhýOÃùÞÆœ9‘k”»=_!ŸÜëÃ2Qê¥Ô3"Ç/·Ì•x–Ä–£GJNN¶Y6RÚ‡Òuï³ÕÞ>czP\\LåååZ‡Áš)­æ-+++)((ˆ–,Yâò}ë•«ïOåè9JkëI{Êï)=®—2¶Sú™c%ž/ägÚ§Ö=—ÒyT‘\¯³½w"r¿d”|Õûï¿/«¼\Qg«««­—ócõ¤Ö#¹¹q)1ª¹mwà.÷ÇJ¾¦Ö»^J炤Ö1¹ó=jÏoë±ïáܼ´<¸šïCZcçþn?­úœíLE:ÑäädÊÎΦ²²2Ú¹s'SŸ>}ÌÖ½téÝzë­A[¶l¡ÒÒR:uêÅÆÆ’¯¯/egg[Ývll,íÞ½›nܸA *((Þž£chXi'NœH!!!´}ûv*//§üü|š={6 Ý»w;ÜfFF ×^{ŠŠŠ¨  €Þ}÷]24{ölIqýøãJQQQ´}ûv*--¥'NÐ!C¨C‡7WÎZ› ¶EN?/:>v·ç+Ôž“¶V&J]£”xfBäøEË\©>Ík/ñ6.‘ö¡wyH™1ƘuZÎ[>ú裯ɾõHó¶H}ŽRîØÓÙgd•׋Ží”zæØÙ\'?ÓîÚ{.%ò¨¢¹^gÙ{ïD´ÍÚ#5_E$V^®®³¶è-?&§‰äL”ê•ضž¹Ëý±ÒïŸ5\_Éw½n×™±H“;ßãŠùm"ýõ=Žbâܼå~”n#ñK¼¸ò%ÞÆd=þøãfoœ=ùä“V,yyyäããC½zõ²ºí­[·ZÝ·èöCÃJÛ±cGºÿþû-ÖíÚµ«ä—x `±|ìØ±äååE%%%·1bÄ@Ÿ}ö™Ùò‹/’Å §~à·fͳ啕•Ô¦Mòóó£üü|""*,,$oooJHH0­W^^NaaaÔ¹sgòóó3ûMǧ+V˜m×Ö¹¯ÿ«_Œ³vÃ#³H™Š–=Žê¡è¹¶×¹*U§å¾Ä»e˳åÝ»w'ôõ×_›-ïØ±#uëÖMòöÕz‰WjݳFô¼Éy‰Wä|Ö·k}vBB‚Ó/ñŠ´µ†ÇäLoÛ¶ÐÔ©SÍ–ïÝ»—¢¢¢èæÍ›²ã“û¯­vlOtt4°øÍ/'Nœ mZ&rΕ¾&:{Ý’‚_:bŒ1ÆœÇ×SÆkø%^ýá—x­Éï‹æÓDr*¢ëËÍ«HÉu9›cQ2÷.÷%^)çÓ{û‘›g´——Sz.H4·iïx•ȹ)yÞ”œ°ÅÖüÊ•+WÈßßßêK¼JäÚ•ÈI‰õ%¢õY´_Sê%^9å+¥Í‰ô1"ù~wÑœ_⽞7ü«—ñññ4cÆ ‹ßÔ®Ô§’}¦+bjn×E[ÔžçsåܨÚ/ñŠŽÝíù µç¤­•‰R×(%ž™9~Ñ2WªO³…_âeŒ1¦-ç-—/_NÞÞÞ’žÓmÜiþ@ês”rÇžÎ>#«Ä¸^tl§Ô3ÇÎæ:ù™v×Þs)‘GÍõ:ËÞ{'¢mÖ©ù*"±òruµEoù19õH$g¢TŸ¨Ä¶õÌ]î•~ÿ¬áúJ¾ëÕp»ÎŒ Dê˜ÜùWÌoé¯ïqçæ-÷£tiÌÞK¼F0—ëÓ§Ù¿£¢¢—.]2-Û´iŒF#’’’ÌÖŒŒD÷îÝqäÈ\¸pÁbÛ÷Þ{¯Õ}ÊÝž ÈÎÎÆäÉ“qàÀÔÖÖrrr0`À‡ßOJJÂîÝ»-–GGG£ººßÿ½Ãm|õÕW€øøx³åmÚ´A×®]-Ö߸q# 11Ñl¹âââPQQmÛ¶ÂÃÃñðÃ#++ ùùù€Í›7£oß¾xæ™gPQQ 6ŠŠŠ°gϤ¦¦Z³ñ¹o×®óso‹HÌ"e*ZvRت‡JœëzjÖi)z÷îmöï6mÚX]%éüªÍ™º§äy³Eä|Ö·…¡C‡Zl'333gÎt*‘¶Ö3eæ©ÏQÊ{*ñŒ¬³ãz%Çv"Ûr6×ÉÏ´kÏÕ”ãÍõªIûtGùª†¤”—VuV.WåÇÔ®GjÞïò½´¾93Ÿ©äü3c‘:&77ïŠùmœ›×WnÞW¿WÂ/ñj $$ÄìßFão§¡®®PUU…’’ÔÕÕ!$$ƒÁìç?ÿùàÇ´Øv@@€Å2g¶'Å’%KðÉ'Ÿà§Ÿ~B\\‚ƒƒ‘`j쎔””àÅ_D=fŠë¹çž”——Ûý~UUJKKáëë‹ÀÀ@‹Ï[µje±~II |}}d±~DD˜Š0nÜ8ÔÖÖâÓO?¬\¹ãÆÃc=¬^½°fÍ$%%Y°<÷ÞÞÞ~?÷öŽQ$f©e*ZvRY«‡"q9¢v–"88ØìßF£ð÷÷7[îáááðüº‚ܺ(wÞl9ŸŽÚ‚³äôõœ)c˜9s&ÊËËñ¯ý ››‹]»vaòäÉŠÄ'ÊV;v$44ÔêòúþäÊ•+²Î¹R×DÀùëcŒ1ÆcŒ1Æš/Gù}@^>MJNEt}gò*Rr]JäX”ʽË%å|ÊáLOJ^Né¹ gs›€ksnjµCŽæWÂÂÂ,–)“çM¤/­Ï¢ýš³ä–¯Ü\¸=RòýLÿäÔ©k×®!%%mÛ¶Eff&V­Zeö¹sœj>› Us¼.ZãÊy>wŽ©ž3×½?_¡÷9i©ä>3!rürŸÒòYÆcÌÝ´hÑ÷ß?¾øâ ­Ca¤>GéÌØS‰gd•×+1¶Ý–3¹N~¦]û{®Æ§œ\¯ZÔ¸Ow”¯jLJyiUgårE~Líz¤æý.ßKëŸ3ó™JÎß9› ’ZÇäÎ÷¸j~[*ÎÍë'7o«ß+á—xuÈÇÇ¡¡¡ðôôDuu5ˆÈêÏÀ5Ù^cƒO<ñvìØââblÚ´ D„ÔÔT¼ýöÛ¿?lØ0Ì›7“&MBnn.êêê@DX´h€ˆ_PP*++QVVfñyQQ‘Åú!!!¨¬¬Dii©Åú—/_ðÛ[þõŽ•+W¢  @JJ """0dÈìÚµ yyyX±bÆçð˜E‰Æ,µLEËÎY¢çÚ`0XÝŽÚuZK¶ŽYKζQGDΧ£¶Ð˜hyÊé”2fÌDDDà½÷ÞCUUÞzë-<ùä“f7nrâ3¸yó¦ÅºÅÅÅŠZ­õ ·V­Z Ÿs¥Û»³×-&]`` ÅàÛ`0Àh4¢eË–HIIÁ¡C‡´³IZ¸p¡©¼Û¶m«øú®ŒÍYk×®5íÏ××Wõý1}Ø´i“Y¿SYY©Y,jÕAW·%ÄÄÄX½®ÙúéÝ»·nê!ã6Ó\éézà \ÏÓ9ù4)9Ñõõ>7¨—{wUžÕ^ÛÕyFWäÍí•«õAÉó¦Ô|„-ŽæW¬=€¨v®]©}‰œú,Ò¯)‘Çveù:ª/RòýLìK9uÊÓÓ;vìÀæÍ›Ñ£GLš4É,®d_­TŸéŠ˜šãuÑVLjÏóéunTN?/:>nHïÏWè}NZm"Ç/çy ¦ú,‰»±6Ol4†èèhL:GŽqz?<èœwdÌR^^^}õUôîÝÁÁÁˆŒŒDll¬ÛþaÆaëÖ­¨©©Ñ:&‘Ôç(µ{ÎëEÇvJ=sìL®“Ÿi×þžKÎñˆæzÕ¢F›u”¯rEŒzŸ Râ^Rn=’š3‘£šÛfîCÏÌ‹Ö15ç{ô4ŸÉ¹y×åæmË•m„_âÕ©ÔÔTÔÔÔ`ß¾}Ÿ½ùæ›hß¾½Ð ³ÒÛk(44§OŸxyyaðàÁ¦‡$·lÙb÷»µµµØ·o"##1}út´lÙÒÔ ***$Ç0tèPÀW_}e¶üêÕ«ÈÉɱXøðá`_UUvîÜ ???ÄÇÇ›–{{{cÔ¨Q8vì^xá$''ÃÏÏðÄO ¶¶sçÎE^^zè!Éq‹³h™Š–\rε¿¿¿Ùà±[·nøðè[§µd TuDä|Ö·…­[·Z¬{÷ÝwcÖ¬Y¦Ë)OÑþA)>>>˜:u*®\¹‚·Þz «W¯ÆŒ3œŽ¯uëÖ¸xñ¢Ùºùùùøõ×_?¨¬¬´¸Á?yò$.]º„èèh´nÝ€Ø9Wº½;sÝbbÊÊÊpôèQ@rr²ià}íÚ5|øá‡Ø¿?xàìØ±CãH›žÙ³gƒˆ­ÊúÎpå¾`ôèÑ "ÄÅŹd¢ÊÊÊÐ¥K$%%¹ä{ÍEJJ ˆÉÉÉZ‡b·:s]Ý–ØoÖ¯_o–Lš2e 33Ólù¨Q£tUÝ}œ½6ãÎ}ª;Çî Í­òµ1}›O“šS]_¯sõÔʽ»*Ïjo?ZäÕΛÛ;^%êƒRçMéù[lͯäçç#77×é˜\Aj_"§>‹ôkÎæ±]]¾Žê‹Ô|?Óž­s)·N!** øâ‹/ˆ””äåå™ÖQª¯VòZ犘šÛuѵçùô:7*§Ÿ7¦÷ç+ô>'­6‘ã-ó¦ú,‰»±6O\]]Ó§Oã•W^ÁéÓ§Ñ»woŒ?Þâ/èˆä<õ>ØTpÞ‘1K“&MÂâÅ‹ñòË/#//@Û¶m‘ššŠçŸ^ëð„¥¤¤ ¨¨{÷îÕ:&@ês”Z=çÇõ¢c;¥ž9v6×ÉÏ´kÏ%J$׫6¥Û¬”|•Ú1ºÃ\÷’rê‘HÎD4F5·Í܇^ž™—ZÇÔžïÑÓ|&À¹y¹”<®n#ü¯N½þúëèÔ©þøÇ?"33%%%(**Â|€W^y .„§§§fÛkì駟Ɖ'PUU…+W®àÿøˆÈá@ÊÃà @~~>,X€«W¯¢¢¢»wïÆÒ¥K%ïÿµ×^Cxx8fΜ‰¬¬,”••á‡~Àرch±þë¯¿ŽŽ;bæÌ™øòË/QZZŠÜÜ\<þøãÈËËÃ;ï¼cúÓàõžxâ À²eËÌ~ËKJJ ‚‚‚°lÙ2Œ3ÆôgΕ&5fÑ2-;¹äœë{î¹¹¹¹8þ<öïߟ~ú >ø ©<Ô¬ÓZ±wÌZPª:"r>ëÛ¬Y³°eË”––âÂ… ˜:u*òòòÌ^â•Sžrú¥L:~~~øÛßþ†Aƒ¡sçÎNÇ7dÈ\ºt ï½÷ÊÊÊpöìY̘1Ãîo±sFHHþßÿûØ¿?nܸÇcìØ±ðööÆ;ï¼cv"ç\éö.åºuíÚ5tíÚ;vÄ¥K—”) à·z2|øp¼ýöÛ¨®®ÆÌ™3µ‰1ÍêêêPWWgñY`` ú÷ï/ü½æÄ^¹>ŒYçê¶¡Äþ´ê¸ù»_Ü—3cÒÈͧIÍ©ˆ®¯×¹†ÔȽ»*Ïê(‡íê<£ÚçÛQ¹:[”:oJÏGØbm~åÔ©S?~¼Åo¬vU®]”H_"ZŸEú5góØ®._)õEJ¾ŸiÏÖ¹T¢NuèП}ö ššŠªª*ÊõÕJ^ë\Ss¼.ÚŠIÍy>½ÎÊéçEÇÇrK«ç+ô>'­6‘ã—ó<Ô¶ÏóÁ®åáለ$''c×®]øË_þ‚åË—ã±Ç3û+:œóä<œ–¸ì™ˆ… "11èС>þøcDEEaáÂ….ý«Jèܹ3î¸ã|ñÅZ‡ÂH}ŽR˱§ãz‘û:%Ÿ9v&×ÉÏ´kÏ%J$× ¨{/¡f›µ•¯rEŒzŸ R"$Z±œ‰hŒjn›¹%æs%µŽ¹b¾G/ó™çæåRúY—¶bDD€ÒÓÓ…¿÷ñÇ‹ŸÒÒRÓ:û÷ï·øü…^0í·áObb¢é{………ôì³ÏÒm·ÝF^^^Ô²eK2deeeÙݶ­Ó*e{¶lܸÑbcÆŒ!"¢cÇŽÑ”)SèŽ;î  §ûî»–-[Fuuu·]PP@S¦L¡víÚ‘——EDDÐSO=EÏ?ÿ¼i_½zõr¸œœJII¡àà`òóó£>}úЗ_~Iqqq¦íL˜0Á´þÕ«WiæÌ™Ô±cGòòò¢Ч;wÚÜG—.]¨}ûöÇõÔSOúþûïÍ–‹žû Ø\_$fÑ2-»Æ¤ÖCѸNŸ>M>ø P»víhÉ’%fÛs¦NÛ*k[uÝֹ݉+Ê—ׂœhT4§¢FFÎq:;7Ðhî]nžU霞£ü£Ü[ÎöíÍÕÕÕQß¾} }úé§NÅçŽó€öè5ßÜ”ç¤êéµì™ûóPÏÎýÝ:Ãÿ\³g0žžŽ‘#Gj cŒ±fìã?Æ’%Kpøða­Cƒ«W¯âÂ… Z‡¢¹uëÖaÔ¨QPk˜¥öö•tìØ1Ü}÷ÝHNNƦM›Ì>»xñ"Ú¶m (..FHHˆ!6i¢íÒ•íØÕ}Æ Aƒ°wï^TVVºdJ DLL öîÝ«u(ºå¨ŒRRR°yófTTTÀ×××ÅÑ™S«6åë¯;\OŸ~úi|ðÁÈÌÌDBB‚ÕuôT™zm†ûlm¹ÓõÀÜ­žkq3bÄÀúõë]¶OwâŠòá|¼9=ß»1Æä¹ýöÛQQQ_~ùEëPlR³/á~ê7îœïoÈã5Ÿ1ÆâëˆúšÊ5ŠýNíûl9Û·7O\oÕªUxâ‰'п|ûí·²ãsÇy@{ôšoný³^Ëž¹Î;ãìÙ³8uêºwï.ù{zxè›o¾All,rssÑ¥KÍâÐߟ*§9\7Xóà¹^¦MížEÏôxÌk^ìÜß­—þ÷æcŒ1¦º¥K—âÙgŸÕ: Æ\bÏž=€îÝ»›^à-((ÀôéÓÑ¡Cx{{£eË–HMMűcÇ,¾/eÝM›6Á`0˜~rrr0räH´hÑ´ìêÕ«¨ªªÂ‹/¾ˆÛo¿þþþǰaÃðÅ_ ¶¶Öá±ÔÔÔ ==ƒFdd$üüüУG¼óÎ;¨««ŽG´,9}ú4 8ûöí“üýÂÂB<ûì³èÔ©¼½½†¡C‡b÷îÝv×õññAÛ¶m1hÐ ,_¾6÷±jÕ*³²1 ÈÏÏ.‹Ó§O#%%!!!Àƒ>(4Éš’’bCÿþýMŸíܹƒ¦e3gÎ4[¿¦¦Fv}¨OÒ-\¸ƒ7nÜÀ¾}ûLŸ{zzÚý^ãåçÎèQ£Š-Z )) gÏžµ[fþþþ¸÷Þ{ñå—_bРA¦mMœ8ÑaÙI©'rclÌQ5–ŸŸ/i?J´;©uÐÖyàTŸd¯-1m¹¢Ö· ƒÁ€¶mÛâСCˆ‹‹CPPÝþ_«ë¯5jµ [œÝŸÔþHN¹9ê#ùz ßëH]u‡q–h93ÆcÍE~~>ÂÃÃQ]]m¶üܹs8{ö,zè!"czÁù~ÆczÅ×(¦õóp@uuµÝ|-àü< ^×^³¸¸Ø"ÿ6þ|Óþ.OKK³›è¡­Ü»Ôc¬§UÞQɹgçÝ•ýüùó­ÎõÕW¦å·Ür‹P|}ô‘"yrÀ=êµ»Ì]93µbÅ œ={]»vÅwÞiÿ¤éÐý÷ßÐÐPlݺUëPcÌå8×ËcŒ1—õ·}› ¨ügÓcŒ1k–-[F)))TZZJï¿ÿ>uéÒ…ª««µK–èèhŠŠŠÒ: ]HOO'5‡Yjo_IG%”œœlZVRRB6l V­Z‘——eeeÑ¥K—èÖ[o¥ˆˆÚ²e •––Ò©S§(66–|}});;Û´ ‘u‰ˆ’““ ÅÆÆÒîÝ»éÆtàÀòðð ‚‚š8q"…„„ÐöíÛ©¼¼œòóóiöìÙ€vïÞíð8322½öÚkTTTDôî»ï’Ñh¤Ù³g[¬ï(Ñã³%::šBBBhàÀ´wï^*--¥C‡QÏž=ÉÛÛ›öìÙc±~ãvœ——G;v¤ˆˆÊÈÈ ’’ÊÉÉ¡ÔÔT2 ´lÙ2‹u###)##ƒ®_¿NùùEœog IDATù4oÞ<@‹-²¹¯ššzöÙgiðàÁTTTdZ.R?þø#…††RTTmß¾JKKéĉ4dÈêСùøøH*·%K–Z½zµÙò§žzŠÐ¨Q£Ì–oܸ‘âââLÿ–[***Ì–Ð<`3N[ß«_žœœLÙÙÙTVVFYYYäççG}úô1[×Z™:uŠ D-[¶”\f"õD4F{¤–QÃýìܹ“‚ƒƒ-ö£D»“S­G‘>Ij[rGîp=2e  ÌÌL›ë¸ºýV/¨_¿~¦}Úêÿµ¼þÚãlÛ°W6ÖÆ¬ÎîÏ^$·Ü¤ö‘|=Ðßõ@jÝq§q–”r–K‹û›´´4JKKsé>݉+ʇóñæDs*œƒaLòòò?ž~ýõWºqã}÷Ýwtï½÷Rxx8={VëíR³/i®ýTSÊ÷7äŠñÏc 5×눚šê5ŠýNíûl9Û·6OÜXEE téÒ%Órk9O¥æåÎãIÉaÆÇÇ“Ñh¤3gÎXl§_¿~s¶HÍwÚʽ‹£òŽJÌ%(5ïî¨ìm}Þ«W/jÑ¢…p| ×q&OîõÚ]æ®äÌE}ÿý÷4}út2F”T& éå9 #FP||¼ÖahŠïO•ÃãzæNÜ=×Ëô/..Nò= sŽïcÍ‹û»uÚßõéw¦Œ1Æ´°lÙ2@žžžÔ³gO:räˆÖ! [°`ib­þç…^Ð:,M¹ÃKG®R?9ÛðÇ`0P‹-è‘G1›¼xòÉ'­¾8™——G>>>Ô«W/Yëý>³uëV«qvìØ‘î¿ÿ~‹å]»v•üï€,–;–¼¼¼¨¤¤D(Ñã³%::šÐþýûÍ–Ÿ8q‚Ptt´Åúèõ/®®Y³Ælyee%µiÓ†üüü(??ßl]kãê„„›“¼×®]£øøxš1cÕÔÔ˜}O¤,FŒAè³Ï>3[÷âÅ‹äãã#9VXXHÞÞÞ”`ZV^^NaaaÔ¹sgòóó£ëׯ›>>|8­X±Âôo¹õAé—x322Ì–§¥¥³Én[evåÊò÷÷—\f"õD4F{¤–Qãý<þøãûQ¢ÝÉ©ƒÖΣHŸ$µ-¹#w¸žŠ¼ÄëªzHô{ÿôèQ³åÖú-¯¿ö8Û6ly‰Wdöú#¹å&µäëþ®RëŽ;³ˆø%Þæ„_âuÑœ ç`ÓŸ;vÐðáéC‡äííM4fÌ«7ë…š}Isï§šB¾ß~‰—1æ*Íý:¢¦¦zb¿ÓãCÊR^â-//—ü¯Ró€rçñ¤ä0·mÛFhêÔ©fëîÝ»—¢¢¢èæÍ›’b”šï´•{9F=䕘KPjÞ]­—xí›yrw¨×î2w%g.ÊÃÃZ·nMÓ§O§‹/Z]ǽ<ôïÿ›|||¨´´TëP4Ã÷§Îãq=sWî˜ëeú·fÍ‹>q„ Z‡Õ¤éñþ˜1Ö¼Ø{‰×ÆcŒifâĉ "TWWãøñã¸çž{´IØìÙ³ADf?óçÏ×:,¦3ÉÉɦúQWW‡«W¯bóæÍèÓ§iM›6Áh4"))É컑‘‘èÞ½;Ž9‚ .¯Ûн÷Þk5¾„„dggcòäÉ8pàjkk9990`€ÃãKJJÂîÝ»-–GGG£ººßÿ½ÕïÙŠGîñYãë닾}ûš-ëÑ£Ú´iƒãÇ#//Ïî÷7nÜHLL4[îãヸ¸8TTT`Û¶mfë:Ôb;™™™˜9s¦ÅòœœôíÛF£‹/†‡‡‡Ùç"eñÕW_âããÍÖmÓ¦ ºvíj÷8 ÇÃ?Œ¬¬,äçç6oÞŒ¾}ûâ™gžAEE6lØ(**ž={ššjú¾Üú ´†í Úµk¸té’i™­2kÙ²%n¿ývÉû©'¢1*¡ñ~¢¢¢,ö£D»SªÊ铵%¦=WÕÃzˆ‰‰1[f­ÿ×òú+ÊÙëµVû“[nJõ‘|=°½µÚ¡ÔºãNã,Ƙ:Ds*œƒaLâââ°aÃüüóϨªªB~~>V­Z…N:išMjö%ͽŸj ù~ÆÓRs¿Ž¨‰¯QL¯êóÔ^^^¸å–[쮫ÔŒÜy<)9Ì!C† GX¾|9 MË,X€iÓ¦ÁËËKrœRØÊ½‹£žòŽÎÌ%¸bÞÝRŽÍ™<¹»Ôkw˜»’;7´k×.¼óÎ;hÓ¦ýBй¡C‡âæÍ›Ø³gÖ¡07Æãzæ®Ü1×ËôoôèÑ}âG}¤uXŒ1Æ4Â/ñ2ÆcŒ1ÍUUU¡¤¤uuu Á`0ûùÏþøñÇ…Öm, Àêþ—,Y‚O>ù?ýôââ⌄„Ó¤¥#%%%xñÅÑ£G„……™byî¹çåååV¿g-gŽÏš-ZÀ`0X,oÕªàÊ•+6¿[‹¯¯/‚‚‚,>ˆˆäçç;\ךk×®!%%mÛ¶Eff&V­ZeuÿRëEii)|}}hóx¥7njkkñé§ŸV®\‰qãÆá±Çƒ‡‡V¯^ X³f ’’’Ìö)·>(-$$ÄìßÞÞÞ€ºº:pXfaaa’ö#RODcTJãýF³ý(Ñƒ¢}’£¶ÄôÁõ°¡ÐÐP«ËöÿZ_E9{½ÖbΔ›R}$_lïG­v(¥î¸Ó8‹1ÆcŒ1ÆcŒ15ìÝ»Я_?»/*9#wOjsæÌ™(//Ç¿þõ/@nn.víÚ…É“'KŽQ*[¹w©Ç¨·¼£3s ®˜ww†”cs&Oî.õÚæ®\=¥7‘‘‘¸û™™©u(Œ1ÆcŒ1ÖäðK¼Lq £Ñˆ°°0DGGcêÔ©8räˆÖajbÓ¦MfåRYY©uHº´víZSùúújŽ$ .4Åܶm[ÍâpDz¥—²vWyyyxõÕWÑ»wo#22±±±Í&ÙÌôËÇÇ¡¡¡ðôôDuuµÅo«ÿ8p ÐºR <ñÄرcŠ‹‹±iÓ&RSSñöÛo;üþ°aÃ0oÞ>> Aee%JKK->¿|ù2€ß&r­k§§'vìØÍ›7£G˜4i:d¶‘z„ÊÊJ”••Y쫨¨HRLõŽ•+W¢  @JJ """0dÈìÚµ yyyX±bÆgö]¥êƒµ—¯•ä¨Ìì½àÝx;Rë‰Ò”*#%Ú’uP´OrÔ–˜{Pºÿ/,,´Úß4ìÿµ¾þŠröz­æþlõGz(7Gøzð;¥Î—”ºãN㬆ÇÅ”Ã÷çL+éé鈉‰ŸŸŸ)ÇvêÔ)­Ãrkjäýù<ý®)Ì«4…cÐBS™ hó6îJOmS­zâŠv¤§rdÚrÇþN/×w,;wæìXÛV½ÑK}r'uuuX²d à™gž±»®’s0JÎëZ3fÌDDDà½÷ÞCUUÞzë-<ùä“’Y"à|Nê1ê%ï¨5r F£7oÞ´X^\\¬xü"Ü¡^î1wåê¹(=zøá‡ù%ÞfŠÇ¥Œ1ÖtÅÄÄX¼ßcï‡ÿ‚ºúΜ9ƒÁ€µk×jŠ®ÙŸ8[†Ü.š½åòø%^¦¸²²2=zœœ "Buu5NŸ>W^y§OŸFïÞ½1~üx—ý2½HII!99YëPtmôèÑ "ÄÅÅiŠd³gÏþÿì{tTÕÙÿ¿“ûä~1† ¤áÖÒQøqIHB MHƒAn¢&`ÑB hQ¬ö-Tß é2-6]¯@Œ² K %€(ºHE…d$HbBžß®™f2sfö>sΜ3Éþ¬•?²Ïž½ŸýìgßžçìRRR4•ÃuÇ‹3]777cðàÁÈÊÊR¥nµË÷………xùå—ñ?ÿó?¨­­ÅñãÇѯ_?äææbåÊ•Z‹'èåäææ¢££•••vÏþô§?aÀ€èèèàÎËBdd$Ο?ð÷÷Ç”)S¬/íÞ½Ûégoݺ…ÊÊJôéÓK–,All¬5¸×ÒÒÂ,CW”l_ss3Μ9c“öŸÿü555HIIA||¼ÓÏϘ1ìôÐÖÖ†Àh4"##Ã&ï|`WÎwÞ‰eË–Ù¤………!!!¡¡¡xÿý÷ŠœœÔÖÖZóðèbêÔ©€={öØä«¯¯GUU•Óvv' ùùù8}ú4V­Z…ììlFÀ¼yópëÖ-<÷Üs¨­­ÅäÉ“­ŸSÒ‚ƒƒm‚ÀC‡Åßÿþw®2\!¥3“É„êêjærxìDI”Ô‘ãN)ä“XÆ’À;Prþommµ»Ìíhþ×rýåÅõZíúœÍGZë±ü%ú‹Õv¼iŸxfoÒ›çsTVVâ@zz:êêêðÅ_ˆ—Ë@i¿¿è'[zB\E«6(åÏ–[Ž»õë%îâ.½!nã­èi~qf'îŒ%OŒ#=éQ`'c›Þ8ßée­QkðVÔl³{m)»Ñ‹=yO=õ>þøc̘13gÎt™_‰ŒqÝîbñâŸrå ^zé%lÙ²K—.å*Ã?oõàwT¥} ñññ¸|ù²M9&“ ß|ó Ò³á-v xGìJN,ª££Æ c®CïL:_}õ•U‚Þƒ7îé@i´ò‡{‚wß}׿‹N-Z(//·IÏÏÏ×XR࿨½?ãÂ}ô>ÿéÍ—'.ñ <‚¯¯/âââƒâÉ'ŸÄ믿ŽxÀíozú#44ãÆóx½D„ÎÎNtvvz¼|­ÚìW²¬[·Ó¦MCHHˆ×^{ X·nó¯l jð / )) ?ü0ÊËËÑÔÔ„ÆÆF¼úê«øÃþ€uëÖÁÏÏ;/+>ú(Ξ=‹¶¶6\¹r/¾ø"ˆÈ悦#|}}1qâD˜L&¬]»õõõhiiAEE6nܨº.\‚Ç}ônܸ“'ObîܹÀ† ˜dILLDQQvíÚ³ÙŒêêjÌž=µµµØ°aâââlò.[¶ »wï†ÙlÆ¥K—°xñbÔÖÖÚy»2pà@lÛ¶ uuuÈÍÍE[[·.žþyDGG£¨¨ûöíCss3>ûì3Ì;¡¡¡Lúêʼyó%%%6¿¶›““ƒ°°0”””`Μ9ðñùï±JI{¸ë®»P]]o¿ýÇŽ×_~‰ñãÇs·ÃŽtvîÜ9<ôÐC\¿”Èc'J¢¤Ž”wJÚ Ü9Ij,]½zC† Abb"jjj¸dx%çÿˆˆ<ýôÓ8vì˜Óù_ëõ—¹cCíúœÍGzЛ+Äzð_”ê/Ûñ¦}‹žçÎ ƒÁ€¯¾úŠ[ï½q>xKréÒ¥ ERR¾ýö[üìg?S¥>=ù˼‰ÞÚOz‘ÃôÖ¥üårýâjûëVô66yÑËXÒ£õ(“šÈi¯^ìG =ö¡ÚcOÍ6{z¯-°¥³³W®\ÁÎ;‘ššŠ_|?ü0¶lÙÂô˳JÄ`Ôˆë:bñâÅ0xæ™g––†Aƒq}Þ'oõàwT¥} éé騩©Á+¯¼‚ææf\¸pK—.Åí·ßî‘ö8Â[ìðžØO,ª¤¤!!!xòÉ'¹õ¡WÆŒƒ˜˜‡—ûÁgR飼·õ“À}„?\à-ˆù­wàé~VÚ-ìÔ$ ""TZZªµ=†O>ù„Pvv¶Ãç4fÌ@o½õ–‡¥Óžììl@---Z‹¢kRSS)00Pk1¸HII¡„„­ÅÐ\w!!!tß}÷©Z‡^tmÁmfEŽ,S¦L!ôÏþS%©z¥¥¥¤æ6Kíò•"$$„Øü :Ôéghùòåôãÿ˜üýý)66–ÒÓÓiß¾}²ò;vÌNGº;}ú4-Z´ˆ~ò“ŸPpp0EGGÓ=÷ÜC%%%ÔÙÙé²­uuu´hÑ"êß¿?ùûûS\\-X°€V®\i­säÈ‘Ìòðê¢;k×®µ–@ü1Mš4‰BCCÉh4Ò„ èÈ‘#ó[þV­Ze}^__OEEE”˜˜HþþþAtàÀ»º»ç§Y³fQuu5mݺծ®õë×;ÔÍœ9s¸uQUUE999NF£‘FE»ví¢ÔÔTk¹<òˆKZmÚ4‡: ¦{ï½—>L'N¤àà`f]±Ø‰\¥Ò‘ÜzÜwXmÐYÿ³ÌI¼c©¡¡’’’hÀ€tùòeæöh‰ž×Ó×^{Íá|n6›­y´´CË^ù³Ï>£ŒŒ s8ÿË©SÉõ×îŽ )¤Ö:¥ê“šÜÕ›3›ëkýk5ylÇ›öY®ì|òäÉJLz² Åù&//òòò}`4‘œœŒ 6Xr\nÛëêê°dÉ 8ˆEnn.NŸ>Í$?‹l,œ?999ˆˆˆ@HHÆ#GŽHæg鳜œ›vwí·À`0 ¬¬ÌšVTTd“Û¶m6ÿ_¼xÑe_9ƒÕ®yuÊ«»îìØ±Ã¦UUU¸ÿþûcM«¯¯g–kݺu0 ¸qã*++­eøùùÙÔë®í±´¥µµÕaú×_üü|„……!&&óæÍÃÕ«WqñâELŸ>aaaˆGaa!Ìf³ËòYÛ숶¶6<ûì³6l‚ƒƒéÓ§ãý÷ßÇ­[·¸u&W–7Þx.\À!CðÓŸþ”Yç@ ð~L&¢££möãpñâE\¸p“'OÖH2@ x±܈°dÉ„‡‡cõêÕZ‹ãÕˆó¹>QÓ÷Ê⛓Sww,õìܹ`4a0pÏ=÷XËbõI²ø³Üñ—9“ß]ÿž\?Wßn`` úõ뇴´4¼þúëhii±ËÏâ÷wÖN½õ“R¶\__ï°Ý¼ö¢T\Å‘Ürãj´U÷R°úË]µY®_\ês<ý#¥}îròº·(‡ǦV;q6–xì½;›7o¶Ûc˜L&‡yõ¨GV™Xâ³,kØ?þñæuNκéj.–»·RË~,ˆÿQ+ƯÔzî¨Þàà`Œ=»víBZZ𵬂‚I}(9ö¤PËníµÕzH ظq#–/_®µ¢»î=dff¢££ÔZA”:ãXÎ/¼{zµý„ŽÐƒ¯§;âL*Ï߯”ÏZ©w™åœ”8KKÁz^“{~a± 5ËfÁÒgƒýúõÉ'ššŠ°°0cÒ¤I¨¬¬´û딥ÿÔð‡³Ê¨T¼BIÜ9ß \3hÐ fÍšeMS2¾ÇÒ¼ãNî8U+ÆâH‡j£Ä¸ðôšÈ²ßX¹r¥¢>hw÷,ñy5㪢èua/â…å—x[ZZ šš""ª­­¥ÄÄDŠ‹‹£²²2jjj¢ªª*ÊÍÍ%ƒÁ@%%%.ëÎÈÈ úâ‹/ìž;–¶lÙbýŸ·>©o9r$ÅÄĸ”Í‚åÛ=³³³éèÑ£ÔÜÜL ððp5j”MÞ²²2@Ï?ÿ<566R]]ýå/!Z±b…MÞÌÌL§më­·¬ÿ×ÔÔÐ~ô#Š‹‹£Ý»w“Ùl¦sçÎÑ„ (((ˆŽ=ê²<²IñùçŸSdd$%$$Ї~Hf³™Îž=Kééé4pà@»oÌàé³ââb`ÓçDD , ”ŸŸo“¾}ûvJMMµIsÔWûöí#£Ñh×WDŽ¿‰GfòêΖvN˜0***èÆtüøqòõõ¥ºº:î¾vö­JØ‘ô·^H}{®%=77—Nž}¨¬¬Œ®_¿N&“‰V¯^Mhýúõvò±øýYÚ©‡~RÚ–Áú JÇU¤ÊvðD”ò£»ò—³¶Y®_ÜÑçxû‡ç|£†Ï'¯’q=Ñ[~‰×ScSŽ8KãðîK=é'ìŠÖ¾gˆ3)Jù¬•|—ÙÙsGçž6Lš4‰¢££éرc.Óåœ×xäVêýc%Êf!%%…BBBhìØ±VÛpøœ·¯-¸JØ‘üK¼»wï¶I>|8 Ã‡Û¤'&&ÒСC™Ë—³ÉHLL¤{ï½×.}È!6›0^±ÊâëëKñññ´dɺ|ù2—ìçˆKGÀ›Ø¿?͘1ƒHGsæÌqxA@ ð$b=ågíÚµÖs¶åoÕªUZ‹%ðÄz Ð q‰Wçsq‰×1jú^]ùæx|ÞÎpv9”Õ÷ÇêÏ"Rﯻþ=?¿Å·ëÈ^333^âeñû;COý¤´-;ƒõå¥ã*ÎÊ–Šx¢ JùÑ]ùËYÛ¬ô%^žþá ž«ásçÉ«dÜFOô–K¼ž›rìÄÑXâ™ë»Ž£«W¯RFF-]º”:::\ÊkAozt%ï{,k˜«k%ßevöÜÑ9€§ &_ƺ¼ IDATL ¨¨(»K¬ŽÒåœ×xäVêýc%Êf!%%…Ð'Ÿ|b“~öìY@)))Ö4ž±ÆÓJúÃåÎîÆ+XpvYQ©ó½xóùX©¹’·ÿxÆo~o‹±xb\hµ&²ì7ôp‰—5>¯T¼ÑÓ—x} hDmm-Àßß·Ýv`ûöí€iÓ¦Ùä Djj*ZZZ°wï^§å¦§§#99¯¿þ:¬ék׮ůýkøûû[Ó”¨ÏFeóBB ¦¦Æš–••åðçÕSRRÐÞÞŽO?ýÔš–ššŠ;ï¼ÓaÛ‹ŠŠl~~|ÇŽðññAVV–M¹}úôÁðáÃqêÔ)\ºtÉ©ü<²I±gÏ@FF†Mzß¾}1dÈ»ü<}ŸÿüçØ·oL&`çÎ3f {ì1´´´à½÷Þ466âСCÈÍÍu(g÷¾êß¿?Û¾’‚GfòꎅѣG;LW¢¯-(a{îp÷ÝwÛüß·o_‡é Lýë™™™8zô(.\ˆãÇãÖ­[€ªª*Lœ8ÑšOM>? ÉÎÎNkZSSž}öY$''#** ƒƒO<ñàæÍ›6eüæ7¿±kû?ÿùOXóXÚÞÙÙ‰ˆˆk™–¿ÿû߀Ï?ÿÜ©ü¼²u§­­ f³AAA µ{~ûí·Ûåçí³ùóçãÖ­[xë­·›6mÂüùóñÀÀ××[¶llݺYYYåìû* €m_Iµ‘GfVòꎕ‡éîöµ¥lÏÂÃÃmþ÷ññ¯¯/‚ƒƒmÒ}}}]ö¯»ãÍ7ßÄ—_~‰ÔÔT„‡‡#33Óºùô¡3@ @ ú¾W)ßÀæó– ïÅŸ¥6žòï¹òíJÁâ÷—ƒ§ûI-[v5â*Re³ÆxqÕOú„=Õæ®(op„Ò>wÞ¼jÄmžÃcSI;áë¯^½Šœœôë×åå娼y3s]<èaŽsç=–5ÌQwÚ¥Å\ìÎ^AÄøõãwÕNWõFEEɪ·;j¿ƒ£‡³ˆ@ ½‰qãÆ!$$ÐZ”^Òg¹{z-ü„Zúzä"ΤŽQj?¯¦oÑjœIÔ>¯©iój–é0Ý2?]¹r…{¬iq¦tg>ÐÂ_dAwlz+JÆ÷xûeÜñæïI1%Ç…Ök¢šq\wá‰Ïk¹'pq‰W  (..<öØc~ø‚ˆˆ´¶¶Âl6Û}æ»ï¾ð÷.¸bΜ9ˆ‹‹Ã+¯¼‚¶¶6¼ôÒKxðÁm6³rêóññÁ÷ßo—÷Úµk.e’ËôéÓ±zõj¢ºº "¬_¿@D6ùóóóÑ¿›¶ÚLbˆŒŒ„ŸŸÚÛÛí¾íÎò7iÒ$EeëN`` ÂÂÂÐÚÚŠææf»çvùyûlÚ´iˆŽŽÆ¦M›PWW‡ãÇ#''qqqHOOÇÁƒQ[[‹7ÞxóçÏw*¯xefÕ)¯îÜ…·¯ ƒÃr”²=="ÕfWŸ™7oöïßk×®aÇŽ "äææâÏþ3y:“#‹ g3bĻó¿»ï¾ÛæÿÖÖV­›Ð£Y·nU×ýúõs™.ððöÛo[í(((H±r…}º^t¨–¨]voG/ö£g„ý ÜEØ@ p„'}¯ÝañyË…Ç÷ÇâÏêšW°úù]ùv=§ûÉÓ¾\%íÅÝØ…\”jƒ7ùÑå´YÍþQÚçΛדq;z›JÚ Ï\~~~Ø¿?vî܉äädâĉ\õ)’sœ³5L©÷XñÄÜ­äZÉk?]1~ï‰ñwm³z»¿„é ­Æž;vË‚ï €¯¿þ¿øÅ/pýúu­E‘Døã£GýèQ&AÏ`åÊ•(--ÕZ €qãÆaß¾}Z‹ÒëQzŸ%gO¯•¯JK_‹lŽgRéÏ+[Pê]f <ç5Î$rÏko^x}¬þ,@ž¿Ìðøù-¾Ý>øÀîÙwÞ‰eË–©#d7´ê'Oúr•²¥brPÒæ½ÅÎÛfµûG Ÿ;O^OÅm|èml*e'‹w_ª•¯Jk_3Ä™”ïLª„ÏZéw™¾s€Zg9ç5¹ymCͲYimmµûò¹ÿüç?¨©©AJJ âããð5%úOÎ8Ðb>Po•ÛÛQ*¾'§ÿXÇoþžcQj\hµ&² t|ßyÓY|^Ëx°»ˆK¼ÐÙÙ‰+W®`çÎHMMÅ‹/¾ˆ‡~[¶l±¹]ÿ / 11EEEصkÌf3ª««1{ölÔÖÖbÆ ÖŸwÅâÅ‹a4ñÌ3Ï -- ƒ ²ËÃ[_zz:jjjðÊ+¯ ¹¹.\ÀÒ¥KUûyv___Lœ8&“ k×®E}}=ZZZPQQ7J~náÂ…ˆˆˆÀ3Ï<ƒœœ$$$8l{RR~øa”——£©© xõÕWñ‡?üëÖ­ƒŸŸŸâ²uçùçŸGtt4ŠŠŠ°oß>477ã³Ï>ÃܹsêPn^™7o ¤¤Äæ›xsrr†’’Ì™3>>êL‰¬2óê”Wwr‘Ó×wÝuª««ñí·ßâØ±cøòË/1~üx«>ܱ=½â¬ÍÎxôÑGqöìY´µµáÊ•+xñÅAD6g^±ÈRRR‚<ùä“Ê)AЫ!"tvvªâ¸ Ÿqã/×j¶I Ðz°q=È ¤Ñj Öjë¡7Î…½±Íâ|î}xÂ÷*‹Ï›9¾?àÚG5wî\ |õÕWn·ƒ?¿Å·»lÙ2ìÞ½f³—.]ÂâÅ‹Q[[ë±K¼Zõ“'}¹rý«ÝQ*v!¥Úx·Ížè¥}îäÛ büÞãg©÷ܹsx衇¸9G˱çŽÝºBí÷´:ÿè•ëׯcúôéøå/‰ÇÜæ™ðK ¼ a³½‡¤¤$lß¾üãñÎ;ïh-ŽG˜2e púôi­Eéõ(½Ï’³§Wê¼Ã»/ÒÒ×ã q&å?“ºë³Vú]f€ÿÀچɓ'#&&Çw™.ç¼Æçà± 5Ëf%""O?ý4Ž;†7nàäÉ“˜;w.°aÛúyÆš»gJ9ã@ÍùàêÕ«2dQSS#« -ä8G©øoÿ±Ž;ÞüžŽ±x˸ÐbMdAi´;󦳸¼–ñ`·! ÒÒR­Åè„„„›?ƒÁ@”œœL¿úÕ¯èÔ©S’Ÿ¯¯¯§¢¢"JLL$Šˆˆ ŒŒ :pà·,………€>¬H}×®]£‚‚Š'£ÑHãÆ£'NÐÈ‘#­mýío+Y×±cÇìt³jÕ*""»ôiÓ¦Q]]-Z´ˆú÷ïOþþþG , •+WZóŽ9Ò®®'žx‚Й3g$åihh åË—Óücò÷÷§ØØXJOO§}ûöI~¦+reëNUUåääPxx8F5jíÚµ‹RSS­å<òÈ#ÖürldðàÁ4`Àêìì´I_°` O?ýÔ&·¯Ö®]+™ŸGf^òê®;ŽÚéhià•ëüùó4~üx ¡þýûSqq±MyîØž”®·oßn—>gÎɾMeð)))”Àœ.ðššJŠ—+ìÓ}ô¢CµlIJ½a=Õµí§'¬ÁJØvOЃ@>j΂Ðb>ÎËË£¼¼<Ö)…ÏçžÐ·ûã•ò½²úæºÂâóîŽ#¿:vìñùþxüY®|T“'O¦ÐÐPêèèp*¿Rþ= ¼~þî¾Ýøøxš5kUWW;•HÚïïMý¤–-wGJ5ã*Jõm`Õ½¼þr)YäúÅ}޵\Å]¡–Ï'¯»q=â‰ýššû=M ¬vâl,±ØûÖ­[í>¿~ýz‡mï:¶½E®Ö0–ø,ËƳÎÉ]7YtÆ‹t×~\!büÿE­¿Rë¹£zƒƒƒéÞ{ï¥Ã‡Óĉ)88˜©ß‰”{R¨e·®öÚDìç)»qeO¬ç¹êž³•.ÕªUäççG—/_¶{¦W¬^â9zEúñ”LzµYzÌœ9“úõëGíí튕©×¸egg'ÅÇÇÓÿþïÿj-ŠÇÐSü ;Jq,ðîé•òòì‹ôàë‘BœI]¿Û¥|ÖJ¿ËÌ/àiÃøñã)**ŠŽ=Ê”.u^“ŠUóÆ9xl^ͲY°ìá>ûì3ÊÈÈ °°024aÂ:räˆ]~Ö3(Kÿ©ág•QÎØlhh ¤¤$0`€Ã³•¯½öšÃyÅl6ËÒ­Þð¶óqW”Œïñôï¸ãÍïÉ‹7Œ O¯‰<{ %}Ðrʳà*>ÏÓ~¹¾}:ÂÂÂÂÂB˜Íf»òêêê°dÉ 8ˆEnn.NŸ>m“U'Ýå»xñ¢SäÛš\vµ€€DEEaêÔ©¨¨¨°æY³fõ³ãƳ¦ïٳǚ~Ûm·I¶»ªª ÷ß?bbb¬iõõõ’m€óçÏ#'' ÁøñãŒÕ·›7o¶Ó§Édr˜W-,¸ê#¹}ÏbïJô%‹Ydå™kXm„§½rË(Çùóç1mÚ4DDD8\×xç#gk°3äÌß»½»Ò«ý±Ž=¸»Þ{r.”Ú³tÏ'ÕJí¤Ú,×~ºö}pp0F]»v!--ÍZVAAK]ñÎa,:ËÉɱiS×ñwàÀ ”••YÓŠŠŠlòoÛ¶M–NAϦ'ø¼‰K–,Axx8V¯^­µ8@ AÇd2!::ííí6é/^Ä… 0yòd$ëùˆó=gΜÁwß}‡””›tWþXÖØ ¯Ï–Õ‡Úg11OÅ’xËa‘‹7®î¥bÚÝQ*þ®Tÿ¬\¹RV,E ^¹»±hwßp†\;â‰K*9Îxã1#FŒìÝ»—K/ÞÊ”)SPYY‰›7oj-ŠÀËû"@ A¯G‘ßúí@åŸMx†’’ÊÉÉ!³ÙLûÛßhðàÁÔÞÞ®µX@ èe”––’šÛ,%Ê_´h òòrÉ<ÙÙÙ€²³³éèÑ£ÔÜÜL ððp5j”dþ––kZAAEDDЇ~H7oÞ$“ÉD+V¬ TQQÁ$kHHÝwß}Ÿedd}ñÅvÏÆŽK[¶l±IKII¡;v¬µM'Nœ ;èСC.ÛT[[K‰‰‰Ô§O*++£ëׯ“Éd¢Õ«WZ¿~=•••zþù穱±‘êêêè/ù ùøøÐŠ+ìäMII¡„„¦tÞvKai_nn.ù„Ìf3mܸ‘вeËlʨ©©¡ýèGG»wï&³ÙLçΣ &PPP=zÔš—W'Žlpß¾}d4ílÐ][ãÑ©Åââ⨬¬Œššš¨ªªŠrssÉ`0PII‰Íç¥lxäÈ‘#Ùî &PEEݸqƒŽ?N¾¾¾TWW'Ù†Ï?ÿœ"##)!!>üðC2›ÍtöìYJOO§R`` d]rÇmwûìèè åË—Ó”)S¨±±QRV%epOeff:íû·ÞzËú?½wm›³¾t4ÆyäçW¼6ÂÓ^9öç oXOµ&%%…"""hÒ¤ItäÈ2›ÍN×5ÞùÈÙì žù›wNu¯ýñ®GÎôÀ[–+©1ºÚ³ðöû©6wMg±G}îÜ9JKK£ØØX湇׆xtV\\Lìög , ”ŸŸo“¾}ûvJMM•­oD‹ù8//òòòùä›ô³gÏJIIqÙ&Ë… G{ÇÌÌL›K¼'N´Ë3wî\ò÷÷§¦¦&;ÙX/ñò¶[ KûvïÞm“>|øp@‡¶IOLL¤¡C‡Ú¤=øàƒ/¦ÔÖÖR`` 9Қƫ)ÌË˳³AwmG§غu«MÞÖÖVêÛ·/F2™LÖt¹Ó>øÀ¥Ü]™9s& mÛ¶Ù¤_¾|™™/ñò貫}^½z•222héÒ¥ÔÑÑÁ,·sOíß¿_²ï `sA‚ÇÞ»¶ÍY_:ã<òóŒ+^ái¯ûs…7¬§ZcY׺¿à!µ®yú/ËüÍ;§:‚×þx×#W—xyÊ’B͹ÐÕž…·”Ø?Hµ¹k:‹ýHõý•+W(88˜yîáµ!544P@@effZóݼy“¢¢¢hРAd4éúõëÖg3fÌ 7ÞxC¶N¼q‰WˆK¼úBø¼@ 5â¯@ ô öïßO3fÌ R@@ÅÅÅÑœ9s^®xÞô’ò‹/¾H¨¸¸ØásÖK¼R±Ÿ-«•ˆ=&¦F,‰WåðÊÅWW3¦mA‰ø»ýãÊf'L˜@QQQvK¥ÒyýÁrcÑîúøYà±#ž¾QºåÄc  4Èá39è=nùÓŸþ”ëËk½q>øàòï¹çžÓZL¯cëÖ­vz|ä‘G´K6,vb—¶jÕ*­Ex!Þt>Öšµk×r;ÞüAoÅÙ%^=ˆ‚‚ÚÛÛqæÌÜu×]Z‹$×3jÔ(›ÿ555.?›™™‰£GbáÂ…8~ü8nݺ¨ªªÂĉÝ–-==ÉÉÉxýõ×ÑÐÐ`M_»v-~ýë_Ãßßßî3!!!1b„MZrr2úöí‹3gΠ¶¶ÖiÛ·oL:ÕîYyy9ŠŠŠYYY¨¨¨°Ë“’’‚ööv|úé§®(œv;ãî»ï¶ù¿oß¾Óìú}ÇŽðññAVV–MzŸ>}0|øpœ:u —.] _'Ým°ÿþlmÐ][ãѩŦM›fSF`` RSSÑÒÒ‚½{÷º¬Ó£GæÊ¿gÏ@FF†Mzß¾}1dÈærä貪ª cÆŒ^~ùeøúúrÉ®„ ]áé£ÔÔTÜyçû¾¨¨~~~Ö4{ï o_òÈÏ3®xm„§½JÙŸ€Ÿ   Œ3Æ&g]S–ù[‰9•×þ”\£Õ\ ]íYäö;ûXìGªïccc1lØ0æºxmˆGgÑÑÑøùÏŽ}ûöÁd2vî܉1cÆà±ÇCKK Þ{ï=@cc#:„ÜÜ\‡r²èD ô<„Ï[ @ (Ajj*Þ{ï=|õÕWhkkƒÉdÂæÍ›‘””¤µh‚^Fkk+pÇ3»#{áñÙ²úP»â*&æ©X’RåÈ‘ËݸºÒ1m%üñZôÏ¡C‡ÐØØˆ±cÇ2¥[PÛ¬¶ß«ñôÒý('ãç燖–× è!¤¥¥áÀZ‹!t¹üûýﯵ˜^ǬY³ìôøüCk±dÃb'ÍÍÍvikÖ¬ÑZt G³bÅ ®qÇ›_ Ø#.ñ @ œaó¿Ï[ÈÎÎN—Ÿ-..Æ›o¾‰/¿ü©©©Gff¦5 ªEEE¸yó&þú׿ª««qðàA,\¸ÐaþÈÈH‡é·ß~;àÊ•+’uµµµ¡©© AAA s*WSSž}öY$''#** ƒƒO<ñàæÍ›.Ûæ Þv;#<<Üæøúú"88Ø&Ý××צß-úèììDDD„µ–¿øqsÎ IDATÿû߀Ï?ÿ€|t·Á€€¶6¨„­±èÔ• ÄÅÅ€õ’Ž;„„„0çmkkƒÙlFPPBCCíž[ì›^]^½z999èׯÊË˱yóf溔’¡+rúè7¿ù]ßÿóŸÿDAA]¹¬öÞ޾䑟u\ñÚO{•´??1110 vé,ëšÚ¸š¿•˜SåØŸ’k´šë½šs!k>g} wÿÀ ‹ý8ëû¨¨(¦zäÎ<:›?>nݺ…·Þz °iÓ&ÌŸ?<ð|}}±eËÀÖ­[‘••åP€mO$@ @ è™   @{{»[åHÅ^xâ&¬q_ ®bbžŠ%9ÃQ9rår'®nAɘ¶»þx=ôjûƒÕöñ[`±#Þ¸¤Òý('ÓÑÑ£ÑÈ¥ ofÒ¤I8sæŒÍ…|@ @ ð!.ñ tÃ×__üâ¸~ýºÖ¢TdݺuV§Y¿~ý}:V¯^ÂÂBTWW£³³D„õë×€Cxàm·"22~~~hoo—ü¦¼I“&PW'JØ‹N]ÙÀwß}à‡oùµàããƒï¿ÿÞ.ïµk×x›)I`` ÂÂÂÐÚÚŠææf»çÌeñêÒÏÏû÷ïÇÎ;‘œœŒÂÂBœ8q­ö¸ÓŸrú(??ýû÷·éûÂÂB›—6xí].¼ò³Ž+^ái¯’ö'à§©©Éaº£uw>rµ»‹œñê¨ ^ûã]œéA¯këžE‰>Ð W}Ïz]ÎüÈ«³iÓ¦!::›6mB]]Ž?ŽœœÄÅÅ!==Dmm-Þxã ÌŸ?ŸIn@ °àMþ;oô· ø}¬Þ4Ö-{ôJKK1bÄF«ÍŸ;wNk±n²cÇ›Ë –_ÔµÖ¥çi5Æ‚šk‰7®­}¢§ùÂ[ˆ íÛv×/Í7aûZpóT,‰¹r¹W· dLÛ]¼Zý£v,ÅžˆE»‹ñÆ%•îGÞxÌõë×ADÖù¬7ðÿþßÿüë_ÿÒX+ÄÕ±W“¦§ùîzºí÷´þò¼Ño ;ñFÝ ôƒ7¬ÝR6®—1(pL÷ûŠZÝ»—xºàôéÓ¸ûžžn÷-oz¢¹¹ƒFVV–Ö¢x-+V¬!%%ÅcuΚ5 D„ÔÔTÕé.ZèÉÞ¨;¥pÖjÏrË/,,ÄSO=…ßýîwªÈ%È!22çÏŸøûûcÊ”)ÖCÖîÝ»™Ê¶ : :ÿûß­ÿbñâŸrå ^zé%lÙ²K—.•,¯µµÕî‚áþóÔÔÔ %%Åe eÆŒ€>øÀîÙwÞ‰eË–áÖ­[¨¬¬DŸ>}°dÉÄÆÆZƒw---®Ío»Õ"77¨¬¬´{ö§?ý  @GG‡ê:QÂÖXuj±îå¶µµáÀ0ÈÈȰ¦ÇÇÇãòåË6yM&¾ùæ®6ºbêÔ©€={öؤ×××£ªªŠ¹^]†……!!!¡¡¡xÿý÷ŠœœÔÖÖÊn‹»ýÉÛG~~~Xºt©µïß~ûm,Y²Ä®\V{wVùyǯð´W)ûðÓÜÜŒ3gÎØ¤I­k¼ó‘«5X xÇ«#xìOÎz$¥½¯m,{–®ùÜé­ê{“É„êêj·Ë‘šÃxu€üü|œ>}«V­Bvv¶õúçÍ›‡[·ná¹çžCmm-&OžÌ,·@ Þå¿Ó‹ÏS ¢ÕÃÙX×CìÊ‘ z°=èFàý8³£ÊÊJ<ðÀHOOG]]¾øâ Í_Αk÷b¼Ø’““"Bvv¶Ö¢¨¶(9O+1<½–ÈÙG‹q"p„žæ oág?ûàÒ¥KŸ»ã—æõÙ²úP-°ÄÄ<KâEŽ\îÆÕåbÚJùãÕèOÄRœá©X´\X툧o”îGÞxŒEß–ù¬7””:tHkQNÚ—÷æ}¬Ø«I£ßR¨åŸÑÓØéIýå-xSüÍ‚^ìÄu'ÐÞ°vKÙ¸^Æ ÀG÷µºw#.ñ 4çúõë˜>}:~ùË_âñÇW½¾ÐÐPŒ7NÖs"Bgg':;;ÕO ¸ÀÕöjÏÎÊwÖþ¤¤$lß¾üãñÎ;ï¨"›@ ‡G}gÏžE[[®\¹‚_|DÄ|Aá®»îBuu5¾ýö[;v _~ù%Æo“gñâÅ0xæ™g––†AƒI–§Ÿ~ÇŽÃ7pòäIÌ;ذaƒKy^xá$&&bÙ²eؽ{7Ìf3.]º„Å‹£¶¶Ë–-ƒ¯¯/&Nœ“É„µk×¢¾¾---¨¨¨ÀÆ™ÚÍO»Õâ…^@RR~øa”——£©© xõÕWñ‡?üëÖ­ƒŸŸŸGtâ®­l:µØ@QQvíÚ³ÙŒêêjÌž=µµµØ°aâââ¬ùÓÓÓQSSƒW^yÍÍ͸pá–.]ÊôíÔ<<ÿü󈎎FQQöíÛ‡ææf|öÙg˜;w.BCC¹Ê’«ËbÛ¶m¨««Cnn.ÚÚÚd·Çþäí#X¸p!"""ðÌ3Ï '' Ëe±wwa•Ÿw\ñÚO{•´?!!!xüñÇñÑG¹\×xç#–5Ø]äŒ×îðØŸœõHJz_ÛXö,]ó¹ÓZá¨ïÏ;‡‡zˆë׃å̼:›7o ¤¤Äæ×vsrr†’’Ì™3>>Â]+€%üÕîúݵŒŸ‰¸ž@mœÙÑ»ï¾ "ÂÒ¥KФ¤$|ûí·š¾Ì/7ƤÇñ≘ âŽî —~Sb,è¥-Îðêáíó…žHIIÁí·ßn÷å”ÜñKóúlY}¨ŽŠ‰y*–Ä‹¹Ü«[P"¦­”?^þqe³“'OFLL Ž?nó9©t^<‹– «ñôýÈ9}ú4€tß›˜8q"***´Cà©}ùðáÃ{ü>VìÕz7jùg¼é (Æ€@ ozÛímíè©ûŠšÝ»! ÒÒR­Å蕬ZµŠüüüèòåË©/$$„î»ï>ÙÏÊ’’B ­355•=Z§»h¡'GèIwž£zé ,íŸ9s&õë×ÚÛÛ=$• ;¥¥¥¤æ6Ëò_{í5`÷g6›­yŽ;f÷|ÕªUDDvéÓ¦M£í۷ۥϙ3‡ˆˆNŸ>M‹-¢Ÿüä'LÑÑÑtÏ=÷PII uvv2É|þüy?~<…„„Pÿþý©¸¸Øa¾ÂÂB@‡–,Ë2¦?ûì3ÊÈÈ °°024aÂ:räˆ5Ÿ³6Õ××SQQ%&&’¿¿?ÅÇÇÓ¬Y³¨ººÚš§®®Ž-ZDýû÷'Š‹‹£ ÐÊ•+­eŽ9’Ö®]ëPßRérÚÝ©>>qâ„]ú /¼@ÿú׿ìÒŸ{î9ky ´|ùrúñLþþþKééé´oß>›zYuÂkƒDÊØN»Û@DDeddÐìò^»v (>>žŒF#7ŽNœ8A#GŽ´¶ã·¿ý­ÃvóŽõªª*ÊÉÉ¡ððp24jÔ(Úµk¥¦¦ZË{ä‘GÜ·[·nµûüúõë¶¡ëØéŠÚsOYxâ‰'9sF2‹½³ô¥«1Î*?븲Àj#<í•[¶+ô¼žjMWûIHH ?þ˜&MšD¡¡¡×5 ¬ó‘Ö5Ø‚œù›HÞxíýñŽgzà-«;žž íYXû@©ýƒT›åÚO×¾¦{ï½—>L'N¤àà`&=u/‡e“c·ƒ¦Øõß‚ }úé§6éruâmh1çååQ^^žGëô&<¡@øã•FOþ;WèÍß&PÑÇê¡ÖXWÓï®¶=ˆ¸žúxb¿æ­û³ÜÜ\@---Z‹Â„·OÈ몎ììlÝô±Zk€ó´ÚcA͵ěöÑmÑû|¡ö9[éòŸ~úiÉwŤü±¬q4^Ÿ­+ªœ˜˜R±$xÊá‰ù°ÆÕÕŒiwÇÝø;xôê*–2~üxŠŠŠ¢£G:M—ëv'íÎ;,°ÚOßðäeíGÞxÌÌ™3)!!¾ÿþ{.}8Ãâ–ï¿ÿ> ª««ÓZUñÖó)‘÷Q•Dï{5=Ó|¹½Éö¥úËÛ|>Þ„7ú ô2®µÒÏǽmŒ*Ñ^oX»¥l\/cPð®î+ªqïÆÉùî0 (--Åý÷߯µ(½ "B||< „#GŽx¤ÎÐÐPŒ1B²>WÏÊ0bÄÔ××ãÒ¥K«3-- GŽAkk«Çêt-ôä=éÎÓcT/}`¥ý[·nÅìÙ³±cÇdgg{P:…wÞyùùùPk›¥vùÞÊk¯½†ââbœžØ¯yëþ,'';wîDKK ‚‚‚´Ç%Þ6^0HNNƆ ÐÙÙiWGCC–/_ޤ¤$¢_¿~HKKÃë¯¿Ž––IÙ6oÞl£GƒÁ“ÉÄܶ®tÕmHHÆïtÐU怀DEEaêÔ©¨¨¨°æÉÉɱ‘mܸqÖg€Á`@YY™5­¨¨È&ÿ¶mÛdÙ‰;2üýÇ«;gtUUU¸ÿþûcM«¯¯g–ÑÕµÀ2¸ë\ðõ×_#??aaaˆ‰‰Á¼yópõêU\¼xÓ§OGXXâããQXX³Ùì²|Öö?lþ`ïÞ½Š´Y ð6n܈åË—k-†Çé­íV¡S@ ¼“É„èèh´··Û¤_¼x.\ÀäÉ“5’L ôfX}]Jø•Ýñß±úÐä¶GÊØk×®Ùù…׬Yc­»kz^^žd{äø¾yôÀš—UJøüY|ñjÛ#+ÎüÿJ÷\[èΚ5kÆöìÙcM¿í¶Û¯×ëX—ò'l±%ÞØ˜#›þÇ?þ!)C÷6M›6Í뮹:×c\Oà9Xâer×(GŸínG;wîF ÜsÏ=’²*käÞ6^Xcb¬ñRwê°`2™˜Ú®DœÒSk€}¨¬¬Œ®_¿N&“‰V¯^Mhýúõ62tý™øŽŽZ¾|9M™2…mÊ4iEGGÓ±cÇ\¦;ÒíÙ³g)==h§[‹ÌqqqTVVFMMMTUUE¹¹¹d0¨¤¤Ä𷏏˜Ð–-[lÊX°` üü|›ôíÛ·SjjªM8Ò¯Ì<ýÇ«;V,mž0aUTTÐ7èøñãäëëKuuu\29£¼ó Žú k»¤æ‚ÜÜ\:yò$577Ó›o¾IhêÔ©”MŸ|ò ™ÍfÚ¸q# eË–1—ïjŽ""jjj"4~üxîö ”¡´´”ÔÜf©]¾·PRRB999d6›éoû <˜ÚÛÛ~FjL{rÚ-pŽÐ©@ OÄz*\Q[[K衇¢o¾ù†nܸA}ô=𢣣éÂ… Z‹(`@‹ù8//òòòW"¾¨æþ…§-Îî+ZPãÞ“óÝ;ú?õyˆžüÒžyñÅ Û=KLL¤{ï½×.}È!6ƒÿÁt¸¹©­­¥ÀÀ@9r¤MºÚ—xËÊÊlÒóòò€ÍcæÌ™€¶mÛf“÷Ê•+l7™³ê‚•””@Ÿ|ò‰MúÙ³g ¥¤¤XÓÊÊÊhâĉveÌ;—üýýmé– ¥£±”™™)y‰÷êÕ«”‘‘AK—.¥ŽŽ»ÏN˜0¢¢¢ì'GéRº½|ù2ÚéÖ"sw[kk+õíÛ—ŒF#™L&""jhh €€ÊÌÌ´æ»yó&EEEÑ AƒÈh4Òõë×­Ïf̘Ao¼ñ†M¹|8 Ã‡Û¤'&&ÒСC™ËgÝØ 4hË|u—ŽW"¾¨æþ…§-Îî+vEé{7Î.ñú@ ÐÖÖV€¿¿¿Ý³ÌÌL=z .ÄñãÇ­?½]UU…‰'ZóíØ±>>>ÈÊʲù|Ÿ>}0|øpœ:u —.]R¯Ý5j”Íÿýû÷ÔÔÔXÓöìÙÈÈȰÉ‹aÆٕɪ BBB¬?ým!99}ûöÅ™3gP[[ ÈÊÊBEE…ÝçSRRÐÞÞŽO?ýÔš¶}ûvÀÔ©Síò———£¨¨È.½ªª cÆŒ^~ùeøúúÚå9tè1vìX—éRºíÛ·/† bW¶EæiÓ¦Ù¤"55---ÖŸFŽŽÆÏþsìÛ·&“ °sçNŒ3=öZZZðÞ{ïqèÐ!äææÚÕ °Ù‰<2óô¯îx=z´Ãt]¡§ùàî»ï¶ù¿oß¾Ó˜ú???´´´(^®@ ' @DhooÇ™3gp×]wIæ]±bˆÈæoÍš5”V9xÚ-`CèT ï%55ï½÷¾úê+´µµÁd2aóæÍHJJÒZ4@ÐK‘ëërǯÌë¿ãñ¡Ém”/PŠôôt$''ãõ×_GCCƒ5}íÚµøõ¯í0† «ï›GrýŽRzp×çÏê‹WÓYpåÿW»XmAiÜ­W©±®Fl‰wl[ ˜1clÒ<Ñ,¨×xžxYWäÚ±(kÔ¢z/rû_.ÝÛžÀ¶íJÄ)µ\Xâö¼(î¾ÕŽƒwÅ}k¿Éµwâ×JØ·»s =)y¾àÅSó… wÐ=¾íèï÷¿ÿ½¢u*W牿jÑN|Xú«¹¹¹Ç¼Ÿ!°eüøñðóóÃáǵEW°úêäîã”òÕuÇ“þ©3¬§÷EZìÕÔê? J¼§Êê»SÚO.…Úg~%ý¦Z¿'Ì‚šq›P³_ÝíSq÷ÀswÔˆ[x;jú¹•^Õ^ÓÁ²v÷´ø<Àwª+Jô¹'Æ©§ü”Îî+vÅ“÷nÄ%^¦ÚÛÛížãÍ7ßÄ—_~‰ÔÔT„‡‡#33ÓºP@[[šššÐÙÙ‰ˆˆ ›¿ÿû߀Ï?ÿÜ3 aó@@ ³³Ó*³ÙlFPPBCCí>e—Æ¢ ^"##¦ß~ûí€+W®šššðì³Ï"99QQQVÝ>ñÄ€›7oZÛÕÔÔ„   „……1ÉpõêUäää _¿~(//ÇæÍ›e·Ç"ƒ3ÝZÚÖ5¿3™ãââÀºi€ùóçãÖ­[xë­·›6mÂüùóñÀÀ××[¶llݺYYYå\Û‰³6òÈÌÓ<º“CHHˆÃtV]¡·ù <<Üæøúú"88Ø&Ý×××e¿Ë¡££F£Qñr@ @ ÒÈõu¹ëWfõßñúÐä¶GÊ茢¢"ܼyýë_ÕÕÕ8xð .\ÈU‹ï›Gîø¥ôàŽÏŸÇ¯–=²àÊÿï‰>`ƒ(;õ*é«W#¶$gl@LL ƒ]ºÚ}Á‚q=úȉñYkÇJ¡T¬Q‹vèe¼¸ÓÿréÞvŸ^µéÚvwã”Z®JÇí-(îï>Bí8xWÜÙGñ¼##Çþ寝•ŒÃ»3òÚ“Rç ^<1_@ aaa¸ë®»^’è­°úêÜÙÇ)á«s$'ýŽÎ°Zì‹´Ø«©Ñ]Qâ=Uß~rGxâ̯¤ßTë÷„YP3nÅëãW«_ݹˆ»ž»{ FÜ›QÛÏ­ôú«öšæWk7Ðóâóî DŸ{bœzÊOéì¾bWú#FŒpøXìQ³šó§¦ì´¤4Æ öÚ¨#×O¤äuõêUˆˆùKDDDDDDDD®¡v®K)­æïÔΡéu<¶ :‘‘‘xï½÷PRR‚·Þz >ú¨êÆ”Ì}«)=æ™óW3ïÊów«êæÿ]q”>©Š——nܸa•^PP`÷3ÎìW˹z5õLïgc¶ž¶ËDm™»ãs=ÒŸ#ÏøÜ…‘Ï=­½TõLP«ó¯U™hÑ_0êhÿܾ‚ž}c5ý£žƒ«¥ôW_ÿ´ì;s T[Ÿ´_Tp§ë‘‘bbb¸ˆ·¥suî6ŽutüæÈ\YU1hÕ/ª }5-ËV-%sw®*W´=ÞÉw”V罪6à.csµçUMÙ8ûÌ…k\·öÀÚŸ+¹bžS)W\Ïõž‡¾UM{>¯5µûWÓN]ÝQ{,U­W¬àêu7\ÄK†jß¾=ØüºõzõêáèÑ£~ýú길8¬\¹&“ ëÖ­3çKNNFii)vìØaµY³f¡iÓ¦(--5§X\(î¸ãÌŸ?_ñßµ0`Àÿûzõ 9998~ü¸U~¥e¡Fqq±Õƒ·C‡áüù󈎎FÆ QVV†;v Aƒ˜8q""""Ì7U[_þðÃÖ¯_oõ·N:aÊ”)iÁÁÁˆŠŠBPPV¯^   $%%!;;Û¡cì—í¥K—pìØ1»1ßZŽ%%%ؼy3üýýoN÷õõEjj*öïß矉‰‰æÿº0|øp”••áå—_Fvv6úöíëðqTEiÌjÏŸÚ²Ó‚ÚªÛ¨Úë'RrÊÊÊð¿k,éÏ‘¹.5´š¿S:‡¦÷ñÜÊÏÏãÇÇÅ‹ñÖ[oañâŘ4i’êí(™ûÔÍ%j=ïè윿’¹xWŸ¿[)™ÿ×û(­ Uiذ¡y¾µBNNΞ=k÷3ÎîW«¶®¦žéýlìÚµk8pà€Eš½2Q[æîø\\Cí3>waä³FOk/UÅ«ÕùײL´è/qôyn¯w_DMyñÜJÏ›×?­úÃŽ^©OZ/*¸Ûõ‚ˆˆÈ(½zõÂñãÇùO­*QúÞ¬»c¿92WV­úE5¡¯¦uÙª¡tîÎUe£w[Ñã|GiuÞíµw›«=¯jÊÆÙsʵ®[{àNíÏ•\1Ï©†Þ×sWÌCW¨iÏçõ¢fÿjÚ©ý5ÇRÕzÅ ®^wÃE¼d¨èèhÜvÛmVÿ üãqðàA”””àâÅ‹øÛßþ±è Ìœ9-[¶Äc=† 6àÊ•+ÈÏÏǼyóðÊ+¯àÍ7ßD:uÌùï¹ç?~?ÿü3víÚ…S§N¡W¯^Šÿ®…¿þõ¯¨_¿>&OžŒŒŒ \»v ‡ƨQ£ìþ§ %e¡Fhh(ž{î9ìÚµ ¿üò ¾ýö[ 6 ¾¾¾˜={6€_¿~¼OŸ>ÈÉÉÁo¼K—.¡¨¨[·nÅܹs­¶9sæL4oÞS¦LÁºuëPXXˆsçÎaüøñÈÎζZÄ[Y³fÍðÙgŸ!77ÉÉÉ())1ÿ­oß¾ÇîÝ»->c+ÝVÙ9rÆ ³ù5ö1Ož<k×®Eaa!Ž?Ž?üáÈÎÎÆìÙ³iñ™áÇ,X`ño’’’Œ `èСðòÒç«4fµçOmÙiAmŒ@ÕmTíõÀ)¹Fíß¿п#B$""""""r{çÎòeËøc㧪T5GæºÔÐjþNéšÞÇcËøñãáïï^xýúõC«V­ToCÉÜ7 n.QyGgæü•ÌÅqþì±7ÿ¯÷9PZªÒ¿œ?ï½÷®]»†“'ObÒ¤IU~›®³ûÕr®^i=ÓûÙX`` &L˜€o¾ù¦Ú2Q[æîú\ôçÈ3>waÔ³FOk/Õ=ÔâükY&ZôŒ¸ܪªçöjèÝQSÞF<w”Òwd\}ýÓ²?ìÈ5ÐÑúTÕøbذa0™Løé§ŸÅín× """£ÜÿýðòòÂöíÛÅm(}oÖÝÆ±ŽŒß™+«ŠVý¢šÐWÓºlÕP:w窲qE[Ñú|GiuÞíµw›«=¯jËÆ™sʵ®]{ ô\©·»3WÌsª¡÷õÜóÐjÚóù jÖOé±¥íÔˆþ‹šc©n½"`{ÝÍå˗ѦM4oÞçÏŸ×ö„DD€¤¥¥F­ôÜsÏI:u$++Ë"}ÿþý2nÜ8¹óÎ;% @êׯ/÷ÝwŸ,X°@ÊËË-òæååÉÓO?--Z´‰ˆˆþýûKFF†ÕþŽ=*½zõ’ÀÀ@iÒ¤‰Ì™3GÑßW¬X!,~†*»ví²JþùçED¬Òxàó~Ž;&III"Ò£GùòË/¥OŸ>àpY(-QQQräȉ—àà`ñ÷÷—Þ½{ËöíÛ-òæææÊ¸qã¤I“&âãã#‘‘‘2räHyöÙgÍÇÕ¹sgsþK—.ÉäÉ“¥yóæâãã# 6”!C†ÈñãÇEDdÉ’%VåòÎ;ïØ,Ç¡C‡ŠˆH¯^½$,,LvîÜi›½ôÊeëïï/]ºt‘µk×Jll¬yÛ?þ¸Ý˜CCC%>>^6oÞl· [·n-M›6µ*ÿ‘#G ùá‡,ÒÕÖ“7ÞxÃn~51«=jË®*¶ŽÙÖmGmŒÕµa5׃ªØ;j¯{÷îµJŸ9s¦|ýõ×Vé/¿ü²Ýí+=~‘AƒITT”ܸqCÕ1“vÒÒÒlÖwOÙ>‘;àý”ˆ¨v0âzœ’’bs΂?ÿûIIIÑõ5w>^é\—óÊÎÌß)CsæxnmÛÕÍyV3fŒ/¿üRuù«™ûVSJó*Õbοº¹xýëã­™ÿ×úTP[ì)((Ñ£GKÆ Åßß_zöì){÷î•Î;›eÚ´išïWi[¯j>YM=³7ﬤNÛ‹¡r›ŠŠ’={öHLLŒUY&jËÜŸëÕ4®è¯¥¤¤8ÔÿPò¼LéµÙ{õÈV:Ùµk—âØµxÖ¨´=Vð´öRÝ31Gžñ*݇£Ç®ÅsJWݹoߪº¶ ´/¢ä^rëyP[ÞÎö£µn'¶¨¹w;zýsäùµ#å]µ×@õïT°7¾èÛ·¯Iii©¢˜ÝñzQ ï8[ïíÕvžöÜ2::Z¦L™btºÐj|jk®ÎV>5ý8Ûý‹ªúåÕÕŽß”ÎÛ¨‹kÑ/r§¾š£ût¦léç;:w§åç&òU­WÔkÝMÏÕ–;þ×D Åš5k‡:àÉ'Ÿ4:$Ýåääà®»îÂ… àããcN?}ú4Nž<‰aÆyªS§N!99ÿ÷ÿǼ5\=––ftD5Nnn.&L˜€—^z íÚµSü¹ýë_8qâfΜ©ctD¤5ÞO‰ˆˆˆÜÓܹsñôÓO‘Ÿë)ÇöBDîæÖñ…ˆ`âĉ ÁŒ3 ŒÌ³p.Ýsá믿ƦM›pæÌ4kÖ Ã‡GûöíMSGŽÁ_þòÌ;aaaF‡CTãõìÙsçÎEaa!‚ƒƒ‡Äñ¹#ŽÛ‰HKöÖ+µî†‹xÉ-têÔ ß~û-&L˜€áÇ#$$ÄètwùòeŒ7ùË_ŽÃ‡ã©§žBHH^|ñE£Ã#"4oÞ<¼öÚk\À[ 4nܘÿʼnHsçÎE`` ž{î9øùù)þœRRRƒˆˆ#$"-ñ~JDDDä.\ˆuëÖaÑ¢Eøä“OpùòeöÓˆÈíð¹‘rl/Dd¤êÆ.\À©S§°yóf4hÐÀÀH= ÇhžçÇÄܹsñïÿ7oÞÄC=„… ¢_¿~F‡¦‹… "((cÇŽå7G¹Àoû[”––â›o¾©±×•Ú‚ã7""r7·‘Öl­W4jÝ—K÷FT…fÍšaíÚµµboƒ °iÓ&à·¿ý-ÂÂÂðÐC¡uëÖØ³gZ´h¡z›&“©ÚŸ   ˜L&8pYYY0™Lxá…t8Bªé”Ô·éÓ§¦]ž¿=³fÍâ^""'ddd OŸ>ªð@ll,¼½½±eË"#"""""ªÙV®\‰°°0¼ÿþûXºt)êÔQ÷?hß|óMÎ}ãêë`ͦÇs=¢šŠí…ˆÜAUã‹ `ûöíh×®飤¤Ë—/G\\îºë.lܸ/¼ð²²²°lÙ²½Ð.33­Zµâ^"iذ!Z´híÛ· 9ã7""rG·×\5uýy†[×+µî†ßÄKdØØXÄÆÆj¶=Ñl[DÕñôúæéñ‘öÊÊʰmÛ6¼ôÒKª?‚®]»"##©©©:DGDDDDDTs=£GvjS§NÅÔ©S5Šˆ<™Quu°æÓú¹QMÆöBDFÒb|AäiŽ?ŽÿûßX¸p! ‘˜˜ˆŒŒ ÄÆÆÖšE­™™™hݺµÑaÕ*½zõÂ×_mtä$ŽßˆˆˆÈU¸~ƒˆßÄKDDDDD„={ö ??ýû÷wèóqqqøâ‹/4ŽŠˆˆˆˆˆˆˆˆˆˆˆˆˆÈÒ7Ìߺ۶m[|òÉ'˜0a~þùgó·îÖ–¼ñ¡gϞؽ{7nܸat(DDDDDD‹x‰ˆˆˆˆ¨ÖKOOGTTî¼óN‡>‡sçÎáÇÔ82"""""ò4;v„ÉdRüóꫯ²&Þ|óMó15nܸÚtw°råJ‹sQ\\ltHª¹Ë1¸Kµ™'¶A""Gðžã~Œ8'K—.5ï¯nݺºï¯&q—¾'ŸCOŽ<_VV¦OŸŽ&Mš`È!€´´4œ9sÓ§OÇm·Ýfp„®'"8yò$ñ¹X¯^½pýúuìß¿ßèPˆˆÌÜe¼S“±ŒDZ$q/ÕzˆwøóݺuCXXÒÓÓ5ŒŠˆˆˆˆˆ<ÕòåË!"æŸqãÆ6lØ`‘žššª{,×®]CëÖ­1pà@]÷3uêTˆ¢££¥»ƒ¤¤$ˆÅaŽƒu¢&”¥§óÄ6HDäÞs£gŸÐˆs2dȈbccÆUýbwç.}GΡ»ðäØÉ3•——cÓ¦MPm)3"2Vvv6fÍš…-Z >>—/_Æ’%KpæÌ¼þúë¸ýöÛÑ-œ8qЪU+ƒ#!ª]L&î¿ÿ~lß¾ÝèPˆÜJuc…ªþÎyÛÚ«¦Ô ½cåÜyº:F@DDDDDd¤Í›7£¬¬Ìéÿr‡©S§¢¤¤~~~EGDDDDDžfÿþýŠó.]ºTÇH~Œ“'Oê¾ò¬DDDµïÿ,"ò åå娲e æÏŸ•+W"((ÇÇĉѲeK£ÃsK™™™Fdd¤Ñ¡Õ:½zõÂÌ™3!"0™LF‡Cäñ8f![<©^è«'•‘-\Ä[Ijj*RSSƒˆˆˆˆˆ\(##÷Üs"""œÚNBBžxâ ìÚµ }úôÑ&8"""""""""""""ªÑ ðÑGáÿøNž<‰Î;ã½÷ÞÃðáÃáïïotxn-33­[·6: ¢Z©{÷îÈÍÍÅÉ“'ùmØDDDTkpÝ9Š‹xÿ+--Íèˆj¤›7obéÒ¥X·nFމ„„£Cr¹7bÕªU˜3g¼¼¼Œ‡ˆˆˆn‘žžŽAƒ9½fÍš¡eË–ÈÈÈà"^"""""ƒ½ùæ›xæ™g;vì0„··7JKKÍùòòòðÚk¯aÕªUøù矈ûî»þóŸ£{œ ³H›1c^xá”––ÂÇÇÇœþÈ#à¾ûî3WTTV¬XgŸ}{öìAYYºuë†W_}÷ß?`åÊ•xøá‡ÍÛ(**BݺuÍ¿W>þsçÎ!""m۶ŰaÚš ”––â?ÿù.\ˆC‡áÊ•+hÕªF§žzÊ¡9OµÇýÙgŸÙÜNRRV­ZeþýþûïÇöíÛ›7oF¿~ý°zõj<øàƒ€É“'cöìÙæü7oÞD:ÿ{T–““ƒiÓ¦á‹/¾€··7ºwïŽÙ³g[}ÛQnn.f̘իWãüùó E¯^½ðÒK/¡cÇŽ¬Ëþ§Ÿ~R´í[)­ËJ¡ª:QRR‚×^{ Ë–-ÃÙ³gQ·n]Üÿý3f xàx{{W«š8(®[•Ë@I½W›¿‚^çÕÙrÕ£ ÚãhÛTr-}õÕWñâ‹/°l«7nÄ€ááá¸téë²>zô(^|ñElÞ¼ùùù~=g¿ùÍo¬ŽCÏ: &¯ÒcÖ¬íѯ´ì(9 ,À˜1cªÌSQ_õ¸Ö¨½WT¸u?§OŸÆŸÿüg¬_¿¾¾¾øÝï~‡¿ÿýï¸rå žzê)lÛ¶ AAA8p Þ~ûm›?«äZ¥ÕýÿVZÝsO͵Ã%÷ gû<Ë—/·˜¯¸ÿ;ÒVìõÕžµewôèQ<ûì³Øºu+JKKqÏ=÷`æÌ™Õ–o{} ½Ú›3ã µ÷LGï{ö(]mEësèÌ5KÍq:»³×ª]öíÛ‡ùóçcÑ¢EðññÁ!CðùçŸãî»ï6:4ÁE¼DÆéÔ©êÖ­‹]»vq/Ù¥fnLë¹WÆUÝX¡º¿k5f©P¹{óæM´oß/½ôÞ}÷]lÞ¼ðøãcáÂ…šÍ ;26Q;®P;>­ðÉ'Ÿ`øðáiÙÙÙhР¢cÓ+Þ9s樮ÅÅņÌ_TGivt,goûŽÎ‹ÊϧíБq0¹'®;#"§‘N:$;v”™7ožÑáæøñãb2™dÆ F‡BDDD·øé§Ÿ€lÙ²E“í=ñÄrï½÷j²-""""¢š €¤¥¥¹d_rÿý÷Ûü[vv¶4oÞ\"##eÍš5råÊ9vì˜$''‹Éd’ hǸqã€Ý9Âøøxñòò’'NXý­{÷î²xñb‹´èèh ”îÝ»ËÎ;åÚµk²wï^¹ûî»Å××W¶mÛf‘?11QHQQ‘9­âø4h kÖ¬‘«W¯JNNŽÌ˜1CÈ;ï¼#""kÖ¬ò׿þUòóó%77Wþþ÷¿‹———L:Õ*Þèèh‰ŠŠR”®ö¸m™3gްÊ;räH ©©©é+V¬ØØX‹´ŠòILL4—çæÍ›%$$Dºtéb‘÷üùórûí·Kdd¤¬[·N åðáÃÒ»wo©[·®ìܹ³Úmgddˆ¿¿¿Õ¶«RU]V{ •óW®£G–ÐÐPIOO—ëׯKNNŽL:UÈÖ­[Å©&Gê–šz¯&¿žçÕÙrÕ³ Ú£¦mª½–Ú«Ë;w–ððp«ôвîÝ»·lݺU~ùåÙ½{·x{{Knnn•Ç¡Wp´¾Ø;-ÚžžÒÒÒDï× RRR$%%EóíjÙPR«Ë£÷=¤º{…=ûINN–o¿ýV®]»&ü±Hbb¢|ÿý÷RXX(sçÎ2eÊ‹m¨¹Viqÿ¯·Ö÷œ„„„*ãûôÓOÍ¿«=§¶(½hÙç©|ÿQÖVªë3VÞ¾Ö}ªÌÌL©W¯žDEEIzzºÊÁƒ¥ÿþÒ¬Y3ñóó«¶œ«+-Û›Vã µ÷LGúJ·ö ÔÄ®¦]éq¹f©9Nµ±kq]p„+ÇÙä¼Ë—/˼yóäî»ïÒ¹sg™7ož\»vÍèÐ<Ò]wÝ%/¼ð‚ÑaÕZÝ»w—'žxÂè04£×ø´6S:æÑsnÆUq‰T?6W:Ïë̘ÅVöðáÃÒ¯_?‰ˆˆ°êÃj=7¥fl¢f\¡f|zëx§´´Tž~úi‰‹‹“üü|‹íÆÄÄHýúõe×®]Õ¦ë¯#õÂÕó·²7ß\]vf,WÕö™S;÷îl;ttLêp|LDnlñ‘æÊÊÊäÝwß___éÑ£‡ÍBmÓ³gOúè#‹mT”Ïš5k,Òÿð‡?‹…‚>ú¨Í4ÙÙÙâçç';wV´í””«mWEéKûì3‹¼YYYâçç§é"^-Ú›Vã Gñªí+ÝÚ7P»šv¥Ç9t暥æ8ÕÆ®ÅuÁ|IÙý•——˶mÛdèСR·n] ‘?þñòÝwßšG+++«{¹ÎÓO?-;v4: Íp¯ö”Žyôœ›qU\"ú/âU2f±×‡½xñ¢Xõaµž›R36Q3®P3>­<Þ¹|ù²ÄÇÇˤI“¤´´Ôê³½{÷–°°0«…¬¶ÒõŠ×‘záêù‹[9ºˆ×™±\UÛwt¯š¹w-Ú¡#ã`R‡ãc"rcË~ýŽw""üôÓOˆ‰‰Á³Ï>‹W^y_}õZ¶litX†5jV®\‰K—. U’‘‘>}úÀÏÏO“íÅÆÆÂÛÛ[¶lÑd{DDDDD¤Ÿ+Vxà‹t???ÄÆÆ¢¨¨_|ñ…Kbéß¿?:tè€?üyyyæô7ÞxO=õ|||¬>ˆŽ;Z¤uèÐ5Â]å>+ŽÀ€VÛ°a&Ož 8p ¶nÝj•'::7oÞÄ?üPýÚáÈqߪ~ýúøÝï~‡ŒŒ äääV­Z…nݺáÉ'ŸDQQ>ÿüs@~~>¶mÛ†ääd›ÛêÒ¥‹ÅïQQQ€óçÏ›ÓV®\ /// 8Ð"oƒ Ю];ìÛ·çΫvÛMš4±Ú¶”ƒ= عs'ÆŽ‹Ý»w£¬¬ pìØ1ôéÓGó8©[jë½ÒüzžWgËUÏ6hš¶éªki×®]úœuÀÑúbï´l{¤œ£uWI]´—ÇÝï!÷Þ{¯Åï5²™eµo5×*-îÿ•i}ωE§NlÆ7yòdÔ©SÇœæè9­Lé5@Ë>JûŒ•iݧڸq# >>Þ"o£FЦMµ‡T%-Ú›‘ã ­ÆJbWÓ®ô8‡Î\³Ô§Úص¸.PÍRPP€ùóç#::}úôÁÑ£G1{öldeeáý÷ßG§NŒÑ£ýüóÏ(**B«V­Œ…¨ÖêÞ½;:„k×® ¹)¥cWÌÍè—+(³ØëÃFDD mÛ¶VÛÔc¬×KC IDATnJéØD͸‘ñé±cÇЭ[7xyyáÝwß…···UžmÛ¶!??Ý»w¯6]ïxÕpõü…VœËiÍѹwgÚ¡sDDä9¸ˆ—ˆ4óñÇãî»ïF~~>víÚ…iÓ¦ÙðÔFƒ†¯¯/ÒÒÒŒ…ˆˆˆþ«¬¬ Û¶mC\\œfÛ A×®]‘‘‘¡Ù6‰ˆˆˆˆH{%%%¸rå êÖ­‹àà`«¿GFF€y„+Lž<ׯ_Ç?ÿùOÀñãDZeËŒ;ÖfþzõêÙL¿í¶Û/^´»¯êŽ¿²+W®à¥—^B‡“ɓɄgžypýúõj­*jÛ–#F ¬¬ Ÿ~ú)`Ñ¢E1b~ÿûßÃÛÛ‹/,Y²DPPÍ턆†Züîåõëc´òòrÿ+·òòr„††šË¢âç»ï¾dffV»m___‹mk¥ºc¨Êœ9sðñÇãÔ©SˆEHHÌ/i‡#uKm½W’_ïóêl¹êÝíQÒ6]y- tèsZ×gꋽcвí‘2ÎÔ]%uÑVO¸‡„„„XüîååoooX¤{{{[í[íµJ‹û=î9úÓŸ¬âûꫯ0zôhsgÎiej®Zõy”RÓg¬LË>UII Q·n]›ÇSq=׊³íÍèq†žc„[cWÚ®ô:‡Ž^³Ô§Úصº.PͰoß>Œ75Â3Ï<ƒîÝ»ã»ï¾Ã·ß~‹±cÇ:}¦_8qкukƒ#!ª½zôè²²2ìÝ»×èPÈM)ó¸jnFϸ\¥º1Ku}ذ°0«4=榔ŽMÔŒ+ÔŽO/_¾Œ¤¤$4nÜ6lÀ'Ÿ|âðñTÐ3^G¸rþB+ÎÌ?iÍѹwgÛ¡ÖsDDä9¸ˆ—ˆœváÂ$&&bÔ¨Qxì±Ç°oß>«ÿ TÛá‘GÁ|`t(DDDô_{öìA~~>ú÷ï¯évãââ\öm]DDDDDT5“Éd3ÝÏÏ¡¡¡(..Faa¡Õß/\¸à×ÿBî*C‡Edd$Þ{ï=”””à­·Þ£>jó¥ÈË˃ˆX¥W¼üRÕKÕe>ø f̘1cÆàøñã(//‡ˆàwÞ›1¨¡ö¸myàP¿~},Z´¹¹¹Ø½{7’’’‰þýûcË–-ÈÎÎÆG}„#F8«ŸŸêÕ«‡:uêàæÍ››?111ïÃ{uYë} >›6mBAAV®\ Arr2Þ~ûmÍ÷çHÝR[ï•ä×û¼:[®z·A{”´MG®¥^^^¸qã†UÞ‚‚ŽBû: G}quÛ«MÜ©àŠ{ˆ+îö¨½Viqÿ×3¾ÔÔT4iÒÄ"¾1cÆX¼x«Õ9Us ЫÏãh[q”Úënpp0Š‹‹m~»[~~¾fq©áŠë‹#÷L=Ç·Æ®´]¹Û9Tsœjc7r¼@îáòå˘?>:tè€{ï½ûöíûヒ¬¬,Ì›7ߺ«ƒÌÌL„††"""ÂèPˆj­F¡I“&صk—Ñ¡›R2æ1bnFë¸*o·ºýꩺ>¬­ì£Çܔұ‰šq…Úñi:u°iÓ&¬Zµ :tÀ˜1cœþ‡zÅëh½påü…»s¤ õš{w·q0¹.â%"§üç?ÿAûöíqèÐ!lݺ³gÏ6ÿG²4jÔ(ìÛ·0:"""žžŽ¨¨(Üyçšn7..çÎÃ?þ¨év‰ˆˆˆˆH½€€‹ßï¸ãÌŸ?ððÃÖ­[gñ™’’lÞ¼þþþˆwY¬~~~?~<.^¼ˆ·Þz ‹/ƤI“ìæ/..¶záäСC8þ<¢££Ñ°aÃ*÷Wqüëׯ·ú[§N0eÊ”••aÇŽhР&Nœˆˆˆó‹EEEjÑ&µÇm‹¯¯/RSS±ÿ~<ÿüóHLL„¿¿?`øðá(++ÃË/¿ŒììlôíÛשx“““QZZŠ;vXýmÖ¬YhÚ´)JKKÚ‡-UÕe­Ô«WGøøø ..+W®„Éd²j'Îr´n©­÷Jóëy^)WW´A{”¶Mµ×Ò† "++Ë"oNNΞ=«ÃQèS´®/®l{µ»õô¾‡¸â^a‹#×*-îÿzÆW§NLš4ÉßÒ¥K1qâD«|ZœS5×½úlNNŽ?n•_¹)%cµã µãÓàà`DEE!((«W¯FPP’’’íÐ1鯣õ•óîNmê=÷înã`""rBDä€+W®Èرc€ >\ Éí•——KË–-eÊ”)F‡BDDD"rÿý÷Ëc=¦ùvKKK%,,LÞ}÷]Í·MDDDDT´´4—ì+!!ABCCåìÙ³²sçN©S§Ž9rDDD²³³¥yóæ)kÖ¬‘«W¯Ê±cÇ$99YL&“ÌŸ?ß¼üü|iݺµ4kÖL²²²TÇ1nÜ8 6l¨2_nn®øûû‹Éd’ÄÄD»ù¢££%44TbcceçÎríÚ5Ù»w¯Ü}÷Ýâëë+Û¶m³ÈŸ˜˜(¤¨¨ÈœVqü 6”µk×ÊÕ«Wå矖'žxB"##åÌ™3""Ò·o_ ûÛß$77W®_¿.[¶l‘¦M› ÉÈȰŠ-**Êf̶ÒÕwUvîÜ)€lݺ՜~ýúu 2mÚ4›ŸµU>""Ó¦Mòý÷ß›Ó.\¸ -[¶”-ZÈúõ률 @òòòdîܹ`U·Õl»*UÕeGöc+hh¨ôîÝ[8 ÅÅÅrá™>}ºW_}UQœjâp¤n©©÷jòëy^-WW´A{”´M5×R‘ &ùÇ?þ!………râÄ ¡GŸGI[©®ÏXÕöíS8qBêׯ/QQQ’žž.………òÃ?H||¼ÜvÛmâççWm9W£–íMíõŵ÷LGúJ·ö ÔÄ®¦]¹âª¹f©9Nµ±kq]p„+ÇÙô«üü|™7ož´k×NHçÎeÞ¼yríÚ5£C«U|ðAùýïotDµÞÛo¿-áááR^^nt(NÓk|Z›)óè97㪸Dª›;:Ï«fÌb«{èÐ!IHHÛo¿Ýª«Å¼pejÆ&jÆjƧ¶Æ;Û¶m¹ï¾û¤¸¸Øœ#õë×—]»vYä·•®W¼ŽÖ ×Í_ÜÊÞ|³Ú:¬f,WÕv™S;_äl;ttLêp|LDnlñ‘j›6m’&MšHdd¤¬ZµÊèp<Ê+¯¼"áááRRRbt(DDDµÚ•+WÄÇÇG–,Y¢Ëö“““åÐeÛDDDDDžÎ•O=*½zõ’ÀÀ@iÒ¤‰Ì™3Çâï—.]’É“'KóæÍÅÇÇGBCC%>>^6oÞl‘///OZ¶l)M›6Uµˆ÷ƒ>0/²¨üSÕ?E3fŒ/¿üÒnžŠ—#Ž9"ñññ,þþþÒ»woÙ¾}»9ߊ+¬ö=tèP»Çß°aC2dˆ?~Üœ'77WÆ'Mš4‰ŒŒ”‘#GʳÏ>kÞfçÎå7Þ°Ú×óÏ?o7Ý‘ã®NëÖ­¥iÓ¦V/ Ž9RÈ?ü`‘¾k×.»±Ýš^yŒ———'O?ý´´hÑB|||$""Bú÷ïoñB‡£Û¶Ç^]V»ŸªêÄþýûeܸqrçwJ@@€Ô¯__î»ï>Y°`Aµ/a:r¼JëV¥õÞÑüzWgÊUM99ÛíQÒ6•^KED dôèÑÒ°aCñ÷÷—ž={ÊÞ½{¥sçÎæø¦M›f³¬u¶õ¨jò*=5u¤oß¾$¥¥¥ªÊž¼ˆW‹~€’󨦾êy©îxoeo?{÷îµJŸ9s¦|ýõ×Vé/¿ü²ˆ¨¿¦WpäþïŠ{N…gžyFÈìÆ£æÚa‹#÷ µ}žêú„jÛÊ­}F=ûTŽ;&III"þþþÒ¥KY»v­ÄÆÆš·ýøãÛ-g{e W{Sso´Gé=³‚Òû^u}¥±«mWΞC-¯YjÏ‘ÚØ½.8àKÊ®PVV&2hÐ ñõõ•ÐÐP;v¬ìß¿ßèÐj­¶mÛÊK/½dtDµ^Å}ºòœ¢§â"^í©óh=7cD\Õìý]ë1Kå>l@@€ôèÑC¾üòKéÓ§8\J¨™“S;®¨n|ºdÉ«ryçwl–cŸ¸W¯^&;wî´ˆÍVºÖñVP[/nåŠù‹ öÆ”jë°Ú±œ³s¶(=ŸZ´CGÆÁäމÈ-3‰ˆ€ˆHââbLŸ>o¼ñ~øaÌ;¿ùÍoŒË£œ;wÍš5ÃgŸ}†¤¤$£Ã!""ªµV®\‰Gy999ˆˆˆÐ|ûsçÎÅÔ©S‘——???Í·ODDDDäÉL&ÒÒÒ0xð`£CqK|ðæÌ™ƒo¿ýÖnžŽ;âÒ¥K8wîœ #Ó—’ã¦ÚMm½¯‰íÄžÜ6kZ(((@£F0tèP,X°Àeû]¶lRSS¡çkƒ ,_¾\·}{òäk ‘»©i÷=R‡ãl}åääà£>‚ pòäItîÜcÇŽÅСChtxµVyy9°páB 6Ìèpˆjµ’’Ô«WóæÍÈ#ŒÇ)ŸRM×¶m[áÌ™3ºíƒc"2ÇÇD䯖{y†ƒ¢[·nxÿý÷ñþûïã³Ï>ã^4nÜ111øàƒŒ…ˆˆ¨VËÈÈÀ=÷Ü£Ë^HHHÀ/¿ü‚]»vé²}"""""ª¹æÎ‹§Ÿ~Úè0\®¶7‘»cÛt"‚‰'"$$3fÌ0:"ÍðCDD¼›6mÂàÁƒÑ´iSÌœ9±±±8pà¾ýö[Œ;– x vöìY””” U«VF‡BTëùùùáž{îáûDn"''õë×ÇÍ›7-ÒOŸ>“'O¢oß¾EFDDDT»q/U©´´³fÍB—.]ÇcìØ±F‡åÑF…õë×#''ÇèPˆˆˆj­ôôtÄÅÅé¶ýfÍš¡eË–ÈÈÈÐmDDDDDT3,\¸?ü0®]»†¹sçâòå˵â¿C×Öã&rwl›îéÂ… 8uê6oÞŒ ‘Ãx!""w—““ƒY³f¡uëÖˆ‹‹Ã©S§ðÞ{ïáüùó˜7oî¾ûn£C¤ÿÊÌÌ´nÝÚàHˆºvíŠ={öý×åË—1nÜ8üüóϸ~ý:öìÙƒÔÔT„„„àÅ_4:<"""¢Z‰‹x‰È®S§N!&&Ó§OÇ+¯¼‚ôôt4iÒÄè°<^rr2‚‚‚°xñb£C!""ª•NŸ>'N躈ú÷ïôôt]÷ADDDDD5ÃÊ•+†÷ßK—.E:ulæ{óÍ7a2™pàÀdeeÁd2á…^pq´ÚQzÜT»©­÷5­ÁÓÛfM¬ 4ÀöíÛÑ®];£C!rš§_cˆÜMM¼ï¹Ú­ßºûú믣_¿~8xð ù[wŒ“n‘™™‰°°0„‡‡ èÒ¥ :„¢¢"£C!ªõ4h€M›6¡  ¿ýío†‡z­[·Æž={ТE ÕÛ4™LÕþqlâᔜçéÓ§&‘Ç2‰ˆ¹Á‚ ð§?ý -Z´À¢E‹øŸ$56nÜ8ìØ±‡6:""¢Zgîܹ˜:u*òòòàçç§Û~V¬X””äää ""B·ýy“É„´´4~ë‘X¶lRSS¡çkƒ ,_¾\·}Õdg;&++ ÿþ÷¿ñ¯ý gÏžEïÞ½1fÌ<òÈ#º>C$mL™2;wîÄ7ß|ct(D„_Ö·iÓ»wïF·nÝŒÇaŸy6މÈ-ç7ñ‘…œœ<ôÐCxòÉ'ñä“ObïÞ½\À«ƒQ£Fá‡~ÀÞ½{…ˆˆ¨ÖÉÈÈ@Ÿ>}tø ooolÙ²E×ýQõÊÊÊÌߺ۬Y3¼ýöÛˆÇÁƒ±uëVüáà^‘™™‰Ö­[ýW«V­Ž={ö ‘[â"^"2[¾|9Ú·o#GŽ`ëÖ­xýõ×áëëktX5Ò}÷݇;ï¼|ðÑ¡Õ*eeeضmâââtßWHHºv튌Œ Ý÷EDDDDD¤•¥K—Âd2Ád2¡nݺF‡ãqÞ|óMsù5nܸÚt¢[¹²®°^QMþÙsôèQ<óÌ3ˆŠŠB||<®^½ŠÅ‹#''óæÍCûöí‘Tâ"^"÷b2™pÏ=÷ðKMˆÇ`FòÄg<îR_<±ìˆˆÈ³p/áÊ•+1bRSSñÈ#àÀèÙ³§ÑaÕx#GŽÄ§Ÿ~Š¢¢"£C!""ª5öìÙƒüü|ôïßß%û‹‹‹Ã_|á’}iaÈ!ÄÆÆŠÛ»víZ·nšÓ¦N Att´E^{é5­2ª ô<.WÖ•ÚZ/‰ˆÈõ\Õ'`_Œˆ*+..Æòåˇ»îº K–,ÁÈ‘#qâÄ lܸƒæ·îz¨²²2œ>}š‹x‰ÜL×®]¹ˆ—j„š:§éJ5q æ)õŸñ¸K}ñIJ#""ÏÂE¼DµÜ¦M›Ð¾}{ddd`õêÕ˜7o‚‚‚Œ«VxôÑGñË/¿`ÕªUF‡BDDTk¤§§#** wÞy§Kö‡sçÎáÇtÉþˆˆˆˆˆˆÈuDååå(//7:‡éþ==½Œì©©Çå ®¨wDDžÊÓ¯‘UÅÏ{'¹Ò¾}û0iÒ$DEEaذa¨[·.ÒÒÒpæÌ¼þúëhÞ¼¹Ñ!’“Μ9ƒ7n U«VF‡BD•téÒÇŽCAAÑ¡U;¾âø…la½ """=Õ1:"2FQQþò—¿à7ÞÀ#<‚÷ßáááF‡U«DFF">>|ð† bt8DDDµBFFâãã]¶¿nݺ!,, .[8LDDDDDD®Œ“'O†[«©eTS‹ˆˆH/¼w‘Þ °lÙ2¼ÿþûØ¿?î¼óNüùÏÆc=†ˆˆ£Ã#effñ¹™®]»BDðÝwß¡oß¾F‡Cä0Ž_ÈÖ """r¿‰—¨Ú³g:uꄹsçâÃ?IJe˸€× £F¦M›pöìY£C!""ªñ®^½Š={ö ..ÎeûôööFLL 222\¶O""""""""""""¢š®¼¼›6mˆ#ШQ#<óÌ3èС222päÈL›6 xk¨ÌÌL„‡‡£~ýúF‡BD•4lØ5ÂÞ½{…ˆˆˆˆˆÈíp/Q-RZZŠY³f¡gÏžhÚ´)>ŒáÇV­öàƒ"<<‹-2:""¢oË–-(++Cll¬K÷‡­[·¢¤¤Ä¥û%""""¢š¡´´iiiˆ‹‹Cƒ àïï:`öìÙ(//7ç[¹r%L&“ùçôéÓHMME½zõŽÚü/ñGERRBCCˆ^½zaûöíŠb+((°Ø§Éd«¯¾jŽ»rzJJŠùsyyyxúé§Ñ²eKøúú",,  ÀÖ­[Íy^}õUóg{öìiN߸q£9ý7¿ùêò¬””d_å}lÞ¼&“ kÖ¬1§Mž<Ù"ÿgŸ}fñ{qq±Ã±T¥òù @×®]±víZôë×ϼïÑ£G›óçææbâĉhÖ¬|}}äädì߿ߜçÍ7ß„ÉdÂ/¿ü‚;v˜·S§N*c©øœÉdBãÆ±wï^ÄÆÆ"88ˆ‰‰ÁŽ;Ìùo­“·–‘’X+T®3~~~hܸ1úõë‡?üEEEª·YRR‚—^z mÛ¶E@@êׯ|«W¯FYYY•å`ï¸mƒj)i?jËíVŸ|ò‰UÛÎÉɱ›_Iy*­wjê°ÒºHD¤¥ý2µý¥×H%÷€[ïGgΜAjj*‚ƒƒŽáÇãòåË8}ú4|ðA£aÆ3f :Þê⯮O ä~¥45íË‘ñ²²²0kÖ,´jÕ qqq8räÞ}÷]deeáã?F¿~ýŒ‘t–™™‰Ö­[ÙеkW.â%UÔÌÓi1÷éèøE‹ù÷êæw™³¬Ì‘¹3µc.WÍ;Ú£u¼ŽÔ GÇ”jæÅ•PûŒGÉÜ‚ÖÏOœ+W:'®¶^¨);­Ú'ÕrBDµÂ‘#GäÞ{ïyýõ×¥¬¬Ìèè¿&Nœ(Í›7—òòr£C!""ªÑÆ/÷Þ{¯Ë÷ûÓO? Ùºu«Ë÷MDDDDäŽHZZšÑaxŒ5kÖùë_ÿ*ùùù’››+ÿûßÅËËK¦Nj•?11QHbb¢ìܹS®]»&âïï/]ºt±È›™™)õêÕ“¨¨(IOO—ÂÂB9xð ôïß_š5k&~~~ŠbŒ///9qâ„Õߺwï.‹/6ÿž-Í›7—ÈÈHY³f\¹rEŽ;&ÉÉÉb2™dÁ‚Ÿ ”ûï¿ßj»;w–ððpEñÙ3gÎ`ŸˆÈÈ‘#€¤¦¦Z¤¯X±Bbcc-Ò*Ê»¨¨È"=::Z¢¢¢¬öi/Ý[ççðáÃÒ¯_?‰ˆˆ°:?çÏŸ—Ûo¿]"##eݺuæü½{÷–ºuëÊÎ;-òÛ+ÛêDGGK`` tïÞÝ\ÇöîÝ+wß}·øúúʶmÛ,òÛ*#5±VÔ™ Èš5käêÕ«’““#3fÌòÎ;ï¨ÞæèÑ£%44TÒÓÓåúõë’““#S§NU5~·wîÕ´ÁêÊùÖº¢¦ý(-7[û*--•§Ÿ~Zâââ$??¿ÚXÕ”gUõNmV[É1iii¢÷k)))’’’¢ë>ˆ´ ¶_¦¶SÕ5Rmªâ~”œœ,ß~û­\»vM>þøc  ÄÄDùþû殺°PæÎ+dÊ”)ºï­1U¾w*½_©EM_LM_–È]Õ†qvqq±,[¶L(ÞÞÞÒ A™8q¢¿TNwtþ½ªù]-æ,+S3w¦fÌ¥×¼cLLŒÔ¯__víÚUmº^ñ:R/ªS~úé§æßÕÖãê¨}Æ£fnAËç'JçÊWS/Ô–Öí“ôSÆÇDä±–q/Q W^^.óæÍ“ÀÀ@éÚµ«=zÔèèòÕW_ QÖªU+ù¿ÿû?CöݲeKyî¹ç Ù7‘»áÃSuÖ¬Y#}úô±J6l˜øøøÈ•+W,Ò+^ŠX³fEzJJŠÜÜ\sÚ Aƒ€|öÙgy³²²ÄÏÏOñ"Þ/¾øBÈøñã-Ò·oß.QQQrãÆ sZÅ K–,±È[\\,5ÉÉÉ1§ë¹ˆ7//O|}}%!!Áœvýúu “V­Z‰¿¿¿\½zÕü·‡~X>úè#‹m蹈×Þù¹xñ¢XŸG}ÔæK5ÙÙÙâçç';w¶Hwf/ùþûï-Ò+溣££-Òm•‘šX+ꌭëFBB‚ù%+5ÛlÞ¼¹ôèÑÃj{mÚ´Ñl¯’6X[uEMûQZn·îëòåË/“&M’ÒÒRE±ª)ϪêÚ:¬¶.’c¸ˆ—èÔöË´\Ä«¶Uq?Z·nEþvíÚ ùòË/-Ò›7o.wÜq‡.Ç{kL•ïJïWjcQÓSÓ—%rW5yœ}äÈ™6mšDDDˆ———ôë×O–-[ƶY˵jÕJ^yå£Ã "ÒÓÓ€dggŠC8>u=¥óJZÏ}:»ˆ×™ùw{ó»ZÌYV¦fîL͘K¯yÇÞ½{KXX˜ÕBV[ézÅëH½Ø´i“Ý1eÓ¦MåæÍ›æ4µõ¸:jŸñ¨™[Ðòù‰Ò¹rgçÄÕÔ µe§uû$ýÔäñ1y¼e^ ¿°—ˆøà£C!""ª±NŸ>'N ..Îý÷ïßééé†ì›ˆˆˆˆˆ<ÛÀ±uëV«ôèèhܼy?üðƒÍÏuéÒÅâ÷&MšÎŸ?oNÛ¸q# >>Þ"o£FЦMÅ1öïß:tÀ‡~ˆ¼¼>>æ´+Vxà‹m^%ªO IDATøùù!66EEEøâ‹/ïÛõë×Çï~÷;ddd ''°jÕ*tëÖ O>ù$ŠŠŠðùçŸòóó±mÛ6$''»$6Àþù‰ˆˆ@Û¶m­ò¯\¹^^^8p Ezƒ Ю];ìÛ·çÎÓ$¶ÀÀ@tìØÑ"­C‡hÔ¨8€ììì*?¯&ÖŠ:3`À«ílذ“'OV½Í„„ìܹcÇŽÅîÝ»QVV8vìúô飰ª¦¤ ª¥¦ý(-·ÊŽ;†nݺÁËË ï¾û.¼½½Í;|ø0L&“ÅÏ„ hWžŽÔagë"‘ŽöË´àhêÞ{ïµø½Q£F6Ó£¢¢¬îQ®8^¥÷+=cQÓ—%"׸zõ*>þøcÄÅÅá®»îÂ矎ñãÇãÔ©SÈÈÈÀ AƒØ6k±ÒÒRœ9s­[·6:"²áÞ{ï…ÉdÂwß}gt(ä!”Î+¹rîS gæßíÍïê1g©tîL͘KëyÇ Û¶mC~~>ºwï^mºÞñª‹N:ÙSNž<uêÔ1§i]Õ>ãQ3· åógæÊÕĬ¦^¨-;WýôSÀ¢E‹0bÄüþ÷¿‡··7/^ X²d h³¬ôPÝù ³ÊåÊ”——#44Ôj±eÅ‹“™™™šÄW¯^=›éõæâÅ‹v?«&ÖêêŒ#Û€9sæàã?Æ©S§‹$$$˜_ÒBumP-5íGi¹Uvùòe$%%¡qãÆØ°a>ùä‹¿·oß"bñóÞ{ïЦ<­ÃÎÔE""µí—9Ë™>THHˆÅï^^^ðööF@@€Eº···Õ=JïãUs¿Ò;%}Y"Òß¾}û0nÜ8DEEaܸq CFFŽ;†éÓ§ãöÛo7:Dr§OŸÆÍ›7ѪU+£C!"ÂÂÂЬY3ìÛ·ÏèPÈC(™WrõܧÎοß:¿ è3g©tîLé˜KyGGè¯#þô§?Y)¿úê+Œ=ÚœGëz¬ö#s Z=?qt®\mÌjê…Úçc®x¦@DD5ñÕ06lRSS‘’’‚½{÷Zý]r?C‡Eii)þóŸÿ Q”‘‘>}úÀÏÏÏýÇÆÆÂÛÛ[¶l1dÿDDDDDä¹|ðA̘1cÆŒÁñãÇQ^^Á;'¶ëçç‡àà`ãÚµkVÏÏÏWµ½¡C‡"22ï½÷JJJðÖ[oáÑGµxÉÏÏ¡¡¡(..¶ù /\¸à×ÿ:_ÁËË 7nܰÊ[PP *>{xàÔ¯_‹-Bnn.vïÞ¤¤$DFF¢ÿþزe ²³³ñÑGaĈšìS‰êÎÏ­ ýüüP¯^=Ô©S7oÞ´ZlYñcþŒÉdr8¾¼¼<›u¯"®ª«‰µº:ãèñ›L& >›6mBAAV®\ Arr2Þ~ûm‡ËEOjÚÒr«¬N:Ø´iV­Z…:`̘1Ø»w¯¢Ïª)O{õΑ: 8W‰ˆÔRÛ/SÛ©ê©¶¥µÇ«¶o¡æ~¥WŸ¸‚’¾,é#''³gÏF‡pï½÷bûöíxá…pîÜ9,[¶ ýúõsjìB5OÅÂ.â%r_÷Üs¾ÿþ{£Ã ¡d^I¹O½ûjçw+bÒzÎRéÜ™Ò1—«çíÑ+^GëEjj*š4ib1¦3fŒÅÂSGç?íQûŒÇ‘¹£ŸŸ¨YM½Pû|ÌŸ)‘ûá"^¢$==íÛ·Ç–-[°víZÌ›7F‡E „‡‡càÀøðÃ…ˆˆ¨Æ)++ÃÖ­[gX !!!èÒ¥ 222 ‹ˆˆˆˆˆS ""7#Däñ®_¿.'N“É$ƒ ’¼¼<£C"¬]»VL&“œ8qÂèPˆˆˆj”;w 9r䈡q¼üòËÒ¸qcCc """"r$--Íè0>>rß}÷Iqqq•±ª)ϪêÚ:¬¦.æççKëÖ­¥Y³f’••¥à P…´´4Ñûµ‚””IIIÑuDZPÛ/SÛ©ê©¶eï~/ÞÞÞVûîÝ»·:u¼Õõ-lŤô~¥6GúbJú²DîÊSÆÙû÷ï—)S¦Èm·Ý&^^^Ò¯_?ùôÓO­®UDU™0a‚ôèÑÃè0ˆ¨ 6l’››kt(ªq|êzJç•´žûtdüRUºÒù÷ªæwµ˜³¬LÍÜ™š1—^óŽ111R¿~}Ùµk—E~[ézÅëh½¹zõª„††ŠÉd’#FØ<'jëquÔ>ãQ;· ¢Ïó{såÎΉ«©jËNiûä<´ñ1:rÂÍ›7¥Q£Fòâ‹/ Q2}útÅ/HëiÇŽn±˜˜ˆˆˆˆÈh|xªNnn®Œ7Nš4i">>>)#GŽ”gŸ}ÖüâDçÎe×®]æß+~žþy«ôxÀ¼ýcÇŽIRR’„„„ˆ¿¿¿téÒEÖ®]+±±±æü?þ¸âxÇŒ#äË/¿´›çÒ¥K2yòdiÞ¼¹øøøHhh¨ÄÇÇËæÍ›­òþ?{÷e÷üÍYEM4<…N‚)¦(™+º*hEi¥d%F©,ín+­mwQ·­¶u÷fÛÊLc—ŽŠ¥Fë*£R·†æ QsñŒ¢€–!â0¿?î_ÜQV€/¯çãá^3̼gœ™ëšÏ|ËËË<ð€£K—.Ž–-[:"##›6mr 8°¦ïû5j”£uëÖŽóçÏ_t³Ãáp;ºwï®®µýÞ{ïuHräååÕÚ¾lÙ²ý^ï¾ûnÇË/¿|Á‡ŸÚþK¾ÿïÓªU+ǯ~õ+ÇgŸ}æ1b„£U«V?:ÿÉ“'O<ñ„# ÀááááðõõuDGGÿh°Åáp8öìÙã6l˜ÃÛÛÛÑ­[7Ç«¯¾zQ¿«ï>H³k×.GLLŒ£M›6Ž–-[:~ýë_;²²²~ñwt9­?¼ÏtéÒÅqçw:öîÝ{Y·Û¶mŽÄÄDGïÞ½­Zµr´oßÞqà 78Þ|óÍÝ~è§n×å>è—î+—òøù¥ßÛûï¿ÿ£ëúÛßþvÁÛòý»º”ßç/Ýï.å~q±÷Åï.700Ðѽ{w>/õýK]ìÿ¥ý»W²ÏòB.eßÙ¥¾ÿ«ýŽÃ† søøø8>ÿüóZmÚ^׽߹Ü÷µßyê©§’Û·oÿÉ—K¹_ŒK=Æs)û—¿s©ÇO.õñRWûÄ/õ~q)¿»‹}|²Ú¼Æüþ@³·ÄÅáp8Àéœ?^üãõÇ?þQQQQzë­·tÍ5טΚ9s¦Þ{ï=ÉÍÍÍtMBdd¤BBB´hÑ"£v»]¾¾¾JJJÒôéÓ¶&¹¸¸hñâÅš8q¢éÔƒ””½úê«Ú¼ysƒ_wyy¹ºvíª»ï¾[o¾ùfƒ_C UEE…öïßßà×Ý¿8qB‡jðë¾ûbÃX²d‰âââTŸ+˜0a‚$)--­Þ®.†ÉײÀ•hlï³ív»233µ`Á­X±B-Z´Ð­·ÞªøøxEEEÉÅÅÅt"œX`` î»ï>ýö·¿5àgtëÖMÓ¦MÓ¬Y³L§\ÞŸ¢¡4Äþ]öhŽÛûcøž4WÓ.Ý®]»4xð`ýùÏÖ¼yó´jÕ*x›ˆûï¿_‡Vff¦éš„Ó§O+''G‹ÅtŠÜÜÜ4räHY­VÓ)PoæÏŸ¯'žx¢Á¯×áphúôéjÛ¶­æÎÛà×_Š‹‹Õ¾}{UUUÕÚ^TT¤‚‚5ÊP@Ódêµ,ÐTäååiÖ¬YêÚµ«bbbtäȽòÊ+:|ø°RSS5zôhxqEªªªtàÀ™Nð ÂÃõuëVÓ€QìßÀ÷1Ä 8‡Ã¡ (""BÚ¶m›f̘Áî&¤W¯^|¸|||tË-·(88X999 hО¿üå/rqqÑöíÛuøða¹¸¸è¹çžkÐ@⾨[áµ,àl*++•žž®‰'ªsçÎzúé§Õ§OY­VíÙ³GIIIò÷÷7‰&Èf³I’ —ø%ááá*((à3hÖêcÿ®‹‹Ë/þiݺ5ûΜÜÅü;'%%™Î—ˆ=Ï€HKKSbb¢ºté¢/¾øBááᦓPî¼óNý×ý—/^¬ÄÄDÓ98µŒŒŒFõ­ù={öT`` ¬V«FŒa:®Ø< xÀtF“¥¨¨(Ó’¤'Ÿ|RO>ù¤é €û" ÎðZ¸4yyyzûí·õÖ[oéäÉ“5j”.\¨Ûo¿]ÞÞÞ¦óÐ Øl6uêÔIW]u•é¿ <<\‡CÛ¶mã³hÖêzÿ®ÃᨳËBãÅ¿3M+ñXII‰n»í6ÅÅÅi„ Ú´i¼Í@Û¶m5~üx¥¤¤˜NÀ©)??_‹ÅtJ-ÑÑÑÊÈÈ0ü¬£G*99Y Pß¾}µbÅ =òÈ#*((ÕjU||<¼h06›MÁÁÁ¦3\???uêÔI[¶l1+ñÔªU«tÿý÷ËÃÃCk×®ÕÈ‘#M'¡%$$hôèÑÊÍÍUXX˜éœÒªU«äíí­!C†˜N©Åb±è7ÞPII‰|}}Mç5*++•‘‘¡·ß~[Ë–-SëÖ­5qâD½òÊ+:t¨\\\L'¢™bˆp. ÐÖ­[Mg@£ÀJ¼@#óõ×_+11QcÇŽÕСCµuëVx›¡Q£F) @o¿ý¶éœ–ÕjÕˆ#äååe:¥–¨¨(¹¹¹iݺu¦SIÒ—_~©3fÈÏÏOãÆSYY™-Z¤Ã‡ë7ÞPdd$¼0Š!^À¹ôë×O;vì0C¼@#’­ððp-[¶L}ô‘–,Y"ÓY0ÀÅÅE÷ÜsRSSUUUe:§c·Û•™™)‹Åb:åGÚ¶m«ˆˆY­VÓ)hÆŽ9¢ääd]wÝu4h¬V«ž|òI>|XV«UñññjÕª•éL@çÎÓÁƒd:ÀE ÓîÝ»uîÜ9Ó)`C¼@#PUU¥¤¤$ 6LAAAÚ¶m›Æo: †%$$¨¤¤D«W¯6€ÓÉÉÉQYY™¢££M§\Åbá9 îìÙ³JKKSll¬zôè¡Ù³gë†nÐúõëµk×.Íœ9S;w6 ÔRXX(»ÝÎJ¼€éׯŸªªª´wï^Ó)`œ»é ¹ËËËÓäÉ“•ŸŸ¯×^{MS§N5„F¢gÏž>|¸RRRtóÍ7›ÎÀ©dddÈÏÏO½{÷6rAÑÑÑš={¶vïÞÝh€ú§¸¸8Ó ‘Xºt©\\\LgÐdUWWëÓO?Õ;ï¼£?üP;v¬–,Y¢›nºIžžž¦Ÿe³Ù$I†K\¬ÐÐPyzzjÇŽêÛ·¯éœ‹ÆûSõ!^À‡Ã¡¿ÿýïš9s¦ÂÃõeË™ÎB#“ |P%%%òõõ5€Ó°Z­v^I­«¯¾Z©©©ºóÎ;Mçü¤Ûo¿]çÎSzzºé4‡ÖÒ¥K•ššª-[¶¨[·nºë®»” ÓyÀeyøá‡µk×.}öÙg¦S\‚»îºK§OŸÖ'Ÿ|b:LJs5]47©©©êׯŸNœ8¡/¾øBIII ðâ'y{{k„ Z´h‘éœÆÚµke·Ûe:ågY,effª²²Òt œØ©S§”ššªØØXõèÑC³gÏVŸ>}dµZµÿ~½øâ‹ ð©Ùl6›Îp‰Âœj%^¨/ ñ äøñã7nœî½÷^%$$èË/¿Ô€LgÁ Ü{ï½ÊÍÍÕÖ­[M§à¬V«ÂÃÃåëëk:åg3FgΜQvv¶é8™sçÎ)==]ñññêÚµ«¦N*Izÿý÷U\\¬ÔÔT=Z...†K+—ŸŸÏ/à„úõ맨¼¼Üt Å/ÐV®\©þýûkûöíÊÌÌTrr²¼¼¼LgÁIDFF*44T)))¦Sp V«UÑÑѦ3~QÏž=(«Õj:NâË/¿ÔŒ3äçç§qãÆ©°°PúÓŸtøða¥§§k„ òôô4 Ô™ÊÊJ:tHAAA¦S\¢°°0IÒÎ; —€Y ñõèôéÓJLLÔM7ݤѣGkÇŽúõ¯m: NhòäÉz÷ÝwUYYi:€F­¨¨Hùùù²X,¦S.Jtt´222Lg Û½{·’’’¬AƒiÍš5zä‘G”ŸŸ¯¬¬,͘1C:t0 Ô‹‚‚ÙívVâœP÷îÝÕ®];íØ±Ãt Å/PO>ÿüs…‡‡kùòåZ¾|¹RSSÕ¦MÓYpRS¦LÑ©S§”žžn:€FmÕªUòööÖ!CL§\‹Å¢-[¶¨¤¤Ät ‘“'OjÁ‚ŠŒŒÔµ×^«… êÆoÔæÍ›•——§¤¤$ùûû›ÎêÍf“‹‹‹M§¸ }ûöUnn®é 0Š!^ Ž={V³fÍÒ°aâmÛ¶éÖ[o5'wÍ5×hôèÑJII1@£fµZ5bÄyyy™N¹(QQQrssÓºuëL§À°ŠŠ ¥¥¥)66V;wÖÓO?­€€}üñÇ***Rrr²h:hP6›M]»v•···é—¡_¿~ ñhöâêPnn®n¸á½þúëzýõ×õïÿ[]ºt1…&"!!A«W¯Ö¡C‡L§Ð(ÙíveffÊb±˜N¹hmÛ¶UDD„¬V«é`·ÛµfÍÅÇÇ«cÇŽš4i’Ξ=«E‹éðáÃJMMUll¬ÜÝÝM§FØl6›Îp™Â”››+‡Ãa:Œaˆ¨v»]/½ô’ $ooomÙ²ES§N5…&füøñj×®Þ}÷]Ó)4J999*++Stt´é”Kb±X´zõjÓh ‡C6lУ>ª.]º(::Z………zùå—uüøqY­VÅÇdzò( †xg¦Ó§OëÀ¦SÀ†x+´oß>9RIIIš3gŽÖ¯_¯ÀÀ@ÓYh‚<==§·Þz‹o¥à222äçç§Þ½{›N¹$ÑÑÑ:tèvïÞm:õhÇŽzæ™gäïï¯ÈÈH}úé§š1c† ”••¥‡zHíÛ·7 4*ùùù ñN¬_¿~rqqQnn®é0†!^à ¤¦¦ª_¿~*//ׯ5sæL¹ºò°BýIHHÐÞ½{µqãFÓ)4:V«ÕéVᕤÁƒËÇÇGV«Õt êØÁƒ•œœ¬êºë®Ó;ï¼£[o½Uëׯ×Î;õÛßþVþþþ¦3F©¢¢B‡VPPé—©M›6êÞ½»vìØa:ŒaÚ¸ ÇŽÓ-·Ü¢ûî»OÓ¦MÓæÍ›uÝu×™ÎB30hÐ õë×O)))¦ShTNŸ>­œœY,Ó)—ÌÍÍM#GŽdˆ ‰(--Õ‚ ©=zhΜ9êÓ§¬V«8 äädEFFšÎ½‚‚UWW³/àäúõëÇJ¼š5†xK´téRõíÛW;wîTff¦^|ñEyzzšÎB32eÊ-^¼Xß~û­éµk×Ên·+**ÊtÊe±X,ÊÌÌTee¥é\†S§N)55U±±±êܹ³üquíÚU+V¬Pqq±RSS5zôh¹¸¸˜Nœ†Íf“‹‹‹M§¸aaa ñhÖâ.Ò©S§”˜˜¨ &hìØ±Ú±c‡† f: ÍÐ=÷Ü£ŠŠ }ôÑG¦Sh4¬V«ÂÃÃåëëk:å²ÄÄÄèÌ™3ÊÎÎ6€‹T…Üyí IDATYY©ôôtÅÇÇëšk®ÑÔ©S%I .ÔñãǵdÉÅÆÆÊÃÃÃp)àœl6›üüüÔ²eKÓ)®@XX˜¾úê+¾Ø@³Å/pÖ¬Y£°°0­X±Bü±RSSÕºukÓYh¦:vì¨o¼Q)))¦Sh4¬V«¢££Mg\6ÊjµšNÀϨ®®VVV–f̘!???7N………zþùçuðàÁš¡^>[\9›Í¦àà`Ó®P¿~ýtþüyíÙ³Çt Á/ð3Ξ=«Y³f)&&FƒÖÎ;k: PBB‚233UXXh:ãŠŠŠ”ŸŸ/‹Åb:åŠDGG+##Ãt. //O³fÍ’ŸŸŸ† ¦5kÖèÉ'ŸÔÁƒk†z}}}MgM C¼@ÓЫW/yyy)77×t Á/ð6mÚ¤hþüùzýõו––¦«¯¾Út Iºé¦›Ô©S'½ýöÛ¦S0nÕªUòööÖ!CL§\‹Å¢-[¶¨¤¤Ät $íÚµKIIIêÕ«—úöí«?þXS§NÕW_}¥¼¼<Íœ9S]»v5 4Yùùù 2à ¹»»«wïÞ ñh¶â~àüùóz饗)???åææjêÔ©¦³€ZÜÝÝu×]wéŸÿü§ª««Mç`”ÕjÕˆ#äååe:åŠDEEÉÍÍMëÖ­3Ðl:tHÉÉÉŠŒŒTŸ>}´páB;Vëׯ¯5Ô  ~}ûí·:rä+ñMDXX˜vìØa:Œ`ˆøžÂÂB1BIIIš3gŽV¯^­nݺ™Î.è¾ûîSQQ‘þçþÇt ÆØíveffÊb±˜N¹bmÛ¶UDD„¬V«é€f¥¸¸X¯¼òŠ"##Õ½{wÍ;Waaaúì³ÏtàÀš¡^ '??_‡ƒ!^ ‰ c%^ÍC¼€$‡Ã¡ ¨_¿~:wnݪ™3gÊÕ•‡¯>}úhРAJII1€1999*++Stt´é”:a±X´zõjÓMÞÉ“'õæ›o***J~~~zî¹çäïï¯ôôt=zT¯¿þº†Îç‡Cl6›\]]`:@ ÓáÇUVVf:{Ñì+66VÓ¦MÓ£>ª¬¬,…††šÎ.JBB‚ÒÒÒtêÔ)Ó)‘‘‘!???õîÝÛtJˆŽŽÖ¡C‡´{÷nÓ)Mηß~«´´4ÅÆÆªk×®š>}ºZµj¥·ÞzKGŽÑÛo¿­›nºI¦SfÏf³©[·njÑ¢…éu $$D’ôÕW_.€†Ç/šµ´´4õíÛW»wïÖ§Ÿ~ª_|Qžžž¦³€‹v÷ÝwK’–.]j¸3¬Vk“Y…W’,Y­VÓ)MÂÙ³g•žž®øøxuìØQ“&MÒÙ³gõæ›oêøñã5§y{{›Nð=6›MÁÁÁ¦3Ô‘=z¨U«VÚ³géhp ñ¢Y*//×äÉ“§Ûo¿];vìÐСCMg—쪫®Ò-·Ü¢””Ó)4¸Ó§O+''G‹ÅtJqssÓÈ‘#⸕••µwǯÂÂB=ÿüó:zô¨¬V«âããÕ¦MÓ©~C¼@Óâêêªàà`VâÐ,¹›šÕjÕ}÷ݧóçÏ+==]7Ýt“é$àŠ$$$h̘1Ú³gBCCMçÐ`Ö®]+»Ý®¨¨(Ó)uÊb±èÉ'ŸTee¥¼¼¼Lç8»Ý®ììl¥¥¥é½÷ÞSii©† ¢¹sç*..N;w6àäççkܸq¦3Ô¡†x4K¬Ä‹f£¢¢B³fÍÒ˜1c4dÈíܹ“^4 ‹EݺuSjjªé”ÕjUxx¸|}}M§Ô©˜˜9sFÙÙÙ¦SµêêjeeeiÆŒºæšk4lØ0­Y³FÓ¦MS~~~Íi ðÎå›o¾Qqq1+ñMLhh¨öìÙc:C¼hrrr4`À½ñÆú׿þ¥%K–¨C‡¦³€:áêêªÉ“'+55Uv»Ýt Æjµ*::ÚtFó÷÷W`` ¬V«é€F)//O³fÍR·nÝjwzè!íÝ»WyyyJJJ’¿¿¿éL—)??_‡ƒ!^ ‰ Q~~¾ªªªL§@ƒbˆMÚùóçõÒK/)22RÝ»wWnn®î¹çÓY@»÷Þ{uäȆ}ÍFQQ‘òóóe±XL§Ô‹èèhedd˜Îh4¾Î Vß¾}µxñbMžÐÄ„††ªªªJûöí3 ÊÝtP_vïÞ]³£~îܹzê©§äêÊÜ:š¦àà` :T)))3fŒéêݪU«äíí­!C†˜N©‹Eo¼ñ†JJJäëëk:Àˆ]»viñâÅúàƒ´wï^õìÙSqqqºóÎ;Õ¿Óyê‰ÍfS=äååe:@ ‘‹‹‹öìÙ£^½z™Î€ÃD#š‡Ã¡ hРArssÓÖ­[5sæLxÑä%$$hùòå:qâ„éêÕjÕˆ#šìAÛ¨¨(¹¹¹iݺu¦STQQ‘’““©>}úhÑ¢E3fŒÖ¯_¯ÂÂB½øâ‹ ðMœÍfcem  òöö–ŸŸŸöìÙc:ShR8 Ñ£GkÚ´izì±Ç”••¥Ÿý™åË—ËÅÅ¥æOQQ‘âââÔ®];uèÐA7ß|³ ~ôs'OžÔO<¡ÀÀ@yzzÊÇÇGcÇŽUfff}Ý<àgMœ8QžžžZ¼xqͶòòòZ÷oýñ”$?¾Öö;æçJJJ4}útõìÙSžžžòõõÕm·Ý¦mÛ¶ÕºÎÊÊJýþ÷¿Whh¨Zµj¥öíÛ+66Vü±ìv{ÃÜp@³c·Û•™™)‹Å"©i¾žkÛ¶­"""dµZ%ñœš¶‚‚ýéORÿþýåïï¯^xA×]w>ýôS8p f¨×ÅÅå‚?ϱ iÉÏϯâmŠÇƒæ,44T_}õUÍßyŒhâE“‘––¦èèÑ£Ú¸q£^|ñEyxxüâÏ7N‡C·Þz«$éñÇ×ã?®Ã‡kñâÅZ·n&MšTëgŠ‹‹¡÷Þ{OÉÉÉ:qℾøâ µjÕJQQQZ¸pa½ÜFàç´nÝZ·ß~»RRRj¶µk×N‡C111ruuU~~¾ž{î9I’»»»‡† ¢wß}WK—.•$=zTZ²d‰^{í5•––êÓO?Uii©† ¢ìììšËôÑGõ÷¿ÿ]¯¼òŠNž<©Ý»w+44T·Þz«Ö¯_ß°¿@³‘““£²²2EGGKjº¯ç,‹V¯^-‰çtÐô|8788XóæÍS¿~ýôñÇëàÁƒzõÕWõë_ÿZ®®¿ü7Ž¥M‹ÍfSPP¤¦{<h®BBBj­ÄËc@sÀ/œ^yy¹î¹çÅÅÅéŽ;îÐæÍ›5pàÀ˾¼x@C† ‘···F­›nºI›6mÒ‰'jÎóÌ3Ïhß¾}úïÿþoÝ|óÍjÛ¶­zõê¥÷Þ{O]ºtÑôéÓuìØ±º¸yÀ%IHHЗ_~©íÛ·×ÚþÄO¨ººZýë_kmß°aƒ8  &Ôl{æ™g´ÿ~ýõ¯Õ7Þ¨Ö­[«OŸ>úàƒäp8ôØcÕœwíÚµêÓ§,‹Z¶l©N:éå—_V¯^½ê÷†šµŒŒ ùùù©wïÞ<½©¼ž‹ŽŽÖ¡C‡´{÷îšm<§gvðàÁšÁÝž={jöìÙ Њ+T\\¬ÔÔTÅÆÆ^Ô÷_ÇRç÷õ×_ëØ±c5+ñþPS9 4W?âý!ãš"†xáÔV¯^­>}úhýúõZ³fÞxã µjÕêŠ.3""¢Öß»uë&I:räHͶeË–I’nºé¦ZçõòòRTT”***jVMÒðáèýë_µ¶GGG+,,Lÿüç?uòäÉší/¿ü²{ì±Z¿–/_.WWWÝ|ó͵.£sçÎêÓ§¾üòK:tH’4fÌ}þùçš:uª6nÜ(»Ý.Iúꫯ4bĈzº•€æÎjµ*&&æ'Oo*¯ç,Y­Öšm<§gsøðášÁÝ=z())©Nw¿c)€ó³Ùl’ô“C¼Måx0Ð\…††ª´´T%%%<Ç8€¦ˆ!^8¥o¿ýV3fÌÐØ±c5tèPmݺU£Fª“˾ꪫjýÝÓÓS’T]]-Iª¬¬Ô©S§Ô¢E µiÓæG?ß©S'IRqqqô—ÂÅÅES¦LQjjªÎ;Wë´Ç\ß~û­^{í5IÒÞ½{µnÝ:M:µæ<ßÝ¿«««uÕUWÉÅÅ¥ÖŸ-[¶Hú¿å¯¾úªRSSUXX¨¨¨(µmÛVcÆŒ©ÙI@];}ú´rrrd±X~òŽ¥ÎÍf³©gÏž—ý…3š£k®¹FmÚ´ùÉ!Þ_Âc€3bˆN£ªªJIIIŠŒŒT@@€òòòt×]wi?~¼$éßÿþw­í•••Z»v­Z¶l©˜˜i€üüü4bÄ¥¤¤ÔÚîåå¥GyDÇ×¼yóôî»ïjÆŒ?úùÛn»Mçϟ׆ ~tÚK/½¤îÝ»ëüùó’¤víÚÕìLóððÅbÑòåËåââò£ÇuÁjµ*<<\¾¾¾Wt9Îòz.&&FgΜQvvvÍ6žÓ@cQZZzÁÁÝE‹©¤¤DéééŠW«V­¬‰c)€s³Ùl ¾¢Ëp–ãÁ@säââ¢^½z髯¾ºìËà1ÀÙ0Ä §——§n¸A/¿ü²æÍ›§ÿüç?êÚµ«±ž^xAþþþzüñÇõÉ'Ÿè믿ÖÞ½{u×]wéèÑ£JNNV§NŒõ Z¹r¥Š‹‹kmä‘GÔ²eK=÷Üs=z´‚‚‚~ô³/¼ð‚uß}÷é?ÿùN:¥ÒÒR½ñÆš3gŽþò—¿ÈÝݽæü=ôvìØ¡ÊÊJ?~\þóŸåp8®h…D~JFF†¢££¯ørœåõœ¿¿¿eµZkmç9˜RVVV3¸Û¹sg%&&J’.\¨ãÇ× îz{{käX à¼òóó¯xˆ×YŽÍUhhè ñòàlâE£æp8”œœ¬ÊÓÓSÛ¶mÓŒ3äââRg×±qãF¹¸¸hÅŠ’T³_úßoüz饗$I ÐÍ7ß,Iêܹ³6mÚ¤I“&iúôéêСƒ®¿þz9sFk֬у>Xg}Àå¸í¶ÛÔºuk½û¶_}õÕºçž{äp8ôÄO\ðg;v쨜œ7N>ú¨|}}ª>úH+V¬ÐĉkÎûÙgŸ)44TwÞy§Ú·o¯Þ½{kÕªUzóÍ7õì³ÏÖëm4?EEE*((Åb©µ½©¿ž‹ŽŽVFFF­m<§€†TZZª””ÝxãêÔ©“åáá¡ÔÔT8q¢fp·uëÖ¦S%q,pf6›­Öà}S? 4G!!!5+Üóи8‡éàBöï߯{ï½W6lгÏ>«ßýîwrss38ÄÄDmذA;w=%%E¯¾úª6oÞl¨ €Ë3þ|=ùä“:yò¤¼¼¼Lç4˜eË–éŽ;îPqq±|}}k¶óœêÓÉ“'µ|ùr-]ºTk×®•«««bbb4qâDÝrË-jÓ¦éğűÀùœ:uJíÚµÓÊ•+5vìXÓ9êIZZš&Mš¤o¾ùF-Z´0õ-•xÑ(¥¥¥iÀ€*))ÑÆ•””Ä/p‰”——§M›6ÕÚ>þüŸü–Y3«Õª#F4«^IŠŠŠ’›››Ö­[Wk;Ïé ®•––*55U±±±êÒ¥‹}ôQ¹»»káÂ…:vì˜V¬X¡»ï¾»ÑðJKœ‘Íf“$.PŸBBBd·ÛUPP`:C¼hTJJJ4~üxÅÅÅiòäÉúòË/n: pJ7Üpƒz÷î­§Ÿ~ZãÇ×7ß|£ùó竬¬L'N4À%±ÛíÊÌÌ”Åb1ÒàÚ¶m«ˆˆýãÿà9Ô¹“'OÖ îvîÜY‰‰‰’T3¸›žž®øøx]uÕU†KÞÂ… 9–89›Í&wwwõèÑÃt €zÔ«W/¹¹¹iÏž=¦S A¸›¾óŸÿüG÷ß¿<==µnÝ:1Âtàôî½÷^%%%©¢¢B>>>ºöÚkõÁÈÝÿþÎ%''GeeeŠŽŽ6b„ÅbÑßÿþw•••ñœ®Ø‰'´råJ¥¥¥iÕªUòððPTTTÍ ¬3¬´{!Ë—/çX àÄl6›üýýåááa:@=jÑ¢…zôèÁ/€fƒ•xaÜéÓ§•˜˜¨o¼Q‘‘‘Úºu+¼@™2eŠªªªôþû﫪ªJÛ·oguk€SÊÈÈŸŸŸz÷îm:ňèèh•••i÷îÝ<§€ËrèÐ!-X°@±±±êÒ¥‹zè!IÒ¢E‹tüøñšwu€÷ÃáàX àÄl6›‚ƒƒMgh!!!úꫯLg@ƒà«aTvv¶âããuêÔ)-[¶LãÆ34):uRLLŒRRRtçwšÎà²Y­VÅÄĘÎ0fðàÁòññQFF†BCCMç'qðàA}ôÑGJKKSvv¶Z´h¡Q£FiÑ¢EºýöÛåíím:jäççkðàÁ¦34€ÐÐPeee™Î€ÁJ¼0¢ªªJIII6l˜‚ƒƒµ}ûvxz’ 5kÖèÀ¦S¸,§OŸVNNŽ,‹écÜÜÜ4räHY­VÓ) ‘;pà€’““©=z())IúàƒTRRR³â.¼›Í¦   Ó@``  Lg@ƒ`ˆ nçκþúëõ·¿ýM¯½öšV®\©.]º˜Î𬨨XuèÐAo¿ý¶é.ËÚµke·Û5jÔ(Ó)FY,effª²²Òt hdöïß_3¸Û³gOÍž=[Z±b…Ž;¦ÔÔTM˜0A­Zµ2 TVV¦“'O*88Øt €¨ÒÒR•——›N€zÇ/Luuµ’““5hÐ µlÙR_~ù¥¦Nj: hò<==5iÒ$-Z´H‡Ãt—Ìjµ*<<\¾¾¾¦SŒŠ‰‰Ñ™3g”m:4EEE5ƒ»þþþš3gNÍànqq±RSS+OOOÓ©ð‹l6›$1Ä 4’¤ÂÂBÃ%PÿâEƒ(**ÒÈ‘#õÔSOiÖ¬YZ¿~½‚‚‚LgÍÆ< }ûö)++Ët —,##CÑÑѦ3Œó÷÷W`` ¬V«é`Ⱦ}ûj îÎ;—Á]M‚Íf“§§§ºwïn:@èÙ³§ÜÜÜTPP`:êC¼¨w©©© Sii©rrr”””$777ÓY@³¦þýûëŸÿü§é.IQQ‘ d±XL§4 ÑÑÑÊÈÈ0P^^ž^zé%EFF*  fp÷ã?ÖÑ£Gkw=<}ú¨oß¾úË_þR3¸ûýwÜÐTØl6›ÎЀâÐ,0Ä‹zñᇪOŸ>Ú±c‡233•œœ,///ÓY@³v÷Ýw«ªªJ~ø¡é.šÕjÕˆ#x-ùÿEEEÉÍÍMëÖ­3êØwƒ»×^{­úöí«E‹iôèѲZ­µVÜe•JMQ~~>C¼@3 ‚‚ÓPïâE:}ú´uÇwhìØ±ÊÍÍÕðáÃMgÔ¡CÝ|óÍJII©µ}ß¾}š;w®¡*~šÝnWff¦,‹é”F£mÛ¶ŠˆˆÕj5êÀwƒ»¡¡¡êÛ·¯Þzë-Y,­_¿^Prr²FÍà.€&/??_AAA¦34 †x4ìÝEÙ°aƒ¦L™¢¯¿þZ+V¬Ð-·Üb: À$$$(66V;wîÔ–-[´páBeeeÉápè¹çž“‹‹‹éDj|ñÅ*++Stt´é”FÅb±hÑ¢E¦3ÀeÊËËSZZšÞÿ}íÝ»WÝ»w׸qã´páB :”c÷š“'Oª´´”•xf&00PÔ¹sçäééi:ê C¼¸bgÏžURR’^~ùe?^óçÏ×ÕW_m: À´iÓF:tPDD„Î;'9IÒ¹sçäååe¸€ÿcµZåçç§Þ½{›NiT¢££5{ölíÙ³G¡¡¡¦sÀEønp÷ÝwßU~~¾zôè¡[o½U‹-bp@³g³Ù$‰!^ ™ Ýn×X‰@“Æ/®Hnn®&Ož¬}ûöéõ×_×Ô©SM'ø£GjÉ’%š?¾öìÙ#UUUýè| ñ«Õª˜˜ÓÎàÁƒåã㣌Œ †xh¤ª««µuëV¥§§ëwÞQAAüýý« &0¸ ßc³Ùäåå¥nݺ™NЀ¾Ü-((`ˆ@“Æ/.Ëùóç5oÞ<ýþ÷¿WDD„¶lÙ¢ÀÀ@ÓY~`Ó¦MúÕ¯~%‡Ã!»Ý.Ià•¤ÊÊJµiÓ¦!óøI§OŸVNNŽ{ì1Ó)Ž›››FŽ)«ÕªéÓ§›ÎÿŸÝnWVV–>üðC}øá‡:räˆz÷î­»îºKwÜq‡úõëg:%›Í¦€€¹¹¹™NЀڵk'šN€zÅ/.Ù¾}û4eÊmÚ´IsæÌÑSO=%WWWÓY. ""B¿ýío5wîÜ_<ï¹sç €‹³víZÙív5ÊtJ£d±Xôä“Oª²²R^^^¦sh¶ìv»²³³•––¦´´4=zT×^{­|ðAÅÆÆjàÀ¦ Ñ³Ùl 6À€ÀÀ@†x4yL^â¢9-X°@ýúõSyy¹6nܨ™3g2À 4røÃ4qâD¹»ÿü÷60Ä hL¬V«ÂÃÃåëëk:¥QЉ‰Ñ™3g”m:€f§¢¢BË—/W||¼|}}5lØ0mذA=ö˜öìÙ£¼¼<%%%1À )??Ÿ!^ ™ PAAé ¨WL_â¢;vL·Ür‹¦M›¦iÓ¦ióæÍºîºëLg¸...JIIQÿþýåááñ“竬¬lÀ*~^FF†¢££Mg4Zþþþ ”Õj5@³ðí·ß*==]ñññêÔ©“n¿ývíÚµKÓ§O×Þ½{µyóf=óÌ3 1 N'??_AAA¦3ÀJ¼šƒŸ_–”––¦‡~XmÛ¶Õºuë4lØ0ÓI.Q‹-”žž®ððp•””èü”Ó_ IDATùó?:+ñ‹¢¢"Èb±˜NiÔ¢££•‘‘¡çŸÞt MRii©>ùä}òÉ'Z¹r¥Îž=«n¸AsçÎÕ„ ÔµkWÓ‰àôJJJT^^ÎJ¼@3ÅJ¼šVâÅO:uê”§Ûo¿];vì`€pb;wÖÊ•+åáá!W×ÿ÷ÏJ¼€ÆbÕªUòööÖ!CL§4j‹E[¶lQII‰éšŒ'N(55U±±±êܹ³UVV¦çŸ^GŽQVV–f̘Á/Ô›Í&I ñÍT`` ¾ùæ?~Üt ÔVâÅ­Y³F ªªªÒǬ›o¾Ùt€:п-]ºT±±±?:•x…ÕjÕˆ#äååe:¥Q‹ŠŠ’›››Ö­[§¸¸8Ó98­ýû÷kùòåJKKSvv¶¼¼¼¥… jܸqjÛ¶­éDh²l6›¼¼¼äççg:€’¤ÂÂBuìØÑp ÔVâE-š5k–bbb4dÈååå1À 417Þx£^xṸ¸ÔÚÎJ¼€ÆÀn·+33S‹ÅtJ£×¶m[EDDÈjµšNÀé*99Y‘‘‘ò÷÷×ìÙ³ >ø@%%%JOOW||<¼PÏl6›‚‚‚äêÊÇYæ¨[·nòòòRAAé¨7¬Ä‹›6mR||¼Ž=ª×_]S§N5 ž<ýôÓ²ÙlJII‘Ýn—ÄJ¼€†·{÷nÅÅÅ)::Z‹EÇ×Ö­[UVV¦èèhÓyNÁb±hÑ¢E’¤£GÊjµ*##CGŽѺuë ×иäåå)--MiiiÚµk—®¾új;V3gÎTLLŒ<==M'@“öþûï+77WAAA Vpp°òóól: €!®®®êÑ£‡ M§@½aˆ:þ¼æÍ›§ßÿþ÷>|¸¬V«üüüLg¨g¯¾úªvïÞ­œœUUU±/ Áùøø(77W»víÒ¼yóäáá¡Þ½{«W¯^ª¬¬”ÃáøÑÊñø?jß¾½ÜÝÝ¢½{÷ÊÕÕU‡C×_½é<Œ«®®ÖÖ­[•žž®÷Þ{O6›MÝ»w׸q㔜œ¬#FÈÝO@C©¨¨Ð /¼ WWWUWWK’ÜÝÝuõÕWkâĉêÕ«—‚‚‚Ô«W/õíÛ—ÕÐf" €•x4iì…nâ–.]ªñãÇËÍÍí‚§*>>^[¶lÑœ9sôÔSOÉÕÕµ+˜àéé©+VhàÀÚ¿?+ñ\ûöí%©fUøªª*åææÊÍÍM ÆŒ£˜˜3F:u2™Û(lß¾]«W¯ÖªU«´aÃ;wN-Z´ÐÙ³g%©æ@wÇŽMf`ŒÝnWvv¶ÒÒÒ´téR9rDþþþŠÕ[o½¥¡C‡ò%¢`Hxx¸¤ÿ;®)ýï"$ÅÅÅúðÃåáᡪª*IÒ¶mÛf¤@à Ԏ;Lg@½aˆ· ËÊÊÒwÞ©¹sçê™gž©ušÃáЛo¾©'žxB×^{­¶lÙ¢ÐÐPC¥—oÉ’%Š‹‹34 &L0à"ÝqÇJKK3\1OOOµlÙR5ۇΟ?/I*++ÓâÅ‹µxñb}úé§ ñJJIIQrr²\\\äp8$©f€÷;nnnºúê«Mä`ÄÙ³g•••¥ôôt}ðÁ:~ü¸®½öZ=øàƒŠÕÀM'$õéÓ§Ö î÷UWW«²²Rºí¶Ûàš‘€€-[¶ÌtÔ†x›¨²²2Mœ8QÕÕÕúýﯱcǪÿþ’¤ââbÝÿýÊÈÈÐo~óÍ;W†‹¯ÌâÅ‹M'NmÇŽ*//×ðáÃM§øûÛßL'uꪫ®ª5ÄûC...úÍo~£aÆ5`UãõÒK/iÕªU*((¨vþ!wwwuèС˸ÑC=¤Ž;*;;[ƒ 2\Z7&Nœh:pj'NTEE…Z¶li:À/`^45>>>*..¾àiîîîò÷÷çí÷xyyé½÷ÞÓõ×_ÿ³çóùìÝy\ÔÕþ?ð×° »ÊΕj˜1wSCEQ/ÈÅPÓlqé’ š™–uïMË[âB¥Yúxh¦. îä‚(¥–ššZ‰Ê’ Ìùýácæë830Ÿa†|=þàÌùœó>ËçÃ0ŸsæãîÞD§ººsæÌÁêÕ«Ñ¥Kƒ6ñþùçŸØ½{7öìÙƒ}ûö¡ªª }ûöÅ[o½…¸¸8øùù5AäDDÔ}ûöÅ/¿ü¢ói¼¶¶¶˜4i¿ˆè!!òòòбcGK‡CDDDDDdrV–€Lï£>ÂŽ;ÔrÕÖÖâ·ß~Ã?þñÄÇÇcâĉøþûï[Í^"2 nà%""KhÓ¦Þׄزe ¿eõÝ»wÇo¼++ÝÿÎ)•Jxxx4qTDDDDDDDDDDD†»|ù2z÷îO>ùðÓO?á·ß~Ó™·¸¸7nÄèÑ£áíí^xùùùxûí·qíÚ5dee!11‘x‰ˆZˆîÝ»«Nò !.\ØÄ‘¥®^½jáHˆˆˆˆˆˆÌƒ›x[™Ÿ~ú ³gÏÖú«¶¶‡ƲeË’’ÂÍzDDDDÔ,´k×2™L+ÝÚÚ‹-B=,Uó÷úë¯ã±Çƒ­­­ÖkµµµÜÄKDDDDDDDDDDÍVZZ{ì1üòË/¨­­ØØØ --MçêÕ«HIIÁ°aÃàããƒ_|°víZ«7îz{{[¤ DDd¼îÝ»«¯ÿ÷³µµÅ¿þõ/Y *"²¤6mÚÀÉɉ›x‰ˆˆˆˆ¨Õ²±td:UUU;v,êêêt¾nee…eË–á…^€‹‹KGGDDDD¤ÍÓÓ666¨©©Q§ÙÚÚ¢[·n˜7ož#kÞlll°iÓ&„……i½&„à&^""""""""""jvª««1oÞ<¼ÿþûÉd_P_WW‡Ï>û •••øòË/qúôi¸¹¹!** [·nň#ø…õDD­D×®]amm­µÎÑÚÚ¯½öš…¢""K à&^"""""jµø$ÞV$11¿þú«Îo©îÝð¸yó&fÍšÕÄ‘éæáá++ÍK¬­­±iÓ&X[[[(ª–!$$K—.Õê?ÜÄKDDDDDDDDDDÍÊüþýûcõêÕ ±Wõû™3gœœŒG}»víÂ7ðÙgŸa̘1ÜÀKDÔŠØÛÛ£S§Ni¶¶¶˜={6Ÿ°Nô D^^ž¥Ã """""2 nâm%vìØO>ùDï^•šš|úé§HOOo¢ÈšœœÈd2777}º…£j9d2Ö¯_ÿ¸‰—ˆˆˆˆˆˆˆˆˆˆ,­¦¦óçÏGll,***PSSSo~!vìØÑDÑ‘%uïÞ]ýTvÌŸ?Ÿ÷8‰rÜÄKDDDDD­7ñ¶pJ¥O?ý4ªªªÔj©ØÙÙA&“ÁÊÊ ¡¡¡˜={6<ˆ’’¬ZµÊB[ÞÒ¥Káéé‰7â믿Öz=)) IIIøÛßþfèèa¦P(0`À€&¯W¥R ¥RÙäå[ªÍÔ8ÆŽÇ›ˆtñôôDmm-d2är96mÚTï—Ó6???¬ZµJýÿ€µµ5œ-=Ì®\¹‚Þ½{cÙ²eBh­iÑE©TâèÑ£(++k‚‰ˆÈ’ºwï®~:»B¡@bb¢…#""KS=‰×÷DDDDDD-¥ ÆùÏþƒ¬¬,÷ë@]]üüü0zôhDFFbÈ!puuµd˜ÍЧ§'Þ}÷]L™2 øá‡`kk 8pà~þùg|þù玒¨é8;;ãòåË-¶|""jÙÜÝÝÜûÒ‡?þ¾¾¾ލeš4iÒÓÓ±cǸ¸¸p#4i;v,¶oßné0ˆˆêU[[ 777K‡A&”ššŠ§žzÊÒaQ3Ó­[7XYYA©Tâ7Þà—QYY‰ââb´mÛÖÒá™”Ö&Þ'N`ùòå–ˆ…$***R?IÖÚÚíÚµƒ··7¼¼¼ P(P\\ŒÏ?ÿ¼YlHݶm›¥CÐðüóÏcýúõÈÎÎÆŠ+0oÞ}°xñbôïß_#_cǼººo¿ý6¶nÝŠ«W¯ÂÁÁýû÷ÇÔ©S1jÔ(õÜ ­ËØq3ô8CÏy©y¥jŠëeMM ll´Þ†™TKy_ogg¹\ŽîÝ»7i½æ~Ÿj‰þ···G¯^½››Ûdu«¹þŸ@DDDDDDDÔÚùûûóiˆDDÔdšû&ÞíÛ·£oß¾ð÷÷·t(D%OOOxzzj¬_!"ÓÛ¾};ÆŽÛì7ñ@&“áêÕ«èÑ£‡¥Ã!"""""2-ñ€ÔÔT¡#™È(æžO-îܹ€0`€ðöö7nÜÐx½  @ ///±{÷nQVV&.\¸ bcc…L&k×®ÕÈïää$ú÷ï¯UO=„§§§Vztt´ ÂÃÃEff¦¸}û¶ÈÉÉÖÖÖ¢¨¨HoÜ¿þú«pss~~~⫯¾åååâܹs"22R´oß^ØÛÛÝŽU«V bóæÍe<ûì³€ˆ×Hß¹s§ˆˆˆÐÙ®èèhqüøqQQQ!<(är¹èÕ«—V{„ŸŸŸÑ1ïÞ½[ï¼óŽ(--EEEâý÷ßVVVbîܹê»ú44~RâBÿüBˆüü|ñ·¿ýMxyy‰½{÷Šòòrqþüy.ÄñãÇ ŠYW_ßß–ÊÊJé±±±âÔ©S¢¢¢BlܸQ#GŽÑÑÑâ‡~åååbÍš5€˜={¶Áå×׿ú˜".)ã3|øpaee%.]º¤K¿~ý´Î}„«««eÊáêê*¾úê+qçÎQXX¨¾îeff]—±ãVßqRÎy©×f}{í1ÅõÒqqq"..®ÑåPë×RÞ×ß¹sGìß¿¿ÉëmîïScÇŽ©WŠ–2?‰ˆˆˆˆˆˆˆZ~¾LDDM €HMMµtz5÷øˆZ»´´4q÷î]K‡AÔ굤¿wÞÞÞbåÊ•–ƒˆˆˆˆˆÈÔ¶r/™UsßQQQ!ñá‡j½®ÚˆµeËôªª*áëë+är¹(,,T§»‰wß¾}’â;v¬ ¶oß®‘~ýúuaoo¯µUJ;JJJ„1b„:ß;w„»»»èСƒËå⯿þR¿6fÌñé§Ÿêl×îÝ»5Òãââ­ ʺ6ÒI‰y÷îÝbРAZý4qâDakk+ÊÊÊÔiRû®> Ÿ”¸„¨ƒãäÉ“un,((ööö¢GÅlì&Þ½{÷j¤wéÒEÇŽÓH <òˆÁå7vocâ’2>€HHHÐÈ›••%üüü ¾¡&ˆ'Nh¤Ÿ;wNaaaê4SŒyPPxüñǵÒ;uꤱ‰Wj]æØÄ+圗zmÖ§±×S\/ÁEVd(¾¯¯_sŸÚÚ±ˆˆˆˆˆˆˆˆš?_&"¢¦ÖÜ7 5÷øˆˆˆL¡%ý½ëÝ»·xùå—-‘©mµjô£|‰Z0'''<ñÄ€°°0­×wîÜ 5j”Fº½½="""PYY‰ŒŒŒFÇÑ»woIù8>|¸Fº¯¯/:uꤕ_J;<<<ðä“OâàÁƒ(,,¤§§£OŸ>x饗PYY‰/¿üPZZŠ£G"66Vgœ½zõÒø= ŸŸß`¥Ä…ÌÌL­2ÂÂÂPSSƒŸ~úI&µï ¡oü¤ÄÕ´´4XYY!**J#ÝÛÛ]ºtÁéÓ§qíÚ5iKгgOß}}}u¦ûùù4¾Í!.)ã‰ÐÐPlذ%%%êô¥K—bæÌ™°µµ58fôéÓG#-44¾¾¾8{ö, ˜fÌGŒãÇcÚ´iÈÉÉA]]àÂ… 4h:Ÿ¥ç íœ7çµÙR×K"""""""""""""""""¢‡Y`` ®^½jé0ˆˆˆˆˆˆLŽ›x‰ô¨®®FYYàìì¬õº——¨7n5†“““¤¸ÊËËáàà…B¡õz»ví´òKmÇ3Ï<ƒºº:|þùç€Ï>û Ï<ó ÆkkklÞ¼°eËDEEéŒ\]]5~·³³(•ÊÛ(%æ²²2¼ùæ› …»»;d2d2^yåÀ;wÔåJé;Cé?Cãjˆª?”J%\]]Õå¨~¾ÿþ{À¯¿þjTü†pqqÑøÝÊÊ ÖÖÖpttÔH·¶¶np|›K\RÇ')) wîÜÁêÕ«/^Ä‘#G0mÚ4I1{zzB&“i¥«æßÍ›7M6æ«V­ÂÆqåÊDDDÀÅÅ#FŒPoTšÇü’rΛóÚlÉë%ÑÃŒ›x‰ˆˆˆˆ¨µâ&^"=ìííáêꊪª*”——k½~ãÆ ÷žT©bee…»wïjå½uë–IãrvvFUU***´^/--ÕÊ/µ£F‚‡‡>ûì3!''111ðòòBdd$Ž9‚‚‚|úé§xæ™gLÖ6cc=z4-Z„©S§ââÅ‹P*•B`ÅŠ!„º\)}×X†Æ¥¢kc§*n777ØØØ ¦¦B?ƒ6iüMA_››‚Ôñyúé§áåå…?üÕÕÕX¶l&Ož wwwIõ–••éL¿yó&€{›yM5æ2™ “&M¡C‡pëÖ-¤¥¥AØØX,_¾€qóËØq«oŽzÎsM3TK¼^µDÞÞÞZ_,š››«‘'..2™ ׯ_×H_¸p¡Æqÿûßÿš2ô‡Rjj*ºuë¹\®î÷óçÏK.'--Mc쪪ªÌ-‘ù}ñÅêyìààÐäõàí·ßFÏž=áââooo„‡‡k|™3QKÀM¼DDDDDÔ*q/Q=ƌػw¯Fzuu5> ¹\ŽáÇ«Ó}||´n"šüC…‘#G8 ‘^\\Œ .hå—Ú;;;ÄÇÇãÌ™3xýõ× ¹\˜4iêêêðïÿ2dˆIÛ&5溺:dggÃÛÛ³fÍBÛ¶mÕ+++µÊ•ÚwÆ’8::jlä‘GðÉ'ŸbccQ[[‹ììl­ãÞ}÷]¢¶¶Ödñ7•úÚlNÆŒ½½=póæM,[¶ ›7oFbb¢äº+**pöìY´üùùù ƒÓŒ¹›››zÁ‹­­-† ¦^qÿ¹%µ.cÇ­¾ã¤\§¤^Ó¤h‰×K""""""""""¢–¦°°P} )) B„„„¨_¯««ÃáÇÇ.^¼%%%pssÃÝ»w1þü¦ ü!”ñãÇ#22EEE¸téüýý*+&&BDGG›8J¢¦5nÜ8!a‘ú§NŠ•+Wâ¿ÿý/ ““ÄÆÆòšHDDD-Z`` Q]]méPˆˆˆˆˆˆLŠ›x‰ê±dÉ!)) {öìAyy9.^¼ˆ &   )))ðòòR猌D~~>>üðCTTTàòåËHLLD»víL×;ï¼$%%áàÁƒ¨¨¨ÀÏ?ÿŒ‰'B¡P4ºÀ½Íg°víZ§GÆÄÄÀÙÙk×®ÅÓO? ++ó\F ÙÚÚƒ Baa!–.]ŠââbTVV"33kÖ¬Ñ*WjßKj\н{w\¼xyyy8qâ®\¹‚ªû#88Ï?ÿ<öïß²²2”––âã?Æ[o½…äädØØØ˜,þ¦R_›Íɘñ€„„Èår,\¸C‡E‡$×íää„3fàÛo¿ÅíÛ·qêÔ)Lœ8vvvHIIQç3Õ˜¿øâ‹8w«qóæM¼÷Þ{Bhl(•Z—±ãÖÐ7ô:eÌ5ÍPMq½üóÏ?Ñ©S'!??ߨ8‰ˆˆˆˆˆˆˆˆˆˆZº#FÐþò]øöÛoÕ_ ªëõƒ"<<¶¶¶æ ’°mÛ6!˜˜…Bàà`äååáïÿ»Þc  ЄQikŽóД1%''cÔ¨QprrBûöí±~ýzøùù!997oÞ4IDDDDM-00B\»vÍÒ¡™7ñÒCkÍš5Édؼy3`àÀÉdO›ôööÆÉ“'1~üxÌš5 žžžèÝ»7nß¾C‡aêÔ©e.^¼S¦LÁ;#víÚáÙgŸÅ+¯¼ooo”””@&“aþüùÈÉÉL&Czz:@.—«Ÿjˆàà`œ8q½zõB\\œº®™3g"44ÕÕÕÉd˜2eŠQí€~ýú¡cÇŽ Dxx¸:].—ãŸÿü'hlV ³] .Èd2¼ûÇ{ QQQHNN†L&ÃÙ³gqýúuÈd2u~)1§¦¦búôéøàƒàëë‹   lܸ&L 6 ={ö4ªït1tü¤Ä+W®D×®]ѹsgÄÇÇ#%%;w´k×ß}÷bbb0cÆ ´mÛ!!!øòË/‘žžŽ§žzJo¼ôöµê©¬÷·eâĉzÇòÔ©SÉdÈÈÈ@]]d2þ÷¿ÿ!++ 2™ ÇŽÃíÛ·!“ÉðŸÿüGoù†´Ùо7&.cÆÚ´iƒ‰'B9sæÔÛçúúßÍÍ Ë—/Ç‚ àíí'žxîîî8räˆÆ¹ÖØ1€cÇŽ!$$ãÆƒ‡‡:wîŒ`í‡)‡Æ IDATÚµxíµ×Œ®Kê¸rœ”sÞ˜kš¾ñh̵GEêõR¥R ¥RÙ`ŸµVèܹ3rssqõêU×222ðâ‹/B¡PàСC¨««Óz}øðáMîC+//àééiáHˆHeÏž=˜x÷Ýw±bÅ ìÚµ ÇG¿~ýÔ¯ûûûã›o¾APP%Â~¨ÄÄÄ ==•••ppp0è…Bnݺ!++ËdeIÕÐ<4…¡C‡"++ UUUÍ"¦:àòåË8þ<ºtéb–:¤’ÉdHMM5èKª-¡¹ÇGDDd -éïNNNøè£´¾´„ˆˆˆˆˆ¨ÛÆ'ñI°fÍIOá%""""""""""""ÝTOÓÍÈÈP§•––"77?þ¸Î×ÏŸ?GGGõÞ¢¢"Ìš5 íÛ·‡Ú¶m‹ØØXœ9sF}LZZd2™úçÂ… xê©§àéé©N+..6¸¼úÔÖÖ"55Æ ƒ··7är9BCC‘’’¥R©7¦ßÿñññpssƒ§§'¢¢¢pùòeÀ­[·4òÊd2,^¼X]ßýéqqq ÆXRR‚9sæ 88vvvpwwÇÈ‘#‘™™©_zz:@.—C&“¡oß¾zËMNN†L&ÃíÛ·‘­ŽÉÆÆFgþÂÂB½m¾_cÆD“L&ƒ¿¿?Nž<‰ˆˆ8;;ÃÑуFvvv£ê4嬮®Æ›o¾‰8::ÂÃãGÆ®]»´žH­Ïýãkoo :6l@ee¥Î| ÍCæ©1ùéï†Úgè<”Rgnn.bbbàêê ''' 8PÒF\Cc2dLôùôÓOqùòetêÔ >ú¨Á±5'2™ øã?, ‘Iq/Q=Ö­[‡1cÆ ¢¢kÖ¬ÁŸþÙ"¾•ˆˆˆˆˆˆˆˆˆˆˆ¨¹ ‡\.ÇáÇQ[[ 8xð ÂÃÃagg§ÞÄ{àÀõ1êô‚‚ôêÕ [·nÅêÕ«QZZŠ£G¢´´ýúõÉ'Ü{ò«ÑÑÑ€éÓ§#!!yyyÈÉɵµµ¤òêsàÀŒ7C† Á/¿ü‚¼¼öööHHHÀÍ›7±lÙ2lÞ¼‰‰‰?fÌÀÞ½{5Ò«««qøðaÈår­ÔR9::âîÝ»êßyä|òÉ'F•eÊ1®ªªÂÉ“'5Ò~üñGäçç#,, >>>’ë4õtssCnn.ÀÖÖÆ SoœypÌtQï¾}û´^{ì±Ç0{öl|朆’Ò‡†¶¨J©säÈ‘€hä+..Æ… $µµ¾˜Œ“ÚÚZ„„„HŠƒŒ§kPMM rssñÖ[o!77={öÄsÏ=§÷Éë­Õò€÷=ͧ¹®­"Ž%<ìkx}}}!„@aa¡¥C!"""""2™fµ‰W¥R ¥RiéPzÉÉÉ5jœœœÐ¾}{¬_¿~~~HNNV -Õ/77?þ8¢¢¢°~ýzØØØX:$ƒµ”s±9Æ©P(,öÄecꮯM]Þâ¾>ضm„HLL„B¡@pp0òòòÐ¥K—fÓo-} -y‘~ú®ÿûß-5ª»uuu:ŸZªÚ¸æè舮]»ªÓ—,Y‚àà`<ÿüóØ¿?ÊÊÊPZZŠ?þo½õ’““%ݧmlyÖÖÖ4h ±téR£²²™™™X³fÁq4$!!r¹ .ÄСCÑ¡Cƒ]²d ‚‚‚””„={ö ¼¼/^Ä„ PPP€””xyy5*¾îÝ»ãâÅ‹ÈËËÉ'påÊ 8Ш²L9Æ®®®xíµ×pâÄ Ü¾}§NÂĉagg‡””£ê4õ€_|çÎCuu5nÞ¼‰÷Þ{B 2Ä þ ÂìÙ³±wï^”——ãÚµkHHH@AAz“kSÌCIíoCÚÔ?¥ÔùÎ;ïÀÃÃIII8xð ***ðóÏ?câĉP(’ÚÚPLRÇdíÚµprr¼yóŒîjŠºº:Éß$ú0ÊÎÎFxx8,X€E‹Y:ÉZʹØRâlÎL݇“úû //àééið1M­9ÅBD­‡¾ë :666èß¿¿ÎMqªM¼>…²]»vøî»ïƒ3f mÛ¶ Á—_~‰ôôt<õÔS€œœÈd2¤§§är¹ú ¹Æ”WŸÔÔTLŸ>|ð|}}„7b„ €aÆ¡gÏž:cZ¸p!@&“áÝwßpïé¢QQQu´iÓ'N„sæÌi0¦ûy{{ãäÉ“?~ËÉÉi°Ž•+W¢k×®èܹ3âãã‘’’‚Î;ÕfSŒ‰ŠB¡À|€ÿþ÷¿ðññÁO<www9ráááê|Rê4õ>3gÎTïŸþ‰o¾ùùšRÇÌÜclhûýóPjÁÁÁ8qâzõê…¸¸8´k×Ï>û,fΜ‰ÐÐPTWWC&“aÊ”) ŽO}1:&÷S*•Bp£h3ó¿ÿý}úôÁ®]»ðÅ_X:21Þ÷$¢¦ð°¯áõññ•• , ‘É´œGƒ’Å]¹ràááaáHš·/¿üÓ¦MÆ ´n¦Ñí®®ÎÒ!Y¯DDDDDDDDDTWWWÔÔÔè}½[·nz7©yxx`Ù²eX¶l™Þãûöíkð&7CÊ«O›6mô>uwÉ’%¿ë‹ÉXûõë‡ï¿ÿO<ñ„ä===±bÅ ¬X±Bož˜˜£7>òÈ#øú믵Òë‡úêjì˜ÜOµ)¶!Rê4å kôS› _Có3fæcCÛ§oSg§N°sçN­ôQ£F5x¬”˜ m›ÊôéÓ1}útI1ùÉd2̘1ß~û-V¯^ñãÇ[:$2!Þ÷$"KzXÖðÚÚÚ¢M›6|/µ*~¯êÛWU?üñâããáìì OOOLš4 þù'~ÿýwŒ=ÎÎÎðññÁÔ©SQ^^®·œªª*À€4Ò'NœàÞ7ñÞŸ~ëÖ-uYEEE˜5kÚ·o;;;´mÛ±±±8sæŒVü¹¹¹ˆ‰‰««+œœœ0pà@dee5yûUJJJ0gÎÃÎÎîîî9r$233»”~yЧŸ~ŠË—/£S§NxôÑG ͇~ˆ„„ìÛ·¯Á ¼RÆÃ¼ÉÉÉêyèïï“'O"""ÎÎÎpttÄàÁƒ‘Ý`ô‹¦ÿþû››<==…Ë—/K.ßÔ× cãlìµ@Õÿ·oßFvv¶º~Ýß•PXXØ`\µµµHMMŰaÃàíí ¹\ŽÐÐP¤¤¤@©T]wC}hêò ººo¾ù&BBBàèèŒ=»ví2è‡!Ç{H9ï¿FÛÛÛÃßßC‡ņ PYYÙà¼|ð›µûöí[o¿IÏÔÓL}þëŠwÔ¨QpuuÕ£[·niÔ)“ɰxñb÷ÎûÓãââ ž·†ögcç,ÝSßõ̯1ïÿ‰ˆˆˆˆˆˆˆˆ¨y[³fä§ðQÓ0`€{O³¾ÿK*¤¬ »ŸÔûçRê[¼x±úXUÜpàÀuz›6mŒî‹M›6ižfÍ£Ö Òž˜˜²ïoÓáÇ!“ɰ{÷nuZRR’FþÚÚZí0ä¾§!ñ=¸þâÂ… xê©§àéé©N+..ÖÛŸ†¬e:¦RbjÌýGs¬­jª˜L5¶ëÖ­3i_K]Ïcìš0cÆÆÐuo@ãÖè4Åz1cÆBߨ6¦­Û^>‰—ˆˆˆˆˆZñ€ÔÔT¡#¹AÑÑÑ€ˆ§NbãÆ€9r¤ˆŽŽ?üðƒ(//kÖ¬ÄìÙ³õ–SYY©N;sæŒprraaa¢¢¢B!DUU•èӧزe‹Æñùùùâoû›ðòò{÷îåååâüùó"<<\888ˆãÇ«óþúë¯ÂÍÍMøùù‰¯¾úJ”——‹sçΉÈÈHѾ}{aooߤí/((AAAÂËËKìÞ½[”••‰ .ˆØØX!“ÉÄÚµkŽ]J¿Üï§Ÿ~³fÍVVVÂÝÝ]|÷Ýw÷‰ÆÏ§æR¾!~øá@( @¼üòË #e<¤Ž]XX˜prrýúõÇâäÉ“¢k×®ÂÎÎN=zÔ vé:ïOŽŽV—ðàA!—ËE¯^½ *ûþrÌqͧ)¯NNN¢ÿþ ¶ûþ¸>,\\\´âÚ½{· ÞyçQZZ*ŠŠŠÄûï¿/¬¬¬Äܹs%×ÝPLö¡)Ë›2eŠpuu_}õ•¸sçŽ(,,sçÎDfffƒeJ9^Ê9 åüR]£½½½ÅîÝ»Å_ý% Å¢E‹±bÅŠzû ¾t}¯Yúoš¹Îÿ°°0áêê*,²²²Dyy¹Þ1>|¸°²²—.]Ò*§_¿~bóæÍiõÍ[)ýÙØ9kNqqq"..΢1PËÐÞ'©Ôwý³”Öþ>ÕØ÷ÿMÅÒýCDDDDDDDô0âçË-ÛÚµkELLŒ(//}ô‘èØ±£¨©©±tX-FXX˜ðóó³tD"55ÕÒaèeL|ªuBÑÑÑzóTVV €ÈÏÏBH[¦”ûçRëÓw¯½GÂÓÓ³ÁØT¼ÞÖÖÖŠ9sæˆaƉÒÒR¼RÖ HiϪU«­õÏ>û¬ âãã5ÒwîÜ)""" jŸ¾ûžRû[UNxx¸ÈÌÌ·oß999ÂÚÚZé­_ÊZ©cÚPL¦ºÿhʵUM“9ÆÖÔ}-u=Ocׄ™zÝ›)Öè˜k½˜±c¡olikc×ð Ñüÿë2räH1yòdK‡ADDDDDd*[M¾‰wïÞ½é]ºtıcÇ4Òƒ‚‚Ä#<¢·œ?èÚºu«zßR©“'O¯½öšÖñ“'OÖù!\AA°··=zôP§;VÛ·o×È{ýúuaoooÔ†§Æ´_õAდ«ªª„¯¯¯Ë墰°Ð¨Ø¥ôËý¬­­…˜5k–¸~ýz½ ­µoŽâÿ>œä‘G„‹‹‹ –.]Zï1RÆCêØ……… â‡~ÐH?wîœ Â jWC›øvïÞ­‘'ÔûA²®rÌuͧ)¯†~Ðü`\&LЊk÷îÝbРAZeLœ8QØÚÚŠ²²2Iu7“97ñ‰Ç\+o§N ú°UÊñRÎ)ç—ê­ëÍ#F˜e¯¥ÿ¦™ëüWщ'4ÒuQFF† 4òfee ???q÷î]ôúæ­”þlìœ5'.²"C5‡÷I*ÜÄÛôŒ}ÿßT,Ý?DDDDDDDD#~¾Ü²­]»V666¢k×®âôéÓ–©EXºt©z#êçõ×_·tXDæ¾iÈ\›xïܹ£µ‰Wʺ0}¤Ü?—ZŸ96ñþùçŸbøðá"11QÔÖÖj啲AJ{JJJ„1b„:ß;w„»»»èСƒËå⯿þR¿6fÌñé§ŸÔ>}÷=¥ö·ªœ}ûöT¯Š”µ ÆnâÕ“©î?šrmUSÄdޱ5u_K]ÏÓØ5a¦^÷fŠ5:æZ/fìXèÚÚØ5¼B4ÿ¿Çº¼ð bذa–ƒˆˆˆˆˆÈT¶ZÁÄzöì©ñ»¯¯¯Ît???äçç\îØ±cñúë¯ãË/¿Ä€PRR‚E‹iåKKKƒ••¢¢¢4Ò½½½Ñ¥Kœ>}×®]8p0|øp­˜;uêdpl÷kLûwîÜ 5j”Fº½½="""PYY‰ŒŒ £b—Ò/:räRRRÔm!ÝBBBpàÀ8;;ã•W^ÁòåËõæ•2ÆŒ““ºu릑 ___œ={i* W¯^¿€¤ó0ß5CÅ8Íq-—ŸŸŸV\QQQÈÌÌÔ:6,, 555øé§ŸÌ›9Œ1ÇÇ´iÓ““ƒºº:À… 0hÐ “oè9 åüR]£GŽ©Ußþýû‘””Ô`;¤²ôß4}Lqþ;88 OŸ>iºÆ(22¡¡¡Ø°aJJJÔy—.]Š™3gÂÖÖÖà:¥ôgcç,‘¥5æý?5?S¦L5558{ö,ºwïnéZ„¹sçB¡ñ³xñbK‡ED­œê~·­­-Ú´i@Úº0}¤Ü?7E}qáÂôéÓVVVX¹r%¬­­õæ5d ‚”öxxxàÉ'ŸÄÁƒQXXHOOGŸ>}ðÒK/¡²²_~ù% ´´GElll£Úkl÷îÝ[R=M±–A_LM}ÿѵUM“9ÇÖÔ}mªõ| 1õº7SÍks¬3v,ô­±m}×ðúúúšd+QsaòM¼...šXYÁÚÚŽŽŽéÖÖÖP*•’Ê^´húôéƒãÇcìØ±°²Ò ¿ººeeeP*•puu…L&Óøùþûï¿þú+ª««Q^^( ­ºÚµk')6cÛ¯ŠÝÁÁÎÎÎZåzyy %Ç.¥_¨qúõë‡ýû÷C¡Pàå—_ÆÊ•+µòH§ÆŒ›››ÎøTsãæÍ›n««««Æïvvv ù¼6ç5Ã8Íu-—êzvËÊÊðæ›o"44îîîêqå•WwîÜ1Klæ°jÕ*lܸW®\ADD\\\0bÄõݦ>ÞsÀ˜sQß5ÚšÃß4}Lqþ{zzB&“i¥ëºN%%%áÎ;X½z5àâÅ‹8rä¦M›fp}R¯§³DD–Ä÷ÿDDDDDDDDDDDD–“••àÞ:"[[[IëÂbÈýsSÖgŒ?ÿü111ð÷÷Çþýû±iÓ¦zó²¶Gj{žyæÔÕÕáóÏ?|öÙgxæ™g0~üxX[[cóæÍ€-[¶ **JçZ C5¦¿œœ$ÕÕktÅd‰û ­­jŠ˜Ì=¶¦îkS­çkˆ©×½™j^›k½˜1c¡oü¹Ép>>>&߀NDDDDDdI&ßÄkNGEYYBCC‘€³gÏj¼noo777ØØØ ¦¦FëÛTU?ƒ†½½=œQUU…ŠŠ ­ºJKK›ªYêØ]]]QUU…òòr­×oܸàÞ7xI]J¿Pãõïßûö탓“fÏž>ø@ãu©óÔ˜±+))B+6Õ¦8smLm‰L}-е)ÑX£GÆ¢E‹0uêT\¼xJ¥B¬X±´Æ€f IDATØ”u›º<™L†I“&áСC¸uëÒÒÒ „@lll½O­6öxCΩçb}×hshÉÓ QVV¦3]×uêé§Ÿ†——>üðCTWWcÙ²e˜+++ܽ{W+ï­[·ŒéA6668tèÒÓÓŠ©S§âäÉ“’ËQ1¦=£F‚‡‡>ûì3!''111ðòòBdd$Ž9‚‚‚|úé§xæ™gŒŽÍØøŒ%e-ƒ)ÇÔ”÷Mµ©)bjʱ½¿Nsßë5õ3]¤¬{3Õs¬3õXp=’á|||PZZŠÊÊJK‡BDDDDDd-fïo¿ý†^x;vìÀ®]» —Ë¢¢"|±±±¨­­Evv¶Vï¾û.Q[[ 9r$àÀùŠ‹‹qáÂ3µD¿1cÆöîÝ«‘^]]ÇC.—cøðá¤Ç.¥_îW[[‹ãô8p öîÝ GGGÌš5KýἊ”ñ0f쪪ª´>üþñÇ‘ŸŸ°°0øøø4¶‰­Š)¯ŽŽŽ€?òÈ#øä“O$ÇTWW‡ììlx{{cÖ¬YhÛ¶­úT}L™ªns”çææ†ÜÜ\€­­-† †´´4Èd2­kž)Ž7ôr~©®ÑûöíÓÊûØcaöìÙ ¶Cª–ü7­!Z_Æ¡ï:eoo„„ܼyË–-ÃæÍ›‘˜˜¨³Üúæ­”þlìœ%"²4cßÿéræÌôìÙ‘‘‘pqq±t8fQQQŽ;"**ªÑeeggcüøñˆŒŒDQQ.]ºÔ$hõÕûã?",,Ììõ›Cvv6 ¥R‰ììl 11¯¾ú*æÍ›géðš…Ö0w©a¦g)¦NŠ à7ÞhÒz[² à»ï¾Ã˜1c0vìXuº”uaõ1ôþ¹Ôú|||pýúu¼………¸zõjƒ1=ÈÙÙ~~~P(صk bbbPPP ¹,©í±³³C||<Μ9ƒ×_ÑÑÑËå€I“&¡®®ÿþ÷¿QPP€!C†—±ñKÊZSŽ)`ºû¦\Ô15ÕØÞÏÜ÷zM½ÆìAR×½™jŽ9Ö‹™z,Œiëú†×××€ùžODDDDDÔÔZÄ&ÞŠŠ ÄÄÄ`åÊ•xôÑGѾ}{lß¾ùùùˆ‹‹CMM:ï’%KŒçŸû÷ïGYYJKKññÇã­·ÞBrr2lllï¼ó<<<””„ƒ¢¢¢?ÿü3&Nœ…BÑäí\²d ‚‚‚””„={ö ¼¼/^Ä„ PPP€””xyy»”~QY»v-œœœxãËHáááØ³gär9f̘իW«_“2ÆŒ««+^{í5œ8q·o߯©S§0qâDØÙÙ!%%¥Iû¡%0åµ {÷î¸xñ"òòòpâÄ \¹r”“µµ5 „ÂÂB,]ºÅÅŨ¬¬Dff&Ö¬YcÖºÍUÞ‹/¾ˆsçΡºº7oÞÄ{ï½!„Á7C¤oè9 õ\ ÂìÙ³±wï^”——ãÚµkHHH@AAY6ñ¶ä¿i qrrÂŒ3ðí·ßtJHH€\.ÇÂ… 1tèPtèÐAg¹õÍ[©×ÓÆÎY""K2æ=$‘.ýõFþóŸ˜1c†¥Ã1!”J%”Je£ËÚ¶m„HLL„B¡@pp0òòòð÷¿ÿÝ‘6¿zÍiݺu¨­­ÅÊ•+'''ÄÇÇã…^°thÍFk˜»tB¡À€t¾fÊq–"88;wîÄÛo¿­[·6iÝ-…R©ÄÍ›7‘žžŽˆˆ¼÷Þ{xþùç±yóf§]JYÖCîŸK­/22ùùùøðÃQQQË—/#11íÚµkTÿ¨Öù!66ÕÕÕF•cLÿMš4 À½5p÷?m7&&ÎÎÎX»v-ž~úiXY5~ ¥)Ç·!†®e0õ˜šêþ£)×#5ELM9¶¦n—>¦^ö cÖ½™b޹֋™z,¤´õa^ëÚÄ›ŸŸoáHˆˆˆˆˆˆLD< 55UèHÖëĉ€ÆÏ믿.Nž<©•¾dÉñÍ7ßh¥ÿûßÿ;wîÔJúé§ÅK/½¤‘öã?Š¢¢"­¼‹-RÇTRR"æÌ™#þßÿûÂÖÖV´mÛVDFFŠƒjÅáÂ#\\\„\.½zõ{öìê²_xá³·_¥¸¸X$%%‰   akk+\]]ÅðáÃÅáÇ»”~Bˆ5kÖ¹\.æÎkÈTÐIê|jnå7ÄÉÉIk<—.]ª‘çСCB.—kÍU)ã!%oXX˜ðóó?ÿü³>|¸pvvr¹\„‡‡‹¬¬¬Û¤ï\Ô7×…Zé£FÒ[¾¹¯ÆÆÙØkJnn®8p prrbÕªUõ¶»¾¸ŠŠŠÄôéÓE@@€°µµ^^^âÙgŸóçÏWçíÑ£GƒuKks”wæÌ1}útѹsgáèè(<<û¬ ~úé'½ÇÞÏûž†Ä§«?¤Ü3“²–ÁÐ1•“)î?šrm•¹cR1ÕØšº¯í3©kÂ̽îÍkt̹^ÌØ±Ð5¶RÛjŠ5¼B4ÿ¿ÇºÔÔÔkkk±uëVK‡BDDDDDd [eBûlݺñññx ™È(æžOœ¯Úºuë†ââb\»vÍÒ¡YÏÖkýúõXµjN:eéP,jìØ±î}:Q}ø>©~|ŸjYì"""""""¢¦gÌçËBøøø C‡ÈÊÊ2Wh­NLL ÒÓÓQYY ‡fQoK½‡¶k×.DGG#,, YYYP(–©U³ÔÜ¥{ ºuëÖ,¯·[¶lÁ„ ––†èèhƒ“ÉdHMMÅSO=eÆèŒ×Üã«ïŸýŸ–ú^·©´Ô¿wÞÞÞX°`- Qcm³²tDDDD†X³f æÌ™cé0ˆˆˆˆˆˆˆˆˆˆˆgÏžÅ7¦‘žœœ ™L™Lœ„È&‰}©ŠjðšÒIj‹¥ÑÍÔR:¶„¡c¾ÕV«)Å¡h0£Mg”0JK,ƒ&¶N£UÄR*$–DR[Bäüþ˜oÎW&”ùdy¿®+×Õ<ç9Ÿs?ç|Ns$ç>®\¹¢O>ùD—.]*sŸ @Yöã?J’êÕ«W`|âĉ²X,òõõUff¦BCC5}út¥¥¥é_ÿú—222Ô¥Kmß¾ÝzÔÔTùùù)&&F .TFF†¶mÛ¦ŒŒ ùûû+!!¡Èsûöí+‹ÅbÝräÈ‘5j”NŸ>­ÄÄDU®\ù¾ÖùßǹÛxXX˜ÂÂÂtæÌ­\¹R[¶lÑ‹/¾x×ùׯ_—ÅbQbb¢$)--M~~~Z¾|¹Ìf³.^¼¨Ý»wËÞÞ^ZºtiÛïÒ¥‹ÜÝÝ­×¿Ûø½n÷n6nܨAƒ©K—.:tèNŸ>­#Fh„ /0÷رcò÷÷×¾}û´zõj?^Ë–-“ÙlÖdkk+‹Åb]Ø1c4oÞ<ÍŸ?_ééé:tè¼½½Õ§OíØ±ãÞФ­[·ª]»vzçwÔ§OmݺU Pnn®uNpppcÿþý󘜻¥ëܽýØ_|ñ…õØû÷ïW§N4dÈEEE)Ãîý^ó‹ò8ßïúòÏKuèÐA‹E‹Åz®×ã,ý¹œ¯nݺ’þïçJ?T4”x”'”xr"ÿ“Y“’’tæÌ™L&M:ÕèX@‰á9P>ÅÆÆÊÕÕU‹-ÒŠ+¬Ÿ6 ½ü7L;;;ßuÎÕ«WµpáBùûûËÁÁAmÛ¶Õßþö7ݸqC¡¡¡Öy:uê”fÏž­=zÈÑÑQ>>>Z±b…,‹ÆŽû@so®N:ÉÞÞ^íÛ·Wnn®jÔ¨QL÷†4|øpë:Õ³gOíÝ»÷¾vLÍ_×Ï?ÿ¬¹sç*88XÕ«W————–/_®Úµkkܸq:wîœu~^^žµÌw»»?ˆN:)""B®®®ªQ£†ÆŽ«—^zIf³Y¿þú«uÞ”)S”™™)³Ù¬   ëc²|ùr]½zµÐqãããåã㣠  ÙÙÙÉÓÓS3gΔ——×}åºxñ¢^xá=óÌ3 ÕÊ•+Õ¥K­[·N¯¾úªu§àuëÖéĉ²³³Snn®V¯^}ßkçÜ-çnþ±Íf³‚ƒƒåää$OOOM:Uݺu{à ºöû™_Ôsâ~ÖWî'{QŸËùªW¯.“ÉD‘Æ`üý âýbå[:utöìY£c@± Ä ”ùŸÌzû×ôéÓŽ”žåÏðáÃe±XtóæM%%%©M›6FG BÉÎΖ$U©Rå®sÔªU«c-[¶T:u”””d-|ÅÆÆªR¥J .0·V­ZòññÑþýû•’’Rä¹·k×®]ÑY~~~¾¯_¿¾$Ý÷Ë׬Y#IêÙ³gq[[[èúõëúú믭ã·ïìy»»Upp°¶nÝZhÜ××W7oÞÔÁƒ­c7n”$uíÚµÀÜš5kÊÛÛ»Ð1ºuë¦o¿ýV#FŒPbb¢nݺ%I:räˆ:uêtÏlË–-SVV–^~ùeIÿ¹Ö®]«víÚiÅŠzã7¬s·mÛ¦Ž;Þ÷îµù8wKǹ›ìîÝ»ºÝ 6(,,ì2ä+êÚïg~Qçû]_q¸ŸìE}.ßÎÆÆFׯ_/ލxüý ãýbå[íÚµ)ñ(7ø8>PHµjÕ$I7oÞ¼ë—;Ž{xxèìÙ³:þ¼ÜÜÜ”••%é·wõ=zô¨jÖ¬yßsëÕ«W`ÌÁÁá®ó‹Ãç©Zµª$Yw…ý-999ÊÊÊRµjÕäääTèrOOOIRZZZ1$½?YYYú裴fÍ¥¤¤(33³Àå×®]“ôŸì—/_VµjÕäèèXè8®®®…Æ,X }öÙg $=óÌ39r¤^xá…{fKNN–ô÷‹$9::jÆ zî¹ç´dÉ999éÃ?”ÙlÖ”)Sîáÿ‹s×øs÷^Ç.Ž E]û½æçg¹ÓÜÛÝ~NÜk}Åå~²õ¹|»ÜÜ\ÙÙÙSZ€ßV»víý÷+ò}À¹{ÿå¹›ìñãÇkýúõº|ù²RRR4jÔ(¥¦¦ZK®EÍð¨ï¢œ÷³>IjÓ¦’““uúôi%$$èĉzæ™gŠ5ûƒ<—%éûï¿—$=ÿüóÅšàn<<<$IçÏŸ78 <˜,ÿõ󘘅„„úE:ð õùÄù  (µsçNeggx` $­ZµÊà$(íxôÛxj,÷ ¿_ÎÊÊ’‚ƒƒ íÐÚªU+]¼xQ)))Å–e···®_¿®S§Nå¾qî…Ýí¹œ””¤Ö­[kùòå4hP‘Ži2™´råÊÅæÒ¤´ç 8”ÕŸw‹EÕªUÓ_þò½òÊ+FÇ€‡±ŠxàÊÿdk“ɤzõêiïÞ½ “““ìííÕ¹sgíÚµ«Ðõ.\¸ qãÆ©Q£FªZµªjÖ¬©~ýúéûï¿·ÎÉÿ´Ýü¯#GŽhàÀrww·Ž]¼xñ®Ùrrrô?ÿó?òöö–½½½ÜÜÜÔ«W/ýóŸÿÔ­[·Šœ'_zzº&L˜ &MšÈÖÖVõêÕS`` >ýôS]¿~ýŽóªV­*WWWuïÞ][·n½ëOž<©¹¸¸ÈÝÝ]ÁÁÁ:~üx¡ ‡Vß¾}åìì,=óÌ3Ú¹sço?X(ÄÙÙYqqqZ½zµ,X`t$--Mnnnºyófñ“'OêøñãêÒ¥‹AÉEQŸË'NœP¿~ýQä/ÀÃ0™LªY³&;ñ((ñÀ#4qâDY,ùúú*33S¡¡¡š>}ºÒÒÒô¯ýKêÒ¥‹¶oßn½Njjªüüü£… *##CÛ¶mSFF†üýý• IêÛ·¯,‹úôé#I9r¤F¥Ó§O+11Q•+WþÍlcƌѼyó4þ|¥§§ëСCòööVŸ>}´cÇŽ"ç‘þó????}ñÅ2›Íºxñ¢öï߯N:iÈ!ŠŠŠ*0oùòåÖy»wï–½½½´téÒ;®1,,Laaa:sæŒV®\©-[¶èÅ_,°®cÇŽÉßß_ûöíÓêÕ«uîÜ9-\¸Pï¾ûî ¿øm­[·Ö¾}û´aÃýúë¯FÇA.]º¤‘#GêôéÓºvíšöìÙ£U¯^]þóŸŽà>å¹¥÷Þ{Oï½÷žAi@Eæáá¡ .%^(!W¯^ÕÂ… åïï/µmÛVûÛßtãÆ …††ZçEDDèÔ©Sš={¶zôè!GGGùøøhÅŠ²X,;vì®N:ÉÞÞ^íÛ·Wnn®jÔ¨q×<ñññòññQPPìììäéé©™3gÊËË«À¼¢ä‰ˆˆÐÏ?ÿ,³Ù¬àà`999ÉÓÓSS§NU·nÝ Í›;w®‚ƒƒU½zuyyyiùòåª]»¶Æ§sçÎÊ<|øpëý¨ž={jïÞ½vž2eŠ233e6›$GGGµlÙRË–-Sjjê½(Ò¨Q#­[·NÕ«W׬Y³d2™”””¤3gÎÈd2iêÔ©FG¼#“ÉtϯiÓ¦³Ô«U«–6oÞ¬ÌÌL=ûì³ruuUïÞ½Õ´iSíÙ³G=ö˜Ñï ç.*º¢>—###ÙÆÃÃx” 6F€ŠÂÁÁA­Zµ*0Ö²eKÕ©SGIIIJMMUíÚµ«J•*)88¸ÀÜZµjÉÇÇGû÷ïWJJŠêÕ«WàòvíÚ)O·nÝ´hÑ"1BC‡•ŸŸŸ*W®¬#GŽ˜W”Iù»ï¾“$=z´ÐqŠ”gÁ‚ŠŽŽÖ‰' êÕ««[·nÖ‚­¤"åÉŸ[­Z5999Ýõvï5ÏÓÓS’”––Vè2ggçßW­ZU’”——g=öåË—U­Z59::º~þ} J/J¼Ê J¼PBÒÓÓïøiÉù¿dòðð­­­\\\dcc£›7oÊb±Üñ«sçÎÇd2éÕW_ÕæÍ›•™™©ØØXY,õë×O³gÏ–¤"å±µµ•³³³²³³uùòå»Þî½æ;wNÒvú-*[[[999);;[W®\)tyFFF‘ JVÍš5)ñ((ñ@ ÉÎÎÖÞ½{ ŒýðÃ:{ö¬|}}U»vmIR¿~ý”››«]»v:™‘Ç› IDATFdd¤4h ÜÜ܇Îãââ¢Ã‡K’ªT©¢   ÅÆÆÊd2iýúõÖyEÉó /H’¾úê«Bs[·n­ñãǘwûíHÿÙI7>>^vvvêڵ뭫{÷î’¤7¿xñ¢Ž9ò@Ç%‡x”6w»`À€%™åTJJŠÑ€RÃÙÙYS¦Lѻᆱ'Ÿ|R‡Ò°aÃTµjU™Ífë¼3fhûöí:t¨>þøc=ýôÓºuë–V­Z¥wÞyGË–-“Í]ÿ÷]$o¼ñ†æÍ›§fÍš)++K‹-’ÅbQ—.](OþÜñãÇËÑÑQÏ>û¬²²²ôþûï+55ÕZâÍŸ&GGG=÷ÜsJMMUDD„RSS%OOÏZÓû￯͛7+,,LÎÎÎò÷÷×/¿ü¢ &ÈÑÑQYYYæ_ºtIíÛ·×Í›7µk×.Õ©SçïM(x]g%õ:•ûÿÎøw( æÌ™£U«V@)—­«W¯ÊÝÝÝè(@…âáá¡k×®éêÕ«rpp0:<°B-°úõë«ÿþFdA9T¯^=Î'à9::jþüù?~¼¾ýö[åææª]»vÚ²e‹:tè`çáá¡={öè½÷ÞÓ˜1ctúôi¹¸¸¨uëÖZ»v­%I‰‰‰ò÷÷·^ÏÎÎN’d±Xî+ÏöíÛµhÑ" 4H§NRµjÕäåå¥%K–hذaEÎ#IµjÕÒÞ½{5}út;V)))ªQ£†ž{î9íØ±C 4(4oܸqJII‘½½½žzê)mÞ¼ÙZ"¾Óÿô§?iúôé2™LÖñÖ­[«gÏžZ·nš4i¢„„…‡‡«ÿþºyó¦žxâ ½õÖ[š3gŽâããe2™4lØ0-]ºT‹EyyyÊËË»ïÇÊ^×ÿ¶Gý:•ûÿ·ñïc¤¤¤(&&ÆèÚ­[·T¹re£c$þV“ï¾ûNuëÖ}àì/ NŸ>­¤¤$yzzªE‹”yQ¦ôïß_õë×7:Æñðð$?^768 <8“å~Û^@)£û.-FiÕª•.^¼È®sZþ®ž|4 (  Õ«WPÁ¬\¹R4:€Gdß¾}òóóS||¼õCûË«;wê­·Þ²nØðöÛo+ ÀèX@¹vêÔ)5jÔH‰‰‰jß¾½ÑqàA­*´/(_øpÈ’—’’¢Ï?ÿ\Ÿ}ö™Ž9¢–-[êµ×^ÓСCåââbt<Ü'>\€»ûðÃÕ¶mÛr_à•¤Ž;*>>^;wîÔÛo¿­ÀÀ@uèÐAáááêÕ«—Ññ€réöx ,«dt€ò ;;[Ë—/W×®]Õ°aC}ôÑGzþùçµÿ~8p@&L À Ê…'NèË/¿Ô¤I“ŒŽR¢:vì¨M›6iÇŽruuUïÞ½Õ±cGÅÅÅ (wìììäääD‰@™G‰¡Y³fÉd2)))IgΜ‘ÉdÒÔ©SŽ =zT“'OVýúõ5xð`åååiÙ²e:}ú´æÍ›§6mÚ XÍš5K 4P¿~ýŒŽbˆüâîÎ;­eÞ:P抙‡‡%^e%^x„&Nœ(‹ÅRàkúôéFÇðnܸ¡+V¨sçÎjÖ¬™V®\©ñãÇ+%%E›6mÒàÁƒegggtL€bwþüy}úé§š8q¢lllŒŽc¨üâî·ß~+777õîÝ[O?ý´âââd±XŒŽ”yºpá‚Ñ1à¡Pâ¸OÇ·îºûòË/ËÆÆF+W®Ô±cÇ4eÊÕªUËèˆÔÇ,{{{ýþ÷¿7:J©áïﯸ¸8%$$ÈÝÝ]}úôQ›6m´jÕ*ʼÀC`'^å%^€{عs§¨fÍšéóÏ?×!CtâÄ mÚ´I PåÊ•ŽðÈ]»vM‹-ÒØ±cåàà`tœRç©§žR\\œþýï«iÓ¦ QëÖ­)ó¨Fºxñ¢Ñ1à¡P⸃«W¯ê“O>Q‹-ôÌ3Ï(==]ÿøÇ?ôË/¿èƒ>PÆ ŽP¢–,Y¢k×®iôèÑFG)Õ|}}£ï¿ÿ^^^^ Q«V­(óEäææ¦ôôt£cÀC¡Ä p›³gÏjÚ´ijذ¡ÂÂÂÔ¶m[%%%)>>^}úôa×]P!ݺuKóæÍÓ°aÃT£F £ã” O>ù¤bbb”””$___ 4H¾¾¾ŠŽŽV^^žÑñ€RÏÍÍMFÇ€‡bct 8ÄÄÄ€‘’’¢zõê€riÏž=š9s¦Ö¬Y£Zµji„ 1b%I+V¬Ð©S§jt”2§eË–ŠŽŽÖ›o¾©?üPC‡ÕÌ™35iÒ$½üòË|H p”x””xQ.„„„€Ó¿£#P®|óÍ7ŠŒŒÔ–-[Ô¶m[ýíoÓï~÷;U©RÅèh¥ÆG}¤ªI“&FG)³žxâ EGG+<<\‘‘‘:t¨>üðC½ùæ›”y;pwwWVV–rssecÃÛÞ”M&‹Åb1:@IÊËËÓúõë5}útíÙ³G:tPxx¸‚ƒƒe2™ŒŽ‡R"&&F!!!âí5€Šî믿V·nÝ´ÿ~µiÓÆè8åÆO?ý¤>ø@Ë—/W³fÍN™¸ÍÖ­[Õ¥K]¸pA5jÔ0:<ˆU•ŒNPRnܸ¡èèhùøø¨oß¾òððPbb¢vîÜ©^½zQฃ™3g*((ˆo1kÑ¢…¢££•œœ¬Ž;jذaòòòÒâÅ‹•››kt<Àpnnn’¤ôôtƒ“Àƒ£Ä ʽ7nhñâÅzì±Çôúë¯ËÏÏOT\\œÚ·oot<€R+))I[¶lѤI“ŒŽRn=öØcŠŠŠÒ‘#G¨Ñ£GSæ$¹»»K’222 NŽ/(·rrr´`Á5iÒD¡¡¡úÝï~§ŸþYÑÑÑòöö6:@©÷ÁèÉ'ŸT`` ÑQʽü2orr²‚‚‚4zôh5mÚ”2/*¬üx)ñ(Ë(ñ€rçæÍ›ŠŽŽV‹-4aÂõèÑCÇŽ“ÙlV:uŒŽP&üüóÏZ½zµÂÃÃe2™ŒŽSa4nÜXQQQ:zô¨z÷î­qãÆ©iÓ¦2›ÍÊÉÉ1:PbìííU­Z5¥§§%^PnܸqCQQQzüñÇ5bÄõèÑC'NœPTT”êÖ­kt<€2eöìÙªW¯ž `t” ©Q£F2›Í:räˆz÷î­ððp5kÖLf³YÙÙÙFÇJ„››;ñ(Ó(ñ€2Ïb±hÕªUòññѸqãÔ­[7;vLóçϧ¼ ð222´lÙ2M˜0A666FÇ©Ð6l(³Ù¬äädõéÓG“'O¦Ì‹ ÃÝÝ/€2/(Ó¶mÛ¦öíÛkРAzúé§uôèQEEE©^½zFG(³æÍ›'[[[ 2Äè(ø_ 4°–yûöí«É“'ËËËKf³Yׯ_7:ðH°/€²Ž/(“:¤ªsçÎrvvÖ¾}ûôÙgŸ©AƒFG(Ó®]»¦… jìØ±rtt4:þKýúõe6›uòäI½ôÒKŠˆˆPãÆI™å%^e%^P¦œ9sF#GŽTË–-õÓO?)..N›6mRëÖ­ŽP.üõ¯ÕåË—õ‡?üÁè(ø žžžúàƒtòäI½öÚkzûí·Õ¨Q#EFFêÚµkFÇŠ%^e%^P&ܸqCf³YÞÞÞÚ°aƒ.\¨¤¤$  Ü¸uë–æÎ«aÆÉÓÓÓè8¸Ö2ï!CôÎ;ïPæE¹áîî®ôôt£cÀ£Ä J½þóŸjÞ¼¹þô§?iÊ”)JNNÖˆ#T¹re££”+«V­ÒÉ“'ftÑíeÞQ£Féý÷ßW£F4mÚ4ýúë¯FLj««+;ñ(Ó(ñ€RëØ±c VŸ>}Ô¢E }Z«V­Ò›o¾)“Édt”''§eÞ%K–PæE©“¿/%^e%^Pârss©–-[*##C 2›Írpp0:@…3kÖ,yzz*$$Äè(0ÀíeÞéÓ§ëÓO?UÆ ª´´4£ã¡‚«^½ºL&%^e%^P¢~üñGµmÛVï¼óŽÞ}÷]íÛ·OmÛ¶5:@…”‘‘¡¿þõ¯úãÿ¨*UªrttThh¨Ž;¦éÓ§+&&F?þ8e^ÊÆÆFööö”x”Y”x@‰ÈËËÓìÙ³åçç'{{{%%%iâĉ²±±1:@…õñÇ«J•*>|¸ÑQPJÜ^æ}ï½÷´jÕ*k™755Õèx¨€œ)ñ(³(ñ€GîôéÓ Rxx¸BCCµ}ûv=þøãFǨв³³µhÑ"=ZŽŽŽFÇA)ãàà ÐÐP=zTï½÷žV¯^m-óž={Öèx¨@œ•™™it x ”xÀ#µjÕ*µjÕJgÏžUBB‚>øàU©RÅèXÞ²eËtéÒ%=Úè((Åò˼'NœÐœ9sôüC=ö˜FŽ©3g΀‹‹ ;ñ(³(ñ€G"++K¯¾úªBBBÔ¿íÛ·OmÛ¶5:$ݺuKsæÌÑ!CT«V-£ã  °µµÕˆ#tâÄ Í›7Oëׯ·–ySRRŒŽ‡rÌÙÙ™/€2‹/(vûöíSëÖ­µiÓ&ÅÅÅ)**JFÇÀÿúòË/uüøqM˜0Áè((cªV­j-óΟ?__}õ•š4i¢‘#GêôéÓFÇC9D‰@YF‰+³Ù¬:¨yóæ:xð zöìit$ü—Ù³g«_¿~jÚ´©ÑQPFå—y?®%K–(>>^?þ¸¬ãÇå%^e%^P,._¾¬Aƒéü£"""'www£cà¿lݺU‰‰‰úãÿht”U«VÕàÁƒuèÐ!-Y²D jÞ¼¹¬cÇŽå%^e%^ðÐ:¤§žzJ[¶lц 4mÚ4UªÄÛJ£™3gªS§Nzê©§ŒŽ‚r¤J•*}úhÇŽ†Ü(y•*UÒ€ôÓO?iÅŠúá‡Ô¢E 8P‡.öÛëÛ·/¯ßÊgggåää(''Çè(Pd”x@‘=zT:tбcÇ´mÛ6õîÝÛèH@‰>|¸üýýåàà ÀÀ@õìÙS{÷îÕÅ‹­s"""ôóÏ?kîܹ VõêÕååå¥åË—«víÚ7nœÎ;gà*ÕìÙ³åáá¡AƒŸ0a‚òòò4{öìã»víÒ/¿ü¢XÇ"""têÔ)Íž=[=zô£££|||´bÅ Y,;Ö:7>>^>>> ’<==5sæLyyy=Ú…¢TÊ/ó>>Ú¿¿RRR$IݺuÓ·ß~«#F(11Q·nÝ’$9rD:uzD+Ei—_æýñÇ«3gÎèÿý¿ÿ§^½zéßÿþw±ß¯ßʾüoff¦ÁI è(ñ€û²xñbõìÙS]»vÕ–-[äééit$ Äåòå— òòò$I999ÊÊÊRµjÕäääTèúùÏ›´´´Gœ€‚.\(“ɤaÆÝñò°°0]»vM .”$%''kË–-1b„uNþϹ¼¼<9;;Ëd2øúî»ï$IG•$-X°@ÑÑÑ:qâ„T½zuuëÖÍZ˜DÅV©R%õêÕKûöíSll¬Îž=k-óæŸKÅ×oeŸ£££$éÊ•+'€¢£Ä ~Snn®F¥?üázûí·µbÅ ÙÙÙ (•lmmåìì¬ììl]¾|¹ÐåçΓôŸÝ ()999Z°`F]¨Ð˜ïå—_–§§§>þøcåääè£>Òïÿ{¹ººZçØÚÚÊÅÅE666ºyó¦,Ë¿:wî,I2™LzõÕWµyófeff*66V‹EýúõÓìÙ³Kdí(ýn/ó®]»V©©©jÛ¶­uìQãõ[éG‰@YF‰ÜUvv¶  Ï>ûL«W¯VDD„Ñ‘€Rï…^$­_¿¾ÀxNNŽâããegg§®]» PA}úé§ÊÈÈÐØ±cï:ÇÖÖV£FÒùóçõÑGéïÿ»BCC ÍëׯŸrssµk×®B—EFFªAƒÊÍÍ•$¹¸¸èðáÃ’¤*Uª(((H±±±2™L…~N&“I½zõÒÞ½{µvíZ¥¥¥ÉÏÏOAAAÚ»wï#½m^¿•n”x”e”xÀ]¹rE½{÷Ö¶mÛôõ×_[ߨà·Í˜1C7VXX˜Ö­[§Ë—/+99Y/½ô’RSSe6›åééitL@‘——'³Ù¬Áƒ«víÚ¿9wÔ¨Q²³³ÓÔ©S¨Ç¼Ðœ3f¨I“&:t¨6lØ ¬¬,edd(**Jï¼óŽfÍš%ëü7ÞxCPNNŽÎŸ?¯?üP‹E]ºt)öµ¢|¸½Ì»iÓ&eee©]»v Òž={Émòú­t³··W¥J•(ñ(“(ñ€B222¤~øA[·nUÇŽŽÆd2iíÚµ’d-6åGFFJ’Z·n­àà`IR­Zµ´wï^½øâ‹7nœÜÝÝÕ®];]½zU›7oÖ믿nÌBÒš5ktøða?þžskÔ¨¡W^yE‹E&L¸ãíÙ³G}ûöÕ˜1cT³fMy{{ëË/¿ÔÚµk5pà@ëÜíÛ·ËÛÛ[ƒ ’›››š7o®7jÉ’%š2eJ±­åW`` öìÙ£M›6éòåËjß¾½‚‚‚´{÷î»^'11‘×oåŒÉd’ƒƒ%^e’Éb±XŒJ³gϪk×®ºr劾ùæ5mÚÔèH€!bbb"Þ^(Ëž~úiÕªUK_~ùå}Í_¶l™,X }ûö=âd@ÑmÞ¼Yþ󟕘˜¨:húôéêÔ©“ѱPêÔ©£ððp…††Šb;ñ«Ã‡ë©§žR^^žvîÜI  Û¾}»4qâÄû¾Î'Ÿ|r×]x£*!!A;vìPÕªUÕ¹sguìØQ[¶l1:1GGGvâP&Qâ’¤ï¾ûNÏ<óŒ4h ;wªnݺFGÀC˜9s¦žyæ=ýôÓw³téR½ð ºråŠ>ùä]ºtI,Á”@ÑåwwìØ![[[¨cÇŽŠ7:GGG]½zÕèPd”x€’’’¤6mÚè›o¾‘«««Ñ‘ð>¬ 6hÒ¤I÷œ+WWW-Z´H+V¬M $^~qwÇŽ²³³S`` :v쨸¸8££¡˜±/€²Š/ÜáÇխ[7ùøøèË/¿”½½½Ñ‘ð"##åå奞={þæ¼áÇËb±èæÍ›JJJR›6mJ(!P|:vì¨M›6iÇŽruuUïÞ½)ó–3ŽŽŽº|ù²Ñ1 È(ñP%''«K—.jÒ¤‰¾úê+988 éÌ™3Z¾|¹Þ|óMUªÄ[EQqäwwîÜi-óvèÐ2o9ÀN¼Ê*~3@uìØ1uîÜY5Ò† äèèht$ƒ¹sçªfÍšzùå—Ž"¿¸ûí·ßÊÍÍM½{÷ÖÓO?­¸¸8Y,£ãá899QâP&Qâ úå—_¤Zµjiýúõrrr2:ŠÁ¯¿þª%K–(44TU«V5:`(ÅÅÅ)!!AîîîêÓ§Ú´i£U«VQæ-c؉@YE‰€ æ—_~ѳÏ>+wwwÅÇÇËÕÕÕèH(& .¿É‰0 IDAT”Åbш#ŒŽ”O=õ”âââôïÿ[M›6UHHˆZ·nM™· ¡Ä  ¬¢Ä @’™™©=z¨zõêúæ›oäââbt$“œœÍŸ?_øÃäììlt ÔñõõULLŒ¾ÿþ{yyy)$$D­Zµ¢Ì[888PâP&Qâ ‚¸yó¦  K—.iݺurss3:ŠÑ矮 .h̘1FGJµ'Ÿ|R111JJJ’¯¯¯ $___EGG+//Ïèx¸''']¾|ÙèPd”x¨,‹†®Ý»wkýúõjРёPŒ,‹æÌ™£Áƒ«^½zFÇÊ„–-[*::ZIIIjÕª•†j-óÞºuËèx¸½½½®]»ft (2J¼TþóŸõÅ_hõêÕjÕª•ÑqPÌÖ®]«C‡i„ FGÊœ'žxÂZæmݺ5eÞRÈÎÎŽ/€2‰/åÜ_þò½÷Þ{š7ožžþy£ãà!dggßq|æÌ™êÕ«—Z´hQ‰€òÃÇÇGÑÑÑ:pà€Ú´i£¡C‡êÉ'Ÿ¤Ì[ ØÛÛëÖ­[ºqã†ÑQ H(ñPŽmܸQo¼ñ†Þzë-½ñÆFÇÀCZ¼x±:tè ¸¸8Y,IÒÎ;õí·ßjÒ¤I§ʇ-Z(::ZÉÉÉêØ±£† &///-^¼X¹¹¹FÇ«ììì$Iׯ_78  %^ʩÇkàÀzùå—õÖ[oÅ --M êÝ»·¼¼¼´lÙ2EFFª]»vêØ±£Ññ€rå±ÇSTT”Ž9¢ÀÀ@=š2¯Aìíí%QâPöPâ ºråŠ~÷»ß©yóæŠŠŠ’Éd2:ŠAjjª*UúÏÛ??®áÇkÇŽòõõÕ¥K— N”OùeÞäädiôèÑjÚ´)eÞ”¿ïµk× NEC‰€rhÔ¨QJKKÓÊ•+ekkkt“Ó§OëÖ­[’$‹Å¢¼¼šù$ɼàïïϸhuHâ +++Ó¿ýÛ¿©_¿~š3gŽ»Ã@ÊÉÉ‘§§§õ¹———BBB´mÛ6ýêW¿rcdêri2ïŒ3´xñbuëÖMO<ñ„Î;çîðZ…¢¢"ùùù)??_GŽÑ‘#Gôõ×_kÏž=*((pwxP+’xhÅžxâ >|X+W®´IèÀ•'77W^^^’~Ià Ö?þñõìÙÓÍ‘pDûöí­ÿ†›1c†–.]ªèèh=ñÄ*,,twx-Ê}÷Ý'Y,Y,…„„(//OóçÏWtt´¢££õ›ßüF}ûöU^^ž»Ã€ZYŒ1ÆÝAçíÚµKƒ Ò²eË4}útw‡´jùùùzçwlÊ>ÿüs­X±BË—/·) Ñĉ›3<$I³fÍÒòåËUUU%}ôÑGêÓ§»ÃÐ@gΜÑK/½¤¥K—ÊËËK3gÎTjjªÂÂÂÜšÛeeei̘1õÖ»îºëtèСfˆd I¼´B.\Ð7Þ¨k®¹F›6m’ÅbqwH@«vñâEEDDèܹsÖS­«Vséþ*//×”)Sôßÿýßn‰puKIIÑßÿþwjÛ¶mêׯŸ»CàÕɼéééòððЬY³œJæ­¬¬´~‡½RTUU©S§N:uêT­u|||4oÞ<ýñlÆÈÀ)$ñÐÍš5Kÿû¿ÿ«¯¾úJ]ºtqw8ÀaúôéZ¹r¥.^¼Xg½-[¶(>>¾™¢p¹]»v騱cîp‹ èèÑ£zì±ÇÔ£Gw‡ƒ«P—.]Ô¿w‡qÅ:wîœþë¿þKK–,QEE…f̘¡GyDmÚ´©õ5¥¥¥6l˜þö·¿éšk®iÆh›Þ£>ª´´4•——×ZgïÞ½Š‹‹kƨÀ)$ñÐÚ|úé§úÝï~§•+WjòäÉî¸b|ôÑG:thuÂÃÃuêÔ©+î¤3 5?~¼Þ~ûmw‡W¥””­Y³ÆÝa\ñŠŠŠôÊ+¯Ø$ó>üðÃjÛ¶­]Ý_|QsæÌQ·nÝ´sçNuìØÑ 7ï¾ûN×_½jû¹{TTØ@KG/­IUU•ú÷ï/???}ôÑG²X,î ¸bTUU©S§N:uêT×}||ôÿþßÿÓÒ¥K›92—?~¼$‘D†«ÒöíÛ5pà@w‡«ï¿Í¯:™÷™gžÑÅ‹õ‡?üÁ&™·´´T×\sNŸ>-ooo]sÍ5Ú¾}»"""ܹëÜrË-Ú½{·ªªªlÊ}||4gÎ=óÌ3nŠ ²ÆÃÝÇ-_¾\_|ñ…^~ùexóððФI“äããSãõ‹/êÎ;ïlæ¨ø?$ðW—àà`=òÈ#:zô¨-Z¤•+Wêšk®Ñœ9s”››«?ÿùÏ:sæŒ$©¼¼\GÕ€jý£4­Ñ´iÓj,¿xñ¢n¿ýöfŽœÇI¼´gΜQLLŒî½÷^NšÈž={Ô·o߯uéÒEG%p3N‚÷àý×ýŠŠŠ´lÙ2=÷Üs*--U`` NŸ>­Kîíí­k¯½VŸ|ò‰ÂÃÃÝ­k«}ûö*--µ)ïСƒrrräáÁ™VZ4Nâ µ˜7ož|}}õØc¹;àŠÕ§OýêW¿²+÷ññÑÝwßM/Ü&88XóæÍÓ?ü ””åååéòóœÊËËõý÷ßkðàÁ*((pS¤®¤ñãÇËÛÛÛZæãã£;^­ÿr øúë¯õúë¯ë™gžQpp°»Ã®h“'O¶I¤‹/jâĉnŠø?¾¾¾Ú¼y³]oµòòr:tHC† ÑÏ?ÿÜÌѹޔ)ST^^n}~ñâEÝ~ûínŒG/­ÀþçªgÏž$Í`Ò¤I6I’Ô³gOÅÆÆº)"àÿüå/QNNN­I¼Ò/‰¼ШQ£TTTԌѹÞàÁƒÕµkWëóÝzë­nŒG/-Ü_|¡wÞyGO=õ”<<øOý@S»öÚkÕ«W/Y,I’···î¾ûn7G 9DFFÊb±Ø<8`S'%%E‹E'Nœ°)_°`Íëþô§?5gèõÊÌÌ´‰¯´´´Y–f½wTTT“ÜÃÝ}lIšc¼¸Gyy¹ž|òÉ:x/­»wï^=ZçÏŸo†èš†ÅbÑÔ©Såíí-ooo%''ËËËËÝa€Cø/{´p=ö˜úôé£qãÆ¹;àªñoÿöoòôô”$UTTh„ nŽ@sÈÍÍÕk¯½&IJMM•1F111Öë•••Úºu«$iÓ¦M6¯]´h‘Μ9£°°0]¼xQóæÍSqq±®»î:%$$4_'j‘””$cŒÝrÿ¹sçÊ£¸¸¸&»‡»ûØ’4Çxp·ÞzK'Ož´&ñúøøÈÇÇÇúh.W^^®Ï>ûL·Ýv›JJJš3T—º÷Þ{UYY©òòr¥¤¤¸;p‚€ìÓO?Õû￯>ø Öep½‰'êᇖ$õë×Oݺuso@šÍèÑ£%IYYYzá…l®}ú駺xñ¢õú”)Sl®oÞ¼Yƒ–···$É£ªª*UUU5CäW   õîÝ[Û·oww(V-1& 5Z½zµ»Chñüýýõ—¿üEùùùÊËËÓéÓ§•——§¼¼<åææêÌ™3ºpႵ¾———ªªªôüC7Ýt“æÍ›gýœjmbbbtøða={–µ‚ZuéÒEýû÷ww€I¼´`K—.U¿~ý4bÄw‡\U¢¢¢ô»ßýN;vìÐÝwßíîp4£.]º¨gÏžúöÛoõÓO?©k×®Ök›6mÒý÷߯×^{M[¶lQee¥õÔîêë£F²>ÖáÇ›5~hÍ&L˜àî®8Öÿ½ÿ~Mš4ÉѸƕÐ4””­Y³ÆÝaV$ñÐBkyVV––,Y¢ï¿ÿ^ëÖ­ÓgŸ}fsÒÛ| Ç{Ì!À###CwÜq‡»Ã@ TRR¢O>ùD#GŽtw(h¡Æïî;$ñÐB-[¶LíÚµséP322\Öp¥;þ¼^yå=ôÐCîh5víÚ¥¥K—º;ŒF5j”^xámÚ´ÉšÄ[PP èw¿û¾ùæ­[·N›6m²&ñîß¿_êÞ½»$)33S·ß~»µÍ’’ùùùÙ•8p@=ö˜¶nݪ‚‚IR^^žÚµk§¼¼<-\¸PëÖ­ÓÉ“'ªAƒéñÇWïÞ½­m”••é©§žÒêÕ«õÓO?ÉÏÏO дiÓ4vìX›Ó‚«åææê‘GѦM›äéé©þýû+==]ÑÑÑÖ:úûßÿ®?ÿùÏúꫯTXX¨k¯½VS§NÕ¬Y³äááQc_ëêÓåÞ|óMMž<Ù¦,''G‘‘‘vuÓÒÒ¬ïÉ;vìÅb‘$yzzÚœ4éL«csdœkR_LŽŽMXX˜Cc]íÌ™3zê©§´víZ?~\íÛ·WLLŒ&Mš¤ &Èßß¿ÆxëoGÆ¡1s-5|MýðÃuÎ¥³õkÇcÇŽ)00P·Ür‹~øa :T’´hÑ"krþ€´}ûvI¿$õ3F’®üü|—ÅRל6f½­¿¿? ¼ZZœ’’Ó¾}{óÄO¸¤½ŒŒ ÃÏçýðÃîhUšãó&%%Ť¤¤4é=JJJŒ¿¿¿ 5åååÆcV­ZeÆgŒ1æûï¿7’ÌÍ7ßl}MZZš™9s¦][‰‰‰F’)))©±|ðàÁfÛ¶mæüùó&;;Ûxzzš¼¼øÀ\¸pÁäææš¹sçIfÛ¶m5Þ711ÑìܹÓ›­[·šÓ¯_?›ºëׯ7’ÌâÅ‹MAAÉËË3/¾ø¢ñðð0sçέµ¯µõÉcâââLçέ¯©¨¨0>ø 1b„)((pdzL`` 0`@­×é£3ã슘jgÆ:''ÇtïÞÝDFFšõë×›sçΙÜÜ\³páB#ɼðÂ ÖºŽŽ·³ãàÈ\פ¡kêҹܼy³ñ÷÷·›KgëWcDD„Y¿~½),,44ÉÉÉÆb±˜+VØÔ¯mŽûôécÂÃÃ]K}sêªõÚPÍñþ+Éddd4é=\¹šã} pÒjÛ?ÍZ„ 6¨  Àzú÷èÖ­›»Cà~~~ºõÖ[UXX¨ììlIÒ¦M›4jÔ(IRtt´¢££µ{÷në飛6mÒèÑ£¾×#<¢!C†( @7ß|³***Ô®];ÍŸ?_GÕóÏ?¯Ûn»MAAAŠÕªU«dŒÑ¬Y³¬mlݺU±±±1b„üýý¡gŸ}V=zô¨õ¾S§NUÿþý¨aÆ)!!A»wï¶ž&ZmÈ!š?¾Ú´i£víÚiÖ¬Yºë®»”žž®sçÎ9Õ§Ë={VcÇŽUee¥6nܨ6mÚ8=~uq¤ÎŒ³+Ô56ŽŽõüùóõÃ?(==] VDD„,XPç¬k¼:ŽÎõ¥²¦.ËáÇkìØ±5®WgêWãÒ¥K• õèÑCo½õ–:vì¨Ù³gëÔ©SuöÅÎÄRßœ6÷zG/-PFF†† ¢Ž;º;®JÕ »YYY’¤>øÀ&™nôèѪªªÒæÍ›URR¢Ï>ûLC† qú>7ÝtSå™™™òððPBB‚Mydd¤bccµgÏ?~ÜËÎ;uß}÷);;[•••’¤ƒÖS¿~ýlžwîÜY’tòäIkYBB‚¶mÛf÷Ú¸¸8•——ë믿vªO—:xð n¾ùfyxxhéÒ¥òôô¬÷5Îr¤ÎŒ³+Ô66ÎŒõ»ï¾+I3fŒ]ý7*55Õ®¼¾ñnè882×—j蚺|.»té"Év.­_=ŽcÇŽµ©ëëë«øøx•””hÓ¦MuuÇ!ÎÄRßœ6÷zG/-Ì… ôþûïküøñVuÂî¦M›ôÕW_ÉÏÏOÑÑÑÖëÕI¾›6mÒǬ¾}û*00ÐéûÔôš²²2ªªªJ¡¡¡²X,6/¾øB’ôÝwßI’–-[¦7ÞxCGŽQ||¼BBB4zôhkb`MBCCmž{xüòsªª*kYaa¡üqõêÕKmÚ´±Þÿ¡‡’ôËwGût©ŸþYIIIŠŠŠÒÆõæ›oÖY¿¡ê룳ãì µ£c]³ŸŸŸ‚ƒƒºg}ãݘqpvÍ7tM]>—>>>’l׫3õëLjˆIRnn®£]«Ucc©æŽõ $^Z˜õë׫´´T·ß~»»CàªÕ³gOuéÒE{öìÑ›o¾iMÚ­6tèPùøøhÓ¦MÊÊʲ»Þ¾¾¾ “———ÊËËeŒ©ñ1tèPI’ÅbÑäÉ“µeË={V™™™2Æ(99YÏ?ÿ|ƒã7nœ.\¨iÓ¦éСCªªª’1F/¼ð‚$ÉÓ v½¼¼´eË­]»V½zõÒ´iÓ´{÷n‡_o±XtßË9;ÎM“£cíëë«ÐÐP•––ª¨¨È¡¶ëoWŽƒ«úÙÔêÇS§NIúå„Ûjºxñ¢]ݳgÏ6i,—Ök®yBó ²KÈNKKk²¶=<<Ô¦MÅÅÅiƌڳgOƒãŠŠŠ²«³`ÁõîÝÛ®¼®Ç¢E‹\Òߦ’––f5**Êåõ±jÕ*kÛ~~~6×rrrôÔSO©oß¾ Qdd¤\çôÐa—ôµ)Í;WÆÅÅÅ5I}gLœ8QÆÅÇÇÛ]›6mš–.]ª?þñÊÉÉQvv¶¢¢¢”œœ¬yóæ¹<Ž#‰€æÿø‡† æî0¸êU'îVVVÖxºeu‚_@@€n¸á—Þûé§ŸVtt´¦L™¢7ª°°PZ¾|¹ž|òI¥¥¥ÉËËËZÿþûï×—_~©²²2>}ZÏ<óŒŒ1 þNáéé©!C†(77WÏ>û¬òóóURR¢mÛ¶éÕW_uU7Õ­[7½ýöÛÊËËSrr²ÊÊÊê}Íoû[:tHÇŽÓ®]»täÈ 4¨A÷wvœ›"&gÇúé§ŸV÷îÝõÀhÆ ***ÒñãÇ5cÆ åääØ%ñ^ª¶ñvÕ8¸²ŸM­zSSSõÞ{難¨H‡Ò]wÝ¥œœ¥§§+""ÂZäÈ‘:yò¤^~ùeëðáÚ3gŽKþðŽ£sÚó„+›§§§"""”˜˜¨?üP?ü°V®\©;ï¼³ÙNÂFÓIKKÓØ±c¨nݺéõ×_WçΕ––¦Ó§O»;<àªE/-È‘#GtìØ1Ýzë­î€«ÞðáÃååå¥(((ÈîzuoM§ðVŸ„»víZI’¿¿¿&Mš¤ììl»òêÓH/Õ¡C}öÙgJJJÒÌ™3Õ¾}{ÅÄÄèwÞÑÚµkuÇwXë~üñÇŠ‰‰ÑĉÕ¶m[õìÙSYYYZ±b…}ôQIªñ¾ ,$Y,-Y²DÒ/§~&$$H’2224}út½ôÒKêÔ©“ºwï®7ÞxCwÝu—$iĈêÛ·¯C}Zµj•,‹öíÛ§'NÈb±héÒ¥ÊÎÎÖ!CT^^®ììlùùùiÒ¤IuÎËÒ¥Kuà 7¨gÏžš0a‚ÒÓÓÕ³gÏõÑ™qvUL5Í·£c-I‘‘‘Ú½{·&L˜ Y³f)<<\7Ýt“~þùg}òÉ'êÚµ«Óãíè88ÚŸÚ4fMÕ5— ™ûêq¼óÎ;5{ölë8ž?^[¶lÑ´iÓlb_´h‘¦NªÅ‹«C‡ºçž{ôÐC)22RgΜ‘ÅbѼyóK]s*¹n½Õþô§?éæ›oÖºuë´jÕ*—´¹wï^¥¤¤8TwÕªUÖýÆyï½÷t÷ÝwÛ”ùøøè׿þµ*++uðàA7EÀbø³I´+W®Ôý÷߯³gÏÊÏÏÏeí®^½Z&Làt%@“jŽÏ›ñãÇK’Ö¬YÓd÷ØkŽ÷_‹Å¢ŒŒŒ«*!yïÞ½ºñÆ•˜˜¨ÌÌÌfoûÍ7ßÔäÉ“5pà@}òÉ'N½öÇT÷îÝ5`Àmß¾½Ö8î¿ÿ~-_¾\7n´žrßÚôîÝ[ùùù:~üx“ÔwÆðáõ}ûv•––Ö[÷Úk¯Õáǵÿ~ÅÆÆº<––†ï‰hÖp/-È®]»tÓM7¹4к”••éñÇWLLŒÔ¶m[7NëÖ­See¥Ëî3pà@I¿œ´]^^î²v]%//O³gÏV·nÝäãã£öíÛ+99Y{÷îµÖÉÌÌ”Åb±>~üñGMÚÙÑ IDAT˜0Aaaa WBB‚>lÓnEE…2224bÄEFFÊßß_½zõRzzºªªªjçÀ;v¬BCC ¡C‡jÇŽ.íÏ¥÷JJJRhh¨5hР:“¥/÷?ÿó?:|ø°zôè¡_ÿú׿€k‘Ä @ rðàA~\ W¹™3gêÅ_ÔK/½¤3gÎèÛo¿ULLŒmNÌm¬ÈÈHI¿$µæççÛ]_»v­M‚ì¥îÝ»»,Žšäää¨_¿~Z½zµ^yåè£>RAAú÷ï¯]»vI’’’’dŒQbb¢$)55U©©©:qâ„222ôá‡êÎ;ï´i;++K'NÔ°aÃôí·ßêØ±cºï¾ûôàƒê‘G©1žââb͘1C>ú¨Nœ8¡üã*((аaÃôñÇ»¬?’ôý÷ß«ÿþúüóÏõöÛoëÔ©Szå•W´páB»„äË}óÍ7š3gަL™¢6mÚèÍ7ß”Åb©7>Mƒ$^ZC‡éºë®sw7Úºu«bcc5bÄùûû+""BÏ>û¬zôèáÒûc꼞˜˜(cL~øÁ¥±\nþüù:zô¨žþyÝvÛm Rll¬V­Z%cŒfÍšUãë¦Nªþýû+00PÇר±cµ{÷n»$å!C†hþüùjÓ¦Úµk§Y³fé®»îRzzºÎ;g×naa¡/^¬(((H}ûöÕ›o¾©‹/jΜ9.íÏ£>ª³gÏ*==]#FŒPPPzõê¥×_]999uÞç†nК5k4sæLíß¿_ýúõ«76M‡$^ZˆóçÏ+77×å?Ê´.£GÖÎ;uß}÷);;[•••’¤ƒjÈ!.»OuB¨···Úµkç²v]!33SJHH°)ŒŒTll¬öìÙ£ãÇÛ½îò¤Õ.]ºH’Nž>^!!!=z´Þ}÷]—Þgûöí’¤þýûËÛÛÛ¥m7FYY™ UUU¥ÐÐPY,›Ç_|!Iúî»ïì^jóÜÇÇG’TUUe-+,,Ôã?®^½z©M›6Övzè!IÒ… ìÚ —Åb±+ïСƒ$éôéÓ.éOYY™ŠŠŠäçç§   Zï u ‰€â矖$µmÛÖÍ‘öV­Zeý¹ŸŸŸ»Ã›¤¥¥Y×ATT”»ÃiÕ222Ô»woùûû[Çtÿþývõs×rtܯµ­Ö\­5|G`Ý£5²X,𛲝¾úJ'OžT\\œ:vìè²þŒ3F’”••eS/??_¬ó>Љ‰©³€æC/-Ĺsçäéé©€€w‡‚ËiàÀîW ºÖ–1FUUUªªªj樦©ã­«}WîÑæ÷5kÖÈ£9sæ(((HÑÑÑ:vì˜bcc¾7ïOŽ«mÜó›ß¸;4jtÿý÷ëË/¿TYY™NŸ>­gžyFÆ 6¬AíUUUéôéÓZ»v­âããõÌ3ÏhÊ”)úë_ÿjMbmIž~úiEGGkÊ”)Ú¸q£ UPP åË—ëÉ'ŸTZZš¼¼¼œn×ÓÓSC† Qnn®ž}öYåç竤¤DÛ¶mÓ«¯¾Zëë5sæL}úé§:þ¼>ÿüsMš4I>>>JOOwi/^¬¶mÛ*55U›7oVqq±¾ùæMš4IAAAµÞcÅŠ ÔÃ?ìô¸h$ñÐB\¸pAî@ ¬Ã‡ëý÷ßww(iêx›k<šã>ÇŽ“$…‡‡7û½¯fµ;î¤o¼Q’´víZY,¥¥¥I’>þøcÅÄÄhâĉjÛ¶­zö쩬¬,­X±B>úhƒÚöòòR=ôØcéúë¯×ž={ôßÿýßò÷÷w8®jQQQêÞ½»¤_N»·X,Z°`M•+WÊb±hùòå’~9]Öb±¨¸¸Ø¡ñéСƒ>ûì3%%%iæÌ™jß¾½bbbôÎ;ïhíÚµºãŽ;$IÙÙÙ²X,Z»v­$Éßßß‹ÅbÑ’%K$I7Þx£$Iš>}º^zé%uêÔIÝ»w×o¼¡»îºK’4bÄõíÛWiii²X,Ú·oŸÂÂÂôüóÏkþüùŠŒŒÔ­·Þª6mÚèÃ?ÔàÁƒ%ɦþ‰'lÆÅÑþHRtt´víÚ¥~ýú)%%E:tÐ=÷Ü£Y³f©W¯^*++“ÅbÑÔ©SmƬªªJÆccMÏù?=š„ÊËËÝ ‰UVVº;„«ãhiêJf‹‹«óTØÆ´íŠ×?~¼Þ:÷Üsî¹çžÇ!ImÛ¶ÕsÏ=§çž{®Ö:·ÜrK­I«µ•·k×®Öñ}úé§mžÏ;׿ù‡~Xk,sçε«)GúS­Gz÷ÝwíÊÇŽ[ëk¦OŸ®éÓ§×Û6€æÃI¼´þþþ*--mQ'æœ9sF>ø ¢££åë뫨¨( >\+W®TIIIõ|||Ô¦M3FÛ¶m³ÖÉÌÌ”Åb±>~üñGM˜0Aaaa WBB‚>ÜàúÕòòò4{öluëÖM>>>jß¾½’““µwï^§ûW}ŠÒùóç­§KUŸ`匲²2=þøãЉ‰Q@@€Ú¶m«qãÆiݺuÖ¤²ê{Y,EEEi÷îÝŠWpp°4tèPíØ±£Qýu¦î”””¤ÐÐPjРAÚ¾}»Sý® k«îµuyŒ¥¥¥µ¶ïªqiŒÚâ½¼üèÑ£š0a‚‚ƒƒ®É“'ëçŸÖ?þ¨qãÆ)88X;vÔ´iÓTTTToû®Ú£ŽÞÇÙýY[û—žg±XtË-·Ô;ç—s´ïެÛËï}ðàAÝqÇ ·–åçç;;œ-†3ã^Wß²ïºæëRQQ¡ŒŒ 1B‘‘‘ò÷÷W¯^½”žž®ªª*—ŽÝÙ³gmúc±X´hÑ"k—–§¤¤X_çÈX-Z´ÈúÚZ˳²²¬åíÚµ³–7f¶”ÏXGûàÈ÷†º8ºFú9ÑØï®Ü'Ýo¾ù¦ÝÏÍÍ•äÜü×Ä‘ylÊ}ÐØø€‹Ð"¬_¿ÞH2%%%.o;##Ã8û3œœÓ½{wiÖ¯_oÎ;grssÍÂ… $ó /ØÔ‹ˆˆ0ëׯ7………æàÁƒ&99ÙX,³bÅ ›v$“˜˜hvîÜiŠ‹‹ÍæÍ›¿¿¿éׯŸ]ÎÔ?yò¤¹æškLDD„Ù°aƒ)**2û÷ï7ƒ6~~~fçÎN÷ÏcÍ€œ¿KM:Õ„††š>øÀ\¸pÁäææš¹sçIfÛ¶m6uãââL`` éß¿¿µ¿»wï67Üpƒñññ1}ôQƒúëLÝï¾û΄……™Î;›>øÀ™/¿üÒŒ9ÒtëÖÍøúú6x,Œam9³¶ªc¼ô}¡©ÇÅqqq¦sçÎÅ{iyrr²ùüóÏMqq±yã7Œ$3fÌ“˜˜hþùÏš¢¢"óꫯIæp¸ýÆîQGïãÌþlHûõÝ»¦1¯«ïάÛKï=xð`³mÛ6sþüy“m<==M^^žC}kÈç³RRRLJJŠÓ¯sdÜkë{C÷]c×|Mª¿/,^¼Ø˜¼¼<óâ‹/3wî\»úµ­ÚÊk2jÔ(ãááa¾ÿþ{»kýû÷7ýë_­Ï«ÚÖpŸ>}Lxx¸]ycÖiKøŒu¤Î|o¨‰³kÄ™Ï W~GpÅ>iì~¨¨¨0>ø 1b„)((°–;;§5qf]½\Múþë I&##£IïàÊÕïS€“V“Ä @ ñá‡I'J9£!IU÷ÜsO­?¢=z´5±ºÞßþö7›:¥¥¥¦S§NÆßßßäææZË«“Ö¯_oS?%%¥Æþ;Sÿî»ï6’l’‰Œù%¡È×××ôéÓÇéþÓøÁîÝ»›ßýîwvå=zô¨1‰W’ùç?ÿiSþå—_I&..ÎZæL©;~üx#ɼýöÛ6uOœ8a|}}ÄËÚj\oS‹#šÄ»aÛòØØX#É|üñÇ6åÝ»w7×_½Ãí7g¯£û³!í×wog“xY·—Þûý÷ßw¨5iíI¼µõ½¡û®±k¾&ëׯ7C† ±+Ÿ4i’ñöö6………6å®HâÝ´i“‘df̘aS¾}ûvÓ¹sgsñâEk™³cÕÐäņ¬Ó–ðëHœùÞPg׈3Ÿ®üŽàŠ}Ò˜ýðóÏ?›Q£F™9sæ˜ŠŠ ›zÎÎiMœ™GWïWÄ_’x´t$ñ ZíQ×)½ ùtêÔI’tâÄ 7Gò‹wß}W’4fÌ»k7nTjjªM½±cÇÚÔñõõU||¼JJJ´iÓ&»6úõëgó¼K—.’¤“'OÖ#õ333åáá¡„„›º‘‘‘ŠÕž={tüøq§úç £GÖÎ;uß}÷);;[•••’¤ƒjÈ!võÕ»wo›²^½z©S§NÚ·oŸrrr$9×_gêfeeI’FeS·S§NêÑ£GGáÿ°¶·¶šk\šBß¾}mžW¿ï]^Þ¹sçfËŽìÏýû÷Ëb±Ø'šâ;BcöICûzðàAÝ|óÍòððÐÒ¥Kåééis½¡sz©ÆÎ£#j[C®ˆ¸I¼´QQQ’¤cÇŽ¹9©¬¬L………òóóSpppƒëEDDH’rssí®…††Ú<÷ññ‘$UUUÕx¯úêWÇRUU¥ÐÐP»º/¾øB’ôÝwß9Ü?WY¶l™Þxã 9rDñññ ÑèÑ£­‰N— «±¼C‡’¤Ó§O7¨¿ŽÖ-**’ŸŸŸ‚‚‚j¡¡X[ÓœãÒBBBlž{xxÈÓÓS6åžžžÍ—3ÙŸ¿ùÍodŒ±y¼üòËͦSëörÍkKRSß³ïšbÍêñÇW¯^½Ô¦Mëœ>ôÐC’¤ .8ÔŽ³RSSuá½òÊ+’¤C‡éÃ?Ô}÷Ýg­Ó˜±rVCש;?c탳ß.×Ð5âÈçaS|GhÌ>iH_þùg%%%)**J7nÔ›o¾is½1sz©ÆÎ£#êzÏjlüÀ5Hâ … T›6mZÄ©X¾¾¾ Uii©ŠŠŠ\ïÔ©S’~9õ«©ùúú*,,L^^^*//·K «~ :ÔáþU³X,ŠÍb±hòäÉÚ²e‹Îž=«ÌÌLc”œœ¬çŸÞ®þ™3gdŒ±+?}ú´¤_’dœí¯3uƒƒƒUZZªââb» 5¬-[ή­–4.-Ic÷¨3ÙŸÍ©¶¾;³nQ·–¶ïƧ… jÚ´i:t說ªdŒÑ /¼ I5®OWøý﯈ˆ½üòË*++ÓsÏ=§»ï¾[mÚ´±ÖiÈXyxxèâÅ‹vuÏž=Û½pïg¬£œýÞp¹¦Z#Mý¡!ÒW///mÙ²Ek×®U¯^½4mÚ4íÞ½ÛzÝUsêÌ<ºr\ÍïÿGÕ¿üË¿èܹsî.°jÕ*kò¹ŸŸŸµ<33Ó&1½´´ÔQ¢>—ïËyóæ)##£Æºu]Z3’xhAºvíªüÑÝaH’n¿ývIÒûï¿owíÆoÔ<`SoÆ 6uÊÊÊ´uëVùûûkÔ¨QMí/’““UQQ¡;vØ][²d‰ºvíªŠŠ IŽ÷O’l+®¿þz½öÚkǦH’¼½½5bÄëÏ/7I*--µI&‘¤¯¾úJ'OžT\\œ:vìèt©;fÌIRVV–M½üü|}ZÏ=÷œþú׿jΜ9võœ«Ž;êĉ6usssõÓO?5A/Üÿëg¿7\ª©×HSGpFCû¬Î;+((HëÖ­SPP’’’”““c­ãŠ9uf]½®Æ÷ÿ½{÷ªoß¾9r¤ÝéÎ-Yqq±®»î:%$$¸;”Z¹+Ɖ'Ê£øøx›ò¤¤$c”˜˜Ø¬ñ´Fî^_5íËiÓ¦iþüùzì±Çìê×u hÍHâ ‰ÕW_}åî0$IO?ý´ºwï®x@6lPQQ‘Ž?®3f(''ÇšˆX]/55Uï½÷žŠŠŠtèÐ!Ýu×]ÊÉÉQzzº"""š-æèèhM™2E7nTaa¡ ´|ùr=ùä“JKK“———Sý“¤ßþö·:tèŽ;¦]»véÈ‘#4hS±ÝÿýúòË/UVV¦Ó§Oë™gž‘1FÆ ³«ªG}T»víÒùóçõùçŸkÒ¤IòññQzzzƒûëhÝÅ‹«mÛ¶JMMÕæÍ›U\\¬o¾ùF“&MRPPPý›4i’,‹~øá‡zÇ‚µÕ¸µÕ’Æ¥¥¨oYŸõqt6—ºúî̺EÝZʾóôôÔ!C”››«gŸ}Vùùù*))ѶmÛôꫯ6ùýg̘!-X°@Ç×µ×^kWÇÙ±9r¤Nž<©—_~YÅÅÅ:|ø°æÌ™Ód§Z»û3ÖQÎ|o¸TS¯‘†|Gh*®èk·nÝôöÛo+//OÉÉÉ*++“äº9ut]½®¶÷ÿsçÎiܸqú×ýWÍœ9ÓÝá8Å£ªª*UUU¹;”Zµ†¤º;Œfåι«m_FGGëÝwßÕSO=¥Õ«WÛ¼¦®k@«f@‹±dÉÓ¹sg—·›‘‘aò3üü|“ššjºwïn¼½½MÇŽÍĉÍ¡C‡ê¬jFe¶nÝj­³k×.#ÉæñÿñÆcW>vìX§ëW;sæŒyðÁͯ~õ+ãíímÚ·ooFŽi6oÞÜàþ8pÀ 4Èš.]º˜eË–95Ž{÷î5Ó§O7={ö4¦mÛ¶æ–[n1+V¬0UUU6uãââLçÎÍ7ß|cFe‚ƒƒ¿¿¿ùä»òÿüÏÿ¬w<êÛ£Ž®Ïúîãìþt¤}If×®]µÞ»¶1w´ïŽ¬Ûšæ©¡?-kèç3RRRLJJŠÃõëwgúÞ˜}ç욯K^^ž™>}ºéÒ¥‹ñöö6æž{î1óæÍ³¶Ñ§OŸZ×N}kª>Ó¦M3’ÌÇ\kGƪÚÙ³gÍÔ©SMÇŽ¿¿¿8p Ù½{·éÓ§5¾GyÄ%ëÔÝŸ±ŽöÁ™ï 5qt4ôsÂÙï—så>q´¯ûÛßìÚxá…jŒ¥ú}ß™ù¯‰3óØû ±ñ×ÄÙ÷߆d222œzÍüÇ///sâĉ&Š îo|}}íÊ$SRRâP;fÀ€®µ¨o_Ž?ÞDEE™òòr§®Õ§9Þ§'­¶cŒ@‹°iÓ&=Zyyyj×®ËÚ]½zµ&L˜ ~&ÐòõîÝ[ùùù:~ü¸»CqØÙ³gÕ©S'ýþ÷¿×Š+Ü`Õë³5îÏæÖŸ7ãÇ—$­Y³¦ÉîÚ½þúëZ¶l™>ÿüsw‡â4ö0Ð8Íñþk±X”‘‘¡;î¸Ã¡úÆuìØQ×^{­¶oßÞdqÁ}†®íÛ·«´´Ô¦<))Ik×®UII‰üüüêm'((H½{÷f4Göåßþö7Ýu×]ÊÌÌTbb¢Ã×êÃ÷D´@k<Üø?qqq’¤½{÷º9À1ÆÍž=[!!!Z¸p¡»Ãl°>×{õÕWõàƒº; $íÛ·O§N²þ;êReeezüñÇ£€€µmÛVãÆÓºuëTYYiS7//O³gÏV·nÝäãã£öíÛ+99Ùîße޶éH½ÌÌLY,ëãò$Õ3gÎèÁTtt´|||Ô¦M3FÛ¶m³Ö¹¼üQ&LPXX˜ÂÃՠÇ7x|ëŠÑ™ñuÄ”””¤ÐÐPjРA%ÜæææÖÙç´´4Y,?^;vì°öÅËËËáØ.‡ƒêŽ;îPxx¸µ,55Õú¿h}mVV–µüÒ?ÔåìÜ5¶~õÜ5tÍ\:?ºé¦›ôÞ{ïiøðáÖ¶¦N*©î}Y­wïÞ’~ùCfÎ\Z#’xhA"##Õ½{wNB«qêÔ)9rD[·nUdd¤»Ãl°>ÆûóŸÿ¬Ûo¿]ÅÅÅzõÕWõóÏ?;|B&4µýû÷K’¢¢¢ì®Íœ9S/¾ø¢^zé%9sFß~û­bbb”˜˜¨O>ùÄZ/''GýúõÓêÕ«õÊ+¯¨  @}ô‘ Ô¿íÚµËé6©—””$cL'æææª_¿~zë­·”žž®üü|}úé§ P||¼þüç?רFjjªRSSuâÄ eddèÃ?ÔwÞi×þ°aîììì:ËëŠÑѱpÄ÷߯þýûëóÏ?×Ûo¿­S§Né•W^ÑÂ… ëMB¾´ÏkÖ¬Ñ'Ÿ|bÓç¹sçÊ£ÀÀ@ 0@ÆcTQQáp|—ÃôéÓ5cÆ ;vLÙÙÙòôôÔ‚ ¬÷¹ÔèÑ£eŒQŸ>}êl³¾¹klý†¶#ÙÏÏéÓ§õúë¯+==]_~ù¥|}}eŒ±®ËºöeµÎ;ÛÔuôÐ‘Ä @ 3hÐ §ô ÷¸ô£ÚO<ñ„CmUŸµoß>8qB‹E ,hÚ¸@dd¤¶oß®ØØXw‡‚Fråzn)\µ>[ëþ\%33SmÚ´Ñý×iÕªUN^ذ‡+WNNŽ$)44ÔîÚÖ­[«#FÈßß_zöÙgÕ£G›zóçÏ×Ñ£GõüóÏë¶ÛnSPPbccµjÕ*c4kÖ,§Ût´^mæÏŸ¯~øAK—.UBB‚BBBÔ£G½õÖ[êØ±£fÏž­S§NÙ½nêÔ©êß¿¿5|øp;V»wïV~~¾M½ªª*k2«#å5il/õè£êìÙ³JOO׈#¤^½zéõ×_·Îqm.íó°aÔPcŸ]é‘GÑ!C ›o¾Y6§ì6„£s×Ðú¹oMó«·ÞzKçÏŸ·k³®}Y-$$D‹¥Æù­ëÐ‘Ä @ 3hÐ eggëâÅ‹îõ¨þ{]G“«Oˆºô±hÑ¢¦íp W®ç+ ûW³©S§Ê£òòríÛ·O¿ýíoÝ’ÓØÃÀ•«´´T’äíímwmôèÑÚ¹s§î»ï>egg«²²R’tðàA 2ÄZ/33SJHH°y}dd¤bccµgÏ?~Ü©6­W›wß}W’4vìX›r___ÅÇÇ«¤¤D›6m²{]¿~ýlžwéÒE’tÆ7õ‡ IDATòäI›òKOv¤¼&í㥲²²$I£F²)ïÔ©S½IÁ—÷¹ú×ËûìJ7Ýt“ËÛttîZ¿1÷­m~Ú·o¯˜˜»6ëÚ——òòòRII‰Ó×€Ö†$^Z˜[o½U.\О={Ü ´X~~~’¤òòr»kË–-Óo¼¡#GŽ(>>^!!!=z´5AV’ÊÊÊTXX¨ªª*…††Êb±Ø<¾øâ IÒwß}çp›ÎÔ«IuL~~~ ¶»!IÊÍ͵»vùɧ>>>’~9a×ÕÓÇK•••©¨¨H~~~ ²»Þ¡C‡:_yŸ=<~ùy|Sô¹Z`` ËÛtvî\5×õµSßü´iÓÆ®¬®}y©ŠŠ ùûû;} hmHâ …éÑ£‡ºvíª>øÀÝ¡pÅËÌÌ´Iت>=®5JKK³ö#**ªÞòÖhÕªUÖ¾T' µ¦ö[º–°V222Ô»woùûû[cÙ¿£Úl û¼%Äp%êØ±£$©°°ÐîšÅbÑäÉ“µeË={V™™™2Æ(99YÏ?ÿ¼¤_N¶ “———ÊËËíNí®~ :Ôá6©W___…††ª´´TEEEv×O:%é—“‚Ý©1}¼”¯¯¯‚ƒƒUZZªââb»ë.‹·9xxxèâÅ‹vågÏžm–û»Z}ósúôi»²ºöeµsçÎÉc­ëè5 5"‰€hôèÑÚ¸q£»ÃàŠ—””$cŒÝJ£Í;WÆÅÅÅ9TÞMœ8QÆÅÇÇ;üšââb]wÝuJHHh’ö›ƒ3}hŒ†¬WƶcÇÝyç9r¤òòòôý÷ß»$™¸%ìó–Õè7¿ù$éøñãv×ÂÂÂtàÀI’···FŒaM¦Þ°aƒµ^rr²***´cÇ»6–,Y¢®]»ª¢¢Â©6­W›Ûo¿]’ìê–••iëÖ­ò÷÷רQ£êm§)5¶—3fŒ$)++˦¸2¶5kÖÈ£9sæ(((HÑÑÑ:vì‰\¨U\\œ:tè }ûöÕxýþûï×—_~©²²2>}ZÏ<óŒŒ16l˜µÎÓO?­èèhM™2E7nTaa¡ ´|ùr=ùä“JKK“———Sm:S¯&O?ý´ºwï®ÔÔT½÷Þ{***Ò¡C‡t×]w)''Géé銈ˆhà¨IÆ Sxx¸²³³*¯Mcúx©Å‹«mÛ¶JMMÕæÍ›U\\¬o¾ùF“&MRPPSmÕæ·¿ý­:¤cÇŽi×®]:räˆ ä’¶/5räH\ÞÞÞÚ¼y³»ChÕ‚ƒƒuøða½ÿþûî¥ÁZr\Û±cÇ$Iááán W‹Å¢©S§êÓO?ÕÉ“'m®}üñÇŠ‰‰ÑĉÕ¶m[õìÙSYYYZ±b…}ôQk½:è³Ï>SRR’fΜ©öíÛ+&&Fï¼óŽÖ®]«;î¸Ãé6©W}jíÚµk%Iþþþš4i’$)22R»wïÖwÞ©Ù³g+<<\7Ýt“Ο?¯-[¶hÚ´i’¤ììl»6,X`›%K–H’n¼ñF›Ó²+**dŒ‘1ÆfÌ./¯+FGÇÂÑÑÑÚµk—úõë§””uèÐA÷ÜsfÍš¥^½z©¬¬Ì:× íóÒ¥Kuà 7¨gÏžš0a‚ÒÓÓÕ³gO‡â«éž‹¥Æº‹-ÒÔ©Sµxñbk?zè!EFFêÌ™3²X,š7ožÓýp¶~ms×ñ»|~"""4}útÍŸ?_Ý»w—§§§ÍÔµ/«½ûî»êܹ³ÆŽýÿìÝy\Veþÿñ÷,²( „{Yjê×l¤´T 5!ÉÔ4ÍÆ ˜¢L+§q-É-r™P›)t&Z00›\bJšê‘»– › *š ²œßó“‰7¼žÇýxt_ç:×y_×}ÎmÇîOgD¶ÖÈöÚ]Àæââ¢jÆ ?~¼Ùq€zWZZjvX¡^xAï½÷ž^}õU½ýöÛåí½zõªðþjZµj¥… jáÂ…WíWÝ1«Ó/((¨Rí/µnÝZ‹/ÖâÅ‹«ìÓ¿ÿ*Ç¸ÚØ_|ñEµÚ¯–±&ë[ÞÞÞúàƒ*µ_©³6s¾ýöÛ«œ÷µ\mÍÕÕU+W®¬Ô¾cÇŽJm5‡YíRÕŸOnn®Ú´iS©½ªëR’¾ûî;­_¿^«W¯–]µ·ÖŠ'ñÐ@=Z}ô‘Ο?ov¬Ö‚ d±XtþüymÛ¶M‹E‹E¶¶W~F^^žÆŒ#777µnÝZ:xð`¥~'NœÐ´iÓÔ©S'ÙÛÛ릛nÒ¨Q£ôí·ßJ’Μ9S~¬Ë¯9sæHúï“Ù>zôè«Î¡¤¤D‰‰‰ò÷÷—§§§Õ³gOÅÄĨ¬¬ì:WèÊŠŠŠôÊ+¯¨[·nrrrR«V­¨þóŸ• -¯µÒÿžæxùuèСj­óž={$WWW9;;kàÀÚºukµçñëã^×øõ1×k£×šC~~¾¢¢¢Ô¥K988¨]»vòóóӻᆱ‹/Jª¿s¨ªl5]ƒ+=1Òb±¨ÿþWœ§½½½ÜÝÝ5|øpmÞ¼¹Æ¹«s×dÍjr½Ô$ƒT½s®¶ WWW¥¤¤hýúõZ¶l™Ùq€F'//O­ZµRqqq…öC‡éàÁƒ2dH¥}ªº.üñG5J/¾ø¢ÆŽ[aŸ«m¬E¼4P¿ýíouéÒ%}òÉ'fGÀj=ÿüó2 CÎÎκï¾ûd† ÃPIIÉûGFF*22RÙÙÙZ·n¶lÙ¢qãÆUè“››«~ýú)))IË—/שS§ôùçŸëÔ©SòññÑ—_~)777†¡¡C‡ÊÆÆFЬY³$I¶¶¶2 C>>>JHHÐúõë¯:‡ÔÔT;VC† ÑîÝ»uôèQ…††***J3f̨›…ú•gžyFo½õ––,Y¢üü|íÞ½[ݺuÓÈ‘#µeË–­…ô¿§9Ž9RRÅuNLLÔgŸ}Vi8 íØ±CëׯױcÇ´|ùrýùϾb±ã•üú¸×3~}ÍõZçèÕæ——§~ýúiÍš5Љ‰ÑÉ“'•™™©AƒiòäÉŠ•TçPUÙjº¿îñâE†¡ŒŒŒ ó\½zuù<ÿýïËÉÉI¾¾¾ZµjUrWç:¯ÉšU÷z©i†êžsµÍИôéÓG;vìÐ'Ÿ|¢³gÏšhtNŸ>­°°0=zT.\ÐW_}¥1cƨeË–úÃþpÅ}®t]ÆÆÆjîܹš;wn¥þWÛX3Šxh Ú´i£^³°Ô)S¦ÈÇÇGÎÎÎ2dˆôõ×_ëäÉ“å}^|ñE>|X‹-ÒC=$uïÞ]k×®•aš:ujyߨ¨(•••iÑ¢E޳mÛ69rDÁÁÁÕÊ5hÐ ½øâ‹rwwW›6m4uêT=ú裊‰‰©—‚µM›6©{÷îò÷÷—£££<<<4þ|y{{WèW“µø¥_®³ŸŸŸFŒQi_zé%9sF111ò÷÷—‹‹‹zöì©¿ýíoÊÍͽî9Ötüúœkm½øâ‹úé§Ÿ£€€µhÑBš5k–† V¡ï>‡~éz×àò<ß|óM¨eË–òööÖêÕ«uË-·hÚ´i:vìX­òTuKÕ_³ê^/5ÍP“s®6›N:éÃ?TË–-ÍŽ‚ÿï×O¤¿ÒköìÙdlà<==•žž®3gÎèþûï—»»»~øaÝvÛmúꫯtë­·V¹ï¯¯Ëèèè*Ÿ²{µm€5£ˆ€,88X))):þ¼ÙQhúõëWá}Û¶m%I999åmÉÉɲ±±Q@@@…¾žžžêÞ½»233•••%IzðÁÕ³gO½ûî»ÊÏÏ/ï;þ|M:Uvvv×Ì Í›7WjïÕ«—Š‹‹µsçÎêO°š† ¦íÛ·+44T*--•$íÝ»Wƒ *ïW“µø¥_¯sûöí%U\çÔÔTIÒСC+ôõòòª“ÂÄšŽ_Ÿs­­>ø@’4|øðJÛ>ùäEFFJ2çú¥ë]ƒËó1bD…vùúúêâŋڸq£~øá‡JÅwÏ<óÌ5ó\é:¯ÉšU÷z©i†šœsµÉÔ·ËO¿ÚËìYkÈØøúúêÿø‡~úé')//Oï¿ÿ¾ºtébv4 Á£ˆ€lÔ¨Q***ÒÆÍŽ@“àêêZá½ÍfWVV&I***RAAÊÊÊäêêZ©`ð›o¾‘$íß¿¿|ŒÈÈH]¸pAË—/—$íÛ·OŸ}ö™BCC«•©  @¯¼òŠzöì)ww÷òcMŸ>]’táÂ…ë›ô,[¶LqqqúñÇåëë«–-[jذaåÅ”RíÖâ²_¯³½½½¤Šë|îÜ95oÞ\...•ö¿ù曯k~5¿>çz=s(((PóæÍÕ¢E‹«ö5ãú¥ëYƒkÍÓÃÃC’”——§=zT*¾[ºté5óüú:—j¶fÕ¹^jš¡¦ç\m2€úG/ ˜‡‡‡  õë×›«f±Xêd¹¹¹ÉÖÖVÅÅÅU>µoðàÁåûŒ?^Zºt©ŠŠŠ´páBMš4IîîîÕ:f`` þüç?ëÉ'ŸÔ¾}ûTVV&Ã0´xñbIÿ}Š`]³X,zì±Ç”žž®3gÎ(99Y†ahÔ¨QZ´hQ­×¢ºÔ¢E ê矮´ýÔ©S×5¿šŽ_Ÿs½¬¦ç¨ƒƒƒ\]]UXX¨sçÎ]µ¯çP]¹Ö<;&é¿O§­K5Y³ê\/5UÓs®>2€ëG/ \pp°RRRtñâE³£`µœœœtéÒ¥ò÷·ß~»V¬XQ«±F¥’’mÛ¶­Ò¶èèhuèÐA%%%åm ×ñãǵpáB%$$(""¢ZÇ*--Õ¶mÛäéé©iӦ馛n*/ö¬Ï7pssÓž={$Ivvvò÷÷Wrr²,‹>úè£ò~5]‹š>|¸$)55µBûÉ“'µwïÞZy=ã×ç\¥Ú£<òˆ$éã?®´­OŸ>zöÙgM;‡êÒåyþòÜ“þû´ÚM›6ÉÑÑQC‡­³ãÕtͪ{½ÔTMιúÊ®E¼4p¿ýíouñâEmܸñºÇ²X,¼xñâÅ‹W½½ÆŒSòÕÿû¿ÿÓ¾}ûtôèQ}ùå—úñÇ5pàÀZõú믫K—.zâ‰'ôÉ'Ÿ¨  @§NRll¬^}õU-X°@¶¶¶ö —£££fÍš%???uíÚµZÇjÖ¬™ ¤¼¼<ÍŸ?_'OžÔÅ‹µyóf½ýöÛµÊ_]O=õ”¾ÿþ{éøñãzã7d†† RÞ§6kQ]¯½öšZµj¥ÈÈH¥¥¥éçŸÖ®]»4a¹¸¸\÷üj:~}ÎUªÝ9úú믫sçÎzöÙgõÑGéܹsÊÊÊRxx¸rssõì³ÏšzÕ•Ë󌌌ԇ~¨sçÎiß¾}zôÑG•››«˜˜yxxÔÙñj³fÕ¹^jª¦ç\u2œ>}ZÞÞÞêܹ³rrrj TÅ0 Ãìàêî¿ÿ~µoß^ µÚ?++KÛ·o¯ãT\YHHH½,IZ·n]öÛ»w¯ž|òI}óÍ7jÕª•fΜ©ððpeddÈÇǧBß—_~YsæÌ‘Åb©Ð>bÄ}øá‡’¤S§NiîܹJNNÖÑ£Gåææ¦>}úhúôéòóó»b†ÐÐP­\¹Rÿú׿tÿý÷W;ûÉ“'5kÖ,}üñÇÊËËS«V­4|øpyzzjÞ¼y’¤¾}ûjìØ±š>}z¥¹¸¹¹]±}Μ9Uó»ï¾Ó_þò}ñÅ:|ø°š7o.oooýîw¿Óï~÷» kSµ¨í:ïÛ·O3fÌÐgŸ}¦ââbõèÑCüãµxñbmÚ´I’ô»ßýN«V­ºâ<’““ËŸâzÙøñãõþûï×jüúœkUçèµæŸŸ¯9sæhÆ ÊÊÊR›6môÀèÕW_Õm·Ý&éúÏ¡ªÎ•ª²=óÌ35Zƒ)S¦TG’¾üòKõïßÿŠótrrRÿþýõ /\³P¶6ŸIu×lÇŽÕº^êû»¦º×ì©S§tÏ=÷¨¸¸X_~ù¥¼¼¼®ºv¿TÛïßš°X,êß¿¿ÚµkWoǰV*((P‡ÌŽ4Xêß¿½~O5´Ž"^¬À_þò=ÿüó:vìX>>fG€&©ÿþ|Kºxñ¢>üðC­X±B›6m’»»»F­µk×r¨„"^¬ŒÅbÑc=¦%K–hþüù²³³3;7LTT”ÙMLYY™¶oß®øøx­^½Z—.]Òƒ>¨ÄÄDqO¨’Ù@ÍMœ8QùùùJMM5; 4JGŽQtt´n»í6 8P[·nÕ¬Y³”••¥””SÀ ¸*žÄ €êر£î¿ÿ~½÷Þ{ 4;4 gÏžUrr²âããµiÓ&yzz*88X“'OVï޽͎°2ñ`¥&M𤰰0­U«V);;[qqqòóó“Åb1;&U¢ˆ€F",,LÇ×G}dv¨•œœÅÄĨW¯^ºûî»õé§Ÿê÷¿ÿ½~üñG¥¥¥iâĉrvv6;&ÕbkvP7:tè ÅÆÆ*((Èì8P-………JIIQ\\œRSSåââ¢-[¶L 0;µF/HXX˜F¥¨k×®fÇ€*eff*..Nï¿ÿ¾ 4xð`½óÎ; –£££Ùñ¸n6fu' @^^^úë_ÿjv¨$++KÑÑÑòööÖÝwß­ôôt½ð ÊÎÎVZZš&NœH/ Ñ ˆ€FÄÖÖVS¦LÑ_ÿúW™tñâE­[·NþþþêСƒ¢££5xð`mÙ²E;wîÔŒ3äááavLêE¼42aaa:}ú´Ö®]kvMTYY™¶nݪ°°0yxxh„ jÞ¼¹uìØ1ÅÆÆjÀ€fÇ ^QÄ @#sË-·hôèÑŠ‰‰1; €&æÈ‘#ŠŽŽÖm·Ý¦jëÖ­zùå—uôèQ¥¤¤(88XvvvfÇà†°5;¨{QQQºûeË 8Ðì8±³gÏ*99YñññÚ´i“<==¬É“'«wïÞfÇÀ4ñÐõíÛWýû÷WLL E¼ê\YY™¶oß®øøx%$$¨¤¤DþþþJLLTPPOÛ@ñÐhEDDh„ úé§ŸÔ¹sg³ãhöîÝ«5kÖè½÷ÞÓ¡C‡Ô·o_Í;WãÇW›6mÌŽ@ƒbcvP?F-///-_¾Üì(¬Ø™3g'ÝqÇZµj•~øa}÷ÝwÚ±c‡"""(àà (â ‘²µµÕÓO?­U«VéçŸ6;+RVV¦ôôtMœ8QmÛ¶UXX˜ÜÝݵaÃ:tH111ºë®»ÌŽ @ƒF/CŠ IDATXXX˜.]º¤¸¸8³£°»víÒÌ™3Õ¶m[ùûûk×®]Z¼x±Ž;¦¤¤$ÊÖÖÖì˜XŠxhÄZµj¥G}To¾ù¦ÊÊÊÌŽ :}ú´V¬X¡¨{÷îJHHФI“´ÿ~íØ±C¡¡¡jÙ²¥Ù1°:ñÐÈEDDèÀúøãÍŽ (--UzzºBBBäéé©ÈÈHyyy)--MGŽѼyóÔµkW³c`Õ(â ‘ëÑ£‡†®èèèJÛΜ9#‹ÅRá5gÎIRIII…öÑ£G—ïwâÄ M›6M:u’½½½nºé&5Jß~ûm…ñ‹ŠŠôÊ+¯¨[·nrrrR«V­¨þóŸ*--­ß‰¨dçΚ9s¦¼¼¼4tèPåäähÉ’%:~ü¸’’’äçç'‹ÅrÍq’““+Ü/:tHcÆŒ‘›››Z·n­€€\›7o®é¢9þ¼$qÿ ÀªPÄ @0cÆ mݺUÛ¶m«Ðîææ&Ã04tèPÙØØèÀš5k–$ÉÖÖV†aÈÇÇG Z¿~½$)77WýúõSRR’–/_®S§NéóÏ?שS§äãã£/¿ü²|ügžyFo½õ––,Y¢üü|íÞ½[ݺuÓÈ‘#µeË–·@vêÔ)­X±B}ûöU=´fÍMž>>rvv–ŸŸŸFŒ¡¯¿þZ'Ož,ïóâ‹/ê§Ÿ~Ò›o¾©€€µlÙRÞÞÞZ½zµn¹åM›6MÇŽ«³Lhœ¸`M(â ‰xá…”’’¢~ø¡Ò¶|P={öԻᆱüüüòöùóçkêÔ©²³³+oKNN–*Œáéé©îÝ»+33SYYY’¤aÆiûöí UFF†JKK%I{÷îÕ Aƒêa–@Ó–™™©ˆˆµoß^AAA:}ú´V­Z¥ììlÅÅÅÉÏÏO‹¥ÎÛ¯_¿ ïÛ·o/IÊÉÉ)oûàƒ$I#FŒ¨Ð×ÁÁA¾¾¾ºxñ¢6nÜXçÙиpÿ ÀšPÄ @ñðÃëÎ;ïÔ‚ ®¸=22R.\ÐòåË%IûöíÓgŸ}¦ÐÐÐò>EEE*((PYY™\]]e±X*¼¾ùæIÒþýû%IË–-S\\œ~üñGùúúªeË–6lXù÷\¿œœÅÄĨwïÞºûî»õé§Ÿ*<<\TZZš&Nœ(ggçzÍàêêZá½½½½$©¬¬LÒÿî%š7o®-ZTÚßÃÃC’”——W¯9Ñ8pÿ ÀZPÄ @a±XôÜsÏiõêÕ:räH¥íãÇ—‡‡‡–.]ª¢¢"-\¸P“&M’»»{y¹¹¹ÉÖÖVÅÅÅ2 ㊯Áƒ—ó±ÇSzzºÎœ9£ääd†¡Q£FiÑ¢E7lî@cSXX¨uëÖ)00P;vÔìÙ³õ›ßüF[¶lÑîÝ»5{öluêÔÉì˜åäêêªÂÂB;w®ÒöcÇŽIúïRkáþ€µ ˆ€&d„ ºå–[ôæ›oVÚæàà ððp?~\ .TBB‚"""*õ5j”JJJ´mÛ¶JÛ¢££Õ¡C•””H’ÜÜÜ´gÏI’üýý•œœ,‹Å¢>ú¨Žg4~™™™ŠˆˆP»ví4nÜ8êwÞQvv¶bcc5`À³#Vé‘G‘¤J÷EEEÚ´i“5tèP3¢ÁÊpÿ ÀZPÄ @bgg§iÓ¦iÅŠÊÏϯ´=<<\ŽŽŽš5k–üüüÔµk×J}^ýuuéÒEO<ñ„>ùäèÔ©SŠÕ«¯¾ª ÈÖÖ¶¼ÿSO=¥ï¿ÿ^EEE:~ü¸Þxã †¡!C†Ôë\€Æ"++KÑÑÑòööÖÝwß­ôôtMŸ>]YYYJKKÓĉåäädvÌkzýõ×Õ¹sgEFFêÃ?Ô¹sç´oß>=úè£ÊÍÍULLŒ<<<ÌŽ +Áý+k@/MLhh¨ìííµ|ùòJÛÚ´i£ &È0 EEE]qÿ›o¾Y_}õ•‚‚‚ôÌ3Ï覛nR·nÝôüC6lPHHHyßýë_êÖ­›ÆŽ«V­ZéŽ;îPjjªV®\©—^z©ÞæX»‹/jݺu T§N­ÁƒkË–-Ú¹s§f̘!OOOÓòeddÈb±hÆ ’T^L)I‹EÑÑÑ’¤>}ú( @’äé驯¿þZãÆÓ´iÓÔºukÝsÏ=:þ¼ÒÓÓõä“Oš3X%î_X‹a†Ù!ÀõÊ+¯hÙ²e:tèZ´hQaÛßþö7-[¶L;vì0)Ð4•••iûöíŠ×š5ktá >^ *))‘¿¿¿$;;;³# ÷¯¬ w,4Q­[·Vxx¸Þyç;wN...fG¥½{÷jÍš5Š‹‹ÓO?ý¤¾}ûjîܹ?~¼Ú´icv<Àª†av¨6³óLŸ>]………Š5; Ш(..NþþþºãŽ;´råJê»ï¾ÓŽ;A/E¼4a­[·ÖSO=¥ùóçëÂ… fǬZYY™ÒÓÓ5qâDyyy),,LîîîÚ°aƒ>¬˜˜Ýu×]fÇ7E¼4q3fÌÐùóçµbÅ ³£Vi÷îÝš={¶:wî,íÚµK¯½öš²³³•””¤ÀÀ@ÙÚÚšÜ`ümM\›6môä“O*::Zaaartt4;Ðà>}ZëÖ­S\\œ¶mÛ¦víÚiüøñš2eŠºvíjv<Ðð$^ ^xAŠ5; Ð`•––*==]!!!òôôTdd¤¼¼¼”––¦#GŽhÞ¼yð€rñyzzê™gžÑܹsuîÜ9³ã ÊÎ;5sæLµmÛVC‡UNNŽ–,Y¢ãÇ+))I~~~²X,fÇ E¼@’4cÆ ]ºtIo¾ù¦ÙQÓ:uJ+V¬Pß¾}Õ£G­Y³F?þ¸öï߯­[·*44T...fÇ E¼@’ÔºukEEEiáÂ…ÊÏÏ7;pÃ)%%E!!!òôôÔôéÓÕ½{w¥¥¥éСCš7ožn½õV³c+A/(÷ÜsÏÉÁÁAóçÏ7; pÃìܹS3gÎTûöí¤œœ-]ºT999Š‹‹“ŸŸŸ,‹Ù1€•¡ˆ”sqqÑŒ3ôÖ[o);;Ûì8@½ÉÉÉQLLŒz÷î­=zhÆ ×ÁƒµuëV…††ÊÙÙÙì˜ÀŠQÄ *W›6môú믛¨SEEEZ·nÕ±cGÍž=[¿ùÍo´eËíÚµK³gÏV§NÌŽ  Šx@Í›7×þð­X±B4;pÝ233¡¶mÛjܸq*,,Ô;ï¼£ììlÅÆÆjÀ€²X,fÇ E¼ ’'žxB]ºtÑ«¯¾jv V²³³-oooÝ}÷ÝJOO×ôéÓ•••¥´´4Mœ8QNNNfÇE¼ ’fÍšéü£ôÃ?˜MLqq±.\¸Pãý µnÝ:ªcÇŽŠŽŽÖàÁƒµeËíܹS3f̧§g=$¨Œ"^pE!!!ºë®»4sæL³£  ÉÏÏ—¿¿¿âã㫽Off¦ÂÂÂtóÍ7kܸq*,,Ôš5k”——§ØØX 0 \™­Ù@Ãdcc£E‹iðàÁJOO—ŸŸŸÙ‘ÐÈíÚµKÇב#Gtþüy………UÙ÷èÑ£Z½zµV®\©ƒêÎ;ïÔË/¿¬É“'ëæ›o¾©®Œ"^P¥Aƒ顇ÒóÏ?¯o¾ùF666fG@#µqãF=ZEEE’¤;vhÏž=êÖ­[yŸ³gÏ*99YñññÚ´i“ÜÝÝ5zôh­[·N}úô1+:Àñ_ÖÀU-X°@;wîTBB‚ÙQÐH­X±B=ô.\¸ ââbI’½½½Þÿ}•••iëÖ­ SÛ¶mªæÍ›+11QyyyŠ¥€4HÃ0 ³C€†-44Tü±öíÛ''''³ã ‘())QDD„–/_~Åí-[¶”«««Ž=ªßüæ7š4i’ÆŽ+ww÷œ€Ù’’’4fÌñówVdOâ×4gÎ={VK–,1; ‰üü| 2D+V¬¨²ÏÙ³guß}÷i÷îÝÊÈÈÐÓO?M/°ñ€kºù曥¹sçêØ±cfÇ€•ûá‡Ô»woedd¨¤¤¤Ê~vvv²±±Q·nÝn`:€ºA/¨–éÓ§ËÅÅEsçÎ5; ¬Xjjªú÷ﯼ¼<_µoqq±Ö¯_¯‚‚‚” îPÄ ªÅÙÙYúÓŸôöÛokÿþýfÇ€Z°`FŒ¡‹/^õ ¼¿TRR¢¿ÿýïõœ  îY Ã0̬Cii©z÷î­.]º(99Ùì8PmÁÁÁfG€&­¬¬Lß|ó:$I²±ùßsh~ùSÖª~ÖÚ¦M 4¨>#Þ0QQQòññ1;`u’’’4f̘*¿' Zgkv`=š5k¦˜˜ùúú*55UÆ 3;TËúõëÕ¿µk×Îì(Ð$åææÊÁÁA·ß~»š5k¦fÍš•o³³³«ðÏ‹E’*ô»ÜfíÖ¯_¯àà`Šxh"(â52dÈ)**J¾¾¾Š. !{öÙgbv @ÖXŠ‘@õؘXŸ… ê§Ÿ~ÒòåËÍŽ4Hñ€»õÖ[õì³ÏêOú“Nœ8av Á¡ˆÔÊK/½$GGGýá0; ÐàPÄ jÅÅÅEóæÍÓÊ•+•™™iv A¡ˆÔÚ„ tï½÷*""B†a˜L‘‘‘!‹ÅRáåææV¡Orrr…í&¥­híڵ噚7o~ÃŽ{àÀY,­]»öºÆùõºÖQBàÆ2ëZ¼Ñ¬ý; ¦(âµf±Xôæ›oêË/¿ÔºuëÌŽ¦èß¿¿ ÃÐäÉ“%I'NÔ™3g*ô RVV–<<}ºÎŸ?ov0ÍüùóÕºukÅÅÅé‹/¾¨´=22R‘‘‘êØ±£ 鬃‹‹‹ `v Mß9 ¾QÄ ®[tt´Îž=«9sæ˜LÓºukEGGK’ÂÃÃU\\\¾-55U»víÒsÏ=gV<À F/¸núóŸÿ¬E‹i÷îÝfÇÓ<ñĺï¾û´sçN-^¼X’TXX¨©S§jùòå²³³39!àF¡ˆÔ‰ððpõîÝ[O=õ” Ã0;˜Âb±è/ù‹lmmõꫯêÈ‘#zíµ×tï½÷ê¨Ð7??_QQQêÒ¥‹ìííåîî®áÇkóæÍå}æÌ™#‹Å"‹Å¢”·§¦¦–··iÓ¦ÚùöìÙ£   ¹ººÊÙÙYÔÖ­[«ì_ŒÉÉÉåY,‹:¤1cÆÈÍÍM­[·V@@€zôèò±Oœ8¡iÓ¦©S§N²··×M7ݤQ£FéÛo¿­Vþêd«éš×v.¿vù3²X,j×®¾þúkùúúªE‹rrrÒàÁƒµmÛ¶JûÕdMªÓ÷×sß»w¯BBBÔºuëò¶“'Oª¨¨H¯¼òŠºuë&'''µjÕJúç?ÿ©ÒÒRS>‹_ªéµøKµýLùΩûï€k2êÈW_}eØØØ«W¯6; T ÉHLL¼aÇ{þùç IÆ€ OOOãØ±c¶çææ;w6<<<Œ””£  ÀØ»w¯1jÔ(Ãb±+W®¬ÐßÙÙÙ¸ï¾û*§oß¾FëÖ­«•iÿþý†›››Ñ¶m[ãÓO?5Î;g|ÿý÷ƃ>htêÔÉppp¸®Œ#GŽ4$#GŽ4¶oßnüüóÏFZZšáèèhôëׯZ«šçµ\騛6m2Z¶lYéØ)))†$ãµ×^3N:eœ8qÂxë­· ãù矯Ðwذa†qàÀJÇôññ©ðç]NNŽÑ±cGÃÃÃÃøè£ŒsçÎ?üðƒñÀÍ›77¶oß~ÍyÔ$[Uó®j͇zÕ¹$$$\3ŸaF¯^½ gggÃÇǧü˜_ýµq×]wöööÆçŸ^«5©éú]žû<`lÞ¼Ù8þ¼‘‘‘a4kÖÌ8qâ„1eÊÃÕÕÕøôÓO .yyyå×åæÍ›¯9Ïúü,jz-V¥&Ÿ)ß9WVÛïœëq£ÿ<“ÄÄDƒŸ¿°2IÜÅ€:õä“OžžžÆ™3gÌŽåntÑÔÏ?ÿl´oßÞd,]º´ÒöÇÜd¬Y³¦B{aa¡áååe8::yyyåíuQPlH2Ö¯__¡=;;Ûppp¨TPWÓŒ— êRRR*ô=z´!É8qâÄ53^oï¯ýè£V:vJJŠ1hРJcL˜0Á°³³3 ÊÛÒÓÓ IFxxx…¾[·n5:tè`—·Mš4ÉT©677×ppp0úöí{ÍyÔ$ÛÕæ}¥5߸qc•siÛ¶­qéÒ¥kæ3ŒÿñJ2þóŸÿThÿþûï IF¯^½ÊÛj²&5]¿Ësÿøã¯˜³sçÎÆ½÷Þ[©ÝÛÛ»ÚE¼õõYÔôZ¬JM>S¾s®Œ"^ÀºPÄ À %ÙÔÏó}@S5oÞ<•––jöìÙfGÓ8;;ëþûï—$õêÕ«Òö>ø@’4bĈ íòõõÕÅ‹µqãÆ:Í”šš*I:th…v///y{{×YÆ~ýúUxß¾}{IRNNNíÃWӯݶmÛJÇÐæÍ›+íÛ«W/kçÎåm¾¾¾êÓ§Þ}÷]åçç—·ÏŸ?_‘‘‘²µµ-oKNN–*Œëéé©îÝ»+33SYYYWÍ_“l¿T5ðÁÕ³gÏ+ÎeêÔ©²³³»j¶_rvvVïÞ½+´õìÙS^^^úî»ï”››+©fkRÛõ»çž{®˜qذaÚ¾}»BCC•‘‘¡ÒÒRIÒÞ½{5hРkα>?‹š^‹U©ÉgÊw€9(âuªU«Vzíµ×´dÉ}ûí·fÇ€§¨¨HjÞ¼¹Z´hQi»‡‡‡$)//¯NyîÜ95oÞ\...•¶ß|óÍu–ÑÕÕµÂ{{{{IRYYY­óWׯmccSéØzå•WÔ³gO¹»»Ëb±Èb±húôé’¤ .Tã¹çžÓ… ´|ùrIÒ¾}ûôÅ_hÊ”)å}.¯WYY™\]]ËǼüúæ›o$Iû÷ï¿jþšf«jÞU­yddd¥¹|öÙg ½j®_sss»bûåóèøñã5Z“ëY?ggç+fY¶l™âââôã?Ê××W-[¶Ô°aÃÊ E¯¥¾>‹š^‹×RÏ”ïœÿÇÞ½‡EYí{ÿ÷á"/€¨E^;nE*·º#QÀIJ½+j†ÚC Ç2.;ݵML)5KO^Rõl13ñ˜ÚƒRK+SH»yæwþðaã 0/ è÷ó<óë]ïZßµÞõíý°\DÔaçÎzŸ¬¬,0(ß·oŸ…ÓÕ›x‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈìžxâ <øàƒxê©§ "–ŽCDÔ¦ØÛÛÃÕÕ(--5¸~åÊ·N ­eee…›7oÔ-..6¹OTTT ¬¬ÌàzQQQ³3šƒJ¥2k{ÆŒ3‹/ÆìÙ³‘““­V ÁŠ+Àà÷Öĉѽ{w¬Zµ •••X¾|9fÏž­·ÑÐÞÞnnn°±±AUUDÄèçÑG5k6¥¦N OOO½±Ì˜1îîîŠÚ),,4š%??À­ šJæÄ\óW—J¥BLL >ýôS#-- "‚èèh¼ùæ›ÞßRÏB黨Sž)¿sê×ß9DÔ4jµ?þ8&L˜ ûÔ~×-›0a¶nÝjá´DDDDDDõã&^"""""""""""""""2;•J…5kÖà믿Æûï¿oé8DDmÎØ±cÀàä¸ÊÊJ:tjµaaaºrooo\ºtI¯n^^þøã“û5j ==]¯¼  ÙÙÙÍÎhŽŽŽzûöí‹÷Þ{Ïlí×ÔÔàèÑ£ðòòB||<:wî¬ÛÄW^^nô$$$ ??Ë—/ÇöíÛoP/::ÕÕÕ8zô¨Áµ¥K—¢G¨®®6k6¥ìíí§ËÖ­[‘ ¸ŠŠ ;vL¯ì‡~ÀåË—áïïoooÊæ¤¹ów;777œ={`kk‹‘#G"-- *•ªÑ[úY(}bê3åwŽq-ýCDM§V« [[Ûë©T*L™2¥•R)ÇM¼DDDDDDDDDDDDDDDÔ"çž{NwzÝòúë¯Ã××ü1JKK‘““ƒ)S¦ 77)))ðôôÔÕ ÅåË—±jÕ*”••áüùóHHH@—.]Lîóµ×^ƒ‡‡4 <ˆ²²2üôÓO˜6mœ›ÑQ{²m IDATˆœœ\¸p™™™øå—_0lØ0³µommàà`äååaÙ²e(((@yy9Ž9‚µk×Ö{ßœ9sàêꊤ¤$DEEÁÇÇÇ Îë¯¿Žž={bÖ¬YØ¿?JJJPTT„wß}¯¾ú*’““acccölJÅÅÅA­V#)) #FŒ@¯^½·áêêŠE‹!33ׯ_ÇñãÇ1mÚ4ØÙÙ!%%EWOÉœ4wþŒyòÉ'ñý÷ߣ²²ùùùxã7 ">|xƒ÷µô³Pú.6Æ”gÊïãZú;‡ˆšgÊ”)¨ªªj°Ž³³3BCC[)QQ ¹~ýºøúúÊäÉ“-…ˆîr$55µUúzçw€Á§ªªJ¯^AAh4ñõõ[[[quu•°°09tèA›ÅÅÅ+ÞÞÞ¢V«eèСrìØ1 Ôµ¿`Á‚F³eggKTT”tèÐAÔjµÉÇ,!!!ºvžxâ E333 Æú /ˆˆ”=ºÁ|gÏž•aƉ“““tïÞ]V¯^Ý`ý¦ô}õêU™;w®tïÞ]lmmÅÓÓSfΜ)Ï?ÿ¼®n`` A_Ï>û¬S§NÕ›§°°På¾ûî[[[éܹ³„††ÊÁƒG-S³5wÎgÏž-äóÏ?7)W]þþþâãã#?ýô“„……‰‹‹‹¨Õjyä‘G$##£YsbJ]cc7ö§'Ož”¹sçÊý÷ß/ŽŽŽâáá!?ü°¬[·N´Zm£ãlég¡ô]lŒ)Ï”ß9†”~ç˜Ckþ>"j着ªÄÃÃÃè÷>±µµ•9sæX:&QCv¨DDš´û—ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈû÷ïÇc=†>úcÆŒ±t"ºK©T*¤¦¦b„ –ŽBdq6lÀêÕ«qüøqÅ÷   /^ldÔTÍy¦ÔºøûˆH™§žz ëÖ­«÷DÞÏ>û <òH+§""""""2ÙN+K' """"""""""""""¢;Û¨Q£0qâD<ýôÓ(++³t""¢»ÞÚµk‘˜˜hédF|¦Dt§šS"¢ö@¥R!&&¶¶¶zå7oÞÄäÉ“-”ŠˆˆˆˆˆÈt*K‡ """"""""""""""¢;Ÿˆ`Ĉ(,,ıcÇ þ›ˆ¨%©T*¤¦¦ò¤J""²(þ>"RîÔ©SÐ+»çž{ðÛo¿Y&‘évò$^"""""""""""""""j*• ï¼ó²³³ñÖ[oY:µþþþèÝ»·îg;;;<þøãLDDDDDDd:nâ%""""""""""""""¢VÓ§O,Z´/¿ü2~ýõWKÇ!"j¶´´4¨T*ݧ¢¢ÂÒ‘ˆ¨ËÊÊÒû^Q©TpssÓ«sûwODD„…Ò¶~¿Q]Ó§O‡­­-àæÍ›˜4i’…™†›x‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¨U-X°¾¾¾ˆ…ˆX:Q³DEEADié(DfUVV†Þ½{ß‘›CÛº‡~"¢;erúôé(..Ö«…‹/ÂÓÓ¿ýö>þøcKD5YSÖ¿_‰¨®É“'£ººðÀ oß¾NDDDDDDdnâ%""""""""""""""¢Vegg‡Í›7ãË/¿Ä{ï½gé8DDDpvvÆÐ¡C-£MhµZhµZKG¹k-[¶ ;vÄæÍ›ñÅ_\×h4Ðh4¸çž{,N™†Öß?"2EÏž=˜1c†…Ó™ÎÆÒˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆèî3`À$&&â¹çžÃ¨Q£Ð£GKG"""¢:\\\pþüyKǸ«uìØK—.Ell,âââðÝwßÁÖÖžžŽŸ~ú Û¶m³pJÓp=µžñãÇ[:Q‹ÑjµP©T8|ø0233-‡¨E <‰‰‰–ŽADDDDfÄ“x‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈ"þñ [·n˜5kDÄÒqˆˆˆˆÚœY³faÈ!8}ú4V¬X¨¨¨À¼yó°fÍݦ^¢Z»víÂÅ‹-ƒ¨EtïÞ;w†Z­¶t¢‘••Å êDDDDw"!"""""""""""""""²ÌÌL±¶¶–÷ßßÒQˆè@RSS[¬ýÈÈH ¿þú«L˜0A\]]ÅÃÃCF-çÎÓ«[UU%Û·o—#Fˆ§§§888È_þòY¹r¥ÔÔÔˆˆÈµk×€Þgñâźûë–ÿýï×µŸŸ/óæÍ“{î¹Glmm¥S§N2vìXùî»ïL‡)ÙL™‡ÚÏ!Ct×>ýôS }ô‘®,!!A¯~UUU‹ÎÏí–-[fб¶¶Ö«WPP Ï<óŒÜwß}bkk+nnn.‡n‘y­ÛŸøøøHHHˆlذAnܸ¡«wæÌ‰ŒŒ”:ˆZ­–   Ù»w¯„„„èÆòÄOÈâÅ‹>“ýû÷ëÊ;vì¨+ß½{·Þ|”——-?{ö¬Œ?^<<|¸8;;‹Z­–àà`ÉÈÈ0¸OIŸ¦Ô5u¼òâ‹/Jß¾}E­V‹»»»DDDÈž={¤ºººÑñ6æûï¿qrr’ßÿ]^|ñE™>}ºA=S֩ҵИ¦Ìcíz2õýSòýÚÔL ­eskéßG-Ý>‘¥ýðÖŽ@ÔbÆ'ãÆ³t """"2¯<‰—ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ,æá‡F||<žyæžFDwFFƒK—.açÎøòË/1yòd½:ééé˜4i†Ž3gÎàÂ… ˜3g±`Á€››Dááá°²²Â¹sç””°±±ˆ`ðàÁضmvíÚÈÍÍEPPvìØ5kÖ ¨¨Ÿ}öŠŠŠ0xð`“Nõ2%[CÒÒÒ°zõjÀÖ­[‘‘‘¡»¶eË]y­•+Wb÷îÝ ˆÀÆÆFÑü„……58?[·nÕÍ1óçχˆÀÉÉ C† ˆ@DP]]­«“——‡   lÛ¶ )))(((À×_ GGG„„„`ýúõf×Úþ>üðC]'Nœ@pp0üq¼ûsçÎaðàÁ8~ü8víÚ…üü|lذ)))øþûïaooÁúõë‘””¤g]áááê•GEEADÙ`ùܹs‡ . ++ ÖÖÖš¿kŸ‹¿¿?Š‹‹‘€%K– //_|ñŠŠŠ0|øp|þùçº{”ôij]SÇûôÓOã­·ÞÂÛo¿ÂÂBœ9sýúõCdd$¾üòËÇj ???h4\¿~S§Nźuë°lÙ2½:¦®S¥k¡!MÇZ¦¼u™òýjîgKDmÏ_þòKG """""R¦5· ÝîúõëÒ»wo=z´¥£Ñ ­tïÞ½{õʧL™bp¢ãÞ½{%88Ø iÓ¦‰­­­”””èÊjO¯‹‹Ó«›‘‘!=zôªª*]ÙŒ3€lݺU¯nnn®ØÛÛK```£ãP’­>………bgg'ááẲ7nˆ»»»ôêÕKÔjµüù矺kcÇŽ•M›65)Ãê¹yóf£yEDœœœôN%­kæÌ™@>üðC½òŠŠ éÚµ«¨ÕjÉËËk°}%cªíÏØz —+VˆˆÈøñã€ìÚµK¯N~~¾8::н½½Éã 4zújíº®=9õöòO>ùÄèxͱEDüýý€ÁIºßÿ½ÿ&õ©4_cãõõõ•¿þõ¯å}úô‘#GŽ˜4ÖÆ”••I÷îÝ€¬ZµÊàºÒuªt-ÓÔy¼}=5ôþսϔïWs?Û–ÐÒ¿Zº}""j9<‰—ˆˆˆèŽÄ“x‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈ²±qãFìß¿_ïtF"¢ö(((HïgÀåË—ue8räˆÁ½þþþ¨ªªÂéÓ§ue!!!0`6n܈ÂÂB]ù²eË Ñh`cc£+KKKƒ••"""ôÚõòòBÿþýqâĉFO=W’­>xì±ÇpðàAäååöìÙƒ‡zO=õÊËËñïÿt§dFGG7)Chh(üüüŒÎϼyó`kkÛhÞÆìÞ½0zôh½r{{{„„„ ¼¼h° %cªíoÔ¨Qõ÷ïßFàÖ龦W§sçÎèׯ_cÃ2‹|Ðh¹9Öb-'''è•ùùù¡k×®8uêrss÷ÙÔ|õ7<<_}õæÌ™ƒ¬¬,ÔÔÔ²³³lÒ8ãää„¿ýíon­›Û™c*eÎçl S¾_Íýl‰ˆˆˆˆˆˆˆš‹›x‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆÈâþú׿âÉ'ŸDBB‚nÃQ{äêêª÷³•Õ­?ÑÒjµº²’’¼ôÒKðó󃻻;T*T*ž}öYÀ7ôÚø¯ÿú/ܸqkÖ¬äääà‹/¾@ll¬®Nee%JJJ Õjáêêªk³öóí·ß~þùçó+ÍVŸéÓ§£¦¦Û¶m|ðÁ˜>}:&Ož kkkÝ?Úðá‡"""ÎÎÎMΠÑh æçðáØ3gŽIYR;¯pqq1¸îéé þî2uLõW7Wii)ôæ®–»»»Écl'''ƒ2s­ÅZnnnFË»téÈÏÏWÔgsò/¬^½›7oÆ/¿ü‚tèÐááẵ-Í\ë´)}šë9›¢±ï×–x¶DDDDDDDDÍÅM¼DDDDDDDDDDDDDDDÔ&,]º®®®fÙtEDÔ–3‹/ÆìÙ³‘““­V ÁŠ+"¢WâĉèÞ½;V­Z…ÊÊJ,_¾³gÏÖÛ¬goo777ØØØ ªª "bôó裚5[}F |ðÁ¸zõ*²²²OOO„††âðáÃÈÍÍŦM›0}úôfe˜:u*<==õægÆŒŠ6²ªT*£åöööpuuEEEJKK ®_¹rÀ­S>bê˜ë¯n.TTT ¬¬Ìàz~~¾Ñû¬¬¬póæMƒòâââó+a®µX«°°Ð身c—.]õiî|À­õƒO?ýÅÅÅHKKƒˆ ::o¾ù¦Éí4USÖisׂ9ç±¾÷O©–x¶wgggƒ ÏVVVpww‡¿¿?âââpâÄ KÇ$pë´íºkµ¢¢ÂÒ‘ê5tèPƒw«ö£ÑhLj£9ï§±{“““õêtëÖÍ NRRêÍnì³dÉ’fÏ—¹lß¾]—ËÁÁ¡ÅûËÍÍÅ?ÿùO 4:t€——yä‘Vû‡<ˆˆˆˆ¨}à&^"""""""""""""""jœ±yóf|òÉ'xÿý÷-‡ˆ¨EÔÔÔàèÑ£ðòòB||<:wî¬ÛÀV^^nô$$$ ??Ë—/ÇöíÛoP/::ÕÕÕ8zô¨Áµ¥K—¢G¨®®6k¶úØÙÙaâĉ8yò$^xáDFFB­VbbbPSSƒ—_~¹¹¹>|x³2ØÛÛ#..N7?[·nEBB‚¢¼ŽŽŽzûöí‹÷Þ{0vìXÀ¾}ûô¬Ä¡C‡ V«VoÛJÇTÛß'Ÿ|bpmÀ€xæ™g£F¤§§ëÕÉËËCNNŽÑ,ÞÞÞ¸té’Aý?þø£ÞüMÑܵXWEEŽ;¦WöÃ?àòåËð÷÷‡···â>Í™¸uZðÙ³g¶¶¶9r¤n£Ùí릥(]§æX æšÇ†Þ?¥Ìýlïeeeøî»ï‘‘‘TUUáìÙ³xõÕWqöìY 4?þ¸É§±µ”¨¨(ˆ"##-¥U4çý4vïüùóõê\¼x¿þú+`È!݆Ü;wêýsçÎìß¿_¯|âĉ-:JMš4 "‚VéoöìÙX¹r%þñ 77YYYèÖ­¢££ñüóÏ·J""""jû¸‰—ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÚŒ!C†@£Ñ !!çÏŸ·t""³³¶¶Fpp0òòò°lÙ2 ¼¼GŽÁÚµkë½oΜ9puuERR¢¢¢àããcPçõ×_GÏž=1kÖ,ìß¿%%%(**»ヒW_}ÉÉɰ±±1{¶úÄÄÄÖ­[§wÚnTT\\\°nÝ:L:VVÿÿglM͵Z¤¤$Œ1½zõR”uàÀÈÉÉÁ… ™™‰_~ùÆ pk^}}}¡ÑhðñÇ£´´999˜2e rss‘’’OOÏzÛV:¦ÚþžyæìÛ·¥¥¥¸xñ"âââ››«ÛÄûÚk¯ÁÃÃDYY~üñG<þøãõž ŠË—/cÕªU(++Ãùóç‘€.]º(š¯Æ4w-ÖåêêŠE‹!33ׯ_ÇñãÇ1mÚ4ØÙÙ!%%¥I}š3_­'Ÿ|ßÿ=*++‘ŸŸ7Þx"¢·IýÚµkèÓ§|}}qùòeEí7Fé:5ÇZ0×<6ôþ5eÌýlïFÖÖÖðôôDdd$>Œçž{7nÄäÉ“M>‘¨9œ1tèPKÇh¶cÇŽ=|åÊ•Mn“ïgÛ“œœŒÑ£GÃÉÉ ÷Þ{/6lØ$''#??ßÒñˆˆˆˆ¨-"""""""""""""""¢6¤¢¢BüüüdèСRSScé8Dt‡ ©©©fo733Sè}^xá]Ÿu?£G‘«W¯Êܹs¥{÷îbkk+žžž2sæLyþùçuu úzöÙg€œ:uªÞ<………’˜˜(÷ÝwŸØÚÚJçÎ%44T½{÷–=zˆV«Õ+Ÿ9s¦Ó§O›-ÃìÙ³€|þùç&ç«uöìY6l˜899I÷îÝeõêÕz× D£Ñˆ¯¯¯ØÚÚŠ«««„……É¡C‡Lj_é˜nïÏÛÛ[&Mš$999zífggKTT”tèÐAå¯ý«|þùç"ööö9Š‹‹%66V¼½½E­VËСC娱c¨Ë±`ÁÙ½{·Áú:uªÑõ^ߟ!6w-Šˆøûû‹üôÓO&...¢V«å‘G‘ŒŒŒfõiJ]SÇ{òäI™;w®Üÿýâèè(òðÃ˺uëôÖ~aa¡ôìÙSzôè!—.]2yÞyç£9ªªªôê)Y§¦®…Ƙ2õ­§Zõ½Mù~55“’µln-õû¨9í÷Ýw@"##^×jµòÐC Ù¶m›9b5ÈÉÉI† RïõÈÈH ååå­˜J™!C†È±cÇšÝNsÞÏÆîùõ×_@ƒó-"2wî\ û÷ïW> ¨ï¿…ZËÈ‘#€|ñÅŠî7nœŒ7®…R‘…ìP‰ðŸÜ!""""""""""""""¢¶å»ï¾ÃÃ?Œ7Þx –ŽCDw•J…ÔÔTL˜0ÁÒQ¨…lذ«W¯ÆñãÇ-ÅâFŒŒŒ TTTX:J³   /^´t"³iéßGMiÿäÉ“0`"##‘––f´Î–-[ƒ¡C‡âË/¿4W\"£œ€ŒŒ £×£¢¢°gÏ”——ÃÁÁ¡•Ó™fèСX¹r% Ô¬všó~šrïo¿ý___ 2¤Þùn8ÿî»ïbÿþýoÖ˜Zƒ¥ÿ[¨W¯^8þ<~üñGôïßßäûÆعsgKE#"""¢Ö·ÓÊÒ ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆn7`À¼ð xþùçqúôiKÇ!"¢v`íÚµHLL´t "¢;ÒСCYYY¨ªªÒ•"11={ö„ÜÝÝ1jÔ(9r¤ÁöŠ‹‹¡R©ô>K–,TWWë•7NQK–,ÑÝ[›ÒÓÓuå:u2iÜ•••x饗Я_?8::ÂÃÃcÆŒÁG}„šš½ºW¯^E||<î½÷^ØÙÙ¡sçÎˆŽŽÆÉ“' ÚUR÷viiizóóûï¿câĉpqqAÇŽƒk×®á·ß~Ø1càââoooÌž=¥¥¥í™2§·÷™ & cÇŽº²‚‚‚f-99*• ׯ_ÇÑ£GumÛØØ­Ÿ——‡‰'ÂÍÍ ;vDDDΟ?¯W§ºº©©©9r$¼¼¼ V«áç燔”hµÚzÇøÛo¿5Úvc>øàÀÉÉ ®®®6l¶mÛ¦¨ SÔ÷~ZZSçTÉ÷ÊÙ³gWWW899aذa nF6u}*y÷o·iÓ&œ?}úôÁüǘ8[DDDDt'ã&^"""""""""""""""j“-Z„xÓ§OoSˆLDDmÃúõë1vìX”••aíÚµ¸víOZ&"j!^^^nmˆ¬Ý¬™——‡   lÛ¶ )))(((À×_ GGG„„„`ýúõõ¶çææAXX¬¬¬pîÜ9$%%lll "ÃÃÃ!" 4yÜO?ý4Þzë-¼ýöÛ(,,Ä™3gЯ_?DFFêxš››‹   ìØ±kÖ¬AQQ>ûì3aðàÁÈÌÌlR]c¢¢¢ "ˆŒŒ$&&â¹çžC^^V®\‰-[¶`êÔ©Ðh4X¼x1rssñÊ+¯`ýúõxùå—õÚ2uNoïsîܹˆ‹‹Ã… ••kkk³Œmþüùºg7dȈDÕÕÕFëk4h4\ºt ;wîÄ—_~‰É“'ëÕIOOǤI“0|øpœ9s.\Àœ9s˜˜ˆ Ô;¯uÛNMMÅáÇ Ún̵k×ðþûï#??ß|ó |}}1uêTÄÇÇ+j§1ÆÞϺöìÙc°i¾öãëëkÖ,u5eN•|¯œ;wƒÆñãDZk×.\¹rkÖ¬ÁâÅ‹nV²>M}÷ëúé§Ÿ€Y³fÁÝÝ[¶lJ¥2ÇTQ;ÇM¼DDDDDDDDDDDDDDDÔ&ÙØØ`Ó¦M8sæ –.]jé8DDÔ¥¥¥ÁÝÝï¼ó¶oß^ïI}w‹íÛ·C¥RáСC¨¬¬„J¥Bll¬¥c)V{ã©S§péÒ%¨T*Ýæ>"² 1([¸p!~ýõW¬\¹èСúôéƒmÛ¶ÁÛÛñññ¸råJƒí&&&B«ÕâÍ7ßÔ+?zô(þøãŒ?Þ¬ý)uèÐ!ôïß#GŽ„Z­†§§'–-[†>}úèÕ[¸p!~ÿýw¼ùæ›xì±ÇàììŒþýûcûöíÌ›7¯IuMñÄO 00NNNˆ‰‰Aÿþý±ÿ~$&&" ÎÎΘ;w.|}}ñÉ'ŸänÊœ.X°ÁÁÁpttÄC=„êêjtêÔÉìckLll, ''' >8vì˜ÁFÖàà`,\¸îîîèÔ©æÍ›‡)S¦ %%þùg£m1£G6Úv}222°yóf 8NNNèÛ·/6oÞŒ|o¿ý6¾þúëf¿–±÷³®ÈÈH݆èÛ?¿þú«Ùr4Æ”9U²&-Z„ââb¤¤¤`äÈ‘pvv†ŸŸ6lØ€ÜÜ\ƒþ•¬OSßýºxàìܹO?ý4~üñG™qöˆˆˆˆ¨=ã&^"""""""""""""""j³úõë‡þóŸX¼x1¾ýö[KÇ!"¢6$66"‚ªª*œ:u ´t$‹›4i’Á朆NÂl«jOb¬ûY²d‰¥cÝÕj7ÄÙÚÚ¢S§N€Ý»wF­W×ÞÞ!!!(//Çl744~~~ظq# uåË–-üyó`kk«+3GJ…‡‡ã«¯¾Âœ9s••…šš@vv6‚ƒƒuõÒÒÒ`ee…ˆˆ½û½¼¼Ð¿œ8q/^T\׃ Òû¹k×®FË}||pùòe½²¦Îéƒ>h4‹¹ÇÖ˜Û7Iúøø€Þ8#""päȃ{ýýýQUU…Ó§O›Ôv÷îÝ ÚnŠqãÆöîÝÛ¬vê2ö~¶E¦Ì©’5™žž Ó«ÛµkW£›m•¬OSßýÛ>|)))º÷ˆˆˆˆà&^"""""""""""""""jã0lØ0Lœ8eee–ŽCDDDDt×ÉÈÈ <¶¶¶¨¬¬DII àââbPßÓÓ——×hÛ7nÜÀš5Ä„E IDATk9998|ø0æÌ™£«cÎþ”X½z56oÞŒ_~ù!!!èСÂÃÃu ëfÓjµpuu…J¥ÒûÔþcD?ÿü³¢º¦êСƒÞÏVVV°¶¶†£££^¹µµ5´Z­Aî¦Ì©“““AYKŒ­1®®®z?[YÝúÓøºã,))ÁK/½???¸»»ëò<ûì³€7n˜Ô¶AÛMáíí ÈÏÏoV;uÝþ~¶UÍ©’5YYY‰ÒÒR888ÀÙÙÙ n—.]ô~Vº>My÷‰ˆˆˆˆLÅM¼DDDDDDDDDDDDDDDÔ¦YYYaÓ¦M¸víž{î9KÇ!"j3¶oß®Ûxààà`é8Ô¤¥¥émH©¨¨°t¤6'99Y7?ݺu³tjGîæï\­V‹Õ«Wžzê)·NÅtuuEEEJKK î¹rå €['\6fêÔ©ðôôĪU«PYY‰åË—cÆŒpww×ÕiJVVV¸yó¦AÝâââF3ÕR©Tˆ‰‰Á§Ÿ~Šââb¤¥¥AD7ß|S—ÍÍÍ 666¨ªª28I¼öóè£*ªÛÒÌù kÛ3רT*•²Á4`̘1X¼x1fÏžœœhµZˆV¬X³õeŠÚSgoßdÚTÆÞÏöJÉš´··‡‹‹ ***Œþc_EEEm+YŸ¦¼ûDDDDD¦â&^"""""""""""""""jó|||ðÞ{ïaíÚµøè£,‡ˆ¨M˜4iD!!!–ŽB- ¬¬ ½{÷FDD„É÷DEEADÙ‚ÉÚ·ùóçCDàïïoé(ÔÎÜÍß¹ .Ä7ß|ƒ±cÇbüøñºò±cÇöíÛ§W¿²²‡‚Z­FXXX£íÛÛÛ#..ùùùX¾|9¶nÝŠ„„ƒzJûóööÆ¥K—ôêæååá?þh4S-777œ={`kk‹‘#GêþÁ„º9¢££Q]]£G´±téRôèÑÕÕÕŠë¶4s=ÃZ曣££Þì¾}ûâ½÷Þ39G­šš=z^^^ˆGçÎu„ËËË·gªõë×#00Р\D°cÇ·6›C}ïg{¥dMŽ5 žž®W·  ÙÙÙm+YŸ¦¾ûuUWW£_¿~J†KDDDDw nâ%""""""""""""""¢v!::Ó§OGll,òòò,‡ˆè®æì쌡C‡Z:F«±ÄxEZ­Z­¶Mäiªö”•ˆnÑjµÈÏÏÇž={‚7Þx³fÍÂÖ­[õNH}ýõ×áëë Fƒ?þ¥¥¥ÈÉÉÁ”)S››‹””xzzšÔg\\Ôj5’’’0bÄôêÕË ŽÒþBCCqùòe¬Zµ eee8þ<Ÿ€úä“Oâûï¿Gee%òóóñÆo@D0|øp½l={öĬY³°ÿ~””” ¨¨ï¾û.^}õU$''ÃÆÆFqÝ–fÎgXÛž9Æ6pà@äääàÂ… ÈÌÌÄ/¿ü‚aÆ)Ÿµµ5‚ƒƒ‘——‡eË–¡  ååå8räÖ®]«¸=%¾ýö[<õÔS8wî***˜˜œ8qóæÍÃC=Ô¤vM}?Û+%kòµ×^ƒ‡‡4 <ˆ²²2üôÓO˜6mœ¶­d}šòî×Z·nœœœðÜsϵÜäQ»ÅM¼DDDDDDDDDDDDDDDÔn¬Zµ nnn˜9s&DÄÒqˆˆˆZŒ‹‹ Ο?O>ùÄÒQˆèæììŒöìÙ•JôéÓ/¾ø"úöí‹'Nà¿ÿû¿¡V«õîõòò±cÇ0yòdÄÇÇ£cÇŽxðÁqýúu|ú駘={¶É9:uê„iÓ¦AD˜˜h´ŽÒþ–,Y‚ØØX¼öÚkèÒ¥ fΜ‰gŸ}^^^(,,„J¥ÂóÏ?ß`®Ï?ÿýúõäI“àááûï¿éééX·n-Z¤«×¥K|óÍ7ˆŠŠÂÓO?Î;£_¿~ø÷¿ÿ={ö`„ MªkLVVT*öìÙºÍÏLJJ¥ÂPSS•J…ýë_ÈÈÈ€J¥Â矎ëׯC¥Rá•W^Q4§Æú4¶a´¹c«µråJ<ðÀ¸ÿþû1qâD¤¤¤àþûï¯wì R©°téRÀ€t'Ù§¦¦bîܹxûí·ÑµkWøúúbóæÍ˜2e `äÈ‘4hP“Ú®OLL vî܉ÜÜ\„‡‡ÃÍÍ =ô.]º„mÛ¶á­·Þ2išó~»799Y¯N·nÝàëë 8zô(T*•n̵6nÜ•J…wß}À­ÓoU*ÊÊÊÍß”9Uòž÷ìÙ™™™ ¸qãtïù¼yóàçç‡ÊÊJ¨T*ÄÆÆP¶>M}÷kiµZˆÿ """"2J%ü/E"""""""""""""""jGŽ;†!C†`ÅŠxê©§,‡ˆÚ •J…ÔÔT“7´'#FŒ@FF***Z­Oggg ##£Õú´¤¶6ÞÆòDEEaÏž=(//‡ƒƒC+§Ó×Öæ®V@@ pñâEKG¡v¦¹ß¹-ýû¨=ÿ¾Û°aV¯^ãÇ[: ‘EŒ?°sçN '!""""3ÚÉ“x‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆ¨] ¢E‹0þ|üðÖŽCDw°´´4¨T*Ýç·ß~Ãĉáææ†Ž;"""çÏŸ7¸ïêÕ«ˆÇ½÷Þ ;;;tîÜÑÑÑ8yòd³êž={QQQpuu…““† ¦xcduu5RSS1räHxyyA­VÃÏÏ)))ÐjµÞŸœœ •J…ëׯëNl«=®®ÂÂB$&&¢gÏž°³³ƒ»»;F…#GŽèêÜ>¿ÙÙÙ˜0a:vì¨+[¿~}£u LžK¥ÏÔÔñÞ.**J¯Ÿ¡C‡ê®:t*• {÷îÕ•i4½ú»víÒû¹v³ ÒæzoŒõS\\l0¾%K–¸õ¬ë–7NQ¦%K–]ëéééºòN:58vcc»¾sI™µk×Ö{ /Q»%DDDDDDDDDDDDDDDDíLUU• cZc­ÔÍZß³U’£víyyyÉÞ½{åÏ?ÿ”¼¼úè#KÇ!¢»@PPÞÏÝ»w\¾|YW–––+++DDDèÕõòòBÿþýqâÄ \¼xQqÝôôt@XX˜^Ý®]»¢OŸ>&!""GŽ1(÷÷÷GUUNŸ>mr[õÙ½{7`ôèÑzåööö Ayy98`p߃>ØhÛõÕQ2—u™òL›ÊÃÃ=ö<ˆ¼¼<Àž={ðÐCá©§žByy9þýŠðÙgŸ!::ºÙýÖuûø|||˜6¾ÖX+uÕ÷l•ä¨]{£F2¨¿ÿ~h4ƒòììl<ôÐC°²²ÂÊ•+amm­w½©kË”õ\WK¾7u…††ÂÏÏ7nDaa¡®|Ù²e˜7olmm›É\î„ï\jXll,DUUU8uêhéHDDDDDDDfÇM¼DDDDDDDDDDDDDDDÔnM˜0111xâ‰'̲ኈ¨!®®®z?ÛÙÙ´Z- ²²%%%Ðjµpuu…J¥Òû|ûí·€ŸþYqÝÒÒR888ÀÙÙÙ W—.]LCII ^zé%øùùÁÝÝ]×ß³Ï> ¸qã†ò‰©£v\pqq1¸îéé ºM­u9995Ú¾±:Jæòv=Óæš>}:jjj°mÛ6À|€éÓ§còäɰ¶¶ÆÖ­[~ø!"""Œ>ßæ¸}|VV·þdДñµôZ¹]}ÏßÔ­=c®]»†¨¨(tëÖ û÷ïÇ–-[ô®7gm™²žoï§¥Þ›Ûi4ܸqkÖ¬äääàðáØ3gŽY2™ËðKDDDDDDDÄM¼DDDDDDDDDDDDDDDÔ®­Y³:u”)SPSScé8Dt³··‡››lllPUU1úyôÑG×uqqAEEÊÊÊ ú-**29ã˜1c°xñbÌž=999Ðjµ¬X± "&µ£R©êWWWTTT ´´Ôàú•+WÜ:ùÒ\”ÌeSÕ7ÞÆŒ=øàƒpõêUdee!** žžž ÅáÇ‘››‹M›6aúôé-žG‰–^+æÎÑØÚ3ÆÆÆŸ~ú)öìÙ???Ìž=ÇŽÓ]oµeJvs¿7S§N…§§'V­Z…ÊÊJ,_¾3fÌ€»»{³2YYYáæÍ›u‹‹‹Í’ûvíá;—ZÖï¿ÿŽÿüÏÿÄŸþié(t—Ù¾}»îpppЕ§¥¥éýLÙrêKyþù瑚šÚâýµnâ%""""""""""""""¢vÍÉÉ ;vìÀ×_×_ÝÒqˆè.êêj=zÔàÚÒ¥KÑ£GTWW+®;jÔ(@zzº^½‚‚dgg›”­¦¦G…——âããѹsgÝËòòrÓ ÀÑÑQo³^ß¾}ñÞ{ïÆŽ Ø·oŸÞ=•••8tèÔj5ÂÂÂõ×%sÙ ·!vvv˜8q"Nž<‰^x‘‘‘P«Õ€˜˜ÔÔÔàå—_Fnn.†ÞâyLÕZkÅÜ9j×Þ'Ÿ|bpmÀ€xæ™gôÊ\\\àããggg|ôÑGpvvFTTrssuuZzmÝž½5Þ{{{ÄÅÅ!??Ë—/ÇÖ­[‘ÐìLÞÞÞ¸té’^ݼ¼<üñÇfÉmL[þÎ¥–uòäI 4¡¡¡èСƒ¥ã˜¬¬¬ ½{÷FDD„¥£P3Lš4 "‚½ò¨¨(ˆ"##-”¬uÔ7þ–2{öl,\¸/¾øb«ôGDDDDdnÜÄKDDDDDDDDDDDDDDD힟Ÿþõ¯áÿø‡ÑDD­åõ×_GÏž=1kÖ,ìß¿%%%(**»ヒW_}ÉÉɰ±±Q\÷µ×^ƒ‡‡4 <ˆ²²2üôÓO˜6mœMÊfmmàà`äååaÙ²e(((@yy9Ž9‚µk×*çÀ‘““ƒ . 33¿üò † ¦—¯¯/4 >þøc”––"''S¦LAnn.RRRàé驨¿Æ(™Ë¦hh¼‰‰‰¬[·Nï´Ý¨¨(¸¸¸`ݺu˜:u*¬¬Lÿs¾æä1Ek­sç¨]{Ï<ó öíÛ‡ÒÒR\¼xqqqÈÍÍ5ØÄ[×½÷Þ‹]»váêÕ«ˆŽŽFee¥®Í–\[·go­÷&..jµIII1bzõêÕìL¡¡¡¸|ù2V­Z…²²2œ? èÒ¥‹ÙrËØV¿s©åüùçŸ3f þþ÷¿ãé§Ÿ¶tEDZ­Z­ÖÒQšÌÙÙC‡msmµgœ‡†õìÙ»wïÆ?ÿùOìØ±ÃÒqˆˆˆˆˆ”"""""""""""""""¢;€V«•ÈÈHéÖ­›X:µ1$55UÑ=™™™@ïó /èÚ«û=z´î¾ÂÂBILL”ûî»Olmm¥sçÎ*4èCIÝììl‰ŠŠ’:ˆZ­–   ùøã%$$D—ã‰'žhpLW¯^•¹sçJ÷îÝÅÖÖV<==eæÌ™òüóÏëÚ ltnΞ=+Æ '''éÞ½»¬^½ZïzAAh4ñõõ[[[quu•°°09tèPƒó{ûŸ´™RGÉ\6õ™66ÞÆôîÝ[zôè!Z­V¯|æÌ™@NŸ>­W¾{÷nƒºÓ߉¼½½Ñ«W/dddX:Î]ÉÙÙf™s¶e #FŒ@FF***ôÊ£¢¢°gÏ”——ÃÁÁ¡ÑvÚë<Ô7þ–òá‡bÊ”)HKKCddd«ôÙÚÆعs§…“‘í´²t""""""""""""""""sqwwǦM›°gϬY³ÆÒqˆˆˆˆÚ¬µk×"11ÑÒ1ˆ9uê®\¹ƒk•••x饗Я_?8::ÂÃÃcÆŒÁG}„šš½ºW¯^E||<î½÷^ØÙÙ¡sçÎˆŽŽÆÉ“'›Ô¦)õÒÒÒ R©tŸÛ7>"11={ö„ÜÝÝ1jÔ(9rDWçö6~ûí7Lœ8nnnèØ±#"""pþüyÅójJþääd¨T*\¿~GÕe°±±ÑµS]]ÔÔTŒ9^^^P«ÕðóóCJJ ´Z­®^cm-Y²DW6tèPÝ}éééºòN:5éY5ÅÙ³gWWW899aذa&m¸ÍËËkðù˜2§iêš0e½5uüæ~¿j8`òüµÜÄKDDDDDDDDDDDDDDDw”àà`$%%!11ß~û­¥ãµ ë×¯ÇØ±cQVV†µk×âÚµkwìi­tçúñÇݺu3¸öôÓOã­·ÞÂÛo¿ÂÂBœ9sýúõCdd$¾üòK]½ÜÜ\aÇŽX³f ŠŠŠðÙgŸ¡¨¨ƒFff¦â6M©1z‚h^^‚‚‚°mÛ6¤¤¤   _ý5‚õë×mC£Ñ@£ÑàÒ¥KHMMÅáÇ1yòdÅójJþùóçCDàää„!C†@D "¨®®Öµ“žžŽI“&aøðá8sæ .\¸€9sæ 11 ,ÐÕk¬­¤¤$ÝõºÂÃÃ!" lÒj >;vDVVV£åçÎÃàÁƒqüøqìÚµ W®\Áš5k°xñâF7L×}>;wîÄ—_~©÷|L™ÓÆ4eM˜ºÞš2þ–x¿jùøøøÿï""""¢ö‚›x‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆèŽóÒK/áoû&L˜€’’KÇ!"""jÒÒÒàîîŽwÞyÛ·oWtÚ#Q[›› puu5¸vèÐ!ôïß#GŽ„Z­†§§'–-[†>}úèÕ[¸p!~ÿýw¼ùæ›xì±ÇàììŒþýûcûöíÌ›7Oq›¦Ö«ÏÂ… ñ믿båÊ•ˆˆˆ@‡ЧOlÛ¶ ÞÞވǕ+W î‹ÅàÁƒáää„#F`ôèÑ8vì Lê×\ùë ÆÂ… áîîŽN:aÞ¼y˜2e RRRðçŸ*nÏTJÆ Õjuf+_´hŠ‹‹‘’’‚‘#GÂÙÙ~~~ذaƒn=Ö§îó>|8"""šô|”0eM(YoJÇßïW­:@¥R5:ïDDDDDm 7ñÑÇÊÊ [¶lAyy9¦OŸnðÇÙDDDDw›ØØXˆªªªpêÔ) 8ÐÒ‘ˆ«¨¨ØÚÚ\ ÇW_}…9sæ ++ 555€ììlëꥥ¥ÁÊÊ z÷{yy¡ÿþ8qâ.^¼¨¨MSëÕg÷î݀ѣGë•ÛÛÛ#$$ååå8pà€Á}AAAz?wïÞpùòåFû¬«¹ùkEDDàÈ‘#åþþþ¨ªªÂéÓ§åRBÉêž ÛXyzz: ,,L¯n×®]Ýä|ûó©=IVéóQ”5¡d½)K¼_uÙØØ ¼¼¼þ """"jƒ¸‰—ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆîH]ºtÁ¶mÛ°oß>¼ýöÛ–ŽCDDDDDÍäàਪª2¸¶zõjlÞ¼¿üò BBBСC„‡‡ë6,@ee%JJJ Õjáêê •J¥÷ùöÛo?ÿü³Ém*©gLm&¸¸¸\÷ôôäåå\»ýDb;;;·N”U¢9ùë*))ÁK/½???¸»»ëæõÙgŸܸqCQ{J˜k uUVV¢´´pvv6¸Þ¥K—ï¿ýùXYÝúÓ}¥ÏG‰ÆÖ„’õ¦tü-õ~ÕU]] µZmêtµ ÜÄKDDDDDDDDDDDDDDDw¬Gy¯¼ò æÏŸÌÌLKÇ!¢vÄÙÙÙ`ã••ÜÝÝáï︸8œ8qÂä{“““õêtëÖÍ NRR Êú,Y²¤5¦Ã¨ääd]ŽnݺY,‡%({KÎÕöíÛum×nnk ¥koРAz?מŽÙÒønWß»ÞÓ´´´[kwÂüÜm¼½½ÜÚ,z;•J…˜˜|úé§(..FZZDÑÑÑxóÍ7Ü:iÔÍÍ 666¨ªª‚ˆý<úè£&·©¤ž1öööpuuEEEJKK ®_ù?öî<¾æ3ïÿøûd%‹l–Xo’Ö2j,¥µ¥–œ•Ô2¦T­­!2Š îÎŒš¢±…rWu--Ság©ªí„ZÒPËHgª˜ŠN-‰%©-"$ùþþèíÜX_I^ÏÇã<=×¹Îu½¯ïæžO®sç$ý²“iq)L~‹ÅrÏqÂÃÃõöÛokذa:~ü¸rsse†æÎ+I2 £ÀcI¿½Þ¼y3_û¥K—i åêê*OOOݸqC×®]Ë÷yzzúC{§‡¢T˜ë­°ë/®ûë¶+W®È0 ûs()(â¥ÚäÉ“¬¾}û*--Íì8Jˆk×®éÿø‡$©[·n2 C·nÝÒÑ£G5uêT=zTÍ›7׫¯¾šoW¹»}wܸqyúœ>}Z'Ož”$µiÓF†aØ‹þV­Z•§ÐaĈ’¤M›6åiˆˆ(Öcð ãÆ“ajܸ±©9ÌPصç±êÛ·¯ ÃPppð#U˜k¯{÷î2 Cݺu{äy ƒ{ó—u<ýôÓ ³·Ýë+ ÷iq^k¥áø”5Ï<óŒ¤_îÕ;y{{ëèÑ£’$ggg…„„Ø‹À7nÜhï׳gOegg+!!!ß3gÎT­Zµ”]¨1 Úï^zôè!Iùúfee)>>^åË—WhhèÇyX…Éïææ–§°¶^½zúàƒ”““£„„ùûû+22R•*U²§fffÞuÞ{u[ÕªUuæÌ™<ßIMMÕO?ýôHk(Œ.]ºH’6oÞœ§ýâÅ‹:vìØCûk:E­0×[a×_÷×m·¯…ÛÏ ¤ ˆ”jZ¾|¹,‹ ”o÷'((GGGU©REݺuÓöíÛ5aÂ}üñÇêׯßûlñððPÛ¶mÍŽ«’xo> Ã0”››«ÜÜ\³£<žKx7˜ÉŸ IDATVåÊ••””t×Ï_{í5}ûí·ÊÊÊÒùóçõî»ïÊ0 uìØÑÞgúôé ÔàÁƒµiÓ&]¾|YéééZ¼x±¦NªY³fÉÉÉ©Pc¦ßÝLŸ>]uêÔQTT”¾øâ ]½zUÇWÿþý•’’¢ØØXU©Rå!ZÁ4³fÍtüøq:uJ‰‰‰JNNVPPÕ¾}{¥¦¦*&&F/^Tff¦vìØ¡÷ßÿ®sÞk¬Û:uꤳgÏê½÷ÞÓµk×tâÄ 3F•+W~¤5tìØQ~~~Ú»wïÛßyçùúú***JÛ¶mÓµk×täȽüòËòðð(Ô1¾—‡¢V˜ë­°ë/®ûK’>,é—ë(I(⥞¯¯¯>ûì3mÙ²EsæÌ1;€RbÆŒzþùçõùçŸë³Ï>+’1>¬^½z¨ïgŸ}¦)S¦ɼ@iºöJû½ééé©'NèË/¿,¶9€'•ÅbÑСCµoß>={6Ïg;wîTýúõÕ·o_ùúúªAƒÚ¼y³–,Y¢É“'ÛûU®\Yß|óºwï®Q£F©R¥Jª_¿¾Ö¬Y£õë׫OŸ>…³ ýnï0º~ýzIRùòåõòË/K’üýýµÿ~õë×O‘‘‘òóóÓsÏ=§ŒŒ Ùl6 6L’´wïÞ|cÜ~ÞX,Íœ9S’Ô´iÓ<»u?HA×)IóæÍÓoû[5hÐ@ŠUƒ $I+W®Ôˆ#´`ÁU«VMuêÔѲeËÔ¿IRHHˆš7o^ ±$iÚ´i:t¨ÞyçU®\Yƒ Òøñãåïﯴ´4Y,Mœ8±ÐkÈÎζïžþ öÀÀ@%&&ªE‹êÕ«—=ÇèÑ£Õ¨Q#eeeٯˇ=?:÷ó0sôz+ìú¥â¹¿n[»v­ªW¯®®]»èØO §w(ùZ¶l©iÓ¦iÒ¤IzþùçÙÀ#³X,5j”öíÛ§E‹©_¿~fG îM ´›0a‚–.]ª©S§æÙáµqãÆ÷ÜñõN¾¾¾š={¶fÏž}ß~³ ýºwï~ßÝÁýüü4wî\Í;÷ž}Z¶lyÏ1eçñ»zõêi×®]wý¬bÅŠ÷gúôé…K’¼¼¼´dÉ’|íÈ×V˜5ÜkÎ{µ×­[Wk×®Í×~·bÒ‡9?:÷ó°×DA®·Û ³~©èï/IJJJÒêÕ«µbÅ 9;;è;À“‚x@™1~üx½ôÒKêÕ«W¾»àaÜþƒ{÷îÕ­[·LNófÍš%‹Å¢ŒŒ %$$Èb±Èb±ÈÉ)ï¾iii;v¬åââ"uéÒE;vì(ôœGU×®]ååå%777uèÐA ùú]¸pA‘‘‘ª]»¶\\\T©R%õìÙS‡.ð\ãöއ·_?þø£"""äíí-???………éĉyÆÍÎÎÖÊ•+"•/_^5Rll¬rssyí²ž_ÏÕ½{wyyyÉÝÝ]AAAÚ³gOç*.©©©<¾RÑœÿ‚xRïÍîÝ»ç¹.ýGEâããe±X´aÃ{[TTTžþ«W¯ÎóþÆEšïaî©`Ï’‚>—äq\k·³Z,Õ¨QCû÷ïWpp°<==êGÑòòòÒ† ´zõj-\¸Ðì8ŠYrr²zöì©I“&©oß¾fÇ "^PfX,}ôÑGòõõU¯^½tóæM³#(áüýý%ýRüyñâÅ|Ÿ¯_¿>OAܯ_uêÔ)¶\ãÆ“arwwW›6md† ÃPvv¶½OjjªZ´h¡+V(66V/^Ô¾}ûäææ¦àà`}øá‡žïÚµk9r¤&Ož¬3gÎh×®]JOOWÇŽµsçN{¿””µhÑBqqqZ´h‘ÒÓÓõÕW_)==]­ZµRbbâç*è·w<ìÖ­›¤_Š!£¢¢tæÌ­\¹RÛ·oÏ·CëæÍ›Õ·o_uìØQßÿ½N:¥áÇkìØ±ŠŽŽ~¤µ?êz$é‡~P«V­tàÀ­^½ZçÎÓ¢E‹ôöÛoßµˆñqúõñ]µj•vïÞïøÅù/¨'õÞ\·n½èpùòåy °?ýôS{ûmóæÍÓÚµk,Ã0Ô«W¯<×uQ{˜û¦ Ï’‚<— âq\k·³6nÜX—.]Ò˜1c4mÚ4¥¦¦úGñhÚ´©8 M›6éÊ•+fÇPŒ/^¬¿þõ¯úë_ÿjvà¡PÄ ÊOOOÅÅÅéÛo¿Õ¤I“ÌŽ „3 㾟wëÖÍ^¨vçëäÉ“)åÝMš4I'OžÔ¼yó¦ *¨nݺZ±b…ªV­ªÈÈH;w®@c]¾|Yï¼óŽÚ´i#5oÞ\Ÿ~ú©nÞ¼©1cÆä™ó?ÿùæÌ™£_|Qjذ¡>ûì3†¡Ñ£G(÷ÃŒ1tèPµjÕJîîî²Z­êÚµ«öïߟ¯À³}ûöš4i’|||T±bE=Zýû÷Wllì] Å ºö¢XÏäÉ“uéÒ%ÅÆÆ*$$DjÔ¨‘>úè#¥¤¤ÿüs]½zÕþÙ²eË4pàÀbÍt/¹oŠòYRØLãZËÈÈТE‹ìsöGñ©]»¶¾øâ U¨PÁì(O¬{ý±‚_¿þüç?›÷ÀùûÅÌ™3Ù%E¼ Ìyæ™g´dÉÍ;WqqqfÇP‚Ý.œtvvVÅŠMNS8k×®•$uíÚ5O»«««‚ƒƒ•™™©-[¶h¬råÊéùçŸÏÓÖ¨Q#U«VMIIIöã´nÝ:988(,,,O_5lØPÔéÓ§ï;×ÃŽÑ¢E‹<ïkÖ¬)I:{ö¬½-,,L;vìÈ÷ÝÆëÖ­[úî»ïò}VеÅz6oÞ,I ÍÓ·Zµjª[·î}ç)nwßêÕ«KÊ{|‹âüÔ“|oúúúêÅ_Ô¶mÛ”šš*é—ŸþyýáPff¦Ö¬Y#Iöd{öìiJÖ‚Ü7Eù,y˜LÅ}­¹»»«I“&yÚ sfº×+øõ«,–Tœ? t ˆ”IýúõÓÈ‘#5dÈ9rÄì8J¨={öH’Zµj%ggg“Ó\VV–._¾¬råÊÉÓÓ3ßçUªT‘${áƒøùùÉb±äk¯\¹²$éüùóö9sssååå•o'¹C‡I’þýï?0÷ÃŒáåå•罋‹‹$)77×Þvùòe½õÖ[jÔ¨‘|||ìãŽ?^’týúõ‡Z{Q¬'++KW¯^U¹råäááqÏùÌrçñupøå牷oQœÿÂxÒïÍ*''G+V¬$}òÉ'8p úõë'GGG-_¾\’ô÷¿ÿ]aaaw=çÃ~–ø@’Ô£GIÒÆó|'++Kñññ*_¾¼BCC 4ϵk×””””§íŸÿü§Îž=«Æ«jÕª’¤ž={*;;[ ùƘ9s¦jÕª¥ìììûÎUcÜMNNŽäïï¯ÈÈHUªTÉ^l˜™™yÏïtíE±ž.]ºH’6oÞœ§ßÅ‹uìØ±/ÒdÅuîîTîMEDDèðáÃzóÍ7Õ­[7•/_^’4`ÀåääèOú“RRRÔ±cG“ÓÞ_aŸ%÷{.•¢¼Önܸ¡ýû÷çi+Ì=Ê6Šx@™VµjU}úé§Ú°aƒæÌ™cvO°ÜÜ\?^ëׯWpp°Þ}÷] Ô=Ê8Æ»ï¾k8::[·n5; €b ÉX¹reû»»»’ò¼,‹áååe4jÔÈxýõ׃ø»111yúT¯^=_Ÿ7ß|3OŸ>ú(_IÆÕ«W ¼Ž£GAAA†»»»Q³fMcáÂ…y>¿xñ¢eÔ©SÇpvv6¼¼¼ŒÐÐP#>>þcÇÄÄØ3U¯^Ýøæ›oŒ:FùòåvíÚ{öìÉ÷½´´4cìØ±F@@€áììlTªTÉèÔ©“±mÛ¶¯« c$&&ÞóßÙÞµkWÃ0 ãÂ… ƈ#Œš5kÎÎÎF•*UŒAƒ'N´÷}öÙg ½ö_÷¿Ûù.Ì19vì˜Ñ½{w£B… Fùòå-Z_|ñ…l{È!öqZµjgΜ)ðñ-ȵ÷0Ç·°k½›ÒroÞöôÓOµjÕ2rssó´4Èd|÷ÝwyÚ×®]›oÞßÿþ÷÷¼ÆtíÝéaÏkaž%z.U¦‚\k:>76ªW¯n9rÄ 5<==ïû|+ˆÂþ{ô¤(>½zõ2zõêev ­8‹aÆ}j|ÊŒÁƒkݺuúæ›oôÔSO™@²X,Z¹r¥úôécv@ ѤI]¼xQ§OŸ.²1‹ûߣ'y÷iÀƒõêÕK«V­2;ŠÎ*'³<)-Z¤ýë_ ×Þ½{åååev$ ÀV®\iv„2ãúõëúî»ïôí·ß*))IçΓ«««6l¨ÐÐP5iÒÄ숥Nbb¢æÍ›ÇuŽR­fÍšfG@£ˆà•+WNëÖ­S‹-ôÊ+¯hÍš5rpp0;P ì8_|rrrtøðaÙl6Ùl6íÚµK7oÞÔo~ó 4HV«UAAAruu5;j©6oÞ<®s% ÿ— àWªU«¦U«VióæÍš:uªÙqð˜Íš5K‹EIII:sæŒ,‹¦L™bv,˜ %%EË–-SŸ>}T©R%5oÞ\sçΕ,X 3gÎè»ï¾ÓŒ3dµZ)àäÃN¼whݺµÞÿ} 5jÔÐþýû,OOO¹¹¹©C‡JHH(Ô\~øaž>7nÜÐ¥K—ò´Y,M›6M’”§½W¯^öö•+W*$$Dþþþ*_¾¼5j¤ØØXåæææ[CFF†ìã89åÝ'äÂ… ŠŒŒTíÚµåââ¢J•*©gÏž:|øðÏUAç(ªóuç1¼ß9-ȺîœóÇTDD„¼½½åçç§°°°<;'d½YYYzë­·T¿~}¹¹¹É××WáááúüóÏ)Lî››«ƒjæÌ™ ‘¯¯¯BBB´jÕ*=ûì³úüóÏ•žž®mÛ¶)::ZÏ>û,¼€'E¼äàà +VÈÇÇG½{÷VVV–Ù‘ LëÞ½» ÃP·nÝ$I™™™2 C{÷î•$¥¦¦ªE‹Z±b…bccuñâEíÛ·Onnn Ö‡~x×qFŒ¡‘#GêÔ©SÚ»w¯ï™aܸq2 C7Ö¥K—4fÌM›6M©©©Úµk—ÒÓÓÕ±cGíܹ³ÀsÝÙG’¼½½e†:wî,ýðÚ2eŠ$ÉÉÉI†a¨U«VZ±b…V¯^-IÚ¼y³úöí«Ž;êûï¿×©S§4|øp;VÑÑÑùÖàîî®6mÚÈ0 †¡ììl{Ÿ””µhÑBqqqZ´h‘ÒÓÓõÕW_)==]­ZµRbbâ}ÏUAæ(ÊóUÐsZÐuÝ9^TT”¢¢¢tæÌ­\¹RÛ·oW¿~ý µÞQ£FiþüùZ°`ÒÒÒôý÷ß«~ýúêÖ­›vïÞ}ßã ”©©©Zµj•FŒ¡5j¨yóæš3gŽ|||4þ|>}Z'NœÐâÅ‹®råÊ™€|(â(„ *hÍš5:räˆFŒavÀ}Lš4I'OžÔ¼yó¦ *¨nݺZ±b…ªV­ªÈÈH;w.ß÷¢££Õ¾}{¹¹¹éùçŸWvv¶*V¬øÀù222´hÑ"µjÕJîîîjÞ¼¹>ýôSݼyScÆŒ¹ëw ;׸qã”››«9sæäiOHHЙ3gÔ»wï<íí۷פI“äã㣊+jôèÑêß¿¿bccuåÊ•®é¶I“&é?ÿùæÌ™£_|Qjذ¡>ûì3†¡Ñ£Gx¬ûÍQ\çë^}v]C‡µŸg«Õª®]»jÿþý÷ܱùnâããÕ°aC…„„¨|ùòªR¥ŠbbbT·nÝÂ8 ”¸~ýºl6›&Nœ¨æÍ›«Zµjzå•W”œœ¬1cÆèÀJMMU\\œ†®êÕ«›€¢ˆ êÕ«§O>ùDŸ|ò‰Þ{ï=³ãîaíÚµ’¤®]»æiwuuUpp°233µeË–|ß{î¹çj>www5iÒ$O[£FT­Z5%%%)%%å‘ç VÓ¦MõñÇ+--ÍÞ£¨¨(999ÙÛ´cÇŽ|c4nÜX·nÝÒwß}Wày×­['………åi÷÷÷WÆ uðàA>}ºPk¹Sqž¯{õyØuµhÑ"Ïûš5kJ’Ξ=ûÀ,·uîÜY_ýµ†®½{÷*''G’tìØ1µoß¾Àã%Unn®<¨™3g*$$D¾¾¾ ѪU«ôì³ÏjýúõJOO×¶mÛ­gŸ}V‹ÅìØ E¼!<<\Ó¦MÓÿøGmÚ´Éì8€;deeéòåË*W®œ<==ó}^¥JIRjjj¾ÏÜÝÝjNooï»¶W®\Y’tþüù"™ë7ÞÐõë×µhÑ"IÒñãǵk×. :4O¿Ë—/ë­·ÞR£Fäãã#‹Å"‹Å¢ñãÇKúe×Ë‚¸},sssåååeçöëСC’¤ÿûß…^Ës×ùº[ŸGY———Wž÷...’~)J,¨… jÙ²eJNNVpp°*T¨ Î;Û‹™Ò(%%E«V­Òˆ#T£F 5oÞ\sæÌ‘æÏŸ¯S§NéĉZ¼x±ÂÃÃU®\9³#ðH(âxH“&MÒàÁƒ¡o¿ýÖì8€_quu•———nܸ¡«W¯æûüܹs’~Ùqµ¨¤¥¥É0Œ|í·‹woó>ªˆˆÕ¬YSï½÷ž²²²4{öl 6,_ñkxx¸Þ~ûm 6LÇWnn® ÃÐܹs%)_Ö{ípéêê*ooo999éÖ­[2 㮯:<0ûýæxÜç«(×u/÷Û5Ôb±hÀ€²Ùlºté’Ö­['Ã0Ô³gOÍ™3ç¡çž$—.]Òš5k4räH=ýôÓªV­š ¤Ÿ~úIo¼ñ†’’’”ššª¸¸8 >\5jÔ0;2EŠ"^€GðÞ{ïé¹çžÓ‹/¾¨3gΘð+=zô$mܸ1O{VV–âããU¾|y…††Ù|7nÜÐþýûó´ýóŸÿÔÙ³gÕ¸qcU­ZµHæqrrÒ˜1ctþüyÍž=[Ÿ}ö™"##óôÉÉÉQBB‚üýý©J•*Ù J333ï:®›››nÞ¼i_¯^=}ðÁ’¤ž={*;;[ ù¾7sæLÕªUKÙÙÙÌ~¿9÷ù’Šn]÷r¿õz{{ëèÑ£’$ggg…„„hݺu²X,ùŽPRdggëàÁƒš9s¦BBBT¹reõîÝ[ß|ó~÷»ßiÛ¶mJKKÓ¦M›ôÆoè·¿ýí}‹Ý(é(âxÎÎΊ‹‹“‡‡‡ºu릌Œ ³#þ×ôéÓU§NEEEé‹/¾ÐÕ«Wuüøqõïß_)))ŠU•*UŠl>///Mž\^^^š2eŠºwï®êÕ«çùÜÑÑQíÛ·WjjªbbbtñâEeffjÇŽzÿý÷ï:f³fÍtüøq:uJ‰‰‰JNNVPP¤_Že`` ¬M›6éòåËJOO×âÅ‹5uêTÍš5KNNNÌý 9çù*ÊuÝËýÖ+I¯½öš¾ýö[eeeéüùóz÷Ýwe†:vìXË‹ääd}ðÁêÓ§*V¬¨æÍ›+66VU«VÕòåËuþüy8p@3fÌÕjU¹råÌŽ ÀcC/À#òõõÕ—_~©Ÿ~úITnn®Ù‘ L¸½kéúõë%IåË——ÅbÑÞ½{%IþþþÚ¿¿úõë§ÈÈHùùùé¹çžSFF†l6›† &IÚ»wï]Ç),-X°@ùË_TµjU½ð òññÑöíÛÕ®]»Ïu·u½üòËyúxzzjøðá2 Co¼ñÆ]ó¬\¹R#FŒÐ‚ T­Z5Õ©SGË–-Sÿþý%I!!!jÞ¼¹½ÿ¼yóôÛßþV 4PDD„bccÕ AIRåÊ•õÍ7ߨ{÷î5j”*Uª¤úõëkÍš5Z¿~½úôéS ct¿9Šò|ôœt]woÊ”)’$‹Å¢™3gJ’š6mª°°°­wçÎ&M#á IDATª_¿¾úöí+___5hÐ@›7oÖ’%K4yòäOÀ çϟתU«4bÄÕªUKzã7ôóÏ?kÒ¤I:pà€Îž=«eË–©wïÞòóó3;2¦±†a˜ 4سg¬V«¢¢¢4cÆ ³ãø‹Å¢•+W¸Ð(¬&MšèâÅ‹:}ú´ÙQ<ÁJâ¿Gׯ_××_-›Í&›Í¦C‡ÉÑÑQ7–Õj•ÕjU»víäììlvT”rqqqŠˆˆ?P‚¬r2;@iѶm[-]ºTýúõSíÚµõÚk¯™ (”œœ>|Ø^´»{÷neee) @V«UÑÑÑ U… ÌŽ À"^€"¡#GŽ(22RO=õ”¬V«Ù‘€ûJNN¶íÆÇÇ+==]UªTÑ /¼ ùóçëÅ_T5ÌŽ @‰C/@ûóŸÿ¬äädýîw¿SBB‚žyæ³#ŠÉ¬Y³4~üxû{‹Å¢7ß|SÓ¦M31Ü_ZZš¶oß.›Í¦mÛ¶éäÉ“rssSëÖ­5aÂY­V5kÖL‹Å쨔hñ1‹Å¢¿ýío ÕK/½¤½{÷ªråÊfǃqãÆiܸqfÇ€ûÊÎÎVRR’l6›6lØ ÄÄDY,5iÒD}úô‘ÕjUPP\]]ÍŽ @©B/@1pqqÑêÕ«ÕªU+………髯¾’›››Ù±PF$''Ëf³Éf³ióæÍºzõªdµZ5fÌY­Vùøø˜€R"^€bâçç§Ï?ÿ\­[·Ö Aƒ´råJY,³c JMMÕîÝ»e³Ù´qãF9sF+VT‡4kÖ,uêÔIµk×6;&e E¼Å¨~ýúZ·nBBBôç?ÿYùË_ÌŽ€R ##C‰‰‰öÝv:$WWWµmÛV£G–ÕjUÓ¦Måàà`vTÊ,ŠxŠÙ /¼ ÷ß_C† ÑSO=¥˜ %LNNŽ>l/Úݵk—nÞ¼©€€Y­VEGG«sçÎòôô4;*ø_ñ<¯¾úªŽ;¦!C†¨FêСƒÙ‘ð„KNN¶ínÛ¶M—.]’¿¿¿‚‚‚´`Á………©ZµjfÇ÷@/ÀcòÎ;ïè‡~PïÞ½µgÏÕ¯_ßìH@™¡ˆˆ³cpOgÏžU||¼ýuúôiyyy©C‡š6mšBBBT·n]³c€¢ˆà1qppÐ'Ÿ|"«Õª.]ºè믿VÕªUÍŽ” +W®4;’¤Ö­[ÛÿûòåËúꫯìE»GŽ‘‹‹‹Zµj¥áÇËjµªE‹rrâ'¿”DÃ0 ³C”%éééjÛ¶­µ{÷ny{{› Avv¶’’’d³Ùd³Ù´sçNݺuK²Z­²Z­ U… ÌŽ |¸:vì(???³£”jñ”B¡¡¡Z¾|¹úõë§råÊ)&&ÆìH %''Û‹v·mÛ¦K—.Éßß_AAAŠUhh¨þë¿þËì˜eŠƒÙPû¬,ËCÏçíí-Ã0*ýðÚ2eŠ$ÉÉÉI†a¨U«VZ¾|¹V¯^-IJIIQ‹-§E‹)==]_}õ•ÒÓÓÕªU+%&&ÚÇ5j”æÏŸ¯ (--Mßÿ½êׯ¯nݺi÷îÝv°”j†a¨[·n’¤¨¨(EEEéÌ™3Z¹r¥¶oß®~ýúå韚šª-ZhÅŠŠÕÅ‹µoß>¹¹¹)88X~ø¡ËPFX Ã0Ì€âõ·¿ýMÆ Ó;ï¼£‰'š<ÀÕ«Wµoß>Ùl6Ùl6:tHŽŽŽjܸ±¬V«¬V«^xṸ¸kŽ­[·*44T#GŽÔÂ… íí ŠˆˆÐÉ“'åìì,I4h–.]ªåË—«ÿþö¾©©©ª]»¶žyæ8p@’ ªU«*!!!Ï|õêÕÓâŋվ}ûb]€’'..N2 CÝ»w×úõëµaÃ………ÙûôîÝ[«W¯Ö… T±bEIÒ«¯¾ª?þXÿûßÕ·o_{߬¬,èçŸÖÉ“'U¥J•Ǿ&¥Þ*vâ(† ¢yóæiÒ¤Iš5k–ÙqÀ®_¿.›Í¦‰'ªyóæòööVçÎe³ÙdµZµ~ýz¥¥¥éÀš1c†¬Vk±ðJR§NÔ¨Q#}üñÇJKK³·ÇÄÄhôèÑö^IZ·nòÔI’¿¿¿6l¨ƒêôéÓ’¤Î;ë믿Öðáõwï^åääH’Ž;F/€kÑ¢Ež÷5kÖ”$={ÖÞ¶víZIR×®]óôuuuUpp°233µeË–bN  ¬r2;ÈÈHåääè7Þ»»»^ýu³#Pfegg+))ɾÓîîÝ»í»BZ­VEGG+88X¾¾¾fGUTT”† ¢E‹é¿ÿû¿uüøqmß¾]}ô‘½OVV–._¾,IòòòºçXÿþ÷¿U£F -\¸P­ZµÒÒ¥K,I Òˆ#Ô£Gâ]€RãÎçÍí?n››+éÿžMåÊ•“§§g¾ïßÞ}755µ˜“(«Ø‰  ùãÿ¨?ýéOúÃþ %K–˜€2#77WTll¬úôé#???5oÞ\±±±òññÑüùóõÓO?éĉZ¼x±z÷îýDðJÒïÿ{U©REï½÷ž²²²4{öl½òÊ+òññ±÷quu•···œœœtëÖ-†q×W‡$I‹E ÍfÓ¥K—´nÝ:†¡ž={jΜ9f-@)ãêê*///ݸqCW¯^Í÷ù¹sç$ý²c8Šxʘ?ýéOš]×®]Ӏ俿¦ððp³#P¢\¸páÿ³w§ÑQUéþÇ•y$Ä€€ 8`ÓÜ  €RÌÁD®AEQ" ÝÞksTW£ B‚Ý„©)@0‘YÀVºE!HB†ýáŸjB¦ª¤È áûY«^°Ï>û<û9û Ū­¯¾úJ)))JMMÕöíÛ¨¶mÛjðàÁ²ÛíêÚµ«|}}­µÊ®»î:=òÈ#š5k–ÆŽ[j믿^[¶lÑÿýßÿiôèÑ:tèêÖ­«;ï¼S‹/–ÝnwÖ]¿~½>üðC 4HT@@€n»í6Íš5KO<ñDuu ÀUèÒ?„¨ &hÒ¤IÅÊï¼óNõïß_Ë–-SÆ µuëVMš4IÏ=÷œ>¬   uìØQ‡ƒ?àŠ²cŒÕAÀÆ5Jýë_µhÑ"õë×ÏꨱÎ;§7ÊápÈáphÇŽ²ÙljÓ¦ìv»ìv»¢¢¢`u¨WÄìÙ³5}útmÛ¶ÍêP\ƒ’’’/~þà*²•x®a6›M3fÌPAAxà-_¾\Ý»w·:,j„‚‚íÚµË9iwÆ ºpႚ7o.»Ý®ñãÇ«gÏžª[·®Õ¡V‹™3g–¹ /Jb/À5Îf³iæÌ™ÊÊÊÒ}÷ݧ•+WªsçÎV‡@µ+,,ÔÎ;“vSRR”››ëœ´;tèPEGG«qãÆV‡Z->þøc-_¾\sçÎÕgŸ}¦ÌÌL=ôÐCV‡pÕ`/äíí­¹sç*>>^ýúõÓŠ+tÏ=÷XW”1Fÿüç?µvíZ­]»Vëׯ×Ù³guà 7(::Z~ø¡zôè¡o¼ÑêP-“œœ¬ððpýæ7¿Ñ‚ äãÃOO\e3Æ«ƒ@ÍŸŸ¯øøx}ùå—Z¶l™ºuëfuHxÔþýû«ì®]»VGŽQhh¨:tè »Ý.»Ý®¶mÛÊf³Y*àIIIŠ?pYÈŸC€“¯¯¯5hÐ ÅÄÄhéÒ¥êÞ½»ÕaPiéééúúë¯åp8´jÕ*ùäIÒ}÷ݧŋËn·[ Ö*,,ÔÎ;+ínذAgÏžU£F¥÷Þ{O}ûöUÓ¦M­(“xP¡‹ym6›î»ï>-Y²„‰¼Ù¿¿s¥]‡Ã¡ÌÌLEDDèÞ{ïÕ”)SÔ³gO5kÖÌê0·0‰.ñööÖìÙ³%ýgEÞž={Zàjté¤ÝuëÖéĉ U‡4~üxÙívµmÛV6›ÍêP€Jc/\vq"¯ÍfÓ€ô·¿ýMýû÷·:,@ —––¦””9­\¹R¿üò‹‚ƒƒÕ©S'7Nv»]wÞy§¼¼¼¬ð›1ÆX®.………zâ‰'´`Á}ñÅЉ‰±:$@ rüøq­_¿^‡C)))Ú½{·Õ¶m[EEEÉn·ëÞ{ŸŸÕ¡j ´´43¦XÙÉ“'µoß>uêÔ©XùM7ݤ)S¦TgxઅLâ@¥jøðáJJJÒ¢E‹Ô§O«CX$++K›7o–ÃáÃáзß~+///µiÓFv»]v»]QQQ °:TÀU¢Y³f:pà@…õ^zé%½öÚkW> pßB«#ÀÕÉÛÛ[³gÏ–———ââ┘˜¨ØØX«ÃTƒsçÎiãÆÎ•v7oÞ¬¢¢"µlÙRQQQ?~¼zõꥰ°0«C\¥† ¦×_]ùùùåÖ{øá‡«)"p+ñ JŒ1JHHÐôéÓ5{öl :ÔêVPP ]»v9WÚݰaƒ.\¸ æÍ›;WÚŽŽV½zõ¬PKìÙ³GwÜqG¹uZ¶l©ü±š"·±/ªÆf³éÝwß•üqåççkøðáV‡¨‚ÂÂBíܹÓ9i7%%E¹¹¹jÞ¼¹:wî¬÷ß_ýúõS“&M¬PKµlÙR¿ýíoõÃ?¨´u«|}}õè£Z¸ŽI¼¨2›Í¦·ÞzK×_½ž|òIeggë¹çž³:,€öïß»zõj>}Z 6T—.]4mÚ4õêÕK7ß|³Õa®!Æ ÓË/¿¬‚‚‚Û oATà:›)íÏ•ôÆo襗^Ò”)SôûßÿÞêpe¸tÒîÚµkuòäI5hÐ@:tPTT”ìv»Ú¶m+›Ífu¨€kÔ¡C‡tÓM7•X‰×f³©}ûöÚ²e‹E‘€K²/|¸¢¢¢ÔµkWùúúZ*e:th‰w1zðÁ-Š\g3Æ«ƒ@í4þ| 6L#FŒÐôéÓe³Ù¬ j­¬¬,mÞ¼Y‡C‡Cß~û­¼½½)»Ý.»Ý®.]ºÈßßßêPpÙ©S§¡‚‚I’———ºwï.‡ÃaqdP¡…¬Ä €+fðàÁòññÑ!CTPP ™3gÊËËËê° VÈÊÊÒúõëµvíZ­[·Nß}÷l6›Úµk§ž={êµ×^STT”‚‚‚¬€J«W¯ž¢££åp8TXX(é×ÕyàjÀ$^\Q>ø ‚‚‚ôÀ(;;[sæÌ‘?[wåäähûöíJMM•ÃáІ táÂ5oÞ\v»]/¿ü²ìv»ÂÃízä‘G´zõjI’···âââ,Ž\c3Æ«ƒ@í÷ÕW_iÀ€êÑ£‡’’’äïïouHP£åååiÓ¦MZ·nÖ®]«Í›7ëÂ… ºýöÛÕ£GuïÞ]ݺuSƒ ¬€+*++K 4P^^žâââ´hÑ"«CW,d/ªÍúõë5`ÀuëÖMIII °:$¨1 µsçN9¥¤¤hÆ :{ö¬5j¤¨¨(ÙívõîÝ[7Ýt“Õ¡Pízè!-\¸PûÛß4pà@«ÃW0‰ÕkÓ¦MêׯŸÚ´i£Å‹+44ÔêÀEEEúñÇ•šš*‡Ã¡Õ«WëôéÓŠˆˆÐ½÷Þ+»Ý.»Ý®æÍ›[*pÍJJJR||¼ÕaP#1 B }¬Ž×–Ž;*%%E½zõR÷îݵbÅ 5hÐÀê° Zìß¿_‡C‡Ck֬ѩS§Ô AuèÐA/¾ø¢ìv»Ú¶m+›Ífu¨.‘˜˜huÀ5¯  @óçÏ×СC­¸æmܸQï¾û®Õa\X‰–øùçŸÕ«W/ùúúêË/¿T“&M¬ <îâ¤Ý””­[·N‡VHHˆ:vìè\i÷Î;ï”———Õ¡(ÅÅ•xù¹-P3œ?^AAAV‡\óx>¸Œ•x`fÍšé믿VïÞ½¥Õ«WëÖ[oµ:,¨’´´4¥¤¤ÈáphÕªU:x𠂃ƒÕ©S'=Z;wV‡äëëku¨\u˜À àjÃ$^X¦aÆúꫯԿuéÒE+W®T›6m¬ \vìØ1mذÁ¹ÚîîÝ»¨¶mÛjРA²Ûíº÷Þ{åççgu¨ª“x`©ððp­^½Z÷ß¿ºwï®eË–©sçÎV‡¥ÊÈÈЦM›”šš*‡Ã¡o¿ýVÞÞÞŠŒŒÔ€4mÚ4EEE) ÀêPXŒI¼°\pp°–.]ª!C†¨W¯^úÛßþ¦>}ú”Z÷äÉ“ª_¿~5GàZ•­M›6ÉápÈáphÇŽ²ÙljÓ¦ìv»^yåuíÚUuêÔ±:T5Œ—Õ’äïï¯ÄÄD 4H±±±JJJ*QçÇÔoû[í߿߂\ Î;'‡Ã¡_|QQQQªW¯žzöì©… ª]»vZ°`222´mÛ6MžLâ@áíí­?þX£GÖÃ?¬Y³f9·>|XÑÑÑJOO×Ë/¿la”j“œœ¥¤¤è7ÞPÏž=‹MÚmÕª•æÍ›§'Nè§Ÿ~ÒG}¤|PáááV‡  Y¸p¡Œ1ÎÏÈ‘#%I+V¬(V¯¸¸8c[­1fggkÇŽ’¤ØØXc”ŸŸ¯={öèÕW_Õž={Ô¾}{=þøã:þ|…ûŽ7®XÇë矖$uîÜYÆç„\wòSQn½õVÅÄÄT=!5ĸqãdŒQdd¤åm_ÉXP1wó_¯‡Ú‚k  öñ±:àR6›Mo½õ–®¿þz9R™™™9r¤z÷î­'NH’’’’4nÜ8µoßÞâh\m ´k×.99¥¤¤(77WÍ›7WçÎõþûï«_¿~¬|ðööVDD„bcc«ñãÇëÍ7ßÔ©S§”œœ,›ÍfuˆÅcTTT¤¢¢"«CA ¢6mÚ(%%ÅêPª׃õ®µ1p-c/j¤ñãÇ+00P š9s¦>¬üü|I¿NIHHàÏ*TXX¨;w*%%E©©©Zµj•Ξ=«F)**JÓ¦MS¯^½tóÍ7[*€kÐÎ;]®»`Á‚+IÕMžûì³ç`æÌ™¥^•Íóž={çwß}·–-[&»ÝîlëÉ'Ÿ,7Ÿ—çÂßß_Mš4‘Ýn×'Ÿ|¢œœœRëU%gü±ËyuçZQ?*3æûì³jŽ €'œ9sFO<ñ„úôé£#GŽ”;)érû÷ïל9s4räHÝxãjÑ¢…~ÿûß+33S/¼ð‚¶mÛ¦cÇŽiéÒ¥?~¼Úµk'›Ív{ÖHHHPBB‚Ž9¢… ê믿ÖàÁƒ‹ÕIKKÓ]wÝ¥¤¤$͘1C§NÒW_}¥S§N©S§NÚ¸q£Çâiذ¡¤_'••6©pñâÅ%&¢]ü4kÖÌcq\...NÆÅÆÆ–Ø6zôh½÷Þ{zÿý÷uòäIýøãjÙ²¥bccõõ×_—Ûî¸qãdŒQdd¤NŸ>­1cÆhÒ¤IJOO׆ têÔ)õèÑCëׯ/5Ž‘#GjÔ¨Q:tè6mÚ$oooI¿Nξ뮻ôùçŸkÚ´i:qâ„6oÞ¬   EGGëã?.Kvv¶F¥—_~YGŽ)õø’´råJ 4H=zôÐ?þ¨C‡é©§žÒرc5~üøRûéjÛ—«[·®Œ1êÝ»·¼¼¼ôïÿ['N”$ùøøÈ£N:iÞ¼yúâ‹/Êlçò¼]:îµvíÚãÞÕ^<‡ÁÁÁêܹ³Œ12Æ”úG„.•œœ¬éÓ§K’æÍ›§””ç¶‹ßOæÍ›ç,{÷ÝwµhÑ"EGGË#—ctuÜ”fðàÁ;v¬zöì©S§NÉ£§Ÿ~ºÔë¡2yþ÷¿ÿ­N:iÛ¶múâ‹/tüøqÍž=[Ó¦MÓwß}'cJ³—º˜‹ùóç;s±}ûvuëÖM?þ¸>úè£bõ<‘3WóêÎ=Ô•~TfÌyêZ€5˜Ä €ç½÷ÞÓ믿.cL¹õŒ1zñÅ‹­¦ æ[µj•î¸ãÍ;×9qáË/¿,³~ZZš.\¨‘#GªY³fjÑ¢…~÷»ßiÿþý>|¸V¯^­S§NiõêÕÎI»^^ü<@í÷ä“OªS§N V=£­[·›@ûÒK/éàÁƒzûí·Õ¯_?…„„¨U«VZ°`Œ1zöÙg=OEïn±±±Îûþ域þÙcq¸cÍš5jÕª•zöì©ÀÀ@EDDhÊ”)ºí¶ÛÜjçܹsš1c†ó|´oß^Ÿ}ö™.\¸ 1cÆ”ºÏøñãÕ­[7©C‡*((Ðu×]§—^zI?ÿü³Þ}÷]ÅÄĨN:ºí¶Ûôù矫Q£Fzî¹çtìØ±bm9sF¯½öš:wî¬rß­[7½ôÒK ×u×]§gŸ}V?ü°¦M›¦³gÏ–ˆÓ¶K3vìXéí·ß.Vžššª_~ùE>ø`…m\êÒqo·ÛÕ¿ÿRǽ»9t× Aƒäçç§¹sç:Ërrr´xñbÝrË-Z²d‰²²²œÛæÌ™£aÆU9ƲÆÍåNŸ>­þýû«°°P+V¬Pxx¸[ýs%Ï/¿ü²NŸ>­iÓ¦©gÏžÎûË矮sçι|¬‹¹˜6mšbbbªˆˆMœ8Q}úô©–œ•w=ºzuµ•åék Õƒÿ¥@Ó¯_?=ÿüó ‘··w™“ñŒ1:~ü¸ÞÿýjŽ@eœ9sF#FŒPß¾}uìØ1åçç;·íÚµË9qèøñãÎI»­ZµÒ 7Ü ‡~XÛ·oW|||±I»ÿó?ÿ#»Ý.___«º–¹ë®»Šý»qãÆ’¤£G:Ë’““åå奘˜˜bu6l¨V­Ziûöí:|ø°GâIKK“$ùúú–:©°&êÓ§¾ùæ=õÔSÚ´i“ %I{÷îU·nÝ\n'88XmÚ´)VÖºukÝpà ڵk—37—ºûî»KmkÑ¢E’¤þýû+÷÷÷Wtt´rrr´jÕªbÛÔ¡C‡ £uëÖ•8fdd¤òóóõÃ?”ØæjÛeéÕ«—Z·n­O>ùD'Ožt–O™2EÏ>û¬ÛÏðËÇ}Ó¦M%÷•É¡»êÕ«§~ýúiõêÕJOO—ôëjÓ:tÐ3Ï<£œœýýï—$çê­¬rŒe›KíÝ»W:t———Þ}÷ÝrWë-‹+y^¹r¥$©wïÞÅê6hÐ@-[¶tùXsÑ·oßÛV¬X¡„„„bõ®DÎʪãÎ=ÔÕ~T–§¯%T&ñ Æ¹å–[ôöÛo+##Cýë_uûí·K’|||JÔ-,,Ô«¯¾ZìGÌjžU«V©eË–úôÓOeŒQQQQ±í………2dˆ~ó›ß(""BC† ÑîÝ»õßÿýßZ»v­²²²´mÛ6Mž}º$é™gž©r{ÕÅf³ièСr8:}ú´’““eŒÑÀõöÛo»ÜÎÉ“'eŒ)Q~q‚ëÅ ¯ñ÷÷WXX˜rss•••Ubû±cÇ$ýº è¥Îœ9Sj{—À€úóŸÿ¬#Fhß¾}***’1Fï¼óŽ$•ÚWÛ.Ï!C¡>ø@yyyzë­·ô裺<ÑÓ•Éai“”]ѿիWOsçÎUFF†6mÚ¤¸¸8EDD¨W¯^Z»v­ÒÒÒôé§ŸjذaUŠÑU>>>r8Z¼x±Z·n­#FhëÖ­•ê_yüýýªÜÜ\egg—ØîÊäî‹í”— WëU%gåÓÕ{¨«ý¸¨²c®:¯%x“xpUh×®>ûì38p@øÃT¯^=yyyÉÛÛ[ùùùš6mš~ùå«Ãp‰•+WêöÛo/sõÝK]¸pA×]w&Ož¬Þ½{»´b bTAARSSKl{ã7tã7ª   ÊÇy饗´eËÝÿýzðÁ«Ü^u©[·®öìÙ#IòõõUÏž=•œœ,›Í¦åË—»ÜNnnn‰‰’ÿüç?uôèQEFFªQ£F.·uÿý÷KR‰ãçååiÍš5 TïÞ½‹mËÎÎÖ®]»Ê=~aa¡RSSÕ°aC=÷ÜsjРs"aNNN™ñ¸ÒvEüýý5jÔ(?~\o½õ–æÍ›§1cÆT¸_e¹›Ã   ]¸pÁùïÛo¿]ùË_*<ŽŸŸŸâããµsçNM˜0A±±± ”$ :T………zå•W”––¦=zT)FW…††ªqãÆ Ñ’%K¢¸¸8¥¥¥¹ÝVEúöí+é×w¾K¥§§kß¾}.·s1ÿøÇ?Jl»óÎ;õüóÏ«ç霕Ç{¨«ý*?æªûZ@Õ1‰W•&MšhÒ¤I:zô¨>ýôSEFFJ’òóó5a‹£ I™™™6l˜úöí«ŒŒŒ2Wß½Ü?ü ÌÌÌ+\[^ýuµhÑBÇ׊+tæÌ:uJ}ô‘^}õUM:U>>>n·[TT¤ãÇkñâÅŠŽŽÖ›o¾©áÇkÞ¼y•^aÒ*O?ý´¾ûî;åååéøñãzóÍ7eŒ)1é²=üðÃJKKÓ´iÓQlŸàà`=Z›7o.óøÞÞÞêÖ­›ÒÓÓ5eÊ8qB999Z·nfΜYf<®´íŠQ£F)00P'N”Ýn×-·ÜâV^ÜánÛ¶m«}ûöéСCÚ¸q£öï߯.]º¸t¬¡C‡J’fÍšUlµÝ¸¸8…††jÖ¬Y2dˆ¼¼Šÿt¿2çÙ]7ß|³¾øâ eddhàÀÊËË«R{—{íµ×T¯^=%$$hõêÕÊÎÎÖ÷߯ÇÜ­q/æâùçŸ×òåË•••¥Ã‡kÔ¨QJKKsN~­Žœ•›«÷PWû!UmÌ•u-effê¶ÛnS³fÍtôèQæU`j I|øðáÃç*þØl6“œœlõãœT=?·={v©÷Ƭ¬,g7–Ø>aÂcLÉwáþýû;÷;yò¤;v¬iÞ¼¹ñõõ5 40½zõ2«W¯v)¶àààRïÙaaa¦uëÖæw¿ûÙ¾}»ËûN™2¥XÆ—Ù/wòS–E‹•ØoÈ!ÆcvîÜiFŽiî¸ãdêÕ«g:vìhfÍšeŠŠŠ\ÊOdd¤iܸ±Ù½{·éÝ»· 5¦k×®&%%ÅY¯´óWÖø:qâ„IHH0Íš53¾¾¾&,,ÌôîÝÛ¬Y³ÆYgÊ”)Î67nl¶lÙbºwïnBBBJ=¾1Æddd˜‘#Gš¦M›___a{ì1óâ‹/:Ûj×®Ûm_Z¿¬shŒ1#FŒ0’Ìúõë]ÊmYyseÜ»’ËöìÙcºtéb‚ƒƒMÓ¦MÍôéÓ]ŽÏcn½õVsã7–3=ö˜‘d~øá‡R÷s%FWÆÍüùóKlçwJÝ·´krÈ!•ÎóÞ½{M\\œ©S§Ž 2÷ÜsY¿~½éÖ­› r9‡—ç¢Q£FfРAfß¾}W$gî\îÜC]íGYc®*×ÒÉ“'M‹-Ì7ÞhŽ9RAÆ«¦:ŸW¹$›1Æ °ÙlJHHP§N¬9{ö¬ÒÒÒtûí·[ pÍÊÈÈÐéÓ§uöìY={V™™™ÊÊÊÒÙ³guòäIeff*==]6›M—þ|íâ¿ÇŒ£wß}×ÂÀ$%%)>>^üÜåiÓ¦Nœ8¡Ã‡[J7{ölMŸ>]Û¶m³:\a-[¶TNNŽû¬êÔ©£?þñV‡Wkp-\½¼¬®6S§N•ÍfÓ®]»täÈÙl6Mœ8Ñê°jœääd…‡‡ëÃ?Ô‚ äãÃ:TµEÆ åp8túôiÝ{ï½ ×}÷ݧ[o½U[¶lQóæÍ­±VáZ¸:ÙŒ1Æê <Áf³)11‘Õh †ã~ àj‘””¤øøxñs[þƒç#€Ë²/àaLâ°P›6md³Ù\þ´o߾ؿsss­îþ¿M›6•x«[·n±:ÉÉÉŶÇÄÄXmÍpy>x¿­},Xà<¿¯ï)!!!%®_///…‡‡+22R£FÒöíÛ]ÞwêÔ©Åê4iÒ¤D‰'ºýpÒ¤I¥Æ0uêTg&Mšx|X?ÿü³$©sçÎ2Æ8'äºó°,ãÆ“1F‘‘‘žI®V]3p “xà’EEEYFµ¹Öúk¥ê̵1FEEE***ª–㹂±µÏ”)ST¿~}Í™3G6l(±=!!A ºé¦›,ˆÎs¬|®ÖÆçgeûTsQSx{{+""B±±±Z»v­þð‡?è“O>ÑàÁƒeŒ±:¼ÍSã’ñ €«Õ\ËvîÜérÝ \ÁH€kChh¨~úé'«ÃÔrõë××o¼¡'Ÿ|R£FÒŽ;äëë+IZ¹r¥vïÞ­Ï?ÿÜâ(«Žç*®5“'OÖúõëµdÉ-X°@ƒ®r›|'j7Vâ>^¡¡¡ª_¿¾†ªÌÌL8p@ Phh¨5j¤#F(++«Ìv.>W/ªìs²¢÷Ûʼ«IR\\\±x/Íáš5kd³Ù´téRgYBBB±ú•~—ºïŸîìWÕw Wû}Ñ¥ç>88X]ºtQJJJ™í»[ß1VÅű³iÓ&åçç{´mOÚ³gú÷ïï¼»wï®ÔÔÔõÜ®Ôue\æååéOú“Z¶l©   Õ«WO Ð’%KTXXèR;®~gqul\<žÍfS“&M´uëVEGG+44´Üü]®²ß-Ü9î^3UùÎ0µ„$“˜˜huU6räH#ɬX±¢Ì:±±±F’‰5ß|óÉÎÎ6kÖ¬1uêÔ1wÝuW±ºG57Ýt“‰ˆˆ0Ë—/7YYYæûï¿7]»v5æ›o¾q)®àà`Ó¹sçR·¥¥¥™fÍš™ˆˆ³téRsæÌ³wï^3pà@c³Ù̬Y³J¿k×®fݺuæÜ¹sfÓ¦MÆÛÛÛddd¸TÇÝ~•–³Õ«W›ÀÀÀ9«¨¿eéÝ»·ñòò2ÿþ÷¿KlëÔ©“™7o^¥sVV<íÚµ3õë×w)¾¥K—Iæµ×^3§N2æ½÷Þ3^^^fܸq%ê{ú”¥¢\W‡;y¿´½œœœRË]#ÿú׿LݺuMãÆÍ—_~éì»Ýn7 40þþþ.õ½¢þ»;N®µå~  öKLL4Uý¹í¸qãŒ$e6lhŽ;Vl»ïÆüç¹7pà@³mÛ6“mæÌ™c$™¾}ûšØØX³cÇ“••efΜi$™çŸ¾Ìv.}®Væ9éÎûmyy(ÏôéÓ¤ï=ö˜‘dâãã‹•/Z´ÈDGG;ÿ]Ùw©+ùþYÑ~žx—p§ß¥ûï¾ûÎôêÕËÜ|óÍ%ν»õ=cyvìØáW+óœtçý֘ʽ«}ú8ËΟ?oÂÃÃÍ-·ÜbÍÙ³gÛî¿ÿ~óé§Ÿ:ÿ]Ùw©+ùþYÑ~žx—p§ßeû#GŽÿçÞÝúžˆ±<®Lâ=þ|¹“xËÛ÷矮–I¼’ÌÆ‹•÷ÝwF’‰ŒŒt–¹3>ÑÉ“'åS¦LѳÏ>+___gYesV111Z·n]‰òÈÈHåççë‡~(u?OŸƒÊ*+wòî WÆÈÊ•+%I½{÷.V·AƒjÙ²¥[Ç+ãàYÁÁÁº÷Þ{%ýú̽œÕ÷úöíÛû÷ 7ÜPjyãÆ]~_ªÊsÒ•÷ÛʪW¯žúõë§Õ«W+==]’´xñbuèÐAÏ<óŒrrrô÷¿ÿ]’têÔ)}õÕW8p sÿʾK]É÷ÏŠxb|¹Óï²Îý 7Ü Ûn»­DîÖ÷DŒU•––&IòõõÕu×]ç±v=) @:t(VÖºukÝpà ڵk—³îŒOÞ«úôé£o¾ùFO=õ”6mÚ¤ÂÂBIÒÞ½{Õ­[7÷:ûÿ•õ]¡2c#88XmÚ´)VVZþ\áÊõïNnݽfªû;Jb/ÀU,,,¬Ø¿½¼~ý9HQQ‘$)//OgΜQQQ‘ÂÂÂd³ÙŠ}¾ýö[IÒ¿þõ¯JÇpñ -±=""B’œ%.\aû¥Õ©J¿.Ï™ŸŸŸ¤ÿ䬪tþüy͘1C’´oß>­]»VO=õT‰ø+“³ª8sæŒþô§?©uëÖ wæë…^$?¾Ôý<}*«¼ñâJÞ]UÑÉËËSVV–Rbÿððp·Y«Æ  úÔ„{}:uŠýÛËËKÞÞÞ *VîíííÒûRUŸ“½ßVÕ°aÃTXX¨Ï?ÿ\’4wî\ 6Lƒ–···æÍ›'Iš?¾bbbŠõ¡²ïRWúý³,ž_®ö»¢sýõ×—ˆÏúžˆÑRRR$I:urûÅT—úõëËf³•(¿˜ÓãÇ»5><}¯š>}ºæÌ™£ýû÷+::ZuêÔQŸ>}œ“Y+£¬ï •uëÖ-µ­Kóç*W¾[¸sܽƪû;Jb/@-æïﯺuëÊÇÇGùùù2Æ”úéÞ½{…m•ö#ð‹Ç Snn®²²²Jl?v오_WúñOö«,eõ·"C† QDD„>øàåååé­·ÞÒ£>ZlÂJeræåå¥ .”¨{úôi—c0`€þüç?kĈÚ·oŸŠŠŠdŒÑ;ï¼#I2ƸÜVuŒ-w¸’wOñ÷÷Whh¨rss•]b»;?ê—jÖµ¨^V½\Iž~N–¥²ïýû÷W½zõ4wî\eddhÓ¦MŠ‹‹SDD„zõꥵk×*--MŸ~ú©† Vl_O¾Ky²OWú]ÂÕ~WtîO:U">wê{"ƪ***ÒôéÓ%IÏ<óŒGÚ¼Μ9SjùÅëïúë¯wk|Tf,•7žm6›†*‡Ã¡Ó§O+99YÆ 8Po¿ýv‰ºUQ™±qòäÉRË/ÍŸ§¸{ܽƮô÷fTŒI¼µÜÀUPP ÔÔÔÛÞxã Ýxã*((¨°   bFn¿ývýå/‘$Ýÿý’¤åË—Û'//OkÖ¬Q`` z÷î]•n”à©~•¥¼þ–Çßß_£FÒñãÇõÖ[oiÞ¼y3fL‰zîæ¬Q£F:räH±ºéééúå—_\êOaa¡RSSÕ°aC=÷ÜsjРóñ999.µq¹ê[®r5ïžÒ·o_IÒÊ•+‹•§§§kß¾}nµUÓ®-@õªîw‚êàÉçdY*ûþàçç§øøxíܹS&LPll¬%IC‡Uaa¡^y奥¥©GÎý®Ä»”§út%ß%ÜíwYçþĉÚ»wo•ë{"ƪx饗´eËÝÿýzðÁ=Ú¶'eggk×®]ÅÊþùÏêèÑ£ŠŒŒT£F$¹7>ÜKå˺uëjÏž=’$___õìÙSÉÉɲÙl%Ú¯Êw…ÊŽÜÜ\mݺµXYiùówrëî5s¥¿7 bLâ¨å^ýuµhÑBÇ׊+tæÌ:uJ}ô‘^}õUM:U>>>¶Ó¶m[íÛ·O‡ÒƵÿ~uéÒÅyŒfÍš)!!AË–-SVV–öíÛ§‡~Xiiiš6mš"""jd¿ÊR^+2jÔ(jâĉ²Ûíºå–[JßœõêÕKGÕ| ììlýôÓO3fŒË«@y{{«[·nJOO×”)StâÄ åäähݺuš9s¦kI)¥Wzl¹Ã•¼{Êk¯½¦zõê)!!A«W¯Vvv¶¾ÿþ{=þøãn¯Œ[Ó®-@õªîw‚êàÉçdYªòþ0tèPIÒ¬Y³Š­¶§ÐÐPÍš5KC† ‘—×~j}%Þ¥<Õ§+ù.án¿K;÷»wïÖ#<¢*×÷DŒî(**ÒñãǵxñbEGGëÍ7ßÔðáÃ5oÞ¼*¯{%kôèÑÚ¼y³Î;§mÛ¶é‘G‘ŸŸŸ¦M›æ¬çÎøpw,U4žŸ~úi}÷ÝwÊËËÓñãÇõæ›oÊSlò¼+í”§²c#,,L/¿ü²6nÜXnþ<Åܺ{Í\éïÍp¨%$™ÄÄD«Ã¨´Ù³gI%>YYYÎ:7n,±}„ ÆS¢¼ÿþÎýNž½Øö'N˜„„Ó¬Y3ãëëkÂÂÂLï޽͚5kÊÿòŸ°¸RÇ~U6gõ·"#FŒ0’ÌúõëˬãJÎ.:}ú´yòÉ'M£FL`` ‰ŠŠ2[·n5íÚµsÆ?~üørcÊÈÈ0#GŽ4M›65¾¾¾&""Â<öØcæÅ_t¶Ñ®];ŸƒŠ”•kw⸨¼¼/Z´¨D[C† ©ôÙ»w¯‰‹‹3uêÔ1AAAæž{î1ëׯ7ݺu3AAAUîÿE«ÅÕ~¿píHLL¬ðÙSž?ü°ÔgY~~~±zÕùNPÖsoëÖ­%Ê_ýuóõ×_—(å•WÊ|®^äêsÒªwµ[o½ÕÜx㦨¨¨Xùc=f$™~ø¡Ä>Uy—º’}ºÒï®öû¢KÏ}`` ¹ë®»Ì²eËLtt´³þO]Û¶m³:”kJMÈ{Ë–-•““£ƒZCMÇýÀÕ"))Iñññâç¶žÃs@MÖ¦M8qB‡¶:”ç#€ËzYPÍœ9ScÇŽµ:ŒkNuå===]õêÕS~~~±òè§Ÿ~R=®x ÔT<'ø“xøøãuÿý÷+;;[3gÎTff&«ŒV+óž™™©‘#GêСC:þ¼¶lÙ¢øøxÕ©SGüã«%j*ž“0‰ð˜ääd…‡‡ëÃ?Ô‚ äããcuH×+òÞ°aC9>}Z÷Þ{¯ÂÃÃuß}÷éÖ[oÕ–-[Ô¼yó+5ÏIW›©S§Êf³i×®]:räˆl6›&NœhuX¨lÆcuž`³Ù”˜˜Èê§PÃq¿pµHJJR||¼ø¹-ÿÁóÀe Y‰ð0&ñ¸`Á‚²Ùl²Ùl °:—L:Õs“&M,‹ãjÌ]m‘œœì̽ÍfSnn®Õ!€ËÔöçumïßµÈÝ÷û+ñ} ¬6oÕïàÁƒºï¾ûtöìYIÒ‹/¾¨ÄÄD‹£rcW“x\0hÐ cmu(.7nœŒ1ŠŒŒ´4Ž«1wµE\\œþ{weyÿÿÿug%û‚˜@À‚(ÚCi°ˆŠBY‚,š‘E´ -VŒ[ªŸ£V«àBX,žãBQ‚žD@>eû ÈRôIJ$’°Ä„,¹~øË”a&É}Of2@žsæ\\sÝïk¹çzßçÌÅc”••ìP@=.õýúRïßù***tõÕW+333Ø¡ŒÓü>ÏõµÙÒÖ[°íرC×_½ ¤øøxIÒĉõè£êOúS£³‡5€@ã/p‘ˆUïÞ½ƒðûxË`ŒQmm­jkkƒ ¸îÏæîÃ÷߯áÇëþçô»ßýÎUÞ¹sg-Z´HþóŸµpáÂf‹¸Pqˆü ..NûöíÓG}ìP€€zá…T\\¬'žxÂãßÒÓÓuûí·ë÷¿ÿ½Îœ9„è€ ‡x€-ƽñƺñÆÕ®];¯uFŒ¡C‡iÙ²eÍpaá/€{öìQvv¶£>}úhýúõõÖ?v옦NªÎ;+""BIII:t¨Ö®]몓-˲\¯Þ½{»þmõêÕ²,KK–,q•ååå¹ÕÿàƒÜþ>pà€rss•˜˜¨Ö­[+33Sûöí³ÝG;1KÒ™3g”ŸŸ¯[o½U©©©ŠŠŠR·nÝ4kÖ,ÕÖÖ6yìÎWPPàÖÏo¿ýV¹¹¹Š‹‹SëÖ­5vìX8qBÐðáç¶mÛjâĉ*//wûÉ“'Ý®gY–žyæ×ûÏ-¿ýöÛmÇmw~ìÌÃÌ™3eY–N:¥ 6¸®f{\%©¸¸¸Ñ˜9f%%%š2eŠ:v쨈ˆµiÓF999Ú±c‡­øí®E'sá¯ù¯›#˲Ծ}{mÙ²EŠ‹‹Stt´ú÷ï¯ 6x¼Ïɘة{~ß 5räHµnÝÚUVZZªšš=ñĺöÚk­ääd >\~ø¡Îž=kk>ö8ÝÇÛ¯í~ÖKöòŒgžyÆk~ºbÅ Wùe—]æç¹9_tt´n¸á-]ºTt½o„ Žû×'û—Ý=Ön›vê?7ÕÕÕnײ3¾æ”N:¿oêó€?Ûll½ù#Ïö=i·þÌ%wîÜ©ï¾ûNéééõŽK÷îÝ%I+W®´=–Þørß44i)ÏLhFà!Éäçç7¹¯¾úÊ$&&š´´4óñÇ›òòr³k×.3hÐ Ó±cGéV¿¨¨ÈtêÔɤ¤¤˜%K–˜²²2SXXhrrrŒeYfîܹ®º³gÏ6’ÌüùóÝÚ?~¼‘drssÝÊ-Zd222Üʲ²²Œ$“••e6nÜh***̪U«LTT”éÙ³§GÒÓÓMZZšÏ1/Y²ÄH2Ï>û¬9~ü¸)))1ýë_MHHˆ™6mZ“Æ®!uýÌÉÉ1[·n5æwÞ1’ÌСCMVV–Ù¾}»)//7sæÌ1’ÌC=äÖ†“ØlBBBÌ×_íK¯^½<欱¸íÌ“y0Ƙ˜˜sË-·ØŠ£±˜V¯^mâãã=br2fC† ipÌÞ}÷]×ßGŽ1?ùÉOLJJŠY¶l™)//7»wï6}ûö5­Zµ27nl´Nb«¯ßõÍ…¿æ?==ÝÄÄĘ^½z¹®¹eËóóŸÿÜDDD˜O?ýÔ§1q:~u}ïÛ·¯Y»v­9uê”Ù¼y³ 5%%%f„ &!!Á|üñǦ²²Ò›iÓ¦IfíÚµ¶úÚþú¼€@ËÏÏ7þúºmcû¸“ýúÜúõ}Öû+ÏèÑ£‡iݺµ[™·œo÷îÝfàÀ¦M›6^s>§ýóÆîþådß´Û¦“½³®¯UUU®2§óá4çïß¿¿INN6›6mj´<ù½?ŸšÒ¦ÓõækžííšÁ¸'냿sÉyóæ¹ÖP}ÊÊÊŒ$Ó§O;Ã畯÷M}q7¤¥>3ùÊŸû#À%n!Y¸døëPØwÜa$™>øÀ­üðáÃ&22ÒãKâupß{ï=·òêêjÓ®];eŠ‹‹1Æ;vÌDDD˜!C†¸êUVVš¤¤$sÕUW™¨¨(óý÷ß»þmĈæí·ßvk·îËÅK–,q+¿ýöÛ$/'{;Äë$æ%K–˜~ýúyŒÓ˜1cLxx¸)++s•9»†ÔõsÙ²enå]»v5’̺uëÜÊ;uêd®¹æ·2'±¯\¹ÒH2“'Ov«»~ýz“––f~øáGqÛ™'ó`LÓñžÓ]wÝå““1ûä“Oê³+®¸Âœ>}ÚUv÷Ýw{=À^TTd"##M=퇓Øê··¹ð×ü§§§Ifûöínå»ví2’Lzzº«Ìɘ8¿º¾ôÑG^ãìÔ©“¹ùæ›=Ê»téÂ!^8G0ñÚٯϭ_ßg½¿ò oëËùŽ=j¢££œæü}ûö5III‡ü¼•2¿÷çó@SÚtºÞüyˆ7÷dc}ðw.ù /IföìÙ^ÿ½ŽeY檫®j°NC|½oê‹»!-õ™ÉWâ°maˆ­ŸëhAV¬X!IhÐ uëÖMo½õ–Ž;æ*Ÿ1c†xà…‡‡;ŠÛÎü8™8?¦´´4˜œŒYFF†®»î:¯c–——§°°0WYAABBB”™™éÖnjjªºvíªmÛ¶éСC Æï$¶sÙ™ ÎLLŒºwïîVÖ­[7µk×N;wîTQQ‘$gcâëøÝpà ^c2dˆ6nܨûî»O›7oÖÙ³g%I………êׯŸí¾üÏÎ~}®ú>ë™gÔ—óµiÓF×^{mƒïuÚ¿sÙÝ¿œì›vÛlêÞéë|ØÍù?ýôS?~\½zõj´<ù} žšÒfSÖ›¯‚qO6Æß¹duuµ$5š#‡……©ªªÊǨ}³úâ¶£¥>3 p8Ä pŽšš•——«U«VŠõø÷Ë/¿Ü£~YY™Zµj¥¸¸8ú)))’ä:°+IãÆÓÙ³gõî»ïJ’æÍ›§qãÆiÔ¨Q Õüùó%Iï½÷ž233½Æ!I nGDDH’jkkí£“˜ËÊÊôÄO¨[·nJJJ’eY²,K?ü°$©²²ÒÕ®“±³+>>Þíï…††*::Ú­<44Ô£ïvc¯“——§ÊÊJ½öÚk’¤½{÷jÍš5ºï¾ûÇÝØüø²všêü˜BBBÜb’œÙïÿ{1û¿ÿû?M˜0ÁU§®¯µµµJHHpµY÷úüóÏ%I_}õUƒñ;­¾~×w¯økþ½–×ÝGu4&M¿˜˜¯±Ìž=[ï¼óŽöï߯ŒŒ ÅÇÇkÈ!®ƒ€à±³_ŸËÛg} óŒÆr¾¤¤¤ßï´ç²³9Ý7íî‰MÙ;›2¾æü T~ˆç¦¶Ù”õæ«æ¾'ˆ\²U«V’¤Ó§O7xí3gÎ(**ªIqû2fõÅmGK}f@àpˆà‘‘‘Š‹‹Suuµ***<þýøñãõT]]­òòrúß}÷¤9§Î°aÔœœ¬y󿩤¤D›7oVvv¶RRR4hÐ ­Y³FEEEzûí·5nÜ8?÷ÐyÌÇ×ÓO?­‰'jïÞ½ª­­•1F/¿ü²$Éãj×ÉØ5»±×=z´RRRôꫯª¦¦F/¾ø¢î¾ûîF£øÂ—µcY–ßã8ŸÓ1ËÍÍU‡ÜÆlâĉn_´ŒŒTbb¢ÂÂÂtúôic¼¾ú÷ïïרœò×ü;vÌk,G•ôãa'câ¯ñ;—eY;v¬>ùä{ö¬6lØ ÔÔTM™2EmÚ´q}9¼ªªÊ£]§cHNc—~üâôäÉ“uôèQ½øâ‹š?¾|ðÁ€ÅètíDGG»}‘ÿšk®Ñßÿþw¿Åã˘………éÁtÙ‚ 4eÊz999:sæŒ6lØàñoÏ?ÿ¼®¸â 9sƯ±9å¯ù¯®®Ö–-[ÜÊþýïëÈ‘#JOOwdp2&M¿ó%&&jÏž=’¤ððpÝzë­*((eYëàÞÇÏç4ÏhÛ¶­>ìV·¸¸XÿùÏ<Ú®/ç+..ÖÞ½{ý¿7v÷/'û¦Ý6›ºw:@ t~ˆçæxÆhŽû3÷¤ÔpüKþìg?“$:t¨Þ:u±×ÕõÅ…rßœ«¥?3À9ñœçÙgŸUrr²òòò´jÕ*UTTèË/¿Ô˜1cëQÿ¹çžS§N”——§¥K—ª¼¼\{÷îÕ]wÝ¥¢¢"Íš5K)))nï;v¬$iîܹn¿¶›­¸¸8Í;W£GVHH`¾Þa7æÐÐPõë×OÅÅÅš1c†JKKUUU¥µk×jΜ9í:»@r{É“'+**JÓ§O×ÀuÕUW,F§kç¿ø…öîÝ«ƒjÓ¦MÚ¿¿úôéã·x|³ûî»O š>}º²³³•––浯;wÖ½÷Þ«åË—«¬¬LÇ×믿®§žzJ3gÎTXX˜ßcsÊóŸ Ç{L›6mÒ©S§´uëV3Fš5k–«ž“1iêøyó›ßüF»víRMMŽ=ª^xAÆÿ<`̘1²,Kß|óã±üW ÷ñó9Í3 ¤#GŽèÕW_UEE…öíÛ§|P—_~¹GÛÞr¾Ý»wëž{î ø¯bÚÙ¿œî›v÷D»õ¼ñå™Á‰¨uëÖÚ¼ysƒåÎïñ<ÐÏÍqòžl¬þÎ%ÓÓÓuùå—kçÎõÖÙ±c‡«çr’[ú¾ñÏLpÌ\"$™üü|¿´UXXh²³³M||¼‰ŠŠ2={ö4K—.5F’‘d~ýë_»ê—––š¼¼<Ó©S'nÌàÁƒÍêÕ«ë½ÆÕW_m®¸â S[[ëV>~üx#É|ñÅnå›6mr]»îõøã»ú~îkذafÆŒõÖwsII‰™4i’éСƒ 7)))füøñæ‘GqµÛ£GŸÇî|õõsË–-åÏ=÷œù׿þåQþä“Oú{‰'IfݺuõÆi7îúæÇé<cÌž={LŸ>}LLLŒéСƒ™={¶ßcòuÌ~øa#Éìܹ³ÞxŽ;f¦Nj®¼òJnÚ´ic dV­ZÕø;ˆÍ×¹¨ãËü×IOO7iiiæË/¿4ƒ6qqq&**ÊôíÛ׬_¿¾Icb§®·¾{ûšØŽ;̤I“ÌOúSm’““ÍM7ÝdæÎëñ™4`ÀkΜ9ãx<êãÏÏk¤üü|¯Ÿ£¾¨owºoÙý¬7ÆYžqòäI3aÂÓ¶m[ez÷îm¶lÙbzôèáºÆÿøGWýss¾èèhsóÍ7›uëÖ™~ýú™èèhW½¦îËçr²ÙÝcí¶i§Þ¢E‹<ú4zôhGóáëxõéÓÇ$%%™7ºõÏ[y óû¦>xc·M_ÇÏiž}® åžl¬þÌ%1æ±Ç3aaaæðáÃ^ÿýŽ;î0iiiæ‡~p+wš[úzߨýìn©ÏLMåÏýà·Ð2Æ\,ËR~~¾FŽìPp‘{óÍ75{ölmݺ5Ø¡ š2ÿÝ»wWii©:€ÈšßÉ“'Õ®];=ZsçÎõ[»|^¸X,\¸P¹¹¹âë¶ö]{íµªªªÒ·ß~ìPPYY™ºvíªÌÌL_yݹs§®»î:½ûóÎ;]åÊ-ÑüØl{?$Øš9sæhêÔ©ÁAÂüÿÈ£)S¦(>>^O?ýt°Ã\@Š‹‹•œœ¬Ó§O»•8p@ûöíÓ€‚€æ’ %K–èƒ>ÐìÙ³]åû÷ïWNNŽ}ôQ·¼ä–h©8Ä €ï7ÞЈ#TQQ¡9sæèĉüBh Âü{÷ÝwßiÿþýZ½zµRSSƒàsâÄ Mš4ITee¥>ûì3åææ*>>^úÓŸ‚€fpÝu×iëÖ­Z¾|¹¾ÿþ{IÒ믿®?ÿùÏúóŸÿìV—Ü-‡xIJJJÒßþö7-X°@aaaÁ ͨ©ó?sæLY–¥;wêðáò,KÓ§OP´Í#55UëׯW×®]ƒ à“ššªO>ùD'OžÔ/ùK%%%éW¿ú•®¾új}öÙgºòÊ+ƒ".–e5úúßÿý_b¼ÀuìØQK—.U||¼$éùçŸwûÞ:ä–h©,cŒ vþ`Y–òóóùM¸Àñy àb±páB忿НÛð_ì¶½Ï/ñ~Æ!^€ [°`,Ë’eYjÕª•_Ûž9s¦«íöíÛ7Z eâ3€ CAAkO¶,KÕÕÕ>·ëÖ–eY QRR’ÒÓÓ5yòdmÛ¶Íö{gΜéV§}ûöu¦OŸ®îÝ»{”7ôzæ™g|òÙ @ËÄ!^€ »óÎ;eŒQFF†ßÛž6mšŒ1JOO·U eâ3ÿ«¨¨ÐÕW_­ÌÌLÛïÉÎΖ1FYYY~¹þöíÛ%IYYY2ÆèôéÓÚ³gžzê)íÙ³G×_½î¹çUVV6úÞiÓ¦¹Õ9tè¾ùæIÒ-·Ü"cŒë@îûï¿/cŒë5iÒ$IÒòåËÝÊsss›ÜO ä³™¾¬ ©}ÿÅ!^¸ˆÅÆÆªwïÞÁp‘iiûG0úkŒQmm­jkk/ˆx$)44T)))ÊÊÊÒš5kô‡?üAo½õ–F%cL³ÇïZ;n¿¥}6ìàR§}ûö;Œýå/Ѻuëôá‡jÁ‚5jT“Ûܱc‡íº ,hòõ.E^;ÃÚ.ü/´@–eéw¿û$éµ×^ r4péá/ÀyΜ9£üü|Ýzë­JMMUTT”ºuë¦Y³f©¶¶ÖU¯  @–e¹^Pnn®Õºukeffzýu£={ö(;;[ Љ‰QŸ>}´~ýú€Äè/3gÎtõ³}ûöÚ²e‹222§èèhõïß_6lðx_II‰¦L™¢Ž;*""BmÚ´QNNŽ×_ç²S÷ü1/,,ÔÈ‘#ÕºukWYii©jjjôÄOèÚk¯Utt´’““5|øp}øá‡:{öl½ý\qqqjÛ¶­&Nœ¨òòr·¶ì¬#_ÇÄ'óâïµÓ_ïùúÖŸ?b²3Vu÷å©S§´aÃW aaaŽûÖ˜¦öpá°³Höò;{ão¼á×ýÓin·¿çËÎÎv»Î¹ùÛêÕ«eY––,Yâ*ËËËs«ÿÁ¸ý]]]íS<ÅÅŶž1š¢®o›7oÖéÓ§ýÚvSøú¼egíÖqúlf7'òõyÄ[¿ëÖŽ¯ãa·}_ï•Æøë³¤îsâ|Û³*Z p‰dòóó›ÜÎ’%KŒ$óì³ÏšãÇ›’’ó׿þÕ„„„˜iÓ¦yÔÏÊÊ2’LVV–Ù¸q£©¨¨0«V­2QQQ¦gÏžnu¿úê+“˜˜hÒÒÒÌÇlÊËËÍ®]»Ì AƒLÇŽMddd@bLOO7iii¶Ë듞žnbbbL¯^½\}ݲe‹ùùÏn"""̧Ÿ~êª{äÈó“ŸüĤ¤¤˜eË–™òòr³{÷nÓ·o_ÓªU+³qãFŸêóß1ïÛ·¯Y»v­9uê”Ù¼y³ 5%%%f„ &!!Á|üñǦ²²Ò›iÓ¦IfíÚµösðàÁ&$$Ä|ýõ×ÿÖ«W/3þ|×ßEEE¦S§N&%%Å,Y²Ä”••™ÂÂB“““c,Ë2sçÎu{LLŒ¹å–[<ÚíÑ£‡iݺu£±?999fëÖ­¦¢¢Â¼óÎ;F’:t¨ÉÊÊ2Û·o7åååfΜ9F’y衇ÜÚp²ŽœŒI}ìÎK ׎7¾Þóõ­?Ääd ×·¦|é›·Ïôç|þú¼€@ËÏÏ7—ê×mÚ?œæ7ívêøšÚÉÁëo}fÏžm$yä9ãÇ7’Lnn®[ù¢E‹LFF†×8«ªªÅã­«W¯6ñññ^ûWŸíÛ·»Ú©OUU•‘d$™#GŽx¼×Ϋ±±4i’‘d–/_n;ö:NæÚÉÚuúlæd6õyäÜ~Ÿ¿vœ®}§íûr¯Ô'Ÿ%õ¹XžU/—òþàg ÉšÀ%߇xûõëçQ>fÌnÊÊÊÜÊ뾤»dÉ·òÛo¿ÝHrû¢îwÜa$™>øÀ­îáÇMdd¤£C¼Nbôç!^Ifûöínå»ví2’Lzzº«ìî»ïöz表¨ÈDFFš=zøTטÿŽùG}ä5ÎN:™›o¾Ù£¼K—.¶¾4¿råJ#ÉLž<Ù­|ýúõ&--ÍüðCï½÷ž[ÝêêjÓ®];eŠ‹‹]åþ>Ä»lÙ2·ò®]»Ifݺunå:u2×\s[™“uädLêcw^¹v¼ñõž¯oýù#&'k¸±C¼Mý¬ðGÎÇ!^‹KùRCû‡Óü¦±½ÑN_óA;9xcý­Ï±cÇLDD„2dˆ«¬²²Ò$%%™«®ºÊDEE™ï¿ÿÞõo#FŒ0o¿ý¶×8}=Ä{~ÿîºë.¯ý«C¼••• âmè½ß|óM³âµ3×NÖ®Óg3'k´©Ï#çö»¾C¼v×¾Óöýyˆ7Ÿ%õ¹XžU/—òþàg Cù¡^€'33Sk×®õ(OOO×éÓ§õÅ_x}_Ïž=ÝþîСƒ$éÈ‘#®²+VH’ìV·]»vêÒ¥KÀcô‡˜˜uïÞÝ­¬[·nj×®vîÜ©¢¢"IRAABBB”™™éV755U]»vÕ¶mÛtèÐ!ÇuÏuà 7xqÈ!Ú¸q£î»ï>mÞ¼YgÏž•$ª_¿~öqРAêÖ­›Þzë-;vÌU>cÆ =ðÀ w•-Z´H’4lØ0·6"##•‘‘¡ªª*­\¹²Ñkúêúë¯wû»]»v^ËÓÒÒÜÖ¢äl9“úØ—æX;¾ŽÃ¹ê[þˆ©©k¸Ž?>+üÑÀÅÅ×ü¦¾½ÑN_÷;9¸¯’““uÛm·iÕªU*..–$-^¼X7Þx£î¿ÿ~UUUéŸÿü§$éøñãúôÓO•““Óäëžëüþ¥¥¥IòOÿêÔåïáááºì²ËüÖ®¿Ù™k'k×é³™“5ê¯\®!\ûþÈÏo.†gU´<â8OYY™žxâ uëÖMIII²,K–eéᇖ$UVVz}_BB‚Ûß’¤ÚÚZIRMMÊËËÕªU+ÅÆÆz¼ÿòË/xŒþ˜˜èµ¼.þ£Gª¦¦Feeeª­­UBB‚+¾º×çŸ.IúꫯÕ=_LLŒ×XfÏž­wÞyGû÷ïWFF†âãã5dÈ×—ÈíÈËËSee¥^{í5IÒÞ½{µfÍÝwß}®:u±·jÕJqqqm¤¤¤H’ëÐG ÄÇÇ»ý¢ÐÐPEGG»•‡††ºÖb§ëÈΘ4Äμ4×ÚiÊ8Ôñ¶þü“?ÖpSúæïþ.MÉoêËͫӔý¦±¼©Æ§³gÏêÝwß•$Í›7OãÆÓ¨Q£ªùóçK’Þ{ï=effzÍó›âüþ…„üøõoõO’Ö¯_/IêÕ«—­ÿ˜%XìùD'OžTAAŒ1ÊÉÉÑK/½d«Ñ£G+%%E¯¾úªjjjôâ‹/êî»ïVRR’«Ndd¤T]]­òòr6¾ûî;I?þJSýðÃuOžø G½#FH’G»555Z½zµ¢¢¢4xð`WyÛ¶muøða·ºÅÅÅúÏþc»þàË:²;&õ±;/͹vq?ùc=;YÃÑÑÑnï¹æýýï÷[ßü}. õí’óüƽß4Ô߆DDD(77W;vìÐã?®¬¬,EEEI’ÆŽ«³gÏêÉ'ŸTQQ‘ ðxüíÑGÕgŸ}¦#FèŽ;îhöëû›“µëôÙÌÉõÇóH°øsm6÷gÉÅ𬠀–‡C¼ç U¿~ýT\\¬3f¨´´TUUUZ»v­æÌ™ÓäöŸ}öY%''+//O«V­REE…¾üòK3F±±±DŒIHHÐc=¦M›6éÔ©SÚºu«ÆŒ£ˆˆÍš5ËUï¹çžSçÎuï½÷jùòå*++ÓñãÇõúë¯ë©§žÒÌ™3渮]¿ùÍo´k×.ÕÔÔèèÑ£zá…dŒqt¸bòäÉŠŠŠÒôéÓ5pà@]uÕUuž{î9uêÔIyyyZºt©ÊË˵wï^Ýu×]***Ò¬Y³”’’âª?hÐ 9rD¯¾úª***´oß>=øàƒºüòËõ¯©|]GvƤ!væ¥9×N î'­g»kø¿ø…öîÝ«ƒjÓ¦MÚ¿¿úôéã·¾âþ_}û‡ä<¿ñ‡@ï7 õ·1cÇŽ•$Í;×í×v³³³§¹sçjôèÑ ±ÿÕì¦ÄÓµµµ:zô¨/^¬ŒŒ ½ð º÷Þ{5þü æ×›ÂÉÚuúlætúãy$[›cÆŒ‘eYúæ›om«¹?K.–gU´0à!Éäçç7¹’’3iÒ$Ó¡CnRRRÌøñãÍ#ù¤1Æþ:òeL¼q2/þ^; iÊ=_ßW°š““±Ú³géÓ§‰‰‰1:t0³gÏvÜ·Æ>šÚŸóùëó-??¿ÞÏú‹]Cû‡1öò;{£¿÷O_sðÆúÛ˜«¯¾Ú\qÅûðøñã$óÅ_¸•/Z´È#žÑ£G7¯ýó&&&Æã=–e™„„Ó­[7óÛßþÖlÛ¶Íö{g̘áV'--­ÑgŠ7ß|Óëü———7{SÆÂInîôÙÌnNÔ”ç‘úÖŽ¿Ö†¯k³Î€Lll¬9sæLƒý¨ã¯Ï’Æ\,Ϫ—ŠKyð³…–1Æà`Y–òóó5räÈ`‡rÉêÞ½»JKKuèС`‡ÒlÞ|óMÍž=[[·n v( ÆMÅç5€‹ÅÂ… •››+¾n ÒÉ“'Õ®];=ZsçÎ v8nZâ³j0±?Øö~H°#.dsæÌÑÔ©SƒÆ…1ZcŒ¦L™¢øøx=ýôÓÁ¸hpˆ8Ço¼¡#F¨¢¢BsæÌщ'Zü¯…2&@ËöÝwßiÿþýZ½zµRSSƒpÑà/5sæLY–¥;wêðáò,KÓ§OvXSPP ¤¤$ýíoÓ‚ 삎1Z®ÔÔT­_¿^]»v v(nZÚ³*.>–1Æ;°,KùùùüB(\àø¼p±X¸p¡rssÅ×mø/öGÛÞç—x?ã/@ °`ÁY–%˲ԪU«`‡?c~.LùùùêÞ½»¢¢¢\ùÚîÝ»ƒÖ­  À5V–e©ºº:Ø!áà¯{)Xë+66Öíº–e)$$DIIIJOO×äÉ“µmÛ6Ûï9s¦[öíÛ{Ô™>}ººwïîQÞÐë™gžiŽáhQ8Ä ÐÜyç2Æ(###Ø¡ šßŠŠ ]}õÕÊÌÌ BdÞµ„eÆ 5j” ¤’’}ýõ×jß¾}°ÃºàeggË£¬¬¬`‡‚ „?ï¥`­¯ŠŠ mß¾]’”••%cŒNŸ>­={öè©§žÒž={týõ×ëž{îQeee£ï6mš[C‡é›o¾‘$ÝrË-2Ƹä¾ÿþû2Ƹ^“&M’$-_¾Ü­<777 cÐRqˆA«Þ½{;ŒKž1Fµµµª­­ v( …i(ßk 9JÝÁ¹|P±±±êܹ³<¨ŸýìgÁí‚ÌçžEü§9ÆÒ—{éb˜ãÐÐP¥¤¤(++KkÖ¬Ñþð½õÖ[5j”Œ1Á~ìN\\œöíÛì0Ü´„åàÁƒ’¤Ö­[9àâÖRüå/Z·n>üðC-X°@£Fjr›;vì°]wÁ‚M¾<ñK¼àggÏž vÀ%¡¥ÜK–eéw¿û$éµ×^ r4ðñÁ™3g”ŸŸ¯[o½U©©©ŠŠŠR·nÝ4kÖ,ÕÖÖºêȲ,×ëÀÊÍÍUbb¢Z·n­ÌÌL¯¿`¶gÏegg+!!A111êÓ§Ö¯_o;>_¯{ìØ1M:U;wVDD„’’’4tèP­]»ÖUgæÌ™²,K§NÒ† \× sSaa¡Fީ֭[»ÊJKK%I%%%š2eŠ:v쨈ˆµiÓF999¿BTSS£'žxB×^{­¢££•œœ¬áÇëÃ?t}Q¼.^˲Ծ}{mÙ²EŠ‹‹Stt´ú÷ï¯ 6ø4žßóÛ¯®®öÛu£££uà 7héÒ¥8p «­ &48Xû'Ožt«kY–žyæ×õÎ-¿ýöÛ=ÚþöÛo•››«¸¸8µnÝZcÇŽÕ‰'tàÀ >\qqqjÛ¶­&Nœ¨òòr¿Ìµ?Ö/àÂuîÞ©öíÛkàÀzë­·TUU嵞¿ò_÷y'ûOcýk,ß«/G ä¸Hör?'sÛXl‹/–$EEEɲ,ÝtÓMõ¶ëkÎédÞìÔµ›³4švªoYIDATe,>7:·vsL_ŸEœ\£¹ò>_ÖŒ?ûðÈ#ø<–Ràï%®/©ùrôÞ½{K’6oÞ¬Ó§Oûµm‰¸DH2ùùùÁÖ%K–IæÙgŸ5Ç7%%%æ¯ý« 1Ó¦M󨟕•e$™¬¬,³qãFSQQaV­Ze¢¢¢LÏž=Ýê~õÕW&11Ѥ¥¥™?þØ”——›]»v™Aƒ™Ž;šÈÈHÛq:¹nQQ‘éÔ©“III1K–,1eee¦°°Ðäää˲ÌܹsÝêÇÄĘ[n¹ÅÁ¨¹ÇÔ·o_³víZsêÔ)³yófjJJJÌ‘#GÌO~ò“’’b–-[fÊËËÍîÝ»Mß¾}M«V­ÌÆ]mM˜0Á$$$˜?þØTVVšââb3mÚ4#ɬ]»Öíºééé&&&ÆôêÕË5[¶l1?ÿùÏMDD„ùôÓO}‹@Ïo]ûUUU~½îîÝ»ÍÀM›6ml¯«@®ýÁƒ›óõ×_{´Ó«W/3þ|¯mçä䘭[·šŠŠ óÎ;ïIfèС&++Ël߾ݔ——›9sæI桇rkÃ×¹öÇú½˜]LŸ×Z¶üü|ãôë¶u{CjjªY²d‰ùþûïMqq±yúé§$óòË/»Õ D¾à´¾“ýÇnÿŒi<ßó–£r\œä~ÞøÛù9XCœäœNæÍiŽÑXÎÒÔ±4Æþú8wnW¯^mâãã=æÖiŽé˳ˆ¯yl ó>'kÆß}ðu,›ã^òçúò×\mß¾ÝuÍúTUUIF’9räˆÇ{í¼›I“&Ifùòå¶âöÆ—ý …ZHÖ.Ó¡°%K–˜~ýúy”3Æ„‡‡›²²2·òº//Y²Ä­üöÛo7’\_ 6Ƙ;î¸ÃH2|ð[ÝÇ›ÈÈHŸñÚ¹îøñã$óÞ{ï¹Õ­®®6íÚµ3QQQ¦¸¸ØUÞÔC¼}ô‘׿ûî»$›EEE&22ÒôèÑÃUÖ©S'sóÍ7{´Ñ¥K¯‡x%™íÛ·»•ïÚµËH2ééé®2§cèùmìoS®{ôèQíèo ÖþÊ•+$3yòd·ºëׯ7iiiæ‡~ðÚö²eËÜÊ»víj$™uëÖ¹•wêÔÉ\sÍ5ne¾Îµ?ÖïÅìbú¼вùrH©noðö97dÈ×!×@æ Në;ÙìöÏßñr\œä~Þø›ÓC¼vsN'óæ4Çh,giêXc}œ?·wÝu—ÇÜ:Í1}=ÄëKè¼ÏÉšñwŒñm,›ã^òçúò×\Ù9Ä[YYÙà!Þ†ÞûÍ7ßpˆà³0Dhv™™™Z»v­GyzzºNŸ>­/¾øÂëûzöìéöw‡$IGŽq•­X±B’4xð`·ºíÚµS—.]|Š×Îu-Z$I6l˜[ÝÈÈHedd¨ªªJ+W®ôéúÞÜpà ^Ë ¢ÌÌL·òÔÔTuíÚUÛ¶mÓ¡C‡$IC† ÑÆuß}÷ióæÍ:{ö¬$©°°Pýúõóh;&&FÝ»ww+ëÖ­›Úµk§;wª¨¨H’ïcq!Ïo}×mÓ¦®½öZÛ× äÚ4hºu릷ÞzKÇŽs•Ϙ1C<ð€ÂÃý¶}ýõ×»ýÝ®];¯åiiinד|Ÿk¬_À…©no:t¨Ç¿-_¾\yyynõ‘/8­ïdÿ±Û?_r\œæ~þŠÍ)»9§“yó5Ǩ/giêX:qþܦ¥¥IrŸ[_sL'|½Fsä}v׌¿ûà«æ~vlˆõÕœ9zÝ\…‡‡ë²Ë.óK›.ñAYY™žxâ uëÖMIII²,K–eéᇖ$UVVz}_BB‚Ûß’¤ÚÚZIRMMÊËËÕªU+ÅÆÆz¼ÿòË/÷)^;×-++S«V­çñþ””IRqq±O×÷&&&Æ£¬.ŽÚÚZ%$$¸ÆµîõùçŸK’¾úê+IÒìÙ³õÎ;ïhÿþýÊÈÈP||¼† âúRùù½–×ëÑ£G›4òü6tݤ¤$Û× ÔÚ¯“——§ÊÊJ½öÚk’¤½{÷jÍš5ºï¾ûê)>>Þíï…††*::Ú­<44ÔízM™k¬_À…§±½Án½¦ä Në;ÙìöÏW§¹Ÿ¿bsÊIÎédÞ|É1¼å,RÓÆÒ©óç6$äǯÀŸ;·¾æ˜NøzæÈûì¬÷ÁWÁxvlHc뫹sôõë×K’zõêUïB€‹ ‡x‚`øðázúé§5qâDíÝ»Wµµµ2Æèå—_–$c|j722Rqqqª®®VEE…Ç¿?~¼Iq7tÝ„„UWW«¼¼Üãß¿ûî;I?þRQ˲Gbb¢ÂÂÂtúôic¼¾ú÷ïïŠaìØ±úä“OtòäIÈ£œœ½ôÒKí;vÌëÜÔ})þòË/÷i,œô/XóÛÐuëúoG Ö~Ñ£G+%%E¯¾úªjjjôâ‹/êî»ïvtÐØ.ϵÓõ ¸ð4¶7Ø­×”|Á)'ûÝþÕqšïz\œæ~ÍÛ¹ìæœNæÍß9FSÆòÜ6üÅiŽé˵ý™Çú{Nì¬÷¡Î…vŸûW}š3G¯­­ÕìÙ³%I÷ß“ÛÀ…C¼ÍììÙ³Ú°aƒRSS5eʵiÓÆõ㪪ª&·?tèPIÒŠ+ÜÊKKKUXXØäöë3bÄIÒ²eËÜÊkjj´zõjEEEiðàÁ®òèèhýð¹æýýïor999:sæŒ6lØàñoÏ?ÿ¼®¸â 9sFÒ¿XµgÏIRxx¸n½õVȲ,~HRuuµ¶lÙâVöïÿ[GŽQzzºÚ¶m+ÉùX8¬ù­ïºÅÅÅÚ»w¯­6½ö¥¿d?yòd=zT/¾ø¢æÏŸ¯|Ð/m{ãï¹v²~¦º½á£>òø·ë®»N=ô[½@ä N9ÙìöOò-ß ä¸8Íýš3¶sÙÍ9Ì›¿sŒ¦Ž¥ä¿ç_rL§×DëÏ9±³f•‹_h÷ySâªOsåè>ú¨>ûì31BwÜqG“ÛÀ…C¼Í,44TýúõSqq±f̘¡ÒÒRUUUiíÚµš3gN“ÛöÙg•œœ¬¼¼<­ZµJúòË/5fÌÅÆÆú¡Þ=÷ÜsêÔ©“òòò´téR•——kïÞ½ºë®»TTT¤Y³f)%%ÅUÿ¿ø…öîÝ«ƒjÓ¦MÚ¿¿úôéã—8:wî¬{ï½WË—/WYY™Ž?®×_]O=õ”fΜ©°°0Wýßüæ7Úµk—jjjtôèQ½ð 2ÆhÀ€m'$$è±ÇÓ¦M›têÔ)mݺUcÆŒQDD„fÍšåóX8¬ùõvÝÝ»wëž{î±ý+Y^ûu&Ož¬¨¨(MŸ>]ÔUW]å·¶Ïçï¹v²~Oœ8¡.]º¨S§N:räH ºp¨nox衇´lÙ2•——ëСCš}ú˜˜˜Ó¡C3{öìÇÌ[Lõ}ý娱cfêÔ©æÊ+¯4ááá¦M›6fРAfÕªUnõvìØa&Mšd~úÓŸšèèh“œœlnºé&3wî\S[[ëV7==ݤ¥¥™/¿üÒ <ØÄÅÅ™¨¨(Ó·o_³~ýzìŒE çwÑ¢EíŒ=Ú/׎Ž67ß|³Y·néׯŸ‰ŽŽnpþêzí×™8q¢‘dÖ­[çñoõµ½eËòçž{Îüë_ÿò(òÉ'›<×M]¿ÇŽ3;w6W\q…9|ø°­ñ¿P\LŸ×Z¶üüüz?¯rþÞжm[sçwš½{÷6XÏù‚¯{¨ÝýÇIÿêË÷êËQ9.Æ8Ëýìέ·Ø¼õO’Ù´iS£í;Í9Ì›ºvsŒe}ë×¹µ›c6ví†4%mjÞ×'k&}ðe, ü½äÏõeLÓç*&&Æ£}˲LBB‚éÖ­›ùíok¶mÛfû½3fÌp«“––Vo¿ê¼ùæ›^dz¼¼ÜVÎåëþÐ-´Œ1F—˲”ŸŸ¯‘#G;\‚ºwï®ÒÒR:t(Ø¡\p®½öZUUUéÛo¿ v(.o¾ù¦fÏž­­[·;xÁç5€‹ÅÂ… •››+¾n‹æBÎ §X3öGÛÞ v.|ÅÅÅJNNÖéÓ§ÝÊ8 }ûöiÀ€AŠÌ»9sæhêÔ©ÁЂqˆ€-'NœÐ¤I“tðàAUVVê³Ï>Snn®âããõ§?ý)¨±½ñÆ1b„***4gÎ8q‚_y‡x€Ìœ9S–eiçÎ:|ø°,ËÒôéÓƒV³KMMÕ'Ÿ|¢“'Oê—¿ü¥’’’ô«_ýJW_}µ>ûì3]yå•ÁQJJJÒßþö7-X°@aaaÁ ÀrN8Åš.–1Æ;°,Kùùùüú&\àø¼p±X¸p¡rssÅ×mø/öGÛÞç—x?ã/’fΜ)˲dY–Ú·oìp\ä8Ä €¤iӦɣôôô`‡àÀ!^@@ÅÆÆªwïÞÁšUX°ð§M›6;€C¼àÒòÊ+¯è•W^ vháB‚€¿cxñâÅ‹×Eò9rd°· ðÿ+((eY®×”››«ÄÄDµnÝZ™™™Ú·oŸÇûJJJ4eÊuìØQjÓ¦rrr´cÇW™3gʲ,:uJ6lp]#,ìÇߣÊÎÎv»vïÞ½]ï]½zµ,ËÒ’%K\eyyynõÏœ9#I:v옦NªÎ;+""BIII:t¨Ö®][o? 5räHµnÝÚUVZZêuŒþñ¸½×²,7mà\ò8Ä -Xvv¶Œ1ÊÊÊ’ôãAÙ¼¼<>|XùùùZ³fFåöž¢¢"õìÙS .Ôk¯½¦ãÇëÓO?ÕñãÇÕ«W/mÚ´I’4mÚ4c£[n¹ÅõzÔ¾-((ÐìÙ³%IóçÏ×úõë]×øÇ?þá*¯óÊ+¯hÑ¢EÊÈÈ1Faaa*..VÏž=õî»ïjÖ¬Y*--ÕÿûÿOÑÑÑÊÈÈÐo¼áµŸ“&MÒäÉ“uðàAmÞ¼Y¡¡¡õŽÑ¨Q£4uêTÝzë­:~ü¸Œ1JMMmÒ¸¸ôqˆà2aÂõêÕK1118p † ¦-[¶¸ýJí£>ªo¿ýV/½ô’n»í6ÅÆÆªk×®Z°`Œ1zàl_ïÎ;ïTDD„æÍ›ç*«ªªÒâÅ‹uÕUWéÃ?Tyy¹ëßÞyç7Î-–o¾ùF¯¼òŠ233¯.]ºèÝwßUÛ¶m5eÊ}÷Ýw×ýãÿ¨~ýú)::Z7Þx£Îœ9£Ë.»Ì£ÞÉ“'5lØ0={VË—/WRR’í¾hÙ8Ä péÙ³§Ûß:t$9rÄUVPP effºÕMMMU×®]µmÛ6:tÈÖõ’““uÛm·iÕªU*..–$-^¼X7Þx£î¿ÿ~UUUéŸÿü§$¹~ñ7''ÇõþE‹I’† æÖndd¤222TUU¥•+Wz\÷†nh4¶ÂÂBÝxã Ñ+¯¼Òà¯õÀù8Ä pIHHpû;""B’T[[+Iª©©QYY™jkk• ˲Ü^Ÿþ¹$髯¾²}ÍqãÆéìÙ³z÷Ýw%IóæÍÓ¸qã4jÔ(…††jþüù’¤÷Þ{O™™™Šu‹¥U«VŠ‹‹óh7%%E’\‡ƒÏÓ`L'NœPvv¶Ú·o¯åË—ëÿø‡íþ€Ä!^€‘‘‘JLLTXX˜NŸ>-cŒ×Wÿþý]ï±,«Á6‡ ¦äädÍ›7O%%%Ú¼y³²³³•’’¢AƒiÍš5***ÒÛo¿­qãÆ¹Å’ êêj•——{´ûÝwßIúñ‚ Ó'Ÿ|¢Å‹«[·nš8q¢¶lÙâ¸-‡x€ÿ¯½ûw©r àþ}C¢:E? $Ì\‚‚†(ZZOòÇ´…¸-"4è˜þ¡…KŽâ¡–ZZÂÎ $šyît½.÷r½8eŸÏö<ïËó|Ÿwy—÷Ë ìI¶··³´´ô·kãããéììÌöööîÜádzµµµ;îééÉÔÔÔîøàÁƒ©T*y÷î]cGGGNž<™ööö¼xñ"ííí)—Ë©Õj{^ ø=)ñ°'ccc9}útîÞ½›………|ùò%Ÿ?ÎÓ§Oóøñã}ú¡=€ýG‰à7V­VSEæçç“$¥R)>L’E‘ñññ$ÉùóçsãÆ$ɱcÇòæÍ›”ËåÜ¿?GÍÙ³góüùóÌÏÏçöíÛ {LLLäܹséííM¥RÉäädz{{î¹téRº»»ÓÙÙ™+W®ìΗJ¥Üºu+Iʽ:qâDÞ¾}›;wîddd$GŽÉÅ‹³±±‘ׯ_çÞ½{ÿx΢(ÖzöìYŠ¢Èû÷ﳺºš¢(211‘jµš«W¯æÛ·o©V«9tèP†††R¯×³³³“ÿ÷ð€}­¨×ëõV‡€ŸÍÌÌL*•J|n ñ~øÏfý‰šL‰šL‰šL‰šL‰šL‰šL‰šL‰š¬­Õàg633ÓêðÓX^^nu€_†/ü‹J¥ÒêÀ/¨¨×ëõV‡€}dö@«À~£Ä M¦Ä MÖ–d¶Õ!`©þw0ÌœLIEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/screenshot.png0000664000175000017500000172343414152763504021277 0ustar arvidarvid‰PNG  IHDR¸K÷ pHYs.#.#x¥?v IDATxÚì}{xEöö;™„\¸„$H ˆrO‘€¨°”Õ ˆ.‚ ’]v#7* 8âˆ7Œ«Â'à¢(^@%¿U’ä2" r èïpššš®éžkf&už§Ÿ¤»ºª«{ºûí·Î9o™(&Mš×- l6 ›Í¦.PTT„mÛ¶aÇŽxî¹çÛ¶mÃ’%KPTTxî¹çÔÿi}Û¶mÂýËËËíö§mìv¾Í¢¢"©ûhµAÇ¢EkŸùó磼¼Ün,iÒ¼e& =L¬ÅÇÇL'‹ŠŠ››+-iAgŠÖRVV¦,Y²D©ªªRÊËËÑ~Á°|ðÁ eÛ¶mJQQ‘ NωúC}p¥/6›MÙ¶m›²cÇå¹çžSÏkÉ’%ê¹¹ÒŽ»õÙs)//×<›Íf¨ÿZ}â—#F(Üîg],&ɹ¤IóYˆsM™ryc^к5ðë¯À™3ÀÂ…µÛæÌ©-_°êþôÿر@jjí~çÏǘ:xäફ€mÛ€_~ŽJJj÷kÐxöÙÚ}¼m7^;eû#¡(ÀÕ-«1æ¶Ãx⭫кùYD7º€{úý†7Ö´Dõù0<8ø à›ÒÆèœt QpäxÄ59_F ]«j»¶G=~Á¥¾ÄÇÛ­G7úOä>„Ç‹^ÄÉ3/ï×ô žÁÿNÄá‰Ü‡ðè‹oÛÕ‹lz½³§à‹Åo æ\$ÂÌçqñBµ¼e‡M8¼«®êò:ô~_,~í®ŽÑÍvÕåH>½;#;á—ˆkyñN‡E¡rçM ÕvZÛ8eŽÆ榈¼x W&G£­v÷At40{6ìî'¶ß§%8ô_ÏŠ‹ãƒòá2P²³m!ûö˜ûÐ}®}#+€Édl_O.¯ÿ˜¦ÚþJ;Þ² ~¸$€K“æ} “—@š4ùpI“&.iÒ¤]-ìß¿?`Ö¬Y˜9s¦áÊ>ú(ÒÒÒ`2™ðóÏ?ãÉ'ŸT˲ jP\`Aã8wN¼€ž¶à|5`¶j.·AåÅdÔàƒ§-èØ¾¶oßÎÚÚ€ììl®ºê*ìÝ»W]u²³³íúµîÇÙ¬©ÂnÂÒ¥K±sçNÀÓO?ó4Ä àŽ;îÀÎ;QYY (,,ÄéÓ§1{öl<öØcHNNÆÈ‘#Q\\Œ­[·bÞ¼yv}åû#­þÙúõëk4èáò§™L&(n Iâÿø‡üõ¤üÃFoÛY³f¡AƒvHAÖªU+u{qq1"##nø¥K—: t¬©®Žºô 5¼ôWëÁZ÷¿cˆRtêÔIEFj¿Øã«µÚaíÚÞÑ8N±{°gÍš“É„3f¨mðm£W¯^—Q¶qc‡c±u¨Ÿ 6´Û®Õ.$%%Ù]O¾ý^½z¡U«Vš×ýwÞQ¿6xkܸ±ZGë÷’æ'‘È%Mš‘‹x û†%ÔÐz7hÐ>ú(f̘áPV\\ì€4ìÛŸì±ÇÓDÑ›˜L>XÒ$rI“&4j#4V­Z%¯H€Û‘#G°Z­xøá‡Õí§OŸFbb¢ºoUU"##‡’’¤¥¥©õÒÓÓQRR‚qãÆ©û.^¼qqqHOOW¿B±qãFÀܹs1mÚ4@rr2vî܉ÄÄDTUU¨Éݸq#ªªªÔrÖÞÿ}Œ1B]§º/½ô¬V+vî܉`íÚµvûPÿÒÓÓ±qãFdggÛ}M 0UUU8}ú´º/µMõ###1`ÀX­Vµÿqqqظq£Ã9ðü˜=v_¶œÊؾWWWK?—4i¾4»¼wòŠŠŠ„9:üBÇZ²d‰fYyy¹f™Öñôúåc•——;œSyy¹]NQUU•z¬²²2€òØcÙÕ™={¶Ýº«yIEEEvýкìï§õ²eÏ=÷œRTT¤ö—¯3{öl»2ö:i]û;v(UUU¾ӵ¡ë¢uÑ5Òº._|ñ…ËùTZ¿Ÿ(rq} –„½@ès0^+¯=\}·ôU7Ðÿ}·ô5´ð ªÛL‚ìL³I ôYßÇa?S˜É Z¦\Û‰2>ýr±òóóíþÂIÖ­Þ:» ¶M6l›’}X (Š¢ÜuW¹Òºõ¥Gù %#£ö]´h‘ÝzÏÙµCÛa +X¯Ìl6+ûÚl6%!!Á¡^~~¾b6›5Û+++SÛ2™Lvej¾ÌÙb6›5¾ i¡õÚ…72‘ûnéëö7åÝ¿ÖÒ¤iXûЃâÎc2›†ðøð˃üN¬Ý„v¸ù»›ö3…™ìöÍmƒü ¾´„„õ³Ù -A~›Þ:kÀ°aÛ}¸–+ ­[@óµ U‹-²[ïÑã9»v–-[¦y gÇ×*£s6›Íê6‹Å‚„„Øl6õÖòó󑀈ˆ”••©Û#""`³ÙÔ¶L—²QÔý,‹]™QËÏÏwè?߯¶mÛÔÿËËËUe2Ñu`ÏÙ“È%MZ #= í&´s '&smpáñápxÈm”hÙ¨‘_Ë fä²X,*’h•Ñ߈ˆMä¢}øc¸‹N"£ãódzÙlª>%«yÉîë켨¬¬¬ 6› ùùùÇaQ»¨¨eee(**RQ±¨¨H"—4i¾4uĆFL„Z†®Œ¾°#/ÎF«ä"—P\¤@4i¾ä\ìg!ýßwK_C k}Ö÷¹<Úg೚- GXx˜.ç2_úf'îåKÎE£bôÝ-â/¡4Z˜ŸŸ³ÙìÀ©ˆgéj¸Ñ(£çbë¹ÃÇDçF#‘ÎF Ùºìo,G ¥I õÑBS˜IE,½ÑB;dbök7¡Z¦×†™{»ùc´}³>o ×°aÛ ¹"""`6›a6›5Gþè-¯5Zè ho#—¨¹¤I“ÈåÜèu¡Ñg};´ã÷£mêÃD~.þ­Ìœ«¬¬L|ÐBiBr1Ìf³êÒò=ñìuó¹økèÐ!»ùÙ–,Y¢¢‹t"ŸÈ¹¤I Uä²ãJáDk´P„jZÈEÜË×ÈÅò –Ôç"¤ÒB®aö©Û=A.³Ù¬ž#{®š¼ŠÝF¨ÇrT½Ø?¶]W‘KkÔ’lÉ’%*¿â3ˆ‰‹Q9¡XDD„ÃIä’&-ÔK3è r±íiÃ~.£æ äºóÎ;]æ\Þ@.B,âP,J”••©HÃ"[f6›íÐŒÚÅ’ïÌäbÛõr9kO"—4i¡È¹úné{y/ vÄP ¹ýDe¬kʵ|Š\Z#b¢oü@@.oq.B®üü|ŽEQâ—Ö~„\z¾2#ËCŒ¾ýƒsr±ÈÀF1ˆ"U(oË¢xk´PO¥I"—4i¹ÄÆÆêô©Ou˜Én´mCýÈ×åÏØB½·Y(!«þ¤…L´‹ä‹ÅnäOM/â\î ‹¤¹¤I“ÈåúCúzíħ´ü\„hêhbhhðoF>2ÜÈåÍ|.oq.>ϊߟѵ⑋½fÞŒ-dU{%rI“&‘Ë53¢¸k§Ï>Þ\Ze¬ÕU&²VŽS q.o!ådi•Ñ(¡ÈÏ¥…ZÄÃÜÂÐ3ѹIä’&M"—'5̤ë£"ôÒŠ|§ºjä|€äs±#a¢‘ÃPB.v¶…h––'Ñ5by‹î´]„\ì¾ÞD5‰\Ò¤Iä2Æ»ôFúØY+*¾Ïú>ºÈåïù¹Ø78«/ákärUCÃ[ÈE±ëûè"˯´ü\}Ö÷ÑР|.!ÿFÓŠi %䢬b…X,¹ø2-TbÛñV„Ë%rI“&‘˽F)t'ÎF i»Ñ¨x!«%!Šöö×h¡¿8q)ö8ã\,?ãwùˆoŽú"Y"—4iõ ¹Œ(î*……‡9Žò€\¤ÇGoq-u#O‘Ë•ØB)î²<Šþg#0´üAì[ßÙñ¼¡!‘Kš4‰\žù¹ŒFWÚº…F|eêÛ”|#>¾HÎÞÐþæ\þTÜåÏ•xí/ÊùE:žFÅ{{´P¤=/‘Kš´@B® Ý6ÀòO‹úו¥>™VÜœ/+;ÛVçÈe¤Lk¤Ž²˜Å_zT¼è7v ¹ú÷ïïvëׯ—¯(iÒDÈUó¯¬_¿ëׯWÿ¯ùW¡…ŒÍ0vF„hD×Р6Lf“n6³Ö—F³%:{c‡’†FBB‚úæÖ*£m".*R†âãµtÞ!Yr.iÒ‚¹è!ñõœÈÞ²ºÊDöç ÝB½2gÑèzm:ç’È%MZ}A.»¸Bœ§"¤ã9W» íj÷ 3¦[è/Å]ÞŸê™È47LtÞTοái›–Î<»¿7£â)Z"—4i¹\`(2C/º‚ök7¡rõYßGÕ?tÖ†?µâÆš…r9› ¸œ­õ†' ºÄÍ´æçb‘Ò]äröIä’&M"—“FÂÃì¢Ý‰hÞc=_`þ-½©ÝE²@F.ž[ñ£…l¬n»èí¯¥¡AÑîÎÏÅj,Jä’&M"—kÆŽ:ƒv­ W¢â}͹´r|ê:ÙÈE¨¤U‡åPüžõ}±œ‹?‹NôE@û‚n¡D.iÒê rW2‚:δ6úné«åA‘þä\¬®D¨çsÑù9)ÕšŸ‹U#æßþl[Ôg91ZælÞc­z2¶P"—4i…\y¡h2›ÐnB;§¾,Wt8ü…\,g¨Zšï,ÏÒRbõÙº¬‹G.Oü\W(B‰\Ò¤Iä2ø´ê —¶¡`?£Š»ïï™%C=*žY Ü™Y’e•œK"—4i\„XF£+DŠ»z| ¸¬WèLdVi–Þ’¡Ž\¢2âGÁ¡…\HHH°+£XD¹¼¡¡ÁjÔKä’&M"—kV44èVßý\”m¬åç"$ÑâjîÎ)9—4iÒ¼\&³É}äâ2‘ÝiÃÈž‰ë3ç"T!—Ö("!‚Vü ›æ*ª‰¸–D.iÒ$rIÎſŽ͹\™Ÿ+Pb µx‹F΢X$ç’È%MZÝ#Wx|øåx@ˆ»™áo ­}‰\u™‰L¦¥“Aow-ÝBözñh&-izÊ»$rI“&‘Kç) 3B*ï³¾r‘Š”ª³¡¡áäâùƒB1¶ÍæËx –ñÊ6›Íaxtb£í݉Ðq?‰\Ò¤IäÒ7W”›Dܬ†ççšrm'¿p.6º€Þnþ@.­ÑBB*_Îr¢Å³Øë@#…ZñƒZ£ˆ„þ"^å rÙl6t-**R‘‰¬¼¼\E)£œM"—4iõ¹ÂÂÃtù•‡Ç‡ G Õœ/“sÄòçh!?«}]!—?æçb‘Ä™r®ãUzµÐÁ:yÃærùÁ$rI“ ÈåŒKi¡œh?£³œÔUT| #ײeË—èœ$rI“&‘ËÀv9Y/ºB„pì\Èz~.Gųñ…z¹J¡€\ìyòçÊFDðÈÅ*?±HÀûÊøYNØ>¸Ê¹´´%rI“&‘ËàSÊèhA®¾[ú G õÚ ®åë™%YnÁúpüŹÚöêQ'ÈÅj ò9Z|<¡¨Œm“ŸÓŒE'6&ÑäÒBPžA0úMÙQ‰\Ò¤…:r…LJ£Ý„vº”±ìLqWs‘Kà¼bôF¥· ͨœË[eeešç„jZÎÎH)ʱÒB'Šñç’È%MšD.cÆf;ƒu4ÚF8ú‹sÑÒ•·Y] —·"4DûÒ[/t†ö,'b57xÎE××]Îů¨¨È¡gèÅfzkäP"—´³¢¢"äææ†rQž–^t«¥Å¹Œ —ú†ñÓü\ü¨X¨ÇRÄ;ÿ×B$Þ´býˆSiEaPܦ»È%)t¹¼É·$rI“ÈLœËY„†2qû™u’å\þÎçrÅ‚=BC¤ï 5Øùù\/–×x#Ÿ‹úÇ+Ky¹¼e¹¤Iä täRs°tP‡¸™)ÌdǹÂÂÃTT3[Hú…þÖÐp©ü¡[è-?—h´Œ´5DósQ´…–– (BƒßÏTcG/½‰\r´Pš´G.厾-ñÍÿEï®±hÓs§§àþüÿbÑS]× ú;>éWû”÷ù6 ÄýùÿÅÆ­Gñóš~jc]‡Ô>hÿ·ª/Æ?ö_¬ÿæní‡vm¢0&« ZÅGØíû«jêÂWváoãÛÃfÂA[µÝ~¬]{ÛçXõŸõ0™L˜5k>øàÜ}÷Ýjù‡~ˆaÆÞ{ï=lß¾O>ù¤C™–­_¿^“S<õÔS0™LPÛ¶mCjjªú¶;pà€¼“¥9¸l4õøŸ´«õpI“æñÃe³Ù/¯†4i¾Ð&MšK^iÒ$rI“&‘Kš´únæ´´´‚ücÇŽÅĉ1sæLÜzë­(--E›6mpàÀäää`ÿþýèÔ©8€®]»âܹs>|8¢££±oß>¬Y³Ž~ýúá—_~Áˆ#ðÓO?aðàÁ˜8q"JKKÑ®];:tkÖ¬A÷îÝQZZŠ&Mš ]»všmîÝ»;wFuu5nºé&TWW;´Ñ©S'œ?ýúõÃõ×_cÇŽÙíÓ¼ystèÐÇŽØ1c’’‚½{÷ÚKš4¯[ZZšb³ÙÔ€²fÍå¢é.»víRl6›fœœÍ:¢ý´é¬œœ»cêµÁËèùÊE..,P>l·Ñb±¨ÿ'&&õ Ž=Z©¨¨Pºuë¦ôîÝ[©¨¨P«ÕªX­Ö:éOll¬’˜˜¨LžEòMK°þ¥÷që_ïÁg/ÿ[ý]n6¼ö6úO_U÷#›|à)t?± [bú ã™R4©9†‘?ÆÛew⾎ÿQÛy§ìvµÎqKSu?-KIl6 ?X´¨öžà­ÿ„XÿÒûÂ~iÙüù@Ë–ÁÜ`Êζùl´ð‰'j®º²¹Ýgh¿gÞmƒ¿ß+ÔXý],îèyÔ«k3g³f¹~~}î{›Þ~Qw¿»îÁòµ/Ì_þ‚)í^÷¸_Xqq?\r(^š4ߘt"K“&.iÒäÃ%Mš4–þýûcÞ¼y˜6m233Ô¦D½´o†œ=‹uÿ;¦>X“&M€°téR¼üòË€Ù³gãÙgŸÅ#<¢þåûÚóüy»uBG¹L&Þ|óM,\¸<ò]»¶Š‹‹ñú믣yóæê:¬´´4µ|éÒ¥0``Ïž=ê¾|»iii€)S¦Ø]O¾ý×_ÅÅÅ(..¶ÛoÖ¬Y˜9s&fÍš“É„8ô;--Mø{IóŸy¹.\ˆ‰':Ýgéñ?Ó¤q½@.i¹ ìÙgŸELL f̘0`€Š,2ÐwéÒ¥(..¶C+š&ó‘GQÊèAÉiÒóæÍÀŽÞð&“ ¿þú«]}wß¼òÁ’ÈõðÃË+"¶bÅ :°xñbõS%%%¨ªªBbb"6n܈ÄÄD :3gÎìܹÉÉÉØ¹s§]]ªUUUvÇ;w.¦M›†ôôtµMv~^äk×®u8jƒïoï¿ÿ>FŒ¡®³û'''«ç¢Õ—ÈÈHu_Q?øs¥6Évî܉÷ß%%%xúR|`zzúeäš6mš¼#¥IóI?—4i¾²œœòºví*ÌÑ“´˜——§tëÖMÉËËS¨ù9`Ò (w,77Wx¼Áƒ;MMðÖ±¬V«’˜˜¨äää(yyyJtt´zm222jûìù[­V5A³¢¢B™]s´öáQ ++ •••^E®¬¬,du¹ $rÉÑB‰\õ¹€Ë~.g¦u°C;¹hµˆ~.úA´Œë³Ÿ«°°P|ÐBiBr­mäÒ:¡Á^7w9—Öµ¿þú둘˜ˆ®]»"66VE³ÄÄD»È ú-y_žÈ&‘K"—„¤2¯ WüÀx´}°­—r¡!-äQÍr­ËääbùEuuµf‚?8W\\œ’ÑzAA6l¨V·{‚\%%%ê9²çZYY©¢ñ.9²²²TÔc‘-**JåGZèDíº‹\Z¿GEE ''G-…Õj…ÕjEll,ºu놜œ‡¾HÎ%G }Ò†´D.}ÜE®øñê_#£…¬ŸË—ÈEoÝ‚‚ÍÑ)_!—¢(.GÅ{¹(*ž8ÏÇixÄ ²’’;Ķ#B.‘LÏDœÐ]äµ'‘Kú¹$ç Uä¢CrÅŒ·1ä‘‹E?*s†\“’S|Š\üˆ=Xþâ\®"ϹâââÜB.:ÇéÓ§Û! Òvö:°eìu£ â­ÞŒŠgÑR"W#—¯}"’sIärj|\ ç"^eŽ4 ‘K/BcRrŠ_9—ÕjU¬@æ\ìvO‘‹ä¹'¡[ýŸE.å´|`ž˜D.ɹ$rIärÍôF Ó7¤Û²ˆ%jCËÏ•ŸÚ%`2‘Ci´F µ¢0H##**J3¶°°°P¨çQ­°°PˆNÎÊœÏ(‘K"—-”Èå;äâ÷ã‘KËWÈuß}÷ yW(R>ϨLäç"déNðœËS+))r`‰\A†\¾D/ɹ$riZÛÛª£€FÕŸz®ìi7ZÈò-=ÎEæÏØB=ÞU×ÈEýòç⑊ýŸ2iDQ I´";ôKwhĤŸKr.‰\¹Üã\¤¡ÑÎ"­‹ü\=WöDú†t§Èµ.sʽü\ôf,((ÐôÿxŠ\ÞPÜ-((ðÚh!‹Ö,¯¢Q¿¨¨(u¡Ôž·c yÕ^‰\¹äh¡D.ãfDq·çÊž*7Ó-¤6ô¢âë*™²Z5¶ç\îŽRN–VŠü\äÏâGñhôÑÛ±…¢s“È%G %rIäÒ7š¡D/Ÿ‹t2ØÈw–·@‡i*Ÿ‹Þ¼@m&r Žj!—»œ‹íƒ}“ÓH ¡–V=-MCÚ.B.Ú×]ÝB¡!9—D.‰\î#—9Ò¬9ÒÇ";“‰Öha‡it‘ËŸós±~›‚‚;} _#—+Þä\ll !6å^YY©îCŒ¢7øÈ au–Ïå ó¶ŸKõ!‘K"—„‹PC.B=äbù•¹Ø‘Dgù\þ@.B/B.-ô@E.O´â‰W±çJÁ#_F׌)tÆ«ÜÐ (‘K"—D.‰\îq.B)wG © £QñþB.ÒŒ(((F{ûc´ÐŸœ‹ñÓã\l=Ñ(¢»Qî˜D.‰\¹$rC.#Š»´ž¾!ݹÕô8—¿‘«°°PÕÑàÕ¼\Fc ý©¸K#l<¡Waa¡ƒ?ˆx©V›,ø¹¼íç’È%‘Ë'mH ÐÑBs¤YÓG¥5Zhû¹D¾2öÁº½uÀæÛ‡Ô‰††¿æçr5ŸË›Qñ”·ÅŸ+;:'Ê`s¾YhÆ_DÅ{{´PË)‘Kr.ɹ ¹bžŒåŸÄ<ƒ—c^†åŸË3c,-ä2bÔ†³ €Ýƒå+äš3gŽÃ(š'ÈõüC¹L¦º-Ô+s—“øj´ÐQñÞB/SÿþýÝF®õë×ûå  ‡\Þ4/ÍkÈUó¯œ}ì,Î>vôÿ–C[Pó¯Ý…ŒÍ0fó´D~.^CƒÝ—ŸuRĹØÑB>-¤·c khxk´ÞîZ£~"ŽÃ¾õEÊP|ü «óîn„†/2‘%ç’œKŽÖ—ÑB#s"{‹sÕU&²¿8W hÅ)s6 £HÛ18W½A.£œKf"Kä Yä"„Äì>ZêOml‹ä™Éºœ‹Ì_Š»¬y s.ojųó@óˆDåüž¶iéÌS™/t %rIÎ%G %r¹‡\”‡¥—ÏEûµ}°­ru˜ÖAÕ?EhÜÞº_µâÙ‘(gst…’â®Ö[tÞ”ÏÆŽ(j[—E@okhð¿‘D® D®`˜YR"W"Wú†t»hwOb ‰‰-ô§ú½õÜåF‘ë‡~¨sõ'ž{±ë¢Ù# Ù*++…ogîÎÏÅj,Jä bÎ装¹êñh¡r%ÏLv)*Þ_£…ì7} êz“s*iÍÛÅr(^Gž-ÓB5-?ËÝeNd‰\’sIäª/ÈE\Éçâµ6ø6ô44¡üɹ† ¢¾i1ŸË›œ‹ÎÏÊåGIµ´âù@¶M-_í7}útɹê3ç’~.iu‚\Îf(q.#æ,¶ðöÖmdlaæsi!•iÕ“±…†\dr´P"W½D®øñjä…ÞÌ’ô ðy_ì¼]¬q4уå/ä"RPPòœ‹Õ|wø’¸¤¥u Hß‘Fµ®Ÿ·ý\¤Ù!‘Kr.‰\¹Ü-4‚\¤m(-$¤2¢[¸.sPÌ,iäí~.wó¹´æCfËÜ™Y’FY%ç’È%9—´ÀA.ÒÆ0[(RÜåù˜rm¾½ÖçäLdVi–1 äòd´ÐÙ¨Eph!Wee%¬V«]Å"òÈå -~'‘+ÈKFhH«3ä u ‚‚õ毙%UCƒ²E3¾h! ¡—ä\„\d’sIä’Èe¹È§Å’¯ŒmƒÖëÚÏÅ>\ȹü…\„J"äÒE$Dàãùy“]E5-„”Ȥ£…ÒÏ%Mr® ‹-4:?—?G õÊœ¡!€V[’sIÎ%9—´À@®ä™É*_b¹”744œq.æsÑYAA&§ðÅÌ’u™‰ÌŽòi¡’–úíKÚ†Zh§…\zš†"#%*oÏ,)9—D.‰\õ…sQ„†Vt‹\ÄÍ:Lëà€\¬Š”‘ !Ë5BÛQñ,Z±ÿ“òm×ÓØ`Û'4äщ­#54ê)rÉ iu†\„JFb E~.jC+²^KýiRrŠß´âICÃÙH˜·‘‹-Œ‹‹s@2¹øù¹<‰Š'u]~;«¯?He|]Bo#WTT”/$4êÖ­***PQQÄÄDäää //Ïî¸z£ž¹ ý\Þj#,''K—Æuðr¥oH7—(YOq·®"4ü‰ìruëÖÍkÈ¥ÉÇÜÉD&”¿"4$rrù½$rIä24bè ¹XMy-ÎeD+~]æ ¿"ûVûé§Ÿ„š|î"—7b SSópË-vÈ嫨BB4gþ1vD•x›HCƒê¹ƒj|¦¸D.ɹ|‚:ÒÏ¢ÈEˆäLq7~`¼ÉÁÏ{L£„"ôÓâ\þòs‘‰f8 Îå-?—3c‰G *›>}ºƒ/°°°Ð!¶ÐÓ|.ê·-”œKr.‰\®#WÏ•=Õ˜A=ÝB-„£íä'Óós±ÊŠ»uå碷zaa¡Ý¹Ò[l|!ÏHù‰EÖW&šåÄÝ\/gq€¹$ç’È%‘ËØH!CÈeŽ4 G µÚЊÐð×Ì’¤.B-_!×”/ÖÖ r‘Æ NZz„¢2¶MvN3ؘDw‹Ô'ûøã«"•3ó•È%‘KšO¯¶}°­®†e,;SÜÕã\„Pþ˜Ÿ‹¾Å)¶P+ 98—·ü\………ç”ùËs1ž—òel„½:Q4ˆ·8Wll¬!ärö`Iä’È%‘«> ›aì ¹ÈÏ8FhÄŒ7ĹÈÏå/ÎEoHQ²«Hæ ¹~øá‡:ÐˆŠŠúŽˆãP|¡–ñ#o´¿V>;£Š·´â322pðàAÄÆÆ"//Oˆ^§NÒD?oŽJä2ˆ\¾|ÛÉÐD/¯òá\ZÈÅúËŒø¹øm´ýžÔØBoq.Šxç••Ø,c~”޶Q¬}AmòèDmº‹\Zq…F‘‹x\Þâ[¹BˆsIä Qä2¡Á"‹NdZ³NR>×O?ý$¬Ãs”ºà\ÞŒ-t6‹ ˽´P¤¤¤ÄaT•ÐÁ[ù\Ô?VYÊ[È%⛹ê1ç’£…!Š\¨…:,çbù˹Ò7¤«¨f4¶póíCê$¶PëÍ(º…ÞÈD)8ÍÏEÑZ&ŠÐ`ÑÂ]Tãûá)rÉÑBɹ$rr™^›ÝEùãäy4Žn€?NžÇA[5:¶‹AßÍiAþs?ã©©×N¹EQP±÷b›6Äü¢J\ŸÜGÃÍÝãP¾ç$†Üz¢#kyÑ>޵ÃA[5æçwÂÑãçðäÂrŒr%nLmŠ„>Ÿbʘ$,[s[–ß„GžÚŽ]{Nâ?‹jýawÞÿþ³¨'’~†µoôÆc¯4DÇŽQVVX±bF?ýéOX»v-:„¼¼ùÄaûºuë™™ièáâ-¢­¥ÉÃe³Ù”øøxy%¤IóÅ€†4iÒ|€\y¤I“È%MZP™’––¦Øl6uùè£ìþnß¾]±ÙlÊš5k”KH§©ÿóK=„eEEEÊ«¯¾ªY¯°;Ž·–¢¢"—Ú÷U?õ#//Ï+íääähÖ¡ízç%¹ÈE.¼Ø}Ž5 þóŸÑ£G¼óÎ;ê_~0‘Âì6oÞŒx»víÂ3Ï<ƒœœ¼÷Þ{ؼy3FŽ©–¿õÖ[xï½÷Ôz<ðF¥î¿aÃÁf³Ù‡mïP×É>ùääåå©íïØ±EEE>|8æÌ™ƒ²²2ddd¨ÇåÛç÷ã÷7ÚÏo¾ùEEEêñ©~]¯ß}÷F¥ž/ýÕkgÿþý5jà½÷ÞS÷g·=ÚðyI“&MZÀ2.Z† ¦ Qî/ù‹RVV&?À–}ûö)111òZè\ÓôÕ²wï^§åz#ÞîÅbQl6[ß[÷-]_|ñE%##Ciß¾½K×ßèu2ºØl6¥¤¤Äéu•‹×–Ë+YYYº?hYY™òÖ[o)ï½÷ž@Ù³gRVV¦dddÈ‹YGËèÑ£JEE…@Ù¼y³òÀ(6lPŠŠŠÔíô; >\™3gŽú·¾\ʨQ£Ôë°ÿ~»uo_ÌÌL¥sçÎêï±k×.å™gžQrrrÔçgäÈ‘j9=W?ýô“O€ãã?V •O>ùD–öçñE¿ ]úK÷+ÿ{ÐG5]×ÔÔT€rçw*/¿ü²[×ßèu2²¼õÖ[êÿ#GŽT¯'=‡õåyóÇb ¬]kÃ[o/:§f3g³f9nŸ2X°Àq»Ù \¸Œ,Z(Šýö1càpܱc%KìÛyòI`Æ ñqœµ7x0ðÑG@Z@é:Ï<üýïÁK•ç>tþýy ÜÓï7Íò—WµÂ_‡hçGýûóøå`#üsd•°ýêsaˆhXûã¬ßÚ ·7Æ×œÀ½Ž|ÆÝ~ W$àì¹0t¿ö2Rëö›‚¯}eññÅšÛÍæ\¸`Á¼‡î÷¥ý~K×>„9FãÛÒ~XöÅ_p×]À²eöõ¾ë X—=ŽäLÃÓïÌÁÜ £ìê_¼4âVƒ‹-ê_²nÃóñýò§Ð)óy4mU†á§ðÕ¯âÂùt¼i ʾkw¼F€3gìûвÃ&¤f>_û[¼ô>Ú÷zÑGìÚë×7ëÖ9ž÷s»ÇáѶ‹ À„{~{ÝOn£máÅÊ‘˜TŒ%»†ã¡¤¥¨k„1‡_Â-'8íÏ´ýx¥ÕTÙ‹¸&ç‘Ýÿ7,XÞ[v6Æ÷e1ødK,vî‹ÄOÖû»mpÓõÇQðæU¸úŠjÔ\0!)¡{E 1þ,V}Ó‡Ž6Ä ×œÄ‘?`Xúï†úýá¾dŠÒND3èytíðªÏEb×¾NèÛõc&4°œÇ®}0ú$¼òŠc½·,Aë{Ýè,æD4:Ä¥ßm̘ڿ‰‰µÏçu×Õ¾[úõƒÓ÷o)ý_@‹¶[qòÈÕØôÎ êúöuSì®×¾mƒ<ºÏ®}ÿ¼úê‰$~6/Mš4iÒ‚Êd®‰4iÒ¤I“À%Mš4iÒ¤Ià’&Mš4iÒX ÿþ€±cÇ"%%S§N!77O?ý´Ó¹.ܱG}óæÍ3†®fàâ ýî Ø´Ü åRtQßì øv…7º€¸D #€çYPs¸ñö‹øác{\ŽŒŒÄéÓ§Õuªßkè|ù®÷>^Ø»Íd×Þƒþ„•+W ûçkÝݧNᩨ(\œè¯7íÞ{ïE÷îÝ1uêT(Š1·èÂ… 1qâDuýå—_Æ_ÿúWÃ÷ÁäÉ“ñ /à"N6f̼ñÆö7±Å‚ššù4K“ÂÆJ6[؂뮻S§NÅÒ¥KñÛo¿áoû/^Œüü|,Y²~ø!þóŸÿxÜââblݺÅÅÅøüóÏѯ_?”——#..çÏŸÇgŸ}fwœô»kßÂW&+øãÈEœ?ü¼) ­:(èÿ— øìM3²¦Õ æ0è 0…«ž7cØ£58²ß„¯ß«6套^ ]Ôú¢( p¨Ò„Ïß6#"ví­|a¥Óói֬ƾ}û¢¼¼\Uô/..ÆÞ½{qÕUW©¿ýö[ôêÕËn}÷îÝN¯ëMçΣ*¬o6r¾K׉ì«›Õ~œ>}‘‘‘øüóÏÑ¥Kœ? 4ÀùóçѰaCTTT`×®]šý(..Ƈ~¸ãŽ;ö¡óŒ‰‰ÁùóçѲeKœ>}ÕÕÕ˜?>Z¶l‰Ï?ÿð÷¿ÿ;wV¯ÃÖ­[qçwj·Gøõ×_±ìR|úóÏ?É“'kÃBÒ¤I n3PˆqñöÄOàñÇ×mdÖ¬Y˜9s¦Ã—ò„ pÍ5× ::&L@uuµÛ´°Àì“§0#:J ƒ|óøÓ¤1Þ;~#š4ÁÊcÇqO“Æ8c2aÒé3x!²‘SÆEí’­ûß1À†† ‘RSƒhEÁ=McÀСŒëÑGEJJ rss2 1®.ý/"þjk›‘]P{VÅ—‘QËËËÃܹs¡( zõê…»îº 5„ \j‡î“9sæhÖ'ÆïöpÂ%&Æ3·ùóçcêÔ©x衇ܾ?{õê…ôôtõ7Ÿ;w®°=þ9â×õF4Š‹‹ñÙgŸ!::/¼ð&MšäÕçKš´`c\fß}÷RSS1nÜ8ddd`È!èØ±#ªªª0iÒ$Ü{ï½HHH@||<ÊË˼ÿþûqõÕW£yóæ(//W¿€?üðCŒ1.\@Ÿ>}ðé§Ÿ Ìo¼cÇŽEûöíѬY3»ã<~òn9wjjð^DFTŸE©Å‚agÏ¢€ë.Ô kÍ\qñ"ú;‡ágÏbzL4þ}ü¤ÔÔàˆ ‹-Š+Ú¿¨ ÔbAÊ…ŒnÒÛ-Œ©®Æ“ ýÎÃ3{ö8ô÷àÁƒ˜;w.¬V+ˆŽ;¢yóæèÔ©6mÚäp^ô7!!S¦L±[]×ËÀu&?6¨"bJdÙ58¼Ç„«S4»BÁéã&¬²Zìú;hÐ Œ1=z4 „ššdffbôèÑHHHÀ–-[ÔýSSS­Ù¯1cÆà£>´iÓåååHHHÀ† ÔúË—/ÇwÞéô¼è>Ùºu«]ý_|;vļyó`µZqÏ=÷ aÆøç?ÿ©y½Dý}ä‘GлwotëV;ag»víP^^ŽÛn» ‹}ô‘æýi¤ÿmÚ´Á!Cpà 7 !!}ôÊÊÊ4Ûkݺµú5kÖ ‡ƤI“ðç?ÿê}tñâEÍãuéÒÛ¶mÃwÞ êÌWFŸ/iÒBÁ~ùåmÆU\|Yq`âĉ8zô¨Ã—ï£>Š-Z8ýBÔòM¸ò.ªçŒöêÕ “&Mª}‘gg¸ì³kÚ´©Ó/w= ¿èøôE¼„—ü&Mš4i^g\zñîÝ»<ðNœ83f¨ @õuEFFbëÖ­˜?>–,Y‚FiúhxßÄ‹/¾ˆŠŠ ”””àË/¿ÄÂ… 5}Y|½ââb|ûí·HNNFEEÊËËñÚk¯aÕªUš>‘mÛ¶©SÅ—}vqqqX¼x1ª««5ËûHŠ‹‹Q^^ŽöíÛÛùú6lØ yüÊÊJìÛ·OÞYÒ¤I“æ3¡v>'ÜvÛmXµj•¼"Ò¤yÁŽ9‚¸¸8‡í¢TÚ¿ªª ‰‰‰ve+V¬ÀСC@-?räV¬XqãÆ¡ªªJ­Ÿ˜˜hׯä’@gII âââ0tèP””” -- V«U]/))Á¬Y³`µZqäÈ :+V¬ÀéÓ§Õv###‡7:œ {VU]ÖÀ¤:Ômc÷!ËÎÎVûDåééé8rävîÜé´.¼ÿþû˜6mš°œ­;`À :&L@rr²Ú>•­]»Ö®nzzºzÎZçÄïCçÃŽdñ}]¼x1Ö®]«Ÿýý"##5Ï999Y ¶¢ãÓ¶¡C‡Âjµ:‹ÊéÞÑj—=ggývö»òe;wîTÏÿKý¢ ºE×õáÊ<.iÒ¤I“t2õÞœFŸŠ€_ww¾ÑÌ´ðóy{ ôóre #ûëõKo¹õÖ[•Ûo¿Ý¯ó#ùc:oõÓÝë«W®··®;<½û‘ßßÕûgDçéÖý¯×?ºŽ¢ùä¼q~Á¶„—g®¸$¿L3ðÒ̸´fÔ¥{鯧¦7£²Q#jËÏ$Lë4S2ÍÐ,2~ÆaªÔÎ ,² |5Í„Líºjv^üÌÑô;Qøz´ÍMÆî¿gÏõ¼È®¿þzŒ?^=^‹-4ûE3<ÿù϶+OKKÃǬ^:_º¯½uÿò÷±è¾Õ»¨?thþ<ézŠ~'þ:S»Ô/ê']_þ>ã7þúòõÈøûŸ ‰[Ëè¹§û½ïØû“¿ùó¥þÑýB÷ÿþñ3¢³õÙ~i‰8{ž¨_üsCF׋®#_﹫7Œ«ï–¾Jß-}•VC[Ùýå·7íÚT onWæÉBèÙýýî ÛÚÞñŸJ«?µR(7w³ZÖ¤K]TN+J³k7u^ª°=¾ë¨n§u½~D^eü‹ëöÖm”»®j«P¶ ¾<ç Íãîë¦m´ë³ÔÒ¤¤={ö44I)eÞ¼y^-WE7nœÒ¯_?å™gžQúô16rzúbÅd2+½z½¨´l™¡X,E©• Q(ÙÙ6eР JR’#óÈÈ(RZ´3 gå©©y†ö÷Ýwݺ>î^WhÌô;þ|åå—_V6lèP¾qãF»vÙö /++K=ŽÑþ½ýöÛ µ_Ĉ:ä´íOÇ1ZÏÝ…Î 'ñ¥~ã"†e³Ù\š©™gf¢úüõÖêo@0®S•§pUuÏ6 IDATfÿùâ~Ûð›ú÷dYí¼L´ÞêO­ÐâÖ^GÎݯìF›ûÚàç?ã‹î_ ºc4 ®oZÜR{¼„¬üøÐ¸fú5h7±Žÿ÷8Zl‰k¦_£¶“:?Õ®Ýóÿ;È«#Õv®¼<©"ÛßíÛŽ3ûΨý u½~œÞ«ýÅÕ!¦1ÚDEáÚ&Mk¿oŒ&—rËþ|u;ä~û5¿¾+¦^× [?‚;®lƒ™×wUë¿Ü£O~Ùì>yÂ¥ýËÊÊдiS̘1ß}÷º®gwÜqî¸ã¯•§¦¦bùòåøì³ÏŽM›@ûö£pÏ=ûѾý(|ðÁ(((ÀàÁ›‘œü ø©©yˆ‰i‡Îó±ÿ'HJÊÆW_}…… bøð2´l™Ã‡¿Æ·ßÖ&šßrËef5lXí—ùo¿mFRÒHŒ7kÖ¬–'%åØÕÿí·ïоý(µüþwß]û¥~ï½÷j2½ëãîueüW_}5ÆŒƒÝ»w£AƒX´h‘Ã~O?ý4zè!µ]¾}Ññ¨}º_è8´?•‹ìwÞ»~=ZȰ¨=ÚŸí—³zž¾"£~ã"†øøx•ѓ㳈™ýõ¯E||ÜmÆ¥µÄŒWÚMl§\ûĵŒKy¹Ë¸^ìÞ[s{(1®„„»õž={ºüÅ,—#ãZ¶l™Ãþ¢óðã"E¿3­‹¾Ä׬Y£É°øíF{BB‚ʈˆQé1&ê—3æ”àÐõÏ׌‹?O½ë/W€2.ž!…YÂpÝS×Ù•¹Â¸¢’¢ÐèÊFê_bN}Ö÷AƒÆ ðËÂ_Ðò¶–ŒKļ¨wײªÚ¯b\ÄÀ‚qñ_À´NL‹ÿbTƵk×.L™2%`×·ß~‹‚‚üú믚Œ‹ÎÃ׌‹~ObP<£}‰ÿöÛoèСƒCûüv=ÆEFŒˆo♂¿™“«FçÏ__‘7;wVERÔ)EÉR9=wÔ.1'žIñLšï­ó>Fbª´~/þ|h®ùu:Š¥už)Òv•q‰¾øh Ì3 äô$¯ÇÈ—:?öêî§\ä"¹È%Èò¸øè¡Ù/X-ߟg@ÈÉçƒå¿Ôùãòc¯¢þJ“&Mš´Ð´€ñqQ4å[ÍŸ-üqh]/ª|]lt£'>®w3nÑôy»K+JŒÍßÒó…@F… \^Ìð>þ¾à£ýÜ*Ô‹b-èN>{<ùÆø|7h9;®V^™«QŒ¨/Q…ÍGùVFó§D>.>/ŒÖõ¢ É(ºÑ]E={m£cTù¼‚ÝÇʼnóù[z¾O}X¾öqÕ÷¨Bþwåó·x _ðÑ~îFŠ¢i~Èh>–³<*øÆø|7‘ùjD‹÷yñ׃߮烮wŒ‹˜Ÿ7£ ‰1ñÇuU?0Þií‡QÆ…Ìãb¿ˆù¨BQþd\ÁÁ¸ˆ9±¿ïüùó…Ñp<c׳²² G²L‹î'g ´¿«Êþf\ÔO>úR2® c\ĬxÅ O£ ‰1Ób£ µ¢ éxTÏÕ~ˆ¢ yÆ*y\¼Ñ1U(Ê¿ ÆhÊƸˆ9ÑïKE Š˜ŸF_òF£ ©ÝO"… þ8®*gø›qQ?ùèKɸ‚ÔÇ¥•?åŽrùÈ´|^"Ÿ™Ö~pQ3Qæqy–Ç¥÷E-ó¸ê†q±Œ™UzÐcÒt°‹3¦Æ3w>_H¯ž+Ê¢ûÍŒK‹¹8»ïg̘¡¼ôÒKºjõÊÓO?íÀ°DùYz¿?Ï`hQ…šÇÅš+Œ‹|d¼r†ÈgFFûóÌϨf¢Ìãª5wó¸ô4ÛdWÝ0.b̼҃ˆIó_èôW©ñZˆ|¾^=£Ê"fá/ÆE×èVá“O>‰áÇ« ŠW«'UþåË—#77WÝ–(?‹Ææ£¶y+ò)ʨÂKQ…äS2Íg4ª£Q…F˜š;Œ«tÈpeV—BŠqñ¾ ^^/Š,”|\ééén1®‚‚Cûû›q±Ñ|¼òû»Òvö>`™ïë1Úgz¢¨Bê?ï;ÒcN¢þú+ªÐh”¥«¾%Ѽ]¢í"&F×ŨrI½*$Ÿ’Ñh>£Q…ԞѨBž¹UÈ3®Éß‹ªS'C†qñ¾ WUáCÍǵqãFŒ;ÖQé1®¯¿þãÇ×U‡÷·rÍ'òuÐvºxEÞ×Åß?ü~<ÓERÿyß‘sõ×_Q…z¾-2Ò$$ß1,ò]±ýܳgüa¼Ö!ùÄøyãx&F×Åh?ë-ã"mAO}\ð0‹˜õ‡ÖÝe\¥C†+¥C†‡\—(JŠ—VTX(0.EQ”ÿþ÷¿u6W]«Ãó>(Ñ—;??–Õc™–(Úí«Z…þž‹÷ñùÕã2Ú¿zϸH[eZîø¸DŒËh1?ê­»ëãú[ɤ¬Zry\ü2ý%ÆÅG…… ãúüóÏ‘““ãsW 0.>_‹÷A‰˜??–Õ£ã‰êóý1ªUXWóqñ¾C=FSWŒËhÿê=ã¢íÅGŒÇUÆÅ+p¸Ê¸D>/­zΗ( A>2&Š"tE)A2®à˜™WHEÃñóLñû‹î­zZù(O°¾Ö@U‡‡`Æfɸ‚”q#¢(>b<®2.^ÃUÆÅG#’ñõôåo…Ú È|t˜(ŠÐÕ/5ɸkdQ1â£õö׫Çç’ñÊZyb¨Ï3.Q^›d\A¸À)^xUÈF)‚ÉÇÒc\Zóxy¢œA +T}\И7‰õq¹:Ÿ’d\ɸx_•žrE¨ç«r·ž¨?ΗV”¢+ù_ÞŒ*ÔcT’q8ã"¦ãªF ÈÇEÌ‹ÏÇÒc\ü<^ž*gà UÿÅÆû¸Œ~±IÆXŒ‹7ÞW¥§œÁGêùªÜ­Ç÷‡½/µß®ÖL¿¾djüˆ„žX2® ñqÁÅ™‡¡3218gÑÐÐ,äÛñV׋Ý{‡ãÒú"ÓšU2®àŒ*ä£ E>'‘o“Ú3ªUH_ü¼*½S£zz̉gºTä«bÛç‰3¥Ôèú¸ø~ûš©ñ×Qæq)ã"†ÃGz:—H^UÈk$zËÇÅÏǪZ…|T¡«jÒõqšV!ÿ%Îû„DLšßÎG—Š|UTÎ3=¥‘½Q—–Bˆ/™eWû¸È—ÄÎ\lD•:Šp1‹ícÇÇ:ªýñD«pV—B6K닱gÏžB•ð`g\¾š+ÕáÙˆEêð¢(?jŸÿ«w¤2®Õ¿î«³/›cçÎ }\ÑÑÑèÑ£¶oߎ¯¿þaaa0`Š‹‹QVV†­[·">>Û·oÇÑ£GÇjµb÷îÝØµk—WÊ—/_ŽÍ›7cÇŽøá‡°hÑÄKyR«Q]}¯¾úRRRó ÂÂÌHK›ÈÈ´hÑQQ‰8|øk\}õp¼ûî?°råJDF.ÀÑ£?"-í*Œ?55W K—|ìÙ³LeT§OÀÏ?¿„¤¤‘>¼þõ¯aéÒ¥šå±±íꇅ™qÅ}±zõ+hÓ¦ š5³Úíß¿ÿ‡Ø±ÃŠ}ûþƒöíGáèÑ]º>®^wú}gÍš…Ý»wãÓO?Enn.JKK†/¾øBe¬Ùl6dffâ7Þ@XXFŽ‰Ý»w#%%C‡Å-·Ü¢y¼bûöíxüñDZ{÷nLœ8Ñ'Nhöö_±bÂÂÂpæÌtíÚ¯¼ò ~øa¬[·NóüŽ;†˜˜üøãÈÍÍÅõ×_ï´ž·Œ®ÓêÕ«‘™™‰ï¿ÿ^s¿9sæ`Μ9¨¨¨€ÕjÅ[o½…{î¹ÈÏχ¢(ÈÍÍźuë°gÏôïߣFBûöí‘››‹Æ#77?ü0F…×^{ f³×^{-òóó±lÙ2»ëߺukØl6œ9sêv½ç·Þ3.ò1æ-Z>3#Q…”·ELËSÆEJüìŒËYžMÏž=íX(ù¸ô¢ ÓÓÓCÊÇÅkj1l-¿êkù¸X¯¸ÁçuAGµÞÝù¸êJ>Ðó¸Œ*ßÔ[ù’ÈÇd4šOUÈûªh»QuxšÏ‹þºëã"¥ òqQ´a°û¸Dy6äÛb} ¡äãÒ‹*ܸq#ÆŽëàà 6ùœx­@>ߊŒ÷ñ>+ª/òqQ?xÅ >¯‹7>zÕè|\|ž¡¿}czymâã2ª|SoïSò”qÁ…™ŒõÃSå póq… ãâ™ϸxF&WðªÃ³3óLòúô—³zzJ"Õú@UÎàûèQ…’qé1"b8î2.¾=½™Œõúá©r?W¨0.žyñŒ‹gd’q—:<Ϙø¨@ÑïÊçõe\¢zzJÎTëQ9ƒïw GJÆeÐÇEÌÈYÞ•/£ ù~nt%+”˜|úËFz;º-У CÕÇÅG÷‰|Yîú¸xߟ/&Šn)szW°Ì€,—A™(ïÊ(ã¢|.WßÖÜQÎàó¸B…qñ_Æô——–’A(0.½<®PõqñŠüº§>.ÞwÆç‹ñùDÔ¾3eŽ@Îã –%ãrqÅŒ÷˜qËÇ"Ÿ™­B–©í‡QÆU:d¸R:dxÐ3.úBc}[¼b}KWpk²Q}Ęø/q>º×åñ>,Q~˜¨Ÿ"F,ʞLjŒ+ ó¸RŸKʼní'`[cCéôRÝü)>+*) –( jþ¨©Í»²Îý~-´D|f<Êž*sšÇEù_5'këŸØ~ÂP?Dy\y)×£êÔ)„›Í8r¶{OÄ”ï¿ÃuM›uåwìß¿_ýŒ‰‰Á”)Sìò¸–.]а°0lÞ¼Ùéqê*kÑ¢E0›ÍhÜøqCy\QQ زe*"#4ó¸6n|cǎŤ8Íóâó¸Ìf3233Ѽym>YŸ>¯DצM›†>ú™™™hݺ5†Š×^{Í.ÿhذa:t(žyælݺË—/Gnn®š$Ê úå—_››«æ5}ùå—¨¨¨PÅWØåkQ?©¼¼¼™™™8qâ„Ýþ‰‰‰~ÉÇr×øþjý.¢þɨB.ÿÊhþ”«‹Ñ¨BWóÉDŒë£[Ø­?›Ö]i’ÊôeÈÎÇ¥§~j>®PS‡ç}Qz̈÷UiµïÌ÷©¥…ÈWÄXhêW°¨ÃzT! æaÖû¨BÊ¿2š?e4ªÐhßwÕáÕ/Ú¥Èmê㲄™0÷Æ!UÈÕóóqé©_‡š+ÔÔáy%Eªç«¢öE†üqDZˆzóÑþl¿Qž¿žU¨¦¬^½Zéß¿¿ºÐúO?ý¤üöÛoveÞ\yÜÙŨVa°-®ªÃ³_u©ŸmS’’r.Ï€¬Ç¸ü=²§õx¦¥§†Î×ÓÒ”>.ɸÖÇE‹;Œ‹õQñŒÎˆ+~`¼f¢'>®w3nÑœŸ+Ô´ Ù/béã M«9¨÷åÎûºŒúªøýxõw£õ]žŸñY2®ñqÑ_wù¨ˆÁ£ÓóqõYß 7pð•¹ëã:zö,ÚFǨŒ‹æç vÆÅû è‹Xú¸B#‹Ï7â5E”ô{ó Iä«ÝOd¼ú»ÈÇ¥Õ~ «ÃÓñ%ã rÆEJTîé|\ÔϤô[/<>Ümå Š&ä}\¡Â¸è‹L¤˜¡7’d\ÁøxÍI‘ <Ë\´æcÓŠNÔó‰A ¸ÁûÌxW˜«vïoߘŒ* rÆEJ¤ ïé|\Ô1.bRzŒ‹Uìà¶rEò>®`g\|ô—H1Co%ɸ‚C9ƒ˜ 1^^Uèê|lü}Ã3"žQñ>3-µu#ʼOMFJÆeˆq£@ÍÝ[Q…t\£Z…´¿Ñ|2£y\ÄÀB1ªÿ¢f˜¯£¯¼Í¸Þzë-¥_¿~UèoÆ¥¥EÉû¬àDÓPÄØô|cĤô¾üyFBõŒú¸øYüŸØó2¢Ý(W€1.–Ѱ ÉÛ3 “3ªUHûÍ'3ªUH ,T£ Éxfô‹;P×Ê•+1vìX¿GãÍ¥ç³"Æ%blz¾1bRz_þ|ô!µhÄÇEjz›ié]Gɸ‚$ªt—qñí¸Â¸ÂãÃ}¦ì>.þ œý2ã–3_ˆôq×|\ô{êíOŒIäƒ}Á‹êéù¸x_ª+y\ìµçoW Ï€,—A£h@oGe\džªÃ‹”3‚ÝÇÅÓ—ϰô|!ÒÇ>.ž)ñjï"¦%òAé14¾žž‹÷¥º›ÇÅöÏŒ‹÷éIÆÄŒ ñ¥ç£“%šÉØY?`PÁÙ:|ËFBÖÇÅkÄSÌóq·‹Õ›W´]O9ƒýâÏÊÊÒŒ*tæãâûe”qñÇ•>.ɸ\2wçÁ1.bXZël{zý`ÍY¨ú¸x8^1CÎÇÜ>.>z”ÖõæÇâó¬ô”3¨œ˜U¨wÿiõËsâ+}\’qy¤UØýýî>™ÙW‹Q­BòyI­Bɸ‚qyZÍç"æàŒaˆê=žÔ*”ŒË¯Œ‹×*ÜýÊn´¹¯ÛŒËßfT«|^¡U(µ å|\Z Œ˜‘ÃÕ3z<©U(—_1+^é¨F ‘¨ÂøñNó±Ø~ðý£~yâãb—Ò!ÕÒ!ÃCŽq‰¢ ¥+¸ŸWÅjj1Þ—Eõé>0¢]IŒŒJiòyXF0ê*KK£Ðˆ’ˆd\ƸˆYñJF5õ¢ I1C”Å÷ƒ|aÔVIÃEãú[ɤ¬Z2Œ‹WÒ࣠¥+8¯áG¾)òeŠ¢áx_Õ§û@o>.bd|TªHƒÏÃ2ª€QWy\F5 %ã ²¨Bo1.0*ïÐÉ Ó[<‰*ä}\¥C†+³ºÜ²>.pÊRÞ»y\u1ï“â£ñôê±3!™‹m@/Š‚…¥K2.¿Fzʸ¨bZÔž(/L¯žFò>®Éß‹ªS'CÖÇEFÌKªÃc\Fó¸ü5Ï€øè>£Ì‰?Ž(ªP4Û€^£(ZOú¸$ãò ã"†å-ux‘&¢žrõÈoÌãz6­»Ò0,,äf@f¿œéËšõmÑ—¤d\Á¯¯ÅxDõx߯¼a”q±û%$$8­Çj!ê1.*çÛ««ù¸ô擌+À1,OÕáy­A^ûPO9ƒú¡ç3ªœa 3aî=Bfd^޾yß}IJÆå]Æåoïëâ_=߯¼a”qñûñëüþt=ÆEåÔ1ŒºšKO=_2®g\|—QßR ,F}\¡Â¸Œú¸Œ~±É¨Â¼€õqyZÉó¸xFbÔ§FûK—d\u’ÇeÔ·$Š*ô·õq;ãrÕÇå­±~Uè_—·ëé©Ãë1=æÎ3/é㒌˧Œ‹ò­|Ÿ(?ËhT¡ÖÌÉžjj-¡Æ¸Ø/6Ö×%}\õ‹q‰˜’QÆÅ+e°ùcΘ¯ý'b\¼ =\œÇËӅσ“êðAʸ(ßÊÛŒ‹|]”Ÿ¥UHå|>™§Q…|­‡ ãâµèx_—ôq…ãâ}^z>.ž)é1.^-Båñù‚zšƒ¼ =1 £óxyj|œT‡—>.éã’Z…>g\ÙÙ6eР õ.ªÐÓz®øªàDÃh¿¤K2.éã’>.—¿àƒE«p×®]˜2eŠaÆuøð×øöÛ¿†|T¡·™šQ_•ˆÉ»£À"}\’qù”q…LJkú–àuxQ—t×ÇõnÆ-š ,=Ö³gOCy;ÒÇ3 CGQ:3d³3‰dg6Ö«ÇûÒ\a\¬Â‡¯™«z?þ|]Eɸœqñ¾%Og@æ0h]”ÇEy_|=wó¸ÈŽž=‹¶Ñ1!;—h Ÿ—(o'P|\®2®ú:2ïãùªD3deX¼F¡žbÏÌŒF:;_25:ê§ÞùIÆà>.^9Ã(ÓŒÙhA=å RØ &HQÞRÎÆ¥å{ÐRÎðÖ—¿Œ*¬;Ë€øƒáDaƒ­Gëzш<Ñ›1™Úã£õô˜]诨BF$ã å £L‡g\ü Ƽʻžr«ØÁF=ºÊ¸DÊÁθD¾‘r†Þ ¶2ªÐµ¨B3.žiͬÅ(øz´®È+tci%R{ZªõΘ]诨B¾ÿz>?ɸœqñLÉ[Z…ü<[FÕá©FUêEŒ‹f¤2®Õ—ãA{ IDAT¿î«³/›cçÎ9-/++ÃÖ­[±téR„……aÀ€(..Frr2¢££qðàAõkÑ™Y­VìÞ½»víòJùòå˱yófìØ±?üð-šˆöíGaÀ€Õ¨®>‚W_} )))ˆ‰yaaf¤¥ÍFddZ´èލ¨D>ü5®¾z8Þ}÷X¹r%"#àèÑ•€-[¦"22]ºäcÏže*£:}ú6n|cǎŤh–ÿüóKHJ‰ØØÎvåaaf\qE_ÜxãÓˆŒL@Ÿ>¯Øíß¿ÿ‡Ø±ÃŠåË—cüøñغu«K×ÇÕëN¿ßæÍ›±uëV|úé§ÈÌÌÄêÕ«‘™™‰ØØXlß¾Guz?!,, M›6ÅöíÛqÓM7aèСøÿì}xÕÙÿ¿Ù„`xUP bDÄ** *oR_(E¤ÖR•¶*¶ú€ÕGПUQ[[ªR­ZÛ`幤ÊElmÄRߊ/UÑ‚â#•T@ A1´Š‰B’ýý±¹gÏÜ{ÎÌ™ÙÍîìr¯k®ÍìœsæÌ™ÙÌžùì÷¾ÿô§?ª·~ýzœ~úéxë­·\õ&Nœˆ÷Þ{uuuÎuÖ¹sgTTT`È!øÝï~‡Ù³gã¹çžsÕ«¯¯wõkÓ¦MžõÒëm·Ý†?üO?ý4V¯^·ß~Ûøù:t(F…;KV­Bqq1{ì1Ü{ï½Ø°aî½÷^ÔÔÔ`íÚµ3f ~ò“ŸàÉ'ŸÄ¸qã°víZ×ñ~ùå—¨¯¯Çºuë‹ÅÐÐЀúúz§_;wîD>(r3.šiÙ²%Xd@V½èǸt¿2ì9±gZ‘3ÎîS^°¿*ÔýzläÈ‘VßÌ qÆUh‘3¼fJ6™{uõüfê¯üt¬Ìfæ`;ã Z/S‹îW“¹œqåÓ ,’ù¸ˆ1Ù²%Ó¯ ©>÷…ù1.]ž¢Ä‡ýUákg~]KK öW…ü×cĺ8C(ÆÕV>.b\Ô¨äãâ ÈYò¼ž_ä ¾³2Û_=Ú2® õ2%Û_MÖÔÔ`Ñ¢Eë"FE³Kz­©©ÁèÑ£võÆoàâ‹/N9^bX4n|=_é È&&ÆÇåÅÌÂÖ “ûYtx™q…Ÿq=ñÄ‘‰UH3'*$sr62 s_T¡DÎWže@¦OØ_òöLù½üúa›L"g¸U¨³5ãÚ¶m[$f\ü×}TÞ6s2ßO[e@Öù¢ !r†Ì¸òdÆ•)1-Þ®ãâÑêÓq­›|^ü¶Á'ìŒKƒNe\¶ß(eÆe7ãʶË4cöócñrAgj|†áõëTŠØ¢²V¿÷£Ñz¶fjº â2ãÊãWº>..>ƒóc\Câ¿2ôûU!¯Gåýf\´Ý/Va®òqñ¨üª0Ïg\4â±m#VØ2.¯œZ^U¨ÎÀ$:¼}¾$u¦µ¿EÎ(´Ÿ¡Ðù4WÛä3,¯—Ê~z÷îíÊ€lš¨Œ üXª-y¼z÷îmýDBf\›qÑLˆÇ4Í‚2.ž ÙoÆEL‹ú‘®«Ð£Ã›b¦“GIf\Ñ™qñ OÓyål“fL¶>.þ«CZ÷›p&f;sÒ1»lþÑ̸"θø¯ù2áãRg\ÔnÐ_Â2/˜mäŒß ?¥àòqÑ7h•mÑ7òBc\?^ùlü»ýn¿™qÑ7q•!ù±*>SR—°õ¼úÙ»wï” ÍÌI1[3.EßTnĈ®èîÔ?>£ 2Sc‰š~ júu¨Ì¸|~ÍÖÇebfÔnÐ_Úæ³œñÄÖ âW…ü4g[ô¼ÐWíšw°âgó ~ÆÅ3ÓùôcU|¦ÄÙXØz¼Ÿ<‚gc~3'êŸm¯L‰GÑ7iÕªUøîw¿ëDw?þøã1sæLgFtƳ8ÐŒ‹3?¾öúÚ¯~UH¿êkß³}èϨLìÊoÆ¥þ‘ú‘n¬Â^ee)Ñâó}ÆÅóqÆEßœåW…ùíãâ¿Úó‹jÎ3ür&ô׈~õxÔú 3.h"‚DqÉŒ+O~U¨2%R˜ϨLìÊoÆElú–qQ>.͸î]¿?8ò¨¼ŸqñüGœqÑ7gùUa¸WT|\ü×~œ]™f|¦æ77ýªÐT¶ÓþxìA¿™“)"HÔ—̸">ã2e,N'÷qÙDΠ_fŠqqW!2.õ¤úÍL÷Í.ì’í×âÅ‹ããÇßïg\´]IyýºM—?K³Ðö×s6¿vãÑämòqéfŒ¶õ2±¨üÎæ×|ÔšyÑ *3/¿(ÿQûµa$f\~‹Ãθ¸Ë6rýú0SŒ‹û¸ …qù}ƒçßìü~ÕåW.Û3®§žz —\rÉ~9ƒ¶ÓŒF÷ë=Ý ÂÄpüöÇÛçÑßM¬J'Ý̉³YšQøÕË´è8ý~Í÷Úk¯aÑ¢E)™Œi•îÌKý¼¨ãõ_FîW…|Æ“)Æe;ãâ¾2Û_7zÅ*\7ù¼_W!þªP÷MNbÆŒ‹û©Lø7tƒòbcôÊcù™öÇ•m ]ŒÍlθü~M˜«W”ÙV¤UÈg<™b\¶3.î+³ýu£iÆ5wÍ›8öÏËœùº íW…´Î¿ÉI¬Â˜qq?•)âŸ!qåÇÆè•Çò3í3*Û<Æf¶g\üs•WÔÙVäWØÈ^‘8L3'xÄ*LwƵ¿åãR¿a\~1ÛöGÆ—n&å•‘XÇpxL>› ÈœÙäñR#hD-?5fa”ŸqÙÆRÜog\™ŠœaŠÄaš9™~Õ4/˜äãrs¶e\¼Þþθ¢9ƒ³&¿ŒÄœUñ˜|¶92åñ2±£lÿ:ÐO|ühܣƸøŒËïs¹ßθhÇL7r13>31.Ú?Ÿ©!ñ ï:<^‹ÜŒ‹û¸‚~cËÆÇãï¼óÎ~“™ûõüÎ'}cç1ùŒÃfÆ¥2([ÿ—íŒË4³h뙚î8lXW®f\ò«BƒhFÃc¦9ƒ˜ŸÁ™íŸÏÔ2«°$V„»†(˜÷Ûð™–í7¶|ñq½øâ‹¸ð Û|Æ• Èܯ§óKé~UÈgH|Æá7ãâ ÊÖÿe;ãâyò•9™ï×/rF®g\QüUa€øGŸXR]‡éßè›RhÁCðß—ildÆÜ5xøŽ¡)ïÏùå:Üyݱ®÷.ûÉ;xðöÁ®÷h¿~ûщÚûÓscÊé‡âãú/qhÏð¼wñÛ[·jçOÏ}Œ+nyß™Ô þ_²Ï׉+o}›·5bé½ÃÐÿ°¤¡xÒeoàéGÛ¼x^³ó÷Í7ߌÛn» ÇwþïÿþÏUî†nÀÏþs\|ñÅX¼xqÆNn·nÝðé§ŸZ—þùç­ËN:;vìpurÈ!Võz÷î>ú"‘HVÅnyøµX³îsìÞÓ„Íu øÞuo'Öšð‹Êpîé‡âå·>Ņ׮ƚuŸcò×ÿ¤ÖoÚÝ MèÓëô?¬#Þû×èÙ½½óþm÷ý ‡÷퀇'f.C¾¹½{€ÿ·àŸ8áè®XýÞN<üd-zÜo¿ÿ9Ž;ª ^~ëSüpÞZ´´·Ü[ƒë¿Ä)C»¾ýÛxü™pÞÄÞ8òëÏãžÜŠÞ=ÀõwýC=CŽéŠÝ{š°e[zvoI§õÂ#OÕaãÖ=xøÉZÜ|ïz´´'J|»¹èÚ5˜zÆ¡8æ¬1ôØñÝoôE<t(+FÏîí»÷4áÀ.íеs;œ7±wê wròFôÄð_cÏ~'Ý“§ÿ'NÄe—]æ|‹Y±bþøÇ?¢gÏž¸á†PUU…W^yçœs6n܈O<óçÏÇ¿þõ/lß¾0~üxLž<ßýîwÑ£GL:'NĬY³PUUålŸ;w®«^ccc ‹aÓ¦MÆU§NP^^ŽúúzÔÔÔ`õêÕxðÁ1dÈL:³gÏÆsÏ=øË_þ‚Þ½{c×®]¨¯¯wµÕ¹sgìÚµK>y"‘(½ýsÑV‘H$‰¢¤˜ H$‰ònÆ%à ‰D"™q‰D"‘H$3.‘H$í÷3®úúz¼÷Þ{¨¯¯G}}=êêêðì³Ï:¯õõõ8óÌ3Øýx£´´ƒö,cÊ=C?o«‰m¿­ú™©ã ÛŽßq‰D"Q¤o\ü_ii©ë8 ዪ¯¯wþé‘ñðG?ú~ö³Ÿ9e÷îÝëÚ®ûgÙQI®Ø¯_?çï/¿üÒÙIgpìÚµ«ïUTT¤ìW×>•Ó•·égyy¹v¿Aûáu¼6íÐ9âåÕ÷Ÿyæ«ã‰D¢H‹Â£|òÉ'ñ¿þõ¯ñúúúø¤I“\¯S¦Lq…Û3fL@üÒK/ˆŸtÒI®í‹-r¶Ň ⪷xñbWù .¸  ¾páBmxÚ_f̘ájôèÑqñÓNK„X?~¼k¿¼}^Ž—·íçôéÓ]û§vøº_?fΜé:Þ3f¸^ýÚ9ãŒ3\ëTžÞ:th¨ñ—EYd‰ÔBÑy$gu³ª-:±råJWûmµŸtÛÏT?3uœ™j‡—,²È"KÄË@«2X]Ö¬Y#ã`1> ÈÚ>ûöí_²d‰q{iii|ðàÁYëÏ©§žšÓýgâº]¶l™v\·nÝ¿úê«­Çßvœ‚~‘ŒÂ¸î‹ëçð£Fò|¬øýïßù{Ú´i˜;wn Óe_Ó¦MKad*»Ò±·ýq|:vì˜ÂþÚj\ÊÊÊ0}úô´Xp[*×û§ó³—Î;ïí;þ'M½ ¯,þ-zíE|ôþø”ýýêWÀ5×$ׇ;Þø†{3žàq ™ôs¬é²”ö®¼øÍoÜm•Ä›pLJ—ãš#Âܺ›ð«>ópLJ—cNÅB4£û¾¸eëcVÿÅ÷ù_±²ëDßþünÃøá‘UÎë£5gã⣪SÚÓõÇKüÿéÿ„ŸÆþà¬ýËg¼Æþ༹t~Êx¥«_üè×O“çB±±cuëÌ:vº%²Š ´4¹‹G©/§ª}{àã5ÛïðáôŒà9Õî¾;ù÷1Ç:$öߥ‹»\·nÀ7¿ |ç;Éözõ¾öµÄßµµîòÝ»§¶›/zgc'ÄãÀuehÜCõëÝñû几%lÞ~–'n&´vî.qêÀg»Ú9å7~tvî.qíãæ‹·`Ççí°a[™ž“4¡ïFüúÉ>€C»ïÍ›ñ}Â_ñÏÍC\ï]p¾li»/ÑÜ\‚î]ë=ë›TÜîKt;ì|ýGßFq»¯Ð¾Ó×Üi¿Ó–WoðÅŽ ìüøèÄçì mè~Ø;ÚöêêRÛj**A¯}£ÏÞZœ°gµ³Ôœƒöñ/Ñ­)ñmð²í¿¶êOSQ;×+‰·§ëñf£ü?˜=ÛüÂF-Ííœñ¢uÝx¥«ÿü¢\ݸ^z 4È\`ϞČn»Í½Þš ×^ë~_ÕW_%nFô ŠÄ÷»f ðío63gÅÅÉoYO=•ÜÏûï7Þ˜XÿïÿNÖïܘ4)ñ÷ÿþo²½O>vïN ÀĉÉý¨í惾O¿ÞGömĽOöÁÄ“>ÅQ­7«Cº%n /­íêlßÝXŒÖèÔ£íTþˆÞ_âže}RöÓ£ë>t< µõíQKÜñny¸ö5¡¼ÇWØóe1ìÔxs}çÈÛá‡|€æ–b¼²v"U¬qÖà–[47­’½Ø¼}zôššÛ¥Ô÷Ò„+ÎGqÉWø|û@tî¾Å™…ímH|3{eño‹5á”éWYõý¼ {>냽]´íé~[Õgo-ö•b[i9¾(îê¬À’ž—&¾Ð”˜Õ1JâM¸ëÃËŒ}è±o;¾(îê¼Õø>š‹J´íùüÖË%õÿÁG@ssêÿ ?•u©ÇÞÆ.ÎxѺn¼ÒQ·n‰/ë¢Ü¨húôú¼ŒU¨>BÜuוe´½;Ûáñ•=på”dvâÞwÝ—ÑýäòQ¡—<ع3{çï€NÿÁ—»»ŽÐUiSuoÚÿ”ôˆLòEK–ȣœܸ AvE"‘H”O‘H$ÉK$‰D"¹q‰D"‘H$7.‘H$ÉK$‰D"¹q‰D"‘H$7.‘H$åŸJ&L˜à¬<ðÀ¸âŠ+œõÑ£GcÏž=¨¨¨À²eË2¶Ó¢¦¦Æºüô[š°ä–œ7· ËîH†%:onV,,FÃçEèÐ8ý’&üéW%è?´פޓÿð‡?ࢋ.rÕ_vG ¦^Û„W/Æé?hÆS÷¤¶wã7S"´k×ûöíkÓ“´lçç8ïÀ®ÎúÝwß«¯¾Ú8Nôš)]wÝuX°`î¼óNí~u*..Fss³qÝæ:X¸p!fΜé¬7+W®L)·dÉ'Õ…H$*<=ÿüóæ× 7ÜèÑ#á ïÙ³'Ö¬I†µ¹ùæ›ÓîÀ˜1cPTT„Áƒ£cÇŽ¸ôÒKqÛm·¡¸¸ÇsŒq?G¶`Û¿Ü7£æ&àÐ#ãøÎ¼&·‹£Ckì“õ!5Ô›Õ/)vÖaÇÖ"úö>üðCÏcjß¾½s¤ã?ݺuCçÎÑ£GsÌ1Úu¿q=÷«¯ðF»v¡Ç»CkFogu¼½ÎoŸ>}p ' ©© ½zõJÙNÇCíuP>~ík_sö >ú¨sÜt˜ö{æ™gº®=®›˜H$Ú•2-éÚµ+¾ýío¦Nêz=úè£ÓÞá믿ŽK.¹k×®ÅÝwßGyo¿ý6`óæÍÆýÔ¼Cß-ÎÌ¢ÓAq|ÕP„ƒzÁ™]|Ù“ðO¿*A¬øÆ,sx!ªß´8¤"<ä¹EÅÚöÎ8ã ÏcúÍo~ã:X¿~=~ö³Ÿa×®]¸îºëðþûïcîܹ)ë~ãúÇöíqJ3º††Ü}÷ÝÎx«ã¼yóf”””`Á‚Æ~lÛ¶ _|ñúôé£YÒñP{´?زe‹k¿>ú¨sÜt˜ö»bÅ œx≮÷þë¿þK>±"‘E&L(¨Oº Ÿë·zè¡øXª¾Ô­[7|úé§o×ô¨°Õ½{wüGÂq‹Dû¥<ré éôë_»Ó!,\¸=zô@QQ>ø`Üÿýiuú¹ÏÑOÿÎúJŸ^ãŽ;îж ƒššðÜg;Ñ«¥EJ{p# ?pà@ H*..NÙ_¦nZËv~î¹ý´ 3ËÉW5£ÇaqL¿¥É·M]mõÛß&rÝ|óÍ8þøãC·³páBÏúêø†¹i-Y²ÄÙsÝ””àî»ïNëú¤G›•••ÎxxµÇ?GêúСCqÞyç:ŽL¾D¢|SLe3ĶTÙ°˜öíÛ;›8þøãñ裢´´Ô©¯“ÊHlMÄ¥ÛOY<Ž•¶Mz·†‡ö³h£Gëú5 Ú}qƥ꽒ÄãÁ“ö5¥´§2.•ÍôìéŽ ýè£:g‹quéÇ¡G&&ÍíJã«sf  sêÑ£G ƒRûÀÅêtý:à€PÛšØlóæÍx÷Ýwqš¯Fó^'ºN¼êÓø.Y²Ä8^~ý嬌XÍõiê?=jÝ·oŸ3~í©¬O=¶ ™Ž#èçK$*ȱb[*ó¸ýöÛ}YLûöíñÁ8ÿ`ˆMôë×Ïù¥×N|*#¹ýöÛûi,*Â}MÎLé°æfìm½,,K$:ü4–˜@NïÚ%þç‹/Íè®îÜ G47ãôƒtµ§2.•ÍL:Õ5^ê+[Œë‹EøjPÒØQ›ç%oðÄœèür¥ö€‹Õéúõå—_âØcMÞ8»tÁŽ;´}ó:.ºNx}u<‰­®^½Ú8^~ýUYÙ’%KVgs}zõ¿Gصk—3^íÝ~ûí.Öwûí·kY²nGuš››ãúù‰ Q‘a\ºŸK‡Q–ìˆéŸ€ ã‰D¢ü“‘qÍœ9K–,A=R˜±†Z=“W™‚­š››}뙘ÛÍ7ߌbÉ’%®›Ö<àê¿é¦E Á$ªoÚ¿©~[Ü´ÈMK$í׊sY¸p!>þøc´k×.…9ôìÙÓa;ôLÞÄtþµ“_‹×ãì…ߨTmÞ¼Ykd%_š×~¹t̳¬LøÙD"‘HòÆ¥2&7ÜN:5…혘÷ߨ̂nˆ:¿¯GísæÆë©ºõÖ[µïCðò‰‘8óSëëöO B$‰DّøfÏž-£!ELúÓŸS¦Lq½ÿûßÿ€ÙØa‡¹ÖéiÆÖ­[]Û_}õU×:í‡?UX¿~½ëK­›öË÷C¢÷Mºë®»×^{-`Ô¨QÚ~šÚñÛN¢q{öÙg­Îï‡ß8øéñÇœþùÚí¦öù—nÚn;.ô«bÞnÐñð;¯~Á*hÿ4t}Ο?_;îœq•<ÿüó)ÂD"‘H$ŠªbP__/#!‰D¢ü¹q‰D"‘H$3.‘H$‰ÚHñBY–-[æ[¦´´4>xð`×{sæÌÉÈþ¯¾új9®-]t‘v\d éõ:£ñ¶÷°×g®®Çxn_ºtiÆ÷©Ž£ßþ÷§%åQáá‡èׯŸëýŠŠŠ6¹k0ÀµßýèGƤ~RÑÔ×Þ½{­ÚÒï3Ï<ãYgÓ¦Mm2FQ<.¯ë¡k×®)åÊË˵e§M›†¹sçËOp€qÛþð‡”qá×u¦¯ãte:N¿Ï¡iœmú©^g´¯ñõº镎ǯúÜÓõàu}ª×£z¼êuäzµ/kRíW=ð­o}+c×—zývìØ±ÍþçåŒkÆŒ®»Ù¥—^¿à‚ \ï?> ~Úi§¹^Ó]ÆŒãÚïI'”V{3gÎtµ7sæÌxQQQ|È!qñE‹y~ó£ñ?~¼«ÞСC=÷ûòË/kß=zt\7Îùz\tÞézàýã •›>}zJùiÓ¦¥\w´Ìž=Ûµ¿µk×jÛ?ãŒ3ââÛ¶mÓn_´h‘ëxéºÎÔõ˯cÓâwPh¨î|áãÌ“úIãkZh?||y½9sæh¯Cz¥ã¡vL×çI'äºhá×'¿ùñRÿèz¡ë’ÿÿ2-ü:¢ñZ¼x±«¾ßçÆöólúÜÐxÑ8Òþm?w¾˜7®\¹2¯¦_¿~i?êãŠæræ™gf¬­|»® õ:kËë3“׋,|T8îÍq(*)¸7Ç¡´[©ëõ–·8ëÃŽqoŽËØ¢jIJ(*.Jyÿ”§$§Î‡€á´ë¢OóqàÜ]ë#Ÿéj÷äå'kÛ[ºs©Ó)ýP×½úÑïûúÇPk'ëZðädž©ÞeP}ZÂü×µ´T[ÿæ>‡…šJ7üyyF¦ä—,óõÒ¥‰ñ<è ƒ\ë~Z·nqÛŠ+<·ëêÇã‰øÑ€.]}Æçóhö}À·¿½U[vútó™b±Rtë68ôv›ò&s§ßøøÛ–-[<ËmÛ¶ @òÇ\ï¼óŽ¶ÜªU«\íÒ+™KMý¤öéz¡ýPyÚnÒ»ï¾ëôkÅŠ€¾}û:¦aÓþè8Ô~©õæÌ™“ÑG\t\üxuRû¡>¶¼ð ÓúQ]IIIJ}ê??Qüñ^‚qµŸýã3xÒÎ+‰Ö‹ÚáÝYï¶I'ÊÊËoŽ·N:hØAØùV"]ÃЇ†"Ö>†‡'\ß'?s²þqåZ×úŽv8íÆÚŰjê*m{j? ¹ÑÙœu( IDAT‰ÖýúÑXÛ¨íåâ<²iàÑÑãо¸Gtî øÛgkë_òÚ+9½H¶ìÞm]¶C‡xðÁ$꺗FW^y%£ÛùË_bìØ±(kM{SRÒÅŸþawêäfJ'œp–-ûZkÿ“.þνÙÝ[Zö†Ú¤|§NOØqußDÿ.ZóÝéâƒO¢vÕö+++=÷‹Å\×KCCƒ«|,fvï”––bøðá®~=óÌ3(++ÃQGåy<555®ýøÕKW4~üxµÿ•~¨Œí‘GÁ}÷Ýgd¢~,¬©©Éùb§Ž‡îü4òæþÆÕz£è2¨‹ó /zÙY/ëS†–}-mÒ‰÷l¬±0æÕ1øìŸá‹÷ù´6ü*ñþŸ7ýÓété@oûòíN»-ûZ0êÅQÚöx?¶<´Å釺î×~—xƒÿ5“¦ ±¹ %­7²ùï%¾ÌYýfâÆøt"¼Ï©={Eê"ùáÀ¯úPRvåòòr׺—^yå¬^½:£Û>ø`¼ôÒKøÆ7¾4è47‰>}3ÜaÆa÷îÍ8ê¨KG9k×þ‰0<»woÆÊ•+1uêTìÚõ!=t|ë?¶1)ûÿâ‹pÈ!‰÷=vvàí0pàL§^åoºé¦Àãv\uZ°`JKKqï½÷j·Ï›7Ïi—·ï·?õzY°`uÿöîÝ‹ 6¸úE™ËøÃzÞðî½÷^×~lê¥#нÊ×øùkíÇ5×\ ‘Ƀ´yóf\zé¥)u>üðCŒ?ÞõžZHf» Ä°üüÐûj£¢¢qoŽËI>®•ÃWf~æÖ§ Û×;ü²Ã±ùÁ͈ªúv舺†=ë]9ðü¦æŸ‰ÚRsæÌÁwÞ™µzùr|¢6žq½tÊK€×Î|ÍõJzíÌ×а¹í§‹#Ÿ™x÷tâÜ€9Égº6Œë¨S걯u½:î;AÛg]j;a×ßÎ8ÇýHSa^6ŒëÖÁCsz‘˜='vAëĶ8£ðSP†å·ÝĸüuÆe:Žt—éü³¢óLë&öAߨ9Óâï›öĠʃ"†ÅÅ•Ú/ã¢vy{êÌ΋eJtœ^çM—×£Â3.ÒŽ)Ü÷lJÌ.êªêЂ2®ܯŠËŠQ÷Xº ê‚áO ×2.gæÆYWk;aW»X g½°Â=Ím}T˜ïŒ‹Aee¥kþ!pFá¥\1®þýû»¿ÜD„qÑ0tåKJ:Ÿ0ãJç“x gZ7±êêj§¼Ú¾ú¾i*ó¡r555.†ÅÅõËĪ*++µíQÿÚšqIìwÞ„qyݸ[ÆEÚ¾|;b¥1l}Ø"?,ã"yu š›QT\„.ƒºàÍioºÚãâ¬Ë¶:Ƶ¯¥oœ5@‚q¹¾ù 㒦РŒ"WŒkãÆ˜5k€è0®Ë/¿ëׯDŽ ´å º&ðø„W Á¬të&öQUU¥m_}ß$Î|ˆAÃâÒ1*ê—«RÛ#–CýkkÆ¥§Íø ãJ•0.ã‰Ò‘0.QNf\Qa\ªo 03)?ÆEâ>.3#ÑvÞt×Ë'¹Öo<.É,ò™qé¤>;'Öåç¿áõLÊ6ãjhhÆ…$ûY½zµë<™êãå©“ÿËĸ¨žé:âl&Û¬*¨èøùøj¿´öí‹%K–¸f˜ƒ{_?ô¹ãíòóEç‰ÄËÓ:÷Ñ  ÷é|ñãÙ¶m›ëüÏŸ?ßêsnÿ¨0ŒKõmI&dÆÇ˜™©®ª.¥Ê(…b\#îUÿvŸ¨ÅìãRŸÓîå¿ÑÕÓ)ŒKýÙùþ̸ˆýTWW;çÉ«ñµ¼ÚŽÉÿeb\TÏtq6“MVFtü||µO‘ÊÊ0}útgLM±7U¦EŸ;µ]Ýù¢:ã‘Ê«ëÜGGlÞWÏ?žX,æ:ÿ•••®u¯Ø’v7.äžq©¾-•I™ñq©2ù¸týðªgøVý{Ö~ö)€ý‡qѳs¿€¯¦z:å‚qmÚ´I’ì‡^{õêåY˜ZžÖ½ü_4Ëå¾&6¦ciÙ`UA¥;~¿ã[¸p¡‹YÍž=Û¹mÙ²\pk;}î¨ÝÚÚZ-»¢óôù矻ʫëü<¤÷mÎÿ\Ó:ígôèÑ)Ç¥ŠØœú¾0.ã‰Ò‘0®ÜjåÊ•¾aÌ QN4äwÞyÇÈpݺuqñùóç£'·E¾˜ƒ:H¥™¯×××kû+‹,²È"KçãRcv鞉rß…ú¬™ç‹I™Í„ð˜Ø_WýaŸñ‹D"‘(¿Ó={åÏDIêïýUѳIòÐúÌ™3Cù 8áûåþSE"‘HTx*‚+&»H$‰DŸqyå㢥­óq‘(F åͲ̓E:á7IßÏïÅ×Õö¿ìpW;ä碘‰a}\“ðÙ g¹ÞW}]6>®‡Nêä^9ð˜Œ\$&=§æá²ñûpI¬B»òÙòq‘x~,ò!‘ˆç«â~-S¬B^Ïäã2ÅF¤ò®§¶&Žcͤ)._W¾û¸T¿ÏÃøû}TI¬Âhú¸x~,•…ó†êu¡‹!&V¡º›˜yAójéö—-ÿ—š·ÌKmñ¯‹ÿm—Ï2ÛÄÇ%¥#ñq‰r2ãÊu¬BbOœ}¥«ðä§OvØ–ãâû#¶´¦X…œqJ>.®úúzm¬BS%.a\vå³Í¸ˆUÑyå±¹ˆÝð|^ÄNlc®ZµÊu=qöÂëÑ~Ôö3Á¸2-ê§ÓÑ$a\^ s̸ˆe9ù¯™X…{6íqؖʼt± Õý9l+`?t± 7ã '—î± Uè•GIU®W§N‡»¿¤ãJ1-bLôjбG|EÍ祲ÛX…Îõ¤c/j=u¿Ô~TõSéh’0.¯r˸ˆeÑk&bªŒŠX½êbÒþÔzAûaøTZ¬Bbj¬BS%®\1®Ý»7㨣Œ@—þ?1-:¿ôjbVºü]ÄN‚Ä*¤vzõê¥eQºýªíG•qÑqñ˜Ž& ãJ•0.ã‰Ò‘0.QNf\QÍÇeÊŸåǸȦú¯ø2.*ÏY›Ú/ÉÇå­°ù¸3ÃPíÙ.ù¸ìäW%*ob—*Q¯?6F× •ãyŸüêQ9•ÅèX•‰ådƒq©ãaꇭ8󪫫Ӗ3åÙâçŸN93ä¾¹Ü?*Œ`>.Àœ?Ë‹q©>0°ô=&_ kSû%ù¸ü6—Ã$—ûŸ_ö1J:?TÞ‹]ªLD½üØ]' )yŸüê©åh?&Veb9Ù`\êx˜ú¡jèСxýõ×f¥Þ¬TæuÊ)§ oß¾Z¶ÅÇÍ”§‹N93ä¾¹Ü߸½|\ª‚0.ÕF¢öL¾°”Ô kSû%ù¸ì&—Ã|\Ie“q£¤óCåmØ%]ôêÇÆH ,HÉûäWO-GûñbU^,§­—ÊŠü®ûaÆáä“Ov˜Õ|€1c×Ñ5×\ƒ¢¢" 2¯½öN=õTÛ"¦ÅÇÍ”§‹¤æëòc’¹’0.ã‰Ò‘0.QNf\Qa\«|S¶1Iª‹û¶¼Úã"¶¦c^abrƵnòyÎß…À¸¸?‡Ø–Îã¥Bðq•––bذaæ\1.ΜæÏŸïb4êyUß§ë€Î¿ÉÏů^޳5S¬Bê?÷GfVåÕ_¯z™ݨӅ^Ø?eò{ùùÀøÌ‹Æ%ŠY7"«PõMÙÆtn± ©½ ± 9ó «PǸ››ãÒùsÞ}÷]­?ÆK…âãR}7ºí¶ŒË«|¶—Êœè<ªŒF=¯êû555®óoòsñëG-ÇÙšÚµjÿ¹?Ê‹Uyõ7[± ýb7À#<‚ûî»Ï·­iÓ¦aîܹô~/zßäûRûC¢Ï³—Ï,·7.D'V¡ê›"e*V!ëX…®Ü–1m×okÖ'¾iãÒùsÊËË­|7ª ÉÇuýõ×{n71®«®ºÊé‡Wùl2. 5F ÉÏÓ«W/ç:0Åäï›Êq¶¦ëï?÷Gù±*S³«Ð&v#1-U§vàŽ;îô{ÑûôzÍ5×}_jjkk]Ÿç0ýlk ã‚0.‘( ãådÆÆ5ò©‘’l)¬ –‹‹Xõ‡Öýú¡óq¹˜<WTgôJŒ‹ÇšóS¾0.¯Ð7…äãâç—X ÷YqÑ ˆ¶s†db:¦z~± yÔ¤M¬Bž7̯^¦¤ë/W.—Mÿrû¨0"ŒkÇ ;Ô^…òq9ÿ\ÒÈÇUV^æê­‡ñq5Çã.ÔVHù¸xŒ8z¥ ^5ç'‰Uh_>ÛŒ‹Î+±Õg¥Suuµk;gH&¦£«Gûóò;ñþ“±‰UHû ’Ç+ÒõW§\1.ÛþåöÆ…h0®íË·kßÏv>®÷ltõ‡ÖÃÆ*ôçe /‰³òo©±æü”OŒë¸ãŽKÙ¦}\Qb\<ö ê³Ò©ªªÊÙîżlêÑþ¼êóþ“±aUº¼aÙ`\ºþÚ([Œ+lÿ²%a\Æ%¥#a\¢œÌ¸¢À¸TE±‰1Á1)ŠYÈÛçíqñ‡¶¬3.ÊÃ¥æß€OíüŒK9ç›ÐƧ¢J—]y t|‚Ž+MGç‘X“‰9ñ˜†¼¼éz0Õã1IÄÞxyÛ|\¹gy: ãòzTÆE J HŒ)(ã*+/sÇ,D0ÆÅcÖUÕiëù1.ÊÃEù· ¬¸äy¬B5æœWlBŸ I—}ùN:Ÿ0ãÊcÓUVV:¬ÉÄœxLC]yÝõ`ªGכޕVTThËÛæãÊ¥t,O'a\>ÿ¢£À¸VŽXéŠ HŒ)(ãÚxÏFWÌ Œ‹äçÿòc\”‡‹´fÒ467¡¤õF–¯Œ‹Çœ3Å& òl\W’qùù¸Ôà¿¶ãv\¹ˆ5™˜ièWÞ¯žz½qV:oÞ¼”òAóqåJ:–gõdJWb„q ã‰Ò‘0.QNf\Qñq[:ùéÔ|ZA}\€Û˜ójq|j¤‹‰QìD¿~˜òq©L (<1 úæ®ú¸Ô÷ý$ŒË®|¶÷c™Î+÷õñXƒ&6¶ïš/JǸL±ýòxeJ*öó9 ãòzT=¸Ü³ik=Œ Hú¯€$;³a\;^Øá015vb—Ê´€Âôq³ gáªK}ßK¸ìËg‹qqq?–鼪¾>Ϊ¼üXaêéúC×¥ŽqyÅ>ôË㕱s öó9 ãò¼UDƒq@¬4†­ou½ÖÇEþ+5¯– ã"¶¶rÄJWìÄ0>.•iª‹DÏÂ¹Ëæ¹0®h3.Ët^U_gU^¬+L=¯þè—ŽQþ)›<^™gÄ6ÆÕ:¸„q‰DéH—('3®\3®±¯ ”?Ë–q‘Œ˜™)æ ߟʴÔvüúab\<×ßÎ8Çù»òqq¶@ŒKǼ$ŒË®|¶b’xŒB“¯Š_TÇ4ù–è:!EœyÞ,.ÎÆÔŠ^¬Š3&Ûz™§š?ŒK—×£Â\3®˜9žq‘Œ˜™)æ º?W>0ÖNÆÅóqµ‹ÅpÖ +F>. •-ÐÏß÷’0.ûòÙŠUHRcÒ«›áþ= Ðä[ŠÅbƒR í×TOecj=?V¥2¦ õ2!•µQÿuÆåuãBt|\€Û?„g\Û—ow13SÌAU*Ó¢~ØúÉlòqíkiÁgMN|#-ÆÅŸã—ýv º± IÄ€L¾*ÝõÀcúù–ˆA©ŒeÁ‚žõT6¦ÖócU*c R/RYé%a\­ã ŒK—H”Ž„q‰r2ãŠ*ã «PmW}5µÇËsÆ6V!©Ð±îçò“0.»òÙŽUHçOe\€ÙWE38ªg›kÛ¶m.æDåx,BS?y} š± ©6ùê„qy=*Œ(ã «ójjO-¯c\¶yÁöWÆÅE,‚û¹¼$ŒË¾|¶cÒùS——‹˜Õ³ÍÇ‹Å\쬲²R‹ÐÔO^?ª± imòÕ ãòºq!šŒ+l¬B“Lí©Ò1.’0.©,‚û¹¼$Œ+º>.:*ãòòc™7o^ |\$•ébÚÖj¬BÇ ùêH¸ZÇA—0.‘( ãådÆ•kÆEL‰Ç´H21.’_>.Ú¯—®‹òr9¨&Ÿçü]Œ‹ÇŠãy¹ÄÇe¿Ý¦|¶}\t^¹ïÉÄ.é}bTŽ’+ä+—ŒKeJjlÁ 1IFÆ¥<4Å*t±-V/ÌËå”knPŒK+ŽçåW~û¸è¼òØz&vIïËâ1+M~,Ú®2 ZW™KêÍ=ɶ‚0.î3¤ýµ5ãã(ù¸ÂÞ¸;Æ¥2%5¶`~"Vµå¡-ÆX…êþx½t|\@2/ךIS¿­YŸøFZŒK+Žç岑0.ફ®rú%W[ÏÄ.ùûjÌJ/?µÏЂ \ÌÅ$ê—-ãâì†ö×ÖlLGÉÇN¸ ŒK$JG¸D9™qE%ù¥(¶ ‰Iù1.bTªÿ °ËÇ¥úÉè•úã×θÖN:7ñHJaZ@áåã¢gô.zFÏcrÿŽ—rŸú÷ïïª#ŒË-b1t¹ÏJ'5v µÏ_M×g?ºX‚ºòêuæ•ËtýªýÊ–ÿ«²²Ò“ݸ¼o\ˆf>®-%ØP&W|\ä'ÛòÐWÂ2.bZ…˜K÷Œ¾¼¼<°'WŒkãÆ˜5k{ÆõÌ3cRöŸIƵX…½zõrG?ß‘;Úç¯~ûS¯+KЯ$VÅc)ÚÖË”lØÿ2,ŒKa\"Q:Æ%ÊÉŒ+*ŒKeP@x±)ÕÆc!𗮦<^acÞx\’Yb¬BzvO¬ËÄB¸ÄÇeW>[± Iôè—3.¿‡<6aÐ|\<¿–_ÌKKˆf¬Â ã/ŒËãÆÆE Š”Ž‹Ø”ê SÙ•1V¡¦j;™ˆU‹7%¦à…«Ø]ø&¢J|\ö峫¥ ><…qù±*›0h>. 5¿–_ÌK5–"ÝX…AÆ_—× ¹g\Ä €ô}\ÄÆT_dW^± y?Ôv2«Ð53)ÀX…ª‚ø¹ÄÇeŸ+›± ‰upÆåW3§ ù¸€ÔüZ~1/y¾°¨Æ*Lç¼ ãja\¸D¢t$ŒK”“WT±$bQ¶y°H.cŽØaè'a\vå³åã¢ó»nÝ:Ûò‹Èc r¶eÚ]'ªßËË7¦öO}µe\Tþüù9ÉãÅýn: ãòzT±$bT¶y°œ‹UHíêªê|}\ê~bíbX5u•U?L>.z ÓÇÅc̽ûî»Ú†^Æe_>[>®X,ælWýU~±Õƒœmyí¯ºº:ÅïååSû§¶k˸èú­¬¬ÌI/Õïf’0.¯¢áã"–DŒŠÖÇEí¨yµl|\ªZöµ`Ô‹£¬úaòq‘ ÑǤƘ+//ׯ0ô’0.{Æ•M—ºü[~±Õƒœmyí¯ªªJë÷òòéʇe\ÙÎã¥úÝl%Œ«u„q ã‰Ò‘0.QNf\Qc\䣲Hâ± ¹KͳåŸ(ÿ±­°Œ‹ô·3Îq?ÒT˜W>3.S¾$b\~1í¸ !Vaii)† fþÀå‘‹ÏÅ™&‰û¼¸/‹ês÷yÑuEåüòñ˜˜jû6Œ‹§_½LÉ/? ÆåçŸËÝ£Â1.ÕGe#й!(± u~,Ä`Ÿv¼°Ãa[é0.h‹á¬V¤L÷üg\¦|ItÁkØŸ|\{÷Ž‹Gò_q¦ @Ëû²¨>÷qqŸ]WTŽççââ11©ž-ãâÇ™-Æå—Ÿ ˆãòóÏåîÆ…è0.òQ‰¨“ÎØ1®íË·;l+]Ƶ¯¥oœ5@áù¸Lù’È¿E¬ÁFùĸüb^ýõžÛóÉÇEçQõ_q¦Iÿôu± é}ªoòq©ý˜7ož«ÏÏÅg¸jLLµ^PV•mÿ—_~2rÁ¸‚0¸lI„q‰DéH—('3®¨0.î› Ë¸x{$[ï1/¿~˜׃'v?Ò,ÆEâ1åˆqqæ'a\vå³íã"vÄýX¦óÊó³ù1.¯z*33±Õ_ÄE3<ÚŸÚ~6—_ÌG@—÷£Âˆ0.î› Í¸ÜGçÈÖÇÅû±ã…VýÐ1®²â<²iCÊt(œX…<¦]ð*ó“0.ûòÙôq;ÒÅ4W5?› ãòª§23kQcñcÓ!ÆEíg‹qqŸ›N¸¼n\ˆN>.bJé2.Ua|\*ÛÚ¾|»U?tŒ«±¹ %­7ªBUÈcÊãR˜Ÿ„qEÓÇEìHkPw^9³±e\¦z@’™™X QhëÇâþ$j?[ŒKõ¹ÙJWë8ãÆ%¥#a\¢œÌ¸¢æã0g€gþ¬¶ŽU¨öëžm¬Bž«PgôÊcR9?B¬ÂBõqñ˜œ%ÑùNÇÇ¥úÃty¿øÌÄ«P=ž(çãZ½zµvU ãòzT±X…uUužù³Ú:V¡Úõ5L¬B]>®Ba\*‹PYUH ÁK¸ìËçÂÇÅcªë@ú>.ÀíÓåýâ1ót± ÕòQÏÇU]]2Ž\¸¼n\ˆV¬Bçq¢!V[Ç*äý I>®T‹P™Uh£BŠUXˆ>. 5f Î¯ezßq©þ0ž÷K3Ç*TËG=W,F.a\­ã ŒK—H”Ž„q‰r2ãŠã:á¾Òb\äÃRÙ`ö…qÑ~Ǿ66P?lWqQÖM>ÏYÏgÆEßléY8± θÄÇ¥>ÞÊ?÷Q£âìC¨²º>tùt>-*Çc ò~rÿ/D›qéüc\¸¼Fˆq—£î±4WëP'¯V«ölÚcŸ6C ~Ø0®æxœšË{ÆU]]ízN¬‚3®(û¸ú÷ïïª#>.õ¦éŽáÇcrö¡Æ $vCׇ)¿÷i©åÔX‚º~rÿ=uÆÅû¯“0.¯¢Ã¸š›QTœøñBºŒ‹4æÕ1Ž/̆qñ|`¶ý°e\ƒþ¼,1CÉsÆUUU¥ÍËÄW”}\7nĬY³äÞÇuÕUW9ýˆŠK=<† Ê>xÌ@ ÁnèúðÊï¤ú´Ly¾¼úib0Qg\~ý×IWë8ãÆ%¥#a\¢œÌ¸¢«ÐÉǵ<³± móq¥ôãéôòqýåë]ë/žž|$X± ¹…=çgå~*—ÃÊ'ÆE¢óH “³(Ýõ¤Æâã¾.Ý~tþ-¾ß”§­ïSyµ_6ù¸ˆÍeËÿÅÇ3ê± móéeÿQa„bR­ y°H~± móqñ|^¶1u± à°Žnß͆]‰t+…«ûQè‚Åb®gå^*—‰aå#ãJÞ<$b˜œEé® 5÷uéö£óo©ûÕ©¢¢Â)¯öË6WMMMVý_êxæC¬B›|z¹¹q!:± )V÷o©û5õ‡Ê«ý²a\ÄæråÿʇX…Q”0.ã‰Ò‘0.QÖg\%7”àÉ#ŸDÉ %Îòä‘Oâˆßáz/ÓK[ˆ3®lËĸÒUÔ=³'ÖeûŒ<ÓŒ‹üVé0®^½NMÙ¾¿1®tëqŸ•í ƒÊñ× ýвËf£À¸HQb]±Áƒ»‚^Òú¾}û" 弔¸²,ãJWQg\ªÔgötáÛ<#o ÆõÏޗ¸èoú‡!Œ«íëqŸ9h•㯶ýŠºËf£À¸HQb]±wÞy￟ø†¹|ùrÐúÇŒvíÚÉœ4ÈŒë’~y\~ŒK•úÌ^e]Aêej{ûöÝRWcc#&MJD2±a\Ÿ|òw”—Ÿ“ÆÅ|\™¨ÇÙ”.æ NTŽ¿Úö+|\ùÀ¸jkk#7nE&LÈ ãzþùç3Þ¦0.·„q‰²!a\¢¬Ï¸š~Þ„V¾€¦Ÿ7áå5/»^iyyÍËøbæ®÷Ò]t¢Ø‚ÜGd&Ó®& IDAT—)æ ©#ŸéYÏ6V!÷qJ>.=TÙ–êÇ Ã&2±]|\Èȸ2 WSì@1-Õ§ds=pß÷}qt¡Æ&TÛW™ŽqQû®BÉÇ$Ÿ…s¶¥úº‚²‰LmÒw É6èÕ;DLKõ)Ù\Ü÷Ç}_œ±¨± Õö)¶¢Žq©íó¼`Ôïl±±ÊÊJ_Ÿ£ø¸¼n\ˆŽK½a~ñ^¨›©|\[Úbíã€íË·»ÚÉ„Ëõ«|\ô,\ǶÈ×”Mdj{¾ú¸¢«0h=•i©ål®î ’×Ú§ØŠ:ÆEí«1‰áP¿³ÉÆ‚ú¥ÄÇÕ:âãÆ%¥#a\¢œÌ¸¢«PeZ€;ŸVÆ•m™|\j>.¸ñ¸$³(ÆÅW¡2®£>:Ôø„×têéØgK~õlòV™ú%>.ÿ÷I¸BHeZ$bM¡cfY:ÏÇ‹7%¦à…«PU”|\:ÆU>®N:Ÿ°ãšn=ÛâlɯžMÞ*]¿ÄÇå–0®6Ê´ÔØ‚@ú± ³6ã²ÌÇE*”X…ª¢äãÒ1® >®l2.òqù1®›nº)ðø„×LÔSÙ–Ê–lë‘lòB‰KW›J—½„q‰¢,a\¢œÌ¸¢Â¸¸Ë”?ËqqÉä ã:á¾\í¤ëãzvÂY®÷ÿvÆ9Îßù̸¸Ï†„ø¸ ÃÇÅóFÑy&FEÛ¹è|s?—Éeºž¨œÎŸ¥–÷ò{y1.ê§Ž¡eƒÑþ…q…¼qEÑÇ¥¾e\܇$šŸ«¸¬uÕ¹ÚI×ÇõìÇuÎ{íb1œõ ùϸ¸Ï†„ø¸‚oR>[>.5o”zž‰QÑv.:ߪŸËËeºž¨ù²è•÷ÏTÏqQ?9CË«®®Æ•Ö Ñóq© ˸ȇ5æÕ1Cóóq576£¨¸Èý;M×S[õ×Lš‚}--xã¬É‰o2À¸TŸ 1ñq^>.:Ï6ŒŠÎ·Ê¤lýXºräË¢WÛz~Œ‹_—ÙöqUUU ã )a\Æ%¥#a\¢œÌ¸¢Â¸N^~2ŠŠ‹¦tòÓÉGqa|\'/w?Ê#vÅÛÓõH2.Û~pÆE1 ¹+ß—SNeYäÛâ±ãÂøo2±]22îÄŽè|.]ºÔu~¹è|Ó+•ã1¹øuÃõƒÄ}a«W¯Né—«R^z™–Ä* û¨0Œ+Ö.†USW!ÞZÿ/ìÙ”˜e„ñqQ{$bW~ŒK­GŒË¶œqÖ±SŠ«—SNeYt¡óØqAý7™Ú.Œ i»ÊŽœuõürÑù¦WbS<æaêM:¦e£œa‘¸/¬ººÚUßU© /H½LJb¦sãBîW˾ŒzqTâ1∕ˆ•ưõá­Â1.µ½1¯ŽqØ•ãRëÔθîX÷nŠ«P—ú œX÷mÑûAý7™Ú.Œ i»ÊŽ,XàZç>+ozõbS:騍Žaq_•§úAYUØzéHb†“0.ã‰Ò‘0.QNf\¹f\ÄÔØ„êû@8Æ¥úÀTvÆÛãûÚXWyÛ¼`¦X…<—ʼ )V!g*ó²‘_¹l3®††a\HeGÜ—eºˆqé™i?j=bW^¬EÓP…hãã¢W•5eƒqÑþLããò~T˜cÆE Éñq±÷CÇ*Tl&ÄÎlòq!–,$/˜.V!àÎÇ¥2¯B‹UȆʼìþI›Ëå‚q©¡•öç|\œq_–é:¨¨¨022Ó~¨`W~¬EÓ˜—­«ººÚµŸl0.ÚŸ×x¸¼o\ÈãRiÌ«cÒf\¼= Á΂äãZ9be ¼`6ù¸TæUˆ± U‰Uè§\0®M›6å$VaÔ|\œÑMÈÏ—5oÞ\âã²+ŸmÆÅÙ•71IbT:Ÿ`f&¦z^>._Ð6g²êÌ3Œ‹ûÖtÆåõ¨0b± ƒ!c’ÔX…AW]U‹m…õqQ¬B•q‚Keê³p•iÙø}T‰Ë¾|¶—ʦÔò&&IŒJç³ÌÌÄTÏËÇÅý‚Aòqq&KûÍ–‹ûÖtÆåuãB´bRŒAR&bÁ±­t|\$•q‚Keê³p•iÙø}T‰+º± U6eSžü[&ŸUÐzüzÒ]‡T?|\Ô^¶óxÙ|>Ô/ø„qÆ%¥#a\¢œÌ¸¢Â¸ˆieK$•q©LkÀœ}\j?TY×ǹE!ù¸Ôgô.]¿l߯_½LI|\é>*ŒãB ¡ØIe\jÌúª:×:oϯÄÞÂú¸oJN¹ ÍÇ¥>£§˜ttÁWVVúÆb# ã²/ŸMÆÅcRªçÓƒ’ÞWóe©ìŠ«ººÚŲx¾,/—®_¶Œ‹ïW|\¸+ [2i刕ÚuÞžW?T…e\¤BõqÑ3zŠI§².Ûg帢éãâ1)ÕuS JÓû:vÅ·«,Ë&›W¿lY߯ø¸„q™o*¸¬%ŒKe ãådÆÆ¥Æ€ËF8‡ñqe[&ÆÅóq©¾®BŠU¨>‚RY—m½LmÆ…ŒŒ{ºõV­ZåbQ^LÇ«žíþl}\Q‘×q ãò¸qEq©LÉ™A•'ØDèX…Y–Žqñ|\@Ò×Uh± 73QYWz™Ú®c\ô7ýÃÆÕöõ***åÇtLõl÷ÄÇù—0.¯rϸT¦D¾«÷l~¬Â¬Í¸4Œ‹çã’¾®BŒU¨2“ ± ³Å¸1iRb,Œ+;õˆ9õêÕ+ÓQëÙî/W.tü…qµŽƒ0.a\"Q:Æ%ÊÉŒ+׌‹XÖÉËÝM¾« ± O¸ïæ¼Zj?¸ß‹÷+Œ‹b@qQÖM>ÏY/ÆE>SÌBñqÙo·)Ÿ-ÆEççǪ¯¯÷Œ±ÇýZTŸ®Ó ƒÇ$ä±.ýöÇýf@4óqÑþhܽ’0.W®WYybíbX5ÕmhlnlNAÝþ¸ß ˆn>®êêj׸{1$a\^7.ä–qm¼g#Zöµ`Ô‹£$×–‡¶H/Vasc3ŠŠ‹<ój©ý’~¯1¯Žqõ+>.ôçe‰o2ĸL1 ÅÇe·ˆ.ãRócI¿ž)Æ÷kÍ›7Ïuxù³ˆéb]Ò~uûã~3 ºù¸ªªªBŸ/a\­ã ŒK—H”Ž„q‰r2ãŠZ¬BRXÆEíÛÒµo«”n¬Bîã*4ÆÅEÏĉuÙ~³ÆeWþè£5>AÇ•3'3ЖUQyÚ)V!¯ÇÙ˜)6"¿î²Åª2%ñq…}T¡X…ªB3®¶¥kß&V¡ªtbê|\ÍM ÓÇ$Ÿ‰Ó…obª„qÙ—ïÔ©Sàñ 3®<h꨼ºS¬B^³1SlDõºË&«Ê„ÄÇ•æ­"Jù¸2Á¸ˆm©í‘lbÚÔ³a\:×okÖ'¾É K±.›˜s¸ìóqÝtÓMÇ'ì¸zù®lXßW¬B^³1S DUÙdU™ø¸ÂI„q‰DéH—('3®¨0®qoŽsù¨ÂæãûÚX½ËО®€¿ÿËq‘ëÅÓÝÕü\ùȸˆE« &Áý[ôì^—ýv›òÙöqq??¿\ÜÅcÚ2.*GŒ…×ãåy^.@ϸh;oÏ6W¦ÄÇG'a\7®¨0®æÆf—*t>®RüXÔ^—A]0ü‰ážŒ«¹±ÙÊÿåǸȿµa—;= åçÊWÆE¬£¦¦ÆÅ$Tÿ–úì^W~û¸¸Ÿ‹Ÿ_.ÕEÿÔëÄ–qQ9b,¼/ßÐÐà˸Ôí¼=Û<^™’:>& ãòºq!Œ‹˜ÖÊ+3škÌ«cœöº ê‚7§½éjO×ÿ— ã*Åðà†Ä„)Ÿ± •I¨þ-õÙ½0®Ì2®\Å*T“W=Õ$üWtØ2.^ÎTO½þ,Xà˸h»Ú^mm­ëø²ÅÆÔñ±•0®ÖqÆ%ŒK$JG¸D9™qE5—­Š”/ù¸òqù‰û¸$—ýv›òÙòqeªÿ ù¸8ò›rÖˆËæ}>Þ$a\Òåã²õO‘ò%W¾3.?qW”òq‰+ûõèüsÖå'΀¼X)g]€ø¸¸„qµtù¸H…–Ëù&ºŸø¸l$ŒË>Va6}\™¬§².qdë£òâãÆ•q ã²—0.Q”%ŒK”“W®åÍÊ4㢘ƒ”ïË/V!mçyÁÒU¨æãâë…”‹¾9r?—ø¸ì·Û”Ïãâ¾.?gS~ŒkÛ¶m®|ZjlC¯ü_<ï›Ú¾Žq‘_‹_—ª¯«-Ù˜šÏÌë¸a\ž7®\3®/ìhÆÕú ´¬¼ÌµnŒUƒ6/X:± iz¯[/¤|\@ò¹êçRß÷’0.ûò¹b\ª¯ËÆÇÅÙ”ãŠÅbN>-ÛÐ+ÿ—š÷MmßĸȯůKòuµ5Só™y ŒËûÆ…Ü2®íË··)ã¢<[¦öTéò‚ÙöÃ6©Ð=#çlK|\ûã2±)[ÆÕ«W/mlCSþ/ éÏRÛ71.òk©LGÝO[³1žÏÌë¸t_‚…q ã ŒK$JG¸D9™q‰+3WòP¸>®éÓë=§N¬ÂLÕ#eëÇâõ¨¼ƒÐ¶_âãòŸ$Œ+„ÄÇU>.•MDÑÇEÓ?Œþýû»êH¬ÂÌ×#6fãÇÒÕ«®®v1Û~‰Ë-a\m ñq†KeQôq566bÒ¤Ä xذaظq#fÍšÀžq=ó̘”ýï± Ó­gãÇÒ©ªªÊš¹¨ý—0®ŒK—½„q‰¢,a\¢œÌ¸r͸ˆeqÿ”ÉwÔÇå×Wþ.^/l>.Ò³Îr­«Ì«IGŒË”‰K|\vå³Í¸è|r—ɵzõj—?‰³3QÛUë“ïʯž.¿•ãâÇ¡¶ß–lŒŽ‡ŸN¸®sþV™W¡1.5&zá›ò/©Ê•K—=:ŸªËËU]]íø“t¬ÄÄLÔvUù®¼êÑ~Õþú1.~Ô~[³1:ê'­ë$ŒËëÆ…Ü3®tüS~RÛóÊÇEù»Ôzéæã€§¶&òŒ­™4Åż 5V!±ŒòòrßüK¤\ù¸Â0®ý-—._”—‹XI¯^½³µ]ò7©yÀ¼Äýc6ŒKwmÍÆèx¨Ÿ¶ÇãrÆA—0.‘( ãådÆ׸7ǹX“-["ã"FÅ}a*CÓÅ*tÊ=(Gìb)úõƒ3.ŠIøâéîG€ùθLþ£Ø ­ûI—]ùl3.Μ輛1^ÊûÅ8¤útÝ#åו§öt±ÿ¼XY˜­X…¼ÿ^3^a\^ #àã€æÆf‡5aK΂W,ÕF ÍĸTíÙ”˜ÝlÇ ;¬úÁÅ$ܰë ç½B`\&£Pe'TÞK«Ð¾|6—Ž9UWW{2®ŠŠŠ”z´nã˜]7ÄHùuT]]íjOø³*³0[± ùñzùÚ„qyݸ{Æ[J° •#VbK:q_14/ƱҶ>¼ÕõÞöåÛ­ú¡c\¥±Üø@ãâþÕ·”¹H¬BûX…Ùd\:æTUUåɸæÍ›—RÖmbªÌÇ‹‘VUU¹Úã1ýX•³0›± ùññµ ãja\¸D¢t$ŒK”“WTgSÄš€à>.••X6µÎÛó뇩ž­ë/_ŸèZðäÑÎß…àã"vÁý[.îs"&dÊgeº83ùúüê™üNœµÚú±rŸ86±BUaX—éxI¼=[G…a\œMk ããR}Yeåe®uc>.C?š›­úaòqÖ1™?©¬¸P¬B•upÿ–š'ÉO…¸öî-œ|\ÜçDLÈ”ÏÊt=ð…:_ŸM=“߉³V[?V®—Ê€½X¡*b]&Fåå3•¡ñUû•_7.DƒqÑò‹÷¾p±¦°>.òeQ>.Z÷ÊÇÅû$Ù[X×ëÿÈ×Lš‚Ææ&”´þh£|\*ËPý[¤01æ2µ½­—_¬Â믿Þs»ã:òÈ‘ÉÇ¥ž_bB<Ÿ•ßõ Æ(41+¿zê~¹L± £Ì¸hÜmò“›ŒäcbT~ø!ÆïzoæÌ™Úã­­­u/­ç“„qA—H”Ž„q‰r2ãŠã"¶eëŸ"ñX…j}ÀœßKו‰pß Vý01.•i…«P“Ž— á’|\vå³Í¸8¢÷½bª×¯gb:¦ØÜÆeŠ¥Ø1® õ2!],F/eƒq¥Û~öFˆqI¶eëŸ"ñX…TŸTWUgåãB,ÉÈŠËŠQ÷˜]^0ãR™Px± u1éèæÅB¸ÄÇe_>›ŒK=ÜOå;PõS©õ¼˜Ž.v ÎGÆ¥‹¥Ø3® õ2!],F/eƒqñõè߸Æ¥²-[ÿ”ITß6V!×Ê+ÑÜØŒ¢â"«~è—Ê´ 5V!IGŒË‹…pãJ×Ç%ÆEçÏ6æ$¿.x=?¦Ã·ë|d\ºXŠ€=ã Z/S²Å˜-ÆeÇ(J„q‰DéH—('3®¨1.ž¾+ÛX…<¯–ÉæÕ¯z¶ŒKeZpãqIfQHù¸HÄ&ˆu ã²ßnS>ÛŒ‹Ç ¤ò¶þ/º¨¼ÉÇeòÑ£g?¤cFÙˆ9˜®lΛ0.Í+jŒ €§ïÊ&V!o0û¼úáUφq©L‹´¸€|\:û 8¸‚3.º9Eq©1©|ÿWee¥«¼)?›Î7¦²S?ŽÃó[e+æ`:²=o¸ ÿ¢£Â¸€$“2ù®Âäãòò……­gøT¦µfÒ÷̤@óq‘ˆu ã θ֯_ &hËg›qɘT>ˆÿKÝ+ã¾1•ú± žß*[¬*ÙŒ¿0®T ã‚0.‘( ãådÆ%Æ•‰|\$Õ·$V!ù¿‚ÆL41®u“Ïs­ãâ1å¸Ë–½ã²+Ÿ­|\ÜÇÅ™—_^-^.S}N~1/çÏŸ¯õÞŒ‹çSg>Ù`cÄú¢«PW½ÉH>®VQ>- Ù®kÇ ;BÅL4Å*llnr­ãâ1åT—í3ü\1®þýû»êäãÊV>.îãR™—M^-µ\P6¦úœüb^VVVjý„~Œ‹ç£~g‹ÕÔÔD*V¡0®4•‰|\ªTffããÚ¾|{¨˜‰¦X…¿­Y p)§ú¸lJ®ׯ1kÖ,Ña\—_~¹'ãÊf>.õ¼ÚÖSËs&&ÿ`ó’û ýÏ+FýÎ#Ö¥X…¸lnN¸¬%ŒKe ãådÆÆ¥2) ‘G‹„qQ=•iñu/Æ¥Æ&ìY›­«ÐòqqÑ3{ñqßnS>[>.ÒêÕ«†¤²$ÓyåLŠÇ.ô‹U¨ÖSËûåu£í*«Ñ±*S ͶÎÇ¥2?‰U˜WT—ʤ€D- 8ã¢z”G‹dÊ«¥JMcm6>®BËÇÅ¥>³—ýö å³åã"UWW; IeO¦óÊ™”»Ð/V!¯Gåýòº©Û‰Õ˜X•)†f[çãR™ŸÄ*ÌÄ ÑôqQ­ Œ‹êQ-jÏ”W‹ßÜ(6á˜WÇbm6>®BËÇÅ¥>³—ýv Ú± $s¢W¯óªcR½zõòe:¼•÷c\êvb5&VÅchÖÖÖf-—:Þ«0¼„qA—H”Ž„q‰r2ãÊ5ãÒù¶Ô÷ô|\{ÐÄÌxyÕ·¤ŸëÙ g¹Ö )d<ßO¸ìÊg›qq&DçÓt^¹•m>.bMãÖM †û¸lójQû:_Z6|\´›™²0.Ý£Â3®æÆfKRß2àãj} jbf¼<ù¶€ôóqÀ³'™Y¡åã¬@—‹¿ï%a\öå³Í¸T&DçÓ뼪þ=•iÙäã’¬‰b^Òº‰Á¨>.µ?VEís_Z¶|\´,ŒKwãBn×–‡¶¸X’“ êã"™˜™k@ßÖ˜WǤ žÚš8ŽBÍÇUUU¥ÍÇÅß÷’0®è2.• Ñùô:¯ªÏ+¿–N<–¡ºîÇ`x¾® ¬J‡lÇ8ôcÀ¸R%Œ ¸D¢t$ŒK”“WT|\jŒÀtòq‘¸/ÌäÇòêàÎφq©¾­Ä#Ásœ¿ó™qqfÁý[ôȰÐ|\?^ù¬ùU€ù¸Ô€6~,•Méü_aëñ~Rÿ¨÷Þ¬ŠúAíûù¿2-bN^± KKK1xpâü0 #û¥Ï§:NºÏ)_{}µÝ£Âˆø¸Ôiåãj•ê £vÃÄ*¤ªa—êÛ€v±Îza€üg\*³àþ-•ˆ+?±¢††ç|Úø±T6Åý_aëéúIý«¬¬LñÞ¬Jí±?ÿW¦UQQá«pïÞäùïØ15FeæE7x'ÿœªëa¯¯¶½q!>.5F Ù|\ÔnÐX…ªÂ0.Õ·µfÒìkiÁgMN|S,ÆEÌ‚û·TRh>®?|fÊþ ™q-X°Àu>müX*›Rý_aëùõSÇܼX•Úb;~þ¯LkÞ¼yV± gÏNœÿk®¹Æµ>sæÌPÌ‹4‰—êkãëa¯¯¶’0.ã‰Ò‘0.QNf\Q‹UH¾)•Q…a\'/w?Ê3åÕâ"¶FýëãZ;éÜÄ7¸ãÜŒâ/_ŸèüÏŒ‹3îã"ÿÄ*´ßnS>Ûù¸x AîÏâ"vï ?æiŠUhªGÛiôj˸¸o,Š>.a\^ #«PõM£ øbíbX5Õm¸Û³iãjnlvú‘Ž«¨õáâMîG‡uL0Š|g\ Ú.ž«P|\\ôÌžž…›ž¥sq–bR¶WCCƒ0.eûªU«Œ1UÑ7sîSâׇnºöýöÇÛ§W@ϪL1ýêeRêqÚÄTû“iÖ¥·nœ£Ã0Œ+†”X…*£ ëãRóq‘/̆q••—eÌÇÅóq’‹«²²Òõ,Üô,=õŸsÌ·\.—ú³óý•q©Û+**´1¹ˆpŸ¿>tûÓµOþ*Ýþxû꫉U™b&úÕˤÔãôŠHõÔþdšuÑqóÏ#)Š1 #øx¬B•Q…õqñ|\+G¬´b\ïÙ˜1ÏÇUh>..õY8–žŽrÁ¸6mÚ”Æuùå—G†q©Û‰!ñ˜€\ÄFt>%›~òö½bèy±6[1›z™§×ñÕÖÖbúôé®þë"f•iÖÅ×£ÃP„q‰DéH—('3®¨Å*äŒ HßÇ„q©ùÁ‚ÄLÔ1®â¢"¬›|žë=5?W!Å*¤uþìÜ–½ˆË®|®Ï‹Åó;‘8“â>+?ÿ½Òþ¨¼i܇Eë€7«¢~Ò 0›ŒK÷¹ñüòšEÆeÿ–ûQa„b©Œ)>® ŒKÍ$f¢Žq5ÇãàSZÊÏUH± ip?;·e/¹òqõïßßUG|\îó«nçy±Lü„3)Õgeãÿ¢×ššWyÓþ¸‹úéǪ¨ŸÄä²É¸tŸrÁ¸¢ìßr߸X…@*cÊ„ °g\.÷cÄ ãv\¹ŸjéÒ¥.’®¼.Ÿ–ãR™©Î礲+æÏŸŸÒ¯l°*[ñ|d4îQóqñ–ßç2w #À¸¸ Hú°‚2.•Q9ÿÄ. »°Ð|\$z®nëãâõtÚß|\QÈÇ•¼y&ýTÄfT’®<ϧEç׋q©ÌTçs"veRee¥«^¶bÚJ?uÜ£æãâ1 ½ÚcÄm IDATÈí ÑóqIVPÆÅ•ʸtíñ›%Å&ô«ÆÇåú†X€>. É"‚ú¸LÌØ¿|\QËÇEZ°`‹Íøù¹Ô|Zt~ýØŽ®ý ¸Ø•Ÿ¨^¶c?uÜ£æãâ1 ½>—¹’0.ã‰Ò‘0.QNf\¹d\*CRóeaK$îã"_ÉqÑþ9k ›‹¤ú¶àÅÓ“ qñ¼IœmÙ>#Ï—éYâqWá0.•méX•_¬BbRÄP8ã1í¶sŸ•M¯ Œ‹ÚÓ]§mÉÆø~MãáúòšCÆ%± 5RÒžM{´ï‡UH¾0õ1 —kϦ=)l,|\Îëã:×ú†]‰G˜…¸xÞ$ζlž‘K>.hoN¹d\*Ûâ¬JÝÎEŒ„˜1•ñ˜ö§nç>+›<^AµÇ¯Ó¶fcê~½ÆC}œ—KÆ%± M G¬tòeÁÙ’Iä S™™ÉÇEûçl,ù¸È·µfÒ”ÆbxpCâ]HŒ‹çãReóŒ<ŸòqwÜq)ûÏf>®l3.5ïšÍù¬ªªÒ2)ÎÈtR·sŸ•m/[ÆÅÛ£ãjk6¦î×o<¢À¸$V¡z³Æe-a\¢(K—(ë7®þ>1ô«ßØg±å¥30ä›+ñöSãRÞ?áÃÚêÓÚü .øñ?PuÏ0üäWïãök’³ƒ [öàÈ~õοêxü×Üú½Oý+>úûDgûO~õ>¾7õ0 8<ÑÆ¯Þ„«fál¯ÿÏWèÙ½½¶í‹ç5§¼×¹sgìÚµKû8€Gf΄n½õVë_=ÿüóÆmÛ¶mCŸ>}œõ¥K—â[ßúêêê0räHTUUaÔ¨Q¾û˜?>®¿þzùÔ‰D¢´ Sé‹ÝM€–`ß¾¼þøh×ö–àÕÕŸâÔ»;å7lIÌ6×¥>/ýÆåI(ºy[ƒq°ì¯á®ßopÚkø²—|+ñˆî²óÝêö(ù¸tí>þëa®úpOÙ/;¿JKcøÎÕÿT”»™˜î¦ÅOŽWUUaÚ´i¸âŠ+Ü3ÅV½{÷u"uõöîÝ›™‹DaôLþ”SNAß¾}=YÀÙg»™–.‰D¡o\¯®NøŒîÿÇP×I¿|‹ëý.JœmíÚÅ0p⋉ì§=ç¼?êÄn8ñØ®Nù#ûuÄ+oý‡÷퀿½ñoÀÊU‰×Û®:ÚÙÏá}:`Ñ Öõ‡?Õ:õãqà÷?\{é‘N{(Fs³{ÒHý¸û6:ûQÛU¥Ö¿úûýSŽ£_ï2ìÝ—Ø~Ok{^¢ã+**ÂÀQ[[‹¡C¿ <çœsðÄOॗ^rÕ¹ð çž{.>úè#œtÒI®íÆ Lš4Éi—o×ÕË´jkkgò¯½öN=õT©,`ÆŒr£‰Dm¦´æ»¶|Ôˆ~½ËB×çUéf[Ï=÷N?ýt«²^ E"‘(R7®úúú8ôìÙSFC$‰D‘WL†@$‰Drã‰D"‘Hn\"‘H$Eâ2 "‘H$’—H$‰Drã‰D"‘ܸD"‘H$Ê3Åëëë3º ÁÍ´ËÅ_ì¹=ÓK¶÷—륭7߯3jý ÛŸSN9%Pù³Î:k¿ºîe‘EYd‘EY¢º8O Ï<óL×,ìÄOÄ€œ8­Ÿ~ú©“ÐT·$Ó¼ÀŠ+\Û/^Œ·ÞzËI({÷Ýw;‰W.\è”{â‰'kÖ¬ÁÛo¿¢¢D*¬nݺaðàd"Xµ>HÚùÁ ´5‰°º¿ ¾¾ÞUŸ·¿`ÁÔÕÕáòË/wʨýâÇÃëóþðí\o¿ý¶küxÿ)…Ô¢E‹œã©­­ur5ÞrË-xÿý÷œ‚||ýúïמWûm1ž¿øÅ/°yóf'ì!?~Þ¿íéŒ%Ñ­¯¯wr,òóËÏ_O·?3fÌÀ‡~ˆûï¿pÿý÷£¦¦Æ_Þ>/ß½{w”••aéÒ¥9_"‘H$‰D¢4 ×СCBõÉ'ŸÄÇŽñÅã§vZ¼¾¾>¾~ýúø³Ï>ë”áëõõõñ)S¦8„kÅŠάnâĉñ’’’8€ø¢E‹âgžyf<‹ÅißGuTüì³ÏޝY³&^SS¿ð ãâ=öX@¼[·nñÁƒÇ¤Ô/**Š/]º4>hРøc=–²?ñƒ:È©ÏÛŸ:uj¼¨¨ÈU@|áÂ…Îßêñðú¼?ºþ2$~ê©§¦Ô×õ@|Ú´i®þtíÚ5þúë¯Ç=öØøÄ‰ãŒ0 >`Àíñúõ߯=¿ö39žgžyfJyõøyü¶§;âsæÌqõÏt~uëéöçøãwŽS7¾¼}]ùx ~ÿý÷;ëéž/Yd‘EYd‘EYB/©®°‹i•OË/~ñ «/èé.ô…·-—¶ì[§ú…?ÊãÁÏ_˜ó…óc{¾d‘EYd‘EYdIcÂ%‹,²È"‹,²ˆ'XŽ?3Ëa‡º®ú Yd‘¥À<\ªæÏŸïxXêëëÿF±¢¢O=õ ¦¦€Û£4räHlÞ¼O>ù¤ãáž‘hÒŒ3uuu€x[·nuê”ÿÞ÷¾çªçwâïÿ{›]ÿ™¾ž2­Å‹»ÖùõʯO~?”û›(ªJ™…ýô§?òÉ'ñ>ú(^WWxWQQ/))‰¿þúëñšššùoæÎß¼y³Ö£#‹,ûÓrÝu×Å;vìè¬oذÁè!Óy®ÔòºÏ÷¨ñuY ëúQ={~ž?›ë%JË€â½{÷Žˆ×ÕÕåÄåeøðáñÒÒÒ8€ø'Ÿ|¢õœòñý¼øy˜ùÿW›Ï‡­™_¯^ýZºt©ó÷7¿ùÍ6»þ3}=ezY¼x±k]½^ùõ©»ÊýM–ˆ.2²È’¯‹ê¹’EYdAŽ<ò¸—åË—‡®Û³gÏøµ×^+דÜe) ¥@|úôà?ôRQpê©À«¯æ7úkß8æàí·ý÷Üs'ŸŒfÿDÑÒ]W^øj_ l+àÃ÷de¿™Þß®†bt,kF¬(ó}}nõA8ýÄÏ2ÒÖÅóšóúzéÙs‰|h" ®]]»€––¶ß×7¾TW·MÛEˆã¢úJ,îùÃHŽMÿÚr|DÙÕ’%=eDû…bpðÁÀ téüìgÁ騏þz [7`Π¤˜<¸ë. sçÔíEEÀÍ7óçÅÅÀرÀ=÷$^ž«Kàî»e o_`æÌľn¾Ù¿¼Íñþä'Àµ×C‡&Ö¿û]à§?ÈböýïwÞ |âx†  nº)õxࢋ€Ûob±DùÛnK¬·þ9E·Þ üüç‰IÕðá‰}]s 0mš¾÷Ü“/ÒС‰}ÐvUÔ?5õšz<¼¿¢Ìë¾?öÁ§Á{›:ž|å`ÜQUŽ–8ðàòCœr·<Üñ8pϲ>˜ÿ¿åhnIÌnÞ\ß+ß9Ð)§Ö€_-í‹_þo9ö6¥ìïvÁ-÷sêëÚêïÝñ³Góÿ8HÛÿ;ªÊ]“­[K\ýöœ¬5ãÝMñØßz`áÓ‡bñ³½°µ¾=¶šø@œ~âg¸uq?¹PB¨s‡ÏqוcAëÄ€ë~‚ÙÓnEçŸãÖ\‘²tç‰ÿÏ6êÒa'Nøw|ï¬_;ï2èELû°ÕþU•v؉ W|®8_»®}øÔá3zÔ+8þÌ»pp¿5ûƒK0àäG0áŠóÑñ m8qÊ-(ëò FœSgüåßEQ,1?~â¯0~æ…èyÄ›Úöo¿Ý{2qÈ€¿cÌ÷f¢×€¤ïæØ¯ÿ½¿ö"`Âçã€Î;ÇoÑ¿êêÄ=+ˆ¾¾ó|ï“Öœƒ÷Õk·Çâ-¹ëe ÝýÿÙ{ûð*ªCßÿ»“C’"!¼6 áDòŒTµD·þ BµÒ–ªõÖÖ–¢U[ªž bU.zßë¹=´Þ‹G«>p‹çVDOшU^¤ë÷ÇfvÖ^{Íëž™dg?ϳÌÌZkÖ¬™=‹Ì'ß7pßžo¢×ñýøñþ[Pyâcü|ïâÄö¿}ïRäŠVÀwÿz'Ö¾w)Æ}Íuÿt?ñ)~ðÑmˆŠV¬|ÿÿKY6Ú›x(qÐ>/ýãÝóAÏžÀ7¶mc|¯ûñüdG—¢ƒ¨ûÆÈÉiEãÜE)ãK]ïtü·={ßýnüÿóòx¿&Y6áêÛøóŸÃ‡Û&n8y2õ‹ùèÑø„àöÛS×G"ñåŸý øá—_öî߬¾÷=}yÆä%''ÞÎ%KÚÖ}ôððÃÀ„ ÀÁƒ©íS·×¯\þôéÀ+¯7Æ×]pA|ùØc@¿ÓÏ€;vÄVR_ÎÍæÏ¯z<çŸìÛŸ$Ý{oüø…ˆ/ÿò—©õ——Ç×?þx|ÂYUÿï'Ÿ“&¥¶¯¦&~<û[¼Œ™3«¯Ž·íê«Sûãå—Ó.mùxÔöÙüŸ¥[{—Lü ðêönèÕý8~ðÏû±l}?Œrÿ÷?Kñ³Ó“àÔ©¾7ë¿ñÀ³½RÊS÷7&>3&|†ß<×+¥¾s†ÆÅçü-±¿Zþ–Å(éz7\úWì9ÐE{ Çþ‘“˜l}øIŒøÚ—(-jML´–ÎýGÿž‹{Ÿì­Ýÿþ[OäD€ËÏû ¿q§Nÿg[)žúŠÄ6“†‡ŸpÀ¸äȱn¸édéüÆ~‡âÂCøÉÜï¢Oål{wŽ놢3ޤ¬€÷ßß‹ðË~†S§rñÛ¾›øÙëoŸ‡s†þ_GõË?VŠ?®zÜtYGìã”ÈÁ[/Þ„’3wãµG/ IÚæï‡ÏDqÅ€²ê·ñù_‡BœŠÑ|º÷lDrO ¿ðsÓT4›l ž´Ã/ø5ò ¿Àˆ âÎÒªˆæÃ_ß™‚²^ïàã]“ðÕ‘8ÿú9ŽÚ/½|íkÎÏûÿ)½S½ˆÚ¿ïÀk%M8˜W™4‘1Ö@T´âûÿ};–|mMb}K^OôÿÇû€!ÇÞÂÎÂá8‰ßK¶Cž8²Ö¿¹îŸî­ñq~o<Œ®'¤,À•ƒÿ ¥­ŸcÅûW;jŸ—þqŠîùàã{îiÛÆ˜`-]šþó“EŸáØUÈëry_¦Œ/u½ÓñÕ^|ü1ðë_Ç'ªÆó!Ù@ ¯›YnðÓŸÆ?$ûø•æ· ‘tÅ_>,Äœ¦OSÖú2Šží…[¯ÜHÝÿõ~WüiG7\É_Ó.‹¯ºç_þ%þPÙY9ÿú9øãª'o_Vëâ–~AÐÐL™üâíÓ?¾{®üoì8|¥dÕ„‹Ý@!„B!þCC‡B!„B8á"„B!„N¸!„B!„pÂE!„B!œpB!„B'\„B!„B8á"„B!„@‰Àù矟Û¥KÔÕÕáõ×_ÏŠã-++áC‡pêÔ©ÀëºâŠ+°qãFOûF"\pÁØ´i¯HâˆiÓ¦áßÿýßMÇÓÕW_uëÖñ~@!„PøãÿhºNû® /¼6lH|`åÊ•xä‘GÐ¥K—ÄúY³f%ö™:ujÒrïÞ½ñóŸÿ¼Ãt½÷Þ‹Ÿÿüç˜0aàÛßþ6zè!äææâöÛoOl·aÃD"ÜÿýX½z5¢Ñ¨íñt)b?mEli+ ¸\`ê‚“èR̺¹5eû®Ý€ó®:‰œ\àŸnlE¯³fý uœBli+J*ΟwEe.:™Øïò·"'7þÿ“æœÄå?jEŸ!úÜê‡~Øt²¥Ö_V%Ћ·÷’ïµÕwÎ¥'QSÊQû6n܈G}ÔÛ¬?ÅW\uëÖ¡[·n)çCÇâÅ‹ñ»ßýW_}5Š‹‹ñË_þ=zôÀ]wݸîºëðàƒ¢¤¤Äv}ºãµ×©S¸ÿÈQ”Ÿ:…§¾8¤Ý¦°°÷ÝwŸ³PÆ“º¬ãüóÏǺuëpÛm·¥Œou<ëÆ÷w¿û]üö·¿ECCƒ§þذa***RÚtÍ5×Øî«ž]ûäãËÍÍÅ•W^‰ßüæ7ÈËËK9ÞœœœsÎ98ûì³ñ/ÿò/Úó­ÞÜï™gž‰eË–¡´´¿ùÍoL·[·nrssmË+--Å£>j:Ö !„’Ùh'\/¼ð8€ë¯¿±X,ñ µzõjÜu×]xá…°víZË‚?úè#üèG?ê9kÖ,lÚ´ ?ü0 ¹¹{öìÁ¢E‹ð»ßý/¾ø".»ì²Ä„!''999øÎw¾ƒåË—ÛÏWG ?‹&–Ë«½oEðÕQ  kêög”þ,‚‚B ¿ PQ-ð¯+¢hÙIÚîèç”UÅ'Tgöhù0‚S§çCÿýnr¢@—"ý„«¨¨Èô7[jýŸˆ`ó†\ <ûŽü-¾M¾ù]€÷·å8j<÷Üs¨­­õtŽŽ9‚¹sçâÁL9*3fÌÀÞ½{ñÝï~C† ÁÉ“'æp饗"//?ü0jjjl×§;^·¶â¥ü<ü-'Ý„H{¼ªãI]V©­­E]]æÎ‹Ûo¿=e|«ãY7¾·mÛ†¼¼<”––ºîÚÚZüéOÂÁƒ“& /½ô¦L™b»¿z~Ôö©Ç‡Æ÷¿ÿ}üò—¿L9^cÿýïßûÞ÷Rηz?p{¼555xõÕWñÅ_$&p*C‡Å;#“'OÚ–÷Å_àÊ+¯ä·!„ÒI‰ÙòJa&[ÚŠ K£Ž·¯¨¨À/ùK|ó›ß ¥}øÆ7¾[n¹%´>)//ÇÍ7ߌþð‡þüâç?ÿ9–,YÂÁœlذ±XŒA!„d V¯rÂÕAf½×û;(<Ã×r;šÃåÔ™qêàïX9P„B!Ä¿ W­3#;[@²ã¡s¼ÒubJKK1iÒ$íoTg¢®®?ü0b±6lØ€^½zá¶ÛnCee%î¼óNפsHV­Z…‡z¶ÇS~ê6}þþðù€'O⎣_¢ì”Àÿ:tØ´ÞoüãX|ìïÈpî‰ãâÖ:Œ>'Oâž#GQuê<|$±ýó_‚ñ;®Û¾üÿû‹C˜xâ„¶l+‡Km¯7y þã8Æ8§¿8„kÿþwüáó/´í³s¸dgFçÊãKçà¨t6‡+¶´]KÛ–Ï(úh¼<Õ©Ó¡:\êõkç@©ý!£»?¸é¯þýûãæ›oF·nÝðë_ÿ0a¬Zµ ãÇÇwÜ[o½guúõë§-ãÆoĺuëpÏ=÷¤}¾Ôû‰“úu÷?yü÷Âo}ë[®Ç—ÛþU/§N™áÔy¹¦Ûÿòù®¨¨À-·Ü‚h4Šx e|¸mŸîûHvúìœd }Y~•V=ABéøäHqfTg Hv<^xáìÞ½K–,A,óʼnY¶lNž<©}(U‰šš|ÿûßÇÎ;“¶kiiAÿþý]w‚Î!9uê-Z”pÕ¬Žço99˜ZÖö´¼;7?.ꊋÿÿkþ—÷Ÿ/(ÀEÿø O?;ú%®îÖöÀ{ 'O; £Z[±=š ãÏ&¼‘—‡|!ÐÝä·WV—Ú^Ã[[Q$^(ÈGmëIÌëV‚íÑäWåöæ—êÌè@Õ!’•ÎæpUöØ»=‚/¿@âcLß q xåñø]:ÕqR¯_;J×2:§ÎMíݻ˗/Ç”)SðÉ'Ÿàê«¯Æ 7Ü€ÒÒR,^¼?þñ‘››‹Ë/¿‹/Ö–qöÙgcîܹ¸ñÆÓ>_êýÄIýêýO¿›7oÆã?Žßüæ7®Ç—ÛþU/'NÐæÔy¹¦Óÿêù.//ÇPTT„®]»¦Œ·íS¿T§O]¯û~Sq;¾b±JKK±råJí÷Uß_„B:>|¥PCnn.~ýë_ã†nè0múÃç_à›I’ ®Ž.B!„ÎK»9\̹!„B!„dó„+€Öq)..N¼¯o¼cž››«ÍŠÑ9 jÎú޼ÇÁ‰£ ;uuu‰WѼäj9©Om¿ãfçÈŽƒÁ·¾õ-455™ö·ñQûßíñÚåÙ9~jý^ŽŸD„B!¤3’¤:L:ú÷ïE‹᪫®JY§: ºœ·ŽƒGAv,Þ|óMŒ;óæÍÃM7Ýä:WË®>]û­7»úTÇŒ®]»bóæÍÚþ–sÒÔþw{¼v9@vŽŸZ¿Ûã’B!„B: ÖáêÛ·/æÏŸŸþô§<Ë„B!„À°u¸Ô>÷Üsì5B!Šƒ&~Ãî„ûï¿ßùÎw<—¿oß>ôíÛ×rŸgŸ}6ñÿ—^ziÒ:uÿƒ&m¿`ÁìÛ·Ï´þ¾}û&­Wۢ߶mÛ’ÖoÛ¶-©¼K/½4i›úúzÜÿý¦ë·mÛ†eË–%ÕwðàÁ¤íåã9vìXJ{ ËxõÕWŸ_ýêWIí“ËÖõIaa!Ž;fº½ÚŸvÄb1Ô××'¿ºÿ¤I“’Οú×'åö¹©žxâ ÜtÓMž÷×ïÔ©S“Îßõ×_ŸX®­­Mi¿ºï¦M›,ë”ûC=×êxPÇ‹®,«ñbD+¸íSƒÕ«W'züºëOn¿î\«Ç#ÿåæcÇŽYmmmÒø½ôÒK“Æ¿êþ}ûöMº^´Wê¹öÒßé\¯º}Õþ—û×ɲÚ_òýí'?ùIÒ=|Û¶m®ÇûW_}eºmâoL¿øâ‹ü6'„B!„ÉaB!„B'\„B!„’q~Ú>W_}u‡iKß¾}3¶/¼ð´ö¿ùæ›3î˜y¾²ç>qÎ9çð~™e÷ãÎÔŸNƯŸ÷³Î~½ØÝ?Ó½?fJÿ9½^Óý¾á‡ŸLü$~Ãõæ›oâ?ÿó?³°U«Vaß¾}‰?Ó}ß}÷áí·ßN¬¿çž{ðÑGaÑ¢EÚí—.]ŠwÞyEEE€õë×cÿþý;v¬v¹½Y¿~=¶nݚȽ’WþóöO=õ€¸L÷æ›o"‰ÒžG}4!F£Q´´´ ¥¥¯¼òJJûtëÿüç?c×®]ÈÏÏ”——côèÑ–uÞ|óͦëÔñ¡ž_µ¾îÝ»ãŒ3ÎÀ“O>ééø—/_Ž?ýéOŽ·Ÿ1c`Íš5Úö Ï—õùR¯wµ=òõ¤ë»ûÍ]wÝ…½{÷â[ßúVʾjùçœsöîÝ‹gžy&q?Sïw*·ß~;Þÿ}äææ¦_UUUB¤=pà€£öÏ;|ðV®\‰X,–8/---–í_¿~½v¼¨çW½_w´û¯ÝýØíý6ÝûÚ?êxPË·:Ÿºñi‡ZžÕxÖµWí/µ?Õñku?sr½Ù_»úÔû™ÝýP]VÏÚÿnîŸê÷½îþ ö‡ÝýÓîþhw~åþSï/ºû¥Ýó—ìîGêø4hZZZ’ÎZ¿]íÚµ+)ÿ3]äó¥ö—“ïu|ÉãQwüé~ß‘Nö®«®ºJ---€Ø½{wbV6}út‘“““X?sæL‰D±fÍš”í§M›&, $ $ˆnݺ‰×_] 6L»ÜžŸiÓ¦‰h4š8õxÏ:ë,qÑE‰mÛ¶‰wß}7©¿üñ@ÚdœÝ¿©íS×G"ñä“OŠáÇ'ÚW^^.Fíù_áäñ¡ž_]}«V­+W®L«.¹äÇÛ^vÙeIãQÏAx¾¬Ï—|½ëîêõ¤[]]˜8qbbÙê~3}úô”û“Ußcç?øØ»w¯ö|Yõ¯î~öæ›oгÏ>[œqÆÚýåö92ÑòxºöÚkŸ{y¼¨çWw¿îH÷_»û±—ûmº÷¹tãA-ßê|êÆ»ÝGýþµÏêù”û˪?ÍúCý¹Õõædü:écL;¹ÊËêùѵÇÍýSý¾Wïj8½šÝuçW½ß©ý§Þ_äcqòüååûÍì~¤_eeeIçK­ßï7õ|©çÞÍo uãKŸòñ{ù¾ã§Ó~’/h·Ÿ»îº‹Ðçù矵>'ða}*++ÅM7Ýäyÿ°ÛËó•Þù êcö€ÆgÕªU®?²õ~Ý÷ƒLÏé~–éõ9½?º9¿ñþÂ?ü˜"DÓ–¦¬ú•Þæ±›}/³âÜ |ù ¯evéÕ_ýõ«Û¾ ëëmì}do`íûzÏ^xéã¿úZfï®øèØ—YùkòëÁªwßáûÄ••ÐÒòšív^Ý»×{®'ÝýÛ»|Bt\xá…xá…:m}„tF×;?y/Ÿó2@´ üõéøÃè]ÿ_)Ë*êú7íÀ§ÿ÷SÙy§ŽŸÊ¨é5«Wâÿ‹‡£hPê;÷‘h$±Ý¨U£y¥yÈí’‹Q+F¡°! * _»þk‰ý†ý¥pDl IDATbXâÿ‡/ŽÉ¯NF·QÝ´íqßG“­~×ôKio~E>ЇÇÛ·Âyûú_Ûß´?Î}ã\Ëv¨ëÓí½ìÅØ'œ¿oþ‹ú¼5c¦éúÇÏKZ.+(@—Ü\<2¾ŠŠqæg¾7dxb›_7œ“øÿcÇcÛ7.E]ywmù«ÆM }²õíÁC;Ìu³êÝwð¿§L ¬|]NàÚµk-×{%//óæÍ<ýôÓvÿ»ï¾;ñÿ†[ %%ƒ‹µ ¼|´41˜‹9s>Àøñ+1pà@\qÅ€×^‹OzÆ»3g¶90—^ú&.½4î<•—Dii<µýêýE>]ùêþn8óÌ3QWW ÇIí/Ù4hzõŠOÿèG?òt~äòuÇã¤>'篽PÇŸÝùuƒÚªÃeæhÝvÛm‰ÿWDÕ´s(½8auuu6l˜íøprPû—ØL¸†,’øá±¡llàð_§,«¨ë‡ÿj8¿u{VìÁ_~ô—Œêªæª¶‡ò1e8ºëhÊ6…ý ñù–Ïã7CK¥õ¥ô?á¿'OH«çTŸþþöÚß?ß¹l'¾úø+œ[§­_ˆVlß¾6TâùçSúÃIùÕÕSñøã}ñúë7`çΨ¨¨mü„=^u\ýõIË={öL<ØáСCñï—ª*WåÆb±”öªËóçÏÇsÏ=‡'žx[¶lñt|rûu÷ùxtå«Çï†O>ù;vì@II ZZZ´ý5aÂ,_¾³gÏNÚwþüù®O-_w<éÖ×ÞÈçËÉùõÊüùó±k×. ÜvÿmmmÅòåËQYY‰ÆÆÆ”}¦OŸŽo¼Æ KüQ’©S§¢oß¾¸á†R–§M›†7¢¹¹91î½÷^ÔÕÕá±Ç³­Ï`Ò¤I¦Jî'×Ú¿D_) ‰¦-M®ë­[]‡7¼Zƒ~ÏMäwÏG¯ê…½«÷¶Ëy»y†=çî_{Ô„+_ ol}{ðP<ðnÇøŠ‚.˜Ý éµÂ––TVVòØCøUxÿýÿÅŽ`„ÆÍ7ߌåË—wÚúxþá„‹.?8;¸Ãú8®¬‚qCgq¸.\˜ôgÄ :\„dt¸l0)ã¿‘+FJ†• ´¾4á&íp Y6$É“R—Uê×¶ýê7·0 ÐcJŒÙ0ƕåbæt©í ÓáêÑ¥ †—Æ_i}d¼þWèªãE‡Ë_Ü:\ê;ô²s¡[$;[vE:d£Ãµzõê¤>¥Ã•ìpíÛ·û÷ïOlóûßÿï¿ÿ>¦Nª-_v¸tç#ÈñÆx5s”ŒrÔëY]¯s>œ8@K–,I)ߪýºíÔgçø¨åÉ”ÎÁ²ÃΡRûË­Ã%·×MûŒþËt‡KE>Ÿé^ot¸èp¹A4miM[šD$'"š¶4‰† bÜÓãDÓ–&‘[˜›²llo|tëû\ÙG”5”‰Šs+R¶oïüùÆê9Õ¢hp‘ r sE·QÝÑðXƒ¨žS-&¿:YLþÓd1ùÕÉ€ò³!¢vi­ ûŠ‚Ê@4nnŒ—¨º¤*Q~´8*Æ>5V *ÒÖ¯kç¹oœk¹l|òËòEÉð’Dý•TÆ^‘/š¶4éÛˆþ×ö·í—³×´\¿¦^Û?ú£òüJÇn3š“#ŠóòÄ]õ ¦Û¼5cfâÿï®owÖÄ€¢bqæé<“-]büùNqY¿‰í‹óòÄóS¦‰Á%Ý´e¿Ý<+ô?1úíÁC;ÔŸ<Þ«·«í8 ˆùóç‹>ú(ñQ×ãt6îO{¿øâ‹¢¶¶V ?W|ðAÚÇ‘nyaí÷Ýw bàÀâ쳓¯Ë‚‚2Q^>útFÌHQR’œ3{ölqâÄ @477'rŒD|Æ$jjâ}‹µˆ³ÎZØ/KÎQš2åI1qâDQP¿¾O:%ª«§‰nÝ‹’’A‰z'O^Ÿ´ŸQþyç¥æjUWO‘H<×§±qÍéã)O±`Á‚Äù÷²¿UýĈÉ2ܨO!f̘‘Èzê©§´åÏž½Ûô|=~¯òõi|6mÚdz=ëÕëþLûüùóň#´÷ ]û­¶‡Ã? o_EE…¨¯¯O”¯–WTT$ÆŽ+ˆW^yEyyy¢¤¤D<ðÀ¶ý¨îou>Œþ’s¬ $zõê%ˆ={öhûN=~»öÉýç´¾LÉ’RÏgº×›®?Ô2]ßÜvÛm¦9jn˜]έ—\¯Å‹;ÿnúGw?æ‡>ô:ép¹ë:\Î~Õ-­p¡³”Ì‚ °zõjvD€Ðáâù#¤3à —_œÌáòµ>:\™.â:\„x‡N!ÁqÎ9çà7Þð½\:\ºY¨&gKEv¤€Ž•ÃxsÌd‡KÞßI´§ÃÍÉÁ?÷—»fÂd}–•£¡{„«E‡Ë_‚ÎáRß9—®troœÖç”lp¸®»îºÄ¶t¸èpÎnÙ¸ž¼äbûY•¯[ï6÷Ë­Ã¥Öçö~äÔ™qãT…MGv¸Ôóïtü:Aîÿ 6Hu¬ÊËËN̘1#þ¼²f àž{îÁG}„E‹i÷W¿ï¬ÚëæzV¯'·ý±dÉÛ:ÕÔm¯^_vçG·^¾þu×§Õ÷¹z>n¿ýv¼ÿþû‰¸u½3§nŸ2ábWºœ-™ü²|ì¾g7 qsü4t¤®ê9ÕýÐhŒ\1ãžç¬}ÊÏäýíúذ˄™Ã5 k^û4ž_1âôω ¨Áú‰çâ‘ñ“ðâ×§`W•Ãe ç†È9\@z¹7NêsC¦åp577cáÂ…èÙ³gbÂd—Ãõàƒ6mÚ”9\Ë–-CŸ>} „ÀŒ30kÖ,ÔÔԘߟ¥.õ|=~¯êõ6þ|Œ1÷ÝwŸvY¾žÒ9¾X,f[¾ºÞKî—UN“šó¥kÛû‘]î‘Z~¦çb…‰îüÛ_¯Lžì¶—¿Ÿ‰2_jÚÒ$š¶4‰HND4mi ĸ§Ç‰¦-M"·07eÙØÞøèÖ÷¹²(k(çV¤lßÞ¸xçòìugÇß½ŒFD´(*†,’´¾~M½ †ülˆ¨]Z+ˆÂþ…¢ ²@›ãÛF ª.©Jì-ŽŠ±OEƒŠ´õ:igß«û:Z_yA¥ ò+òEÓ–&}ûÑÿÚþÚrªçT‹É¯N“ÿ4YL~u²È-ÌÝFuDÃc ‰íÎ}ãÜÄÿûÑ•çWZß[3f&þ?6 F éVªÝnPq‰èÛ5^îÖ‹.ÄÝõ âκ1€PT,Î<ã @l9½>ˆËú H”Qœ—'žŸ2M .馭ãíæY¡¿üíÁC;ÔûÉÓ{õv¼íüùóň#ÿ/; ¢¾¾>ÉaÔ9”‹/ÄyL·¼°ö¿ûî»1pà@qöÙg'­+((åå£Oû±#EIÉ ¤õ³gÏ'NœDsssÂñ“¨©‰÷u,Ö"Î:kAÛukI*gÊ”'ÅĉEAAüú>uꔨ®ž&ºu,JJ%êonŽÏI}výÙ?›6mòåzˤ¿AàôxÍÆ‡Óñl|?ó£8\|¥0x˜Ãå®?˜Ãåì7\Ù’ÃE‡2\˜Ã• s¸‚‡9\<$øýÙ1à„˯ÎîpѾ ë£Ã•YÐá"n ÃEˆwèpet¸@‡+êd©Ë*õkë“–Ãv¸T‡ Huºäe'í“.õøtõÙv—:‡ Hu¾èpù‹W‡Ë ¡¾n¼“~æ™g¢®®ðä“O¦]w6:\ãÆÝ‡™3Û:\t¸Ü :Zêõkæ4ŽàÌ2Úi–si¬WC–ŽÃ¥Ö§ÞŸìœ»úÔòÕöÓáò†|¾tËòxt.:\®&\C– Iüð؇ÇP6¶ pø/‡S–UÔõÃ5‡ß:Œ=+öà/?úKFt„1Ù¬_S¯]–É/ËÇî{v77JëK1è Â-NžVÏ©>ý-üíµ¿%~¾sÙN|õñW8yì¤å„JGna.Z¶Æ¿è{´M"Æ”á讣ÚeÛöYŸY}A÷ÇÞ‡÷:>±5Ò­½·S»þ–m[“–Çt¯ÀOFÖáÚ×_I)çtóðJË'‰ŸßúæÿÃcDZÖVý„ýÌžY3Y¹Ó¿k½gÏž)7úI“&%¾”"‘^zé%À'Ÿ|‚;v ¤¤---i×]SSƒ—_~9ñàÑÑ÷8p îºë®ÄòáûðôÓƒ¥‡‘hiy O<1¯¿~vïÞÖÖVœ8q&L@ïÞÓ±eËxæ™aˆÅâý·}û=xöÙшÅZPQ1_|±óô—uü ~׮ߦLy'Nœ@nnnbÂU]= {ölÄþÐŒ3ΨҶyÇŽ{ñôÓƒqÞy¥¬«®ž†W^ù&ž{®Áô˜ï¸ãôíÛWû¯îNöß±ã^<ûl¶~!Z±}ûrlØP‰çŸßÏ–-[†>}ú@3f`Ö¬Y¨©©1-¿ºz*¼/^ý†”óôø {¼áСC€ªª*íõ«.ÏŸ?#FŒÀ}÷Ý窮X,¸þúëM×WTTàÖ[o|ðÁÚöÙ!—¯–§k|²ÚÞI}jùºöO˜0Ë—/ÇìÙ³“¶Ÿ?~ÚÇ7þ|<÷Üsxâ‰'°eË_êë(ÈçK^ö:uìÚµ ƒ'_ïëÖ­CMM 8€ÖÖV,_¾•••hllÄôéÓqã7bذa‰ï¯©S§¢oß¾¸á†R–§M›†7¢¹¹91î½÷^ÔÕÕá±ÇK)_ý¾tr½;ÿVãWþ¾&‰Ç^¾Rt¸Üõ.{²ÉáRá;éA?„Óá’¡ÃÜö‡EEEøÿø|ãßÀæÍ›¤:VëׯÇÖ­[ÑÔÔ¤u¼þüç?c×®]ÈÏÏüö·¿MªC.ÏÌÑr2ÞtëuãÍé÷©™ch—3—õ®lw¸d ûâó-ŸÇ^†–¤¬¯žSÑÆÈ#1î™q‚u¸Ž<Ž£ïE´(ŠãŸOL­P47—®|+§M×_a:\ºáµOãï>(-KYPƒõÏÅ#ã'áůO@‡+üt¸t˜9\€¹á/†L¦9\ÍÍÍX¸p!zö왘0Ù9\>ø `Ó¦Mt¸4d“Ã¥:”êõ£–ïŹtâˆÈËé:cj}ryjûuý—N}ºòÔãqëT¹qr:«Ã%·Ž’çŸ>&OžŒ­[·bèС)ŽÕ´iÓðÍo~ ñû‘êxE"ìÙ³ÿôOÿ„ßýîwèÛ·/î¿ÿ~ñWÕòtŽ–Ýx³Z¯oN¿OÍCu?¿Ÿ3¾Rt¸Üõ.{èpñôàÂépÉÐá :\<„pÂÅ —ýgw¸B§Ã•UÐá"nè,WÐ境!™. 7IÍ™R§°s¸€ÔÜ-³ö忢aczLé1Æ8r¸TTgÍÎñ Úá’sµœ8\Û¥ .€—ߤëp9ÉÍ‘-»Ü˜t`WÇË᪨¨À˜1cë­,Ýþn®h4 !„رcGJ8)¿³;\VŽ“Ùõ(;4ºõª$o¯ÞÔëßm.—ZŸ›òìœ5]XõŸUÿ›åF¥›Ãå¶;K—Šá4ùñýqÛm·%_97Ku´äÜ, îxíß¿cÇŽÅ9眃½{÷â™gžÁ¢E‹´Î—¼½º¬Û^ÍùRë·ëÝ÷³ÕöD™pÑáÒSÕ\¥Í™R§0s¸“%wKFn_÷‰Ý±õŠ­8ôÖ! ,ҷϳfçxípɹZvŒø×gÏ@‡+¼:\NrsdgËInL:0‡«ãçpY9XéîßÚÚŠ¥K—"‰`øðá)ýá¤üÎîpY9Nf×£áÐ8½^íÕûιq“Ëewÿ±+ÏÎYSûîÿ¬úß,7ʧÊMÿv–.¹Ý†Óä÷÷œ›¥:Z@rn,^¼}ô¾üòKôîÝýû÷Ço¼þð‡Ú\/y{uYÝ^—ó¥ÖoÕ?*ºïg?sÌ:3|¥0$èp¹ë:\öd“ÃEg+\èp±?†Ï!œpqÂeÿÀI‡Ë×þ Ã•YÐá"n ÃEˆwèp’yÐᲡß5ý¤:Kaæp™aåpÉëýp¸ §Míu}˜9\‰2JË0¸$µ?uŽ.qëpÙ9ºeÙáÒ­Wsy¼B‡Ë‡ëÙgŸMj{¦çpÑá²¾~U'Æ*ÇÊÀ‰´dÉíþv’g,úTgËm®““þ1Ú¤ïp©çO>ÝxèL—“þõB¶8\Aõ_VM¸èp%S=§Eƒ‹ðáÚRy]˜9\fX9\òút.™ªæ*mÿ¨ëÃÌá2WQ‰wJù¹Îñ¢Ãå?n.+GB·¬æné¶Wsy¼B‡«ã;\í™ÃE‡ËúúÕ91V9VNu;É‹£ã¦>õø¼ä:ÙõêȤëTÉçO=ÝxèL—“þM—Îìp…ѾRt¸Üõ.{èp‘àÂé,É0‡+xèpñü '\öœt¸2jòG‡Ë_èp7Ðá"Ä;tªÉ<èpY`8P‘h$á&Z5*iÃa Ëáê5«ò+òQ<´8Þž£lÛï‡Ã¥:l*²Óæ´>?®EgÅÝ9—KÇc§ÿ¼.±s¸Ìriäw¾UKv¶Ìœ?sT èpÑáR®tr¸jkk!„HÊ rü„1^ÕëQ]V¯GÕi²ËÅR‘·×µ×®|·—Ûút÷7'Né¼yó•¯:c~äpùM&;\f¹Rn ÃE‡Ëñ„‹W*†UدŸoù<þ03´@ªÃ–ÃUÕ\…ããè{G-ŠâøgÇmÛï‡Ã¥æn©eÈN›£úÒt¸bj0¤[)z/î–ȹ\*å¸sGü¼l½èt¸‚ÀÊáRsitï|Ë–êl©ÎH9*t¸èp©W:9\;wîDEEEhã'Œñª^ò²z=ªN“[ÇIÝ^m¯]ùnïnëÓÝßÔû™é÷X,f[¾Îël¹XaâÄÉK:\D_) :\îúƒ—=ÙᢳվÐáb„ .ž?B8áâ„Ëþ“—¯ýA‡+³ ÃEÜ@‡‹ï0‡‹Ìƒ— ª³d¼â7rÅHíúöÈáRs±¤8g~æpɹ[rXýÚäWQÂÎáR-æpOº9\f–üN¸]—º½WèpÑá¢Ã•v¹XºëÕ‰d–ÓgçT¹uÆ‚¨Ï »þQï—n.'ΙÕúLÏá²s€ã÷¬ôrépÑár<á¢Ã•Œì,忢õhÜÝ)èQ²hŸ. -÷JFuÎüp¸t¹[†#–_–Ý÷ì4nnô­?œæpé-æp…ƒ×.c¡¾n—Ãåç;ät¸èpÑáòŽ].V:׫.§ÏΩò’‹f}NúGuæÜ8\N3u}¦;cV°_9Ž.¢‡¯†.wýA‡Ëæp‘àÂé,±?Â…Ï!œpqÂeÿÀÙÁ® Úd}t¸2 :\Ä t¸ñ.B2:\§ÑåLÉŽ’ÝöíåpN•ê˜.—“öÉ—z|ª£eמ0.£%Ó£K ?ý*á#ãã¯Ñáò·—fΠw¸¬¶÷ .:\ªÃµoß>ìß¿ßqù²Ã¥;AŽŸ°Ç+ê`ª“œ*'YîžìŒéŽG—³dUŸz?‘_½Ó9,êñyÍuÒ9cºúüÊáÒ9L^ëË”.õ|Zõ¿èpÑár<áÊv‡K—3e8JN¶Ûá’*cf`8^¶í³8>£eÕ¿úéås´d>ýê+ì<|Åyy8øø$–—ÿ¸q¸TìœÕá²Û>èpÑáR®eË–¡OŸ>‰ãsãp©ç#èñöxÕ9˜ªä5§Jw½«õ©Î˜z<^r–äû‰ê@éùøÒÉuÒ9cºúÒuª¬¦ êëHX9vjÿ{…ÑÁW C‚—»þ Ãe.ÜC8%™ `õêÕ숡ÃÅóG'\œpÙ?pÒáòµ>:\™.â:\„x‡N!™®Ó¸u¸ ür–Tì.µ½ºö»m_:Wɰ”Ö—&Ê¥Ã<Ñá2CçD8Éåò.:\Ìá²¹ÞMœI£;‡Ëk.–êˆõÙå~érþÜ8\ñ1ÝæœÉåéúÏm—ZŸ]ý~9\~Ò‘.³Ü1ùû‚9\ö×@‡Ë— .wWÎ’ŒÃ¥¶W]vÝ>‹òí®ê9ÕýÐhŒ\1ãžç[ÐáÊ,Òq¸¬Ð9v¹\é@‡‹s¸¬1s&ëÏÊáò’‹eæˆÄb1ÛÜ/cæåø ÇI-Oí?/ǧÖgU|Bßyœª00Ë“¿/˜Ãe½t¸Ò¯†.wýA‡Ëžlr¸TètýN‡‹ý.t¸xþá„‹.ûÎîp…þN‡+« ÃEÜ@‡‹ï0‡‹Ìƒ×iÌ%#ÇÊnûöv¸Täu¹…¹hØØ€Sz`̆1Ž.õøìê3h.™EgÕj¾}ÆÌ¤e:\þ’®Ãeæ<Èï„ËΖçÁ+t¸²ÛáŠF£B@;v¤ô‡“ò³-‡Kw½ªË:GFvhœ8@Æö:'K-O®ßm—º¿$¯·r\LïŸ6Ζºìw—“×Yr¸ÌÆ£×Ü4:\t¸O¸²Ùá²r”Œ+»íÛÛáR1&ÏõkêÑ}bwl½b+½uE‹ôí³9>»úÚ3‡ ˆ»WCº•â¡÷vê'°ÿú `cãyèp r¿ IDATW‡Kç<¨ï„«Î–çÁ+t¸²ÛájmmÅÒ¥K‰D0|øð”þ`W*êõj•ó”t¿ué\Æb1K'Ë(O®ßK.–Ú~;H^¯s\ì°s¶Ôe¿s¸ìœ¼LwƬÆc:¹ifÐá":øJaHÐár×t¸ìa î!œÎû#\èpñü '\öœt¸|í:\™.â:\„x‡!™.Ô\)ã¿‘+F@ŠÏ´Ã¥:Tjû’fÑÑHÂ=µj”'‡K‡œK¦¿Ú?A;\¿¨oÀ[’—¥:Z2ºœ.:\þâÖáRõzS ;\v¹;é×êÕ«“<¿®É““'%™æpíÛ·û÷ïw\~6:\²£»Ír¬ Ü8\ò²Ú~»e'õÙ9U:çÇXïÄá²+_í?uût.«û¯®¿:‹Ãe ?/Î:\t¸O¸²=‡KFÍ•Ê-ÌEëѸ»SÐ#>q) x‡Kv¨t¹W2…ý ñù–Ïã_CK\;\fȹdòñëú'h‡ë–m[“'¨Š£%£Ëé¢Ãå?n.ÙнC¯:²Ãe—»“.Ùæp577cáÂ…èÙ³gbÂD‡+ÙáZ¶lúôé“8>:\©NŒÙõh–cåÕùŠÅb)í·[v{RÛoæüë8\VåëúOÝ>]§Êêþ«ë¯Î”û¥Ž?/Ît¸ˆ¾Rt¸Üõ.{èp‘àÂé,É,X°«W¯fG.ž?B8áâ„Ëþ³ƒ;\A´/Èúèpet¸ˆèpâ:U„dt¸t³PÅÒv—Y–YNì\9iŸ™Ãå¤?Ôö„™Ã¥s´Rú³¬ Ý{$\-:\þ’n—:çCvºÌry¼À®ìÎáŠD¢ˆÅZ‹µàâ‹ã¯§ãpÕÖÖB1cÆ„2~¯:§ÃÊáòéRË—¯]ùns¸ìê3˜7ož¥Ó¢:gNQs¿Ôe¿r¸ü$“® ®7:\t¸O¸èpµ¡:P*í‘Ã¥:cºœ0Ù¹²m_ý¡kO˜9\:GK&6 ë'ž‹GÆO‹_Ÿ€WxÍá²Cç|ÈNW:Nˆæpe·Ã%D+¶o_Ž *ñüóñû{:×Î;QQQÚø {¼ªN‡Ã•®S¥–¯^ÿjù^r–¬êKú¾ˆÅ, ·9cjܙœªö&ˆëÑÁW C‚—»þ ÃeO69\*tº‚~¡Ã%C‡+xèpñü '\öœÌáòµ?èpet¸ˆèpâæp’yÐá²Áp’T‡JÍÁ ÚáR1sºtíó#‡K=^9,¿"ÅC‹£VŒò¥?Üæp©Ë2Ìá žts¸ ŒwÀUgHv¶Ìœ ?Þ!§ÃE‡ËO‡«3æpÉׯÙþr®”|=›9 nr¸äòìœ-/Θ|?qšëe—3æ´ÿtåûíp©÷_]{åãél9\êx2[v.:\Ž'\t¸ôN’ìPér°‚v¸TÌœ.£N¹}éæpéŽWÎ;~ð8޾wÑ¢(ŽvÜ·þp“Ã¥.Ë0‡+¼æp©ï€«Î‚ìléœ ?ß!§ÃE‡ËO‡«3æpÉׯÙþ†³¥^ÏéäN”\ž³ååøäû‰Ó\/79cVý§+ßo‡K®ß¬½òùë¬Î˜.×Íèp|¥0$èp¹ë:\ö0‡‹÷N‡K†WðÐáâù#„.N¸ì8épùÚt¸2 :\Ä t¸ñ.B2:\6ôšÕK›Ce¼ò7rÅHÁ;\²3å$KÞއˠß5ýRœ­öp¸dzté‚á§_|d|£vÕñ¢Ãå/^s¸tN†Ù;â²Ã¥: ÌáêØ×äÉÉ“·WEEERŽ••ƒ¥ÛŸ9\þÖ§:@êõ¨Ë½¬MÙ²ÊñÒÕ¯n¯Öo—Ãe—ã¥Þ¯ÔòtÇ#oo‡ZžÝñøípÙÏÎêpãÑl¼ºWz\VM¸èpé©j®JÉ¡Ê-ÌEëѸËSÐ#>‘Úá’)'¹Xòöé:\ÆvEƒ‹ðáÚSœ­öp¸d>ýê+ì<|Åyy8øýoUÇ‹—ÿxÉáÒ9ºwÄe‡KÝž9\ÙçpY9XÌá ~¼ª¦|=êr¯ìM»/µ~u{µ~».»/õ~¥+Ïìxœ8AjyvÇŸÐûçpÙO?êëhÈãÑKN›Ùæp¹ïÙ _) :\îúƒ—=t¸Hpát¸dèp.ž?B8áâ„Ëþ“—¯ýA‡+³ ÃEÜ@‡‹ïÐá"$ó Ãe‚]ÎTØ—UûtøÃe×ý®éçK¸q¸à±Æó,×Óá ¯—ʼyó9\òö€¹Cá:\t¸˜Ães½[8Tv¹Xf׫•¤îï·Ã•n}ñ1ßæ˜©÷';ÔþÐõÛ\,'ŽŽY.¢ÑþÎæpÙå¸y.Ç.:\ÉXåLµ‡ÃeÕ>¿s¸ìúÃ(Çp¼üê§WyAîܯgëE—h·¡Ã<^.•X,æÈá’·¬·Ðá¢ÃÅ.k¬*»\,·×«n?®të33õþd‡Úºþñ3KutT‡Kmgs¸¬rÜü€ÑÁW C‚—»þ Ãe.ÜC8.:\ÁC‡‹çN¸8á²à¤ÃåkÐáÊ,èp7Ðá"Ä;tªÉ<èpÙ`ä]ÉN”AñÐb Š¿b¶Ãeåo©íõ3‡Ë¬?Ôå .ÙÉŠæäàŸûÇË]3a²íö.¿qëpÙ9ºWd‡K]oæ x—ÿ׳Ï>›Ôvæp7~¯v¹Mñ1ÐæéròTç©£äpÉXå†í±ê?£¶_ÝßnðÏáò“LÎáÒG·Ðá¢ÃåxÂE‡KOUsUŠ•xhS†£»Žßá2&ÇõkRß9Âá²ê]ÿípÉNÖ€®ExíÓø»Ä#N [mÐá 7—•¡s$d‡K·ÞÌAð.:\Ìár~ýÖΑYNžÎy2»¾ÕíƒÌá2~f—f´G×VŒÚ~u»åø„¾s9Ua£;?fãÑ t¸ˆ¾Rt¸Üõ.{èp‘àÂépÉÐá :\<„pÂÅ —ý'._ûƒWfA‡‹¸!Þ¡ÃEHæA‡ËÃYª_›úªE˜—š»¥sÊdäœ0?.ÕÓå€ùÙ~;\0¼´ ƒKâåÓáò¯9\K–,Ѿ®s*¬.æp¥çp­^½:©³9‡+B!vìØ‘ÒNÊ϶.³ëÏ(WçPÉëdHÝÞÊéRïVŽ‰ì¤¨Î‘YŽ–®<õø­œ,'ý§ö‡Uù®´¿¯lúß t¸èp9žpÑáÒSÕ\…ü²|ì¾g7 qscb]˜—œƒe攨9a~8\ª3¦Ëó»?üt¸`\E%Þ=—Ÿ—ÿ¸q¸äwÄÕwÂuN…ÃÅ.ïWss3.\ˆž={&&LÙìpµ¶¶béÒ¥ˆD">|xJ0‡Ë™ÃÄ+‡Jç|¨ÛÛ9]êýCç˜Ø9Uryjûtå©Çoåd9é?µ?¬ÊOèép¥ƒ]ÿ§ .¢ƒ¯†.wýA‡Ë:\$¸‡p:\ìp¡ÃÅóG'\œpÙ?pÒáòµ?èpet¸ˆèpâ°.:c„¤.dG)$\®Q«F!¿"ÅC‹ãË+F?‡KçP™­÷Ãá²ê Ùó£?ì.3 —KÅxåï‘ñ“Ðáò¯—ŠU.ŠìpÉïà[½Sîæpu¼.Õ‘Ú»w/öíÛgê øíp¥“ÃÕ®”ë_qbÌr­Ìœ(À™¤ËÅÒµß.§Ë®>ãc•»eu¼n˜7o^JùºþJ×áROvæ¼æ~ud‡Ëj|úu½e³Ãe6þ‰É„‹W2²£TدŸoù<þ03´ÇÇÑ÷Ž"ZÅñÏŽ?‡KçP™­÷Ãá²êÕó«?¬.3föM4vFqøÄ @e—øÄŠ—ÿ¸q¸TìrQd‡ H~ßêr/0‡«ã;\wÜqúöí«ýW÷ ®tr¸:£Ã¥"_f¹[€¹åöþ ;cºö[åt¹=õ~¤Ögw¼nˆÅb)åëú+]‡K>>ՙ댹_Vã3ˆë-›.«ñO’á+…!A‡Ë]Ðᲇ î!œÎ’ s¸‚‡Ï!~ÂuþùçgÕAÿñ̈vf²Ã•I“?¿ ÃE‡‹8ƒ!Þ¡SEHæ‘ÄßYŸ1chÿ…B]¿lÙ2Lš4 ƒ J¼“JüÅÎá j’ÓQðêpµt¸üq¸t˜½c/;]~¾Cž)×èÑm΀õhÑ"9rëÖ­óÝá:ó̉ˆDâ—ñJb&;\‘H±X b±\|qü•c:\Á×ç‡d–ce`•ÃåÕq±[ö«¿˜ÃÕñÆ?s¸È÷q§›põîÝþóŸ å]QÝúŸüä'6l®½öÚv½À;3vW6àÅáj/èp¥çpY¡{Ç^vºü~‡¼³9\õõõxùå—Q\\Œ¹sçúîp:u‘ˆ¡g¾Ã%D+¶o_Ž *ñüóñÜE:\™QŸYŽ•“.7¨åÙ-ûÝ_ÌáêØã1[s¸‚ø>îLð•ÂLgv¸ìho‡Ë t¸‚s¸TètýB‡K†WðÐáâù#¤ÓO¸øG3|xàd—¯ýÁ®Ì‚q.B¼Ã.B2æp™P2¬¥õ¥‰ü(»ª°s¸¬2¸Ôõ~äp©ýaÐïš~ÚöÃõ‹ú¼5cfÊÏÍr¸Ôí™Ãå/é8\ê;áNœ- 5§ Ιèˆû3‡+¼.¹?œ”Ÿm—êl¨Ë²S•ŽÃeìç$GÉîþà4‡Kç¬Øå|Ù9,êþV¹_@rîàÎáÒµ_ÎÝrÒß™žÃe5^ýÊqd-Ç.æpµQ=§£‘+FbÜ3ãR5‡ ?‡Ë˜ׯ©·]Ÿn—®?ªçT£hp>\û¡¶=Açpݲm«öçº.ÝöÌáò¯—úN¸³e çtíLtäý™Ãå~·9\rÐáJFu6t‡ìT¥S_,sœ£”ÎýÁ.çÏ*çˉâ:fV¹_@rîX|BïÜáRÛ¯ænÙõ·Ûú::êùñ;Ç`ÑÃW C‚9\îúƒ9\ö0‡‹÷N‡‹ý.t¸xþá„‹.ûN:\5ù£Ãå/t¸ˆèpâ:U„dt¸t³P£¥¢:Ma;\AMr: nr¸¢99 wkÍ„Éúþ,+GC÷ W‹—¿0‡+üýÝ8\Aæpu6‡K—ÕŽÃU[[ !ÆŒÊø {¼úU_º•³¥s–ü¬Ï,÷Ë8N¿û‹9\oüÓá¢ÃåxÂE‡« £%£sšÂv¸²§9\ºáµOãï&(-KYPƒõÏÅ#ã'áůO@‡+˜ÃÕ>û·wWgs¸t9\é8\;wîDEEEhã'ìñÚQê3s¶Ü8K^ëÓ9X@›åw1‡«cG:\D_) :\î Ães¸èt÷Bg‰ý.t¸xþá„‹.ûN:\¾ö®Ì‚q.B¼Ã.B2:\&Xåpé–ƒv¸ìr°’fÑŠƒæGWýÚzËþé(9\‹ÎªMùY.]0üô«†Œ¿"D‡Ë_Ü:\v96²Á®d˜Ã^×¾}û°ÿ~Çåwö.õúUõzV*óäÄR¯o].—®~câ4‡ËIyjN–ºlW¾Ûúür¸Œþ´sÐ:[—|üt¸œ_o®tM[šDÓ–&ɉˆ¦-M¢acƒ÷ô8Ñ´¥I俦,ÛÝú>Wöe e¢âÜŠ”íÛûÀòS=§ZL~u²˜ü§Ébò«“??÷s“¶“—‡ülˆ¨]Z+ˆÂþ…¢ ²@›ãÛD ª.©Jl-ŽŠ±OEƒŠ´mÛ©kOõœjQ4X¿oך®âŒ>g$꯼ Rùù¢iK“¾}€èmmyùeù¢dxIb{³þ ê×ÔûÖ•çWZž§·fÌLül@Ò­ÔtÛhNŽ(ÎËwÕ7âîúqgÝ@ (*gžï¯-]"ˆ .ë7 ±q^žx~Ê41¸¤›¶ü·›gÙŽ+¿?ß<4ô:­>Ó{õvµýQQQ!êëããæƒ>HÚfÓ¦Mñ󉈫®º*iÝâÅ‹ÿ?þ|1bÄ_Ž£¶¶V 0@ÛžŽ´ÿÝwß-ˆгÏ>;i]AA™(/-ˆòò‘¢¤dPÒúÙ³g‹'N¢wïé"ɉ_G±@ÔÔ\•X>ë¬m×ÙéõÆgÊ”'ÅĉEAAüú>uꔨ®ž&ºu,JJ%ê}öÙg“ö3Ê?ï¼ÇSï¿ÕÓD$ß/ל>žòÄñ ÄÛôâ‹/zÚߪ~â§?ýiÒ²QŸÂQù³gï6=AŸ°Æ«qýΟ?_|ôÑG‰z=‰±cÇ â•W^IÙßøÜ|óͦu™]ß›6m²­_]ï¤>«û“Yyºñ¨ŸfÇ料U«V‰•+W bРA¢W¯^€Ø³g£s§ëOµ=òý×I}výÙ‘>òñûu½ÝvÛm‰ÿß½»íúD"âÉ'ŸÇ?¿ßßeÆr·nÝÄ믿.† &.»ì2@üà?{÷îDYY™=ºíþ!o¯[–·Ÿ>}ºÈɉßß[ZZ´õ;½ÞŒO^^ž())<ð€åõÀOò‡¯†.wýA‡ËÙo¸˜ÃE‚€ÎR2 ,ÀêÕ«ÙB‡‹çÎ '\~=pÒáòµ?èpet¸ˆèpâ:\„dt¸4äWä£xh1`ÔŠ¶®â¡Å(wŒ?Û>rÅHáæp™µOFv®Òu¸tõ©—ßýá4‡ëŸûÍ6‡‹WðØ9\²# {Hu²dgKçè® ro:âþt¸èpùõ©Î‘ê0éMõúuâ©×·±¬Ö§:%é:\f÷3ÊÌIU±Ê “׫õ§ëpÙ9x^êËÔ.³ï#·Ðá¢ÃåxÂÅ®6Ž<Ž£ïE´(ŠãŸOü¼lLŽî:ŠÜÂ\´ç1ôˆO$ÂÌá2k_b‚T–Ý÷ì4nnD÷‰Ý±õŠ­8ôÖ! ,Ò·ÏE¨9dAõ‡“®™}ûÛæp}úÕWØyøŠóòpðñI,s¸üÇ*‡KΩQs< ä\9gKÝ_·}âü”{Ó‘÷·Ëá*/‰––×ðÄðúë70‡ Ö9\­­­Xºt)"‘†ÿ̲eËЧOŸÄñ¹ÉáRÏGÐã'ìñZQQ[o½ðÁzö왘xèÖ›]¿v¨×·±,×§æyÉ ²»ß¨9EòöfÇ+c—¦ËA’ëO7‡Kn¯YÿøY_GÆìû(˜ÃEtð• Ãå®?èpÙÓ™.:[í ®dèp.ž?B8áâ„Ëþ“—¯ýA‡+³ ÃEÜ@‡‹ïÐá"$ó ÃuÕA2˽2Û>L‡ HÍÓa8g~äpéê3ÊWs¿üè§—ŠárÉè/:\þâ6‡Ë'†ã•Öñ¤Q^68\×]w]bÛÎæpE"QÄb-ˆÅZpñÅñWŽép9ÃÌ9²Ëɬ 3GÄh·‡,Ü/Ù¹òËi‘ûK½ÿ¨Ž—ß9\ò²îx:“Ã¥;>§Ît¸èp9žpe³Ã¥:Hª£d·=®ÃeLí0œ³t.³úŒò ûâó-ŸÇö†–øÖN.•™}S':Ç‹—ÿX9\npâ`8q¼Ò!ò²ÁázðÁ›6mêt—­Ø¾}96l¨ÄóÏÇÿÈ.ûkÖÌ9R¯_'Ž“Õý é~‹yvÈÜQŸê\ùå´ÈΔ|ÿÑ9^é:UêñÉË:§©39\êñyvÐá":øJaHÐár×t¸ìɦ.:^A?„Óá’¡Ã^as¸˜Ãå+gJW¾Î‘ô’Ãå4ÇÊm—ÛúÒÍá2»Í›7OÛé:\NY¹}-‡ËiΚèpÑár<ábW:‡«zN5Šáõ&&¨2a;\j{tøåp©ý¡:[í‘Ãu˶­ÚŸë.æp…ƒ•Ãeåxèœ+GËÏ\Ìábs¸ÜaåLéÊ÷êH¹[nr¬ÒqLœÖ—N—Õý+‹iû/§Ê‰#«¶¯³åp9Íuô .¢ƒ¯†.wýA‡Ëæp‘àÂépÉÐá :\<„pÂÅ —ýgw¸‚h_õÑáÊ,èp7Ðá"Ä;t¸É<èp™ ;Za8K*N.ÃÑôΙ¼ÞIûœæpéúC­?ì®eåhèÞ#ábÉ0‡+xüÈá’ß¡W Ùé’ß7sÀ¼B‡+».æp¹Ãìú³s4dGÊS¥:8f¹yVŽ—›.3'ËX¯ÖŸN—“þòÛá²;^æpÙC‡‹—ã ®ddG+,g)égãpmŽ–Yn˜±ÞQûÒè]ýaæpÅÔ`ýÄsñÈøIxñëÓSÖ3‡+ÒÍá’ß¡—øCp›Ó¥¾3®sÀÒWv;\Ìár‡Ùõgåh&î·§)§Û«Žºlç\Ù!ï¯s²TÇE®?Ý.'ýå§Ãåäx™Ãå:\D_) :\îúƒ—=Ù”ÃE§+\èp%C‡+xèpñü '\öœÌáʨÉ.¡ÃEÜ@‡‹ïЩ"$ó Ã¥›…j%3ŒíÚ+‡ËïINGÁÃ¥s´Ì0¶£Ãå/~8\f˜9&fNWPõu´ýÝ8\‹-‘#G°nÝ::\ ÃÕëóÃ’0Ù Õ9:AÕçw‘Ù”ÃÄø§ÃE‡Ëñ„‹Wª£dEUsüðöp¸:;N.£e†‘ÓE‡ËÒu¸ÌÐ9&VNWõuäýí®úúz¼üòË(..ÆÜ¹sépWg­Ov '*GǪ>¿Ïï.üx¤ÃEtð• Ãå:\öd“Ã¥B§+è‡:\2t¸‚‡Ï!œpqÂeÿÀÉ._ë£Ã•YÐá"n ÃEˆw˜ÃEHæA‡K¡×¬^ȯÈGñÐbÀ¨z‡ËȤ2h/‡«ß5ýõkÛ~®sмæpåɹ^2ºþ ;‡ëõ xkÆLËm†—–apI¼|:\þ’®Ã%çØ˜åÐÈΖ“í½Â.:\t¸œ_¯2F9jî•.WOv¬w¹Xº\-£~«ûì¤XÕ§Ÿê€éœ0»A',Y²Ä6× ðÏáR³ú;K×’%K´ã݉.Ç.:\qªš«püàq}ï(¢EQÿì¸v;crZ¿&>Ñ Û᪞S¢ÁEøpí‡È/ËÇî{v77j4¯9\†£$çzÉèú+Ì.¸eÛVÛmÆUTâÝÃñ<:\þ“ŽÃ%çØèrhdgËÉöéÀ.:\t¸œ_¯I÷ÏXL›{¥æêɹ{v8ÍÕŠÅbÚû•“bw|ªfæ„Yåº9>»\³ø„>=‡Kí»ú3Ý“OïA8Ht¸ˆ¾Rt¸Üõ.{˜ÃE‚{§Ã%C‡+xèpñü '\öœt¸|­WfA‡‹¸!Þ¡SEHæA‡Ë„!ˆ¤xZ2a;\j{dgËIû½:\Nû£dX JëKå†ép9ÉáÚ®ø]t¸ü%È.@ÿޏìtèÞ9w ®ìv¸¢Ñ(„B`ÇŽÒs¸jkk!„À˜1cB?aŒW;ÇI]oæxøåTÉåëŽGç|¥SŸ3&çty½ßyuªÂ†9\t¸èp9œpÑáJæŸXÿk}Ø—ÜÕÙrÒ~¯—“þ¨žSÑÆÈ#1î™q¾õ‡Ÿ9\#þõÀÆÆóÐá ‚ r¸tN—[Gà :\Ùípµ¶¶béÒ¥ˆD"><þ0é8\;wîDEEEhã'Œñjå8©ëuׯŸN•Z¾z‘ÓáRÛ£¢¶¯ûÄîØzÅVzëŠéÛç¢?|ÉýJÓá’s·ºF£8|â ²Ë)ÛÆÔ`ýÄsñÈøIxñëÓÐá +‡Kv"T§BçHXånéÞ¹§ÃE‡ËÍþa:\ÙÃe•ËåäúµÃ*7 HνRï'~;\jyªÃâ¤>;GL>žt.u7ýaœ¿ÎæŒY? ÃEtð• Ãå®?èpÙÓ™.:Zí ®dèp.ž?B8áâ„Ëþ“WFMþèpù .âç(ö IDAT:\„x‡N!™.Ý,Tã$©ø;¥¢:\aMr: ~çpÑá –öÎáòór:\ÙípE"QÄb-ˆÅZpñÅñWŽ™Ã|}é8@êõoçt¥[ŸäÕ)µrºæpuÄñO‡‹—ã ®6tN’LP¹SI7ԉݳ~pú•ÃE‡+Ú+‡ËïwÈépe·Ã%D+¶o_Ž *ñüóñœCæpuÜút׿•Óå×=ÉÊJÇ)µsºâzæpuäñO‡‹èà+…!A‡Ët¸ìa¯àBèpÉÐá :\<„pÂÅ —ýgw¸‚h_õÑáÊ,èp7Ðá"Ä;Ìá"$ó Ã¥Ðïš~ápér¹$Ú­®wÒ>Ùá’÷ϯÈGñÐâx¬§?Ü8\@j.—Ýz:\þ’®Ãe–ã#¿Cn–Ëe¶½WèpÑá¢Ã•æýÀ"§Ë.;g*]‡Kw©««Ã°aôí×åZÛ»í/#£¶ß«Ãe´Ûî~©O¦çp鯋z~Üœ/t¸èp9žpe»ÃU=§Eƒ‹ðáÚ3ÂáÒår@Us•v½mû,Ê?~ð8޾wÑ¢(Žv<´þpêpɹ\NÖÓáòŸt.5ÇG}‡Ü*—K·}:Ðá¢ÃE‡+=¬rºüÈá²s¦Òu¸t¹b“&MÂÛo¿Ò~³\+c{·õ©ŽŒ®ý^.#WËê~©;žLwÆt9[êùqs¾ì ÃEtð• Ãå®?èpÙ“M­p¡Ã• ®à¡ÃÅóG'\œpÙ?p2‡+£&t¸ü…q.B¼C§ŠÌƒ—nÊ®v‡9\ödK—™óÁ.ç×¢E‹päȬ[·Nëp­^½:ÉsðÛáš<9yRÒ‘®h4 !„رc€ô.Ýùrü„=^ýª/Hu®œäbùYŸ\¾Îqñ»¿˜ÃÕñÆ?.:\Ž'\Ìájƒ9\dÒÅ®Œ"¨.óÁ®6ì®úúz¼üòË(..ÆÜ¹sS®ææf,\¸={öLL˜²ÙájmmÅÒ¥K‰D0|xü`Òq¸Ôóôø {¼v„úTçÊÏ\,'õÉ嫎KýÅ®Ž=ép|¥0$èp¹ƒ—=Ìá¢ÓÜC.:\ÁC‡‹çN¸8á²à¤ÃåkÐáÊ,èp7Ðá"Ä;Ìá"$ó ÃuÙÉr’;å%ç*Œ.ÝúÜÂ\4ll@)=0fÃG9\P<´EƒŠlëÓ9oaçp,:«6åg:Ç‹—¿øíp©ï„ëœ ÙáÒåàx%s¸‚v¸2)‡‹—{ÔëÓ*‡ pŸ‹e ;%Fn’§D瘸ÉáÒµW—Ûdô£[§Å.WPíßt.»ãSÛŸé9\êù1süÔœ27Ðá¢Ãåx•Í—êdÙåNT™Ž’Ã¥[ß}bwl½b+½uE‹ôíÓP6¦ Gwµ­Oç¼…ÃPƒ!ÝJñÐ{;SÖé/:\þã—Ã¥{'\u2d‡Ë,Ç+Ù–ÃE‡+:\îQ¯O«./¹X:§ÄÈM²sJ¼8&NÚ«ËmŠÅbi×§;^µÓu¸¬ŽO×þÎâŒ9dº\.y}ºÐá":øJaHÐár×t¸ì¡ÃE‡+¸‡p:\2t¸‚‡Ï!œpqÂeÿÀI‡Ë×þ Ã•YÐá"n ÃEˆwèp’yÐá2Aç+NSÎ’ŠêpÉ•]N˜ê yu¸dŒWG® 5‡Ì ß5ý|é;‡ëõ xkÆÌ¶óuú•¾GÆOJÙ–WðØ9\^rkdGKÞ_眘•ï…lt¸Æ»3g¶½•ÍW$E,Ö‚X¬_嘗5N'à ñêpí´«O^ŸNî—ê°å¨÷Õ!uz?Z²d‰¶}:ÇH>>¿r¸TgÉ8^õx:‹Ãew~uÎ’SèpÑár<ábW2Æä³~MÛ;í†Ó”³¤›àÈb»œ0ÕAóêp俢õhÜ]*èQ Í!«žS¢ÁEøp퇾õ‡•Ãu˶­‰ÿïâð‰€Ê.g¤lK‡+¬.·¹5²£¥î¯sNÔòÓ!Û®Þ½§cË–ñÌ3ËÅû?›.!Z±}ûrlØP‰çŸo@‡Ë 'Ž“|½{q¸÷çX̶>u½—ã3sX ÇG¾ßèR»û‘\¾®}:ÇHîO¿œ*ãxäö莧³å~©ç×ïœ6:\D_) :\îúƒ—=ÙᢣվÐáJ†WðÐáâù#„.N¸ì8;¸ÃDû‚¬WfA‡‹¸!Þ¡ÃEHæA‡Ë;gJušÂÎá’s² Œvªë´ÏÊá²ëÕyk¯.ÃÕRy¬ñ¼¤e:\þ’n—êdØånÉŽ„™æ:\þ;\“''OJÜ:\3fLb½•ƒ¥Û?]‡Kî'åËWmm-„Iírü„1^äT©Ž™3X;@v÷³\%3')èúÌŽ×3§ÕK.–²Åá²s€ÍƯS®ºê*Àš5k?“.Õ¡R/uyéÒ¥xçwPT¿ÊÎU4EKK ZZZðÊ+¯¸:¿vã×ìú&>O¸èp%cåL©N~œ“ePÕ\¥]oÛ¾4úHuÞÂÎá2˜Ù7uÒX^P€;wÄÛ±õ¢KÐá ¯9\:'Ã*w Hv$tX:Ðáêø—•ƒ„Ã%÷‡[‡kçΨ¨¨mü„1^æj©¹F:gÈûƒºlç$YŸÕñ›aå´™‹•-—•œŽS(ÿ£…:‡Jv¼ÔåiÓ¦aãÆhnnNô¿ì\µ¶¶bùò娬¬Dcc££ó«b–C¦ë/â|¥0$èp¹ë:\ödS®p¡ÃÅþ:\<™Êå—_ŽÇœƒ€pÂÆ„‹9\þö®Ì‚q.B¼C‡‹Ìƒ— ²³¤:[~åN©8q¸äúUäœ,?r¸Ôþ’±úµÉ¯¢„íp©Ž– s¸‚']‡ hË™q’Ëe`å„x…WÇs¸Ú;‡‹—r½[äêö¹TºÜ+HWŸœKeWŸÛÜ/»ýÕö;Í!3CujÔúÕe¿.?êË´.ÝùqëÜt6‡Ën=IsÂE‡+ÙYÒ9[AäNÉØ9\jýê:9'+Ý.µ? G,¿,»ïÙ hÜÜè[8u¸tŽ– s¸ÂÁ«Ãe`äÌ8ÉåJœ/Nˆt¸˜ÃE‡Ë«\=»\*/¹=:§Ä¸_ØÕçÅѱÚ_m¿“2;T§F=^uÙo‡+¬ú:ºóãÔ¹Óý£…™èpÙ­'Þà+…!A‡Ë]Ðᲇ î!œÎû#\èpñüe*t¸'\!N¸˜Ãåo}t¸2 :\Ä ÅáZ¸p!~øažP*tªÉ<èp™ s–TÜæ\¥ãp©í±kŸ—œ0·Wºõùåpé­”þ,+GC÷ W‹—¿øápY¡s>tN.:\NöO×áúýï÷ßS§NÕ–Ÿm—º,;UjùfõùåTéÊw›Ãå&gÌ*ЫdæÐåùåpùI¦9\~^ot¸ˆ« ®dtÎ’Š«œ«4.µ=Víó”–F•KæÔáÒ9Z2±5X?ñ\<2~^üútt¸‚ ]‡Ë ó¡:]t¸èp¹Ù?‡kÆŒ˜5kjjjLËÏ6‡K^V*µ|¿s¿ÔûƒZ¾Û.»ú’¾/b1Ë@¯N™Cc”תöÂëq_) :\îúƒ—=Ùäp©Ðé ú!„Îû#\èpñüe*t¸'\!N¸˜ÃåoÐáÊ,èp7Ðá"Ä;Ìá"$ó Ãe‚UîT$A¯Yñw¦G­ ü.9gË £½~äpô»¦ŸöøÛÓá€í3fZ®§Ã,é:\fïŒËN–Y—ßÎK6:\«W¯N:t¸’®}ûöaÿþý‰mÜ8\ºóäø c¼ÚåpY9^^.«òí± œ±øoËq’··rºÌÐ9ªV¹„~9\Fš½:f¬ïl9\ªÓ—î«st¸ˆ« ®d¬r§ ûâó-ŸÇn†–7‡KÍÙ2Ãh¯9\rî—züíípÀˆ}°Q€L‡+Òq¸ÔwÆU'Ë*‡Ëoç%Û®ææf,\¸={öLL˜èp%;\Ë–-CŸ>} „píp©ç#èñÆxµÊáÒ­——½ÔgU¾#æ·3f ç8ÉÛ[9]fǦË%³Ê%L×á’ûSw|jw&gLuú¼ä´éþÑ :\$ñyà+…¡@‡Ë]Ðᲇ9\$¸‡p:K2 ,ÀêÕ«ÙB‡‹ç/S¡ÃE8á qÂÅ.ë£Ã•YÐá"nè,WÐ境!™.œ8R.SX—QŸ]F˜º>Ý®úµæ¯bá´ùÃõ˜òª!. :‡K÷js¸˜ÃÕ^9\våwö.3äëOvœtËêöN*Ó¤sÊäút÷?ë“Ë÷âpÉèöW¯—êô˜Ý/UÇ)Ó.'Πn\„1A˜ùpDõƒ|¸"öy’òI2´?Pùq¸¤â†Æù˜‰}¸ØúÙ8[,¬—­ãpiѤÂoR>^äÃeY,åÃõꫯêõÐç³e®Ï ùp‘ùp™†”{|ê;^•øé‹»Ç¾ú¤$Ž–1q¸XŸ&6n›o¬Œ¡8\Rò˜‡‹mOÎ穦Åá’Ò·v¾šùpF\µÝ‡Kìó$å“dh òãpIÅ Œð13P¿Tœ-1R>^¶ŽÃ•Ü0 M=½ðÅé“ò¤|¼È‡Ëò˜ãÃ%ö)òa0ä³e®Ï ùp‘ùp™†”{|šs¼JÅÝ“òÑRGËâò¬O7KÊçɹ8\¬<¼AoºO•T{r>O5)—TÿÍõ&.B ôJ¡ .ãôA>\òP.Âzáä³Dú°-äÃEãW]!.‚ .\UÝ‡ËæàäÃU« .Âȇ‹ L‡|¸ªqqqسg)¢–C>\2„>ª×§Ë½™;ÜÂùWl*Û‡KÇŠfäµs±CÌ·1¨ÓµÚ¦µ5)—œ>X2[ûp±q¶ÄÔqrBó‡¯~Ï?‚'.Ëb¬—œ…¡¸[†|¶(WÕôáê=sªŽìäÃe½ùc‹ùÊ¿bŸ}ǧ9q±ä|¦Øú+³=%údõ'nOIÜ/s}¸X}°>;¦ÄýªN>\Z´ãdî«s>>>hݺõõ1¹¹¹B¦OŸŽsçÎÁÎÎNÒË>^bh©¸uRÈO¥òm½~UKƒ‹âpé40n‘nÈ\‘©×§Ë»­7 Ψ|.1¬¼¾ ¾Øÿì~Ü:r nݤå3S¬™-}¸¤âl‰¹VT„“·oÁÝÞ×ïóF,ùpYc|¸ ùXÈÅÝ’ò¡8\äÃeLyòá2¯=Ö§Hìó¡ÏGËÔ¸XJ|¦ÄõWv{Jô)ÖÛž’8cæøTIéƒõÙ±TܯªNrr²I>~†8sæ "##u~[¹r%ÂÂÂpùòå >X¶ðñb} ¥âÖ±ãjè|j(ßÖëWu‚^)´äÃeœ>ȇKòá"¬wN>K¤ÛB>\4~„u ó'\5Êà".Ëêƒ|¸ªäÃECMñá=z4¾üòKP¦Wõ‚|¸€|¸ôÂúH±q¦Ø|[úp9ø9À½™; Õ"é8aâ¸Y–ðábc|±ú°u®¹Ñ18Ò»_¹¾¼}ã[GðÅÒ‡6ùpYc}¸¤â|h} ”Äá’ò©È‡  8\JÊ›ëÃõóÏ?ãܹsèÑ£‡dýb.©ñ°æü±Å|e}@ÄiöøU7 P‡‹]?”Æùb×¥q¸ä|ªLñ)ÕçCÃÆMÒ¦-íÃe(ÎÅá2ò᪼õ«Z\äÃUë#ÅÆ™’ò¡²¥Wñõbœ.€ÆMƒâÅòÙ¸Y–ðáÇcõQq¸¦Ø/üŸÜ0 «:ã«øÈèÖÓ`?úÕçJòá²<ÆøpIÅùÐú@ÈÅá’ò© .òá2¦¼9>\½{÷Fÿþý¦ÿ"òábÇÃÚóÇó•õ§ÙãWIÜ,¥hã ò³„§¡þ(É—kOŸ 7I›¶¤[»žR.ó .òáÒ½Rh#ȇË8}—<äÃEXï"œ|–H¶…|¸hüë@çO2¸j”ÁE>\–ÕùpU/ȇ‹0òá"Ó!.‚¨~×CÄq¤ôÅÝÒ"åCeë8\¬O•Ú8a–ŒÃØ?°ÊÅáÒ¨Õ‚oÖòö*äS.ëc¬—âwìõ½nÊ;ézå7à“b,µÁ‡ë…^ö­ >\YYYÈÎÎö!®òãÃPy±O’8n•Ôñ¥ÄˆõÑGIÉú¡Ô‡K‰ü¬Oª±ë‡!ù¥ÒÆúpÉÅ=4´þ*m¯ºÅá§”O±1Ìž=/^ÄØ±c+è‡õéb}¬ª‚O—>Ÿ6¥óÙ\ýÕ&¸Ä}‰\â¾DN¥Vq‰û¹˜oc¸vëÛq‰û9;» iíþÚM*?dpçãÍùuö«°eo$·Î{:s8×0WÎ9Ä™ÀuÜÚQr_•FÅiÜ4\Ó©M9\ÓiM¹&S›p8—.œ£¿£ny¸€>By»†‹]˹…»IÖoHNñ½*7dÈr—/_6«]¶¼©õIÉkòsæÌáp7æÚ´i£“çèèÍùø´æp>>-9pü§Ÿ~š{ðà€ îÉ©Tj—œœËà†鈈QB9m¾vÛ¸q#—À9:òÇwYY”ÄyzFráB»:­Ò)§­¿K—ô ý JâT* ¿^t\þ°?>Bp£Fñ2edd˜TÞPû¸-&뤵íqÇõîÝ›Óhøú×­['YÿÓOŸÕ;Öž?¶š¯ÚãÃPù7 ÿ?Þàñ5yòdƒkB‹-*ü¾qãFÎÏÏ‹ŽŽÚW²~ȵ'%Ÿœüì|Tº~ÈÉϦp‹/æ>ûì3þüÎr¸óçÏËö‡mOnýUÚžœ>«ÚÆŽ§¾õDö¼×³'§R©8ÜòåË%õãíí͵nÝZ¯®Äéž={rj5¿çæòëíÙ³ºë‰8””ÄEFFrááá\x8¿ÞjÏééé’í‰ÏŸRã­äxÚLÑ_mÚè•BA>\Æéƒ|¸”=áª->\,ôNºu!Ÿ%]F…eË–‘"¬ùpÑøUw–/_ŽçŸ¾ÊËIçÏÊ .K]p’—EõA>\Õ òá"Œ|¸Âtȇ‹ ªäÃ%Cès¡:i}>LU-`Y.±–>7m{–Ї1>\B^Þˆôð4¸Ï˜Þ…|¸,‹±>\r>RïŒë{çÜÒ>/µ1ײeËtÞç8\äÃ¥ôø•*ÏÆÉÓçã!öñ2ä¤ÔGJ_+sã~±i¶ú|¢Øòú‹ƒÅ¶gn.}ã¡õ‘«é>\JÎ7ÆPÓ}¸ØùQ™ëU0¸(—.Aƒàé†Ì™:¿<—PäíËã/nšy¨Zq¸´x·õFÁ™‹Çá’꿸=KéÃP.)ÚùùãÔí[’yÉ ÃÐÔÓ _œæã Q.ËcL.q©¸ù$Fzõê ÅáÒÃõÁ $$ÇQ.æødËKÅɓлTŒ;¥¶¼1q¬,÷Kœfûg¨~%ý“‹ƒ%¥Osãb±úÇU’ŠSU“âp)9ßCÏž=ñÖ[o¡Aƒˆ­ 6.'«²ãrI7 Åݲ ôJ¡ .ãôA>\òP.ÂzáäÃ%†|¸¬ùpÑøUwȇ‹ ƒËWU÷ᲆ|Öl|¸ªäÃECMñá²vý!ùTDõƒ|¸¤¬P™8\@Å8XÖöáRâCÅb¬O•!®èòŠ+ˇK.´ðöAŒoÁW‹|¸,‹¥ãpéCìaÉ8\JÚS Åáªy>\b}(©_ìÃÕ¤Ip‡¶mÛÚdþØz¾J¬”“8`^\,©´øø5Ö‡KIÜ*CqœXŸ+c‘ò©·g®—5¨J>\†æŸÔ|§8\¦ûp™{¾¬•ùp•£ÏGIŒØ§ °¾—*£|ª àà퀳óÎ:níh™ö,èÃÕÐÕ »®ñï:·xàXLrÃ0¬J茯â; £[OäÃe Œñá2­O„øtÀ¼wð•´g Õ͇+8¸'ö훈~xÉÉüq$çõdÉÀÆk…—XJêûp†J¨í>\æž/kôJ¡ .ãôA>\òP.zÝzáäÃEú°-äÃEãWÝ!.‚ .\‡Ë²ú ®êùpÆ@q¸Ât(AT?ȇK„ØIûJ_ËE-íoË8\bØ8aZÄ>_¦Äá÷_‰ÏëãUq¸€ò8[ôñ𕿯â; .Kc®—Øg¢nݺˆŠŠ|ÿý÷Â>J|¶,ñymŒÃe¬—±q¸~úé'Ù«»—1q¸j¢—œÏ?ôûTI¿J|€´>$¬냢ćÌ.¹8VúÒæ¬ÖðáÒÊ'·žÖ”8\úúkÊ«„bj»—¹>pµ .q_"—¸/‘S©U\â¾D.æÛ®Ýúv\â¾DÎÎÅ®BZ»¿v“ÊÂyÇxs~ý*ì_ÙÉ­þ°úÎÎÅŽólåÉàb¾‹‘Ý×tZS®ÉÔ&Î¥ çèïÈà:níÈï£Ð'@Ø_ã®áb×Årnán’u’40ˆs‹t3¸.zy4çßÝŸÀ9ø9p‰û¥å¸) $ûïæÊ9‡8WØ_»9x;pÍ=tò-¡ÿGýeû§Ý’†qM=½$ó\5.ÊÇ—ÀýÜ¥;€›ÃÍŠjËູsuùþí{¼€S܀ІBîööÜo]“¸HOÉ6Ž=Ù_±¬–Ú^Œlfó6 m=ƒÍ*ùòeá{{{ÎÃÃûüóÏùñP©¸!C†èÝ_»mܸÑì~4iÒ„kØû .TÙòsæÌáp7æÚ´i£“çèèÍùø´æp>>-9pü§Ÿ~š{ðà€ îÉ©Tjþ8JÎåpaaC„tDĨòãìa¾vëÚõ{.!!stäï²²2.((‰óôŒä<<Â…vúé'rÚú»tI¯¸¶%q*•†_/:.Ø¡?¸Q£x™222L*o¨}\‹“%åMNÎåz÷îÍi4|ýëÖ­“¬ÿé§Ïê”÷õõåÚ¶mk“ùc«ù*uü‰ÇcüøñO¶üäÉ“õ¶5räH®E‹ÎÍÍ‹åpÛ·oçFŽÉåää+ŸŸ]¡†Ú˧¯¼¸¿bù¤Ò殬>/^Ì}öÙg.<<œ äpçÏŸWÔ–”|†ÖS%íÉé³27Cý54¾ŠÎ{={r*•ŠÀ-_¾\R?ÞÞÞ\ëÖ­õêJœîÙ³'§Vóëqn.¿Þž=«»žˆÓIII\dd$Î…‡óë­ö\™žž.Ùžø|jèø1v>K­Ç´‰ôz¥Ð&—qú .eO¸(a Èg‰ôakȇ‹Æ¯ºC>\„!T¸ÿv&UÈØ{8íZyWû¦þœƒ!}‚e÷Ëø+=;ùWYù¬AÖåBÔp¶JÝó–ŸÃÄçìR÷°÷Kõæ=ñÄøí·ßèÈ6ƒ?þøƒ”@Aa!®_·ðŸÀNy›OýýOO"²Çf”–q’ù±ýÿBÛ§¶ã€’R ¿#0áwt²Sr–—¦AHÇ€«7îãÐ þ3ªÏLø[vÿ%Vþ˜ øò~ÉýGL9ˆø§ÿ¶}ü‡¦~ -žØ‚‚{üg½Ÿ{ã vÙ„ýGò7o£°¨ÏLø[²?gC«Þ[„úÛ>µ mžÚ¦W±íü…&I›Qü  {ç¡q·?ðôøýø*=SR¾'Röè”?xüv¼‰Ë¹ý¸ÎfÞE`Âï8|jŠOßiQaüT*rrr0iÒ$|ðÁˆ‹‹Ã´iÓ0lØ0¡¼J¥bJ¬^½ HMMExx8 ..½zõ‡~ˆììlôïß_([ZZŠU«V¡{÷îHIIA\\6n܈W_}¾¾ÒÍøè£››‹ÂÂB¡ÍäädlÚ´©‚¼lûly%íU5 ÅÁbã Ô¯_ .!Έ}qdæÍ›‡Ö­[ ûß¾}ƒ–ÜWI\‚ ‚ [¡÷•BÂ0iÿËArïàj݇'ÇîÅ/KÛY¥îÜ÷‘úK^{NúµÂ^){ðëWq&Õmè•BÁ`Û´Iø’Ue`‹Ïè¾ýöÛ˜9s¦Åë­Š¯2©©äCCAD55¸Ø»ÌäLGAAa>jRAAA\AAAdpAAA}¸H AAA–‡žpAAAÁEAAAAAAAAAA„õ fAAAX 5äææZtÓG=lÚ9[·WÙX»¿ÕMŸUM^Såy饗ŒÚÁ‚´²AAT%ƒ æÍ›‡ëׯKîtòäIøûûëM—”” 77S§N~›8q"üüütêéÝ»·IB6iÒÄ !§q{W¯^U\N£ÑÀßß_¶?U m­%uÓ§9úÈÈȨ2ò¤¤¤ÕN—.]*üfîxAAf\nnnÂßþýûŒ·ÞzK0xXHêMLAA`Ày{{#;;±±±ggg\¸pãÆ »””,\¸ÙÙÙ˜|óçϗ쯜ürõÉÕoi}:99áôéÓØ±c‡dÿYyäòÍÕGnn.¢££…2ìø²ãǦ͕6n܈3gÎéÌÌLLœ8Q²~©ý`Æ °³³³ÈxAAf\b´@QQ‘E9uêBBB°oß>áâ±aÆÐh4‚·~ýzÀßÿÎ;#$$QQQ’õ±åµ¢“““d{¬1ÈÖŸ™™‰FáÀŠú#U^,”üžžž‚|:uBpp0|||$ågùꫯЬY3ÄÇDz²²ÐªU+lݺU²¿rÈÕ'W¿¥õ™™™‰ˆˆìß¿_2Ÿ•G.ß\}øûûãÀB?ÙñeÇM›+ÏŋѣG„‡‡ ¿…††"..N²~©ýSSSñÌ3Ï ´´ÔâãEAA˜ipÅÅÅaïÞ½¸yó¦E)))‘LïÙ³ÞÞÞˆ‰‰Áõë×Ñ¥K}:¦M›&´ÏÂÖ/µDD233m2ÿ ‚ ‚ Ãp¹¹¹ÜôéÓ¹ÜÜ\³¶qãÆq¹¹¹n̘1øOÎW›mýúõ:é©S§ ÿ[²?‡¶I¬%¿µô¹hÑ¢j¡vüLÏÊcÆ‹6Úh£6Úh£6Ó6áֻヒÆ›d±±_-ÔÞ¥×~Ü ª“––†¬¬,|ûí·¤¿ŠXúSÙòW5}Vµñ¬jò(/‚ ‚ Â4(ð1AAÈУGlܸ‘úO(bøðáX¹r¥ñe*pÿþ}R"AÔ Ôú2¶oߎñãÇ›T©öîxBBi˜ dX»v-®\¹"„ sç1qתÛ·oÇ™3gЪU+“Ê["®cUF|þutt¬uý¯ ëíºuë––¦h¾z{{ãĉø¿ÿû?Çq8zô¨Õ濥瓥™3grss…vé ¢F\¹¹¹ˆŒŒÄ»ï¾‹˜T±6fP1ÎÔþýû±lÙ2á*©¸BQ[hРêÕ«‡½{÷B£Ñ qãÆØ¿?²³³TŒÆÆÍb÷g'6Λ&jÖüaã®ÉÅm“›/UÈÈH„‡‡ qél×±ºÁÆ ¬mý—;^äâP²ë«’ããÂ… xðàä|€½{÷ ÿgdd iÓ¦xì±Ç„ß"""t®¡,9ÿ-=Ÿ¬¿¿¿à¦ÂÎWv~²çC:¿ÕÊàŠ‹‹Chh(òòò°nÝ:“*îÙ³§ð?g*??jµ7FëÖ­eã,D?Õj¤¤¤ ¤¤-Z´@LLŒðF67‹ÝŸ=žØ8clš¨Yó‡õ§•‹Û&7_ª*sæÌApp°Íã:V7Ø8µ­ÿrÇ‹\Jv}•;>5j„?þXï|€¯¿þZø½_¿~8xð \]]uö=z´Mæ¿¥ç“%¸|ù2._¾,™ÇÎOö|Hç7¢Z\;vìÀ™3gàéé‰~ýú™TqŸ>}йsg¨g €ð~²TÜ'‚¨m„……¡W¯^’yl0¹¸YìñÄÆ“‹;FÔ¼ùc(n›Ü|©ª4lع¹¹U&®cUÃÎÎ¥¥¥BšXÓû¯ôx‘‹CÉ"w|pgp¾À—_~)ü~éÒ%DEEá³Ï>«”ùoéùd  ™glÜR‚¨Ò×É“'Œ¾}ûâ‡~0©bŽã„;4lœ)xá…„ÿÙ¸BQÛоÞ%L.n{<±qƤâŽ5kþˆã®ÉÅm“›/U‘®]»â‹/¾@qqq¥Äu¬Ê9r:tÀâÅ‹…‹Q6n`MNj\J¹ããÂ… ^ßÏW:¯ýΙ3QQQhÖ¬™N™/¾øÂjóßÒóÉÚˆç+;?Ùó!߈ª }Ÿ6ÚªáÆÆÍ¢6ÚhC%Å}¤Mwmvtt4¹ü¡C‡h>Ñù¶š‡‹ ˆê7‹ ‚¨:ôïßC† 1©¬J¥B\\)‘·D C€KN¶ì'7y¨ ¯ÏFE¢W õÒµ+ðçŸUW>¢jññ‹Cÿ^tEówmÖ®¥ÛÛø·7z´Í³¸œw‹ìà )ƒ½Æ2!‡½_½_Sö÷O£ƒ¦ ðä“À/¿X¿77 ¸˜ß¬Á7×ã7ŸþUV?ròY[?„­ &RQ+P€«+ðá‡@ß¾–©4%Åø2 ·ÿ3Ï ðÿ{x}èñ¯°¿Òþ®üDcnLA,_Ë–ÀŒåi;;Ã2ØB>Â0ë¶™æpüÝŸu0ue¨Yí™R^ÌüuAhP¯HHŸÈtÁGéü¸ŽœwÅÔ•¡zÛ8•팩õ±ó_ÀGéÁ¸qÛEÅjì=áW§RÌ\SŸ"²›ÁÀ.ËZ—»Ñ&r'æ½8óú®N˜=zžLH“Ì7vx¤áÌû<ºDýèÖæ˜;ö9$Åþ ¨})šuY Ϻgô¦ÅÔið7ºŽŒÐ(þjÿÑqFð>ÄñϾŠncŸEd§¯uÊi÷SÂÔ©À¹sN¤ê¡¾GÇ 6;{þño´ž¥H¾‚þü$ú²¿áóϵøætô¿ž*üsg'–œ}V2?ùš®>º0«N÷ƈ«‹u~_sêq‹èÇ÷Á5¬8Ý/\þX2ÝáöŸXsêq¡=9ùŒÕ±È]´mËÚãÃÒ×O,Nn×Ñuô<òè"Éù%•¯dþWuê3g¯¼Bë4Q ®™37ÞÚµ3mÓ.<âôÛo/¾(Ÿ’ÂHÚ_âüéúÄ|ò ÿtGË“':)Û_®¿M›òò‰à¹sí^^¼qóæ›õàäT±?..ü‚¬5GæÍê9ßwÿöÛÀk¯sæHË—˜´o¼óNùoóæ)7¶Øþ°ò–åì%ÞàÐRX¬Æ¬5õ±ù€`É/ü×™î?P#c¿7Ò6ûcfj}lØË•é™®×têcËï9áŽé«ëã×Ý>’í±†[ÿÝ";Ì_„O×IÊ_Z¦Ç©\Ø}ÜŸvÃäA9€[w5õøLž)Yþn‘Þ’…Mÿx¢Ã °ó_|”ŒvMï^p _ý@“Å>7­ÃËãüx¹ÝÀÂuïcâç«ùõrä x{Ùˆmº *W!€¢"eí¹9߯”¥ËÑ«ýw€GºcÊÒèó£¢öYº½ð ê6Þ¥7Íâàr ~±áñå‡OðQ¨Ô¥°Ó܇«÷%l^ú-Bšÿ^~CJs%Å./ho Ós)ˆöUÉúíìøó„¡·6ºŽMþÿcñZü±x-¬º0Æ$ý,:¼7nk ±ã/¶[6º O×Ly¶üà÷t-Á7h²˜ÀäÅ+q&§ü‹g¾ÙxyÀ4¼øÔÌò}žy {ŽuAˆÿyÉü§ŸÖ®UÖÞÞã‰ð󺂒Rû‡7 œ0ïÅ¡((ôPÔ>Ëæ%ßáfN ½i–KÇ»ÁÅó2ʶ-{ÎÃÙ=ÏÂÙó þ®ÿý_!¿Içe8±#öé7°ïûÙØóÝ'’õÇÅ~U®EÒ|ìXµDç·ÆqßâÄVÞ@‰HX ßÃ:OÔääËËS~..R;cÍ©ÇqÛŽ¿á2$÷+´¸{@xbÄæÀ¨+Ÿb~л(T»ÆÍMMùðç¯~†åõ^̸ø Þ ý¯7\j’~Öø§`Å龸¯v’L‡Ü¿ˆiY¯áݬ×ËgŒ~L½>(.´_{àÏ¡ãÇ+»ž0—Ó;‡¡ëè!(}à$9¿¤òåæWe’‘Á_«´hAk5QK ®Ù³Þx±ÙÙÒ—±4n¬ûŸåwø<¸«ÐEEÜ_¹ú (ˆ_(JKyc(9xˆP¿>Ÿ§²2þ•‹zõÊ;{–7âØöçÏçRq8‚àÞ=þγ>#êÊ>¿uërƒK‰ï­T¤ä%¬x ª€ÐºE¸–o‚B;¸8•âð974 (2ºü´•¡8íbÖÝVCeKË;µî“‰©Ã3áïõJTÐé:¦ÏDæU'Éòw‹ìðùOA‚èçõ7ïØcÃl;ìI“ÁÒþÆ1ñóÕhx²ÜHO› o÷(¸ç)™<Œ#*‹›óLIž‚)K— ¿Mü|5œï*jß\œo#>ùUüùÅá·s{žEñ=o8¹ñŸ†þcñZäóç- r®žIlÿæ 4ë¶Ý^$Y¿áµ½nØntƇ9 j¶Ð úG\:ÞMØçÅkq÷fì4÷Ég,ƒ#7Àµ¬@'ã ‡²û’ùaE§Qª²ÓÙÿ’c}„žt¼½»Ýù8š/6NŘ+Ÿ õÔ&égpîWx.â'”¨ìáRv·Bú³À)¹M ÿU,Ÿµa¯‡fÍ*÷[µŠ?߆…éßß’D$¬ÂŸ_¦¢¬Tý óK*ßÒóËÒׄ ü<Îδ>µÌà:s†¿@ŠL ]pô(0}ºîo'òFÃùóÒùRLšVÜÿìYþÕ>™éÞ z÷æŸÀôéÃ+¿ýV^fÁ Q#éýÙþ²õççï¾[^×ùóüS£ädþ ÖÇó'1~È¿*(ÕŸìlÞ¨iÙ²üIÛÛo—ë‡m¿´”¿à#öÏbå;y’­²^=þ¤ ®kÏžŠúxcnòdþuB¶?Rò–ÃÓµDçu½@ßb,X„Y.hP• Ðé:¶ö„»K©^ƒhÉ/¸}Ï®By;;‡Ï»BëŶ§-¿ô¸u·âS¬`¿û}¼Z7¾‹­‡Ëï–‡bÞÚ`äæÛÃ^Ãaæšúø‚ypêÊPd^åßÉ™·6 ñÝŸuW Á‡ß†à©×áæ\&z…ÅjÔõ&¯xSx´íÏ­{½Ú§ÃÝåf‰W–/gsšáÝáÐ:|nÞñ«o,ïÓÙÍñÜãóáãq † O¿;5?wåÚgiØæxÖ=ƒÆñ©ppɯø;ö^ƒácp3»%Z=öœ=ø@eÿ›•] œob¼ßøs­a…öºŽ µZ¿Å°oг§þþ‹_ñYZnd·BÇcàê“ÒGEò¹¸ÿý§Ð >õ¦gN€ÇÇH:êÏÏ AðýL«+äÀ› >Ǥœ©BúƒÌWÑâî\tj\¡þoN÷†3]?Tx7ëuÔypEjç égžÂÌÌ—uÊÈÉgŒ~ŒEêzH|þüðCþÜnhKRVj6}߇³G®ÎS,CùÆÌ[3>ðÒK¼±UXHë5Q{°ÊW Èßÿ&j3'¨jÜ»¯†‹cÿá =~Xs¾ ÁÐî¹ò»o¦® Å»C³*}°råJ 0À*mMžzôh4nܘÎVAQQºPhÒ¤ öîÝ‹ž={bÕªU9r¤ä…ļyó$/øœœªD'[µj…•+W–®®X±b ˜3gox8;cèС˜ùï¼óŽäx°¸»»cùòåøôÓOuæ£ö¯››–/_ŽqãÆ)Ê7w¾®Ï¿…¾^žèy¿* ÌWv>±i)fÏžeË–ÁÞÞ¾Âüfç3›öõõÅÒ¥KññÇ›¤ÇݺuÃØ±c¿ÿþ;†Ž~ýú)*ÏŽÔñ'î,]º£F’<žÅõ:;;Wov=0¶¿_~ù%F…ÄÄD½7qïÞ=Eõ¥¦¦"..ŽÎFAQ› .íâäädäçç###ãÆC·nÝtò Q\\ Ž«wä§L™‚áÇ 鯾ú #GŽD×®]áåå,_¾¸xñ"¢¢¢0bÄôèÑCQ¾ý@ƒ+çu/¼žWгÿ¨áX±ÌßÕôv —ÿÖq`)oVÃ͇ß?yj îÝ.ÏéUŠ}¿ÚzŽ.Áï_jðÛçv’ò$&&âÛo¿Õ«¶ýûw#K¡VñOç U·2ìûŸZ±|ׯ_GÆ M£×^{ ðóó«0,_|ñRRRP§N½Ä“&MB`` ÜÝÝå›;_¿º}¿9: ²¤ÔìùÊÎ'©ù%æ›o¾Á×_Q£FáÁƒæ7;ŸÙôÌ™3ñÎ;ïè<92FC† AË–-ƒ©¨¨iii¸}û¶IýgåcûcÇŽE×®]%gHIIÁ'Ÿ|‚ ãÍ®¦Œÿܹs±yóf4jÔH2ÿùçŸÇ×_­XÇŽ£³AAÔ&ƒ‹eÍš5ˆŽŽ6ê‚dâĉ&ûôØ‚²²2œØñ‘럔¡Îö÷7ޞرãÍ®Æö÷رcX´hâããqíÚ5³Ç»oß¾ Crr²ð„Ž ‚ ˆšƒ W[¾RXB•– IDAT]iÞ™÷ßùw›ò‹ùeË–aöìÙ8wîœMdLKKðaà >Y³F›J?PÙT'Y óèׯ8ŽÃ?þHÊ ‚ ˆZ‚I_)$ª-»”elÀ¨Q£`ù\\\0zôh›[QU0`[AAÁU•xºÈ°ïˆö‹Æb+H£Ñ30D||¼¢úzõê¥h¿êôĨ*ÉE]-k‚ ‚ ª±Áeɸ[mÚ´ÁÊ•+õ^h³qo´m/^¼ðñÇcõêÕ:Ÿ‘¶5¯Ý»‡¦ Ÿ²2ü– ÏIîûlQ6äåcøÃüÑLü¦å·ï #/ãïéþ¾)/_±<†âp±ò²lÊË6gŽÚM¿u[R>¥q¸Äq ÍŸêvÁj‰8\!M9ôŸÌGp$‡Aï” i‚t\4s‘‹cei¼¼¼°råJ϶k4A'K—.E@@\\\гgO«Ëî'¦´_ÙqÅq»ä₱qÑ*cý·ŸŸ¾ùæá3ýìü0E>¹ñ0”onÉ: --M'ì„x<ªÃù‹ ‚°ÁÅÆ=bãn±qzÄqs5jdv\# >\ï…¶TÜ›æÍ›C£ÑÀÑÑ:t¨ÎgÜM1µ_ýuþËõç÷¼|$—?áI¿uOxy¢Ÿž¯žýäèˆÇ½½0¤¨¨‚¡ãÂq)-EOo/<)*ïÈq¸û°ïuÊÊð}þ-,¿}GïÅ¡8\¬¼,ݽ½ÐÝ›wÞ/|ØfTI 4G=òŠÃÅÆ=b/n¤â@i÷svv®P_M‹ÃÕ$¾ Û–aýGü“LGWé34ˆê®?.‹8N{ü²ùZ#CÇJJb¤â¢£¯Å‹cøðá:ÆÌªU«„ÿ·lÙ‚^½zaéÒ¥ÈÈȨP¾eË–X¸p!V¯^-ÌsÆ‹]OäÚ×·þi™9sf… ncæ—±úeãvÉœЋfÌúi ý‹Ç{áÂ…1b¢££õÎcäcÏGl\66Ÿ=>Ì#éëë‹÷Þ{O8±ãaíóAQM .6îw‹Ó#ŽÓuþüy³ãmÙ²õêÕ3øZ÷f„ øî»ïP·n]ádzóæM‹(¥uëÖ6lõ'ÉÛ 5å¯ýÝR©ðé¨9že U*lÊËG¾èâèµ{÷0ÕÍ÷þ¶)/×D_¼{å^!>uá/vß¾ƒ=Ü1ÒÃ]R¹8\¬¼R<_X„ù¢/½_pËTV&)Ÿ¡8\lÜ#Ö°–Š%Ž£ÄRÓâpE'•! ŒCòTþ ×¹j¸ûr(=€d㢉aãT±Ç¯\+9}IÅE3F_·o߯´iÓ V«áîîŽW^yEçiçŽ;pãÆ ¤¤¤H–‹‹Ã÷ß¡C‡ óÁÜñ¯'ríë[ÿ´¼ýöÛX°`rrrLš_ÆêW*n—¡¸`RqÑŒY?ÍÕ?;Þ©©©øæ›oPôð†;?Œ•=±qÙØ|öøÂ˜þÕ¯_|ðÞ{ï=½ãaËóAQE .6îwK*N‹9q<<<ðñÇWF*†{³víZäçç Ÿ¡×Æ ·˜rŽ?ŽÀÀ@£û3À˯¸»Áþ¡ñ%Ewo/¸‰Nè‘%¥(aò³ìÔhöðµ¿îÅÅØâÀ¿O6ÈË“ïÞÃF=¯ÊÅáR³EEØàXþþÚrg'ÜP«à÷Ðàbå3©ùÅÆQb©iq¸Ò¦jp+W=àè ôz±é3Êb6.š6N{ü*‰ceH_RqÑŒÑר±cñþûïÃÞÞwîÜA»ví°hÑ"@—.]ðßÿ¡nݺxî¹çtžÂèܤ` osÇK¼žÈµ¯dý›0a^ýu“æ—¹ú•Z¥Œq\4c×OsôÏŽ÷!C0bÄ”––ÂÅÅ¥Âü°Äún(’¸’ÆôoÑ¢EHNNÖ +ÀŽGeœ¿‚ ˆ*fp±qظ[RqzþÎoýúõÍŽkôùçŸãèÑ£˜8q¢ðÔB\^*îÍÆ¡ÑhàáÁGâ>}:Z¶l)Ü!6©8@Ÿ|ò ¢££qêÔ)Ùþ$¡Ii)R ‹àSV†1……Ø”—åÎ寤lÊËG‹‡ÆÉƼ||vçÄϘÆx¸cFAy”äEwî Íƒœ‘xµ!/†"ÉÅábåeå“âGGØs€×ËV>Cq¸¤â‰ã¸IÍ/q%–š‡ëò9žšXO%€~Kpå¼ žác¥ÉÁÆ©b_¹8VRú`ÇŠ‹fŒ¾Œ´´4¤§§ —Ú§[¶lÁ—_~‰%K–àÖ­[({8e T3Æ‹]OäÚ—šŸâù;}útdeeaâĉ&Í/cõËÆí’ZÅå¥â¢™»~£v¼–è¯1ò°ql‚ ‚ ¢¦ _kÿŠ?£»e˸¹¹aèСGÓ¦Me/¶Ù¸KlœcãÔÈÅ™Ñ'çÍ7ßDXX&OžŒo¾ùF'°¤9í±òËÅ)“kÐS#v2/**Ò«ï&Mš`ïÞ½ôolÙ¸>,rqÚô[JûÏÆ±!‚ ‚ ˆep)ÚQ­†§§§äWÌØ e6î’”Acl$CqfØ89§NBHHZ´hsçÎ!** #FŒÐ ,iN{¬ürqÊäÚcãÔÀ Aƒ°lÙ2ÉýÅõçççWп±ý•Šë#F.NÛ¾±ý—ŠcCAAµÊàzë­·ššŠÌÌL‹4ll$CqfØ89K–,ž¾èÜöXù•Äé1Ô§úôéƒ?ÿüÓbmNÜ"¹8mæ¶/dž ‚ ‚ jŒÁ%‡ŠeÆŒؾ}»Þ|q\}q—´qNŒS#ÇD ''77øå—_ôÊkN{¬ürqÊäÚcãÔ˜‚XÿÆö—ë#U·¡8múÚWÚ6Ž AAAÔjl®5kÖ`ðàÁ4ÂAAAXC_)¬`py{{cèС€ÒÒR¤¥¥QšÒ”¦4¥)Mi&ýå—_" ÿ”¿  ÀàþK–,Ñùxà [VV†-[¶Loß¾Ý`ýË—/G›6m„ý÷ï߯#ßõë×uòwíÚ¥sA`ooo°? .D^^ñ RÁËËK'íââ‚þùï÷Ý®];ƒùQQQÓ111¸|ù²PÞÏÏÏ`~½zõ î/×›NJJÒÑzzºN~ûöíuôWXXh”üæöߨþtèÐAgþݸqìúØ´œ>Ì榟xâ ùüñÇUÞXùÙýåŽKÏ—ÀÀ@£äµöü0÷x•Ó§\ší?;ØõsóæÍFÍwE—ø‡àà`,^¼˜ÌT‚ ¢ÊÀqòóóáíí­hÖ 1¶~ŽãpåÊÁ‘âÎ;ؼy³p~òÉ'uê—ç8/^ö·³³Ã!C„ ¶}© ’½ýã8ÔiÿÈ‘#B}jµ=zôÀñãÇ…ú4h€Õ«WKæs‡ììl¼üòË’—Z­F—.]„þÀ­[·tä .àØ 94 ¦L™"ȧ•GŸNNN—}ÙýY}Ê¡V«1bÄ4kÖLèÿ‚ tÊ;;; hÇáò厢¤ XV~CØÛÛcþüùøðÃM*/Õ_WWW$$$ý‹Å| ìß°aCùY}ÄÇÇcçÎzÛëƒ5èÙùÀΩöĸRù?þ8~ýõWÅ: Âüùó…ñüì³Ï„þ°ý—:þÄòs‡S§NÔ·ƒƒƒÎ‡×ŠŠŠôö_¥R!<<\˜¿jµ;væ¿’ñ—g .%òŠçGYY™Žñ`о¥æ´ÒãUª¬þ/\¸ èWIšíBB‚°¾•””`þüù Žã°cÇ£ç»Ô—Åjÿ™8q"üüüè¬NAAa!ƒ«  ×¯_'AAAXÚà"‚ ‚ ‚ Èà"‚ ‚ ‚ ƒ‹ ‚ ‚ ‚ .‚ ‚ ‚ Âz×ôéÓqöìYÒAAA„áhã·=zT)y†^-õ¸`Á³Ê«T*ÎÑѱÚõ›Æ«v¬/¼ð­—µp=®)úT:-µžÕôãEný4w}¬.úSz¼š{¾¡¶j¼‘´Û¢E‹ªŒ,ëÖ­ãìíí…tFF†Áý å7iÒ„ËÍÍ5X~Íš5“ýðáÃf×qúôéj5wh¼,;^rú«Ìú-¡/s·ÿþû‹ŽŽæÂÂÂÍZiÓêSÉüe×3k¯/†Ö3v~[b¾Ûzý4g}TR¿µ×Kc׫W¯šÕŸcÇŽÙtý7GRóÑPÿ«êøÑfýM ‹-BNNFŽ hܸ1öïß/D}vvvÆ… 0nÜ8|tèóçÏ ˜Ùýqøða!¢w@@N:…Ý»wK¦+ooodgg#66V²¿S§NöMIIÁÂ… ‘É“'[M¦ .àÁƒ€ÜÜ\DGG#77WR>6?&&999˜5kàäÉ“fÉÂÎv|Ùö´lذvvv&µ!ôOí«°‹-’”×Ðxé/öxgåa'V?,rë““NŸ>;vH–gëß¿?–-[&Ì#v¼¤8~ü¸°.°ýÓÖÛ­[7¸»»ËÊ7nÄ™3gYYY€¦M›"22RR~FƒŒŒ œ;w®Â|aÇ—]¯«Úú+·»Þš»°úaç[¿Üx²óS¶>¹ùÌÊËê‹Õ';åÖ3¹ãMÉü•kÏÐüeç7›–:^Åò {¾gשñ–[? ­rãËê]_ØõLîúËXäÖ#v~åææB¥RéŸrúòôôÄ›o¾‰ 6Xd=aNj՗ÜùF ñübç#ÛsÏwD {¥P{ÇaòäÉî©§žÒ±Ê´ÖûË/¿¬c½kïh°ûkóûôéÃà~ýõWÎÎÎNÈgÓ•½iû§íÛßï¾ûŽ[¿~=€‹ŠŠô•––fy5jÄÕ­[WïV>}wH>ùä“ eL¹ãÇÎv|Ùö>Ì¥¦¦rféáСCŠö;{ö¬ä\­¼ÖÞh¼ {¼³òHO¬~<==9'''Eë6=þ|Ew7mÚÄ-_¾œÀµnÝZr¼¤ô;vìXÉþ½ùæ›ÂS©ò¬ü/^ÔIoذA¨WéQ©ù¢_v½®jë¯ÜzlìzkîzÀê‡lýrã©ïøÓ·é›ßúæ3+/«/}úÔÎ_¹õLîx“›¿ríé[Ï ­‡â4;>¬<Æ®Ÿìùž]X}(]?õ­Rã+^ïXýI­/âõ@îúËØMn=bç;>RóÓ¾´ã7yòdN¥R™½ž°ãeî.©ùeh~šr¾£­?áÒ²eËøùùU°ÈJJJ{öì···ÖGII ÂÃÃqüøqØÙÙ¡W¯^HIIÁ±cÇ Bº²aûÃö7&&ׯ_G—.]pðàAa¿óçÏ[Çæ8EòjåcÙ³gÚµk‹Ê¥ìøJµ‹;wîTÊøÉÍg/ÛŽ{¼³ò(9žš7oŽ   EëÜú$Åýû÷@§¼¾ñÒrèÐ!øøøTèßܹs1|øp´k×NQÛ...:é—^z Í›7G:uLÒ7;¾¬>ªÚú«ôxVºÞš»HÍWcÎìxê›ïæêCn<µúÒW^;MYÏÄýQ:õµgîzÈŽ+±HïÅëƒ欟Rã#µÞiõ'·¾È]‹ÜzdÊü4¤¯ >úè#Ù¹X;¿L9ß5ÁàêÝ»7ÒÓÓqýúõ ;edd oß¾X»v-òòòpäÈ$%%¡}ûö’•þüóÏèÞ½;¢¢¢PZZŠ·Þz û÷ïÇÍ›7 Bº²Ù°a’““Q¿~}ÉþfffbüøñHOO·‰<.\¨ðúLtt4ºví*)›ïàà•J…²²2¡ü¥K—Э[7“eÏv|¥Ú‹ˆˆ@ff¦Yzøâ‹/í—––† $$Jæ3—mÇ‹=ÞYy¤ëvî܉sçÎ)ZovìØ¾}û"11Q¯¬lý/¼ð‚ÞõNŠŽ;bíÚµ¸yóf…þ•••aÖ¬Y˜2eŠ"½MŸ>Ó¦Mä9þ<~ûí7ôîÝ[±îÅó…_v½®jë¯Üzl,殬~Øù U¿¡ñT2ß !7ŸåÆSJŸâù«d=3t¼)™¿†ÚcQ²ŠÓìø°ò‹Ôù^¼>H¡dýÔ·>J/»Þ‰õ'µ¾ˆ×3¹ë/c‘[¤æ×¹sç„ñ‘jßçs`×6mÌz-5?Åý7å|GÔ\Lv×>v§ÍòÛúõëmúå7%¯¨ÙrSú:aU‘—ÆëP•;†*ó£ o¿ýv•\SjãZZ>rRÝæsUZÏjB{JÖGcÆ·*®/´ÑF›¯s1++ ß~û-™«V¢ÿþ2dH­ì»J¥B\\Wµ$++ ¨2òÐzMÐzVsÖǪ¶¾¡p-À%îK¬UÞ»Õ¢õE¾‰S3NY\ÎÀ~øï‡ÿª¬|VkO¨íÕ(+.³Š|Ó[·Á»‡þ±x½ƒ4BúÅóµrqPÛá~Y)BŽfÍ^ÂñãŸÉîÔ—.m4¹sËWvý!Å‚ 0a„ÛAÔT„'\â û²â2lOÜŽìÔlÉ4 ›hÌ!^*ăü(ºRTå•ðd:íè„ ¼“jâ¾Da³÷²¯¨45:níˆ!ü;ü>ñºÎ½í7´G§ül°Îï÷tV,S«ÏZáò/—%ó|â}Ði{'„$‡HÊkïeN;:¡þ°úŠåk1¿…^}hÜ4BýR°ùfëƒÚÿ_{£Æp`ƒFó»a÷cü;è þuu ðOà@¯¾Ö¨±ÎïGz÷SÜþ²øŽXŸuÑfsvq»„*süp¶&=nÕ6zõê…Ó§Oëüvùòeƒù¦âàà ûYøÊ,¿lÙ2p§ãP¾k×.dffB­æ—ôää«Ó½££/¼ˆÖ­ß}(Ÿ7ú÷?=þÿ‡r$&&ÂÉÉ©Bù¶mç 99ÉÉüg#"RµÂ¯^^M„²Æ`Nù¤¤ ‹Ö/öG²öü±õ|•bøðáÂÿÈÍÍ>{íããƒS§NaÚ´iÂ>kÖ¬Ñ[×àÁƒu>ëÏÊ«O~m{Rù†Úcåg×¶?Rõ³åÁÇÇÙÙÙ?~¼¤¾ºt颳ÿÑ£G‘1cƘ4>lýl”´'§ÏÊ„/¹ñ5)}\½ª»þfddèÌKíÖ¤I«ôYÜ‹¸}}¦ëGn}Ò/aÀà:ñþ ¨4åqvõÜ…Ž[;âΩ;’i6?4%¿¸ˆÏ€S=§*¯„Ë¿\Æ_þBƒ‘ ø ðØ­Ø»\)‡ù*ìß>£=¶'n‡{¤nŒè¯£¡R«àà瀿:üÿþ:ùW7ð¡cG$ü‘€Øu±ze*Ì)W"ý…ž¼ýyø«ã_ì()oÂÆüÕá/8;%Ÿ>}8ú;b[Ü6½Oõ団Ýv dpˆ¢ñ›ƒ4}BB±#÷*âÿï:¿¯é˜;• uœœýëOx&)Ÿ#úö=ŒvíÊã4¥¥ù#-Í_4¦™hÞ|¢Ïƒe£N~=ÈÏ×s³bÅ âý÷ß7©|\ÜB ”-¤? ‘œœ _ßhÁˆbõ!W¿‡Gc<ùä~ ”-¤â¸<Öž?¶ž¯n-^,Äðø8LõêÕƒ¿??þÿüó"##MtÍš5ƤI“$å•’ÿСC&÷•Ÿ]_Øþ°õ³ååäÉ“ ¾Ö§O_Ú8VuëÖEHHžzê)“úÇÖ¯O_¦¶WÙ°ã%7¾ÆÂêƒÃÅÆÙò÷÷Ç®]»àïï“'OVˆ#ÇÆ “‹ƒgl\/øûû£¤¤DòC*¬~äŽV¿„ŒÁÕtZS8Öq~,)(Á¾§÷¡ÞãõPv¿¬Bš…Í?¿ð<\º Ýíª":ï錬UYBÚ%Ôÿ “~íLã¦Aì÷±¸²á ÔŽü埴À‘WŽ€+{x·w_"îž»+”ñMðÅ™ù žf³šaW]Ø7`ŸdýÎ!θ¸ì¢^Yµ†˜ø•;±¼ÅyÅP;¨Q|£XÈ—“Ï>œœÐq{G4~­±ä¾Rù–ÐûDLoØÜ¢B½ù3Z·A#wwlKz¢|Qi×c÷ìDéûóÇžìÓwn—÷¿n=L?Âx^Ûvèøû¯xâÏß%ëuuÃâÓ'jýb2¬‘u ®… """ÿþû¯ð[÷îÝ…¯tIå›{Gt×®]X»v­ä›ªV¾uëÖ:i±aÃ_P\DFF¬[Ç»»;6oÞŒ+W® ¬¬ fbíÚ†P©4€zõ:á»ï‚áèÈßý¼qƒ?ΜY…ÀÀnؼ¹úö=ÆURžAƒ²ðÓO­pùòV#FühíÚPøûKûµôï éé!¸vMz}ìÞ½;œuùS¾^½ÎHO¯o”d~Zš?nÜ8 è‘Õ‡\ýÞÞ-ðË/1HOçoàclYbþØz¾²Œ7W®\Òõë×GVVf̘:t(~øáDGG+®óÊ•+B iV^6ýÖ[oéÆö•Ÿ]_Øþ°õ³ååúõëptt.˜¥ô•ššŠgžyFøê]nn.Nœ8aÒø°õKéËœö*v¼äÆ×Äú` 8p@¯A’™™‰† B£á×ß-Z &&Fø *›ÎÊÊB«V­°u+¿¾vîÜ!!!ˆŠŠRÔžÖˆëÞ½»¢ù!wü°ú%d .)b¿EñbÁ `Ó†öo³ª Jî”àæî›¸úûÕj¡ˆmqÛàX¯Üèl1¿ ÎèÝßÓûààë  ž­Þ1Þx2@øÍÞS×w+q_¢ð–Nvj6êt­ƒ&ï–¿»£Ûtú«“vià‚F/•û]*Ÿ¨ _hˆÛGnãÁ-é× ³ Ñ ¥^y™û¦„k˜«¤¼Î!Î}.ùÿä+–Ï>B†„À;ÆA‚$õ!•o }ä¤å(?w{{º¸"ÜÝCøíØ“ý…—ªV;ƒÿºx§Eù]Ïøÿûþ~¢¯näîŽ×š6ÒÙ÷ÊíWš>‚Ã7o ¿ø¾dûYw ðbd³Z¿˜¬<Æ*õ.]º]ºtÁìÙ³uî Ê7‡Å‹£W¯^øôÓO«dùÀÀ@¸ºº¢ys~¾4«W¯ÖyÅçÎs äãÀ:4ÑÑÓÀÇyY»v-ÜÝݱbÅ þ8ËÉ@hh_té²÷ïç=¼kÙ]º¤£¨è:îÞÍA``7<ñÄ_¸qãÚ¶_ß(xyñsþÀèÒ¥ V¯^’’deýŒ  îðõÇñ7-¼¼šÀË« ÔjÙþggo@XX2ÜÜÊãúÜ»wIèµË€¯o´ /V¦Ôúôi<öØc6™?¶ž¯,žžž üSƇŽ;âùçŸܾ}­[· 9^{í5tìØƒ–”—M×­[ÁÁüÛ»wï6º¬üìúÂö‡­Ÿ-o,5„ °cǽúbãXEDDàÝwß5©lýRú2§½Ê†/¹ñ5Vâ8\€á8[Jâ>бD\////´ø5HV?RóA¼?%–p IDAT«_B?ô•BàRßP÷.ÞS\¦Õç­pôÕ£VûRK‹ù-pôÕ£UFñ¿Æcw¯Ý•2?¸¹A.ÜQ\æëö1nÏ.›}©oq»ŒÛ»³ÊSv]7m°I[aaaP«ÕzŸpæÑ·ïaüôS+RéÃf¬Y³F0¨jb{4~A¨IÖ'òÝH£Œ-8üâaô ¨úP{ûï­4ùf´nk”±#wmGÿеr~«<®Ç¿Í|úé§dlAAW­2¨Þ‰4˜0å IõêûJ¡5°äÓ-‹èÊ]ŸÞºÁü!;¶þ?{÷^UuçÿC.'`H $@ÈMn?’DnjD*jmÕ:Sfjë´ÓÇo­<3Îw[ëð­ãŒ3Xk™o±* C^&$¹ —j-Á¿bÄL€üþ8žµ?Y{¯½Î¾ä\>ïçáѽ÷Zk¯}9g“¬WLå^í î|ÅÓ·[à¡£¦¦†:>Æïos&LXãh»¡CºªÇíþªþàëлýíH"óÔSOÅ]}ü퇣1àJe‡‹†:Wy¨z£ £eÚÎ3wJêp ¹cˆi=]¦4of½9 P±12›WÙ³e–í.'.—Øž ®™Y8X³÷¶è‰N;\¶ ïpÉœ;'èv·œ88n—9ìpɳ|ùrÇåëœDp¸Äû“:Yô~¦ëenã4oÞ<œ:u «W¯––OÛ¯Ú^UŸìù#sš¬\1êh)ßo(,Ú_±:\b{íÚGû/Ñ.«K¢çÓíýÆ;\Z®Tw¸h¨s5}Ótìš¿ËôÓŒ­3zìç—Ã5þ±ñ¦ºé2MÑ-E8÷ö94Þù£Û>Ù}.3*ª®ot.—U{‚r¸×`êÖMÞW>Mµ•ÓÅ—wÑq¸dNèæX96QwKåà¸Mª9\999hmmÅCE\,v¸Ì×óÏ?ööv¬Yùf®  mmm¨ªª’–O.Ùùðóúñûz¥÷'u²èýL×ëº= >|¸éM ³¥Ú^÷ødN“Xu¬¨£¥ŠÊÁ²ê/Kl¯ª}²þÓ­/žCϧÛû.v¸´\ìp™C«wzeÏ”¡ÿÄÈ,x#Wì1¡ƒŸבGàÒ™K–Ë4ã~<9#rŒo‰®¶]ŘŒÁѵG‘J“¶O;—KÖž ®s—.!+ÔŸ^’›*sºØáò>N.ê|P7GæØˆî–ÊÁq›Ts¸.^¼ˆÜÜ\ddDf:e‡ËìpÍŸ?áp"NRvv6ví’ÿZ/u¸èùðûúñûz“ÝŸ¢“Eïgº^×퉾ù»|ù²´|Ú~ÕöºÇG&Zu¬¨£¥ŠÊÁ’õ—Ž‹EÛ«jí?Ýúâ=ô|zq¿±ÃÅ—ã—,©æpшÎÕäŸLÆáÕ‡qáhä“áÒo–bvcd Õ¼)‘é5ãÉJ ¥¡õH+NüìDdÀÕ~ÇŸ<Ž+Ÿ_AæÀLiûTÑq¹‚îêí[1(ÆôÎߨ°Ã?‘¹94¢»å·ƒãEy‰äpEû±¡¡ÁTìpÑìØ±ÃødØï$šÃ%:Y²ûY\‹ÛsüøqcÚr'Ζj{­7IÄi¢åQÇŠ:Zª¨,Yé¸X´½NÚ'öŸn}qÿ¦Wân¹½þÙáb‡Ëñ€+Õ.ê\u\è@îø\äUDWu•u¨Ÿy³rþPĺòÓáJÏMG¸8l´‡.f«yC3ò§çcÌ÷#Ÿhw¶w¢­¹ —:—ÃE£r¹dí Òá*íÛ÷‡½Ÿž1~&:\2§‹.ïãÔá¢ÎusdŽhÀ¨·I5‡kóæÍX¹r%¶oߎ³gÏ~ù©%;\¢Ãµ|ùrÔÖÖ¢¥¥¯¾ú*î½÷^Œ9Òqùâùðûúñûz¥÷'u²èýL×ëº=ëׯGMMåó‚¶_µ½îñQ§‰–G+êh©¢r°dý¥ãbÑöÊÚ'þí?Ýúâ=ô|zq¿±ÃÅ—“°Ã@ØáÒïv¸o’RÈábw+ذ;eNss³ñ†•ãOØáâóÇá${xZøÂ—f°Ã•PñÛábw‹Ãáp8¸R}@ç—ª};\bØáŠáZõñÐÙ; 6ìp™cõí_—Þ….ç ÚáJöþäpÄPN—;\B§d†P]W’»¬§%« .1Ô ‹šXs÷ÍEF^†±Ž&s¸¢û;éÞt¸2C!ì¿åvÜ3j¬ívï-Y€.Ï[Ðw¸tbå†D].@îvy]Ÿãë1É®üü|´´´ÃWj;\Ôm¢Ëô~’Õgç8QÇKU>]O+U}²ç‰Ã%s¿tŸGvîQ,.VЉg‡Kvþí®_Ý444àý÷ßÇõ×Ë?¨ºîºë<1ª¢¯wªöªîg+7ÏiÐõ²úÄþ¥î›l{z©Î¸Þêõ:Ú纯çßþö·µÏ{ÖcÀÅ—93kg¢anrÇåJ×Sç*¿.ê„ÕUÔ¡®¢]W»på|dâ‰Xœ01âþªþèm‡«~Q Ê·mÆò‡ bÞZÐs@À—wÑq¸tcå†D].+·Ëëúœ&Ù®½{÷¢°°ÐrÆ7v¸RËá¢n]¦÷“n}ÔñR•O×SçJ÷øT­O÷y¤r’ÝÅò;ôü«®_ÝŒ7cÆŒ1žŸÔÉúãÍχãÇ€Á$„Ãa|ðÁ3A÷§¯wªöªî/™›GvåÓõ´>Ú¿Ô}£ÛÓûKu~èzÙëµxª^Ïéùˆ¶1:‹%]¯rÏdå™\ìp™“Þ//Uàô¶ÓÒið©søëpõøF8aSšƒw›&†î¯êÞv¸r32°uÞBln:‰°0Mj4ß?±Ç„ìpy§W,¡nˆèrÉ\ ¯ëÓI²;\ÑOûõë'm;\©åpQ·Iæ8‰÷S,Ç':^ªòézê\éŸÊá¢õé>TîQ²»X~‡žÕõkžxâ 6¬‡“¥ÊÉ“'qíµ×âàÁƒ Ý_|½Sµ×Éý%ÞO@dfÂè¶²òíÖÓúhÿR÷nOï/Õù‘Ý_âý/s÷èë¹x<²L˜0ÁòŽÅ=3 ¸dIu‡kßûY)`Rç Þá0 ò+ÞÝ 3 $ûÛõ‡,A÷GÍ[;00+lØYbîsÕD>ý›V0;\‰ꆈ.Wõé&™®¦¦& >¿øÅ/H=ìpy•Ds¸¨ÛD—éý¤[Ÿèx9)_\/s®t¢r¸díñú|$³‹åwœœ/ÎßÈ‘#ÑÒÒbédECŸ²eº?}½SµWuÑûiÒ¤I¶÷—j½]}2÷MÜ^æ¢éžñþ—ÝŸôù ÕóüðáÃÈÏÏ·\oåžÙ½>°Ã%IÓ‹M4o®{¤Û¡°s®.ê„@Æ5Ý»‹&†î¯êÞv¸ÖŸ8†ÅC±vÊ4ãg¢Ã5iˢ²õUÀŸý4r#²Ãåyœ:\±„º!¢ #s»¼®O'Éîp­[·åå寝„°Ã•Úu›dŽ“x?éÖG/Uùt=u®tOåpÑútŸG*÷(Ù],¿CÏ¿êú%óæÍóÏ>‹Ë—/K¬>úÈp¹6lØ€åË—£¤$ò ø;#E‹aæÌ™Æó˜î/žkY{EKåfÑû víÚ…'NX–o·žÖGû—ºot{z©Îìþï™»G_ÏÅã¡çª««±qãFœ;wNºžFtÏì¶g‡+€°Ã¥ßìp)Þ$¥ÃEÃ.—¿a‡Ëv¸ü;\|þR=/¿ü2–-[ƯwIž>€°Ã¥Ùìp%Tüv¸hØåâp8N2dÆ 8uêþã?þƒ_ïRà½RÜÿÎßêÕ«ñÌ3ÏðÙâp8‡Ãáp8 ã.:o>u ÄXÍóog ØM¹)s >ù¤{² Ù¼øNç½5²òuÜ»õýû÷7\þåp8‡Ãáp8 8à¢óÚ«Ü Ù<ÿâ¼÷4*—‚:âø‰uFg1¡óÞggg›(£GÆþýûÑÔÔ$]¦Îj^ýhœº?ªõÅÅÅ(**²œF2h‡…Ãáp8‡Ãáø—.]óæÍëŠþÿ¬Y³º^yå•®W_}Õø™ø¯¥¥¥k÷îÝ]óæÍë ‡Ã]?ü°ñsÙö´|«2­–÷»ßuèúö·¿mü¬¶¶¶Ç¶ý×Ý ë+_ùŠ©,ºüÉ'ŸtèºýöÛMåoذAZ>€® tegg;>»õ ,èjnnîZ»v­£þµ«‡ÿñ?þÇÿøÿãüÿñ?þ¿ÿ¤“f8q ÄyôeóÞû‘è¼ø4ÑoâöìÙƒ(˱r¬æÕ¼u^ýu 6Ìv¾þ ‡Ãáp8‡ã}B@Ïyíen…Ý<ÿ²yïÅí¸¢S'Nœ0-‹óâæyïkkk±téRlܸŸ}ö™ò eÎX> vTÇ+®àP]]{ï½×Qÿr8‡Ãáp8œÄLBÌRØÛaÃáp8‡ÃáÄv¸„‡Ãáp8‡KÒtÍÝ77¥º®¢ÎÓòÆýhŽ®=êy;‡Ü1ÿï•ÿ—pýëº?Ò€PF—;}ißãe7à‘áœ@óÔSOáÁLÚú’-ìÈr¢1¾áߨw^îDÃÜ4½Ø$]¦¡ëÿÅa´}Ô†+篠ýtâMúP¼¤³gc芡€Œ¼ Ìnœáw¤÷KÇÜ}s¨æÏ0Oä1sÛLÌnœa6Ìôó9{æ8nÃõë®ÇÇ[>–®‹Ö=wß\däe(×Wl¬”=[fÙ¾É?¬lSôx3ò2PõFF=8Ê48ŒÆut3;Ó¶-+F\küÿ¬ÂÁ8pëR|cÔé¶™¡ößr;î5PU8Ø<_x+Ö,ÅÝ׎6ýüÛîp|¾ž›Q—O}Ø5úóʪ¸¹_ºÔ-ºÅñöóæÍéS§°zõjÓÏE†¡¦¦ÇŽ3­:xQùùùž»unËó{ÿçž{]]]èêêþmðÝ»wãäÉ“…"ôU«>ñìüfe`ÅŠQVöÈ—í€eËŽ`áÂßFÎÿ—í˜;w.Âápý§M{«Vµ`ÕªÈù;ö~Gõ–”ÜÈË»ÎØW'nö_´Hí<._¾Üqù:ç#h‡Ñ‹úÄû•:“ÔõüÚ×¾†ææfÜwß}Æþ¿úÕ¯?/hy´ýNž/võ=MÙó(Z=•³)+_ævF÷§Çwã7š¶{÷ÝwÑÔÔ„¿ø‹¿p|¾tŽÏI}ªþŒ§ÐóåöúO4GÖÉñ:¹>¬¶§¯Ï2à:ò褥w»W»ïFu]5Z¶J—ièúÒûKñá³âà½. '\§|¼åcÔϪLjûFDÞ ï¨Bý¬zdËŽ¼)ÌÂÎé;{|S6õߦ"-”†Ì™¨ŸUÂ…fgë“m‘›0kPªÞ¨BÅo*,ÛÐÖ܆®ùŸ×ÕUÔ¡®¢]W»påüåú>Ù}.£óRä#«öÙeÆÖîÙ'§ošŽ]ówíÿØxi[ÝôGãM(ùZ‰´-OL-GGg÷·_{>=ƒþsV ƒ01õ‹jP¾m3&äå™~þ«ê¹è“–†Aá0¦nÝ„[†šë{­ù`p8»߆ÿœ·È²š.^0µ)Õ2ã·¯á›^š†† >Üô¿+Và­·ÞÂØ±cMûE¼ÂÂB¢££çÎóÜ­s[žßûë[ßÂÎ;Iv:„™3g¢´´_¾ù7;†‹ïÀòå‘_‹¾páBdÐþóŸ# !''­­­x衇"÷÷ôÂW¿ÚŒ±c#oH–-;‚Gà‹/>B(”‰E‹jñòËã±cÇÍÒöõé“…¥K‡ÊÊŸ?Û°¡6 çø$&MzÈb€7+W6aРÈóàüy³Ó¸~ýz´µµáÑGiÿéÓŸÆÊ•M˜<ùûƒ£L5QÏ?ÿ<ÚÛÛ±fÍ@AAÚÚÚPUU%-¿ÿÑX²d?V®l2Ê£çÃÏë'èë•Þ¯Ô™¤®ç¯~õ+ 6 ó7Óó‚–GÛ¯z¾(?Ì"ަìy$–GGålÒòen§X¾ÕùÙ¶múôéƒÁƒ£¤¤_ùÊW|9>·õÅ[èùr{ý'š#«:^'ׇÝöôõ™C\ã¬AYÆ;.t`ßûPtK:/uöX¦¡ë?xúäŒÌAå+• Û1söÌÁ©"o¸/v¡Ì.Ÿ½ ‡QÝPÑßëþFdòO&ã#®Î/?íÝ7O\4ÖTàýÿyÃ3áï&`÷ÂÝØ·|Ÿ´îì’l|øÜ‡¶íË)ÍÁ»8Zµí*Æü` Ž®=Š´Pš´}v¹z$Þ®y»û®‡ÞEÙ3eè?±?¢öKg.™öñ¢?è7bÑüðà~´´wOÑè\¶ðäfd`ë¼…ØÜtá/€ŸWÎÄ·÷ìÂÕ/?oÉ2kýS÷ù\„Çß9xrZ%ª·oÅ­om—–_Ú·~~ìHÊ?Lî¾ÖÙ€+úp¾|9r?=üðÃ(++3Ö?ýôÓ;v,~ÿûß?[°`þöoÿÖX=z4,X`|¢¼{÷nlܸQú ‹nÜ–ôþbßE7æ7Ä¢¶v!~ó›ÈùÉÍÍÅ›o¾‰Ó§O£³³/^Dnn.22"ß–ÍÆÿý¿Ã•ùtòìÙÈ}ðþû/`È›ðæ›w`éÒCHOï+mÏÊ•§°iÓõøøã:Ó FühãÆRN—î¿lÙQüú×%8sFþ|\°`²³³QQQÓþEEsðë_—  `Štý† …8{ö ÑóçÏG8FAAàÓO?Evv6víÚ%ÝÀ€Éز¥¿þu‰ô|ø}ý}½Òûuøðá8uêÖ®] øú׿ŽW^yS§N5ö9}ú4þéŸþ)¦ç-¶_õ|QåÀéÓ§-OVžx<ôøUåÓeZ¾ìü¼øâ‹øêW¿j̲ÜÒÒ‚#GŽøv|nê‹ÇˆçËëûM6О0a‚Ñç………8xð ±ÝÉ“'1räH¤§§GÞ;MžŒòòr”””H—O:…믿uu‘çëœ9sPRR‚)S¦H˧¯ŸªãU]ªíéë3‡ ¸d©x©—Ï^F(+$]¶Ûþ†n@Gkν}Ÿlÿ$!;fçôÈ*Š Bw/ÚÌ™È+|Crv×YÔWÕ£ëj÷·:×\ :.v»ZuuøüwŸË㇫푇աûaèW‡bfí̘Û7ù§“qáý ŽÖ_m¿ŠãOǕϯ s`¦´}v)ýf)f7Fˆ€¼)y˜ü“É8¼ú0.µ®?èþØsó,ý¯×-××¼µ³ÂhÿòcJ~.ŸÊLÜò2;k,?^6ÍØö®Æ:|íÚѨ_T#-›§ùÔÏñãÇ v‚:~¡P‡6>z:x6lÀ{ï½g,{íÖ¹-¯·÷“žžc¾^»ºPQQúúúÈ_~SÐÐÐ` *àãÿ áð@dg~ùIì`´µ}‚/¾ø›6MÁŒëH=éèèè@ggú÷ƒóçÿ€´´>Æ ƒ<>ÿ\þwž]]ŽŽËj"#§û·¶êý½åŽ;ŒOnýNУ›úèýJI™ëYTT„¡C‡Æô¼•GÛo÷|q{|²òÄãqâlÚEV>=¾ŠŠ ´¶¶šÞäïÛ·/¶7ŽÏËúâ!ôú â~‹'GVçxe¯ÇªÐ×gŽ0àêhí@ûÇíÆ7%w•àÌ[gðÇÇÿ(]޾޾Ӥëßù«w0ê¯G!«(Ë4(I””Þ[ŠåP¼¤8òF£$¥÷”âüóÆñ(€¡Ë»oØÆ›1»¾Û-Ë‘ƒk×tÿŠ[ûGÝöÈÕ#ñ§wþ„+Ÿ_‘ÖßÖÔ†÷°mcÆ5æ¿Ýš»o®é·VÄõíhknCç¥NcÀEÛg—ºÊ:ÔÏŠ¼9;è<:.t w|.ò*"ÐôÜt„‹Ãè;ª¯§ýѼ¡Yڞ܌ Éé‹1¹‘oØ~V>_o¬3–È7VÑîXâÅÚ)ÓŒõ3~ûþûÖ¥Æòµ¹¹øÞøIÆrÓ݃Éˆß;‹ó—/IÛsêâüå¸ )ÿ0ùÅÎfò\¿~=jjj §Ž:~ÿüÏÿŒo¼ÿ÷oì#:x'üz¨×nÛòüÞÈ!èÛ·/&MŠ\¯+W®Ä/ùKÓ¯ø´¶žÀ!7}ùBÿ8¦N} ÅÅWpãÆÈÍÍÅúõëD\•+Wbûöí8{6ò¡Ãðá·áÆööOqñb3† ¹ ·ÞZ³gbÚ´'PP0yy‘kþàÁƒ¸ñÆñË_þ8uj3†]€‚‚)èêºúåùºyy×!ÊTSÓ6Œµ ýú 7~öÅÇã÷þPP0Õè/ ò÷ZµµµhiiÁ«¯¾Š{ï½#GŽt\¾x>ü¾~‚¾^éýJIêz~ï{ßCuu5¾öµ¯Åô¼ åÑö«ž/ªPG“-ÌÙ´+Ÿ.ÓòeçgìØ±¦gâØ±cñÈ#8êOÝãs[_¼…ž//î·DrdeÇkçÈÊ^Uîlùó N$üÂñ>×ÿŸëñîwßõm¦>šÉ?Œw¿ûnÜôÇŒ­3L¿ÆdFôë‡4¤á.´:ÞçßfVã=»›©ïç•Ux`﮸¹§ÞZp 潾͗²ÙÁ 6K—þ›6]Ïýà§¹ÙxÊñ'¿úÕ¯À±>>œÞ ¿~ÆOØá ã§5Ø€ßýåïP¼´85û# Ø»lo¯µomÙ4­ÁÜ·»ËJG¤äõà‹¿oó"ìàq8‡Ã¯Ÿ<àJõÕÆÙ®?tÿ¡˜Êµš¥ÐëöðôÛ-OúÃÇßD}¼ìÛõw5ÖÅTîÕ®à~}6ž¾Ý?½¦¦†2Æïo·&LXãh»¡CºªÇíþÑX}»Å×¥w úÛ‘Dþ6æ©§žŠ»úøÛ-ëPž èðs*\©ìpQW‹.Ë2hÞ Ìzs€à.ê`Qw‹.;iu¸Ä㓹[¾ö‡‡KŒÊáÌn;\¶ çp©B+×#êŠäç磩© õWåIýìp™Ã—<ìpÁ¸ÿD‹Þ¿tYædÙ9N2·Kœò]¶^tƒhûTõÑòiy´>ÙóIåÙÕG˧íg‡Kp-ö']¶rÛœ†.v¸´\©îpQWËÊÙŠ¦è–"œ{ûoj4ý<(‡‹:XÔݲrºTí³:>Z_ýaçpѨ.êv/ìpy‡KêØX¹QWäü#JJJ0bÄOêO5‡+==+VüƼ³ÃÅ—N¨‹Eï_º,s²ìBÝ$êþÐõÔ ¢íS~˜¥pˆh}ôù¤r‹TõÑò­ÚÏbº~è²îõHÃ;\Z®Tw¸¨«%s¶ÄŒûñ8äŒÈ1} ¤ÃE, §ËE—Uí³;>Y}Aô‡•ÃÕãúS8\ÔíØáò#N.UdŽ u=DWäÓO?EVVV˜X“j׊'±qãH¤¥Ev¸ØáÒ u±èýK—©“å$¢›$sÄõÔ ’9`vqâQGL|>©Ü"U}´|YûÙáÒ =_âr,×£]Øáb‡ËvÀ%K*9\ÔÕ’9[bÒBih=ÒŠ?;aü,HwJæ`Q—‹.«Úgw|*w«·ûP;\4ìpÅodŽ u=DWd„ Ÿdn‘N}´|YûÙárÚŸtY÷z”….v¸œ„®Â—~°Ã¥x“”B »"þ†.ò;\¾‡.>~½Löð´ð„.Íþ`‡+¡â·ÃEî‡Ãáp8üzÉ®TP±Ãå}°Ãe›Tr¸hØñ7ìp™Ã—ÿa‡ËyØáJÌ,\¸°WêåçT¸RÙáêÑ)™!T×U£ä.ûiÉ£¿Šé·Ã•‘—Ù³1üîî¿IrÇË}©#‹Ã%–¯rÉhípe†BØËí¸g”ý4¼ï-Y€.Ï[ðÖá¢Q9\bžÒ×îEJÇÑ1]Iîpåç磥¥Åøûv¸Øá¢žxÿÐòeÛë¸Xôy@—ݺ_´>Zm?=¾X\'±>Z­?‡K×UŠö³ÓúâÙá’½~ÄÒV‰ÎVºyófÛín»í6ãÿE§K–ÚÚZÛI^DgKu½©ÖËî»×S•'Ûßë×ç„p¥ºÃE3³v&æ6 w\®å63¶Îèñ3¿®ªU¨ŸUìaÙ"ÓøÛ}ûeåˆ9u¸hù*—̪¿‚r¸êÕ |ÛfL°ùCÍ·ô°Ãå]¼t¸Ê; IDAThTu@ÜF×Ñ¡I4‡+''­­­x衈‹¥r¸öîÝ‹ÂÂBc3v¸RËᢽhùºnžÊù¡ËnÝ/Z-¶ŸŸÛúhy´þhœºXº®\½>bé»äää`ذaÆŒÔÉ0`ššš Æ‚:]åååhnnÆßýÝßÞ|óM,^¼“'O––G-Õõ¦ZO¯7Õë©Ê‰£û{ýúœð®Tw¸hÒû¥£â¥ œÞvZ: þÈÕ#{Lèà§Ãuù³Ëe†pùlĉ8òè\:sɲý2GLÇá¢å«\2Yépåfd`ë¼…ØÜtaašÔh¾3~b Øáò>^9\²Ø9\2ÄMtšDs¸.^¼ˆÜÜ\ddDf6U9\ÑOLûõë'm;\©åpQÞ?´|]7ωó#.»u¿h}´<Ú~z|në£åÉ\BK×UJF‡K¼>tûC•/¾øÿðÿ€ï~÷»…B=œ¬£G¢¤¤Ä˜FŸœ÷ïßaÆ÷^t  -:[ªëMµž^oN^Oíœ8º¿×¯Ï ?à’%•.Yöݹ™™Òfé7K1»12Ekޔȷ*~ºS»íFæÀLä•;›jSæˆé8\NÊSõWÐWÍ[;00+lØYbîsÕD>›V0;\‰;‡Ë󇢎N"9\ÑO&ŒA`íp555aøðáøÅ/~Aêa‡Ë«$’ÃE<Ùý#–ï…›GŸâ²î—Zž¬ý´ÿܺNby²ãqãb©žoÉèpÙ¹PnŸ÷_|ñþ×ÿú_8wŠz8YªçÅž={PYYÙÃè*++C~~¾¥»%Fu½©ÖëÞÿ*'Žc3àJu‡‹¦éÅ& š7×=Òí ˆîT]eêgEÞ¬œ?t€¿WvI6Jï)Åù‘ºÒsÓ.£ï¨¾ÒöÉ1‡‹–¯rÉdý¤ÃµþÄ1,(еS¦?®I[^Æ”­¯þûì§‘v¸ZžÌ%Ôq±t]¥ds¸èõá¤?tÒÖÖ†?üííí'rØá ìpé÷;\Š7IìpñT·>….sØáò?ìpñùãp’=<-|a‡K³?ØáJ¨°ÃÅáp8‡Ã.qîp9 ;\Ýa‡+†k•®¤ ;\æX}»åUùv¸t‡“à.v¸ºS¼¤³gcèŠî¿Y4of½9ËX*¿.š¨‰5wß\däeH·ÛW±12›WÙ³e–í£—U½²òcq¿lûÃõbD÷߃©®ÜŒ ¼·d;\~ ¶àÞá™ë˜Ý-™›âtÖ3Uüv´ÜîßÛWfæ,[v þöËÁ¶¿פI“LÇê4n®={öxZ~²9\vN½­=q{Ñq¢ÛËžôþÛC ÙöÔÒ)OåŽYõ‡UÿÑþ§õÑåX.z^tú7Ñ.+—*Ö×±?ýú;%•Ûåv{'ýc¼ß%×K,î\J¸Øá2çã-£~V=FÜ7PtKν}7EþHÖÊÁòËᢩ«¨C]Eº®váÊùžoÐöõÉîƒpqؘAPåpÉ"ºcN.¿®'¦–›Ì+•Ã58œÉ¯½‚‰[^6ýœ.ïâÆá¢ u=¢‰º[27EæÆÄ¿-·û{íp¥§gcÅŠÿÁøñ‘7|*‡kÑ¢Z¼üòxìØq³´}^;\tºf•£åÖáêêêBee¥1È£ý¡*?Ù.•SEïG™£gw¿Òíéó€Þÿ´=Ô R9Kºå©Ü1+7˪ÿhÿÓúèr4±ºXºýë¶¾x‹Ì¥róúQXXˆÝ»w£°°üã1zôhìß¿MM‘ûŸ:[O?ý4šššðýï߸^Ž=jLP²ÿ~<÷Üs8~ü¸1 Ý.º=]¦Ûggg›ô´~'ý#†^/ºî\ʸØáê™9{æàÔ ‘7Üã~<9#rŒo]d–Ÿ—,9¥98p÷é:Ú¾«mW1æcptíQ¤…Ò¤í³ uÇœ8]~:\?<¸-íÝS‚«®¡998xëRüpR÷¯J±Ãå}bu¸¨ƒB]ÀìnÑíenŒ›íh¹Ý߭õbÅIlÜ8ii鑘כoÞ¥K!=½¯´=~;\*GËíþiiiØ»w¯ñ¦…ö‡ªüdw¸TN•ì~$'÷«¸=}Ðû_æüˆNÊYÒ-OåŽÉÜ,»þ“õ¿XŸlÙ­‹¥Ó¿^ÔO¡.•ׯ“'OFyy9JJJŒ”èlÍ™3%%%˜2%òüù×ýWL˜0Á˜‚ÿüùó…B=z4ÊÊÊz Üéöt™nòäIŒ9éééÒúUýCC¯]w.å\²¤ºÃµsúNdE¡i¡4´iʼnŸ°Ü>hwjòO'ãÂûm{µý*Ž?yW>¿‚Ì™ÒöÙE掉‰Åý ÒáÚùÉi”m}Õô7VìpÅÑCˆ8(2×Ct·èö27ÆmzÛÑ ÒኺUgÎìAVÖc;+‡ë‹/>¦MS0cÆ:RO°—•£å—Ãí§å÷æõd}Ô‰’Ý¢ƒää~·§Ï'n’è©¶×-OåŽÉÜ,Ýþë“-»u±tû7Ñ.Ñ¥òãõCŒ•³õÁ‘çOMM î¿ÿ~“véRäm™»E·—í/&zîÙ³ èQ¿ªhd¯Ïnݹ”p±ÃE÷–b@ù/‰Ìؼ¡ùÓó1æû‘Oˆe–Ÿ—,טÿvKt±hû:Û;ÑÖ܆ÎKÆ€ËÎᢡËO‡+7#CrúbLnj‡ëžQc1}`!¾*üÝ;\Þ'V‡‹:(Ôõˆ~Jgµ½Ìq¿-·û{íp57×¢´t)n¼q#.]ú €½Ã5mÚ((˜‚¼¼È5„ÃÕÔÔ„›o¾ÙQÿyápUVVbñâÅÆ²Ø±”ŸL—Ê©’Ý¢ƒää~·§ÏzÿÓöP'Hå,é–§rÇdn–]ÿÑþ§õÑeÀ½‹¥Ó¿^ÔO¡.•ׯ4ÔÙ¢yøá‡±ÿ~ã×môø{(Ñí¢ÛËö·¯­­ÅÒ¥K±qãF|öÙgÚý˜M‘^/ºî\*‡®Â—~°Ã¥x“”B»[Á†.î ÃŸ?'ÙÃÓÂv¸4ûƒ®„Šß»[‡ÃápxÀ•ê*v¸¼ïv¸l“J»[Á†.gýÁ—wa‡ËyØáâp|ÀÅWwògäcvÃl”¬êž&\t§¢ñÌ’ÄÃE×»u¸¨KFûG¶ÞU8p¸ÄD­÷–,À̬ë©ÓÅ—ǃ-è;\vÎÌѺ.ºÞÊù‰5ìp™ãÖáZ·n©½ºW,Ž–Ûý-ªõ´üdv¸¬î×è,~Ô¥’9VvŽu~èþNœ.±=^×'s·dõ[EÕ?´=n.zþèñÐë!Ù.Uÿê&./û/å\ìp™óÙþÏP_]!Ë"ƒ,™»%ºTÑÄ‹ÃE×»u¸¨KFû‡®÷¢?ì.š‰[^ÆÄ-/ãjW>“Llaåt±Ãå]t.•scåÎD.º^æü¸ ;\Þ;\iii&FÇá¢ÎÕúõëÑÖÖ†G}4¦ýUתU-((˜j ¢žþy´··cÍš5ŽÊO5‡Kv¿Š®u©¨c¥ u~èþN)gI·>z|*÷«ÇšŠþ±rŽbu±èù£Çcu=$‹Ãå´&Õ.¯û/å\ìp‘Oì¿èD'¬ îu©€ør¸èz·`vÉhÿÐõ^õ‡•Ã%ËÈ~¹¸sç›Òu2§‹.ïãÔáR97²eÑá’­]·a‡Ë{‡‹~#çÆáZ°`²³³QQQÓþ*‡kÆBœ={ÐèÇùóç#£  ÀQù©æpÑû‘ºFÔ¥¢Ž•*Ôù¡û«)]gI·>z|*÷‹FÕ?2çÈ‹EÏ=ÙõL—“þu“dw¸üpÉ’ê׬·faÿŸí—¿Á–¸Tñæp‰ëÝ:\€Ù%“õ]têt±Ã_Q¹3¢Ã%[/º2^„.o.ú àÞᲚHÅ/‡kÇŽ(,,d‡KqÿR׈ºTÔ±rÑù¡û«©Xœ%úèñ9q½Ä8éêyébÉ\%z=$“Ã夽L²9\A÷_Ò ¸Øá2gâ?LÄ¡ûÎu§¨KÄ—ÃE×»u¸¨KFû‡®÷ª?¬.Y®É4÷‡èpÉœ.v¸¼S‡KåÜÈÜÑ€‘­ÏËËóì8ØáòÞáš4i&Mš„ÌÌØ.GË ‡« `ªÑ_°|ùrÔÖÖ¢¥¥….ÅýK]#êRQÇJêüÐýUŽ”®³¤[=>•ûE£ê™säÆÅ¢çìzH&‡ËIÿz™ds¸‚î¿d ;\„.ýþ`‡Kñ&‰.ŽOawÊœææfã ;ÇŸ°ÃÅçÃIöð´ð„.Íþ`‡+¡Â‡Ãáp8Žý{%þ†ËíâGãptíQÏÛ9äŽ!¦éúSéª e„|ûvïñ²ðÈáž—»rĵøõ‡¤âéBf¨O`ßîq;&¬Áþ°N¹ÝС ñÑG;b®Çíþ½]>‡#ËSO=…|;‚ÃI°°Ã% u¬B™!T×U£ä®È¬3Ô¡òÛá¢ÎUF^f7ÎÆð»‡;j¿[‡+:øsÒoÕgÛ ‡kVá`¸u)¾!LC¾b„ýߣ-(Š·oޏ9ìpy•ÃEêvX9ZQw 0»1Vî‡ÓYÏTa‡Ëv¸Ü—ß©AF$šÃ%[¦÷#u©è²Êq·—µWU>m—õÑç›Ê¤n™ª|êdyápyDv¸dŽ›NØáb‡KkÀÅ—9Ô±šY; s;.@O‡*¿.ê\Uí¨Bý¬zdËvÔ~·—Ì!£]2§õÅêpíùô nøÏMXùå 뉩å¶Öí%¥hlù3~ûšùE‚.ÏbçpQg†ºVŽVÔÝ¢nŒÌýÐqvTa‡‹.Ñá¢ý¡ëpuuuõ˜¡ÑÏëÇïë•Þt™ÞÔ¥Òuªèö´½NÊ×y>èÖGŸo*ºeªò©“M²¸XAGåªé†.v¸´\ìpõŒèX¥÷KGÅK8½í4BY!©Cå·Ã%:W—?»ŒPf—Ï^vÔ~·uÈh¨Kæ¤>7Wt`sùËÿþðà~´´·Y¶omÙ ¸67;ÝÚý&.ÏcåpQgFævPGKt·¨C÷×uvTa‡‹.Ñá¢ý¡ëpé ¶¼¸~ü¾ÞèýH—éýH]*]§ŠnOÛ«*_÷ù [}¾Éžg4¢[¦*Ÿ:Y@r¹XAG媹 ;\Û—,©îpQçjßûYi 8©Cå·;%:W»íFæÀLä•ç9j¿—]¨Kæ¤>·ý±çæ%Xú_¯;»ÈÓÒðÞùÏðïuÏÂÈWp¡Î ÐÓí Žu·hÄýcqvTa‡‹.šh°Ãez?R—Jש’m/¶WU¾îóA·>ÙóMåRGЮ|™“•L.VÐQ¹j^‡.ŽiÀÅWψŽUÓ‹M4o®{$òû¹Ô¡üu¸¨s•]’Ò{JqþÀyc?.êÑú¨Kæ¤>7×Ïʧãëu“Û›‘!9}eÀìp½pâ}TÆ&wÊÉ—÷±r¸¨3#s;¨£%š/Ô¡ûë:;ª°ÃÅu¸Äþˆ¥ücÇŽáæ›oäúñûz¥÷#]¦÷#u©t*º=m¯ª|Ýçƒn}ôù&{ž‰¡n™ª|êdÉåb•«æuØáâDóv¸ôûƒ.Å›¤$v¸ØÝêݰÃÅýtØáâóÇá${Øá ìpiö;\ ¯.v·8‡Ãáð€‹c@ühœíúC÷Š©\ÕÌ€^ÆËo·<éýñ²l×ßÕXS¹W»‚;_ñôíxyè555üPéÅøým΄ km7tèBWõ¸Ý_Õ^•ÏAàߎ$ò·1O=õTÜÕÇßnq8.v¸ÌÝ©Œ¼ T½Q…QŽ’®÷Ûᢡ.W“JÜ0·uǨóƒæ ¬7gyÓ ‡KÑÙ¢É …°ÿ–ÛqϨÈ4»ìpy<Ø‚½Ã%‹ÛcåzD].êØx퀰Ãe;\îËO6‡Ë.2×Ht¥d÷«ãDïwºL˧.]ßõ9ùÉ®Äçe,—ª½bèz'õÅ»Ãeç8ªÜ4UØáb‡KkÀÅ—9Ôš¾i:vÍßeüÌÊ¥òËᢡ. uÃÜ:\Ô£ÎWÑ-E8÷ö94ÞÔèYØ9\4VÎV4õ‹jP¾m3&?df‡Ë»Ø9\=‹ ·ÇÊõˆº\Ô±ñÚa‡‹.v¸bu¨+¥{¿Òû.«\,]÷+èúTý#{^Î.U{{| k±>QÝ/•ã¨rÓTa‡‹.­;\æPwê݇ÞEÙ3eè?±¿t=à¿ÃE#º\4Ô sëpÉÜ1Ñù÷ãqÈ‘cúVÊ‹þ°r¸hdΖ˜ÜŒ l·››N"üå4«ìpy+‡‹FåöÈ\ÑåÌŽ×;\ìp±Ã{¨kD]©XîWñ~§Ë*K×ý º>UÿÐç% çp9qÃÄÈÖ'²û¥rµ›¦v¸8¶.YRÝᢃ©Ã«ãÂÑ –Ûøípш.—,¢æ…ÃEÝ1ÑùJ ¥¡õH+NüìD¯ô‡ÌÙ¢©ykf… [‹®ø‰ÌÉ¡®u¹¨cãµÂ;\4ìp9 ud®•îýJïwqYåbéº_A×Kÿè8\NÜ01²õÉæ~©H/ÃÇ4àb‡‹¼A!îTÇ…äŽÏE^Ežt=à¯ÃEC].ÀìbQ7Ì­Ã%sÇDç«yC3ò§çcÌ÷ÇxÚVÌÙ®õ'ŽaAñP¬2ÍXÏ—÷±r¸z|8¡p{d®‡hÎPÇÆk„.v¸ØáŠ=Ô5¢®”îýJïwº¬r±tݯ ëSõ}^z—7Lü54ÙúDv¿TŽ#`惡 ;\œhØá ìpé÷;\Š7IIìpѰËlØâþ:ìpñùãp’=<-|a‡K³?ØáJ¨xípѰËÅáp8‡\©> Šs‡KÕ>€.1ìpÅp­úxèìrv¸œõ;\Þ….ça‡‹ÃIðWª;\¢«%s¦ì¶Úá¢.u¨Óå¤}Ôá0;[ªöípQg‹f@fÖ,Å}£#Av¸<lAßá£rg¢‰:\N·5ìp™Ã—ûòuÎG¢:\ÑY˨ãD—eî‘ãdåüDË£î=™ ¦r£èóDt¬¨CDOVŸj°bç~Ñúbq¸ìú“žXê‹w‡‹F<Ÿ2gM÷ºg‡‹.Ç®Tw¸¨«E)ÕöÑåpQ‹:aVN—ª}VÇgålYµÇ‹þÐq¸¬œ-£¬Å5˜ºu†÷5OcÍ—wÑq¸hœº3Q‡Ëéö±†.v¸D‡ëùçŸG{{;Ö¬Yã¨|êpÉ·Ÿ×OÐ×+`vô¨ãD—uÝ#™ó#ÖGÝ/zÂá0 •O.z>ü¾~‚¾^©£G'™ë¤ãÑûÖGÝ/zN®çÏ;#0N¶wv¸Øá¢×òåËQ[[‹–––˜Êχß×OÐ×+uô¨ã$stÜ#z¿Óú¨ûE‡®W~xJž'Ô±¢=>ÝúTî­pçb©*¯ë‹·ÐóIûÛë°Ãʼn†®Â—~°Ã¥x“Äǧ°;eNss³ñŸãOØáâóÇá${xZøÂ—f°Ã•Pa‡‹Ãáp8‡\þ Øáò¾?Øá² ;\¿Â—9Vßn±Ãå]Øárž ®dïO'ð;\Î.ÏÝ)Iì.Ú^ºKûÜ8\b¿yÒìp)“L—*V®MÔårë¨ô¸žØá2….÷åwj‰àp‰S@ÓûOåpE?D‰:H€žÃ%sªèó–ÀT¿ŽÃ%sÃÄòdý'«ßi}ªúÝ:\~$ž.zýÑëÇêü: ;\ìpi ¸ØáÒs¸üp§hì.Ú^ºkû¬ÊS9\@äo®hØáJ¸q¸T±rm¢.—[G…†.v¸D‡‹ö‡®ÃÕÕÕÕc†F?¯¿¯WêTÑûOåpQIêüÐúèóAV¾èvéŸÌ Ë£ý§{|´>'õÉãbùzýÑëG×…£a‡‹.­;\z—_î”qƒ(.Ú^ºKûìÊW9\#Wì1Á;\©—X.Ud®èrÞ:*ìp±Ã%:\´?t.Á–×ßכ̽ï?•Ã%sì"s~Äúèó–OÝ®XŽOtªhy´ÿtÖ§ªH.ËïÈ8úz¡ã©ÂÇvÀ% ;\öWo»Sªè¶Ï.*‡«ô›¥˜Ý™7oJ^¯ô;\É™kC].¯v¸Øá¢‰ö;\²Al÷ý§r¸d’*Ôùë£ÏZ>u»b‰èTÉÊû/–ãÓ©H.ËïÈ8úz¡ëÂé„.ŽiÀÅ—žÃå—;Êá¢í¥Ë±´Ï®|•ÃUWY‡úY‘7oç÷¬?ØáJ¬Äêp©"smDÆkG….v¸¨Ã%öG,å;v 7ß|s ×ß×+uªèý§r¸¨ƒ¤|¾ç‡ÖGŸ´|êvé`vªhy´ÿtÖ§ªH.ËïÐëOöz¡ãÂé†.N4ìpv¸ôûƒ.Å›¤r¸hØåò7ìpqv¸øüq8Éž>€°Ã¥Ùìp%Tüv¸hØåâp8‡Ã®TPŹÃå$ìpu‡®®Õs˜].׳þ`‡Ë»°ÃåÞò1êgÕcÄ}#mMo9\=Þ façôÆßªõÉîƒpqؘÒ_åpÑãSÕç‡K¦ãpíùô nøÏMX9B> Èàp6&¿ö &nyÙôsv¸¼‹‡‹º5V®GÔÝR¹5nÃWj;\]]]¨¬¬4ˆn.Ùùðóú úz¥÷+]¦Î‘®›'Û^t°èzZ¿•ãçôxTŽ]O"å‡g wËk‡‹ŸÊUs[_oGu=ê^4ìp±Ã¥5àJu‡KæLÍÙ3§^8åxûÞt¸hÂÅaT7Tcô÷"ߨ\m»Š1?ƒ£k"-”&mŸÝñ©êóË%sêpE:—-UzÛ%Ûsó,ý¯×¥ëv~re[_5ý;\qô’¸5Ôõ î–ßa‡‹.v¸¬CïWºL#]7OÜ^æ`ÑòÄúeŽŸÎñ¨'º^æé†ö—×—ÊM¢ý™èî—ÝõËõ¡õÞ„.Ž8àJu‡‹:S¥÷–b@ù/éž%Pt§d.Uo:\´}%w•`@ù ]y`v¶w¢­¹ —:—ÃEOUŸ_.™S‡ëgåÓñõÆ:ŒÉíoüLt¸î5Óâ«Â¯²Ãå}bu¸¨[#s=DsƉ[ã&ìp±ÃUYY‰Å‹Ën.ñ|ø}ý}½ÒûUvÿŠÎ‘®›G·§]Oë—9~:Ç£rœèzê©âÄÝòÒá¢Ç§rÕÜÖ×ÛQ]º×‡nØáâDÃWa‡K¿?ØáR¼IJ!‡‹Ý­`Ãî÷GÐa‡‹Ï‡“ìáiá;\šýÁWBÅo‡‹Ý-‡Ã>8V IDATáp8<àJõ;\Þ÷;\¶I%‡‹Ý­`׳þ`‡Ë»°Ãå<ìpq8 >àJu‡K–è¯Zfäe ê*Œzp€žÎU—ÌÁ²úUÐPfÕuÕ(¹+2KN,­'ú/#/£ÇñÓþ ÂáZ!ü=u¶h2C!ì¿åvÜ3*2í8;\¶ ïp‰SÈÊÙ³Q‡K¶½èx¹ ;\æ¸u¸¦M{«VµV;\þ^?A_¯Ô5¢÷£l}ôçÑè8\t™¶_µ¬ª>Tn“l½Êá²+_ö<·wëp©ž¿´¿Ýá²»n£Ç¯ë¦Y]ÿìpq”®Tw¸d™±u†ñÿÓ7MÇ®ù»Œoœ¨s_—ÌÁÛG3³v&æ6 w\.}‡‹¦®¢uuèºÚ…+ç¯ô8~Ú?^ô‡ÃõÄÔr“yeålES¿¨åÛ6cùÃcv¸<¼_4.ê¾PÅÊÕŠ:\t{êx¹Mª9\999hmmÅCE\,?®  MÓ£'’ÃõüóÏ£½½kÖ¬qT~ª9\Ô5¢÷£Ì‘-U¨ E—iûU˺Ï'•ÛD׫.Uù´ÿ¬ž‡±ºXªç¯U%ªÃ%‹xýéºi²ëŸ.v¸¸RÝᢹz¤i†wzeÏ”¡ÿÄÈ,xÔ¹üu¸¨ƒEÛG“Þ//Uàô¶Óe…´.YrJspàîÒã§ýãUX9\?<¸-íÝS„Ëœ-1¹Ø:o!67DøËiVÙáò>N.ê¾PEæÂˆÝž:^n“j×Å‹‘››‹ŒŒ þ8\â7\@b9\óçÏG8FAA£òSÍáÌ®‘ì~×Ë-U¨ %.Óö«–uŸO´ý2·I\¯r¸TåÓþ“mïÆÅR=eý•È ½þtÝ4UØáâØ¸dI%‡«Çèo–bvcdŠÐ¼)y˜ü“É8¼ú0.|2L+ XwжO–}wîCfA&:/uj;\Ò‡ÈO'ãÂûòã§ýtÈœ-šš·v``VذµØáŠŸ8qPD‡‹n/s¼Ü&•®è'Û Æ ðÖá¢ßp‰çpíØ±………ìpI"ºF²ûQ\/s´T¡.]¦íW-»9>ÙóJ\‹Ã¥ê¿ï·ÑöËÜ&q½ÊáR•OûO¶½Kõü•õW";\4ôúÓuÓtÃ'v¸;\úýÁ—âM;\ŸÂî”9ÍÍÍÆ4Ž?a‡‹Ï‡“ìáiá;\šýÁWB….‡Ãáp8pù;€ˆs‡KÕ>€.1ìpÅp­²Ã•4a‡Ë«o·Øáò.ìp9OÐW²÷'‡ø€‹.¡Sˆc%Ë yƒ0ëÍYüw¸¨{U¼¤³gc芡Ò}©›å¤}v—ª?h{‚p¸ÄPgË*Q§‹.[Ðw¸b E*êrY­5ìp™ãÖáZ·n©½‰àp-ZTëiùdD¢9\2ÇÈÎárëbÑòéýOË—¹}nê£=~º^7ýû÷7úK¶ì…ÃåuÑáòêúg‡‹.­;\æPÇŠ¦è–"œ{ûo2ÿ‘¥_u¯>Þò1êgÕcÄ}#¤ûR7Ëiûbí«öøåpÑX9[bÞZÐs@À—wÑq¸b‰Ì퉺\VëcMª9\ééÙX±â0~|ä ‡WZZšÉ†‰g‡kÕªL5Qn®®®.Ó±û}ý}½R—Gåp¹u±dîžxÿÓò©3å¶>ê€Ñã§ëuS\\Œ¢¢"czoºM2¹X½/:v¸Øár<àb‡ËêXÑŒûñ8äŒÈ1} ã§Ã%s¿æì™ƒS/œ²<ÑÍrÒ>7ý!kŸÌÙóñ{LèÀ—÷qêpéFæöˆ.W,®êæTr¸V¬8‰G"--â´øápÑoäâÙáÚ°¡gÏ4úÑ­Ã¥3Øòâú úz¥.ÊárëbÑòéýOË—¹Ynê̘Ìq¢n˜N†ŽS§NaíÚµÒe ¹\¬ÞŽ×÷;\Û—,©ìpfÇŠ&-”†Ö#­8ñ³ÆÏüt§dî×Îé;‘U”e}Ó n–“ö¹éY{‚t¸€žÎ–˜ûÇ\‡C5‘Oÿ¦ ÀW"Eæöˆ.W,®*©äpE]©3gö +«ÛiñÒá¢ßpìpuþý®º<*‡Ëm}´|Ùý/–ïÄùÓ©/2hïvÀd.uÂtòúë¯cذaÆ7rtH.+âçýÆÇ4àb‡ËêXfçªyC3ò§çcÌ÷»?Ñ÷Óá¢îUé½¥P>ÅKŠ¥íÌn–“ö¹éY{üt¸hdΖèpMÚò2¦l}ðßg?¼0³Ãåyœ:\º‘¹=¢ £ëú¨’jWss-JK—âÆ7âÒ¥ˆÓâµÃ5iÒ$Lš4 ™™‰ápL5ú pïp;v 7ß|s ×OÐ×+uyT—[‹–OïZ¾ÌÍrSuÀèñÓõºyàP]]{ï½Wº $—‹ÕÛñû~c‡‹ ;\„.ýþ`‡Kñ"‘B »\þ†.sØáò?ìpñùãp’=<-|a‡K³?ØáJ¨øípѰËÅáp8‡\©6 Šs‡ËIØáê;\1\«þæ0»\þ†.sØáò?ìp9OЗ“úøÛ-GcÀÅWw¨+E¬h¢Ë~;\4Ví¡‰®¯Ø™Í«ìÙ2ËöÙ9\´<rÇãÿ3ò20»q6†ß=Ü›þpàp­q­í²êt±Ãåñ` ú—8…,u<¨;èn‰.Ž×;\æ°Ãå¾|ó‘—xÿÒý©»Eïg™Ûeç8Q׊–§r·tÝ/ú<¡û«Ž7;Юÿè²—l ïhùôxœÔ—H½žÜºiìp±Ã¥5àb‡ËêJQ ˆü_W7@’öЈíë“Ýáâ°1à®ÃEËÿØxSÛªvT¡~V=²‡e{Öv×SËMæ]¦±rºØáò.:un¨ãaåÎDÝ-êâx퀰ÃÅ———ì|øyýø}½Òû—îOÝ-z?SÇGêZÑòTî–îñÑç Ý_u¼€½ ¨ê?ºìµÃEë§í•›úâ-ôzr릱ÃÅ—Ö€‹®ž])ê`\=²Ç„~:\42—K mßÕ¶«óƒ18ºö(ÒBiÒöÙ…–wäÑ#¸t¦{ƾ˟]F(3„Ëg/{ÚV×îGK{›å2Ìéb‡Ëû8u¸¨sC™;#º[ÔÅñÚa‡‹./.z>ü¾~ü¾Þèý+Û_t·èý,s«T]+ZžÊÝÒ=>ú<¡û«ŽWåªú.{ípÑúeíÇm}ñꤹqÓhØáâØ¸dIu‡Kt¥¨ƒUúÍRÌnŒL1›7%ò­Iî”Ìå2 Hû®¶_Åñ'ãÊçW90SÚ>»ÈŽWÌîE»‘90yåÝë‚v¸T¡N;\ñÑñ¹3¢»%sq¼v@Øáb‡‹†.çû‹î½ŸeŽ*¢k%{>¨Ü-Ýã£Ïº¿ÝñÆâÚ•ï·Ã%k/uÓ’Íý¢Nš7Mv¸8¦;\d€A\)ê`ÕUÖ¡~VäÍÊùCçøëpÑÐöf‹¶¯³½mÍmè¼Ôi ¸t.Z^zn:ÂÅaôù„;»$¥÷”âüóÆ>~:\¹’ÓcrûK—³Ã%sºØáò>N.êÜPÇCæÎˆæ uq¼v@Øáb‡Ëk‡K<~_?~_¯ôþ•í/º[ô~¦Ž*Ôµ¢å©Ü-Ýã£Ïº¿êxU. ªÿè²×­_ÖÞ<òë÷Éä~ÑëÉ­›¦ ;\œhØá ìpé÷;\Š7I)äp±»lØá2‡.ÿß?'ÙÃÓÂv¸4ûƒ®„Šß»[‡ÃápxÀ•ê*v¸¼ïv¸l“J»[Á†.sØáò?ìp9;\N‚¸Øáêu¸B™!T×U£ä®È¬3y¨z£ £ ‡Kt¯h{d·wëpåÏÈÇì†Ù(YÕ}ü¢»Õ—˜™Y8X³÷¶è‰N;\¶ çp©\™Ót;\VN—άgva‡Ë·×´iO`Õªcšu]‡kÒ¤I¦cušxr¸:5ȈDs¸d÷¯è`9qö¨ã$:{2çŠNA-nOë§Ë²úÄçíú¼¢åÑãÑudí³;?.»ó™l½eý¯“Tw¸Ü:f)7àb‡Ëêpͬ‰†¹ È— ˜¾i:vÍßÕã(¿.ê^ÑöÐÐíÝ:\Ÿíÿ õÕõ²,2ˆ£îVÐMãâLݺ Ãûʧ©¶rºØáò.:—ÊÕ±rz¢—Ì¥±sot×÷׆ …¦éÑu®èôÿѨ­xs¸ºººzÌÐèçõã÷õJ'z?RË©³×}m˜=êBÑúéö´~º,‹øü ýAŸW´½$ÿ6Uæt±Ãå}œ:\€½«#szD‡‹n¯rot×÷—ø àÎáR9Zñæpé ¶¼¸~ü¾Þ¨ãDïGê`9qöÄPg0»P´~º=­Ÿ.ÓÐ燬?Äç-Ov<:®-Ou<€·—ê|º­/ÞB¯GÕõ¡›Ts¸t¯÷”pÉÂW·Ãûî܇̂Lt^êÄäŸLÆáÕ‡qáh÷ÔáA»Sb{TqëpÀ¬·faÿŸíÐÓÝêm‡«zûV ‡1} s`”®Þ«#s>D‡‹n‹{£ ;\Þ:\ô.À½Ãeåh±Ãl}ô~”9X*gÏô¦DâìQÊn{Z¿¬=bdÏÚâóŠ–';׉–§:À_Ëo÷+"^ªëÃmRÁáòÓ1Kº;\æP‡«éÅ& š7×=ùýÜŽ ÈŸ‹¼Šî†Ÿu¯h{³ÃE·wëpMü‡‰8tÿ!Kw+h‡«ÇùêÛ÷‡½Ÿž1~&:\2§‹.ïãÔáR¹:2§G4`èö*÷F7ìpyïpåå]‡¼¼ë Åæp555áæ›ovÔñèp;vÌqûÍá¢÷#u°œ8{b¨³¹~ò,ë§ÛÓúé2 }~Ðþ Ï+Z=]׉–§:À[‡Ku>ÝÖo¡×£êúp›dw¸üvÌ’)ìpv¸ôûƒ.Å›$v¸8>….sØáò?ìpñùãp’=<-|a‡K³?ØáJ¨°ÃÅáp8‡Ã.ìpyßìpÙ†.Ž_a‡Ëv¸ü;\ÎÇ“à.v¸Ì+™;´Ãe×>«DUÔ­Ã¥êêtípÀ‚â¡xûæÛ,׳Ãåã` z—ìÅš:7v—Êñrv¸Ìa‡Ë}ù:ç#Ñ®è‡"Q7Š–§r«{ÇIæ$ùápÅZuÂt]"Út™–ïÖá’9KâñÑö'›ÃEû×íýÆ;\Z.v¸Ì¡Žu¦‚v¸Tí“eÆÖîÙÚÜ:\ªþ N—ý¡ãpÝ^RŠÆ–O0ã·¯I׳Ãåt®ç8*‡Kåx¹ ;\ìpyépÉ·Ÿ×ß׫ÊÁ¢å©Ü*Uèþ~8\nê£N˜®KDûƒ.Óò£‰ÕÅ¢Î=>«ö'‹ÃEû×íýÆ;\Z.v¸Ì¡Žu¦‚v¸Tí£¹z¤i ·—ª?¨ÓåU8u¸Ö–Ý€kss±sÑ­Òõìp‡‹FtŸT¡ý!ë±|À‹E%z|²ö'“ÃEû×ïû.N4ìpv¸ôûƒ.Å›$v¸8>….sØáò?ìpñùãp’=<-|a‡K³?ØáJ¨°ÃÅáp8‡Ã.ìpyßìpÙ†.Ž_a‡Ëv¸ü;\δÕìýÉá>àb‡«;ÅKŠ1»q6†®0ÿ`ôW/çî›küËÈËÜáJï—nÔo¯.UÐå .ÑÕÊ …°ÿ–ÛqϨ±Ž¶g‡ËãÁô.;×F¶ t;\²õVSØÆv¸Ìqëp­[·ÎÔÞTt¸:5ȈDs¸TnT4vë©ãdç\©ž±:\ÑöQ‡Hu|´ÿTŽm?Ý_µìÖáò#‰äpÑócu½: ;\ìpi ¸Øá2çã-£~V=FÜ7Âø™èZÕUÔ¡®¢]W»på|÷DA9\Y…YØ9}§íߢyép©úC¶ì¶?ì.êjÕ/ªAù¶Í˜@þ°Øj{ãE‚.Ï¢ãp©\ºMÔá¢ëiyn×÷WZZšÉ†I%‡«««Ëtì~_?~_¯ô~sâF>|ØØÞÊ•²zÐíýp¸ÄöQ‡Hu|´ÿTŽm?Ý_µM²¸XA‡žÕõ¨ ;\ìpi ¸Øáê™9{æàÔ ‘7ÜÔµ€œÒ¸û€±¤Ã.£º¡£¿7ZºÞk‡KÕ²þñÓ᢮VnF¶Î[ˆÍM'–L£ÊW0qêp©\™s#:\t½Ì‘qv¸¼w¸è7r©äpé ¶¼¸~ü¾Þèý¦r£~øá×(u¥Ä¨œ+¯.Ú>꩎öŸÊ1¢í§û«–är±‚ŽìüØ]ºa‡‹c;à’%Õ®Ów"«(2¥®ù¼ ï÷ŽÃuv×YÔWÕ[N¹ï‡Ãeײþ Ú%«ykf… ;Kv¸âè!D\™s#:\²õ^‡.o.ú ÀWPçßïúTnÔw¾ó47Gˆè›BêJÙ=t·×u¸dí"'.í?•s¥êÕr2¹X½z~ì®/·a‡‹cp±ÃE,÷–b@ù/‰ÌH]+ȸ&ôOWÉ]%P>C—w_à~:\ªþõŸuµÖŸ8†ÅC±vÊ4cv¸‚S‡KåÚȜр¡ëiyn×÷פI“0iÒ$df¦¦ÃuìØ1ÇíO4‡KåF <ؘx$úkOy¿þmuÿ‹Û{ípÑöQ‡Hu|´ÿdŽ‘]ÿÑýUË@r¹XAGv~ì®G·a‡‹ ;\„.ýþ`‡Kñ&‰.ŽOa‡Ëv¸ü;\|þ8œdO @ØáÒìv¸*ìpq8‡Ãáð€Ëß;\Þ÷;\¶a‡‹ãWØá2‡.ÿ×ó°ÃÅá$ø€‹®îÈÜ©AóaÖ›³ôŽÃ5äŽ!=¶±úUÐŒ¼ T½Q…QŽàÞá’¹_b{<ï®÷–,3þ ÈÌb‡ËëÁô.ê|P×#q$ÀÚá¢NŽÛ°ÃeŽ[‡kÚ´'°jU‹1Íz"8\{öìñ´|ó‘èuy¨ƒ%s{DÇIæfÙ¹\ôùA—e®X-OÖ~ú|¢SfÛ¹Zªþ“õ‡]ùìp¹ªÿuÂ;\Z.v¸Ì¡îTÑ-E8÷ö94Þù#Á ®ñïñm—̽Šfú¦éØ5—±[‡‹º_´=~ô‡—×Ä-/câ–—qµ« Ÿ _°Ãå]t.ê|P×0»8ÑX9\ÔÉq›Ts¸rrrÐÚÚŠ‡ЏX~8\6š¦«g‡««« •••Æ ö‡®Ã%;~^?~_¯*‡‹º<ÔÁR¹=t{•ËEŸtYå ÑòhûhyôøU®–ªÿh}ªò£a‡+Æ+ý¯v¸ØáÒp±ÃÕ3¢;5îÇã3"Çô­KבGàÒ™î‚̽2}âõл({¦ ý'FfåsëpQ÷‹¶Ç¯þðÊထýrqçÎ7»ºìpy§u>¨ë!s{ì.™“ã&©æp]¼x¹¹¹ÈȈ̼ê‡Ã%~ÃķÕ––†½{÷oZhè:\ô|ø}ýø}½9q¸D—Gæ`Ù¹=t{•ËEŸtYå ÑòhûhyôøU®–ªÿh}ªòv¸ÜDÕÿnÃÇvÀ% ;\ÝîTZ( ­GZqâg'ºoª^t¸dî•é†ÿÉd^}ŽFÚçÖáR¹_½Ý€Úáz¦² GÿÔ]?;\½Ñù ®‡Ìűs¸dNŽÛ¤’Ãí·††÷¼u¸è7\@â9\Ñþ`‡ËÙý'º<2ËÎí¡Û«\.úü9A*‹:LbûdåyÝŸºŽ;\ÞÆOGŠ.ŽiÀÅÐwªyC3ò§çcÌ÷»?ÁÒáJÏMG¸8Œ¾£"Ÿ(ËÜ+Ñáê¸ÐÜñ¹È«ˆ ÆÜ:\Ôý¢íñ«?¼r¸àšLsûØáò>N.ê|P×CæöØ9\2'ÇMRÍáÚ¼y3V®\‰íÛ·ãìÙȇ^;\yy×!/ï:„B‰ápUVVbñâÅÆ²Ø±”/ž¿¯¿¯W•ÃE]ê`©Üº½Êå¢Ïº¬r±hy´}´Uù;\n¢ê¯Ã'v¸;\úýÁ—âM;\ŸÂ÷GÐa‡‹Ï‡“ìáiá;\šýÁWB….‡Ãáp8pù;€`‡Ëûþ`‡Ë6ìpqü ;\Îúƒ.ï—óíp9©¿Ýâp4\ìp™#:S¡ÌªëªQrWdÖ™Œ¼ ÌnœáwG~‡?‡Ë®}ªõn.'ý!º_A8\b– C5_Áª‘£¤ëdfa÷âÛðƒ‰‘izÙáòx°=‡‹†ºÔʼnFt¸Ä)k­¯X×9n®uëÖ™Ú«ëpÅâh¹ÝŸ.½È¦¶s¹èýjç8Ñçu¿dí§í/U}tú<²ê/«ãu2X·§åÓþòÂá¢ÏOÑ=£õ;©/Þ.»ëÓíõŸêíOŽbÀÅ—9Ô™šY; s;.7ò†}GêgÕ#{X¶i?¿.UûTëÝ:\ªþ î—ýaçpѼ|êCLÙú*V/]¿cþb̬} ]濇c‡Ë»è8\4Ôý .N4Q‡‹:*2ÇËMRÍáJOÏÆŠÿƒñã#o8üp¸ÒÒÒL6ŒŽÃE«õë×£­­ >úhLûë:\Ï?ÿ<ÚÛÛ±fÍGå'»ÃÕãÉ%:z*×J÷ù@Ý/Ú~Úêxé}ÉúËîxU¡ÛÓò­ú+V‡‹uϬ®‡Du¿T×§Ûë?Õ.ÚŸÅ€‹.s¨3•Þ//Uàô¶Óe…pù³Ëe†pùl·Sà§Ã¥jŸj½[‡KÕÔýòª?¬.YÞ½íüÛûòi¦ÿrßn¬Ÿ9ÿ_^÷·%ìpy§Ìý .ŽèpQGE悸Iª9\+VœÄÆ#‘–qZüp¸è7rn®  ;;1í¯ëpÍŸ?ápؘ2?Õ.z?Ê=;×J÷ù@Ý/Ú~Ú™ã¥s<ôyDëS¯“ˆÛÓòeýåÆá¢ÇGÝ3ÙõÈî—êúôú~K5‡Kvýsl\²¤ºÃE³ïÎ}È,ÈDç¥Nì^´™3‘WÞ=•lÐî”NÜ:\ªþ îWoôÇä×^AqvŽü®Ê™¸gw=Ž|~Þø;\ñê~PGt¸hbqrTI%‡+êJ9³YYÝN‹—ý† pïpYM¤â—õcDzåˆÌÑsëZ‰Ï™ûe×~™ã¥ú<ëS¯“ÐíÅòeýå¥Ã%sÒh&“û%;_~ÞoÉîpÉú“c3àb‡‹¼A!ÎTÓ‹M4o®{$òû¹Ù%Ù(½§çt¿÷ÓáRµ0;\t½[‡KÕÔýòª?¬.šo½Óšf ®Ö+˜˜7Óuò×÷qêpÑÈÜÑʼn~Jg 扣B]·I5‡«¹¹¥¥KqãqéRÄiñÚáš4i&Mš„ÌÌØ.Gˇkùò娭­EKKKÊ;\4ô~¤ŽžÊµÒ}>P÷‹¶Ÿ¶Gæxé}ÑúTÇ« Ýž–/ë/7=>êžÉ®‡Dv¿T×§ß÷[²;\27“#;\„.ýþ`‡Kñ&‰.ŽOawÊœææfã ÇŸ°ÃÅçÃIöð´ð„.Íþ`‡+¡Â‡Ãáp8Žý{¥®ùóç§ÔA¿ñÆ ÑÎ!w 1MןJWe(#Ø·{^eåˆkñë?HÅÓ…ÌPŸÀ¾Ýã$v&LXƒ?üar»¡ä„¹B IDATCâ£vÄ\Ûý{»|G–§žz >ø w‡“` @FF¶lÙ‚;ï¼Sº]ÿ“ŸüÅÅŸæškz̈Âñ&*‡Ë먮@£épÅCØáºÅ·ò­œÑå¼s@âÝ᪬ü)V­j1ÙO½épEÛ1xpúôÉê±":\‹ÕzZ~²;\nësã8ÉÜ+qJk™+ä¦>ZžjÙëþòÂáò:ñîpùyý³ÃeÝ/ɀ륗^Â’%K0fŒ|Zgºþ…^À7¾ñ <ýôÓÜ©>ÅÎáJ…è8\ñv¸bw¸T±rR¢.à­ï×Þ½ßEKËncºq'×þýû?˜f‡ËÞáZµªSA;\ñ]u¬¨»¤r…tCËS-ûÕ_‰êbÅ[Øá²¿¾iœ8zìrÙ ¸úöí‹ÿ÷Çë¯¿Ž¬¬žŸPÒõþçŽS§Nyö@ᘣr¸R%:Wo†®Hbu¸T‘9)¢Ëåµ’l×… P^^nL Ì—½ÃµaC!Ξ=hô#;\ñ_ŸèXQwIå 醖§Zö£¿ÙÅŠ·°Ãe}Ó¨=v¹.¸÷Þ{1`Àcþqý<€~ýú¡¼¼óæÍã^ä¤tØáò?ÔI].?dr¸úö5Œür¸ÒÒú ³ó*;\qpý¥Z}*÷ÊΊ%´<Õ²×ý•L.V<¾¾x™dw¸hØåR ¸^zé%TWW_É\0úI×?ñÄø—ù´´´H/Ž»¨®T‰S‡«·ÃW$±:\ªÈœÑ„ñÚ‰w‡+;»éé9ÈË‹ü½€Êáúáˆ'Ÿ|Òp¥¼v¸Î{ƒÏÂÌ™?GWWr8\S · `‡+žë£Žu—d®›ÐòTË~ôW"»Xñv¸ì¯oÀÞá¢ëÙå²ÏR§If‡ËIzÓáŠ%ìpùçpѰËåoØá"ü°Ãå{ØáâóÇá${ØáŠÓ$³Ãåäc€Þt¸b ;\Û«].‡Ãáp8‰ö^©kî¾¹)uÐuuž–7îGãptíQÏÛ™¨—ëþðÙáz¼ìŽ=ŠÇ{ÌQ;©/®h:u¥ìÊa‡‹Ý-Ç®#AZz÷ R»ïFu]5Z¶J—ièúÒûKñá³âà½. 'dÇÌØÚ=»ÊøÇÆ›L¬™µ3Ñ0·¹ãrMûLý·©H ¥!s`&êgÕ£p¡yzÎO¶En‚¬AY¨z£ ¿©°¬ßÎáÊ*ÌÂÎé;-¿©£ëûd÷A¸8ŒÎK‘oŒ¬Úç´?>Ûÿê«ë1dÙÛö¸é;‡ë‰©å&óêåSbÊÖW±zÜxGÛ/ÕsÑ'- ƒÂaLݺ · 5×÷Zó)Ààp6v/¾ ÿ9o‘eÿ°Ã»ÃE]•»UXXˆÂÂBtttàܹs¹7ñ²ÿ·¾õ-ìܹӸ#e'×âÅ;°|yä×0Ùá²w¸ºººPYYi i°ÃÕ3ÔÝ—©‹¥[u¶hù´<·ÏÚ^ú|¢ëW¬X·Þz cÇŽµì»òé2mqq1ŠŠŠzL÷íÔá¢í?pàÆgÌ^礿uêK„ˆçlj+ev¸ØÝÒpl<²uû[:°ïÎ}(º¥—:{,ÓÐõ<ýrFæ ò•ʄ씑«Gš&l8òè\:Ó=]~z¿tT¼TÓÛN#”ùDyòO&ã#®Î/?íÝ7O\4ö)¨*Àûÿ;ò†gÂßMÀî…»±o¹|W•Ã.£º¡£¿7ÚÑú«mW1æcptíQ¤…Ò¤íÓéè@0ú+²öxÑV×îGK{›ùS·ÛîÀ¿½Ôñö?¯œ‰oïÙ…«_¾©zoÉ2ký“±~Îà"<þNÄzrZ%ª·oÅ­§ÄW$±:\ÔõP¹[0zôh,X°@0îM<ï¯r¸V¬øµµ ñ›ßDÎ;\öWZZöîÝk¼i¡ýÁ—9ÔÝ¡ËÔÅŠ¥>ÑÙ¢åËÊsó| í¥Ï'ºþé§ŸÆØ±cñûßÿ^Ú>Uùt™¶øðá8uêÖ®]k¬×q¸hû¿þõ¯ã•W^ÁÔ©Sõ·n}ñz~T®”nRÍábwKsÀ%KÅK¸|ö²1  ËvÛßð èhíÀ¹·Ïá“íŸ$\§”~³³#Æ@Þ”<é6ûî܇̂LczÍõ× ãb÷'FuuøüwŸË㇫푇աûaèW‡bfí̘Úwv×YÔWÕ£ëj—£õWÛ¯âø“Çqåó+Ș)mŸnÌzköÿÙ~ËöÙ0ùµWPœãxû)ù¸ |ª8qËË8tüxÙ4´ùârWc¾víhÔ/ª‘"ÎÏW‘¹vîVäMì“;â·{“hû‹IO7ß~9\éééèèèHZ‡+Úìp™CÝ'n}¢³%+Ÿ–çåóAå…þöî>ÈŠêÎÿ{†¹óƒÃ ŒÌ À8 0²;Œ 23A"O:A~CÔ]±¨Š®ûÓÒ$em™JªbjË I¬<ü±e’5T­T”5ˆ‘†AÁ Y‚”]¬ž#$€<Ìïëí{ú3§ûô¹}ºïCÞUVÙôísNŸ~¸÷ܾs^ùùØ»w/¾ýío;¶O7bûß|óMŒ3ÆöDJÇá¢íá…°téRìÛ·ÏSëÖ—é¡ÇGu|ý&×.v·4\WÏ_Å¥?^²ž@ÔÝ[‡“[OâOÿAºœøø¤I×ÿÏ?ý&üP4ºÈqPÉéžÙžöø‡‘sýçPPV€âêb ÿF÷è G1jî(LúFò÷º½ŸïEgOò-WŠ›IþÝÐ¥“o,ãOþç\ùóiý*‡«îÞ:ŒhÚåÉâœwçX¿Z¡ë¯_ºŽ‹Ç.âúåëÖ€‹¶O§?š¾Û„þÕýVÈÚc¢?œ®²X 5¥CÑP6𕉓Ð6²Ê6KàþÅˬñÐ×ñŸÀýö®%ÖòMeex|ò-ÖòÑ¿^HÞ '7áwgNãܧrœ®xRu¸¨ë¡r· ¼<ùEHîM&m_SSƒ¡C‡â–[âç«ÊáÚ»÷i´´¬±\)Óמ={pûí·ãßÿýßqõjn8\3gδÜ2ÚìpÙCݺL],Ýú¨³EË—•ççþ@ÛKïOtýO~òÜ~ûíøÎw¾#mŸª|ºLÛÿð㣣«V­²þMÇá¢íÿä“OÐÜÜlû@-þ ö·n}™z|d®”ÉäºÃÅî–÷ð,…!¤tl)üõÿzÞ&—./ý‘N‡kܰaÈCþïÂyÏ۰ÜÃÅîV¸a‡‹û#ì°ÃÅÇÃÉõ°ÃB¿Ñ¨5ØrÛáRöGš®µÍÓµ[;\A:\ìnq8‡ÃÉöÏJü„Ëï‚.ãg%;\Ùua‡‹ã5ìpq8©‡],';׬Sˆ³åcî”$nWñâp…—˜Âü|ôÝy7˜0Ñõuû/ÀW‡Ë—Ã¥<¾ —+S³L±ÃeO® 6-ÿº‘­—Ÿúü8N*wKæN™¬°;ZNn˜©þÒu¸ÂH6:\¦Îv¸Ì¾ÿæü€‹.{œœ-1¢K•HXWâæpÑô,èBëë1¥¼Üñ5[ç °Ãe.~.UT.`ÖÉE‡«¯¯Ïúƒiv¸Ü®•+O ²²ÅDùu¸ÍÐäùöùšîúTî–Êò[u´œ+Óý•K.V:ã÷|d‡‹.­;\öÈœ-1Ô¥Âu¸¢'‡‹¦,æ¹ó±ñèG(–L£úèä¦A:°Ãe>©:\ª¨\.ÓH®9\.\@kk«5%0;\î×úõU8}zÕ~.Á–‰ó'ìó5êss·¼¸S~ê“9ZÔ±2Ý_¹äb¥;¦ÏGv¸8®.Y¢ìpƒ-Ûl‰K¶;ű§këŒ,*¶ì,1«&¡¿+þíßôÊ‘Øáʶ¸¹\A8 ¹äp j±Ã;\¹SŸ›»åÅò[ßàA½Ý±2Ý_¹äbeâû‹É°Ãű ¸Øá²Gæl‰Îu©€p®¨ÄÉá¢yþð!Ì«®ÅÚiÓ­®[^Ý€i›^üöô©ø.ãIÕáREår™v@rÍázòÉ'ñì³ÏZ®;\êTV¶XníTÊ?tè-ZÊùöùš õ¹¹[2wÊd}ÔÑ’9V¦û+—\¬t'èóŸ.N"Ý|«ëú{{»S*÷Ú@xÇ+“žn@ˆ»Ž®®.¾é˜ ŸæL™òˆ§×ÕÖÎ÷UßíUýaª|B:’ÍOcÖ­[—qõñÓ-GcÀÅ×àˆ?µ¬YZc['.‡åp‰îWçöNÔ­”O›N±/Ægójþi³cûTר¹£ÐþV»´=à 0çÝ9æ\2׊qÉ¿k¯º»ïZ‚¿w˜–|Daöt-Áƒ7Ç‚ìplAßá¢SÎvuuáСCÖ›·Ì±I¸[*wÇoØá²'Š×Î;–¯s<²Áá’M-:<âõ,s°èön޽¾îNõËÖ«Ü(·û-oøðáÖýH¶ì¥|úü:\²û¥›#楾lr¸èþ³Ã¥>?İÃåsÀÅ×àˆÎÖä5“mO›èr"A:\b{ÎöEOGj–ÕH·¥ŽØ’!(®.¶f\tjŸSFß9gÞ9ƒÞÏ÷JÛSTU„mmÛýmœŸþps¸žiiµ™W;OÄ­ÿõ îabzv¡eÓ+Kfkc‡Ëàõ¢ápQ·fÅŠغu+&Nœh½yË›„»¥rwü&®… ·`ùòøÏ0Ùárw¸0sæLk€ø³Ÿý —.]Â#<â©|êpÉŽGçOÐç+½~»ÃC¯gê`ɶw ½¾e÷·úéz¿÷'Z^uu5FmMÇM—UåëÖ—HªíO¯ŽX®¸_tÿÙárïv¸|¸Øá²‡:[¾u—O^v\‚u¸h{1§ 5¨#víâ54|½×D^~ž´}niüf#JÇ•ZOh{Š«‹Ñ±½7?~³Ñþpr¸žÜÓ‡—.&Ï¿Ï:Ÿ: xÎ\¾Œ¢ü!8u9ù´•.óñêpQ·æ?ø&Nœˆßÿþ÷Ö¿QÇFt·wwÇorÍáZ±âClÞ<¿úUüø°Ãåîpåååa×®]Ö‡–;î¸ÅÅŨ¬¬ôT>u¸èñúü ú|£×/uxèõL,™[åÙõ-ÞTõë:Aªû-oìØ±8räÖ®]+]V•¯[àÏá¢ýéÅË%÷‹î?;\êëM ;\>\²DÙá’9[ªépÉÚÓ¾µ}_êsÜFtÄ®]º†žýWþ|…# ¥ísK^~Î8Ãß?,mÏé§Ñ3»ÇF„í’í\´KþûM麎76aTq1ÚF&oDìpeÐM(?{÷îÅ·¿ýmáC±Ý±Ý­ø‡XgwÇDrÉá*((µŸ¯ìpÐw¸¶lÙ‚ªª*v¸H¨ÃC¯g½¾Åûƒª~¿Nª¼7ß|cÆŒ±žàÑeÓõþ.Õý’ÞsÍý¢ûÏ—÷óƒ.Ÿ.v¸ì¡ÎVAYŠ«‹1tBü]º ëpÑö4}· ý«ûmõ‹NuÄ®_ºŽ‹Ç.âúåëÖ€‹¶Ï-ÇÖCE[¾Ö mOݽuÑ:µËkö‡“ÃU‹¡¦t(ʆ¾ßÚ†ûz»­eÀîpÕ†Õ Øuꤵž.óñêpQ·æ'?ù n¿ýv|ç;ß wlDspwwü&×®½{ŸFKËË•b‡K™3gZn,_¾›7oƉ'R*_<AŸ?AŸ¯ôú¥½ž©ƒE·W…^ßôþ ª_× RÝŸhy?ü0:::°jÕ*´¬*_·>ÀŸÃEûÓ‹#–KîÝv¸Üû`‡ËTØá !ìpé÷;\ŠIr¸ØÝ 7ìN‘/œŽ³>Pp‚ ;\|ü8œ\O BØáÒìv¸²*A;\ìnq8‡ÃáWÔTìp™ïv¸\%‡‹Ý­p×=NO·Øá2v¸¼‡.'Ë\ìp%+¡³·cïÿF?aLÍywbå1ÄÊc˜ý›Ù˜ðØá9\Ní“Et³ü:\Nõ%~Šj¼?ײ±ãÐßõwX9>^_a~>úî¼L˜(}=;\¶ v¸Ä)f©ãA]­DîÝž¾ÞÉåI5ìpÙ×ÿòsÍá’})’p£d•¸^v½»9Nôú¦ËNî•Û²ŽÃåÅýóâh%B·§N]Oë÷ëpÉÚ+öO*õe“ÃEãäJy ;\òëã0àb‡ËžÙ[f£§½%cJâÈgt£{F7® àʹ+h{¥ ;îØ1è T—[ûh¨›å×á’Õ':\Aô‡›Ãµáȇ˜¶ée<Ô8г  ­¯oÄ”rùŒ’ìp7‡‹:/Ôñ ®V" w‹nO_ï䯤v¸Øáb‡Ë{¨E*ºÞézw ½¾é²Ì½¢.‡Kåþyq´ÄÐí©SF×;õWª.–ÊQ3]_¦GæJé„.v¸´\ìpÙóéÙO‘_˜OO'‚ÒúRì¾wüž'ö¡ùÇÍÞ”œ/H‡ËKûÄP7˯ÃEë£WPýáäpÀ¾/,Å¿½ŸVº,æ¹ó±ñèG(–L£ÊW8qr¸¨óBÀîjvwKæÄÐ×S7ÆOØáb‡‹.ï¡nu¨dν~U¡×·¸Lë£._‡‹¶WåXÉöW Ýž:e2‰ö—K娙®/Ó#{?òv¸8®.Y¢ìp½½àmŽ,Dykò‰ÉÔïMÅ…÷/Xƒ‰½íÅ…ƒÉ©ÃÃt§dí³}` n–_‡‹ÖG®tôÇÔ×^BuIÒêÚº#‹Š-;K ;\™êxÄ?”Ú]-ênÑÐ×S7ÆoØáb‡‹†.‡Ä¢•Ì٣ׯ*ôú—i}Ô2á鸲ý¥·—9e´|Z¿IKÖ?AÖ— ïG&ÃÇ6àb‡Ëž’ºÔ?Ps»ÏYÿ»!–øæU×bí´éÖkØá ?Nu^¨ãØ]­Ä·rNÛÓ×ËÜ?a‡‹.v¸¼‡ºQÔ¡¢ëe×»[èõM—i}ÔòëpÑöª+ÙþŠ¡ÛS§Læ Ñþòãb©5ÓõezdïG&Ã'v¸B;\úýÁ—âCR;\ìn¥7ìpÙÃWða‡‹‡“ëáiáC;\šýÁWVÅ´ÃÅî‡Ãáp8pqìv¸Ì÷;\®Ée‡‹Ý­ô†.{Øá >ìpy;\N–¸¢ìpQG*§ŸZ¦Ûယ¥5Žë¨æ×á¢õÑòó óÑÑݺ{ëÌô‡Âᢡ. uºØá2<Ø‚ÚáJ%*WÇÉé2?ååºÃUQQ'NX¿×ÏE‡kÁ‚ÍFËÏe‡KåFÉ®_êTyqœÛËÜ=LUÝZu³üºD²þ¢n¡XŸ_‡‹îŸÌ÷'×.ÙñrsÓtŽ;\å€+ê—Ì‘)/¯Âs¸&¯™ìúô‹ºa~.Z-ÿ¶Í·aûœí(k,3Ön u¹hœœ.v¸ÌÅÍáJ%^'§Ë÷`Ögy¹îpíÚµ UUUŽ3Re»Ãµrå TV¶Xƒ(v¸Üãů_•S¥ºP‡K×ÓÝZu³üºD´¿èý‡Ö—Hª.Ý?ºìäRåŠÃE÷/•ó‘?v¸Øáò<àŠºÃE)êL©^„ëpøÖ\>yÙuŸD7̯Ã%«O,¿`Xfüç ý¸Åíp :&‚ËE#sºØá2'‡K7^•Óå'~ËËu‡+ñ è°aäíÉv‡kýú*œ>½ÇêGv¸Ü£r£èõ«rªT÷Àîp¥â€éîXu³L¸DbÑû­ðçbÑý£Ë2—*—.ººç‡*ìpq\\²DÉᢎu¦T¯Âu¸<í“à†ùu¸TåÀ»_|…•…Ö€<ìþ . uºØáÊÜxqtTNWº“Ë×Ñ£G1vìXüüç?'õ°Ã•)çOØõ¹¹QôúõâT¹Ýâƒæ¤Ã•Ц»?b}ÔÍ2á¹¹d2§Ë¯‹E÷O\–¹T¹äpÑýKåüÐ ;\Û€+êu¤¨3Ø«t;\e(®.ÆÐ C­ÛØÝ0¿—¬>±ü£/Ũ¹£0铌ö‡“ÃEC].ÀîpÉœ.v¸ÌÇÉáÒGGåtù‰ßòrÝázî¹çÐÚÚjý-®ÊÊ«¿v¸Ü¢r£èõ«rªT÷êp¥â€éì­ºY&\"±¿èý‡Öøs±èþÑe™K•KÝ?ÝóC7ìpqa‡+„°Ã¥ßìp)>$å°Ã¥ ;]Á†.{Øá >ìpññãpr=<-|a‡K³?Øáʪ˜v¸Ta§‹Ãáp8¸¢6 b‡Ë|°Ãåš\v¸Ta§+ذÃe;\Á‡.ïa‡‹ÃÉòW”.§$~jY1«Û;Q·29m¸èR…ípÉÚCÛmÚáûƒº[Æ]2׊qÉ¿S9\# ‹°§k ¼9>d‡Ëð` î—Êéqr=Üœ-ÑMqrRMÐŽ–ßíÓípŽÀ²e0þ¯?lçžÃµsçN£åç²Ã¥r¯dåÓëÙÍq¢–Ì*'GHlŸÉúT÷'Ýû!­ŸöŸ_‡KÖâ2m_®9\ôxù}ÿ`‡K~>q\Qw¸d®³}gÑÓуšeñA–“ƒ–ÃEÛCcÚá¢ýAÝ­ \27‡ë™–V›y¥r¸zv¡eÓ+;t¨ýMž.s׋‹Ã¥rzœÜ'g‹º)2÷ÇO‚v´ünŸn‡kÁ‚ÍØ°a2¶lY$m_¶;\˜9s¦5@d‡Ë=*÷Š–¯ëÜQ‹ÞO¨S%s„tœ ÝúT÷'Ýû!­ßéøøq±ÜœC'‡)W.z¼ü¾°ÃÅ—Ö€+ê u¸‰Ä2—*L‡‹¶G“íênå’99\OîéÉKö)ÁÝ®3—/£(N]N>me‡Ë|œ.•Ó#s_Üœ-™›"–ç7a;Z~·Ûázë­¥X²¤C¥íÉv‡+//»ví²>´°Ãå•{EËOŹ,z?¡N]ŸŠ¤SŸ—û“ÎýÖ/;>~\,•s(k_.9\²óÏäû;\×—,Qr¸}€–8\í[ÛÑ÷¥>ÇmÂv§Tí1épÉúCt·2Á%ss¸:ÞØ„QÅÅh™¼±ÃnÜœ™ûâælÉÜ7Ç&•¤ÛÑÊd‡ë¯ý¯¼2 ³f=Gêa‡+Sο0ëóâ^ùÝÑÁ¢÷™S%®OÅ Ò­OuÒ¹Êê§ýçÇÅòâÒöå’Ã%‹é÷1ìpql®¨;\4ÔájúnúW÷[•Ì¥ Óá¢í‚u¸hPw+(—ÌÉá*‹ÅPS: eñ'j*‡«~è0¬nhÄ®S'­õìp™“Ã¥rzdî‹›³%sSÄòü&hGËïöév¸¦O••ÓP^?çsÑáš9s&.\h-³Ãå•{EË×uEï'Ô©¢ëu Ýú¼ÜŸt~Ùññãb©œCYûrÉá’&ß?hØáâ$ÂWa‡K¿?ØáR|HÊa‡‹­ô†.{Øá >ìpññãpr=<-|a‡K³?Øáʪ˜v¸ØÙâp8‡Ã.Ž}‘á—ª};\bØáJá\5¸ëìl¥7ìpÙÃWða‡Ë{Øáâp²|ÀÅ—=¢³¸;%‰›ÃE-ñßeë½´Oåp¹õ­? ‡K–ý‹—Iÿ½0?}wÞ&ħée‡Ëð` î—*ÔA‘¹>€ÝåJl8» ©†.{¢èp-X°Ùhù¹ìpÑëOåìQg Ðs±€ÁìÅÍr«O扮–l½l m¯.‘n™v¸Tû›k—ìýÂÍMÓ9~ìpq”.v¸ì¡ÎVî›ÃE-ÀîdÉÖ{i_ªýAë7Ñn—,[ç9àïYÐ…Ö×7b ùÃXv¸ÌÅÍáR…:(ÔõI$árv÷ÃÉñJ5ìpEÛáZ¹ò*+[¬A;\î¡×ŸÊ٣Δ*ôõÔQ¢Ë*7Kº=uµèz™+¦ã¥Ú_¦.Õþš¨/“BûWå¦y9~ìp±ÃåyÀÅ—=Ô٠˲.…ÃØ-êdÑõ^Úç§?då 6 IDATõépÑ<:¹Éu†²X ›æÎÇÆ£¡ø³iVÙá2'‡ËKD…º>€Ýå¢î‡Ìñòv¸¢íp­__…Ó§÷XýÈ—{dןÊÙ)/_O%º¬r³T¡ÛSW‹®§õ§âéö—I‡Kµ¿~ëË´ÐþU¹iºa‡‹ã:à’%Ê—,çN ΖÌÉ×{iŸŸþÕf¬n˜„þ®ø·mÓ+GJ_Óµu F[¶;\™ÑA¡®`w¹¨û!s¼ü†.v¸hØá’Gvý©œ=êL©¢ûz7Kµ½ÌÕrsŠRq‰tûˤÃåesÉá¢ýëÅMóv¸8¶;\ä q¶Âr§Q9\€ÝÙ¢N]ï¥}~úCVÍ-¯nÀ´M/~{ú»ÃõüáC˜W]‹µÓ¦[Û°Ãe>N——ˆ u}ßÒ%BÝ™ãå'ìp±ÃUYÙbõÀ—[dן›³G)Uèë©£D—Un–*t{êjÑõ´þT\"Ýþ2ép©ö×o}™Ú¿*7ÍoØáâ$ÂWa‡K¿?ØáR|HÊa‡‹†]®p×=ìpv¸øøq8¹ž>„°Ã¥ÙìpeUL;\4ìrq8‡ÃÉöÏJü„Ëïâ©F\{Ðx;k–ÖØ¦ëÒY™ËìéÞÓÍ·â{w/÷žq7á?>üß(.æ íé'»3eÊ#xï½ç”¯«­?Þ’r=~·OwùŽ,ëÖ­Ãc=ÆÁádYØá’uŠƒ3•Hõâjtöv¢vEüXÃv¸‚ˆÊá 5šu¶h–‡þ®¿ÃÊñq7.ã‡Ë—Ã¥<¾N“ËT}™²=;\|{v¸Â­ÏãD*êZƒ¥ ë3ÝŸ´è½úGô´÷`܃ãlÿ–Ã…è8\NÎV"Ž|ˆi›^ÆC“íoìp‹‡K''ÈÉå ª¾LÙ>‡«¯¯Ïúƒiv¸ØáÊ¥ú¨SE]+¿Î’n}¦÷Ï©¼\q±Ò¿Ç‹.v¸´\ìpÙC)Y>·ós8ò‹#ÖrØWâÕá’9[4û¾°ÿö~ògŸìp™‡Ë-2'ÈÍå ¢¾LÞ^åp]¸p­­­Ö”Àìp±Ã•kõQ§Jt­L;KªúL¼\r±ÒÓÇ‹.Žë€K–¨;\¢3%˶¶m(¤†ípqì¡ÎÖ ›àk/¡º$é±Ã•]¡N›ËD}Ù¶½˜¡Cí#v¸âa‡+wê£N•èZá,¹ÕÄþÑòrÉÅÊÄ÷“a‡‹cp±Ãeu¦€ø«Ä¯BêWÕcDëT/NÎ"¶Ã…xu¸dΖèp}eâ$´¬²Í"È—ùøq¸Ü"s‚Ü\® êˤíu®'Ÿ|Ï>û,.\€./a‡+{ê“9U¢keÚYRÕgzÿdåå’‹•î}þ³ÃÅI„g) !ìpé‡.Å›D„.v¹‚ ;\ä‹v¸;\|ü8œ\;\!„.ý¯ØáʪèÃEÃ.‡Ãáp8pEm@õT£ëúþÕý)•kj–BUû}ºå¥>õÎw¼žn¾Õuý½½Ý)•{m ¼ŸÏfÒÓ-q×ÑÕÕÅ7ôÓ­)SñôºÚÚù¾êñ»}"NO·L•ÏAèOG²ùi̺uë2®>~ºÅáh ¸¢ìpQW+VCgo'ÆÞ?Vúú‚a˜óî$~жÃU1«Û;Q·29ù¨¹£ÐþV{ü GÌKûD‡‹öGb_ç¼;±òØ öÐþòÝš¬w“ãºý‹—Yÿ(,b‡Ëô` þ.q Z'çCt·¼¼>Õ°Ãe;\þËÏ5‡K¼þ¨KUQQƒbÍš5â³À%œ"@îd¹9NÔ¢åËêï2WHåFÑ)±©ã%.Óý¡û«ŠlÿÄöÓòý:\´>Uý^êËd‡‹îŸÓùžª#Å—¿þ‹Ü€+êuµfo™žö”Œ)‘©*¶¶mƒþ,,‡ëlßYôtô fY `ô£qæ3èý|ü1Uûœú£{F7ºgtcàÚ®œ<чSùé‡ë™–VW«éÕ hzu® à¬0ñ;\æâÇáúÑ~dME È ény}}ªÉE‡káÂ-X¾<þ3Lv¸ØáòS½þ¨Kµ{÷n466Z³£UWWcôèÑÖtÕÔ­R…º@´|Z?½¨\!ÕþQÇ‹.Óý¡û«»´ýNý•ªÃEëSÕï·¾t‡îŸì|÷ãH±ÃÅ—Ö€‹.»«õéÙO‘_˜OOË‚âêbtlïÀÍ'Ÿˆ„ép%b‰ 5¿ÙˆÒq¥ÖS!™#¦jŸ[@i})vß¿[úZY™è¯ד{úpâÒE×׌V†/n{+ù¦Ê—ñ¤êp=üðÃ8~ü¸µLÀînyy½ŸäšÃµbŇؼy>~õ«øña‡‹.?õÑë°»T÷Ýw^zé%´´´ÆŽ‹#GŽ`íÚµÖëE·JêÑòiýô~ r…TûG/™ë%îluöOv?£ýåÇá¢õy©?›Ý/ºô|7íH±ÃÅqpÉ5‡KtµÞ^ð6 G¢¼µ\úÚÓ;N£gvmÊû°®ö­íèûR_üÛãü<œ?p‡¿ØZO1UûÜúˆÿäðÂû¤¯•õW¦¹d?ž9?IÖÏWæ†:€ÝÝòòz¿É%‡«  Ô~¾²Ã€.“õ‰.Õ /¼€¥K—bß¾øß¿ùæ›3fŒõD*>]ïèÉ"º@´|Z¿ì~àæ )?$ÇKæz‰û#Û_ý“µŸö—_‡‹ö‡ªþlw¿èþŠç{ÐŽ;\Û€+êuµJêJPÿ@=Îí>g½Ft¸êî­ÃˆÖ¨]ž„Ãt¸š¾Û„þÕý:!þ ó±õÇPÑV†¯Å¿Á–9bªö¹õÄn°ÿí–Ø²þ2Ñ^®²X 5¥CÑP6Üú7Ñဠííg‡Ë|Ru¸n¸áÔÕÕY¿§ÎGâ[:×ûI®9\{÷>––5–+Å—:ìpy¿^©KõÉ'Ÿ ¹¹Ùú@öð㣣«V­²ÊÝ*U¨ D˧õÓûÌÒÙ?êxÉ\/qdû«³²ûí/?­ÏKýÙì~Ñý£ç{ÐŽ;\œDØá !ìpé÷;\ŠIr¸ØÝ 7ìpÙÃWða‡‹‡“ëáiáC;\šýÁWV%h‡‹Ý-‡Ãáp8<àŠú€Š.óýÁ—k¢äp±»nØá²‡®à×÷„ípåzr8¡¸¢ìpÉR³´Æq]:.ÚÑÝRµ_×áÒíDŒõ‡¦ÃU˜Ÿ¾;ïÆ&J×—Åb–À.Óƒ-øw¸¼„ÎB˜p¹TnˆnØá²'Š×Î;–]ƒŒÈ6‡+ñ¥ˆèTɦ”N\¿A¸Xbùt¨Ûå·>•ûE×û½ß¥âb…Lv¸‚¾ÞØá’¿?s\Qw¸h&¯™ìút)l‡‹¶‡º[^ÛïÕáÒí þ7Wºõ™r¸zt¡õõ˜âð‡Ø7—`êk/¡éÕ ö7 v¸ŒÅÃå%2ç#áré:;ª°Ãm‡k``3gδˆ~®A34yþ}¾ªœ*ºž^¿¦],Z>Ýêvù­Oå~Ñõ~ïw¹æbeZü^oìp±Ã¥5àb‡Ëžß:€Ë'/;®Ûá¢í¡î–—öë:\:ý1þ¡ñƒ&¸Óá*‹Å°iî|l<úŠ%Ó¨Ö––bÏ]Kðä-ÉŸJ±Ãe>©:\ªÈœÑåÒuvTa‡+ÚW^^víÚe}hñëpé ¶Lœ?AŸo*§Š®§×¯i‹–O÷Gævù©pw¿èz¿÷»\s±2-¦¯7v¸8®.Y¢æpé$Ý—ÌÝRE×áÒIý?Ô£³7>Eoù´òÐûº¶nÁÈ¢bËγíOÇѼéeÛßX±Ã•=‘9ÔåòãìÈÂ;\4ìp9|ˆ¸Tªëפ‹%+_Ü™ÛåwÿTî—¸Þïý.]¬LK×;\Û€+ê× (e(®.¶œ+ ½mu·hûdí×q¸tû£{f7zÚãÞÎõŸ3Ö^®ç¼êZ¬6Ýú7Ñáz`ÂD´¬Âÿ—¬Ÿ.óIÕáREæ|ˆ&Œ®³£ ;\ìpÍœ9 .´–ý:\‡¢E‹B9‚>_UN]O¯_Ó.-Ÿîu»üÖ§r¿èz¿÷»\s±2-A_oìpqa‡+„°Ã¥ßìp)Þ$"äpѰËlØá²‡®àÃ?'×ÃÓ‡v¸4ûƒ®¬JÐ »\‡ÃápxÀµU†;\^ÂW2ìp¥p®†øËav¹‚ ;\ö°Ã|Øáòž°./õñÓ-GcÀÅW2ÔÙJüÿœwç VC¬<†Ù¿™ M¾ÃEÛCCÛ7ãÅøl^Í?mvlŸ›ÃEû°;`ù…ùèèî@ݽufúÃõBø{¬…Ex{áðõ&÷i]Ùá h°µÃ%N1+sqd®NÂÙ¢ÛS7….v¸LooÚáÒ9Ùèp‰Ë2‡ÊíúÜ'z}ÓåáÇ[’ì~bÚá’•ØÝ,Ùz¯åÓýñëpÑíUí£ÇÏK}Ùäpy9t—ýüç(\ìp‘ÄÙêžÑîݸ6€+ç® í•6ì¸cÇ 'Pa9\´=4´}CJ† ¸ºØšÒ_×á¢ýA°Û6߆ís¶£¬±ÌX¸9\Ï´´ÚÌ«-w,Äm›_ÃÕç¿wÛ:oð€€.sqs¸¨kC]™«$-º=uSØáb‡Kgû°.Ùñòü ú|¥×#]¦•êúU…^ßt¹ºº£G¶¦Ã¦÷Ó—¬<Ñ!RÕ§*Ÿî_‡‹n¯jŸ“#–+î—êüÑ ;\ìpi ¸Øá²Gæl•Ö—b÷ý»ãßð<±Í?nÆð¦áÖú0.ÚÚ¾k¯¡áë 8¸ö òòó¤íÓéê€ +ÀŒÿœã¯·Ø€ ®'÷ôáÄ¥ä”àÿøîÛxþ¶NüMy…ôõNn4¡;\æãäpQ׆º82çFt¶èöÔMa‡‹.íÃv¸èñúü ú|£×#]ì•êúU…^ßtyìØ±8räÖ®]+½Ÿ˜v¸hyÔ!RÕ§*Ÿî_‡‹nï¥?¨#–Kî—êüñv¸8®.Y¢ìpÉœ­©ß›Š ï_°{Ú‹ “S‡‡íN‰í´Ž´ïÚ¥køàÙpåÏWP8²PÚ>þ9`ï~ñ]VZò0ûãG3oÃo÷àÀŸÏIׯn˜„þ®ø·qÓ+G`‡+¡.ŽÌ¹¡Î uSØár;\ò°Ã\}*‡J·>z}‹Ëo¾ù&ÆŒc=±¡÷Ó-:DºõÑòéþøu¸èö^ÚG_®¹_nçé°Ãű ¸Øá²GælÅnHþ­ÔÕ WQ6¹ å3Ê­ Óá¢íì.mßõK×qñØE\¿|Ýpé8\´?¨vô…£5w&}c’Ñþpr¸Êb1Ô”ECYü Þù+WÑT>m£’ßìˆ×-¯nÀ´M/~{úTüÆÀ—ñ89\Ôµ¡.unßÊ9mOÝv¸Øá2¹=`ÞáGÐçOÐç+½é2u¨Tׯ*ôú¦Ë?ü0:::°jÕ*éýÄ´ÃEË£‘ª>Uùtü:\t{YûÄŸ¡É±\r¿Tçé°ÃÅI„®Â—~°Ã¥ø”Ã;[é ;\ö°Ã|ØáâãÇáäzxZøÂ—f°Ã•U1íp±³Åáp8'×>+ñ.¿ˆ§qpíAãí¬YZc›®?Jge~,?°§{O7ߊoìÝm¼Ü{ÆÝ„ÿøð£x¸P˜?$´§{œìΔ)à½÷žS¾®¶v>>þxKÊõøÝ>Ýås8²¬[·=öw‡“ea‡KÖ)Ä•rJb †ÃtÜ®ÐãÁáS˜Ÿ¾;ïÆ&º¾Ž®À—Òá2ê|ˆN—l}ªa‡Ëž(:\ l6Zþu 2".Óõ™pœ׿Êåò[ŸÊq2ẹ\ºWÉ&‡ËôùÏ—Ù÷ßœp±Ãe“+%fÖ¦Á³±åpE1nMÏ‚.´¾¾SÊË_ÃW°qs¸LDæ|$œ.§õ©†®h;\+Wž@ee‹5ˆòëp š¡1Èó'ìó5ꯕËå7*Çɯ ¨r¹É+Ýñ{>²ÃÅ—Ö€‹.{d®”˜ñ4¡CWTãäpÑ”ÅbØ4w>6ýÅ’iTÙá 'N—ßÈœÑé2퀰Ãm‡kýú*œ>½ÇêG¿—Î`ËÄùöùšîúèõ¯r¹üFå8ùuU.[.Vºcú|d‡‹ã:à’%Ê0Ø•²}Àþ‡ztöƧT-Ÿª¶Ãű§këŒ,*¶ì,1ìpewd·ètူÃÅ ;\™Y½þU.—‰¨'?. ÊårÏÅJw‚<ÿÙáâØ\ìpÙ#s¥Dçª{f7zÚãVÎõÇ±Ý ®¨ÆÉá¢yþð!Ì«®ÅÚiÓ­c‡+ü89\~#s>DÆ´Â;\••-Vþ®C‡aÑ¢E¡œ?aŸ¯é®^ÿ*—ËoTŽ“_Pår¹åb¥;AŸÿìpqáY C;\úa‡Kñ&‘×*ìtv¸È?ìpv¸øøq8¹v¸B;\ú_°Ã•U‡Ë¨Ã¥ ;]‡ÃápxÀµÕS®ëûW÷§T®©Y Uí`ôé–—úÔ;ÜñzºùV×õ÷öv§Tîµð~>›IO· Ä]GWWßtLÐO·¦LyÄÓëjkçûªÇïö‰8=Ý2U>¡?Éæ§1ë֭˸úøé‡£1àŠ²ÃU1«Û;Q·2>«L68\5Kk¬ÿ¯^\ÎÞNÔ®¨•®÷Ò>êp‰ÛÇÊcèìíÄØûdžÓš¬w“çõìplÁ¿Ã%NAë䀈קv¸ìa‡ËùQs¸è”ÒⲮåë^™p¸ÄöŠÎREEÅ öWTTààÁƒX³fôõºý%sŽÄöë:\_þò—qìØ1<øàƒžî—t¼Ô—É=èñIåx‰a‡+Ù®¨;\gû΢§£5Ë⃌Lw¸&¯™l[÷ÇWÿˆžöŒ{pœt½×ö9•?{Ëlô´÷ dLIhý¡ãp=ÓÒêj`9­g‡Ë\ü8\?úѬ©hg$ány}}ªa‡‹.v¸||D®Oº¬[Ÿ®{å×á¢í­ªªBUU®^½Š3gÎ jÿîÝ»ÑØØhÍG_¯[uŽœÚïÕáúå/‰1cÆà«_ýª§û%ÝÝú2-ô| ÇG÷xѰÃÅ—Ö€+êWbp‘˜ "Ó®ß:€Ë'í3æ}nççpäG׫ÚçVþ§g?E~a>>=-w‚ê¯ד{úpâÒE­õìp™Oª×Ã?ŒãÇ[Ë2Dt·¼¼Þï7¢ìp±ÃÅŒ\ÏtY·>]÷ʯÃEÛ 7ß|3æÍ›'mÿ}÷݇—^z ---Ò×ëÖG#Yûu®ãÇã‡?ü¡§û¥l²Ùý’9fôøè/UØá⸸d‰šÃÕ¾µ}_ê³–³ÍáÚÖ¶ E£‹׫Úç–·¼Â‘…(o-—8²Ð%c‡+³CÑÝòòz¿a‡‹.v¸ÒWŸŽ{„õ~ýz›s$¶ÿ…^ÀÒ¥K±oß>Ç×ë„:G²öë:\£GFmm­§û¥l²Ùý’/ôøø9^ª°Ãű ¸¢îp5}· ý«û1tBüÛLw¸ Ê P\]lµ·~U=F´Ž@õâjéz/ís+¿¤®õÔãÜîs¡ö‡W‡«,CMéP4” ·þMt¸dëÙá2ŸT®n¸uuuÖïßeˆhÎxy½Ÿ°ÃÅ;\©‡^ŸtY·>]÷ʯÃEÛ åååŽýõÉ'Ÿ ¹¹ÙöU|½n}Ô9’µ_ÇázüñÇÑÑÑaMl¡r–dû“Íî—Ì1£ÇGçxé†.N"ìp…v¸ôûƒ.Ҥ9\ìn…v¸ìa‡+ø°ÃÅÇÃÉõð´ð!„.Íþ`‡+«´ÃÅî‡Ãáp8œlÿ¬ÄO¸ü žjÄÁµ·³fimºþ(•ù±üÀžî=Ý|+¾±w·ñrïwþãÃÿâáBaþОîq²;S¦<‚÷Þ{NùºÚÚùøøã-)×ãwût—ÏáȲnÝ:<öØcÜN–….Y§dÃe:ÔáJk4®Âü|ôÝy7˜à>íïþÅ˰ÃÀáòíp¹_'Ht¹s;\öøu¸¦O+Wž°¦YχkçÎFË×9¹àpéÖç×q§°V9]¦ë£å;9E¦úK×á #™ìp}þ³Ãeöý7ç\Qw¸h2ÝáŠBt®ž]h}}#¦¸üáëÖyƒìp™‹‡K'·'árf\t¸úúú¬?˜¦Wii)Ο?'žˆ»XA8\ë×WÙ¦«Ïd‡k``3gδ’~.Ùñòü û|Mw}Ô±R9]¦ë£åËœ¢ ú+[]¬L‹ßó‘.v¸´\Qw¸h2ÝáŠJ¼:\e±6ÍG?B±dÕG'7 šÐ.óIÕáREæöˆ.—i$×® . µµÕš˜:\ùË_PVV†X, ‡K|Âd¶Ã•——‡]»vYZü:\ôx}þ„}¾¦»>êX©œ.ÓõÑò©SDe³‹•i1}>²ÃÅqpÉ5‡‹&Û®¨§këŒ,*¶ì,1«&¡¿+þíßôÊ‘ØáʶP·Gt¹‚p@rÉá:Ô>0¢WÂiÙ¾}»5¨Ì:\ô ÀWXÇ?jõ©œ® "–O¢ ú+›]¬lx1v¸8¶WÔ.šLw¸¢¯×ó‡a^u-ÖN›ný›èpÝòêLÛô2à·§OÅo ìpOª—*2·G4aL; ¹æp=ùä“xöÙg±páBƒ®7âž{îÁo¼Ó§ã_:˜v¸ÊË'¡¼|òó³Ãáš9s¦Õ_€‡K<AŸ?aŸ¯é®:V*§Ët}´|êÑ_ÙìbeZ‚>ÿÙáâ$³†v¸ô×âM"B »\Á†.òÅ;\‡.>~N®‡®Â—þ×ìpeÕá Ôá¢a—‹Ãáp8¸¢6 zªÑu}ÿêþ”Ê s–B“O·TýámçƒÛ×§›ou]oowJå^ïxeÒÓ-q×ÑÕÕÅ7ôÓ­)SñôºÚÚù¾êñ»}"NO·L•ÏAèOG²ùi̺uë2®>~ºÅáh ¸ØáJºZ±ò:{;1öþ±Ž¯­YZcý:.±~Õú/Ægójþi³cûD‡kλs¬ÿbå1e}Ô-óÝšW{ÕØ}×ü½Ã´äÔéb‡Ëð` Á8\‰Y¨«“HÂ᪨¨ÀÁƒ±fÍ#õ²Ãe_‡ë¹çž³µ—®`ÏŸ°ÏWÙõI§”¦Ë]]]8tèµìæ8QHt***<»@â²Êrk/­ÿË_þ2Ž;†|е~¯õÑý¥ýkÂáR±ý^êËd‡‹ÚŸNÇOç}Š.v¸<¸Øá²»Z³·ÌFO{JÆ”H_;yÍdéÓ§°.§úÖ)‚âêbkÆE§öYÝèžÑk¸r>'·ÌOè8\;OÄ­ÿõ îw“t½“ÓÅ—ÁëǰÃ%ºÔÕI$ápíÞ½¶YÉü$®… ·`ùòøÏ0ÓápåååÙlv¸‚;Â>_éõI*º¼bÅ lݺ'NôT>uªªªPUU…«W¯âÌ™3ž\ 'HÕ^Zÿ/ùKŒ3_ýêWÔG÷×éþ—ªÃååxÈÚŸ­î=>´?eÇO'ìp±Ã¥5àŠºÃE]­OÏ~ŠüÂ||zZîøÖ\>iŸ±.L‡KV¿Ûúk¯¡áë 8¸ö òòó¤í£)­/Åîûw{ªOæ–™è¯Wb ó©Ã€Gæt±Ãe>¦.êzPW°;\÷Ýw^zé%´´´©?×®+>ÄæÍóñ«_ÅO:.úDŽ®àΟ°ÏWz}R§Š.ÿà?ÀĉñûßÿÞSù2èæ›oƼyó¨] ]'ÈK{Åúàøñãøáh¤>º¿²ûŸ‡Kµ²ög»û%YŠëý†.Žë€K–(9\ÔÕz{ÁÛ(YˆòÖrÏed²ÃuíÒ5|ðì¸òç+(Y(mß ›Æ÷¦âÂû<×Aݲ°ûcç¢ÅXòßo:®§N;\™êzÈ\Ñázá…°téRìÛgîïsÉá*((µŸ¯ip¸è.€®°ŽÐõÉ®O×ùùØ»w/¾ýío{®ƒº@ëׯ·Ü!• ä× ’µW¬?>ˆÚÚZiý©DÜ_Yÿšt¸èþÉÚŸíî—x|dý)®7v¸8¶WÔ.êj•Ô• þzœÛ}Îzèp” ¸ºC'$¿á Óá’Õï־뗮ãⱋ¸~ùº5à¢í£‰Ýó\ŸÌ-3Ñ^®ï·¶á¾Þn4” ·þMt¸dN;\æcÊ᢮uußÚ%òÉ'Ÿ ¹¹Ù4šk×Þ½O£¥e ª«çHÃuË-·à–[nAa!;\AŸ?aŸ¯ôú¤N]þÉO~‚Ûo¿ßùÎw<•/sÊ…Ÿ‡«\ ]'ÈK{ÅúüqtttXGø­é IDATî¯ìþçÇáRퟬýÙì~ÑãCû“®7v¸8‰°ÃBØáÒïv¸’Øáâ©á ;\ö°Ã|ØáâãÇáäzxZøÂ—f°Ã•Ua‡‹Ãáp8‡\Á Øá2ßìp¹†.NPa‡Ëv¸‚;\ÞÇ“å.v¸’)V`9TÀ`—ʸ;% u¸D‹ÖOC1]‡KVÞìßÌÆ„Ç&Øþ=Ñ?³*й½u+Ãs¸VSÀ(,ÂÛ ¿€¯7ɧ5f‡+àÁÔ—›3ãäz$œ-º½Ì ršÂ6•°ÃeO® 6-?—®Ä— NN•ÌõÑq¸dN’[}t½lÿtÜ/YýâýFæºÝhù´}Ô‰¢ûç×á¢û#»‹û“í—ªÿUî”*ìp%ûãaÀÅù€QU„mmÛ¬¿õ¢.UîèpQË©þD¨#¦ëpÑ´½Ò†wì°µAtËÎöEOGj–Õë7‡ë™–V›yµåŽ…¸mók¸: ÿ{7v¸‚›Ã¥rfd®t¶èöÔ ¢ëý&jWAA V¬ø?LžÿÀu‡kåʨ¬l±Qìp¹GåTÑë]×á¢N’ª>º^wÿh{iýô~C@Õýˆ–OÛG(º‰¤êbÑý¡íqr ³ÕáRõ¿ÊR….v¸´\Qw¸hŠ«‹Ñ±½7?ž|â!ºTA¹SÖB.ê`ÉêC±T.Û7ZOìCó›1¼)> uË1q‚ ®'÷ôáÄ¥‹Öò?¾û6ž¿­S^!}=;\áÄÉáR93ÔõìÎÝžºAt½ßDÍáZ±â#¼øâxäåÅ–¨;\ë×Wáôé=V?²Ãå•SE¯w]‡ °;IªúèzÝý“9Dbýô~C@Õýˆ–OÛ's¢¨ûå×Å÷‡¶Gæf»ÃåÖÿ*wJ7ìpq\\²DÉá¢9½ã4zf÷ئ´§.UºÝ)Z¿ꈥâpÙn ÿ:{Ú‹ ãûOÝ2hßÚŽ¾/õYÛ„Ù?šyx»þ|Îñ5ìpeVD烺€ÝÙ’%h§(JW•:yr'ŠŠ’N ;\ö°Ãåð!ƒS%^ï©8\¢“¤ªO¶^wÿ¨Cäæ4¥âÒòÅöÉœ(ÚŸ~],º?b{dû“í—ªÿÝÜ)¿a‡‹cpEÝᢩ»·#ZG vyò†$ºTA¹S‰P‡‹:X²úE‹:b©8\¶ öÂU”M.CùŒøàŠºeMßmBÿê~ã.™“ÃU‹¡¦t¨ån¿rMå#Ð6*ùÍ;\áÇÉáR93ÔõH|+ç´=uƒèz¿‰šÃuìØfÔ×/Áí·¿ˆË—ãNKÔ®ÊÊ«¿v¸Ü¢rªèõ®ëpQ'IU]¯»´½´~z¿¡ ê~D˧퓹[åäçð~\,º?´=2×0›.UÿËÜ)“a‡‹“;\!„.ýþ`‡Kñ!)‡.v¶Òv¸ìa‡+ø°ÃÅÇÃÉõð´ð!„.Íþ`‡+«bÚábg‹Ãáp8¸8öD†;\ªöìp‰a‡+…sÕள³•Þ°Ãe;\Á‡.ïa‡‹ÃÉò;\ö¸¹WÔ¥ ÃáC]°êÅÕèìíDíŠZéz/íss¸TýAݲ0.1ËÆŽC×ßaåø Ž¯™W]‹wÅÝv¸ ¶ v¸¼ ²nuhqr¹œ\T×=~®éÓŸÁÊ•'¬iÖu®[n¹Å¶¯^“I×u 2".:e´xýRçIå>jÇÉíþ@—U®TÐõÉÜ.·xu õ±Ã¥•ãH]8? ÃåÚ¼y³çãKãôþêv}s ¸Øá²Gå^É\* 8‡‹†º`|õèiïÁ¸ÇI×{m_ªýAÝ2ýáæpÑl8ò!¦mz5N–®¿»®½'þ„Y¿~Íöïìp™‹›Ã¥ us¨C“ˆ“Ëåäx¥v¸Ì;\ë×WÙ¦G×q¸èôá*GË´ÃEûC×á4CcçOÐç+½þèõK'•ûä÷þ@—½ºRAÕG÷W/.¡Ì9b‡ )¯ô|×uáh~÷»ß€5Í>u¹¨ƒE.º\TT„ßýîwøÞ÷â÷Oêf8q---Ž&ÕùçôþêÔ_Ã.v¸ìQ¹WÔ¥‚u¸d]0 þ´èÈ/Ž8®WµÏOÈܲ .Yö}a)þí}ù4Ók›oÅMeeضà®äM….ãqr¸T¡nŽÌ¡qs¹dŽ—Ÿ°ÃeÞáŸpþ.•£eÚá¢ý¡ëpé ¶Lœ?AŸoôú“¹X¢óD—uÝ#Õý.{q¥‚¬O¶ÿnQ¹„2çˆ.ïQ9Ž©¸p:¡uºèò‘#Gð·û·èîŽß?©›UUU…={ö8˜TçŸìýÕ­¿8†\²DÙá’Et¯¨K„ïpQl[Û6.r\¯jŸŸþ¹e¡÷Çk/¡º¤T~’çåaÿ¹³ø—ýÉ¿Sc‡+ƒnBÄÍ‘94n.—Ìñòv¸Ì:\ô àßárr´‚r¸ýÁ—ûõ¤Ú'7÷ÉïýAv¿P¹RAÖ'Û_UÜ\B™sÄ—¹ó=N'N–ÛëðÞ{ïÙ.77Ku|ÅÈÎ_Nˆ.v¸È…{E]* X‡KÑ«_U­#P½¸ZºÞKûüô‡Ì- Òá¢ùÊÄIhYe›%Pt¸~qø}Ì®ºOMM~KÈ—ù89\ªP7GæÐ¸¹\2ÇËOØá2ïp•—OByù$äç§æp=z‹-òÔA8\b¤Rþ¡C‡<·?Ó.zýÑë—:O*÷Éïý.{q¥‚¬î¯**—Pæ±Ãå=*ÇQ×…“åž{PÑè:X7nļyó0mÚ4ë‰"MKK æÎëéøvGKöþ*®7íZr’a‡+„°Ã¥ßìp)>$å°ÃEÃ.W¸a‡‹û#ì°ÃÅÇ/[ó»ßýû·|à¨ÃÓ‡v¸4ûƒ®¬Ši‡‹†].‡Ãáp8<àŠú€*Ã./a‡+v¸R8WÜuv¹Â ;\Þúƒ.sa‡Ë{ØáʬðÓ-Žö€‹.{DwJænunïDÝÊ:kYLЭß)‰ŸŠÎx1>}qóO›Û§ãpQç FÍ…ö·ÚÍô‡¦ÃØ-šÂü|ôÝy7˜Ÿö•.Ã-øs¸D·¤¢¢ÂÑ¡I8\^\?a‡Ëžt;\©8Z~·g‡Ë=â”î^Ü+Ùð⬢*ÇIÜ^v¿PÕG%údÛÓö‹ëiûT‘¹H´~qÙ´Ãe¢¾Lw¸ÜÞotÝ4ò³Ñáòâtq| ¸Øá²‡ºSÔÝ:Ûw==¨YVcÛ.,‡Ë©~1³6ͲþHÉW[Súûu¸¨ó5úÎÑ8óÎô~¾×Xè8\NÎV"= ºÐúúFL)/·ý;;\æâÇ᪪ªBUU®^½Š3gÎ8ºZ ‡Ë¯ë£ ;\™åpQçêùçŸÇÅ‹ñ­o}+¥íÙáòWuzTŽ“Ìõ‘¹R^ë£÷ U}ºÎ’—íÅöÓõ´}ªP‰Öïä"™r¸‚®/ÓB®›F“k—j=Ç瀋.{¨;EÝ­ÄàCœÐ"L‡KV¿˜ñ·M8qíâ54|½×D^~ž´}:ýدÆo6¢t\©í©T˜—ÌÙS‹aÓÜùØxô#6Í*;\擪ÕxÓ™7o¹«%:\€?×ÇË7Îìpe®Ã5oÞ<”””`ÆŒ)mÏ—¿ú¨Ó£rœèëe®”N}ô~¡ªO×YRmOÛ/+_lŸ*ÔE¢õËöߤÃF}™z|tÜ4Ýd›Ã¥ZÏñ9à’….ØÔÝjßÚŽ¾/õYËa»S´~ÛàêÑÙŸÒµ|Z9®]º†žýWþ|…# ¥íÓîÁùÊËÏÃùçqøû‡ÓÒ2g‹¦këŒ,*¶l-v¸2+ëׯÇþýûãp‰«E.?®—°Ã•ù—ÓD*ìp…_ŸŽ{%s¥üÜ/Tõùu–èö´ý²òÅö©’Š‹dÚá º¾L~¿I¥?t’m;]¸Øá"Pˆ;EÝ­¦ï6¡u¿µ×á’Õ?çÝ9Ö¯ˆºgv£§=þaê\ÿ9\¿t]ÄõË×­—‡ °;_ÇÖCE[¾Ö`´?¼:\2gKt¸ž?|óªk±vÚtk=;\擪ÃåÂÏ=e®–hÀøu}Ta‡+ó.G‹®`ÏWêô¨'úz™+¥S½_¨êÓu–TÛÓöËÊ/'?_w u‘hý²ý7ép]_&F<>ºnš,¹äpÉÖsÌ„®Â—~°Ã¥øÄ' °;ÅývØáâã—­a‡‹ã5<-|a‡K³?Øáʪ°ÃÅáp8‡Ã®`îp©Ú°Ã%†®ÎUv¸r&ìpyë>/Í….ï ÛáÊõþô~ºÅÑp±ÃeèNÑP‡* ‡‹¶Ç­}27LÕ>‡ËD}®ý¡épQgË)û/À—ñÁü9\^C§ÁM¸\ìp±Ãez{/×òåË=—ŸË]¦.-_VŸI‹–/sºüÔG#êúu¨ƒDËóëp‘lr¸‚¾ÞØá⸸Øá²‡ºS4Ô¡J$(‡‹¶GÕ>ê†ym_ªý‘j}¦.'gKÌÖyƒìp™‹‡ËKdnOÂåb‡‹.íý:\•••¸xñ"fÏž--?j]¦.-ßo}*‹–OÛã·>êQ7ЯëD$§òrÅÅJwü^oìpq´\ìpÙ#s§hD‡ Öá¢íQµºa^Úç§?R©Ï¤Ã%s¶Ä<:¹iЄìp™‡Ë-2·Gt¹Øáb‡Kg{¿שS§PRR‚;ä?ëšÃE—©‹EË÷[ŸÊÅ¢åÓöø­°;G27Ðë$shy¹æb¥3A_oìpql.YØárèPá;\®m“¸aªö…]Ÿéþ Î–˜Õ “ÐßÿöozåHìpeSdnu¹Øár;\ò¤êp…áÓd›Ã%FæbÑòýÔ§r±hù*§K·¾ø <éÉÜ@?®“ÌA¢ååš‹•îy½±Ãű ¸Øá"P$î”è\v‡ Öá¢íQµºa^Úç§?R©Ï¤Ã%s¶D‡ë–W7`Ú¦—¿=}*þÆÌ—ñøq¸Ü"s{D†.v¸Ln¸;\/¿ü2V­Z…ñãÇ{.?—.ºL],Z¾ßúT.-Ÿ¶Ço}Ô9¢n _׉:H²òrÍÅJgL\oìpq¼„®Â—~°Ã¥x“ˆÃEÃ.W°awŠû#ì°ÃÅÇ/[ÃÇkxZøÂ—f°Ã•U Úá¢a—‹Ãáp8¸¢6 Êp‡ËKØáJ†®ÎÕ9ÌþQ°a‡Ë[ðyh.ìpyOØ——úØáâp4\ìpÙ#ºSÔÝÊ/ÌGGwêîÿf7 ‡K§Ÿ‚ÒöÎx1>›WóO›ÛçæpU̪@çöNÔ­Œï/Ýÿt;\e±ö/^f9[Na‡+ Áü9\ÔýprµîuFL;*ìpÙ×<:—ÎñÈ6‡Kv½º9]º—ª|•óeÚý¥ŠŠŠA¯§.—×$î´|Zž_‡KÖŸâþÑõ^êË&‡Kæ²É\·TÃÇuÀÅ—=Ô¢îÖm›oÃö9ÛQÖXfÛ.(‡K–Y›f9®£íR2ÅÕÅÖ”þº×Ù¾³èéèAͲø ”‹K0õµ—ÐôêÇ×°Ãlü8\ÔýprµîuFL»EQs¸JKKqþüy<ñDÜÅb‡Ëîpýìg?Ã¥K—ðÈ#ñ'sº—ìxyþ}¾R§Š^¯*§K·>Uù*çË´ûUUU…ªª*\½zgΜôzêry‰èˆÑòÊKÕá¢ýI÷Ïéþ›+îuÙd®›NØáâh ¸Øá²GæN‰îVÁ°ÌøÏ8þúqkšü .šñWN(!¶÷ÚÅkhøz®=ˆ¼üUù*çˤû?Ÿ×cÿþýÒ×Ë\.·È1±|Yy~.±?eûGû;—Ü/ê²ÉößdØáâØ\ìp‘(wJt·Ž¾p£æŽÂ¤o$Ÿ¤ÃEÓ=³=íñKçúÏpw®_ºŽ‹Ç.âúåëÖ€KÇájúnúW÷[ýA÷?Ý×&¢mdþ߸dùìp…ŸT.ê~È\-Ñœ¡Îˆi·(jׯqÏ=÷à7ÞÀéÓ§?û–“.ÑáZ¾|96oÞŒ'N¤äp‰Ç#èó'èó•:UôzU9]ºõ©ÊW9_¦Ý¯øù\îøzêr©"sÅòeåùq¸hÒý“ÝsÉý¢.›ìøê†.Ž—°ÃBØáÒïv¸’"äp±»nØ²çØ±cÖbN0a‡‹_¶†.Ž×ð´ð!„.Íþ`‡+«´ÃÅî‡Ãáp8pE}@•á—ª};\bØáJá\ p×Ù; 7ìpÙãôtËTùv¸tÂWf…Ÿnq´\ìp ŽÓO-«W£³·µ+â”´ÃEë+V`9[²Ðõ^ÚçæpÀ¨¹£ÐþV»ü$2í’i:\…ùùè»ón<0ÁyZ×yÕµxgQÜåa‡Ëð` þ.¯ƒ.ê¤$\.'·+Õ°Ãe;\þË¿®AFdƒÃ%†^Ô‘¢Ë²ëUÇÅ’9Wâz™“Eï&ë£å§êp9ÕG]$]‡‹ºLªû%uª²ÑársÚèù¡r«tÃÇuÀÅ×à¸9W|õèiïÁ¸ÇÙþ=(‡‹ÖWTU„mmÛÿÍi½ª}N}çhœyç z?/ÿ#à \2‡«gAZ_߈)åòﮫGï‰?aÖ¯_³ý;;\¯—*NNJÂårrcRMÔ®‚‚¬Xñ˜<9þ„.»ÃEûCU>u¸¬cÆùöùJ¯?êHÑeÝëUå\Ñõ´>]gI·>Z~*—º½“‹äÕÅ¢.“ªÿ©S¥[_º£rÚèù¡r«Ta‡‹£5àb‡Ë/ÎÕçv~G~qÄZÚáë+®.FÇöÜüøÍÒíeëUísKã7Q:®Ôñ©SP.™W‡«,æ¹ó±ñèG(¦QMdm󭸩¬ ÛÜ•¼)³Ãe<©:\ªÈœÑå’¹1~5‡kÅŠðâ‹ã‘—wbØá²;\´?TåS‡Kg°eâü û|•]¢#E—u¯W•sE×Óút%Ýúhùº Ý^æ"éºX¢Ë¤êêT¥R_:ãÅ}£ç§›[å7ìpql.Y¢ìpyq®¶µmCÑèä 5hwJ¬ïôŽÓè™Ýã8å¾l½ª}nÉËÏÃùçqøû‡_“N— º¶nÁÈ¢bËβäyyØî,þeòïÔØáÊ¢›”ÄI¡.—®¤J”®„[uòäN%v¸ìIô‡×òÓyþ…]½þ¨SE—ý\¯^œ+±>¿Î’ª>Z¾®Ã¥ªOæ"éºXÔerëêT¥R_¦…žßô|ts«ü†.ŽmÀÅ—=*çª~U=F´Ž@õâä,‚A:\´¾º{ë0¢uj—'/(±}²õªö¹åØúc¨h«@Ãפõå’yu¸ž?|óªk±vÚtëßD‡ë‡ßÇìªñÔÔä“v¸Ì'U‡K™“"š027ÆO¢æp;¶õõKpûí/âò峟}ËÉ—èp‰ý‘Jù‡¢E‹B9Â>_e×_9ùy·¸¬{½ªœ+ºžÖ§ë,éÖGË×u¸hèö2IÇÅ¢.“¬ÿE‡‰:Uºõ¥;^Ü7ñü¹Uºa‡‹ã%ìp…v¸ôûƒ.Ҥ9\4ìrv¸¸?Â;\|ü²5ìpq¼†§…!ìpiö;\Y• .v¹8‡Ãáð€+j*v¸Ì÷;\®‰’ÃEÃ.W°a‡Ë[°Ãe.ìpy;\™~ºÅÑpEÙá¢nu¥T¯ÚárŠøSК¥5Öÿ§â„É®Dù±òfÿf6&<6Á±-¢Ó¶ÃÕ^u#vßµï0-9uºØá2<Ø‚?‡‹º0NŽ“»å×½t¾°Ãe ;\þËÏe‡Kå<ÑëSv½º9N´|Y{©³åæd©ê£ÛS—*‘Ä,‚t}ªŽQâõ2GLl®Ã¥ª–Oû7.ý7í8²ÃÅqpEÝá¢n•“+åôúD‚r¸d°Ék&Û^›ªæT~Û+mØqÇÇö89]a9\;OÄ­ÿõ î'ŸÄÉéb‡Ë\ü8\Ô…qrlœÜ-¿î ;\ìp±Ãå=*ç‰^Ÿº×+-Ÿ¶—:X*'KùeÙ^æRíÝ»×q}*Ž‘Xu¢h{ñãb‰õ©Ü*õeZÄý÷ë8²ÃÅÑpEÝá¢n•Ì•r{=¼Ã%†:a¾u—OÚgÐÓuÂÜÊß÷Ä>4ÿ¸Û†K_/sºÂt¸O<2§‹.óIÕá¢.ŒÌ±qs·üº7²oøØáb‡‹.ïqsžèõ™Êõ*–OÛK,•“¥ ÝžºTÿüÏÿl»æèz]Lj–—øžp¢dΘ‹ÖçÅ­Ê&‡KwÿM;Ž4ìpql.Y¢äpÉÜ*êJ©^¦;„æVþÔнíÅ…ƒ¤¯—9]a;\;-Æ’ÿ~Óq=uºØáʬˆ.ŒÌ±qs·üº7²°ÃÅ ;\Îqsžèõ™ÊõJËÛ«r¶ü:\Ô¥zôÑGqìXœ,™5kÖ õºŽ-/~½Ø¨AŸ·|¸X²úTçC¶;\ªý7í8Ú¾f‡‹#¸¢îpQ·JæJùu®ü8\4Ô +(+@qu1†Nˆ㜊æVþÕ WQ6¹ å3Ê¥ý!sºÂt¸¾ßÚ†ûz»ÑP–|':\2§‹.óIÕá¢.ŒÌ±qs·üº74ìp±ÃÅ—÷¨œ'z}ê^¯´|Ú^ê`©œ,UèöÔ¥ºñÆ1fLü×ï¼óΠõºŽ-/~½”;¶ðçbÑú¼¸UÙäpéî¿ Ç‘.Ž—°ÃBØáÒïv¸’"äp±»nØâþ;ìpññËÖ°ÃÅñž>„°Ã¥ÙìpeU‚v¸ØÝâp8‡Ã®¨¨2Üáòv¸’a‡+…s5À]gw+ܰÃå­?Øá2v¸¼‡®ÌŠêé–©éæ994àŠ²ÃES1«Û;Q·2þ›\êr% ®9ïÎA¬<–—í ’öÎx1>›WóO›Û's¸¼ö`wÀÂv¸`^u-ÞYô麅EØÓµÞ²Ãex°}‡KåäÐe épQÇÇ´£Â—=~®Û}uoÁcÝ[°ÃôùÆù*^¿Ôí¡×§Ì•Òu±å$ÊÝ+Z~ºëóÒŸ²)Èú¾Þ„Ã%ö=~t9×.™S%{¿ñšI“& šqóOJÞ¿ò•¯ ÚÆÍÑ2Yù‰÷O§ó/Õû©j}Ø÷¯¬pEÝá¢9Ûw==¨YDP—«{F7ºgtcàÚ®œKNô.‡‹†¶wHÉW[3.zq¸túƒ:`&úCÇẻ®½'þ„Y¿~Mº¾waZ6½‚±CíÓX³Ãe.:—ÊÉqrsu|ü:*4ìp™w¸ÖÍ™usæ Çœ® ÎŸ ÏWzýR·‡^ŸÔ•Òu±w÷Š–ŸîúTý)sµÄúhÿ™v¸hÐãçä0åŠÃEªTÎ1øÃ œéõþÞ{ïY³dRG+,§+ñþét>%¢z?U­ûþ•u®¨;\ƒ¾±ÿlð˜°Bær•Ö—b÷ý»­mÒépÑÐö^»x _oÀÁµ‘—Ÿ'mŸŸþ9`a:\k›oÅMeeضà.éú3—/£(N]N>me‡Ë|¼:\*'Gææˆu|L;*ìp™w¸Ä'\;\Až?AŸoôú¥nÌÙ])]Kå^ÑòÓ]Ÿª?iÿÑúhÿ™v¸hÐã's˜rÉáìN•îù¡ŠÌÇš2eŠu ©£†Ó%¾ÊÎ'1ª÷SÕú°ï_Y7à’%J—,í[ÛÑ÷¥>k™º\S¿7ÞONži—ØÞk—®áƒg?À•?_AáÈBiûüöM˜ý‘Ÿ—‡ýçÎâ_öËÿ­ãMU\Œ¶‘É;\t"NŽÌÍ.™ãcÚQa‡Ë¬ÃEŸpìp…uüƒ®º=²ëSt¥t],•{EËOw}ºýIëóâ”ùq±hÐã's˜rÉ኉’tªü:m^³wï^ë'®bÂpº¨c©ŠêýTµ>ìûWV ¸¢îpÑ4}· ý«û-×JærÅnˆÙ¶I§ÃØ],ÚÞë—®ãⱋ¸~ùº5àrs¸tûƒ:`¦úëÃõ‹ÃïcvÕxjjò[BÑáª: «±ëÔIk=;\æãÕáR9927G4`¨ãcÂQ×y‡«rü8Tއ!±åþ³Ã•Ù½~©Û#s¶DWJ×ÅR¹W´üt×§êOÚ´>Ú¦.ÚôøÉ¦\r¸¨S¥{~ÈòñÇãóŸO^ÿ‡¶-wttàÅ_Ä™3gØvìô/ IDAT­0œ.ñØÉÎ'ñg²÷Sõaß¿²)ìp…v¸ôûƒ.Ň$v¸8…Ý)î°Ã?N0á÷ÏÌ O BØáÒìv¸²*ìpq8‡“yá÷OpåÖ‚.óýÁ—kØáâv¸¼õŸ—æÂ—÷°Ã•]I·ÃÅ÷© p±Ã58âO-GÍ…ö·Ú¥ëÃv¸bå1tövbìýc×ÏþÍlLxlÿWÁ°Ësêq9 ‡kŸÁ¶ñ2ék—‡þ®¿ÃÊññþ`‡Ëð` zu^¨c#sh»Ã%º8ìpe¶Ã5}ú3X¹ò„5Íz®8\Ë—/÷\¾ÎñÈ6‡‹.ÓëWV¾Ž‹EÝ$•ûåÅéS¹Qnû£Zïå~$nO÷OæD™v¸hûÅû)=^¹æp%’8ü¾°Ã•ÞûWÖ ¸Øáѹ}çhœyç z?ß+]ŸHX×ì-³ÑÓÞƒ’1%Òõm¯´aÇ;¬íý:\EUEØÖ¶ÍúÛ7Ú²þñÛn×3-­ƒÌ«­óœ?ðo8ò!¦mz5N¶ý;;\¯ ‡‹:/Ô±¡M" G„º8ìpe¾Ãµ~}•mºúlv¸*++qñâEÌž=[Z>u¸dÇ#Èó'èó•:>t™^¿´|]÷ˆºI*÷˯ӧÚÕzU}t{ºtÙ´ÃEË£÷S§ó!W.Àîžù}ÿ`‡+½÷¯¬p±Ãeu®¿ÙˆÒq¥ÖS™ƒ¦ÃõéÙO‘_˜OOË„}OìCó›1¼i8øv¸Š«‹Ñ±½7?~³´?販þpr¸žÜÓ‡—’Sœ>:¹I9aþ/,Å¿½Ÿœ†š.óñêpÉœѱ‘9>¢#B]v¸2ßáŸpÙíp:u %%%رCþ³^êpÑãôùôùFºL¯_Z~*î‘è&©Ü/¿NŸjTëUõÉ$qÿè²i‡‹–Gï§²ó!—.êž™~ÿ`‡‹.×—,Qv¸¨s•—Ÿ‡óÎãð÷K×áºSo/x…# QÞ*7¸¦þëTì}h/.Œ“í×á:½ã4zf÷XSüÓþ Ëa÷Çê†IèïŠÛ6½r¤¼O^{ Õ%Iˆ®ôE漈ŽÌ¡™‹Ã—s2Áá¢O¸€ìu¸Äó6¨d“Ã%ûpI¯_±üTÜ#ÑMR¹_¦>•‹e¢>qÿd˃>ot±d÷Sz>ä’ÃEݳ Þ?da‡‹Ã—$Ô¹:¶þ*Ú*Ððµéz \‡«¤®õÔãÜîsÖ¿‰×Õ WQ6¹ å3â2¿WݽuÑ:µËão´?販þpr¸Êb1Ô”ECYü Þ-¯nÀ´M/~{ú»Ãõ•‰“Ð6²Ê6‹ ;\æãÕá’9/¢c#s|DG„º8ìpe¾ÃU^> å哟_¨ÜÿLw¸^~ùe¬Zµ ãÇ÷\¾x<‚>‚>_©ãC—éõKË×u¨›¤r¿ü:}ªýQ­WÕG·§ûG—M;\´-9u°Âv¸d.–˜Äº9ïÎA¬<æÛáª^\ÎÞNÔ®¨uì±ÿÂp¸Äæç£ïλñÀù4Ã# ‹°§k ¼9>d‡Ëð` z—×$fýrr=¼º"^âæ é&×®ŠŠ œ8qï¼óÎgƒmv¸¢ìpÑí©#E=Ùõåæ8Q÷GæTQ×KuÿÐq¸Tí§.X*÷·öÓåT.ÚY}N÷ß\s¸èñ”??‘õèrƒ¬t»\²óÍëû¡éþËùWÔ®Ék&Ûž&ݶù6lŸ³eeÒ×;9Xa9\ÔÅ¢éžÑîݸ6€+ç®øv¸þøêÑÓÞƒqŽ“öí?ýáæpÑô,èBëë1¥\>kcïÂ.´lzc‡Ú§±f‡Ë\t./'×ë+¢¼*\!ÝäºÃµk×.TUUY3|ÑäšÃõ³Ÿý —.]Â#ğ̱Ãe¿>èöÔ‘¢ÎžîõEÝZ¾ÌõòrÿðºªöSLwÿTí—-Þ],Ú/šŸú2=ôxÒã§›ââb:tÈš4…öu¹¨“•n—Ëéx{}?ôÛ‘pEÝá:ð­¸|29]Á°ÌøÏ8þúqé4ø2+L‡‹ºX²”Ö—b÷ý»øw¸€øÓ¨#¿8"íÚ¦úÃÉá¢)‹Å°iî|l<úŠ…iR9sù2Šò‡àÔåäÓVv¸Ìǫå uRd®‡Ž+¢ŠÊÒM®;\‰'Æ “¶'×®;î¸ÅÅŨ¬¬À½>dÛSWJtöt¯/™û#–O]//÷ýSµŸº`ºû§j?]ô\,Ú•ƒæ·¾lˆxúè#Lœ8}}}¶AU¢è@„:Yév¹dÇ[u=ˆñÛ‘pÉe‡ Þýâ»(¬,”0eV˜îu±d™ú½©¸ð¾‡ ¶µmCÑè"Oýv@×Ö-YTlÙYb:ÞØ„QÅÅh™¼á°Ã•¹‘9)ÔõÐuEÂN.;\GÅØ±cñóŸÿœÔ“Û×–-[¬oÆ3ýüI÷ùJ)ÑÙK%Ôý˧®——û‡nÜÚ/sµ>„)Ú/Û?.–ÊA3]_&F<ž~Ÿl;?ý¶Ë%;Þ:ñÛ‘pEÝá*(+@qu1†Nˆÿäìè G1jî(LúFÒ+™ƒ¦ÃE],Ú>ˆÝ³þ߯ÃU¿ª#ZG zqµ´hÿ™ê'‡‹æùÇ0¯ºk§M·þMt¸ê‡Ãê†Fì:uÒZÏ—ùxu¸T¡NŠÌõP¹":Q¹BºÉu‡ë¹çžCkk«õ­(8\Ë—/ÇæÍ›qâÄ v¸ÈõA·§ŽTüø—§|½R÷‡–O]//÷ýSµŸº`ºû§j?]ô\,Ú™ƒ&þìÍo}ÙñxÊ\HôööbÉ’%˜3gŽcÿP—‹:Yét¹dÇ[<Tn—ßþ‹RØá !ìpé÷;\ŠIr¸hØ 6ìNÙsìØ1ë '˜°ÃÅÇ/ÛóÃþÿôOÿ”ñíä÷Ïô…§…!ìpiö;\Y• .vE8‡Ãá÷OpEm@Å—ùþ`‡Ë5Qr¸hØ 6ìpÙãôt‹ÏCsa‡Ë{ØáÊÌdÃÓ-¾oeÈ€+ê—˜ŠYèÜÞ‰º•ñY`TUØuÀhL;\Ôý¢ûOë ÛáÚ¿x™õ߈¢AëÛ«nÄî»–àï?›¶œ.Ã-è;\*Fæ~8¹!¦Ý¢ -¿Û§Ûá*,eË`þü_6Øf‡‹®äö8xð Ö¬Y`°Ó#s´Ü'•sEËóât¹Õ§*î-_V¿ëç Ržª?Sq¸Üú“:gôþšk—×÷›T“k—Óù‘®ûUÖ¸¢îpÑœí;‹žŽÔ,‹c¾*‡*‘°.'Ì@v¸¨ûE÷ŸÖg¢?t®¦W7 éÕ ¸60€³’‰-vž:‰[ÿëÜ3Î>I;\æ¢ãp©\'÷ÃÉ 1ííhùÝÞ´ÃUZZŠóçÏã‰'â.–ÊáZ°`36l˜Œ-[IÛÇW´®Ý»w£±±ÑšµŒ:=ÔÑREå\Ñò¼8]nQ•G÷–¯»´^.• #s?ÜÜÓnQØŽ–ßíý:\ùË_PVV†X,>³©Êázë­¥X²¤C¥ía‡+Ú×}÷݇—^z ---äNuºÜâŹ¢å¹9]^âVÝ?Yù:ûGËSõ'àÏÅ¢ýI³\w¸¼¼ßè$×.™ƒ—ÎûUÖ¸d‰ºÃÕ¾µ}_J^@*‡*LwJæ€Ñ˜t¸dîݱ¾°û~¸% uðÒ}¿ÊêWÔ.š¦ï6¡u¿åJ©* \‡Kæ€épQ÷K¶ÿb}¦úëÃ7Úë®ï·¶á¾Þn4” ·Ö³Ãe>^.• #s?ÜÜÓnQÐŽ–ßíM;\7nÄ=÷܃7Þx§OÇ¿tps¸¦O••ÓP^?çÙáb‡KÜþ“O>Ass³õ:=2§Ë-*犖§rºTQ•G÷–¯»´×þÐt¸ óóÑwçÝx`‚û´¿û/À—é¤âpéÄɵ“ŽŠ®£3è|Ìq‡«¢¢'Nœ°~ïU‡K§üëdD68\4âõ's³D÷(±îĉ¨¨ˆ¿W¨'±|º=]öëpÉî'ní§û+sºR‰8m¸XŸ_‡+ˆd’Ã¥:ÿèù.{½ŸDÍáòû~¹;\ö89[ÖâR%”Ã¥r°hRu±œ2úÎÑ8óÎô~¾×h}¦®ž]h}}#¦”;ÏÚ¸uÞà;\æ¢ãp¥òf.smŽˆ_GÅk}^“mWAA V¬ø?Lžÿ¢r¸víÚ…ªª*Ç­rÍá¢ý¡*Ÿ:\6‡'èó'ìó•^Ôy¢îQUU•5Ûã™3g´Ë§ÛÓe¿—Ê ¤õÑýur³t"ºHNý•+.–é¨Î?z¾Ó×ë&ê—ß÷ËÈ ¸Øá²GæLÙ.0âRÁ:\^,]Ë-ßlDé¸R×§Nét¸Êb1lš;~„baZÔDÜ4hBv¸ÌǫÕJ¨k#:"~/õé~ÚM׊áÅÇ#//®Ä7žÃ† “¶'×.Úªò©Ã¥3Ø2qþ„}¾Òë:O2§êæ›oƼyóR*_¶=]öãp©œ@ZÝ_™›¥™‹D÷/—\,ÓQô|—9q:‰ºÃå÷ý2r.Y¢îpQgJŒÌ¥ Òòâ`ÑèºXnÉËÏÃùçqøû‡_“n‡«këŒ,*¶ì,1«&¡¿+þmÓôÊ‘ØáʶP×FtD¨O7Ùäp%ܪ“'w¢¨(é¾89\GÅØ±cñóŸÿœÔ“ÛW¢?¼–ï'Ùæp‰¡Î“Ì=Z¿~=öïߟrt{ºì×á²}HR´Ÿî¯ÌÍÒ‰ÌE¢û—K.–éx9ÿÄóÝ‹óæv¸ü¿_FjÀÅ—=2gJt®¨Këpyq°Ü./ís˱õÇPÑV†¯5«Ï¤ÃõüáC˜W]‹µÓ¦[ÿ&:\·¼ºÓ6½ øíéSñ ;\ÆãÕáÒ̵¿ŽŠ—út’m×±c›Q_¿·ßþ"._Ž»/n×sÏ=‡ÖÖVë'9Qp¸ÄþH¥üC‡aÑ¢E¡œ?aŸ¯ôú£Î“ÌÁ*wùù·ª|Ùöâ²_‡KåÒúèþÊÜ,È\$º¿¹äb™Žêü£ç;}½n¢îpù}¿ŒRx–—~°Ã¥ø!‡‹†‘`Ã÷GØa‡‹_¶‡.Ž*ìp…v¸4ûƒ®¬JÐ ;"‡Ãáðûg¶}Vâ'\~îp…> b‡+r7v¸8^“+WWW6mÚÄ”jÂv¸ØýâpÌ„. v¤bå1ÌþÍlLxl‚§×ípÑT̪@çöNÔ­ôæ„Íx1>›WóO›Û':\tÿUî`wºÂv¸Ú«nÄî»–àï¦%QX„·~_oŠÿÍ ;\fcÂá§œ­¨¨ÀÑ£Gý<ÃÉÝ2í€íhùÝ>ÝWaá,[vóçÿ:~ü×sÏ=gko®8\Ë—/÷\~®9\nî–‹N1íæ8QÈɹJÔ¯r˜TõÉÚ'nO˧íS¹Eº÷?Ó—¬}n÷S/õe’Ã¥»¿²óÃO¢æp™vÌr~Àu‡‹:Rm¯´aÇ;,KõúD‚r¸hÎöEOGj–ÕÈ? ·kHÉW[3ª.ºÿ*÷ËÉé ËáÚyê$ný¯WpÏ8ù$ [îXˆÛ6¿†«ö=ìp™‹‡‹º7øÃPWW‡qãÆÙ^çän™v@‚v´ünŸn‡kÁ‚ÍØ°a2¶l‘O!s¸òòòlÓ£g³ÃUYY‰‹/böìÙÒòsÝáR¹[*K×Í£̹!•ä»t{Z>mŸÊ-Ò½ÿ™v¸hû¼ÞO³ÕýRí¯îùAu‡Ë¯c¹;\vGjßûÐüãf oîéõ@°Mb äô“;êv]»x _oÀÁµ‘—Ÿ'mŸí²ÿ*÷Kæt…ép%:Ÿ: xþñÝ·ñümø›òä“7v¸Ì'U‡‹º7§NBQQ‘í Bån™t@Âv´ün¶ÃõÖ[K±dI? †JÛ#s¸è¹lv¸N:…’’ìØ!Ÿ´&×.•»•øPèäbéºyÔ¢Îu„¼8`:ûG·§åÓöyq‹tï&.Ú>/÷Ólv¿Tû«{~ÐDÝáòë˜EnÀ%KÔ.Ñ‘šú¯S±÷¡½¸pð‚§×á»Sí[ÛÑ÷¥>éºÿŸ½;‹ªÜ8þ™öDÅEÅ sAÅÔÜ·Ò´®æRÝJ[n¥Ö½u[ôW·ÍåÖÍÔô¦¥%¦e›ær5qßpwYÙfÎï#£ 2CàB}߯׼”9ÛsžçœgÎ9ßóõ½ã4é³™¹KÏ›/¼ŸÌ1_€W¶¾ýíXlm®ßë…‰âBT’ ¬š¿Ý°(â¶ô#öln¥ógå”ФÏfνÒ›{h;Ó?P{ùIM/¤õà­ôüKùq£†OÞѤܴ?W ÷ÛÂç+ÌûÔ{3_®I¬tûc³ ê½™7?V» ³ƒÉo3çKÅô}·á}ºysjãõFFn¯òF熖oÚŸŠé­L¿¶×Æ^«¸ý”ôBô;P1òy£Ó7íÉæÌþoÞÞ}µ[áSûV¹}'¼=+o@>1Ÿð1;hÒgs¥åצMÖ¯_ÏóÏ?¨Ýÿúë¯æNÊ”Ejžyæów#GŽ$00åË—ó믿j/;7ö ¶yófBBBؼYݾ+W®dÚ´i•¦×ÛÛ›~øÁÜ Á«¯¾ÊúõëyðÁ+MoÅíW\ÞÒöŒFc¹ñXî6KãêTçä·ß~cРA´m«¶mi\—yóæÝ4pêþýU¿rZÕ¸"B!„wü†«21ëúàçSù˜Û£/s!ª?GOªÝ|_Ú=°ÖîU^ ç^)¥°H}lÞÛm©ï}}Ü/oO;ŠŠMøÖ³¯ü‚«Âü¹WJ‰»‹1ƒš×yãúÛ ÙÊ…¨þti«öìÓ´ïfÿt?÷w­Àä·ûkv}ÛÓ¼ÎI?ÌŠ¹Ði57íO³¶·¥¥×Æ¿Úq0“„mýɼ¡W½·_[¶õ§ðZêî®¶˜L §7=À±Ó¹7¥oêûljKÈ7G…>\Ç¡ï¿e^VÌçŠûS1½]H*`Ú“ÍÌWÜ~RÊUšôÝÂÛÿ9]éòÓ÷îü3¹°guùÓW_ü]åñ³¹ìý®¢úWZ~'Nœ`È!ØÛ«ÇÄš5k:th¹q4ºvíʧŸ~ªÞ\1{öl@ä³yóæLœ8‘¡C‡”ߤìïÓ§O›¿_·ncÇŽåСC•¦÷Í7ßdôèÑ<ñÄ€Ú#Ð!Cpss«4½·_qyKÛ»×XW§â8'e7Z7ªj\—^½z€—×õqÔ–,YrËíYWD!„âŽßpÙè*¿ïjâFfNñ-§7 tªôûÊæ?—Ë%Cá-oîÒ.±óàe«¾seO ™E8ØënZ¿NS!=Î]̧u3WŒ&…ŸveÉw‰´ežç@L6®Î6·Øu}]Û{’uÃMVï.õ̯ÅݸýÙɘ,²r¯Ïkw­=S©ÑtSúL&…ö!n¼ýBKõóëx‚z«Ñ•}G­è´ÂþÜ*½e*ŽÃYqûýºûpq[ÿ›Òi¾®¾MKÃɽRBÔ¾ ~ü_J­¤Ë﫯¾"44Ô|CSYW¨Ó§O§¨HíÆ½M›6deeqß}÷qæÌ™joßh4H||õ*§ãÕ±Ž.$ðé²xz„]‚}ãksçv\¿nKcÚûÇ+]ÿàûëóíºdSÔ݆÷õcËžtŽœÌA§Õðá¢8:…ºãévý•¶SûÒì-•îÏÀ_~ù-•±Sâymü­uQiŒ›vÈüZÜÛ/.6¡( ½á~eþŒvæÿWLß36fÛþ þ9÷$É»’°M®tëàyS~4 tfëµôUÜŸÊÒ{£ 'æ.9gþ»âöF&°ëàe¾ú!©Òò¨˜¾±SòÖó-ñ÷s ô†qמy´q­¤ËÏÖÖFƒÉ¤FwïÞÍ AƒhÐàz¯Ž)))åþ?{öì*ÇÙÐëõtéÒÅüwHH;w`ûöítíÚ•ó6oôä“OròäIrs¯¿âÚ«W/>øà²³³oJ¯¥å-mï^SÙ¸:7ŽÓQqœ“§žzŠÙ³gÓ­[7óü–Æu>|8«V­"##ã¦õWTÙ¸"B!„wK¥½Šª…=´Ã?Ý_§÷á‘—òõì°ÛÖ“`§‘Û«|-ò¿«.òôï¼!»U/…eÐh4$%%Ý•¼]¹r%cÇŽ½íÛ™¢zå[×ò_ŽÏ?ÞñáïïÏý÷ß/ùS‰cÇŽ1~üøÛ¶?Ö¬ÿnŸ_B!„B!„BÜI•v™ñî»ïVû_Y€çôéÓ¿k:”€öÐCÝr¾·Þz«Ú¸Û­,€rWÓ±páBÆŒCzzz­¯ûÆäO?ýT§Êçàÿr|Öíãcܸq¼þúë’?÷¨{áüB!„B!„âN©VŸð©©©lܸ‘Çóý÷ßÓ´iS-ZtÏìÌš5kصkÇgܸqDDD”›¾téRöïßϰaÃxâ‰'HHH`òäÉ€ÔûøãðññÁÝÝ€¨¨(†¨oÐÏ™3‡ˆˆ¦L™Bjjªyš5ªÚ>€ŸŸƒ ",,ŒÑ£G_nzUûgggGHHmÚ´aÇŽ•¶ ³”þ%K–pèÐ!FŽIïÞ½Y·n]­¶€³´}KùSÓü?vì³fÍ"""‚^x½^Ï_ÿúW«óÿܹså¶W±…È_|ÁÚµkéÙ³'aaa<òÈ#øûû—Ëߨ¨(ú÷ïO¿~ýØ·o~ø¡ÕÇoMÕ4}5I]8>/^LLL ùË_ˆˆˆà‡~(·~Kåo)jºüÝ>>BBBðññÁÁÁBBBhÒ¤IµÎߪÎ?KÓïvþL›6 ½^ÏÌ™3éÛ·/ `èСåæéÞ½;½{÷æ¹çž#%%…Áƒ[~kÖ`kkËŠ+ظq#...uæüB!„B!„¢¶ÙTgæÂÂB"##‰ŽŽÆÆÆ¶nÝZî!æÝ2xð`ÂÃÃñ÷÷GQÂÃÃqvvÔ® D@@&“ €'N°nÝ:¾ûî;öîÝËk¯½†““ÑÑÑ$&&Ò¿Z·nÍ®]»ÌÛ9zô(;wîdçÎ4jÔˆ±cDzvíZ‹é³´ýÌÌL7n;w¦´´”ÂÂBúöíË¢E‹,î_qq1§OŸÆËË«ÊtÜ*ýdÈ!`4xøá‡Íë¯-·Ú¾5ùcMþïܹ“–-[°lÙ2^}õÕrÛ‰‰1/ÍÚµkùñÇ-æ¿5–,YÂòåË™;w.Ë—/gùòåäåå0bĆNqq1_~ù¥y™'Ÿ|’wß}—^½zUY¾µ¡&é{àj”þ{ýø0`Ç'00ÒÒRFet[b)ÿòóók´üÝ>>@mÁ“žžNaaáM-q­=«:ÿªšÞ³gÏ»š?mÛ¶åµ×^#""‚3gÎÜr¾={ö°mÛ6¶mÛF“&Mxì±ÇذaƒÅòmÚ´©UëŸ9s&o¼ñ]ºt)W6u¥þB!„B!„¢6YÝ‚+++‹.]ºðÌ3ÏpêÔ)bccyä‘GnšÏÉÉ €‚‚‚J×ciúïuâÄ lllèÙ³g¥ÓOŸ> :u2ŽÁ` 33“M›6Ñ´iS–-[ÆsÏ=ÇöíÛ‰ŒŒäÀdeeUºN“É„N§+÷]Ù~•í§µÛ÷ôôäÀ,^¼˜V­ZѶm[V¯^mõþ•¹rå ®®®óìÆô§¥¥¡ÓéhÕªÕ;ønܾ¥ü±6ÿ#""ÌÝhU nUÔ±cG²²²¬Ê€””sð¬2{÷î%88˜®]»²hÑ"¾øâ –-[¨–EaÒ¤I˜?¾¾¾äçç[]¾5Q“ôÕVúïÕãóܹsèt:ÚµkwËyª*KùSÓåïöñqcù¹¹¹U»~µtþYš~·óçüùóÒ¿«—)**ÂÖÖÖªòµvý3gÎdÔ¨Q8p€>ø N×ÿB!„B!„BÔ”Õ.OOO¢¢¢˜;w.AAAòË/¿Zn>¾ùæþö·¿ÀèÑ£«5ý÷JLL¤qãÆ :”¸¸8’’’çСC$$$Ä„ HHHàÔ©SFsúF#?ÿü3 ¬_¿ž·ß~›ÀÀ@V­ZU­t2~üxæÍ›‡^¯çûï¿·jûYYYôéÓ‡éÓ§“@RR#FŒàøñãVí_™ââb~øaæÌ™ƒ^¯gÍš5V¥ûèÑ£tèÐ7Þxƒøøx¢££ 7¿Í»YÊŸÚ2iÒ$Nž<ÉùóçiР­[·¶*ÿH“&M¸xñ"/^¤[·n9rÄ<}Ö¬YÄÄÄœœLLL ™™™¼üòËæò $<<œØØXôz=ÑÑÑŒ3¦Zå[5M_m¤ÿ^=>ãããiÑ¢/¿ü2IIIæõߨªò·”?5]þne>ÿüs6oÞÌùóç9þ¼¹~´öü½ÕùgiúÝΟ‚‚7nLvv6QQQ\¼x‘¸¸8«,¥¿:ë?uê­Zµ">>žÄÄDš6mZçë!„B!„B!~   @íjªÿþL˜0­V‹··÷KLii©ùmþW^y…¦M›2sæL|}}ظq#›7oæë¯¿Æd2‘‘‘!¥XKüq’““)(( K—.¼öÚkŒ3†;v`cccîkΜ9ÄÇǛ˧̽\>ÇŽcöìÙ|óÍ7u²|êzþ×µãsÞ¼y8;;óä“OÊñqοÛ}~þÙÏŸ;q~ !„B!„Bq'™\B!„B!„B!„BÔZÉ!„B!î]¯¾ú*±±±øøøHf«c0ÌŸ:ÜömΛ7¥K—JæKù Qk8rä‹/¾£Ûõôôäðáì^½;;;)qWëW!„·Ví×G}ĬY³øúë¯y饗îHB›4i‚Á` 66zôèÁ™3g¤…BÔÈxã7hÛ¶-C† aß¾},Z´H2FqOÔ? .d̘1¤§§K†Õ!eÀ À!CX¾|9‰‰‰´mÛöŽl?..___BBB¤0ê =z`0°±±¹é;{{{)ñ§¸¾6l»wïfĈ<óÌ3µZ¿ÎŸ?Ÿ½{÷2xð`zõêÅôéÓ 3OÏÊÊ",,ŒüÑ>üðC9J„âO@¯×Ëúõë™1cÆ ÃÖÖ€‘#G’””ÄØ±céÞ½;tïÞݼìÒ¥KÙ¿?Æ ã‰'ž !!ÁüûSöûrèÐ!FŽIïÞ½Y·n]¹7œ-­ßÒïÓ_|ÁÚµkéÙ³'aaa<òÈ#øûû[=]qoÖ?vvv„„„ЦMvìØQé–ê‡iÓ¦¡×ë™9s&}ûöeÀ€ :´ÖêaÙñãÇY¿~='NdÊ”)lذÁÜ ªßwß}—?þÜÝÝˆŠŠbøðá€:†åœ9sˆˆˆ`Ê”)¤¦¦š§YÃÒïWU÷WkÖ¬a×®] >œqãÆ!~;vŒY³fÁ /¼€^¯ç¯ý«”¿°êúÖRýoiº¥ëךþ~ØÛÛ³hÑ"ÆORRRµëW€¶mÛb0HJJB£Ñ”[ÖÍÍÄÄD¶nÝÊŽ;˜;w.‡¾i+W®ä³Ï>ãóÏ?ÿCÕÿ÷zýt/ÈËËãøñãæOu^°·TZº?”ë/!„¨ÅÚÏ Aƒ”ƒ*€òÄO(¿üò‹RåkòiÒ¤‰b0¥ÿþÊÞ½{•ž={*gΜ1Ϥ,_¾\9uꔫœò‘Ͻ[ÿŠ———b0”:T«~hÛ¶­b0”–-[Þ¶úE>·þ+ƒAiذ¡ù»6mÚ(ƒA °øû1dÈeÇŽŠ“““’ ìرC±··WÒÒÒOOOPŽ;¦Œ?Þ¼üû￯DFFZuüXÚ¾¥û«Áƒ+—.]R4Í-ßäóû?=zô0ßÿVüÎÞÞ¾ÒòïÚµk¹ò“ò—ß—[ý¾Xªÿ­ù}¨êúµ6~?î»ï>Å`0(vvvÕ®_­Ý†F£Qúõë§üòË/Ê‘#G”J狈ˆPôz}«ÿïõúé^þ|øá‡Êš5k”óÇÝÝݪßWKõ§5÷‡rý%ùÈG>Öl¬‚ùøø0aÂ~ûí7‚ƒƒ7n7n$88˜ÔÔTòòòîXDnóæÍ4nܸÜ4žžž8p€Q£F1qâDfΜI«V­nZþƦíeŽ=Š¢(Lš4‰ß~ûMžBñ'óüƒeË–U{¹Ó§OcccC§NˆŽŽ <<ƒÁ@ff&iiièt:ZµjÅñãÇ«½~k~ŸöîÝKpp0666¬X±‚ÂÂB&MšdÕt!Ľ]ÿ\¹rWW×jÕçÏŸ§°°þýûWúÖqmÔ/¢zfΜITTz½›*?6mÚÄâÅ‹Y¶lÏ=÷áááDFFràÀ²²²*]¿ÉdB§Ó•û®  ''§jý~Yº¿:qâ666ôìÙ“;wJáÖ²ÄÄDBBBÌס¡¡¤§§STTTé2;v$++‹ÌÌL)Qåï‹¥ú¿6žÔô÷#66–’’ºvíjÕ1vcýZñù^¯gýúõ7-£( [¶laË–-<ñĬX±‚N:Ý4_×®]9xð`«ÿïõúé^—ŸŸÏéÓ§o9ýVõ«¥úÓšûC¹þBëYÝEáåË—éÕ«_}õYYY´oßž%K–wGƒ[e¾øâ 6nÜhþ;++‹>}ú0}útHJJbĈV?LLLL$00ððpbccÑëõDGG3fÌ9J„BÜRBBAAAL˜0„„N:…Ñh$44Ôü€ C‡¼ñÆÄÇÇMxx8F£±Ö~ŸfÍšELL ÉÉÉÄÄÄ™™ÉË/¿lõt!Ľ­¸¸˜‡~˜9sæ ×ëY³fUõCAA7&;;›¨¨(.^¼H\\«V­ªµúEÜÚÕ«W9{ö,{÷îåܹs¬\¹’÷ߟG}ԪߣÑÈÏ?ÿLBBëׯçí·ß&00Ð\~Ö*,,düøñÌ›7½^Ï÷ßoÕö-Ý_%&&Ò¸qc†J\\III„‡‡sèÐ!)üZ””DçÎyóÍ79{ö,111Ó¥K—róMš4‰“'OšÇjݺµ”¿¨ñõem<©éïGQQÏ>û,+W®¤iÓ¦Õª_˸»»ó׿þ•ñãÇ—ûÞÎÎŽ>úˆC‡‘œœÌñãÇiß¾=<ðÀMé4h/½ôS¦L©sõÿ½^?Õu·ª_-ÕŸÖÜÊõ—BXOƒÚ”K!„·Éã?Nrr2téÒ…×^{1cưcÇÉ!„Bü.ÇŽcöìÙ|óÍ7’â+ €µk×sG[¯¸ºº²aÃÒÓÓyôÑG)..–ÂúIî…âdpgÜBñ‡3çù ’ âkâ £dÂ]äë)™ „BQ‡DFúJ&!ĈM]I¨­-Ìž ™™ðÎ;·o;:øøÀåËPR"È­4m /¾±±°dIÍ×§Õ¿ÿ yyðÖ[üò©íü³ÖãC³fðÙg–&DZøsJ4سtƒ!ü¥oúmßÞ¾“nlŒö4ÿÝ»}½;dßñýûn»Óì™40 ÷»S²mùúõ¹R¨cÒÀ4‚êÖ‰cfÿ)W6ð¢a½b&ôOÃÑÞ$'’øSrqwß…œ˜9Sò£®±sÌ!âñg(Î÷bçò…µºn??xî9pu…ùóáܹ?Fžõê£FAR,\׆[©tŠ‘åg‡“cãÁsÍjŒw3f³àÜcdÙÔãoÍ–ÿáŸÚÈ¿º|ü!„BÔå\“'C«VjÉÞœaÓ&ذáÏ“!/¾ÿþµ»îV­`ÄhÐ@ýû“O !Aý¿FÓ¦A` ¤¤¨÷..ðã°}{Í×ÿG)ßÛY>w›F=÷ݧþžûöAÅ1}ÇŽ…®]Õÿ/_‡[¿Ã‡ÕõÞb\Z!ÄmЭu.ÝZçrà´+ë÷{ݵt„åãåZ‚‡sé]Ùþ¦hOöžt£§,z„æ–›¦?îô&&Þ€zn¥t Σçµù¢Ï¸òë>/}‹p¶W[,5÷/ä¾––Ç;bç?ø«ëu/!3×£IÃððËtjq…/7Ö'зˆä {ê{”0¨K&ëöz‘’iÇSCRÑh k«<º¶Êã»í>|ôm #{fоY¾ÜâŽiÃð+ñóÒðé÷3¸˜ÖÜ<½GèFÝ¿Œ„Ô`®\uàLb{öï ÀÓÃgÒ(†Ìa:(Ò³ýðöHE§5ò]Ô“ì;Ù­ÖÈßǾ†®„+WÝhPO®„¶Ob÷ñ~µ²ÿ–Ôkt”àî_ã╤ÖGkÞ#'-ØêéUqtM§ûø¿¢¡ §Nî)h´FNm›LòÉpó=G—Ñÿ¤´È™í_~{ýsÜ7ò-L¥vl]ü ÎžÉ„Š±Äžü¬ÝS±µÏ')f0gv=qÓöZ÷ùFáDÔ³µzŒ>ôôî k×Þ|Ýj­Ö}Ò0$ €ØÍ/‘×gÏdšw»X°sÌÁÝï,¥ÅNìXú&“  Ð¦ßg4h±€‚œ\:Ù—„#ÖJþíØ¡~ÞV¬€èèÚÉ7b䣄)Ø)Åäè<,ºˆ­RÌWõŸc³Ç0õþ…))sé™»€T»†lsÈZ¯1V-_•†ÅI̾0™"­Év¨_r gã6y>ÈrßÉ7ÍÿLê'hPXì7õž8~4(¼Ÿð7ÅsÎ1'c> ‹“ØçÁ¼†¯[œÐ?{§-à¬c+òtîs¾ß<†ÔJþÝÎãçN¨éóƒž=aôh¸p®\Q¿;}vïþ#<ŸPèúÈßqõ¾HNZ06v8{&“v.œØÿMµ¢þÒU¹|m×ÿ6Z-üóŸàí­>_Ëχ† aýzصK®-…âÆà S/.¾ÿBCáâEµ¥ÌÀ°¿zÑq;9;Ã{ïAj*|ø!xyÁÛoCr²ÚrË|#ìo¼¡¶èòð€¸8õ-/KË—µ2™@¯__pp€Ÿ†¨(hÓºuS÷à‘G ¨HýÿÏ?ÃÕ«Ö¥¯Ê‹à†ðí·Ð¯´m[~Z“&jpëØ1øòKõ»iÓÔ þ={¬k­TÕúkZ¾ðÿ§^x^ºîî7ÏóÜsТ…š¿¶¶P¿>œ:‹©ÓŸ‚ƒÕ ŒÂBuú?ÀÁƒå×coÿø‡àûäu{–Êçòe˜:5‚ìluûÎÎjÞ­^}½üFußë×W§ïßoýCš=ÔÀRQ‘Dtq-[`Ý:xðAèÓâãÕÖYÙÙPZª^P½÷žÚ2­ªüÓhÔénnjÊd‚˜õSÆÍ ^] Znß÷ßoýùU–õê©Ç‰Ñ7–Ÿ§ªòÑhªÎ_!îeE%Zþý?E%Zê{“W`Sáö¾øµÉv¸;—RRª¥ HË}-òžÉÊ­¾¤gÛòâ¨dÎ$9bo§àíVœÕô ˦{hï,oŒV êq9×–Âb-îË¢{›\+n«Þ>ÀÁ3®9ç‚­ C–-ù…:z¶Í¡_X¶Åý;“äÈ‘8²®Ø–e‡NK¹d&…*Ó¯(°ø×¤\¶£¾g .Ž¥œ¿äˆŸW1S†§XUç/9²÷¤=Cs+ ný{uyWu´m’F­ЪÑõל/çØª¿eÁWhä[D=7ë[ y¸”òöÄ‹æ¿_pæûÞ¤\¶»<¸Ê¦hO´oËüŸÒ2à*OM½i]cîO§°Ø—wyÓ´a!®ŽÒ= ¸ýz'²jëS<ÐéB›ÜüV‹‡z¬î?Ù› )-HÏö3Oë¼—F1ü°cmš&1­Þî© èü#ѧz‘™ç]åò7j×N½ž8|Μ©}ËÌóæÕËnHï>ƘO€oœ“ILJ+fÓ'ìWZÄbR4däÔçŒ>´Ööß×z95… °Ÿði]íéU¹šçÃo ¿5ÿ]?x7mûÿ7Ÿx’y'wuß2õ¡´è¾œzŽ‘v>œúÍöbïrÙ¼\nz3ÿü6¾Í÷Ò¶ÿ°±¿¹™ˆoÓýx"-®™IíÌßwzðÿðô?Á•Ë0–8âä©çìÎ'I9aÕ>„„¨Á‰ß~û}Á-{§,ÂÇN#'­‰1ChÔn½yZ~–?Ç6¼ªÞ‹¸dÐcüß(ÈiÀÞÈOPµ§ýˆÇ§`ï”Ej\EKz|W ñ]j5ÿ¾ú ¦LQ_F;srsk~ü5:^iò_†e~OÛü#( i¶ ‰u SïPøìüÂÉtó óvÓñÊöºÞO¬sGó÷o$½Fë‚’샸ªuÄ¿8‰å¾SØåÖ÷¶?¶J þʼn¤ÛÖ瓆o ULü'þqœ¯¥ßÒt¿âd¶¹â¬ckRìü+¿®aþÝŽãçv³öùAß¾êK¶Ÿ~ªÞ›ëçk÷îûö©ß§§×Þó‰»MkS‚‹—ž«y>ÄlœŽFc¢çÄçÍõ‡¥úKkS\åòµYý99©ÏbòóÕç.Hž!Ä™ù)˜‹‹úoV|ó àA×§Ý+™™jÀàÉ'Õ›íà`5h`¼<5Ðá⢶êÖM p8¡~¦NU[­^]¾…³³åu7o/¼Pþ»iÓÔ`T}Ѭ´>úH ¢¸¹©A£•ÏϪZ¿5å[UúûôQƒ3ß}§¾qUÖÅ^™~ýÔà@@Àõï[µRwIIj—xÁÁê…kl¬ú–ÞÀeiùè#5°³téõï-•O¿~jðå§Ÿ`Û¶ëÇG÷îpôèõn.®\Q/¼A}c¬kWõ‚ûÂËå§(j€èÆc¡C5ÀUæÓOÕ@U|¼úfЋ/ª¥† «Î¿æÍÕòމQn ÀK/©Õ7ß„  xùåëo´Y½ó¦,ÿ""àá‡+Ÿ§ªòyàªó÷ìY©LŽkÏ 7ŠJ´ ë–É}-óÌ]ø•ÙëNr†;gÞZ}â°j›ϺÒ:¨ï"Î%;’iÇÊ­¾Øè& Pûø ô½ÞÅž‹£‘§‡¦’_¨cöªǹX಴ý¦ Ñh²òl((Òš—;™àL¿°l‹û×2ð*-¯ZlAv«ôGŸq%å²½;dÓ»}ÙWlødµÊ É`@Ó†Woš–ê@ÞU­0¢Çe Y¶,Ýà‡ƒ‰WU[¬ôé˜M·Ö¹däÚòë>/âShÛ4Ÿ‡#¬oÊ{9×–¯6Õ'ÿªŽGz§Óº±ú ¼u.á­s¹œkËÂ_йeÑg\8•èĤ©¸9•ÿnÖ°ó—ÑìiÕX"ˆÛoëáª[blØ?šíÇáë™Â¨^_Ñ"ð‡ÏvgÅægqqT[9fçÕ#róŠKíÐùGõÚÖ1—Ì<ï*—7?ÈÓ£ª×¤·ãÅTž{è}\œrX¶ñEbÎw.7=êðPöèM¶[Üõ{& XÀǫߩ•ý·$áȃ5šnÕƒ8:=8;§b6MÇp^mªoï¢Þ€?ðÂÇN¥ »!)§{S¿Ù^] ”º©õ·WíÍÅÁÕ`~˜ªÑ(ׂ@ Ñ˜hÕ{1ŠIÇ©íO—Ûö•¬<ýOàä‘Bú…ûˆÛûÙ)!V§=(Hý÷÷=ÝëÇÑùá7¸pðaÎx”=¿ªt>ÆD—ѯ£˜tì_=˼_žþ'±wÊÂß•“QÏââ•Ä}£Þ¢´È™_þ·Öò¯Ì™3j@&(¨üKh5µÎk4QîƒèŸ½Ž1Ëy!åCÞlü)­ bñ(Í$Úµÿõ{™€¢f$¾BÖ…g›GZ\¾Œ[iKâ&ÚµŸ4|ã¦í]äåäáS¢î¿w‰ êþk1ñTÚ<Œ–ú•¿YJ¶kDë‚üŠ“9äÒo}žäŒc›;rükìØíÖ‡ˆœ-L0,¦C~4FŽÝn}¬šð÷D6xޤaq§- ´à{Üz3¿Áßk-ÿn÷ñs»Xû|hëVõS™õëÕ3³”ßC IDAT}}aÌõyÁ¡Cðõ×uçùÓ­˜JíH9Aƒ–ÛiÑsÞc2éH=ÛÓªúËÒòµ]ýÙ\¹¢>? P[>÷œú’îo¿©Ï9„Bü±˜\§N©ÿ¨¶šqqQ^_¹¢'n·ü|õ¦ÙÛ[}Ûš ®à`5øPÖä¸:Ë—tºòß—µ”òôT(66ê6¬Yÿ¹sêèïuñ¢:6R·n׃_|q=ÀêÅáÓO«c,^¬^ZÚò­*ýeã5uè ¶Ú©(åÚKüééj'/Omõãì|½;‚]»Ô7´@ zMŸ®¶öš3§ü…ȧŸÂ«¯ªÝ8Ìš¥¶²T>ÉêËw´n­^D;9©A#“ImuW‘½½šE¹~ñ\Õþ·h¡¶‹ŽV»–5PZ™3Ô›6µ>ÿʦ7n¬æ[V–šv͵ëR??µuŸŸ<ñø_{¶|ÿýjž•˜,ù×^(ôðPÿµµUƒ¨ŠRuùT7…¸—x_oêÄE':µ¸¹K;?/õD‰Ó;Ò­U.W‹µ$¤: Õ€¯G ö¶&¶ñ`U”=ÛæÉ‘5;½q°3Ѹ~&¥üútZõ “©ü¥ƒZ™ç]UxŒ& :­bqûñ)¬Ý[öÍòÙS è¼³¼±Õûg~€zmܨÜuû%F 6:å¦ù*¦ß×ãÚúœéÜò ÙùÕ¾Ó¯žºút{š6(¬´|’ÓíQpw6¢Õpý€‚‡K).¥ØÛ˜ˆOñ#-Ó®Üz2rlY¹ÕWG#õ3`ks}ß~ÜåͱóÎ î’I×V7çÑá8¶òdÚ=KÖû1¸kñ—ØqÌÝÜŠ®Œ>] Ö5ô.–“KÜuZ­ YyÞdåySTì@‹À4ôNT¯ÿÛñÐ゚™÷Ã[¸8äÞ&Š+WÝКX\¾Ìƒª×t߯¶ò®Mcû-â¾–»øiçvÆ (ÿ`O· 2s}¸ZäÌÙ¤Pwý'û+µ²ÿwŠ“Ç%: ùˆ¢OŽ®{c©½yZ›æÓ åvÎìz‚¤˜Áå–³sÌQëëBW¶,P#‹e­Äì³Ì8¯drlëh4&îõžþ'p÷;cTwÿ[‡Ïøö[õEã7ÞP_ܵv!„u‡Ú·0nœõ!~HˆúÐûÀøå—ò–ÛÉÍ ÆƒfÍÔmæä¨o7­[§^ =õ”ú†³³zs½¿úVPi©uËÿûßêw3f€£#|ð$ù׿n¸Ñr†ñãÕuh4`0@d¤zñ]Õú­ñÌ3j€ ¢²ñ¤&LPƒv.¨?º[7àxöY5€4oÞõnú¬YMË·AuÜ  õb5'öî½þÆ–ƒƒúÖUh¨@ÉÏW»·[»V (=ôš>WWµüNžT»ÌË»^>yyðÖ[åûLþâ 8~Ürù8;«ûת•ºûöÁ¯¿ªÉ²õ«Ýúø¨ù»|ùõœ%íÛÃàÁjšŒFuÿÎS·_ÖEá²²VZ_~©§,埋‹úf[Hˆ:}ß¾[—ÏÈ‘jp«â\UeºwW[¼¹¸¨|ß|£îKUåS–÷·Ê_!îesžŸ@Z–-x‘”nFnNF:µÈ3·°*(Ò²no=â’±Ñ)tl~…²ÍÁž?7¤°XËÔ1z2rl™ÿSCºµÎePç,snNF¦ÑSX¬åÕx¹–òâ¨äriÙÊ•]ÇݹZ¤Å×£„1½Óñt)µ¸ý“ˆ:êAVž Z 89 ª_ÈC=Õ.J,í_™Cg]ØëN~¡Ž†õŠÙ37çR‹é/.Õpà´+—slq´7±ç„þÞÅ<=4Åêr( 2ŠÈ ]ÓòÝ÷äêøuŸç’Ñh‚¯Ðÿ¾,´H4س)Ú‹ôl[4…zn¥t É£Cóò•·!Û–o6×ÇÙÁÈãƒÒ°·U+ϪZœMžÂ®ãnê˜x­UÞ…T¾ßî«“‘ñý ¸ÜÐ áÆhOöt»e ìn˜8C*á»É×7ò¶oã©asiÕøèMßðÍ\rx°ç ê{&£ !=»»bú}úz÷r.޹Œîý%-ÅPZjGôéÖí}“IG“g-.ß°!üýïêǹskwß<]3xsbåãùü{Õ¿(5Ú2¢ç }/à`W@v^=vÆ dWlEcUú«Úktú!ÞoîrÏŠO)Èñ³8Ô@NØð÷(¾êÎÁgb,qT¯]Óé9áùJ·»õ,Û­§aÈ6v.[DQ¾'õ›ï¥í€9½ýiÒ/†Ñqè‡8º¥¡Õ•PRäB¦>”óûÇr5×WÝÿzéöè«ä¦7åÀw–ۆζ=–áÝø0vN9”;‘q±#q{&R\ànu9>ötÊ8tè÷-z~E£vëÍcp•é9ñ9\2ؾt %…®å–±sÌ%¤×ÔktEÑpéT_âöL@Q´´î» ÆùWñÚû‡Ô1•jƒqÓ´0'S6>lòÁÿíò¡ a›û@"}ÿŠ ­ÅåuŠ‘åg‡“cãÁsÍ"Ñ)Ff_x†ú%)Ìõ›‡æ¼ªŸoI*¶J1ùZWŽ;w`µ÷DÒmÕc·QÑ>Hxž Í˵ µÛ¾ñ†ÿÒ!?÷Ò, tÎuîL¤ÏSäØxÜ‘ã'´àcÒ—X|Zbœ;±Âç).ÛúXœÞâêI&ã_œˆ‚†;þç1œîýÕó£òïv?w‚5ÏnuÿÙ¤‰ºß~~ê½­Á;wªë¨Îúïe^±4ëú-.^‰(Š–ËIˆÛ=A ¶[QUµ|mÖ_F0|¸T-{éúÜ9õÙ]f&DFJ !ÄI¹—TœBˆ?9ÏOL¨Ì<æÿÔ_lm’3ì0š4Œík eàÕj­ëbš=‘¿ùb4ixjHª¹õÚ½.ö‚3kvxãåZÊÄix¸”Þ3i“×Ýu'\wÛ+¯¨/˜Íše}—àâÞÑuÌ?põ¹À¾U³¹r¹ñmÛNÓ¦êËv66j·ëÉÉŒü ƒ‰Õ—,¸÷»M«mï]|‘ Âs¼4¿Ü¸SrüÈñ#D]&.!„øc1¸„B!„B!„B!„¨ ´’B!„B!„B!„¢.‘—B!„B!„B!„¨S$À%„B!„B!„B!ê p !„B!„B!„Bˆ:E\B!„B!„B!„¢N‘—B!„B!„B!„¨S$À%„B!„B!„B!ê p !„B!„B!„Bˆ:E\B!„B!„B!„¢N‘—B!„B!„B!„¨S$À%„B!„B!„B!ê p !„B!„B!„Bˆ:E\B!„B!„B!„¢N‘—B!„B!„B!„¨S$À%„B!„B!„B!꛲ÿôë×OrC!„B!„B!„BÜ1[¶lù]ËU»—½½=O?ý4Ÿþ9Ë–-ãã?¦W¯^V/ÿÒK/±páBüýýË}?xð`"##ÍŸ‡~XJµZ¶lIdd$Ó§O—̸ œaìŒRšVZëë`Á‚¬X±‚V­ZýaòlРADFFòÞ{ïáâârG·mkkKdd$Ÿ~ú©¼u˜““‘‘‘|üñÇ’âž¡Ó鈌Œä³Ï>«Ñò .”ëÀÍÍ+VüîüB!„B!ćMuxçw äÕW_%99¹Úܳg©©©ddd”û~Æ lذðøãKÉü 5h®Ðq€ _€ÿ}¡#C¯1Oï3ÞHƒæ ùÙlììàøv-1QVÄi50x²O?… ½;póVH<¡a×w:êù+ |ÚHq!ü0Û†zþ ýŸ4b,UïÙàæ­0ì#¥Å“®ÁÕKÁÎÎì×rhÃÍÛïú öý¬«Õ<?~KJHÓjqTÜ…oXæèP'ê'KÓ……*J£áÙgŸ¥gÏž¤¦¦ÅÚµkÑétÌš5 [[[rss ÄÖÖ–/¿ü’Í›7KæÕÿøÇ?hß¾=ééé8::âââÂ?üÀ÷ß_íuMž<FâE‹j-}íÛ·gܸqðöÛosîÜ9)8!„B!„âgu€+,,Œ>}úàãã¨ÚKKÕÖ) .¤  €~ýúqÿý÷SXXH`` nnnüòË/|ûí·å–oÔ¨¥¥¥¬Y³¦Ú 6lãÆàÿþïÿ8s挔"àèèÈüùóqpp 11//¯rÓ5 ï¼óÍš5ãòåËØÛÛãââÂo¿ýÆ’%Kxå•Wð÷÷gêÔ©„……qõêURRRX°`ß~û-¿þú+_ý5F£‘„„4h€““+V¬à×_­•òñôSØÿ‹–6=M„(å¦5n«Ð ¹ÂÁõZü[*\Ökq­§z¿‰óG4ägWý Ygî>jpl×j <ør)¶×ž»^Ë®´x ˜hÐL þ4j£àäv}=™—4ü¶\G£Ö =F±µWnÚV`+ÿ kH==]L2R¿‰@*-VL7èHˆ±î!x»ví2dk×®­^pËŠý÷ Tðj¨xR0ði#aMÄÔ’›®aÇ·ê÷Îî0â¥Rò.kX÷™E©ÝüûÏþÃk¯½Æ³Ï>Kll,ÙÙÙwì<òööfîܹØÙÙQ¯^=Nœ8Á{ï½gñüøå—_ª\¯F£á½÷Þ#((ˆôôtrssiÖ¬/^äõ×_ÇÕÕ•E‹¡×ëùûßÿŽÿùÏÌÓþùÏJBBvvv4lØ£G2kÖ¬/·ë×>ÅÅt.)až“#ÝKJ8¥³Áßdb|a!ííHÓÞýá"«ªŸ¬™nÉÈ‘#3f Š¢žžNqq1&“‰×^{Íbý­Ó骬Ÿ-MxóÍ7iݺ5III\½z–-[Æ®]»nûñ¡Ñh˜?>ìÙ³“ÉDtt4ÑÑÑF¦OŸÎðáÃiÛ¶-&“‰´´4bcckeû–Îkò¯ªò3#žž|ôÑGÔ«WÏÜÚpݺuË÷Fæs~ÆŒ$&&Z<¿-]ÜîòíÞ½;í۷端¾",,ŒóçÏãççǨQ£Ø¾};éééV¯«sçÎtìØ‘½{÷ÖZù4jÔˆÿþ÷¿<øàƒtêÔI.*…B!„Bˆ:Âê×áÇ9|ø0sçÎ¥Aƒ,Z´è¦Ï&“ ___\]]ÍßuíÚ•o¿ýÖ¼|M[h­[·ŽuëÖIÉU0tèPXºt)[¶l¡e˖̘1Ã<}Ĉ4kÖŒo¾ù†õë×0uêTxàöïßÏùóçi×®AAA¼òÊ+”””ðÞ{ïpöìYózrrrxë­·pssãóÏ?§OŸ>å\5)Ÿ“»nýÛÁI}`œŸ£aïZJK íý&@ÁÁò-Ä@Œ%«¥I{a4 V0™ !Fݦ£›ºþc[µ {ÁHn††ø£Zµ1ââ©P˜¯®ÇÝW!â#ÎêßΠрríy¶F ]†1áÀºò­·rÒ5Ôo¢àVOAFÑÍ:Ò­oá ð»êYÚÿôD ›¾Ð6ÀĘ×K1–€ƒ ˜JÁt½á- |º“6,Ò™÷»¶ò¯Lll,íÚµ#88ØüûNÈÈÈ0wÛ5uêT:wîLëÖ­­>?neðàÁ±zõj~úé'¼¼¼ªÕ½Öˆ#  ((Èü}‡hÚ´©ÅÄ––¿«õ«ÇµÀ Õò¡³3…À„ÂBušI!íîÇ·ª¬Ÿ¬™^•-Z0fÌŽ9ÂìÙ³+-¿ªêïS§NYU?W5]¯×Óºuküüü8tè+W®¼)Àq»ŽV­ZáááAtt4‹/&003fPPPÀ”)SÌó­]»–­[·Ò¿yäþö·¿ñÆoܱcàVùg©üÊdeeñüü|ïÞ½Y·nÕåëææÆÒ¥K‰ŽŽ.× §¥ó;,,¬ÊëƒÛ]¾nnnæúuÁ‚™»¡vss³:À¥Õjyúé§17þjªº/!„B!„âÞPk CCCyê©§8zô(ãÆcܸq˜n|2~M^^õêÕÀÎÎæúCþü|õI¸§§' Ž=q£ 0wî\Þzë-ìíí¥¯¹té oÌÏ2/^Ô^Zµj…ÉdB¯×ƒ S§Nå—_~A¯×óüóÏSPPÀéÓ§oZ_Yë½;U>—ΩûÚËDÑU°µ‡æLæÃåK×÷×Í[aøßŒô{܈íõåƒÚ)4í`âÄ-»¾Ó±ú} ÂGq­§ÉŠ®jˆœiúÏth¯íšãõx-9µ%ÓÆÅ:.ë5ÔRð¼é8À„½Ú¨¥¤°ü>ÄT×ýí¿l8¹[Kÿ' žl´:hÞ¼yµóÏÒþ\Ökøm™Ž£[´Ø;©Ëm_©C¹á4n×Ç„ƒ Ú¤¥´øú÷µ•eÊ‚y.\¸+ç“››mÚ´ùÝçGEe]²†„„ÜtŽæååQZZJýúõqvv¾iy½^¨Ý¶=û쳌7ŽÇ{Œ)S¦_ãåïvýzÀV=Y+,$O£ÁIQZTL¶FÃYݾþNIIÁh4J³fÍÌß—'–êokë窦oÙ²…qãÆ1iÒ$Ö®]ËŒ3xÿý÷ïLý~í÷«Y³fh42220™Læý×h4æÖãùùùæ mÕgéü±”–ÊÏÒòÖ–onn.Ó¦M£]»v,^¼Ø|eéü¶t}p»Ë÷èÑ£€ÚÊ-??GGGúöíKnnn¹úÇ’Ç{ –/_NAA\ø !„B!„¢úcpÝÊñãÇùä“O3f Ë–-Ãh4’™™yÓà{÷îÅÑÑ‘‡zˆ/¿ü’ .°`ÁóàÝ»wãââˆ#X¶lz½žO>ùÄü†¯N§ÃÞÞGGÇ*ÔüÙìÙ³‡¤¤$&MšÄW_}…Éd"55ÕœÿGeòäÉ<ùä“,]º”’’¶mÛÆªU«0dgg£×ëqrrbÕªUìܹ“Ù³g³aÆj¥£&åÓ{œ‘†-®;<¥Ö~ª#ﲆfÛÐy˜‘1¯—b*…óG´Ù¬…â#-èllí5hnß&Äh(¼¢£}_!á¥( ¤œÓðóÇ6äç€ýµb7ö„V ±sP(-Ö’¦Á«¡ÂØ·K)ºªvÇ·{Ž+Yê~zÔWéf"󒆸èò±c;hÙUÁ¿…g()RÓtøÖ?¼?tè;wîä‘G!==Ý»w[½¬¥ýèþ°‘úA Ij Ëpñæò j§F»’N–ß¿²€XMò¯Ì„ èÒ¥ Ë—/¿i¬¾ÛÅd2qôèQ‚‚‚øúë¯)((`ëÖ­|÷Ýw”””››[£óãÀ¼õÖ[L™2…eË–™»»Ñ‹/¾È”)SX°`F£‘””óƒáÇóÔSO1jÔ(fΜ‰——W®\a×®]¬\¹²V–¿›õk²VËw^Î/àçìŠ öv|áèˆrÔ±UÖO™‹Ó«’——Çĉ8p Ï<ó ~~~ænøæÎk±þ¾U ËZ 4ˆŽ;âîîNAA»víbÅŠµV¿W%;;›)S¦ðÄO°páBEaË–-DFFаaCÆOÓ¦Mqrr"##ƒåË—³iÓ¦ZKCUç%–Ê/33³Êå«S¾©©©<õÔSÌ™3‡yóæ1wî\:Tåùméúàv—ojj*SþŸ½3«ªhøïrÙWAQvQDQQMÃ¥Ôp#—ð3Bˬ\Ó,iOM³¯\R³pÉ%3×võSKS\sI%EEAÙL}»÷| 7‘åà.ó{žóÆÔÔ” 6°páB!Œ ô÷Ë/¿Â45õ¿Á£â§k3>ªiþ~ýú±aÃÍ1lØ0Ñ@ àB¿¾/8cÆ Zµjuß}×ÀÖÖ–… "IÉÉÉØÙÙ¡T*Y¹r%{÷î•UÆÛo¿——iii˜˜˜`nnÎO?ýÄ?ü€››³gÏ&77—±cÇâææÆÌ™3),,äÅ_ÄÁÁùóçSPP@bb"vvv˜™™±k×.¾ýöÛGB+*âÕ¼|\U%ß®™laÎyýU_efá®RqE©ÄF­ÆJ’XjjÂOFFÚþÀÊÌL %ÈP(pU«1”$–˜š°UF~g•ŠÕ™Yä+\Uêá¨Rc.IüldD¸©I¹óßÌÉE,05Õ©ŒBCCéß¿?7ndÛ¶m:“¯6\T*Æäåkþo$I´+.&G¡àÙFV´*V±$+‹l…‚àFV´).fQV6 YÉ’ß®]»ØµkS¦LaÅŠ,]º”ƒêT~GŽ!99ù¡ÞþðAå“ì+*"EOIÂR’øÎؘµ&ÆõSøQáÚ±ä›@Yÿ(ˆ;­àÜ!=ÌIM.±›ÌXØHè)áø6=.ÔÃÒVÂû)µ¦(c3hâ,Q”?ÎÓG­ý[§]§PðñÇÓ¢E °²²ÂÒÒ’uëÖ•ûNÞØ±céÑ£K–,áÏ?ÿdúôéÄÆÆâææFBBß~û-cÆŒÁÕÕ•éÓ§ËþNÔýLUñI}µÿQö¿^^^„„„àìì ÀôéÓ¹té’¬þÑß(•Ì;233qvvÆÀÀ€5kÖ°{÷îG*þ¬È¾ Ÿ|ò Í›7çÒ¥K˜ššâààÀÑ£Gùâ‹/´úú’_mÇG5Í¿sçNvîÜIß¾}yñŤßúôéÃèÑ£‰%++ €¨¨(ÍÛ›ÚìCŒ¿@ ‚GÍÓíiÓ¦áèèÈÔ©Sñññ!//¤¤$ÂÃÃÙ´i[·n¥wïÞôèуüü|œ±´´dëÖ­lÚ´ €>ø€víÚ‘@^^ŽŽŽ¬]»–C‡áããC¯^½°··`̘1ðÝwß‘’’Â{g§§'ñññâàà@dd$sçÎÕTxàÀ„„„ðÑG•ûHzMIKK#44Tó¿ŸŸ¯½ö-Z´•ßßß///¾ùæ|||ˆ‹‹ÃÎÎŽ¡C‡²ÿ~ìììˆŽŽæùçŸÇËË‹cÇŽáë닦œË—/3gÎ|}}yíµ×0ÕñIeXXX°|ùryë­·°µµeñâÅšo)•JÖ­[‡J¥ââÅ‹8::baaADD+V¬ÐIÿ´T©Y`jÊsùùø•Ik_\Œ»JÅCf›™ðeVãróØnhH¡¢êo^©€Ñ––ü'¿Ÿâ"$5ÜÐÓã¤A¹sM$‰¯3³°’$¦X˜sY©Ô¤Å*•„Y˜Ó£°÷rr1«àÁßEE<^TÄ>CCNü;4/+ïâb®(•ä*4W©øÒÔ„?d¾mÛ±cGú÷ï϶mÛª=¹¥M¾Ú¸¦T2üDîMÕj¾½Éu==F[Y"wž«à1 IDATàŸ6ÐçÕÜ<ºqÀЀî…EتÕÕ’ßâÅ‹yçw?~»Œ IÑ«ãÅÆ òF1&põ¬I‚„óz$œ/ñ+9 6Îú×–›{Jt{V…MÉíŒÌ46•ø 3+šRLÖ? ¶©DîÜÀ!CF’$ÒÒÒ(,,D­VóÎ;ïh½ÿjË`mmÍgŸ}FãÆ5«Ý¶oß.[?*CNüP—úÕºukZ´hÁ±cÇX¼x1³gÏ&44”={öPTTD£F˜?>±±±ìÚµ‹ÀÀ@Mþ¿þú‹ÐÐPT*;vì`Þ¼yœ:uŠ?üPv^}õUzöìYr¿Q©$‰¼¼<ÆŽÛàö¥->ÑEûåÄUùßçŸ^'uèÐCCC~ýõW6oÞ\çþ«>ô×ÅÅ…¯¿þšgžy†Î;W«ÒÒÒªŽoT*Þ|óM D‡P«Õ¤¤¤pöìY€z‰?Zÿ«²oœœœHKKcÑ¢Eèéé±xñbMû´ùº–Ÿ¶ñQjj*³fÍÂÍÍþù###ÌÍÍùã?Xµj•¬ñ•¶û‡ê²ÿJë¾oß>bccIJJ’mîîîôøK @ ÔÍ»¸¸8:v숫«+Ó¦M£¨¨ˆ9sæ €Z­¦iÓ¦XXXh ðõõÕ i×®vvvœ02?_c“)u<¿ÕÌUÂÄÎ+8ºUI£¦}^RQ˜?Íû×F-Kô~Q…±Ü¢$á\YߣЃ§_)F­‚ËåOnµnÝšàà`NŸ>ͼyó*<§ªû¯œüééé¼ýöÛXZZ²lÙ2zöìÉöíÛeëGeȉêR¿.\¸ÀôéÓ eõêÕäççÓ¨Q#ŠŠŠP©T´jÕŠY³fñóÏ?óý÷ß3jÔ¨2ùwìØÁŽ;°··çÓO?e÷îÝôéÓ‡Ç{Œ?þ˜[·nÉ®ËçŸÎ_ýUaZCÙ—¶øDí—ÿUåׯ_¹¹9óæÍCOO·ß~›„„„zñ_õ¡¿U½”¢­´ù÷»¯±wï^úôéÃðáÃyíµ×xÿý÷ë5þlý×fß………>|˜€€Fމ··7*•ŠÃ‡Ëòu-?mã£gžy777¾ûî;vìØÀÔ©Syê©§8vì˜ÖürÆor¨KÿµeËvìØƒƒ£GÆÓӓÇóÕW_iµGeü%@ *GóØðÌ™3èëë3uêT¶nÝJbb"'N$77—˜˜<==yùå—‰ŒŒ$$$„Ôw­Ì€’…„„ð /°mÛ6f̘Á'Ÿ|Rn  иqc äÍJ¥RIbb"ÉÉÉŒ?žžþyÆWæáš½½= ,àÃ?ÄÈÈH§Â?~< ,`Û¶m„††V8¹UÙõ###’·èsrr011áÉ'Ÿ$33“Ë—/cee@vv6!!!¼ùæ›èß™Ü(|$$$°`ÁÞÿ}.]ºD»víhݺu+BVVÅÅÅ4kÖ 33³JÏSÜ™¨066¦E‹šÕõÑ?1úJ¦Y˜³ÒÄ«;º÷¡¹9wk¡³JÍšÌLdect× TšI•l…‚Sú%+·,î¸fè)xÑÊ’.ÅÅü”q»Ìê#€ø;+™Æ[Z£¯Ä«¸˜öÅÅšô±¹yXÞÙ:1瞉·mF†ô±nDëFl66faV6K3³d·?>>^ó0§®¨L~¥¼˜—µZb™‰ ùwµÏZ*‘S¦ž}¬ñ’¥%¥kã«%Ùò+¥t2ïÊ•+²ê}ãÆ ÍEž¥[ß”úCCCÍùrüWff&o¼ñ;vdÅŠšr´Qº%—‡‡G;’kÚücmóׇýVÅñ;+)ŸÏÏ'K¡ÀT’PPH†BA¬¾²Î¯Ÿy³¤?;J(s[¤†»»ÉoˆŠA¯©8wH³ôËMntì¥ÆØNþ¦Gq¡üë'%%¡R©ðôôÄÍÍ­œ¿ÕvÿÕ–ÿ^ŠïØœòÎêT¹úQÚâ‡úЯK—.1{öl6lØ yˆ»`ÁÔj5NNN?~GGG^ýu:uê”L<—NœôêÕ‹>úˆI“&Ñ©S'¾ùæâââ2dˆÎêØPö¥->ÑEûåøÏªüoëÖ­Y¾|9Œ=Z3¹Uþ«¡õWNÿTu}…B­­-999š—`J¿ey¿ÄŸu%?möÝ­[7ºwïÎ/¿üÂâÅ‹=z4çÏŸgüøñš•CUùú’_e㣫W¯%º …sssÚ¶m‹Z­ÖØFUùåŒßJuçî6)•Êzé?¥R‰$Iܼy“3gÎh¶tqq‘eúøK @ Ôž2+¸155eóæÍÎÎÁ÷®­ó¾ÈÊà+KnèéñnN.ÞÅÅü­_²ÍÝÙ V?)‘0–À‰»‡æÎ*ãòòi]\Œ™$‘ª§G¸© ¿T0H¿®§ÇàFV¬¾É†Û™L77ã’RÉe¥w•Š]éd)œ60`Ž•Éw¶Ok©R1´ €‹Je¹ïz™HC ð-*ÆZ­&G¡àCC–›˜È–ÏÉ“'9xð Ç'--Móö±®ä[•üJyêΔƒ†e·v´¼3‰¥/IšYý;óZæ’š|…vù•2räHºvíÊ·ß~+û[-GŽ!!!^xo¾ùµZMrrr¹Xþù'&&& <˜5kÖpåÊÂÃÃÉÎΖå¿Jmýå—_fþüù,Y²„ pòäÉ*ëwüøq>üðCÆÇÚµk+ÜÖ°*û“ãk›¿.ý«6®ëéÜÈŠ×srù5ã6…ÀN#CVš˜PïNçe•|+ë±*†N+F’àâ_zœÞ]¢›f …WIM:÷Sӹ߿w.S’ž|g…bÇ’ßÎUoÉYVV£Fâé§ŸæÕW_ÅÎÎN³ÍØ‚ ´Þµå×¶G®~T†¶ø¡>ôkâĉ´oßžØØXæÌ™Sfb"""‚ˆˆÍÿ£F"00;wÍk¯½†……¯¾ú*«V­bòäɤ§§óÙgŸé¬Ž e_Úâ“Ú¶_nüW™ÿ½yó&ï¾û. …‚æÍ›³nÝ: dÒaúôéuî¿êCÃÂÂ4/€f%üÔ©Sµö¶ë;88JË–-155åæÍ›|ûí·üöÛo÷MüYWú¯Í¾¡d÷áÇӿÔj5gΜaòäÉš£*ÿQ_ò«l|ÉØ±cy饗X½zµF?6oÞŒJ¥Òš_Ûý£”ÇcnnNPPk×®%11‘E‹iÚPWýçææÆÈ‘#qrrB’$M½8 Ë= ã/@ @P;4»ƒõîÝ[HCP僉uëÖqëÖ-&Mš$Rá™Y¸«TŒµ´(óÝ.]ãááAXXúúúLŸ>]3ùú ãïïϤI“HIIaΜ9²'·DJ·(¼ûY‚ÚcjjÊÊ•+IIIaêÔ©B @ @ ÁÀž={j”OLp @ @ @ „šNpéÝo ™2e K—.ÅÑѱÊóÚ´iÆ xóÍ7’½ö7lØ 9J?0,x¸P*•899ahhø@ÖßÈȈW^y…eË–±víZ.\H÷îÝ«­ÿ+ÚÚÿ ÷¿@ @ @ tƒ¾ÜûöíK‡P*•x{{“ŸŸÏßÿ Ào¿ýÆ­[·˜?>¹¹¹\¹r{{{lllHMMeÚ´išÚkãÈ‘#$''W{{²;w²sçNúöíË‹/¾Ø Â|ûí·ñòò"-- ÌÍÍùé§Ÿ4L~йÚ7cÆ ZµjÅÔ©SIII©“kŒ;–=z°dÉþüóO1b„æKKKÜÝÝÉÍÍeܸq²õ{Ö¬Y8;;Æõë×u¦ÿºÀËË‹œ˜>}:—.]ª×:hk]öŸ>}=z4±±±deeUã·@ @ @Pwh&¸,,,X¾|9‰‰‰¼õÖ[ØÚÚ²xñbÍ7b~ÿýw~ÿýwÍyééé,X°@SƒƒW¯^eΜ9@Éj ___:uêĉ'ª¬ˆ½zõÂÖÖŠ‹‹ùñÇ5é&&&|õÕWsíÚ5lllªÝØ÷Þ{OOOâãã144ÄÁÁÈÈHæÎ«9gàÀ„„„ðÑG•ûseøûûãååÅ7ß|ƒqqqØÙÙ1tèPöïß/ëCÅ|ðíÚµ#!!¼¼<Y»v-‡ÂØØ˜¯¿þšììlÆÀŠ+ÐÓÓãÕW_E¡P°nÝ:T*ñññØÛÛcjjÊúõëùßÿþw_´O›ü«j©~ØÛÛ0fÌ øî»ï4“5m@£F˜?>±±±ìÚµ‹ÀÀ@MÚõë×5úÞ¤I.\Hrr2o¾ùf™ÀËÑo€ÐÐPͤØÒ¥Kñðð¨RÿK¿VWý àââÂ×_Í3Ï›7o&$$„rëÖ-ÌÍÍùöÛoQ«Õ(•Jn߾͇~ˆ¥¥%Ë–-£W¯^e&@ª}rä_UûKõcÖ¬Y´jÕŠU«VU¸‚§¦íkÕª³fÍâçŸæûï¿gÔ¨Qž§§§ÇìÙ³Q©T¼û&·î®ÿ‚ °··gùòådddÈÖÿRꪶmÛVc»‹‹£cÇŽ¸ºº2mÚ4ŠŠŠ4ݱ±±¨Õjš6mŠ………&Ÿ¯¯/›6mÒÚþºî€-[¶°cÇ=z4žžž>|˜¯¾úJÜ)@ @ à>C3Á•••Eqq1Íš5ÃÌ̬Æž?žÙ³g×8éÖ`7ÀÐТ¢"nܸ”<ÿã?*ÍŸ““€µµ5P²òE¥R‘˜˜@rr2}ô·oßF¡P`aaAff¦&¿½½=Ó¦M###ƒ¹sçjV‰h#22’Q£F1dÈfΜ‰……O>ù$™™™šÉ3mìÙ³‡o¾ù€-Z0gÎâããyï½÷€’‡÷]ºt!$$„ŒŒ ’’’صkW…e•®*øjèöÉ‘¿¶öjô#%%Ôj5*•ªVísrrâøñã8::òúë¯Ó¼ys äÛnYYYDGGŒ••«V­’]¶.ô¿®û·¶œ9s†àà`¦NÊÖ­[éС'N$77—˜˜<==yùå—9xð K—.JV^ÉméDb]õ¿R©D’$nÞ¼ÉÍ›7ÉÏÏÇÓÓq—@ @ ‚û2+¸&OžÌ¸qãG¥R‘””Dddd½VèÏ?ÿÄÄÄ„Áƒ³fÍ®\¹Bxx8GŽ!!!^xo¾ùµZMrrr¹-È>Œ¹¹9AAA¬]»–ÄÄD-ZÄ©S§xùå—:t(3gÎÄÆÆ†ììl:ÄÆ5ù•J%FFF˜˜˜ P(d×;99™qãÆ1fÌV®\IQQlܸQÖ*cccéÔ©VVVäæærèÐ!Ö¯__æ¼O>ù„ððp5j¤Y!Sª}Úä/·ý‹-bâĉ„……¡P(HJJbÙ²e\½zµV틈ˆ ""Bóÿ¨Q£ dçΚÉ-€nݺpüøñzÕÿôôô:í_€°°0:uê¤ùÖ¬Y²¾wGbb"¦¦¦lÞ¼™ƒ2oÞtèPœ177ÇÀÀ€#GŽœœ,ä#ÒEºHé"]¤‹t‘.ÒEºH Òõôô4[ ß$Iܾ}»Öå+ ôõ+Þ¿¨¨CCCÜÜÜ*¼~LLL­Ók[Í7®ï-ÿÚµkZå§-¿6jÛ?jµšüüü Ë655Õš~÷.e^(¸¸¸Ô:mÓÕju™]`îN·²²ªuþÚ–_×éÚô_[~mÔµüºÿë:]›ÿkèúÕ‡~4¤hètmþ¹>ì£.å_÷—ûÙ¿Ôµ|tÿÑÐ÷×Úêg]ëwmãϺöïP²»[­&¸ªÂÉɉððp1(@ • IÿüóJ¥R³eº.Q©T|õÕWX[[3räÈz¯¿$I$$$```€½½}¯“••Uá¶ózzzUY¿ª®_ZÿÊÊW*•Œ=š¢¢"’’’ªÝ~…B³³s¥ùKÓkÚ’$qúôé*ÛúôéJëW*¿üü|Î;Waý:uêDzz:ëÖ­«vþÒë7iÒ„É“'WÚ>•JUá¥åWÖ?¹¹¹Zå«§§‡±±q…é7&//“'OêÜ>ôõõùôÓO+•_©~j£*û©ê–¶òµégmÑÓÓcĈÓ®]»Jû_ÛõMLLèܹs¥öWXXXågª²9ò¯)¬_¿žÔÔTæÎ[ï×—Û¿fffšg*²¿äädÍn-÷–ߦM­ò¯J?z÷îMNN‡®q;+ÓµZÍ‘#G´Ê§2ÿ Í¿ÈiŸ¿¿ýK©ýdffÖø»árpttdáÂ…Úçš5k*ímý/÷þW™ü%I*·ƒOMôÛÐЖ-[VÚ¿5íÿÒöWæKí§2ÿ¯ û®êú¥ò©ìþª+ùVæ?Ôju•õ¥ß u•럵éeú««tmúUYüV\\̬Y³°°°à©§žª4þ«ÿ^ÙžV{ï»ví"55•ÔÔT.]º$F©@ @ @ ‚û ½Š~üðÃiÚ´)­Zµ@ @ @ ÜWè @ @ @ $Ä—@ @ @ àBLp @ @ @ (Ä—@ @ @ à¢Â .sssš6mJ“&M„„@ @ @ ÷ú÷þXî$I’ÈÏÏ/÷{QQÏ?ÿ<ŽŽŽ,\¸P¤‹t‘.ÒEºHé"]¤‹t‘.Òéô—^z©NËß³gŽŽŽ7Hý'MšTëöYYYñÌ3Ï”KW©TÕêú/½ôæææôèÑ£\zaa!AAA4mÚ”wÞy§Âü3gά2][~mõ×Ö3gΤqãÆŒ;¶\zqq1[·nÕ*¿ªòajjН¯o¥ò­ªüÈÈH+}>°gÏŒŒŒhÓ¦M…ן9sf¥éjµšØØX FFF•¦W•Ïž=•æ—$‰‚‚‚§—ÊÇÐЗJŸ›h+_­V£V«+LŒŒ¬qùÚäWÛö«T*V¯^]¥þ˹¾žž*•ªÂúGFFÖJ~rä_ÓôRÿQÛþ¯iºÜþÕ×ׯP¾………¼ôÒKU–/GþUéÇÖ­[kÝþªôCŽþ×Ô¿Èi_müK©ýÔ•~”¦çççW꟫êmý¯ ÿ¬ ÿ%IR…ö_Ûþ/meö­R©˜;wnÚ·6ÿ_ÕýUWò­Ì¨Tª*˯/ýn¨û«\ÿ¬­ªÒ_]¤kÓ¯ªâ·ÈÈH7nL@@@¥ñg]û÷Ú"‰CK–,‘V¯^-dqÏáää$>}ZZ±bE¹4GGG©G5.»¦ùÝÝÝ¥ÔÔTÍáíí]ã:¬_¿^ »ïä%…††6Øõ­­­¥S§NI[¶l‘ …-ûöõˆÙWmõïQ®Cë×ýrL›6M:sæŒtíÚ5iÿþýRÏž=uê_Ä!âcqˆã^ýÔ•ÿ­*>{â—šÄgÚü÷ýäßÖø³¡ãG]è߃_Öõý5,,L:{ö¬dkk+âÏ:Я†Ò?¹þ±6ý/ìOâx´ñ .  8ÇÄ«¯¾Z.=$$„wß}·Æå×4ÿÅ‹iÚ´)¢“êˆôôt|||øù矉‹‹ÃÞÞ^EؗಯÚ꟨ÿ£Í믿N¿~ýèØ±#...ôèуˆˆá_ÁŸ=ªhóß¿‹øQÄgµgéÒ¥“––Ö`ñÛÉ“'ILL¤[·n~5”þÉõuÝÿÂþ‚‡‡2\QQQÌ;—€€&MšDbb"cƌѤ2„„„ž{î9üýý Àßß_“¾zõjŽ;ÆÀ=z4ñññe¶FXµj'OždÈ!ôìÙ“íÛ·³zõjÙå¯ZµŠ}ûöѧOz÷îÍÑ£GùôÓO5é+W®dÛ¶m<ñÄøøø0|øpe§?êüøã:tˆAƒRnYbUý;{ölÍ6¶¶¶XYY°oß> ¤Ñ¯ùóçÀ¸qãHNNÖ¤=±|ùrBCCIHH(—îáá­­-ÆÆÆxxxàááA‹-dÛ‡¶üvvvâããóÏ>ËåË—+Üz¤¡Ðæ?´Ù¯Üö°~ýzvíÚ…¹¹y½·sãÆ|ùå—,[¶L§å^ºt©Œ=,Y²¤ŒÔ&ßa_¾jc_ÚîïÚä£íþ¤M´QÛøfÅŠœ9s†#FÀO?ýTÆ?h£ªú?ûì³;v N:ÅW_}ÅàÁƒ¹~ý:ÖÖÖ²ìKÏ=÷ `Ô¨QÄÅÅ&»ÿöîÝ[æü·Þz‹]»véLþo¼ñ‰‰‰Ìœ9“'Ÿ|’¾}û2`Àš4iBrr2O<ñ„æü‰'rêÔ©jÉßÁÁ¥R©‘¿“““ìüÚìW[|-âߺë:¾mèø@›þhóÚê_û”ã?k‹¶úÕÖ?k“¯6ýÒ¦ŸÚüomã³ÚÞßtákÓ¾ÚúßÚ¢Í~´é]¢m|/'~ЦºŠ?k?ÖÖ~µéŸ¶øE[|YÛç_u‰.⣪ü—¡¡!´oßžàíí]mÿY[ýzÿý÷0`]ºtÁËË‹uëÖñôÓOß7ñ‰6ûÒ¦_µßh£6þKNÿ7ôøN ÜTº„×××WJMM•lll$@2dˆtéÒ¥ —‚J7nÜôôô4¿uíÚU“ÿé§Ÿ–’’’$¥RYéäªÊ ’RSS¥ÄÄÄ2Gjjªdff&’ŸŸŸtñâE騱cÒĉ% ‹2ehK”~ýúI7nÜ E…ý£­û÷ï/8p@255•âãã¥HFFFRJJŠdmm]¡~}òÉ'Ò† uéÒEJM|I˜ IDATM­rûƒ°°0i×®]Õ¶mùÉÕÕUúöÛo¥óçÏKgÏž•Î;'mÞ¼¹Ì9666 ¶…ZUþCŽýjk_TT”téÒ%éüùó n»Rbb¢N˼té’4hÐ Ù[ÌÜëŸôCØ—°¯ÚØWU÷w9ò‘sªJéàÁƒšm6æÍ›W&­6ñMß¾}¥¤¤$I___“gáÂ…ÕÞ"­²ú?ûì³ÒîÝ»%@Z±b…ôî»ïJ€/uîÜY¶}UGKí½I“&²â³.]ºHÉÉÉ’­­­¤¯¯/]¹rEêÙ³§ì¶W%ÿ:H©©©R›6m*Í?yòdéøñã 5kÖLJNN–|||t"9þ¥*û•_‹ø·îâãúˆo:>¨Jäømõ¯}Êñïµ=ªªŸ.ü³6û¬J¿j¢Ÿ÷úßÚÆgµ¹¿éÂÿÖ¶}Úâ3]ć•¥k³9ò©ËøSÛø^[ü M?tV7~”k¿UÅwÚôONüRY| ‹ç_u}Ô&>’ã¿´Ù—ÿYSýjܸ±4a„2¿™››K“&M’ î‹E›}ɉ?µ¥×ôë¿jê?ëk|'qˆãÁ9ô«šùêÔ©éééܺuKë,YLL úúútîÜ™'NàççGjj*·nÝ"%%¥RIÛ¶m‰ŽŽ®ö,\dd$’$ñ /ðÇTxΟþ‰»»;úúú¬_¿žüü|^xáYé2ÿý7úúú<ñÄuIuÆ÷µÙºRWñguãG¹ö[øî^ý“¿TŸéâùW]S›øH®ÿÊÎÎÀ¢Fí¯©~ýóÏ?„‡‡—«Ë—_~ù@Å1Úâ9ãƒºŠ¯åøÏÊú¿¾ÆwàÁ¡Ü7¸^xáÎ;§Ùø]»v² ŠÇÕÕ•‘#GÏùóçQ©Txzzj··7ï¿ÿ>—/_æÄ‰øùù¡R©d•íÚ5œñóóãìÙ³$&&râÄ ‚ƒƒ5çÌ;—3gÎpýúuΜ9í[·xýõ×e§?Ê\»væÍ›3`À.^¼HBB~~~œ€óçÏÓ¶m[._¾Ìµk×*틺"00)S¦0nÜ8–ûôÓOÓ¢E ®^½ÊÕ«WyüñÇ9}ú´Nü³°/a_»}Uu—?È¡2ýÑÅý·ªú]¾|™Ö­[óú믓 ‰ŸªKMë/×¾ªâСC¼ýöÛ\¿~ÈÈH²²²Êä—Ÿ}þùç$&&2eÊ&L˜ 3ËÍÍ¥yóæddd°oß>®^½ÊÅ‹ËÉgÈ! >œ‹/òÅ_è\÷+ó/ÚìWN|-âߺ‹ëƒ†ŽªÒ9þANýkjŸºòï5Eþ¹6ö)G?µù_]Äg5½¿éÂÿÖ¶}U¡«ø°²tmö#W>uE}ŽïkÖ$~Ô…ýÊÑ?mñKeñ™.žÕ5äÞ_ 6lóçÏ'11‘ü±ÚíoèñMC¢-þ¯«ñ\ÿ¥ÍVÖÿ÷ûøN 4 •.±Öõñâ‹/J}úô‘ºuë&M:UJII‘ºwï.–Ò‰ã:œœœ¤Ó§OKk×®}(Û§«-Ô¶ÃÂÂB:tèôóÏ?W¹^]»|…} ûjHûzÐŽŠ¶pyXÉÛÛ[zþù祸¸8ÉÃÃC耈¯ÅñÆÂ?‹øì~ŒÏDû®øQ—ö+âqˆCâ‡8êïPÜùƒžÇ{Š©¾‡˜ˆ®B@ @ @  ô„÷ ~ÿóÃþ{•ç½Ì·)n:¯§±½1~Ûüh7§ÝC)¿ ;àúŠ«Ð{0°4àñ­ÓqIGô <×¹·ožmÞBgå}Ó­;aí;꼞&¦üѧ?ó;û>”~.Ü·Û´CP+CCöôéÇ×~O` ÷ð‡&¿üò 3gÎ/oîÆ!g16¶¨&ƒGáæª³ò| «°´t'$$UsØØx×y{âú¦¦ŽØÙõ¸oë?sæLnܸA³f̈́ jÄúõë í蔨¨(BCCEû„~ jHXXgÏžÅÖ¶âø×ÑÑ‘=z<´íØÛ'è’2O‘òoäs~ÆyöûígÿãûË·$ŽÃ½“öG‰‰ð m_šìtmT•?öÓX’w$“¸)‘¸%q\øäWW]½¨#œF8á8Ük_kZŒoAÏã=±ò²Ò¤[zZ–9:.îH—u]P(²Êw{Ín{ºaû”-NÏ9ÑóXOl{É{PcêjJÏã=±îj…‡./ºÐãhš>Ý´ÂóíúÛaÖÒŒËK.ëTF¶OÚòØæÇ8ýêiνNv>…ž‚Ç6=†ë+®XûZÓrbKM{äÊ×ë+/|Vû`ÝÕÇgé~¸;Mz6©ùÕD?Œš•üæm…yksÌ[›cÔÌHvùµÉ_úQ”YÄÑ £¤þžÊûžÀÈÖH·ögjƧ>qfÐPÎ Z£2fywfû“}yÑÍ?Û¦ØÊ«c s þ†ŸmSÚ7²æ÷6œ4”þŽÎžÿŒssZYXòù¹³:•A{G¶=Ù—Q‡#˜vò˜pÊ· é½{';®'r¬ÍŒM¸6,\¸#GŽ0aºwïNãÆ+®¬}rèܹs™cÓ¦MüñÇebîÚøÚÞ´é¯@P]ÊLpÛÓö£¶tø¼C¹sârHX—€Ï’~I¢àfzóQŒ¬tmh˯ÐWPœYLqV1 =§Æœ¢q·Æ4Ó\ô¢ŽHÜ”Èõ-×Éø+ƒœË9¨òTÝ.úw©9šiNqN1ü I%i-ÛÌÍ ç‘Μ} ûÁö51"fv 3Êhú :,ì€Ï”¦Ê2i¹ñ¹d_Ê&çbIý ’ Ê+µ¡îo»saÎ$õ¿ukÿßötZщFaÙÞ»þvÕš€Ñ3Ô£ÝÇíˆ~#šü¤üjÉVRKœq‚ø¯ãI?–Nü×ñeaÐÈ@–|M››bý˜5çgœ'ýx:׸ΥÏ/Ñjj+˯¦úaâdBqV1Éä\Ê!;6›‚ùåËÍßÐú‘¼-™„u ´ý¸­Níïznïœ:Á„c‡k”K÷'ñ²¶ÁÂÀ€—ÝÛÐËάâ¢rçéëéîÛM½0»'¸¹œÅ…ÌÛ\ȼM®ª˜y¹åòé)ù°£73"O¡’þ•ßç]|Y÷Dº6±¥ƒµ Ï87ÇÎDþ$…‘ž’ù»2áØa®çæ ‡üˆòóµxÖ\Šenç®T½wïÞM—.]°´´dòäÉ’••U^ÏŒ˜;w.S§NE¥RU;CàááÁĉ $44;;;¦L™Â’%KÄõe’@dd$ÙÙÙ¤¦¦É­[·4ƒÇ½{÷Ò³gOžþy~ÿýw¾ûî;&MšTrÏÒ3¤Q#5jOÿþ*\áâéù#F$Ò©ÓLìíŸÄѱ/ÎÎÿ0'L˜@zz:NNNøûû“——G»vÿ®$ XÍ AÇpvˆ»ûh†ÇÃc¬&}ðà({l.ÍšЮÝ$FŒH¤uë1´ný2ææÍÙ±£ׯÿF\Üzþ÷¿Úµ›¬™Ä24´$;ûII{IN>@tôþùç”lù=ñÄ*úõÛ‡ƒCz3hÐQºtù´Ì9EEY¤§GkŽÌÌKeÒ›5óÇÞ¾'mÛNà¹ç’prê'ûúO>ù#ÂÅenn!ØÙT/¾NLdùòå<ùä“ÛöÙgëíúƒGѵë|š5 ÀÃcÏ=—Œ‹Ë Ùù5òÀØØ¥ÒøŽ.z`aÑB–~è¢þÍ›á?ÿI eËçhÚÔ;»š6õ¿£[†xzzâååÅÙ³géÒ¥ËCåvÿ*×N˜0¡ÒU"®®®Ü¾}›ëׯsþüy¢££¹~ýz™6FEEqäÈvìØALL æææ:«ßŠ+Xµj‡&&&†ÜÜ\222dÉWŽüŒŒ8zô(±±± <¸ÞûO›üµÅ/Uõœúk»~]ÒªU+?~<`Íš5|ðÁ|üñÇÕÖ/Ö¯_Ï®]»Ê¥_ºt‰sçÎñ÷ß“““CBBB½õ_Uõ¯Ž~5Tûu´ù¿ÚÚo}P™~âááAûöí9pàÞÞÞ꯭­-ÆÆÆxxxàááA‹%ñIzz:ÑÑÑDGG“““ÃÍ›75ÿ”<#Z½z5ÇŽcàÀŒ=šøøxÆŽý7þ2d <÷Üsøûû€¿¿¿ìôU«V±oß>úôéCïÞ½9zô(Ÿ~úoüÅüùó `ܸq$''3hÐ Yí“ÃÉ“'5Ço¼AVVO=õÅÅŵöº¸ÿhÓ_ º”}ºYÅBœÂ[…%ަ‰!m?n‹ž¡·OßF•«B] Öš®gTõ–CÚò»Os@•«âøŽã:Æ•ËK.“ôKí?m¯µ|L…0ÓǤ¹ &&(ôXv°$7¾ìÃf·Én66ä䨓²Ë5´1,éç›…œÿà<êB5V¬Pš*Ñ3ÒC] .){Š-'´äØÐcç”w¼¦ÍM1hd€¾•>ê|5Mz5áö™ÛeÎqs'㯠nî¿Yæ÷ë[®ã9ß“6ïµáÆ/7Hú)©ÂkT†ysú nGÝ®•Œ]F¹àü|Éd_^B^¹ôŠä›{5—3SÎà³Ê«’I±âìbÝhòê@~5ÕŒSzê }6þ6´ý¨-×¾½Æµµ×d•-'ÿý¢'3pé¬SÛ“j‘×ÉÔŒö¬¸÷w®d—¥/»·aû“}yzÏ.ÍyÓÚu`JÛöôÛóÙL~µ0³ÀÚЈF†ä«Tô±w$òÖ?eÎy¯ƒÇÒÒø#ùF™ß7\‰ãË®þ|äåÃ÷W¯°%þJ…רŒ¶VÐ×ÓãÔ=×yòd>Ìc=VæÜÿþ÷¿qâ{÷îeïÞ½´hтѣGóÃ?ÔÛõÿù'RÓææ.´lù×®m“ŸeÄŸŸ†J•_iŸU¦¶¶¾:©¿Z]ÀåËË ‰ŽŽ¦I“&¥ÿyØý»¬øXª:B>räîîîðÔSOñå—_òå—_òÅ_0{ölf̘Á+¯¼BïÞ½ñòòbáÂ…:­£……­ZµÂÅÅ}}}:wîLll¬VùjK·²²âàÁƒtïÞääär6ë£ÿª’¿œø¥ªþ‘Smý_×ÞGŒÁÎ;±¶.Ùu%33³ÌJ9ú5sæLÞÿ}ºvíZáä››666X[[“——Ç€8qâD½ØOUõ—«_ Ù¾Gmþ¯¶ö[T¦………ÄÄÄ”Ùñà^bbbHKK#??Ÿ˜˜˜j]700ÀÀ@œœœP«Kâß¿ÿþ›íÛ·óý÷ßk^D+((`ãÆ•–SYzPPƒ ¢°°5kþ__zé%fÏžMNNIüÉÁƒ9xð ...<÷ÜslÛ¶­Öí»×5mÚ”>}úèÌèâþ£M‚ê"{V¨Q§Fè›é“²3+”&JRv¥`ÝÅ=#=­éw“¸)‘›7«U>”¬Î81â]7w%Ỽ—ycÑÞ‚ÄM‰¢'uDqN1Y粸ºæ*×7_ÇqXÙ%¢f-Ìpuæü‡ç+Œp*·u^Æé ŠsŠiÖ¯E·‹På©hØŒô¿Ò5“[q‹ãˆœ‰ïO¾šIͻɽšKvl6);R¸²ü výíʤ[v°Änæ”È“qºd娰c$nH¤ÝÛá9ÏS¶l²/d#KXy[ÕlðÓւ“ùw&‡Ÿ>\áäVUò½õç-÷=L„oÑoG£o®_®µ•_mõ@*–øçÐ?$ýšTá”é‡Üü÷‹~Xy[‘Ù 6:²e+zÛ;”ùíznÙÅEôhöo{M•úäÞóvÎüsgsä ;{?ÍûÊ¿u%'‹˜ÛlM¼Æ’˜s9»”I÷¶nÌPW¦G•ŸÜþ럛<¾s+ýþøµqù¼‹/_tõ“Ý®ó·3(V«élÓD8âGŸÆMˆJp&:ÈÊÊ¢oß¾ÿúr33ÍÀ¥”.]ºRnë¹ùŠ£G’••Epp0éééäææ2lØ0hupp **Š—_~™M›6ƒ©©iɽ/#…BŸÆ;kÎoÚÔüüTÍäÖ½4n܉‚‚t n‘°Æ}°²úwRºU«PŠŠrHJÚ{÷Ý7ö°gOÿý=z¬ >>OÏï·ÞÞÞ¤¤¤ŸŸÏ­[‘€Ä/°i““æØ°¡©fr«D>eWpÝ=¹u/juzz²ú'#ão }ì잨:>*.yÙG_ßTk™jµ¥RÙ`×—$5 …²ZzZT”¥¬sïÖº¨Edf–Äd–––•ÿyØý«.)**â÷ßgÆ š-’Z·nÍÚµk0`_ý5ÿùϘ2e «W¯Öéµ³²²8}ú4‹-båÊ•¼øâ‹²ä«-½  €`aa»»;Í›—ì\ãêꊉ‰Iƒ÷_uâ—ŠúçAп½{÷âááA³fÍ=z4–––š8N®~Íœ9“¡C‡rüøqþûßÿ–»F\\ÑÑÑ|ÿý÷|öÙgüç?ÿ©—¶i«¿Üþ¹_Û÷(Q‘}éÒ~ëmú‘]ÿZXXTüŒ.;»F÷þ˜˜Í ¥øùù‘ššª™Üª ‘‘‘H’Ä /¼€“““æhÚ´i¥2®(>¬iûJiÓ¦ &L`üøñ•žóꫯ–ÙzU×ñƒ¶òk¢¿AE”™yJÞžLD×ÎL9ƒ¤–ˆèÁ_Ïÿ”l æÿ›?Yç³8Øó Gž>‚yks¼Â½d¥k0YÅ\ÿþ:I¿–ÝÃS[þ›7‰™Ãã¿>ŽÒTI«i­8÷Á92£2q ûtÖ…ž‚vŸ´Ãÿ7züÙƒÇ}œ¢ô"N½Tv ™¦O7%ë|¹W+ÞBLßBÇ`G쟱/;˜.–8òô,ÚZ€ÿoþdÇf5!ª\9—r4@ÝvÇÄÙ¤d•`z!~ÛüJê·õqÌÜÌ8:øh™¼zp%üJ¹•M­ßnßÿüèq¤~;ü(º]Ä…ÙdËH]¨æÜ‡çè°°&ÎÕÿ>LûÏÚ£g¨‡÷RozïIÏã=é¶»›lù–öO‡Ï; IDøFp;ò¶NåWýhó^üwøÓýPwº~ß•¢ÌòúS™~ÈÍ?èG“îMpyÑ¥ÊIÞš0ع9 cùãO T(ø;h?õì]æ BZ¸1Ì¥ìœÐó·´¶´âxÿg8Ú/ ‰!{Ê]'6ó6»¶s5'›“ÓÜÌœ•Š[üѧ?g eOŸ~¸[XÒw÷®2y?îÔ™Eçÿ柂ò[?~رûú jà"ú £°#å¯ò,P«xëÔ –>ÞæfæÂ)?¢ô²³ç÷6¼uòøSgI’èСmÛ¶åòåË\¼xµZMÏž=Ëœ·xñbæÌ™Sny¹ùrÐܶm[¼¼¼¸rå çÎ#::šaƉëËdåÊ•H’D=xûí·‘$‰—_~Y“îææÆ/¿üBTT¤¤¤ðÝwßi&¡J½…ìÝ;Œ®]ç3bD"O>ùcI\]œËæÍÍ)(È _¿} ~•gŸ½H¯^›’ïY]¸p:°~ýzÞzë->øàÒÒÒppp ;;ž-[\iÕj$ÇÇ3lØy$IÅO?•}ÁÃÝý†=Gpp¦¦öüôSɇ·nEñÓOíéØñ†¿Ê°a07wå‡Z£R §gÈc}Æ3ÏœdĈë ;w>”Lp¹¹¹ñßÿþ—[·nqýúuÚ¶mK«V­î 쯱i“3M›ú1dÈYFŒH$(è-Z—©Ÿ“S !!©eKK÷Z÷vö5¶liŽ“Óž}ö"ÿùOM›úqófÙû›J•Ïþý¡øù-¹Ó??èDÿúúÿ>ZÆ» Ž#88N£_Úô£¾ê_XXHïÞ½Y¾|9ùùùìÙ³ç¡ð?»•È#HMMeÓ¦M(•JRSSÙ·oŸ&}Á‚œ={–ÄÄDŽ9BzzºæAZll,½{÷æÛo¿%11‘˜˜ „ŸŸŸNê¦T*ùúë¯9wî7nÜàäɓܼySs}mòÕ–ž‘‘ÁÅ‹5ÇÕ«W5~3//¯^ú¯*ùˉ_ªê9õ×ÖÿuMiÿ~÷ÝwÒ¬Y3Ž=Zmý:þ¼FN×®]£eË–äååqóæMNŸ>Í78uêe¸×eÿi«uô«¡Ú÷¨S•}éÂ~ë¹úQXXȰaØ?>‰‰‰üøãeÒ—-[ÆîÝ»‰‹‹#..ŽÍ›7˺~||<®®®Œ9’øøxΟ?J¥*óÂUm¸víÎÎÎøùùiúèĉW«œš¶¯”!C†©Y¥w/VVVŒ3¦Âm«Ò¹þ¡ªòµé¯@Píy;ÏFéy¼§ÆCLD׈‡¾Î#±ÆžãÏÖíƒQc{c:­èDVLÑaÑ;,ì@Ö¹,⿎úqúfúø¬ñ¡ðŸBÎL>ƒºHýHù—Zµf˜K ìý­N¯ã`bʺ'zò÷ít&ÿó¡“c¸o7þÎHç« çÄé.Ìõ ØЋ òyåè!ŠÔ—}Mœ8‘ÐÐP=Tê“Áƒ£8{vqqß a„~JÖ¯_Odd$óæÍí„~ àCLp="< \@ @ @  ô„÷ ~ÿó«p뺚â½Ì·)n:¯§±½1~Ûüh7§ÝCÙvÀõW¡÷``iÀã[§ã’ŽèçJxZ8¶m;õo?ųþf\ÙtE«r°kÃðÝÃ9÷Â9²ßP½bÌØÑï¿yþK8ái:wM¸r A_áò” ÖAÖXßúHú¨C£¾k8Ð~^è±Pü7ùÿ!ùýœãœqzÒ ëÖô{±§"èåßKéndkÔþ[@/̘c>À#;#­Èç^èGKM iÓÒþ$etòhŒlŒ´ª[ÛBBÙ:†`[âÝ=Ș:ƒHGÍåojƺ¡Ãù5z&¿FÏìVÚýÌ-¸0-†`[|¬¬Yè5óÑ3™âäÒ©ÿ'\Üð´°äÝìóZ•Áx'¾;gNá¯gO ïcDus3‘÷³¯XÂÉ)Ó°36Ñjü®®®lÙ²…k×®QRRrG‹-"33©TŠ££c·Ã<ù䓈D"Ö¬Y£üÍÑÑ©Tʈ#ðõõÅ××'§[ß]µj999L›6E‹QVVö@}d÷~çïaOßÅÅ…€€Îœ9Cbb"ôîÝ[é>fÌZZZعs'&L`îܹlÞ¼Y%±ø}’“cij*àÚodäÿ˜2å(NNñðxŠØØ+¬Tºÿ‡èè_pvžŒ½}¾¾ÿGŸ>Cöo„µµµ¡¯¯¯ôó7cccÒ \Ǹqß`mí«|,-=ïIÙkjrùüs[öìÝÙß«ô=<æàïÿÚ›ÿ»Ù>ôþùA/Ÿ:ûù /°`ÁÂÃÃyýõבJ¥ilŸÕ…Wg{‚žž)))¬X±‚ððpV®\‰T*%,,Lãüw%mÄ/ÆO7n$55•„„ÂÂÂèÓ§ÆùKLLdÿþý„„„0uêT²³³Y¾|¹Ò}Ïž=8p€°°0æÍ›‡D"Ñê7ZÔ¥¯®}ôD¿¼¼¼”õéïïϲeË(--eæÌ™Ý.ÇäÛùuGÿîvùþ8]µÏûiß4Õ÷ßŸØØØß0¾Éœ9sxíµŽãkkke›M6l˜Ê“””ÄÏ?ÿ¬2æîIÿßSý¹›öYàñDeƒËØ¡}Ùï]¿ëóê)ú¬ˆ¡Û‡Ròm ² ¢7Eˆÿ&ÖÈ]êÂëèëÐZÓJkm+:º:¤/H§Ï¨>¸-pjñЦhãtÜi ¶Py²’‚­´Ô´``ukƒÅÌÌڋµT¥WQq¤‚†+ è™éÝR6C]FìAC~‹3î˜–Ž¾~ýº}(z¦z*n  Ô]®£>·y£Y‰¬£RêâõŠ9oçЦhSþî³Ö‡! Áj˜–>–ØO±WÙ`QÛX uôÖ ²–gÑTÒÔÁ½©¤}ƒøüòÎýÕ¹«5PŸÃÒ×}s}\Ÿu¥oX_äurLœMh­m¥âHŽ1Žx¼äÁå —1ó2ë¶üþ(’$ Å_Su¦Šú+íñ·T·(ÝoæQV*£þr=u—ê•ɺ-Ÿû­¥ß—RôYÞoykMvýÌ-Ù×–WÒOóK¹”]y¬ËÊä_ã(n¨çÕôÓ$œ<Ñ¥?}]]¶ŒERèÌ~7¸¹RWKNM595Õ4È[¹ÖØÐ!¼‘®o`UF:ò¶[ò{7pŸ'¨¯ ~Ö½yÂÅ {Í7)ŒtõØ0,ˆ„“'(nh:ÝÇ”o®°ýò%Ö Òj¼EEE$$$Üñ-S###ÒÒÒ¸téÓ§OïvøÛãY¿~=/½ôr¹\ù»»»;ÕÕÕsñâE²²²(..@$±dÉ&MšÄܹs±··gÙ²elڴ験û¿G!ý¢¢"222¨««C*•’‘‘Á7”“ÇÇÁSO=ÅO?ýÄŽ;øÓŸþÔn³t ±²aeåÔ)Ç:=áâ뻜¸8 C†¬ÆÁa,NNpq¹5ÁLHH ²²gggBBBhlldР['I¿úê+rss‰‰‰!!!ºº:þò—¿(ݧOÏdøðõØÙ…2hПˆ‹“0`À xss7öí §¸øGòòv²wo(ƒ-UnbZRWw•’’Ô–#+ëŸ\¿ž®±üFÞÆäÉÉ8:ŽÇÑ1’èè4שøii©¥²2KùÔÔ¨~LÛÎ.‡¼½ˆ/ÁÙy²Æé»‡©Sãê‡ÇìíC»7>’HøðÃ;v¬²o˜5kÖ=KúôL‚‚6`gŠH´˜øøR\]£5oe%ÂØØ==ãßtQ„…E?•òmÙ²…±cÇòòË/ÓÔÔ¤Ô_€C‡‘ͬY³˜?>ãÆëVþÝÜf0{výûÇck‚½}(¶¶!·‡¹ÿyúWuöó£>bÛ¶mœ8q±XLCCUUUÛguỲ¿=E.—Ê;ï¼ÃÑ£GY¿~=•••* È]å_ü{ÿ½¨¿ƒˆ¥¥%K—.eÒ¤IÔÖÖjœ?‘HDff&©©©ìÛ·±XŒ¹¹9žžž„††òâ‹/rìØ1¶oßÎÊ•+yë­·´Ú&íCSý200`çÎ8p@ÿM._¾Lvv6.\ ¾¾ž¢¢"ÍçO]È·§òÓDÿîvùzFWíóA±owÒCCCD">>>;vŒ€€€NÛ¯ ÆÆÆˆD"D"ýúµO*++ÉÊÊ"++‹úúz***”ÿËdíkD‰‰‰œW¼AŽB¦Pë®kÔõ•CêÂ{ýÕ«ÝÐ6È95ûî ܹ²é %ß–à³ÎGmüÚÃõW\žr!}^:E·Ç7_Ác©γé=ª7æ"s  •õ´;ˆÓq§‘•Ë0qé|áÛc™ýúsræIZë;v¼¦n¦X ßKE“‚¾cúRýkµŠ¯^T©¢âh…êÀÅønðeàë¹öí5J¾.é4;a>Ð}ª3«;÷Ц&‚¶?.scGc,DœŠ=ECaûâ¿ë³® ÿb8'gœÄÄÕE£‚üóñÍêsë)?\ÎÀ•Ñ7×ï–üzÔ¡˜écâf‚‰£ :ú:XúYÒPОߪô*Ž;ŽŽ¾½Czãý7o®~z•«Ÿ\ÕX>Š~T­Âåi­É-¿®–EiÇù<4+ÃöMµº–*dMÇ¡‰zýu˼}˜|èGêZ[:¸÷3³ÀÚÐ+CšärÆ;8‘q㺊Ÿ×ýü9Y^ÎÏ¥×T~ÿîwþõô=<Ú¯Ê=wî\§î E3UUbŒŒzwênmíÇàÁ¯²wo(ÕÕ9úÙ²e ß}÷¹¹¹”——ciiIKK{ÿÍáÇ9|ø0ýúõcÞ¼yÊkúîEúׯg(ëÏÜÜ•þýã¹zõ{ÂVU‰ij*G.oºc¥§§+Ë—ššJJJ IIIŒ=šððp •ýhXXX‡Pu(2®\ÙÕíöñ°÷?Bÿ®‰ý´°°ÀÓÓWWWôõõ6l—.]ÒÈ>w^ýÕ&þóŸIHH`òäÉ\¹rE£ñEwäÿGâ¿Ûã'WWWüýý áòåö— –.]ʉ'>|¸Fù[³f «V­báÂ…DFFâïïÏÆ• ßqqqìß¿këö[cjjjîx’ãÐUúšÔ&úµzõjÞxã ‚‚‚T6ÿnôîÝkkk‰ŠŠâôéÓjó®N¾Ú”_gúw·Ë'ÐÃ5;5íóA±owÒææfÄb±Ê¿G,S^^NSSb±¸[éNš4‰I“&áìì¬ÿ^¸p~ø/¿üRù"šL&c×®]wŒçNîÓ¦M#::šææf¶o¿5~?>kÖ¬¡¾¾}üš‘‘AJJ )))¸ººÏ÷ßßãòý¾ÚÚÚ2~üx­õÿÚП{eŸ4Þ²b…¾™>eûË0èe€ž‰eʰ´F×HW­ûíH’$T©èVüÐ~:ãtÜi‚vQ´£ˆ€°ð±@’$jò`ámAØñ0j.Ôpbâ •Í-SwS|ßñ%ýùt$»%üºôWrÖäà³Î§}*S¾ =3=LÝM1qlßà2q6AÏøÖ)œ¼÷òÈX’Áˆ¯G(75o§¡°ºKu”í+#ÿÃ|ì§Ø«¸[úYbmOÎÛyªÎµo°œŒ9‰äs ƒÖÂ÷_Ë_—SG[k½zÝU9;Ç9Ó7¢¯ÊoM%M´Ö·Ògô­7¦ôLõ7¶Ÿ0²1BÞÔþ÷É'Éz9KéfØ×Pcùõ”ÖúVj³k)Ü^Hñîbœb:1nkmãúñë”ü¯›1ÝûVƒ¢½zQ“U£UÙ—–1úÀø~·‡¿œþsVev|ÃýéþžÝººðv6dŸgAj û#'ò†_Ç· òëkWWñä*›ÄÙLsqUq°îÃLWwþ_æÙaÏ\¯`äþï˜üó|’—Ë»#øwP°Æy»X]E«BÁ°Þ}…Îö1ghŸ¾dVÞ»N™LFTTxyyáæÖ~2ÜÝÝ“nœB dΜ9*WÛüž––~úé'>ÿüsåiiiÔÖÖKee% ÄÄÄ’’ò@,žÞïü=êé'''såʶnÝÚ¥¿––: }#çvjkóË›prºó¤ÕÑÑ‘ÌÌLžþy’’’‹Å˜šš*'óúúúŒ9RéÿæbÙÍÍ­ßÓ§Ïd²Jd²ý@Ÿ>CéÕëÖ¦´§ç\ZZê))9|»õçÚµC:4 þMxøN ðõ½eo(++£©©‰72€6Ž{–¤$gåóùç¶ÊÍ­vù¨žàº}së÷(2tu 4ªŸªª èèèco?ºëñOkûË<úú¦jãT(èééÝ·ôÛÚèèèuKO[Zê00°ÔÈïðáù~ý:dff¢¯¯Ïرcµ–ÿî´‡½ÿyÔû×[ýX-çÎã_ÿúü1Ï=÷\·ìó«³¿Ú €¢¢"ÒÓÓñööVYüW—Mäß“øï6EEEÔÖÖ2aÂåofffÊ…[uù0`Ÿ|ò QQQlݺ•Ù³g³lÙ2•ñ>|‘H„óæÍÃÒÒ²ËqVwP—~wÚGWúµzõjfΜɩS§X»vmÇùm^YYY|ùå—üãÿ`öìÙZ¿j*¿^x¡Ó« »Ò¿»]>»Û>”þ_~ÔÕµÛw ‹Îí{]]–––ÝNW,+_ˆ¸Ipp0R©T¹¹Õ222hkkãÙgŸÅÙÙYùØÚÚ*ë@“ñá-ßMHBB/¾øâýÜ©ýkkü .þ»eŸ?TvžJ(åHÐ~]ö+mŠ6ŽáÌSg€ökÁB~ ¡öb-))¤NLÅ|€9þ[ü5rWN`j[)þ²˜’ÿ©Þá©.|Å‘ ÄkÄŒüßHôLõðü«'Ù+³©É¬Á)V¸§ó^àót u x?€ˆSDœŠ`ÔÁQ@ûæãÙgÎâûŽ/aÇÃõÓ(lÆÚpjÖ)e½74(ŸÆkí›c’FåÆÌMê/×+7ÐÂRÂ0q1i?%XÙLð÷Á„ÿÎÈïFbæaFÚô4•°¢7EäoÉWžTľ2€à½Á„§†¼/˜–êrÖäh\~E³‚ì7³ñÛè×é 4û©öDœŠ`ð{ƒÑÑÕ!âT;5vзÐÇ)Ö ‡'~·¿Lù3O3B„2úçÑ €3sÚÛ§aoC2…jym­mö1ÔX~]ý}!?†´Çÿ¿‘´T¶>ÿÖÍÀײ/„°ãa}DKª»&òyô£oX_\Ÿså⛵ھþ8‚”‰SÙ2"„f…ßïöpöºê⢅súyãÚñ Èé.n\˜Ç#G£§£Ã…i1|ÙÁߥšjBü@a}g£¦ãffŽL.ç†LÆÏã§ðkôLŸŒ—…%P ûÖaüëâ®Ë:^ýøæà!$Oˆ"sê ŽLˆ¢ª¹™73Îj¾É órúiÞ9 73s¡Ã}LcïÀB¯¼|ö”Vã‹‹C*•’””„žžR©”äääß«ÈÍÍU>………Ê…÷ÆÆFµáoòÞ{ïñöÛowúfì?ÿùOΟ?D"!55•ÊÊJå@¿¥¥oooüýýÉÏÏ';;›¬¬,bbbˆ:¹ßù{Òÿøãikk#<<œW^y…¶¶6žþy¥»‡‡ß~û-™™™Èd2ÊÊÊØ±c‡rª}ÒÛÌáÃ1m .NÂØ±{ÚÇW­ ìÞí†LVÅäÉÉ<ùd!³få2fÌn ý{V999øùù±sçN^~ùeV®\Iyy9ŽŽŽäååannÎÂ… •W(ÊårTÇ!^^Ï2sf6±±y˜š:ðõ×íWÞ¸‘É×_û0xð«<ùd!119˜›»óÕWËeèê2|ø?x≳ÄÅ3sf½{û³ÿ8e;óðð`íڵܸqƒââb¼½½ñôôümb•¤$lmƒ™1ãýôS$ b±˜èèh‚ƒo½ w³~wìØAss3vvv¤¥igþª.}MêGSýºxñ¢RNW¯^¥ÿþ466RQQÁ¹sç¸víéééˆD"•÷®Ð¤þ5‘_¯^½X°`A§×u¥w»|=C]û¼ßöMSýhnn&&&† 6 ‘HسGÕ¾ðÁâôéÓÄÆÆv+ž?Z¾›Ì˜1ƒŒŒ å)¾ßÓUûïªÿ×TºŠÿnÛgÇ~»ï"âT„ G˜#AGù2º<í‚ÃÊMµ»…±ƒ1C>B­¸–¬Yœý6úQ›]KÁÖA?nCßLŸ¡Û‡Ò|½™_—þŠ¢EñXõ!ó=ãÚ¨Ã?ÞÕtMLùltª+Yzê—GNŽ[FŒâBU%ÿÉÉ Óm˜ë°+t ×eM,L;N‹âáj_K–,aîܹ*‹2 Ó§grþü;äåí„!ЉDÂêÕ«ùøãa<´ìܹ“ŒŒ Þyç¡|‚~ ù䓈D"Ö¬Y£üÍÕÕ•-[¶píÚ5JJJêòÝ V­ZENNÓ¦McÑ¢E”••ÝÓ÷4}8sæ ‰‰‰лwo¥û˜1chiiaçÎL˜0¹sç²yóf•8Äâ÷INŽ¥©©üÓÈÈÿ1eÊQœœ&âáñ±±WX©tÿôÓOÉÉÉaúôéDFFòæ›o2bDûK ´µµ©èÒÍߌ5J?0pãÆ}ƒµµ¯ò±´ô¼'e¯©ÉåóÏmÙ³Gt_d¯Ò÷𘃿ÿklþïfû¸ßýÏÃÞ¿veßôôôHIIaÅŠ„‡‡³råJ¤R)aaa¹kbŸîvù^xá,X@xx8¯¿þ:R©”   ­ä_“ð‰‰‰ìß¿Ÿ¦NJvv6Ë—/¿'õw“7’ššJBBaaaôéÓ§ƒŸE‹‘™™‰T*ÅÑÑQcùÜíñ‘ºø»ÒMòß7èÃÂÂð÷÷gÙ²e”––2sæLab  êÚOúß»ÍMýŸ0aS¦LáÓO?åêÕ«øùùi>77[[[D"ÑQ¿ŸßiC¾=µ_]Ù'uô4ÿš„WW>uýóž={8pàaaaÌ›7‰D¢ò /MäוýêiûQ—Mç×ÙÏa~® æÌ™Ãk¯io~¡²ÁeìоÀì÷nÇN¥>¯ž¢ÏŠº}(%ß– «!zS„øobÜÕ¡.¼Ž¾­5­´Ö¶¢£«Cú‚túŒêƒÛ7Á²ÝÌ<ÌpyÚ…ôyé8LwÀ¨¯â5bD«47(Ã>†¥¯%úæú¸>ëJß°¾Èëäüéèëà·Ñ¡Û‡¢gª§âÖPÐ@Ýå:êsë‘7Ê‘•È:*µ¡.^¯x‘óvmŠ6åï>k}òѬ†Yaéc‰ý{Œì4ߤÐ5ÔeÐ[ƒÈZžESIS·äצhãtÜi ¶Py²’‚­´Ô´``ukƒ¯&«Fù¸-p£µ¾•3OŸ¡MÞ¦LÄž4ä7±8ãŽiõT~]•ÿNékC?šJÚ7ØÏ/ïzÓä~ëGé÷¥}V„÷[ÞÚàYX2ßsq)ÉÌrsÇÆØ„•çÎð÷!Ça¤«Ç¾qÉ««å¹ÇîèO_W—-#F‘:³ß¿+uµäÔT“SSMƒ¼•k ¦óæàVe¤#o»%¿wGðÙèp‚úÚàgÝ›'\ܰ71éVþ7 "áä Š„N÷1囫l¿|‰õª|Ÿ={Vù,_¾œÚÚZÆGkk«ªž±~ýz^zé%äò[ö¯¨¨ˆ„„„ö-_MËw7‰D,Y²„I“&1wî\ìííY¶l›6mº'e×FúEEEdddPWW‡T*%##ƒ7n('?‡&""‚§žzŠŸ~ú‰;vð§?ý©Ýfébe%ÂÊʇ)SŽuzÂÅ×w9qq† YƒÃXœœ&àârk—@ee%ÎÎ΄„„ÐØØÈ A·N’~õÕWäææCBBuuuüå/QºOŸžÉðáë±³ eР?'aÀ¾0× IDAT€ ð<æænìÛNqñäåídïÞP ZJŸ>C°²²"??ŸpèÐ!Ö¬YÃÉ“š¿Ä0zô6&ONÆÑq<ŽŽ‘DG§¸NÅOKK-••Yʧ¦FõcÚvv!88Dàí@|| ÎΓ5NìØ=LzW×h<<æ`oÚ-’H$|øá‡Œ;VÙögÍšuÏÒŸ>=“   ØÙ…"-&>¾W×hÃ[Y‰06¶AOÏø7]aaÑO¥|[¶laìØ±¼üòË455)õàСCdgg3kÖ,æÏŸÏ¸q㺕7·Ìž]DÿþñØÚ†`oŠ­mˆÆíãaî…þµ+û&—Ë åwÞáèÑ£¬_¿žÊÊJå“:wuöé^”ï£>bÛ¶mœ8q±XLCCUUUZÉ¿&áE"™™™¤¦¦²oß>Äb1æææ÷¤þ½[õ/ÆG]ůN4ÉÿM عs'èP?—/_&;;› .P__OQQ‘0!иïªý÷¤ÿ½Wdee±oß>žyæ/^Ìþýû144`Û¶m$''3~üx"##IKKcݺuÇ}ùòe¢£ow6mÚDbb¢òÿmÛ¶qöìYf̘ADD?üðCwMÒïl~×SùjÃ~ueŸÔÑÓü« ¯IùºÒ_OOOBCCyñÅ9vìÛ·ogåÊ•¼õÖ[ǯÎ~õ´ý¨³_êæ×]ÙOmÌÏÕµ€øøx¢¢¢xæ™gÈËËS9i«.|ff&6l 44”Å‹SZZªâ_$accƒ±±1"‘‘HD¿~ýº•¿kª+ÇwöØ|£þ†x¿å®¡.Õ窑7ÈQÈjÝuº¾rH]x¯¿zµ+RƒœS³Oá¾À+›®Pòm >ë|ÔÆ/Ð3 {·™æŠf.®¼ˆ¢YA¯!½Ð3ÕC×H…LÑexcGc,DœŠ=ECaûâµë³® ÿb8'gÜZäðXæAÿ„þœœy’ÖúŽ ÓÔÍ+ô{é£hRÐwL_ª­VÝ,XáEÕ™**ŽV¨ü^üE1¾|øú@®}{’¯K:MãN˜4GG_‡êÌêÉÒõW\žjß j,jìàî±ÔÃ>†œ}æì-ù÷5$hw§ãN#+—aâÒùÆ6ä×iý«I¿§úüö5À®yPô£êl.O»h­}õ1jK½¼©‰gO!“+ìÓ3}}Œõôh’Ë» oclÌwcÆóDòA¤MM¸šu>±ýë ?–yû0ùÐÔµ¶tpïgfµ¡V†4ÉåŒwp"ãÆu?¯ûùs²¼œŸK¯©üþy~›ƒBø›ÿP¾,Ìç‹‚üNÓ¸Þ½¬Ð×Õ%ýwé <~œª(g¾çÀ‡2ï«W¯ÆÖÖ–ñãÇwê¾víZRRRØ¿¿j÷×ÖöH”ïn`cÓ~¸¬¬ŒE‹!“ÉÆÜÜcccšššêô=<Ú¯Ê=wî\§î E3UUbŒŒzwênmíÇàÁ¯²wo(ÕÕ9úÙ²e ß}÷¹¹¹”——ciiIKK{ÿ}šÃ‡søðaúõëǼyó”×ôÝ‹ô¯_ÏPÖŸ¹¹+ýûÇsõê÷…­ªÓÔTŽ\ÞDUUç/.¦§§+Ë—ššJJJ IIIŒ=šððp •ý\XXX·à W®ìêvûxØûŸG¡ÕÔ¾ýùÏ&!!É“'såÊ•n»wfŸîUýYXXàé鉫«+úúú 6ŒK—.õ8ÿš„_³f «V­báÂ…DFFâïïÏÆµ¦#]ÕŸ««+þþþ„„„pùrûKK—.åĉ >;;;RRR £´´TeáJÓòÝíñQWñwGºªßÕ«WóÆo¤²xzû8 wïÞX[[ÓØØHTT§OŸ&jQ×þµÕÿÞ+ 144ÄÖÖ–¡C‡Mss3Û·ßÿÍŸ?Ÿ5kÖP__ߣ´&NœÈ”)SpvvVnJÅÄÄ`ff¦»jšþæw=‘¯¶ì—:û”’’ÂÀíóîO>ù¤Ó«B»Êÿ ¯IùºÒßË—/Çþýû±¶n¿«¦¦†òòrâ·µµíÒ~i£ýh¾3ûßûÙÕøA“úéŠ]»v±wï^²³³Ù·oÛ·oWÎÕ‘‘‘AJJ )))¸ººÏ÷ß·Ï?Äb1ååå455!‹µÒ‡h¼+d5Ä }3}Êö—aÐË==Ê”ah®‘®Z÷Û‘$I¨8RÑ­ø¡ýtÆé¸Óí¢hG`ác$I"X·»LÕ¹*Zë[±›lGKu òF9v“쨣oíhë™ê!oT]¸Ï{/Œ%Œøz„rSóv ¨»TGÙ¾2ò?ÌÇ~нл¥Ÿ%öÑöä¼ÓiŽ;Îɘ“H>—0hí |ßñÕXu9u´µ¶Ñ+ ×›üx[v<Œš 5œ˜x¢ÓÍ-³~f¸Ìuáâ›U'ð2é ÒÑ3ÓÃÔÝÇö &gôŒõ´&¿;.,¨I¿§ú¡)Š~ô èEMVÖÚ×™Ôµ¶0ÍÅ•ªæfå­LuvádEy‡Í­§û{éà¨ò›L®`NÊÌô ègn³iûÀÌÕÔc½[ú±!û< RSØ9‘7ü:¾åœ__‹¸ºŠï$WÙ$Îfš‹«Š{€ufººóÿ2Ïv,Ãõ FîÿŽÉ?ÿÈ'y¹¼8‚k,ƒ‹ÕU´* ëÝWèps†öéKfå÷Ñ9pà@xñÅ;u dΜ9Z½:èA*ßÝ"--ÚÚZbcc©¬¬¤¡¡˜˜RRRîÉâòÝN?99™+W®°uëÖ.ýµ´Ôí9·S[›‡\Þ„“Ó7ÉÌÌäùçŸ')) ±XŒ©©).\@__Ÿ‘#G*ýßœLÝiòÒ§Ïd²Jd²ý@Ÿ>CéÕëÖ¦´§ç\ZZê))9¬2ÉÛ·oaaa¬[·N9¹)((À×÷–½  ¬¬Œ¦¦&nÜÈÚ8vìY’’œ•ÏçŸÛ*7·Úå£z‚ëöÍ­c… ]]ͮȮªº€ŽŽ>öö£»ô×ÚÚþò–¾¾©ú1•BžžÞ}K¿­MŽŽ^·ô´¥¥Kü>œëׯSQQAff&úúúŒ;VkùïNûxØûŸG½½ÙÞ‹ŠŠHOOÇÛÛ»Ãâ™:÷®ìÓ½*_mm-çÎã_ÿúü1Ï=÷œVò¯.ü€øä“OˆŠŠbëÖ­Ìž=›eË–©}ÃY[Q[[Ë„ nÍeÍÌ” ¿2™Œ¨¨(,,,ðòòÂÍ­ýæwwwL~»åAù<ÈíC“ü¯^½š™3grêÔ)Ö®]Ûq~›—GVV_~ù%ÿøÇ?˜={¶0P‹6ÚÿƒÖþV¯^Mrr2‰„ŒŒ ÚÚÚxöÙgqvvV>¶¶¶*›K ¿Ýürs\{;%%%ÊÅýßSVV†žžÞÞßÊ£iú]Íï4•ï /¼ rµ^wíWgá5±O¡¡¡ØÚÚbkkÛaóC“üÿÑðڰχF$aggǼyó°´´TÖƒºøÕÙ¯{Õ~îdÿ5±ŸšÌÏ»ªŸ®ÚGg„……!•J•óÃî†ïlþSWW‡¥eçó‹îÆ¿Ûà*ý¡”#AGøuÙ¯´)Ú8t„3OÚ¯ ù1„Ú‹µ¤D¤:1óæøoñ×È]9©m¥øËbJþ§z¥ºðG*¯3ò#Ñ3ÕÃó¯žd¯Ì¦&³§X'ÁÂÝeÚZÛH˜Š…·¡GB ù1„ºKud&dªøÓ·ÐÇ)Ö ‡'~ü2åÌ<Í=ÊèŸGƒÎÌ9Ó!­úËõÊ  °”0L\LÚO V6ü}0á¿„3ò»‘˜y˜‘6=M%¬èMù[ò•'U¯ xo0á©áï ¦¥º…œ59š7ÈfÙofã·ÑïŽ'¨ºÂç>èêð~§"ˆ8Á¨ƒ£TüØN´¥öb­ò”Ûíí¦¡ Aù4^kßk”4"o’kM~w\xP“~õ°ŸjOÄ©¿7]"NE¸3ðÓ¾a}q}εÃ&dOhU(=ðƒzYqzʤLœŠ¸ºšù©ªW Z0§Ÿ1®ªopÔ´4“_W«|$ í†ùjC]‡ ²K5Õ„øÂú:ÎFMÇÍÌ™\Î ™ŒŸÇOá×è™?/ K&< ö­!Ãø×Å \—u¼úñÍÁCHžEæÔ™EUs3ofœÕX2…œ—ÓOóþÈQ¸™™ îcÊ{z äå³§º¼Ï˜1ƒŒŒ å[`¿ç½÷Þãí·ßV¾Yv;qqqH¥R’’’ÐÓÓC*•’œœüP•ïnÑÒÒ‚··7þþþäçç“MVV111Múü1mmm„‡‡óÊ+¯ÐÖÖÆóÏ?¯t÷ððàÛo¿%33™LFYY;vìP™¬+Í>CPÐââ$Œ»G¹1°{·2Y“''óä“…Ìš•˘1»öïYåääàççÇÎ;yùå—Y¹r%ååå8::’——‡¹¹9 .T^¡(—ËqpPµÓ^^Ï2sf6±±y˜š:ðõ×íWÞ¸‘É×_û0xð«<ùd!119˜›»óÕWËeñŸÿü‡üü|š››)))aذa Ú~}aAA¬]»–7nP\\Œ··7žžž¿M|®’”ä‚­m03fœ'.N´i§é×/V%ÎΓ˜3GªòXZzõ¸þëê®òÅn8;G1kV.³gakLE…ª}“Ë›8zt.ÁÁ›~«Ÿ¯´¢÷;ý›ˆÅpíÚAbcóˆÍSê×M/^LYYÕÕÕ8;;cg×~z/??333f̘Aee%„……u¸¢²§ù¿SûxØûŸG¡Ugß122â›o¾A*•"•JÉÉÉÑØ½+ût·Ë§§§ÇÖ­[ÉÎÎæÚµkœ={–ŠŠ •…Æžä_]øK—.ɧŸ~ŠD"A,Mppð=©¿¶¶6üüü” {¹¹¹( """¨ªª"77Wù*ûýÆÆFäs·ÇG]ů‰þhR¿/^TÊéêÕ«ôïßŸÆÆF***8wî×®]#==‘HİaÄ €Z4iÿ=íï&\ºt‰_~ù…Ë—/³k×.þþ÷¿+7x¯^½Š‹‹ ÁÁÁœ?‰DÂéÓ§‰Uÿ5551wî\6mÚ„D"Q9?qâDúõëGaa!………Œ9RycBFF¼ñÆ\¹r…Ó§O¬<Í¥iú]Íï4‘o¯^½X°`A‡kì4µ_w ¯‰}RGOõ£«ðš”OþÞ,ߎ;hnnÆÎÎŽ´´4âWg¿´Ñ~4±_w²ÿšØÏžÎÏ»jÇç•W^¡¸¸˜ŒŒ jkkU^HT^>øàB­¸–¬Yœý6úQ›]KÁÖA?nCßLŸ¡Û‡Ò|½™_—þŠ¢EñXõ!ó=ãÚ¨Ã?ÞÕtMLùltª+Yzê—GNŽ[FŒâBU%ÿÉÉ Óm˜ë°+t ×eM,L;N‹âÑj_K–,aîܹZ]t¸WLŸžÉùóï—·C†@$ «W¯æã?„!ðвsçN222xçw„ò ú)ððÜsÏQ\\LCCAAA¼úê«ÄÆÆrìØ1a~' ð¢ÜàxÐDÐŽ———òX¡T*%  S+V¬àüùóÊÖÝNfff‡£¡¿ÇÉɉððð‡VNÝÉÿ·ß~ËêÕ«åÐ**\®®®lÙ²…k×®QRRÒÁsbb"û÷ï'$$„©S§’Ý­¥¯ZµŠœœ¦M›Æ¢E‹(++#**ªƒ¿E‹‘™™‰T*ÅÑÑQãøÕå¿+rss±µµE$uéïý÷ß'66¶Ó;V5aΜ9¼öÚk­Âhšÿ'Ÿ|‘HÄš5k´R?ÚïèèˆT*eĈøúúâëë‹“““ÖõW@@@@@@@@@@@@@@@@@@@@@@àÁUTTDBBÂO!‰D"233IMMeß¾}ˆÅbÌÍÍ5JH$±dÉ&MšÄܹs±··gÙ²elÚ´IéÇÈȈ´´4.]ºÄôéÓ»]uùï †††ˆD"|||8vìØOxÅÇÇÅ3ÏkÖ¬¡¾¾€ŒŒ RRRHIIÁÕÕ•øøx¾ÿþ{€.ó;k×®%%%…ýû÷kµ~z>55/// 7n›7ofóæÍüûßÿî±þ655 ½‰€€€€€€€€€€€€€€€€€€€€€À=Bãop 0€O>ù„¨¨(¶nÝÊìÙ³Y¶l‰‰‰ü¾ð L™2Eå·´´4jkk‰¥²²’††bbbHII¡©© ™LFTTxyyáææ´Ÿº111Q¿¶hhhÀÔÔ´S÷ºº:,,,ÔÆ†T*¥¢¢B%¼¥¥e¿b±}}}† ¦ü-88©TªÜÜê ´µµñì³Ïâìì¬|lmm•›[¿G¡P §§×¡üåÿ&Ì™3§[WWj¢?Ú ßÒÒÂO?ýÄçŸÞéƒDî*\qqqH¥R’’’ÐÓÓC*•’œœ À¥K—ˆŒŒäÓO?E"‘ ‹‰ŽŽ&88X%Â^½z±`Á‚×ȵ´´àíí¿¿?ùùùdgg“••ELL UUUäææ*ŸÂÂB hllT¿ºükJSSsçÎeÓ¦MH$¾úê+÷ææfbbbذa‰„={ö(ÝŽ?Î+¯¼Bqq1ÔÖÖâëë«þƒ>ààÁƒäåå‘——ÇîÝ»•åtwwçé§Ÿ¦  €‹/"—Ë;„ÿ£\½z‚ƒƒ9þ<‰„Ó§OÛ­xî”ÿ›¼÷Þ{¼ýöÛ~£L“úéiývþŸÿü§²ì©©©TVVvØÈú£ú+ pïÐÚ1hƒ%K–0wîÜ›žÚD¹Áq*BÆ#Ì‘ #‚ t<(ï Æá ­ÅðAË<´žOcc‚¿fÐÛƒÉzðÛè‡ûBwA?~‡¥#¿ÉàMƒÑ5xøºÎæ0Ë­ŸÖâûï¨0Vø Öz>MLùyü6 ñH¶¯-#F±dà£Ùwô„^††?™­Á£1Ð}ø‡&ß~û-«W¯*V@{¶Ùo3fœÇØØFF7™>=¹Z‹oäÈM„†¶ƒØÒÒ‹9s¤Ê§w^žû‘¾©©ööáÚ?ü÷¿Ê+ൕ¡}ô”;w²bÅ ¡|Z%33³ÓO'åôóqÇËË ©Tª|:·ÿ+V¬àüùóØØØü!ýsrr"<<ü¡•Swò/Ì?wTV‘š®5qqÕEŽåèÈ£<çmÊãDä Ê.G²K‘G(O.ר]]…¿´î¥ûJ‘$IÈÛ”@Îßs(ÜV(Ôâ=Â9Χ'°aM¿ûq*‚^þ½”îþÿñghâP¬ƒ¬qšåD؉0úFôUºÙµ‡ è…ùs̘cdg¤ÙÄÚÝ”ˆSXYc!²Àõ9WÂÓ±hÛ©û)ö˜õ7ãʦ+Z•ÍX†ïιΑýFv·ÂZúZª<ƒßLàgèèéh%ü¨C£¾k8úfú„ Å“ÿ’_ô$Þ™à½ÁDœŠÀÈöVýú¬óahâP¬†Za3Ö†Cp›ï¦t7v4ÆûoÞ„ÿNxZ÷!÷B?ZjZH›–†ô')£“GcdcÔ=¹˜š±nèp~žÉ¯Ñ3UÜôttøß˜ñ,8ˆ[^òöå´‚m4¯ŸÿäGê¤h&::óLO²¦Åéà¤QØ~æÊô|¬¬Yè5óÑ3™âäÒ©ÿ'\Üð´°äÝìóZÕñN|?vÏœ8Â_Ïž:ÝLjêæf"îg_±„“S¦agl¢µ¸õôôHIIaÅŠ„‡‡³råJ¤R)aaaü.Z´ˆÌÌL¤R)ŽŽŽ*n7n$55•„„ÂÂÂèÓ§O§é=ù䓈D"Ö¬Y£ümذa*ORR?ÿü3úúú¬ZµŠœœ¦M›Æ¢E‹(++#**꩟û¿‡=}8sæ ‰‰‰лwo¥û˜1chiiaçÎL˜0¹sç²yóf•8Äâ÷INŽ¥©©ük¿‘‘ÿcÊ”£89MÄÃã)bc¯°Réü¢£ÁÙy2ööaøúþ}ú  ""‚¶¶6e[¸ý7cccÒ \Ǹqß`mí«|,-=ïIÙkjrùüs[öìÝÙß«ô=<æàïÿÚ›ÿ»Ù>ôþùQ(_WöÕÑÑ©Tʈ#ðõõÅ××'§[ãÛÄÄDöïßOHHS§N%;;›åË—+Ý_xá,X@xx8¯¿þ:R©”   {6¾P—¿®ä¯­ñKOpuueË–-\»v’’’nןºü©«uõßÓükR¾®òß“öss?,, –-[Fii)3gÎ|hêï~—O kÔµ¯ûÙÿçææbkk‹HÔµýÿý÷‰¥¼üÙ÷9sæðÚk¯=´u¨iþ;›ö´~µÕüÑøÕÍŸ~Ê—±Cû³ß»~<ÖçÕSôYC·¥äÛd2DoŠÿM¬‘»:Ô…×Ñסµ¦•ÖÚVttuH_NŸQ}p[à&Ôâ=B’$¡ø‹bªÎTQ¥y£œ–êLÝL±nÍÅU©·=}YIÇ𺆺x½âEÎÛ9´)n}bÎg­C>‚Õ0+,},±Ÿb¯ñÛÍx½5ˆ¬åY4•4uŸU£|ܸÑZßÊ™§ÏÐ&oëqø›²­8RcŒ#/ypyÃe̼̺-¿?Ü™ê2bÏòÈXœÑÁÝÌÌڋµT¥WQq¤‚†+ è™Ýªß¦’ö öóË»Þ4¹ßúQú})EŸáý–w·äSÜPÏ«é§I8y¢ƒ›¼­'’òŸœlRË¥ü''›êæf¬ 5ÓO/ Kæ{ .%™YnîØ›°òÜþ>$°ƒ_}]]¶ŒERèÌ~78¸RWKNM595Õ4È[¹ÖØÐ!¼‘®o`UF:ò¶[ò{7pŸ'¨¯ ~Ö½yÂÅ {Í7)ŒtõØ0,ˆ„“'(nh:ÜÇ”o®°ýò%Ö ÒZœr¹œÐÐPÞyçŽ=Êúõ멬¬T€‘––Æ¥K—˜>}z‡8+âê IDATOÖ8ý±c÷0uêq\]£ñ𘃽}h÷ÆÏ ~ø!cÇŽUö ³fͺgéOŸžIPÐììB‰_Š«k´Æá­¬DÛ §gü›.а°è§R¾-[¶0vìX^~ùeššš”ú pèÐ!²³³™5kóçÏgܸqÝÊ¿›Û fÏ.¢ÿxlmC°·ÅÖ6Dãöñ0÷?zÿª‰}uww§ººšââb.^¼HVVÅÅÅ*eÈÌÌ$55•}ûö!‹177WºôÑGlÛ¶'N ‹ihh ªªêž/ºÊŸ:ùkcüÒSŠŠŠHHH¸ã) uõ§.êêG]ý÷4ÿêÜ»ÊwÚ;wîäÀ*ú pùòe²³³¹páõõõ=4õw¿Ë'Ð5]µ¯ݾ"‰ðññáØ±cw<áOTTÏ<ó yyy*'E"666#‰‰Dôëwkü’˜˜ÈÉ“'™:u*óæÍ£  €E‹)Ýg̘AQQñññ„„„JHHˆÆîÛ¶m#99™ñãÇIZZëÖÝ¿fff²aÃBCCY¼x1¥¥¥DGGkœÿ®æŸÚš¿ô¤ÿèiü]ÍŸ:Cuu³‹ƒ$Í7šÛ;š¾†x¿å®¡.Õ窑7ÈQÈjÝuº¾rH]x¯¿zµô䜚} ÷î\Ùt…’oKðYç£6~-)Œ™>&n&˜8𠣝ƒ¥Ÿ%  46ðë²_ºm(½ h­kUÖ+@UzÇÇGG_‡Þ!½ñþ›7W?½ÊÕO®*ýx,ó BNÎkß^£äë’NÓ¸æÍÑÑס:³ºG2ôXêaCÎ>sVkáM\MP4*Èÿ0Ÿߌ >·žòÃå \9}sýnÉï @ú´;ˆÓq§‘•Ë0q鸱qeó<–zà<Û™Þ£zc.2§0ñ¶˜ìó=(úQu¶ —§]º%£6 ý-ðÈsž^ħ$SX_§Q˜>Fío¹—75±âì)dr}úb¦¯±žM¿ tþ:ÈeÞ>L>ô#u­-âégfµ¡V†4ÉåŒwp"ãÆu?¯ûùs²¼œŸK¯©üþy~›ƒBø›ÿP¾,Ìç‹‚üNÓ¸Þ½¬Ð×Õ%ýwé <~œª(g¾çÀ»÷Ÿÿüg˜TºGgúãqv±y³»¦'wtabbÕ®rNNNæàÁƒ Ò;ïÕ™Õ¨šTØ…Úݶý¬º[á9Ë“ o_h}1c†‡ÖÑŽúÜoæh†¢^½‰qbÊ Ò_KGQ§þß´›©Þö»]”r%)sS0²2ÂÒÇ 7õ—…‡Fæêß‚> "åù¤[¤œ]x–ÌØLú¼×§]éÜ/õÃ.ÔŽëé×;µmõébOÊã“9[QÆð½¿´º¹õL?F»j qª¬”ê¦F¢<½¨hh NÑÄãžœ(-Ñln¬È8ÇܤDöŒ~Œ·‚›?•SS…¤²‚Ÿ¥y¬’dåé¥%µw`ª—ÿJk¾9{êZ)ƒ÷üÌø¿òMv çÓ0‘Þù¿PYA“RÉ€®ÝGûˆÓß¡iå»ÑJ~~>)))j->Éår&Nœˆ þþþx{«ß ÷ññÁ‚üü|ªªª;vìM_le¥™˜Ü`àÀÌœ9Sëè¡[éÕ« ,ॗ^ÒúýøñãTUUCyy9µµµDGG“˜˜x_,žÞkýöô:ÄåË—Y»vm›áÕ}‚‰‰ÖïUUÙ(õ¸»·>ésss#--矞øøx$ –––šÉ¼±±1ƒÖ„¿±˜ucsëÏ88ôC./G./#?ÿúcgwsSÚÏo5¼uôGaá~öïâüùO‰ˆˆàÊ•+iµ×ââbêëë)+KT9ò,ññškÓ&'Íæ–Ú>Úopݺ¹ÕlÌ¢”chh¢WùTTœÇÀÀ—am›Ôo[ê3)•ݳôU*%Fíª§Õ˜˜ØêvРA\»vÒÒRÒÒÒ066fäÈ‘¦{Úǃîvÿªoÿª.ãF~ûí76mÚ¤9b©gÏž|óÍ7Lœ8‘µk×2}út-ZÄúõëÿä'«8sæ ü1ëÖ­ã¹çž»+ã ]úécÿŽŒ_îuù髟>åÓRùßité¯oûY¶lS§NåäÉ“,_¾¼ùü6;›ôôt¶nÝÊûï¿ÏôéÓïJþ:«üî×ü ´Ý¾î—þ­ö“[nŒK›­ÁU«ûwÝý»X,F&“i_«««±µm>~‘H$š ¿ˆD"d2™fs«#¤¦¦¢R©xöÙgñððÐ\NNN-öq­[Ó_×ü³=åû /0a„;ÖßNüºæÏ-¡µótõ—«$„%pvÑYTJ a œzú >lȯC¨ºPEbd"I%aÝÓš5!zÉ5˜ª& ¶Pô“ö›ºî/M(E+aðOƒ1²4ÂïU?2–dp=í:î1îBIÞa èýŸÞ ùu¿G0ø§Á4–7’2çæ37äÁ£jT‘ž@eêÍ·gz½Ù‹!»‡ >*&lk×µï¿AÍ¥Ž=vŒºü:ĉb,<-Ôo –7 Ú)R§ÿó`¬|­8>ù¸Ö½o³&GëÍ1Í$ãõžˆv‰ˆHŠ@´[Dce#™±™zÛ@Ù $ãí ‚W·ø†’>8=æDÕ…*js[>‚ÍØÆ÷w\Ÿpm×ý¦]MQÊ•Ú  ª&¦¦zÛïviªjR¿É÷ÇUWX@´E½‚Ú+µœþËi‚> B|TÌÐ߆â8Ò‘“ÓNjâpyÜ…È“‘ôý¤/†DžŒd`ÜÀû®~twÃë9¯67)[b²§7磢ùbð0Œ 8ÍöÈÑù'ƒcfhÄ×CÄœŠæ|T4ÇÆi!dcbÂÌî¾D{i?AפT2|ï/ô¶ëBò„'H|ìq$••ÌI:ÒL‹×+5h§'NÆÛʹBA™\Î18;i*ûÇŒÇ߯–±ûöjÝûN¿||á<×äÍ~|»o?HÚãSH;‘ІÞNÕÿ-E¹RÁk)É|6x(ÞVÖ‚Ó}DáâÊ<ÿ^¼vúd§Æ»~ýzÌÌÌøñÇ53ÎÌÌüc¹‚¬¬,Í•›«~³ôÊ•+ÔÕÕ¡R©Ö,,eee¡T*‰ŒŒÔJã“O>áÝwßmõŒø)S¦ššªyÊíÖE›ÀÀ@BBBÈÉÉ!##ƒôôt¢££ï‹2¹×ú= é¯[·•JEDD¯¿þ:*•ŠçŸ^#÷õõeÇŽ¤¥¥!—Ë)..fãÆZ“}¥²ƒ£ [ÁŒRFŽÜ¦öÿMµlÙâ\^Áøñ‡xòÉ\¦MËbĈ-€ú{V™™™Çk¯½Æ’%K())ÁÍÍììl¬­­™7ožæE…B««ö8ÄßÿY¦NÍ &&KKW¶oWqXV–Æöí}èÛ÷ ž|2—èèL¬­}øá‡ž(r M4è}žxâ43f0uj:]»†°gÏ(M;óõõeùò唕•QPP@`` ~~~Lìóˆ÷ÄÉIÄ”)ç˜1CJTT2Ý»Çhéçá1Ž™3eZ—­­‡Ë¿º:ï¿÷ÆÃc"Ó¦e1}z>NN"JKµû7…¢žÃ‡g!­ú£|~è”úw¯Ó¿¹ô9……ûˆ‰É&&&[S¿nðâ‹/R\\Lee%8;«ßÞËÉÉÁÊÊŠ)S¦P^^N]]b±˜'Ntªþ­µÝÿ<ìþUŸþõ¿ÿý/çÎC*•’””Dyy¹f¡ìâÅ‹Œ=šo¿ý©TŠD"aÒ¤IˆDꬌŒŒX»v-rúôiJKKo{¡­½ã ]úécÿŽŒ_:ƒ3f “ɈÇÈÈ™LÆ¡C‡ô*?]úéS>m•Gõ×%×¥{ÚÏ… 4vÊËË£GÔÕÕQZZÊ™3g(,,$%%…€€­÷û¹üî‡ü ´Ž®öu¿ôoõõõÌš5‹U«V!•J›½ÝÞÐÐ@tt4+V¬@*•²mÛÍþýèÑ£¼þúëššJUU•ÖSŸþ9ûöí#;;›ììl¶lÙ¢©Ç>>><óÌ3\¹r… . P(šÝ»äååáéé‰H$Òø°äädbbbÚOkúëšê[¾vvvÌ;·Åc;â?:¿®ù³€@‹ûüqÞEäÉHÁ1 a }=ŸñÄõ W­M“;¹«9ý¾ìG•¤ŠôÅéƒWS•QÅ•µW„úq ÆVÆôßП†k œ]xe£ò‘ò!süzíÕ‰½£é¸YXòݰHÎW–³ðäïׄå|E9ÿËÌ:¦[°66aóð\“×3ïøQ•Vûzùå—™5k–fÑJ@àabòä4Îûìì‚1š!•JY¶lëÖ­Œ!ðÀGjj*~ø¡?¡~ óO aƒëáQØàx40L p¿ Ú%jõh¾Û!ôóP|ùvºžæ®æˆvŠèýnï‡Ò~Á+ƒñ™ç#Ô?abkÂàŸÓwU_ M<×ypì¦ywÞǧ¿*fqŸ¾®§›…%ÆL`Å€ð‡ÒÏ­ Ê˽z# ©)ûÇŒg­h&†ÿÐdÇŽ,[¶L(xýûæàÅL™rssGÁídòä4|}guZ|ƒ¯bøpõ7tlmýµŽEìÚ5ôŽçç^¤oi鎋KD猾þZsQgé/´ŽÇâÅ‹…ü t*iii-Í%äO¨Ÿ:þþþšcWe2¡¡-÷ÿ‹/æÜ¹s8::ÞVýsww'""âµS{ôæ—:Z«Hõ…õ\XzâÃ|¸YàìUÙ}Œ’%H7KIO äP‰Þr]´uÿÅ÷.ru÷U¤ñR²WeùŸLr¿ÊJ±“0s2#òd$v¡vX÷´Æº§5fÎfzËõ¡×’^„m ÃóiOìÃì1±×ï#ß–>–DžŒÄ>Ì›¼žó"âxN9µÞe‚ V=¬¸¼êr§ÚÈq¤#ƒ¶ âÌ gÈx«}GŒõy¯ý×÷§Kÿ.8ŽtdȯCðžã­‘ÛÙj]}?éËÀïb`d —¼3íw;å§+zýh¼ÞÈñ¨ãÈ~“1ìÐ0ÌÍ:­^ðÓˆ1¼Ü«7Cø{`磢9ê_>–V¼×g'Må줩íJ¿»µ&½>]ì™çß‹s“¦2ÁݳÅðOxzãgcËGç:µ}qugçȱüåX¯ž>!8åGˆÊ†FïÛÃî)'&Dálnq_éçææ†L&#<<œ   ‚‚‚pw¿ùýÏh]ñññ8pccãfq=ùä“«ùmÛ¶mìÝ»±XÌìÙ³‘J¥ú޲téR233‰ŠŠbþüùßµ¼? é{zzÊ©S§X¿~=¡¡¡tíÚU#1bÄÅÅ1vìXfÍšÅêÕ«µâH>ãСêëKî»ö;zôOL˜pw÷Çðõ}š˜˜Ë„†.ÑÈE¢ÿ1iÒïxxŒÇÅELPÐ?pp訿¦R©´ÚÊßÌÍÍõJàÀ÷5êGìíƒ4—­­ß]ÉûõëYlÚäĶm÷Äöw+}_ß™„„üó¾ÕÿN¶{ívÿº~ýzöìÙÃ!CxüñÇÉÈÈà•W^Ñ»ÿmKnddDbb"‹/&""‚%K– “ɋŦÿ /¼Àܹs‰ˆˆàÍ7ßD&“¦‘{yy±fÍ )**j÷ý+W®$))‰  ‹qppÐÛ~E—þºôÓ•?}ÆOmŧó§KÿŽØÿÆ¿X,&$$„E‹qõêU¦Nzß”ß æÏŸOZZ2™ 77·û&:ºêg[ò»áÛ"++ '''Úîÿ?ûì3bbbZýƱ.fΜÉ?ÿù϶ŒõÕ¿¥ùeGû÷Îò·{æ×Z5ÃÜÕœÀâ<Ιs×^¸¬É®!ÿ»|·…“õAV=­x;É¿%8ŽpÔ)×…®û Œ hºÞDSU†¤ÌMÁë/^t‹è&”b'aáaASUò«rä29*¥ª]r] øv†¦†[ãõ¬²ßdTž©lÎÀØ€ ƒ0ébBÚËi(jYí•ZÊ0u0EQ§@^$ov¿¡©!þ¯ûsá_´tì³¼¦¦ä|‘ƒ²^‰¥·%å§Ë‘ËõÒßÐÔÞïôæì³ÔÕ·Û¾V¾V”Ÿ,§"¥CÜcÜ1²2º9ÉO¿®ù;xe0M5Mœ]tVoygÙïvËOWþ–úquçU,Ü,|'Ôù©Òö*OÚ§ùÿÔµRb¼»coªÿ&ZAm o¤$ó‹45áC[wú††|:HDWSSæþžHMS“Fv¹ºŠkr9ffÔ*š(¬«mv¿™¡o÷ åõÓÉ(T7í÷ÑÀpÍÍY%É N¡ ‡µ 'Je\Õó#×f†F¬Æ ÇRP[+8äG”ó®àaiÉÂxöØáûF/*++)(( ¨¨…B¡%?}ú´æï¸¸8ªªª˜1cFóznfÆ|ÀK/½¤‰ÃÏÏáÇNNNGŽA¥RñÎ;ï°{÷î{ž÷€€^~ùeÂÃÃyÿý÷9þ<‹-bÕªUìÚµKH_òóóÉÏϧºº™LFjjªÖäîàÁƒ 6ŒcÇŽi~߸Qý½+CCSlm{`bbǘ1;Ù»w,eeÚ}OPÐ+½Bfæ:®^=‚¡¡1††&äç«õ[°`ï¾û.ÁÁÁxyyqàÀ @F†úAáÃ×Ó¥KRSc17w¤_¿¥œ=»‰ä @ýTAÁ¯äåíÄÁ!„¾}ß %e)/~EÏžÏcmíÍŽ7Ÿ¼-*J`òä3äçïæÚµLMm©®Î£¨è …œ«W´« † û ›¤¥ýP1`À;%pêÔš0U”—·þ]Tgç!ÔÖJéÒ¥7¡¡o“˜8©t^é¹ KKgΞ}\\†síZŠÞúK¥RvíÚÅ–-[ aÅŠLŸ>½Ù‡ÔïTú“'§QX¸ÜÜŸ°·ïC¿~Ë8vlyy;õº¿K—ÌÍ122§KõB”B!§ª*G“¿Ÿþ™~øòÿ÷¼ú꫚MÚýû÷ãææÆ¿þõ/lmm5j'Nèÿ‹·÷þ”ääר®ÎÅÐÐ¥RL–¤WûxýÏÃî_oèpäÈ’’’044dΜ9X[[ëÝÿ¶%W( >\óÿï¿ÿÎ3Ï<Ó©$_~ù¥z|mlŒƒƒµµµTTThùÿ ðÃ?×îû÷íÛ‡¹¹9¶¶¶,\¸íÛ·süøq½í×Qté¯K?]ùÓ5~ÒÿΟ.ýõµ¿‰‰ _ý5L›6êêjìÒ¥K”””àèèHMM ùùù÷Mù™™™qøðaþùÏ2yòäV}÷½ÊߣޮúÙ–ünøÇŽ`jjJ=°³³cçÎŒ;Vkü|ƒ§žzŠòòrXºt)Ÿþ¹æ[n8::bnn®ÙH“Ëåää¨Ç/ëׯ§OŸ>ÄÆÆâèèÈÒ¥KY¾|9_|¡ÿN™2…O?ý”×^{ÜÜ\ŒŒŒP($%%é%ÿꫯèÑ£ÿùÏ4s»„„ÞxC=~MKKcß¾}üôÓOôéÓ‡eË–1oÞrH×ýþ¯ú«q­‚“ÓOâ3ׇ˫.S´£ˆ>ïõÑ¿€n*R*8:ê(ÆtÒ•À’÷myßäé%o s7sll8s’Ú\õâµ×³^ ú~'¦Ü(ù.ò¥Ç‚œ˜z‚¦š¦fñXz[bÒÅc;c”õJºèFåYíMÿÅþTœª ôp©öÀ÷­¢×›½(ÜQHÑö¢Óh ë^ÖP™Vy[ö½¼ú2¾ }ñ˜îAס]±°&w}ó7}úbê`Ê鿜n1ž¶äa¿Û-?}ó÷0ÔŠÓx>ãyGÚá\¿^<ççÏS‰‡È­©Öû>}¶›_íÌ¢À>Œßÿ+ÕMÍäÝ­l°75£‹‰)õ c\ÝI-»¦æÍàN””pàj¡Öï›r²Y6„‡ôgknß_Éi1ִ낱¡!)JOàÑãdi süzÝW:%%%áï £FbõêÕ¬^½šO?ýT+ܲeËprrb̘1-Ƴ|ùrÙ³gÖÄÆŒìÙ³{{{®_¿~ÛO*v67Ž)..fþüùÈårD"ÖÖÖ˜››S__/¤ß|}ÕGåž9s¦E¹RÙ@E…3³®-ÊííƒéÛ÷ víNeef‹aÖ¬YÃÏ?ÿLVV%%%ØÚÚÒØ¨öÏãððG|¼*•RÝÇUœg̘_ÈÉÙŠ\^@YÙYŠ‹).N¤¤$™1cv’›û#ÎÔÕ]ÕJ¯®®Paaá ÀáÃϸ¹¢wï…X[{’ðöñòŠÂËkJebñÍï={Î!55–¦¦š?×l°·ÒÈ««sil¬Òü_\œDQQEE X[wÇ×÷i½6¸<<Æãì,bófwMOëè(ÂÄĪ]圜œÌÁƒ9xð Ý»wgöìÙzmpuVú×®¥jÊÏÚÚ‹=žÒ{ƒ«¢BB}} E}«e–’’¢É_RR‰‰‰ÄÇÇ3lØ0"""055EõÇC1b±¸Ý ðJ¥œË—7·»}<èþça÷ï±±±,]º”yóæ1zôhBBBX¹r¥Þý¯¾ýóßþö7,XÀøñã¹|¹sOø°±±ÁÏÏ///Œ0`/^TÏUªÛ¾ßËË‹† Â¥K—X¸p!ÇŽcРAzÙ¯£´¥¿>úé²O[ã'}ã¿SùÓG}ì¿lÙ2Þzë-¨ªªjqеkWìíí©««câĉ$''ßóòsvv&11±XÌÕ«WéÞ½å£îïeþt·/}Úßô·KCC‰Dëă–ؼy³fÃ&##ƒÝ»w³aÃJKK‘H$”””P__D¢=~7nãÆÃÃÃ¥R=þ=þ<¿üò [·n¥¬L=þ•ËålÞ¼¹Õô[“GEE1iÒ$Ø°áæøuΜ9ÄÆÆRS£¿¦¦¦’˜˜Hbb"^^^<õÔSš ®¶ô×5¿ìŒþ½3üGý¯>ókè½+Ô¥_Œ­Œ)ÞS²¢_“ IDATŒ‰ FFï-Æ~ =†f†:å·"—RšPÚ®øAývFòŒd¶„‘¿1ŸÐÏC±écƒ4^*”d'¢jRqíè5Š~*jñí;]rt‹Ô~³®¾¨ž¦š&†Ý|"ÄÈÒEöSxÙŸd“úr*áÛÃ5›š·R›[KõÅjŠw“óE.\´ä¶Á¶¸Lr!óÝæ‹<gÔt'¢O Ý$¥÷òÞ}¤·]ª3«Q5©° µk·M-}, ú0ˆ”çSn‘rváY2c3éó^­pVÝ­ðœåÉ…·/´.yGí׺ÊOßü=,õÃ.ÔNëºÎ O{RŸÌÙŠ2†ïý¥ÕÍ­gzø1ÚÕí¶ÒX‘q޹I‰ìýo7?ç:§¦ Ie?KóX%É ÊÓKKjïÀT/þ•Ö|sõÔµRïù™ñ~å›ì,>Χa"½u»PYA“RÉ€®Â[¹:ýº‘V~nt666òÛo¿±iÓ¦fG<ôêÕ‹ ðÒK/µxïÀ™9sf‹G×E‹±~ýúvõ¿mÉCCCÉÏÏ'%%…ÀÀÀ;²x[UUÅ™3gøøãY·nÏ=÷\§ÜŸŸŸOUUcÇŽ½9´²Ò,Œ¶Ç~w]úékŸÖÆOúƧiM}í¿lÙ2¦NÊÉ“'Y¾|yóù{v6ééélݺ•÷ߟéÓ§ßå'—Ë™8q"666øûûãí­þô€÷}þtµ¯¶äwÃ?ê¢ö“[nŒK›­Áýñ6 îþ],#“É(--ÕºßÖ¶ùøE"‘h6ün ‰ÉdšÍ­ŽššŠJ¥âÙgŸÅÃÃCs999µêÃZ¶¦¿®ùe{ú÷^x¡ÝGã·Ç?ßNüúίnEkçéê/WIKà좳¨”*Â8õô)@},Ø_‡Pu¡ŠÄÈD’Kº§5!kBô’k&0UMl- è'í36uÝ_šPŠ$VÂàŸcdi„ß«~d,ÉàzÚuÜcÜ…’ìz½Ù‹!»‡ >*&lk×I™“¢·ÀØÆ÷w\ŸpýÓl~Ÿð;V~V OΰÃ@ §fžj¦GÍ¥Ž=vŒºü:ĉb,<-Ôo –7 Ú)"â÷ÿ<+_+ŽOÖ~6àírÖähÞÔšD½ÞÑ.Iˆv‹h¬l$36Soû(”d¼AðÊ`,<Û÷}˜Ú+µœþËi‚> B|TÌÐ߆â8Ò‘“ÓNj…sz̉ª Uš·˜þŒ.yGí×újHÛå§oþ†úÑMÜ ¯ç¼ZÝd¼]>43C#¾"æ|T4磢96n’Vfv÷%Ú«ùt“=½9̓‡ad`Àù¨h¶GŽnîâõJÍÚ鉓ñ¶²F®PP&—s`ÌÎNšÊþ1ãñ·±eì¾½Z÷¾Óo_8Ï5yó£ßîÛCc'’öøÆN¤¢¡·SOë¹RÁk)É|6x(ÞVÖ‚C~DáâÊ<ÿ^¼vúä}¥×ÿû_Î;‡T*%))‰òòòfõ)S¦ššªyŠ­YÿäÞ}÷ÝßÌZ»v-lܸ‘††œ;õžŽÐØØH`` !!!äää‘‘Azz:ÑÑÑBúz²nÝ:T*¼þúë¨T*žþyÜ××—;v––†\.§¸¸˜7jMö•ÊŒ&,l3fH9r›z\ÝTË–-ÞÈ匈'ŸÌeÚ´,FŒØ¨¿g•™™Ipp0qqq¼öÚk,Y²„’’ÜÜܨ®¾Â÷ßûàç÷ O>y…èè ¨T ¶o×~ÀÃßÿY¦NÍ &&KKW¶oï @YYÛ·÷¡oß7xòÉ\¢£3±¶öá‡z¢PÈ144eР÷yâ‰Ó̘QÀÔ©étíž=£õ—¯¯/Ë—/§¬¬Œ‚‚ñóóûcbŸG|¼'NN"¦L9ÇŒR¢¢’éÞ=FK?qÌœ)Óºlmý;\þÕÕy|ÿ½7™6-‹éÓóqrQZªÝ¿)õ>< ‘hÕåóC§Ô¿{þÍ… Ï),ÜGLL611Ùšúuƒ_|‘ââb*++ñððÀÙYýö^NNVVVL™2…òòrêêê‹ÅÍŽ¹ê¨þ­µÝÿ<ìþõâÅ‹Œ=šo¿ý©TŠD"aÒ¤IˆD"½û_]òõë×cffÆ?þˆL&C&“‘™™Ù)úiúïÂÂBNŸ>Mii©Vú3fÌ@&“‘‘2™ŒC‡éu¿J¥"88X³ðœ••…R©$22Roûu”¶ô×¥Ÿ>öikü¤+þ;?]ú·Çþ.\Ðä#//=zPWWGii)gΜ¡°°””´ÜïeùUTT••¥¹rss5ývÝŸŽ ¿Wù{”ÑU?õiwÒ?êK}}=³fÍbÕªUH¥Òfo·744ÍŠ+J¥lÛv³?zô(¯¿þ:¤¦¦RUU¥õÀÀçŸξ}ûÈÎÎ&;;›-[¶hê±Ï<ó W®\áÂ… (Šf÷ß.yyyxzz"‰4}Trr2111튧5ýuÍ/õíßíìì˜;w.³fÍêTÿÑÑøõ_ ÜŠœwy2R°ÆCLBXÂCŸGÏgüC“;v°lÙ2¡àô3eÊ9ÌÍc´“É“ÓðõÕiñ ¼ŠáÃÕßX±µõ×:±k×Ð;žŸ{‘¾¥¥;..3~øúkÍD¥¿Ð>:J\\‹/ò'Щ¤¥¥µx4—?¡~ t>«V­jö ¼Å‹sîÜ9ïÍøÀÝ݈ˆ¡pîZ«Hõ…õ\XzâÃ|¸YàìUÙ}Œ’%H7KIO äP‰Þr]´uÿÅ÷.ru÷U¤ñR²WeùŸLr¿ÊJñ.áû7_†îŠã(G<žò òD$Ž#ÚßQx<åh—ˆÈ“‘˜9™é7±ö±$òd$öaöØØàõœÇ#pzÌ©Åð.\°êaÅåUû¡LÇ‘Ž Ú2ˆ3/œ!ã-í#ÆBþBÿõý±³Ç}š;âcbºEvÓÈÍÝÌ üw ¿Gq¼ýœ™“‘'#± µÃº§5Ö=­1s¾3ök ]úwD¿ŽÖ¯»Q?¯7r<ê8²ßd ;4 3G³N­[ÿèLÒ¸I<ææÁ_zø‘Íh×ö_ð/=ü88v磢q¶Ðï[qÝ­m8Èщ>]ì™çß‹s“¦2ÁݳÅðOxzãgcËGç:Õc\ÝÙ9r,9–À«§ON÷¢²¡Ñûö°»@ʉ Q8›[ñw]ý·®ñ.¹››2™Œððp‚‚‚ ÂÝ]=?022"11‘Å‹Á’%KÉdˆÅâ»–¿¶ôÓÇþm•ßý?]õKWþÛÂßß_“Ÿ-ZÄÕ«W™:uj§éßYã·ùóç“––†L&ÃÍÍí®åO có»U?n—ÌÌLŽ9€ ¹¹¹lݺµSÓøì³Ïˆ‰‰iñȺ6l………¬^½‘HÄäÉ“Ûý€âÌ™3ùç?›Ÿ:êß:Ã?êòoŸ¾ð Ì;—ˆˆÞ|óMd2aaaùúõëÙ³gC† áñÇ'##ƒW^yEïô„ù³ÀÝEkƒËÜU½€üQp³€5Ù5ä—Oÿ ý)ÚQ„¼TNÀÛHþ-ÑK® ]÷Ðt½‰¦ª& H™›‚ÃP¼çz ¥x°òµÂóORf§à:Ù³nfHb%,ÕBjhjHø¶pjsjI}1µÕpƯ ¦ÿ†þYiÉj¯ÔR}©šš¬u äEòÓñÝŸÌw3Q)Ušßû,ïC¿/ûÑe@lûØâ2Á¥]0†¦†ô~§7鯤S_T¯%³ô¶Ä~=–^ üd9?pé£KøýýæK}‘zùÜ+··)`áaASUò«rj.ÕP}±y±¼Óí׺ô×W¿ŽÖ¯{]?®î¼Jþwù¾ØiíË߯–9~=™‘xˆiÞ>8š[°äÌ)þÓo Þq˜±{ÔcdWWñܱ#­†364dMøPâ‡ÀêO‹ï—««È¼^IæõJjMÖÕ¶˜ÎÛ}CYšš‚BuÓ~ ç»a„us$ؾ+OxzãbaÑ.ýW cÁ‰cÔÖ N÷åǼ+l¸t‘„=PzŸ>}Zs½òÊ+TUU1jÔ(ššš´ë¹™|ðÿûßQ(šßóóóY°`Á}û”ï¾}û8p ¶¶¶,\¸qãÆQUUuWÒàå—_fܸqÌš5 -ZĪU«˜ôóóóIMM¥ºº™LFjj*eeešÉÙÁƒ‰ŒŒäé§Ÿæ·ß~cãÆüõ¯U÷Y†¦té@—.}˜0áH‹o¸½ÂŒRúõ[†«ëHÜÝÇâéys‚º`ÁÊËËñðð`È!ÔÕÕÑ»÷Í7Iøá²²²ˆŽŽfÁ‚TWWóÿþßÿÓÈ'ONcРpvNïÞeÆ )={ΠgÏç±¶öf÷î ~%;;Ž]»†Ó»÷BúÐ¥KrrrØ»w/û÷ï'66–'ôˆaذ¯?þnncpsͤIÇ8ð=­0U”—§k®ë×µ?Fíì<W×HðÔSExxŒ×;ý‘#·ñøãGñòš„¯ïL\\†·«I¥R¾øâ FŽ©iûÓ¦M»kéOžœFXØ œ‡ð"O=u/¯IzßߥKææŽ™ÿQ°±é®•¿5kÖ0räH^{í5êëë5õ`ÿþýddd0mÚ4æÌ™Ã¨Q£Ú¥¿·÷¦OϧG§pr‚‹Ëpœœ†èÝ>dÿó°ûW???†ÎK/½Ä‘#GذaK–,áwÞÑ«ÿÑ¥¿>ñw]ý·®ñ.¹•••páÂÒÓÓ)((@¡P0|øp>üðC>Ì|@yyy§.PëÊ_[ú鲿®ò»×ùÓ§}´•ÿ[111!..޽{÷bmm­%»téœ?žššòóó;­|::~333ãøñã\¼x‘É“'·îNåO có;]?:‚ׯ_g×®]<÷ÜsÄÆÆòæ›ojO¿úê+:Ę1c=z4Çç½÷nŽÿ¶mÛÆÑ£G™4i3gÎdøð›ã#SSSèÓ§GŽ!4´ùøÀÅÅ…qãÆÑ¿¦M›ÆåË—™?> ~ójûöíL›6¿þõ¯üþûïÍNàÐ¥_@@ŽŽŽ˜››@@@Ý»wïÿÖÑûõñoŸ~ùå—|õÕW;v ‰DBmm-Z:¤¥¥‘””ÄîÝ»‘H$ZþCWú÷ûüYàºiÐzÀ†²µ£èfJà;šRy¦E­¥\©SnhÖö‘Cºî÷Õ_Ýkœœ~Ÿ¹>\^u™¢Eôy¯Îø:†iWSu9•6paÉ” JìúÙadi„¡™!J¹²íû»™¶%ŒäÉÈKäXx¶¼ðí»È— zpbê šjššÉ-½-1éb‚±1Êz%ÝFt£òl¥öfÁb*NUPz¸Të÷‚ï ZD¯7{Q¸£¢íE-¦ÑÖ½¬106 2­²™¬6·–³‹ÎÒÿ«þ˜Ø™ÐTݤ©×À_»»}*R*8:ê(ÆtÒ•À’÷myßäuªýZEÕqý:Z¿î—úQqºÏg<;­}9˜©ŸR/©¯gñé“ÈJ:tÃÊØs##êoYo Gss~1†'íCV_—•u‹á^íÌ¢À>Œßÿ+ÕMÍäÝ­l°75£‹‰)õ c\ÝI-»¦æÍàN””pàj¡Öï›r²Y6„‡ôgknß_Éi1ִ낱¡!)JOàÑãdi süz=º/[¶ '''ƌӢ|ùòå$&&²gÏm÷ªRÝ·yòòò"$$„!C†pé’zÓ`áÂ…;vŒAƒÝñôo)R\\Ìüùó‘ËåˆD"¬­­177§¾¾þNß×W}Tî™3gZ”+• TTH03ëÚ¢ÜÞ>˜¾}ß`×®áTVf¶fÍš5üüóÏdeeQRR‚­­-jÿÅO<™™J¥º¯MKKãèÑ£lܸ‘ÒRu_YVv–ââDŠ‹))If̘äæþˆ……3uuWµÒ««+TXX8kÒ000`üøñ¼ñÆøøø0aÂÒÓÓõ¨QxyMB©l@,Þ ù½gÏ9¤¦ÆÒÔTóÇâš ööAyuu.7iŠ‹“(*J ¨(këîøú>TºGgúãqv±y³»f äè(ÂÄĪ]圜œÌÁƒ9xð Ý»wgöìÙšcúîFú×®¥jÊÏÚÚ‹=ž"/o§~ãÏ õõ%(õTT´üàbJJŠ&III$&&ϰaȈˆÀÔÔTãçÄbq³P](•r._ÞÜîöñ ûŸ‡Ý¿^ºt‰3f°gÏìíí¸~ýºæI{]ý.ýuÅßèÛë´&OJJÂßßFÅêÕ«Y½z5Ÿ~ú©V¸¿ýío,X°€ñãÇsùòå»–¿¶ôÓeÿöÔ¿{‘?}ôÓ§|–-[Æ[o½EXXX‹›¾¾¾tíÚ{{{êêê˜8q"ÉÉÉÖ¿£ã7ggg‹Å\½zU³0ßRݽSùèØüãNÖŽâëëKmm-ï¿ÿ>ÉÉÉœ?ž;w²råJlmm‰ŒŒdÒ¤I444°aÃÍñßœ9sˆE,#‰pww×äS$ae¥544 ‘H´NLø3æææÌœ9“AƒÑÔÔD}}=#GŽä‹/¾ÐÔ÷ŒŒ›§6õéÓ‡íÛ·3xð`†Þ¦~555H$JJJ¨¯¯G"iýÅŽú·Û¹_ÿÖóSüüüðòòÂØØ˜pñâEbccYºt)óæÍcôèÑ„„„°råJ½ûŸûyþ,poÐ{W¨K¿.[S¼§;Œ,Œ(Þ[Œý@{ Í uÊoE/¥4¡´]ñƒúíŒäÉ„m #c>¡Ÿ‡bÓÇi¼T(É;LÅ™ šjšpïLce#Š:Îãœ)?UÞlsËc†‡ÖÑ|J¹’”¹)Yaéc‰…›zƒËÂÃ#ó›oád’MêË©„o×ljÞJmn-Õ«)Þ]LÎ9¸LpÑ’ÛÛâ2É…Ìw3[ÌÃÑQG9}é&)½—÷&èà ½mPYªI…]¨]‹ò²ßË86ö á ¤¿žŽ±µq‹zè\ÌhÁ~Z޼Iŵ£×(ú©¨Ù~µ_§LÚЯµüé[¿î—úajÇõôëf³Se¥T75åéEECuŠ&÷ðäDiI³Í­gzø1ÚUûh¹BÉÌĬŒMènmƒ‡¥z`çei¹ÑÍöµ"ãs“Ù3ú1Þ nþSNM’Ê ~–æ±J’A”§—–<ÔÞ©^>ü+ító<\+eðžŸàW¾ÉÎâ£á|&ÒÛ*+hR*е›àpqú;t#­üÁÛèìÕ« ,ॗ^jQ>pà@fΜ©uôƒ@~~>UUUŒ;Vó›••555w%ýãÇSUUELL åååÔÖÖMbbâ]Y\¾Óé:tˆË—/³víÚ6Ã56Vêœ[©ªÊF¡¨ÇÝ}L«÷º¹¹‘––ÆóÏ?O||<‰KKKΟ?±±1ƒÖ„¿±˜ucsëÏ88ôC./G./#?ÿúcgwsSÚÏo5Ôš„îÞ½±XÌ{ï½ÇÎêÍ•+W®t³¿ ¥¸¸˜úúzÊÊRGŽö8’ÊJæ$i5hcbÂÌî¾D{i?Aw½±œê*Í%­Uªòj«›m]¼^Éð½¿[SÍ鉓ñ¶²F®PP&—s`ÌÎNšÊþ1ãñ·±eì¾½Z÷¾Óo_8Ï5yó£ßîÛCc'’öøÆN¤¢¡·SOëm¹RÁk)É|6x(ÞVÖ‚Ó}DáâÊ<ÿ^¼vúä§û”)SHMMÕ<ùg>ùäÞ}÷ÝŸŸ1c2™ŒøøxŒŒŒÉd:tèþèÿU*‚ƒƒ5§¬¬,”J%‘‘‘wmÑ,00rrrÈÈÈ ==èèè&ýuëÖ¡R©ˆˆˆàõ×_G¥RñüóÏkä¾¾¾ìرƒ´´4är9ÅÅÅlܸQ³ ê7UŒ&,l3fH9r›ºÿhªeËoäò Æ?Ä“Oæ2mZ#FlÔß³ÊÌÌ$88˜¸¸8^{í5–,YBII nnndggcmmͼyó4G(* \]µûiÿg™:5ƒ˜˜l,-]Ù¾]}„LYYÛ·÷¡oß7xòÉ\¢£3±¶öá‡z¢PÈ133ãÿû999444PTTÄ€èß_}|á•+ßS IDATWðõõeùò唕•QPP@`` ~~~, ä“ˆ)SÎ1c†”¨¨dºwÑÒÏÃc3gÊ´.[[ÿ—uußï‡ÇD¦MËbúô|œœD”–j÷o E=‡ÏB$ZõGùüÐ)õï^§‰äs ÷“MLL¶¦~ÝàÅ_¤¸¸˜ÊÊJ<<ú·g Oÿ­k|Жü¿ÿý/çÎC*•’””Dyy¹ÖBâúõë133ãÇD&“!“ÉÈÌ̼kùÓ¥_[ö×§üîeþôÑOWþopáÂM=ÎËË£GÔÕÕQZZÊ™3g(,,$%%…€€ Ð)úë;~³³³cîܹ͎ùª¨¨ ++Ksåææjúíººº»’?ŽÍ?:£~Ü)ºuëÖ¬555ÑØØˆ³³3yyyxzz"‰4m,99™˜õø///ooo&NœHVVùùùˆD"NŸÖ544ÍŠ+J¥lÛ¦”——3bÄþñpåÊòó󉊊Ò:]@$qàÀŽ9‚T*å»ï¾ãÀÔÕÕéÔïŸþ9ûöí#;;›ììl¶lÙÒiþMŸû[kßúø7}ú·Öâ722ÒøÿÂÂBNŸ>Mii©Æ?^¼x‘Ñ£Góí·ß"•J‘H$Lš4 ‘H¤wú÷óüYàÞ`Àç]DžŒ¬ñ“–ðÐçÑóO\Ÿpåä´;»0jîjN¿/ûQ%©"}qúCgÇà•ÁTeTqeí¡~Ü‚±•1ý7ô§áZgžEÙ¨|¤|È¿žD{ugâÁ_ïh:n–|7,’ó•å,<ùûCgÇ5áC9_QÎÿ23„Žé¬MØ<|×äõÌ;~”FåÃÕ¾^~ùefÍš¥5hxP˜<9sç>$;{£` fH¥R–-[ƺuëc<°ÄÅÅ‘ššÊ‡~(äO@@¨ŸÂ×#£°Á% ðh`(˜@à~A´KÔâÑ|·Kèç¡ø.òít=Í]ÍíÑûÝÞe9¯ ÆgžP?þ„‰­ ƒLßU}14yð\çÁ±˜æÝ½Óâûz¨˜Å}úvºžn–3ÂÊöµ&|(/÷z8}GG°35eÿ˜ñ¬ ÃÄðÁšìرƒeË– +Ðy}sðb¦L9‡¹¹£`Œv2yr¾¾³:-¾ÁƒW1|¸ú¨T*Í5pàÀ;žŸ[Ó·µõ×:–±k×Ð;’¦§§g³×ßOú íC £ÄÅűxñb!JZZZ³£»„ü õSàáañâÅœ;wGGÇ2~‡ ­U¤úÂz.,½ÀaÑa>Ü,pöªlŽ>Fɤ›¥$„'Pr¨Do¹.Úºÿâ{¹ºû*Òx)Ù«²ÈüO&¹_å ¥x—ð˜áû“îØ‡ÛÓý¥îDžŒÄ.ÄN+L¯%½Û†çӞ؇Ùcbó#Þænæþ;ˆß#ˆ8Ñ®´-},‰<‰}˜=66x=çEÄñœsj1¼Ë¬zXqyUç~ˆÖq¤#ƒ¶ âÌ gÈx«}GŒÙÙj]}?éËÀïb`d ×ýºì7tÿPm¨Ó~d8!«BnË~ª'Oy Ú%"òd$fNfzëoæd¦®S¡vX÷´Æº§5fÎf÷Mýh¼ÞÈñ¨ãÈ~“1ìÐ0ÌÍÚgK+Þë?ˆ³“¦rvÒÔfòô&iÜ$sóà/=üHŠf´«þßt¶°à|T4ý»v#À® v]p±°ÐëÞîÖ6œŠFäèDŸ.öÌóïŹIS™àîÙbø'<½ñ³±å£ŒsZwƸº³säXþr,WOŸœî#DeC£÷íaw”¢p6·¸ë:¬\¹’¤¤$,X€X,ÆÁÁA#[¿~={öìaÈ!<þøãddd´ú‘ú'Ÿ|’€€bccõŽÿóçÏ'-- ™L†››Û}S>K—.%33“¨¨(æÏŸOqqq³¨ é·Ž§§'¡¡¡œ:uŠõë×J×®]5ò#FÐØØH\\cÇŽeÖ¬Y¬^½Z+‰ä3Š¡¾¾ä¾k¿£GÿÄ„ ‡qw _ß§‰‰¹Lhè\$ú“&ýއÇx\\Äýõ7¸"##Q©TkÂßøÍÜÜ\¯ô|Q£~ÄÞ>HsÙÚúÝ•¼K$ îÙÂÃõëYlÚäĶmw4¹sç6ói÷“þw²}Ükÿó ûW///Ö¬YCaa!EEEÍännnÈd2ÂÃà "((www½ûÇh]ñññ8p@˧t¤Õ¿>ヶú]öyá…˜;w.¼ùæ›Èd2ÂÂÂÚ=¾¸ÝñOGõÛ¶m{÷îE,3{öl¤Ri³oTµ•¾¾õãv럮ú¯+ú”Okøûû#“ɋń„„°hÑ"®^½ÊÔ©S;­ýÝéú{¯ó'Ð:FFF$&&²xñb"""X²d‰¦<î‡ù‡½½½¦MïÛ·O>ùDó¿™™ÙcçÏ>ûŒ˜˜˜¿±ü Äßõ§5Úò/¿€ÀŸÑÚà2wU/@Ü,`Mv ùßåÓCŠv!/•ðv’Kô’ëB×ýÆ4]o¢©ª CRæ¦à0Ôï¹ÞB)Þ%¤ñR ¾/ âT5—kPÔ)h¬l¼9€úv¶A¶[ãõ¬ÝÄÝPT+4òú"õê¹WÚ^706 xe0ý7ôÇÈÒHKV{¥–êKÕÔd©Ó—É›WjSCü_÷'óÝLTJ•æ÷>ËûÐïË~tÐÛ>¶¸LpÑ{åF¼½ßéMú+éÔÕ·Ÿ~]syÏõ¦©¦‰SÏœB¥Péu[ö³ð° ©ª‰Ò„RÜ¢Ýðý»/—V\ÂÊߪÝö»mgbjHø¶pjsjI}1µ]úßšùU95—j¨¾X¼X~ßÕ«;¯þöÎ<*Ê#ûûö}YdY@P׸o¸ ÑLŒ1&dFg21™IÌ«ó3'ÆŒ13Fc&ŽD¢Ñ˜¸&FD‰¨(Èê(ÍÖ [³5ÐÝï[[¶Fиô÷œçè[uoÕ­[U·ê>Uÿ+Àó}Ï.é§°¾Ž¿%_$êÂÙÖ S^rëOdü)f÷uÆJ߀U—/ñÏÁª¿ îdhŒ¨¹™â†z®ÕT“]]EÉ}nÐÖÔdkàbBFatßâ?·VDNM595ÕÔKZ(j¨o•_OS‹÷ù±:%‰ì®þþ=,ÿ # ·>½˜îØWåÛ¾†uá,…õõê÷Å÷·òùêúUÖ x¤rOœ8Á°aÃ055eùòåL˜0‘H¤ {xxššJBBG%;;ccãÖv¬§ÇúõëùË_þ‚D"Q™¿žžçÏŸçêի̘1ã±j^ýu&L˜ÀÂ… ±µµeÅŠlÞ¼Y-_E’’Bmm-B¡””***›o±±±„‡‡óüóÏóóÏ?³{÷nþøÇ?Êç,M]ÌÍ=07÷bÒ¤3mžpñö~ƒÈHƒ¯¡OŸÑØÛÇÑñî]TT•••888LCCÞ=I²“©S/àè8w÷ÅÌ›‡Ç2}ÆŒTüý×ccÂÀ$2R@ÿþKèßÿeŒûrôh……?qãF4GŽ„0pàrEKW×”ÚÚ[ÇRRr†ôô¹};Yeýù%'žÂÎnvvc™:õ<ÆýK)Ms³ˆÊÊtÅSS£ü±u›`úô ÇÓ3Šùó‹qp˜¨²üÑ£÷3eʯ89MÅÕu¶¶!]²¡3R Ø€M¯2~ NNSŸùÞÞÞX[[c`` Ø|rssSÉ>z¢ü}ûÎdÞ¼\\æcmŒ­mÖÖÁ*÷'yüyÆ×‚‚¢¢¢Ú=åáììLuu5………dee‘žžNaa¡ÊócRR’âyã7‰DŒ3†–––™_;ãß™ÐÙüß™~¾øâ ¾üòKΞ=Kvv6õõõTUU©Ì¿»þOwÊçææFHH¯½ögΜ᫯¾bÕªU¼ÿþû*ËïÌ>ºcªØgúïŒ~:::DGGsüøñVþãõë×ÉÌÌ$##ƒºº: z¬ÿ=lûý½ë§FûH$„„„ðÑGqúôiÖ¯_Oee¥R€ò÷\TVV’žžNzz:uuu”——+þ‹å{83gΤ  €ùóçLHHÁÁÁ ¶¶¶L˜0!C†0{ölrssY¶ì®ÿšššÊ†  áÕW_¥¤¤„©Sïú?;vìàСCŒ9’!C†0wî\E}öìÙ\¸p!C†œœÌgŸ}ÆŒ3(,,ÄÂÂ]]]<<<ðòòâÌ™3øùµö?:âß]þ;wîäÂ… L™2…Å‹“ŸŸß¥úw×~Tñ1Ú_z‚¿j´ÚëTÞ9n?aSE“¼£õÖÅó}O4u5©¾\¤^‚T,í”®©×ñ•CåwÓ]Þê%$ÎKÄy‰3¹›s)>XŒ×¿¼:å¯FŒ‘6} 0°3@C[SSêóëÑ·ÓÇÄÄÄ9‰Ôß”oN;ýÁ ÿ½þ\˜ùÛI â8®+\q‰rᬠ´Ôµ´¢ö5DÇ\m3m¤RzêMuZµr°`¥;U—ª(?]®`Ø[ˆ÷o¼3€¢ƒE(nSF{0`Œ†¶Õ©ÕÝÒ¡ërWt-uIz!©k;П“Ò)yÛòü>ºku”Å–1`Õ´µ»¤¿no]¾ àbäEÄeb  ºT~€ªä*~ó+Úô î…ç?<¹µë·¾¾õØÙGURŽ‹{ªù°Ô“¿¥^ÖØÈʤDÄ)Ã,{c¤­¾–÷l”·‡‹·Ë~ìG´55imË¿† ãËëWÙq-G‘æÍ>¬ðôbâ/?QÛÒÜŠG?#,tõ0×Ñ¥Q"a\{R*n+¥yÇÇ— eeœ,)Rúý›¼l æ¾CØw3½ùymÊhžfæhkj’|Ÿ<5ž=$–—ñ’Û€G&ÏÉÉ ___‚ƒƒ¹~]¾)¾|ùrΞ=‹¿¿üTìÚµkY½z5K—.eìØ±øúú²qãÆV¼Ö­[G||<ÇŽS™¿ ñññ„††RRRB¿~ý«ö¸s2¥´´”eË–!‹ ÂØØ}}}Õò»ã¸Ê¯Ê½|ùr›t©´‰ªªlôôzµI·°ðaР¿qäHÕÕ9m¦Ùºu+?þø#×®]£¬¬ SSSš›å㳃Ã&ã€L&•ÏqUŒw˜¼¼}ˆÅò@\EE¥¥ñ”–ÆSVv‘qãqóæ÷ØÐÐP¢$¯¡¡a``ÀéÓ‹ ììÆ0pàrŒ‰‹›OUU¶ ýsNNS‘J› ýJñ{ÿþ/‘’²–––ºß6×L°°ðVÐkkoÒÜ|w®´4ââ8Š‹ã06ëóÇ:•ïà0› öì±WÌäVVAèèu©oßNQèÏØØ —ùܺuè±—žžŽP(¤¡¡ôôô6Ó´gVV=R~©TLnîž.÷'}üyÆw™¬ã@BBîîîèèè0f̶lÙ–-[øôÓO»4?®Y³kkk¥«4{r~m‹gþ*þEgú011ÁÍÍ '''´µµ:t(W¯^U‰wýŸî”ïúõëDFFrìØ1,,,¨©©QœDPE~GöÑ]ûSÕþÛ«_gõ¿×vÞ}÷]Ú ¹ººÒ«W/,,,hhh`òäÉ\¼x±GûúòßÇ¥~jtŒ?ýéODEE1qâDrss{|||˜‹ÅìÙ³§Mš¾¾> ,Àßߟ––=z4Û¶mS¤III!>>žøøxœœœ˜?>‡ÉýŸ/¿ü’]»vññdzk×.víÚ¥dÃ555$''séÒ%ä“O>ÁÅÅ…¤¤$²³³•nd¸ñïˆÞÔÔÔ!ÿ &0aÂJåþ{FF‡fß¾}Šé:ªwìG¨º~~Pþj¨q?´UMh>Øm#mJ•b7K~lµôx)Ã,ÐÔÓì”~/1ômõéÞ[eþ ?‘¶<€oHz! ¿ÿøQt°AŒ§?8©[ó ¥®Q¦Q¦mmì#ì)9TBcq#-u-XŽ´T¸´ µ4HºÄÿƦÔdÔx á !×6\S¢×߬G,S{µM]M\^sáÆ¦ º©)¶Sm97é\+ÞU—å -ù) ©XJúÊt•ÊV›S‹¬E†™Ÿ•+HFýŒp\èHâœÄö73"h,i¤<®\e¾zVzH庾P¼sõ¡no]•õ÷ Š¥$/IFËH C#CômäZjZeSi!Ò"ãö¯·)þ¡«QVJ®ÇÅ>Ìų̈I¯é±~u©¢œÚ–f¦9:ñm¾|RŸâàÈ…ò²VÁ­E.n7ÔóKqQÛ}T*åti1ûoå3®½R€kCæÒ*+86ö9Ž øàŠòI»¼:¥ dWW¡«¥Å O/>ÊHSÐý,,™åäLøÏGZ×áv9Ãý(ïû|8‚F©„å‰çTÒAVu-R)C{õæ|¹P=Ø>ÃbÙ›ÔÊGè,((@$1~üxÅÞÈȈºººß6Òûóõ×_ãééÉíÛ·Ù¾};S¦Laçθ»»+ø 6Œ àããÓ%þb±˜É“'cbb‚‰‰‰âÍ=ggg*++ihã$æ£Äùóç‰DÌ™3‡¯¿þ€ˆˆâããÉæîÓ.ÿÔ©Säææ²}ûvžþùvÓ57×ò@ν‰n ‘4bo?®Ý—©©©¼üòËøúú’Ïoošg£¡¡¥åPÊËåNÖÖA46 Á­ûai9±¸±¸‚‚‚Ãxy­ÀÌl€B¾›ÛBš›ë(.޽wv§¨èŠŠ~ÁÝ}1aaÑüðÃPòóóù)¡”ùœäççGii)TT¤2ΜùEE';Ðü—J>‹TŒ¦¦ŽJi«ª2ÐÐÐÆÖv$%%ñí¦»ÓŸŒ:ÜÈdR44´zT~K‹Ü÷ÖÖ6ìQù÷nò˜››«”ö^ûxåïJÿxÒÇŸ§}|UnÃf~þùg¾ùæ&OžÌ§Ÿ~ªòü8`À¢¢¢”ÞìïÉùµ=þùÍÿªB$qùòe._¾Œ¹¹9/¾ø"{öìé6ÿ‡]>€ØØX<<äWNš4‰¯¾úŠE‹uY~[öñ¨ì¿£ú©B_³f III$&&rðàAþþ÷¿+ïܸAQQéééèëëóÎ;ïôèw\¶ýþÞõS£}øùùqèÐ!"##ñôô|(ããï ™5k/¼ð‚Âﯧ²ÿ'EKë®ÿsîÜ9ÅZN[[›èèhùÃþ ”ï•W^i°V´ö?:㯊üöøggg+êwÆAAA…BEp«³úwÇ~î×@ àèÑ£*/]ᯆªB)òTr¸„¸€8ÒV¤!“ʈ ˆãÒó—ä¾ÚÿŒ(KD|x< Ï%`Üßß­¾*Ñ Q …û )þAùäÎò—Ç•“½6›á? GËP ·7ÝÈ\•IMj ösìÕ-ù¡¡©ÁÀ$ø§`ÂÎ…1ü‡á4W6“üRò} ÎM:‡‘›!q!Œ<9¤piÁ%Û)¶„'†3hÓ 445O gXtë+Øê®×qö¹³44Š£ü”`eA‡‚äòŽ‘«çgœWÊëñžy[ó'•œ¸·ût$ˆ°„0‚ŽÑ\ÝLÎÚ•u m’’ù^&>}Ú>¡¤¬Ÿ³F”%R‰6ösìé3½O+ZGúÓí¥‹T,UÞÀȵÈеÔUYŠQ õùõЧ¡Hî5Á­ÎÚÀ;>L诡ì  ¹æûzŒì£whoœ^t"뽬.éh†c_2¦E°møH´44ȘÁð±rýI¥„?Ì@3s.NšNüsSÈ®®æ¥„3J>>xzz’››Ëµk×J¥„‡‡ËûÌÕ«Œ;–]»v!ÈÎÎfêÔ©)ñÙ´i|ðA«;Ò;ã_UUŵk×ÏÍ›òo‹æçç?‹Ëææf<==ñõõ%//ÌÌLÒÓÓ‰ˆˆPËW;vì@&“ÆÛo¿L&ãå—_VÐ]]]9xð ©©©ˆÅbJKKÙ½{7†††÷,J›ˆ `‘‘FÞ¯ |ûm_Äâ*&N<Åܹ7™=û£F} È¿g•““ƒÑÑѼõÖ[¬ZµŠ²²2ìì쨭Ígï^gÜÜ1wn>YÈdðVªƒ»û˜5+“9sn`h؇äWVT¤rà€ƒý¹so‘ƒ±±3ß}׉DŒ¦¦.þþ2}z‘‘…Ìš•N¯^¾;6Faç®®®¬[·ŽŠŠ ñôôT\W[{‹˜G¬­ƒ˜9ó ‘‘¦M»H¿~s”Êçà0 „J©©{·Û¿¶ö{÷öÅÁa2³g_cÞ¼¬­ƒ(/Wžß˜:u*ÿýïilläĉ=bªÊ—H9}z!AA›³ïz´lܸ‘#GŽP]]Muu5ÇWÉ>UùÛëOúøó4Œ¯‘‘‘…BbbbÐÒÒB(rêÔ]ÿôã?æÊ•+¨¬¬T|£IÕùqæÌ™¤¤¤(6áï §æ×öøwæt6ÿw¦---¶oßNff&EEE$%%Q^^®Ð*ü»ãÿt·|€‚¾{÷nššš°±±áüùó*ËïÈ>ºkÙgõS¥þw••¥¨ç­[·pqq¡¡¡òòr._¾LQQÉÉÉxxx0tèÐíçÓ~‡ú©Ñ>vî܉žžßÿ=B¡¡PHNNαþè •••Œ5Š¿þõ¯äççSPPÀ´iÓÚ=iÞÖ¯_OZZ………¤¥¥QQQÁŸÿüç.•£©©‰ˆˆ6lØ€@ `ÿþý*óWE~{üóóóqvvfÑ¢Eäçç“••…D"ÁÛÛû‘ØÏ˜™™±dÉ’V×Àª²~V…¿jt)nÁo÷E„'†«µñ#. £ã"GúLïCâ쇻1ªßGŸÁ_ F”-RùôדŸ>ˆ2EäoÏWÛÇ=Ð6ÒfÈWChºÝDÚò4¤ÍÒgj yÉ­?Ný˜ûÓC•cg`ÈÿF†“Q]©òé¯' [GQUÉg9™ê‰ékë°'d·Å,=ÿ+ÍÒ'«½þúë,\¸°UÐK 5ž̘‘Ê•+qãÆnµ2ÔPÛ‡O%¢££IIIá£>R×O 5Ôö©†j¨¡Æu€ëÁ³àRC 5ÔPC 5ÔPC 5ÔPC 5ÔPC 5ÔPC 5ž hªU Æã‚ #Am^Í÷ ðû®+\{¼œú}ô :ÄÀ>•íà³Ñç¥Îjû¸:¦: ÿq8ƒ6BSçÉ:cÇObvßžûxìG„²ÒkP—ÓÎÀ“ã&±ahàSÙ¿¶ŽàõOçØÑ˜éêò˸‰l‰Žæ“ïš$L˜Êsv¼àâFú´ÆöQíû„ýŒMȘA•5^æ,uÀ•©³˜dïØfúéŽ}q31åß™WzTãúØshôx^8Ç›IÔï3„ê¦&Æž8ÆÑB&MÃFß Gù;99±uëVŠŠŠ(..nEå•WX²d aaa¼óÎ;…BT¦ß‹¹sçâááÁÚµkUÎ?tèP¥'&&†“'O¢­­ýX´ÏêÕ«ÉÉÉaÚ´i,[¶ŒÒÒR&Ož¬–¯"ñóóãÒ¥Kìܹ???zõꥠ5Šææf¢££?~< .dË–-J<²³?çÔ©946–=výwìØ˜4é4ööÏáêúȤ2.F^¼»y¹š>3û c®£ø­±X -=^ŠÏFŸV<4u5ñßãϵ®‘òj ûÛ>¡¡¡­÷GÞè˜ëúz*’z‰‚VŸ_OSEº–ºH$ˆ‹ÅmÊqÛ¬ÿ—…L*SüîµÎ ]K]ò¶å!m”bØ×ʤJÄ¥b•t ©«ÉÀ÷’¶<ÆâÆ®/âÓkûlô¡¥®…´i=’ßÀÁ€Q åqåØEØaâiÂõ ×é¥|bGý=(1yûii c®ƒ¤ABsu³ÊöÓQþÇÉ>J•``g€çûž¤,Ké1ý¥VV(þÞ8‚Ú–f–ÿUµ„‰)/¹õgâÉŸxoÙÕÕ¬º|‰Æ/Ņʃ¾¦&ŸúÑKW—%çâ©kiQÐrkEÜ‹±ÔÓ£^ÒBQC}+YzšZ¼7È·“."‘ÝÕß¿‡b¥¯ÏæìL$\ŒM¸P.¤DÅÔêij±ah¯œÿ•Âúzõ ûŒâû[ù8²~h8{ºÇøÅwß}Gttt+ú_|!ïÚÚXZZR__OUU•Êt…ëé±~ýz^{í5$‰Êù“’’GGG#‰ˆŒŒ|,ÚÄÃÃ×_ÀÀ@>üðC222X±b›7oæÈ‘#jù*Ú_AAµµµ…BRRR”6Ÿbcc9r$gÏžUü¾{·ü{Fššº˜šº £cƸq‡8~|<Ês·÷x{¿ANÎJJΠ©©¦¦òòEEEñÁàãビ“'OždèСdfÊ_Ô Ù‰¹¹))kÑ×·bðàÕ¤¥­#;{ ?UXø·nÂÒÒ—AƒþFròj®^ý’þý_ÆØ¸/Þ=yS\ÇŒ—)(8ÊíÛÉèêšR[{‹ââX$1%%gºÔ#G~‰‰‰ ©©ÿd ú>ÅÅq\ºô·»~Euµ’^ï‡M0õõÌÍâç÷ññ/!SIþèÑû14´!-íCttL°µ áöídÕý#€#GŽðí·ßâëëˆ ˜7oß}÷Ý#‘?cF*EE'¸yó,,¼PܦŒö`<À m ªS«»¥?×å®èZê’ôBRå7p2@Ú %o[ßRw­Ž²Ø2¬€¶±v—ô×­ÅHƒ¾Ø ¡­©)õùõªÙ ùû¨JªÂq‘ãCé_ozùÐ[O¹gΪœÇROþ–{Yc#+“K¤ ³ì‘¶6úZZ4þ¶X{s +<½˜øËOÔ¶´ö32ÁBWs]%Æõ±'¥â¶Ršw||¹PVÆÉ’"¥ß¿É»Á–€`þá;„}7óØ›Ÿ×¦Œöàif޶¦&É÷ÉSãÙCby/¹õìé ™LÖiÜÜÜprrB[[›¡C‡rõêU•éëÖ­#>>žcÇŽu™?Àš5k°¶¶fܸqM{ܹ£´´”eË–!‹ ÂØØ}}}Õò»ã¸Ê¯Ê½|ùr›t©´‰ªªlôôzµI·°ðaР¿qäHÕÕ9m¦Ùºu+?þø#×®]£¬¬ SSSš›å㳃Ã&ã€L&•ÏqUŒw˜¼¼}ˆÅò—/**Ò(-§´4ž²²‹Œwˆ›7¿ÇÀÀ†††%y ¥€ NŸ^h`g7†—clìH\Ü|ªª²;÷9¦áä4©´‰ÐЯ¿÷ïÿ))kii©ÀÌÌ ?¿»A¶ÜÜ\jjî¾TZš@qqÅÅq÷ÃÕõy•\±± bÏ{…£ke„ŽŽQ—ÚùâŋįÆK¿~ýX¼x±J®ž’ûvŠ¢ýŒpq™¯r€«ª*›ÆÆ2$’ÆvÛ,99YQ¿„„âã㉉‰A_ß¿GÊ/•ŠÉÍÝÓåþñ¤?OÃøÞù×ÆÆ†øøxBCC)))¡_¿ÖWm'$$àîŽcÆŒaË–-lÙ²…O?ý”ëׯɱcǰ°ßQSSóPÞ„ÿÓŸþDTT'N$7W~C„*ò×®]ËêÕ«Yºt)cÇŽÅ××—7þ6þ9áëëKpp0ׯ_`ùòåœ={•ôó8ׯ³öë¬þ=ž²Ÿ¶ôs¯o÷î»ï€H$jÓèÕ«4440yòd.^¼øHüߎÚGÕñá÷¬Ÿí£§ì÷÷†X,fÏž=mÒôõõY°`þþþ´´´ÐØØÈèÑ£€””âãã‰ÇÉɉùóç+<_~ù%»víâã?f×®]ìÚµKɆkjjHNNæÒ¥K<È'Ÿ|‚‹‹ IIIdgg+ÝÈp?:ãß½©©©Cþ&L`„ 888 •Êý÷ŒŒ >̾}û¨¨¨è´þÝÿŸûSãÉ‚ÊQ!óÁæhiSz¬3´ ´(=^ŠÅ0 4õ4;¥ß AŒ€ò¸ò.ñù錋‘ ø6€‚ÝøýÇ/ÅÉ5.Lw¶Up¢Ã…©XJò’d´Œ´0t6ÄÀNà2p0@K_K‘îÆ¦¤¼žBà@EPó^Ô߬§öj-¥GKÉÛ–‡í$[%º©)¶SmÉù õ&OÕå*~ó+". øFÀÀuñþÈ[å:ÔæÔ"k‘aægöÀ:4êg„ãBG²ÞËj3#ÒÞá½»”_ÏJI£<ˆqaæÒßJGÒ ÿ_··®Êúë.ZêZeЏùÕM ¿-Ä>¾KöÓQþÇÉ>ÌüÌ”NÔõ\MLYìÚŸ·“Ûwú¹¸1¶òÕ#—*Ê©mifš£UMM4HZ˜âàÈ…ò2Ep `Cæ–$Äslìs¼ëÓú;yu"²««øQp‹ÍÙ™LstR¢ûYX2ËÉ™ÿ—Ú:8{év9ÃýÈÄ“?ñõkü{X Ÿ©\÷¬ê*Z¤R†öRŸÊ}Ö1IJ7©•>Ð)‰¸|ù2Ÿ|ò ;vìàÅ_ì}ذa,X° ÕÕBªæ0`QQQ¼öÚkU{œ?‘HÄœ9s¨¬¬¤¾¾žˆˆâããÉæîÓ.ÿÔ©Säææ²}ûöÓ57Ë߆ÖÑ1¹Ï®n ‘4boß~PÔÎÎŽÔÔT^~ùebbbÈÎÎÆÐÐP>÷Ue£¡¡¥åPEzkë …ŠàÖý°´ŒX\‰X\AAÁa,-‡`fv7(íæ¶ææ:Š‹cïÝf£¨è~ùeŸ&“þ<íãkgó£X,fòäɘ˜˜àîîNß¾}ù©ƒûl ™Ÿþ™o¾ùFé µØØX<<<°±±añâŘšš¶;O?üüü((( 99OOÏV›sÉïß¿?_ý5“'OfûöíÌ›7+V°s§üuˆD"Æw-hdD]]]—õó8Ö¯³öë¬þ=‰µŸÎôòЬY³HLLdݺu­è7nÜ ==}ûöñá‡2oÞ¼GÒï:kULJǵ~jôŒý>®°°° 11‘/¾øOOO|||Ø»wo—ü¯sçÎáîîN`` Û¶mcÇŽ|ýõ×­ò½òÊ+mÚ6 8­hbÒÚÿ茿*òÛ㟭x!ä‚‚‚ …ŠàVwüÏ®ØÇ+¯¼ÒæÕ¿O³ý©ñxB)òTr¸„¸€8ÒV¤!“ʈ ˆãÒó—ùµ`Á?#ÊOÂs ÷7Æw«¯JtÅFÔBá¾BŠP¾¸³üåqåd¯ÍføÃÑ2ÔÂíM72WeR“Zƒý{uK>x}è…¦®&~ŸûžNxb8#NŒPÐm§ØžΠMƒÐÐÔ <1œaÑÃí^Ÿ_¯xŠäÁAƒ"0su×ëÐøP  ä§+›:Dع0†ÿ8#W#ÎÏP¾¢Àã=ò¶æ)N*9qo÷'èHa a ¢¹º™œµ9*×_Ú$%ó½L|6ú´{­3X?g(KDýͶ¯`Ó6ÑÆ~Ž=}¦÷éR~Ý^ºHÅRå ‰ Y‹ ]K]•õ÷ ÐÐÔ`à?üS°œÿÃi®l&ù¥d•ìG•ü‹}ôíÓ‹N)“ìɨª$¯VÔ&ÝDG‡ý\‰pR~C³E*%äøaš™sqÒt⟛Bvu5/%´¾êjM5!Çs³®–¤É3èkdŒX"¡B,æä¸I¤MÅ/ã&ânbÊøÇ•ò¾?x(Ÿdep[ÜúêÇ÷ æÔøÉ¤N™IÜøÉT55ñ^Šê§ÅR o%_äóá#èkd¬pŸQŒ²íÃR÷¼•”Ø£|### …ÄÄÄ ¥¥…P(äÔ©S€üðíÛ·“™™IQQIII”——+ÝÞý6mÚÄ|ÐêÍ4UóÏœ9“””Å[Ê š››ñôôÄ××—¼¼<233IOO'""B-_EìØ±™LFXXo¿ý62™Œ—_~YAwuuåàÁƒ¤¦¦"‹)--e÷îÝŠ ”|QÚDllˆŒ0zô~ùøßRÏ·ßöE,®bâÄSÌ{“Ù³¯1jÔ·€ü{V999øøøÍ[o½ÅªU«(++ÃÎÎŽÚÚ|öîuÆÍmsçæ‘…L&áÀå<ÜÝÿÀ¬Y™Ì™sCÃ>80€ŠŠTðbР¿1wîM""r06væ»ïú#‘ˆÑÔÔÅßÿC¦OO"2²Y³ÒéÕË—cÇÆò—««+ëÖ­£¢¢‚ÂÂB<==qssûma‹˜G¬­ƒ˜9ó ‘‘¦M»H¿~s”Ê7}útd2™ÒãáÑýïRÕÖÞbïÞ¾88LföìkÌ›W€µuååÊó›DÒÈéÓ Úü[û|×#ö÷{Ë¿»‘òŠŠN0gÎ æÌ¹¡°¯;xõÕW)--¥ººllliùÛëOúøó4Œ¯Ý™«ªª¸víšâ¹yó¦bÜhøí ì?þ˜+W® HHH ²²Ri~½Ã÷îÝ455accÓ£WÜíܹ===¾ÿþ{„B!B¡œœ•ä_½z•±cDzk×.ÙÙÙL:•  ù b2™ ÅÆßµk×J¥„‡‡«¬ŸÇ¹~µ_gõï t×~:ÓÏdee)êqëÖ-\\\hhh ¼¼œË—/STTDrr2JÖ³ÿuÖ>]~¯ú©Ñ1zÊ~GTVV2jÔ(þú׿’ŸŸOAAÓ¦MkuÍaGX¿~=iii’––FEEþóŸ»Tަ¦&"""ذa€ýû÷«Ì_ùíñÏÏÏÇÙÙ™E‹‘ŸŸOVV‰Dé…±‡=þƒü…%K–°páÂgÊþÔx<¡Áo÷E„'†«µñ#. £ã"GúLïCâìć*G¿>ƒ¿Œ([DúÊô§N>}eŠÈßž¯¶{ m¤Í¯†Ðt»‰´åiH›¥ÏÔò’["œú19ö§‡*ÇÎÀÿ '£º’å‰çž:=n AFU%Ÿådª'¦{`¬­ÃžQÜ7²ôü¯4KŸ¬þõú믳páB¥M5ÔxZ0cF*W®|Ä»ÕÊP£kÖ¬aÇŽje¨ñÄ"::š””>úè#uýÔPCmŸj¨¡†j}p^êüÔÛ[WíCÇT‡á?gÐæAhêÕx:°råJ®\¹‚••ÕÉ_ 5ž&(í"55’µ:‹ÓA§9=üt«Ä76ßàìØ³”,C°G@\`e§ÊT¦w†Žò_ý×UJŽ– ˆpcó rþ™ÃÍ/oª[ñÁÔÛTé´iÃþ7 - \ÿäʈ_F`5Æ ‡ù„_Çj”| ÖÐÔÀ?Æç¥ÎXZàòº á‰áXX¨¶°v6T¤7ñ0ÁéE'·aýœu›ém'ÙbäbDîæžýP¡Õh+ü¿õçò+—É|WùŠ1‡HìçÚchA¿×úžŽ™¯™‚îû™/CvÁ"ÀûÙö„ž ¥wxïÓÿˆ_Fà¿Ç_§r&ß;¤¿¾>žÿð$ì\aç|Äa¾AG‚O GÏZOñ{OÖïA죹¦™óÓÎ#üYÈÈS#ѳÒS9¯–†?ŒÇëleÍ_<½É˜AÕÝò9ñ¯!þ¤MEÚÔY¤»ÿóÊáÑãyÑÕ +kzéªVÆ~Æ&Šòx™[°Ô}W¦Îb’½c›é§;öÅÍÄ”g^éÑþ5®=‡Fç…³q¼™tA=è>C¨njbì‰c-paÒ4lô»öC;;;„B!x{{ãíí½½üûœZZZÄÇdzråJÂÂÂXµjB¡ÐÐPEþ¡C‡*=111œ ùjZ†ZJ´úüzj¯×Rw­Iƒq±¸µQëjâþ¶;9ä “Ê¿{­óbðƒ1jŽ©—)¶“lѳQ}òÔÔÕdàûI#ÆâÆVtAŒ€Â½…T]ª¢.W^¾æêf ûbáoAÖê,*+)ü®ëÿ¾ŽÛ_ÜzDÿ´ˆZ(+Ç.Â׿¸r}ÃuŒÜº¬¿Ec±<@~å zhêj¸?ú¼zR^MQ¢õdýºk%‡J(ø_žï{ª\7‰LÆôS'ø,'“„2!ŸådRÝÔ„Å=¨Âú:þ–|‘¨ gH{CGãkÑ ^vÀ([;D-Í­Òikj²5p1!£0ºoq˜[+"§¦šœšjê%-5Էʯ§©Å{ƒüX’ŒDvWÿÈÿF†ÐÛ ‹^Lwì‹­êA =M-6 êÂY ëëÕî3ŠïoåóÕõ«¬Ð¥|ÎÎÎTWWSXXHVVéééÊûŸDBHH}ô§OŸfýúõTVV*mP$%%)ž7Þx‘HĘ1chiiQ¶S==Ö¯_Ï_þò$‰â÷‚‚¢¢¢Ú|KWùzzzœ?ž«W¯2cƌǪM<<}Fco?GÇ»tQQQTVVâàà@pp0 x÷$iHÈN¦N½€£ãÜÝ3wn>Ëô3Rñ÷_Mþ‘ÈHýû/ ÿ—16îËÑ£aþÄÑ9ÂÀËA,]]SjkoQ\KIÉÒÓ?æöíd•õ7rä—Lœx ;»qØÙeêÔó ö/¥4ÕÕÕ¤¤¤(žû?RmcLŸ>áxzF1~1U–?zô~¦Lù'§©¸º.ÀÖ6¤K6$ضm£GVŒ³gÏ~dògÌH% `66!xx¼Êüù%89MU9¿¹¹úúVhiéÿf‹˜˜ôSÉ>z¢ü}ûÎdÞ¼\\æcmŒ­mÖÖÁ¿Ù–.ÞÞÞøúúråʆ öT?OÃøÚÑü¨ ½³ùñĉ 6 SSS–/_΄ ‰D*Ó»‹Žø«¢ßî–ÿaû»~ùo]ñÏÚÃ_|Á—_~ÉÙ³gÉÎΦ¾¾žªªª+¿‡‡©©©$$$pôèQ²³³166nU¢££9~üx+úõë×ÉÌÌ$##ƒºº: Ô 5º 777BBBxíµ×8sæ _}õ«V­âý÷ßï²ý> TVV’žžNzz:uuu”——+þ‹å{83gΤ  €ùóçLHHÁÁÁ ¶¶¶L˜0!C†0{ölrssY¶ì®ÿšššÊ†  áÕW_¥¤¤„©Sïú?;vìàСCŒ9’!C†0wî\E€}öìÙ\¸p!C†œœÌgŸ}ÆŒ3(,,ÄÂÂ]]]<<<ðòòâÌ™3øùµöÏ;âß]þ;wîäÂ… L™2…Å‹“ŸŸß¥úw¸¥Âúµ;ö×]þj¨Ñ”w75ÚOØTÑ$ïh½uñ|ßM]Mª/W#©— K;¥kêu|åPgùÝßt—w„z ‰óq^âLîæ\Šãõ/¯Nù«Ñsp]¥.I/$)~Óí¥+oÇò&²Ve!m’b6Ø -C-4õ4‘ХдN/8áø¼<ÖPРÌ{…+.Q.\˜u–ºÖŽ«a_CtÌuÅû+M IDATÐ6ÓFÚ(¥÷¨ÞT§U+¥q_éNÕ¥*ÊO—+ý^¸·ï Þ xgE‹(>PܦŒö`<À m ªS«ÛïPFÚô5ÀÀÎ m L}L©Ï¯§þf=i+ÒòåtÌäA½–Ú…ÝwWÿNH¤ämË#ðû@ê®ÕQ[Æ€UÐ6Öî’þ²ϪÛ[—€o¸yq™GåÀHOÖ¯'ì£*© ÇEŽT×%nxÑÍùñ§¸YWÛêÃÁÐ/s ¦ÄþL^­|Ñõ²ûÏs¿W¤{s +<½˜øËOÔ¶üêgd‚…®æ:º4J$ŒëcOJÅm¥4ïøør¡¬Œ“%EJ¿“wƒ-ÁüÃwûnæ±7?¯MíÁÓÌmMM’Ƴ‡Äò2^rëÚé‹„„ÜÝÝÑÑÑa̘1lÙ²…-[¶ðé§Ÿ*¥ûÓŸþDTT'N$7·õ Î5kÖ`mm͸qãÚ”³nÝ:âãã9vì˜òð'S­·%ßÆÆ†øøxBCC)))¡_¿~U{ܹ£´´”eË–!‹ ÂØØ}}}Õò»ãS¹Ê¯Ê½|ùr›t©´‰ªªlôôzµI·°ðaР¿qäHÕÕ9m¦Ùºu+?þø#×®]£¬¬ SSSš›å㳃Ã&ã€L&÷Õªª27î0yyû‹å¸ŠŠ4JKã)-§¬ì"ãÆâæÍï10°¡¡¡DI^CC) ÃÀ@~]ÜéÓ‹ ììÆ0pàrŒ‰‹›OUUç/Á99MÃÉi*Ri¡¡_)~ïßÿ%RRÖÒÒR€™™™Òâ?77—ššÅÿ¥¥ ÇQ\‡±q?\]ŸG 8Öùüê0› öì±WÌÔVVAèèu©/^¼Hll,±±±ôë×Å‹óÝwß=2ù·o§(ÚÏØØ —ùܺuH¥¼UUÙ46–!‘4¶ÛfíÙ‡•U`”_*“›»§õú±©‰ôôtz÷îýTŽ?OÃøÞÙüؽ³ùÑÉÉ ___‚ƒƒ¹~ý:Ë—/çìÙ³øûûwJï.:ãß™~­­­»Uþ‡í?<ìúuÅëÌ?ë&&&¸¹¹áää„¶¶6C‡åêÕ«=Rþµkײzõj–.]ÊØ±cñõõeãÆ­Êþî»ïÐfpÕÕÕ•^½zaaaACC“'OæâÅ‹êÝÂõë׉ŒŒäرcXXÈoMª©©Q: ¤ŠýþÞ‹ÅìÙ³§Mš¾¾> ,Àßߟ––=z4Û¶mS¤III!>>žøøxœœœ˜?>‡ÉýŸ/¿ü’]»vññdzk×.víÚ¥ÔGkjjHNNæÒ¥K<È'Ÿ|‚‹‹ IIIdgg+ÝÈp?:ãß½©©©Cþ&L`„ 888 •Êý÷ŒŒ >̾}û/ÒuTUÑÙúùAí¯;üÕP£-¨2l޶‘6¥ÇJÑ1ÓAË@‹Òã¥X ³@SO³Sú½Ä(+ïŸÎ¸y‘€o(Ø]€ßü0ñ2A#P·ä#‚Q?#:’õ^–òâ÷r-u-ØL´¡¹ºIƒ› 6T^ªT·Lw¶Up àÆ¦¤¼žBà@EPó^Ô߬§öj-¥GKÉÛ–‡í$[%º©)¶SmÉù õ&OÕå*~ó+". øFÀÀuñþÈ[åº×æÔ"k‘aægÖnš–ºD™"n~u“Âo ±¸û†FŹ ÎŽ?K\`éo§£m¬Ýf9"Ú½º°=ýëYé!i”Ÿ&¸0óéo¥#iÿ¯Û[Weý= ´U?©XJò’d´Œ´0t6ÄÀNà2p0@K_«Çê×SöaægFMzM—êíenAò”¤UUrü°Rp«+XäâÆØ>ÊWÖ×QÛÒL˜ÍÝújiSßÛ2¯°$!žccŸã]ŸÖoåՉȮ®âGÁ-6gg2ÍÑI‰îgaÉ,'gþ_jR«¼—n—3üØL<ù_߸ƿ‡òi@Êõʪ®¢E*eh¯ÞêöÇËÞ¤V>X ³¹¹™Ÿþ™o¾ùFéŠ??? HNNÆÓÓ³MçyÀ€DEEñÚk¯µÉ{ذa,X°à®îèH¾X,fòäɘ˜˜àîîNß¾ò“éÎÎÎüîíqþüyD"sæÌ¡²²’úúz"""ˆ$›»O»üS§N‘››ËöíÛ;±mùœ¡£c¢ô»Ht‰¤{ûö7ýìììHMMåå—_&&&†ììl ås_U6ÚXZU¤·¶¢±Q¨nÝKËÁˆÅ•ˆÅÆÒrffwƒÒnn in®£¸8öÞmlŠŠ~á—_¦‘‘ñ)aaÑäççàíí­Ô_JKKill¤¢"qæÌˆ‰qP<ß|c­nAë\÷·î‡T*FSSG¥ö©ªÊ@CC[Û‘¦ki‘Ÿ<ÖÖ6ì”§T*EKKëw“/“IÑÐÐêâØZ‹ŽŽ©Ji﵇Qþ¶p§½MMMŸªñçi_UÙØìh~,((@$1~üø»k%##êêäcCgôî¢3þé·»åØþÃîŸ*þ›*þYg‰D\¾|™O>ù„;vðâ‹/öHùû÷ïÏ×_Íäɓپ};óæÍcÅŠìܹSIþš5k˜5k‰‰‰¬[·®õþǤ§§³oß>>üðCæÍ›§^ ¨Ñ#ˆÅÃÃ/^Œ©©©b£ªý>®°°° 11‘/¾øOOO|||Ø»wo—ü¯sçÎáîîN`` Û¶mcÇŽ|ýõ×­ò½òÊ+mö]€ÚZ¹nbbÒŠÖUä·Ç?;;[°¿ƒ   „B¡"¸ÕÿSÕõóýÜ{õ¥*ö×þj¨¡*”"O%‡Kˆ ˆ#mE2©Œ¸€8.= _üS0¢,ñáñ$<—€qc|·úªDW,`D-î+¤øå;¶;Ë_WNöÚl†ÿ0-C-ÜÞt#sU&5©5ØÏ±W·ä#‚õsÖˆ²DÔßT¾BLÖ"#á¹LÓûtIÿº½t•NÉÈ$2d-2t-uUÖ_w`;Å–ðÄpm„†¦á‰á ‹¦RýZD-ò“n¿= Eòàgƒ I£¤Çê×öÑ;´7N/:µ 2v†MþÃÑÓÔâ¿Á¡dL‹ cZg'Ü=">ñ/Ó"Ø6|$ZdL‹à@øX%&::,èçJ„“òš2 ü§£ô75#qÒtÎOœ† 3ã~iUŽ«5ÕŠ[Òäô52F,‘P!srÜ$Ò¦Îâ—qq71eü‰ãJyß<”O²2¸-n}õã{ƒsjüdR§Ì$nüdªššx/%IõM ©„·’/òùðô52V¶Ï(FÙöa©ûÞJJìR¾?þ˜+W® HHH ²²²Õózzz|ÿý÷…B„Ba«+ÌfΜIJJŠâ-ÝV}xÓ&>øàƒ6ß<‹ŒŒD(ƒ––B¡S§N©$¿ªªŠk×®)ž›7åßÍÏϧ¡¡áwo“ææf<==ñõõ%//ÌÌLÒÓÓ‰ˆˆPËW;vì@&“ÆÛo¿L&ãå—_VÐ]]]9xð ©©©ˆÅbJKKÙ½{·"%_”6A@À"#Œ½_>¶Ôóí·}‹«˜8ñsçÞdöìkŒõ- ÿžUNN>>>DGGóÖ[o±jÕ*ÊÊʰ³³£¶6Ÿ½{qs[ÄܹùDDd!“I8p@ùw÷?0kV&sæÜÀаȯ8¬¨HåÀ/ úsçÞ$""ccg¾û®?‰MM]üý?dúô$"# ™5+^½|9vlŒÂÎ]]]Y·nâé鉛›Ûo û[ÄÄ8bmÄÌ™WˆŒ0mÚEúõ›£T¾éÓ§#“ɔ¶ö{÷öÅÁa2³g_cÞ¼¬­ƒ(/Wžß$’FNŸ^HPÐæßÚç»±¿ß[þÝ”ÿPTt‚9sn0gÎ …}ufªüMMMŒ;öÿ³wæaQWûã10쫈 ˈ, ‚! *‹¦æ’æšfZWÍüªÏÕû»EÝ[öÕûµ®W³k©Ù5Í{óJb.YfZ*¢* *‚ Ã6 ‹¬ÌÌïɱdFÅ ?¯ç™çÏùœý}ÞgyÎ9lܸ‘ÆÆF>Ü)ôOgЯºúÇöÜuõ*•Š€€ÍÂØåË—Q*•DGG«ÇÇ:Ü]áë*ßMÿÃ?<ìüé3~Óg|v7 Ù´iYYY‘ššJyy¹&üMÿ¥K—6l[·nE*•’ÍØ±c oýßÅ‹5á\¿~(//çìÙ³‘––†Ö‚µ€ÀƒpKþ·mÛFSSŽŽŽœ~‡‘…Ïýû9šn4‘¹(e³ò™Ò!³½z1IÒ“1ñ??ÔxœÍÌùïàh.TW²(åD§+Ç aƒ¸PUÉç9YBÇô;,Äl y#sOþJ³òÉj_ .dÆŒOͤO@ #?>ƒsç>æêÕmBaò!Ð)‰%==?þXÈŸ€€ ŸO‚ëáY0p <ˆ„"xRß~×£ùá¹Ø³ÃÓiÚÝ”ð}áôù¨O§¬‡€5¸ÏuäãÄÖbü0€¾ëú"?}ª3~Äh&÷è¸Ë§ÿ3(’¿¾žNg3sŽ Íêà°NÙ¾6„ baïΩ;ccŦðÁˆEOÿÐdïÞ½,[¶L¨XŽë›b˜0ᦦBaÜ#ãÇgàé9£ÃÂ0`ê;*¬­½™>]¦ùuéôÐóó8â77wÁÉ)ê‰Mÿ²eË(**ÂÑÑQxû"66–˜˜!JFFF›Gw ùäS sùsçpppx*ÃèLh­"55rqéEŽ…ãØ€c­^¾ºî*IÃ’(;R†t»”„°ÊŽ–éí®‹öü_úÇ%J~*A'å꺫äü=‡ü¯ò…Z|D˜:›âû7_¢NDu²õ$×ï~<·å9lŸ³Åa¨HÙ=ôößîÄÚÝœè”hìBí°ò±Bò Q'£èöB·6ßwí„…‡×ÖuìE…CÙÂÙ7Ï’õþ½1æ:Í——]° ³£çüžD§Dch£·Ï?z2èð žwÀõW¢OEã0ävG7èð B¶‡êãô"ŽG¸.ð¾Êï^1‚û\wìÂìðX衉ïÖþÖZ¿¾Ÿõ¥ÿûc`h y§÷’Þ„î ÅíU7ìBíÛ‰Ÿùh¾ÙÌÉq'‘ý"cðÑÁ˜8˜txû¿ `~:‚?xzîÐ.ÆúÇñVŸ’GŽågW^óðâü¸I ë®ßý„=-­¸0náÝð³µc®woÎÈh·6ßÉ­^VÖü3ë\‡æxwö ÁkI ¼zJPºÏÕMM ;t€Ÿ ¥œ=GS³ _"‘°aÃŠŠŠ(..¾ë{óæÍ###™L†³³3 ¾Ã!11‘˜˜¢¢¢X²d 2™ŒÈÈÈ6Ãxùå—ñññaùòåšgo¾ù&sæÌ!**Š÷Þ{™LFhhè}…ÿ8Xºt)999Œ7ŽyóæQZZÚêx!þ»ãææFPPgΜaË–-Ñ¥Kû!Chnn&66–#F0cÆ Ö¯_¯Fvö=:…ÆÆ²'®ýö=£GÃÅå<=_eÊ”k-Ѹ‡‡Îر'pu…“S$þþoaoÿ ¾#L¥Radd¤yÿÖ3SSS½â_¿~=G%((HóëÝ»÷#ÉûÍ›—ùæ›nìÞíóXÊþQÅïé9ÀÀ¿>±éÿä“O1b¥¥¥Nÿtvýª‹-[¶pàÀÈ‹/¾HVV–Ö%õkÖ¬!99™ ‰½½ý#ë_Ûëßõqo/ýÎÎÎÈd2ÂÂÂð÷÷Çßß½ý ùÓ̓Ⱦã˶ðööÖ„ÈâÅ‹)))aâĉ’~}Ë·=ÄGåOàþæ7úÈopp°Ö/..Ž#GŽhÉvvv™:tèŸ}ö™æ“§¦¾øâ ¦L™ÒæÍOCøw£#úÏÝ»wsðàA"##™5kR©TsâÓ0ÿxúÐÒ\¦ÝÕÇ‘ŽœûÚ —uWë(øoa»Ã¸¼ê2½,ðùÀ‡ì¿eã0ÄA§».tù702 åf -5-ˆ H›“†ä5 ]£º µøˆh,V@K–°& •»…§•)•T¥Ua 2ÀeŠ ††zû¿…‘þû#¶“±0E½BãVŸWOSEÆöÆ(È‹å­ü‹ŒEx¿ëÍÅÿ½ˆJ©Ò<÷[ᇱ½1¹sQ6*1ïaNej%òR¹^ù‹èóa2eÒXÜxÏå'“ªógh€ØVŒ¢AAsu³^~-<-p›éÆ©I§ð~Ç›ºKud/ÏÆg©eGË0s5£¥¦…ò„rœ'9cåkÅ•ÕWè¹@{ÇŽ>åw?¨”*NO;­ù¿úl5Ý'tGl{Û@uóüMÍßkh©k!sqæíÖÖ`DÆ"Œ,¼.Aö‹Œê³ÕOœ|”ì+ÁÌÙ ß}IŸ—ÞaíëÛÈ¡˜b%ó†wo~*”ræF¹~+kf{õbÔ‘Ÿù oÙÕÕ,9{†¿÷ëÏáâBm¥/±6$œ.ÆÆÌ9‘H]K‹ÆíZm 7ärìML¨W´PÔPß*.‘!ô âÝÔÓ(T·ËïŸýÃp05e]v –Vœ*—Q¢ç%×&"CV‡òæÉ_)¬¯î3Êw×óp57gUp(¯'ë°p X°`»ví"66¶µü™˜pìØ1þú׿2~üxNºm`U(DDDhþ?qâ3gÎlsÅÄÄ„U«V1þ|ŠÛºéË/¿T·?##ìíí©¯¯§ªªêžÃøøø°páBÂÂÂX¹r%.\`ñâŬ[·Žýû÷ ñë)ÔÖÖ"“ÉHOO×ZœˆgðàÁ$%%ižoÛ¦¾ÏH$2ÆÚڱ؆áÃ÷qðà**´ûÿ?ãïÿgrr6SRr‘È‘HLA:} ,à£>" ‰D‘#G&+Ký¡NDÄlmýHO_Ž©©ýú-%3sÙÙõ¨ÂŸ¹~}ööôíûÒÒ–réÒWôêõ––=Ø»÷öΛââÆ?KAÁOܸ‘†±±5µµ×).ŽG¡SRrüžê`ð௰²ò #ãàà).NàÌ™¿ÜwTWk•ë8:¤¾^Š­m‚‚> 1q6Ré½â:t7ææŽdf®D,¶ÂÉ)‚7ÒôÿI¥ìß¿Ÿ;vÈêÕ«™:u*»víz$ñŸAQÑ!òó¿ÇÎÎ~ý–‘”4—ë×÷éåßÖÖSS M±µõùMoÉ©©ÉÕ)‘þ=&0`ÀZNŸ~‡ÚÚ|D"C”J2Y2ÆÆÆôêÕ [[[ áÌ™3Fÿtvýªo?Nrr2"‘ˆÙ³gcii©q?t覦¦X[[³hÑ"öìÙ£¹ÄþQô¯íõïú¸·—~wwwª««),,¤¸¸Xkl¡!íó ò£k|y ±XÌþóìíí™›7oæÄ‰:tˆÏ?ÿêêêðððÀÆÆ†}ûö1bĈVãÐöÂ×ånll¬3ü-[¶àççÇòåËqpp`éÒ¥¬X±Bïü·ÇƒöŸ^^^DDDFnn.ÇG¥Rñá‡òÓO?=ñó_§mÓ¼ÁÝ_lªhÀ¸«1¾ú"2Q}¶E½¥\©Ó]dÒþ‘Cºü{¿í­nhõ R¦¦à>Çkë®Q¼·¿øé _ #¬í;_[ ÏEž¸Nu¥Ë .XúX’¿%_oÿž‹=ñXàÁ©‰§h©kiånÞñ­##”JºéJu¦¶Ä;Æ›ª3U”Ó6~[ˆÿjz¿×›¢½Eï)n3Ž»aÙÛ#ª3ªï¿ÁYaÖà 3g3 Œ °°¦>O÷b¾qcu;)oââ’‹(›”Øô³ÁÐÜ‘‰3‰Ê%¹s û.ŒºËu”Å—Ñ{IoŒ,î©üÉkÜ^u#mV ­ž‹<1¶7&õµÛ*SgS¬|¬H™’B}¾º<$¯Kù6„SN=qòQ•Z…ÛL·+3Ws ülíx1þrkkxû7?Á ‡êôoo¢þʽ¬±‘˜Ôä %ýí»bad„©¡!¿MFÞîÀb_?Fþ™Ú–ÖÆÕžVØ›`+6¦Q¡`xwÒ+nh½ó^@ §ÊÊ8RR¤õü›Ü«¬Èߟcg~.ßæå¶ÇÝðµ±ÅH$"íŽøž=RÊ˘íÕ±»/T*U; ߎ$&&III ={Þý(Ï?þñ,X°€Q£FqíZë +V¬ 11‘Z/œ[YYáåå…D"ÁÈȈàà`.]ºtOá?n‰QZZʼyóË儇‡cii‰©©)Bü€§§ú¨Ü³g϶é®T6QU•‰I—6ÝíìèÛ÷/ìßAuuN›ïlذ~øË—/SVV†µµ5ÍÍjýìê:WבÄŹ¢R)Õ}\Õ†ÿ‘ÜÜÈåTTdRZšHii"ee§>|ùùßafæHCC‰V| ¥€ 33õqqÇŽÍ pv~ž>}aiéFBÂ+TUeëSHÆ!‘ŒE©l"2òßšç½zÍ&=}9--uØØØtÛÈvíÚ5nÞ¼ýaMii2ÅÅ '`iÙOÏWõ2p¹ºŽÂÑ1œíÛ]4Y‡pÄb‹{ªçÓ§OO||<={ödÖ¬Yz¸:*þ7Ò5õgi)ÁÃã½ \UUÙ46–¡P4ÞµÎî&a’~¥RεkÛ[Ï›š8þ<]»ví”ú§³ëw}X¾|9K—.eîܹ 6ŒÀÀ@Ö¬Yó›~ÈÀ¹rå ‹-"))‰GÖ¿êêßïæ®Oú“““ñööF,óüóϳ~ýzÖ¯_ÏÚµkï)ÿBþÚê_\~Ú_ÞbÙ²e¼ÿþû„††RSSÓæ8 K—.ØÙÙÑÐÐÀ˜1c8}út‡¤¿½òÕ}ü?¬ü <Øüæ^ôß²eËèÖ­Çâò(—ËÙ¾}{›n¦¦¦LŸ>ZZZhlldèС@zz:‰‰‰$&&"‘Hxå•W4ž¯¾úŠ­[·òÉ'Ÿ°uëV¶nݪ%Ã7oÞ$--3gÎ •JÙ»w/Ÿ~ú)¤¦¦’­u"Ãè ¿=÷¦¦¦vÃ9r$#GŽÄÕÕ¥R=~¿pá?þø#;w¢Bgþõå~úÏ+W®0mÚ48€¦<ÛÚ‰ö$ΞNô¶ Ùö³ÅȈÒ¥ˆmÄšRz°»þvˆLD:Ý4NJyBù=…êݧ§&tG(Û úWV~Vš1swsü?ö'í4¤;¤d.Ê$gy~ÿð»§p®~v•ô…é„í Ó5O}~=µ—j)ý©”ܹ8vÒr·°Æi¬9µ^ä©:[ůÏÿÊ©I§~#¥ÏŠ>øì¯wÚjsjQµ¨° ²¹ïrj©k¡&«†üçS¸£—I­·ø»Ns¥kt×Vio©kÁq”#ÍÕÍ(8Žt¤òL%J¹j#Æ© §8ÿÎy êÿ»ë]~4ùñµ"ò×Hn^¸IÒ Im·,zZà6Ë\ÔzÞXÜHK] öƒo±ahn¨ÉÓ&6A6Z;Ò”Âú:j[š‰r¼^sC#ê[ZØfzx1¬»³Ö³3åÔ¶43ÎMBUS Š^tuãTy™Æ¸°:ës’90ìÞh}ÏEn] ÙÕUü ½Îºì,ƹI´Üƒìì™(qç3R[ù=s£œ~`Ô‘ŸùúêeþÙ?Œµ¡áz—ÁÅê*Z”J‚»»rŸuž³ïJFå£3tå5¸ IDATÊårÆŒƒ••ÞÞÞôè¡>Z×ÝÝ33õQ‰AAA––†¯¯o›ƒïþýû3}úôVG'Ý¢¦¦†³gÏòé§Ÿ²yófþð‡?Ün[z„ÿ¸8yò$555L™2…ÊÊJêëë™4i‰‰‰dñ³³ÇôèQ®]»Æ¦M›Ú}¯¹Yý5´Xlu‡\]E¡hÄÅåî‹ÎÎÎdddðÆoGvv6æææê¾¯*#ìíƒ5ïwëNc£Lcܺ{û~Èå•Èåüˆ½ýsØØÜ6J{yÍ ¹¹Žââøß/ÃPTt˜Ã‡ÇqáÂZ¢¢Ô_çååàïï¯ÕJKKillüm·šŠãÇ_'.ÎUóûæ›nãÜÞÁuë÷{ãÖ(•rD"ýŽ@®ªº€NNƒÛßµ¨?Î122צR©ÄÐÐð±Å¯R)100¼'9mn®E,¶ÖëÝßËÇÃH[ܪokkëN¥:»~ÕE¯^½øúë¯3f ›6mbêÔ©,^¼˜-[Ôw¸PSSÈ#nÏ5,,¨««{¤ýk{ý{{îú¤ÿvlæ—_~á›o¾Ñ!y/þ…üµæQÉϲe˘8q")))¬X±¢õúÇÕ«œ?ž;w²råJ¦NÚaéo¯|Ï›o¾©9:¬í>àîþVþ}ä·wïÞ,X°€ùóç?Uy³³³#%%…/¿ü___øöÛoïiüuâÄ ¼½½ cãÆlÞ¼™¯¿þºÍöÑ–lšÝŠVVV­Üt…¯Oüw ?;;[óAÁ-ÂÃÑÉdãÖƒŒ?ïEÿÝMÄÇÇããャ£#³fÍÂÚÚZkžü$ÏžN´,O%?–š@æâLTJ ¡ œyU}̃‘HÍÅ£I~!Ë^–nÔË]3©i¡pg!ÅßkŸ«ËyB9Ù˳ðý Í ñzÛ‹¬%YÜ̸‰Ë¡&N/:MßÏúb 2 :%šþ±ýµñ1õµTü?ö'ò×Hý2‡¡¤LNÑËÿï©»R§1D&Fbæf¦Þ%XÙDø¾p¢ND1à‡XxZpr¼ö>ø»!W³#Pk’ôn/Â÷‡•EøOá4W7“³“&å`iéή]½P(äˆDÆ„„¬ä¥—R™6­‰ÏÓ¥K <¯igžžž¬X±‚ŠŠ ñõõÅËËë·‰ýuââÜèÖ-œ Î1mš”qãNÓ³ç­ô½ôÒK¨T*­ŸÏƒßKU[{o¿í«ë&O¾ÌÔ©tëNy¹vÿ¦P4rìØ ÂÃ×ýV?»:Dþwü·RþEQÑ!¦L¹Ê”)W5ò¥K>Uú›šš6l7n¤±±‘Çw ýÓÙõ«..]ºÄ°aÃØºu+R©”ììlÆŽKx¸ú*•JE@@€faìòåË(•J¢££Iÿª«×å®Oú?ùäÎ;‡T*%99™ÊÊÊ{ò/ä¯ùWÈO{ãËßsñâEM<ׯ_ÇÃÆ†ÊËË9{ö,EEE¤¥¥áã㣵`ý éo¯|oaccÜ9s˜1cF«8ôñÿ°ò'ð`ó}õß„ HOO×ì|Z¨¬¬dÈ!¼õÖ[äååQPPÀ¸qãZsØ«V­"33“ÂÂB233©¨¨àOúÓ=?&MšÄêÕ«‘J¥ìÞ½[ïðõ‰ÿnáçååáîîÎÌ™3ÉËËãâÅ‹( ­Æ}ä§=ýq«ضmMMM8::j¡ú$ÏžN ~[[%:%Z(NLBhB§Ï£ÛL7º¿Ô]˨ö00ínJ¿/ûQ“]Ãù˜ó®ÖP“UCÞ¦~‡‘…Ïýû9šn4‘¹(e³ò™Ò!³½z1IÒ“1ñ??ÔxœÍÌùïàh.TW²(åD§+Ç aƒ¸PUÉç9YBÇô;,Äl y#sOþJ³òéj_ .dÆŒšE7ÎÄøñœ;÷1W¯n C@NIll,ééé|üñÇBþùxÊ \ÏÏ‚K@@@@@@@@@@@@@@@@@@@@@@àÙ@$À“BøþðVGó=Aÿ Âs±g‡§Ó´»)áûÂéóQŸNY~kpŸë.ÈLj­Å øa}×õE$~úTgüˆÑLîѳÃÂûÏ Hbüúvx:ÍÌ92|4«ƒÃ:¥žÛ6ˆ…½û  ±1‡‡bSø`Ä¢§h²wï^–-[&T¬@‡Ä ç05u ã?>OÏÞ€눈PßdmíÍôé2ͯK— ‡žŸÇ¿¹¹ NNQOlú…ö!ð ÄÆÆ#äO CÉÈÈhóè.!‚| tbbb8wîOeø ­U¤Æ¢F..½È±ðcp¬ÕËW×]%iXeGÊn—’–@ÙÑ2½ÝuÑžÿKÿ¸DÉO%Hã¤\]w€œ¿çÿU¾P‹„©³)¾ó%êDQ'[Ob­ý­µ~}?ëKÿÿöÇÀРCÂowbínNtJ4v¡vXùX!ùƒ„¨“Qt{¡[›ï;vÂÂÂkë:ö¢B‡¡„ìáì›gÉz_ÿ#Æ D„Ä…à>×»0;<zhòs ¿øñÜ–ç°}·¡ üy =f÷и»NsÅåeìÂìè9¿'Ñ)ÑØÚ<”ò»ßú뽤7¡;Cq{Õ »P;Ävâ+ŸÇ-Í7›99î$²_d >:“•­·úã“5kÖœœÌ‚ ˆŒŒÄÞÞ^ã¶{÷n>žÁƒ“””¤y¾m›ú>#‘ÈkkÄb†ßÇÁƒ#¨¨Ðî{üýÿŒ¿ÿŸÉÉÙLIÉqD"#D"1êô-X°€>úˆ€€$ GŽ!88˜¬,õ‡:[°µõ#=}9¦¦ôë·”ÌÌdgoÔ;  æúõ}ØÛÒ·ï_HK[Ê¥K_Ñ«×XZö`ïÞÛ;oŠ‹?þ,?qãFÆÆÖÔÖ^§¸8…BNIÉñ{ªƒÁƒ¿ÂÊʃŒŒ¿*‚ƒ?¤¸83gþr{ÜP]­U®wâè8úz)¶¶} ú€ÄÄÙH¥ôŠèÐݘ›;’™¹±Ø '§nÜHÓ;ýR©”ýû÷³cÇY½z5S§Ne×®]$þñã3(*:D~þ÷ØÙùѯß2’’ærýú>½üÛÚú`jꀡ¡)¶¶>¿é5955¹šüýðÃìÚµ‹þýûóÿ÷¼ýöÛ#탦¿G °–Ó§ß¡¶6‘È¥RL–¬WûxšõOgׯ·úÍcÇŽñ׿þ•ñãÇsê”öNîîîTWWSXXHqq±¦oÕ×=55Uówll,555L›6í‘tåÏÇLJãÇ“œœŒH$böìÙXZZê]?íùïtO:„©©)ÖÖÖ,Z´ˆ={öpòäI¼¼¼ˆˆˆ ,,ŒÜÜ\Ž?ŽJ¥âÃ?ä§Ÿ~Ò«þvþ¾üòKõüÈÈ{{{êë멪ªÒË]ŸüÝB,óŸÿü{{{&OžLmm­ÆíÊ•+”••áàà@]]L>ÛkOzþtÓ^ûÔGþ&•••TVVª×‚ëê(//çüyíûí'L˜ÀÚµkyçwÈÏÏÇÐÐ…BArr2NNN!“Éððð`ÕªU¬\¹’Õã׌Œ :Ä÷ߟŸË–-cîܹìÛ§ÿlÞ¼GGGV®\I}}=^^^$%%QXXÈäÉ“‰‰‰aþüùlÞ¼™'NpèÐ!>ÿüsüýý©««ÃÃÃöíÛLj#ZCÛ _—»±±±Îð·lÙ‚ŸŸË—/ÇÁÁ¥K—²bÅ ½óÿ ú£=té _@ -´?]jg#NSEÆ]ñýБ±ˆê³Õ(ê(åJî"“öÒåßûmouC«W25÷9î\[wâ½ÅøýÃOgøúXô{Ís‘'ÆöƤ¾–Úáá{.öÄc§&ž¢¥®¥•»ysĶbŒlŒP6*é:¤+Õ™ÚFïoªÎTQ~¬\ëyá·…ø¯ö§÷{½)Ú[Dñžâ6㸖½-102 :£úŠYòš·WÝH›•FCÁíÅÿkë¯á¹Èש®tÔKKò·hïP4²0¬‡fÎf``M}^}‡–ßýÔŸ©³)V>V¤LI¡>_ÉëB¾ áÔ„SR>O’|T¥Vá6ӭÚž½‰ú+õ²ÆFbRS+”ô·ïŠ…‘¦††4Þ1Ù»“ÜÚæü•o"¢±5VñTÛÜL¹\ÛûvŸûú1êðÏÔ¶´6Žö´°ÂÎØ[±1 û»^qCë÷9UVÆ‘mÃÙ7¹WY:¿>ÇÎü\¾ÍËm3Ž»ákc‹‘HDÚñ <{¤”—1Û«÷c‰ûü# ,`Ô¨Q\»v{‡§J¥_¹bÅ 9pàÀC ÿqpëHŒÒÒRæÍ›‡\.'<<KKKLMMillâ<=ÕGåž={¶Mw¥²‰ªªlLLº´éng@ß¾aÿþª«sÚ|gÆ üðÃ\¾|™²²2¬­­inVëgWב¸ºŽ$.ΕJ©îãª.0|øäæîD.¯ ¢"“ÒÒDJK)+;ÍðáûÈÏÿ33GJ´âkh(T˜™9pìØLÀgççéÓg––n$$¼BUU¶î1dÉX”Ê&"#ÿ­yÞ«×lÒÓ—ÓÒR€ AA·l×®]ãæÍÛf•–&S\œ@qq––=ñô|U/—«ë(ÃÙ¾ÝE3rpG,¶¸§z>}ú4ñññÄÇÇÓ³gOfÍš¥—«£â¿q#]S––<<^ÑÛÀUU•Mcc Eã]ë,--M“¿ääd‰‹‹ÃÔ4¤CÒ¯Tʹvmû=·§]ÿtvýîèèHbb"‘‘‘”””гg룴“““ñööF,óüóϳ~ýzÖ¯_ÏÚµkõr¿Å²eËèÖ­Çdã}ò·|ùr–.]Êܹs6l¬Y³Fïúiχ,´3>‘H$2pà@®\¹À¢E‹HJJ"$$„+W®0mÚ48€úTŽ›7ojíDÐU;VVVxyy!‘H022"88˜K—.ét×'·dïý÷ß'44”ššš6Ç]ºtÁÎÎŽ††ÆŒÃéÓ§Éø¶½öñ4åOàÞÛ§¾òÿ¸‘Ëålß¾½í5(SS¦OŸNHH---4662tèP ==ÄÄD‘H$¼òÊ+ÏW_}ÅÖ­[ùä“Oغu+[·nÕ’á›7o’––Æ™3gJ¥ìÝ»—O?ýRSSÉÎÎÖ:‘áNt…ßž{SSS»á9’‘#GâêêŠR©¿_¸pü‘;wRQQ¡3ÿ¥?ÚB_ýq¿á ´…ÞV!Û~¶YQz ±C3CJ–b×ß‘‰H§ûï‘ÆI)O(¿§ðA½;ãô´Ó„î¥`[Aÿ ÂÊÏJ³³EàácÑÓ·n\üàâÝ'ãÓ\é};ë®~v•ô…é„í Ó5O}~=µ—j)ý©”ܹ8vÒr·°Æi¬9µ^ä©:[ůÏÿÊ©I§~#¥ÏŠ>øì¯wÚjsjQµ¨° ²¹¯¼YùZùk$7/Ü$é…$-ã¹»9þû“öFÒR2e’³<¿øi…ÑR×BMV ùÿΧpG!.“\:´üî—ÆâFZêZ°|û‹ CsC ½å£½òyÒäÃ&ÈFkGãƒr¦¢œÚ–fƹI¨jj¢AÑ‹®nœ*/keÜšéáÕæÑƒ¿ÊJ|ðGüØÍŸNŸÀR,fi†öÒ«³Î1'9‘Ã^àý€Ö÷\äÖÕ]]ÅÒë¬ËÎbœ›DË=ÈΞ‰wþ7£µqûÌrøQG~æë«—ùgÿ0Ö††ë]««hQ* î"ìÊ}Öyξ+•ÖÐDAAiiiøúúÞ×àºÿþLŸ>½Í£s:"üÇÅÉ“'©©©aÊ”)TVVR__ϤI“HLL|$‹»=þ£GríÚ56mÚÔî{ÍÍꯡÅb+­ç55WQ(qq¹û¢­³³3¼ñÆÄÅÅ‘¹¹¹ºï«ÊÆÀÀ{û`Íûݺ…ÓØ(Ó·îÄÞ¾ry%ry?boÿ66·Ò^^3hn®£¸8þ÷ˤæðáq\¸°–¨(õN€¼¼<üýýµÚKii)¿íÆQqüøëÄŹj~ß|ÓMcÜ‚Û;¸ný~oܺ¥RŽH¤ßÊUU000ÂÉip»ïµ´¨?î122צR©ÄÐÐð±Å¯R)100¼'9mn®E,¶ÖëÝnܸAyyùCIÿ½´§]ÿtvý*—Ë3f VVVx{{Ó£‡úhvwwwÌÌÌî¨ãf~ùå¾ùæ›6PlϽwïÞ,X°€ùóç?Òñƒ®üõêÕ‹¯¿þš1cưiÓ&¦NÊâŋٲe‹^õ£Ëÿæ  €ššFŒq{­À‚ººÛº9>>™5kÖÖÖmŽ“Úª¿G•¿ššΞ=˧Ÿ~ÊæÍ›ùÃþ ·»>ù[¶l'N$%%…+V´žß^½ÊùóçÙ¹s'+W®dêÔ©t|Û^ûxÒó'ð`íSùR±³³#%%…/¿ü___øöÛoïiüuâÄ ¼½½ cãÆlÞ¼™¯¿þº•¿7ß|³MÙ4»­¬Z?t…¯Oüw ?;;[c¼Exx82™LcÜzñç½Ì_ß|óÍ6.Õ¥?žæù±À“‰–å©äÇBÈ\œ‰J©"!43¯žÔÇ‚ üy 5kHŒN$ù…d,{Y¸!P/wͦ¦…Â…¯}†³.ÿå åd/ÏfÀ÷047Äëm/²–dq3ã&.S\„šìœ^t":%š¾ŸõÅ@d@tJ4ýcûk½Óí…nÔ\¬ÑìÒ¹#+#\¦¸Ðý¥î÷>@Ý•:#21373õ.ÁÊ&Â÷…u"Š? ÀÂÓ‚“ãOjùõùÀ‡Ü ¹š¿§×»½ßNTrá?…Ó\ÝLÎò½ËGÙ¤$ëƒ,Ö`ævï÷Ãø­ôCd,"è‹ ¢S¢‰N‰fСA€Úx›úZ*þûùk$ƒ~„ÃPR&§¨Û‡È€>ïÃÀŸªóÿýš+›I›Ö¡åwßò¡‚£O`áeADBƒ %œ™~Foùh¯|ž$ùèÙÉ$íyï•¥’ˆƒ?ÒÇÆ–Ó£_"ñ…É®®fv²ö1NVb1Ó{z2IÒú ÐOú‡‘øÂ‹lH“R‰ÿ»I½QÞê½K7«‰8ø#ùuµ¤ŽO Kä r9G†&sìD…·•5#Ôòûa¿`>½xòÖG?~зGGŒ!ãÅ $ŒCUS¤ë¿ËS®TðNÚi¾0ˆ–‚B~FâÔ¹Þ½y'5呯»eËLLLøî»ïÉdÈd2rrn·ÿiÓ¦!“Ɉ‹‹ÃÐЙLÆÑ£GµÂøì³Ïøè£Úü2­#Â\477ãëëK`` ¹¹¹deeqþüy&Mš$į'›7oF¥RŻヒJ¥â7Þи{zz²wï^222Ëå”––²mÛ6J=)m">~¡¡«™6MÊС»ÕýGK=;vô@.¯bÔ¨£¼ür>“'_fÈ€ú>«œœˆåwÞaÉ’%”••áììLmmß~뎗×L^~9I“.¢R)سGûoï×™81‹)S®bnÞ={úPQ‘Áž=~ôíû^~9ŸI“r°´tg×®^(rD"cBBVòÒK©L›VÈĉçéÒ%žÔ.OOOV¬XAEE………øúúâååõÛÄþ:qqntë΄ ç˜6Mʸq§éÙsŠVú^zé%T*•ÖÏÇçÁ索­½Î·ßöÀÕu “'_fêÔºu §¼\»S(9vlááë~«Ÿ]";þÛ )ÿ¢¨èS¦\eÊ”«ùºÅÿüÏÿPZZJuu5®®®8::>Òôß­}<íú§³ëתª*._¾¬ùåççkôBÃoG\òÉ'œ;w©TJrr2•••Z iºÜA}ÌUzzºfã?èÊߥK—6l[·nE*•’ÍØ±c ׫~tùïÚŸ¨T*4 “—/_F©T­ñ¿iÓ&²²²Ø¶mMMM8::j‘Ö^ý=ìüjÒWTTDjj*åååZwÄ´ç®OþnqñâEM9]¿~(//çìÙ³‘––†Ö‚õÃßêjOzþö©|!‰Ït IDAT?ÉTVV2dÈÞzë-òòò(((`ܸq­Ž9lU«V‘™™Iaa!™™™TTTð§?ýéžÒÑÔÔĤI“X½z5R©”Ý»wë¾>ñß-ü¼¼<ÜÝÝ™9s&yyy\¼x…B¡õÁØ£Ð666Ì™3‡3fܳþÐ'|{Á€ß΋ˆN‰J£“šÐéóè6Óî/u×…¦ÝMé÷e?j²k8s¾Ó•cÀšj²jÈÛ”'ÈÇï0²0â¹?GÓ&2e¢lV>S:d¶W/&Iz2&þ燳™9ÿÍ…êJ¥œètå¸!lª*ù<'Kè˜~‡¥‘˜íC¸!odîÉ_iV>]íká…̘1£C•žÆÏàܹ¹zu›P­J¥,[¶ŒÍ›7 …!ðÔKzz:ü±?A>ž2×3³`àx6 E ð¤¾?¼Í£ëî— á¹Ø³ÃÓiÚÝ”ð}áôù¨O§,¿€5¸ÏuäãÄÖbü0€¾ëú"?}ª3~Äh&÷èÙaáýgP$1~};<Îfæ>šÕÁaRÏmÄÂÞ}ÐÆÆØ˜ÃÃG±)|0bQçšìÝ»—eË– / ßÄ ç05u ã?>OÏÞ€눈PßcmíÍôé2ͯK— ‡žŸÇ¿¹¹ NNQOlú—-[FQQ‘æhD{%66–˜˜!JFFF›Gw ò)Ð9ˆ‰‰áܹs888<•á t&´V‘‹¹¸ô"ÇÂqlÀ±V/_]w•¤aI”)Cº]JBXeGËôv×E{þ/ýã%?• “ruÝUrþžCþWùB-v¦Î¦øþÍ—¨QDl=‰µö·Öúõý¬/ýÿÛCaˆ ‰ Á}®;vavx,ô :%»P;ý&Öîæš÷­|¬üABÔÉ(º½Ð­Í÷F;aáaÁµu{Q¡ÃPBv„pöͳd½ŸÕ¡åÛžû£.¿ûI?@ï%½ ÝŠÛ«nØ…Ú!¶ßs»¾âJøþp¢S¢1éfòÄÈGóÍfNŽ;‰ìƒÆÄÁ¤Ceë­>$Ë Î®¼æáÅùq“Ö]ÿû¿Áöˆ!„;tãwOÒ_œÀ°îÎzùíiiÅ…q“w膟­s½{snìDF»¸µùþKn=ð²²æŸYç:´ †wwaßм–”ÀÛ©§¥ü QÝÔİCø©PÊ©Ñãp45{ªÒ¿eË8ÀÀyñÅÉÊÊjóu€—_~–/_®yöæ›o2g΢¢¢xï½÷Éd„††>1ù[ºt)999Œ7ŽyóæQZZª¹^ˆ_7nnnqæÌ¶lÙBPP]ºtѸ2„ææfbcc1b3fÌ`ýúõZadgÁÑ£Shl,{âäذï=ú../àéù*S¦\#(h‰Æ=<üsÆŽ=«ë(œœ"ñ÷ {ûçõa*• ###Íû·ž™ššêÿúõë9zô(AAAš_ïÞ½IÞoÞ¼Ì7ßtc÷nŸÇRö*~OÏéþõ‰Mÿ'Ÿ|ˆ#(--ítúçiׯ‰„ 6PTTDqqq+w]ýŸ³³32™Œ°°0üýýñ÷÷ÇÅÅEow€5kÖœœÌ‚ ˆŒŒÄÞÞ¾CòfhhHbb"111DEE±dÉd2‘‘‘zçOŸñƒ>éŸ7oÈd2œYýkýâââ8r䈖No/}úÈßê?}ò×Qùo ooo¼²xñbJJJ˜8q¢01Ð ]úO—þyù}Pììì4i>tèŸ}ö™æ“§¦¾øâ ¦L™ÒæÌOCøÒ¿éb÷îÝøý·l†8èt×….ÿF´Ül¡¥¦‘isÒ¼&¡kTW¡;ˆÆbµ³ô`)kZOBÏßÔü°&€–º2gê¶J©âô´Ó·3ÏVÓ}BwĶ­ FøìØVLÆÂ õ [}^=MMÛ£hP /–·ò/2áý®7ÿ÷"*¥JóÜo…ÆöÆänÌE٨ļ‡9•©•ÈKåzåAd,¢Ï‡}È\”Icqc‡—o{î²üî7ýÁ[ƒ‹0²4BòºÙ/2ªÏVë¾ÈXDÈö.|™ôÿI'lwÛ;x·|”ì+ÁÌÙ ß}IŸ—Þ!mÏÛÊšÙ^½uäg>èDvu5KΞáïýús¸¸P§ÿž–V èÚQG~æz]-'Êd¨Pñ® ‡‹‹´•¾HÄÚpº3çD"u--·kµ5Ü˱71¡^ÑBQC}«¸LD†|Ð7ˆwSO£PÝ.¿öÃÁÔ”uÙY4(xXZqª\FÉo—„ëÂDdÈêàPÞ<ù+…õõ‚B~Fùîz®ææ¬ åõ¤cOMº}||8~ü8ÉÉɈD"fÏž¥¥ek971aÕªUÌŸ?…â¶îúòË/ÕíÓÈ{{{êë멪ªzbò¶páBÂÂÂX¹r%.\`ñâŬ[·Žýû÷ ñëAAAÔÖÖ"“ÉHOO×Z<‹gðàÁ$%%ižoÛ¦¾ïJ$2ÆÚڱ؆áÃ÷qðà**´ûÿ?ãïÿgrr6SRr‘È‘HLA:} ,à£>" ‰D‘#G&+Ký¡NDÄlmýHO_Ž©©ýú-%3sÙÙõ¨ÂŸ¹~}ööôíûÒÒ–réÒWôêõ––=Ø»÷öΛââÆ?KAÁOܸ‘†±±5µµ×).ŽG¡SRrüžê`ð௰²ò #ãàà).NàÌ™¿ÜUWk•ë8:¤¾^Š­m‚‚> 1q6Ré½â:t7ææŽdf®D,¶ÂÉ)‚7ÒôN¿T*eÿþýìØ±ƒÀÀ@V¯^ÍÔ©SÙµk×#‰üø ŠŠ‘Ÿÿ=vv~ôë·Œ¤¤¹\¿¾O/ÿ¶¶>˜š:`hhŠ­­Ú¥PÈ©©ÉÕ)‘þ=&0`ÀZNŸ~‡ÚÚ|D"C”J2Y2ÆÆÆôêÕ [[[ áÌ™3FÿtýZPPÀ‚ صk±±±­ÜuõîîîTWWSXXHqq±Vß©û¡C‡055ÅÚÚšE‹±gÏ­Kî…BADD„æÿ'N0sæL-Œ®üé?èJ¿‰‰ ÇŽã¯ý+ãÇçÔ©Žý@LWý¥¦¦jþŽ¥¦¦†iÓ¦é•>}äïaÖŸ>ù{ÐüßB,óŸÿü{{{&OžLmm­ÆíÊ•+”••áàà@]]„@@/té?]úG_ù}TVVRYY©^ ®«£¼¼œóçµï·Ÿ0ak×®åwÞ!??CCC ÉÉÉ899„L&ÃÃÃU«V±råJ6nT_3228tèßÿ=~~~,[¶Œ¹sç²oŸzü³yófY¹r%õõõxyy‘””Daa!“'O&&&†ùóç³yófNœ8Á¡C‡øüóÏñ÷÷§®®lllØ·o#FŒh5m/|]îÆÆÆ:Ãß²e ~~~,_¾–.]ÊŠ+ôÎÿƒöoíáååEDDaaaäæærüøqT*~ø!?ýôÓ‡/ ÐÚ¦ùv6â4U4`ÜÕß}‹¨>[¢^R®Ôé.2iÿÈ!]þ½ßöV7´z)SSpŸãεu×(Þ[Œß?üt†/ *ý^ó\䉱½1©¯¥ÞW4’×$¸½êFÚ¬4 ´¿={â±ÀƒSOÑR×ÒʯysĶbŒlŒP6*é:¤+Õ™ÚFïoªÎTQ~¬\ëyá·…ø¯ö§÷{½)Ú[Dñžâ6㸖½-102 :£úᔯêÉ(¿ûIŸ©³)V>V¤LI¡>_mœ¼.!äÛNMÐ=Ñ2îjLèŽPNO;¼LŽ™[Û»7žù¨J­Âm¦[‡5={õWêeĤ¦ W(éoß ##L i¼c°z'¹µ5Ì;ù+ßDDck¬þâ©¶¹™r¹¶!öí>,öõcÔ៩minNO +ìŒM°Ó¨P0¼» é7´Þy/ See)Ñ6œ}“{•õ¡ù[àsìÌÏåÛ¼Ü6㸾6¶‰D¤ÝŸÀ³GJy³½z?Ui^¾|9K—.eîܹ 6ŒÀÀ@Ö¬YÓê½+V˜˜È­Ö­¬¬ðòòB"‘`ddDpp0—.]zìy»u$Fii)óæÍC.—Ž¥¥%¦¦¦466 ñ?žžê£rÏž=Û¦»RÙDUU6&&]Út·³  oß¿°ÕÕ9m¾³aÃ~øá._¾LYYÖÖÖ47«õ³«ëH\]GçŠJ¥T÷qU>üGrsw"—WPQ‘Iii"¥¥‰”•føð}ä燙™# %Zñ54”*ÌÌÔÇÅ;60ÀÙùyúôY„¥¥ ¯PU•­{Ì#‡D2¥²‰ÈÈkž÷ê5›ôôå´´Ô`ccCPÐm#Ûµk׸yóö‡Y¥¥É'P\œ€¥eO<=_ÕËÀåê: GÇp¶owÑ „‹-OŸ>M||<ñññôìÙ“Y³féeàê¨øoÜH×ÔŸ¥¥Wô6pUUeÓØX†BÑx×:»›|88„uHú•J9×®mo=ljâüùótíÚµSêŸÎ ßU*Ýœöú¿ääd¼½½‹Å<ÿüó¬_¿žõë׳víZÀÀ@È•+WX´hIII„„„thYþñdÁ‚Œ5Šk×®é¿öƺÒïèèHbb"‘‘‘”””гgÏ—}êÔÇ„vëÖáÇkžéJŸ.ùëÖ­ÛC¯?]ù{üÿÞíý÷ß'44”ššš6Ç]ºtÁÎÎŽ††ÆŒÃéÓ§… €NtéG}çíÉïãF.—³}ûö¶× LM™>}:!!!´´´ÐØØÈСC5€ôôtILLD"‘ðÊ+¯h <_}õ[·nå“O>aëÖ­lݺU«Þ¼y“´´4Μ9ƒT*eïÞ½|úé§xxxššJvv¶Ö‰ w¢+üöÜ›ššÚ äÈ‘Œ9WWW”JõøýÂ… üøãìܹ“ŠŠ ùïˆþín\¹r…iÓ¦qàÀììì4åÙÖN´û _@ -ôÞ{jÛÏ# #J”âÏ÷ìïó>ïs>ç|Î9ú¶úôè¯vüо;#se&_’úl*þÿñ§ø@1¢½"œŸsj³0h„ÓB'R¢Sº~q¤¹´™ŠDå/†íFæªLNM:ÕiØü­ùÔ^ª%hâcbò6ç)¹7ÞhD"–P¥M]M\_r%k¾ÂÝÔ×Û¶œžzºã ú…j~yê4´4ðÝâ‹L"#ku–Ze¯Ï­GÞ&ÇÌߌªsU}.û¾ß凉¤™¶†6,ÇX*¸´ µ6IÕÒ™DFÚ’4´Œ´042Dߦ}ÁÇÀÑ€¶Ú6¤ÍÒ‡J?ÌüÍ”v4ö”ó•Ô·µéäÌ—íútG'ÎV”wXÜZäêNISc‡Y¿ˆËsôÆÛÙóþÈ`V¤$+ùÙœ}‘̪JŽŒŸÄÑ"o]Tþ èzCeMMäÔT£«¥Å*/oÞ½tg—¦¿…%sœñSǯzÏߪ`Ô‘ïÛë^CƒƒFÓ,“²2å´Z2¸\SM›LF@¿þœ© Æö f¸e2ª…ÎAƒñÙgŸáååÅ­[·Ø±cÓ§Og×®]xxx(ü1‚ àëëÛi **Ф¤¤>™Ü}ÜÓOHHàÚµkìØ±ƒgžy¦K­­í_{ëè˜üFoò‘J›qp˜Ðå—½½=¼øâ‹øùù‘““ƒ¯¯ï¯_òæ ¡¡¥eíjÖÖÁ47‹‹[¿ÅÒrII%……?àí½ 3³ÁŠôÝÝÒÚÚ@IIüÝÓ„ÿLqñÏxx,&<<Žï¾    Å—©þþþ”••ÑÜÜüën59'O>Gqññ.å£j×ÝÈd45Õ;B¹ºúÚØÚŽ¡´4©KmmícmmC5Ò—¡¥¥õÀÒ—ËehhhuKO[[ëÑÑ1UËïÝúq?òß·3MMM+ûó¸Û×îô­­­üôÓO|þùçL›6Mi·+÷ÂÂBêêê˜8q¢bÄÈȈ†††^Ë»¿¿?$&&//¯n•OÕøAUþ% Ó¦MÃÄÄÅÑd  ªªŠ&5OQè)ƒ&66–Ó÷ÊŸ*ýë‹ú»Ÿå¿ÍúõëIMM%%%…ð·¿)÷šŸŸOqq1YYYèëëóÚk¯ ÷´ t³îÚ>ª²¯ªô÷aÅ‚””æÌ™Ã³Ï>«hk]ÙáÎÆ_§OŸV¼«ikkGss3Ï=÷œR¸eË–u=GøënL“nªâW'ý®âÏÉÉQ,XÞ^F,+·z2þT·»-‘HÄáÇ•~ÇÓ³}çÿÔ©SùôÓOY´hQ·ãP¥•§ÒJI L$sU&r™œÄÀDÎ?Ó~̃†¶!?†Pw¹Ž¤ˆ$’'%c<È¿í~j¹+^`êÚ(úºˆ’ï”Ï0V¾"±‚œ 9ŒúnZ†Z¸ÿÅìµÙÔfÔâí Ôd/`;Ý–ˆ”†nІ¦)Œˆ¡äÇz’5u—ë‹¿EÛD‡hìfÚupó~ÇM]Mü?ô'"%‚ˆ”FÝÁ_ÃÕNM:ESaaIa8´ï¬j!ø`0á§Ãõý(ŒÜŒ83KùˆÏ×=¹¾ýºbG Ò$䫃>Lxr8Á‡ƒi­i%wC®Úò‘µÈÈ~=ß-¾]î0ê‰|U¹÷…ü~wþåpzêiŒÜM eÌñ1 ƒó Ϋ¥mum44*ž¦âö²&Q“bqëaÑþaýq~ޙ˯_îµ¶×&“zô†˜™snêL’&M'§¦†’•q2ÑÑaÁ@7¢œ;~¡ùÞˆ ’&Mg{P-2>ßï#õVEWjk=ú7êI6 #c$R)• Ç'L%sÆ~ž0S&;ªöÍa¼ù·$~|}è0&N#cúl'N£º¥…×ÓÕßå)‘IY“vŽGÆÅÈX0ÈO(cmíXê1˜5©)Lž¯\¹ÂøñãÙ½{7"‘ˆœœf̘App°’¿­[·òÖ[ouørMKK‹;vMqq1©©©TTT(Î(^š½¼¼ðóóãúõëdgg“••ETT”¾šìܹ¹\Nxx8¯¾ú*r¹œ_|QáîææÆÈÈÈ@"‘PVVÆž={044¼ë¥´…øø(7#bܸ}íýG[#_~é‚DRÍ”) Ì›wƒ¹só;öK ý>«ÜÜ\|}}‰‹‹cÍš5¬]»–òòrìíí©¯/૯àyó ˆŠºŒ\.eÿ~¥2xx<Çœ9ÙDGçchhÇþýC¨¬Ì`ÿ~o†ý+óæÝ **cã|óÍ ¤R ššºŒù3g¦SÄœ9YôëçÇ‘#OPPP€››7n¤²²’¢¢"¼¼¼pwwÿõÅþ&{÷:amÌìÙ‰‰yŽ£•ò7sæLär¹Òsû¥º'Ô×ß䫯\ptœÆÜ¹y<ýt!ÖÖÁTT(÷oRi3'N,$8xÛ¯õóM¯è߃NÿÎDÊ(.>Ftt>ÑÑù ýR¥}•ÿ––ÆÏG}Dss3?ÿüócaûƒX,fïÞ½hii!‹IHHP»ÿ{ï½÷¸xñ""‘ˆäädªªªÔv—Ëåøúúâååŵk×ÈËËC&“ÑkåÛµkzzz|ûí·ˆÅbÄb1¹¹¹j•OÕøAUþ«««ÉËËS<7nÜPØÕÞZܺWýÝföìÙ¤§§+¡n£*ªô¯/êOUùzRþ»¹|ù²¢7oÞÄÕÕ•¦¦&***¸páÅÅŤ¥¥áééI@@€ðB  ÷²ê¾_¨£¿#UUUŒ;–W^y…‚‚ ‰ŒŒìpÌá½Ø´i™™™‘™™Iee%ÿ÷ÿ×íñGTT›7oF$±oß>µãW'ý®â/((`À€,Z´ˆ‚‚._¾ŒT*ÅÇǧOú·Û˜™™±dÉ.\Ø!ümýÛ³g---ØØØ(1«NüÝAƒ_Ï‹ˆH‰¤ñ“˜øØ—Ñi‘v3íH™{'Fõíôöñ0êrêÔÞýõ(á»Å—ºì: vúqÚFÚ ÿt8-·ZÈ\™‰¬UöDÙÜåúçÑŒüb$Ð~œ^èÉPü¶ùý.ùýžúëIù445¹w$–À"È×®Šü>,úÑZÛÊ™È3ˆ3&a zVz½¦WZ|7v+!ÄÊš?{ùp)2Š`+õëÇÆÀ€K‘Q ï×O3s<Í̱5P﮸Æ&Šô¼Í-Xê1˜‹3æ0ÕÁ©Sÿ3\p71åŸÙ{µ}M°sàฉ<{*‘¿¤ž òDMK ãáp‘ˆ³S#±Ñ7èóvìXZ[[‰‹‹câĉ,\¸>ø@)ŽœœIHˆ¦¹¹ü¡Óñã¿cêÔ88LÂÍí¢£¯áï¿VáüofÌ8£ãlmÃðñyKËá@ûar¹mmm…ÿÛ¿éëë«•þ|@BBþþþŠgðàÁ}RöÚÚ<>ÿÜš}û<ˆìû*ý%K–(Ù´‡-ÿ÷³}>>øøøààà ¶|T…ß·oG%,,ŒÅ‹#‰zõŽRUã/Uú¥Êý^xxx(äéççǪU«(--eΜ9}VªÊß“ös¿Ë÷¤Óöñ~ÚUXXX(Úü±cÇØºu«â==½G¦>üðC¢££;ܱü¨ÄßýRŽìwoÄ/ ð[”z^}»ö j›É6\ü³òÄeC~…ÿ+$h_y›ò0d„çëžä¼‘ƒÕX+•îªP^C[ƒ¶Ú6ÚêÚÐÐÔ mIÎÏ:Ó?¼¿P‹½DÀî4u5Ñ6ÖÆù9gÄ?‰©¹P£pí ¡¥Ž¹Ò&)­5­½ÿm4´5ðy×s2Vd m”*Ü i©lA×Ri“I‰¤CxM]M<^õàòÿ»Œ\&Wüî½Ñ]K]®tY³ CCªR«”IÔÊ¿¦®&CÞBæÊLšKš»-ßæ’öä²£eønñívxGÚêÚ”Jˆ%Je»íV‘X}”=&^&\Ý|•±Ê;vÔ‘ßï­¿ž”O.“s.æœâÿš 5ØÍ¶CÇ\ç¡ÓÒƒ¥Øàõ¦éËÓ{¥íIårf&SüþVÑ.±ÐUpçlhL]k+%MˆÕýç IDAT››Êå}MMþ52˜~ºº,9DC[›ÂíZ}·$,õôh”¶QÜÔØ!¼ž¦¯õçÕÔsJiüsDVúúlËɦI*ÅÕØ„³bJÕ¼äZOS‹Í,;ó E‚A~Bùöfކ†l ä¹S'ú,ÝcÇŽ¡¯¯©©)+W®dÿþýŠKp¥R)¡¡¡ ¿§OŸfÑ¢EŠ0%=ÖÓcÓ¦M¼ôÒKH¥wlSaa!±±±|óÍ7ÄÅÅu§ÊýAâééÉŠ+ âwÞáÒ¥K¬ZµŠmÛ¶qèÐ!!}5(,,¤°°úúzÄb1éééJ“KñññŒ3†S§N)~ß³§ý>#MM]LM]ÑÑ1c„ƒ=:‘ÊJå¾ÇÇçe||^&7w'¥¥'ÑÔÔFSS‡ÂÂöüÅÆÆòÖ[oáë닳³3Ç' €ììöuBCwanîMzúôõ­6l™™ÉÉùhßUTô#7oÄÒÒ¡CÿJZÚ:®\ù„Aƒ^ÄØØ…îì¼))IdÖ¬ æÖ­4tuM©¯¿IIIÁÄÄ•ŒŒrÞ¤¤$‘óçÿzgÜPS£$×ßbcBc£só!øû¿NRÒ ˆDGÔJܸ}Ú™ù::&ØÚ†rëVšÚù‰D:tˆ/¿ü???6oÞÌÓO?Í7ß|Ó'éÏš•Aqñ1nÜø o† [Ï©SK¹yó Zá}||°¶¶ÆÀÀ@qyyss³âBú{éGoäßÅe6£Fý‹sçÖP_MM-d2)bq²ZíãQ¶?»}UÕ¿ªÓÿ¦¦¦*þŽ‹‹£®®Ž˜˜ÅoüqûøW[KKK©®®îµ2¨Š_OO'Nð·¿ýY³fqöìYµÃ«S~OOONž|¸Wʨjü¥J¿T¹ßFGG‡ÿþ÷¿XZZ2wî\êëënW¯^¥¼¼+++(,,ì³úSU~uÛσ(ß“NoØÇûi?TQUUEUUUû\pCde)ßo?{ölþõ¯±fÍnܸ––R©”äädlmmñ÷÷G,ãêêʦM›xçwøè£öñkFFÇŽã»ï¾ÃÛÛ›õë׳téRlÿìܹÞyçqwwçÔ©S1wî\V¯^ÍK/½ÄÎ;9}ú4ÇŽãßÿþ7>>>444àêꊙ™dâĉÆ¡÷Š_•»®®®ÊøwíÚ…··76lÀÊÊŠuëÖ±qãFµËßSýºªìwOãèt®Syæ¸k-•-èö×ÅëM/4u5©¹Pƒ´QŠL"S鮩wï#‡T…÷ø‹G{Ck”’òt – àÚ¶k”(Áûmo•ñ Ü}{}L ~m0ÅŠ)Ù_Òi]a<Ø m j2j~Ÿå=«£ê´j~yê4´5èÒ¯7¼¸¹û&7?»‰³²&×?ºNзA4ä5P_ÎൃÑ6Öî–ü~wýÉ{GŸuÆé'Ò§ÑT¨¼8ò°èGuj5N‹œîK[\â>˜çÝ=˜Ÿ”À†zµÃ»UΨ#ߣ­©Ék[Þ>‚O®^ag^®ÂÏ_†ø²ÊË›)?ÿH}[ÇÅéF&Xèêa®£K³TÊ;Ò+o)ùyÍ׳åå/-Vúýóëù|Â~ÃùúÆu¾*¸Þi]áef޶¦&i¿IOàÉ#¥¢œÜ÷YzÎÎÎøùù¢˜°]¹r%§NbäÈ‘J~ÿô§?Ë”)S¸v­ãÐ7’””Ä‘#Êçrù½ ¤*÷Éí#1ÊÊÊX¾|9‰„àà`ŒÑ××§¹¹YH¿¸¹µ•{áÂ…NÝe²ª«sÐÓëש»……/C‡þ•C‡B©©ÉíÔÏöíÛùþûïÉËË£¼¼SSSZ[Ûí³£ãd'³w¯#r¹¬½«¾Ä„ ?pýú×H$•TVfRV–DYYååç˜0á 7n|‹ MM¥Jé55•r l8qb ½ýS ²cc'çS]£FûŒÄÙy2Y aaŸ*~4èÒÓ7ÐÖÖ€™™þþwÙ®]»Fmm­âÿ²²dJJ))IÄØx nnϨµÀåè8›`¾øÂA1б² FGǨ[õ|îÜ9âãã‰gàÀ,^¼X­®ÞJÿÖ­tEý;ãê:_í®¬¬,Äb1MMM&ŸnÓ•~XYõJþe2 ×®}Ñíöñ¨ÛŸÇݾw§Uå¾~ýz¬­­;=JÓÄÄwwwœÑÖÖ& €+W®ôZÞ»ŠßÆÆ†¤¤$ÂÂÂ(--eàÀÝ ¯Nù7lØÀºuëXºt)ãÇÇÏÏ-[¶ôYý$''ãáᎎO=õ|ð|ðÿú׿Ô*ß½Â_½z•˜˜Ž9‚…Eû©µµµ½º“AÝñ×½ôK•ûúõëùûßÿN`` uuuŽúõ뇅…MMML›6sçÎõIý©S~Uúù0”ïIç÷ÚǾ²=A"‘ðÅ_t>G¥¯Ï‚ 9r$mmm4773nÜ8Å@zz:III$%%áììÌüùó <Ÿ|ò »wïæ½÷Þc÷îÝìÞ½[I‡kkkIKKãüùóˆD"8Àûï¿««+©©©äää(Èð[TÅ/÷–––{Æ?yòd&OžŒ££#2YûøýÒ¥KüðÃ|ýõ×TVVª,oéWgtÇ~ÿžø:CíU!óaæhiSv¤ 3´ ´(;Z†Å 4õ4Uºßh¯ˆŠÄŠnÅí»3ÎÅœ#ðË@ ÷âÿL¼M;‹~?Í%Í´5´a9æÎй–¡Ò&寰ÚÚ¨Ë®ãÆ§7(ú²‡(‡Ž/ã1Žôèÿ»âÏßšOúŠt‚ö)5ï¦ñF#õWê);\Æõ®c;ÕVÉÝÔ×Û¶ä¾Õq’§úBûÑÙ¨³ˆ>1dã|ÞõQ[Fõ¹õÈÛä˜ù›Ý׺èL~Jñ69·~¹EÉw%ŠÝ‘zVzH›ÛeyvöY²Öd)d«Û_WmùõT?zR>/Â~ £öR-§&ê°¸õ0釙¿µYµ½ZïÞæ¤MŸEfu%¡Gèrqk‘«;ãí컌§M&ãDY ûn0ÁN¹}nξȒä$ŽŒŸÄß};Þsq½¡Žœšj¾Ýd[N6‘NÎJîþ–ÌqÀÿËHíöü­ Fùž)Çä³ü<þ9"ˆ«]þË5Õ´Édôvå>é ·ìOFUß-tRWWÇĉ¿ÑÐÐpG÷ýý),,$-- //¯Nß#FŒ`Á‚}v´G_qæÌêêêˆŽŽ¦ªªŠÆÆF¢¢¢HJJê“ÉÏÇ=ý„„®]»ÆŽ;î鯵µ½OÐÑ1Qú½®.©´‡®ïG²··'##ƒ_|‘½{÷’““ƒ¡¡a{ßWƒ††6–– ÿÖÖÁ47‹‹[¿ÅÒrII%……?`i93³;‹Òîî imm ¤$þîÑ ÅÅ?óóÏ‘\ºô/ÂÃÛ¿/((Pì ºÝÞÊÊÊhnnþu7Žœ“'Ÿcï^GÅóùçÖŠÅ-¸³ƒëös÷âÖo‘É$hjªwDvuõ%44´±µsOmmíÿhkªŒS&“¡¥¥õÀÒ—ËehhhuKOkkk177WËïÝúq?òßöñ¨ÛŸÇݾªÓ¿ªÓÿ<˜ØØX^zé¥NÓ¨««ãÂ… ¼ÿþûìܹ“矾WËÐUü‰„iÓ¦abb‚‡‡...@û®%ƒ»Ž¿WþîUþAƒñÙgŸ1mÚ4vìØÁÓO?ͪU«ØµkWŸÕÏ6ØÊO?ýÄçŸÞáˆKuäßUøøøx<==±±±añâŘššöù8K•~©r_¿~=sæÌ!%%…7v|¿ÍÏ'++‹¯¿þšwÞy‡§Ÿ~ºÏëï÷è÷ÃP¾'žØÇ¾°÷ RRRøøãñòòÂ××—¯¾úª[ã¯Ó§OãááAPP}ô;wîä³Ï>ënÙ²eê6 Ø­hbÒqü¡*~uÒï*þœœÅ‚óm‚ƒƒ‹ÅŠÅ­žŒ?»c?–-[ÖéѱªìwoØ'»QZy*ý¡”ÄÀD2We"—ÉI Läü3çöcÁB~ ¡îrII$OJÆx1~ÛýÔrW¼ÀÔµQôu%ß)Ÿñ«*|Eb9rõÝ(´ µpÿ‹;Ùk³©Í¨Å!ÚA¨Éž"‡ÓSOcänDhb(cŽœ_ðkýkj0äCù1„ðÓáŒún­U­¤½ |Ĉ¶‰6ÑØÍ´ëVüwÓpµA±À–†“Aû.Áª‚·§ÿý(ŒÜŒ83ëŒRXÏ×=¹¾ýºbG R'þê ‚žNðá`ZkZÉÝ«¶ˆd-2²_ÏÆw‹/NÝ¿Ævº-) Ý: M "R"7B=ùƒ_LÈáÂ~ #ðë@ZkïÈ_·Ÿ.2‰LYäR9ò69º–ºjËï÷êGo”Ïûo4u5ñÿПˆ”"R"}lôC§ýÃúãü¼3—_¿Ü«MpëÈQèijñß0.EFq)2ŠS“g(ù1ÑÑaÁ@7¢œ;~ú†ßp'NãÂôÙü0n"5--,HJèàïJmb-uÚ,\ŒŒ‘H¥TJ$Ÿ0•ÌsøyµãW'ý®â/((`À€,Z´ˆ‚‚._¾ŒT*Uú`¬/ôËÌÌŒ%K–°páÂáUÙouâèüz^DDJ„ ǘÄÀÄǾŒN‹œ°›iGÊÜû;1ªo§Ï°‡Q—SGÖê¬ÇN޾[|©Ë®£`G w¡m¤ÍðO‡Ór«…Ì•™ÈZeO” yÁ}QΙÿã}MÇÞÀÿ‰àRM+SN?vrÜ4šKÕUü;7[è˜îÂX[‡/BÇrKÒÌÒ3¿Ð*{´Ú׊+X¸pá#óR( ÐfÍÊàâÅwÉÏß#C@ÐÇ’¸¸8ÒÓÓy÷Ýw…ò ú) ðˆ!,p=!< \Oš‚‚wztÝïÅÿ?þ¸­rëõ|êÛé|0˜!o y,ëÁw‹/–ôã7è˜ê0êûQ Ý6MGÏtÆOœÊ\—½ßG‡±Ú{h¯çÓÞÀ㦲9 è±l_ÛƒF³bðãi;z‚™®.?O˜ÂŽà1èh>úC“°~ýz¡bz¯oö]ÍìÙÑ×·„ÑMfÍÊÀÍma¯Å7jÔ6BCÛï¨05õ`Á±âé×Ïÿ¾—çA¤ïääÔárú‡)ÿBûè)qqq¬^½Z(Ÿ@¯’‘‘ÑéÑ]Bùýx§ÆŸ¢üx9¢/D$%RžP®¶»*îþÊÛW(=\Šh¯ˆümùäþ#—ŸÜj±qœïHð¡`"R"гÖSüîý¶7Ãw Ç|¸9Vã¬ù1—\îzÖzD¤D`æo†ñ cŒ£g£§Vš† ‰H‰À"ÐOœŸw&üL8Ö“¬;õo;Õ#W#®mëÝ‹ ­ÆY1òË‘\Xvì¿+1¦o¯×^„Ÿ'üLx·å§ ·?¹1úçÑX=e…ã|G"ÎF`5öNG7úçÑŒüb$Ð~œ^èÉPü¶ùý.ùýL}L•ž¡[‡2â#ÐÐÒP«þUéσÖÖÚVÎDžAü“˜1 cгÒë^»14âíá#Éœ1‡Ìs:¸Ûp)2Šáýúãifާ™9¶êßõöÊ_’'Ï`’½#Ϻº“Åx;õî'hlÂ¥È(‚­¬ñ6·`©Ç`.ΘÃT§NýÏtrÁÝÄ”f_ìÕö5Á΃ã&òì©Dþ’zV0¶O5--Œ?v„ÃE"ÎNÄFß WãwvvfûöíSRRÒÁ}×®]9r„¦OŸNvv¶Ò%¸ªÂßͼyóðôôdÆ jÇíwÜ$''KXX–––Mý¬[·ŽÜÜ\"##Y¾|9eee.‘Òï'''üýý9þ<»víÂßߟ~ýú)ÜÇŽKkk+qqqLœ8‘… òÁ(Å‘“ó! Ñ47—?tíwüøï˜:õ“ps{†èèkøû¯U¸ÿ›3Nãè8[Û0||^ÁÒr8Ð~G˜\.G[[[áÿöoúúúj¥?bÄÛ<õÔ·XXø(SS÷>){mmŸn;}žDö}•þ’%K”lÚÖÿûÙ>´ýyÜík@@€Ò³wï^Ž?®dîÕ?ª`ùòåddd ‹±··ïµü/[¶Œ%K–Îk¯½†X,&00PmwUòï©ûý?©’¿ªñªðûöíãèÑ£„……±xñbD"Q·îPëiþUé_wƇ¿ÅÃñXLXX~~~¬ZµŠÒÒRæÌ™óÐŒ{¢_}Q>õèÊþõ´}õ |||ðññáØ±clݺUñ¿žžÞ##Û?üèèèNï`~âï ---’’’X½z5ááá¬]»VÑžÕå^úÕñ ü¥.}»ö zßúvðØß@áÿ þépJ” ©àùº'9oä¨å® Uá5´5h«m£­® M Ò–¤a9Ú—%.B-ö•²èj´/ˆÆë¤ÿ!½ƒ»‘›u—ë¨N«¦"±‚Ækhi)Ü  h«kCR*¡ájõWê‘”I:Ä£¡­ï_†:-C-%·Æ‚Fê¯ÖÓ×€´IФDÒi>=^õ ÷­\ä2¹âwïÞ ûxææ˜z›b;ÕVí¶ÛñysY/gÑ\ÒÜÁ½¹¤}øâË—üî…‘›N‹œH[œ†Ý,;ôú둳!ÏužJ²­H¬À>Ê·?»quóUŒ<Œº-¿ß=I‘U«x\–¸ÐÖÐÆùEç‘KåjÕ¿*ýyXô£ô`)…ÿ+ÄëM¯nɧ¨±¿¦#öì©Î_@ ©km¥¤©‘¼Úrjª)mjRïÂĔܓ”À\—Xé°öÂyþ1lD¿ÚššlÍÞбýæåÿZ}¹µ5äÖÖÐ(m£¸©±Cx=M-^êϺô4¤ò;òûçˆ þ7&œÀþVøZôc¦“K·èô4µØHìÙS56 ÷ åÛ›|zõ ›{5ÞÂÂBbcc»üÊÔÓÓ“ŒŒ ’““9|ø0999«^¡ÇzzlÚ´‰?ÿùÏH¥Rµã?vì#FŒÀÔÔ”•+W2yòdêêêŠ:ñôôdÅŠLž<™… bkk˪U«Ø¶m›~7ô/==úúzÄb1éééTVV*&Ÿâã㉈ˆà™gžá§Ÿ~bÏž=üñlï³4u17÷ÄÜÜ›©SOvºÃÅÇçebbD ¶;»q88LÄÉéÎTll,UUU8::BSSC†ÜÙIúÍ7ß——GTT±±±Ô××+]r=kV#GnÂÆ&”!CþHLŒˆAƒ–0hЋ»pøp8EE?’ŸÇ¡C¡ ²R±ˆ¥«kJ}ýMJJâ)-=IVÖ{ܺ•¦¶üÆŒù„)S°·Ÿ€½ýxfÌ8Èo+ùim­£ª*KñÔÖ*_¦nc‚]^^±ÌŸ_‚£ãµÓ7nÓ§ÿ‚³ó ÜÜ`kÚ-‰D|ôÑGŒ7NaæÎÛgéÏš•A`àfllBñôüóç—âì>>X[[c`` ˜|rwwW*ßöíÛ7nkÖ¬¡¹¹Y¡¿½‘—Ù<ýt!®®ó±¶ÁÖ6këµÛÇ£lwû ššªx^~ùeêêêxê©§hkkS«T^OO3gÎpåÊfÍšÕëùÿøãùä“O8uê999466R]]­–»*ù÷Ô½/ÆOªä¯jüs¯ðîî†òÒK/qòäI>ýôSÖ®]Ë›o¾ÙgùW¥êŽuttˆ‹‹ãèÑ£Jå¸zõ*ÙÙÙ\ºt‰†† ŠñowôëA•O•ï%]Ù¿Þh_=¡ªªŠ¬¬,²²²hhh ¢¢Bñ¿DÒ>‡3{öl ™?>!!!„††¢ˆÃÖÖ–É“'3|øpæÎ˵k×X¾|¹Â=##ƒÍ›7ÊþðJKK™1ãÎøgçΜ´´4þýï3kÖ,ŠŠŠ°°°@WWOOO¼½½9yò$þþÇ÷Š_•»:ñïÚµ‹³gÏ2}út/^LAAA·Ê/¤R)¡¡¡¼û8q‚M›6QUU¥ö˜ªô«§ñ t†òì¦F×[*[ÚZ]¼ÞôBSW“š 5H¥È$2•îšz÷>rHUx¿x´7„F))O§0`É®m»FɼßöV¿@ÏÐí¯Kà—œ‹9‡¤\‚Sljëk\Ãm¥ŽO;Òot?Œ=¹±ëλê´j~yê4´5èÒ¯7¼¸¹û&7?»©ðã¶Ê ×XWÎÎ9K[C[‡4 ] Ñ1×AÛLY³ŒþcûS“Y£<Ù¿ÚƒêóÕTœ¨P^`øªŸÍ> ~m0ÅŠ)Ù_Òi]a<Ø m j2j:÷ ï™üî)ÿ~ºíí¤¢…Ëk/#k‘a6Ì -C-4õ41p6@Ö$ãúG× ú6ˆ†¼Êã˼v0ÚÆÚÝ’_Oq[醮¥.©Ï¦*ý®ªþUéÏäÕ©Õ8-rê–\ä*ÜÏÝ*gÔ‘ïÑÖÔdŒµ-oÁ'W¯°3/WeÜ–zí_¹—77³:5‰TÆËþik£¯¥Eó¯íâË*/o¦üü#õm­âhd‚…®æ:º4K¥L°s ½ò–’Ÿ×|ý8[^ÎñÒb¥ß?¿žÏ!¼á7œ¯o\ç«‚ë¦Ñ^fæhkj’ö›ôžÓ­ý¨Ü .tê.“µP]ƒž^¿NÝ-,|:ô¯:JMMçýÅöíÛùþûïÉËË£¼¼SSSZ[Ûísdd$3gÎDOO™L¦x!þå—_سgí}eee&eeI”•%Q^~Ž rãÆ·ØÐÔTª”^SS ÇÀÀ€'ØÛ?Å!+16v"1q>ÕÕª?‚svŽÄÙy2Y aaŸ*~4èÒÓ7ÐÖÖðëäš > ÷úú´¶Þ™„,+K¦¤$‘’’DŒâæö "Ñ•é;:NÁÆ&˜/¾pPôäVVÁèèu«žÏ;G||<ñññ 8Å‹óÍ7ßôYú·n¥+êÏØØW×ùܼyP­°YYYˆÅbšššÈÊÊêÔOZZš¢|ÉÉÉ$%%±wï^ôõGöJþe2 ×®}ѸŠB¡ IDATíöñ¨ÛŸÇݾßÍúõë±¶¶V: ³;ýcgámllHJJ",,ŒÒÒRx_ònbb‚»»;ÎÎÎhkkÀ•+WTº«’OÝ{£þÔÿt&uÆW÷ õêUbbb8räÔÖÖvk'COò¯Žþ©ÿúõëùûßÿN```§/¹¹¹Ñ¯_?,,,hjjbÚ´iœ;wîÕÕ¯Y>®Qeÿz£}õ‰„/¾ø¢S7}}},XÀÈ‘#ikk£¹¹™qãÆñÑG)ü¤§§“””DRRÎÎÎÌŸ?ŸƒÛÇ?Ÿ|ò »wïæ½÷Þc÷îÝìÞ½[I‡kkkIKKãüùóˆD"8Àûï¿««+©©©äää(Èð[TÅ/÷–––{Æ?yòd&OžŒ£££bü~éÒ%~øá¾þúkŇt÷*¿ºüéO"66–)S¦píšz' uG¿~Oü¡­®GóaæhiSv¤ û9íÛZËŽ–a1ÂM=M•îw#Ú+BßVŸþýÕŽÚwgd®Ì$ðË@RŸMÅÿ?þ(F´W„ósÎBmÞGdiKÒÐ2ÒÂÐÈ}›ö uGÚjÛгÕÃç]NM:EkU+¢/EX³Âûmo~yêåV›œ[¿Ü¢ä»¬ÆZ)-påoͧöR-Aûƒ“·9O)lãF$b õWêÑÔÕÄõ%Wò·æ+ÜM}M±aËé©§;”¡úBµ"/Zí»€dY«³Ô’A}n=ò69fþfT«êUùI›ï|éïãHsi3‰JyokhÃfŠ ÅûÛl&ÛPu¾ ™D†ž•ž"޳³Ï*Êí‹kêʯ§ 4Âi¡)Ñ)]´;©Ã†jéÏâfþfÔfÕÞ—¶Ö&“q¢¬„}7 ˜`çÐak‘«;%Mü\rgé|eõm­D:9óeAû `º£g+Ê‹[›³/’YUÉ‘ñ“8Z$â­‹Ê; ¯7ÔQÖÔDNM5ºZZ¬òòæÝK™ w Kæ8 â§Cò}þV£Ž|€–†¦Y&eeÊiµÊ}¹¦š6™Œ€~ý9S!ŒîÌpËþdTõÝBç Aƒøì³ÏðòòâÖ­[ìØ±ƒéÓ§³k×.<<<ÔŽgĈ,X°__ßnÅ_XXH]]'NTL ÑÐÐðPÔÇ™3g¨««#::šÏ>û €¨¨(’’’údòóqO?!!k×®±cÇžyæ™.ýµ¶Öí 9wSW—TÚŒƒÃ„.¸ìííÉÈÈàÅ_ÄÏÏœœ|}}illäÒ¥Khkk3jÔ(’“““!··~‹¥å0$’*$’J ÀÛ{ffƒé»»/¤µµ’’ø»{Š‹¦¸øg<<ÇwßPPP´ïJOoï“üýý)++£¹¹™ÊÊt@ÎÉ“ÏQ\|üòißÁ¥Ö˜L&ASSG-¿ÕÕ—ÐÐÐÆÖv ¥¥I]÷Ýmí;µµ ÕH_†––ÖK_.—¡¡¡Õ-=­­­ÅÜÜ\-¿#GŽäÖ­[TTT`lÜûùïNûxÔíÏãn_o3xð`bcc•¾ÌÔî» /‘H˜6m&&&˜˜˜(¾Œ0`UUU4©yR‚*êêê¸pá.\ÀÜÜœçŸ^iB¶+wUòï©ûƒ®?uÇW]…ˆÇÓ³ýÄ’©S§òé§Ÿ²hÑ¢‡JÿT±~ýzRSSIIIáÀüíoSrÏÏϧ¸¸˜¬¬,ôõõyíµ×úäWUõ£®~=¬å{ÒQÇþõEûº_XXX’’œ9sxöÙgºèåå¥öøëôéÓ [¤­­M\\ÍÍÍ<÷ÜsJá–-[Öõa}ûøÃĤãøCUüê¤ßUü999Š&n/#‹‹[=ÞÜ-û­nüꢴòTúC)‰‰d®ÊD.““˜ÈùgηOøjkòcu—ëHŠH"yR2ƃŒñÛî§–»â¦®¢¯‹(ùNù `Uá++ÈÙèïF¡e¨…û_ÜÉ^›MmF-ÑBMÞgÚêÚh,hTLkM+¹rÕ–¬EFöëÙønñít–ít["R"ºu(šD¤D0"n„Zò»¶‰6ÑØÍ´SžŒh““<)/BC ù1„ú+õdÄfí;¼d™r©y›]K]µå×S¬'YSw¹ŽÆ˜»Wý«£?‹~ôëóóÎ\~ýr·d3ËÉ…K‘Q|4j Z\ŠŒbÄx…û~ÃIœ8 Ógóø‰Ô´´° )A) t#ÊYù ¬6™ŒÐ£?0ÄÌœsSg’4i:955¼|²C>®ÔÖzôn4Ô“:m.FÆH¤R*%ŽO˜JæŒ9üÍWíãQ·?»}½ÍìÙ³IOOW,"(ÞeÔì» _]]M^^žâ¹qã†ÂîôÆâ–––;vì ;;›ââbRSS©¨¨Pºcä^îªäßS÷û=~R%uÆW÷ (ä·gÏZZZ°±±áÌ™3}’uôOø._¾¬ˆçæÍ›¸ººÒÔÔDEE.\ ¸¸˜´´4<== x(Æ¿ÝѯU>®QÇþõ´}=Hªªª;v,¯¼ò ÙåNóÎØ´i™™™‘™™Iee¥ÒÝêÐÒÒBTT›7oF$±oß>µãW'ý®â/((`À€,Z´ˆ‚‚._¾ŒT*ÅÇǧ×d¼k×.ôôôøöÛo‹ÅˆÅbrs•çÇÌÌÌX²dI§Ç ªÒ/uâèüz^DDJ„ ǘÄÀÄǾŒN‹œ°›i×é¢Ho¢o§Ï°‡Q—S§öî¯G ß-¾Ôe×Q°£@лÐ6Òfø§Ãi¹ÕBæÊLd­²'ʆ¼à>ˆ(çL‹ÿñ¾¦co`ÈÿÆDp©¦JíÝ_ÛƒFs©ºŠçf Ó]këðEèXnIšYzæZeVûZ±b .ì0i# ð80kV/¾K~þA‰D¬_¿ž;w Âxd‰‹‹#==wß}W(Ÿ€€ ŸÂד°À% ðd )ˆ@àa!øPp‡£ùz‚ÿüq[åÖëùÔ·Ó'ø`0CÞòXÊÏw‹/–ôã7è˜ê0êûQ Ý6MGÏtÆOœÊ\—Þ»\û¿£ÃXí=´×óio`Èñ SÙôXÚ¹íA£Y1xʘéêòó„)샎æã?49pà€pÿ€@÷úfßÕÌž}}}+AÝdÖ¬ ÜÜöZ|£Fm#4t¦¦JÇ"öëçßËó Ò74tÀÖ6ü¡Íÿúõë)..V( Ð]âââX½zµP>^%##£Ó£»ýx§ÆŸ¢üx9¢/D$%RžP®¶»*îþÊÛW(=\Šh¯ˆümùäþ#—ŸÜj±pû“£ÕSV8Îw$âlVc»gh¯Là×8=ã„E :ê]òm8Àˆ”,-0ñ4ÁùygÂÏ„c=ɺSÿ¶Sm1r5âÚ¶k½*«qVŒür$–] ûïÊGŒéYë‘™¿ƃŒ1dŒžžÂÝ1ƇyXY0ð¥í~ýÌÔNÛÔÇTéºu(#þ7 -^—߃Оȧ/ô£µ¶•3‘gÿ$fLÂô¬ôzU·^âKòäL²wäYWw²"£o×ýûŸuu'~âT.EFac` V˜Æ&\ŠŒ"ØÊos –z æâŒ9LupêÔÿL'ÜMLùgöÅ^•Á;Ž›È³§ùKêYÁè>AÔ´´0þ؉8;5}ƒG²Ë—/'##±XŒ½½}§~æÍ›‡§§'6lø]áëÖ­#77—ÈÈH–/_NYYÓ¦MÒW'''üýý9þ<»víÂßߟ~ýú)ÜÇŽKkk+qqqLœ8‘… òÁ(Å‘“ó! Ñ47—?tz?~üwLz‡I¸¹=Ctô5üý×*܃ƒÿÍŒ§qtœ‚­m>>¯`i9h¿#L.—£­­­ðû7}}}µÒÿàƒHHHÀßß_ñ <¸OÊ^[›ÇçŸ[³oŸç‘}_¥ïæ¶?¿¿=´ùï½÷˜8q"eeeýyÜíë¾}û8zô(aaa,^¼‘H¤¸£ê6[¶l!99™ØØX°´´T¸(={÷îåøñã ›r¿ËçììÌöíÛ)..¦¤¤¤S?÷Ê¿ªþ_UþwíÚÅ‘#G aúôédggóòË/?4å[¶lK–,!<<œ×^{ ±XL`` Úõ¯*üýÆÞÞ±XLPP>>>øøøààà ¶û½ððð@,†ŸŸ«V­¢´´”9sæ/½ý·°°P´™cÇŽ±uëVÅÿzzzŒ ?üðC¢££;ÜÁü¨ÄßZZZ$%%±zõjÂÃÃY»v­Â^õFÿÞñ ü¥.};}¼ÞðÂ÷Ÿ¾<6ä7Pø¿B†:œ’%H*$x¾îIÎ9j¹«BUx m ÚjÛh«kCCSƒ´%iX޶Äe‰‹P‹}€‘›N‹œH[œ†Ý,;ôú둳!Ïuê¿ìÀÔÇmcmœŸs¦X¤õÒþ4´5ðÝâËðO‡£e¨¥äÖXÐHýÕzò6I‘”H:*µ®&¯zûV.r™\ñ»÷Fo†}< ósL½M±j«´¥²±èj2äÍ!d½œEsIswGÚêÚ”Jh¸Ú@ý•z$ewò'Ú+¢è«"ªÏWÓp­=ÿ­5­êOdÕ*—%.´5´q~ÑyäRy¯ÊïA釺òyÐúQz°”Âÿâõ¦W¯µ/S^pDLRs]`¥oÀÚ çùǰjÇ¡§©Åá§&‘__Çó§NvéO[S“íA£Ù:£»&®Õב[[Cnm Ò6Š›;Mçõ¡þ¬KOC*¿#¿Žâc ìo…¯E?f:¹`k`Эüo$öì)Š£û„òíÍ>½z…MT¾õôô8sæ W®\aÖ¬Y÷ô·iÓ&þüç?#•J»þAàééÉŠ+˜úˆqãÆ)Úþܹsû,ýY³2 ÜŒM(žž`þüRœg¨ÞÜÜ}}+´´ôÕEOLL*•oûöíŒ7Ž5kÖÐÜܬÐßÞÈ¿‹Ëlž~ºW×ùX[‡`kеuȯº¥‹ÿŸ½3‹²Úÿ›}dYQ@H×ÜSCÓ[feÙ÷꽕u¿e?½_ëz3»Vš]Óìæ•$M³´´4DITDÀ…E¶Ù—`f~LŽN,3nø¼_¯çõ‚9ç|Îþ9Ëç9çñóóãâÅ‹Œ5ªWéŸÞ®_=<< 㥗^âäÉ“|ñŬZµŠwÞyGåçèÑ£Œ5 KKK–/_ÎäÉ“©««S¹§¤¤¨žW^y…ºº:ÆOkkë=É_aa!Ë–-ë𔎦ôw6þk“~///ÒÓÓIJJâÇ$''ssó&Ÿ}öŸþ9§N"''‡ÆÆFª««µ®ÿÎÂß \]]©©©¡¨¨ˆììl233)**ÒÚýÄÆÆräÈ‘6õsíÚ5²²²¸té  ^¯ÿ«ªªÈÌÌ$33“††***TÿK¥Ê=œÙ³gSXXÈüùó %,,ŒÐÐP• {{{&OžL@@sçÎ%//¥KoÏ_ÓÓÓÙ°aaaa¼øâ‹”––2cÆíùÏöíÛ9xð cÆŒ! €yóæ© ÔsçÎåìÙ³ššÊ'Ÿ|¬Y³(**ÂÚÚCCC¼¼¼6l'OžÄß¿íü¼3ùšÜµ‘¿cÇΞ=ËôéÓY¼x1]ÊgÈd2ÂÂÂxÿý÷9qâëׯ§ªªªÝ4þÈøÞ]ùíîuªïwì±¹²YÙÑúâýŽ7º†ºÔ\¨AÖ(C.•kt×5êüÊ!Má=_óTv„FÉO&ãºÄ•¼My”(aØ?‡i”/Ð= û*ë©¢™ìUÙÈ›åX°BÏT]#]äRy§áŒ±ð² 9:™ÆëÊÍk—§]ÜÈÙÙ·Oj¸¯pÇm™g眥µ¡µÓ¦ô1@ßJ¹DN¿±ý¨É¨Qóã¹Ò“êóÕTœ¨Pû½hO>|òæŠS²¿¤Ý8:Â|ˆ9:ú:Ԥ״ë^ZͯãEG_‡¾¡}ñþ»77vÞàÆ—7nw83}Lš`â`‚޾–¾–4tm3ß}¹;†6†¤ü)¥­[”ßýhږσÒ>ªSªq^äÜcýËÆHù–z¹DÂÊ”d¤29£lúa¦¯±ž™¬Óð¶ÆÆ|?v"O?ŠX"ÁŬý…íkC}Yá=Œ)Ç~¢¾µ­ñp™Ö†Fô10D"“1q€#i•7Õü¼éëÇÙòr~)-Vûý«ü\6…òw¿ö^ÏgOA~»qt„·UôuuIý]|Éå<ë1ä¡I¯‰‰‰„‡‡SZZÊ A_ºnÝ:9|øð ?¸u%FYYK—.E*•‚¹¹9ÆÆÆH$!þnà*÷Â… íºËåÍTWç`dÔ·]wkk_†ÿ?üFMÍåvýlÙ²…ï¿ÿž«W¯R^^Ž¥¥%--Jýìä4'§ÉÄÅ9¡P(ÇêêêKLœxˆüü½H¥JC\eeee‰”•%R^~މrýú·˜˜ØÑÔTª_SS ÀÄDy]܉‹Æ3tèrÌÍIH˜Ouµæ—à\\fââ2¹¼™ðð/T¿ü,iikimmÀÊÊJmñŸ——Gmm­êÿ²²$JJ()IÀÜ|îîO!Ö¿“ÓììBؽۑß>[Œ­mf]ªçsçÎO||<ƒ bñâÅ|óÍ7÷,þ›7ÓTõgnî‚›Û|nÜ8¨UØêê$’rd2I‡u–ššªÊ_RR‰‰‰ÄÅÅalØ#é—Ë¥äåín»~ln&33“~ýúõJýÓÛõûµk׈‰‰áðáÃX[[P[[«zSÝÅÅ???BCC¹víË—/çÔ©SªÉZ³f ýû÷gâĉ÷4 …¢ýÕyú5ÿÚ¤íÚµ¬^½šçŸž &àççÇÆ{¬Žº“¿[XXXàáá‹‹ úúúŒ9’+W®h¬MáïIIIxzzb``ÀøñãÙ¼y3›7oæã?ÖÊýVÛ|ë­· R3þÝ9èÛ·/ÖÖÖ4551mÚ4Î;',zµþשTÊîÝ»Ûßc46fÁ‚ÒÚÚŠD"aܸqlݺUå'--ÄÄDqqqaþüù<¨œÿ|þùçìܹ“>ø€;w²sçNµ>Z[[Kjj*çÏŸG$qàÀ>üðCÜÜÜHII!''GíF†ß£I~gîÍÍÍÊŸè›éSv¸ +ôLô(;R†õ(ktt5ºß‰(NDEBE—äƒòtƹ˜s}Dá®BüÿíÅ0 Dq"¡&ï2ÕªimhÅnŠ-5-ÈšdØM¶£ê|Uã…SŒý"Õš’ ­ ­ØŒ¹m‘×3ÕCÖ¤¾qŸûQ.i/§¼?XeÔ¼“ÆëÔ_©§ìÇ2ò·æc?Õ^ÍÝÒ×ûö\~÷r»yøuü¯œ:‹è+C× Åç}­Ë þr=ŠVVþ_›§hUpó×›”|WÒæŠ¾Ö†Vê²ê¸þÅuо.Â1ªíí•ß-Ì™á¼Ð™ì·³Ûuïnùݯö¡mù<(íÃÊߊÚÌÚë_ç++¨oma¦³ ÕÍÍ4ÉZ™îäÌÙŠò6Æ­EnL ~u™T&gAbfú 2·ÀÉT¹qäbjޱÞíSn².²$)‘Ãç-ß¶oå7Ô‘SSÍ÷¢lÊÉb¦³‹š»¿µ s\\ùém«çoV0úð÷Lùå'¾Ì½Ê¿FóqPˆÖe]SM«\ÎȾý…ûˆ`Óôª‡ÇÐ)•J™6mxzz2p òd¹««+&wœb5j ,hsu¶áïgΜ¡®®Žèèhªªªhll$**ŠÄÄÄ{²øííñ?~œ¼¼<¶mÛÖ©¿––z ,Ô~¯«ËE&“àè8±Ã°¤§§óÜsÏGNN¦¦¦Ê±¯:}llFªü÷ï‚D"V·~ͤÒ*¤ÒJ ac€•Õm£´‡ÇBZZ()‰¿svDqñ1ޛɥK @AA>>·Ç[ÊÊÊH$TV¦ Nž|š¸8'ÕóÕWýUÆ-h{‚ëNãÖï‘Ë¥èêjwEvuõ%ttô±·Ó©¿ÖVåË8úú¦eÊårôôôî[ü …½.µÓ––z ,µòÈÍ›7©¨¨¸+éo[õmiiÙ«ôOoׯñññxyyaggÇâÅ‹±´´T“………ÔÕÕ1iÒ¤Ûk!33Ôd 2„eË–ñÒK/=PùÓ”~M㿦ô<˜/¿ü’iÓ¦±mÛ6ž|òIV¬XÁŽ;îIÝi[?uuu\¸p?üíÛ·óÌ3ÏhUÿÚ„¿W´´´ðóÏ?óÕW_µ{…[gîkÖ¬aΜ9$''³nݺ¶ë÷Ü\233Ù»w/ï½÷O>ù¤°x$ôw°¶¶&99™Ï>û ooo|}}Ù³gO—æ_§OŸÆÓÓ“àà`¶nÝÊöíÛùòË/Û„{á…Úí»õõÊù¹……E7Mòµ‰¿#ù999*ƒÿ-BBB‹Å*ãVw柷æã………¤¦¦âííÝ¡ñé…^hsµ°6ú][ùÚ¢fy*=TJBP+2PÈ$%pþ©ó€òZ°ÐŸB©Ë®#12‘¤Ç“0lŽß?­ÜU ˜ºVŠöQòúΚÂW$T³6‡ÑßFÏT×<ÈZ•Emz-ŽÑŽBMÞe­ ’OÂÂÛ‚°„0B ¥þJ=éËÒÕüé[èãíÈ€'üNœžz33ÂÂóËÃùçÛÄÕp­SŸ¢©°‰ðÄpLœM”§«š 9BÄéF?3w3ÎÌ:£Öëm/ò·ä«NÞÉà7òCI„üBKM —×^Öº äÍr²ÞÎÂw£/&Îm7‡¼9„ÐC ÿ5œ ½A´Ô¶ú¬ò ]†þc(¡?…*ÓÿÝhZªn»k,¿[›N÷§.»Nu ®=ºS~÷«}h[>BûèÞ—g\:42þZårÂŽb¨UÎM}‚Äǧ“SSóIêW Z°`;Q.êoxÖ¶4“_¡ô± IDAT_§zDÊ…åÆú6²+µ5„9Äõ†zR¦Íb ™9R™ŒJ©”_&N%cÆŽMœ‚§…%“ŽQ ûΈ‘|˜}‰›Ò¶W?¾=|Ç'M#}úl&M£º¹™·ÓR´.©\Æë©çøtôc 43”î#ÊXû<ï9„×S’š4WWWsõêUÕsýºòÛ 455©ü}ôÑG¼ûî»mÞ\Ó6üý¢¥¥oooüüüÈÏÏ'++‹ÌÌL¢¢¢„øµdûöí( """xã7P(<÷Üs*wwww8@zz:R©”²²2víÚ¥2B)¥ÍÄÇG´˜ãÆíSŽ­|ýõ@¤Òj¦L9μy×™;÷*cÇ~ (¿guùòe|}}‰åõ×_gÕªU”——ãàà@}}{ö¸â᱈yó ˆŠÊF¡±¿ú žžO3gNÑѹ˜š`ÿ~凕•éìß?ŒáÃÿƼy×‰ŠºŒ¹¹+ß|3™LŠ®®!ïñÄ)ÄÄ1gN&}ûúqøðxU;wwwgݺuTVVRTT„··7¿-ìoçLÿþ!Ìž}‘˜3gžcРhµô=ñÄ( µÇË«ûߥª¯¿Áž=qršÆÜ¹WyòÉBú÷¡¢B}|“É$œ8±M¿ÕÏ7=Òþîwü·7RþMqñQ¢£s‰ŽÎUµ¯[¼øâ‹”••QSSƒ““vvv÷4ýÍÍÍL˜0­[·"‘H8vìX¯Ð?½]¿lÛ¶¬¬,víÚEss3vvvœ9£œ¿+ |}}U_W¯^E.—©&cöìÙ¤¥¥©NÝËüÅÄÄ ‹‰‹‹COO±XÌñãǵJ¿¦ñ_Sú¯\¹Â„ عs'"‘ˆœœf̘AHHÈ‘?===Uý“’’BEE…ÚFhgõ¯Mø»Í|ÀÅ‹‰D$%%QUU¥¿&÷[dgg«Ê鯏¹¹ÑÔÔDEE.\ ¸¸˜ÔÔT¼¼¼Ô6¬z³þïUUUŒ;–W_}•‚‚ ™9s&™™™ZËX¿~=‘‘‘Aee%ùË_º<ÿˆŠŠbÆ ˆD"öíÛ§µ|mâïH~AA®®®,Z´ˆ‚‚²³³‘Édj/Œu—;v`ddÄ·ß~‹X,F,·¹ÜÊÊŠ%K–´{mgú][ù]A‡ßLŽJ£“”Ðëóè¼È™O yîÝÝ5`̈ÏFP—SGæÊÌ^W޾}©Ëª£`[Ð>î@ßLŸ€/h¾ÙLÆò ä-òGJ‡<ë1˜(—AL‹ÿ鮯ã`bÊÇDr©¦Šåɧ{]9n ~ŒKÕU|r9K˜îÀ\߀Ýac¹)•ðü™_i‘÷®þõòË/³páÂÝt¸WÌš•Îŋ»K( 6ˆD"Ö¬YÃöíÛ…Âxh‰%--÷ß_ÈŸ€€Ð>2×#£`àx4Њ@àA!䇯æû#øÿÛ÷î=žNãÆ„ aè»C{e=ønôÅõyW¡}üKF?šá›†£kðð©ÎøIS™;pPÉûÏcá¬6¼ÇÓé`bÊ/§²adp¯ì_[‚ãå!½Swt+CCŽMœÂ¶1è>üS“°fÍ¡bznlö]ÉìÙ16¶ £‹Ìš•Ž»û“7zô&”߸±´ôdÁ±êéÛ×ÿ®çç~Äojꈽ}Ä›~¡t—ØØXV®\)äO GIOOo÷ê.!Bûè¬\¹’‹/bkkûPÊèM¨í"IŠ%d¯ÎæDÈ NŒ>ÑÆsî¦\NM8Eù/åˆv‹HN üx¹Öîšè,ü•^¡ôÇRDq"r7åpù—¹þùu¡ïN1N8ÎsÄ:ØšA/ "29+?+•»Q#åoþV˜6Ç|°9FvFmåÌw"ä‡"“#1êo¤ÝÂÚÕ”ÈäH¬ƒ¬±ð²Àå"ÎDÐÿñþíú·Ÿj™›y›zöC…¶ãl ü: /\ ë­®]1¦mùh¬‡Êï±c¸;P^§v2 ¿M~¨üºÕN:HŸ±ƒ1Þ÷&âtgÚn’ø}âGÀެƒ¬qœëHø©púEö{`ÚGKm gfžAü³˜1ÇÇ`dÛµºs25ãŸd̘CÆŒ9]v×Ä«C}Iš<ƒÇœø“›™3£˜0@»ï2·àÒÌ(Blû3¬5Ï{áâŒ9Lutn×ÿÎñ°°ä_Y{´íLàÈÁq“øÓ©^K9+(ÝGˆšæf&=ÌE"ÎN‰±IÊwqqaË–-SR¢þ P===Y¹r%¬Zµ ±XLxx¸Êƒƒb±˜àà`|||ðññÁѱýþ5oÞ<¼¼¼X»v­Úï7n$))‰eË–ŽÖñßoV¯^ÍåË—™9s&K—.¥¬¬¬Ý¬ ñ·³³3þþþœ?ž;vàïïOß¾}UîcÇŽ¥¥¥…ØØX&MšÄÂ… Ù¼y³šŒœœO9~<‰¤üë¿&|ÇÔ©'pt|w÷§ˆŽÎÃß•Ê=$äfÌ8“ÓìíÃññy›@ù0…B¾¾¾Êÿ­ßŒµŠóæÍ?~Õ3dÈ{’÷ÚÚ«|õUöíóº/e¯âww_€Ÿßÿ>°é¿›ýã~럇]¿v6þjÿÈ‘#Õž¸¸8~ùå•ÎÐ4>ïÛ·#GŽÎâÅ‹‰D=ú §^x%K–Á›o¾‰X,&((Hëùƒ¦üïØ±ƒÃ‡ÊôéÓÉÊÊâ•W^¹'õ§ÍüDSüÝ­ß[,]º”ôôtÄb1÷¬ýirïÊüð÷xzzªÊÓÏÏ+VPZZÊœ9sîYÿÓT¾ÚÖÏýÊŸ@÷ô“&÷»‰µµµªÏ=z”>úHõ¿‘‘ÑCSÆŸ~ú)ÑÑÑm¾±ü°ÈïŽþ×DgãïðþxøP3pPn@ûþ˷džÜ ÿ[HÀ”(AZ!Åëm/rþž£•»&4…×Ñסµ¶•ÖºVttuH]’ŠÍc6 \2P¨Å{„(NDÑž"ªÏWÓ×€¬IFKM‹ÊÝÄɄֺV¤¥R®5P¥i™ôvc3Ô%x_0ù¤½˜Öa<:ú:ønô%à‹ôLõÔÜ ©¿VOÃUeüÒiÛFm¨‹çž\~÷2 ¹Bõû°uÃñÙúŒìƒå0Kì§ÚwÉÀ¤k¨ËÐw†’ùJ&’I—ËOSùhGåwKvEBQ¸ÿÕk®aæiÖåòûÃÊDCýJJ”ô‹¯´5Š˜4Å:КìÕÙT%WQôM×þu ¿zÅÇÇÉSO=ÅÏ?ÿÌ®]»øŸÿù嘥kHŸ>^ôé3Œ©SO¶{ÂÅÇçbbDŒ±†Æáè8 gçÛpË–-£ªª '''BCCijjbèÐÛ'IÃÂv0cÆYœ§ã鹘yó ðòZªrŸ5+ÀÀõØÙ…1tèÿ#bðà% üææùñÇŠŠ~"77–~cèÐå*#–¡¡%õõ7()‰§´ô$™™pófªÖå7fÌçL™r‡‰88L`ÆŒ3ŒõO5?555¤¥¥©žß¤ÚÎ.”"ñö^Æüù%89MÑ:þqãö1}ú¯¸¸ÌÀÝ}ööa]›?‹Dlݺ•qãÆ©tÃܹsïYü³f¥´;»0¼¼^dþüR\\fh¾O/ŒmÑÓ3þ­-zaa1H-[¶laܸq¼þúëH$Uûí‰ô8›'Ÿ,ÄÍm>ýû‡boFÿþ¡Z÷‡YÿôýÚÙø«Mü)))ªç•W^¡®®ŽñãÇÓÚÚªq|öðð ,,Œ—^z‰“'OòÅ_°jÕ*ÞyçËßgŸ}ÆçŸΩS§ÈÉÉ¡±±‘êêj­æÚäßËË‹ôôt’’’øñÇÉÉÉÁÜÜüžÔŸ¦ù‰¦ø{¢~ŒŒ8sæ W®\aÖ¬Y÷´ýi“~mç‡ÄÆÆräÈUýÝâÚµkdeeqéÒ%(,,¼'ýO›òÕT?÷;ÝÓOšÜï&UUUdff’™™ICCªÿ¥RåÎìÙ³),,dþüù„††Fhh¨J†½½=“'O& €¹sç’——ÇÒ¥·ç¯ééélذ°°0^|ñEJKK™1ãöügûöíaÖ¬Yamm¡¡!^^^ 6Œ“'OâïßvþÑ™|MîÚÈß±cgÏžeúôé,^¼˜‚‚‚.å¿;ú_šÆß}ý+ðp¢¾»©Ó±ÇæÊfeGëgˆ÷;ÞèêRs¡Y£ ¹T®Ñ]רó+‡4…÷|ÍSÙe$?™ŒëWò6åQr „aÿ¦Q¾@53}Lš`â`‚޾–¾–4(7£«S«ùuü¯èèëÐ7´/Þ÷æÆÎÜøò†ý ú:ˆs1ç–K1qnãÛ}…;nËÜ8;ç,­ ­íB ú o¥\"§ßØ~ÔdÔ¨oö¯ô¤ú|5'*Ô {ŠðÙàÃ7‡P| ˜’ý%íÆÑæCÌÑÑס&½æ•]gå£ Mågâb‚¼INþÖ|‚¿ ¦ájåñå Y5}sý.•ßA«úUt¾ñz#+2ø<+Zë[UzáAkÕ)Õ8/rîR)ºéÞ6FÊ·ÜË%V¦$#•ÉeÓ3}}Œõôü¶ÑþÚP_VxcʱŸ¨omi#g™Ö†Fô10D"“1q€#i•7Õü¼éëÇÙòr~)-Vûý«ü\6…òw¿ö^ÏgOA~»qt„·UôuuIý]|Éå<ëѳ§/ ízØŸÿüg–-[Æ”)SÈË»}Â3)) OOO ?~<›7ofóæÍ|üñÇjá×­[Gbb"‡Výæâ₟Ÿ¡¡¡\»v €åË—sêÔ)µŠÿ~rëJŒ²²2–.]ŠT*%$$sssŒ‘H$BüÝÀÝ]yUî… Úu—Ë›©®ÎÁȨo»îÖÖ¾ þ7~ø!ŒššËíúÙ²e ßÿ=W¯^¥¼¼KKKZZ”úÙÉi2NN“‰‹sB¡+ǸêKLœxˆüü½H¥JC\eeee‰”•%R^~މrýú·˜˜ØÑÔTª_SS ÀÄÄ€':88ŒgèÐ嘛;“0ŸêjÍ/Á¹¸ÌÄÅery3áá_¨~<øYÒÒÖÒÚÚ€•••Úâ?//ÚÚZÕÿeeI””$PR’€¹ù ÜÝŸB$:¬1~'§)ØÙ…°{·£j¤¶µ ÁÀÀ¬Kõ|îÜ9âãã‰gРA,^¼˜o¾ùæžÅófšªþÌÍ]ps›Ïµ›¿Vç ‘”#“I:¬³ÔÔTUþ’’’HLL$..cãÀI¿\.%/ow—ûÇîzƒ~ïlüíJükÖ¬¡ÿþLœ8QMFgãóµk׈‰‰áðáÃX[[P[[ÛãoÂ[XXàáá‹‹ úúúŒ9’+W®hLŸ6ù_»v-«W¯æùçŸg„ øùù±qãÆ{Þ>Û›ŸhŠ¿»õkggGbb"ááá”––2hР{Úþ´I¿6óÃ5kÖðÖ[o¤z¹é÷ó€¾}ûbmmMSSÓ¦Mãܹsw}þÛ•òí¨ÿÝïü tO?iã~¿‘J¥ìÞ½»]7ccc,X@`` ­­­H$ÆÇÖ­[U~ÒÒÒHLL$11æÏŸÏÁƒÊùÏçŸÎÎ;ùàƒعs';wîTkõµµ¤¦¦rþüyD"àÃ?ÄÍÍ””rrrÔndø=šäwæÞÜÜÜ©üÉ“'3yòdœœœË•ó÷K—.qèÐ!öîÝ«z‘®³üwGÿk¢+ãþx8ÑÚ*ÔgDôÍô);\†•z&z”)Ãz”5ºFºÝïD'¢"¡¢KòAy:ã\Ì9‚¾¢pW!þÿöÇb˜¢8‘P“÷ˆÖ†Vê²ê¸þÅuо.Â1ªí|E«‚›¿Þ¤ä»lÇ*'†r©œÔ%©è™éaêjЉƒÒbâd‚žñíS8¹å’örÁûƒUFÍ;i¼ÞHý•zÊ~,#k>öSíÕÜ-}-±ŸaÏåwÛnòT_P˜ÎFEô•ˆ¡ë†âó¾Öy¯¿\¢U•¿U÷&ší”ÚfFŒS›«ù4•Ÿ‘­2‰ÒˆqvöY2_ÏDÖ¤üß°Ÿ¡Öå÷GѶ~;£òt%§&"!8Ì72Ñ7×oSJû°ò·¢6³ö¾ôÁEnL ~5ÇùÊ ê[[˜éìBus3M²V¦;9s¶¢\eÜØu‘%I‰žð8où¶} (¿¡Žœšj¾Ý`SN3]ÔÜý­m˜ãâÊÿKOiöüÍ Fþž)¿üÄ—¹Wùר`> Ñ:_Ù5Õ´ÊåŒìÛOP´86ýH¯º·†N IMMÅÛÛ»ÃÉuKK ?ÿü3_}õU›+€FÅ‚ Ô®åÛ³uuuLš4Iõ›™™ ]Žÿ~pæÌêêêˆŽŽ¦ªªŠÆÆF¢¢¢HLL¼'›»½=þãÇ“——ǶmÛ:õ×ÒR€…Úïuu¹Èd'vÖÁÁôôtž{î9âââÈÉÉÁÔÔT9öUç ££ÍH•ÿþýCHÄ*ãÖï±±TZ…TZIaá!ll°²ºm”öðXHKK%%ñwÎ~(.>Ʊc3¹téc""b(((ÀÇÇG­?”••!‘H¨¬Lœ<ù4qqNªç«¯ú«Œ[Ðöׯ­6s¹]]­ê§ºú::úØÛé|~ܪ|ÙK_ßTóœI.GOOï¾Å¯PÈÑÑÑëR;mi©ÇÀÀR+¿Ü¼y“ŠŠŠ»’þ®ô‡]ÿúUÉ!CX¶l/½ôR'm ýñ9>>///ìììX¼x1–––mÆéîRWWÇ… øðÃÙ¾};Ï<óŒVéÓ”ÿÁƒóå—_2mÚ4¶mÛÆ“O>ÉŠ+رcÇ=«¿Îæ'šâïnýJ¥R¦M›†……žžž ¨¼¹ÇÕÕ“»ÞþºR¾Í׬YÜ9sHNNfݺumÒ‘››Kff&{÷îå½÷ÞãÉ'Ÿ¼'ý_ÛòÕÔÿÔü h§Ÿ´Ñ_"ÖÖÖ$''óÙgŸáíí¯¯/{öìéÒüëôéÓxzzÌÖ­[Ù¾};_~ùe›p/¼ðB»m ¾^9ÿ°°h;ÿÐ$_›ø;’Ÿ““£2HÞ"$$±X¬2nugþÙ•õé /¼ÐîÕ¿šÆßyý+ðp¢fy*=TJBP+2PÈ$%pþ©ó€òZ°ÐŸB©Ë®#12‘¤Ç“0lŽß?­ÜU ˜ºVŠöQòúÀšÂW$T³6‡ÑßFÏT×<ÈZ•Emz-ŽÑŽBMÞettuú¡„þJÄéF7š–ªRŸ½}ÅÌ7‡úc(ῆ´7ˆ–ÚÛî­u­44ªž¦â&šDM*ÃÌ-®5pêñS46žމ³‰ò”`U3!C”ñ?3w3ÎÌ:£Öëm/ò·ä·9ù0øÁ„üBDR!?†ÐRÓÂåµ—µ.y³œ¬·³ðÝèÛá ´Îè¬|n¡o¡c´#žЦßtV~†} ‘Kåê2ŠV†6†Z—ßE›úµŸnOdr$Ã?ŽŽ®‘É‘ŒŠ½}…Þ­öåû/_- ‚¨Ik{ºì~·~áýpyÆ…ì·³»TF³œrif[GAOG‡K3£Ø9Akw  r'ÊEý »V¹œ°#‡jÕ‡sSŸ ññéäÔÔðlÒÉ6é¸R[CØ‘C\o¨'eÚ,š™#•ɨ”JùeâT2fÌáØÄ)xZX2éèµ°ïŒɇٗ¸)m{õãÛÃGp|Ò4Ò§Ï&aÒ4ª››y;-EûE–\Æë©çøtôc 43”î#ÊXû<ï9„×S’{TnLL b±˜¸¸8ôôô‹Å?~\å¾cÇŒŒŒøöÛo‹ÅˆÅbµ+Î>øà.^¼ˆH$"))‰ªªª6ù>úˆwß}·Í›i …___ÕÄýêÕ«Èår"##µŽÿ~ÒÒÒ‚··7~~~äçç“••Eff&QQQBüZ²}ûv ¼ñÆ( ž{î9•»»»; ==©TJYY»víR¡”‹Òfâ㣠Ú@LŒˆqãö© _=©´š)SŽ3oÞuæÎ½Êر_ÊïY]¾|___bccyýõ×Yµjååå888P__Àž=®xx,bÞ¼¢¢²Q(dì߯þ‚‡§çÓÌ™“Ett.¦¦Ø¿_yÅaee:û÷cøð¿1oÞu¢¢.cnîÊ7ß F&“¢«kH`à{<ñD 11EÌ™“Iß¾~><P¸ÜÝÝY·n•••áí퇇Ço ûÄÅ9Ó¿³g_$&FÄÌ™ç4(Z-}O<ñ …Bíñòêþw©êëo°gÏ@œœ¦1wîUž|²þýC¨¨Pßd2 'N,$$dÓoõóM´¿ûÿí”S\|”èè\¢£sUíë/¾ø"eeeÔÔÔàää„Ý=MGýãa×?½A¿v6þjÿìÙ³IKKS‚¾Mãó¶mÛÈÊÊb×®]477cggÇ™3=³þÑÓÓSÉ/..&%%…ŠŠ µø;KŸ¦ü_¹r… &°sçND"999̘1ƒ{VÍO4ÅßÝú­®®æêÕ«ªçúõëªq£©©é®·?mÒ¯Íü ;;[5¼qãnnn455QQQÁ… (..&55///µ ë»Ùÿ´-ßÎúßýΟÀ×OÚ诙ªª*ÆŽË«¯¾JAA………Ìœ9“ÌÌL­e¬_¿žŒŒ ŠŠŠÈÈÈ ²²’¿üå/]JGss3QQQlذ‘Hľ}û´–¯MüÉ/((ÀÕÕ•E‹QPP@vv62™Lí…±»©ÿoaeeÅ’%KÚ½UÓøû ¯R»¿Ý™)”F/&!(¡×çÑy‘3ž@òÜä»ñcF|6‚ºœ:2WföºrôÝèK]VÛ „öqúfú|@óÍf2–g o‘?R:äYÁD¹ bZüOw5Sþ;&’K5U,O>ÝëÊqKðc\ª®â“ËYÂÀtæúìËM©„çÏüJ‹üáê_/¿ü2 .Tm: ô&fÍJçâÅ÷ÉÍÝ%†@D"kÖ¬aûöíBa<´ÄÆÆ’––Æûï¿/äO@@hŸ‚ëáQ0p <è E ð òCH›«ùºƒÿ¿ýq_áÞãé4`LÈÁ†¾;´WÖƒïF_\ŸwÚÇï0°4`ô÷£¾i8ºŸêŒŸ4•¹õ˜¼ÿ<ÎÊaÃ{<&¦ü2q*F÷Êþµ%ø1^Ò;uGw°24äØÄ)l ƒîÃ?59pàkÖ¬*V çÆfߕ̞}cc[¡0ºÈ¬Y鸻/ì1y£Go",Lù ///µkGu×ósgü––ž,X V=}ûúß•8MM±·x`Ó¿fÍŠ‹‹UW# t•ØØXV®\)äO GIOOo÷ê.!Bûè¬\¹’‹/bkkûPÊèM¨í"IŠ%d¯ÎæDÈ NŒ>ÑÆsî¦\NM8Eù/åˆv‹HN üx¹Öîšè,ü•^¡ôÇRDq"r7åpù—¹þùu¡ïN1N8ÎsÄ:ØšA/ "29+?+•»ûŸÝyìØcØŽ·Åi¾‘g#±{[ûç0vÐ' ¶ãl ý)”ÏÔnaíjJdr$ÖAÖXxYàòŒ g"èÿxÿvýÛOµÇÌÍŒ¼M=û¡BÛq¶~È….õ–úcÆÆxÿÝ›ˆÓDœi»  ©|4¡IþcÇ#pw  ¼N/ìd~›üþPùu]ãq}Þë`kÜ^vSÅw ¿OüØ€u5Žs ?N¿È~Z»ßïöÑRÛ™™gÿ,fÌñ1ÙõhÛú<4ŒÝac ±íÏ|WwÒ¦ÏfÂíû§©ÿ $cÆ2fÌéR܃Ì-¸43ŠÛþ ëcÍóžC¸8cSÛõÿ„ó@<,,ùWÖÅ-ƒ‰98n:•Àk)g¥ûQÓÜÌ„£‡ù±HÄÙ©3±36éQù/¼ðK–,!""‚7ß|±XLPPÊÝÁÁ±XLpp0>>>øøøàèxûûžûöíãÈ‘#„‡‡³xñbD"Qâ„Á| IDAT‡wÔÏ›7///Ö®]«µü[,]º”ôôtÄb1Lý¬^½šË—/3sæL–.]JYYY›¨ ñwŒ³³3þþþœ?ž;vàïïOß¾}UîcÇŽ¥¥¥…ØØX&MšÄÂ… Ù¼y³šŒœœO9~<‰¤üë¿&|ÇÔ©'pt|w÷§ˆŽÎÃß•Ê=$äfÌ8“ÓìíÃññy›@ù0…B¾¾¾Êÿ­ßŒµŠÔ¨2~ü·X[û¨KK{’÷œœtttîÛÆCmíU¾úª?ûöyÝÕxÜÝàç÷¿lú?øà&MšDYYY¯Ó?»~uqqaË–-SRRÒÆ]Óø¸cÇ>Lhh(Ó§O'++Kõ‘z===Y¹r%¬Zµ ±XLxxx—ÇßÎØ¸q#III,[¶ŒððplllTn#GŽT{âââøå—_T:MSþ5Éï,ÿÚ¸kKGóMíCÓüJSú4Õ&ùÝE›òëNýt†§§§ª½úùù±bÅ JKK™3gÎ=ëÝíŸ÷;£~ì)ýñG°¶¶Vµ©£GòÑG©þ722zhÊùÓO?%::ºÍ7˜ùÝi?šÐ´~¾Ûú]àÑCÿÎŒ(7Ðí&Ûqñ¯ê— ¹ þ·à}Á\]³Áfx½íEÎßs°k«Ñ]šÂëèëÐZÛJk]+:º:¤.IÅåO.ô‹è'Ôâ=B'@GOƒ>Èšd´Ô´`æn†ó"gÎFÅóuO®4³6¯Õ^*#¥™»UÉUT§V££«ƒc´#zfzmâÑÑ×Áç} úþr:²F™Ê­± ‘æÊf m ‘5É–HÛ„×5ÔÅó O²ÿ_6 ¹Bõû°uÃ0´1$k>r‰Ó¦T¥T!-“j•]C]†¾3”ŒåHJ$mÜ%%JqÙ‘2|7úª¹iS>šèL¾‰“ ­u­T$Tà倅·×6\cÐ2õ;Ú”ßA!Wp.æÜíÍê 5 ˜=ƒ>˜4Å:К³Qgi*l¢*¹ …BÇ_=¨H¨Ðèþ µÒƒ¥˜8˜àýŽ7iKÓz¤ü™[0º_¦üò7ê9].F‚7|ü8VR¬•Œ¢Æþ–zŽC¢l ~¬c¥¯«ËÇ!ô54dÉéDZ[UnyõuÜ”J±12¢QÖJqSc›ðFºz¼=ÜŸ7RÎ!SÜ.¿ ÆÖؘM9Y4Éd¸™[p¶BL©–6ÒÕcÃÈ ^8ó+E‚Â}DùöFN¦¦¬ÄÓ§Nô˜ÜÏ>ûLÙþõõ±±±¡±±‘êêj•»««+555QRR‚Lv[¯xxxFpp0ùùùœ>ž1cÆpêÔ)Õï»v)¿w¥«kˆ¥¥VLœx#G&QY©>öøø¼‚Ï+\¾¼ÒÒ“èê꣫k@a¡2}Ë–-ãÝwßÅ××~ùåFŽIV–òE°°ôé3Œ´´µÛ2bÄj22Ö‘“³Pž€**ú‰7bcãÇðá#5u5W®|ÎàÁÏan>nŸ¼))I`Ö¬ þÈÍ›©ZR_ƒ’’xd2)¥¥'»TcÆ|Ž……ééÿŒù%% œ?ÿ7•Ÿ––:ªª:þ.ª]("úôŠ¿ÿÛ$&>‹HtX«øÇÛ‡©©ïa``½}7o¦jþY³Ò).>Êõëßam=Œ#ÖpêÔóܸq𡈿O/ŒmÑÓ3¦O¥!J&“RW—¯\ˆD|ÿý÷|óÍ7Œ5Šÿû¿ÿãµ×^Si»›þg3zôÇœ;÷:õõ×ÑÕÕC.—!'ahhÈàÁƒéÓ§‰‰‰rþüù^£zƒ~-,,dÙ²e|óÍ7ÄÆÆ¶q×4>zyyqòäI’’’ÐÕÕåÙgŸÅÜÜü·v(#,,Lå÷ôéÓ,Z´HÍ¡I¾&Ž=б±1–––,_¾œýû÷sæÌ•{JJŠêïØØXêêꈉ‰Ñ:ÿšäw–mÜ5ο;™hÓ>4ͯ4¥OSýh’ß} ³ôu·~na``Àþólll˜;w.õõõ*·k×®Q^^Ž­­- öXþ4µ¿îöÏû?ŽÑF?vWt‡ªª*ªªª”{Á TTT™©>›={6ü1¯¿þ:ׯ_GOO™LFRRöööøûû#‹qsscýúõ¼÷Þ{lݪœ¿¦§§sôèQ¾ûî;† Æš5kxþùç9xP9ÿÙ¾};vvv¼÷Þ{466âááÁ©S§(**bîܹ¬\¹’—^z‰íÛ·súôiŽ=Ê'Ÿ|‚ ¸¹¹aeeÅÁƒ™4i’Úü^“|M†åïØ±ƒaƱvíZlmmY½z5ëÖ­Ó:ÿÝm?¡ÍúùnëwG}õãŽ=6W6`ØÏïw¼Ñ5Ô¥æB ²Fr©\£»®QçWi ïùš§²£5ÊH~2×%®ämÊ£ä@ Ãþ9L£|j0fú˜ 4ÁÄÁ},}-i,hݯ¡²+šÉ^•¼YŽÕ+ôLõÐ5ÒE.•“·9÷åî8=éDßÇúbîeÎõê'ðÜW¸ã¶Ì³sÎÒÚÐÚ&~Ó¦ô1@ßJ¹DN¿±ý¨É¨Qóã¹Ò“êóÕTœP7Œí)ÂgƒCÞBñbJö—´GG˜1GG_‡šôš¬<‡Õ¦|4Ò‰|äMrò·æüm0 W(/gȪ!è›ëw©üº‹ËŸ\p~Ê™ÔÅ©4*×ÉX‘AÀçX)^­õ­ª~¯ÉýAkÕ)Õ8/rî±2˯¯cé™_ù*,’>†Ê7–ê[Z¨J´–¡ÐÂÏkC}Yá=Œ)Ç~¢¾µ¥û 3 ¬ èc`ˆD&câGÒ*oªùyÓ׳ååüRªnxû*?—ÍA¡üÝ/€½×óÙSßnámÕ}]]RŸÀ£GrE9Ïz éq¹xxxàâ₾¾>#GŽäÊ•+$%%áéé‰ãÇgóæÍlÞ¼™?þ˜k×®ÃáDZ¶VžJ­­­m÷MºuëÖ‘˜˜ÈáÃêçÉ·³³#11‘ððpJKK4hÐU·N¦”••±téR¤R)!!!˜››cllŒD"âïîîÊ«r/\¸Ð®»\ÞLuuFF}Ûu·¶öeøð¿ñÃaÔÔ\n×Ï–-[øþûï¹zõ*åååXZZÒÒ¢ÔÏNN“qršL\œ …r.R]}‰‰‘Ÿ¿©´€ÊÊ ÊÊ)+K¤¼ü'äúõo11±£©©T-¾¦¦2@‰‰òº¸':88ŒgèÐ嘛;“0ŸêêÍs —™¸¸Ì@.o&<ü Õïƒ?KZÚZZ[~Û\³ÀÚÚGå^_––:ÕÿeeI””$PR’€¹ù ÜÝŸÒÊÀåä4;»vïvT´¶¶!˜u©žoÞLS•Ÿ¹¹ nnóµ20Ýïø•í!‰¤™LÒa¥¦¦O||ïûpêñS´Tµ úZ„í8[†ýs¿ŽÿU%?÷£\j/Õ¼?ñQ1W7\U‹¿ñz#R±”ú+õèêâö’¹åªÜ-}-±ŸaÏé©§Û.Ð/T«âÒÑÓÁw£/r©œÌ•™Zå½þr=ŠVVþVT«êR¹i*µÍŒ'$¥’6'—:ÃÈÖ™DùFÕÙÙgUy¥ÑXÛòëÖæ±·#¶ cE§?ÕÆ½òt%§&)ïÙŸ÷|¸øêE­Ý¤öaåoEmfmö­_ÅeŒ9r€ ø00„—““Úø[äæAIS£Ö'»îdCÖE2ª*9<áqމx÷¢ú[@ù u”55‘SS¡ž+¼‡ñþ¥ •»¿µ s\\‰ü¹í[½çoV0úð÷èéèðiðcHä2–'ŸÖ*mÙ5Õ´ÊåŒìÛ3bAÙ>ÂØô#½ªç uuu\¸p .ЧOžyæ™6 ¦––~þùg¾úê+¦M›¦ZÀÇÇÇãå¥<¹0uêT¾øâ -Z¤vÔ¨Q,X°__ßÓО|©TÊ´iÓ°°°ÀÂÂBuõ‹««+UUU4iy ònqæÌêêêˆŽŽæË/¿ **ŠÄÄÄ{²¹ÛÛã?~ü8yyylÛ¶§žzª“¶£|ÚÀÀâwí:™L‚£ãÄ \¤§§óÜsÏáççGNN¾¾¾¿½)™ƒŽŽ>66#©¨Pn8õï‚D"V·~ͤÒ*¤ÒJ 1lØ ¬¬†¨â÷ðXHKK%%ñwn£Q\|Œââcxz.&""–ï¾IAA>>>ª7Sýýý)++C"‘üvZMÁÉ“OS\üK'åÓù ®;‘Ë¥èêh7«¾„ŽŽ>ööc(-MìÐ_CƒÒÐff¦Ùp£PÈÑÑÑëÑø[[•'ŸõõM{4þ;ÛŸ¥V~¹yó&˜›÷|úÛ£¶V9'³´´ìUú§·ëWMããàÁƒùòË/ñööææÍ›lÛ¶éÓ§³cÇ<==UúâàÁƒÄÄÄàííÝ%ùš(,,¤®®ŽI“&© fffªþ~‹!C†°lÙ2BCC»”gMò5å_›òÑ´qÜÙüCÛöÑÑüª+éë¬~´™¿ý4¥¯»õs‹5kÖ’’Brr2àÿWýº×ÜÜ\Š‹‹ÉÌÌÄØØ˜7ß|óûŽkgõÓò×[éL?vWÜo¬­­INNfΜ9üéORµÅÎÆ¹\ŽžÞíùÏéÓ§UyÕ××'66‰DÂÓO?­î…^èxð·ÓŠmÜ4É×&þŽäçää¨ B· Æ!!!ˆÅb•qKSþ»Ó~~_>"‘¨ÍÍ&Ú¬Ÿï–~x4Q³<•*%!(Œ(ä ‚8ÿ”òš}B ¥.»ŽÄÈD’OÂ|°9~[ü´rW-`êZ)Ú[DÉwêwüj _‘PAÎÚF7=S=<^ó kUµéµ8F; 5y—ÑÑÕaè?†úS(§#ýÝhZªZH}Vyň¢UAÒãIXx[–FèO¡Ô_©'}Y: 4N¦ü)Ÿ÷}ÿ5œÇ~~ Ûq¶$ÏMn»Ip­SŸ¢©°‰ðÄpLœM”§«š 9¢Œÿûј¹›qfÖµ°^o{‘¿%¿ÍÉ€Áo &ä‡"’"ù1„–š.¯½¬uÈ›åd½…ïF_LœÛ~Æ~º=‘É‘ ÿh8:º:D&G2*v”Vås } }£ðÄ€.É7ìkØÆP¦)P´*0´1ÔºüºÃ°÷†¡k¨‹ÿ§þD&G™ÉcGo_•w«ýøþËE‹‚„àjÒj´vPÚG¿ð~¸<ãBöÛÙ=ÚÇ>LâãÓÙJ³\ŽÏ÷ûH¹©nä´00`Á w¢\Úžð˜åiéÓg“0iÕÍͼ–¢uþ¥r¯§žãÓÑ1ÐÌ\Pº(cíð¼ç^OIî1™zzzlÛ¶¬¬,Š‹‹III¡¢¢Bíð>ø€‹/"‰HJJ¢ªªJÍýVø]»vÑÜÜŒÚ5}ôï¾ûn»'»:“_]]ÍÕ«WUÏõëÊ“Í÷ݸukSÃÛÛ???òóóÉÊÊ"33“¨¨(!~-Ù¾}; …‚ˆˆÞxã  Ï=÷œÊÝÝÝžžŽT*¥¬¬Œ]»vajjzÇ¢´™øø(‚‚6#bܸ}*ÃÀ×_D*­fÊ”ãÌ›w¹s¯2vì×€ò{V—/_Æ××—ØØX^ýuV­ZEyy9Ô×°g+‹˜7¯€¨¨l û÷û¨åÁÓóiæÌÉ"::SÓìß?€ÊÊtöïÆðácÞ¼ëDE]ÆÜÜ•o¾ŒL&EW×ÀÀ÷xâ‰bbŠ˜3'“¾}ý8|x¼ª»»»³nÝ:*++)**ÂÛÛßö7ˆ‹s¦ÿfϾHLŒˆ™3Ï1hP´Zúœœ&³`Xí±´ìþM}ý ö숓Ó4æÎ½Ê“OÒ¿êã[SS3fÌà?ÿù‰„£GöHûÓ6~™L‰ Ùô[ûø¦GûANο).>Jtt.Ñѹªöu‹_|‘²²2jjjprrÂÎÎ¿¹¹™ &°uëV$ ÇŽëú§7èט˜Äb1qqqèéé!‹9~ü¸Vãã•+W˜0a;wîD$‘““ÃŒ3 Q…ß±cFFF|ûí·ˆÅbÄb1—/_Öz|ï …B¯¯/ÞÞÞäååqõêUär9‘‘‘jþfÏžMZZšÊ¢mþ5É×”mʧ34Í?4µMó+mÒ×Yýh3ëšÒ×Ýú¹“ììl•œ7nàææFSS\¸pââbRSSñòòbäÈ‘÷¬ÿu§>ùèœÎôcwõÇý¦ªªŠ±cÇòꫯRPP@aa!3gÎlsÍag¬_¿žŒŒ ŠŠŠÈÈÈ ²²’¿üå/]žDEE±aÃD"ûöíÓZ¾6ñw$¿  WWW-ZDAAÙÙÙÈd2|||îIû¹…••K–,aáÂ…mÂw¶~¾Ûú]àµ[ðÛ}‘É‘Biôb‚z}93à‰íÍzãÆŒølu9uZŸþz˜ðÝèK]VÛ „öqúfú|@óÍf2–g o‘?R:äYÁD¹ bZüOw5Sþ;&’K5UZŸþz˜Øü—ª«øär–00ݹ¾»ÃÆrS*áù3¿Ò"¸ú×Ë/¿ÌÂ… šE¡€@W˜5+‹ß'7w—Pm‰D¬Y³†íÛ· …!ðÐKZZï¿ÿ¾?¡} ç|Îç,Ï9Ï9Ïî0¼3à,ÿµþôYÐGð?admÄП†2pÝ@DF÷_Ó™0v3z÷í²ø¾Éß]žN'3sŽ™Àš Ð²~mÆ‹ý̶£3Øs`Ìx6† ÇHtÿMvíÚ%|_@ kûfÿ%L›vSS{ÁdêÔL<<ævY|C‡®#"b3ÞÞÞ¨T*Í5dÈÛžŸ›õ[[{iËØ½{àmÑincÔ=›~¡~t–øøx–,Y"äO KÉÌÌlóè.!‚ <,Y²„Ó§Ocoo_Æ/ ð ¡5‹$+’qvÙY‡æðÐí_Zw‰äÑÉ”,C²MBbh"e‡Êô–뢽ûÏ¿{ž’=%H¶K¸´îçþuŽ+Ÿ_JñaêdŠÏ?}ˆ:EÔ±Ö¹0xó`lClqžáLdr$=¢{hä¾ïú2xó`º î†ýH{ §÷3½õ{°îcNtj4¶!¶Xy[áö”QÇ¢èùHÏ6Ã;NpÄÂÝ‚¼uy]jû‘öÌ©çN‘ófN—ÚO_\f»öKѩјô4Ñü>ìÀ0‚·êãô"ŽD°.à/ÙïNû‡È€àíÁôYÐÛP[Ü_tפ÷^ñæšfŽM9†ô7)à ÇÄÞ¤ËëØÿñóȱ<åáE˜}Oºë¯ÃÅÜ‚w“5y:Y“§wHo_K+ÎL‰!̾'¾ÝlYàÕŸÓ“§3ÁÙµÍðºöÆÓÊšçœîÒüéåÌî‘cy"9‘WÒŽ îCDuS£÷ïeO¡„ã¦à`jvGõ?÷ÜsÌŸ?Ÿ¨¨(Þxã ¤R)!!!ùŽ;Ø·o‘‘‘<ýôÓH$’[ž>kÖ,¼½½Y±b…Þñ;99!•J ÅÏÏ???ÍÇÞï–-[ƹsç˜2e .¤´´”‰' úõÄÕÕ•ÀÀ@Nž<ÉæÍ› ¤{÷îùˆ#hnn&>>ž±cÇ2wî\Ö¯_¯Gnî':4™¬ìž«¿£GÿÈ„ ‡qv~Ç™93ÀÀ¥yXØÇLž|—ñ8:Fâç÷2vvƒõ7ÂT*b±Xþúo¦¦¦zé2ä]Fú[[?ÍemíyGòž››‹Á]›x¨©¹À×_÷dÇïÛªÇÃcÿ¸gÓ;ëÇÝnî÷öÕÍÍ 6PTTDqqq›aÖ®]KJJ qqqDFFbgg§wú6oÞÌÞ½{ gÒ¤IäääðÒK/ݱþU—þÎæ_Wüºä÷zþ‚‚‚´®íÛ·sðàAMŸ küÔYtù‡.¹®ô·‡——R©”ÈÈHX¼x1%%%LŸ>½KòfhhHRRK–,!**Š¥K—jôé[~±ÿíΟ@çýûnöo¶¶¶š4íß¿Ÿ?üP󿉉É}cãO>ù„™3g¶ù æû!þδºÐõü|»Ûw‡­ž×´—z‚Úaœ§ÿ®=qY©ž‚ÿº#” «/`ÑÏï·¼Éýg.ö#ìuÊu¡ë~±-5-´Ô¶` 2 }~:nO¸Ñ#ª‡PŠwY±z´t_)þkýµdæ½Í± ¶åxÌq ©L­D¥RáùwOÊ˰ð° 2µ’ªô* D8ÏtÆÐ°•±~ïùaÔ͈Ì3Q4(4²†üš*š0¶3FѨ@^,ou¿ÈX„×k^œýgQ)Ušß}WúblgÌåO/£”)1ïmNeZ%òR¹^ù‹ðö²e!+–u©ýôÕ¼-˜ ï] ãù BwÜØábæbFKm å‰å8Å8aåcÅÅ5é§½cGûÝ ÿP)Uœˆ=¡ _}ªš^ÓzaÔÍèžó’Ý%˜9™áó¶ 3ºÌ~ßFŽÄÄÐ+##žõêÏžB '¯•ë}aC=¯§ŸàgÉU6„»u£/ñQpÝ™4‰ú–,¯®–kr9v&&4(Z(jlhu¿‰È·òZÚ ªöû÷PìMMY—›C£B»¥ÇË¥”46ê•~‘!k‚BxîØï64 îCÊWóq17guPO&¾cz?ûì3uý‹±³³£¡¡ªª*<==‰ˆˆ 44”Ë—/säÈT*o¿ý6{öìÑöcV¯^Í /¼€B¡Ð+~€>}úP]]Maa!ÅÅÅZ÷Þm¼½½yñÅ eÕªUœ9s†Å‹³nÝ:~ùåA¿PPP@]]R©”ŒŒ ­É¥„„†Nrr²æ÷­[Õß»‰Œ±¶vÇÈȆ1cv³oßX**´û?¿—ðó{‰sç6QRr‘HŒHdDA:}qqq¼óÎ;øûûãææÆÁƒ "'Gý¢NDÄfºuó%#c¦¦ö ´Œ¬¬•äæ~ ¨w@þÊÕ«»±³ `àÀ×IO_ÆùóŸÓ¯ß³XZöf×®;oŠ‹™:õ{¸v-cckêê®R\œ€B!§¤äH‡Ê`øðϱ²r'3ó_€Š  ·).NääÉ×5aš›k©¬¼õwQÂihЭÛß")é$’½zé9rææde­ÂÈÈ GÇ®]K×;ýS§fRT´Ÿ+W~ÄÖÖ—Aƒ–“œ¼€«Wwßú»uóÆÔÔCCSºuS/D)rjk/êopýôÓO|ÿý÷ 2„ÿû¿ÿã•W^Ñ,Òv6ý½{OcèÐ8qâUêê® ¢T*JSôª÷sûó ´¯ÄÅÅñý÷ßßJ¾ÿ~LMM±¶¶fÑ¢EìܹSóz}ÒçííÍ‘#GHIIA$ñÌ3Ï`iiyÇúW]ú;“}âC~Ä IDAT×%¿×ó—––¦ù;>>žÚÚZbccõ?u]þ¡K®+ý×122âË/¿ÄÎÎŽ3fPWW§‘]¼x‘²²2ìíí©¯¯§   Kò¦P(ˆˆˆÐüôèQæÍ›§µÀ¨«üôµÿÝÈŸ@çüûn÷o•••TVVªç‚ëë)//';[{7mÚ4>úè#^}õU®\¹‚¡¡! …‚”” D*•âîîÎêÕ«YµjŸ~ª¿fff²ÿ~~üñG|}}Y¾|9 ,`÷nõøgÓ¦M888°jÕ*ðôô$99™ÂÂBf̘Á’%Kxá…Ø´iGeÿþý|üñÇøùùQ__»»;666ìÞ½›±cÇjïuůKnll¬3þÍ›7ãëëËŠ+°··gÙ²e¬\¹Rïüw¶ýh}žŸowû.ðð¡ýj‰Á­6U4`Üß·}‹¨>U¢AR®Ô)™´ä®û½^ñRW´©¥Òg~òÖåQ¼«ßw}uÆ/Шn-j¸Ò@Öâ,>#õ¢DK]‹¦\òÖçá±È—Ç\è>¬;–Þ–\Ù¬½Ïc±îqîŸ~œ–ú–VzÌ{›cÔͱ¥LI=¨ÎªÖ ãµÄ‹ª“U”Ö^(ü¶¿5~ô£?E»Š(ÞYܦŽ[aÙß±Õ™Õ]n?]÷0&ä›NÄž@^&ÇÌU{wƒ™›ÊF%—?½Lè¡Ô_¨§,¡ŒþKû#¶wÈ~wË?4“}O¸áú¸+éO§ÓXÐxOúGUZ®ó\»¬j¹˜[àÛÍ–I ¿q¹®€g½úóóȱRËËxƳÿ×kee…§§'nnnˆÅb‚‚‚8þ</^$66–½{÷bk«ÞUZSSÓæ›t+W®$))‰½{÷ê?@JJ ^^^1jÔ(Ö¯_Ïúõëùè£îzy\ß™RZZÊÂ… ‘Ëå„……aii‰©©)2™LÐß <<ÔGåž:uªM¹RÙDUU.&&ÝÛ”ÛÚú3pàëüòKÕÕçÚ ³aÃ~úé'.\¸@YYÖÖÖ47«Ûg—q¸¸ŒcûvT*¥º«:Ø1?sùòwÈåTTdQZšDiiee'3f7W®ü€™™%ZúKff><0ÀÉi,ÂÒÒ•ÄÄÙTUåê´›ÛÜÜ&£T6ù…æ÷~ýž!#c--õL®Yakë§‘×Õ]¡¹¹Vóii Åʼn'biÙÇõZàrqƒCÛ¶9kzZ{û0ŒŒ,:TÎ×®ehìgi醻ûl½˜î¶~µ?ä"“•¡PÈnYfééé$$$@JJ IIIlß¾SÓà.I¿R)'/o[‡ëÇýÞþ<í»J¥j§~»@xx8/^`Ñ¢E$''¬WúV¬XÁ²eËX°`£G& €µk×jtÜîþU—þÎä_ŸøuÉïõü]gùòåôìÙ“1cÆthüÔYtù‡¾þÓ^ú—/_Λo¾IHHµµµmŽºw­-Lœ8‘'Nti]ÿÛßþF\\ãÇ'//O¯òÓ×þ÷Bþ:îß÷Kÿ&—ËÙ¶m[›2SSSæÌ™Cpp0---Èd2FŽ©YàÈÈÈ ))‰¤¤$ÜÜܘ={¶fçóÏ?gË–-¼ÿþûlÙ²…-[¶hùpMM éééœÄúì6¨b 1¥{Kqšî¤n ÷•b;Ä‘‰H§üf$Û%˜:šj_§Ïý ù d-Ê"ä›ÒžH#ð?í*B²]‚Û“nBiÞe*ŽVíïລRŽHd¤Wتª3ˆqtNIIÒ-ÃÕ׫Ú,,t/ܨTJ »TK‹zç³XlÞ¥úoö?##k½ÂsíÚ5ÊË˱´ìúôw¤~Üïíσ޾P[[ËØ±c5 šú¤+}ýúõ㫯¾ÂÇLJk×®±qãF&MšÄæÍ›ñòòºíýkGôÿ•ü늿³úïvþ®Ó¿âââÿËã§Î¢Ë?Ú“ëJÿòåËIKK#55•]»vñh÷zéÒ%ŠŠŠÈÎÎÆÔÔ”7Þx£Ë¾ãÈîÝ»‰ÅÇǧËÇÇw;Ý¿ï÷þÍÖÖ–ÔÔT¦OŸÎO<¡ñÅöü\©TbhxcüsôèQM[&‹‰G&“ñä“OjÝ÷ÜsÏÝzŽðÝŠVV­Çºâ×Gÿ­âÏÍÍÕ,]_0 C*•j·tå¿«Úçž{‰DÒêd}žŸïDû.ðð µòTòs ‰!‰d-ÎB¥T‘’ÈÉÇOª'|Å„ÿNíÙZ’¢“Hy$Ë~–lÐK®y€©m¡ð»BŠÔ>ãW×ýå‰åä®ÈeèC147ÄóOr–æP“YƒóLg¡$‰Nfà‡1ÍøÓð¯„ÿŽÿ¿ýQ5«H M¤:C½{¦!¿´'Òð{ÏÈß#öÛ0ìGÚ“:#µõ$ÁÅz’I¦± ‘ȤHÌ\ÍÔ»+›ÛFÔÑ(†þ4  ŽM=¦u¯÷[Þ\Þp¹ÍAý^ëGØ/aD¥D¶'Œæêfέ8§wþ•MJrÞÊÁ­«T]a?±•ç™Îôz´W«zÓß ¹‹Ô;›%(d Œ»£”+µ'0*T-*ŒíŒõ¶ßÝòßU¾ˆŒE~Htj4Ñ©Ñ Û?ìžó‘=p{ʳoí2Û©€è_÷ÐÏÚ†Ô rlüT¨˜–x@+œ•‘súzãÖ·US]{sfJ ŸŽ¡g¦Ä°3zt«pçkª‰Ø÷3WêëH›8•Þ–È *ärŽ™@Öäé3/+kÆî×Þ=öö  >8{†kòÖG?¾5p‡ÆN$sÒ4ÇN¤ª©‰·2Òô¶\©àÕô|2t½-,…÷!e„c/xõçÕ´Ô;¦ÓÐÐ7’““CQQiii”——k~]¾uëVšššpppÐ:bàÃ?äwÞiõfš>ñ¿ÿþûœ>}‰DBJJ •••·üÆ×Ýx(öññ! €Ë—/“““Cvv6111‚~=Ù´i*•Ѝ¨(^{í5T*Ï>û¬FîááÁ®]»ÈÌÌD.—SZZÊÖ­[177¿é¡´‰„„BBÖ+aäÈêñAKß|Ó¹¼Šñã1kÖf̸ÀˆßêïY;wâããyõÕWYºt)eee899QW—Ï·ßöÁÓs³fås•JÁÎ~Zyðòz’éÓs˜9óææ½Ø¹s™ìÜéËÀ¯3kÖbbÎaiÙ‡ï¿ï‡B!G$2&8x>šFll!Ó§gÓ½{{÷Ž ??V®\IEE………øøøàééùǃýU¶ow¥gÏ0¦M;Ml¬„)SNзïL­ô¹¸ŒcΩÖemÝù Þºº«|ûmo\\&2cÆ{¬€ž=Ã(/×îß™ú;“]ñë£ÿ^Îßu¦M›FFF†f¬#ã§Î¢Ë?ôñŸ[¥ÿfΞ=«±ÃÕ«Wqww§±±‘òòrN:EQQéééx{{ÔeùÛ¼y3&&&üðÃH¥R¤R)çÎÓ«ü:bÿ»•?¿îß÷{ÿVYYɈ#xùå—ÉÏϧ  €)S¦´:æ°=V¯^MVV………deeQQQÁÿþïÿv(MMMÄÄİfÍ$ ;vìÐ;~}ôß*þüü|úôéüyóÈÏÏçìÙ³( üüüîXû`ccÃüùó™;wn«ûÛ{~¾í»ÀÇÁs«D§F Öx€I I|àóè:Ï•^öjsѬ+1íeÊ ÏQ›[«÷î¯û ÿµþÔæÔ’¿1_ð›[ˆüÅ`š®5‘µ( e³ò¡jCžñìGŒ[_&&üz[õ8™™óßáÑœ©®Ô{÷×ýĆÐaœ©ªäãs9BÇt–b#¶EŒàš\Æ‚c¿Ó¬¼¿ê׋/¾Èܹs»lRI@à^bêÔLNŸ~K—¶ Æh…D"aùòålÚ´I0†À}K||<¼÷Þ{Bþÿ¸Ï¸†.‡‘`{…°_ÂZÍ×ÿˆÇb.O§i/SÂv‡1àd9ø¯õ§Ï‚>‚ü #k#†þ4”ë"2ºÿšÎ„±˜Ñ»o—Å÷å°H–øìòt:™™spÌÖ…>õkCè0^ìÿ`¶ÁÆØ˜cƳ1l8F¢ûh²k×.áû]Û7û/aÚ´Ó˜šÚ Æè S§fâá1·Ëâ:t›ðööF¥Ri®!C†ÜöüܬßÚÚKëXÆîÝo‹Nssg£îÙô/_¾œ¢¢"Íш%>>ž%K–ùèR233Û<ºK@ðOƒ%K–púôiìííïËø$´f‘dE2Î.;Ëá°Ãz¸UàKë.‘<:™²ƒeH¶IH M¤ìP™Þr]´wÿùwÏS²§Év —Ö]àÜ¿Îqåó+B)Þ!\b]pžåŒm¨-}_èKtj466­ÃÍv!ì—0¢S£1éi¢ùÝÚÏZëøá@†üw†º¬û˜mˆ-VÞV¸=åFÔ±(z>Ò³Íðޱp· o]^—ÚÀ~¤=Áßsê¹Sä¼Ù±#ÆLzš¨mhƒe?K,ûYbâ`Òñr¸…}‡Fð¶`@}œ^Ä‘Öü%ûÝ ÿÐW~·ü£¹¦™cSŽ!ýMÊðCÃ1±ïXÙ¹˜[ðîà`²&O'kòôVò—ø“2n28¹ð„»'ÙSbÝ˹Ëâo¾–Vœ™C˜}O|»Ù²À«?§'Og‚³k›áuí§•5ÿÎ9Ý¥õkL/gvËɉ¼’v\ht"ª›š½/{ %Ÿ0S³.ßÍÍ 6PTTDqqq›aÖ®]KJJ qqqDFFbgg×!ùufÍš…··7+V¬Ðû~}Òw7Y¶lçÎcÊ”),\¸ÒÒR&Nœ(è×WWW9yò$›7o&00îÝ»kä#FŒ ¹¹™øøxÆŽËܹsY¿~½V¹¹ŸpèÐLd²²{Î?Fþ‘ ãìü3sfK5ò°°™<ù(..ãqtŒÄÏïeììêo„©T*Äb±&üõßLMMõÒ¿~ýz:D`` æêß¿ÿÉ{nn.wm⡦æ_Ý“;¼o«9üãžMÿûï¿Ïرc)--}àÚŸû½}ÕÕ¿999!•J ÅÏÏ???œoŒƒ‚‚´®íÛ·sðàA­6`áÂ…dff"•JqrrêðýíÑ^ÿ­+þÎŽ?6oÞÌÞ½{ gÒ¤IäääðÒK/é-×—¶ìghhHRRK–,!**Š¥K—"•J‰ŒŒì²òkÏÿôÑßYÿÓåÿ•·‡———&?,^¼˜’’¦OŸŽ€@gѧþtEûøW±µµÕ´û÷ïçÃ?Ôüobbrߨù“O>aæÌ™­¾Á|¿ÄßÿÑÅŽ;Ø·o‘‘‘<ýôÓH$­ol=÷ÜsÌŸ?Ÿ¨¨(Þxã ¤R)!!!BåøËh-p™ö2ÅçŸ>øÿÛ¿UÀúKõü·€Á_ ¦xW1òr9Þoy“ûÏ\½äºÐu¿Ø€–šZj[0>?»avôžß[(Å;„d»„Âo ©:YE}^=ŠFÍÕÍ7œÉXDèŽP.7ñ|Fë‡ØìÍÕ{~oZê[89ï$*…J+œØÿµþ þb0†æ†Z²†üê.ÖQA­_^,oíÔÆ"¼^óâÜ;çP)oÄí»Ò—AŸ ¢[P7¬}­qœàØ¡&‘±ˆo û¥ldŲÛÏÌÅŒ–Úä%rê/ÖSw¾y©¼Cúoeßëq—'–ãã„Çß=¸¸æ"^¶ßÝò]ò{Å?Jv—Pðß|Þöé} êy=ýqÇ“[?àXYóŒg?b“1£wìMÍXzê$ÿ4¤K⿱HĆÐalÅŸ¯yuµœ«©æ\M5 ŠŠZÝo"2ä­,ËHG¡ºa¿ å¿Ã£éa¿mwuí£™þ‹&"CÖ…w<™Â†¡Á}Hùáj>_\<Ïê ®ÜwË·h÷ïßÏ!C°¶¶fÑ¢EŒ7ŽÚÚZ½å?61aõêÕüýïG¡Pè}¿®ôÝM¼½½yñÅ7nsçÎÅÑёŋ³nÝ:Aü/##ƒºº:¤R)TTTh&ßˆŽŽæñÇç·ß~cëÖ­üÏÿüºÏÓ­›7ݺù2a‘6w¸øù½Dl¬„Aƒ–Ó«×HœÇâêzc‚-..ŽÊÊJ\\\§±±‘nì$ˆØÌäÉÇqu„—×ÓÌš•·÷B|êÔL‚ƒWãàÁ€ÿCl¬„~ýæЯ߳XZöfÏž( åÒ¥x~ù%‚i±Œ­©«»Jqq%%GÈÎ~Ÿk×Òõ¶ßðáŸ3~ü!œœÆàä4šÉ“1dÈ»Zaª««ÉÈÈÐ\þ¶ƒC8½zEããÇìÙŸ¸Œ×[ÿÈ‘;˜4éwÜÜ&ãá1GLjùÐÔ©™„„¬ÁÁ!oïç™=»7·É÷þnݼ15µÇÐÐô_ôÆÊêÆŽp‰D† 9r$¯¾ú*2™Lã¿]‘þÞ½§ñØc¸»Ï¦gÏp#èÙ3üß2ÆÏÏ€€NŸ>Ýå;èîvûó ´¯ºú·>}úP]]Maa!gÏž%;;›ÂÂB<--Ms½ôÒKÔÖÖ2jÔ(ZZZ4ýî±cÇ8þ/^$''‡3gÎP__OAAð@ Ðiô©?m;Cee%ÙÙÙdggS__Oyy¹æ¹\=‡3mÚ4 ˜={6áááDDD®‰ÃÑÑ‘qãÆ1xð`f̘A^^ Þ¿fff²fÍ"""xþùç)))aòäãŸM›6±{÷n†ÎàÁƒ™5k–f~ÆŒ?~œÁƒ“žžÎÇÌÔ©S),,ÄÖÖccc¼½½ñõõåÈ‘#¶Ÿ·¿.¹>ñoÞ¼™ãÇ3iÒ$ž~úiòóó;”ÿÎúO{xzzÁ /¼À‘#Gøâ‹/Xºt)o¿ý¶&ÌgŸ}ÆçŸNrr2¹¹¹444PUU%T^¿Œöìf;iš*šÔ­‡1>oû 2Q}ªEƒ¥\©S.2iÿÈ!]÷{½â¥®h RK¥Ïü>ä­Ë£xW1¾ïúêŒ_ ‹ÆBŒYo3ÌœÌ0`íoMC~Æ=Œ ù&„±'—É1s½õĶÇ"ŒíŒI{"­µl±îqîŸ~œ–úÖ«yosŒº!¶£”)é1¢ÕYÕÚ‹K¼¨:YEùárí€o ñ[ãGÿ7úS´«ˆâÅm긖ý-1PYý—lW•^Åï£~Ç@l@÷ðîøüÓ‡«[®rõ««:ïÕe_373”J.z™ÐB©¿POYBý—öGl)îýî†èë?÷ŠT¥Uá:ϵC¶Qµ#³3Q¿¥^&“±$-¹BÉ»XˆÅ˜"»i¢ü¯ÄWø³ØÇ—ñ~¥®¥¹•¼¯…¶Æ&t32F¦P0¦—3״¼áÀñ²2–iýþõåK¬ 矃ùîÊe¾Í¿Ü¦Ž[ácÓ ±HDúŸô <|¤–—ñŒg×î¾P©n]CÜÜÜ <<œ‹/°hÑ"’““ Ö)¿™•+W’””ÄÞ½{õŽ_Wúî6×w¦”––²páBär9aaaXZZbjjŠL&ôwõQ¹§NjS®T6QU•‹‰I÷6å¶¶þ ø:¿üAuõ¹6ÃlذŸ~ú‰ .PVV†µµ5ÍÍêöÙÅe..ãØ¾Ý•J©îãªÎ0fÌÏ\¾ür¹z!®¢"‹ÒÒ$JK“(+;Á˜1»¹råÌÌhl,ÑÒרX ¨03Swøð<À'§Q °KKWgSU¥û%87·)¸¹MF©l"2ò Íïýú=CFÆ ZZê°±±ÑzøÏËË£¦¦Fóii Åʼn'biÙÇ‘HöêÔïâ2‡0¶msÖô´ööaYt¨œ¯]ËÐØÏÒÒ w÷Ù\½ºûž×¯ö‡\d²2 Ù-Ë,==„„HII!))‰íÛ·cjÜ%éW*åäåmkýüØÔDvv6=zôx ÛŸ¡}×Õ¿¥¤¤àåå…‘‘£Fbýúõ¬_¿ž>úH+ÜòåËéÙ³'cÆŒÑüæàà@RR‘‘‘”””зï­ânë~Ýíþýÿ­âïÌø`ÅŠ,[¶Œ 0zôhX»v­&]òöèˆýþö·¿ÇøñãÉËËë’òëˆÿÝJgüO—þÎʯ§ùòå¼ù曄„„´ùr”‡‡Ý»wÇÖÖ–ÆÆF&NœÈ‰'„.CWýù+íãB.—³mÛ¶6e¦¦¦Ì™3‡àà`ZZZÉdŒ9’O?ýT&##ƒ¤¤$’’’psscöìÙìÞ­ÿ|þùçlÙ²…÷ߟ-[¶°eË­:ZSSCzz:'OžD"‘°k×.>øàÜÝÝIKK#77WëD†?£+þöäMMMíÆ?nÜ8Ƈ‹‹ J¥zü~æÌ~þùg¾ûî;Í‹tíå¿«ü§-.^¼Hll,{÷îÅÖÖVcÏ?ïD³²²ÂÓÓ777Äb1AAAœ?^¨´ ½W…º ê†ØBLéÞRŒlŒ043¤t_)¶Cl™ˆtÊoF²]Byby‡âõ'ù&„‚­þ'+_+$Û%BIÞ!Zê[¨Í©åÊW(ü¦çõJ¹’ôùéZbÞÇ3'õ…™‹†¦7vÙXôµÀu®+gß:Ûfü—>¼DÆ‹„î Õ,jÞLÕêÎ×Qº§”ËŸ^Æq‚£–ÜÚßÇÉŽœ{§õ$OÕ)õÓñ˜ãH¾–0`åüÞóÓ;ïuçêPµ¨° ´é܃^‹Šk¿_£øÇbìG´>ÒÆ%Ö…ÑÚêºìkbo‚B¦^9>í8Ù¯f£hTÿoÜÃXoûÝ-ÿÐ×îÿ° ´¡&»¦Ëìv²¢œº–f¦¸ºQÕÔD£¢…I.®//kµ¸5Ïݓѽœþ’ž59§™Ÿ’ÄÞÑð¦ë·€.××’[]ÅO’«¬ËÍaŠ«›–<ÐÖŽén}ø™­§O^+gèÞŸðW¾ºt å£0½Óv¶ºŠ¥’ î=„†ö!g°]2+ïÜBgAAµµµŒ;öF_eaA}}½^òë 2„9sæ´:HßûïUŽ;Fmm-3g©™ IDATΤ²²’††bbbHJJº#“»ºþC‡‘——ÇÆÛ ×Ü\€‘‘•Öïµµ—P(d8;ßzRÂÉɉÌÌLž}öY¶oßNnn.æææê¾¯*1vvAšð={†!“I5‹[ÆÎnry%ry?cg7›‹Òžžsin®§¸8áæÑEE8p` gÎ|DTT<ùùùøùÝèo)--E&“QQ‘¨8räI¶owÑ\_ÝS³¸­wpݼ¸õg”J9"‘‘^åSUu1ŽŽÃÛ w½>[Xè^¸Q©”v©þ–õÎg±Ø¼KõßìFFÖz… æÚµk”——ß–ô·Åõò¶¶¶~ ÚŸ½}Õö±f~ûí7¾þúëVG¼õïߟ¸¸8^xá…VŸ'NÄÊÊ ///z÷VŸìÒ§OÌn:EàV÷wv|p»ãïׯ_}õ'NdãÆ<öØc,^¼˜Í›7ë%×gâX—ý)(( ==Ÿ[Nnþ•òÓÇÿôÕ;ü¿³òë,_¾œéÓ§“ššÊÊ•+[Ï\ºDvv6ß}÷«V­â±Çº}êÏ_m¿î6¶¶¶¤¦¦òÙgŸáãヿ¿?ß~ûm»÷(•J oŒŽ=Š——¡¡¡|úé§lÚ´‰¯¾úªÕ}Ï=÷\›u ®N=>·²²j%Ó¿>úonn®fAè:aaaH¥RÍâ–®üw…ÿ\·ÏÍG^'!!oooxúé§±¶¶nõœ\[[Ë©S§øàƒØ´iO=õ”Pqþ2Z+O%?—’HÖâ,TJ‰!‰œ|ü$ >,ü×pjÏÖ’DÊ#)Xö³$`C€^rÍLm …ßRü£öȺî/O,'wE.CŠ¡¹!ž¯x’³4‡šÌœg: %y›10à_ÿ5œ¨£Q ýq(͕ͤ?“®)׆üÍÕXÔ@£¤Q³ðÐó‘žÔž­¥áÊ­ «¿XOò#É44™‰™«™z—`ea»ÃÔúŠ…‡ǦÓº×û-o.o¸¬Ùx3ý^ëGØ/aD¥D¶'Œæêfέ8§· ”MJrÞÊÁ­»;ÔnEÿ7ú¾'œÈß# ù.„æšö»ŽØJŒóLgz=Ú«U½iϾÆÝQÊ•Ú ªÆvÆzÛïnù‡¾þs/øGȸ=åvËEÚ[1Õµ7g¦ÄðéÐápfJ ;£G«í£T±ïgØtãÄ„GIzd¹ÕÕ<“rD++##æôõ Æ­o‡â¿™ó5ÕDìû™+õu¤MœJo Kä r9ÇL kòtŒ—•5c÷ïÓº÷íAA|pö ×ä­~|kà Hæ¤i$ŽHUSoe¤ém¹RÁ«é'ødè0z[X îCÊÇ^,ðêÏ«i©]oll,R©”íÛ·chhˆT*åСCLöªð÷÷× Ü/\¸€R©$::Z/ùu>üðCÞyçVo¦és{é»Û477ãããC@@—/_&''‡ììlbbbýz²iÓ&T*QQQ¼öÚk¨T*ž}öYÜÃÃ]»v‘™™‰\.§´´”­[·j¡Ô¥M$$IJ†ØX #GîP÷- |óMoäò*Æ?ĬYW˜1ã#F|¨¿guîÜ9üýý‰çÕW_eéÒ¥”••áääD]]>ß~ÛOÏyÌš•OLÌYT*;wj¿àáåõ$Ó§ç0sæ%ÌÍ{±s§úˆÃŠŠLvîôeàÀ×™5ë 11ç°´ìÃ÷ß÷C¡#¼ŠGM#6¶éÓ³éÞ=€½{Gê.V®\IEE………øøøàééùǃýU¶ow¥gÏ0¦M;Ml¬„)SNзïL­ô=ú裨T*­ËÛ»óߥª«»Ê·ßöÆÅe"3f\à±Ç èÙ3Œòríþ­±±‘É“'óå—_"“ÉØ¿—øŸ¾ú ‡Ï%,lÝþñ}—ÖƒÜÜÿPT´Ÿ™3/1sæ%]çù矧´´”êêj\\\ppp¸£éojjbôèÑ|úé§Èd28ð@´?Bûª«{ÿý÷9}ú4‰„””*++[M”M›6ŒŒ Í.§ëTUUqáÂÍuåÊM»ÒØØ¨ó~]èÛÿ·gÆçÏŸgôèÑlÙ²‰DBnn.“'O&,,L/¹.ô±ßæÍ›111á‡~@*•"•JµŽ€íLùéãºôwÆÿtéï¬üfΞ=«)ç«W¯âîîNcc#åååœ:uŠ¢¢"ÒÓÓñööÖš°è úÔŸ¿Ú>Þm*++1b/¿ü2ùùù0eʲ³³õŽcõêÕdeeQXXHVVüïÿþo‡Ç111¬Y³‰DÂŽ;ôŽ_ý·Š???Ÿ>}ú0oÞ<òóó9{ö, …Bë…±;á?666ÌŸ?¿Íc`7nÜHNN[·n¥©© ŽSÏÏjäEEE¤¥¥Q^^ÞæB™€€ÞóÒüq^Dtj´`˜ÄÄ>®ó\éõh/Rg¤ÞV=¦½LôÙ jskÉ^’ýÀÙÑ­?µ9µäoÌüã&Äb1˜¦kMd-ÊBÙ¬|¨Úg<ûãÖ—‰ ¿ÞV=Nfæüwx4gª+Y”zô³ã†Ðaœ©ªäãs9BÇt–b#¶EŒàš\Æ‚c¿Ó¬¼¿ê׋/¾ÈܹsõžT¸Ÿ˜:5“Ó§ßãÒ¥­‚1Z!‘HX¾|9›6mŒ!pßOFFï½÷ž?Á?î3„®‡„‡aK@@@@@@@@@@@@@@@@@@@@@@àá@$˜@à^!ì—°VGóu†Àÿâ±Ø£ËÓiÚË”°Ýa xgÀYþkýé³ àÂÈÚˆ¡? eຈŒî¿¦3aìfôîÛeñ}9,’%¾»>ž%K–ùèR233Û<ºK@ðOƒ%K–púôiìííïËø$´f‘dE2Î.;Ëá°Ãz¸UàKë.‘<:™²ƒeH¶IH M¤ìP™Þr]´wÿùwÏS²§Év —Ö]àÜ¿Îqåó+B)Þ!\b]pžåŒm¨-}_èKtj466Zaú/íOÈw!¸>îŠmˆ-F¶7>âmíg­u üp Cþ;CºÍû˜mˆ-VÞV¸=åFÔ±(z>Ò³Íðޱp· o]^—ÚÀ~¤=Áßsê¹S伩}Ę©“)>ÿô!êhQÇ¢nmÇÙ.„ýFtj4&=MôÖíû®/ƒ7¦ÛànØ´'ü×pz?Ó[#v`ÁÛ‚õqzG"Xð—ì÷W0éi¢ö‰@,ûYbÙϽís¯ûGsM3ǦCú›”ᇆcboÒ±úcnÁ»ƒƒÉš<¬ÉÓ[É_àOʸÉ<âäÂîždO‰at/ý¿/`Û]ëútèp¾…¡nûõµ´âÌ”Âì{âÛÍ–^ý9=y:œ]Û ÿ¨ko<­¬ùwÎé.­_cz9³{äXžHNä•´ãB£ûQÝÔÄèý{ÙS(áø„)8˜šuY܆††$%%±dÉ¢¢¢Xºt)R©”ÈÈHM˜;v°oß>"##yúé§‘H$mž¾páB233‘J¥899µ©oÖ¬Yx{{³bÅ ­ß×®]KJJ qqqDFFbgg§‘999!•J ÅÏÏ???œïï‹.[¶ŒsçÎ1eÊ.\Hiii«È úo««+œã]èJŸ.ûéJ¿®ò×%ï¬êŠ_Wþ:›þöðòòÒ”W@@‹/¦¤¤„éÓ§ w¤ýílûØlmm5mþþýûùðÃ5ÿ›˜˜Ü76þä“O˜9sf«o0ß/ñwæùYºú‡»é&â›ÿ1í¥ž€vçÀé¿kO\Ö_ª§à¿„îåÂê Xô³Àû-orÿ™‹ý{r]èºß@l@KM -µ-ˆ HŸŸŽÛnôˆê!”âB²]€¡FÝŒP4*h®n¾1@Þ„ÈX„ØRŒÛ“nH“R}ªúÆClvæoÿµþ´Ô·µ8«•±~ïùaÔ͈Ì3Q4(4²†üš*š0¶3FѨ@^,ou¿ÈX„×k^œýgQ)Ušß}WúblgÌåO/£”)1ïmNeZ%òR¹^ù‹ðö²e!+–µ’ËŠÕ Ä¥ûJñ_ëßæýÁÛ‚¹ðÞ2žÏ tGÇv¨XxXP™ZIUz"œg:cha€™‹-µ-”'–ãã„•×\¤oœöŽ}ì÷W¹žy‰¹T®e{}ìs¿øGÉîÌœÌðyÛ‡Œ…zÛ§°¡ž×ÓOð³ä*B‡i?àXYóŒg?Æü•·’[]ÍÒS'ù× !(.Ô+þÌÊ ÍßB‡Q×ÒÌÂc¿·nôE"> £»±1ó&QßÒ¢‘åÕÕrM.ÇÎÄ„E E ­î7òÖÀ@^K;BuÃ~ÿн©)ërshT(p·´âx¹”’›>òÝ&"CÖ…ðܱß)lh܇”®æãbnÎê žL>Ü%q* """4ÿ=z”yóæi& <==‰ˆˆ 44”Ë—/säÈT*o¿ý6{öìQû§‰ ‡æÿøS§Nåøñ¶`MLLX½z5/¼ð Ŷiÿþý˜ššbmmÍ¢E‹Ø¹s§æ#»}úô¡ººšÂÂBŠ‹‹µî½Ûx{{óâ‹/ʪU«8sæ ‹/fݺuüòË/‚~=(((   €ºº:¤R)Z“ >œäädÍï[·ª¿w%cm펑‘ cÆìfß¾±TTh÷=~~/áç÷çÎm¢¤ä"‘‘Ȉ‚uúâââxçwð÷÷ÇÍ̓DNŽúEï¿ÿž€€^ýuX½z5K—.åƒ>Ô;  åêÕÝØÙ0pà뤧/ãüùÏé×ïY,-{³k×7ÅʼnLzŠ‚‚=\»–ޱ±5uuW).N@¡SRr¤Ce0|øçXY¹“™ù/@EPÐÛ'ròäëš0Í͵TVÞú»¨á44HèÖmo‘”ô É^½ô¹ss²²Vadd…£c×®¥ëþ©S3)*ÚÏ•+?bkëË AËIN^ÀÕ«»ï ý~~~ôìÙ333ÍÇËe2™æƒôíùGW¤¿wïi ú'N¼J]ÝD"C”JRiŠ^õã~n„öµ  €¸¸8¾ÿþ{âãã[ÉuõŸ}ö™zü*cggGCCUUUZy8rä)))ˆD"žyæ,--õ¾_µ¿®þ=--Mów||<µµµÄÆÆê5þÐ%×5¾Ñ‡öÒ§Ë~úŒŸt•{ò®êÛÓ¯Ë?:“þ›122âË/¿ÄÎÎŽ3fPWW§‘]¼x‘²²2ìíí©¯¯§  @x ¸#íogÛÇÎPYYIee¥z.¸¾žòòr²³µÇqÓ¦Mã£>âÕW_åÊ•+¢P(HIIÀÑÑ‘ÀÀ@¤R)îîî¬^½šU«Vñé§ŸªçG23Ù¿??þø#¾¾¾,_¾œ °{·zü³iÓ&Xµj xzz’œœLaa!3fÌ`É’%¼ð lÚ´‰£G²ÿ~>þøcüüü¨¯¯ÇÝÝvïÞÍØ±cµÆ÷ºâ×%766ÖÿæÍ›ñõõeÅŠØÛÛ³lÙ2V®\©wþ;óü¬ }ú‡»é&bí™ã[lªhÀ¸‡1>oû 2Q}ªEƒ¥\©S.2iÿÈ!]÷{½â¥®h RK¥Ïü>ä­Ë£xW1¾ïúêŒ_ ‹ÆBŒYo3ÌœÌ0`íoMC~¦N¦Xy[‘:3•†+êÉi·'Ýþ6˜ãÓ´'=y`lgLÚi­â÷Xì{œ;ǧ§¥¾¥•ܼ·9F݌ۈQÊ”ôуê¬jíÅ‚%^T¬¢üp¹ö÷…ø­ñ£ÿý)ÚUDñÎâ6uÜ Ëþ–ˆ ¨Î¬n;€êÖ÷÷0&ä›NÄž@^&Ç̵ã»òÖçá±È—Ç\è>¬;–Þ–\Ù¬ÞÁhæf†²QÉåO/úC(õê)K(£ÿÒþˆ-Ųß_¥*½ŠßGýŽØ€îáÝñù§W·\åêWWuÚç~óª´*\ç¹vÈ>íeßÎDý–z™LÆ’´Tä %Cìz`!cjhˆ¬“ݯøúÓÃÄ„YG’[Ëø³ØÇ—ñ~¥®¥¹•¼¯…¶Æ&t32F¦P0¦—3״¼áÀñ²2–iýþõåK¬ 矃ùîÊe¾Í¿Ü¦Ž[ácÓ ±HDúŸô <|¤–—ñŒgÿÛ÷ßþö7âââ?~úè®—Çõ)¥¥¥,\¸¹\NXX–––˜šš"“ÉýÀÃC}Tî©S§Ú”+•MTUåbbÒ½M¹­­?¾Î/¿DP]}®Í06là§Ÿ~âÂ… ”••ammMs³º}ž2e >ú(&&&(•JÍñï¿ÿÎÖ­[)/W÷•Y”–&QZšDYÙ ÆŒÙÍ•+?`fæ@cc‰–¾ÆÆR@…™™‡Ï prÅ€‹°´t%1q6UU¹:íãæ67·É(•MDF~¡ù½_¿gÈÈXAKKý“‡VØÚúiäuuWhn®Õü_ZšBqq"ÅʼnXZöÅÃãq½¸\\ÆãàƶmΚžÜÞ> ##‹•óµkûYZºáî>[¯¦»­ ;;©TJccc«É§ëÜÊ?ìíC»$ýJ¥œ¼¼m®÷{ûó ´ï*UûúôVVVxzzâææ†X,&((ˆóçϰbÅ –-[Æ‚ =z4¬]»VKG{÷뢽øõé߯³|ùrzöì©uÔ§®ñ‡.¹®ñMGh+}ºì§Oút•{ò®ðO]úuùGgÒ³mß|óMBBB¨­­msн{wlmmilldâĉœ8qBx ¸ííogÛÇ;\.gÛ¶mmÊLMM™3gÁÁÁ´´´ “É9r¤f ##ƒ¤¤$’’’psscöìÙšžÏ?ÿœ-[¶ðþûï³e˶lÙ¢UGkjjHOOçäÉ“H$víÚÅ|€»»;iiiäææjÈðgtÅßž¼©©©ÝøÇǸqãpqqÑŒßÏœ9ÃÏ?ÿÌwß}GEE…ÎüwæùYúö_÷ºÿ Ü_ˆõ ØmP7ÄbJ÷–â4]},Oé¾Rl‡Ø"2é”ߌd»SGSzD÷Ð;~PïÎÈZ”EÈ7!¤=‘Fà)ÚU„d»·'݄Ҽ´Ô·P›SKmN-b+1Î1Δì.AV,£¥¾»ávš.CsCÚó}-pëJêÌÔ6ã¿ôá%jÎÔº3é~)Ö\Ð’7\i@.•Sw¾‘±÷ܹôá%ÜÚßÇÉŽp´UÜU§Ô 0 Þ…æ¿Ö¥\Iö’l½ò^w®U‹ ›@*OTvìÁ\®$}~:††˜[˜cê ^Ð0s1£¥¦…ì†\b]•È(O¼±cÞÇ¿÷üH~$™æÊf$ßH°i﻾ü>êwLìM4q\_P¼~´Ÿqc½í×%©×~¿FñÅØ°¿±À¥÷‹ØÚhí8ë,'+Ê©kifŠ«ßä« “\\9^^Öjqkž»'Å (.jý€deÍÓý˜”ð[›zÖäœ&«²‚½£a_¡„wNk¿t¹¾–ÒÆFr««064d±/ï¹±‹.ÐÖŽén}ˆþ­õ[“'¯•3tïOêºo`À'¡Ã),J=ª— ÎVWÑ¢TÔ½ÇÊ¥Bcû3Ø®™•]»ÐÈîÝ»‰ÅÇǧ•}úPYYI㻇 œ9sð÷×Þ¡ZPP@mm-cÇŽÕL€YXXP__ß*ÍÍÍüöÛo|ýõ×Lœ8ñžXà:vìµµµÌœ9“¯¾ú €˜˜’’’îÈäÿСCäåå±qãFüñ[†knV¿ímdd¥õ{mí% ÎÎcn¹ÀåääDff&Ï>û,äææâïïOCCgΜA,3tèPͱ×s¯/ný;»AÈå•ÈåüŒ¯ïbllúkô{zÎ¥¹¹žââ„›G ¨è^^OÏ?‘ŸŸ¨w ]3500ÒÒRd2Ù»qT9ò$EEÛ±Oû;¸´ÆdJ9"‘‘^a«ªÎðÿÙ;ó°*˼ñØ÷Md_DA”ESÃCEÓ™S‹›yË~9—5Ψ9š½.Ù›#J™eZiiˆ’((Š,*ˆrØȾ–Ãïòè ôQðù\×ùã<÷þ½¿÷÷Þžû~TTÔ±´œ@IIÂýÝmÏzzŠ7nÚÛ¥¨¨¨õjú­­couuÝ^MÿþEccc¥üÞ¯"ÿÝiýÝþ tûªlÿW[[Ë¥K—¸téÆÆÆ¼ð 8p€áÇóùçŸãêêÊ;wصk3gÎdÏž=8;;+ ¯Eñ+Û¿1‚èèhº5þPÆ]ÑøF–?EòS”¿þ Ÿ¿W?”eíÚµ¤¤¤œœÌáÇùŸÿùùùmn.EEEddd ­­ÍÛo¿-|ÇU ÏxÔúÿ¨011!99™9sæð‡?üAÖÖf¥R)jj÷Æ?çΓõêêêÄÄÄÐÔÔÄÿøG¹pË—/ðᯧ1 :?ůLúŠ?;;[¶!twCÜßß±X,ÛÜRTþžÎŸï—H$’ÌR¶ÿêÏú'ðd"·óTò] ñ¾ñ\^u™vi;ñ¾ñ\|þbÇ‚¯º ?P›UKBH‰Ï&¢?\ÏížJ¹Ë&0µ­,¤ø[ù;`…//'{]6㾇š®No:‘¹&“šôl"m„š|Ĩ¨ªàö7~ ø\0ã¾GKe ©J½»nÁ¹éçÐsÒ#0> ?O)\\xQ.ógͩͪ•m‚u¹Hp£ž³Ïž¥± ‘ „ tìt:N V6ãÔ¿#ý#ãÐsÔã|øy¹°.ïºpsûMÙ‰@¹IÊ_‡ãÿ½?Á‰ÁøÿàOKu 9ër”–´YJæ»™xlöèò–åLKB’Cµe*ª*„$‡06f¬Lïòd¿Æ¢ŽÑFQ£Üæ–º:6‘6X=g%wC~)HÁ}£;A¿1þ§ñ˜M2#ynÇFæ M¤©üF[;í­íhšj*-¿ž0âíü@Ð/Aøô¥¥æ>ýP Ÿþ¤ƒƒcÿ‚=YïfuK>ávC¸:+‚ã& ¦¢ÂÕY|2¹C?¤R‡›‘1¦?G³3É®®æO‰ò×8hh°p¨#ö]Ÿ ™ncÇÕªJnÖÕ>0×jª <þ·êëH™Î=}$mmTH$ü|˜ôôt$ ¥¥¥ìÛ·]]Ýû&¥ÍÄÅEà뻉¨(“&êè?Zøâ‹!H$UL›vŠyón1wîu&NüèøžUNNÄÄÄðÖ[o±fÍÊÊʰ¶¶&77}}}–-[&»B±­­ ++ùqˆ³ó™3'“ÈÈ\tu­øúk7**Òùú둌õ7æÍ»EDDúú|õÕpÚÚ$¨ªjâãó/ž{.…¨¨BæÌÉ`Ð OŽ{FÖŽY¿~=âêꊓ“Ó¯ûÛÄÆÚanîÏìÙWˆŠ1kÖ†”ËŸ­¢ô[" IDATm( Šå~††Î=®ÿººÛ|ùålmg0wîuæÏ/ÀÜÜŸòrùþ­±±‘°°0þïÿþ¦¦&Nœ8Ñ+ú§lúmmMœ>½ÿ­¿êÇW½Ú6oÞÌ÷ßOuu5ÕÕÕ?~\)ýè«ü?¨}ôwû3ìkTTb±˜ØØXÔÔÔ‹Åœ:uJ©þOMMMÖ?‘’’Byy¹ÌýÚµkLž<™½{÷"‰ÈÎÎ&,, ¥Â+BQüÊôïÐqÍVZZšlì~6þPÆ]ÑøF”?eä§(ŠêÿaŸ‹_™òõ$ÿ÷“••%Ó“Û·o3lØ0)//çÒ¥K‘ššŠ‹‹ cÆŒ&ÜþöÔ>>n*++™8q"o¼ñùùù0kÖ¬ž4ïŠ 6pùòe ¹|ù2üå/éV>𛛉ˆˆ`Ó¦MˆD":¤tüʤÿ øóóóqpp`ñâÅäçç“••E[[›ì*龘?±téR-ZÔ­þ­¿ëŸÀºoÁ¯÷E„$‡ÒÀÄûÆø2Ú-¶Ãê9+٦ϣBÛJ›Ñ;GS›]«ôé¯þ„Çfj3kÉß•/èÇ}¨ë©ãý™7Íwš¹¼ò2ÒéSeCþä4œû¡Ìˆûñ‘¦c­£Ë'„pµºRéÓ_ý‰í~ã¹ZUÉÇ9™BÇtúêœÈIËÎÿB‹´µ¯W^y…E‹É½ááé\¹²‘ÜÜ}‚0ýÄÄÄ––ÆÆ…ò ú) ÐÏ6¸žž† .§UAO þßûwºš¯'xý¯Ž«{=ŸÚVÚøõÇí·Y›=pXæ èÇoÐ0Ô`Ü‘qŒÚ: Uþg:ã¦NgßÿbõÈQ½žOk]~ž2McüdûÚî7žWF LÛÑŒ4599e»ü' ¡Úÿ‡&‡¾Ÿ л}³ÇjfϾ‚¶¶™ ŒnžŽ£ã¢^‹oܸ­îÀÐÐYîZÄAƒ¼yyGúvvvL™2å‰Í¿Ð>zJLL «W¯Ê'Ы¤§§wyu—P>A?«W¯æÊ•+˜™™õËør«HMEMd½—ÅiÿÓœwº“çÜ­¹œ|–²ŸËïOÙ©2¥Ýñ°ð×þy’JÅŠÈÝš @Î?r¸õé-¡ûmkm\ÿîJð¹`‚Ïwrwü³#ãOŽÇì3lØ’‚ÙÄ{†ØócO¼÷xcâk‚Í\‚Î18d°Rië:è’‚‰¯ .Ø¿`Oðù`ÌŸ5ïÒ¿åtKô†é‘·5¯We`6É Ÿ/|¸´ü™ïdöªüz~üÉñøð:®Ó <ˆçVÏß%¿Ç¡#ÿ9ï=Þ{c6ÉŒ€ò§!OŒ~´Ô´p~ÖyÄ?‰™pjZfZ½ª[‹‡9±p¨#fæ¬rÉÕYŒdªtø|Ʊ?p">¦fL±²!áÙ™¼4ÜE©°Cõ ¸:+3sF›°ÌyWÂæ0ÝÆ®KÿÏÙ ÁÉÀg^éUL±²á褩üál·ýèöUQÿx—+VžžŽX,ÆÚÚZö|ùòå,]º”àà`Þ~ûmÄb1¾¾¾}Ò¿*3~°¶¶F,ãç燻»;îîîØØØ(-eä³yóf‰ŽŽ&((SSÓ>«Eã#eõë÷ÖoOQ¿¢ü÷D¿œeúâééɪU«())aΜ9}V{öìáØ±c0sæL233yýõ×{Å>ôEùžvzj?§ý711‘ÙÄ'N°eËÙ--­~SŸ|ò ‘‘‘¾ÁÜ_âïIÿ¦eíãƒôS@ »Èmpi[u,P{üÛ£“ÇúÜz þ[€÷gÞ.FR.Áå]²ÿž­”»"…WQW¡µ¦•ÖÚVTTUH]šŠéxS†,"ÔbÑTܱzåõ΋ÚzŽzØ-¶#uI*VáVh Ö"{]6.ïuLXu‡èbâcBÖ{YT&WRøU!7þ}§×œ:Å¥¢®‚Çf¼?óFMWMέ!¿ºuÔ_¯§­± I±¤³RkªâüWgr>È¡]Ú.{>rýHFïñc Gb9Ý- å;OUMUÜÞw#ãõ šŠ›zU~= ¯c«Ckm+åñåXGXãøš#76Ý@ÏY¯Ûò{úq×OmV-U©U”Ç—Ó×€šžÚ§%GK(øo®ï»öjûúoÞ ößÌ%©¼Œë554¶µRÝÒ¬tx'C2«*¹p§ŒŸKЏQ[ƒ®ºF'ꪪl÷OlàDô~³8ŸWWKNM595Õ4´µRÔØÐ)¼–ªïŽòâ½´TÚÚïÉïßcýøï„`|›áa2ˆçì†`©£ü&…–ª›Æøt–†Áà>¥|s;ŸÏn\cÃß>K³­­ÀÀ@6nÜÈéÓ§Ù°a•••r D)))²ß믿Nmm-Ï<ó ­­­òz¬¥Å† xíµ×hkk“=/(( ::ºË·\œœ äå—_æÌ™3|öÙg¬Y³†÷ßÿ‰¨^yåBCCY´h–––¬ZµŠ­[· é+IAAiiiÔÕÕ!‹IKK£¢¢B¶8GHHÏ?ÿüEôõ‡ðÃÁþHnn ߈›ÛJÙ&–¦¦!uu·).Ž£¤ä rçNªÒò›0áS¦M;…µõ¬­'vž±cÿ)秺ºš´´4Ùï·Á¶°ÀÊ*W×h,(ÆÖvšÒéOštˆ™3ÁÞ> GÇ…XZvK‡D";vì`Ò¤I2Û0wîÜ>K?<<_ßMXXââò ”`o¦txwwwÌÍÍÑÑÑ‘->999É•oûöíLš4‰·Þz‹¦¦&™þöFþ‡ ™Íüù ¶só,-17Pº}ôgû3Ðí«¢þñn¿zþüy®]»Fxxx'÷;wòé§ŸröìY²³³ihh ªªªOúWeÆTWWSXXHVV*-Eò9qâcÇŽÅÐЕ+WJmmmŸÕÏÃÆGÊ”¯'õÛ<,~EùïŽ~ihhÃñãÇÑ××—s»qã™™™\½z•úúz ú¬þ\\\HOO'11‘~øììlYþºcWùžvzb?·ý¯¬¬$##ƒŒŒ êëë)//—ý—H:ÖpfÏžMAA , €ÀÀ@dqXZZŠ··7sçÎ%//+î_ÓÓÓÙ´i¼ôÒK”””voü³{÷nŽ=Ê„ ðööfÞ¼y²æÎKRRÞÞÞ¤¦¦òñÇNaa!&&&hjjâââÂÈ‘#9sæ ^^Ç‹_‘»2ñïÙ³‡¤¤$fΜɒ%KÈÏÏïVù{Ú¿=tmJ û¨Èþ tùÕM•{l®èXhÕ¬‰ëû®¨jªR}©š¶†6¤©BwU­‡_9¤(¼ó›Î ­¡äùÉ8,u okŇ‹ùÏ‘ ãèÚì¤9H³£Ë›ÉZ“…´YŠÑh#ÔtÕPÕR¥áV—W]ÆûSo4Œ:Ý[ëZeõ~ÇUŽ ‹FÒœ$Zë[;¥£;D c ÔÔ‘6I*ê*T§W÷ºüz^Ç^i£”›;nâ÷õ×ë)‹+cÄš¨ë«wK~C?¤)yÛòp\éˆí|[„¾‹>·öÜz"õ£*¥ »Åv½ÞÄôÕ5pÐ×ÇVWuUêêœ.ýlß¾#GŽpýúuÊÊÊ044¤¥¥Ã>ÛÚ†bkJl¬-ííÒŽ>®ê*S¦|ÇÍ›‘H:6â**.SZš@iiee˜2å(·n}ƒŽŽ%ré56–íèèXpúôb@këgps[‰¾¾ññ ¨ªRüœ½ý,ìíÃJ› úLö|øð?‘–¶ŽÖÖzŒŒŒä&ÿyyyÔÔÔÈþ—–&R\Oqq<úúCqt|‘è˜Âômm§aaáÏ6²Ž™™?zݪç .G\\C‡eÉ’%|õÕW}–þ;i²úÓ×·gذܾ}T©°ˆÅbÉÈÈèÒOjjª¬|‰‰‰$$$‹¶¶O¯ä_*•—w Ûí£¿ÛŸnßõ$$$DII C‡v}Õ¶NNNØÛÛ£®®Î˜1c¸víZŸö¯?$&&âì쌆†Ï<ó Û¶mcÛ¶müç?ÿQJþ“½½=žžžpãÆ V®\ÉÙ³gñññyäõ£h|¤¨|FFF=ªßÞâAñ+Ê¿²úµvíZÞyç|}}»Ü|tttdРA˜˜˜ÐØØÈŒ3¸páBŸÔߺuëxï½÷X¶l“'OÆÓÓ“Í›7wË><Îò=õËs=°Ÿý¥“H$8p K7mmm.\ˆ­­­4551iÒ$vìØ!ó“––FBB ØÛÛ³`ÁŽíÿ|úé§ìÝ»—?ü½{÷²wï^9®©©!55•‹/"‰8|ø0}ôÆ #%%…ììl¹~‹¢øæÞÜÜüÐøCCC ÅÖÖ©´cü~õêU¾ûî;<({‘îaåï­ùñï™ß*Û¿ t¥w…ŒG£®§Né±R4Œ4PÓQ£ôx)&cMPÕRUè~?¢XåñåÝŠ:Ng\ˆº€ï¾ì+Àë½0i€(V$Ôäc¦êR­õ­XL³ ¥º…¶Æ6,B-¨¼X‰TÒap+ÎUpvêYâýâÉøkêúêä| ¿“»%—´WÒðûÚO¶©y? ·¨»VGé¥ÜÜqËé–rX†YvŠ÷nyæ’"’íá¶Þ ÷îJ—±.§ŽöÖvŒ¼Œ©,m£l•¾ºñ.ZfZ´5uœHšDÆ[´5vü׬©´ü—~è:èâ¾ÑÔS}!âòÊËä¬Ëaä?G>‘úaäeDMFM¯Ë©®µ…ŒªJv^ÏfßÍD9 ëägñ0'&[ÉÝf`À|ýY”Ͼ¼,?ÿ k.¥ð‘Ï89›2¯°41c“ŸåÎoݬ¯%»ºŠ#¢ÛlÍÎd–½œ»—‰)sìøé)Â^¼SθcG˜öó|ž{õã?¾þJ—=«ºŠV©”1ƒ õ)ÇÛt0é•}»ÑéååEAA©©©¸ººv9x1bÑÑѼüòË]Æ1vìX.\(wµ‹²ÄÅÅáââ‚……K–,ÁÐÐðwÅó(8þ<µµµDFFRYYICC$$$ôÉäw §êÔ)òòòصk×Cýµ´Ô ¡a ÷¼¶6—¶¶&llü}$kkkÒÓÓyñʼn%;;]]ÝŽ¾¯*uLMÇÈü››ûÓÔ$–mnýSÓÑH$•H$|‡©©7FF÷6¥œÑÒROqqÜýË0ääÉY\½ú‚ƒcÈÏÏ:N ÝßKKKijj¢¢" hçÌ™?k+ûíßo.ÛÜ‚Î'¸îßÜú-R©UU åÆ/UWQQQÇÒrÂCýµ¶vœ­§•¯7ê·7xPüÊÔ2úµvíZæÌ™Crr2ëׯï”~nn._~逓ÓbæÍË'""‹öö6¾þZþgç?2gN&‘‘¹èêZñõ×WVT¤óõ×#5êoÌ›w‹ˆˆôõøê«á´µIPUÕÄÇç_<÷\ QQ…Ì™“Á Až;ö бÁåèèÈúõ멨¨ °°WWWÙxuu·‰µÃÜÜŸÙ³¯%bÖ¬ )—¿çž{Žööv¹Ÿ‹KÏ¿KUWw›/¿‚­í æÎ½Îüù˜›ûS^.ß¿µµ5qúô"üý·þZ?_õŠþ=îôï²yóf¾ÿþ{ª««©®®æøqùñÁK/½Dii)ÕÕÕØÚÚbaaѧùPûèïög ÛWEýcUUׯ_—ýnݺ%³¨©©ÉúÏ¢¢"RRR(//—[h{Ôý«¢ñÇ~È•+W‰D$&&RYY)ËŸ2ò˜|ÚÛÛñðð-<^¿~©TJHHHŸÔ¢ñ‘¢òõFýöhþ¥ ~eêGYýÊÊÊ’ÕÓíÛ·6l”——séÒ%ŠŠŠHMMÅÅÅEnÁúQÖßµkט*¬utùyÊt6ñåÛî7žWF¸ ýŒ4599e»ü' ¡:ðÛ×áÇY»v­PñÊ÷Í«™=û ÚÚf‚0ºIxx:ŽŽ‹z-¾qã¶ØñCCg.Ë~ƒy=òò<Žôuum°´ ~bó/´žÃêÕ«…ò ô*ééé]^Ý% è§ÀÀ`õêÕ\¹r33³~¿€À@BniÙ²e|ýõ×1gÎ~úé'&L˜ td ¿jÕ*¦L™ÂìÙ³Y¶l¯½öšÐá ô+Ì&™áó…—–_"ó኱§‰–šÎÏ:ø'1NM@ËLKJ/3Åʆ£“¦ò‡³ñ¼™’$ä)¢º¹™É'ŽñC¡ˆ¤é³°Ðî_—}ï½÷ÈÉÉaÖ¬Y¬X±‚ÒÒRÙGä˼yópqqaݺuÜV¬XAzz:b±kkë~Y>!ýÎèêÚ`bâNhè ÆÛ‚‰‰;šš&2÷‰'ÒÒÒBLL S§NeÑ¢ElÛ¶M.ŽììO8u*’¦¦²'Nÿ'Oþ–éÓOccó,ŽŽÏ™‡—×™»¿ÿÇ„…ÃÖv––A¸»¿©©7ãY¸PŒŠŠºÌÿÝgjjÊõ³Û¶mãÔ©SxyyÉ~#FŒè“²×Ô\gÿ~sry,²ï«ôâéù?OlþeûxÜög Û×§½|Ë—/géÒ¥óöÛo#‹ñõõ•¹ÛÛÛ³}ûvŠŠŠ(.–ÿ†¹šš ¬^½šàà`Ö¬YƒX,&((è‰(›¢üõÔ½¿ë—³³³¬<žžž¬ZµŠ’’æÌ™#L ¼}411ÁÝÝwwwNœ8Á–-[dÿµ´úÏ:Ë'Ÿ|Bddd—ß`îñÿ^û­ ‡âøñã±dÉD"Ñïú†â“:?xòmp9880oÞ<^}õU¦OŸŽ©©)›6mRúM Eá[[[Ñ××G__©TÊ–-[HJJbß>á>~ÒX4Uq{ߌ×3h*nò”Rr´„‚ÿàú¾« Œ^DKUMc|‰N:KaCƒ §”onçóÙklãÛoòìââÂ+¯¼Bhh(‹-ÂÒÒ’U«V±uëÖÎz®¥Å† xíµ×hkk“{~þüy®]»Fxxx¿-Ÿ~×44RY™Akk=MMåTVfÐÜ\ t,^ÆÅÅÂóÏ?ÏO?ýľ}ûxõÕW;ƪš»`l<’éÓÏtyÂeÍš5H$6nÜHhh(3gΔ[ ‹ŽŽ¦²²[[[hllÄÍíÞIÒÀÀ=„…%ag7gç%Ì›—‹Ë ™{xx:>>°°ÄÍíU¢¢D ¾€áÃ_D_?üLaá俯ðý÷¸¹­”mbijRWw›ââ8JJΑñ!wî¤*-¿ >eÚ´SX[OÁÚz2aaç;öŸr~ª««IKK“ý~ûl ‹¬¬BpufÁ‚blm§)þ¤I‡˜9óìíÃpt\ˆ¥e`·tH$±cÇ&Mš$kûsçÎí³ôÃÃÓñõÝ„…E ../±`A ööaJ‡76vA[Û 55í_uу¡råÛ¾};“&Mâ­·Þ¢©©I¦¿½‘ÿ!Cf3~Æ-ÀÜ<KË@ÌÍ”nýÙþ tû*”vîÜɧŸ~ÊÙ³gÉÎΦ¡¡ªª*™{AA¯Ó IDATÑÑÑ]¾ÜÖÖF`` 7näôéÓlذÊÊJLMMŸˆ²)Ê_OÝû“~ihhÃñãÇÑ××—s»qã™™™\½z•úúz „ À€·•••ddd‘‘A}}=ååå²ÿ‰€Ù³gSPPÀ‚  00€€Y–––„††âííÍܹsÉËËcÅŠ{ã×ôôt6mÚD`` /½ô%%%„…ÝÿìÞ½›£G2a¼½½™7o666Ì;—¤¤$¼½½IMMåã?&<<œÂÂBLLLÐÔÔÄÅÅ…‘#GræÌ¼¼:?¿"weâß³gIIIÌœ9“%K–ŸŸß­ò÷Ä~+ÂÉɉÀÀ@^~ùeΜ9ÃgŸ}Æš5kxÿý÷•_z‚çÇO&²×%ML:Þ$­¨¨àÿøÍÍÍŒ5 ]]]´´´dFæA( ÿñÇ ««ËîݻٷoË–-cúôé¬[·Naüýú¨¨«P^-ã)§*¥ »Åv‚ zW#cÔUUI­¸#ã)'¹¼Œ?9è7ù½{eDii)+V¬@"‘àïï¾¾>ÚÚÚ45Ý{!býúõ$$$pìØ1Ù3  ¢¤¤„¡C‡öÛò éwGGG.]ºÔ¥»TÚLUU6ZZƒºt=z4ëÖ­cäÈ‘dfv}²|ûöí9r„ëׯSVV†¡¡!---ØÚ†bkJl¬-ííÒŽ>®ê*S¦|ÇÍ›‘H*~ß_¦´4ÒÒÊÊ.0eÊQnÝú KäÒkl,ÚÑѱàôéÅ€ ÖÖÏàæ¶}};âãPU•­P>öö³°·C*m&(è3ÙóáÃÿDZÚ:Z[ë022’›üçååQSS#û_ZšHqq<ÅÅñèëÅÑñyD¢c Ó·µ†……?Øðëg‹13óGCC¯[õ|áÂââ∋‹cèС,Y²„¯¾úªÏÒ¿s'MVúúö ¶€Û·*7æ©Ê¦©©Œ¶¶¦ÖYjjª¬|‰‰‰$$$‹¶¶O¯ä_*•—w Ûí£¿ÛŸnß…òu```€““ööö¨««3fÌ®]»@{{»RqüùÏ&::šiÓ¦‘——÷ÄÕ…¢üõÔýIÖ¯µk×òÎ;ïàëëKmmm—ã€AƒabbBcc#3fÌàÂ… „@@°€D"áÀ]ºikk³páB|||hmm¥©©‰I“&±cÇ™Ÿ´´4HHHÀÞÞž pôhÇøçÓO?eïÞ½|øá‡ìÝ»—½{÷ʵњšRSS¹xñ""‘ˆÃ‡óÑG1lØ0RRRÈÎÎfР?Åÿ0÷æææ‡ÆJhh(¶¶¶H¥ã÷«W¯òÝwßqðàA***–¿·ìwWܸqƒ¨¨(Ž;&Û+¨©©Qú$Ú“>?x2‘àºrå Lž<™šš™qHKKë´ù4{ölÆ/÷L™ðvvvìÚµ‹_|‘ÈÈHÞxã ²³³™={¶POú»ýèöU(_µµµ\ºt‰>úˆÝ»wó /(ÖËË‹‚‚RSSquu}â6·寧îýA¿Ö®]Ëœ9sHNNfýúõâÉÍÍ%##ƒƒò¯ý‹ùóç “Á>*ÀÄÄ„äädvî܉««+|ùå—Ý;wgggüüüرc»wïæóÏ?ïnùòå]¶ÝŽqlÇøÃÀ óøCQüʤÿ ø³³³e/DÜÅßß±X,ÛÜêÉø³;öwùòå]^=‡‹‹ ,Y²CCÃNóà…ÒçÇO&ª÷&­Ì;—áÇsäÈ­ Œý öd½›%£‘HÛx+õŸŒÏ=}A O)-­Xæ<‚·R’ûMž[ZZpuuÅÓÓ“›7o’™™IFFrþ¶lÙÂ|Ðé͵ªª*®_¿.ûݺu €üü|ûMù„ôŒŸßf.cn€›ÛŸY¸PŒ£ã½ë¦9|ø0éééH$JKKÙ·oŸlªcRÚL\\¾¾›ˆŠ1iÒ!êëëÑÓÓ£¢¢‚´´4êë멬¬äøñã„„„““ƒ‡‡111¼õÖ[¬Y³†²²2¬­­©«ËçË/prZ̼yùDDdÑÞÞÆ×_»Ë•ÁÙùÌ™“Idd.ººV|ýuLJé|ýõHFúóæÝ"""}}¾új8mmTU5ññùÏ=—BTT!sæd0h'ÇŽ=ókþ 8rÄ/¯5Ì{Ù³/chèÌ‘#¾¿Nìok‡¹¹?³g_!*JĬY:4R.Ï=÷ííír?—ž—ª®î6_~9[ÛÌ{ùó 07÷§¼N寧îýE¿²²²d Ä·oßfذa466R^^Î¥K—(**"55¹kÁþwMee%'Nä7Þ ??Ÿ‚‚fÍšEFF†Òqlذ˗/SXXÈåË—©¨¨à/ùK·òÑÜÜLDD›6mB$qèÐ!¥ãW&ýÅŸŸŸƒƒ‹/&??Ÿ¬¬,ÚÚÚpwwï3û 7(,]º´Ëktïöoûöí£¹¹ Ο?¯Tø'}~,ðd¢Â¯÷ELžÍ ”O §¤§§wyu—P>A?«W¯æÊ•+˜™™õËør«HMEMd½—ÅiÿÓœwº“çÜ­¹œ|–²ŸËïOÙ©2¥Ýñ°ð×þy’JÅŠÈÝš @Î?r¸õé-¡ûÛ¶øïOHrZæZ²çÚÖÚ¸þÝ•àsÁŸîÎñÏŽŒ?9³g̰]`KHRf•3Ôºº„$‡`âk‚‹ö/Ø|>ógÍ»ôo9ݽazämíÝÑšM2Ãç .-¿Dæ;Ý»bLË\‹äŒ¼ŒÐ®þp}´,´z-üø“ãñ9àt\§x&Ï­ž¿K~½­*ª*øÄúà°Ì?†½2L–ŸÞO_èGKM çgGü“˜ §& e¦Õ=¹èêñOo.‡ÍárØœN9±p¨#fæ¬rÉÕYŒdÚkñ?Œ¡ú\¿™9#MXæ<‚+as˜nc×¥ÿçì†àd`È¿3¯ôªîL±²á褩üálqâDZZZˆ‰‰aêÔ©,Z´ˆmÛ¶ÉÅ‘ý §NEÒÔTöĵßÉ“¿eúôÓØØ<‹£ãóDFæáåµFæîïÿ1aaç°µ†¥eîîo`jê t|#¬½½uuu™ÿ»Ï´µµ•JÛ¶mœ:u ///ÙoĈ}RöššëìßoΡC.Eö}•þÒ¥KålÚ“–ÿGÙ>·ýèöõ.+V¬ ==±XŒµµµÒîööölß¾¢¢"Š‹‹û¼|Ë—/géÒ¥óöÛo#‹ñõõU:ÿŠò÷¸ÇŠä«hü¤(<ÀæÍ›ILL$::š   LMM»­¿7ÿŠÜ&kkkÄb1~~~¸»»ãîîŽRysvv–Õ—§§'«V­¢¤¤„9s”ŸÇ)’ÿž={8vìÌœ9“ÌÌL^ýõ^×ïGU>Gk_éÏ£ÄÄÄDÖfNœ8Á–-[dÿµ´´úl?ùä"##;}c¹¿Äÿ z£QV¿~¯}ø-r\ÚVÿöèä±>·ž‚ÿàý™7Ň‹‘”Kpy×…ì¿g+å®EáUÔUh­i¥µ¶UR—¦b:Þ”!K‡µØWÊ¢©Šß!?n6öRZ'÷¦âŽ Ò+¯w^ôÖsÔÃn±©KR± ·Bk°Ùë²qy¯ó„VE]Íxæš®šœ[C~u7꨿^O[c’bI—ùtþ«39äÐ.m—=¹~$£wŽÆxŒ1†# ±œnÙ­ &UMUÜÞw#ãõ šŠ›º-?[Zk[‘”H¨¿QOݵ:$¥’^ ×­<¾ëk_s䯦è9ëu[~B?Ú¥í\ˆº@þ®|*“*Éß•OKM ÆÝ–ÏãÖ’£%ü·×÷]»%ŸÂ†zþ–z褳]ºÿ7ïûoæ’T^ÆõšÛZ©niîµøï¢®ªÊv¿ñÄNDï¾E€¼ºZrjªÉ©©¦¡­•¢Æ†NáµTÕxw”便ÒÖ~O~ÿëÇ'ã;Ø “Aûì3Ö¬YÃûï¿€‹‹ ¯¼ò ¡¡¡,Z´KKKV­ZÅÖ­[;ë±–6làµ×^£­­Mö<%%Eö{ýõש­­å™gž¡µµ•¶¶6Ù¸q#§OŸfÆ TVVv¹Àó8èNù…ô»¦  €´´4êêê‹Å¤¥¥QQQ![\‹‹‹#$$„矞Ÿ~ú‰}ûöñꫯvôYªš»`l<’éÓÏtyÂÅÝýu¢¢DŒ½+«IØØLÅÎîÞitt4•••ØÚÚ@cc#nn÷N’î!,, ;»™8;/aÞ¼|\\VÈÜÃÃÓññÙ€…E nn¯%bøð¥ þ"úúCøá‡` $77†ï¿ÄÍm¥lKSÓººÛÇQRr†ŒŒ¹s'UiùM˜ð)Ó¦ÂÚz ÖÖ“ ;ÏØ±ÿ”óS]]MZZšì÷Û`[X`e‚«k4 ck;Méô'M:ÄÌ™¿`o†£ãB,-»¥C"‘ˆ;v0iÒ$™m˜;wnŸ¥žŽ¯ï&,,qqy‰ J°·S:¼»»;æææèèèÈŸœœœ”ÒÞÈÿ!³™?¿€aÃ`n€¥e ææJ·þlº}½Ûož?žk×®Þm÷‚‚¢££»¶ºz¨«¨âibJÞ}“¼žÆÿ¦›«\G2íäÔµ¶trªg€‰¦Æš4µµ1Åʆ´Š;r~Þöð$©¬ŒŸKŠäžï¿™Ë6ßþîéÍÁ[7ù2ÿf—i<W#cÔUUIýMzOÉåeüÉiDŸ¥wãÆ ¢¢¢8vì&&§JkjjdoÊݽ¢´´”+V ‘Hð÷÷G__mmmššî½ð°~ýz8vìX—i­]»ssó^õõç?ÿ™èèh¦M›F^^ÞQÝ)¿~÷qtì¸*÷Ò¥K]ºK¥ÍTUe£¥5¨KwFúßHuuN—~¶oßΑ#G¸~ý:eeeÒÒÒaŸmmC±µ %6Ö–ööޱXUÕU¦LùŽ›7"‘tlÄUT\¦´4ÒÒÊÊ.0eÊQnÝú KäÒkl,ÚÑѱàôéÅ€ ÖÖÏàæ¶}};âãPU¥ø%8{ûYØÛ‡!•6ô™ìùðá"-m­­õÉMþóòò¨©©‘ý/-M¤¸8žââxôõ‡âèø<"Ñ1…éÛÚNßld=­™™?zݪç .G\\C‡eÉ’%|õÕW}–þ;i²úÓ×·gذܾ}T©°ˆÅbÉÈÈèÒσôÃÌ̯Wò/•JÈË;ÐíöÑßíÏ@·ï$$$DII C‡í–;@{{ûc/ŸNNNØÛÛ£®®Î˜1c¸víšÂüw'küð0ù*?) ooo§§'ܸq€•+WröìY|||”ªÿžä_wEòOLLÄÙÙ žyæ¶mÛÆ¶mÛøÏþ#öwÞÁ××WnóîþqÀ Aƒ011¡±±‘3fpáÂ…_Ö­[Ç{ï½Ç²e˘>>´¶¶ÒÔÔĤI“رc‡ÌOZZ $$$`ooÏ‚ 8z´cüóé§Ÿ²wï^>üðCöîÝËÞ½{åt¸¦¦†ÔÔT.^¼ˆH$âðáÃ|ôÑG 6Œ””²³³åndø-Šâ˜{ssóCã %44[[[¤ÒŽñûÕ«Wùî»ï8xð ìEº‡•_Y~Oÿ¢H¿zþ ü¥w…ŒG£®§Né±R4Œ4PÓQ£ôx)&cMPÕRUè~?¢XåñåÝŠ:Ng\ˆº€ï¾ì+Àë½0i€(V$Ôä#F*‘’º45=5ttѱîØÀбÕAM[MaøªKU´Ö·b1Í‚–êÚÛ°µ òb¥ls wK.i¯¤á÷µŸlSó~n5Pw­ŽÒJ¹¹ã&–Ó-åÜ = ± ³$烜.óðË3¿‘„h¿·õn¸otWZu9u´·¶cäeÔ³‰Bk;w~¹Cñ·Å]^ÑheËàÁÝ ¯e¦E[SÇi¤ÙId¼•A[cÇÍÁšJËïQꇫA¿Qsµ†³Ïž•ÛÜRV>OŠ~yQ“QÓëí¬®µ…ŒªJv^ÏfßÍD9 ëägñ0'&[ý¾£Û›2¯°41c“ŸåÎoݬ¯%»ºŠ#¢ÛlÍÎd–½œ»—‰)sìøé)Â^¼SθcG˜öó|ž{õã?¾þJç-«ºŠV©”1ƒ ÷)ÇÛt0é•}»Ñ‡‹‹ ,Y²CCCÙ.çÏŸ§¶¶–ÈÈH*++ihh ""‚„„¹Å§±cDzpáÂ^ý2bÄ¢££yùå—;¹yyyQPP@jj*®®®OÌæVwÊ/¤ÿû8uêyyyìÚµë¡þZZêÐÐ0{^[›K[[66þ>’µµ5ééé¼øâ‹ÄÆÆ’®®nGßW•ŠŠ:¦¦cdþÍÍýijË6·~‹©éh$’J$’ ¾ÃÔÔ#£{›ÒNN‹hi©§¸8îþÞ¢¢“œ<9‹«WÿCpp ùùù@Ç)¡ûÛCii)MMMTT¤íœ9óGbcme¿ýûÍe›[Ðù×ý›[Æ,R ªªJÕOUÕUTTÔ±´œðP­­'ÕÕu™¤RÔÔÔ[úííRTTÔº¥§555+å÷~ýxùïNûèïög ÛW‰DÂŒ3000ÀÙÙ™!C:nfqpp@GGG¡û“R¾ÚÚZ.]ºÄG}ÄîÝ»yá…”*Ÿ²ù{’Ç?)¢  €ÚÚZ¦N*{¦§§G}}½Ròë+&ÿ{6¨…Ÿ~ú‰ýû÷wºsíڵ̙3‡äädÖ¯_ß)lnn.ÿüsf̘Á®]»˜?>«V­bÏž=âY¾|ù¯¦{~÷Eù}íiû}ܘ˜˜œœÌÎ;quuÅÃÃ/¿ü²[ã¯sçÎáì쌟Ÿ;vì`÷îÝ|þùç]¶®t ®®cüa`Ðyü¡(~eÒPüÙÙÙ² ç»øûû#‹e›[=v§yýx˜~=)ö]``!·óTò] ñ¾ñ\^u™vi;ñ¾ñ\|þ"Ðq-XÀÔfÕ’’@ⳉè×Çs»§Rî² Lm+… )þVþŽcEáËãËÉ^—͸oÇ¡¦«†Ó›Nd®É¤&½›H¡&1­µ­4ä7È~E›¢FÙÆŠåLKB’Cµe*ª*„$‡06flÇdºµÄg1p5 0>€¨»VGztz§´êoÔË6@‚‚бÓé8%XÙŒÿQ‚Ï3îÈ8ôõ8~^.¬Ë».ÜÜ~Sv"ð~†ÿu8þßûœŒÿþ´T·³.GiH›¥d¾›‰Çf‡žPzààøíü@Ð/Aøô¥¥¦…Ô?É_Ñ£n ŽM¤ VÏYu+¼æ M¹B€öÿÏÞ™ÇUYåÿ;ƒˆ," ²(¢€ ,šš+¢¸ éLffáŒÎTÖ|Ë~:_kœÔÆJ³¯¹4™$¹e™K™ˆ’((ˆ.ˆrÙ.Ⱦ]àÞûûãæÕ(—Ä|Þ¯×ózÁýœs>gùœå9ç9çHåÈ[äèZèªÒ><>ô@SWŸÏ}K#,9Œádžw(žûèÒ ‡¸üÞååQ„}_.…G²yØ´44¸Éþ°ÑhihðÑОŸDÆäiüùä>øàƒû~ù8uêTÒÒÒ”_)ßËöíÛÑÓÓã»ï¾C,#‹[±ö¤P7ý‚þû³uëVär9¡¡¡¼ýöÛÈår^~ùe¥Ñ‡Ô IDATÜÙÙ™žžŽD"¡¤¤„;w*¡/¥MÄÅEâᅫ¨(£FíSô¿-õ|ûm_$’JÆ?ÁÌ™7™>ý*#G~ (î³ÊÉÉÁËË‹˜˜Þzë-–/_Nii)¶¶¶ÔÖæ±{·#..ó˜93ÈÈËÈåRöïWýÀÃÕõÏL›–ÅŒ×14ìÍþýŠ#ËËÓٿ߃AƒþÁÌ™7‰ŒÌÁØØ‘½{û#•JÐÔÔÅÏïC¦LI!*ª€iÓ2éÙÓ›#Gž \ÎÎά^½šòòr pwwWW[{‹ØX{¬¬™:õ"QQ"ÂÃÏÑ¯ß •øM™2¹\®ò¸¹=ü½Tµµ·Ø½»/vv™>ý*³fåceHY™jÿ&•6ròä\7üV>{;Åþž´þ;¬_¿žC‡QUUEUUGUË>WüïW?ºzûÓÝÛ×ÊÊJ®^½ª|nÞ¼©lÚ•DEE!‹‰EKK ±X̉'Kú´´´”ã‡ÂÂBRRR(++SNôµuã÷$ÇÊßöÆOíù—Ëåxyy)'N¯^½ŠL&#,,L­üëŒø·'o/ÿ?úè#.^¼ˆH$"11‘ŠŠŠ6'z/_¾¬Lç­[·prr¢¡¡²²2.\¸@aa!©©©¸¹¹©LX?ÌøõÊ•+Œ=š;v ‰ÈÎÎfòäɪ~€hffÆ‚ ZÓØž}?Žô <ºöUúû4SQQÁÈ‘#yã7ÈËË#??Ÿðððûî4o‹5kÖ‘‘AAA”——ó·¿ý­Cñhjj"22’uëÖ!‰Ø·oŸÚá«£ÿ~áçååáèèȼyóÈËËãòåËH¥R•Æuú—ûµíÙWg´ï¿Gƒß΋Kr£ïßíÓh?ÏžÞSz“<ýÑNŒê÷Ögðƒ©É®!sYf·ËG¯õ^ÔdÕ·%O°{Ð6ÒÆ÷K_šn7‘±$Y³ì™jC^réO¤C?&ÆýôHõØòõˆ0.UU°$ùL·ËÇMùTYÁg9YBÇtÆÚ:ì ÉmI# ÏþJ³¬kկŋ3wîÜV“݈ˆt.^\Ëõë;…ÌìC [CZZk×®Ò' ا€€€€@CXàzFx¸ž 4…,xZ<ØæÑ|ŸÿóÁy©s§ÇS¿·>øÁÀnY^ë½p\è(äïÐ1ÕaØÃ´aš:]¯éŒ;é};ïòÎÿa™Ç N§­!ÇÇL`Ý€niG›†³xÀ@¡Bý3]]~3ž-#ÐÑìþC“°råJ¡àÔ–1uêEôõ-…Ìè é8;Ïí´ð† Û@p°âSSWæÌ+Ÿž=}yzž„~CÃ>ØØ„>µñ_¹r%………X[[ /ð‡ˆ‰‰aÙ²eBú:•ôôô6îìS {°lÙ2.^¼ˆ¥¥e— _@ ;¡2‹ÔXØÈå—9x’“ÃN¶r|}ÃuN>MéñRD»DÄÄSz¢Tmy{<Èÿ•_¡øp1¢X×7\ ç_9ÜÜvS(ÅÇ„ó_þËp,Ÿ³Än¶aIaXŽìxCk7ÛŽÀC„%‡¡g¥§Þ‹µ£!aÉa˜û›câf‚Ë„ž Åêy«6ÝÛL°ÁÈÉˆÜ {Ñ®å(Kü¾õãÂ+ÈzW8bìY¢¹º™³ágÿ,fĉèYêujøo ô"qÜdž·µãON.d†G2ºwÇïü““ qc'p)<k5/èìglÂ¥ðH-­ðèaÎB×\œ< }ìÛt?ž/.&¦ü'ëb§æÁ˜Þ}88j,:Ï›)I‚Ñ=CT551ú؈Hš޵~׺\vÅŠäää΢E‹())iuÉøfΜ‰››«V­j%[´héééˆÅblmm»dúý­±··ÇÇLJóçϳ}ûv|||èÙ³§R>räH𛛉‰‰aìØ±Ì;—7ª„‘ý9'NÌ ±±ô©³ÿÑ£¿g„“ôéó<ÎÎ/0cF.>>Ë•òÀÀϘ<ù vvã±± ÁÓó ,,|Åar¹mmm¥û;¿éëë«¥ãÆœ8qå3`À€Ç’öêê«|óûö¹=‘¼\úçàíý?Omü?úè#ÆŽKIII·kº{ûú¬§oÈ!*Oll,ÇG[[---X¶l¡¡¡,_¾±XLHHˆÒÿöíÛ9räAAALš4‰¬¬,^ýõ.‘>6mÚDaa!EEE­ü¿òÊ+,X°€ÐÐPÞyçÄb1þþþݾ\]]•åéííÍÒ¥K)..fÚ´i‹@·oÍÍÍñôôÄÓÓ“cÇŽñÉ'Ÿ(ÿ×ÓÓë2yøùçŸ3cÆŒûÞÁü´‡?ÔéÚcß¾}=z”æÏŸH$jó¿§õýW ë¡²À¥ß[÷ºãõ¯Vë®×‘ÿu>¾_úRt I™·÷ÜÈþg¶ZòöhÏ¿†¶-Õ-´Ô´ ¡©Aê‚T,†[ÐwA_¡FÎFØÏ³'u~*½#z£×KìUÙ¸­Pÿ…TSW“€}Ôߨ'íÕ´ûºÓÐÖÀk½¾_ú¢e¨¥"«Ï«§öZ-uWë6H‘IÚÔãú¶+9ä —É•¿{¬ö`ðƒé1¤¦¦ØL°AÏZ¯Cñøþ@2_Ϥ±¨Q0Šg”âƒÅäûû‰)/¹ô'*áÓû:b©oÀò çù×à¡j‡¡§©Åáçžçzm /ž>u_wÚššl NlðHŒî™PÈ­­!§ºŠœê*ê¥-6Ô·©ç½A>¬HKE*¿[¿þ34€¯G„âßË/óžL±ï‹A‡â¿nˆ?ÑI§)¨¯ íå»[y|yí k†øw™8»¹¹±xñbÆÇܹs±±±aéÒ¥lذ¡µëé±fÍþþ÷¿#•JU~?{ö,W®\!""¢Ë¦OÐß6ùùù¤¥¥Q[[‹X,&--òòr@1¹GXX/¼ð?ÿü3;wîä/ù‹bì¡©KnôèáÁ„ §ÚÜá²|ùr$ k×®eܸqLš4Ie‚,::šŠŠ ììì ¢¡¡ïî$ ÞÎäÉIØÛOÂÕu>3gæáæ¶H)ˆHÇÏo ÖÖÁ ø¢¢Dôï¿€þý_ÆØ¸/‡‡RPðׯÇpèP0.Q.béêšR[{‹¢¢8Š‹O‘™ù·o§ª#FlcüøØÚŽÁÖv4“'ŸeèЫ¸©ªª"--Mùüþlkë z÷ÃÝ=šÙ³‹°³¯¶þQ£ö1iÒ¯88LÆÙy66Á²!‘HÄæÍ›5j”²îOŸ>ý±éˆHÇßÖÖÁ¸¹½ÊìÙÅ88LVÛnèë[¢¥¥ÿ›-ºabÒO-ûèŒø÷í;•Y³òqrš•U66ÁXYýf[ºxzzâííÍÅ‹:th·jº{û*¤RRR”Ï믿NMM Ï=÷---H¥R‚ƒƒY»v-'OždÍš5TTT`aa¡’Æôôt9|ø0ÙÙÙw‰ôÝ飣£ï»Ëé‹/¾`Û¶mœ>}šììlêë멬¬ìrö¥££CLL GmU>×®]#++‹K—.QWWG~~¾ðB ÐíÛÇŠŠ 233ÉÌ̤®®Ž²²2åÿ‰bŽoêÔ©äçç3{öl‚‚‚&((H† ãÆÃ××—éÓ§“››Ë¢Ewǯééé¬[·Žàà`^}õUŠ‹‹™<ùîøgëÖ­ûì3"""(((ÀÜÜ]]]ÜÜÜðððàÔ©Søø´Ÿ?(üöäê„¿}ûv’’’˜4ióçÏ'//¯Céêô?ÂÅÅ…àà`^{í5N:Å—_~ÉòåËyÿý÷»Äû¯@×DuvSãþ›Ê›­—.îﻣ©«IÕ…*¤õRdY»rM½9Ôž×7]­^Jò¬d8’»!—¢ExüÛ£ÝðÝžºŠr*kâòòËÈšd˜ 6CËP M=MdÙƒý÷ÒÅÿ[ÎECR*ÁÀ¾í‰oç¥Î8E;‘4-‰–º–Vrþ†èôÐAÛLY£Œ^#{Q•Q¥âÆu™+•ç+);Y¦ò{Áî<×y2à(¤hQ›:î‡ñc4´5¨J¯ â§2¥ûyöž…žâ+õÒÆF–¥$#‘ÊjÑ #mmôµ´h¼g"¼-,õõùa䦜8†¸±£¶_lßèÅRwÆÿòµ-Í­äýŒL0×Õ£‡Ž.R)cz÷!­ü¶Š›w¼¼I*-åxq¡ÊïßܸÎFÿ þéíËž›7Øw£M÷ÃݬÚšš¤þNŸÀ³GrY)/¹ è2ñ½sdDII ‹-B"‘ˆ±±1úúú46Þý bõêÕ$$$päÈåoÖÖÖ$$$Bqq1ýúõë²éôwggÅQÊ.\hS.“5QY™ž^Ï6åƒfÕªUxxx•ÕöÎòM›6ñÃ?põêUJKK155¥¹YÑ>ÛÙÃÎn±±vÈ励\eå%ÆŒù‘7ö ‘(âÊË3()I ¤$ÒÒsŒs›7¿ÃÀÀš††b} %€Åqq'OÎ4°µ}Ž—`llO|ül*+ÛÿÎÁ!‡ÉÈdM„„|©ü½ÿ—HK[EKKfff*/ÿ¹¹¹TWW+ÿ/)I¤¨(ž¢¢xŒûáìü"Ñ‘võÛÙÇÚ:]»úðÛµÅXZ¢£cÔ¡r>wîqqqÄÅÅѯ_?æÏŸÏÞ½{›þÛ·Ó”ågl쀓ÓlnÝ:¨Þ˜§2›ÆÆR¤ÒÆû–ÙýìÃÒ2 Sâ/“IÈÍÝÕúý±©‰ÌÌLzõêÕ-ÛŸîÞ¾ é»ËÊ•+±²²b̘1mÊÿú׿ÍøñãÉͽ{BɪU«X±b .dôèÑx{{³~ýú§®,î—>ù=ËÝ\\\ppp@[[›!C†påÊ•.c_+W®äÝwßÅßߟššš6Ç={öÄÜÜœ††&NœÈ¹sç„¡}$ »víjS¦¯¯Ïœ9sðóó£¥¥…ÆÆFFÅæÍ›•nÒÒÒHHH !!fÏžÍÁƒŠñ϶mÛØ±c}ô;vì`ÇŽ*u´ººšÔÔTΟ?H$âÀ|üñÇ899‘’’Bvv¶Ê‰ ¿§½ð$ojjz`øãÆcܸqØÙÙ!“)Æï—.]âÇdÏž=Êé”~u¹_ÿó ®]»FTTGŽÁÜÜ\™Ÿwv¢=íï¿]µW…z î¶‘6%GJÐ1ÓAË@‹’£%˜5GSO³]ù½ˆbE”Å—u(|PìÞ9uÿoýÉß™Ïÿù`âa‚(V$”ä#¦òB%-u-X·¦¹ªiƒëqÖTœ¯hµ¸eeG¯0ÕM™DFê‚T´Œ´0t4ÄÀV±Àe`g€–þÝ]Z×?¹NÚâ4ö(5ï¥þf=µWj)9\ÂÍ7°™`£"7õ2Åf² 9ä´™†_Ÿû•¤È$D߈¸z žk=Õ΃ڜZä-rÌ|̃xÆ1ó1£:³ºÓÂ;_^FmK3áöT65Ñ ma’=Ie¥­·æ9¹0º·êÖm‰TÆœ„xŒ´uègl‚¡bâÈÁÐ}­»õk]ÖE$&pdôó¼ëÕú+ u5dWUòƒè²³·wP‘û˜[0ÍÁ‘ÿ—žÒ: ·ËväÆÿ‰¯®_å?CøÔ?Pí<¸\UI‹LÆž½{ÆñµèEzE×Yè<{ö,555̘1ƒŠŠ êë뉌Œ$!!AååpèС̙3§ÕÑA‰„‰'bbb‚««+}û*v¦;::b``ÐeÒ'èÿcœ8q‚ÜÜ\¶lÙò@wÍ͵è蘨ü~åʘ4iÒ}ýÚÚÚ’žžÎË/¿Lll,ÙÙÙ*ÆF•Ùhhhca1DéÞÊ*ÆF±rqë÷XX F"©@")'?ÿG,,|13»»(íâ2—ææ:ŠŠâîÆ¤°ð~ù%œK—>%44€¼¼<<=ïŽÇ|||())¡±±‘òò4@ΩS&6ÖNù|ó•rq Zïàºwqë÷Èd45uÔÿV^BCC›t×Ò¢Øy¬­mØn˜2™ --­'¦_.—¡¡¡Õ!;mn®EGÇT-·÷ÚÇ£ˆ[Ü)oSSÓnÕþt÷öUHŸ‚Ík¯½ÖJæããC~~>©©©¸»»«L.öïߟ¯¾úЉ'²eËfÍšÅÒ¥KÙ¾}ûSUJŸ:ÔÔÔpáÂ>þøc¶nÝÊ‹/¾Ø¥ìkåÊ•L›6äädV¯^Ý*œëׯ“™™Éž={øðÙ5k–ð2 ´í`nnNrr2_|ñîîîxyy±{÷î¿Îœ9ƒ««+lÞ¼™­[·òÕW_µò÷Ê+¯´Ywjkãs“V²öÂWGÿýÂÏÎÎV.øß!00±X¬\Üz˜ñg{ýÏïó§­£ãââpssÃÚÚšùóçcjjª|~Úߺ&*+OÅ?ïOÆÒ ä29ñþñœá< 86.è§ j.×–@âó‰÷7Æ{“·Zrå LM { (ú^õŒåöü—Å—‘½*›aßCËP —7]ÈZžEuz5}fôJò#o‘“ø|"&î&ÇôSµWjINWq§m¢MŸ}è=¥w«r¯Ï«W> … 4ˆ6ªNà×]«ãôó§iÈo $!{Å.ÁŠ&z&”a? ÃÈÙˆ³gUüº½çÆM7”;ï¥ÿÛý <Hhb(‡i®j&gUŽÚy k’‘õ^^ë½î»M ûÓ+¤/:pù½Ëf‹LFðÑhÖƒs¦ðü$²«ªx)Qõ¨Aæôs&ÒAõ —êæ&nÔÖ(Q½bÒïV}m«²+ÕUý‘›uµ¤LŒ ¯‘1©”r‰„ãc&1y¿Œ«‰)cUñûþà!||ù·%­}oÐ`NŒHú¤©ÄHeS便¨™”·RÏñù°áô52 íe¤Moºà­”ä.çææfÜÝÝñööæÆdee‘™™Idd¤Š»O>ù„>ø Õê•••\½zUùܼ©¸[4//†††.“>AÿýÙºu+r¹œÐÐPÞ~ûmär9/¿ü²RîììÌHOOG"‘PRRÂÎ;•‹PŠ—Ò&ââ"ñ÷_GT”ˆQ£ö)ÆLuuQ^^NZZuuuTTTpô¨¢ý #''///bbbxë­·X¾|9¥¥¥ØÚÚR[›ÇîÝŽ¸¸ÌcæÌ<"#/#—KÙ¿_õ W×?3mZ3f\Çа7û÷+Ž8,/Ogÿ~ ú3gÞ$22ccGöîíT*ASS?¿™2%…¨¨¦MˤgOoŽyNiçÎÎά^½šòòr pwwÇÅÅå·û[ÄÆÚceÈÔ©‰Š~Ž~ýf¨ÄoÊ”)Èår•ÇÍíá索­½ÅîÝ}±³›ÈôéW™5++«@ÊÊTû7©´‘“'ç¸á·òÙÛ)ö÷¤õßHù? 1cÆuf̸Îȑߪe+þMMMŒ=šÍ›7ÓØØÈ/¿üÒ-ÚŸîÞ¾ éS0uêTÒÒÒ¸víZ+ÙöíÛÑÓÓã»ï¾C,#‹•G°^¹r…Ñ£G³cÇD"ÙÙÙLž<™ÀÀÀ.“¾¨¨(Äb1±±±hii!‹9qâ ¸fË–-deeQXXHJJ eeemN¤>íöuùòeåñ­[·prr¢¡¡²²2.\¸@aa!©©©¸¹¹©LX íÛTTT0räHÞxã òòòÈÏÏ'<<œÌÌLµÃX³f ‘‘Ayy9ûÛß:<þˆŒŒdݺuˆD"öíÛ§vøêè¿_øyyy8::2oÞ<òòò¸|ù2R©T僱‡åAýÏÌÌÌX°`A›ÇÌÞi¿wîÜISSÖÖÖœ={¶K¼ÿ tM4øí¼ˆ°ä0!7º1ñþñÝ>öóìé=¥7ÉÓíĨ~o}1˜šì2—ev»|ôZïEMV y[ò„ŠsÚFÚø~éKÓí&2–d k–=SéÉ¥?‘ý˜÷Ó#Õck`È×#¸TUÁ’ä3Ý.7 çReŸåd •ꌵuØ<’Û’Fžý•fY÷ª_‹/fîܹOݤ“€€:DD¤sñâZ®_ß)d†€`Ý’˜˜ÒÒÒX»v­>Á>ºÂ×3³°À% ðl )dÀÓBà¡ÀVG> >ÿçƒóRçN§~o}2ðƒÝ²¼Ö{á¸ÐQ°ß¡cªÃ°†1hà 4uº^Ó7vÓûvÞåÿÂ2AO[CŽ™Àº!ݲ~m ÎâݳíxÌtuùeÌx¶Ž@G³ëM8ÀÊ•+…‚è¼¾ÙkS§^D_ßRÈŒ‘޳óÜN oذ +î¸15ueαòéÙÓç‘§çIè···g̘1Omü…ú!ð°ÄÄİlÙ2!}Jzzz›Gw éìS {°lÙ2.^¼ˆ¥¥e— _@ ;¡2‹ÔXØÈå—9x’“ÃN¶r|}ÃuN>MéñRD»DÄÄSz¢Tmy{<Èÿ•_¡øp1¢X×7\ ç_9ÜÜvS(ÅÇŒÝl;–†ž•žòw}[}ÜÿéNè™PBφ¶òמüA:–†¹¿9&n&8¼è@èÙP¬ž·jӽ͌œŒÈÝÛ©i·e‰ß·~\xåYïf©?šøÅúá¸Ðósœ;)Ó£.Îufø/ñ|λÙv„%…a9ònG7ü—áøíòÇéŸ Æ{ƒ÷Ê¿?Ê€åðßãý ö˜û›£c®£¶ýèYé–†™Æý1îoŒžµÞScÍÕÍœ ?‹øg1#NŒ@ÏR¯cõÆÐˆûú‘1y“§©È´44ø~äH¥w÷äRx$–ê—϶ `v$ÐҊَΤMšÊèÞ¶jùígl¢ÔçÑÜ…®¸8yúØ·é~Š}_\LLùOÖÅNµŸ1½ûppÔXþt:ž7S’„Æö¢ª©‰ÑÇŽp¸@DÒ„p¬õ;÷žC6mÚDaa!EEEmºY¿~=‰‰‰DGG‚………RöÊ+¯°`ÁBCCyçw‹Åøûû·ÎÌ™3qsscÕªUÊ߆ ¢òÄÆÆrüøq´µµÑÒÒ"!!eË–Êòåˋń„„<5å³bÅ rrrgÑ¢E”””0qâDA¿šØÛÛãããÃùóçÙ¾};>>>ôìÙS)9r$ÍÍÍÄÄÄ0vìXæÎËÆUÂÈÎþœ'fÐØXúÔÕßÑ£¿g„“ôéó<ÎÎ/0cF.>>Ë•òÀÀϘ<ù vvã±± ÁÓó ,,|Åar¹mmm¥û;¿éëë«¥ãÆœ8qå3`À€Ç’öêê«|óûö¹=‘¼\ú,X Ò¦=mñ”õãI·?]½}U§ÿX´héééˆÅblmmÕoßΑ#G bÒ¤Idee)/±ïˆþ?‚:ý·ºã‡?š~uü?ÉñS{ñ³µµE,€§§'žžžôéÓGmùÃÆÿQ§ïA¸ºº*íÅÛÛ›¥K—R\\Ì´iÓ›}¶—þŽŒwú¾üŸdÿfnn®¬ÓÇŽã“O>Qþ¯§§×eòùóÏ?gÆŒ­îXî*á?Œý´Ç¾}û8zô(!!!ÌŸ?‘HÔæŠªÿxöPYàÒï­X€ðúW+‡u×ëÈÿ:ß/}):P„¤L‚Û{ndÿ3[-y{´ç_C[ƒ–êZjZÐÐÔ uA*Ã-è» ¯PŠËXt5 Ø@ýzÒ^Mk%o,R,^|½íIïöäwÐÐÖÀk½¾_ú¢e¨¥"«Ï«§öZ-uWë6H‘IÚŒ§ëÛ®ä|ƒ\&Wþî±ÚƒÁ_ ¦Ç˜z˜b3ÁFí”;á| ™¯gÒXÔØ¡ü‘Ë䜋:GÞ–<*’*ÈÛ’Gsu3:=tÔÒmäl„ý<{Rç§Ò;¢7z½ôÈ^•Û Å„€-5-”Å—ai‹óß¹¶îF®Fο?ÊC0õ4EÛX‡?;Ð+¤ÒZ©Úös' ’b u×꨽R‹¤DòÔÙGñÁbò¿ÎÇý}÷åOA}ÿH=GtÒéV2©\ΔÇø,'‹ÄR1ŸådQÕÔ„¹®zöÙÏØ„a½¬x;õgJÅìʻο3ÓyÛÓ»•[mMM6 '6x$F÷L(äÖÖS]ENuõÒ ê[ù×ÓÔâ½A>¬HKE*¿›ÿÀ×#Bñïe‰—yO¦Ø÷ÅÆ@ýE =M-Ö ñ':é4õõBƒûŒòÝ­<¾¼v…5Cü;5Üüü|¢££ïû•é±cÇ:t(¦¦¦,Y²„qãÆQSS£”ñÅlÛ¶Ó§O“M}}=•••­íXO5kÖð÷¿ÿ©ônû—’’¢|^ýujjjxî¹çhiiA*•ÌÚµk9yò$kÖ¬¡¢¢¢Í ”'››‹/fܸqÌ;–.]ʆºHKf IDAT ý°¿´´4jkk‹Å¤¥¥Q^^®œ\Š‹‹#,,Œ^xŸþ™;wò—¿üEÑgiêÒ£‡=zx0a©6w¸xz¾NT”ˆÁƒWÒ»÷(úô‹½ýÝ Šèèh***°³³#((ˆ††¼»“48x;“''ao? W×ùÌœ™‡›Û"¥<""?¿5X[3pà_ˆŠÑ¿ÿú÷cã¾>JAÁO\¿áCÁ ¸D¹ˆ¥«kJmí-ŠŠâ(.>EfæGܾªvþ±ñãO`k;[ÛÑLž|–¡Cÿ­â¦ªªŠ´´4åóûK°­­ƒèÝ; w÷hfÏ.ÂÎn¼ÚúGÚǤI¿âà0gç9ØØwȆD"›7ofÔ¨QʶaúôéMDD:þþë°¶ÆÍíUfÏ.ÆÁa²Úþ===±²²ÂÀÀ@9ùäâ⢒¾M›61jÔ(Þzë-•öÛñïÛw*³fåãä4+« ll‚±² R»~tåö§;´¯íõ¿zzzœ={–+W®ÑáþÙÍÍôôt9|ø0ÙÙÙ«­ÿaP§ÿnoüð°éoÏÿ“?µ?GGGªªª(((àòåËdffRPP ¶üaãÿ¨Ówbbb8zô¨Š}\»v¬¬,.]ºD]]ùùùÍ>ÛK¿ºãß'‘>‡+ÿ'Ý¿UTT™™Iff&uuu”••)ÿ—Hs8S§N%??ŸÙ³gDpp0AAAÊ0lll7n¾¾¾LŸ>ÜÜ\-º;~MOOgݺuóꫯR\\ÌäÉwÇ?[·nåàÁƒŒ1___fΜ©\@Ÿ>}:IIIøúú’ššÊgŸ}FDD˜››£««‹››œ:u ŸÖã…ßž\ð·oßNRR“&Mbþüùäååu(ýÛ~<‚ƒƒyíµ×8uê_~ù%Ë—/çý÷ßlý—À³‡êì¦Æý6•7)*Z/]ÜßwGSW“ª UHë¥È$²våšz>r¨=ÿ®oº**Z½”äYÉ8.p$wC.EŠðø·G»á <º½tñÿÖŸsQç”J0°ocâZÞN òöõ8/uÆ)Ú‰¤iI´Ôµ´’ö5D§‡ÚfÚÈeôÙ‹ªŒ*7®Ë\©<_IÙÉ2Õ†Ýx®ódÀ;(*S*±Ÿgß¡<’«énË^tqev nÖÕªåçFm ‹ÎþÊ7ÁaôømQ¬¶¹™2‰êB웽XêîÁø_~¢¶¥¹U8ýŒL0×Õ£‡Ž.R)cz÷!­ü¶Š›w¼¼I*-åxq¡ÊïßܸÎFÿ þéíËž›7Øw£M÷ÃݬÚšš¤þNŸÀ³GrY)/¹tîî ¹üþ5ÐÁÁooo‚‚‚¸víK–,áôéÓøùù)Ý™˜˜àâ₃ƒÚÚÚ 2„+W®¨„µzõj8räH›ºV®\‰••Õ}úúë_ÿJtt4ãÇ'77÷©(;Gb”””°hÑ"$ £¯¯Occ£ ÿ!pvV•{áÂ…6å2Y••ÙèéõlSnnîÅ AÿàС`ªªrÚt³iÓ&~øá®^½Jii)¦¦¦47+Úg;»qØÙ#6Ö¹\¦èã*/1fÌܸ±‰D±W^žAII%% ”–žc̘ƒÜ¼ùÖ44«èkh(äXpòä<@[Ûç8p ÆÆöÄÇϦ²²ýàÂqp˜ŒLÖDHÈ—Êßû÷‰´´U´´Ô`ff¦òòŸ››Kuuµòÿ’’DŠŠâ)*ŠÇظÎÎ/ iW¿Ýx¬­Ùµ«²'·´ DGǨCå|îÜ9ââ∋‹£_¿~ÌŸ?Ÿ½{÷>6ý·o§)ËÏØØ'§ÙܺuP-¿™™™ˆÅbÈÌÌlÓMjjª2}‰‰‰$$$‹¾¾_§Ä_&“›»«Ãõ£«·?Ý¡}PÿkmmMBB!!!Ó¯_¿÷Ï«V­bÅŠ,\¸Ñ£GãííÍúõëÕÒß™<¨ÿ¾ßøáaÓßžÿ'=~R'~‰‰‰¸ºº¢££ÃsÏ=ÇÆÙ¸q#Ÿ~ú©Zò‡‰ÿãH߱߻ヒ¿¿¿ÊâØ½ã€ž={bnnNCC'NäܹsÅ>թퟆô t¼ü»Jÿ&‘HصkWÛsPúúÌ™3???ZZZhlldÔ¨QlÞ¼Yé&--„„ppp`öìÙ<¨ÿlÛ¶;vðÑG±cÇvìØ¡bÃÕÕÕ¤¦¦rþüyD"àã?ÆÉɉ””²³³UNdø=í…ÿ ySSÓÃ7nãÆÃÎΙL1~¿té?þø#{öìQ~H÷ ôwFÿv?®]»FTTGŽÁÜÜ\™Ÿwv¢=ŽþKàÙCíU¡ƒ{ m¤MÉ‘tÌtÐ2Тäh æCÍÑÔÓlW~/¢Xeñe »3ÎEÃÿ[òwæãó>˜x˜ Š %ùˆ‘Id¤.HEËH CGC l vhékušžëŸ\'mqû”‹š÷R³žÚ+µ”.áÆæØL°Q‘›z™b3Ù†œZOòT^P, $E&!úFÄÀÕñ\ë©vÜjsj‘·È1ó1ûCùcânBȯ!T_ªæôó§ï»¸eeG¯°^­âÞRׂõxkš«š‘6H±gMÅù dz–zH»’¦&‘ùV&ÒÅÿº½tÕο?JcQ#-u-XŒ¸ûE‡–¡–2±y‹œÛ¿Þ¦èû"•#Ÿ&û0ó1£:³ºSë˜GsR'EQYNðÑﻸ5Ïɥͣ—0âèxþ°¿;ƒ±Ž+ÒU¿_—u‘‰ ý<ïzµþ èF] ÙU•ü ºÅ†ì,ÂíTä>æLspäÿ¥§´ò{þvÃŽüÀøã?ñÕõ«üghŸúªþËU•´Èd éÙKhpŸq|-z‘^ñø:óóó©©©aìØ±ÊߌŒŒ¨««SqWSSÃ… øøãÙºu+/¾ø¢Š|èС̙3Gåh¤{0`ÑÑѼöÚk­d>>>äçç“ššŠ»»ûS³¸pöìYjjj˜1cÔ××IBBÂcyùíîúOœ8Ann.[¶ly »æfEŸ £cò;»¼ŽTÚHŸ>÷¿ÉÖÖ–ôôt^~ùebccÉÎÎÆÐÐPÑ÷Uf£¡¡…Å¥{+«@ÅÊÅ­ßca1‰¤‰¤œüü±°ðÅÌì‹Ë\š›ë(*Š»·w§°ð~ù%œK—>%44€¼¼<@±KèÞúPRRBcc#ååi€œS§þLl¬òùæ+åâ´ÞÁuïâV«1›L‚¦¦z;è++/¡¡¡ÍˆºkiQ|Ü£­mØþ˜Z&CKKë‰é—Ëehhtlì^]]M=ÔrëççÇíÛ·)++{$ñïHýèêíOwo_% 'NÄÄÄWWWúöUœÌâèèˆA»ýsÿþýùꫯ˜8q"[¶laÖ¬Y,]º”íÛ·?¶3ú%ùˆi©i¡>¯^ù4*gD Ê…›I6„%‡1è“Ahhj–ÆÐ˜¡Ê0Ú“ß¡îZr($!{Å.ÁŠ&z&”a? ÃÈÙˆ³gUüº½çÆM7”;ï¥ÿÛý <Hhb(‡i®j&gUŽÚy k’‘õ^^ë½Zí@R'<>ô@SWŸÏ}K#,9Œádž«„£m¢MŸ}è=¥·êdD‹œÄç1q7!8>˜ Ÿ‚¨½RKzt: Øá%“ÈTýHåÈ[äèZèª9œ™p##‚ãƒq|ÈàüœójçÏ€wt8ˆ_CðßãOsu3©/¥>uöÑ+¤/:pù½ËÊ¢û¾\ dó°hihp)<’ýa£•òOü†¡§©ÅƒB¸É¥ðHNSÝBn¢£Ãœ~ÎD:´þÂ壡$6œ¾FÆB£ûŒ2Ò¦7 ]ðVJr§†…X,&66---Äb1'Nœøm²WŽ———rà~õêUd2aaa€â ò-[¶••Eaa!)))”••µÈòÉ'|ðÁ÷=#}êÔ©¤¥¥)¿¾—íÛ·£§§Çwß}‡X,F,·:bíIÑÜÜŒ»»;ÞÞÞܸqƒ¬¬,233‰ŒŒô«ÉÖ­[‘Ë儆†òöÛo#—Ëyùå—•rggg8@zz:‰„’’vîÜ©\„R¼”6‰¿ÿ:¢¢DŒµOÑ¿¶Ôóí·}‘H*?þ3gÞdúô«Œù- ¸Ï*''///bbbxë­·X¾|9¥¥¥ØÚÚR[›ÇîÝŽ¸¸ÌcæÌ<"#/#—KÙ¿_õW×?3mZ3f\Çа7û÷+Ž8,/Ogÿ~ ú3gÞ$22ccGöîíT*ASS?¿™2%…¨¨¦MˤgOoŽyP,p9;;³zõjÊËË)((ÀÝÝ]y^mí-bcí±² dêÔ‹DE‰?G¿~3Tâ7eÊär¹Êãæöð÷RÕÖÞb÷î¾ØÙMdúô«Ìš••U eeªý›TÚÈÉ“s Üð[ùìíû{Òúï°~ýz:DUUUUU=ª:>xõÕW)))¡ªª ;;;¬­­küïW?ºzûÓÚ×õ¿•••\½zUùܼySÙ.444´Û?_¹r…Ñ£G³cÇD"ÙÙÙLž<™ÀÀ@µôwê¿Û?ââÅ‹ˆD"©¨¨P_µ'˜ø?ŽôÝáòåËÊpnݺ…““ ”••qá IMMÅÍÍMeÂúQÚg{éWwüû$Ó'ðÇË¿«÷oŒ9’7Þxƒ¼¼<òóó ¿ïNó¶X³f ‘‘Ayy9ûÛß:¦¦&"##Y·n"‘ˆ}ûö©¾:úï~^^ŽŽŽÌ›7¼¼<._¾ŒT*Uù`ìQ· 8AaÁ‚msz§ýعs'MMMX[[söìÙÇÖ <{hðÛyaÉaBntcâýã»}íçÙÓ{Jo’§'?R=ú½õüÅ`j²kÈ\–ÙíòÑk½5Y5ämÉìã´´ñýÒ—¦ÛMd,É@Ö,{¦Ú—\úéЉq?=R=¶†|="ŒKU,I>ÓíòqSÀp.UVðYN–Ð1݃±¶»‚Gr[Òȳ¿Ò,ëZõkñâÅÌ;WeRM@ »‘ÎÅ‹k¹~}§­‰D¬\¹’­[· ™!Ðe‰‰‰!--µk× éìS@@@@ ‹!,p=#< \ÏšB<- lu4ßÃàó>8/uîôxê÷Ö'ð` ?Ø-ËÁk½Ž ûø:¦: ûaƒ6 BS§ë5qc'0½oç]Þùßá!,óÔéñ´50äø˜ ¬Ð-ëצ€á,Ð=ÛŽ‡ÁLW—_ÆŒgKàt4ŸþúuàÀV®\)œÀã뛽–1uêEôõ-…Ìè é8;Ïí´ð† Û@p°âŽSSWæÌ+Ÿž=}yzž„~{{{ÆŒóÔÆ_¨KLL Ë–-Ò'Щ¤§§·yt—>Á>ºË–-ãâÅ‹XZZvÉðº*³H…\^q™“'99ìd+Ç×7\çôèÓ”/E´KD|@<¥'JÕ–·Çƒü_ù÷Š#Šq}Ãurþ•ÃÍm7…R|Lxæïv_ÌýÍé3½!§CèÖK)7õ4Uy}2ˆ¡_ECK{à»Ý—¾=°eIÐOAô}©¯Zº  KÃÜß7^t ôl(VÏ[µéÞf‚ FNFänÈíÔ<°e‰ß·~\xåYïfujþ©Ã€åðßãý ö˜û›£c~÷’ôá¿ Ço— 8N/øT0Þ¼ÿPþ= û¸ƒÝl;–†ž•žò÷§Ý>š«›9~ñÏbFœž¥^‡ògž“ sú9diÅRw.…G2¸§…RþÆ@/ÇMæy[;þääBfx$£{«¿à¶ `v$ÐҊَΤMšÊèÞ¶jùíglÂ¥ðH-­ðèaÎB×\œ< }ìÛt?ž/.&¦ü'ëb§Ö¯1½ûppÔXþt:ž7S’„F÷¢ª©‰ÑÇŽp¸@DÒ„p¬õ;v¹¬ƒƒ›6m¢°°¢¢¢Vò}ûöqôèQBBB˜?>"‘Hå!C†¨<±±±?~mmíVaÍœ9777V­Z¥¶þöÂå•WX°`¡¡¡¼óÎ;ˆÅbüýýŸšòY±b999„‡‡³hÑ"JJJÛ%ïÝA¿½½=>>>œ?žíÛ·ãããCÏž=•ò‘#GÒÜÜLLL cÇŽeîܹlܸQ%ŒììÏ9qb¥O]ý=ú{&L8IŸ>Ïãìü3fäâã³\) üŒÉ“Ï`g7›<=ßÀÂÂPÜ&—ËUêÚßôõõÕÒ¿qãFNœ8ò0`ÀcI{uõU¾ùÆŠ}ûÜžHÞ?.ý ,Pióž¶ø?Êúñ¤ÛŸîÞ¾‚⎷ÄÄD¢££ ÁÂâîøØÖÖ±XL@@žžžxzzÒ§Oµýw¤ÿ#´×·'W'}‹-"==±XŒ­­m‡å”‡ßhii‘À²eË eùòåˆÅbBBBÔ¿½ò}êèß¾};GŽ!((ˆI“&‘••Å믿®¶ÿ‡±/WWWexÞÞÞ,]º”ââb¦M›öØÊ¯=ûyÚÓ'ðp´÷~ô(177W¶yÇŽã“O>Qþ¯§§×eòðóÏ?gÆŒ÷½ƒùiÿaÚÏβ¯GÕ <{¨ôLú½õqÿ§;Ö㬹øwՉ˺ëuäOÀ¾®®¹ŠQ#ÜÞs#ûŸÙXŽ´lWÞíù×ÐÖ ¥º…–š445H]ŠÃŸèÚK(ÅÇ€a_CÌýÌIŠL¢!¿Šä är9.w¡,¾Lñ’šY­tïµÞ‹–º2–f(3r6¢"¹‚ÊÔJ445è3£ZFZ­tihkà¹Ö:¤/NGZ/UÊêóêi*oB×BiƒI‘¤•M]M\ßvåòÿ»Œ\&Wþî±Ú] ]nl¾¬Q†a_C*R*”HÔÊM]M¾?Œ%45vzþµÇCÐÔÕDÛX‡?; þYLÕ…* ì h©i¡,¾ ÛH[LÜM¸¶îý¢Uw쨓Ê>4u5ñÛåÇÕµWI{5€}ª;tºŠ},ÆÀÖ÷÷ÝI[”¦v}{M1XÐР‡® Òªš›/&¦¼äÒŸñÇâ½A>dWU±üÂyþ5x(¿´v?c†õ²büñŸ¸UWË™R1rä¼íéÍ/E…ª¾¦&ŸúÒSW—g¨kiQÊrkk¸-‘`¡§G½´…†úVºô4µxoo§œC*¿›ÿ€¥¾>²³hJq26!©LL±š—„êij±nˆ?¯œý•‚úz¡Ñ}FùîVv††¬âÏŸOŸTÛ_~~>ÑÑÑìÝ»—˜˜™‹‹ ÁÁÁpãÆ N:…\.çý÷ßçðá䤤(ÝÇÄÄPSSCTTTk;ÕÓcÍš5¼öÚkH¥Rµô«þ_|¡¨ŸÚÚXXXP__OeeåSQ&nnn,^¼˜€€>üðC.]ºÄÒ¥KÙ°a‡ô«iŸùùùÔÖÖ"‹IKKS™|Š‹‹cĈœ>}ZùûΊû®45u15uBGÇŒ1crôèXÊËUûOÏ×ñô|œœ­ŸBSSMMòóñ‹ŽŽæƒ>ÀËË Ž?Î!CÈÊR|¨¼=ýéãæÍï17÷`ðà•œ>½[·ªåßÓÓ+++ ”——766ríÚ5eú~øáöîÝËСCùßÿý_Þ|óMå"íÃÆ¿oß© ö)çνEmíM45µÉ¤ˆÅ‰jÕ®Üþt÷öàØ±cèëëcjjÊ’%KØ¿¿òzGGGªªª((( ¨¨H¥ïUÇ¿ºýû¥½þ»=y{éÓÓÓãäÉ“üÏÿü$%%uHþ°<ìø&88Xù÷™3g˜7ožÊU{á·W¾B*•¶«ßÍÍS§N‘˜˜ˆ¦¦&/½ôÆÆÆjûW×¾tttøïÿ‹……Ó§O§¶¶V)»ví¥¥¥XZZRWWG~~þc+¿öìçiOŸÀG÷£GIEEйàº:ÊÊÊÈÌT½ß~êÔ©|úé§¼õÖ[ܼy---¤R)‰‰‰ØØØàããƒX,ÆÉɉ5kÖðᇲy³büšžžÎ±cÇøþûïñðð`åÊ•,\¸ƒ㟭[·bmm͇~H}}=...œ>}š‚‚¦OŸÎ²eËxíµ×غu+gÎœáØ±c|öÙgxzzRWW‡““fff(üö人ºí†¿}ûv<<&n&$ÏH¦þ¦bòßáÏøíö#ijÈdÜØ|ƒ€ï¨»ZGi\)–@ÛX»Cù÷(ìC·—.þßús.ê’R ö­wgt%û¨L©Ä~ž}‡óÉX[Gccì ÐÖÐÄÛ܂ܚ,ô_©—66²,%‰TÆP‹^ik£¯¥Eãï^vÏÚý•o‚Ãè¡«øâ©¶¹™2‰êB웽XêîÁø_~¢¶¥¹U8ýŒL0×Õ£‡Ž.R)cz÷!­ü¶Š›w¼¼I*-åx±êÂÙ77®³Ñ?ˆzû²çæ vçÝhSÇýp7붦&©¿Ó'ðì‘\VÊK.Û}!¿g±õ÷\»v¨¨(Ž9‚¹¹9ÕÕÕm~ ·råJ¬¬¬î{×êÕ«IHHàÈ‘#jëW7|\\\ppp@[[›!C†påÊ•'^wŽÄ())aÑ¢EH$166F__ŸÆÆFAÿCàì¬8*÷Â… mÊe²&*+³ÑÓëÙ¦ÜÜÜ‹AƒþÁ¡CÁTUå´éfÓ¦MüðÃ\½z•ÒÒRLMMinV´Ïvvã°³Gl¬r¹LÑÇU^b̘¹qcI9åå””$PR’@ié9ÆŒ9ÈÍ›ßa``MCC±Š¾††@Ž5'OÎ4°µ}Ž—`llO|ül*+³Û͇p&#“5ò¥ò÷þý_"-m--u˜™™áãsw‘-77—êê»^•”$RTOQQ<ÆÆýpv~A­.;»ñX[²kW~»¶KË@ttŒ:TÎçÎ#..ޏ¸8úõëÇüùóÕZàê,ý·o§)ËÏØØ'§Ùj/peff"‹ihhh5ùt‡ÔÔTeúIHH 66}}¿N‰¿L&!7wW‡ëGWoº{ûîàà€··7AAAÊÓ%K–púôiüü§R$&&âêêŠŽŽ¬ú8 IDATÏ=÷7ndãÆ|úé§jùW·Úë¿$Pú¬­­IHH $$„ââbúõSýp±=ygÐ〿þõ¯DGG3~üxrssÕ ¿#åÛ÷Ó¿jÕ*V¬XÁÂ… =z4ÞÞÞ¬_¿^mÿê¤åÊ•¼ûî»øûûSSSÓæ8 gÏž˜››ÓÐÐÀĉ9wîÜ#/¿ŽØÏÓš>?NGÞž$‰„]»vµ=G¦¯Ïœ9sðóó£¥¥…ÆÆFF¥\àHKK#!!„„˜={¶rgÛ¶mìØ±ƒ>úˆ;v°cÇ®®®&55•óçÏ#‰8pàü1NNN¤¤¤­r"Ãïi/üÉ›ššþ¸qã7nvvvÈdŠñû¥K—øñÇÙ³gåååí¦ÿaÛχ±¯ÇÑ <{¨½7¿ÇàhÿöÎ<¬ªj}üfdD@dPA4çY#S,íÚ÷êýVÖ­«?½_ëVj×kšÝ®f7“ÔJ³Ì¡LAIT”QdA”Ãt@æáàœóûãäÉà9$*êþ<Ï~8k¯á}×»ÞµöZ{­mªOùÑræ(· –+Çj„ºFºÃoG´W„±½±ÚñeÚÄo*l"cyAû‚H^”Œÿ¿ý)9X‚h¯çgœ…Ú¼ÇT­âÌåÛÅ}#ûâó¾—^Ußég:ЧN$E'©ýnâb‚ÏÎL¯’”‹KÚêï^Ù‡\*'eq z¦z˜˜š`l§\Ðé娋¶º6Œì*û°ð·PÛ±¨- m­dÖT“YSMoCb\\ùöF!«*ihke†“3û •ƒ†iŽNœ¯¬h·¸µÐÕÒæ¦v;³~—3úØŒëçÀ¿Cx9)QížY—Ȩ®â踉+ñÎ%õ·€®5ÖSÞÜLNm †zz¬ðòfÃåßvaú[Y3ÇÙ…ÈŸÚ¿Õ{ñf%#~¯´M>…D.cyÒY­t“][C›\N@Ÿ¾œ« ÷1f¸u_Ò«»w¡óäÉ“xz*Àš2e Ÿ}ö .T»gðàÁ,[¶ŒÐÐÐÓ1bóçÏÇ××÷•ASúõõõ¤¦¦’ššŠ¥¥%Ï>ûl§t÷“sçÎQ__Ott4Ÿþ9QQQ$$$Ü—ÉÝG=ÿ¸¸8 ؾ};O?ýt§÷µ¶*߆600ÿÝä#“Ièß|§ \¤§§ó /àççGNN¾¾¾¿î$ÈAGGkë*+•N¶¶!H$bÕâÖï±¶†TZTZEQÑx{¯ÀÂb°*w÷´¶6RZzòöi6JJ~¦¤äg<<ž#""–ï¾  °°Pîºõfª¿¿?åååH$’_wã(8}úJJNtªM;¸nG.—¢«k Õ½55—ÑÑÑÇÞ~4ee Þ×Ö¦›éë›h‘¿==½–¿B!GGG¯KvZWW‡¥¥¥V÷róæM*++13ëþòw¥}<ìþçQ÷¯EEEÔ××3aÂÕ†©©)Ôq+?ýô_~ù%S§NåÃ?Ô:¾¦þ÷nÑÔkÓ¿w$ŸT*eêÔ©˜››cnn®:ºÐÅÅ…êêjáÍZž¢p·ÜI¿þþþ:tˆ˜˜¼¼¼î™}tÆò4hŸþ9^^^ܼy“íÛ·3mÚ4vî܉‡‡‡Öå×d_k×®%99™¤¤$<È›o¾©žŸŸOII ™™™óÖ[oÝ—ï¼jk?«|Ýó|ÔS±²²"))‰9sæ°hÑ"•-ÞÉÏü~üuöìYU[×××'66‰DÂ3Ï<£oÉ’%Ïïüº[ÑܼýøCSúÚäßYú999ª&n-‡„„ ‹U‹[w3þìŠÿ^²d "‘¨Ýο;ÙWOé¿-ÔVžÊ~(#>(žŒ(ä âƒâ¹øôE儯¾¡?†RŸ]OBd‰1d†ß6?­ÂU0õm]LéwêgkŠ__IκF~7==Ü_s'kUuéuôî/Ôä}`È?†úc(¾ÿôEѪ >8žÚ4õÝ1¶m©Ï®W-ÂÜ¢©°‰äEÉølð!ü—pFý4 ›±6$ÍMj—OãÕFÎL‡ŸÇOÆÃ¼7ŽS‹ûö°þ•}™›ÒöG?®:Œ¸ SIŸ6›ø S©iiauZ²öYr¯§\àã‘£`j&8ÜÇ”1öýxÑc0¯''u)^LL b±˜½{÷¢§§‡X,&..N¾}ûv²²²Ø½{7---ØÙÙµ;âföìÙ¤¥¥©&Q~ÏæÍ›yçw:|³QSþwJ_OOOU¾’’’““©¬¬¼ogàkž8nÅËË ???®]»FVV™™™DEE ùkÉŽ;P(DDDðÆo P(xá…Tánnn»C›ç£žJuu5cÆŒáÕW_¥°°¢¢"f̘ÑéNóŽX¿~=“‘‘AUUùË_ºTŽ––¢¢¢Ø¸q#"‘ˆýû÷k¾6ùw–~aa!...,\¸ÂÂB²³³‘Édª£¤»müŸ……‹/fÁ‚]²¯ûÑ <~èðëy‘I‘‚6aâƒây:Ñof¿Eºã~Æ ûÏ0êsêµÞýõ0á»É—ú¬z · öqú¦ú ÿl8-7[ÈXž¼UþXùçÝå<©'¼§ù8ô2á‹Ñ‘\®­Öz÷×ÃĶàQ\®©æ£Ü,¡cº 3}ö„á¦T‹ç~¡UÞ³Ú×Ë/¿Ì‚ Ô&=fÍJçÒ¥ äçï”!БHÄÚµkÙ±c‡  ‡–ØØXÒÒÒØ°aƒ Ÿ€€`ŸÂ×cÂã°À% ðx +¨@ §r8¤ýÑ|wÿ¿ýq[áÖíå4îgLÈ¡†¼3䑬ßM¾¸¼è"ØÇï0èmÀÈïG2tËPt >×yrÂæè¾wþwT8+½‡v{9z™pbü6?’ík[ð(^ühúŽ»ÁÂПÇOf{Èh tý¡ÉÁƒ…ït­oö]ÉìÙ—06¶”ÑEfÍJÇÍmA·¥7räÂÂvл·óç‹UWŸ>þ÷\ž‘¿‰Iìí#zlù…ö!p·ÄÆÆ²råJA>n%==½Ã£»ùûx4X¹r%—.]ÂÆÆæ¡L_@àQBmIR"!{M6§BNqjä©v7çoÉç̸3Tœ¨@´GD|p<qZ‡kâNñ¯¼w…²#eˆöŠÈß’@î?r¹þéu¡» ï÷¼¾s8–Ã-±kCè¡ x~@»ûŸr$äp‘I‘Ùu{ú>X»˜™‰Uæžæ8?ëLĹl'Úvx¿ý{L]M)ØRЭ:²kCà¾@R—¤’õ·®1fì`Œ×ß½ˆ8AĹ®Oôöé­v Ý<”_Œ@GO€Q?"pO  ‡)ý:¼¦ÓÜÍ{óϬKݪƒñýúshì‰çµäó‚S~Œ¨miaÜñ£)q~Ê ìŒ{õÈr.]º”ôôtÄb1]˜7ožžž¬[·Nõ›³³3Û¶m£¤¤„ÒÒÒ'÷ƒ.ßš5kÈÍÍeÆŒ,]º”òòr¦NúÐäïää„¿¿?/^dçÎøûûÓ§OUø˜1chmm%66– &°`Á¶nݪ–FNÎÇÄÅE#‘Tô8û7î;¦L9Eÿþqs{šèèüýW©ÂwíÚEnn.³fÍbܸq¬^½šà`åK ‘‘‘( ôõõU÷ßúÍØØX«ü·nÝJ\\þþþªkðàÁ÷Eöºº<¾üÒ–ýû=ˆîïWþnnóñó{³Ç–ÿ^¶íeÿª§§GBB+W®$""‚U«V!‹ WÝ víÝ»—'N¨ù Mýï¦M›HLLdÙ²e„‡‡cmmÝí²t–ÿ’%KX¼x1¼õÖ[ˆÅb‚‚‚´.Ÿƒƒb±˜àà`|||ðññ¡ÿþ÷E>mêG“|;wîäèÑ£„††2mÚ4²²²xå•WTáû÷ïçØ±c„‡‡óÜsÏ!‰:ü©6ã«?‚&ûÒ4þÑ$ßðððPéÓÏÏ+VPVVÆœ9sîKýiS¿ÚÖσO@3ÚÔßýðaee¥òiÇgóæÍªÿŒŒüñÇDGGwøæ‡!ý»ñÿÝa÷Ò¿ <~¨-p÷SNPûþÓ·Ýù}QÄðφSz°i¥ÏÕžäü=G«pMhН£¯C[]mõmèèê²8ëQÖ X<@¨ÅnÂÔÍ”úìzjRj¨Œ¯¤©  =S½ßŒÅP—àýÁ4]k"í¥´nOÿ:ú:ønòeøgÃÑ3Qo*l¢ájyÈšeHK¥íÚP7<È}'…\¡úÝû]o†ýg––ôöîý{Œì´ïý#F¼§vOmm-iiiªë÷Á¶³ ¥_¿H¼¼–ñÔS¥8:NÖ:ÿ±c÷3mÚ/8;OÇÍm>ööa]²!‘HÄ'Ÿ|ÂØ±cUmîܹ÷-ÿY³Ò Úˆ]žž/ñÔSe8;O×:¾¥¥'ÆÆ6èéÿj‹ž˜›T“oÛ¶mŒ;–×_‰D¢²ßî(ÿ€³yòÉ"\]ŸÂÖ6{û0lmCµn³ÿyÔý«L&#,,Œ 6pêÔ)Ö¯_OuuµÚkrr²êzå•W¨¯¯ç‰'ž ­­M«þ÷øñãŒ1‚Þ½{³|ùr&MšD}}ý}üç?ÿáÓO?åÌ™3äääÐÔÔDMMÖåsqq¡¶¶–ââb²³³ÉÌ̤¸¸ø¾È§Mýh’ÏÓÓ“ôôt9rä999˜™™àîîNXXúÓŸ8}ú4Ÿ}ö«V­âí·ßîòøê¢É¾4î$ßí˱cÇÚ…_½z•¬¬,._¾Lcc#EEE÷¥þ4…kS?R>;£MýÝkÿx'ª««ÉÌÌ$33“ÆÆF*++UÿK¥Ê9œÙ³gSTTÄSO=Ehh(aaa„††ªÒ°··gÒ¤I >œ¹sçRPPÀÒ¥¿_ÓÓÓÙ¸q#aaa¼ôÒK”••1}úoãŸ;vpèÐ!FÍðáÙ7ožê‚¹sçrþüy†NJJ }ô³fÍ¢¸¸+++ ñôôÄÛÛ›Ó§Oãïß~üq§ô5…k“þÎ;9þ<Ó¦Mã¹çž£°°°Kòß­ÿ¿[û»×þ]àñC}vS§ó[ª”­†} ñzÛ ]C]jSk‘5ÉKåÃuî|䦸¯y(Z“Œ¤'“pYìBÁ–J–âýž·Æô4S°µ·ån8>éHŸQ}0ó4ãúÎëªz ÚÄ…˜ H+¤ôrêÕ­éßÂm…®Ë\9?ç†J?PÙBöªlä-r,†Y g¢‡®‘.r©¼GÙGMr N º½ šéàbf†£‰)ú:ºøYYS Å ÓÚHù–{…DÂÊä$¤29#¬ûbª¯±ž’_'Ò_âË /o&ÿü# m­íÒhjŽ•¡–†Hd2Æ÷ëOZÕMµ{Þòõã|E'ÊJÔ~ÿòZ>[ƒBù»ßp¾¾~¯ ¯u˜GgxYX¢¯«KÊïòxüHª¬ày÷Á=¦üðÃ{.Ÿ¶õÓ™|ëÖ­cÍš5¼øâ‹Œ7???6mÚ(>bbb8zô(VVVÔÕÕ©v*te|u·td_ÚŒî$ßíiÿío#((¨ÃÅ777úô郕•ÍÍÍL:• .Ü×öÕQ¸¦úéIò ´GSýÝOÿq7H¥RöìÙÓa˜±±1óçÏ'00¶¶6$ cÇŽå“O>QÝ“––FBB 8;;óÔSOqèrüóé§Ÿ²k×.>øàvíÚÅ®]»Ôl¸®®Ž””.^¼ˆH$âàÁƒüë_ÿÂÕÕ•äädrrrÔNdø=šÒ¿SxKKËÓŸ4i“&MÂÑѹ\9~¿|ù2?üð_ýµêEº;Éß]þãØßýôïúÚÞh9Ì}S}Ê–ã0G¹m°üX9V#¬Ð5ÒÕ~;¢½"ŒíéÙWëôA¹;#cyAû‚H^”Œÿ¿ý)9X‚h¯çgœ…Ú¼ L\LðÙàÙ‰gh­nE´O„ÍX¼ßóæ—'~A.•“²8=S=LLM0¶SN¨÷rìE[]2Éoo¢;Æ8")“P_©uú·ÈßœOÝå:‚#>.&ocžZ9›®7!Ki¸Ò€®¡.®r%s¾*¼·ooì§ÛsvÊÙöè©5ª¼tô”»€äR9™+3µÒQCnŠ6þT_¨¾guÑ‘þna:ЧN$E'©ýndc¤ªƒó³Ï«då⤶ú»×tVþšÔÚÛ°›lGÉå‰Ý$;ª/V«·z’}Xø[P—Y×íúihk%³¦šÌšjzãâÊ·7 ÕîYèêNis?—þ¶Àt±ª’†¶Vf89³¯P9è˜æèÄùÊ ÕâÀƬKdTWqtÜDŽ‹xç’úNÌkõ”77“S[ƒ¡ž+¼¼Ùp9CîoeÍg":Ü®ìoV2òè÷èéèðqð($rË“Îj%{vm mr9}úr®R,8åǘáÖ}I¯î9 R©”©S§bnn޹¹¹êÍ:ª««5†7770bÄæÏŸ¯¯¯PÉ]àܹsÔ××ÍçŸ@TT ÷eòõ^çGAAÛ·oçé§Ÿîô¾ÖÖ ÌÕ~¯¯ÏG&“пÿøN¸HOOç…^ÀÏÏœœ|}}}Ó>}¬­¨¬TN8ÙÚ† ‘ˆU‹[¿ÇÚzRi5RiEE?àí½ ‹ÁªüÝÝÐÚÚHiéIµIÂ#GŽpäÈ–-[Æ¡C‡8p ……Ê>ÎÇLJ´4eŸäïïOyy9‰„ªª4@ÁéÓÏPRr¢SýÜÚÁ¥ r¹]]­î­©¹ŒŽŽ>öö£)+Kèô¾¶6åÎc}}-ò—£§§÷ÀòW(äèèèuÉN[[00è­Õ½Ü¼y“ÊÊJÌ̺¿ü]i»ÿyÔýë­ö~èÐ!bbbðòêøt„Áƒ³lÙ2µ7÷µéŸ‹ŠŠ¨¯¯g„ ª \SSSïËøàVÿ___Ojj*©©©XZZòì³Ï²gÏž.•¯µµ•Ÿ~ú‰/¿ü’©S§òá‡Þsù´­ŸÎä4hŸþ9^^^ܼy“íÛ·3mÚ4vî܉‡‡òåå“'Oâé©<±cÊ”)|öÙg,\¸°Kú½[:³/Mh#(€’““IJJâàÁƒ¼ù¦úq¯ùùù”””™™‰±±1o½õV·}§USýi ¿SýôùîÌêï~ø{‰••IIIÌ™3‡E‹©l±3?ÕÑøëìÙ³ª¶ª¯¯Oll,‰„gžyF-Þ’%K:Ÿ¿iPŽ?ÌÍÛ?4¥¯Mþ¥Ÿ““£z¡àÖ‚qHHb±Xµ¸u7ãOmýÿ-ýˆD"Ž9¢µýÝ/ÿ.ðx¡¶òTöCñAñd¬È@!WÏŧ/*'|õuý1”úìz"Hœ˜ˆÙ 3ü¶ùi®z€©o£øëbJ¿S?ÃXSüÊøJrÖå0ò»‘è™èáþš;Y«²¨K¯£t¡&ï’¦Â&’%ã³Á‡ð_ÂõÓ(lÆÚ47IUoM…Mª«¹DépšEÍj‹[úæúôîO¿™ýº”þí4^mäÌÄ345žN/§^Ê]‚Õ-„ !âl#¿‰©›)çfS‹ë¹ÚmJȉ IDAT“kÛ®©vª BßDÈá"#9Bkm+¹ërµÖ‘¼ENÖê,|7ùþ¡löÓì‰LŠdèæ¡èèê™ɈXõ#ä:Óß-l'ÚRŸ]OÓuõ#Ü ûª-(d m ­ µÖßÝ |•_Ѧ qb"æ^æ„Ňúc( WH_–Þãì£ox_œŸu&{uv·éNOG‡F“0qÓçðÓ¸ÉTK¥ÌOˆS»ÏÜÀ€ù݈rVÃ¥M.'ìØ ±°ä”™$LœFNm-Ï'žn—וºZÂŽýÀõÆ’§Îb€©R™Œ*©”ã§1}?ŸŒ‡yo&?¦÷íaü+û27¥í~\=tq¦’>m6ñ¦RÓÒÂê´dí' ä2^O¹ÀÇ#G1ÀÔLpÊ)cìûñ¢Ç`^ONê1eª©©!//Ou]¿®Üy\XXHss³Æð[lÞ¼™wÞy§Ã3Ôcbb‹ÅìÝ»===Äb1qqq=F²|­­­xyyáççǵk×ÈÊÊ"33“¨¨¨‡&ÿ;v P(ˆˆˆà7Þ@¡Pð /¨ÂÝÜÜ8xð éééH¥RÊËËÙ½{7&&&·=”¶pòdAA‰‰1vì~¥ÿokbß¾H¥5LžǼy×™;71cöÊïYåææâëëKll,¯¿þ:«V­¢¢¢ ùê+ÜÝ2o^!QQÙ(2ðQ“ÁÃãæÌÉ"::“~8 <â°ª*¼:ô¯Ì›w¨¨\ÌÌ\øæ›AÈdRŒŒŒøè£¸ví---”––ÀðáÃUíÄÍÍwß}—ªª*Š‹‹ñòòÂÝÝý×ûìÝë„­m³g_"&FÄŒ80Z­|3gÎD¡P¨]·ªï†††|õÕ§2wnO>Y„­m••êý›L&áÔ©„„lùµ~¾éû{Ðùÿ6‘òoJJŽOtt¾Ê¾nñÒK/Q^^Nmm-ŽŽŽØÙÙÝ×òwÖ>vÿó¨ûWP±dddÄ·ß~‹X,F,·;btöìÙ¤¥¥©&aµíŸ ¾¾¾xyyQPP@^^r¹œÈÈÈû2>ÐÓÓcûöídeeQRRBrr2•••ªohS¾>ø€K—.!‰HLL¤ºººKñïeýh’ïÊ•+Œ7Ž]»v!‰ÈÉÉaúôé„„„¨Ò¿÷îÝ´´´`ggǹsç´ÒowÑ™}iÿh#ß-²³³UõtãÆ \]]inn¦²²’ÔÔTJJJHIIÁÓÓ“€€€ûÖ¾4…ß©~z‚|wæNõw?üǽ¤ººš1cÆðꫯRXXHQQ3fÌÐêt€[¬_¿žŒŒ Š‹‹ÉÈÈ ªªŠ¿üå/]*GKK QQQlܸ‘HÄþýûµN_›ü;K¿°°.\Haa!ÙÙÙÈd2|||îkÿlaaÁâÅ‹;<Ƶ'øwÇ ~=/"2)RÐÆ#L|Pü#/£ÓB'úÍì×á¢YwbÜϘaÿF}N½Ö»¿&|7ùRŸUOáöBÁ>nCßTŸáŸ §åf Ë3·Ê+ò¼û ¢œ2õä÷4‡^&|1:’˵ÕZïþz˜Ø<ŠË5Õ|”›%tL·a¦oÀž°1Ü”JxñÜ/´Ê­öõòË/³`Á‚'=z:³f¥séÒòów Êh‡H$bíÚµìØ±CP†ÀCKll,iiilذAO@@°O‡ aë1áqXàx<ÐT ÐS9ÒéÑ|ÿûã¶Â­ÛËiÜϘC! ygÈ#Y¾›|qyÑE°ßaÐÛ€‘ßdè–¡è<|®óä„)ÌÐ}ïüï¨pVzíör:ô2áÄø)l ~$Û×¶àQ¼<øÑôwƒ…¡!?ŸÌöÑèöüöuðàAáû÷·oö]ÉìÙ—06¶”ÑEfÍJÇÍmA·¥7räÂÂvл·óç‹UWŸ>þ÷\ž‘¿““ãÇï±åÚ‡ÀÝËÊ•+ùº•ôôôîäìSàÑ`åÊ•\ºt ›‡2}G µY$I‰„ì5Ùœ 9Å©‘§ÚÝœ¿%Ÿ3ãÎPq¢ÑñÁñTÄUh®‰;Å¿òÞÊŽ”!Ú+"K>¹ÿÈåú§×…Z¼Ï8>åHÈá"“"1²5@GW‡À½¸¼è‚U°®/»™‰U•*ž±ƒ1^÷"âlç"º”§‰‹‰*=sOsœŸu&â\¶m;¼ß~Š=¦®¦l)èVÙmÆÚ¸/Ô%©dýMû#Æ´Ñ&zûôV»†nʈ/F £§À¨ŸG¸'P§v: ¿-~HÝmnvcÔÏ£°yÂǧ‰<‰Í˜ß:jï÷¼¾s8–Ã-±kCè¡ x~@±ÖºVÎÍ8‡ø'1£ãFcdcÔ5½˜˜òÞð@2¦Ï!cúœvá ]Ý™?ÐPxysyFÃúXkþ§¡aì Cˆ-O¹¸‘6m6ãú9hw ™9—gDbc‹·¥/z æÒô9LéïÔáý3ànÞ›f]êVÛ߯?‡ÆN`Ñ™x^K>/8ÛLjږÆ?Ê‘bç§ÌÀÎXûïêéé‘ÀÊ•+‰ˆˆ`ÕªUˆÅbÂÃÃU÷¨]{÷îåĉèëë°ÿ~Ž;Fxx8Ï=÷"‘Hõ ‰ß3oÞ<<==Y·nê7ggg¶mÛFII ¥¥¥ÆÛ´i‰‰‰,[¶Œððp¬­­µ.߃fÍš5äææ2cÆ –.]Jyy9S§Nò×'''üýý¹xñ";wîÄßߟ>}ú¨ÂÇŒCkk+±±±L˜0 °uëVµ4rr>&..‰¤¢Çµßqã¾cÊ”Sôï?7·§‰Ž.Àß•*<$ä#¦O?‹£ãdìíÃññykkå7¸"##Q(j¶~ë7ccc­òߺu+qqqøûû«®ÁƒßÙëêòøòK[öï÷| º¿_ù/^¼XÍçõ´òßËöñ ýÏ£î_‹ÅãããƒêcóÚôŸšÊ¯Mÿ|7,Y²„Å‹Á[o½…X,&((HëñÉÎ;9zô(¡¡¡L›6¬¬,^yå­ãßbéÒ¥¤§§#‹qppx(äëŽñÓ½ÞIþ»m?ªòøùù±bÅ ÊÊʘ3gN·Û©&ûè(¼+ö÷ åèMíëA>XYY©|þñãÇÙ¼y³ê##£‡FÇü1ÑÑÑ~cùaHÿnü§&´}¾¾Wý—À㇚ç2î§\€°›dÇ¥ÿUŸ¸lÌo¤è‹"‚÷“·>ÓA¦x®ö$çï9ØŒ±Ñ® Mñuôuh«k£­¾ ]R§à¼È™¾}…Z¼Oèê¸'¼ y¤½”FðþßvX(ä .Ä\øm²2µ–~³ûa`i úMRª\@-?VŽï&ßNóÑÑ×Ágƒ–¤¿œŽ¬I¦ k*l¢¥ªCkCdÍ2¤¥ÒËéñ†Ùÿ/…\¡úÝû]o ­ ¹öÉ5ä9&L¨N®FZ.ÕZþ!o!cy’RI—t§~4NdÖ©þöÝäK[c+2è娋¶ú6*ã+qˆrÀÜËœ«¯2p™úŽmôw/ìÃÔͧ…Nœ:Çë4^i$g]žk~ü\Z¢îôuuù00„>††,>›@c[›*¬ ¡ž›R)ÖFF4ÉÚ(inj——‘®«‡úóFòdŠßô÷ÏÁس%'‹f™ W3sÎWŠ)Óò#¡Fºzl bɹ_(njîcÊ·7 q41a}@Ïœ9¥U™LFXX˜êÿ³gϲpáBµ äädÕß±±±Ô××€»»;aaasíÚ5NŸ>B¡àí·ßæÈ‘#êvjdÄúõëùÓŸþ„Lö›ï)**bÙ²e|óÍ7ÄÆÆ¶+ãñãÇ166¦wïÞ,_¾œ¨}¤ûNå{ÐxzzòòË/Ìûï¿ÏåË—Y±b[¶láðáÃBþZPTTDQQ ˆÅbÒÒÒÔ&Nž<ÉèÑ£9sæŒê÷Ý»•ß»ÒÕ5¤woW ,?þÇŽM ªJ½ïññyŸWÈÍÝAYÙituõÑÕ5 ¨HY¾eË–ñÎ;ïàë닳³3'Nœ €¬,å‹:aa;±´ô&-mÆÆ6 ¶†ŒŒwÉÉùPî€*.þ‘7amíÇС%%e W®|Ê A/`f6€ƒÛySZϬY©áæÍ {ÓÐpƒÒÒ“ÈdRÊÊNw©FþssWÒÓÿ(x›ÒÒx.^üëoãªÚZ5½þ;»PššDXZÁß5 Ï#Õ*ÿ±c÷cbbGFÆû˜coÆÍ›)Z—_$qøðaöíÛ‡ŸŸ7näÉ'Ÿä›o¾¹/ùÏš•NIÉq®_ÿ++o† [Ë™3/rãÆ!­âûøø`kkK¯^½T/—H$\½zU%ß÷ßÏ7ß|È#ø¿ÿû?^{í5Õ"íÝ–À€ÙŒù!.¼NCÃutuõËeˆÅ‰Zµ‡Ùÿ<êþÀÅÅ…ÚÚZŠ‹‹)--Uë[5õŸÚ”_Sÿ|·üç?ÿQޝõõ±¶¶¦©©‰šš­Ç'žžžœ>}šÄÄDtuuyþùç133Ó:¾‘‘§NâÍ7ßdÖ¬Yœ?þ¡‘¯;ÆO÷r|¨Iþ®´þûßÿbmmÍܹsihhP…]½z•ŠŠ lllhll¤¨¨¨ÛêO“}Ü)\ý=hù4?ïÔ¾äóGuu5ÕÕÕʹàÆF*++ÉÌTÿ¾ýìÙ³ùðÃyýõ×¹~ý:zzzÈd2°··Çßß±XŒ««+ëׯçý÷ßç“O”ã×ôôtŽ?Îwß}‡··7k×®åÅ_äÐ!åøgÇŽØÙÙñþûïÓÔÔ„»»;gΜ¡¸¸˜¹sç²råJþô§?±cÇΞ=ËñãÇùè£ðññ¡±±WWW,,,8tè&Lh7½SúšÂ 5¦¿sçN¼½½Y·n666¬Y³†wß}WkùïÖÞ mž¯ïuÿ%ðø¡¾4¯Óù-UʉVþ†x½í…®¡.µ©µÈšdÈ¥ráºFw>rHS|×<” ­IFÒ“I¸,v¡`K¥Kñ~Ï[cúw‡a_C‚öq!æÒ )½œ:»Þy‘3NO;‘ò\ ÍE·Mn+4çã¶Â ×e®œŸsž¶Æ¶vá&L0°4@ßB¹DNß1}©Í¨U»Çc¥5k¨}üÖ`J–Pz ´Ã<:Ãl°:ú:Ô¦×Þ•.;Õ–¸-wÃÐÚäE¿ Hz9÷BÞ,çÚ'×þ6˜Æ¼F*NV0xÕ`ôÍô»¤¿{a†} •í¼²…ìUÙÈ[äX ³@ÏD]#]äR9[ p[î†ã“ŽôÕ3O3®ï¼Þ#í£&¹§…N]Ò‘BÓ7ÀÅÌ GSôutñ³²¦ ¾^c¼k õ,=÷ _†Ebi¨|ã©¡µ•J©úBìkC|YáåÍ䟤¡­µ]:Mͱ24ÂÒÀ‰LÆø~ýI«º©vÏ[¾~œ¯¨àD™úÂÙ—×òÙÊßý†óõõk|Ux­Ã<:ÃËÂ}]]R~—ŸÀãGReÏ»ÿ±ÝþóŸY¶l“'O¦  ý͵k×bkk«vÔÖÕ«W‰‰‰áèÑ£XY)wÕÖÕÕuø¦Ü»ï¾KBBGªOŒ+·pgggüüü UM/_¾œ3gΨ±|š[Gb”——³téR¤R)!!!˜™™allŒD"ò¿ ÜÜ”G妦¦v.—·PS“ƒ‘QŸí¬|:ô¯>Fmmn‡÷lÛ¶ï¿ÿž¼¼<***èÝ»7­­Jÿìè8 GÇIìÝëˆB!Wöq5—?þ®]û©´ €ªª ÊË(/O ¢âãÇâúõoéÕËŽææ2µüš›Ë½zÙpêÔB@‡'2d9ffNÄÇ?EMMŽæ1“ó œ§#—·þ™ê÷Aƒž'-mmmXXXàïÿÛ"[AAuu¿½T^žHii<¥¥ñ˜™ ÄÍíi­¸'cgž=ýU=¹M¦]ªç .pòäINž<ÉÀyî¹ç´Zàê®üoÞLSÕŸ™™3®®Oi½À•™™‰X,¦¹¹¹ÝäÓ-RRRTò%&&’ÀÞ½{16ì–òËåR öt¹}<ìþçQ÷‰xxx```ÀO<ÁÖ­[Ùºu+~ø¡ÆþS›òß©î.ÌÍÍqwwÇÙÙ}}}¸råŠVã“uëÖ±fÍ^|ñEƇŸŸ›6mÒj|cggGBBááᔕ•1pàÀ‡N¾î?Ý‹ñ¡&ùµm?k×®åoûAAAÔwð\çææFŸ>}°²²¢¹¹™©S§ráÂ…»®7MöÑû¹“þ”|ZÌ?héÿzâóÇ-¤R){öìé0ÌØØ˜ùóçH[[‰„±cǪxÒÒÒHHH !!gggžzê)ÕϧŸ~Ê®]»øàƒصk»víR³áºº:RRR¸xñ""‘ˆƒò¯ý WWW’““ÉÉÉQ;‘á÷hJÿNá---wLÒ¤ILš4 GGGäråøýòåËüðÃ|ýõ×TUUi”¿»ügGhz¾¾_ý—Àã…Ö{O-‡Y¢oªOùÑræ(· –+Çj„ºFºÃoG´W„±½1}#ûj>(wgd,Ï h_É‹’ñÿ·?%KíáüŒ³P›÷¹TNÊâôLõ015ÁØNylL/Ç^´Õµ!“È0÷2gØöad¬ÈàÌÄ3(ŸüÍùÔ]®#ø@0âãbò6æ©…7]oB*–Òp¥]C]\ÿäJþæ|UxoßÞØO·ç씳íÒ®I­á—'~@GOßM¾È¥r2WfjU¶†Üm ,ü-¨¾PÝõ‡-õã㈤LBe|e»0Ó¦8-p"):Iíw##dåçgŸWÉÊÅ'mõw¯ì£&µ†¶Æ6ì&ÛQr@¹0b7ÉŽê‹ÕÈ¥rL\LðÙàÙ‰gh­nE´O„ÍX¼ßóVÕYO²  µuÝEC[+™5ÕdÖTÓÛЀW¾½Q¨vÏBWwJ››ÚíÌúE\Îèc?0®Ÿÿ áå¤Dµ{6f]"£ºŠ£ã&r¬XÄ;—ÔߺÖXOys39µ5êé±ÂË› —3TáþVÖÌqv!ò§öoõ^¼YÉÈ£ßÊ]hB"—±<é¬V²g×ÖÐ&—Ч/ç*Å‚Ó}ŒnÝ—ôê®-túûûsèÐ!bbbðòòêðžÁƒ³lÙ2BCCÛ…cáÂ…j÷Œ1‚ùóçãëëÛ¥²Q__Ï„ T4¦¦¦466j]¾ɹs稯¯'::šÏ?ÿ€¨¨(îËä磞\\lß¾§Ÿ~ºÓûZ[•oC˜«ý^_ŸL&¡ÿñ.p988žžÎ /¼€ŸŸ999øúúþú&z::úX[PY©œp²µ A"«·~µõ0¤Òj¤Ò*ŠŠ~ÀÛ{ƒUù»»/ µµ‘ÒÒ“·O³PRò3%%?ãáñ±|÷]……Ê>ÎÇÇGõfª¿¿?åååH$’_wã(8}úJJNtªM;¸ÔÆ,r)ººÚí ¯©¹ŒŽŽ>öö£)+Kèô¾¶6åÎc}}-ò—£§§÷ÀòW(äèèèuÉNëêê°´´ÔêÞÀÀ@nÞ¼Iee%ffÝ_þ®´‡Ýÿ<êþU½[ùé§ŸøòË/™:u*~ø¡Æþ³§”¿¾¾žÔÔTRSS±´´äÙgŸUMÈÞi|2hÐ >ÿüs¼¼¼¸yó&Û·ogÚ´iìܹñ¥R)S§NÅÜÜsssÕÑŽ...TWWÓÜÜÜãåëŽñÓ½ÞI~míoíÚµ$''“””ÄÁƒyóÍ7Õç?òó)))!33cccÞzë­nùΫ&ûÐÆ~´Ñ߃’O {è©Ïš°²²"))‰9sæ°hÑ"•-vf§¿Îž=«òEúúúÄÆÆ"‘Hxæ™gÔâ-Y²¤óù›_w+š›·hJ_›ü;K?''Gµà~kÁ8$$±X¬Zܺ›ñ§¶þó–~D"Q»“Oîô|}¿ú/Ç µ•§²ʈŠ'cE ¹‚ø x.>}Q9᫯Cè¡Ôgד™@âÄDÌ™á·ÍO«pÕL}Å_Súú°šâWÆW’³.‡‘ßDÏD÷×ÜÉZ•E]zý£û 5yi«o£©°Iu5—(N³¨Yµ°âý¾7º†ºøìOdR$‘I‘Œ:þÛQlöÓì‰LŠdèæ¡èèê™ɈØíòj¼ÚÈ™‰gh.j&!S hS`hm¨µþî•}(Ú$NLÄÜËœ°ø0B ¥áJéËÒåâuò¢d|6øþK8£~…ÍX’æ&õ8ûèÞçgÉ^Ý%ÍrÀåQ|2r4z::\žÅÈq€rAèƒÁ$LœFÆô9ü4n2ÕR)óâÔÒ070`þ@7¢œÛ¿ár+þ¶àPZär|¾ßOòÍö‹¤Wêj ;ö×Hž:‹¦fHe2ª¤RNŒŸBÆô9ü<~2æ½™pü˜ZÜ·‡ð¯ìËÜ”¶?úqõÐaÄM˜Jú´ÙÄO˜JMK «Ó’µ“Ëx=åÅS3Áé>¦Œ±ïÇ‹ƒy=9©Kñvî܉‘‘ß~û-b±±XLn®zû={6iiiªI’ÛÙ¾};YYYìÞ½›––ìììÚ³yófÞyçwvÅÄÄ ‹Ù»w/zzzˆÅbâââ~LVàëë‹——äåå!—ˉŒŒÔº|’ÖÖV¼¼¼ðóóãÚµkdee‘™™ITT”¿–ìØ±…BADDo¼ñ …‚^xAîææÆÁƒIOOG*•R^^ÎîÝ»111¹í¡´…“'£ ÚHLŒˆ±c÷+ûß¶&öí€TZÃäÉqÌ›w¹só3f üžUnn.¾¾¾ÄÆÆòú믳jÕ****ppp ¡¡¯¾rÁÝ}!óæ•B!ãÀ5<<žaΜ,¢£ó11éÇC¨ªJçÀo†ý+óæ]'**33¾ùf2™]]CßgæÌdbbŠ™3'“>}ü8zô qssãÝwߥªªŠââb¼¼¼pwwÿõÁþ{÷:akÂìÙ—ˆ‰1cÆŒV+ßÌ™3Q(j×­‡ê»¡¡á_}5Gǩ̛ǓOakBe¥zÿ&“I8uj!![~­ŸoºÅþtþ·Ø´i‡¦¶¶–ÚÚZŽS¼ôÒK”——S[[‹££#vvv÷µüµ‡Ýÿ<êþàƒ>àÒ¥KˆD"©®®V}£CSÿ©MùïÔ?ß-zzzªñCII ÉÉÉTVVª}cäNã“+W®0nÜ8víÚ…H$"''‡éÓ§¢UüššòòòT×õë×U~µ;&ï‡|Ý1~ºWãCMòw¥ýdgg«ä¸qã®®®477SYYIjj*%%%¤¤¤àééI@@@·Ø§&ûÐÆ~´Ñ߃’O@3Úø¿žúü¡‰êêjÆŒ믾Jaa!EEE̘1£Óæ±~ýz222(..&##ƒªª*þò—¿t©---DEE±qãFD"û÷ï×:}mòï,ýÂÂB\\\X¸p!………dgg#“ÉTGIwÚ´ /^Ì‚ ºô|}¯û/Ç~=/"2)RÐÆ#L|Pü#/£ÓB'úÍì×á¢HwbÜϘaÿF}N½Ö»¿&|7ùRŸUOáöBÁ>nCßTŸáŸ §åf Ë3·Ê+ò¼û ¢œ2õä÷4‡^&|1:’˵ÕZïþz˜Ø<ŠË5Õ|”›%tL·a¦oÀž°1Ü”JxñÜ/´Ê{Vûzùå—Y°`Ú¤Œ€Àã¬Yé\º´üüÝ‚2Ú!‰X»v-;vì”!ðÐKZZ6läìS@@@@à!CXàzLx¸tôB‡tz4ßÁÿßþ¸­pëör÷3&äPCÞòHêÏw“/./ºöñ; z0òû‘ Ý2]ƒ‡Ïužœ0…¹ºïãÿÎJï¡Ý^N‡^&œ?…Á¤ŸÛ<Š—A@ CC~?™í!£1Ð}ø‡&¾/ Эøú®döìKÛÊè"³f¥ãæ¶ ÛÒ9r aa;èÝÛƒùóŪ«Oÿ{.σÈßĤ?öö=¶üBû¸[bccY¹r¥ Ÿ@·’žžÞáÑ]‚|‚} <¬\¹’K—.accóP¦/ ð(¡6‹$)‘½&›S!§85òT»› x‹ IDATó·äsfÜ*NT Ú#">8žŠ¸ ­Ã5q§øWÞ»BÙ‘2D{EäoÉ ÷¹\ÿôºP‹÷ cc¼þîEÄÙ"εÈuû³£~…Í68>åHäùHlÆü戽ßóføÎáX·Äf¬ ¡?†2àùÚ=X»˜™‰Uæžæ8?ëLĹl'Úvx¿ý{L]M)ØRЭ:°kCà¾@R—¤’õ·®1ÖÛ§·Ú5tóPF|1=µûŸr$äp‘I‘Ùu9~wèïA؇&ù´}´ÖµrnÆ9Ä?‰7#£{ÒιºsrÂ.ψ®—ößz{uˆ/‰“¦3ÑÁ‘E®îdΈb\?í¾O8ÐÌœË3¢±±ÅÛÒŠ=siú¦ôwêðþ™Np7ïÍ?³.u«ìãûõçÐØ ,:ÏkÉç§ûQÛÒ¸ãG9R,âü”Ø÷º¯ù¨]{÷îåĉèëëààà€X,&88|||TÃý=óæÍÃÓÓ“uëÖµ [ºt)éééˆÅbT¿ïß¿ŸcÇŽÎsÏ=‡H$RûÆÅƒfÍš5äææ2cÆ –.]Jyy9S§Nò×'''üýý¹xñ";wîÄßߟ>}ú¨ÂÇŒCkk+±±±L˜0 °uëVµ4rr>&..‰¤¢Çµßqã¾cÊ”Sôï?7·§‰Ž.Àß•*<$ä#¦O?‹£ãdìíÃññykëá€òa …BÕÖnÿÍØØX«ü·nÝJ\\þþþªkðàÁ÷Eöºº<¾üÒ–ýû=ˆîïWþnnóñó{³Ç–ÿ^¶íuÿª©ÿÓÔ?kŠ¿dÉ/^LDDo½õb±˜   n+¿¦ôÙ¶m%%%”––¶‹§p===X¹r%¬Zµ ±XLxx¸êž;wrôèQBCC™6mYYY¼òÊ+Ý"›6ùƒò}‰‰‰,[¶Œððp¬­­µŽ¯I?šÆO÷züw/íËÃÃC¥???V¬XAYYsæÌéövÖ‘þî¶~{’|Ì¿ÞMýÞ-VVVªgªãdzyófÕÿFFFŽ?þøc¢££;üFóÃþÝúÿ»µ¿{éß?ôoÿǸŸr‚Ún’—þW}â²1¿‘¢/ŠÞLÞú!)U.€–+Çw“¯Z˜©›)N 8u×=h¼ÒHκ<×xª)MÝL©Nª¦&¥]úG÷GÏT¯]>:ú:ølðÁÀÒ€ô—Ó‘5ÉTaM…M´Tµ`hmˆ¬Y†´TÚ.¾®¡.oxýÿ²QȪ߽ßõÆÐÚkŸ\C.‘c2À„êäj¤åR­ä×5ÔeÈÛCÈXž¤TÒõ‡øÌ:Õß¾›|ikl#cE†Zú{ÉÛGÚKiïîRüîÒ߃²Mò÷û(;TF/‡^x½íEÚÒ´nÓŸ‘®ߎÇ;—ÒxöÌiŽ>1Që¸æ½yÞ}“OüÈê¡þäÔÖ²*õ"ÿ6‚ŸK‹Õ¾®.†ÐÇÐÅghlkS…4ÔsS*ÅÚȈ&Y%ÍM–sõÐÿÏÞy‡Eu¥ÿÃлˆ) ‚•¢Qc‰ Ý1jÔïê~7Ñì&æ'û5YWc6EcÖHÌÆ•„Øb4‰&FD ¨(ˆ•&CGz`f~L2:aˆXÀûyžû<0§¾ç¼ç½çž÷žs½y-á2RùÝöû×(?,ôôØ™‘F£TŠ£‘1—ÊK)Vó#¡º"MvŒôeåÅŸ)hh îSÊ×·s±50`ûH_þ{î‘•› ü;""‚ÚÚZBCC•¿988P]]MAAEEEH¥ÒöõXW—íÛ·³zõj•8ºººœ;wŽ¿ýíoÌž=›K—î:p ÀÏÏœœΟ?\.ç­·Þâûï¿ì}âêêÊÚµkñóócÛ¶m\¿~õë׳sçN¾ûî;¡|5ÈÏÏ'??Ÿºº:JKKIJJRYÜ‹ŠŠbܸqÄÆÆ*?p@ñ½+‘HG´µM™4é§NM¦¢BõÞãáñ<<þBff8ÅÅ牴‰´ÉÏWÔoÍš5¼ýöÛxzzbooÏ™3g9r$iiŠuöѧ;II[ÐÓ³`øðͤ¤l%#c ØUPð·oŸÀÜÜ‹aÃþJbâfnÜø”Áƒ_ÂÈh ÇŽÝÝySTÍìÙWÉÏÿž;wÑÑ1¡®î6EEQH¥Š‹Ïw©ÆûccG’“ÿÈ9ò-ŠŠ¢¹rå¯Ê8ÕÕÕ*íú[¬¬ÆÐÐ ¦OŸ¡x{¿ILÌ‹ˆÅ'Õ*„#X‘’² mmc¬­¸s'Qíú‹Åb¾ûî;¾úê+¼¼¼Ø±c .äðáäüÙ³“),hýœÃèÑrùòFêêò‰4‘ɤ”–Æ©5>z²ýéíöUû_G÷guÒòÉ'Šù¯–æææ444PUUÕm2t–~~>kÖ¬áðáÃDDD´{¸_¸T*% @ùÿ… Xºt©Ê´««+çÏŸ'..‘HÄ‹/¾ˆ‘‘Q·È¦Nù§OŸFOOÖ­[ÇÑ£G¹xñ¢Úé;kŸŽæO{þ×ú¥­­ÍþóÌÍÍ™7ouuuʰ[·nQVV†……õõõäççwßóeí÷ ýû$È'ð`öUÝþ}TVVRYY©X ®¯§¼¼œÔTÕïÛÏ™3‡?ü7’——‡¦¦&R©”¸¸8¬­­ñöö¦´´GGG¶oßζmÛØ³G1MNNæôéÓ|óÍ7¸»»ÆŠ+8qB1ÿ ÇÊÊŠmÛ¶ÑÐЀ³³3±±±0oÞ<6lØÀêÕ« çÂ… œ>}š>úêëëqttÄÔÔ”'N0yòä6óÐŽòï,\GG§Óü÷íÛ‡»»;[¶lÁ‚͛7³uëVµåPûÿ ú÷°í»ÀÓ‡–êÊñý#6W4 ÓO··Ü鈨¾Z´AŠL"ë4\¤Ûñ‘C¥wyÕE1ФÄ/ŒÇa¹Ù;³):V„û?Ý;Í_ ß?H§¯Ž¢Ë›IߔެY†épS4 4éŠIddïÊÆi¶ mé;¶/F®FäíSÝç´Þ Ç5Ž\š{‰ÖúÖ6å 4@»6Z¦ZÈšdôßê”jÕÅþ .T]©¢ü\¹Êï ðØáÁׇPx¬¢£Eí–q?Œ†¡¡¥Aurõ5£Ó:'tÌuHøÃÝ µN?|¿òårèe$eôíô»”¾;Ûïq臖±–Zò?)úQ•P…ÝR»nZzz?‰YgOSÚÔ„½a×LÍuo¹—55±!!‰TÆ(ó~ji¡§©IÓ/ í¯õd½›;SúºÖ–6ù 24ÆLG—>Ú:4I¥Lê?€¤Š;*q^÷ôâRYgŠ U~ÿ"'‹]¾cø»×ååp07§Ý2i´D"SžÀÓG|y/:y,e‡……aiiɤI“T~‹‹ÃÅÅmmmžyævíÚÅ®]»øðÃUâmݺ•˜˜Nžxð‹$%m¡µµSSS¼½ï:Ù²³³©©¹ûbPIIEEÑEcd4'§çÕrpÙÚNÅÊÊŸ/¿ œèXXø£­mØ¥~¾|ù2QQQDEE1hÐ –-[¦–ƒ«»Ê¿s'IÙFFö8:.RÛÁUU•ASSRiÓ}û,11Q)_\\111DFF¢§çÓ-õ—É$dgÙåñÑÓíOo·ï]¹ÿµwV7½±±1ÎÎÎØÛÛ£¥¥ÅÈ‘#¹qãF·ÉÑQþr¹¼ãǧNÂåOúkÖ¬aêÔ©dgß=bË–-lÞ¼™+V0qâD¼¼¼xï½÷º½¯Ú+ßÞÞ///ÆŒí[·X·n±±±øøø¨UÿŽäïlþô°çÝ¥_aaa¼ñÆøúúR[[Ûî< oß¾˜™™ÑØØÈôéÓ¹|ùòËÔ•ö{þ}\ò <˜}íÊø}œH$¾üòËvÃôôôX¼x1>>>´¶¶ÒÔÔÄ„ ”€¤¤$bbbˆ‰‰ÁÞÞžE‹)<Ÿ~ú)û÷ïçÝwßeÿþýìß¿_E‡kjjHLLäÊ•+ˆÅbŽ;Æûï¿££# ddd¨œÈð[:Ë¿£ðæææóŸ2e S¦LÁÖÖ™L1¿~ý:ß~û-‡¢¢¢¢SùÄþ?¨þ=Jû.ðô ¶W¨Ïð>hjQr²mSm4õ5)9U‚Ù(3Dº¢NÃïE)¦<º¼KùƒbwÆåÐËø~åKþ|¼ÿí±»1âH±Ð“™ª«U´Ö·b5ÕŠ–ê¤R¬¦XQy¥™D†ƒïxøR"â¯Ä¤¬K!sK&îÿtWÉ'ëƒ,’Ö&áwÔOéÔ¼—†¼ênÔQò} 9{r°žf­nâi‚õ k2ßÎl·Ž??ó3—B.!þBÌЭCñxÇCmë2ë·Ê1õ6ýÝíd8È»%v¤¿™®ú€.‘‘¸<MCM  зQ8xômõÑÔÓì4}wµßãÒuåRôÃÔÛTeGÝOܤ2ÇDc¨¥Í #cl  ?öFèiªîr\êèÌÄþª[·¯T”S×ÚÂL;{ªš›i”¶òœ­—ÊË”Î-€i×XÃɉÏò†gÛï\äÔ×’Q]Åqñmvf¤1ÓÎ^%ÜÛÌœ¹öü¿ä¶ÎÕ+wÊ}ò8SÏüÀçY7ù×(?>ôõW» Ò««h•ÉÙWØ•û´3¼É•ÞÑ9dÈÖ¬YÃêÕ«ï§¥¥…ü‘/¾ø¢ÍN£FbñâÅmŽ’H$LŸ>ccc\\\8Pq4¯ƒƒú¿C…««+VVV,[¶ “n;bèA¹xñ"µµµÌŸ?ŸÊÊJ !&&æ‘,îööòÏž=Kvv6{÷îí0^K‹âmhmmc•ßkk³J›0`Ò}ÓÚØØœœÌK/½Ddd$(î}Uhhhan>RßÒÒŸ¦¦R¥së·˜›G"©D"© ?ÿ[ÌÍG`jz×)í켄––zŠŠ¢î]Æ¥°ð'~úi&ׯHPâMýÜÜ\<<îÞo½½½)))¡©©é—Ý8rΟÿ#‘‘¶Êë‹/,•Î-¸»ƒë×ë^çÖo‘É$ˆDÚêÍ_ª®£¡¡…µõ¸ãµ¶*vkitš§L&CSSó±•/—ËÐÐÐì’ž¶´Ô¡­m¢V\îܹCyyùC©WÆGO·?½Ý¾ª{ÿëèþ¬NúÚÚZ®^½Êûï¿Oxx8/¼ðB·Êð0ó÷öö&??ŸÄÄDÜÜÜTÌçŸÎôéÓÙ»w/ .dýúõìÛ·ï‘”ŸŸŸOmm-“'O¾û¬jhH}}½ZéÕYØîlþô°çÝ¡_aaaÌ;—øøx¶nÝÚöù=+‹ÔÔT:ĶmÛX¸pa÷<_ªÑ~Ú¿S>³¯êö™™ñññ|òÉ'¸¹¹áééÉÁƒ»4ÿºpá...øùù±gÏÂÃÃùüóÏÛ¤[¹re»º (w+·t–¿:åß/ÿŒŒ ¥CýWüýý)--U:·dþÙû½råÊvìHÿ•}xºPñ<[L´o4)ëSËäDûFsåù+€âX°1?Œ¡6½–˜àâžÃh°^»½Ô W>ÀÔ¶Rp¨€¢oTÏXî,}yt9[2ýÍh4 4q~Õ™´MiÔ$×0`þ¡'ÖÏY̰†¡!Ò 8>˜Q£Ë­râžÃØÍ˜€èÆü0†ºu$¯IÎÉ„?$àñŽ?2öDZXL° ~^|›rêoÕûl,ùÆ¢o§¯Ø%XÙŒÿ ‚.1úøh ¹8[u µë›®äìÎQî¼—Á¯ Æÿ;‚â‚ðÿÞŸ–ê2·dª-¿¬YFÚ›ix¾çÙᫎ°|Ö’ÚôZòÚŒ‹†ÜåÕX¨8Ö­Q܈´IÚiúîj¿Ç¥êÊÿ$èG¿À~Ø¿`_'ã¥™œºZå%nPL,o7Ô©8¨ŒµµY<ȉ{Õ7\Ze2N}ËPÓ>\ž6‹˜gŸ#£ºšãÚu£¦š€Sß’W_GÂôÙ 44B"•R!‘pfÒ4RfÌå§ISq16aòéS*iß>’÷Ó¯sGÒöèÇ7‡ çìäé$?7‡èÉÓ©jnæÍ¤õÂdR6&^æãÑchh$ܧ”ñÖýYá2„ ñ¼ì9sæ””¤|‹ñ^Þ}÷]®]»†X,&..ŽÊÊÊ6ù>ø€·ß~»Í›½UUUܼySyåå)v.çææÒøËž{÷î%--ÐÜÜŒ••Õ#;"¤ó…ãÜÜÜðòò"''‡´´4RSS ÊW“ððpär9AAA¼öÚkÈår^zé%e¸““ÇŽ#99‰DBII P:¡¥ÍDE…à뻃ÐP1&QØÿÖ¾új IS§žeÁ‚<æÍ»Éøñ_ŠïYeffâééIDD7ndÓ¦M”••accC]].:àì¼” r IG.—rô¨ê ..dîÜ4æÏÏÂÀ ?G ¢"™£GÝ6ì¯,XGHH&FF><©T‚H¤ƒÏ6fÍJ 4´€¹sSéÛ׋“'ŸQŽ'''¶nÝJEE¸¹¹áììü˃ým"#í°´ôgΜk„†Š™9ó2ƒÍW©ß¬Y³Ëå*—«ëƒ—ª®î6ÄÖv:óæÝdáÂ|,-ý)/W½¿I¥Mœ;·ÿ¿ôÏánÑ¿Ç]þÝ…”SXxšùó³˜??K©_¿òòË/SRRBuu5¶¶¶XYY=Òúßo|ôtûÓÛí«º÷¿ŽîÏ¥×ÔÔT†’@yyy·}ãRüCCC)--%22MMMJKK9{ö¬ÚáûöíCWW—¯¿þšÒÒRJKKÉÌT<ŸÜ¸qƒ‰'²ÿ~Äb1̘1ÿn럎ʗËåxzz*>oÞ¼‰LXX­ôɯÎüéaÏÿºK¿ÒÓÓ•ítûömill¤¼¼œ«W¯RXXHbb"®®®* Ö‚:í÷ ýû8åx0ûÚ•þ}©¬¬düøñ¼òÊ+äææ’ŸŸÏÌ™3ÛsØÛ·o'%%…‚‚RRR¨¨¨àÏþs—êÑÜÜLHH;vì@,säȵóW§üû埛›‹ƒƒK—.%77—ôôt¤R©Ê cÓþÿŠ©©)Ë—/gÉ’%]Ò¿Geßž.4øå¼ˆàø`¡5z1Ѿѽ^F»¥vôŸÕ¿]§Yw¢×_០§6£–Ô ©½®=ßó¤6­–ܽ¹‚~܃–¡#>AófRÖ¥ k‘=U6äEçÁ„ØbzÔµ}þ;.˜ëÕ•¬‹¿ÐëÚq·ßX®WUòQfšpcº#-m¾ ÏI+.þL‹¬g¯µkײdÉ’n]TxR˜=;™k×Þ!+ë€Ðm‹Å„…….4†@%""‚¤¤$ÞyçA>A?z‚ƒë)áipp <ˆ„&xRðÿΟþ³úw[~ÞÿöÆi½S·×S¯¿þ'üúöÐ^Ùžïyâ°ÂAPÈß m¢Íè㣶s"ížg:£&OcÞÀîûxçÆ²Á}X·×ÓF߀3“¦±c¤_¯Ô£Ý~cY;d¨0 ~ƒ©Ž?MšÊ^ÿqh‹zÿÔ䨱c„…… / þ½Ùssæ\COÏBhŒ.2{v2NNKº-¿Ñ£w øÆ‰‰ ‹—*¯¾}½º<£|ƒX[=±õƇÀƒÁ† ùº•ääävîôS w°aî]»†……EÌ_@ 7¡²ŠÔTØDúætÎùŸãÜèsm"gíÌ"vb,egÊ)&Ú/š²³ej‡wFGéoüóÅß#Ž“µ3 €Ìd’÷ižÐ‹§?91ö§±Xf¬pµs™6À®Ýø³ìâll¿ҮukLê?€&ó‡Øh^M¸$(ÝSDus3OŸäû1—¦ÍÄJ¯g}\vóæÍdff2sæLV­ZEII Ó§Oo7î‚ puueË–-mÂV­ZErr2¥¥¥ØØØôHù„òÛbgg‡··7W®\aß¾}x{{Ó·o_eøøñãiii!""‚É“'³dÉvíÚ¥’GFÆÇœ=;Ÿ¦¦²'Nÿ'Nü†iÓÎ1`À³89=ÏüùÙx{oR†ûûÄŒ°µŠµu ¯`n>P|#L.—£¥¥¥Œÿëozzzj•¿k×.Ξ=‹···ò2dÈ#‘½¦æ&_|aÉ‘#®¥íUùNN‹ñòúÛ[ÿ‡9>·ýéíöõi—oåÊ•,_¾œ   ^ýuJKKñõõU†9R劌ŒäÌ™3*6ó½÷Þ#..Ž5kÖˆ¹¹y¯‘ïIï¿©Ÿ‹‹ ¥¥¥âååÅúõë)..fîܹƒ@¯·fffxxxàááÁéÓ§ùàƒ”ÿëêêö˜6üøã™?~›o0÷”ü¦&111lذ   6mÚ¤´WêräÈN:E`` Ë–-C,·ûÂ'õùW ç¡âàÒ믇ÛßÝðü—g›ˆõYõäÿ7ŸŸ èX’r ®oº’ñ÷ µÂ;£³ôZ´Ö´ÒZÛŠ†HƒÄ剘5gàòB/> ±[jGâ²DúÏîn?]2¶dàºYýRq¤˜‚ƒT]©¢>»i£”–ê–6ñ4´4ð|Ï“Ÿ@Ó@S%¬!·º[uÔßT¤—IÚ*µŽ—×\È|;¹L®üÝ}«;Ã?NŸ‘}0q7Ázš5ºVêßÒ·ÇÔÙÕÕ•µk×2eÊ–,Y‚µµ5ëׯgçÎmõ\W—íÛ·ó¿ÿû¿H¥R•ß/^¼È7˜={v•O(¿}òóóIJJ¢®®ŽÒÒR’’’¨¨¨ÀÞÞž¨¨(‚ƒƒyþùçùñÇ9pàÿó?ÿ£˜{ˆtèÓÇ•>}Ü™6í|»;\6mÚ„D"áwÞaÊ”)<÷Üs* dkÖ¬¡²²[[[ÆŒCcc#C‡ÞÝI°3.ag÷..ËX° W×UÊðÙ³“ññÙŽ•UC‡þ¡¡b^ÀàÁ/ad4ï¿¢ à²²"øî»†]§tbéè˜PWw›¢¢(Š‹Ï“šú.wî$ªÝ~ãÆ}ÊÔ©g±±™„ÍDf̸ȨQÿT‰S]]MRR’òúíG°­¬ÆÐ¿0nnkX´¨[Û©j—?až{îgìígàä´kë€.éX,fÏž=L˜0A9öçÍ›÷ÈÊŸ=;_ßXYàêú2‹co?Cíô}ú¸¢§g¦¦Þ/ºèбñ ùvïÞÍ„ ظq#MMMJýíŽú8‡… óqt\„¥å¬­°´£öøèÉö§·ÛWA>øä“OøôÓO‰%##ƒ††ªªª”á Êë/ù µµµ<óÌ3´¶¶púôiF…‰‰ ëÖ­cÊ”)ÔÖÖö ùžôþëJý´µµ‰ˆˆàÔ©S©„ݺu‹´´4®_¿N}}=ùùùÂ@¯·•••¤¦¦’ššJ}}=åååÊÿ%Åßœ9sÈÏÏgÑ¢EŒ3†€€ÆŒ£ÌÃÚÚš)S¦0bÄæÍ›Gvv6«VÝ¿&''³cÇxùå—)..fÆŒ»óŸððpNœ8Á¸qã1b ,`ÀÅ ÆóæÍãÒ¥KŒ1‚ÄÄD>úè#fÏžMAAfffèèèàêꊻ»;çÏŸÇÛ»íü££ü; W'ÿ}ûöqéÒ%ž{î9–fæ= IDAT-[Fnnn—äï©TJ@@ï¼óçÎcûöíTVVªý…³³3¬^½šóçÏóÙgŸ±iÓ&Þzë­ñü+Ð3Q]ÝÔ¸Äæ ÅB©N?ÜÞrC¤#¢új5Ò)2‰¬Óp‘nÇGu–ÞåUÅ@k¿0‡ådï̦èXîÿtï4C§¯Ž¢ŸÊ›IߔެY†épS4 4éŠIdê)œ¡úõÑ·ÑGCKOrï.f;­wÂq#—æ^¢µ¾µMzƒh÷ÑFËT Y“Œ~ãûQR­Çeƒ UWª(?W®ò{ÁÁ¡ü®ãä¤8JùêÕ«í†ËdÍTUe «Û·ÝðádzeËÜÝÝIKkgùîÝ»9~ü87oÞ¤¬¬ ZZöÙÖv ¶¶SˆŒ´E.WÌ媪®3iÒ·ääB"Q8â**R()‰¡¤$†²²ËLšt‚¼¼¯Ñ×·¢±±X¥¼ÆÆ@޾¾çÎ-4°±y†¡C×addGtô"ªª: ÎÞ~&öö3Éš üLùûàÁ/’”´…ÖÖzLMMUþ³³³©©©Qþ_RGQQ4EEÑ ÂÉéyÄâ“–ok;++¾ür¿|¶ ´µ »ÔÏ—/_&**Ѝ¨( IJeË8|øð#+ÿÎ$eÿÙã踈۷O¨7ç©Ê ©© ©´é¾}–˜˜¨”/..Ž˜˜"##ÑÓóé–úËd²³¿ìòøèéö§·ÛwA>ÆÆÆ8;;coo––#GŽäÆ*q°´´dÒ¤I÷ØG{¼¼¼3f ·nÝ`ݺuÄÆÆâããóÄôÃï•ïIï?uëÆo¼¯¯o»ÎG'''úöí‹™™LŸ>Ë—/ ‚}$ _~ùe»azzz,^¼Z[[ijjb„ ìÙ³G'))‰˜˜bbb°··gÑ¢Eœ8¡˜ÿ|úé§ìß¿Ÿwß}—ýû÷³ÿ~•1ZSSCbb"W®\A,sìØ1Þÿ}IHH ##CåD†ßÒYþ…777w˜ÿ”)S˜2e ¶¶¶ÈdŠùûõë×ùöÛo9tèòEºŽäW—?ýéO¬Y³†©S§’­Þ Y·nÝ"44”“'Obff¦lÏ_w¢=éÏ¿=µ½B}†÷AËP‹’“%h›j£©¯IÉ©ÌF™!Òu~/âH1åÑå]Ê»w.‡^Æ÷+_òäãýooŒÝGŠ…ž|ÈT]­¢µ¾«©V´T· m”b5ÅŠÊ+•mœ[¶¡¶ô î×n>­õ­Ô¦Õ’÷Y_0 Dõ¶¬²HZ›„ßQ?¥Só^ò¨»QGÉ÷%äìÉÁzšµJ¸‰§ Ö3¬É|;³]~~æg.…\Bü…˜¡[‡âñއÚmP—Y‡¼UŽ©·© O9¦Þ¦Ô¤Öt[~W*Ê©kma¦=UÍÍ4J[yÎÖŽKåemœ[K™Ø¿ý­Ûu­-¤VUòÉÍ äÜ"ÔÁQ%|GÚ5–ÇÅprâ³¼áÙö- œúZ2ª«8.¾ÍÎŒ4fÚÙ«„{›™3×Þÿ—œÐV†;åŒ>yœ©g~àó¬›ük”úú«ÝéÕU´ÊdŒìÛOP°§œæýH®ì9ŽÎ‹/R[[Ëüù󩬬¤¡¡bbbTGÅâÅ‹ùË_þÒæÁmúôéãââÂÀŠéèëë÷ù„ògÏž%;;›½{÷v¯¥¥mmc•ßoܸAcc#Ï=÷Ü}ÓÚØØœœÌK/½Ddd$(æFUhhhan>RßÒÒŸ¦¦R¥së·˜›G"©D"© ?ÿ[ÌÍG`jz×)í켄––zŠŠ¢îI%§°ð'~úi&ׯHPP¹¹¹xxÜy{{SRRBSSI€œóçÿHd¤­òúâ K¥s Úîàº×¹õ[d2 "‘¶zóߪëhhham=®Ãx­­Š—µ´´ :ÍS&“¡©©ùØÊ—ËehhhvIO[ZêÐÖ6Q+®wîÜ¡¼¼ü¡Ô¿+㣧۟Þn_ùÔÖÖrõêUÞÿ}ÂÃÃyá…T‡ š5kX½zµÊïùùùÔÖÖ2yòdåo†††Ô××?Qýð{å{ÒûOÝú………1wî\âããÙºuk›|²²²HMMåСClÛ¶…  ‚}ì333âããùä“OpssÃÓÓ“ƒviþuáÂ\\\ðóócÏž=„‡‡óù矷I·råÊvÇ.@]bþalÜvþÑYþꔿü322”/ üŠ¿¿?¥¥¥JçÖƒÌ?çç瓘˜ˆ››Û}[+W®l÷èÁ¨¨(\]]±²²bÙ²e˜˜˜(ŸƒŸôç_ž‰Šç©øÛb¢}£IYŸ‚\&'Ú7š+Ï_ÇÆùa µéµÄÇ÷lFƒðÚí¥V¸ò¦¶•‚C}S¤ò{géË£ËÉØ’ÁèoF£i ‰ó«Î¤mJ£&¹†ó=ù‘·Ê‰{6c7c¢óÃênÔ‘¼&Y%ž–±æ ÿ¬þªý+Ò`è?†2æ‡1]bô7£i©l!ñŶGÔÔߪ'öÙXó Œ DßN_±K°²ÿþŠôÇGcèdÈÅÙUÒº¾éJÎîåŽÀ{üÚ`ü¿ó'(.ÿïýi©n!sK¦Úm k–‘öfžïy¢o'ݧ•~ý°Ážô7Ó»-ÏV™Œ€Sß2Ô´—§Í"æÙçȨ®æÅ¸ó*ñŒµµY<ȉ{Õ7\454xw”1Ï>GÊŒ¹ü8q*• ‹cζ)ëFM5§¾%¯¾Ž„é³hh„D*¥B"á̤i¤Ì˜ËO“¦âblÂäÓ§TÒ¾5|$ï§_玤íÑ oÎÙÉÓI~nÑ“§SÕÜÌ›I j·D&ecâe>=–†F‚¢=¥Œ·îÏ —!lLˆï1uniiÁÍÍ ///rrrHKK#55••x|ðo¿ýv›3Ô«ªª¸yó¦òÊËS|[477—ÆÆÆ#ŸPþý G.—Äk¯½†\.祗^R†;99qìØ1’““‘H$”””pàÀ¥JñPÚLTT¾¾; 3aÂÅœ©¾CCC***HJJ¢¾¾žÊÊJNRØïàà`233ñôô$""‚7²iÓ&ÊÊʰ±±¡®.—ƒpv^Ê‚¹„„¤#—K9zTõ —?2wnóçga`П£GGVT$sô¨;Æý• ò ÉÄÈÈÇ#•J‰tðñÙÆ¬Y „†0wn*}ûzqòä3J=wrrbëÖ­TTTPPP€››ÎÎο<Øß&2ÒKKæÌ¹Fh¨˜™3/3hÐ|•úÍš5 ¹\®r¹º>øw©êênsðà@lm§3oÞM.ÌÇÒÒŸòrÕû›TÚĹsKð÷ßùKÿîý{Üåß]Hù7……§™??‹ùó³?þ+•ð—_~™’’ª««±µµÅÊÊê‘Öÿ~㣧۟Þn_Ÿvù455Ù»w/iii’@yyy›…Â9sæ””¤Ü¥¥|>—ËñôôT.<Þ¼y™LFppp¯ïIï¿®Ô/==]ÙO·o߯ÑÑ‘ÆÆFÊË˹zõ*………$&&âêꪲ`- Øÿö©¬¬düøñ¼òÊ+äææ’ŸŸÏÌ™3IMMU;íÛ·“’’BAA)))TTTðç?ÿ¹Kõhnn&$$„;v ‹9räˆÚù«SþýòÏÍÍÅÁÁ¥K—’››Kzz:R©Tå…±eß¾}èêêòõ×_SZZJiii›#ÀMMMY¾|9K–,i“þWûàÀš››±²²ââÅ‹=âùW g¢Á/çEÇ ­Ñ‹‰öîõ2Ú-µ£ÿ¬þÄÏ{¸ £zýõþÉpj3jIÝÚëÚÑó=OjÓjÉÝ›+ œ{Ð2ÔbÄg#h¾ÓLʺd-²§Jþb?ˆéQ?<Ôrlô øï¸`®WW².þB¯kÇÝ~c¹^UÉG™i º#-m¾ ÏI+.þL‹¬w¯µkײdÉüýý…Îèq̵̞kï•u@h 6ˆÅbÂÂÂC ÇARRï¼óŽ Ÿ€€ Ÿ= ÁÁõ”ð48¸žDB<)øçßæhÃÁûßÞ8­wêözêõ×Ãÿ„?CßÚ+ÛÏó=OV8úñ´M´}|4ÃvC¤ÝóLgÔäiÌØ}ïüÏØ@6¸ëözÚèpfÒ4vŒôë•vn·ßXÖŠ€*¦::ü4i*{ýÇ¡-êùS“cÇŽ&t¬@·áé¹9s®¡§g!4F™=;'§%Ý–ßèÑ; Ø€‰‰ ‹—*¯¾}½º<£|ƒX[=±õƇÀƒÁ† ùº•ääävîäôS w°aî]»†……EÌ_@ 7¡²ŠÔTØDúætÎùŸãÜèsm"gíÌ"vb,egÊ)&Ú/š²³ej‡wFGéoüóÅß#Ž“µ3 €Ìd’÷ižÐ‹Ý„m¨- ÀÌÏŒA«Œ©—©2Üë#/F왯æ 06~ÁýÔÎ_×RW‘§·)Fƒ0l„®•®zÖÇcæk†±«1ö/Øt1Ëg-Ûo=ÍCGC²wfwkYL°Àç+®®¼JÚê1¦!ÒÀ'Ò‡˜ù™á¸ÖQ)Ͻ Ù4ßC¾Ø=o‡™¯Úfw?‚îô''Æþ4‹g,°]dKð¥`,Æ[<”öû=úaâa¢r û`£þ; M µòýzúÑRÓÂÅ™)ý±”qgÇ¡k¡Û½ãÏÀŽð!eÆ\RfÌírz/³¾*מÑã8ô š·ÿ #c®Ï ÁßÂ÷>f¬pµs™6À®Ýø³ìâll¿ҮukLê?€&ó‡Øh^M¸$姈êæf&ž>É÷b.M›‰•Þ£ýΡ½½=»w聆°¢¢¢6áGŽáÔ©S²lÙ2Äbq»ÓX°`®®®lÙ²å¡äÿ8ؼy3™™™Ìœ9“U«VQRRÂôéÓ…òÕÄÎÎooo®\¹Â¾}ûðöö¦oß¾ÊðñãÇÓÒÒBDD“'OfÉ’%ìÚµK%ŒŒ9{v>MMeOÜø8ñ¦M;Ç€Ïâäô<óçgãí½Iîïÿ3f\ÀÖv*ÖÖxx¼‚¹ù@ñ0¹\Ž–––2þ¯¿ééé©Uþ®]»8{ö,ÞÞÞÊkÈ!Döšš›|ñ…%Gޏ>–¶Tå;9-ÆËëoOlýæøxÜö§§Û×Îî+W®dùòåñúë¯SZZН¯¯2|ß¾}œ÷È‘#U®ÈÈHΜ9£bs~/šššÄÄİa‚‚Ø´i¥¥¥ª]ÿÎäïh~ Nù»ÿÞ{ï=âââX³f ˜››«ÞYÿtÖ¿»ÿ:›Ÿ=ˆ~¹¸¸(Ëóòòbýúõ3wîÜG"_wÈÿ8å{ÚQ§ÿÔµï«V­"99™ÒÒRlllIýÍÌÌ”cúôéÓ|ðÁÊÿuuu{L?|üñÇÌŸ?¿Í7–{Jþ¢_¡®ýxú'Ð;Q¹óêõ×ÃíïnXM±âÚÿª.\ÖgÕ“ÿß|üŽøqsûM âú¦+ÏÀb¼E§áÑYz - ZkZi­mEC¤AâòDìÿ`O¿ ~B/vâH1šh÷ÑFÚ(¥¥ºƒ˜ù˜q)äùTÆW"—Ëqþ_gÊ£ËÕÊ_ßVŸÖÚV$Å$¥ä2y»ñ4´4ðxÇí>Ú$¯MFÚ U†5ä6Ð\ÑŒŽ¹ÒF)’"I›ô".¯¹þÿÒUÊpßꎎ¹9{r5É0h@eB%’‰ZõéˆúÖPRÖ¥ÐTÔÔ¥¶•Ëä\½|w1÷j5ýçôG»Ï]ÖÈý#éˆÐ2ÒÂþö”þXJõÕj ±[jÇ¥K¸lt¡þF=[2pÝìÚÆ‰ü í÷{ô &µFù·ç{ž´Ö·’²>E­¼»¢_[?ŠO£o£Û[n$­Jê¶ñWÐPÏ_/ó­ø6»ýÆv9}re…òïÝ~c©kmaÕÅŸÛ}‘ˆ}üé«£Ãò 1Ô·¶*òëj¹#‘`®«Kƒ´•ÂÆ†6éuEš¼9Ì›×.#•ßm¿òÃBOi4J¥8s©¼”b5?ª+ÒdÇH_V^ü™‚†Á ?¥|};[¶ôå±çY¹ùùù¬Y³†Ã‡¡æììL@@~~~äääpþüyär9o½õßÿ½ªëê²}ûvV¯^T*íöü®®®¬]»???¶mÛÆõë×Y¿~=;wîä»ï¾ÊWS¿òóó©««£´´”¤¤$•Åè¨(ÆGll¬ò÷ß»‰t01qD[Û”I“NpêÔd**Tï=ÁÃã/df†S\|‘H ‘H›ü|EýÖ¬YÃÛo¿§§'öööœ9s†‘#G’–¦xQ' `}ú¸“”´== †ßLJÊV22öŠP?pûö Ìͽ6ì¯$&næÆO<ø%ŒŒrìØÝ7EEÑÌž}•üüï¹s'êênST…T*¡¸ø|—ú`ܸO16v$9ù€œ‘#ߢ¨(š+Wþzw^U]­Ò®¿ÅÊj búôŠ·÷›ÄļˆX|R­ò'L8‚))ÛÐÖ6ÆÚ:€;wÕŸ?‰Å|÷Ýw|õÕWxyy±cÇ.\ÈáÇIù³g'SXxš¼¼o03sgøð0bcWpûö µÒ÷é㊞žššzôé£pDI¥jks”ò?~œÃ‡3jÔ(þïÿþW_}Ué¤}Ðú8‡Ñ£?äòåÔÕå!i"“I)-Sk|ôdûÓìkG÷?€O>ùD1?ÕÒÂÜÜœ††ªªªTêxþüyâââ‰D¼øâ‹)è®®¦  €¢¢"•{/@BB‚òjkk íÙ¤R)Êÿ/\¸ÀÒ¥KU8Õ¿#ù;›¨SþÃî¿Ó§O£§§‡‰‰ ëÖ­ãèÑ£\¼xQíðÎú§³þ}˜ý§ÎüL]ýÒÖÖæ?ÿùæææÌ›7ºº:eØ­[·(++Âúúzòóó‰|Ý!ÿã”ïi§³þSǾëêêrîÜ9þö·¿1{öl.]zt/˜VVVRYY©X ®¯§¼¼œÔTÕïÛÏ™3‡?ü7’——‡¦¦&R©”¸¸8¬­­ñöö¦´´GGG¶oßζmÛØ³G1MNNæôéÓ|óÍ7¸»»ÆŠ+8qB1ÿ ÇÊÊŠmÛ¶ÑÐЀ³³3±±±0oÞ<6lØÀêÕ« çÂ… œ>}š>úêëëqttÄÔÔ”'N0yòä6óÐŽòï,\GG§Óü÷íÛ‡»»;[¶lÁ‚͛7³uëVµåÐû[G¨c?§þ ôNT_-éàEÿæŠftúéàö–"ÕW«‘6H‘Id†‹t;>r¨³ô.¯º(Zƒ”ø…ñ8,w {g6EÇŠpÿ§{§ù ¨©†ZèÔGßF - Lh‰D$þ¦<§øò2^tòHË”Ëï?oݺEhh('OžÄÌL±ë¶¦¦¦Ý7é¶nÝJLL 'Ož|(ù?~=£¤¤„U«V!‘Hð÷÷ÇÈÈ===ššš„ò''ÅQ¹W¯^m7\&k¦ª*]ݾ톛™y2lØ_ù«3Û³{÷nŽ?ÎÍ›7)++ÃÄÄ„–…}¶µ‚­í"#m‘Ës‰ªªëLšô-99‡H/OTT¤PRCII ee—™4éyy_£¯oEcc±Jy%€}}+Î[ h`có C‡®ÃÈÈŽèèETUet>g²Ÿ‰½ý d²f?Sþ>xð‹$%m¡µµSSS¼½ï:Ù²³³©©¹ûâMIIEEÑEcd4'§çÕrpÙÚNÅÊÊŸ/¿ ¼S[Xø£­mØ¥~¾|ù2QQQDEE1hÐ –-[¦–ƒ«»Ê¿s'IÙFFö8:.RÛÁUU•ASSRiÓ}û,11Q)_\\111DFF¢§çÓ-õ—É$dgÙåñÑÓíOo°ïÝÿ~ÅØØgggìííÑÒÒbäȑܸq€-[¶°yófV¬XÁĉñòòâ½÷ÞS¦‹‹ÃÅÅmmmžyævíÚÅ®]»øðÃUÊ ÃÒÒ’I“&=”¶üÓŸþÄš5k˜:u*ÙÙwOˆè¬þÉß•ùÁýʘýgoo——cÆŒáÖ­[¬[·ŽØØX|||: W§Ôí߇Ñ]iÿŽô+,,Œ7Þx___jkkÛôíÛ333™>}:—/_~$úÙò? ò=í´×ÙwSSSbbb ¤¸¸˜Aƒ=‘²I$¾üòËvÃôôôX¼x1>>>´¶¶ÒÔÔÄ„ ”€¤¤$bbbˆ‰‰ÁÞÞžE‹)<Ÿ~ú)û÷ïçÝwßeÿþýìß¿_E‡kjjHLLäÊ•+ˆÅbŽ;Æûï¿££# ddd¨œÈð[:Ë¿£ðæææóŸ2e S¦LÁÖÖ™L1¿~ý:ß~û-‡¢¢¢¢Sù»Ë~üžç[++«¡= µ½B}†÷AËP‹’“%h›j£©¯IÉ©ÌF™!Òu~/âHq›]ê¤oÈmàrèe|¿ò%ÿ@>ÞÿöÆØÝX¹³DàÁi­o¥6­–¼Ïò(øª€!w¨¸PAìäX¢ý¢I}--#-2ßn»˜bjÛáÑròV9w~¾CÑ7Emv÷e}EÒÚ$üŽú)š÷Ò×@Ý:J¾/!gOÖÓ¬UÂMú¡Ž~=)úaêmª²cíQ²ÔÑ™‰ýÛߺídlÂ2§Á¼–ØþCÃŽ´k,‹áäÄgyóíw.rêkɨ®â¸ø6;3Ò˜ig¯îmfÎ\{þ_r[çå•;åŒ>yœ©g~àó¬›ük”úú«-Wzu­2#û »rŸvF˜÷#¹òÉrtFEEáêꊕ•Ë–-ÃÄÄDåˆ!€Q£F±xñâ6¿wWþ‹‹/R[[Ëüù󩬬¤¡¡bbbÉâno/ÿìÙ³dgg³wïÞãµ´(Þ†ÖÖ6Vù½¶6 ©´‰î¿hkccCrr2/½ô‘‘‘ddd``` ¸÷Ue ¡¡…¹ùHe|KKššJ•έßbn>‰¤‰¤‚üüo17©é]§´³óZZê)*ŠºwöGaáOüôÓL®_ÿ  ÅN€ÜÜ\<<îÞo½½½)))¡©©é—Ý8rΟÿ#‘‘¶Êë‹/,•Î-¸»ƒë×ë^çÖo‘É$ˆDÚjõOUÕu44´°¶×ñü¨Uñ²––A§yÊd2455[ùr¹ Í.éiKKÚÚ&jÅõññáÎ;”——?”úwe|ôtûÓÛíë];VËÕ«Wyÿý÷ ç…^`ðàÁ|þùçLŸ>½{÷²páBÖ¯_Ͼ}ûÚÑ~üñG¾øâ‹6Gp 2„5kÖ°zõên¯»··7ùùù$&&âææ¦²ø§nýï'¿:óƒŽÊØäççS[[ËäÉ“ï> R__¯VxWú§£þ}Xý§îü¬³ú‡……1wî\âããÙºuk›ð¬¬,RSS9tèÛ¶mcáÂ…L¾îÿqÊ÷´ÓQÿufß% Ó§OÇØØ(vMêëë?ñ²›™™åÑ»¤ IDATÏ'Ÿ|‚››žžž " †þc(c~CÐ… F3š–Ê_¼{„ȯážÿòDÞ"'Ú/šê$ÕÝ1ZÆZ ˜?€þ³ú·)cÈëCóýÄ÷/-5ªùÿJý­z¥(0&};}Å.ÁÊfüOø+êw|4†N†\œ}Q%­ë›®äìÎiwgÙà×ãÿ?AqAøïOKu ™[2Õn#Y³Œ´7Óð|Ï}»®]÷mîˆtDxìMp|0ÁñÁŒ==ö×u.L»€¡³!ÑŒ;3dpe±büÉ[åÄ=‡±›1ÑŒùa u7êH^“Ü­í÷ ú`ù¬%µéµÊ]h¿¥#ýPG¿žýèØûì;tâýfÛ äúÌöŒ‡¦†×g†p4x¢Jcmmr"ľý7\¦ °ãzU%9uµ÷-çFM5§¾%¯¾Ž„é³hh„D*¥B"á̤i¤Ì˜ËO“¦âblÂäÓ§TÒ¾5|$ï§_玤íÑoÎÙÉÓI~nÑ“§SÕÜÌ›Iêïâ“ȤlL¼ÌÇ£Ç2ÐÐH0ÊO)ã­û³Âeâi¹¡¡¡”––‰¦¦&¥¥¥œ={V¾wï^ÒÒÒ8pàÍÍÍXYY©±ðÁðöÛo·ûfowäÿ¸hiiÁÍÍ ///rrrHKK#55•¡|5 G.—Äk¯½†\.祗^R†;99qìØ1’““‘H$”””pàÀ¥JñPÚLTT¾¾; 3aÂżºµ¯¾ˆDRÅÔ©gY° yón2~üW€â{V™™™xzzÁÆÙ´ieeeØØØPW—ËÁƒ8;/eÁ‚\BBÒ‘Ë¥=ªú‚‡‹Ë™;7ùó³00èÏÑ£C¨¨HæèQw† û+ ä’‰‘‘‡F*• éàã³Y³ -`îÜTúöõâäÉg…ƒËÉɉ­[·RQQAAAnnn8;;ÿò`›ÈH;,-ý™3ç¡¡bfμ̠AóUê7kÖ,är¹Êåêúàߥª«»ÍÁƒ±µÎ¼y7Y¸0KKÊËUïoRiçÎ-Áßç/ýs¸[ôïq—w!åßžfþü,æÏÏRêׯ¼üòË”””P]]­­-VVV´þ÷=ÝþôûÚÑýOSSSyÿ+,,$!!òòråBÙ7˜8q"û÷ïG,“‘‘ÁŒ3ð÷¿ûÕ»ï¾Ëµk׋ÅÄÅÅQYYÙf¡mΜ9$%%)wu'ûöíCWW—¯¿þšÒÒRJKKÉÌÌT«þɯÎü £òvÿÉår<==• Ÿ7oÞD&“¬V¸:ý£Nÿ>¬þSw~¦Ž~¥§§+ÛáöíÛ8::ÒØØHyy9W¯^¥°°ÄÄD\]]U¬¶|Ý!ÿã”ïi§£þë̾WUUqóæMå•——§œ—5ªù‰ÇIee%ãÇç•W^!77—üü|fÎœÙæ˜ÃŽØ¾};)))’’BEEþóŸ»TææfBBBرcb±˜#Gލ¿:åß/ÿÜÜ\Xºt)¹¹¹¤§§#•JU^{Øö'(,_¾œ%K–´Iß‘ýèéú'ð„ú5øå¼ˆàø`¡5z1Ѿѽ^F»¥vôŸÕŸøywaT¯¿Ã?NmF-©R{];z¾çImZ-¹{sý¸-C-F|6‚æ;ͤ¬KAÖ"{ªlȋ΃ ±Äô¨j96úüw\0׫+Y¡×µãn¿±\¯ªä£Ì4áÆtFZÚ|0ž;’&V\ü™YÏ_k×®eÉ’%*‹n½…Ù³“¹ví²²!бXLXXáááBcôX"""HJJâwÞäôS@@@@ ‡!8¸žž—€€€€€€€€€€€€€€€€€€€€€€ÀÓHh'ÿïüÛ=ºî÷âýooœÖ;u{=õúë១oí•íçùž'+ýø Ú&ÚŒ>>ša;‡!Òîy¦3jò4æ ì¾wþgl ܇u{=mô 83i;FúõJ;·Ûo,k‡ E@S~š4•½þãÐõþ©É±cÇ :^@ý{³çæÌ¹†žž…Ð]döìdœœ–t[~£Gï$ @ñ /.U^}ûz?tyGùvvvLš4鉭XX………Ê£ºJDD6läèV’““Û=ºK@ÐOÞÁ† ¸ví=2Þ„Ê*RSaé›Ó9çŽs£Ïµ‰œµ3‹Ø‰±”)Cü¥˜h¿hÊΖ©Þ¥¿ñÏ_Œ8RLÖÎ,2ÿ‘IÞ§yB/>"ôlôpû»A‚ºÔåôº–ºÇcêmŠÑ`#Œ¡k¥«VZƒÿÏÞ›‡Eyÿö}e_T@A"‹ÄÜEcÚMM«oÓjúKÌ{™¼¶ÆÔ$S£1ßX5D£±1.‰Q"TEDd_f€™ùý1Íèd†Š>Ÿëzþ˜9û}ÎsŸå~Î9͉ɌÁ.Ì+‘/x}&‡‰]úwšì„Å` Š7öîE»búU(_ ïͼËg誡„í Ãý9wìÂì0²3z(òï©üEûø·yn„ '&3‡Ç§}´7´sfÚ$?Hsb &LzµmýÉ/€ô¸x&º¸ñ›ÁÞäNK`œ³î÷ :š™qyZÁýú#²±Edc‹“Žt²´âò´Â80ÌÖŽ—}†r)~“]Ý»ô?ÝÝo+kþ‘w©We0ÞÙ•ƒ±øÍéTþ|>CPºOõmmŒ;v„Ãeb2&OÃÑôɼ\vÉ’%äää ‘HpqqéÒÏœ9s‰D¬Y³PÝÁ‘––ÆŠ+ˆŽŽfÕªUH$¢¢¢›r½ýöÛ2mÚ4–,YBeee¯^òÞ×Ówww'((ˆsçα}ûv‚‚‚èׯŸÚ}ìØ±´··³k×.&L˜À‚ Ø´i“FŸpâD"RiÕc×îÇû7“'ŸÄÕu"^^Ï‘˜XLPÐ*µ{xøÇÄÇÿŒ›Û$œœ¢ð÷ÿööÁ€êŽ0¥R‰¡¡¡Úÿ/ÿ™ššê”þ¦M›8qâAAAêgèС¥ì WÙ½Û}ûDDö+ýE‹©uÖã˜ÿ÷ߟ &PYYÙçôÏ“®_=<<ؼy3·nÝ¢¼¼¼K?6l ==¥K—…½½}Âß«ÿ}ýëý–OÛøA[ýlß¾#GŽÁÔ©SÉËËãµ×^{lÊ·xñb-ZDtt4o¼ñ‰„°°0µû¾}û8zô(QQQ,\¸±X¬qÇ–¶ðz|§-ÿÝáãã£n,_¾œŠŠ fÍš%L úüøÚÎÎüýý9vì~ø¡ú·‰‰É#ÃO>ù„ÄÄÄ.ï`~⿽Ñêªu™? 肆ËÔYµ@ð€N›‹š)ýW)ÁŸS~ Yµ Ñ[" þZ “»6´…×3Ô££¡ƒŽÆôôõÈZ”…ý3öx.òjñ!!-W@/½öß-j›¹™ÑÑØ¬BFóµfš®4!«”uò§g¨GÀ†‚?ÆÀÜ@í¥¤…¦kM4_mFÞ*GVÞ9¼¾±>>¯ûPøn!J…Rýÿ°µÃñélGÚb=̧ÉN:Ø~‰×ï?r_ËEZ.í±|F¿5†–†xüÖƒþQý‘7É{]þ÷+¿GÕ>ôõµo-×[È~%û•ï~ÛGÅÁ JÿUŠï;¾½&;+k^ôBRÚ f{d€©«.œãÿF„è>5·¤±½òÖ®6ÔSP_GEtêë³yÔ3$GŽÅâ®E€â¦F ê)l¨§EÞÁ­Ö–NáMô xkxogg!WÞ‘ß?BFñ¯1Ñ„õ@€]?¦»{êl`û%Þõ#ÃXšqš²–Aá>¥|s³„ϯ]aÝȰ'*ß&&&œ9s†+W®0cÆŒný­[·Ž?þñÈå*ý/—ˉŒŒä½÷ÞãäÉ“¬[·ŽÚÚÚ.À"‘ˆW_}•¸¸8,X€““Ë—/gãÆBú:RZZJvv6MMMH$²³³©©©Q/¦¤¤ÃsÏ=Ç?üÀÎ;ùýï¯ê³ô±µak;ŒÉ“Ou¹ÃÅßÿ5’’ÄŒ±gçX\]'àî~gbéÒ¥ÔÖÖâææFDD­­­øùÝÙI¹øø Üݧâã³9sJ‰–¨ÝgÌÈ!4tŽŽ‘øùýž¤$1C†,`È—°´ôäðáhÊʾ§¨h‡Eâç·LmÄ26¶¦©é&åå)TTœ"7÷}nßÎÒY~cÆ|ƤI'pq‹Ë8âãÏò7 ?õõõdgg«Ÿ__‚íè³s ¾¾K™7¯7·I:§»©SÂÃ#/¯ù89Eö¨ ‰Åb¶lÙBll¬úÝŸ={öCKÆŒÂÂÖãè‰Hô óæUàá¯sx033S/>y{{k”oóæÍÄÆÆ²råJ¤R©ºýöFþ==g2wn)ƒÏÃÁ!'§H"þÓ¶Œñ÷÷'00K—.Ò§ôO_Я¥¥¥,]ºôž»XŽ;FHHÖÖÖ,[¶Œ¸¸8uß]ÿû0ú×û-_wù×¥~D"999¤§§søða °´´|lÊ÷é§ŸòÙgŸqúôi hii¡®®ooo"##ùÝï~Ç©S§øüóÏYµjï¼óŽNáõøN—üÿ‚‘‘»víâèÑ£êçÚµkäååqùòeš››)--&}~|][[Knn.¹¹¹477S]]­þ-“©ÖpfΜIii)óæÍ#""‚ÈÈH"""Ôq899Gpp0³gϦ¸¸˜%KîŒ_srrX¿~=‘‘‘¼òÊ+TTTgü³mÛ6<Ș1cfΜ9¸ºª>0ž={6“••ÅÇÌŒ3(++ÃÎÎcccD"Æ ãÔ©SuŸw¿6w]âß¾};L:•… RRRÒ£òwÇýöŸºèG]çϺ¢¹º©wom5mª­¿1¾ïø¢o¬Oý…zä-r2…Vw}“îÒÞçÏ>ª­ENæÜL.HñÆbÊ”3ìoôÆ/Ð (ï/x]V?=ûz†zô‹è‡ï_}¹¹ã&7¿¸©öãµÜ‹ÁK“1+ƒŽæŽNq˜{šcdk„¡! ©‚þcûS±^ÃÏ êÎÕQ}²Zãÿ²=eø¯÷gèC¹uàåûË»Lã^XµDÏPúœúËÇÔÅ+‘™‰™´ÜP-Þ{üÖƒÐ=¡dÌÌè5ù÷†üEû0îoLØWaœM:‹¬J†™»Ù+_o´ºóu¸?ïÞk¯–½‰ê+õ*©”ç3‘É„Ø÷ÇÂÐS¤rí†Ð³·«}ä[ õõãàÄß‚CøìÚ¶]½³È÷g¿–ûcÒñïiêhïÇ +ìŒM°52F*—3ÞÙ•ìšÛ~Þ$£ªŠ+niü¿ûz›Â"øk`0{o\gOÉõ.Ó¸¾6¶êë“õ«ôž>2««xÑ{è“_GGGÒÒÒˆŠŠ¢¢¢‚Aƒî}èÚµkIKKãÈ‘#]ºÿá`éÒ¥Lš4‰âââÇ¢|¿‰QYYÉ’%KÉd„‡‡cii‰©©)R©THÿ>ðòR•{áÂ….ÝŠ6êê 01é×¥»]Çÿ…C‡"©¯/ìÒÏæÍ›ùöÛo¹zõ*UUUX[[ÓÞ®ÒÏnnq¸¹Å‘œì†R©Põqu—?þ;®_ß‹L¦2ÄÕÔ\¤²2ÊÊ4ªªÎ2~üAnÜø33GZ[+4Òkm­”˜™©Ž‹;yòy@—gñó[†¥¥;©©ó¨«Óþœ‡Ç4<<âQ(ÚˆŠú\ýÿ!/’½†ŽŽflll4&ÿÅÅÅ444¨WV¦S^žJyy*––ƒðòz±øˆÖôÝÜ&áèΗ_ºª:„cddÑ£z>{ö,)))¤¤¤0hÐ .\È×_ýÐÒ¿};[]–– <›7ê677‰DBkk+¹¹¹]úÉÊÊR—/==´´4’““15 í•ü+2Š‹¿ì<lk#77—þýû÷IýÓô»R©ìæýö 00ˆˆ®]»À²eË8}ú4¡¡¡ZÃ÷¤ÿ}Pýëý”O[þu©Ÿ5kÖðöÛoóòË/3nÜ8Ù°aÃcQ¾_°²²ÂÛÛ 9r$W®\áÚµk$%%qäÈìììhhhè´Sá^áõøN×ü¯^½š7ß|“°°0 ãßÝã€~ýúaggGkk+S¦Láìٳ„@ O¯uE&“ñå—_v½ÆfjÊüùó ¥££©TJll,[¶lQûÉÎÎ&--´´4<<<˜7oªÆ?Ÿ}ö;vìàý÷ßgÇŽìØ±Cãmhh ++‹sçÎ!‹9pà|ðƒæüùóhœÈðk´Åß{[[[·ñÇÅŇ›› …jü~ùòe¾ûî;öîÝ«þ®»òëÊÓjÓ=é¿tEg«í[ - ©ï‹ÒÓ82n"otþ èzs#õu|+¾ÉÆ‚<¦¹{h¸ÙÙ3Ëc ÿ›s¾snW3úÈ·Lúñ{¾(ºÊ?BFñQX¸Î2ȯ¯£C¡`d¿þ‚}Ê ¶ïONí“cè”ÉdL™2+++|||ðôTí,8p fwíb aþüù]Dii)YYYøúú>6Æ-€3gÎÐØØHbb"µµµ´´´@ZZÚC™üöõôOœ8Aqq1[·níÖ_{{FFVÿ76!—Kqu½÷ýH...äääðÒK/‘œœLAAæææª¾¯®==CìíGªý;8„#•JÔÆ­_co?™¬™¬†ÒÒï°·ÆÆæŽQÚÛ{ííÍ”—§Ü=úãÖ­ã?>Ë—?":z%%%€j—ÐÝïCee%R©”ššl@É©S¿%9ÙMýìÞí 6nAç\w·~B!C__·#¢ëê.£§gˆ“Ó˜nýut¨>^244×§B¡ÀÀÀà‘¥¯T*ÐÓ3èQ;mhhÀÖÖV'¿¡¡¡Ü¾}›êêê’ÿ{åÀÚÚºO韾®_KKKilld„ êÿ,,,hnnîµþ÷Qö¯Úʧ-ÿÚêgÈ!|ñÅL™2…­[·2wî\–/_ÎöíÛ‹òÝé§¹pá|ðÛ¶mã…^P»¥¤¤ ‰pttdáÂ…X[[w'uþQïtÉÿêÕ«™5k™™™¬]»¶óü½¨ˆÜÜ\öîÝËßÿþwæÎ+Lú¼þ¿_ìììÈÌÌäÓO?Å××—€€öìÙÓ£ñ×Ï?ÿŒ£FbË–-lÛ¶/¾ø¢S¸Å‹wùî45©ÆçVVVܴůKú÷Š¿  @mðÿ…ððp$‰Ú¸u?ãÏžôŸ‹/îòèÁîô£®ógž ayªø®‚Ô°T..¿ˆR¡$5,•sÏTÇ‚E|Ac~#i1i¤OLÇrˆ%›urWO`;(Û[Fù¿5ÏpÖ¾:µš‚5Œþ÷h Ì ðþ³7y«òhÈiÀ5ÑU¨É‡€ÓT'b2cþápôôõˆÉŒ!d—æQ †V†¸&ºâ<ݹSø¡o %âpQ?E¶7Œö†v²^ì|DMóµfNOÈ¿ÌmYç£ß>‚¦3u&©¦P×ÖÆ[ÙçuŸD*ä¬Ì:Ë'£ŸÁÓÂRP¸O)cœyÙg(+Ïg>1y®««ãêÕ«êçÆ ÕÝ %%%´ÞuLè‡~È»ï¾ÛåêÛ·oÇÄÄ„o¾ù‰D‚D"étÄÚ£¢½½___¹~ý:yyyäææ’ ¤¯#Û¶mC©TÍ믿ŽR©ä¥—^R»{yyqàÀrrrÉdTVV²sçNµJ5)m#%%°°õ$%‰‰Ý§ê?:Zøê+Od²:&M:Áœ97˜=û*cÇ~¨î³*,,$ €]»v±råJV­ZEUU...45•°gÏ@¼½ŸgΜòQ*åì߯ù‡Ïo™5+ÄÄ"ÌÍÙ¿_uÄaMMû÷cøð¿0gÎ  ±´È×_A.—¡¯oLhèß™>ý»_té?mllX´hQ—ÇØv§u? ô=þs^DLfŒ >LjXjŸ/£ûóî8Ow&söƒ]5u6eħ#h,h$wEnŸ“cÀ†ó)ÙZ"´»0´0$øó`Ún·qqÙE튧J‡¼è=„ALIùþ¦ãbfοÆÄp¹¾–e™?÷99nõ —ëjù¸0Oè˜îÂÒЈ/#Çr[&åå3?Ñ®è[ï׫¯¾Ê‚ zuÑI@àa1cF—.½GQÑNA‹Å¬^½šmÛ¶ ÂxbÙµkÙÙÙ¼÷Þ{Bù„ö) ð„!¸žž—€€€€€€€€€€€€€€€€€€€€€€ÀÓ¾ Ç…ðCá]Í÷ßôÏ ¼–{õz>MM ?Žß»~}²60ðåBûøFÖFŒþv4Ã7GßèÉS)&3Û³÷.ïüÏD±bØð^ϧ‹™9?ŽŸÌú‘£úäûµyÔ3¼:´oêŽûÁÆØ˜ãã'±5| FúÿûuàÀV¯^-TœÀÃë›V0sæ%LMÂè!3fäàåµ ×â=z#‘‘ª;n¬­}˜?_¢~úõ zàåyé»»»3~üøÇ6ÿÂû!p¿ìÚµ‹+VåèUrrrº<ºK(ŸÐ>ú+V¬àÒ¥K 0à‰Œ_@ /¡±Š$½%%ÿí|N†Ÿääè“<m,âô¸ÓTýX…øK1©£R©:Q¥³»6º åoW¨8\8YLÑÆ" ÿ¯ŸÝjñ!aâ`BLf 6A6X±Ärˆ%&Ž&jwkkgø‡Ã ùWzz ûÛ0‚·clË€ØD|狞:¥m>М˜ÌìÂì°Yáñ‚Ñg¢q˜èÐ¥§ÉNX ¶ xcï^$< v¡_…rañòÞÔnæü-8”‹ñ³¸?«“û¡£Ù9–PûŒwv%mâT^ÒóûC~3Ø›” “¹<-G/èdiÅåi „p`˜­/û åRü,&»ºw麻'ÞVÖü#ïR¯¾_ã]9;ßœNåÏç3¥ûQßÖÆ¸cG8\&&cò4M{v¹¬‡‡›7oæÖ­[”——wrß¾};GŽ!""‚©S§’——×éð 6žžÎÒ¥K‰ŠŠÂÞ޾˴æÌ™ƒH$bÍš5:§ÿöÛoSXXÈ´iÓX²d •••L™2PÝ1‘––ÆŠ+ˆŽŽfÕªUH$¢¢¢›úé.ÿBúÚqww'((ˆsçα}ûv‚‚‚èׯŸÚ}ìØ±´··³k×.&L˜À‚ Ø´i“FŸpâD"RiÕc÷þŽ÷o&O>‰«ëD¼¼ž#1±˜  Uj÷ðð‰ÿ7·I89Eáïÿ'ìíƒÕaJ¥CCCµÿ_þ355Õ)ýM›6qâÄ ‚‚‚ÔÏСCJÙ®²{·ûö‰‰ìVú‹-ÒÐy[þäûñ¨õÏ“®_µõÚÜ/^Ì¢E‹ˆŽŽæ7Þ@"‘Ö+ýïý¢­ÿÖ¥wqqA"‘0jÔ(üýýñ÷÷ÇÕÕUçñ‰.ã›Y½•¿%K–““ƒD"ÁÅÅ¥×Êw¿ù×V?ûöíãèÑ£DEE±páBÄb±Îw„ùøø¨ÛC`` Ë—/§¢¢‚Y³fé\>mé߯ü´½º|N?éªvvvê4;Ƈ~¨þmbbòÄÈù“O>!11±Ë;–Ÿ„øï§ýܯ~Ò¦ÿzІËÔYµ@ð€N›‹š)ýW)ÁŸS~ Yµ Ñ[" þZ “»6´…×3Ô££¡ƒŽÆôôõÈZ”…ý3öx.òjñ!aæfFGc² ÍךiºÒ„¬Rvg’šÛ ~<yÒÑÜÁ¹çÏ¡”+°ð² 1¿‘º¬:ªS«i)nÁÀ S:z†zl øó` Ì5Ý[JZhºÖDóÕfä­rdå²ÎÚXŸ×}(|·¥B©þØÚaŒøt¶#m±fÓd§N˜n_c}üÞñ#÷µ\¤åÒNîÒr•øÒk]/úk“6º“ß/uSZK‚ ^ôâÚúkXøXôX~ª}ŒÜ1kk - ñø­ý£ú#o’«Ëæþ¼;Y ³pžáŒI Ö z[ôØµŠƒ”þ«ßw|{$Ÿ²–fþ’u–¥§»t÷¶²&¯®–³·«ø±â×074Ò9~}?;‘¢¦F^8}êžþ õõÙ<ê’#Çbqׂ"@qS#… õ6ÔÓ"ïàVkK—é¼5<ˆ·³³+ïÈï!£ø×˜hÂú À®ÓÝ=q23ëQþ× ciÆiÊZZ…û”òÍÍ>¿v…u#Ãz®´´”¥K—Þó+R‘HDNNééé>|˜‚‚,--ÕîÇŽ#$$kkk–-[F\\Û©‰ ëÖ­ãü#r¹\§ôE"¯¾ú*qqq,X°'''–/_ÎÆËåDFFòÞ{ïqòäIÖ­[Gmmí= lmùÒ×­}fggÓÔÔ„D"!;;›ššõâ[JJ 111<÷ÜsüðÃìܹ“ßÿþ÷ª>Kß[[¶¶Ã˜<ùT—;\üý_#)Ï«qvŽÅÕuîîwp—.]Jmm-nnnDDDÐÚÚŠŸß¤‘‘Û‰ÏÀÝ}*>> ™3§‘h‰Ú}ÆŒBC×á艟ßïIJ3dÈ"† y KKOަ¬ì{ŠŠvqèP$~~ËÔF,cckššnR^žBEÅ)rsßçöí,å7fÌgLšt—ñ¸¸Œ#>þ !!ÓðS__Ovv¶úùõ%ØŽŽ8;Çàë»”yóÊqs›¤sú±±û˜:õ'<<âñòš“SdÚX,fË–-ÄÆÆªuÇìÙ³Zú3fä¶GÇHD¢W˜7¯xÃûûûãàà€™™™zñÉÛÛ[£|›7o&66–•+W"•JÕí·7òïé9“¹sKûì3NŸ>MAA---ÔÕÕõJÿ{¿hë¿uéßH}}=eeeäçç“››KYY™Îãmã›]÷›?Μ9Õ+W˜1cFÇo:ÿÝÕ··7‘‘‘üîw¿ãÔ©S|þùç¬ZµŠwÞy§S:FFFìÚµ‹£GvÊÿµk×ÈËËãòåË477SZZªSÙtIÿ~å§íý{åx°úIýó ©­­%77—ÜÜ\š››©®®Vÿ–ÉTk83gΤ´´”yóæAdd$ê8œœœˆ‹‹#88˜Ù³gS\\Ì’%wƯ999¬_¿žÈÈH^yå***ˆ¿3þÙ¶md̘13gεoöìÙdddLVVü13fÌ ¬¬ ;;;Œ‰D 6ŒS§NÔyüÑ]üÚÜu‰ûöíddd0uêT.\HIIIÊ¿íç~õ“6ý/ ÐS4W7»ÙHÒVÓ¦zÑúãûŽ/úÆúÔ_¨GÞ"G!Shu×7éþÈ!má}þì£zÑZädÎÍdà¢o,¦ü@9Ãþ6Lkü÷O]V?=ûz†zô‹è‡ï_}¹¹ã&7¿¸©áÏk™ÆöÆœÿÍyÍÅóMÅx-óÂm®ýžé‡¥È’Û5wày-÷bðÒÁdÌÊ £¹£SÌ=Í1²5ÂÐÆ…TAÿ±ý©¿X¯áÇg…uçê¨>Y­i`ØS†ÿz†¾1”[nQ¾¿¼Ë4î…åPKô õ¨Ï©ïÚƒnvª{ÊGÝÉÏÌà E«‚ë[®3ê›Q4_m¦*¥Š¡«†bhiØ#ù=ˆöaêbŠ•ÈŠÌÄLZn¨Œ¿õ tO(330îg¬ÒÕmä¯ÊGѦÀf„ æè›è£)«öQw¾÷çÝ{$mÍcC^.À‚ÁÞD98ágkË–+º} 0ÀÔ”oÇŽgú‰cH¤R<,ºž¸üÙ/€å¾Ã˜tü{š:Ú;¹²°ÂÎØ[#c¤r9ã]É®¹­áç€@2ªTF¸»Ù}½ˆMaü50˜½7®³§äz—iÜ _[ õõÉúUzO™ÕU¼èݳÝJe÷oØš5kxûí·yùå—7nlذAm` $""‚k×®°lÙ2NŸ>Mhh¨F>>ñì³Ï²iÓ&6mÚÄG}¤Óø¤»ñMoÐ|ï7ŽŽŽ¤¥¥EEEƒ êÑøíaä¿»ú¹víIII9r;;;:í´X½z5o¾ù&aaa]~<åååE¿~ý°³³£µµ•)S¦pöìY­eÓ%ýÞhݽ²|`ðàÁœ?ž‚‚~¶ø»sokkë6þ¸¸8âââpssC¡Pß/_¾Ìwß}ÇÞ½{ÕÒuWþÞêßþý¤‹þè):[…lGØbhaHå‘JŒlŒ003 òh%v!vè›èku¿q²˜êÔêŪÝg“ÎöU¥;K úgVì'‹…š|ˆ(;”Üþé6åÿ.ït„œÅ ܸ“ÿV¾ÆÿæÍñÏŸ¬—²%æâ²‹®)dØß†iø+ú°ˆìW³µ”Ú¨y7-7ZhºÒDåáJ®o¹ŽÓd' wëkœâ(|·ó"OÝ•&#!ñn1~kýðÏ_çr76¡ìPbdó_Ëî^òÑXÌHr£LÿÉÏd€ r©j7AÆÌ rWæ"oUý6îo¬³üTû–KéhîÀ~Ì/> Ì Ôy¬»PGGsŽ“i¯oGÞ*Ç1ΑÚsµjãÖãÔ>l‚lhÈmè5™ ¶²â£°p¤¥²³ø‹ÏüĪ çù tt'¿Ïöfœ³æÖm™\Áü´T, di…›¹jáÈÃÜSƒ;»ÜÖç]bQzGÆMäÍ€Î_]on¤ ¾ŽoÅ7ÙXÇ4w ÷ ;{fy äs:gÏÝ®fô‘o™ôã÷|Qt•„Œâ£°pe__G‡BÁÈ~ý%û”lߟœÚÞ3t2„/¾ø‚)S¦°uëVæÎËòåËÙ¾]uLii)L˜0Ꭾ¶° ¹¹Y#žæÏŸßã£Μ9Ccc#‰‰‰ÔÖÖÒÒÒBBBiiiêŵ   JKKÉÊÊÂ××÷±1néš!ýÿž'NP\\ÌÖ­[»õ×ÞÞ€‘‘•ÆÿEÈåR\]ï}?’‹‹ 999¼ôÒK$''SPP€¹¹¹ªï«+@OÏ{û‘jÿáH¥µqëרÛ@&«E&«¡´ô;ì탱±¹c”öö^@{{3åå)w¸uë8ÇOãò刎Þ@II  Ú%¤îk‚‚¨¬¬D*•RS“ (9uê·$'»©ŸÝ»ÔÆ-較ënãÖ¯Q(dèëë¶Cº®î2zz†89éÖ_G‡êãCCs­q* YúJ¥==ƒµÓ††lmmuòÊíÛ·©®®~ ùïÉûñ¤ëŸ¾®_u¥±±‘ .ðÁ°mÛ6^xá…Ǧ|Úúo]û÷ööv~øávïÞ­>BQÛøDÛøæAs¿ù“ÉdL™2+++|||ðôTÌ3pà@ÌÌÌxùtÿÝ«~RRR‰D8::²páB¬­­;W¯^ͬY³ÈÌÌdíÚµâ.**"77—½{÷ò÷¿ÿ¹sçê\†îÒï‰ü/^|Ï£µ½²|V?ikß3vvvdffòé§ŸâëëK@@{öìéÑøëçŸÆÇLJQ£F±e˶mÛÆ_|ÑåûÑUÛhjR?¬¬:?´Å¯Kú÷Š¿  @mpþ…ððp$‰Ú¸u?ãÏž´Ÿ{éîô“6ý/ ðß ayªø®‚Ô°T..¿ˆR¡$5,•sÏTÇ‚E|Ac~#i1i¤OLÇrˆ%›urWO`;(Û[Fù¿5Ï@Ö¾:µš‚5Œþ÷h Ì ðþ³7y«òhÈiÀ5ÑU¨É‡ÀÐ7†q8‚¨Ÿ¢ÛF{C;Y/j1ã0ÑÆüFõ._h)iáüoÎãÿž?Q?EñÌÏ0 v™³3;¥Ó|­™ÓOÓZÚJTZfîfª]‚µm„ 'úçhF; / ÎÌ8£Vô–ˆë›¯«wj,r¾>„ðCáD§G~8œöúv ×ê\~E›‚¼·òØ€™{g¥ë4Õ‰˜Ì†8=}=b2cÙ¢“|~ÁÐÊ×DWœ§;÷H~ÆýŒ5 AJ¹e‡c{cå÷ÀÚ‡~žü3ÞD¦F2æÇ1 €sóUúEÙ¡$}b:V¾VD¦Fñ}MWšÈYšóصþQýñxÁ£[#eWÌp÷äò´¶Œƒž—§%°?fÅ$žü‘aá\˜:“Ÿâ¦2ÁÅ•É)ßkÄaedÄüA^$xh~áÒÐÞÆõ¦Fõ#nQMÌn¶4!½ë5€+ õDýŽÍMœŸ2O Kdr952?ŽŸÌÅøY? +k&;ªö#ù ÿ2·e~|køNL˜BÎÔ™¤N˜B][oeë¾KQ¦³2ë,ŸŒ~O KAá>¥ŒuræeŸ¡¬<ŸÙ£pIIIH$’““100@"‘pâÄ U›¿r…qãÆ±cÇÄb1ÄÇÇþŸÅ^%êûÕ«WQ(ÄÄÄh¤ñá‡òî»ïvyzwé···ãëëK`` ׯ_'//ÜÜ\Ôá·oߎ‰‰ ß|ó ‰‰DÒ鈵G….ùÒïžmÛ¶¡T*‰ŽŽæõ×_G©TòÒK/©Ý½¼¼8pà999Èd2*++Ù¹s§Ú¥š”¶‘’’@XØz’’ÄÄÆîS«;Zøê+Od²:&M:Áœ97˜=û*cÇ~¨î³*,,$ €]»v±råJV­ZEUU...45•°gÏ@¼½ŸgΜòQ*åì߯ù‡Ïo™5+ÄÄ"ÌÍÙ¿_uÄaMMû÷cøð¿0gÎ  ±´È×_A.—¡¯oLhèß™>ýÚÚÚHHH`ýúõˆÅböíÛ§süº¤¯øKJJ8p Ï?ÿ<%%%äçç#—Ë5>{Ðí§;ý¡M?iÓÿÿ zü缈˜ÌA}˜Ô°Ô>_F÷çÝqžîܥѬ71u6eħ#h,h$wEnŸ“cÀ†ó)ÙZ"´»0´0$øó`Ún·qqÙE튧J‡¼è=„ALù•Ñ­·q13ç_cb¸\_˲̟ûœ7z†Ëuµ|\˜'tLwaihÄ—‘c¹-“òò™ŸhW<^ï׫¯¾Ê‚ zuÑH@àIaÆŒ.]z¢¢‚0:!‹Y½z5Û¶m„!ðIJk×.²³³yï½÷„ò íS@@@@à C0p=%< .§}A á‡Â;Íw?ý3¯å^½žOSgS†ã÷®_Ÿ¬‡€  |y Ð …‘µ£¿ÍðÃÑ7zòTgÊ„ÉÌöì½Ë;ÿß3Q¬6¼×óébfÎã'³~ä¨>ÙŽ6z†W‡ú /Ô¯°16æøøIl ƒ‘~ßš8p€Õ«W / {ß°‚™3/aj:@F™1#/¯½ßèщŒTÝabmíÃüùõÓ¯_Ð/Ï£HßÜÜ'§èÇ6ÿ«W¯æÖ­[ê£zÊ®]»X±b…P>^%''§Ë£»„ö)Ð7X±b—.]bÀ€Odü} U$é-)ùoçs2ü$'GŸìä¹hc§Ç¦êÇ*Ä_ŠI•JÕ‰*ݵÑ]ø+»BÅá ÄÉbŠ6Pø…Üøì†P‹ ¯?xñÌñgðìÜæ¹“À±=W´nóÜ?NLf &&ºM¬š“ƒ]˜V"+<^ð úL4ºôï4Ù ‹Áo,îU ˆ@èW¡\X|¼7…#Æž&ÚÚ93í ’$Œ91“&½ÿŸüH‹g¢‹¿ìMî´Æ9÷ü~Áß ö&eÂd.OKÀQÇ :YZqyZáfkÇË>C¹?‹É®î]úŸî•5ÿȻԫ2ïìÊÁØ üæt*>Ÿ!4º§ˆú¶6Æ;Âá21“§áhúd^.»dÉrrrH$¸¸¸tégΜ9ˆD"Ö¬Yó_…¼ýöÛ2mÚ4–,YBeeåC½„úIOßÝÝ   Î;ÇöíÛ ¢_¿~j÷±cÇÒÞÞή]»˜0a ,`Ó¦Mq|‰‰H¥U]»7îßLž|W׉xy=Gbb1AA«Ôîááÿ3nn“prŠÂßÿOØÛª;”J%†††jÿ¿ügjjªSú›6mâĉ©Ÿ¡C‡>”²74\e÷nöí=Ù?¬ô½¼æøÿ=¶ùÿý÷™0a•••}Nÿôuý*”¯ûþßÅʼnD¨Q£ð÷÷ÇßßWWÍùÁ† HOOgéÒ¥DEEaooÿX”ÉÀÀ€´´4V¬XAtt4«V­B"‘¥Sùt ÿ0èN¾ºÔϽðññQ—'00åË—SQQÁ¬Y³„‰@Ÿ×vvvêwæØ±c|øá‡êß&&&OŒ ?ù仼£ùIˆÿ~ô·6öíÛÇÑ£G‰ŠŠbáÂ…ˆÅâ.ïx{\ç¿O.SgS|ÿêKÀ?:yl.j¦ô_¥LùrdÕ2Do‰(økNîÚÐ^ÏPކ:;ÐÓ×#kQöÏØã¹ÈS¨Å‡€…—îÏ»“µ0 çΘô7¡`M¢·uŸêë3jß(Z®·ýJö=ýéê°!€àσ107Ðpk)i¡éZÍW›‘·Ê‘•˺LÇçu ß-D©Pªÿ¶v#>íH[¬‡Yã4Ù G“åßï?r_ËEZ.ÅSJÅÁ JÿUŠï;¾½§•5/z!)í³=2ÀÔŒUÎñ#BtŽÃD߀ÃÏN¤¨©‘NŸº§?C}}6z†äȱXܵ PÜÔHaC=… õ´È;¸ÕÚÒe:o âíì,äÊ;ï×?BFñ¯1Ñ„õ@€]?¦»{âdfÖ£ü¯ÆÒŒÓ”µ´ í)å››%|~í ëF†=Qù611áÌ™3\¹r…3ftëoݺuüñD.—÷8ü£@$ñꫯÇ‚ prrbùòålܸQH_GJKKÉÎΦ©© ‰DBvv6555xxx’’BLL Ï=÷?üð;wîä÷¿ÿ½jì¡oŒ­­[ÛaLž|ªË.þþ¯‘”$fĈÕ8;Çâê:w÷; K—.¥¶¶777"""hmmÅÏïÎNÒÈÈíÄÇgàî>Ÿ…Ì™S‚H´Dí>cF¡¡ëptŒÄÏï÷$%‰2dC†¼„¥¥'‡GSVö=EE»8t(?¿ej#–±±5MM7)/O¡¢â¹¹ïsûv–Îò3æ3&M:‹Ëx\\Ɔ¿iø©¯¯';;[ýüúlGÇœcðõ]ʼy帹MÒ9ýØØ}LúñxyÍÇÉ)²GmH,³eËbccÕïþìÙ³Zú3fä¶GÇHD¢W˜7¯xÃÛÚŠ05€éÚ¢+«AåÛ¼y3±±±¬\¹©Tªn¿½‘OÏ™Ì[ÊàÁóppˆÀÉ)‡ˆÿ´-cüýý äÒ¥K„„„ô)ýÓ×õ«P>íýÿÀ©¯¯§¬¬Œüü|rss)++S»;vŒ¬­­Y¶lqqq466>e“ËåDFFòÞ{ïqòäIÖ­[Gmm­†¨»òéþA£M¾Úê猌ŒØµkGÅÒÒRÃíÚµkäååqùòeš››)--&}^?ÖÖÖ’››Knn.ÍÍÍTWW«Ëdª5¾™3gRZZʼy󈈈 22’ˆˆuNNNÄÅÅÌìÙ³)..fÉ’;ãלœÖ¯_Odd$¯¼ò ÄÇßÿlÛ¶ƒ2fÌ‚ƒƒ™3gŽÚ@={öl222&++‹?þ˜3fPVV†ÆÆÆˆD"† Æ©S§ ê<>ï.~mîºÄ¿}ûv222˜:u* .¤¤¤¤Gå¿_ýÝÞÞÞDFFò»ßýŽS§Nñù石jÕ*Þyç'bþ+ðd¢¹º©wom5mª­¿1¾ïø¢o¬Oý…zä-r2…Vw}“îÒÞçÏ>ª­ENæÜL.HñÆbÊ”3ìoôÆ/p÷3VÕSuù«òQ´)°aƒ¹ú&ú(dŠîÃ÷7&ì«0Î&EV%Ã̽ë…o¯å^ ^:˜ŒYt4wtr7÷4ÇÈÖCCRýÇö§þb½†Ÿ>Ô«£údµÆÿe{Êð´Ø`í IDAT_ïÏÐ7†rëÀ-Ê÷—w™Æ½°j‰ž¡õ9õBƒxÊ©;_‡ûó½‰ê+õ*©”ç3‘É„Ø÷ÇÂÐS¤w-„wÅSS¾;žé'Ž!‘Jñ°°ìÒߟýXî;ŒIÇ¿§©£½“û +ìŒM°52F*—3ÞÙ•ìšÛ~Þ$£ªŠ+niü¿ûz›Â"øk`0{o\gOÉõ.Ó¸¾6¶êë“õ«ôž>2««xÑ{è“_GGGÒÒÒˆŠŠ¢¢¢‚Aƒî}èÚµkIKKãÈ‘#ÿUøGÁ/GbTVV²dÉd2áááXZZbjjŠT*Ò¿¼¼TG)_¸p¡Kw…¢ººLLúuéngÀðááСHêë »ô³yóf¾ýö[®^½JUUÖÖÖ´·«ô³›[nnq$'»¡TªÆruu—?þ;®_ß‹L¦2ÄÕÔ\¤²2ÊÊ4ªªÎ2~üAnÜø33GZ[+4Òkm­”˜™©Ž‹;yòy@—gñó[†¥¥;©©ó¨«Óþœ‡Ç4<<âQ(ÚˆŠú\ýÿ!/’½†ŽŽflll4&ÿÅÅÅ444¨WV¦S^žJyy*––ƒðòz±øˆÖôÝÜ&áèΗ_ºòŸk‹0 ##‹ÕóÙ³gIII!%%…Aƒ±páB¾þú뇖þíÛÙêú³´ô`ðàyܼyP·1O]Rir¹ôžu–••¥._zz:iii$''cjÚ+ùW(dÙyþØÖFnn.ýû÷ï“ú§¯ë÷§½|ºôÿéééøøø`ddijÏ>˦M›Ø´i}ôÁµk×X¶l§OŸ&44ô±ª‹?üá,]º”I“&Q\\¬Sùt ÿ ÑE¾ºäõêÕ¼ù曄……ui|ôòò¢_¿~ØÙÙÑÚÚÊ”)S8{ö¬0!ô? “ÉøòË/»t355eþüù„††ÒÑÑT*%66–-[¶¨ýdgg“––FZZÌ›7ƒUãŸÏ>ûŒ;vðþûï³cÇvìØ¡ñŽ644••Źsç‹Å8p€>ø€Áƒsþüy 4Ndø5Úâïν­­­Ûøãâ∋‹ÃÍÍ …B5~¿|ù2ß}÷{÷îUH×]ùïWwǵk×HJJâÈ‘#ØÙÙ©åùËN´Ç}þ+ðd¢³UÈv„-††T©ÄÈÆ3*Vbb‡¾‰¾V÷»'‹©N­îQü Ú½s6é,a_…Qº³” a5Ì q²X¨ÉLÝ…::š;pœäH{};òV9ŽqŽÔž«ídÜrKr£ŒæDS!Sµ(  Ìšcæ¢2p™¹™a`zg—VчEd¿šÍ¨ý£ÔFÍ»i¹ÑBÓ•&*Wr}Ëuœ&;i¸[XãïDá»…]–á§g"#!ñn1~kýðÏ_g46¡ìPbd#4ˆ§› rz-¾s5Õ4u´3Í݃º¶6ZåLus'£ºª“qëùÁÞŒsÖܺ-“+˜Ÿ–Š…¡ƒ,­p3W-y˜[bjpçýZŸw‰Eéi7‘7:t½¹‘‚ú:¾ßdcAÓÜ=4܃ìì™å1ÿÍ9ß¹ ·«}ä[&ýø=_]å!£ø(,\gä××Ñ¡P0²_¡=åÛ÷'§öÉ1tÊd2¦L™‚••>>>xzªv–8³»v1†„„0þ|^{íµÿ*ü£âÌ™3466’˜˜Hmm----$$$––öP&¿}=ý'NP\\ÌÖ­[»õ×ÞÞ€‘‘•ÆÿEÈåR\]Çß3¬‹‹ 999¼ôÒK$''SPP€¹¹¹jlTW€žž!öö#Õþ‘J%jãÖ¯±·LV‹LVCiéwØÛccsÇ(íí½€ööfÊËSî ¥äÖ­ã?>Ë—?":z%%%øûßQYY‰T*¥¦&PrêÔoINvS?»w;¨[Ðy×ÝÆ­_£PÈÐ×7Òmü[w==CœœÆt믣CµóØÐÐ\kœ …ƒG–¾R©@OÏ Gí´½½ ##kü†††rûömª««Hþ»â—ú¶¶¶îSú§¯ë×§½|=éÿÛÛÛùá‡ؽ{·ú±ÒÒR™0a‚ÚŸ……ÍÍÍMQZZJVV¾¾¾÷\íª|= ÿ è‰|ï•P¸fÍšEff&k×®í¶¨¨ˆÜÜ\öîÝËßÿþwæÎ+Lý¯;;;233ùôÓOñõõ% €={öôhüõóÏ?ãããèQ£Ø²e Û¶mã‹/¾ènñâÅ]¾»MMªñ¹••U'7mñë’þ½â/((ÀÐБ#ïŒßÃÃÑH$jãÖýŒ?{¢/^Üåу)))ˆD"Y¸p!ÖÖÖêyðã>ÿx2ѰJ¥œýû5?òñù-³f员X„¹¹3û÷«Ž8¬©Éaÿþa þæÌ¹ABB!––ùúë!Èå2ôõ ý;Ó§Ÿ')©ŒY³ré×/#GžU·s///Ö®]KMM eeeøúúâííýŸ‰ýM’“ÝqpgæÌK$%‰™6í,ƒ%jäoúôé(•JG$ºÿ{©ššn²g'nnS˜=û*sç–âàNuµfÿ&—K9yrááÿS?_÷Jû{ÔéßYHù'·n#1±ˆÄÄ"uûú…W^y…ÊÊJêëëqssÃÑÑñ¡æ¿­­qãÆ±eˤR)Çïú§¯ë×§½|ºôÿï¿ÿ>—.]B,“žžNmm­z!Q©T ^x¼zõ* …‚˜˜˜Ç¦¶oߎ‰‰ ß|ó ‰‰D¢q„lwåÓ%ü]ÿÐA¾Úòÿ ùùùêxnÞ¼ÉàÁƒimmýÿÙ{ó°*«µñÿÃ<ƒ¨Ì£ ‚( (ƒ3Nˆâ€¦çÍ,-,= Öû+û깬ãI-+ÍŽiúf¢”Yž,µ4DITÝ2¨ ÊfFæi{óûcŸvî@Ø$àó¹®çý¬ñ¾×Z÷šöZååå\ºt‰ÂÂBRSSquuUZ°ìÇTVV2nÜ8^}õUòòòÈÏÏ'<<‘H¤r›6mâòåËpùòe***øûßÿÞíñGdd$[¶lA,søða•ãW%ý{ÅŸ——‡££#K–,!//ÌÌL¤R©ÒÆ´ýù Ë–-cñâÅíÂïÚµ‹ŒŒ öïßOss3$%%õŠù¯@ïDÿÞš*h£ïßçe´[b‡Õ,+Ræ>Ø…Q]+]F|6‚Ú¬ZDkD}Nž[=©Í¨%oWžÐpîBÓ@Ÿ½>4ßiæòªËÈZdO”üÏ8!Ò~Óã~z éXëéóåØP®VW²*å·>§Çþc¸ZUÉ'ÙB£º CM-㎤‰ç’~¥EÖ·Ú×Ê•+Y¼x1Ba ô:""Ò¹re399ûe´C,³~ýzvïÞ-(C ×CZZ›7oäê§€€€€@/CØàzBx6¸ž Ô<.üÐîjÃûÁûßÞ8­vêñ|êZép4÷wÝû¤þ<·zâøœ£P?þ„–±£¿ÍðmÃQ×ê}¦3nò4æ:ôÜÇ;ÿoL0k† ïñ|Zëéóˤiléß'íÜÿ1¬ꎀ2&ÚÚœš4•]cÑRïýC“#Gް~ýz¡`z OÏ5Ìž}]]3AÝ$""'§Å=ßèÑÛ Ú€±± ‹•*žþý½¸<"}}},-CÛü¯_¿žÂÂBÅÕˆÝ%&&†5kÖò ô(ééé^Ý%È'ÔO¾Áš5k¸rå fff½2~¾„Ò*RSa™ë29p†3£Ï´óœ³-‡sÏQöKâƒbâýã);]¦²{WtþÚ¿®Q|¬q¬˜œm9dÿ3›[ŸßJ±PSWÃ7ÖÇç1õ7eðÊÁ„¦„bêgªðãô’cNÁl‚¶ m MÅl\÷ ­íB[~ 4%sÕ&ÖŽúŠü¹aÿ´=!I!˜O1ïпå4K »­g?Dk6Þ ß¯|¹´üouïŠ1]k]ÜþáFÈo!„$µ_$°²Åf¾ ¦þ¦ za¡)¡˜x™¨¾'õ÷Wòïõ‰>{|0õ3Åf® Áç‚:°ÏÔ–š’“(ý¹”±§Ç¢c¦Ó£uËV߀ùøryæ.ÏœóPÃ24âjx$fæ ëgÊs.C¹2sÓlì:ô?ËÎg#c>ȸң:˜deÃÑñ“ùÛ¹x^»˜,æ'ˆêæf&ž<α1ÉÓ±Ð}¸ß9´··gÇŽRT¤üP X³f !!!¬]»–ÒÒR‚ƒƒ;Œkþüù¸ºº²aÆÿ£`ݺudggΊ+())i÷u!ý{cgg‡··7.\`Ïž=x{{Ó¿…û¸qãhii!&&†É“'³xñb¶oß®GVÖ§œ>=¦¦²Ç®ýNœø¦M;ƒÍœœžbÞ¼\¼½×*Ü>aæÌß°µŠ¥e0¯2`€ ÿFX[[ššš ÿ¿¿ÓÕÕU)ýíÛ·súôi¼½½ÏСCŠì55×9pÀœÃ‡]‰îVúNN‹ðòúÿÛü¿ÿþûLž<™’’’>gúº}½ŸþY÷)Ÿ*ý·µµ5¥¥¥øûûãáᇇ666=þw¶nÝJbb"ÑÑÑ3`À€‡¦ÿ‘#G*=±±±üòË/ ›Þ•þ÷ìÙÃñãÇ dÆŒdddðÊ+¯¨ÿƒ–ïðáÜ8q‚àà`–.]ŠX,n÷­¿ªEy{yy±zõjŠ‹‹™3GõyÜòåËY¶l!!!¼ùæ›”––âçç×cãË®ÊçAË'Ð9]Ù‡®Úσn_ajjªÈóÉ“'ù裿uttzM|úé§Ì›7¯Ý7–{Kü÷Ó¿u…*ö`ÅŠ¤§§SZZеµµÐ°þ2J\ºVòlÏ<Ûy¬Ï©'ÿË||öúPt¤I¹×·]ÉúG–Jî]ÑUx5M5ZkZi­mEM]Ôe© 3‡eB)öm²6ÎG'oW•É•äíÊ£¥¦­~Z8`·ÄŽÔ¥©XEX¡3P‡¬ Y¸®S}Bª®­Žÿan6ö|Ú=ý©iªá¹ÕŸ½>hèk(¹5ä5Pw£ŽúëõH¥HŠ$¦ãò† ÙïfÓ&kS¼¶q#>A¿‘ý0fŒå4Kt,tº•÷wܽ"¢©¨©Û:n*’o _y¥ãMq¬˜‚¯ ¨ºPE}®\¾–ê•Ã÷”þþJþõô1õ5%s]&•)•|SÀnàü²sŸ«ÅG‹Éÿ2·wÜz´ 4Ôó¿©ç‰N>÷@Ãkª«³Ã ±Aã0øÓà5·®–ìšj²kªi¶RØØÐ.¼Žºo÷f]Z*Ò¶?ô÷Á(¾‚ß@3K]›~ý\é×oÓ¦íð„‹‡Ç+DE‰1b=VVã±±™ŒÝ ˆÑÑÑTVVbkkK`` ¸»ÿq’4(h3g&cg7—¥ÌŸŸ‡«ë …{DD:¾¾›°°ÂÝýE¢¢Ä ² €!CžÅÐÐcÇB((ø‰œœ~ü1w÷UŠM,mmcêênSTGqñYD¢÷¹s'Ueýû9S§žÆÚzÖÖ™93‰Q£þ¥ä§ººš´´4Åóç`[XbeŠ›[4 ak;UåôÇ?ÌŒ¿bo?'§EXZu«‰ÅbvîÜÉøñã¶aîܹ-ýˆˆtüü¶`a„«ëó,\XŒ½ýL•Ã÷ë犮®ºÿ­‹® R’oÇŽŒ?ž×_¦¦&Eýí‰ü;8ÌfÁ‚|^ˆ¹y ––A˜›þ·niãáá——W®\aÔ¨Q}Êþôuûz¿ýsWîZ>UúoGGGª««)(( 33‘HDAAA„8yò$£FÂØØ˜U«VFmmíCÓÿÅ‹Ï+¯¼Bmm-&L µµU%ý»ºº’žžNbb"ÇŽ#++ CCC•âÐò9;;Ä /¼ÀÙ³gÙ»w/k×®åwÞé¶þµ´´ˆ‰‰áĉJòܸqƒŒŒ ®^½J}}=ùùù*çÿ³Ï>ãóÏ?çܹsdeeÑÐÐ@UUU/»*Ÿ-Ÿ@çteºj?º}uFee%"‘‘HD}}=åååŠß‰| göìÙäçç³páB "00P‡¥¥%aaaøøø0wî\rssY±âñkzz:[¶l!((ˆçŸžââbfÎücü³{÷nŽ=ÊØ±cñññaþüùŠ Â¹sç’œœŒ©©©|òÉ'DDDPPP€©©)ÚÚÚ¸ºº2lØ0Ξ=‹·wûñygñwå®Jü{öì!99™3f°téRòòòº%ÿýöo¡ŠýÔÑÑ!))‰k×®!4hûFyuSíÞ›+šå m 6n︡®­Nõ¥j¤ RdY—îê:_9ÔUx—×\ä ­AJÊ‚—9’»-—¢#E û×°.ãPû¿Ùc÷”|3«1¿Q^.ýµååTÞLæÚLdÍ2LF˜ ¡¯ºŽ:2‰¬Ó8µjã÷•ç£Î#)“ g×ñ·Ój'G&yN2­õí;V}}´úi¡i¢‰¬IÆÀq©¾\­äÇe Uª(?S®¼ðu[<úæP RômQ‡iÜ Ã¡†¨iªQ^ý×Û¦Bƒ4ÐDÏA=k=Ô4Õ0ö4¦!¯Aåð=¡¿¿’ÿ†[ \^}ŸÏ}Ð2‘oжֵ*ÚuWô¶úQu± »%v=ÚîÚBø×Ü=Yí6Œ©§~¢®µ¥û #Lµuè§¥M“TÊ$+Ò*î(ùyÓÓ‹ä²2~).TzàfÛýù‡—‡nÝäë¼›¦q/ÜLú¡©®NêŸÒxòH)/ãç¡5Ͷ6ÕZàK/½Dtt4S§N%7·ý Ð7’ÀñãÇHü‚߯Ä())aÅŠH$044DWW—¦¦&!ýûÀÉI~Uî¥K—:t—Éš©ªÊBG§‡î¦¦ž þ¿üøcÕÕÙúÙ±cßÿ=ׯ_§¬¬ cccZZäöÙÖ6 [Û0bcmik“媪®2iÒܼy‰D¾WQq™’’JJ(+;ϤIG¹uë;ôô,hl,VJ¯±±hCOO~]Ü™3K5¬­'àî¾ CC;âãRUÕõŸàìíñ·Ÿ‰LÖLpð^Åû!Cž!-m­­õ˜˜˜(Mþsss©©©Qü.)I¤¨(ž¢¢x áäôbññ.Ó·µŠ…EÚ(zZ3³´´ ºUÎçÏŸ'..ޏ¸8 ÄÒ¥Kùæ›oZúwî¤)ÊÏÐОÁƒrûöQ•ÂVUeÑÔT†TÚtÏ2KMMUÈ—˜˜HBB±±±èêúöHþe2 ¹¹ÛÏ››‰D 8°OÚŸ¾nß{¢îÌýaÊw¯þ;11´´´˜0aÛ·ogûöí|üñÇ÷ÞÞÞ///¹qã«V­âܹsøúú>ÔñÑúõë177gÒ¤IÝÒÿ† X·nÏ=÷'NÄËË‹­[·ªÿƒ–ïÆDEEqüøqLMå·ÚÔÔÔ(NR¨ªÿõë×óÖ[oáçç×áæ—““ýû÷ÇÔÔ”ÆÆF¦OŸÎùóçU–ÁÈÈgggìííÑÔÔdäÈ‘\»v­GÆ—ª”σ–OàÞ¨j_ºj?ª}õ‰„ƒv覫«Ë¢E‹ðõõ¥µµ•¦¦&ÆÏÎ;~ÒÒÒHHH !!{{{.\ÈÑ£òñÏçŸξ}ûxÿý÷Ù·oûöíSªÃ555¤¦¦ráÂÄb1GŽáÃ?dðàÁ\¼x‘¬¬,¥þLWñwæÞÜÜÜiüaaa„……akk‹L&¿_½z•~øC‡)þH×™ü÷Û¿uFWöÓ‚„„‚ƒƒ)..fРABƒ¸oTÞê7¢šš”/AËD = JN”`:Êuõ.ÝïF+¦<¾¼[ñƒütÆù¨óø}åGþþ|¼ÿíÑ0#ıb¡${#7#‚ ¦æj 禜SlnT]ª¢µ¾‹©´T· m”bfAå…Êv›[¶Q¶í®¦“Id¤.KEÃ@}G}ô¬åz¶zhèþq 'ç£ÒV¦áÿ­¿bSónn5Pw­Ž’c%ÜÜyËi–JîÆžÆXδ$ûÝö‹ Æ}£;›=TÖO]vm­m˜x›<°2h­o¥6£–[{oQðU6‘6Ý ¿ú»*~«àÜäsÄûÇ#zC„¦¡f‡åÐꇉ· 5¢šGÒN— vf¢Õ_;º½%ã Ë8>q oy¶ÿÐÍúZ²ª«ø^|›mY„ÛÙ+¹{›`޽#ÿ/ýb»°î”3úø÷Lýå'¾È¹Î£üùØ/@å¼eVWÑ*“1²ÿ@Á?áø HzåãµÑéííM~~>©©©¸¹¹u8¸5j‹-Rùê–îÆÿ¨HJJ¢¶¶–yóæQYYICC‘‘‘$$$<”ÅϾžþéÓ§ÉÍÍe×®]úki©@KËHé}mmRi66÷^”°¶¶&==gŸ}–ØØX²²²Ð××—÷}UY¨©i2`ÀH…sóššJ›[fÀ€H$•H$äçÿÀ€>˜˜ü±)í켘––zŠŠâî^F¤°ð§N…sõêÇ„„Ä——€‡‡‡R{())¡©©‰ŠŠ4 ³gÿ‡ØX[Åsà€¹bs ÚŸàº{sëÏÈdÔÕµT*Ÿªª«¨©ibi9¶óñ[«üÏHššú]Æ)“ÉÐÐÐxdé·µÉPSÓèV=mi©CKËX%¿¾¾¾Ü¹s‡òòò’ÿŽø½¼û”ýéëöµ/ȧjÿÝÒÒÂÏ?ÿÌ”®è»ŸðùùùÔÖÖ2yòd…?êë몞‡Jtt4/¼ðB·ô?dȾøâ ¦OŸÎ®]»X°`«W¯fÏž=*Åÿ0ˆ‹‹ÃÕÕ –.]б±±bœ§ªþׯ_Ïœ9sHIIaãÆíçï99ˆD":Ä{ï½Ç‚ º•ÇÚÚZ.]ºÄ‡~ÈîÝ»yúé§»]¿–/_Þîê0UËçAË' Jݱ}Q¥ý<Êöu?˜šš’’’ÂgŸ}†››žžž|ýõ×ÝýöÛo¸¸¸àïïÏÎ;Ù½{7_|ñE‡í££º PW'Ÿµsë*~UÒ¿WüYYYŠ íß  ´´T±¹u?ãÏûµ]ÙO‰DÂôéÓ122ÂÅÅùÍlŽŽŽèéé Zà/¡´óTüC1ñ~ñ\^}™6Yñ~ñ\xê ¿,ð§@j3kIM qJ"†C ñÚᥒ»bSÛJÁ¡Šþ£|ÇqWáËãËÉÚÅèÿŒFC_çלÉX›AMz 6ól„’솽7 umu¼?õ&4%”ДPÆœ#Ÿ ·¶‘8%#7#‚âƒü)ºku¤G§+Å¡i¤‰Í<¬fYµ+÷†¼ÅÓX(ß}Zá¾gÏtttøî»ï(--¥´´´Ýh}ôï¾ûn‡w¤÷DürÒìææ†——7oÞ$##‘HDdd¤¾ŠìÞ½›¶¶6BBBxã7hkkãÙgŸU¸;99qäÈÒÓÓ‘H$”””°ÿ~Å&”|RÚL\\$~~[ˆŠ3~üayÿÙÚÀW_9 ‘T1uêiæÏ¿Åܹ×7î+@þ=«ììl<==‰‰‰áõ×_gíÚµ”••ammM]]_툳óæÏÏ#22“¶6)ß~«ü—ÿaΜ æÍËA_ߊo¿•_qXQ‘ηßcøðÿeþü[DFfchèÈ7ß A*• ®®¯ï{Ìšu‘¨¨æÌÑ¿¿ÇOä\NNNlܸ‘ŠŠ pssÃÙÙù¿ûÛÄÆÚanÀìÙWˆŠ~žAƒæ)åoÖ¬Y´µµ)=®®÷ÿ]ªººÛ|ýµ¶¶Ó™;÷: äcn@y¹rÿ&•6qæÌb¶ý·|¾é‘ú÷¨Óÿc!åßždÞ¼æÍËQÔ¯ßyþùç)))¡ºº[[[,,,jþ›››™8q";w©‰S§Nõ ûÓ×íkOôϹ? ùºê¿ßÿ}®\¹‚X,&11‘ÊÊJ¥…Àû ßÖÖ†§§§báñúõëÈd2BCCšþA~XZZšâ“ªõëÚµkLœ8‘}ûö!‹ÉÊÊbæÌ™¨ÿÃo×®]ddd°ÿ~š››±°° ))©ÛúÏÌÌTø»}û6ƒ¦±±‘òòr.]ºDaa!©©©¸ºº*-Xw††††"………\¼x‘òòònÕ/Ÿ€^¶lY»kU-Ÿ%Ÿ@×te_Ti?²}=H*++7n¯¾ú*yyyäççŽH$R9ŽM›6qùòe ¸|ù2üýïïöø#22’-[¶ ‹9|ø°Êñ«’þ½âÏËËÃÑÑ‘%K–——Gff&R©TécºëÌ~te?«ªª¸~ýºâ¹uë–B®ÆÆF¡q ü%Ôøï}¡)¡‚6ú0ñ~ñ}^F»%vXͲ"eîƒ]ÕµÒeÄg#¨ÍªE´FÔçôè¹Õ“ÚŒZòvå õã.4 4ñÙëCóf.¯ºŒ¬EöDÙgœ‡i?ˆéq?=Ðt¬õôùrl(W«+Y•ò[ŸÓãÿ1\­ªä“ì ¡cº CM-㎤‰ç’~¥EÖ»Ú×Ê•+Y¼xq‡“~ÞNDD:W®l&'g¿  vˆÅbÖ¯_ÏîÝ»eôZbbbHKKcóæÍ‚|Býèe\OO—€€€€€€€€€€€€€€€€€€€€€€À“º Ç…€Ú]]w?xÿÛ§ÕN=žO]+]Žàþ®{Ÿ,Ï­ž8>ç(TÈ?¡e¬ÅèïG3|ÛpÔµzŸéŒ›<¹=÷ñÎÿÌšaÃ{<ŸÖzúü2i[Fú÷Éz´Ã +‡º êO˜hksjÒTvŒEK½ïMŽ9Âúõë…‚P½oö\ÃìÙWÐÕ5”ÑM""ÒqrZÜcñ½  ù7HŒ]X´¨TñôïïýÀåyéÛÙÙõØÇçDþ…ö!p¿ÄÄİfÍA>%==½Ã«»„ú)Ð7X³f W®\ÁÌ̬WÆ/ ЗPZEj*l"s]&gÎpfô™vžs¶åpnâ9Ê~)C|PL¼$œ^rbÌ©1˜M0Ãv¡-¡É¡˜ë¾¡µ]hKÀ„¦„¢c®£R}G}BSB1õ3ÅÈÕû§í I Á|Šy‡þ-§Yb0Ø€Üm¹=ª³ñfø~åË¥å—ÈxK¸bìI¢¥¦…¤ð$J.eìé±è˜éôhü¯º{’6“)Ö¶üm°3¢ðH&Zuÿû‚ìLÜäi\ ÄBÅt24âjx$fæ ëgÊs.C¹2sÓlì:ô?ËÎg#c>ȸң:˜deÃÑñ“ùÛ¹x^»˜,Tº'ˆêæf&ž<α1ÉÓ±Ðí]—]·nÙÙÙ„‡‡³bÅ JJJÚ}äùwæÏŸ««+6lhç¶bÅ ÒÓÓ)--ÅÚÚºWÊ'¤ß;;;¼½½¹pá{öìÁÛÛ›þýû+ÜÇGKK 111Lž<™Å‹³}ûv¥8²²>åôéy45•=võâÄÿ0mÚll¦àäôóæåâí½Váð 3gþ†­íT,-ƒñðx•|ù7ÂÚÚÚÐÔÔTøÿý®®®Jéõ/&LøSSÅclìüPd¯©¹Îæ>ìúHtÿ°Ò_¶lY‡6ëqÉÿƒlÚþôuûú¤ËgooÏŽ;(,,¤¨¨¨»µµ5¥¥¥øûûãáᇇ66òù†† ¬Y³†Ö®]Kii)ÁÁÁ½B>UòøðaNœ8App0K—.E,·ûÆPo­_... y½¼¼X½z5ÅÅÅÌ™3G˜ôyûhjjª°i'Ožä£>RüÖÑÑé5:üôÓO™7o^‡ß`î ñß‹žè_TµßëüW ÷¡´Á¥k¥‹Û?ÜðüÀ³Çúœzò¿ÌÇg¯EGŠ”Kp}Û•¬d©äÞ]…WÓT£µ¦•ÖÚVÔÔÕH]–Ê€1pXæ ”âCÀÀÉ»%v¤.MÅ* :dmÈÂuêRumuüûÓp³´çÓîéOMS Ï­žøìõAC_CÉ­!¯ºuÔ_¯GÚ(ER$é0—7\È~7›6Y›âý°ÃñÙúì‡ñ0c,§Y¢c¡Ó­ü»¿ãŽèMEMB¥xB)>ZLþ—ù¸½ãÖcqºóŒó¢N3×Á3]=Ö^ºÀ?GŒR9u ŽM˜BN]-OŸ;{OšêêìðClÐ8 îZPÈ­«%»¦šìšj¤­66t˜ÎÛýY—–Š´íöõÁ(¾‚ß@3r‘ޝï&,,‚pw‘¨(1C†,`Èg14tàØ± ~"''† ÂÝ}•bK[Û˜ººÛÅQ\|‘è}îÜIUYcÇ~ÎÔ©§±¶ž„µõDfÎLbÔ¨)ùii©¥²R¤xjj”?–naˆ•U(nnÑ,\X„­íT•Ó?þ03füнýLœœaiÔ­:$‹Ù¹s'ãÇW´ý¹sç>´ô#"ÒñóÛ‚…E®®Ï³pa1öö3Uïáá¹¹9zzzŠÅ'ggg%ùvìØÁøñãyýõ×ijjRÔߞȿƒÃl,Ègðà…˜›bi„¹y Êí£7ÛŸ¾n_ùäýCttô=Où8::R]]MAA™™™ˆD" J¥±yófΜ9æM›¨¬¬dÀ€½B¾®òïììLPP/¼ðgÏžeïÞ½¬]»–wÞy§×Õ/---bbb8qↆ†Jn7nÜ ##ƒ«W¯R__O~~¾0!èóö±²²‘H„H$¢¾¾žòòrÅo‰D¾Æ7{ölòóóY¸p!¨ˆÃÒÒ’°°0|||˜;w.¹¹¹¬X±BážžžÎ–-[ âù矧¸¸˜™3ÿÿìÞ½›£G2vìX|||˜?¾âsçÎ%99RSSùä“Oˆˆˆ   SSS´µµquueذaœ={oïöãÎâïÊ]•ø÷ìÙCrr23fÌ`éÒ¥äååuKþθßþEûý8Ïz'Ê«›j÷öØ\Ñ,ohµq{Ç umuª/U#m"“ȺtW×éüÊ¡®Â»¼æ"oh RR¤à¸Ì‘Üm¹)bØ¿†u¿Àý¡Ý_[^NåÍd®ÍDÖ,Ãd„ ú¨ë¨#“È:?P¿¯ü8uI™=»Ž¾V;18z0És’i­omç®ï V?-4M4‘5É8n Õ—«•ü¸¬q¡êBågÊ•Þ|]€Ç†¾9”Â#…}[Ôa÷Âp¨!jšjT§W â §êbvKìz,¾:ò©—55±æb ©ŒQb ©‰®†Mw-„w„™®.ߛĬÓ')mjÂÞÀ°C¯¹{²ÚmSOýD]kK;÷AF˜jëÐOK›&©”IV6¤UÜQòó¦§ÉeeüR\¨ôþÀͶûò/ݺÉ×y7;Lã^¸™ôCS]Ô?¥'ðä‘R^Æ3ÎC{M~¿2¢¤¤„+V ‘HÀÐÐ]]]ššþøCÄÆIHHàøñãŠw$$$Lqq1ƒ êµò éw''ùUÊ—.]êÐ]&k¦ª* þº1‚ 60lØ022:>Y¾cǾÿþ{®_¿NYYÆÆÆ´´Èísxx8³fÍBGG™L¦˜ÿúë¯ìß¿ŸòrùXª¢â2%% ””$PVvžI“ŽrëÖwèéYÐØX¬”^cc ІžžgÎ,Ô°¶ž€»û* íˆ_HUUׂ³·ÇÞ~&2Y3ÁÁ{ï‡ y†´´ ´¶ÖÿwñÐSS…{]Ý-ZZj¿KJ)*Ч¨(CÃA89=…X|¼Ëômm§baÀÁƒ6ü÷³Å˜™ ¥eЭr>þ6eЕ|åÿÆDEEqüøqLMM¨©©yè'î·~­_¿ž·Þz ???jkk;ôïßSSS™>}:çÏŸ&‚ý$ ìÐMWW—E‹áëëKkk+MMMŒ?ž;w*ü¤¥¥‘@BBööö,\¸£GåãŸÏ?ÿœ}ûöñþûï³oß>öíÛ§ÔFkjjHMMåÂ… ˆÅbŽ9‡~ÈàÁƒ¹xñ"YYYJ72ü™®âï̽¹¹¹ÓøÃ ÃÖÖV1~¿zõ*?üð‡Rü‘®3ùUå¯ô/]ÙïÇ}þ+Ð;QyW¨ßˆ~hhRr¼--4ô4(9Q‚é(SÔuÔ»t¿q¬˜òøònÅòÓ;ç£Îã÷•ùûóñþ·7FÌNJ…’|ÀT]ª¢µ¾‹©´T· m”bfAå…Êv›[¶Q¶ ¨<•ÈH]–ІúŽúèYË7¸ôlõÐÐýã”VÎG9¤­LÃÿ[ŦæÝ4Üj îZ%ÇJ¸¹ó&–Ó,•Ü=±œiIö»ÙÊðë„_IŽLF|@ŒûFw<6{¨¬ƒºì:ÚZÛ0ñ6*Äމ· 5¢š‹ïBE9u­-„ÛÙSÕÜL£´•¶v$——µÛÜZ2Ø™‰VÊG·%R‹â1ÐÔb¡¶úò…#{}Ct5þh_[2®°,1ã§ð–gûݬ¯%«ºŠïÅ·Ù–•A¸½’»·éæØ;òÿÒ/¶—áN9£ÏÔ_~⋜ë|0ÊŸýTÖAfu­2#û*ØŽÏ€¤WöžÎ¤¤$jkk™7o•••444IBB‚ÒäpÔ¨Q,Z´ˆW^y¥ÝÄmúôéáâ₃ƒüdº££#zzz½F>!ý¿ÆéÓ§ÉÍÍe×®]úki©ä9wsíÚ5™1cÆ=ÃZ[[“žžÎ³Ï>Kll,YYYèëë+&ÚššŒ=Záÿ÷Éæï›[fÀ€H$•H$äçÿÀ€>˜˜ü±)í켘––zŠŠâî ÕFaá)N çêÕ ‰ //ŸRô5ÞÞ”””ÐÔÔDEEÐÆÙ³ÿCl¬­â9pÀ\±¹%×ò ®»7·þŒL&A]]KµñoÕUÔÔ4±´Û©¿ÖVùÉcMMý.ã”Édhhh<²ôÛÚd¨©it«žÖÔÔЯ_?•üúúúrçÎÊËËHþ»Ó>z»ýéëöU¯;u¼…Ÿþ™(]!æííM~~>©©©¸¹¹=V›[ªÐUþãââpuuÅ‚¥K—bllÜnõ¸×¯õë×3gÎRRRظqc»xrrr‰D:tˆ÷Þ{ “Á>v©©))))|öÙg¸¹¹áééÉ×_Ý­ñ×o¿ý†‹‹ þþþìܹ“Ý»wóÅ_´ ·|ùòÛ.@]|üadÔ~üÑUüª¤¯ø³²²ÐÔÔdäÈ‘Šw”––*6·îgüÙþeùòå^=Ø™ý~Ü翽¥§âЉ÷‹çòêË´ÉÚˆ÷‹çÂSùµq?R›YKBh‰S1bˆ×/•ܘÚV Pôå;˜» __NÖ†,Fÿg4ú8¿æLÆÚ jÒk°™g#”䦭µÄ)‰¹DàOÔ]«#=:]ÉŸ¦‘&6ól°šeÕ®ÜòOca#âF¤MÊ øõ7ê97åù'£g§'?%XÙLÀÑB~ aô÷£1p2 )"I)¬ëÛ®ÜÜqSq"ðn†¼1„€I !àX-Õ-doÈVY²fogà¹Õóž'Ðú>ƒbÿ´=™ogöXœ­2A'~Àݤç§Í"aÊ ²ª«y&QùªA#-- r"Ò^ù.5-Íܬ«U<âù¢ß톺vd×jª :ñ·êë¸8=C$R) ¿LšÆå™s85i*.FÆL>yB)ì;#FòaæUîHÚ_ úöðœž<ô³‰Ÿ<ªæfÞN»¨²$2)¯§žçÓÑcp¸Ç 4¾Ï8K+žsÊëSzÕ¢“››^^^ܼy“ŒŒ D"‘‘‘Jþ>úè#Þ}÷Ývÿ<®ªªâúõëŠçÖ-ù·Eóòòhllì5ò éߛݻwÓÖÖFHHo¼ñmmm<ûì³ w'''Ž9Bzz:‰„’’öï߯؄’OJ›‰‹‹ÄÏo QQbÆ?,3Õ×c``@EEiiiÔ××SYYɉrûJvv6žžžÄÄÄðú믳víZÊÊʰ¶¶&''CCCž{î9ÅŠR©++åqœ‹Ëÿ0gNóæå ¯oÅ·ßʯ8¬¨HçÛo‡1|øÿ2þ-"#³14tä›o† •JPWׯ×÷=fͺHTTsæˆèßß‹ãÇ'(깓“7n¤¢¢‚‚‚ÜÜÜWàÕÕÝ&6ÖsófϾBT”˜ððó 4O)¶¶a,ZTªô»Üwù×ÕÝæë¯°µÎܹ×Y° sóÊË•û7©´‰3g°í¿åóMÔ¿Gþïlݺ•ü‘êêjª««õëwžþyJJJ¨®®ÆÖÖ ‹‡šÿ{µÞnúº}䃨¨(JKK‰ECCƒÒÒRNŸ>­pÿý÷¹rå b±˜ÄÄD*++•÷ìÙƒŽŽß}÷¥¥¥”––’Ýkäë*ÿ»ví"##ƒýû÷ÓÜÜŒ……III½®~eff*ˆoß¾ÍàÁƒill¤¼¼œK—.QXXHjj*®®®J Ö‚ýï˜ÊÊJÆÇ«¯¾J^^ùùù„‡‡ßó¤yGlÚ´‰Ë—/SPPÀåË—©¨¨Pº¢[𛛉ŒŒdË–-ˆÅb>¬rüª¤¯øóòòpttdÉ’%äåå‘™™‰T*UúÃØý¢Jÿbbb²eË:¼†¶3ûý¸Ïz'jü÷¾ˆÐ”PA}˜x¿ø>/£Ý;¬fY‘2÷Á.ŒêZé2â³ÔfÕ"Z#êszôÜêImF-y»ò„†sššøìõ¡ùN3—W]FÖ"{¢äÆy‘öƒ˜÷ÓMÇZOŸ/džrµº’U)¿õ9=îðÃÕªJ>ÉÎÕ]jjq0hw$M<—ô+-²¾Õ¾V®\ÉâÅ‹  [ ×‘Ε+›ÉÉÙ/(C b±˜õë׳{÷nA½–˜˜ÒÒÒØ¼y³ Ÿ€€P?zÂד°Á% ðd .¨@àq!àÇ€vWÞÞÿöÆiµSçS×J—€£¸¿ëÞ'ËÁs«'ŽÏ9 õãOhk1úûÑ ß6u­Þg:ã&Oc®CÏ}¼óÿƳfØðϧµž>¿L𯖑þ}²}íðÃÊ¡}ÓvÜ&ÚÚœš4•]cÑRïûC“#Gް~ýz¡àTï›=×0{ötuÍet“ˆˆtœœ÷X|£Go#(hÆÆ.J×"öïïýÀåyéÛÙÙ1iÒ¤Ç6ÿBû¸_bbbX³f Ÿ@’žžÞáÕ]‚|Býè¬Y³†+W®`ffÖ+ãèK(­"56‘¹.“3g83úL;Ï9Ûr87ñe¿”!>(&Þ?ž²Óe*»wEgá¯ýëÅÇŠÇŠÉÙ–@ö?³¹õù-¡{Û…¶ü@hJ(:æ:Š÷^Ÿxá³ÇS?SlæÚ|.˜¡UŽW×Z·¸ò[!I!ÝÊ“¾£>¡)¡˜ú™bäj„ýÓö„$…`>żCÿ–Ó,1l@î¶žýЮÙx3|¿òåÒòKd¼Õ½+ÆîG~UÂ95߃¾€ü:½ ³AxmóúKúëcc¥gøGÃõå(Ô4ÔzD>§—œsj f̰]hKhr(fãÌ›úÑRÓBRx¥?—2öôXtÌtz¬^i¨©ñŸq“X9Ô@3s^vóàjx$fª—Ï«îž$†Ídе-ìŒ(<’‰Vª}Ÿp¡‘"½aýLyÎe(WfÎaš]‡þgÙ9àldÌWz´}M²²áèøÉüí\<¯]LŒñDus3OçX˜äiáXè>žß9\±bééé”––bmm­xommMii)þþþxxxàááMÇíoþüù¸ºº²aÃÅ»={öpüøq™1cÍGÔÖ­[Gvv6ááá¬X±‚’’¥Ü éwŽÞÞÞ\¸p={öàííMÿþýîãÆ£¥¥…˜˜&OžÌâŋپ}»RYYŸrúô<ššÊ»v1qâ˜6í 66SprzŠyórñö^«pø„™3ÃÖv*––Áxx¼Ê€>€üammmhjj*üÿþNWWW¥ô·oßÎéÓ§ñööV¦¾¦d®Ë¤2¥’‚o ¸ñÁ œ_vV9þ¦"ùê•W:_WÓTÃs«'>{}ÐÐ×PrkÈk îFõ×ë‘6J‘I:”Ãå ²ßͦMÖ¦x?lã0F|6‚~#ûa<ÌËi–èXètK?îï¸#zEDSQS·õ«ªü%¼ž­­µ­”Ç—ciÓËNÜØrƒnëïž‹¢Åã°ÌÖúV.,¹@›´í¾å3p2Àn‰©KS±Š°Bg Y²p]çúØÕâ£Åä™Û;n=Öö¤mmÌ:}’O²3H,+å“ì ª››1ÕV­~ºóŒó¢N3×Á3]=Ö^ºÀ?GŒjçWS]þcˆ ‡Á] йuµd×T“]SMƒ´•ÂÆ†váuÔ5x{¸7ëÒR‘¶ý¡¿FùóåØüšáiÚŸYvXꩾI¡£®Á–‘~D'Ÿ£ ¡A0ÈO(ßÝÎcïklé÷XåKGG‡¤¤$®]»FDDD;wGGGª««)£)´­ IDAT(( 33‘HDAAA‡ñlÚ´‰—_~©TªxïêêJzz:‰‰‰;vŒ¬¬,  Ù]]]Y¹r%aaa,^¼KKKV¯^ͶmÛ„ôU$??Ÿ´´4êêê(--%--ŠŠ ÅâS\\¡¡¡<õÔSüüóÏìß¿Ÿ_|QÞg©kÓ¯Ÿ+ýú cÚ´³žpñðx…¨(1#F¬ÇÊj<66“±³ûc:::šÊÊJlmm ¤±±w÷?N’~óÍ7\¿~ÈÈH¢££©««SúÈuDD:¾¾›°°ÂÝýE¢¢Ä ² €!CžÅÐÐcÇB((ø‰œœ~ü1w÷UŠM,mmcêênSTGqñYD¢÷¹s'Ueýû9S§žÆÚzÖÖ™93‰Q£þ¥ä§ººš´´4Åóç`[XbeŠ›[4 ak;UåôÇ?ÌŒ¿bo?'§EXZu«‰ÅbvîÜÉøñãmîܹ-ýˆˆtüü¶`a„«ëó,\XŒ½ýL•Ã{xx`nnŽžžžbñÉÙÙYI¾;v0~üx^ýušššõ·'òïà0› òê<’2 zvÊ Ó ·¸¼ú2>Ÿû e¢@k]«¢ÜT¢­k/N«=˜ä9É´Ö·¶s×wÐG«Ÿš&šÈšd 7êËÕÊ‹ýk\¨ºPEù™r¥÷_à±Åƒ¡o¥ðH!Eßu˜Æ½0jˆš¦ÕéÕMÉm÷YH„׳×CÖ(ãæÎ›øçOýõzÊâʺv(š†šÝÒ_—e´Ê íÚ\üÛÅ“O»¿¶Ü”7“¹6Y³ “&hèk ®£ŽL"{¬êGÕÅ*ì–Ø=¶¸Ìy(O;»°0á4·êëT 3@Gþ/÷²¦&Ö\LA"•1jÀ@ 45ÑÕÐ é¿ é¯¹{²ÚmSOýD]kK»xaª­C?-mš¤R&YÙVqGÉÏ›ž^$—•ñKq¡Òû7sØîÈ?¼|8të&_çÝì0{áfÒMuuRÿ”žÀ“GJyÏ8}lòcaaABBÁÁÁ3hPû«>qqqAKK‹ &°}ûv¶oßÎǬäoãÆ$$$püøq¥÷6l`ݺu<÷ÜsLœ8///¶nÝúXÈÿû•%%%¬X±‰DB@@†††èêêÒÔÔ$¤89ɯʽtéR‡î2Y3UUYèèôïÐÝÔÔ“áÃÿ— ¢º:»C?;vìàûï¿çúõ딕•allLK‹Ü>‡‡‡3kÖ,tttÉdŠ ñ¯¿þÊþýû)/—÷•—))I ¤$²²óLšt”[·¾COÏ‚ÆÆb¥ôK€6ôô,8sf  †µõÜÝWahhG|üBªªºþœ½}8öö3‘Éš Þ«x?dÈ3¤¥m µµ¥Énn.555Šß%%‰ÅST¡á œœžB,>Þeú¶¶S±°ààAÅ@ÇÌ,--ƒn•óùó牋‹#..ŽAƒ±téR¾ù曇–þ;iŠò34´gðà…ܾ}T¥°"‘ˆÒÒR‰DúIMMUÈ—˜˜HBB±±±èêúöHþe2 ¹¹»Ý>z»ýéëö]•þ³­­ó FgîöööxyyÈ7XµjçÎÃ××·Gåx饗ˆŽŽfêÔ©äæ¶¿!býúõ˜››+]õyãÆ ¢¢¢8~ü8¦¦¦ÔÔÔ(þ©ßÕøC•ñÉýÒSúíHþß122ÂÙÙ{{{4559r$×®]{äò©R¾ªŒÿÖ¯_Ï[o½…ŸŸ_‡›«NNNôïßSSS™>}:çÏŸä姪þ¥|÷n?ªÖÏÎÂ?H$<Ø¡›®®.‹-Â××—ÖÖVššš?~<;wîTøIKK#!!„„ìííY¸p!GÊÇ?Ÿþ9ûöíãý÷ßgß¾}ìÛ·O©×ÔÔššÊ… ‹Å9r„?üÁƒsñâE²²²”ndø3]Åß™{sss§ñ‡……†­­­bü~õêU~øá:¤ø#]gò÷TÿÖ÷Û¿ üTÞê7¢šš”/AËD = JN”`:Êuõ.ÝïF+¦<¾¼[ñƒütÆù¨óø}åGþþ|¼ÿíÑ0#ıb¡$ï™DFê²T4 4ÐwÔGÏZ¾Á¥g«‡†®ü”LÅoœ›|ŽxÿxDoˆÐ4Ô$ûÝö‹)¶Q¶Ýººðnr>Ê!meþßú+65ï¦áVu×ê(9VÂÍ7±œf©änìiŒåLËóUu©Š_'üJrd2âbÜ7ºã±ÙCå¼Õe×ÑÖÚ†‰·É-‹¿¢?3¤MòMŒäÙɈ^!m”ÿÖ¨­²þºÂ`v‹íÈ|;³G嫺TEk}+S-h©nAÚ(Å"Ì‚Ê •ŠÍ­Ç©~˜x›P#ªéÑrÖÏ”Ô\®ª èÄ÷ÜÜZ2Ø™‰VÊG·/T”S×ÚB¸=UÍÍ4J[™akGry™bs `KÆ–%&p|âÞòlÿ/ ›õµdUWñ½ø6Û²2·³Wr÷6À{Gþ_úÅva/Ü)gôñï™úËO|‘sFùó±_€ÊògVWÑ*“1²ÿ@Á ?áø Hzåã³Ñ)‘H˜>}:FFF¸¸¸àà ?9îèèˆÞŸN)¶´´ðóÏ?sàÀvW<5ŠE‹µ»zpÈ!|ñÅLŸ>]»v±`ÁV¯^Íž={ ù“’’¨­­eÞ¼yTVVÒÐÐ@dd$ eñ³¯§úôirssÙµkW§þZZä}‚––‘ÒûÚÚ¤Ò&llîý}$kkkÒÓÓyöÙg‰%++ }}}ÅdXSS“Ñ£G+üÿ>Ùü}sëÏ 0‰¤‰¤‚üü0À“?6¥ÓÒROQQÜÝËlžâÔ©p®^ý˜òòòù)!E_ãíMII MMMTT¤mœ=û?ÄÆÚ*žÌ›[Ðþ×Ý›[íÆ¼2 êêZ*•OUÕUÔÔ4±´Û©¿ÖVùÉcMMý®ÇÜ2,ý¶6jjݪ§555ôë×O%¿¾¾¾Ü¹s‡òòò’ÿî´Þnúº}Uµÿü«äççS[[ËäÉ“ÿ˜ËP__ßcùööö&??ŸÔÔTÜÜÜ:\ü:t(ÑÑѼð íÜâââpuuÅ‚¥K—bll¬'t5þèÎøäA ª~;“_ÞÕréÒ%>üðCvïÞÍÓO?Ýíñ׃B•òíªþ®_¿ž9sæ’’ÂÆÛ¯ää ‰8tèï½÷ ,x(²uU~ªêÿq•ïIá^íGÕú©JøÇSSSRRRøì³ÏpssÃÓÓ“¯¿þº[ã¯ß~û üýýÙ¹s'»wïæ‹/¾hnùòåÖm€º:ùøÃȨýø£«øUIÿ^ñgee)6$' €ÒÒRÅæÖýŒ?»cÿ–/_ÞáÕƒ÷Ó¿ ü”vžŠ(&Þ/žË«/Ó&k#Þ/ž O]äׂþHmf- ¡ $NIÄpˆ!^;¼TrWL`j[)8T@Ñ”ïî*|y|9Y²ýŸÑhèkàüš3k3¨I¯ÁfžP’÷Ikm+ y Ч±°€Fq£bãÄýŸîþˆçž´µ´ïOušòéM#MlæÙ`5˪]–3, M eøGÃQSW#4%”Q1í¯P«¿QϹ)çhÌo$8!=;=ù)ÁÊfŽò[£¿“IIJa]ßvåæŽ›ž,òÆ~ $1„€c´T·½![eÉšed¼çVÏv'ÜTAùÿªþ´ûk+m´IÛhkmC{€¶Êúë ó)æÔfÖÒp«¡Gåkkm#qJ"FnFÅøS u×êHNìêÇÀàØ?m_›|ñ‘ïhtÔ5ø¿À`®†Gr5<’saÊGÈ´´X4ȉH{帴Êdøw“~œŸ6‹„)3Ȫ®æ™Ä³íÒ¹VS­Ø@»8=C$R) ¿LšÆå™s85i*.FÆL>yB)ì;#FòaæUîHÚ_ýøöðœž<ô³‰Ÿ<ªæfÞN»¨ú&‚LÊë©çùtô £ü„2ÎÒŠç\†òúÅ”Ç&OUUU\¿~]ñܺ%ÿög^^ÿ?{gWe•?þ7—}ßd‘MdQ\AY45÷T\È´)Í,ýŽþ¦É¶±¯Î×ÊR3gJ£©‘ÂJ³Ì¥ÜP‘Ee“ËvAY/pïýýqëê „«à†Ïûõz^/¸gýœó9Ës>Ï9§I9V~øá‡\¼x±XLbb"ÕÕÕí&ú›7oæÝwßmw†úåË—;v,_~ù%b±˜ììl¦NJHHÈC!kk+ÞÞÞøûû“ŸŸOff&DEE ékÈŽ;P(DDDðú믣P(xá…TîîîîìÝ»—´´4¤R)åååìܹSe„R¾”¶pìXAA‰Ž3fÌneÿßÖÈ®]ýJk˜8ñ8sæ2kÖFÞ(ï³ÊÉÉÁÏÏØØX^{í5V­ZEEEäææbbbÂâÅ‹UG(Êd2úöU§==ÿÄÌ™™Ìž‹‘Q_öìQqXU•Æž=> üs敃‰‰+ß}7™LŠH¤G`à<õT2ÑÑÅÌœ™••?>¡jGîîî¬[·Žªª*Š‹‹ñööVW_¸8glmC˜1ã"ÑÑb¦M;Gÿþ³Õò÷ÔSO¡P(Ô/¯îßKU_o¾é‡“ÓdfͺÂܹEØÚ†PY©>¾ÉdÍœ81Ÿ-¿ÕÏw=¢:ýßÙ´iû÷ï§¶¶–ÚÚZRŸ¼ôÒK”——S[[‹““vvv÷5ÿ·kzÿÓÛûWMÆÏèèh$ qqqhkk#‘H8~ü¸Fî …???ÕÂÜ•+WËåDFFöXþcbbÐ××çûï¿G"‘ ‘HÚ‘:cÆ RSSU»dneûöídff²sçNZZZ°³³ãÌ™3Í?4™Ÿt—ž(ßÛɯ­­­’¿¤¤„ääd*++Uõÿ åÓ¤~5™ÿdee©ÊéÚµk¸¹¹ÑÔÔDee%.\ ¤¤„””¼¼¼Ô¬dýÝIù?(ùgºj?]é§&áfª««=z4ýë_)(( ¨¨ˆiÓ¦Ýv§yG¬_¿žôôtŠ‹‹IOO§ªªJíˆnMhii!**Š7"‹Ù½{·Æñk’þíâ/((ÀÕÕ• PPP@VV2™L탱û1¾™››³hÑ¢AíÎø& p7hñÛy‘I‘Biôbâƒâ{½ŒÎ œéûT_’fÝÛ…Qƒ¾ ùtuÙud¬Ìèuåè·ÉºÌ: ¶úq :Æ: ý|(-×[H_žŽ¼UþXõ! =åÒŸÉÇ~¾§é8ñßQ‘\ª­fyÒé^WŽÛ‚Gr©¦šæd Ó-˜èèòuØh®K›Y|æWZ彫}-[¶Œùóç?4F+;aúô4.^Ü@nîN¡0Ú!‹Y³f ;vì Cà‘%66–ÔÔT6lØ È' è§€€€€À#†`àzLx \"¡Bö‡tx4ßÝðïÜW¸÷x> ú²/„Aïê•õà·É×Å®‚~ü]3]Fü8‚Á[#Ò}ôºÎcã'1«_Ï]ÞùŸ‘á¬ôÜãùt04âè¸IlÜ+Û×¶à‘,Ø;ûŽî`®§Ç‘qÙ2 ]ÑÃß¾öîÝËš5k„Џc³ßJf̸ˆPwÈôéi¸»Ïï±øFŒØBX˜òŽ<33OæÍ“¨+«€{.σHßÈÈ{ûˆ‡6ÿBûè.±±±¬\¹RO GIKKëðè.A>A?z+W®äâÅ‹ØØØ<’ñ ô&ÔV‘šKšÉZʼnœq¢çÜ-¹œ{ŠŠ£ˆ¿OÅñ Ý»¢³ð—ß¿LÙ2Äqbr·äó^…Ÿ µxŸÐ·Õ'2)ósL˜`2À};}•»™¯™Ú3xó`†ÿw8ZÚZ¸ÿÙ‘GFbó„ NO;y6›ÑšuÔF®FD&Ebd‰©—).Ϲq&Û'm;ôo?Éc7cò¶äõhØŒ±!pW ^¼@æßÔ3p0ÀûïÞDœŽ âLûE€îÈàÿO†Æ Å2ÈÇYŽ„Ÿ §Od•ûÈ## ü:P§v2 ÿ-þwU~wƒÏû> ŠÅP lÆØús(ýökçÏéi'Bö‡™‰¾­R´DZÆâºØË`KÜ–¹©òû°èGëVÎL;ƒä £ŽBßFÿŽÊÇÉȘ÷‡’>u&éSg¶sÿ(p_…&ÐÚ†q}Ixr / Ðüþ¿ò#qÂTžtpâY72¦E1¶¯f÷ö71åÒ´(Bllñ±°d±ç@.NÉ$Gçý?åÜS3þ‘y±GÛ׸¾Žì3žgOÅójòY¡Ó}Œ¨miaìáƒ(svÒ4ì îìžC¶mÛFII ¥¥êw|jkk“ÀÊ•+‰ˆˆ`ÕªUH$ÂÃÃU~vïÞÍ¡C‡çùçŸG,ßö ú9sæàååÅÚµk5J`õêÕäää0mÚ4–,YByy¹Ú%Ï]…Ðt•!ýÎqvv& €óçÏC@@VVV*÷Ñ£GÓÚÚJll,ãÇgþüùlݺU-Žììqüølš›+:ý;ö&M:£ã“¸»?ÃìÙy¬R¹‡„ü“©SOãä4{ûp|}ÿеõP@yG˜B¡@GGGåÿ÷ß 4JëÖ­?~œ€€Õ3pàÀû"ûWøê+[vïöz e¿ÒwwŸ‡¿ÿ›mþïeûxÐýOoï_AyÇ[bb"K—.%<<kkk•Û°aÃÔž¸¸8Ž=ŠŽŽŽFã{Wñw—_|‘E‹Á[o½…D"!((¨GäÓ$ü½¬?MÊ·+ù»šßÄÄÄpðàABCC™2e ™™™¼òÊ+=2?Ò$ÿ]•Ÿƒƒ‰„àà`|}}ñõõÅÑÑñŽêïvxzzªòãïïÏŠ+(++cæÌ™÷E?5)Ÿ®êçAË'p÷ú¯iÿy¯°´´Tµ©Ã‡³yófÕÿúúúL9ÿë_ÿböìÙíîX~TâïNÿÙš¾_/Y²„´´4$ Bã¸kÔF^ƒ¾Êz» v\ü‹úÂeCnEÿ-"xw0WÖ_Áx€1^o{‘ý÷llFÛtéÞ]…×ÒÑ¢íFmumh‰´HY”‚˳.ô‰è#Ôâ}ÂÐɶº6¤eR¤) ¹Bý%5ã†êo¿M~´5´‘¾"cwcœ8s6ê,ž¯yÒp¹ìµÙx­öjgÕÒÑÂwƒ/ºº¤-KCÖ(S¹54ÒRÕ‚žµ²&ÒRi»|ŠôDx¾îIÖÿf©åÑgzÖzä’¼YŽQ?#ª“«‘–K5’_¤'bÐ;ƒH_žNsis;÷æR¥¸üP9~›üÔÜîDþŽ0êg„e %g£ÎÒTÔDuR5 …¿xP_©ª›ÊøJ¢0õ6åêÆ«ô_ª¾cG“ò»[ŒÝ©Nª¦&¥-‘޳Ñ6ÖV+¿À¯¹²á ©/¥¼ûæ…\Á¹ès7»/ÔÒwF_t-tÛ¥ó õ£l_††x¿ãMê’T˧¸±7RÎñ“øÛ‚G¶s÷05ãL…„s×+ii1¯¿;F:ºš½@˜š±ÐcþÌۃȮ­eÕ…ó¼7d8GJ‹Õ;}‘ˆC°ÒÓcÑéÚÚTnyõu\—J±Ö×§QÖFISc»´ôEÚ¼=8€×“Ï!SÜ,¿ ÆÆÀ€-Ù™4Éd¸™˜r¶RB™†—„ê‹´Ù8,ˆÏüJqc£Ðá>¦|­'##Ö âO§Nh®¨¨ˆ¥K—òÝwß«æ&“É Sýúôi,X Z òðð ,,Œàà`òóó9yò$ …‚wÞy‡¨ë©¾>ëׯçå—_F&“i”¾——Ë–-#88˜>ø€K—.±bÅ ¶lÙÂþýû» ÿ Ñ$ÿBú]ëgQQõõõH$RSSÕïŽ;ƨQ£8uê”ê÷;•÷]‰Dz˜™¹¡«kθqû8th|8ÿ÷ÿÇ«¯¾ª2Òv7ÿýúÍ`Ĉ9wî5êë ‰´‘ËeH$‰µG¹ÿéíý+ÀáÇ100ÀÌÌŒåË—³gÏÕ%ôÉÉɪ¿ccc©««#::Zõ[gã»&ñw—O?ýT9¿ÖÑÁÚÚšÆÆFjjjzL¾ÎÂßëúëjþ¤‰ü]Ío¼¼¼8yò$‰‰‰ˆD".\ˆ‰‰‰Æá»“MÊÏÕÕ•ÚÚZŠ‹‹)--U›ûiR¿£««Ëþó¬­­™5kõõõ*·«W¯RQQ ÝýÔ¤~»ªŸ-ŸÀÝë¿&õ/©®®¦ººZ¹ÜÐ@ee%ê÷ÛϘ1ƒ?þ˜×^{ÂÂB´µµ‘Éd$&&`ooO@@‰777Ö¯_Ï|À'Ÿ(ç¯iii>|˜~øÖ¬YÃâŋٷO9ÿÙ±cvvv|ðÁ466âááÁ©S§(..fÖ¬Y¬\¹’—_~™;vpúôi>Ì?ÿùO|}}ihhÀÍÍ sssöíÛÇøñãÛÍC;‹¿+w==½.㉉ÁÇLJµk×bccÃêÕ«Y·nÆòw·ÿï MÞ¯õõõ9qâo¾ù&Ó§OçìYágî¡þi‰Öí=¶Tµ ×Gïw¼鉨½P‹¬Q†\*ïÒ]¤ßù‘C]…÷|ÕSÙÐe$ÍMÂu‘+y[ò(Ý[ŠÏû>]Æ/Ð}jRjøõ‰_ÑÒÑÂ*Ô ï¿{síËk\ûâšš?÷åîèYë‘üìÍ Ÿž•ž²ž+[ÈZ•…¼EŽùs´´é‹Kåʰ+Üq[êÆÙ™gikhëÐУk¡‹Ž¹òf9}F÷¡6½V}±¥'5çk¨õþ§·÷ï...øûûÊÕ«WX¾|9§N"00PÍïš5k°µµeܸqïww055ÅÃÃttt6l—/_î¶|]…¿Ÿõ×Qùv%¿&ó³µkײzõj/^ÌØ±cñ÷÷gÓ¦Mw<¿»›ükR~‰‰‰xzz¢««ËO<ÁÖ­[Ùºu+ü±Æú¹fÍþö·¿D]]]‡ó+++,--ijjbòäÉœ;wîžë§&õÛUý< ò t¯ýjâþ ‘J¥|ýõ׺0oÞ<ikk£¹¹™1cƨ <©©©$$$€‹‹ O?ý´ÊÀóÙgŸñå—_òá‡òå—_òå—_ªéð7HIIáüùóˆÅböîÝËG}„››ÉÉÉdgg«ÈðGºŠ¿3÷–––NãŸ0a&LÀÉÉ ¹\9¿té?ýôß~û-UUU]ÊßSúÓ]½_ÛÙÙ‘@xx8eeeôïß_h¨ÝFc«Å tŒu(?XŽ®¹.Ú†Ú”*Çr¸%"}Q—î·"ŽS_yGñƒrwƹèsí ¢hgÿÀÔÇqœX¨Éûˆ¢MÁõ_¯SúCi»ÝyÆýqžïLÖÛYê/ÇjhkhÃn¢­µ­ÈšdØM°£ú|µšq'ws.©ËR Þ¬2jÞJca#õ—ë)?PNþ'ùØO²Ws7ó3Ã~ª=9ï¶_䩹 4Ð:‹ø+1ƒÖ Âwƒ¯Ær×çÔ£hS``~Çe¦©üNÑNjGþNÕé*N?E|p<¯g c¢£’SßFY³ÒˆqvÆY2^Ë@Ö¤ü_¯žÆåw·¹á»Á—”R<œµ9ø¼ï£\€ÊIY”‚¶±6F®F:( \†N†h(wy™z›þk87.ÝàÔ“§Ú·&ý00WÛ±Ø]ÜLMù8(„ù ñì̻ʋg~eÕ…d> ÑÎï7ÆöUߺ}¾ª’ú¶V¦9»PÓÒB“¬)NΜ­¬P·6f^dQbÇ>ÉßüÚßs‘ßPGvm ?Н±%;“iÎ.jî–ÖÌtqåÓ’Û…=½’dâÑŸù"÷ ÿÌÇA!—AVm mr9ì„]¹;C­ûVݳ†Î€€ŠŠŠHIIÁÛÛ»ÝäüرcxyyaggÇóÏ?™™Y»#X†μyó4>šåwΜ9C]]³gϦººšÆÆF¢¢¢HHHx$Gtþ{{úÇ'//íÛ·w꯵Uù5´®®©Úïuu¹ÈdÍ8:Ž»mXÒÒÒxá…ˆ‹‹#;;###åØW“––ÖÖÃTþmmChn–¨Œ[ÄÚzRi5RiEE?am=só›Fiù´¶6PZzìÖÙ#%%G8rd—.}LD„òKü‚‚|}}ÕÚkyy9ÍÍÍ¿íÆQpò䟈‹sR=_}e«2nÁÍ\¿?··þˆ\.E$Òl‡tMÍ%´´t°·Õ©¿¶6åÎc£.ã”Ëåhkk?°ô 9ZZÚw¤§­­õèêšiä700ëׯSYYyOò'íãQïz{ÿZTTD]]ãÇ¿ù.ilLCCƒš¿²téR^~ùå;ß5¿»ÔÕÕqáÂ>úè#vìØÁsÏ=×#òuþ~Ô_Wó§ÎäïŠðÅ_0yòd¶oßÎܹsY±b111÷eþw'å×ÚÚÊ/¿üÂW_}ÕîÈÎô” ™3g’””ĺuëÚ¿ßææ’‘‘Á·ß~Ë|Àܹsï‹~vU>šÖσ–OàîÛ¯&íûaÅÒÒ’¤¤$>ýôS¼½½ñóóã›o¾¹£ù×éÓ§ñôô$88˜O>ù„;vðÅ_´ ÷â‹/v¨Û€j·¢©iûùGWñk’þíâÏÎÎV¬'$$‰D¢2nugþy'úñâ‹/vxô`gï×R©”É“'cjjЧ§'ýú)¯6quuÅÐÐPh¼w…šå©ì§2âƒâI_‘ŽB® >(žóÏœ”Ç‚…þJ]V ‘ $>™ˆÉü·ùkä®z©k£øÛbJP?C¹«ð•ñ•d¯ÍfÄ#Ð6ÒÆãU2Wer#í޳…š¼ |k ¡B ÿ5œ oƒh½ÑJÊBõ#FlŸ´¥.«ŽÆBõ#Æm ŸLÄÔÛ”°ø0B¥þr=iKÓÚ¥ÓpµAeàOÇÐÙP¹K°º…}!DœŽ`Ä#0v7æÌtõ#&¼Þö"[¾jg“Ú$úõ„ì!"1‚!´Ö¶’³6Gcùå-r2ßÎÄo“_‡;ì§Ø™Éà̓Ñi™ÉðØáw$¿Ž©޳éûTßvñzo¡?‡â÷?­ âƒã©MUîNÒ³Òkg(SÈ(ÚèYëi\~wKcA#ÉÏ&ã»Á—ð_ÃùËHlÆØ4+IÕî UOS‰ÒxÕ$nRæ|>ðA¤'"à_D&E™ÉÈÃ#:ýèÞ—ç\Úq»bºs?.M‹â“£ÐÖÒâÒ´(öDŽ ¯®ŽÙ'޲%(„ Sfðë„)ŒwpdÒ±ŸÕâ0ÕÕe^w¢\Ô¿pi“Ë ;ôƒÌ-87é)žœBvm- ÛuùF-a‡~¢°¡žäÉÓégl‚T&£J*åè¸I¤OÉ‘qñ45cüáCjaß2Œ².q]ÚþèÇ·áøøÉ¤M™AüøÉÔ´´ðvj²Æå#•Ëx-åÿ1’~Æ&B‡û˜2Ú¾/‹=òZrÒ…‹ŽŽF"‘‡¶¶6‰„ãÇ«ÜcbbÐ××çûï¿G"‘ ‘HÈɹپ·oßNff&;w¥;;»vGmÞ¼™wß}·Ã]¥ßÚÚŠ··7þþþäçç“™™IFFQQQçÿA¢Iþ…ô;gÇŽ( """xýõ×Q(¼ð *wwwwöîÝKZZR©”òòrvîÜ©2B)_J[8v,Š  DG‹3f·Ê0°kW?¤Ò&N<Μ9…Ìšu…Ñ£wÊû¬rrrðóó#66–×^{U«VQQQƒƒõõ|ó+ ˜3§€¨¨, {ö¨àáéù'fÎÌdöì\ŒŒú²gÏ ªªÒسLJÁƒß`ΜB¢¢r01qå»ï “I‰ô ü€§žJ&:º˜™33°²òçàÁ'¥ËÝÝuëÖQUUEqq1ÞÞÞxxxüöb¸8glmC˜1ã"ÑÑb¦M;Gÿþ³Õò÷ÔSO¡P(Ô/¯îßKU_o¾é‡“ÓdfͺÂܹEØÚ†PY©>¾ÉdÍœ81Ÿ-¿ÕÏw=¢:ý› )ÿ¦¤ä0³gç2{v®J¿~祗^¢¼¼œÚÚZœœœ°³³»¯ù¿]ûxÔûŸÞÞ¿* üüüT gW®\A.—©æoÆŒ¤¦¦ªv1ÝJg㻦ñß-ÚÚÚªùCII ÉÉÉTVVªúº+_WáïGýuV¾]ÉßÕüæòåËŒ;–/¿ü±XLvv6S§N%$$¤ÇæGå_“òûðùxñ"b±˜ÄÄDª««Û-äv¦Ÿ¿“••¥ªÇk×®áææFSS•••\¸p’’RRRðòòR[°¾—úÙUùhR?R>îé¿&î3ÕÕÕŒ=š¿þõ¯PTTÄ´iÓÚsØëׯ'==ââbÒÓÓ©ªªâÿý¿ÿwGùhii!**Š7"‹Ù½{·Æñk’þíâ/((ÀÕÕ• PPP@VV2™L탱{­? ƒ{<Ÿ†F7‰Ã‚{e?·-x$ËB@s==ŽŒ›ÈöQèŠý©ÉÞ½{Y³fP±=†ŸßJf̸ˆPwÈôéi¸»Ïï±øFŒØBX˜ò///µc‡~Ïå¹5}33OæÍ“¨+«€{’¦‘‘#öömþ׬YCII‰êhD;%66–•+W ò ô(iiiÝ%È'è§À㣣#BAÜÔV‘šKšÉZʼnœq¢çÜ-¹œ{ŠŠ£ˆ¿OÅñ Ý»¢³ð—ß¿LÙ2Äqbr·äó^…Ÿ µxŸ0p0ÀûïÞDœŽ âLûNÚýÏîŒ<2›'lpzډȳ‘ØŒ¾¹ãó¾Cc†b1Ô›16„þJ¿…ý4{±v5"2)Ë KL½LqyÎ…ˆ3Ø>iÛ¡ûIö»“·¥g/Ê´cCà®@.¼xÌ¿ÝÙcf¾fjÏà̓þßáhikàí„ãG,ƒ-éÿr"“"1÷7×8|O–߃Ð}[}¥Ìæ˜ 0Ád€ úvú~´ÞhåÌ´3H~‘0êø(ômô{T·¸y0¯¿;¡6¶¬ðöáÒ´(†XYßQÿ0ŒŸÆŒç9wOBll±ÒÓ,ýML¹4-Š[|,,Yì9‹Sg2ÉѹCÿO9÷ÃÃÔŒd^ìÑ2×ב}cÆóì©x^M>+tºµ--Œ=|ÅbÎNš†Áý¿\vÓ¦M$&&²téRÂÃñ¶¾ÙþH$ãë닯¯/ŽŽßÿ9gμ¼¼X»v­ê7¶mÛFII ¥¥¥íÂìÞ½›C‡ÎóÏ?X,îð²ÞÅêÕ«ÉÉÉaÚ´i,Y²„òòòv—¬ éßggg8þ<111`ee¥r=z4­­­ÄÆÆ2~üxæÏŸÏÖ­[ÕâÈÎþÇϦ¹¹â¡k¿cÇþÀ¤I'pt|w÷g˜=;€€U*÷2uêiœœ&boޝï_±¶ (ïS(èèè¨üÿþ›Féþ>O<ñ=––¾ªÇÌÌã¾Èž––66ÆðxãÆ¾úÊ–Ý»½îi:îîóð÷ó¡Íÿ‡~Èøñã)//ïuýÏ£Þ¿v5þu5þ¾øâ‹,Z´ˆˆˆÞzë-$ AAA¹kkk“ÀÊ•+‰ˆˆ`ÕªUH$ÂÃÚùCgîšä?&&†ƒÊ”)SÈÌÌä•W^é5òuUÿÝA“ô5Ÿ-Y²„´´4$ ¥ïéé©JÏßߟ+VPVVÆÌ™3{¬îºÛ>º£_÷C¾Ç®úWMú÷ÎÚ÷ƒÄÒÒRÕg>|˜Í›7«þ×××dêhÞ¼y¼ùæ›=Þ~5áNÞ_ïvüx˜Ð¹õƒ¾Êj» v\ü‹úÂeCnEÿ-"xw0WÖ_Áx€1^o{‘ý÷llFÛtéÞ]…×ÒÑ¢íFmumh‰´HY”‚˳.ô‰è#Ôâ}¢¹Ti-?TŽß&?57cwcœ8s6ê,ž¯yÒp¹ìµÙx­öR)Ý©Nª¦&¥-‘޳Ñ6Ön—ޖ޾|ѵÐ%mY²F™Ê­± ‘–ªô¬õ5É–JÛ…é‰ð|Ý“¬ÿÍB!W¨~÷Y烞µùŸä#o–cÔψêäj¤åRäé‰ôÎ Ò—§Ó\Ú|ç/ñ7Tûmò£­¡ôéªßÄqb¥üÚZèZè"k’ÑZÛªqøž*¿¥†N†´Õµ!-“"•HÕêîaÒ²}e:âýŽ7©KR{¬üþ›§¼˜X[K =}šdmÔ¶¶hþ›ð1èkkcª«Ë ž9P,æüõÊö¾HÄÇ!Xéé±èt mm*·¼ú:®K¥XëëÓ(k£¤©±]x}‘6oàõäsÈ7Ëïñ10`Kv&M2n&¦œ­”P¦á%¡ú"m6 âÅ3¿RÜØ(t¸)ß_+ÀÉȈõÂøÓ©÷-ÝÇc``€™™Ë—/gÏž=ªKp\]]©­­¥¸¸˜ÒÒRd2YÇz¬¯Ïúõëyùå—Õü±téR¾ûî;bccÕÂxxxFpp0ùùùœ¬­ý<ø RRVsùòg ð&&ýØ»÷æÎ›ÒÒx¦O¿@QÑ®_OAOÏŒúúk”–C&“RVvòŽê`Ô¨Ï05u#-í=@Á°aïPZÏùóo¨ü´¶ÖQ]}û{QíìBilca1ˆ€€·IHXˆX|P£ônjّ‘éé «kн}ׯ§hœÿéÓÓ()9LaáXZú0dÈNZ̵kû‰ô-,¼00°A[Û ¥!J&“RW—ߥ~ôDþûõ›ÁˆsîÜkÔ×"i#—ËHÑÓÓcÀ€XXX@`` çÏŸï5ýOoè_;ÿ4?ýôSåüUGkkk©©©ÑÈ]&“¦ò{úôi,XУ ¸Ý?tæ®Iþ½¼¼8yò$‰‰‰ˆD".\ˆ‰‰I¯‘¯«úï]¥¯ÉüL__Ÿ'Nðæ›o2}útΞíø=]]]þóŸÿ`mmͬY³¨¯¯W¹]½z•ŠŠ lllhhh ¨¨¨Ç꯻íCSýzPò=îtÖ¿jÒ¿wÕ¾ï5iiilذA5çݲe ÆÆÆ,\¸êêjª««•kÅ TVV’‘¡>Ï‹‰‰ÁÇLJµk×bccÃêÕ«Y·nŸ|¢œ¿Î˜1ƒ?þ˜×^{ÂÂB´µµ‘Éd$&&jäþÙgŸáææÆ{ï½§jûñññ¼ñƪü>|˜~øÖ¬YÃâŋٷoŸªlll000ÀËK9’J¥äççw»ýj‚¦ï¯w;~ ïût¿@ ¸½“ž•ž²+[ÈZ•…¼EŽùs´´é‹KåämÍÃ}¹;Ns°i…‰— …1ê;ðÜW¸ã¶Ô³3ÏÒÖÐÖ.£~FèZè¢c®ƒ¼YNŸÑ}¨M¯Uóã¹Ò“šó5TžP_Ü/þ¦ß¾ |k %{K(ÝSÚa·Ãd  Z:ZÔ¦Õv«Ý—»£g­Gò³Éí¤±†ý 1t0DKG 3?3 5ßå÷ ô£&¥†_Ÿø--¬B­ðþ»7×¾¼Æµ/®=túQ“\ƒóçob&:º¸š˜àddŒŽ–Kkòêêº çddŒ…%SŽýB~½Òÿ žùiÌxž ¿ÇÐÐŽ¦¦2µôššÊ††ÊãâNœXháàðƒ-ÇÄÄ™øø§©©ÉÖ }NÃÅe*ry á៫~0`!©©kikkømqÍKK_•{}}!­­7ÇÏòòDJKã)-ÇĤ?îîÏhdàrršˆ]_í¨šèØØ„ «k|Gõ|ýzªªüLL\ps{Z#ÓƒN_©Ù47W “5ß¶În§66Á=’¹\J^Þ×íß[ZÈÈÈ OŸ>½²ÿé ý{gãŸ&ã/€©©)¸¸¸ ££Ã°aø|ù²ÆîþóŸYºt)'N$/¯gNøè‰ùƒ¦ó‹ÛåíÚµ¬^½šÅ‹3vìXüýýÙ´iS¯‘OÓúí.¥ßÕüÌÎÎŽ„„ÂÃÃ)++£ÿŽ‚_³f ûÛß ¢®ƒ÷:www¬¬¬°´´¤©©‰É“'sîܹ“­;íCýzÐò=ÖËsô¯]õï¶¶¶õ¿+&L`„ 899!—+篗.]â§Ÿ~âÛo¿¥ªJ9•J¥|ýõ×·çvîÓ¦McêÔ©´´´ðùç7çŸ .díÚµ44(矩©©$$$€‹‹ O?ý´ÊÀ•MEEÍÍÍdggß³ö{;4íïF¿F4¶ Y ±@ÇX‡òƒåèšë¢m¨Mù¡r,‡["Òué~+â81•ñ•w?(wgœ‹>GЮ ŠvðïL}LU;_5jhkhÃn¢­µ­ÈšdØM°£ú|5r©#W#|7ø’òB â]bÒ—§“³6Ÿ÷}ÔâÉÝœKê²T‚÷«Œš·ÒXØHýåzÊ”“ÿI>ö“ìÕÜÍṵ̈ŸjOλ9æñ×'~ålÔYÄ_‰´n¾|5–±>§E›óó».'ãþÆ8Ïw&ëí¬ÝÛڨˬ£ðóBŠwãåxGá»[~J?ÔÒ6×½Né¥ív>,úa`®¶£®§¨ok%£¦šO¯d³3ÿ*Ñ®níü,pó`l_õ£/Ѝok%ÂFÚ:4¶©è6f^dQbÇ>ÉßüÚßs‘ßPGvm ?Н±%;“iÎ.jî–ÖÌtqåÓÚWÏ_¯dÄÁ™xôg¾È½Â?†óqPˆÆ²gÕÖÐ&—3ÌJØ•û¸3ÔºiÕ÷ÏÐYTTD]]ãÇ¿Ù׫^\n¥µµ•_~ù…¯¾úªÝÇgÞ¼ywu4бcÇðòòÂÎÎŽçŸ33³?bèn9sæ uuuÌž=›êêj‰ŠŠ"!!á¾,îööô?N^^Û·oïÔ_k«òkh]]Sµßëêr‘ÉšqtwÛ°¤¥¥ñ /Gvv6FFFʱ¯&--¬­‡©üÛÚ†ÐÜ,Q·þˆµõ¤Òj¤Ò*ŠŠ~ÂÚz(ææ7Òóimm ´ôØ­£;%%G8rd—.}LD„òKЂ‚|}oŽ·”——ÓÜÜüÛn5'Oþ‰¸8'ÕóÕW¶*ã–²|”;¸~n5ný¹\ŠH¤«Ùü¥æZZ:ØÛêÔßïý…±q׆…BŽ––v¦ßÖ¦üJGǨGÓ¿UÿtuÍ4ò{«~Ü‹üwÄÊ9™™™Y¯êz{ÿªéø[WWÇ… øè£Ø±cÏ=÷œÆî‘’’‚··w·zrþЙ{gù0`_|ñ“'OfûöíÌ;—+VÓ+äÓ´þ»CWéw6?“J¥Lž<SSS<==é×Oyõ‚««+††7Ú^³f 3gÎ$))‰uëÖµÏÍ%##ƒo¿ý–>ø€¹sçöh;»Ûö¡©~=hù“ö}/ùýC¯;%;;[eðù$‰Ê¸ÕRSSQ(üéOÂÉÉIõØÚÚÞ¶Œär9ÚÚêó«úúúnÍM4éÿ^|ñÅN¶ïªî*¼€À£‚šå©ì§2âƒâI_‘ŽB® >(žóÏ(yÐÒÑ"ôçPê²êHˆL ñÉDL˜à¿Í_#wÕ L]ÅßSúƒúž]…¯Œ¯${m6#~¶‘6¯z¹*“i7pœí(Ôä}À~Š=‘I‘ Þ<-‘‘I‘ U^¦­hSød"¦Þ¦„Ňús(õ—ëI[š(“ÉÏ&ã»Á—ð_ÃùËHlÆØ4+©ý"ÁÕN=yЦ¢&ÂÂ1t6Tî¬n!d_§#ñãŒÝ93]} µ×Û^äoËWí¼•¯ d‰„¡µ¶•œµ9Ë/o‘“ùv&~›ü0t¾»ûalŸ´¥.«OÔÂK IDATŽÆBõ]YZ"-½7ˆÐŸC•òý0‚ÖêVR¦h¾§ÊïAéÀÀ·z ”ð_à ú6ˆÖíåô£Ox\žs¹­‘ñnÐÖÒâÃáÁ$<9…ô©3ùeìDª¥Ræ%Wógª«Ë¼þîD¹¨!¨">À3s’&=Å™‰ÓP `Fü‘vi]¾QKØ¡Ÿ(l¨'yòtú› •ɨ’J9:néSgrdÜD~2iSf?~25--¼š¬qHå2^K9Ç¿FŒ¤Ÿ±‰Ðá>¦Œ¶ïËbϼ–œtßÒT(øùù©^ì¯\¹‚\.'22RåçÃ?äâÅ‹ˆÅb©®®n÷"°yófÞ}÷Ýw^EGG#‘Hˆ‹‹C[[‰DÂñã7Û÷öíÛÉÌÌdçδ´´`ggw_é|a»oooüýýÉÏÏ'33“ŒŒ ¢¢¢„ô5dÇŽ( """xýõ×Q(¼ð j/÷{÷î%-- ©TJyy9;wîT¡”/Í-;EPÐF¢£ÅŒ³[9¯nkd×®~H¥5Lœxœ9s ™5ë £Gï”÷YåääàççGll,¯½ö«V­¢¢¢êë øæW<<0gNQQY(2öìQÿÀÃÓóOÌœ™ÉìÙ¹õeÏžATU¥±gƒ¿Áœ9…DEå`bâÊwß @&“"éøO=•Ltt13gf`eåÏÁƒOJ—»»;ëÖ­£ªªŠââb¼½½ñððømaàqqÎØÚ†0cÆE¢£ÅL›vŽþýg«åÏÉióæIÔ33Ïn×}ý5¾ù¦NN“™5ë sçakBe¥úøÖÔÔÄÔ©SùÏþCss3‡îýÓ4}™¬™'æ²å7ýø®GÛAvö¿))9Ììٹ̞«Ò¯®ôã~å¿¥¥…±cÇòÉ'ŸÐÜÜÌ‘#GzEÿÓú×ÎÆ¿®Æ_mmmÕøXRRBrr2•••ªñ·+wPa¥¯¯Ï÷ßD"A"‘““Ó#²õÄü¡+÷ÎòùòeÆŽË—_~‰X,&;;›©S§Ò+äÓ¤~»KWúÑÙü¬¦¦†+W®¨žÂÂBÕ¸Öô‡#Ú³²²TåxíÚ5ÜÜÜhjj¢²²’ .PRRBJJ ^^^j öÝz¿ìfû¸ýzò tÞ¿vÕ¿kÒ¾ï#FŒ   €‚‚†Nr²f븺º²`Á ÈÊÊB&“©}0Õ®]»†³³3!!!ª>ìܹsÌž=ûŽâù÷¿ÿÍáÇÉÍÍ%77—]»võXû077gÑ¢EÌŸ?¿]š¼¿v¾«÷W‡ ­ßÖF‰LŠJ£ßëet^àLß§úvh4ëI ú0äÓ!Ôeב±2£×•£ß&?ê2ë(Ø^ èÇ-èë0ôó¡´\o!}y:òVùcÕ‡,ô@”K&ûùž¦ã`hÄGEr©¶šåI§{]9n É¥šjþ™“) L·`¢£Ë×a£¹.mfñ™_i•?ZíkÙ²eÌŸ?¿Ç•&¦OOãâÅ äæî C@Ð^Ill,©©©lذAO@@ÐOû@ZZëׯîwè×cÂã`àx< E ð°²?„¾Oõí±øþ€û ÷ϧA_Bö…0èÝA½²ü6ùáºØUÐ? k¦ËˆG0xË`Dº^×ylü$fõëßcñýgd8+}÷x> 8:n‡÷Êöµ-x$Ëöξ£;˜ëéqdÜD¶‡ŒBWôèOMöîÝËš5k„Šè¹±Ùo%3f\ÄÀÀF(Œ;dúô4ÜÝç÷X|#Fl!,Ly‰™™§Ú±ˆVV÷\ž‘¾‘‘#öömþ׬YCII vvv‚ Ü±±±¬\¹RO GIKKëðè/A>A?‰ˆˆ B@à> ¶ŠÔ\ÒLÖê,N„œàĈí<çnÉåÔØST­@üµ˜øàx*ŽWhìÞ…¿üþeÊ”!Ž“»%€œ÷r(ü¬P¨Åû„ƒÞ÷&âtgÚwÒ>ïû04f(C-°cCèÏ¡ô[¨¼lUK¤E`\ ®‹]± ¶Äm™‘I‘XYjöbíj¤òoêeŠËs.Dœ‰ÀöIÛýÛO²ÇØÍ˜¼-y=Z6clÜÈ…/ù7Íë®ü·âô´!ûCˆLŠDßV_õûÈ## ü:P§v2 ÿ-þwU~÷B?Ì|ÍÔžÁ›3ü¿ÃÑÒÖRù¸j AßáüŒ3–A–èZê>4úÑz£•3ÓÎ ùE¨ã£Ð·Ñïñ6öÃøiÌxžs÷$ÄÆ+=ÍÓøë ?'LåI'žuó cZcûjv?aS.M‹"ÄÆ K{äâÔ™LrtîÐÿSÎýð05ã™{Tþq}Ù7f<ÏžŠçÕä³B§ûQÛÒÂØÃ9P,æì¤iØÞ×ô‡ ¦öÄÅÅqôèQtttؽ{7‡"<<œçŸ±X|Û; æÌ™ƒ——k×®Uýöâ‹/²hÑ""""xë­·H$Ê3ÖX¹r%¬Zµ ‰DBxxøCS?«W¯&''‡iÓ¦±dÉÊËË;¼¤XH¿cœ àüùóÄÄÄ€•••Ê}ôèÑ´¶¶Ëøñã™?>[·nU‹#;û_?>›ææŠ‡®ýŽû“&ÀÑñIÜÝŸaöì<V©ÜCBþÉÔ©§qršˆ½}8¾¾ÅÚz( ¼#L¡P¨ÚÚ­¿h”þðáïóÄßcié«zÌÌ<î‹ì7n\᫯lÙ½Ûë”ýýJßÝ}þþo>´ùÿðÃ?~<ååå½®ÿyÔûW¶mÛFII ¥¥êwpk2þÅÄÄpðàABCC™2e ™™™¼òÊ+Å+K–,!-- ‰D‚ƒƒÃ}‘O“ùEOÈ·iÓ&Yºt)áááX[[ß7ù4M¿³òï,|Wå×]H$ãë닯¯/ŽŽŽ˯©þu„§§§JßýýýY±beeeÌœ9³Ç꯳ùgoO {ï7]éǃÄÒÒRÕ&>ÌæÍ›Uÿëëë?2u0oÞ<Þ|óÍ{Ò~»Û¿Ýëð÷5—A_åµß?üÚylÈm è¿E ý|(¥{K‘VJñzÛ‹ì¿gkäÞ]…×ÒÑ¢íFmumh‰´HY”‚õHkú-ê'Ôâ}¢¹Ti½øJÇ‹ÚÆîÆÔeÕQ“RCe|%yhk +8}Ž‚íTŸ­¦`{­7ZѵhoÀÐÒÑÂo“C?ж‘¶š[cA#õWëi¸Ò€¬I†´TÚ^©õDx¾îIλ9(ä Õï>ë|òé,†Y`æc†ý${ôí4Ez"½3ˆŒW2h.m¾£²»ù;K?xw0ù¤¾”ªæfèdH[]•ñ•8D9àþw®n¼Š±§ñ—ß½Ò7TO¿Eýhkhãü‚ó(dÊ:öå0Ì|ÍÐ1ÑÁåO.ô ^öÐéGÙ¾2Šþ[„÷;Þ=Ú¾¾ ƒ¿¥¦ºº¼à9ÑöÔµµjöajÆBD'gV?Wl Yuá<ï ÞίŽHĶà‘Ä…Æø/‡yõuäܨ%çF-²6JšÛ…×ióöàV§¦ SÜ,¿ æ¿£"êcƒŸ¥O9÷ÃÞPs#…¾H›Ã‚XzöÅB‡û˜òýµ>¿z™õÃîïËUrr²êyå•W¨««ã‰'ž ­­ ÂÂÂxùå—9yò$Ÿþ9«V­âwÞi¯Çúú¬_¿ž¿üå/Èd7û¯O?ý”Ï>ûŒS§N‘Mcc#555Èd2ÂÂÂØ°a'Nœ`ýúõTWW÷èUwðòòbÙ²eL˜0ùóçcooÏŠ+زe‹¾†‘ššJ}}=‰„ÔÔTªªªT‹GÇŽ#22’gžy†_~ù…;wò?ÿó?Ê1K¤‡……>Lšt²Ã.¾¾¯-fÈ5ôí;GÇñ8;ß\ ^ºt)ÕÕÕ899JSSƒÝÜIÃÔ©gqvž‚§çóÌ™S€—וûôéi®ÇÎ.ŒAƒþ‡èh1,`À€01éÇÿLnn,û÷‡1hÐr•KOÏŒúúk”–£¬ì$rýzŠÆå7jÔgLœx‡q88ŒeêÔ3 þ¾šŸÖÖ:ª«3TÏWÕÜíìBéÛ7oï¥<ýt)NN5N̘ÝL™ò+..SqwŸ‡½}ØéX,æ“O>a̘1ª¾aÖ¬Y÷-ýéÓÓ Úˆ]^^/ñôÓe¸¸LÕ8¼……6hkü¦‹^˜šö×H?z"ÿýúÍ`îÜ"ÜÜžÆÖ6{û0lmCÓ-=|}}ñ÷÷çâÅ‹ >¼Wõ?½¡-**béÒ¥îòÐdüóòò"--ÄÄD8@vv6&&&Åÿû¸|æÌ._¾ÌôéÓ{¼ »J¿³ùEOÈwøða†Ž™™Ë—/g„ ÔÕÕÝ7ùºJ¿«òï*|Wå×]\]]©­­¥¸¸˜¬¬,222(..ÖXþ®ÜGWW—ØØX:¤V¿W¯^%33“K—.ÑÐÐ@QQQÕ_góÏÞ ŸÀÝ¿ßh¢÷š?îܲe 11ÊÞÕÕÕddd‘‘ACC•••ªÿ¥RåOLL gÏžeÊ”)<ÿüó°dÉÍùëŒ3(**âé§Ÿ&44”°°0BCC5vÿì³Ï8~ü8ãÆcìØ±œ9s†÷ß_-ÿ7n$,,Œ—^z‰²²2¦Nª6~ÙØØ```€——^^^ôïß¿ÇÚowû·{^@à~£¾º©u{-U-ʉ>zx¿ãHODí…Zd2äRy—î"ýÎê*¼ç«žÊ‰p£Œ¤¹I¸.r%oK¥{Kñyß§ËøzEçÎy[óp_îŽÓ\'¬FZaâeBaLûv.ϺàüŒ3)ϧÐTÔ¤ææ¾Â·¥nœy–¶†öW£~FèZè¢c®ƒ¼YNŸÑ}¨M¯Uóã¹Ò“šó5Tž¨Tû½ø›b|7ú2ð­”ì-¡tOi‡iÜ“&héhQ›VÛ­bìLþÛ¡×G ]Aœ‹>‡´BŠ¡³ºáÀÐÅy“œüOò þ>˜†+ T«`àªè˜èÜQùÝ+ýPÕñrwô¬õH~6Yõ›ƒ¦^¦$ÍN¢±PiÜpù“ ßrvÆÙ‡N?j’kp^àÜcMËÉÈ K¦û…üzåKÝ žùiÌxž`ÀBRS×ÒÖÖðÛâš)––¾*÷úúBZ[o.’–—'RZOii<&&ýqw±ø`×ã³ÓDìþ?{oÕ‘6nßì;‚È"» ‚Š`£,*î‚ ¢h4‰c¢3ú›¼c2“˜Wç35ã}$&fQŒ&qb¢&Ä Š (B£¢(ÍÖ ìKÝýýÑIk”& *žûºÎuA×öÔSužSUÏ©:ö"öïwRtlmE˜uªÓÒÒHLL$11‘°dÉ:Ôcåß¾©n?ssW\À­[G´J[U%¦©©¹¼é¾mv¿þakÜ-ò+2®_ßßvþØÜLvv6ýúõë•ö§7Øw¥R» Âýž7ndýúõ,_¾œÈÈHüýýÙ¶m›VùÛÛÛ“œœLXX¥¥¥ZXìîúµ7¾èjý\]]ñ÷÷'$$„k×TNýÕ«WsæÌFõÐë×Qùé¿3òßO]%%%/// ˜0a;wîdçμÿþûZµ¯6í¿aÃÞxã ‚‚‚Úu>zxxзo_¬­­illdúô餥¥u[4þì õøíöGÛùÉãÈ”)S˜2e ÎÎÎ(ªñëåË—ùúë¯9xð úE2™LÆþýûï›Ïý£££‰ŠŠ¢¹¹™O?½;þ\ºt)7n¤¾^5þÌÌÌ$99™ääd\]]Y°`GލÆWb±˜òòrššš‹ÅÝ~ÿvÕ¾=ìô=Ö^!«áVè›éSv¬ ƒ>è™èQv¼ ë@ktt; ¿I‚„ФŠNåªÝiqi¢po!`1ÔI‚DhÉGŒ©»)¾[|Éx!É W_$ocCßz×8ûXöc5—k83ùL»Îüíùd®Ê$ø‹`µSó^n6Pw¥Ž²£eÜøðÓ4Â-ý,qˆr ïí¶‹0^k«êå}}ÓóT(èéé=²ò•J::zê§--uXj÷Þþñ0äošÕ˜ÌÒÒ²WÙŸÞn_;zþ 4ˆýë_LŸ>Ý»w3þ|Ö¬Y£~ÿ#d2Ó§OÇÂÂ///ÜÜT'¿¸»»cbÒsG!ßo|ÑÕúR[[ˤI“îεÌÌÔ ¯›ŽÊïHÿÚÊÿ ñYwÑÒÒÂwß}Ǿ}ûºýÒ 60gÎÎ;ǦM›Ú®äç“ÍÁƒy÷Ýw™?~·–ÿ ñgo¨ŸÀoŸßôDÿèˆ_^ôê,b±Xíðù‘H„T*U;·ºBff&J¥’çž{gggõeggw_ÛÞø®®®®KcmÚçÅ_¼ïÑùÚØ·®¦x\Ðð<•~]JRP×\D©P’”ÄùgΪcÁB¾ ¡6·–äˆdR&§`>Èÿ]þZ…«'0µ­,¢ä¿šgøv”¾"©ñF1£ÿ;=S=<ÿèIκj²jpŠÎí f8q.‚aÛ‡¡£«CĹãUG44þl:¾[| û1Œ1ßÁv¼-çæžS§úîPt u øGç"ˆ8Á˜cÚ”S­^í KÃÄÅDµK°²Ñá?…3ú«Ñ˜y˜‘:+U#­÷›ÞÜØuC½#PcñÚ D߈O GtTDKu yó´®¿¢YAΛ9ømók³ƒJ´©¿¾…>N±NôŸÙ¿Í}ÓPР¾‹UαFI#ò&9†} QÈš r%ÊV%†6†Zëïaõõ¢Ùd;jskÕ»´îY÷â§i?aæiFhR(c¿ 8¿ðüc×?ú…õÃõy×6Nº® "¾=Ê Ë>œ›6“Ô©Ñ(Q2;é¤F< ð ÆUó ÈV…‚Ðã_3¤iÓf’üðCššš8yòd¯°?½Á¾ÆÅÅ!•JIHH@OO©TÊ©S§´zþ]¹r…ÈÈHþýï#‘H‹ÅDEE!‰´Ê¿ªªŠ«W¯ª¯›7oªíNcccÔïAã‹®ÖO©Tâçç§v ^½z…BADDD´_Gåw¤måÐø¬«¼÷Þ{\ºt ‰DBJJ •••㳎ÚW›öÈÍÍU×óÖ­[ 8ÆÆF***¸páÅÅÅdddàíí­±`ß´>ÉõèÚüF›þÑŒ=š‚‚  $=]»õƒ‚‚ÜÝÝY¼x1äææ"—Ë5^˜ê ·nÝÂÅÅ‘H¤¶iiiÄÆÆv*Ÿ>ø€'NŸŸO~~>è¶û OŸ>,[¶¬ÝcD;²oÝ‘^@àqBççµU"ÎEÚèÅ$%õú:º,v¡ÿÌþNµ‡qc†4œZq-Ùk³{ý¶ùQ›SKÁî¡܃¾™>#>Aóíf.®¾ˆ¢EñTÙ¥žƒˆqÀôÄoj9Ž&¦ügl—«+Y}î§^§Ç]Ác¸\UÉÿåå¦{0×7`è8nËšXžú#-Š'ëþZµj‹-ÒX”è-Ìš•Å¥K[ÈÏß+(C@è½’øøx233Ù²e‹P?¡ ôYYYlÞ¼™øøxA]Fpp=%< .§]A ¢oDmŽæë à±Æ£Ûå4îoŒèˆˆ!oé•úóÛæ‡ûrw¡ü KF5ša;†¡kðä™ÎÄIÓ˜ëÖ}×þç˜0ÖÖír:š˜òýÄilÜ+íÜ®à1¬<MúrrâTv‹Æb Ûû‡&‡fÆ Bà hÿlö[ËìÙ—06¶”ÑIfÍÊÂÃcQ·å7zôBCUßȱ´ôÒ8±o߀‡^ŸGQ¾©©áÝ3~øç?9tèP·Ê¿aÊ‹‹±··:¼Ào">>žµk× õèV²²²Ú=úK@èŸONNN„‡‡ Šè4V‘šŠ›È]ŸËiÑiN>Ý&rþŽ|ÎDž¡üûr$û%$'Q~ª\ëðŽxPú+ï\¡ôh)’ ù;òÈûk7?¹)´baìhŒÏ_|ÿ)œðÔÎiK_KkØöaþ'=Ž'Öî¦Dœ‹À:È o \Ÿw%<5»ÉvíÆw˜æ€Ù@3®ï¸Þ­:°o˨£¸ðârÞÈé”~ºª¿¡ï eÄžX°Âv¼-!߆à¶ÔM»…‰NêïQôž¬ßoé-5-¤F§"ýNÊØSc1²5êÖ¾õ?CüH™ÅdGgžèIvt ‘ý;ÿ}Ágz’8i—£c°×òÚÌ-¸ƒÈÖŽ¡VÖ,÷Ì¥¨9Lsri7þL7<-,ù[Î¥nÕÁÄþN?‰gÏ$ñÇô³‚Ñ}Ѝnn&òÄ1ŽI8;-{c“'²+ø­4" IDATV¬ ++ ©TŠ££c»qæÍ›‡··77nTg¬'''³víZÂÃÃY·nR©”°°°Ç¦^ëׯ'//èèhV¬XAYYY~døI/ßÅÅ…€€ÎŸ?Ïž={ oß¾êðqãÆÑÒÒB||<“&MbÑ¢EìܹS#±øœ:KSSùc×ï##ÿË´i§qršŒ‡Ç3ÄÆ^' `:\$ú?¢¢~ÂÙy*aøúþ66#Õ7”J%úúúêø¿üfll¬Uùï0a—X[ûª/KKÏ©{MÍUöí³ãóϽ‰î{ª|…øûÿù±•ÿ½÷ÞcÒ¤I”••õ:ûó¤ÛWWWWvíÚEqq1%%%ß³gÇŽ#$$„3f““Ã+¯¼¢µüº~Û¶m#%%…•+W†Ö㇎äïH?º~/¾ø"Ë–-#<<œ×_©TJPP:üóÏ?çøñã„……±dÉ$‰Æ7^:Jÿ°qttD*•Œ¯¯/¾¾¾899u‹|^^^êñž¿¿?kÖ¬¡´´”9sæ§b|ý ¬­­Õ÷܉'ؾ}»ú##£'FÇ .äÏþmã§®Ú¿Žì×ÃN/ ÐÓh8¸Œû«¨ýþæ×&b}~=…ÿ)dħ#(9\‚¬B†÷›Þˆÿ"Ö*¼#:J¯£¯CkM+­µ­èèê±,›16¸-sZ±‡h*Q9@/½òÛµk²kÔ—Û27Zë[9¿økV£FmÆÞ>”!C~G\œ„Aƒ–0hÐ ˜›»qôh8EEß’ŸÏ7ß„2dÈjµËÐÐ’ºº[””$RZúÙÙïqûv†Öú;ö¦N=…£ãD#‰ŠJ%0ð8--µTVf«¯šÍ©Ûۇп>>+Y° gç©Z—?~üç̘ñ#®®Qxx,ÄÁ!´S}H"‘ðá‡2~üxõ½?wîÜ+Ö¬,‚‚¶boŠ·÷K,XPŠ«k”Öé­¬¼16¶EOÏøç¾è…Å­úÀÉ“'ÉÉÉaîܹ,]º” &tJ~7·ÙÌŸ_ÈÀ °³ ÁÁ!;»Ÿû–!¾¾¾øûûséÒ%{•ýé öµ°°•+WÞwKGáÞÞÞdee‘’’ÂÑ£G‹Å˜››k%ÿãP¿'Nˆ¥¥%«W¯fÊ”)ÔÖÖj5~ÐFþéçq¨ßG}Ä'Ÿ|™3g‹Å444PUU€§§'¡¡¡¼üòËüðÃ|ú駬[·Ž·ÞzK«ô=»»;ÕÕÕ‘››Kvv6EEE–ÏÀÀ€øøxŽ?Þ¦}®]»FNN—/_¦¾¾žÂÂBaB ÐëÇ×Ðv‡ãŽ;سGµC½²²’ììl²³³©¯¯§¢¢Bý¿L¦ZãÙ³ggÏžeÆŒ,Y²„‚‚V¬¸;~={6………,X°€BCC Ñ:ü“O>áÔ©SLœ8‘ÈÈHRSSyçw4äߺu+¡¡¡¼ôÒK”––¥¡c[[[ŒñööÆÛÛ›´?Q§«ö¯#ûõ°Ó ô4𫛨HÓ|§Y5‘ègˆÏ[>èêR}¡yƒ…LÑa¸®Ñƒê(½×½T A rÎÍ?‡û2w®ï¸NÉᆾ3´Ãüºe÷dã±ÚCCÒŸMo¶Æƒ+rvÎYZë[Û„›º™b`e€~}M úëGõÅj8^k½¨:_EÅé ß‹>+Âw«/ƒ_LñábJ¾(i·Œûa>Ø}ª³ª›~º¨¿ë;¯ã±ÚçùÎôÓsosnî¹Ùíú{Tý£§ê×ý£*½ —Å.ÝvkÙ©ÞR/ojbmú9dr6ý0Ó×ÇXO¦ŸÂ±1_›ÈÌS'65ájÖþÄöCüXã3”©'¿¥®µ¥Mø3 ¬ °20¤I.gb'2ïÜÖˆóºŸ?gËËù¾´Xã÷}7òÙÂ_üGpðæ >+¸Ñn÷çúººdüª<§så,õüÄÈkooOrr2aaa”––>pâ²iÓ&’““9vìX»á¿ÿýïY¹r%S§NåúõëEýlmUGâ•••±bÅ d2"‘sssŒijjÊïʘÈCuTî… Ú W(š©ªcdÔ·Ýpkk?† ûß|Juu^»qvíÚÅW_}ÅÕ«W)//ÇÒÒ’–•}vvž‚³óœQ*ªg\Õe&Nüš7"“©qwî\¤¬,™²²dÊËÓ˜8ñ7o~‰‰‰=¥å56–JLLTÇÅ>½ÐÁÑqC†¬ÆÜÜ…¤¤TUuüœ«k4®®Q(Í„…}ªþ}Р¥dfn¤µµþçÅC ¬­}Õáuu7ii¹»ÈZV–BII%%I˜›ÀÃã$’c–ïì<{{û÷;©:¶¶" Ì:ÕÎiii$&&’˜˜È€X²d‰ú˜¾ž(ÿöíLuû™›»2pànÝ:¢UÚª*1MMåÈåM÷m³ûõ©SÃÇÐÐåÏ/Å„……uz^¡qýúþ¶óÇæf²³³éׯ_¯´?½Á¾+•Ê.…oܸ‘õë׳|ùr"##ñ÷÷gÛ¶mZÉÿ¨ëçêꊿ¿?!!!\»¦rº¯^½š3gÎ0jÔ¨ÇÚÈÿ ýtËô® õû <==quuE__Ÿ‘#GråÊ®]»F\\ÇŽÃÚÚ€ššÊË5w*ß/}O’’‚——L˜0;w²sçNÞÿ}­åÛ°ao¼ñAAAο{Ç}ûöÅÚÚšÆÆF¦OŸNZZš0!èÕãë®2eʦL™‚³³3 …jüzùòe¾þúk<¨~‘L&“±ÿþûæs¿ðèèh¢¢¢hnnæÓOïŽ?—.]ÊÆ©¯W?333INN&99WWW,XÀ‘#ªñ•X,¦¼¼œ¦¦&ÄbñoªgWìŸ6öëa¦èi´ö Y ·BßLŸ²ceô1@ÏD²ãeXZ£k¤Ûaø½H$T$Ut*PíÎH‹K#è@…{ ø ‹¡H$BK>F8Ç9Ó/¢ý‰¦Ù3\¹ûfn»áùÛóÉ\•IðÁj§æ½4Ül îJeG˸ñá ¦9h„[úYâå@ÞÛmyª.Tñã„9sÉ> C6 Áw‹¯ÖõªË«CÙª¤O@Ÿן©»)¾[|Éx!É W_$ocCßÚ­ú{Tý£§ê×]ý£O@j²kºM'çïTP×ÚB´‹+UÍÍ4Ê[™áìÂÙŠò6έÅ=‰ì¯yô™L®`arfú 0·ÀÙTµðåjjޱÞÝ]n[s.±,%™c‘“yïí.€õµˆ««øJr‹â¢]\5¬m˜ãêÎÿfµuNŸ¿]Áèc_1õûoùWþUþÌûA"­u[]E«BÁȾý#ú”3¦Y•OŽ£S&“1}út,,,ðòòÂÍMµ³ÜÝÝ“{v1²páÂv  °°ŒŒ |||ç@jj*µµµÄÆÆRYYICC111$''÷Èä··—êÔ)®_¿ÎîÝ»¯¥¥P9r6¹¼ '§‰÷MëèèHVV/¼ð ˆÅbLMMUϾ*1::úØØŒTÇ·³ÑÔ$U;·~Ípd²Jd²;~Íúô¹ë”öô\DKK=%%‰÷.“R\|’“'£¹|ù}ÂÃã(((À××Wã~(++£©©‰;w2%?üð Îêkß>;µsK¥Í\÷:·~B!CW×@«ö©ªºŒŽŽ>c¯µUµóX_ß´Ã< zzz¬|¥RŽŽ^§úiKK–ZŽ·dee¡¯¯Ïøñã»Mþö¨©QÉ,--{•ýéíöµ# Ä¿þõ/¦OŸÎîÝ»™?>kÖ¬Q¿áß‘üº~………ÔÖÖ2iÒ¤»sa33õÂhG㇎äïH?º~wŸSµ\¸p¿ÿýï|üñÇ<ÿüóê°ÄÄD¼½½±··gÉ’%XZZ¶'=(}OÑÒÒÂwß}Ǿ}ûÚáÖ‘|6l`Μ9œ;wŽM›6µ]ÿÈÏ';;›ƒòî»ï2þ|a2 ðÔØÿ_^ôê,b±Xíðù‘H„T*U;·ºBff&J¥’çž{gggõeggׯÆ=h|WWW×¥±‰6öïÅ_Ô8Úµ3ö«;Ò <.hxžJ¿.%)(‰‹k.¢T(I Jâü3çÕ±`!߆P›[KrD2)“S0dŽÿ.­ÂÕ˜ÚVŠQò_Í3œ;J_‘Tx£˜Ñÿž©žô$g]5Y58Å ç€ö3ˆ8Á°íÃÐÑÕ!â\ñšGè[èãëDÿ™ýÛÍÃn²µ¹µ4ܼÿdõ×ê93ù …„%‡aâb¢Ú%Xٌ興ðŸÂýÕhÌ<ÌH•ª‘ÖûMon캡Þ¨1Izm¢oD„§„#:*¢¥º…¼yZ×_Ѭ çÍü¶ùaâbÒiýtE  ¤?›Žï_Â~ cÌwc°o˹¹çºUªôTýº£ô ë‡ëó®÷uÒþZ BÍ>V¤M›Iò䈫«Yš¢yÔ … xãªù†gMK37êjÕ—¤A5èºÕPׯAv¥¦šÐã_s³¾Žôé³p33G&—sG&ãû‰Ó¸5‡“§âeaɤÇ5Ò¾5|$ϽÌmYÛ£ß6œS“¦“5c6I“¦SÕÜÌ›™éZë@¦ójFÿ=73sÁà>¥ŒsèÏr¯Á¼š~¹ªªŠ«W¯ª¯›7U;O hllTÇÛ¾};o¿ýv›7“AuĆ‘‘_~ù%R©©TJ^^ÞcQ¿––|||ð÷÷çÆäääMLLŒP¾–|üñÇ(•JÂÃÃyíµ×P*•¼ð “ûÇ“••…L&£¬¬Œ½{÷ªPªIs3‰‰1m%.NÂøñŸ«ž­ 8à†LVÅÔ©§˜7ï&sç^eܸ€ê{VyyyøùùÏ«¯¾Êºuë(//ÇÑÑ‘ºº>ûÌOÏÅÌ›W@LL.J¥œ/¾Ð|ÁÃËë9æÌÉ!66SÓþ|ñ…êˆÃ;w²øâ‹¡ ö'æÍ»ILLææî:4¹\†®®!£F½ËÌ™éÄÅ1gN6}ûúsìØõ}âááÁ¦M›¸sçEEEøøøàééùóÂÀ-\°³1{ö%ââ$DG§1`@¬†|ÎÎSX¸PªqYZzu¹ýëênñÙgn8;Ogîܫ̟_ˆˆŠ Íç›\ÞÄéÓ‹‰vüÜ>‡º¥ÿ=êòï.$}@qñ bcó‰ÍW÷¯ŽúÇ7033cöìÙTVVÒØØHXXgÏžíVù›››‰ŒŒäÃ?¤©©‰“'Oö ûÓìk\\R©”„„ôôôJ¥œ:uJ«ð+W®É¿ÿýo$ b±˜¨¨(D"‘Vò?êú)•JüüüÔ/®\½z…BADD„V㇎äïH?º~zzzìÞ½›œœŠ‹‹IOO§¢¢Bc!õ—ð½{÷ÒÜÜŒ½½=©©©Z§ؼ÷Þ{\ºt ‰DBJJ •••êò;#_nn®ZO·nÝbàÀ466RQQÁ… (..&##ooo{Þ:¾þ…Ñ£GSPP@AA¤§k·~PPP€»»;‹/¦  €ÜÜ\är¹Æ S]áÖ­[¸¸¸ ‰Ô6 --ØØØNåóÁpâÄ òóóÉÏÏçÀZ¥ÓÖ¾ôéÓ‡eË–µ{ŒìƒìWw¥xœÐáçó."ÎEÚèÅ$%õú:º,v¡ÿÌþí:EºãþÆ ÿh8µâZ²×f÷:=úmó£6§–‚ÝBÿ¸}3}F|:‚æÛÍ\\}E‹â©²!K=ã:€é‰ß>ÔrMLùÏØ.WW²úÜO½N»‚Çp¹ª’ÿËËL÷`®oÀþÐqÜ–5±<õGZ½ëþZµj‹-êÖE'žbÖ¬,.]ÚB~þ^ABÿè•ÄÇÇ“™™É–-[„ú ýS ÈÊÊbóæÍÄÇÇ Êè2‚ƒë)áipp <è *x\}#ºïц¿…€ðXãÑír÷7FtDÄ·‡ôÊvðÛæ‡ûrw¡ü KF5ša;†¡kðä™ÎÄIÓ˜ë6 Ûòûç˜0ÖÖír:š˜òýÄilÜ+ï¯]ÁcX5¸wÚŽ®ÐÇГ§²[4Ý'hrøða6lØ 4¬@÷=›ýÖ2{ö%Œmet’Y³²ððXÔmù½ƒÐPÕ7n,-½4ŽEìÛ7à¡×çQ”ojꄃCx÷ŒþùO:Ô­ò ÷‡@W‰gíÚµBýº•¬¬¬vþê'ôO§'''ÂÃÃEô«HMÅMä®Ïå´è4§GŸn9G>g"ÏPþ}9’ý’‚“(?U®uxG<(ý•w®Pz´I‚„üùäý5›ŸÜZ±‡0v4Æç/>„ÿNxj[#mék©q Û>ŒÀÿ¢£§€Çï=sr ¶lq^àLÄÙlÇi75u7%â\ÖAÖXx[àú¼+á©áØM¶k7¾Ã4Ìšq}ÇõnÕíx[FÅ…/óÆo;bÌy3¢oDDœ‹ÀÈÎHëtéwÌÉ1ŒÚ? P§úC(þ;ü“þ:‹Ž®£Fá¾Üë`k®¨.ï:jÿ¡ï eÄžX°Âv¼-!߆à¶Ôí±é-5-¤F§"ýNÊØSc1²5êÖ¾eobÂåèFôí‡w+¼ûXá`bÒé|žèIâ¤i\ŽŽÁ^ËôÌ-¸ƒÈÖŽ¡VÖ,÷Ì¥¨9Lsri7þL7<-,ù[Î¥nÕÁÄþN?‰gÏ$ñÇô³‚Ñ}Ѝnn&òÄ1ŽI8;-{c“-ßÑÑ©TJpp0¾¾¾øúúâä¤ú¾§žžÉÉɬ]»–ððpÖ­[‡T*%,,¬Ý¼æÍ›‡··77nTÿöâ‹/²lÙ2ÂÃÃyýõבJ¥©Ãׯ_O^^ÑÑѬX±‚²²²Çê#¾Z¾'½|8þ<{öì! €¾}ûªÃÇGKK ñññLš4‰E‹±sçN<ÄâpêT,MMåÝýù_¦M;“Ód<<ž!6ö:ëÔá"ÑÿõÎÎSqpÃ×÷°±¨¾¦T*Ñ××WÇÿå7ccc­Ê |‡ ¾ÄÚÚW}YZzöHÝkj®²oŸŸîýHtßSå{x,ÄßÿÏ­üóþxÜíóã^?WWWvíÚEqq1%%šßàÖæùú ôÚ„?Ìúu‡üÉ×Õð‡Ù~¿°mÛ6RRRX¹r%aaaØØØ¨ÃFŽ©q%$$ðý÷ß«m~Gùþùç?~œ°°0–,Y‚D"y(߀Y±bYYYH¥Rµ–¿+òyyy©û‹¿¿?kÖ¬¡´´”9sæôXÿ|PûuvüÛÓõè˜={öpìØ1BBB˜1c999¼òÊ+Zß¿kkkõœìĉlß¾]ý¿‘‘ÑÓ .äÏþmã§Žæ]™ßöDzžFÃÁeÜ_åÀðû›_›ˆõùõþ§ŸŽ äp ² Þoz#þ‹X«ðŽè(½Ž¾­5­´Ö¶¢£«CƲ lÆØà¶ÌMhÅ¢©Då½ôJû‹Ú5Ù5êËm™­õ­œ_|¥\‰™‡.‹]ÈX’AÿYý1êg„x£ïõm'´:ú:ømócħ#Ð3ÕÓk(h îZõWë‘7Ê‘•ÈÚvjC]¼^ó"ïí<” ¥ú÷¡›†2ü£áX´Âr¨%Ó0²×þá¨k¨Ë·†ýJ6M%M¿Ù u þ<˜† d¾”ÙùE€è×ÄÙ„ÖÚV*’*pŒqÄã\Ûz 3/³Nëï· T(I‹K£`w•g+)Ø]@KM VZµ¿™‡µ¹µTeTQ‘TAÃõôÌô»þQz¤”Âÿâó–O·Þ_®¦æÔ¶´PÒØÀÕšjÄÕU”66jÞHW£&“_WËóg~¸o<}]]v!!tf÷,(\¯«%¯¦š¼šjä­76´[ΛÃXŸ™\yW æ?cà êg‹Ÿu_fº¸uÊAg¤«ÇÖ‘A¬<{†¢†Áà>¥|y«€O¯]aóÈ -×ÝÝêêjŠŠŠÈÍÍ%;;›¢¢"är9¡¡¡lÙ²…Ó§O³yóf*++Û±yófþð‡? —ËÕ¿ôÑG|òÉ'œ9s±XLCCUUUx{{³jÕ*¦L™Â¢E‹ppp`Íš5ìØ±ã±h“G-_o(¿°°ÌÌLêêêJ¥dffrçÎõâ^bb"<óÌ3|÷ÝwìÝ»—ßýîwªg–®!VVÞXY eÚ´ÚÝáâëû qq†ß@ÿþãqrš„‹ËÝΕ+WRYY‰³³3!!!4662dÈݤ‡âêÕ«ÄÄİråJêêêøÿïÿ©ÃgÍÊbÔ¨ÍØÛ‡2dÈ“0hÐ2 zss7Ž §¨è[òóãùæ›P† Y­vbZRWw‹’’DJK ;û=nßÎÐZcÇ~ÂÔ©§ptœˆ£c$QQ©¾£§¥¥–ÊÊlõUSsM#ÜÞ>„þý#ðñYÉ‚%8;OÕºüñã?gÆŒquÂÃc!¡êC‰„?üñãÇ«mÃܹs{¬üY³² ÚŠ½}(ÞÞ/±`A)®®QZ§·²òÆØØ==ãŸû¢74ê·k×.ÆÏ«¯¾JSS“ºÿœ>žãÇcnn®víÚ5rrr¸|ù2õõõöXÿ|Pûufüû(ê' ÏÊÊ"%%…£G"‹5Ú§£û÷aóë€;vì`ÏÕõÊÊJ²³³ÉÎΦ¾¾žŠŠ õÿ2™jgÏž=œ={–3f°dÉ X±b…:¿Ù³gSXXÈ‚  !44”­Ã?ùäN:Åĉ‰ŒŒ$55•wÞyGCþ­[·ÊK/½Dii)QQQú·µµÅØØooo¼½½0@ûu4ìêü¶'Ò ô4š«›:÷Ø|§Y5IígˆÏ[>èêR}¡yƒ…LÑa¸®Ñƒê(½×½TÚ9çæŸÃ}™;×w\§äp CßÚaþÝ€R»h«=0´1$ýÙtõo†} Uí\ÑLîº\Í ú ©ºFº(d UÚ5 \9³sÎÒZßÚ&oS7S ¬ ÐIA¿qý¨¾X­Çk­U竨8]¡ñ{ÑgEønõeðëƒ)>\LÉ%í–q?Ì›££¯CuVu§UgØÏ A¤Å¥!+—aâòÛw'´§_W n|xƒà/ƒ©¿ZOyb9ƒ× Fß\¿Súë*®ÏºâòŒÊ™ÕXبuû_ßyÕ8Ïw¦ï˜¾˜{›ssæÍÇ¥T¥Wá²Ø¥[õ–v»œÑǾB_W—±v¼3"O®]áã«y¦µ56æ«q™yêÒ¦&\ÍÌÛ÷Ç!~¬ñÊÔ“ßR×ÚÒ&|€™Ö†FXÒ$—3±¿™wnkÄyÝÏŸ³åå|_Z¬ñû¾ùì á/þ#8xóŸÜh·ŒûáÓÇ }]]2~UžÀÓǹŠr–zîÑ2SRRðòòÂÀÀ€ &°sçNvîÜÉû￯ï÷¿ÿ=+W®dêÔ©\¿Þvè¦M›HNNæØ±cmÂ,,,ðôôÄÕÕ}}}FŽÉ•+W°µUíd-++cÅŠÈd2D"æææÓÔÔôHÛãQË×ÛË÷ðP•{áÂ…vÊfªªÄÓ·X• IDATõm7ÜÚÚaÃþÄ7ß„R]Ýþób×®]|õÕW\½z•òòr,--iiQÙçèèhfΜ‰‘‘ …B=aÿñÇÙ»w/ªgå;)+K¦¬,™òò4&N<ÂÍ›_bbbOcc©Fye€{NŸ^ èàè8!CVcnîBRÒªª:~ ÎÕ5W×(ŠfÂÂ>Uÿ>hÐR237ÒÚZÿóâšÖÖ¾ê𺺛´´Ü]¤)+K¡¤$‰’’$ÌÍàáñ ɱËwvžŠ½½ˆýûÔa[[f{Ƨ¥‘˜˜Hbb" `É’%êcúz¢üÛ·3ÕígnîÊÀ ¸uëˆVi«ªÄ45•#—7Ý·Í222ÔõKII!99™„„ÆŽKxx8†††(~)&,,¬ÍhG(2®_ßßéûãI·?½Á¾+•ÚM ï÷|í(ýƒÂ{²ý~‹üÉ×Õð‡Ý~®®®øûûµkª— V¯^Í™3g5j”FÜ 6`ggÇĉµÎÿÚµkÄÅÅqìØ1¬­U§‚ÔÔÔP^Þ=;5íííINN&,,ŒÒÒÒ.<·'¿¶òmذ7Þxƒ   vôíÛkkk™>}:iiiÝz¯·×?;Ó~ÿ>õhŸ7²~ýz–/_Ndd$þþþlÛ¶­Óíÿ82eʦL™‚³³³züzùòe¾þúk<¨~‘L&“±ÿþûæs¿ðèèh¢¢¢hnnæÓOïŽ?—.]ÊÆ©¯W?333INN&99WWW,XÀ‘#ªñ•X,¦¼¼œ¦¦&ÄbñoªçýæÝ9¿}Xéz­½BVíÐ7Ó§ìX} Ð3Ñ£ìxÖÖèév~/’ IÊT»3ÒâÒ:DáÞB>Àb¨’‰Ð’ fÌpYäBš“ã U´Ö·b?Õž–êärì§ØSy¾RíÜÈßžOæªL‚¿V;5ï¥áfuWê(;ZÆoà0ÍA#ÜÒχ(òÞn»ÈSu¡Š'üÈÙ˜³HöI²i¾[|µ®[]^ÊV%}útZ/ ™‚Œeè™éaênЉ£ÊÁeâl‚ž±æ.$ç8gúEôë”~l7©v œ}–ìW³‘7ªþ7ìg¨µþº‚…a?†Qs¹†3“Ϩ[Ú´¿©»)¾[|Éx!É W_$ocCߪQÆãÒ?úô¡&»æ¡ÜC­ §ËJøüVû·Ý¾x '‘ý5fr ““0Ó7`€¹Φª…/WSsŒõîö¯­9—X–’̱Èɼá×ö-çõµˆ««øJr‹â¢]\5¬m˜ãêÎÿf¥·I{þv£}ÅÔï¿å_ùWù[`0®wnu­ #ûö éSΛ~dU>GgKK ß}÷ûöíÓ8â' €ÂÂB222ðññi×¹ÈÂ… Ûýñ µµµ\¸p¿ÿýï|üñÇ<ÿü󤦦R[[Kll,•••444Crròc±xú¨åëíåŸ:uŠëׯ³{÷îúf rähö«|äò&œœ&Þ7­££#YYY¼ð $$$ ‹155U/èëë3zôhuü_û~qný›áÈd•Èdw(,ü›ôés×)í鹈––zJJï]Ƥ¸ø$'OFsùòû„‡ÇPPP€¯¯¯ÆýVVVFSSwîdJ~øá9œÕ×¾}vjç–J?š;¸îunµ“)dèêhÕ>UU—ÑÑÑÇÁa샟ݭªÇúú¦  ôôôYùJ¥½NÚÆ: ,µŠ;jÔ(nß¾MEEYYYèëë3~üøn“¿3÷Ç“nz»}Õöùú8ׯ+òw$_WÃ6………ÔÖÖ2iÒ¤»sU33õÂï/ <˜•+WòòË/wºŒÄÄD¼½½±··gÉ’%XZZÞwœÕYd2Ó§OÇÂÂ///ÜÜT'¹»»crÏ)’_ù6lØÀœ9s8wî›6mj“G~~>ÙÙÙ>žW_}•uëÖQ^^Ž££#ùùù˜››³|ùrõŠr¹œþý5Ç!^^Ï1gN±±ù˜šöç‹/TGÞ¹“Å_ eذ?1oÞMbbò07wçСAÈå2tu 5ê]fÎL'.®ˆ9s²éÛןcÇTÇÔàááÁ¦M›¸sçEEEøøøàééùóÂÀ-\°³1{ö%ââ$DG§1`@¬†|ÎÎSX¸PªqYZzu¹ýëênñÙgn8;Ogîܫ̟_ˆˆŠ Íç›\ÞÄéÓ‹‰vüÜ>‡º¥ÿ=êòï.$}@qñ bcó‰ÍW÷¯_x饗(++£ººgggìíU»÷nܸ™™³gϦ²²’ÆÆFÂÂÂ8{öl·Ê¿ûãI·?½Á¾ÆÅÅ!•JIHH@OO©TÊ©S§´~¾v”þAá=Q¿®Èß‘|] Øí§T*ñóóS;>®^½ŠB¡ ""B#Ù³g“™™©Þ%Ò™þñËøiïÞ½477cooOjj÷Ì_«ªª¸zõªúºyó¦ú¹ÔxÏ1ñ’_[ùrssÕzºu뤱±‘ŠŠ .\¸@qq1x{{k,Ø?Ìþ©Mûi3þ}”õ¸?W®\!22’ÿûßH$Äb1QQQˆD¢NÝ¿›Ñ£GSPP@AA¤§k·~PPP€»»;‹/¦  €ÜÜ\är¹Æ S]áÖ­[¸¸¸ ‰ÔsÄ´´4bcc;•Ï|À‰'ÈÏÏ'??Ÿh•®£ùã/ôéÓ‡eË–µ{ÌkGóÛîH/ ð8¡ÃÏç]Dœ‹´Ñ‹I JêõutYìBÿ™ýÛuŠt'ÆýþÑpjŵd¯ÍîuzôÛæGmN-» „þqúfúŒøtÍ·›¹¸ú"ŠÅSeC–z"ÆuÓ¿}¨å8š˜òŸ±\®®dõ¹ŸzwárU%ÿ——#<˜îÁ\߀ý¡ã¸-kbyê´(ž¬ûkÕªU,Z´H=ièMÌš•Å¥K[ÈÏß+(C  ‰„ 6ðñÇ Êxb‰'33“-[¶õú§@••ÅæÍ›‰”! Ðe×SÂÓààx:ÐT ð¸ úFtߣù~ à±Æ£Ûå4îoŒèˆˆ!oé•úóÛæ‡ûrw¡ü KF5ša;†¡kðä™ÎÄIÓ˜ë6 Ûòûç˜0ÖÖír:š˜òýÄilÜ+íÜ®à1¬<MúrrâTv‹Æb Ûû‡&‡fÆ Bà hÿlö[ËìÙ—06¶”ÑIfÍÊÂÃcQ·å7zôBCUß°°´ôÒ8±o߀‡^ŸGQ¾©©á­ü6l ¸¸X}4¢€@g‰gíÚµBýº•¬¬¬vþê'ôO§'''ÂÃÃEô«HMÅMä®Ïå´è4§GŸn9G>g"ÏPþ}9’ý’‚“(?U®uxG<(ý•w®Pz´I‚„üùäý5›ŸÜZ±‡q^àŒèç"0²3Ò>]œ3N󜰶fÀˈ8Aÿ>ÚM¬ÝM‰8u5Þ¸>ïJxj8v“íÚï0ͳf\ßq½[ën;Þ–QFqáŠ休өúÙ©~ èƒù sÌ™cd¯½þº’¾³úû­ ^7˜ ƒA¸<ã‚u5ÖZ§õø½cNŽÁv‚-Î œ‰8í8ÛǦ´Ô´Šô;)cOÅÈÖ¨[u÷?CüH™ÅdGgžèIvt ‘ý;÷}Áÿ/`$_ŸÄó^ˆlíèk¨ŒÌ-¸ƒÈÖŽ¡VÖ,÷Ì¥¨9Lsri7þL7<-,ù[Î¥nÕÁÄþN?‰gÏ$ñÇô³‚±}Ѝnn&òÄ1ŽI8;-{c“'®Û¶m#%%…•+W†M»ñæÍ›‡··77nTg¬'''³víZÂÃÃY·nR©”°°°Ç¦nëׯ'//èèhV¬XAYYY~døI/ßÅÅ…€€ÎŸ?Ïž={ oß¾êðqãÆÑÒÒB||<“&MbÑ¢EìܹS#±øœ:KSSùc×÷##ÿË´i§qršŒ‡Ç3ÄÆ^' `:\$ú?¢¢~ÂÙy*aøúþ66#Õ7”J%úúúêø¿üfll¬Uùï0a—X[ûª/KKÏ©{MÍUöí³ãóϽ‰î{ª|…øûÿù±•ÿ½÷ÞcÒ¤I”••õ:ûÓ›í«6Ï¿‘#Gj\ |ÿý÷j›ñ ðžx¾ººº²k×.Š‹‹)))iþùçŸsüøqÂÂÂX²d ‰Dã&¥ï¨þ<ŽõëHþŽòØtT¾££#R©”àà`|}}ñõõÅÉI»ù›———º?úûû³fÍJKK™3gŽÖò½øâ‹,[¶Œððp^ýu¤R)AAAÝ6¾Ü³gÇŽ#$$„3f““Ã+¯¼Òcõ{ÚéèþéÈ~wd?Ô5ÖÖÖê{êĉlß¾]ý¿‘‘ÑÓ† .äÏþmã§®¶OWìSw¤èiôïýǸ¿1>ñÁ~Š=—þ ¹pYŸ_Oá þ<˜«›¯b6È ï7½ÿEŒí8ÛÃ;¢£ô:ú:´Ö´ÒZÛŠŽ®Ë2p}Ö•~áý„Vì!t uµW·\%ó¥L‚?ïÜ I‚= ¬ 7Êi©niOG_ß-¾Xµ* yƒ\ÖPÐ@óf m ‘7Ê‘•ÈÚ•Óë5/rÿ7¥B©þ}覡ÚrãÃ(š˜º™R™^‰¬L¦uý‡¼5„‹«/ÒTÒÔéú™8›ÐZÛŠ¬T†L*ÓM´MßUýýVFþ{$º†ºè›ëãúœ+Òï¤T_¨Ö*­™‡.‹]8s¯W½¨¿Rx£ïõÞmœäº”)ÅÄÑŸ·|È\‘Ù-ºó²°d©ç ¦~ÿ-o @\]ͺ çùëð@N–i•Çgaã1ÒÓÃÂÀ€¼s´HÂùÛm¾®.ïÑ×Ðe?%SßÚª»^WËm™ ##ä­76´Io¤«Ç›Ãx-= ¹ò®þþŒ­±1;Ä94Êå 4·àl…”Ò{>Òü ŒtõØ:2ˆS¤¨¡A0¸O)_Þ*ÀÙÔ”Í#ƒxîÌé'Fî'N`llŒ¥¥%«W¯æ‹/¾h÷#ãFFFlÞ¼™—_~¹\e»är9¡¡¡ê8?ýô‹/îÖª®àííͪU«æÝwßåòåˬY³†;vðÍ7ßåkAaa!………ÔÕÕ!•JÉÌÌÔX¼HLLdìØ±œ9sFýûÞ½ªï]éêbi9ƒ>Lœx„ãÇ'qçŽæ³Ç×÷|}_!/ïcJK@WW]] Uò­\¹’·ß~???\]]ùþûï9r$99ªuBC÷`e5”ÌÌÛ2|øz.^Ü„Xü! ÚUTô-·nÁÆÆŸaÃþDFÆz®\ù„Aƒ^ÀÜÜÇïî¼))IbÖ¬ åöí -©«»EII"r¹ŒÒÒ:ÕcÇ~‚…Å@²²þ (9ò-JJ’8þOê8--µTVÞÿ»¨öö!44H°²B@À›$'/E"9¦UùãÇŽ©©=/¾‹¡Ü¾¡ýøW"á›o¾áÀøûû³uëVæÏŸÏ¡C‡z¤üY³²(.>ÁÍ›ÿÅÚz(ÇoàÌ™åܺuD«ôVVÞÛ¢§gŒ••÷ÏvKFmíûGwÈïæ6›Ñ£ß'-íUêên¢««‡B!G*MÁÐÐAƒaeeErr2£Fâüùó½ÆþôvûªÍó/==]ýw||<µµµÄÅÅiþ°Ÿ¯………¬\¹’C‡µùŽŒ§§'¡¡¡sãÆ ~øá”J%o½õGí0½6õÓvüñ¸ÖïAòk“ÿÃD›òÝÝÝ©®®¦¨¨ˆ’’õØî×ðÏþæÎK]]:ìÚµk”——ckkK}}=………ZËøÑG©æwúúØüÿì½yX•eþøÿbßwYd7ð ,.˜{*¢hZ©™“}F¿Óg¬¦ì£ó³²Ò+§Æ²©qÁL³\KE”$EPdQMÈ"Û9À9ç÷ÇÉ£g@ÎA Ÿ×u=×çÞïû}¿ïåýÜ÷cgGCCÕÕÕ]6¿ôññáôéÓ$%%¡««Ë¢E‹077ï¶ò=í´×´ÑßšôG{òÓ¤§§³~ýzÕœwÓ¦M˜™™±hÑ"ªªª¨ªªRî××SQQAF†ú&}L0q6AG_ËKòïmf{®ð¤ß²~œ›yŽ–ú–VáMû˜b`m€¾•>r‰œ^£{QsI݈â½Ò›êóÕTœRßÜ/þ¶ÿ þ xk%ûK(ÝWÚfÂ|€9:ú:Ԥג+ÊYä5àw“_www åúõë,_¾œ3gÎ0|øp5¿ëÖ­#11‘#GÚÞXÿãÿȲe˘8q"7nÜx"Êgo¯|I©¬¬Œ¥K—"•J‰D˜››cllŒD"Òʫr/^¼Ø¦»\ÞDuu6FF¶mºÛØ0hЛ:FMMN›~¶lÙÂ?þȵk×(//ÇÒÒ’æf¥~vu€«ëââ\Q(”cmuõ¢¢’—·©´€ÊÊK”•%RV–Hyy QQ((øGo©¥×ØX(01Q^wêÔ@gç± ¸ss7æR]­Eÿš†»ûTäò&ÂÿRýÞ¿ÿ"ÒÒÖÒÒRÿÛæš66þ*÷ººš›kUÿ—•%QZš@iiææ}ñô|N+—«ëDEìÚåÂoŸ-ÆÞ^„Y‡Ú9%%…øøxâããéÛ·/ .ÔÊÀÕUéß¾¦j?sswúõ›«µ«º:‰¤™LòÀ6{|ØÛ‡tIþår)7nìj½~lj"##ƒ^½zõHýÓÓõ{GÆ¿5kÖààà@TTT›á5¹?ªñU¡xð ‹×¯_'66–#GŽ`ccÀ;w(//×*¼¦òudþñ$–OSþµ‰ÿQ¢MúIIIx{{c``ÀرcÙ¼y3›7oæÓO?Uk»·ß~›àà`jkkÛœØÚÚbccCcc#“'O&%%Eë|ZXXàåå…»»;úúú :”«W¯v‰ü¯]»–Õ«W³dÉÆG`` 7nl%›²|O3íõŸŽèïöô£6òó$2aÂ&L˜€««+r¹rþzåÊ<Èž={¨¬TÎ_¥R)»víz`<rŸ6mS§N¥©©‰¯¾º7ÿ\´hk×®¥¾^9ÿLKK#11‘ÄÄDÜÝÝ™;w®ÊÀ•Myy9‰„ììì‡*ggÚGýô(à t7Z[…¬[£o¦OÙ‘2 ¬ Ð3Ñ£ìh6ÃlÐ5ÒÕè~?EqET$Tt(~PžÎH‰M!xw0…Û ú, ? ÕÉG‡\*'uq*zfz˜z˜bâ¬4p™¸š g¬§¾u¥WdÛ Í–új3k)øª€âÝŸD«qÍý$—´WÓÙ¢2jÞOCAuWë(;\FÞçy8MrRs· °Äiª9ïµÞ䩾¨4‹>GÑÎ"®ˆÿz­ë .§E‹« _«¨©|Š·¹Mé¥mžnl¯þ4…ïlý=,’R -õ-غ÷F˜ž©²F™V嫾XMK} Ži®iFÖ(Ãq‚#Uç«TÆ­'I>¬‚¬¸“q§Ëú×ùÊ êZ𙿿NuS²¦¸ºq®¢¼•qkA?/ÆõvVû­¸¡žº–f"ï•×TOŸ†u݆ÌË,NJäȸgx; õw.òêkÉ®©æÇ¢›lÊÎdš›»š{3Ý=ø¿ô ­Ëp»‚G~d≟ø:÷§Á"­ë «¦š¹œ¡¶Â©Ü§!v½H¯úý: ©­­eüøñªßÌÌÌT Ÿ» 6ŒyóæµyµKPP………¤¦¦âëëûķΞ=Kmm-111TUUÑÐÐ@tt4‰‰‰Ý²ùÙÓÓ?yò$7nÜ`ëÖ­íúknV¾ m``¡ö{mm.2™—¨†uvv&==—^z‰¸¸8²³³155UŽ}ÕÙèèècg7TåßÁA„D"V·þ;»ÁH¥UH¥•ÄÎnVV÷ŒÒ^^óin®§´4þþÙ %%Ç9~|W®|JD„òMäüü|üýýÕúCYY‰ä·Ój NŸ~¸8WÕ³s§ƒÊ¸¥¬å ®»ÏýÆ­VsZ¹]]í®P®®¾‚ŽŽ>NN£Úõ×Ò¢|¹G_ßTóœZ.GOOï±¥¯PÈÑÑÑëœ67×a``©•ßûåãQä¿-îÜQÎÉ,--{”þééúUÛñoÀ€,[¶ŒW^y¥Í8ÚsÜãk||<>>>8::²páB,--µ¾âMSù´<©åÓ&ÿ]QÝQ¾ææf~þùgvîÜÙêŠÏ5kÖ0sæL’““Y·n]«°¹¹¹ddd°gÏ>üðCæÌ™Ó¡<ÖÖÖrñâE>þøc¾øâ ^|ñÅËÿË/¿ÜêêÇþýûóõ×_3yòd¶nÝÊœ9sX±bÛ¶mëÖò tNkÒŸíÉOwp÷E¯Ž’­2øÜE$!‹UƭΖ–†B¡à…^ÀÕÕUõ888fæHe2*¥RNDMâÒÔ™šˆ·…%ãU ûîà¡|œu…ÛÒÖW?¾3h0'ÇO&}Ê ÆO¦º©‰wÒ.h]R¹Œ×SSøçˆ‘ô13”îSÊh§Þ,ñÀë’7yV(¨6®]»†\.'22RÍß'Ÿ|Â{ï½×æ›ÇÛ¶mÃÈȈï¿ÿ±XŒX,&''ç‰(_ss3¾¾¾’——Gff&DGG ékÉ_|B¡ ""‚7Þx…BÁK/½¤¶¸ß¿?éééH¥RÊÊÊØ¾}»Ê¥\47Mpðbc‹3f¯rühi`÷î>H¥ÕLœx’Ù³ ˜5ë£Gï”ß³ÊÉÉ! €;vðú믳jÕ*ÊËËqvv¦®.Ÿo¿õÀËk³gç…B!cß>õ<¼½_`æÌLbbr15í;}¨¬Lgß>? z“Ù³ ˆŽÎÁÜ܃ï¾ëL&EW×áÃ?äÙg/[ÌÌ™ØÚräÈX@iàòôôdݺuTVVR\\Œ¯¯/^^^¿m Ü$.Î 3f\&6¶ˆiÓRèÛ7F-®®˜7O¬öXZzwºýëênòí·}pu̬Yט3§êã›L&áÔ©ùˆD›~kŸïºDþwú÷6’>£¤ä11¹ÄÄäªäK“|tWþ›šš7nŸþ9‰„ãÇ÷ýÓÓõ«¶ãߌ3HKKSòùoÚsÔãkll,b±˜¸¸8ôôô‹Åœ,X°€üü|²²²Édj/Lu†›7oâææ†H$Rõñ””bbb:ÏgŸ}ƱcÇÈÍÍ%77—Ý»wwYÿn¯ÿj«Ÿ:^@àIBç·½Q"“#…ÚèÁ$'ôø2º-p£÷³½Ižõh7F{3ø_ƒ©Í®%ceF«Ç€ÔfÖ’¿5_ûÐ7ÓgÈWChºÝÄ¥å—7ËŸ*²È«?Ñî}™ÿÓ#MÇÙÄ”ÿŒŠäJMË“íqõ¸%d$Wª«øGN¦00݇¹¾»ÂFs[*aÉÙ_h–÷¬þõꫯ2þü67žt¦OOçòåõäæn*C@ÉŽ;HKKcýúõBùùèÒÓÓùè£Úü>Ÿ€€€@G \O OƒK@@@@@@@@@@@@@@@@@@@@@@àé@W¨'Ñ!Q›Wó=,AŸá¹Â³ËóiÜÛÑߨ#ë/`cK<ùø/ , ñãm„®ÁïOuƟĬ>}»,¾ g¥ß .ϧ³‰)'¢&±ahHÔs[BFòꀨcehÈñ¨‰lÂ@÷÷?5Ù¿?kÖ¬V ËXÉŒ—16¶*£ƒLŸžŽ§çü.‹oĈM„…)¿Abié­v-¢­mÐ#/ÏãHßÔÔ'§ˆ'6ÿkÖ¬¡¤¤GGGAàŠ;v°råJ¡|]Jzzz›W åäSàéÀÅÅ…ˆˆ¡"ºµ]$I‰„¬ÕYœâÔˆS­<çnÊå̸3”Ÿ(§hW ! ”Ÿ,×Ú]í…¿úÁUn¾EQ\¹›rÈy?‡‚/ „Vì"ŒŒˆLŽÄ*È óþæ˜÷7ÇÈÑHåîùGOF‰ýX{\çºy.ûÑö]» kS"“#± ¶ÁÂÇ÷݉8Ã3múwšä„Y?3nlêÚ Û±gøîá\|ù"™o?Üc®s]™‰‘ýò;ãûW_"~ âlëAÐ5Ö—Ù.Ø„ØÐ÷•¾Êº ´z$õ÷0ù÷ûÀ!Û†`=Äû1ö„þJŸE}:÷€UÞŒÛsnØÛ``cðÄÈGófÎN;‹øg1£NŽÂÈÞ¨ËäJOG‡FGñꀄÚ;ð'_®L‹Fd¯}ûüïÀ’&LågWžïçEÆ´hÆõÖîû„}Í-TéùYÛ°Ä{—§Îd’‹[›þŸu냗…%ϼܥý+ª· ÆŒçù3 üùÂ9A)?EÔ451îØqnÒ4Mº-m===Y¹r%¬Zµ ±XLxx¸ÊÏÞ½{9zô(ááá,\¸¢¢¢ÞA>{öl|||X»ví#‰ÿq°zõjrrr˜6mK—.¥¬¬¬[?2ü{OßÍÍ   Ο?϶mÛ ÂÖÖVå>zôhš››Ù±cãÇgþüùlÞ¼Y-Žììròd Iù×ÇûI“Náâò žžÏsƒ  U*w‘èLú+®®qr Çßÿ±³(¿¦P(Ð××Wù¿û›±±±VéöcÇ~¿ê±´ôꖲ߹s;Ø»×ç±Ô}w¥ïé9ÀÀ¿<±ùÿÛßþÆøñã)++ëqú§§ë×—_~™Å‹Á[o½…X,&88¸ËÆÏG=¾¶—mëwãÆ$%%±lÙ2ÂÃñ³³S¹¹»»³eËJJJ(--m3í…ï,šÒß¶mGŽ!44”)S¦™™Ék¯½ÖÊßÒ¥KIOOG,ãìì¬uxgggÄb1!!!øûûãïï‹K×ýAù:t¨Úlj'Tc–6íó ¼½½UòÈŠ+¸uë3gÎì¶òiÊgôCw–O ãí¯~}œØØØ¨úü±cÇøä“OTÿýnê~Þ¼yüå/7Ò4¾h¢³ú³»ô¯€@W¡ÿ?ƽ•쎹ü'õËúÜz ÿSHÈÞ®}t ³þfø¼ãCö_³±m¯Ñ]šÂëèëÐr§…–ÚttuH]œŠûóîôŠè%´baâjBKm Ò[R¤b) ¹Båfæi†Û7ÎEŸÃûuoê¯Ö“½6ŸÕ>Z1Û‹ÿ~tôuð_ïµ鯦#k©ÜòhªlÂÐÎY£ i©´Ux]C]¼ßð&ëÿ²ÔÒð[燡!yŸç!—È1ícJÕ…*¤eR­ò¯k¨ËÀwriù%$¥’ׯ®¡.Ãw çÚúk¤ý!½ê'T$¥JsÙÑ26´ _W¤¬= ¬ 5Êh®iîòú{Øü›yšQ•\Euj5:º:¸Ä¸ g¦§uüC¿Š®¡.úæú¸¿àŽøg15kž8ù¸uà&Î&ø¾ëKÚÒ´.é{2…‚gOSýþv1}úbc¨ÝäÍÛÂ’E^ý™xâ'ÞDvM «.žçýÁÃ8^Z¬®ôuuùt¸[CCÿšH}K‹ÊíF]-·¥R쌌hµPÒØÐ*-#]=ÞÄR)îÕß߇…`ol̦ìLe2ú™[p®BÌ­ÆF­Ê`¤«Ç†¡Á¼|öŠ…ü”òýÍ|\MMùhh0/œ9Õ-iÊd2ÂÂÂTÿÿúë¯,X°@µAäååEXX!!!äååqúôi ï¾û.‡V—c##>úè#^yåd2Y—Çÿ8ðññáÕW_%$$„?ü+W®°bÅ 6mÚÄ¡C‡„ôµ °°ÂÂBêêê‹Å¤¥¥©m.ÅÇÇ3jÔ(Μ9£ú}ûvå÷Œtu ±´ì‡QQ8zt<••êc¿ÿkøû¿FNÎܺu]]}tu (,TæoÙ²e¼÷Þ{àîîΉ':t(™™Êu¶amíGZÚZŒí31âSRR^§®®]]=ärbq†††ôïßkkk>|8çÏŸï1ú§§ëW€ýë_Êù©¾>vvv444P]]Ý%ãgwŒ¯íå_›ú=vìÆÆÆXZZ²|ùröíÛÇÙ³gÕÆeË–ñÝwßµùMá;‹¦ô}||8}ú4IIIèêê²hÑ"ÌÍÍÕæE§Nâ/ù Ó§Oçܹs ïááAMM ÅÅÅ”––ªæV]…¦ü]¸pAõ÷Ž;¨­­%66Vëú¹‹ÿþ÷¿±³³cÖ¬YÔÕÕ©Ü®_¿Nyy9öööÔ××SXXØmåk/ÿÑ«|ßþšôkwžžÎúõëUsÞM›6affÆ¢E‹¨ªª¢ªªJ¹W\_OEEêó¼mÛ¶áççÇÚµk±··gõêÕ¬[·ŽÏ?WÎ_g̘Á§Ÿ~Ê믿NAAzzzÈd2’’’´rÿòË/éׯï¿ÿ¾jìHHHàÍ7ßTåÿرcüðÃøùù±fÍ–,YÂT}ÈÞÞccc||”ó'©TJ^^^§Çmè¬þ|ÔúW@ «ÑWß9~°Ç¦Ê& {âû®/º†ºÔ\¬AÖ C.•kt×5jÿÊ!Má½ÿì­TÄ 2’ç$ã±Øƒ›nPº¿¿ü4Æ/ ™êÔj~û :ú:؆ÚâûW_n~s“›_ßÄÐÖPÙNMd­ÊBÞ$Çj°z¦zèé"—Ê;ÿ]r‰œ^£{QsIÝâ½Ò›êóÕTœªPû½øÛbü7ø3à­”ì/¡t_i›i<óæèèëP“^Óáº5ìeHðî`RbS–K1qkãt‚B‹k¦ILœMÐÑ×Á2À’†ü†.­¿‡ÍÿÍ7ð\î‰ëWlGÚbîcNÁ6íNX;cácArL2 Êò¸¿àÎðo‡snƹ'N>ª/Tã¶Àí‘ôÃÅ^xÑË›¹‰')¨¯Ó*Œ‘ò-÷r‰„•’‘Êä ³ë…™¾>ÆzzH~›Œüy`+|ý˜xü'êZZGûšY`ch„µ!™Œ¨Þ.¤UÞVóóV@ çÊË9q«Dí÷y¹lå¯CØSÇ·ùym¦ñ |­¬Ñ×Õ%õ¿ÒxúH®(g‘׀ǒöÿøG–-[ÆÄ‰¹qã†jaË‘#G°±±àÎ;”—·~¹cݺu$&&räÈ‘GÿãÀÞ^ù’RYYK—.E*•"‰077ÇØØ‰D"¤ß <=•Wå^¼x±Mw¹¼‰êêlŒŒlÛt·± `Р79t(Œššœ6ýlÙ²…ü‘k×®Q^^Ž¥¥%ÍÍJýìê:W× ÄŹ¢P(çrÕÕWˆŠ:H^Þ¤ÒJ*+/QV–HYY"åå)DE  à{LLil¼¥–^cc ÀÄDy]Ü©S œÇ2pàrÌÍÝHH˜Kuu¶ÆúqwŸ†»ûTäò&ÂÿRýÞ¿ÿ"ÒÒÖÒÒRÿÛæš66þ*÷ººš›kUÿ—•%QZš@iiææ}ñô|N+—«ëDEìÚ墚¨ÙÛ‹000ëP;§¤¤O||<}ûöeáÂ…Z¸º*ýÛ·ÓTígnîN¿~sµ6pUWg#‘”#“IØf’{û.É¿\.åÆ]­×MMdddЫW¯©zº~¿‹……^^^¸»»£¯¯ÏСC¹zõj§ÇÏî_”Mõëàà@`` ¡¡¡\¿~€åË—sæÌ†®\*íèGwá;K{é¬]»–Õ«W³dÉÆG`` 7nÀÑÑ‘ÄÄDÂÃùuë}ûöíPx€¤¤$¼½½100`ìØ±lÞ¼™Í›7óé§ŸvºlÚäï.kÖ¬ÁÁÁ¨¨¨ÕÏݰo¿ý6ÁÁÁÔÖÖ¶9°µµÅÆÆ†ÆÆF&OžLJJJ·”¯½ük«WùºN¾ÛÒ¯O:&L`„ ¸ºº"—+ç¯W®\áàÁƒìÙ³‡ÊJåüU*•²k×®Æó ÷iÓ¦1uêTšššøê«{óÏE‹±víZêë•óÏ´´4ILLÄÝݹsçª \ÙÙÙ”——#‘HÈÎÎ~¨rj3>>ˆÎêÏG©Z[…¬[£o¦OÙ‘2 ¬ Ð3Ñ£ìh6ÃlÐ5ÒÕè~?EqET$Tt(~PžÎH‰M!xw0…Û ú, ? ÕÉ®AÑ¢àö/·)ý¡Tuú®úb5-õ-8Nt¤¹¦Y£ Ç ŽT¯jeÜru¥Wd¯Å—ÜOrI{5}!*£æý44PwµŽ²Ãeä}ž‡Ó$'5wËKœ¦:‘ó^ëMžê‹JÛ¹èsí,bàºø¯÷׺^êrêP´(° ²êpÊ¥rR§¢g¦‡©‡)&ÎJ‘‰« zÆÚŸrj©o¡6³–‚¯ (Þ]ŒK´K—ÖßÃæßÔÃÿõþ¤¾”JÑî".-¿DÎÚü>ðk½YÓ†|HJ%´Ô·`7êÞCz¦zÈeO¤|XYq'ãN—ö;?kR§LçRu%aG>иµ Ÿãz;«ýv¾²‚º–f¦¹¹SÝÔD£¬…)®nœ«(W·6d^fqR"GÆ=ÃÛ­¿s‘W_KvM5?ÝdSv&ÓÜÜÕ܃lì˜éîÁÿ¥_höüí Fù‘‰'~âëÜkü}XŸ‹´.VM5-r9Cm…S¹O;Cìz‘^Õ½†Î   IMMÅ××·Õâ.>>Y¸p!–––­®à6lóæÍkójž®ˆÿqqöìYjkk‰‰‰¡ªªŠ††¢££ILLì–ÍÏžžþÉ“'¹qã[·nm×_s³rL00°Pû½¶6™L‚‹KÔÃ:;;“žžÎK/½D\\ÙÙÙ˜šš*Ǿêlttô±³ªòïà B"«Œ[ÿÝ`¤Ò*¤ÒJ bg7+«{Fi/¯ù47×SZÿì’’ã?>+W>%"Bù¦x~~>þþþjý¥¬¬ ‰DòÛi5§O¿@\œ«êÙ¹ÓAeÜRÖò×Ýç~ãV«9\Š®®vW WW_AGG'§QíÏÏZ”/çèë›jžSÉåèéé=¶ô 9::z’Óææ: ,µò{¿|<Šü·Å;Ê9™¥¥eÒ?=]¿ÞÓcµ\¼x‘?þ˜/¾ø‚_|±ËÆÏî_”Mõ[XXHmm-ãÇWÅeff¦Ú8ÕDgÃw–þýûóõ×_3yòd¶nÝÊœ9sX±bÛ¶mSmOž< ¼½½éÓGyu½‡‡&&&ëë f~þùgvîÜÙeWhjÊß] À²eËxå•W*5kÖ0sæL’““Y·n]+÷ÜÜ\222سg~ø!sæÌéÖòuV?<®ò t¾ý5é×îàî‹^%;;[eð¹‹H$B,«Œ[!-- …BÁ /¼€«««êqppx Žmk~WWWש¹I{ãã]^~ùåv¯ÞÕ¤?;^@àIAÍòtëà-‚¸´â ¹‚„àÎ?§¼æAG_‡ÐŸB©Íª%12‘¤g’0ïoNà–@­ÜU ˜ÚŠ÷Súƒú¿šÂW$T½6›?Œ@ÏT¯?{‘¹*“;éwp‰îí ¼5€Ðá„ÿNðž`šï4“ºHy…ˆ¢EAÒ3IXøZ–FèO¡Ô]­#}YºZúú¸Ä¸ÐûÙÞŠÿ~ê¯×sæ™346žމ›‰ò”`U¢""~`Ä#0ó4ãìtõ+|Þñ!oKžêD Ú$üþˆ‰ˆHŠ@tXDsM39ks´®y“œÌw2 ØÐö ¬öîµ-4ä7¨žÆåµmEÈ$J„Ó'"“#ôÉ ttuˆLŽdØŽaÊþ¡«ÃÀ÷úS¨²ü?Œ ¹ªëëïaóßßÀ…ç/à¿ÞŸð_ÂùóHìÇØ“<+Y;ùPÀ¯“~ÅÌËŒ°„0Fr8?ïü'½Â{áþ¢;YïduiÿûdøŒtõøwh8W¦EseZ4g&LUóca`À¼¾žD»«¿Õ"—vô ­¬I™ô,‰ÏL!»¦†EI­¯ºz§Fe@»0y:}ÌÌ‘ÊdTJ¥œˆšÄ¥©395o KÆ;ªöÝÁCù8ë ·¥­¯~|gÐ`NŽŸLú”$ŒŸLuSï¤]Ð~.—ñzj ÿ1’>fæ‚B~JíÔ›%ÞxýBr·¦»mÛ6ŒŒŒøþûï‹ÅˆÅbrrîõÿ­[·’™™ÉöíÛijjÂÑѱÕ@Ÿ|ò ï½÷^›o†wEü‹ææf|}} $//ÌÌL222ˆŽŽÒ×’/¾ø…BADDo¼ñ …‚—^zImq¿ÿ~ÒÓÓ‘J¥”••±}ûv•J¹hn">>šàà ÄÆ1fÌ^¥þoi`÷î>H¥ÕLœx’Ù³ ˜5ë£Gï”ß³ÊÉÉ! €;vðú믳jÕ*ÊËËqvv¦®.Ÿo¿õÀËk³gç…B!cß>õ<¼½_`æÌLbbr15í;}¨¬Lgß>? z“Ù³ ˆŽÎÁÜ܃ï¾ëL&EW×áÃ?äÙg/[ÌÌ™ØÚräÈX@iàòôôdݺuTVVR\\Œ¯¯/^^^¿m Ü$.Î 3f\&6¶ˆiÓRèÛ7F-®®˜7O¬öXZzwºýëênòí·}pu̬Yט3§êã›L&áÔ©ùˆD›~kŸïºDþwú÷6’>£¤ä11¹ÄÄäªäK“|tWþ›šš7nŸþ9‰„ãÇ÷ýÓÓõ«žžžjü+))áÂ… TTT¨m´uvü|”㫦ükª_…BA@@€jcùÚµkÈår"##UiÄÆÆ"‹‰‹‹COO±XÌÉ“'µßYÚKÿêÕ«Œ7Žo¾ù†¢¢"²³³™:u*"‘ò·êêj®]»¦z Tz¿±±QcxP~_ïòåË‘””DUUU—}CMSþî2cÆ ÒÒÒT§ä´­ŸûÉÊÊRµÓÍ›7éׯTTTpñâEJJJHMMÅÇÇGmÃþQ—¯½üwD?<Žò t¾ý5é×î`Ĉäç瓟ŸÏ°aÃÔ®müü|<<ûŒcÇŽ‘››Knn.»wïî²ñÀÊÊŠÅ‹3þüVqh£?;^@àIB‡ßLŽj£“œÐãËè¶ÀÞÏöneTéjŒ{3ø_ƒ©Í®%ceF«Ç€ÔfÖ’¿5_ûÐ7ÓgÈWChºÝÄ¥å—7ËŸ*²È«?Ñî}™ÿÓ#MÇÙÄ”ÿŒŠäJMË“íqõ¸%d$Wª«øGN¦00݇¹¾»ÂFs[*aÉÙ_h–ÿ¾ú׫¯¾ÊüùóÕ6ez Ó§§sùòzrs· •! ȇ@dÇŽ¤¥¥±~ýz¡|‚| tééé|ôÑGí~¿N@@@@[×SÂÓ`àx:Ъ@àIAtHÔæÕ†KÐgAx®ðìò|÷6Ft@ÄÀ÷öÈvØ€ÇA>þ KFü8‚A›¡kðûSñã'1«Oß.‹ïß#ÃYé7¨Ëóélbʉ¨IlÒ#û×–‘¼: gêŽÎ`ehÈñ¨‰lÂ@÷÷?5Ù¿?kÖ¬V ëÆæ€•̘qcc{¡2:ÈôééxzÎï²øFŒØDX˜ò1––Þj×"ÚÚ=òò<ŽôMM]prŠxbó¿fÍJJJptt^à¡Ø±c+W®Ê'Ð¥¤§§·yõ—P>A>Ÿv¼½½U×"ŠÅb‚‚ÚÿW®\ÉåË—±··(ùsqq!""âw[OÉ¿°þxÚQÛE’”HÈZÅ)Ñ)N8ÕÊsî¦\ÎŒ;Cù‰rŠv‘’@ùÉr­Ý5Ñ^ø«\åÖá[Å‘»)€œ÷s(ø²@hÅn@GW‡áqÃñXâMˆ ý^íGdr$6Á6*?žôdäñ‘صÇu®+‘ç"±}o ²ô·T{}2ˆaÿ†ŽžŽæ…µ‡©*=  Ü_t'âlÏ8´éßi’fý̸±©k?”i?ƞệsñå‹d¾ýpWŒ¹ÎuEtHDdr$FFZ‡ÓT¿#dø®á€ò:½°Óan |¨ú{òaìlŒï_}‰ø5‚ˆ³›„t‡|4ßiæì´³ˆ3êä(Œìº¼ŸýAC98fxYXò÷ÌË]Zþ¨Þ.3žçÏ$ðç çÅûQÓÔĸcG8\\ĹIÓp46éÒøÝÝÝÙ²e %%%”––¶égãÆ$%%±lÙ2ÂÃñ³³ëû]fÏžk×®Uý¶wï^Ž=Jxx8 .¤¨¨Hu‡¹žž‰‰‰¬\¹’ˆˆV­Z…X,&<<ü‰iŸÕ«W“““ôiÓXºt)eeeÝú‘áß{únnnqþüy¶mÛFPP¶¶¶*÷Ñ£GÓÜÜÌŽ;?~<óçÏgóæÍjqdgÿ““'cHÊŸ¸þ;nÜLšt —gðô|Ž˜˜­R¹‹Dÿ`êÔ_quˆ“S8þþÿ‹Ý@ù0…B¾¾¾ÊÿÝߌµJôŠÿaÖÇë±÷òT=6n®ÝRö;w®±s§{÷ú<–ºï®ô==çø—'6ÿûÛß?~íŠõmOŸ t=j.ãÞÊ æ€¿´òXŸ[Oá òÕJ÷—"­âóŽÙÍÖÊ]šÂëèëÐr§…–ÚttuH]œŠÝH;ú,î#´b7 +H‰M!k>UçªÈßšOóf ¬ 0ó4Ãm© Sé=½7F½ŒÈ^›Ïê{ÖŒ;ª§Ïâ>´Ô·p~Áy2…ZZ:ú:l `ÈWCÐ3ÕSskÈo îzõ×ê‘5Ê–J[ µ¡.Þox“ó^ ù½¸ýÖù1ø_ƒ±j¥Ÿ%N“œ0rÔÞ€ k¨ËÀw’ñZ’RIÇ;›¡.!{ChÈk íi «©~M\Mh©m¡"¡çhg<ÿäÉõ ×1ó6ëpý=.ù”* ì—_kßhò¸åãÖ[þ§ßw}»´}>†@[, xÉ{£œ©miÖ*l_s FôràÔ~-³+?—2ÒyÃ?°•_}]]¶„Œ$.l4f÷-ŽnÔÕ’s§†œ;54ÈZ(ilhÞHWw±:-™â^ýý}XÿAp/{llyÖ­N&Ú)ŒtõØ04˜eçÎPÜÐ (ݧ”ïoæóÕõ«|44¸Kã-,,dÙ²e|ËïØ±c 6 KKK–/_΄ ¨­­ÕÚ]%ÇFF|ôÑGüéOB&“àååEXX¯¼ò §OŸæ«¯¾bÕªU¼ûî»Èd2ÂÂÂX¿~=§Nâ£>¢ªªªÛ˜šðññáÕW_e„ ÌŸ?'''V¬XÁ¦M›„ô; iiiÔÕÕ!‹IKK£²²RµøŒ'22’çž{ŽŸþ™íÛ·ó?ÿó?Ê1K×kk¬­ý˜4ét›'\üý_#6¶ˆÁƒ×л÷\\Æãævo¸lÙ2ªªªpuu%44”ÆÆF¼w’4,lS§žÃÍm ÞÞ ™=;Ÿ¥*÷éÓÓ>ü#Ã8ðˆ-¢ÿÅôïÿææ}8|8‚ââŸÈÍÝÁ¡Ca ¸\eÄ24´¤®î&¥¥ñܺušŒŒ¿qûvªÖõ7jÔ—Lœxgç(œÇ1uêY† û@Í´¾žò빪§ª°HÍÝÑ1”Þ½#ñõ]ÆÜ¹¥¸ºNÔ:ý1cö2eÊ/¸»OÅÓsNNa’¡¢¢">ÿüsÆŒ£Ò ³fÍê¶ô§OO'8xŽŽaøøü¹soáî>UëðÖÖ>Û£§gü›,ú`aÑW+ùèŠü÷é3ƒ9s é×o.¡89…áàú›lâïïO`` —/_fذa=Jÿôýªiüõð𠦦†ââb²²²ÈÈÈ ¸¸X«ñàÂ… ªçµ×^£¶¶–±cÇÒÒÒÒ¡ñûa122âìÙ³\½z•éÓ§·YÇééé$%%qøða²³³177×:ÿOsùºjümOþÚ+Ÿ6ò§)þ»°cÇŽ=ªV?ׯ_'33“+W®P__Oaaa—µŸ&ùh¯ÿiãþ¸Ë'Ð>ÿú׿øòË/9sæ ÙÙÙ444P]]ÝáõÍãÀÐÐüüü8}úôOxÍ;—É“'óüóÏ“››«vÐÇÇ{{{ŒñññÁÇLJ¾}ïÍ_¶mÛÆ¹sç˜2e .$??Ÿ¥KïÍg̘Aaa!sçÎ%44”°°0BCCµvÿòË/9yò$QQQŒ7޳gÏòÁ÷æ¯ééélذ°°0þð‡?pëÖ-¦NªuþÛ[vD?µEg×§ ßÓç_õÝÍvÒ4U6)M/C|ßõE×P—š‹5ÈdÈ¥rîºFí_9¤)¼÷Ÿ½•¥AFòœd<{pcÓ J÷—â÷ŸÆøº÷çÝq{Ni¬h,lT¶›­¡²+šÈZ•…¼IŽÕ`+ôLõÐ5ÒE.•«Â{.÷ÄÐÎ Ï_h·ç Oú-ëǹ™çh©oiånÚÇkô­ô‘KäôÝ‹šK5j~¼WzS}¾šŠSj¿[Œÿ¼5€’ý%”î+m3a>À}jÒk:>@÷2$xw0)±)HË¥˜¸uìt‚¦ú5q7AÞ('ïó|¸F÷ûY·n‰‰‰9rDmaË‘#G°±Qžj½sçN›o"þñdÙ²eLœ8‘7n<íq÷J²²2–.]ŠT*E$annޱ±1‰DH¿xz*¯Ê½xñb›îryÕÕÙÙ¶éncÀ AorèP559múÙ²e ?þø#×®]£¼¼KKKš›•úÙÕu®®ˆ‹sE¡PÎÕª«¯u¼¼=H¥JC\eå%ÊÊ)+K¤¼<…¨¨|‰‰#·ÔÒkl,˜˜(¯‹;uj ƒ³óX\޹¹ s©®Öüœ»û4Üݧ"—7þ•ê÷þý‘–¶–––zåâÞÌ {¯{××”–ÒTïe‰²²$JK(-MÀܼ/žžÏQTtDóøì:GG»v¹pw¢bo/ÂÀÀ¬C휒’B||<ñññôíÛ—… òÝwßu[ú·o§©ÚÏÜÜ~ýæróæ­ÂVWg#‘”#“IØf’{û.É¿\.åÆ]­×MMdddЫW¯©z‚~ooüHJJÂÛÛÆŽËæÍ›Ù¼y3Ÿ~úi‡ÆÏ5kÖààà@TT”Öã{gqtt$11‘ððpnÝºÕæÆãÚµkY½z5K–,aܸq²qãF­òÿ´—¯+ä³=ùÓT>mäO“|ß-ÛÛo¿Mppp›ÆOOOlmm±±±¡±±‘É“'“’’Òù5¹òÑ^ÿÓÆýq–O@;,,,ðòòÂÝÝ}}}†ÊÕ«W¹þè,MMMdgg«ÝxлvíâСCdffrøða¾úê+***ÈÎΦ¼¼‰DBv¶úüe„ L˜0WWWäråü÷Ê•+ýqq®ªgçN•q ZŸàºß¸ÕjN&—¢«k UûTW_AGG'§QíúkiQ¦§¯oªyN(—£§§÷ØÒW(äèèèuHN››ë00°ÔÊïýòñ(òßwî(çd–––=Jÿôtýª.cÍüüóÏìܹSí "Mã'À€X¶l¯¼òJ‡Æ÷Î"•J™ïø·%Ou"ð~ú¿ÑÑ!Iˆ‹h®i&gmŽÖå—7ÉÉ|'“€>ÕRÛBC~ƒêi,Q‹U†)} }\b\èýloõÍ õkhkØÊP¤)P´(0´3Ôºþ§|8Mq"29’AŸ BGW‡ÈäH†íöÄÉG¯ð^¸¿èþ@#íà":LK+’'=ËÙ‰ÓP `FÂq5ÌëëI´{ë7(ÿ6,„Äg¦°%$”&¹ÿ÷rávE+WïÔvô õu\˜<>fæHe2*¥RNDMâÒÔ™šˆ·…%㩟{wðP>κÂmië«ß4˜“ã'“>e ã'SÝÔÄ;i´_dÊe¼žšÂ?GŒ¤™¹ pŸRF;õf‰÷^¿Ü¥ñÆÆÆ"‹‰‹‹COO±XÌÉ“'ÛìU šx_»v ¹\Ndd¤Vîwùä“Oxï½÷Ú|³|ëÖ­dff²}ûvšššpttäìÙ{úiÛ¶mñý÷ß«>¶œ““óD´Iss3¾¾¾’——Gff&DGG ékÉ_|B¡ ""‚7Þx…BÁK/½¤r÷ôôdÿþý¤§§#•J)++cûöíj‹}¹¼‰øøh‚ƒ7[Ę1{•ó‹–vïîƒTZÍĉ'™=»€Y³®1zôn@ù=«œœرc¯¿þ:«V­¢¼¼gggêêòùö[¼¼0{v>ÑÑY(2öíSÁÃÛûfÎÌ$&&SÓÞìÛ§¼â°²2}ûü4èMfÏ. ::ss¾û®?2™]]C†ÿgŸ½@ll13gf`kÈ‘#c¥ËÓÓ“uëÖQYYIqq1¾¾¾xyyý¶°¿I\œ"f̸LllÓ¦¥Ð·oŒZþ¾ÉdNšH´é·öù®Käïq§o#è3JJŽ“KLL®J¾4ÉGwå¿©©‰qãÆñùçŸ#‘H8~üxÐ?=A¿¶7þ‚òûi—/_¦¨¨ˆ¤¤$ªªªÔ6º4Ÿ ¼&*--Mu A5¿Örü~Xª««¹víšê)((P鵯ÆF®^½Ê¸qãøæ›o(**";;›©S§"‰´ÊÿÓ^¾®ÏöäOSù´‘?Mò}—¬¬,U;ݼy“~ýúÑØØHEE/^¤¤¤„ÔÔT|||Ô6Ü;µ¾ÔB>4õ?Mî³|í£§§§’ß’’.\¸@EE…ªýµþЉDÂüùóÙ´iEEE­N·755͆ (**bïÞ½*·_~ù…7ÞxƒââbÒÒÒ¨­­U{a à³Ï>ãØ±cäææ’››ËîÝ»UýÜÃà ŸŸOVV2™¬Uø‡åæÍ›¸¹¹!‰T}(%%…˜˜˜Åó ük³þÔF?YYY±xñâ6¯1Ôf}ú¨Â÷ôù—À£Aç·½U"“#…ÚèÁ$'ôø2º-p£÷³½Iž•üHÓ1îmÌà ¦6»–Œ•=®6P›YKþÖ|A>îCßLŸ!_ ¡év—–_BÞ,ªtÈ"¯þD»÷erüO4gSþ3*’+5U,OþµÇÕã–‘\©®â9™ÂÀtæúì Ím©„%g¡Yþûê_¯¾ú*óçÏoµ©# И>=˗ד›»]¨ A>z$;vì --õë× åäS@@X üÎ \O OƒK@@@@@@@@@@@@@@@@@@@@@@àé@W¨'Ñ!Q««ù:CÐgAx®ðìò|÷6Ft@ÄÀ÷öÈvØ€ÇA>þ KFü8‚A›¡kðûSñã'1«Oß.‹ïß#ÃYé7¨Ëóélbʉ¨IlÒ#û×–‘¼: gêŽÎ`ehÈñ¨‰lÂ@÷÷?5Ù¿?kÖ¬V ëÆæ€•̘qcc{¡2:ÈôééxzÎï²øFŒØDX˜ò3––ÞÌ›'V=¶¶A¼<#}SSœœ"ºfþðï«® êªü ýC ³ìرƒ•+W åèRÒÓÓÛ¼ºK(Ÿ ŸO;ÞÞÞªkëÄb1AAmÿ+W®äòåËØÛÛ?”ü¹¸¸ñ»­§Žä_X <í¨í"IJ$d­Îâ”è§Fœjå9wS.gÆ¡üD9E»ŠHI üd¹Öîšh/üÕ®rëð-ŠâŠÈÝ” @Îû9|Y ´b7ã:×Ñ!‘É‘9©¹ X5€à=Á¸=ç†M° 6 ÿÀ…µ‡)‘É‘ØÛ`ácû‹îDœÀá‡6ý;Mr¬Ÿ76ÝèÒ²Û±gøîá\|ù"™ow슱À2dÛl‚mp™åBø™pzEöÒ:¼ß~ Ù6ë!ÖØ±'ô§Pú,ê£ry|$Ãw ”×é…#pSàCÕßÃ`ä`Ddr$VAV˜÷7Ǽ¿9FŽ“mäçqÉGófÎN;‹øg1£NŽÂÈÞ¨cýÆÔŒ† çÒÔ™\š:óþžïçEüøI\™£‰ößz[ÐÏ‹y}= µw`…¯W¦E3ØÖN«°}Í-¸2-‘½~Ö6,ñÀå©3™äÒö÷Kžu냗…%ϼܥý+ª· ÆŒçù3 üùÂ9AÙ>EÔ451îØqnÒ4Mº4~gggÄb1!!!øûûãïï‹Ë½ïw:T퉋‹ãĉèëë°wï^Ž=Jxx8 .¤¨¨¨ÍoÌž=Ö®]«úmÛ¶mÿ?{gå‘ýýt³ï"‹ì (n (‹kÜ *Ñè$Ñ$fÈŒNòŽfӟ昌Yœ˜DÇ,F3™¸`LÌb¢I4Š¢DE¡hEÖ¦éî÷Ž­–nµ¿ç<ç@ßZnÝ{«êVݧêaÿþý„……1}út²²²T$''³lÙ2"##Y±bb±˜ˆˆˆ^£ŸU«V‘““CLL ‹/¦¬¬¬Íëêo®®®qúôi¶nÝJPP}úôQÑÇŽ‹T*eûöíLš4‰ùóç³qãFµ2D¢8|8ަ¦ò^×'Løž©Sàìüžžw™  *zh舎þ—)8:Fàïÿÿ°µ(¿¦P(T}íöߌµªĈ·?þ[llüU¥¥×]iû¹ìØaÏ7ßøÜÙß­ú==çøJ¯å¿'ûǽî÷ñÕÍÍM›6qíÚ5JJJ:M×4ÿjÃÿúõëIII!!!ˆˆlmm»­}Ï>û,‹-"22’W_}±XLpp°Öþ‡¦öuD¿þCWõÓ•üÝÑ>MõkÒŸ&º¦ò;ÂÍ þˆˆYºt)¥¥¥Ìš5ë®é¯#ÿ´«ãÃÝhŸÚañâÅddd ‹qrrêëÜÜ\ìííññéxþÿ裈‹‹kóSÚ`Þ¼y¼òÊ+÷­î´å¿­õgWƧ®ÚGwØ×ƒîéÐýÞþq?c|_÷Åa²ç_P߸¬Ï«§ðËBB¾ !÷\Ìšá³ÒÑë"ìÆÚi¤k‚¦üzB=Zn´ÐRÛ‚ž¾i‹Òpû‹}#ûê´x— o¨ÏÈ#É}7—ôçÒ ùFý„Åðÿ GßP¡¹·'Üÿ*¦ælÖùoBO¨‡ÿ»þXñ|²™ŠÖPÐ@se3†¶†ÈeHJ$mòéý’7Ùÿ—B®Pýî·ÖC[Cò?ÉGÞ$ÇÔÝ”ª3UHÊ$Z·ðƒ9·äM%M’©»)6#m8{’ÆÂFªNU¡P(ðzÁ‹Š¤ ­Ê0ó4£êTÕiÕèéëáçŒÀL€‰‹ -µ-T$Uàë„…¯—Ö]¢‚ú‰mäw§¸Éƒ¤T‚D,Q“½6ö¡‰Þ[ì£to)&N&ø¾áKúât­åSÜPÏËi©üXt•M!£[Ñô|;vožOçÉãGÙ?þ‘NÉÿËËÊ3 ôô°64¢QÖB´¹õ ¯¯Ï‡#CéchȢߓ©oiQÑ.×Õr]"ÁÖȈY ×Úäså ^:“ŠLqK~ïÁÎØ˜ ¢,e2˜[p²BLéiÖ#}ë†óì‰c74è܇ß^-ÀÅÔ”w†óÄñ#ÝV®‡‡555SRR‚L&S£Ÿ9sFõ÷öíÛ©­­%>>///ÂÃà !??Ÿ£G¢P(xã7Ø·oŸºñÎ;ïð׿þU­Ž=JJJ úúú,\¸sssd2áá᪴¿ÿþ; ,èÖ ¸®ÀÇLJ矞Þ~ûm.\¸ÀÒ¥KÙ°a?ýô“®~-PXXHaa!uuuˆÅbÒÓÓÕŸ‡b̘1?~\õû¶mÊïéëbi9+&NÜËÏ?O¢²R}îñ÷ÿÉÉùŒÒÒ£èë Ñ×7 °PÉ_BBo¾ù&¸¹¹ñÛo¿1|øp²²”/ꄇoÅÚÚôô5Û1tè*Î[‹Hô  <U\ü W¯îÅÖ6!C^&-m/naàÀ§17wç»ïn½y[R’ÄŒg),ÜÇõëiZRWw•’’CÈdJKvJcÆlÁÂbÿ þ%%Iœ>ý²*TZKUUûßEup£¡¡këÁ­$9y!EEûµªܸo05uàܹ·10°ÀÑ1œë×Ӵ濨¨ˆŸ~ú‰]»vȺuë˜3gN«©÷Tý3fdpíÚ®\ù?†]ÍñãÏpõê^­ò[[û`ll‡@`ŒµµÏã–„ÚÚ|öpðàAœœœø¿ÿû?,--?~<'Ojÿ‹»ûLFúÔÔåÔÕ]A__€\.C,NѪÜÏãσ0¾’À×_ÍöíÛ;E×4ÿjÃÿ066ÆÒÒ’%K–°gÏNœ8Ñm2üôÓO•þµPˆ­­- TWWkåhjŸ&úÝ𺢟®æïŽöi²?MúÓD×TþMðßÿþ[[[fÏžM]]ŠvéÒ%ÊËëêþp IDAT˱³³£¾¾žÂ»¢?MþigƇ{Õ>4¬¯Œ8r䯼ò 3fÌP›{{ûúÃÐÐ`eeÅÞ½{™4i’šÿ|sçÎ¥ªª [[[V­ZÅǬú–›vvv«i‰„ü|¥ÿ²uëVüüüX³f vvv¬ZµŠµk×òÉ'JÿwæÌ™|øá‡,_¾œ+W® Éd¤¤¤hEß²e  à_ÿú—jlKJJâå—•þkFFàûï¿ÇÏÏÕ«WóÌ3ϰwï^­ø×´þÔv|j ]µ®æÐý/zBõãö6W*7J ûâû†/ú†úÔœ­AÖ C.‘k¤ëu|å¦üÞÿôVv”§æœÂc‘—7\¦ä»üÞòÓX¾]œ`ú¼+˜ÔøT$åL\Õß®7v2ÆÂÇ‚Sq§h¸¢Üœv{‘_ääÌ“óß„çRO$ à䬓´Ô·´¢›º›b`m€ÐJˆ¼INß±}©9§ñ^æMõéj*ލŽŠ¿*Æ?ƒ^ĵï®Q²§¤Í:Úƒù sô„zÔdÔtZ~ W8·ôö ÃÀJy*©¥®Ee÷ÚàòÆËx.ñÄeŽ }F÷ÁÜÇœ+[•'MÜL7ÊÉÿ$ŸoC¨Ï­§üP9ƒV Bh.ì”üîÕiÕ =¡}Âúàûº/Wÿw•«_\Õhšè½Í>ªÏTãºÀµSòQt@³36懱yôðÄMM¸™™ß‘Ì…x˜›ãbj†POŸ@[.×ÖªèÿÀR_?¦ü…ºi«üýÍ,°14ÂÚÀ&™Œ‰ýœI¯¼®–æÕ€@N–—ó[é5µßwäç±18Œ×‡±ûJ>_ä·YG{ðµ²F¨¯OÚŸêÓááéŠrz êÖ2SRRðööÆÀÀ€ñãdzqãF6nÜȇ~¨–nõêÕØÛÛ3qâDµ…y||<û÷ïÇÆÆ€7n´ù&áÚµkINNfÿ~õó5kÖ°jÕ*žyæ&L˜@`` ëׯo•ÿïÿ; L™2…Ë—/÷ }ܼ¤¬¬ŒÅ‹#‘H ÅÜÜcccššštõwžžÊ«rÏž=Û&].o¦ºZ„‘QŸ6é66 ò2?ýNMMN›i6mÚÄ?ü@nn.åååXZZ"•*Çg—ɸ¸L&1Ñ…B®œãª/0qâäçïF"© ²òeeÉ”•%S^žÊĉ{¹rå[LLhl,U«¯±± P`bâÀ‘# =œœÆ3xðÌÍ]IJšKuµH£|ÜÜbps‹F.o&"âsÕï.$=} --õl®Y`c㯢×Õ]A*½5ÿ••¥PR’DIIææýñô|\«—‹ËBÙ¹ÓY5“ÛÙ…b``Ö)=§¦¦rèÐ!:Dÿþýyê©§´ puWýׯ§«ôgnîÆ€sµpUW‹hj*G&kjWgíÙÇ”)DFFbhhˆâ—b"""T¨ÚB.—pùòÎN÷û}üyÆw…BqÇtMó¯&þííí $,,ŒK—”/‚-Y²„ãÇ3räÈn“£……^^^¸¹¹! >|8/^Ôèhj_güžòº¢ŸîÈßÕöi²?MúÓDצüÕ«WóÚk¯Límë²Ûý€>}ú`ccCcc#Ó¦M#55µÇõ§É?Õv|¸—íÓ¡}888œœLDD¥¥¥ôïßþ§ zãú£¹¹‘H¤vãA[عs§*à‘••ž}ûøüóÏ©¨¨@$Q^^NSS"‘ºÿ2yòd&OžŒ‹‹ r¹Òÿ½pá?þø#»w零RéÿJ$vîÜÙnýíÑcbbˆŽŽ¦¹¹™Ï?¿å¿.\¸5kÖP_¯ô_ÓÓÓINN&99777æÎ« puÄ¿6ëOmÆ'mÐUû¸“üºÿ¥CÏ@ë¨õPk„fBÊö—a`e€ÀD@ÙÏeØŒ°AßH_#ýv%µ:µ¢Mþ†‚RãS ÞLá¶B‚>ÂÂÏ‚¢Ä"&{r‰œ´Ei̘z˜b⤠P™¸˜ 0ÐTÒDK} ¶cnEä¦d2­òßDÞy¤?ŸNÈžUPóv4\i îbeûÊÈÿ$Ç©ŽjtËK£Éy³õ&OõYeædìIŠv1xí`üßõ×Zu9u(ZXYÝ‘ +¯äø¤ã$…$‘ùR&Bsa›|ºÄ»´ººÐÔÃÿwýI{:¢]Eœ[rŽœ59ø½å€‘²&¥¬OÎìfÛ—Œªž tJ¥R~ýõWvìØÑꊃAƒ‘À_ÿú×Vù:„<õÔSXZZª]á0bÄæÍ›×ê÷òÅ_0mÚ46oÞÌœ9sXºt)[·n½Õ·‚‚(,,$-- __ß^³¸8qâµµµÄÅÅQUUECC±±±$''ß•ÅŃ^ÿáǹ|ù2›7oÖ`»Ê·¡ ,Ô~¯­ÍC&kÂÙyb»yœœÈÈÈàé§Ÿ&11‘H„©©©rî«¡§'ÄÖv¸*½½}(MMbUpëϰµŠDR…DRIaáØÚÃÊêVPÚËk>Ri=%%‡n÷¸ví Æpá‡DF*ß$-((Àßß_­?”••ÑÔÔôÇiG>Ab¢‹êÙ±Ã^ÜRÊGy‚ëæs{p«•O+— ¯¯ÝÈÕÕÐÓâè8¦Ãt--Ê—s„BSÍ>µ\ŽàOsûݬ_¡£§'èäØY‡¥Vio·ŒŒ „B!ãÆë6þ;Ó?î÷ñçA_µAGó¯&þ ©­­eÒ¤IªòÌÌÌT‹Ý…ÚÚZΞ=Ëûï¿ÏgŸ}Æ“O>©µÿ¡É¿ÐD¿×þƒ6þQWòßöiÒŸ6úí«W¯fÖ¬Yœ:uеk×¶¢çåå‘™™ÉîÝ»yûí·™3gÎ]Ñ&ÿTÛñ¡·¶ïa‡D"aÚ´iXXXàíí»»òÓ˜üñ„Þ°þhøãæ–›~i«ý?NZXhžß#""‹ÅTTT¨å·´lí¿ˆD"UÀú&BCC‹ÅªàVWžžŽB¡à‰'žÀÅÅEõØÛÛ·;µå¶Ç¿¦õggðì³Ï¶yõ¾¶öÑùtÿK‡žZä©ôÇR’‚“8·ô ¹‚¤à$N?~P^ öKµÙµ$G%“òH æÍ ܨ]µ€©m¡xw1%߫ߪ)ER¢5"F}? ©¯z‘µ"‹7pŽsÖi²‡ÑRÛBCAƒêi¼¦¼v¬±¨QXQÀïSÇÌËŒð¤pÆü6äpzÞiíò߆úKõä8…D$G`âj¢<%XÕLèÞP"dÔ£0ó4ãÄ õ+&|Vú¿)¿Í“Q_HèO¡D¦Dº/i”œ59ZË@Þ,'keëÚ=Öÿk0a¿„ð^ ©‚¤$jÒÕO -„8Ç9ÓïÑ~êAgþrÿwý‰8Áè_Gc7ÎŽS³O`ØÇ¹D®¾!S hQ`hk¨µüº‚A¯"l_Ç"ÞŒô†”´…i7÷µ:´ô^d}#úâö¤Ù+³;%Ÿ®î\ˆ‰å“Qcèéq!&–=Q¸!m&¿®Võ5(ž« u4ÝvÌÜÂÀ€yý=‰uSK §Ç¿G„üÈtÎEÏâ× S¨’H˜—|¸oÔþó\©¯ãÌ´¸›™#‘ɨ”HømâTÎEÏâàÄ)x[X2éÀÏjyß:œ÷³/p]ÒúêÇ•C†rxÒ42¦Ï$iÒ4ª››Y™~F{'\.cyZ*ûž`ÓáþÇXÇ~<ã=ˆågNuk¹ÿþ÷¿9þø€7ß|³Õ›Ç/^d„ üïÿ£¨¨‘HDtt4¡¡·À[·nÅÈȈo¿ýVõ±åœœœ^¡©TН¯/äçç“••Eff&±±±ºúµÄgŸ}†B¡ 22’—^z …BÁÓO?­¢{zzòÝwß‘‘‘D"¡¬¬ŒmÛ¶©-öåòfŠ%8xññEŒ÷Ò¿ji`×.w$’j¦L9Ìc]aöì\ÆŽÝ(¿g•““C@@Û·ogùòå¬X±‚òòrœœœ¨«+૯<ðòZÀc›B!cÏõ<¼½Ÿ`Ö¬,ââò05íÇž=ƒ¨¬Ì`Ï?† y™Ç»Bllææ|ýõ@d2 úú†Œù6>z†øøbfÍʤOŸ@öï(\žžž¬]»–ÊÊJŠ‹‹ñõõÅËËë…ýU]±·eæÌóÄÇ“Jÿþqjü¹¸LfÞ<±ÚciéÝeý×Õ]嫯Üqq™Æìٹ̙Sˆ½}(êó›LÖÄ‘#ó Ýð‡~¾îû»×õßÚú˜k×—G\\žÊ¾4ÙG~~>fffÌœ9“ªª*‰ˆˆhuEaWùo¯Üïãσ0¾ÆÇÇ#‹ILLD  ‹9|ø°ÖôŽæ_Mü+ Tk¹¹¹Èår¢¢¢º¥m@Åßµk×8sæ jþ…&ÿC“¡‰ÞÓþCWôÓù»Ú¾Žêפ?mô«©}7‘­²Ã«W¯2`À©¨¨àìÙ³\»v´´4|||Ô6Ü{RšüÓÎŒ÷ª}:´êêjrssUÏ•+WT~WãŸè 릦&æÏŸÏ† (**juº½¹¹™ØØXÖ­[GQQß|sk~?vì/½ôÅÅŤ§§S[[«öÂÀÇÌÈËË#//]»v©äàááÁ‚ ((( ;;™LÖ*ÿâêÕ«¸ººªšRSS‰‹‹ëT9íñ¯iý©íødeeÅ¢E‹˜?~«üÚØGOåÐý/zzüqßEÔ©(4`$'=ðmt]àJ¿Gû©‚>=ã~Æ ýt(µ¢Z2—e>pr X@mV-› töq„fB†}>ŒæëÍœ[r¹TþP! ½ëÖŸi‡~éÑzœLLùrLjªXrê÷NŽ›BFs¡ºŠÿädé&¦Û`.4`gøX®KšxæÄ1¤òû«=ÿüóÌŸ?_-h¥ƒ fÌÈàüùwÉËÛ¦†:ûÐáÄöíÛIOOW}»E×>tÐÙ§:èÖŸ:èpÿ@àzHð0¸tÐAtÐAtÐAtÐAtÐAtÐA‡‡ú:èÐ[úSh««ùº‚ ƒð\êÙí|÷3&to(ƒßü@ê!`}ÏxèìãO0°4`Ô£²aú÷ßÐyhÒTf»÷ï¶òþ;:‚e~CºO'S~›8•uÃCÈþµ)d4Ïz0ÇŽ®ÀÊЃ§°9t ú¾kòÝwß±zõjâuÐ~nXÆÌ™ç16¶Ó £“˜1#OÏùÝVÞ¨QW~£ÄÒÒ[íZÄ>}‚z¼=÷¢~SSg#»ÇøïUWuÿºþ¡CW±}ûv–-[¦kŸÝŠŒŒŒ6¯îÒµOgŸ:t–-[Æùóç±³k{þwvv&2²}ÿE½·£3üëÖŸ:<èPÛEjºÖDöªlŽ„áȨ#­çmÈãø„ã”ÿVNÑÎ"’B’(?\®5]:Êñ­‹”î+¥(±ˆ¼ yäü+‡+[®è´ØM0v2Æ÷u_"$òDëAÒó>8»ñv¸Ìu!êdvcµ_Hþ'a[‡alƒólg"ŽGÐ7ª¯v kS¢NEalƒ…nOºy"ûGìÛLï8Õ³f\ÞнÊ´gÇÈ]#9ûìY²^ëÜcFöFDŠÂ*È óæ˜4ÇÈÁHëü–þ–jφ0âËè ô}p4#wŽ”×é… 'pCàÉïNàï‚ócÎØ„ØÐÿ¯ý•m ´ÒÚ~4Ùß½¶é )'bN þU̘Ãc0²3êVÛúƒH™Í#N.üe€™1±Lè§ý÷·„…³3|,¡vöÌõð$}úL&ôsÒ*os .ÄÄjgŸµ Ïxâ|ô,¦:»¶™þQWw¼,,y/ë|·Ê`b?göŽ›Ä_Ž'ñÏ3'uƒòC„šæf&ØÏ¾â"NNÁÁؤWò¹xñb222‹Å89Ýê_«V­"''‡˜˜/^LYY™ÚGäoÇc=†kÖ¬QýæææÆ¦M›¸ví%%%w½]šê¿×üuF¾½±~WWW‚‚‚8}ú4[·n%((ˆ>}ú¨ècÇŽE*•²}ûv&MšÄüùóÙ¸q£Z"ÑG>GSSy¯ë&|ÏÔ©Gpv~OÏlj‹»LPÐ ýÿû999̘1ƒ &°råJBB”/1DEE¡P( …ªô7366Öªþ#Þbüøo±±ñW=––^w¥í7nä²c‡=ß|ãsOd·ê÷ôœG`à+½–ÿžì÷zü¹ßÇWMó‡¦úŸ}öY-ZDdd$¯¾ú*b±˜àà`}øðájObb"¿ýö›jLéÉùK œœÌ²eˈŒŒdÅŠˆÅb"""´æ`ýúõ¤¤¤@DD¶¶¶=âô„þº*'''Äb1!!!øûûãïï³³ó]õ?º"mémÁÛÛ[e/,]º”ÒÒRfÍšÕmúѶ}wêÿötûtè4õOMýï^B[ûù裈‹‹kóTóæÍã•WÚ÷_4Ñ{;´å¿­õgWúwwŒÏ½Ùþt¸?¡à2î§Ü`x/ UÂú¼z ¿,dØçÃ(ù®I…Ÿ•>ˆ^iE×Mùõ„z´Üh¡¥¶=}=Ò¥a;Ú÷Eî:-všJ”Îó/¶Þ´6ó4Ãu+iO¥ÑoF?Œú!Z#Âg•v RSwSlFÚ½*›ªSU]Ì¥÷.áõBë =¡ëöù0¦5ZCAu—ê¨Ï­GÖ(CR"imÔ†úx¿äMΛ9(ä Õï~kýúéP¬‡[cég‰ãTÇN˜ô õüÆ`2_̤©¤©Óò5q1¡¥¶I©„úKõÔ]¬CR&Ñ~ ó†êq_äNK} §œF!S¨Ê®HªÀ)Ö Ï<¹´îfÞf–ߢ(±ˆâ¯Š©>]MýeeùÒ©ÖöÓ‘ýõ&û(Ý[Já—…ø¾áÛ}œ…% ½Ÿ|˜ÙîØ›°âìiþ5t„Vùû›[0ª¯=/¥¥ò{¹˜y¼•™ÁKþ­Ò õõÙ2šÄð±˜Ý¶¡p¹®–œ5äܨ¡AÖµƆVùô¬Īô4dŠ[ò{oD_މ$¸¯6}xÔÕGíƒFúÖ &áäqŠtòCŠo¯ðù¥‹¼3<¸Wñeddĉ'¸xñ"3fÌP£ùøøðüóÏ3yòdæÏŸ££#K—.eÆ m–óÎ;ïð / “ÉT¿’pÏÞòÕTÿ½ä¯3òí­õ’žžN]]b±˜ôôt*++U‹ÃC‡Åã?ί¿þʶmÛøÛßþ¦œ³ô ±¶öÁÚÚ©S¶yÂÅßÿEâã‹:t5ýúÃÙy®®·68¨ªªÂÅÅ…°°0<øÖIÒðð­DGŸÄÕu:ÞÞOñØcøø,VÑgÌÈ`äÈwppgðà¿_ÄÀ‹8ðiÌÍÝÙ·/’ââ_ÈËÛÎO?…3xðlm‡`mmM~~>?ÿü3dÍš5œ<©ýK cÆlaÊ”Ã89MÄÉiÑÑ'1â-µ4Ri-UU™ªçÆKjt‡0úõ‹Â×7¹sKpq™¢uýãÆ}ÃôéÇps‹ÆÓsŽŽáóŠŠøä“O7nœªïÏž=û®Õ?cFÁÁëppÇÇç9æÎ-ÅÍ-ZëüÖÖ>Û!ÿa‹>XXôWkߦM›7nË—/§©©Ie¿$++‹Ù³g³páBÆß)þÝÝg2gN!ÌÅÞ> GÇpìíôî÷óøó Œ¯ÍÚÔÿé§Ÿ²eËŽ?ŽH$¢¡¡êêjýÌ™3ªçÅ_¤¶¶–ñãÇÓÒÒÒãó—L&#<<œwß}—#GŽðÎ;ïPUU¥@ÐÄÿ1b–––,Y²„É“'S[[ÛíþGOù]•¿‡‡555“Mff&ÅÅÅwÍÿèŠüµ¡ß„Û·oççŸÆÜÜ\véÒ%²²²¸páõõõv›~4µ¯+þïÝhŸ]ƒ¦þ©©ÿõ4>ýôSÎ;G||<áááìÙ³‡­[·je?†††øøøàççÇÑ£G jsޱ³³ÃØØ|||èß¿¿Öô­[·ròäI¦OŸÎSO=EAA‹ßògΜIaa!sçÎ%,,Œððp´¦oÙ²…Ç3qâD&L˜À‰'xë­[þmFFëÖ­#<<œçž{ŽÒÒR¢££µæ_ÓúSÛþ}§ã&ÜkûÓáÁƒúî¦^û ›+›•I_C|ßðEßPŸš³5ÈdÈ%rt}£Ž¯Ò”ßûŸÞJG²AÆ©9§ðXäÁå —)ù®¿·ü4–¯ƒP´O2ìc¨ÔSE3Ù+²‘7˱j…ÀT€¾‘>r‰¼Ã¢®4pné9†m†•-u-*½ß„çRO$ à䬓´Ô·´*ÇÔÝk„VBäMrúŽíK͹µ4Þ˼©>]MÅ‘ µß‹¿*Æ?ƒ^ĵï®Q²§¤Í:Úƒù sô„zÔdÔÜ‘x«Óª96þzB=ú„õÁ÷u_®þï*W¿¸Ú©r<—xbhkÈ™¿œQýfâf‚¼QNþ'ù„|B}n=å‡Ê´bBsa§ä×¥ÅLˆ‰» &N&è õ° °¤¡ A;ûQhÑö^bÕgªq]àÚmr³5R¾¥^ÞÔIJ3§È䌰틙Pˆ±@@ÓmŽH[ȯ«eñ‰cìÂÚP”«“J©¨bÿ98€¥¾~L9ø u-ÒVåô7³ÀÆÐkCšd2&ös&½òºZšW9Y^Îo¥×Ô~ß‘ŸÇÆà0^Æî+ù|UßfíÁ×Ê¡¾>iªO‡‡§*ÊYè5¨×ðãàà@rr2”––¶Z8ܼ£¬¬ŒÅ‹#‘H ÅÜÜcccššnõõk×’œœÌþýûÕ§_…âž¶QSý÷’¿ÎÈ÷~¬ßÓSyUîÙ³gÛ¤ËåÍTW‹02êÓ&ÝÆ&€!C^槟©©Éi3ͦM›øá‡ÈÍÍ¥¼¼KKK¤Råøìâ2—É$&º P(}¹êê Lœø#ùù»‘H”¸ÊÊs”•%SV–Lyy*'îåÊ•o11q ±±T­¾ÆÆ2@‰‰111èéé1eÊ^~ùe<<<˜:u*™™™åãæƒ›[4ry3Ÿ«~8p!éékhi©ÿcsͽ®î Ré­M¼²²JJ’()IÂܼ?žžST´_cý..SppeçNg•£lgŠY§ôœššÊ¡C‡8tèýû÷ç©§žR]Ów7ê¿~=]¥?ss7 ˜ËÕ«{µó_«E45•#“5Q]Ýö‹‹iiiªö¥¤¤œœLbb"cÆŒ!22CCCÕ8ÑjTär —/ïìtÿ¸ßÇŸa|íhþж~ ¼¼¼pssC(2|øp.^¼¨VÖêÕ«±··gâĉ÷dþúûßÿNBBS¦Láòeõ"ÚãßÍÍÀÀ@¸tI”_²d ÇgäÈ‘Ýêô”ÐUù§¤¤àííãÇgãÆlܸ‘?ü°Çõ×Uùk¢ß.›×^{ààà6ƒKžžžôéÓ™6m©©©]Ö¦öuÕÿ½íÓ¡{Ð^ÿÔÔÿz“&M"::WWWUÀmÖ¬YXYYie?ÍÍ͈D"µþ ‘HDyy9MMMˆD¢NÑ'OžÌäÉ“qqqA.WúÇ.\àÇd÷îݪÕ$ ;wîl—‡öè111DGGÓÜÜÌçŸßòo.\Èš5k¨¯Wú·ééé$''“œœŒ››sçÎeïÞ½Zµ¯£õ§¶ý»'ׇ÷Òþtx0¡uTÈz¨5B3!eûË0°2@`" ìç2lFØ o¤¯‘~;Š‹¨HªèTù <‘ŸJð®` ·ôq~%é4Ùè>[MK} SÖH‘5Êp˜ì@ÕéªVÁ-—x—6¯¬ü½’㓎“’DæK™ͅ伩¾“÷Aéϧ²'DÔ¼ W¨»XGÙ¾2ò?ÉÇqª£Ý2ÀÇhÇVåÞlññÇ8{’¢E ^;ÿwýµ–A]NŠVAV][(´(¸~ì:%ß—´yÅc{ò0ëo†ë|W²Wf«ýndg„¬I99ó$™Ë3‘5*ÿ7ìk¨µüºŠ–új³j¹òùŠwãëÜiûé½Å>¬‚¬¸‘y£Ûävº²‚º)1®nT77Ó(kaº‹+'+Ê[· ðjóêÁcâ2Æüü#þ?|Ã?RÇÜÀ€UijiÖegQ–0êô IDATJ2û'<Âk­ßrʯ¯ETSÍEWÙ Ê"ÆÕMdcË,7þ/ãLë6\¯`Ôþ˜òÛ/|‘—Ë{#Bø08Tkd×TÓ"—3¼O_Ý€ûc˜m_2ªzO S"‘0mÚ4,,,ðööÆÝ]yrÜÃÃNœ8Amm-qqqTUUÑÐÐ@ll,ÉÉÉj›K#FŒ`Þ¼y¼øâ‹:%wÚÊ÷~­ÿðáÃ\¾|™Í›7w˜N*­”œÛQ[›‡LÖ„³óÄvó:99‘‘‘ÁÓO?Mbb""‘SSSåÜW-BOOˆ­ípUz{ûPššÄªàÖŸak;‰¤ ‰¤’±µ†•Õ­ ´—×|¤ÒzJJ©-‚÷íÛGDDo½õ–jq^PP€¿ÿ­ù6((ˆ²²2ššš¨¬L=ú‰‰.ªgÇ{UpK)õ\··þ ¹\‚¾¾vþoõôô„8:ŽéØÿiQž< M5–)—Ë÷¬~…BŽžž Sv*•Öa``©UÚ‘#Grýúu***ÈÈÈ@(2nܸnã¿3ýã~tãëÍq®–³gÏòþûïóÙgŸñä“Oª•3hÐ øë_ÿz×eDaa!iiiøúú¶ nuÄaa!µµµLš4éÖZÏÌLµ±Ù]þGO£;ä/•Jùõ×_Ù±cÇ]»´«ò×D¿‰Õ«W3kÖ,N:ÅÚµk[¯oóòÈÌÌd÷îݼýöÛÌ™3ç®´ïv<ûì³L:µSþï½nŸÝ×?ïEÿ»té€!C:þ¦·&û©«SÎÿmÏÿuuuXZ¶ï¿´G‰Dªn"44±X¬ nuééé( žxâ \\\T½½}›}´=ÿQSûÚ[jÛ¿Û:Mùï…ýéð`B-òTúc)IÁIœ[z…\ARp§? (¯ û%ŒÚìZ’£’Iy$óæn ÔŠ®ZÀÔ¶P¼»˜’ïÕïèÔ”¿"©Ñ£¾…ÀT€×?½ÈZ‘ÅŒ8Çéîéì8Nw$êTC>‚ž¾Q§¢±]yEš¢EAÊ#)XøZžNØ/aÔ]¬##!C­ ¡…ç8gú=Ú¯Uùƒÿ5˜°_Âx/…TARH5é­OÕ_ªçø#Çi,l$"9Wå)ÁªfB÷†ù{$£~…™§'fœPËë³Ò‡üMù­N† |i ¡?…™Iè¾P¤5RrÖäh-y³œ¬•Y¬Àĵó߇ôê Âö…q,‚àÝÁHoHI[˜¦µüì±§6»–†+êW¸ö1l(RÈ(ZÚj-¿;…ž¾žJ¿‘¿G2êûQH«nµOûéÈþz“}ôè‹Û“n­‚Œ]A‹\NøÏ?2ØÊšÔ©’üÈtD55,L9ª–ÎÂÀ€yý=‰uký†Í¿G„üÈt6…„Ñ,—ãÿÃ7œ¹^Ñ*ÝÅ5„ÿü#Wêë83mîfæHd2*%~›8•sѳ88q Þ–L:ð³ZÞ7†çýì \—´¾úq塞4Œé3Iš4êæfV¦ŸÑZ¹Œåi©|4j4îfæºù!ÅXÇ~<ã=ˆågNõžª««ÉÍÍU=W®(¿ýYPP@cc#R©___ÉÏÏ'++‹ÌÌLbccÕÊùàƒxóÍ7Û¼#>>>±XLbb"±XÌáÇïZ5Õ/ùÓV¾½¹þÏ>û …BAdd$/½ô …‚§Ÿ~ZE÷ôôä»ï¾###‰DBYYÛ¶mS¡”‹ÚfŠ%8xññEŒ÷rþhi`×.w$’j¦L9Ìc]aöì\ÆŽÝ(¿g•““C@@Û·ogùòå¬X±‚òòrœœœ¨«+૯<ðòZÀc›B!cÏõ<¼½Ÿ`Ö¬,ââò05íÇž=Ê+++3سÇ!C^æ±Ç®›ƒ¹¹_=™L‚‘‘ÿùÏÈÏϧ¹¹™’’†ΰaÃTýÈÓÓ“µk×RYYIqq1¾¾¾xyyý±p¿Jb¢+öö¡Ìœyžøø"bbRéß?N?—ÉÌ›'V{,-½»¬ÿºº«|õ•;..Ó˜=;—9s ±·¥¢B}~“Éš8rd>¡¡þÐÏ×Ýb÷ºþ[=síÚââòˆ‹ËSÙ×M<÷Üs”••QSSƒ‹‹ ÊÓ{ùùù˜™™1sæLªªªhll$""¢Õ•]忽þq¿?ÂøÚÑü¡©~@ÀæÍ›ÉÊÊâÚµkœ9s†ŠŠŠVe3gÎ$==]uJånί[·nÅÈȈo¿ý±XŒX,&''G+þ ªÀXnn.r¹œ¨¨¨nõ?zÒ?èªüÿýïsþüyŠŠŠHII¡ªªJM¿=©¿®Ê_ývdgg«ê¹zõ*  ±±‘ŠŠ Ξ=˵k×HKKÃÇÇGmC½+úÑÔ¾›°²²bÑ¢E­®ë íÓ¡ëè¨jê=‰Ë—/3pà@þñPXXHjj*¡¡·^ŽÕÖ~𛛉eݺuñÍ7êóÿÇÌÈËË#//]»viE/((ÀÃà PPP@vv62™Lí…¬®àêÕ«¸ººªÒAjj*qqq*GSûÚ[jÛ¿Û´Ÿ;Ê/íO‡züqßEÔ©(4`$'=ðmt]àJ¿GûqjvÏnŒ÷3fè§C©Õ’¹,ó“cÀúj³j)Ø\ ³Û 42ìóa4_oæÜ’sÈ¥ò‡j Yè5X·þL;ôKÖãdbÊ—c¢¸PSÅ’S¿?prÜ2š ÕUü''K71Ýs¡;ÃÇr]ÒÄ3'Ž!•?XýëùçŸgþüùj 7t¸_0cFçÏ¿K^Þ60th…¢¢"V¯^ÍgŸ}¦†÷-¶oßNzz:ï¾û®®}:è ³Oî6lØ€™™ .Ô C·þÔA‡NCàzHð0¸tÐAtÐAtÐAtÐAtÐAtÐA‡‡ú:èÐ[úSh»WóÝ ‚>Âs©g·óiÜϘн¡ ~s𩇀õx<㡳?ÁÀÒ€Q?ŒbȆ!èÜCç¡IS™íÞ¿ÛÊûïè–ù év>LLùmâTÖ y ûצÑ8»ñv¸Ìu!êdvcµ[ˆšz˜ªê³ð±ÀíI7"ODbÿˆ}›é§:b6ÀŒË.w«ìÆÙ1r×HÎ>{–¬×:wÅXà¶u6Á68Ïv&âx}£újßÒßRíòÁF|9=£ŽfäΑ€ò:½ð£án¼#ùÝ Œì”:²Â| 9æÍ1r0ÒZÿšÚw¯íCzCʉ˜ˆ3æðŒìŒºÕ¶mú¨=ŸŒÃבãèin¿@OïÇNäùAƒ ³³ç_.ÄÄj§~û›[¨ÒûYÛðŒ÷ ÎGÏbª³k›éuuÇËÂ’÷²Îw« &ösfï¸IüåxÿD¨infÂýì+.âäÔŒMºµ|7776mÚĵk×())i3ÍúõëIII!!!ˆˆlmm;•ÿ&{ì1|||X³fM+ÚâÅ‹ÉÈÈ@,ãää¤ú}ÕªUäääÃâÅ‹)++ëUÙ½×üÝïõ»ººÄéÓ§Ùºu+AAAôéÓGE;v,R©”íÛ·3iÒ$æÏŸÏÆÕʉ>âðá8ššÊ{]ÿ0á{¦N=‚³ó#xz>N\Üe‚‚V¨è¡¡ÿ!:úw\\¦àè¿ÿÿÃÖVù ®¨¨( B¡P•þæoÆÆÆZÕ?bÄ[Œÿ-66þªÇÒÒë®´ýÆ\vì°ç›o|î‰ìïVýžžó |¥×òß“ý£·Ï½½}šæOMõoݺ•ýû÷ÆôéÓÉÊÊâÅ_TÑœœ‹Å„„„àïï¿¿?Îη¾Ïýì³Ï²hÑ""##yõÕW‹Åw[û4Õ¯©ýšøÓ†ÿŽü—®¢«üiÒŸ&þ{Zšøëª}voooÄb1²téRJKK™5kÖ]±O@@rr2Ë–-#22’+V¨øÑÖ½×íÓA3ºk}s·¡­ý|ôÑGÄÅŵùc€yóæñÊ+íû/šè½Úò'ëÓ÷Ÿ:1~<¬þ•wj.ã~Æø¾îKÀ{­ÖçÕSøe!Ã>FÉw%H*$ø¬ôAôºH+º&hʯ'Ô£åF -µ-èéë‘¶( ÛѶ¸/r×iñ.@!WŸJÁæªNVQ°¹é )Öª4E‰EULõéjê/×#k”!­‘`æi†ëWÒžJ£ßŒ~õ5B´F„컅 Z=¡ëöù0¦5ZCAu—ê¨ÏU–/)‘´6jC}¼_ò&çÍr…êw¿µ~ ýt(Öí±ô³Äqª£ZFcg1ÔgðƒÉ|1“¦’¦NÉÏÔÝ›‘6d¯Ê¦êTÅ_sé½Kx½ ýÌ̪Ç}‘;-õ-œ^p…L‰‹ -µ-T$Uàë„ç ž\Zw 3o³NËïNq“I©„úKõÔ]¬CR&ÑZÿµ¯7ÙGéÞR ¿,Ä÷ ßnícU•ªgñ@_êZ¤Ì>ò2…Bc^™BÁ£‡ðŸœ,RÊÅü''‹šæfl [ó/Ô×gSÈhÃÇbvÛ†"ÀåºZrnÔs£†Y ×Zå7Ò°rH«ÒÓÔx{oD_މ$¸¯6}xÔÕGíƒFúÖ &áäqŠtƒîCŠo¯ðù¥‹¼3<¸[Ë-,,$!!¡Ý·L8Àˆ#°´´dÉ’%Lž<™ÚÚZ­ó«ìØÈˆwÞy‡^x™L¦öû‰'¸xñ"3fÌPËãããÃóÏ?ÏäÉ“™?>ŽŽŽ,]º” 6ô Ükþ„ú IOO§®®±XLzz:•••ªÍ…C‡Åã?ί¿þʶmÛøÛßþ¦œ³ô ±¶öÁÚÚ©S¶yÂÅßÿEâã‹:t5ýúÃÙy®®·ˆ TUUáââBXX |ë$é×_Mnn.±±±$$$PWWÇ?þñ}ÆŒ FŽ|‡pþññE ¸€ŸÆÜÜ}û").þ…¼¼íüôS8ƒ/Q± -©«»JIÉ!JK’™ùo®_OÓZ~cÆlaÊ”Ã89MÄÉiÑÑ'1â-µ4Ri-UU™ªçÆ õ©;8„ѯ_¾¾ Ì[‚‹Ë­ë7î¦O?†›[4žžópt ï” ñÉ'Ÿ0nÜ8ÕØ0{öì»VÿŒ¯ÃÁ!Ÿç˜;·7·h­ó[[û`ll‡@`ü‡-ú`aÑ_­}›6mbܸq,_¾œ¦¦&•ýD"æææ*º‡‡555“Mff&ÅÅÅ*ú§Ÿ~Ê–-[8~ü8"‘ˆ††ª««»­}šê×ä?hâO]“ÿÒUt•?MúÓÄOë¯#þºÃ>oÂÀÀ€íÛ·óóÏ?·¢_ºt‰¬¬,.\¸@}}=………wÅ>e2ááá¼ûî»9r„wÞy‡ªª*µHGþkohŸ£»Ö7=…O?ý”sçÎOxx8{öìaëÖ­ZÙ¡¡!>>>øùùqôèQ‚‚‚Úìßvvvãããƒýû÷ך¾uëVNž<ÉôéÓyê©§(((`ñâÅ*úÌ™3),,dîܹ„……NXX˜Öô-[¶pøða&NœÈ„ 8qâo½uË¿ÍÈÈ`ݺu„‡‡óÜsÏQZZJtt´Öüwe}ªqÿI‹ñãaö¯t¸7PßÝìà @se³r ékˆï¾èêSs¶Yƒ ¹D®‘®oÔñ•Cšò{ÿÓ[Ù‘dœšs E\Þp™’ïJð{ËOcù:tÜþâ†ëãÊ`Eca£ºA™ 1q7ÁÄÉ=¡––44`ØÇP©çŠf²Wd#o–c5Ô ©}#}ä9žK=0€“³NÒRßÒªnSwS ¬ Z ‘7Éé;¶/5çjÔÒx/ó¦út5G*Ô~/þªÿuþ zu×¾»FÉž’6ëhæƒÌÑêQ“QÓi™5\iàÜÒs Û2 +eP°¥®Ee÷çO m 9ó—3ªßLÜL7ÊÉÿ$ŸoC¨Ï­§üP9ƒV Bh.ì”üîÕiÕ =¡}Âúàûº/Wÿw•«_\ÕZÿíµOEë%öQ}¦×®=Ò¿þé@_##;züŽò/òÄ“^ÞÌM>Ì•ú:õ²°Ô×)¡®EÚ*o3 l °60¤I&cb?gÒ+¯«¥y5 “ååüVzMí÷ùyl ãõÀaì¾’ÏWùmÖÑ|­¬êë“ö§útxøpª¢œ…^ƒºµLEb777 ãÒ%妸’%K8~ü8#GŽÔ˜ÿv¬]»–äädöïßÛÆºÉÉÉDDDPZZÚjáqóJ²²2/^ŒD"!44sssŒijjº§ú¸×ü=èõ{z*¯Ê={öl›t¹¼™êjFF}Ú¤ÛØ0dÈËüôS8559m¦Ù´i?üð¹¹¹”——cii‰TªŸcbbxôÑG122B.—«ÔÇŽcÛ¶mTT(çÊÊÊs”•%SV–Lyy*'îåÊ•o11q ±±T­¾ÆÆ2@‰‰GŽ,ôprÏàÁK07w%)i.ÕÕš_‚ss‹ÁÍ-¹¼™ˆˆÏU¿¸ôô5´´Ôÿ±¹f¿Š^Ww©ôÖ&NYY %%I””$anÞOÏÇ)*Ú¯±~—)88„²s§3|¶;»P Ì:¥çÔÔT:Ä¡C‡èß¿?O=õ”êš¾»Qÿõëé*ý™›»1`À\®^Ý«W-¢©©™¬©]¥¥¥©Ú—’’Brr2‰‰‰Œ3†ÈÈH UãhDDD›ÀA.—pùòÎN÷û}üyÆ÷ŽæOmê_³f «V­â™gža„ ²~ýzU)))x{{c``ÀøñãÙ¸q#7näÃ?T¥±°°ÀËË 777„B!ÇçâÅ‹Ý"CMõkã?hâ¯=º6þKwàNù:ÔŸ¶ü÷¤þ:â¯;ì`õêÕ¼öÚk·|ôôô¤OŸ>ØØØÐØØÈ´iÓHMM½+öyÿûßIHH`Ê”)\¾|Y+ÿµ7´OîÊú¦'0iÒ$¢££quu¥¥E¹ç2kÖ,¬¬¬´²ŸææfD"‘Ú†H$¢¼¼œ¦¦&D"Q§è“'Ofòäɸ¸¸¨üã .ðã?²{÷nÕ‹j‰„;w¶ËC{ô˜˜¢££innæóÏoù· .dÍš5Ô×+ýÛôôt’““INNÆÍ͹sç²wï^­ÚוõigÐÖøñ°ûW:Üh²jÐLHÙþ2 ¬ ˜(û¹ ›6èék¤ßŽ¢Ä"*’*:U>(Og¤Æ§¼+˜Âm…}„…ŸE‰E:MÞXøZq,‚npü‘ã­‚[-õ-ÔfÕråó+ï*Æ9Vy¾úl5-õ-8Lq@Z#EÖ(Ãa²U§«Ô‚yä‘þ|:!{BTAÍÛÑp¥º‹u”í+#ÿ“|§:ªÑ-,qŒv$çÍÖ›<Õg•˜“±')ÚQÄൃñ×_ëö×åÔ¡hQ`duGò«ü½’㓎“’DæK™Í…mòéïÒîÕ…fýÍpïJöÊlµßìŒ5)߯89ó$™Ë3‘5*ÿ7ìk¨µüºe#¹EÁõc×)ù¾Du¡¶úo¯}½Í>¬‚¬¸‘y£ÛeçiaÉSžy)­}§Á/&ôk}tÜÏÚ†´é38W]IøÏ?¶ n¬Ë:Ï¢”döOx„×Z¿å”__‹¨¦šŠ®²A”EŒ«›=ÈÆ–Ynü_FëàãéëŒÚÿS~û…/òryoD‡jÝöìšjZär†÷é«lr ³íKFÕÝ tR[[ˤI“nEffª……¶1bóæÍku5D"aÚ´iXXXàíí»»ò乇‡&&&œ8q‚ÚÚZââ⨪ª¢¡¡ØØX’““{…s¯ù{Ðë?|ø0—/_fóæÍ¦“J•cº…ÚïµµyÈdM8;Ol7¯““<ýôÓ$&&"‰055U-Ö…B!£FR¥¿¹Ø½Üú3lm‡"‘T!‘TRXø#¶¶Ã°²º”öòšTZOIɡ۽®];ÈÁƒ1\¸ð!‘‘Û(((ÀßÿÖ|DYYMMMTV¦ Ž}‚ÄDÕ³c‡½*¸¥”ú ®Ûƒ[†\.A_ß@+ýTW_@OOˆ£ã˜Óµ´(O …¦Ë”Ëå‚{V¿B!GOOÐ);•Jë00°Ô*íÈ‘#¹~ý:ddd  7n\·ñß™þq¿?ûø:pà@¾øâ ¦M›ÆæÍ›™3gK—.mõ†¿Ò¤üúë¯ìر£ÕGµµµœ={–÷ߟÏ>ûŒ'Ÿ|²ÛÛÒQýš ‰¿öèÝå¿ôšô§-ÿ=¥?Müu—}®^½šY³fqêÔ)Ö®]Ûz}›—Gff&»wïæí·ßfΜ9wÍ>ƒ‚‚(,,$-- ___µÍiMþkojŸ=·¾é)\ºt @À!Ó[“ýÔÕ)ç ‹¶çÿºº:,-Û÷_Ú£‹D"U@ý&BCC‹ÅªàVWžžŽB¡à‰'žÀÅÅEõØÛÛ·«£¶üGMí»ÓõéíxöÙg™:uj«²;?4åÐý+î Ô"O¥?–’œÄ¹¥çPÈ$'qúñÓ€òZ°°_¨ͮ%9*™”GR0hNà¦@­èªLm Å»‹)ù^ýŽWMù+’*­1êûQLxýÓ‹¬YÜȸsœ³N“w~oû¡o¨OÐGADŠ"êT£ŒVêO_ÁÿLØ/aDþɨïG!­’’¶Py¢EAÊ#)XøZžNØ/aÔ]¬##!£U=õ—êU´ˆäL\M”§«š ݪ,ÿ‡Q˜yšqbÆ µ¼>+}Èߔ߿ɍ/ $ô§P"S" ÝŠ´FJΚ­Û/o–“µ2‹€õ˜¸vþû07åð^ ©‚¤$jÒÕO -„8Ç9ÓïÑ~m–aÿˆ=µÙµ4\Q¿ÂͰ¡Z @!S hQ`hk¨µüº‚A¯"l_Ç"ÞŒôFçõß^ûz“}ôè‹Û“níẂ©Î®\¨®"¿®í9 æõ÷$Ö­õ6Œ…‘¾€ÿ†Ep!&– 1±ŸÜú ¢‹7jT°3ÓfànfŽD&£R"á·‰S9=‹ƒ§àmaɤ?«å}cèpÞϾÀuIë«WÊáIÓȘ>“¤IÓ¨nnfeú­Û.‘ËXž–ÊG£Fãnf®pRŒuìÇ3ÞƒX~æT·–X,&11@€X,æðáÃlö*P9æ¹¹¹Èår¢þ?{çÕ•>þCï Ji‚Tˆ0 ¶X5FS4ÆotW7ù­¦idW)fÝD×ј²5–˜5ƆA° **ÒÛ€©ÌÌÊ Š%x?ÏsŸæ½÷œó¾ç½§ÞsNX˜FÏ+ßÁO?eÕªUÍö€¯¨¨àúõëÊ+;[qvhVVuuu466âåå…¿¿?™™™¤¦¦råÊ"##Ÿˆ=ŸÉ“¯Ð¥‹?‡ W¾®®®¬^½š²²2òóóñòòÂÍÍí÷Ž{;v8bc̤I—™>=ñãèÙ3J%}£˜1C¬r™™¹?pþWWçðý÷=ppË”)×™6-›`JKUë7©´ž“'g¼î÷üÙÝ!þ÷¸ã¿;Ðó9GˆŠÊ **Cé_wø¿ÿû?Š‹‹©¬¬ÄÁÁ[[Åê½ÌÌLŒ™4iåååÔÕÕÂÙ³g;4ý­½öò§3”¯mÕŸêâ¿ví#FŒàÛo¿%//´´4ÆGpðݨ>ùä._¾L^^ñññ”——+Ò´µµÙ´i©©©páÂJKK[¨»_ÚŠ_þê£ IDATÒ§N®IûåAxÐô©Ë?uéØù§.}áŸw¸zõªRÏœœ\\\¨««£´´”‹/RPP@bb"žžž*êÛ?·lÙ‚¾¾>?üðb±±XLzzºFí×'A?Öé¨þÍÃâæÍ›xxxð·¿ýÜÜ\TÞMý§¡¡ÈÈHÖ¬YC^^{ö¨ÖÿŸþ9GŽ!##ƒŒŒ vîÜ©‘<++ gggfÍšEVVW¯^E*•ª|õ äääàèèHpp°òMHH **ª]á¨Óï~û§w077gΜ9-ncÙVù¡îùÎÞ¾x¡;禜{¨ñt7 Ï}¨J«âÊâ+ÎŽ¾k}©J­"kS–à÷ c¬C߯úÒp«K /!k”=UeÈl7"z2öøá‡¡ÿFJe9 ÏîtvÜ4˜”Šrþ“ž*TL÷`¢£Ëö¡Ã¸%©gî™S4Êþ\ïׂ ˜9sf‹ƒv&NLæòåÉÈØ*C yyyDGG³yófÁZ¶mÛFRRü± Ÿ€€àŸuëÖallÌìÙ³cýSv#Lp=%< \O"ÁO Á‚[Ýšï~ø<×E®žNƒîï¦÷ªÞÒ~¾k}qžë,øÇÐ5ÓeàOñ[ç‡H÷ÏWtÔ=;,¼¯‡°ØÛ¯ÃÓighıð1¬éÔ)˹ AƒYЫ7ª˜ëéq4|4›‚‡ +êüM“}ûö-d¼€æu³ïb&MºŒµ`Œv2qb2®®3;,¼×1t¨âŒ33w•m»t xèú<ŽøŒìéÖ-ô‰Mtt4Ê­Ú˶mÛX¼x± Ÿ@‡’œœÜâÖ^‚ t ‹/æòåËX[·Ü>¶··'4´õö‹:ù“N{Ò/ô?:;*£Hõõ\]~•“Á'99ðd³›3Öe7"Ž’c%ämÏ#&(†’%ËÕÑÖó×>¸FÑÁ"òv䑱.€ô÷ÓÉþ2[ÈÅG„ë_]|t0Öíqxΰ³aXÓ| EßFŸ°sa˜˜câa‚‰‡ ú¶úšu¬;†e %¦ž¦8½äDè™PlFÚ´x·1Ý0v1ææº›jëg¬°s_½H껩íÒïAígæc¦rù}êGÿÿõGK[«Ãíw¿ôZÚ‹À]8>ïˆe %º–ºO¤~÷ã·93þ â_Å 91}kýµÝÿëíKü¨qŒ´sà7®ŒdD÷öŸ/ø‚‹Ç#Æ2>[CÍΊëibJÊøH‚­mð¶°d®{/.›Ì{ÇïŸàØ7S3þ•z¹CmÞÝžýÏDðB\ ¿pV(tŸ"*qäóó8;f<¶†ªô¿úê«Ì™3‡ÐÐPÞyçÄb1-Þ;uêT<==Y±b…ò7'''6lØ@AA………jýË—/'==ñãÇ3oÞ<Š‹‹UIÒãwtt$ €óçϳeËèÒ¥‹R>lØ0Ù¶mÌœ9“õë׫„‘–ö_Nœˆ¢¾¾ä‰ó#~d̘“ØÛÄÕõy¢¢n°T)ÿöÛoIOOgâĉŒ1‚eË–¤øˆ!,, ¹\ŽŽŽŽòþ;¿hÿþ0|øXZú(/33·G¢ûíÛ×ùî;öìñ|,¶Tñ»ºÎÀßÿí'6ýŸ|ò wºò§³—¯êê?;;;Äb1AAAøøøàãヽ½jûxíÚµÄÇÇ3þ|BBB°²²RÊúõë§ríØ±ƒcÇŽ©”93ýêâW'פþmKÿ‡­ßƒÚ_]þnÙ²…C‡1hÐ ž}öYRSSyã7ù{2oÞ<’““‹ÅØÙÙuˆ¹»»#‹ ÁßߟE‹QTTÄäÉ“…Ž@‡”êÊwMÂ\hú~ü÷¿ÿ%**ªÙSw˜1co¿ÝzûEüIGÓô·ÔÿTW¾µ…¶¶6±±±,^¼˜ÐÐP–.]ªÌ¯?KÿR ó¡Rót7Àë^ØŽ²åò몗55äþ/— =A\ÿè:ÆÆx.ó$íiX³V+W‡ºçµt´hºÝDSUZ"-ç$âô‚]C» ¹ø0v5Æq–#g#Ïâ¾Äšk5¤­HÃs¹§Æ“˜††4U5!)’ KËä-Þ§¥£…ÏÇ>èZè’¼ i­T)«Íª¥¡¬=+=¤uR$…’fÏ‹ôD¸¿éÎÕ÷®ªÄá½Ú=+=27f"«—aÔÈò åHŠ%¥_¤'¢÷ÊÞ\Zx‰úÂúvé×ö»}å¶òoßµ¾4Õ4qiÑ¥·ßýÒïÛ~ˆôDè˜èàô¢â_ÅT^¬Ô|ãé÷ þQ´¿C;C¼Vz‘4/©cp¦fÌvó`ô±Ã,ó ­²’¥Ïó~Ÿþ-Ì×( }‘6? ÁªËI¼÷‡†l¹Ð‰øl@0]ôô˜s:–š¦&¥ìfu·$¬ôõ©•6QPWÛb<ËüxóBRù]ûý«Ö¬KK¥N*ÅÅÄ”³¥bŠþpq[é_Ó/WÏœ"¿¶V(tŸR~ÈÉÂÁȈúòbÜÉ?Mº¿øâ Åû¥£ƒ••µµµTTT4÷s}}>úè#^{í5¤Ò»eWnn.óçÏg÷îÝlÛ¶íO«ßÃÀÓÓ“ ć~HJJ ‹-bݺu8pàOnn.¹¹¹TWW#‹IJJR<<~ü8C† !..NùûÖ­Šó®D"=ÌÌ\ÐÕ5'<|?¿üAY™jÝããó>>ož¾™¢¢ß‰t‰tÉÍU¤oþüù¬Zµ ___œœœ8vìýúõ#5Uñ¡ÎС[°°ð&)iÖô鳜K—V“–¶P¬€ÊÏ?LNÎ~¬¬üñó{‹ÄÄå\»ö%¯`bÒƒ}û),ŒaâÄ‹äæäÖ­D,,,ÈÌÌä—_~¡¾¾ž£G¶+† ùSS’“ßäôë·’ÂÂΟKyOccåå­Ÿ‹jk;ˆÚÚ<,,z°ŒØØÙäåÒ(þgžÙƒ‘‘-—.}ˆ®®)ݺ åÖ­DÓŸ——Çعs'þþþ¬Y³†iÓ¦±{÷îGÿĉÉ!;ûG,-½éÓ'š¸¸¹ääì×èy O ¬ÑÖ6ÀÂB1%•J¨ªÊTë‘þ=&1pàg$$,¡º:‘H™LŠXžžXXXË€8þ|§):{ùªIýçììLee%ùùùªÔGŽÁÀÀ333.\ÈÞ½{9sæŒR~áÂåßÛ¶m£ªªŠéÓ§?²ô«‹_\]ý«Nÿ‡­ßƒÚ_]þzzzòÛo¿H$böìÙ˜˜˜<²wD__Ÿ“'OòöÛo3qâDΞ=Û®ü½ƒ®®._ý5VVVL™2…êêj¥ìÆ”””`mmMMM ¹¹¹B‡@àË?MÊwuá?ŠþÅÀyÿý÷ÉÏÏçõ×_§¢¢Bå ®ÖÞ===\\\077gÿþýDDD¨´¯ïØÀÚÚ<=í‰DBff¦Fò-[¶àííÍŠ+°¶¶fùòå¬^½šíãI“&ñÙgŸ±dɲ³³ÑÖÖF*•¯‘üË/¿ÄÅÅ…÷ß¹\ÎÊ•+‰‰‰á­·íÛäädŽ9Â?þˆ··7ÑÑÑÌ;—ýû÷k”~uýOuå[[H¥R†ªüÿôéÓÌš5«]X<Îþ¥@çDõÓ’6J4”5( ’®zx­ôB¤'¢òb%ÒZ)2‰L­\¤ßö–Cêžwÿ»»âEª•rnÚ9œç8ssÝM ÷âý·Úð ½.zŠ|*màêÒ«Èd˜÷1GÛH‘¾™D¦6ŒŠÄ N ?…–Ž]uÁë^ä|›CÎ79Ê{\¹â2ß…³“ÏÒTÓÔ, £FèZè¢c®ƒ¬^F×a]©¼¤:‰â¾ØŠó”ž,Uù=ÿû||ÖøÐë^ì+ poa‹q´†I/´t´¨L®l·~a?¥º¢g¥Ç….4—u€ýî;L=M9uŽÚlÅä„Ó‹N ø~g'µo%ÎÃÖ¯#ü£âB޳;ìý²ÒW|¥^R_Ïâ çHeô·êбŽÚÚÔ«ilZðÓ°p&œ8‚¸¾'ã–;~ïíË"/oF=LuSc3yOcS,õô±ÐÕ£^*%¼»=Ie·TîyÇן³%%+*Pùý»Ì Öâþ}Ù•É÷Y™-ÆÑ^æèˆD$þ!>§s¥%Ìvëõ§K·©©)nnn899¡££C¿~ý¸víšÊ=«W¯&66–C‡TÖåry§ÐïapgË‘ââbæÍ›‡D"!88 ¨¯¯ÿSÇïêªØ*÷âÅ‹-Êe²**ÒÐ×ïÒ¢ÜÒÒ?¿·8p`(••é-Þ³aÃ~úé'®_¿NII fff46*Êg‡Q88ŒbÇärE[¤¢"…ððŸÉÌÜ…DR@YÙ%Š‹c).Ž¥¤$ððýdgÿ€¡¡-uuE*ñÕÕr ÛÅ?---FÍ[o½…³³3cÆŒáÊ•+jíãä4'§qÈd „„|¥üÝÃc6II+hjªù}ðÐKK¥¼º:›ÆÆ*åÿÅÅñÆPXƒ‰IO\]Ÿ×h‚ËÁa4¶¶ÁlßnÏïÇcmŒ®®q»ò9!!ãÇsüøqzöìÉË/¿¬ÑWGÅëV’2ÿLLœpqyNã ®ŠŠ4êëKJ멨HkñžÖüÃÚ:¨CÒ/“I¸ys{óþcCW®\¡k×®²üéìå«&õ_||<îîîèêê2|øpÖ¯_Ïúõëùì³ÏprrÂßߟAƒqãÆ .\H\\ P '::ÂÃÃiú5¿-ykõo{ôúu„ýÛÊ_€+V°|ùræÎˈ#ð÷÷gíÚµäý°µµ%66–ŠŠŠèÙ³ç}åott4ï¾û.TUUµØèÒ¥ –––ÔÕÕ1vìX„À•š”ïêÞ¿‡IDDãÆÃÑÑ‘¦ß?¸XLæÆLºé¦"7ó5£Û¸n¤¯JoQ‡SÃOq6ò,yßåÑ{uo|>öÑØÕéÕț䘘·ÝhA¿Ž²ŸqOcg:ruÙÕåj¿û¥¾°ž¦š&¬†ÜýbCÛHi]ó‰™Ç©_Gù‡y€¹Êгå|Y)ÕMŒwt¢¢¡:iÏ:8r¶´¤ÙäÖ,7FtW]:.‘ʘƒ±Ž.=MLq0R 9™` ­­¼oMêeæÄÇrhÄHÞõm~ÎEfMi•ü”—ú´TÆ;:©È,­˜ìäÌ{ÉÍ'Ïß*e࡟}ì0ßd\ç_ýƒø,0Xc\­¬ I&£_aUîÓN_«®$—ÿù&:«ªª¸xñ"ÿþ÷¿Ù¼y3/½ô’мÿþ̘1ã±l­ó(ô{Xœ9s†ªª*¢¢¢(//§¶¶–ÈÈHbccÉàëÃŽÿĉܼy“M›6µy_c£âko]]Ó?äKRi=öö­ÚÚÙÙ‘œœÌ+¯¼ÂŽ;HKKÃÈÈHQ÷U¤¡¥¥ƒ•U?åý66ÁÔ׋•“[ÄʪI9I¹¹?ceÕsó»“Ònn3il¬¡°ð¸Ê éÁƒ áƒ>Pvγ²²ðñ¹[ßP\\L}}ýï«ÕäüöÛ‹ìØá ¼¾ûÎF9¹¥°b×ëÞÉ­?"“I‰4ÛB¹¢"--ºuÒæ}MMŠ{ttŒÔ†)“Éо§n~ÔñËå2´´´Ûå§Õèêšitï½þñ0Òß·o+Údfffªüéìåkû|°‘_ý•ï¾ûN¹ÅVnn.UUUDDDÜíK+ïЫW/æÏŸÏk¯½öXÒ®.~uòÖê_MõXt¤ý[Ê_¾ùæÆŽ˦M›˜6m‹-bË–-D?‰DÂØ±c155ÅÝÝ=zŠU/†÷l¯N¿èèh&OžÌ¹sçX½zuóþmFW®\a×®]|øá‡L›6Mè Lce#é+Ò5¶¬AFê²T|×úbèhØ.ý:Â~6#m¨ºZ¥\%Õb¿ûw8=æ4ÆnÆ ÊcC@çgœ¢ôëÿèÒ§—œZ„»šd2†þò3½Í-H3ؑϒVYÉìøßTî3ÕÕeFOW"T¿°¹ÝØ@fu•òÊ«U4Šrj«›M]»]ÉÐ_~&»¦š c'ÒÃØ‰TJ™D±ð1\7™£á£q75#âÈ/*Ï®ìÓ_Má–¤ùÖËüúp"b,ÉÏN"&b, ,Kº y'R&eIbÿ8˜Æ&B¡û”2¬[wæº÷bÉ…sš4kkk³iÓ&RSS)((àÂ… ”––6kÈú駬ZµªÅ=â§OŸŽX,fÇŽhkk#‹9qâÄŸJ¿‡Ù©÷òòÂßߟÌÌLRSS¹rå ‘‘‘šø7oÞŒ\.'44”7ß|¹\Î+¯¼¢”»ºº²oß>’““‘H$³uëVå$”¢SÛÀñã‘®aúô<žyf¢þhªeçÎH$Œ}‚©S³™2å:ÆíçY¥§§ãëë˶mÛX²d K—.¥¤¤;;;ª«³øþ{gÜÜf1uj‘‘W‘Ë¥ìÝ«ú‡»û‹LžœJTTFFÝÙ»·7eeÉìÝëŸß[LšMdd:&&ÎìÞíT*A__Ÿÿüç?dffÒÐÐ@aa!ýúõ£oß¾€b‚ËÕÕ•Õ«WSVVF~~>^^^¸¹¹ýÞqÏaÇGll‚™4é2Ó§ç1~|={F©¤ÏÁa3fˆU.33÷Îÿêê¾ÿ¾c™2å:Ó¦åbcLi©jý&•ÖsòäL‚ƒ×ýž?»;Äÿwüwz>§ àQQDEe(ýK<ªô7440bÄ6nÜx_Û`>©åOg/_5©ÿ>ùä._¾L^^ñññ”——+ë¹\ޝ¯¯r`íúõëÈd2ÂÂÂTâ˜4iIIIÊU2ýšÄßš\]ý«©þK¿Ž°[ù{íÚ5FŒÁ·ß~K^^iiiŒ7ŽàààGâ›\¿~]yegg+ë­º{¶`×Ä¿®^½ª´SNN...ÔÕÕQZZÊÅ‹)(( 11OOO•u§›)ÿ4)ßÛ ÿasóæM<<<øÛßþFnn. *ﶦïGCC‘‘‘¬Y³†¼¼<öìÙ£"ÿüóÏ9räddd°sçNäYYY8;;3kÖ,²²²¸zõ*R©T僬!''GGG‚ƒƒ•y@TTT»ÂQ§_kýOMË7sssæÌ™ÃÌ™3›Å½eËôõõùᇋňÅbÒÓUÇÏZ{þq÷/:'Zü¾_Dع0Á˜˜À˜N¯£ã,GºOèι)w`Ô »}¾èCUZW_étvô]ëKUjY›²ÿ¸cú~Õ—†[ \Zx Y£ì©*Cf»yéÔ“±Ç?Ôxì øß0R*ËYxît§³ã† Á¤T”óŸôT¡bº]¶Æ-I=sÏœ¢QÖ¹Þ¯ 0sæÌG6(# БLœ˜ÌåË“‘±U0†€à’mÛ¶‘””ÄÇ,è' ø§Àc`ݺu«œÁ% ô?4E˜àzJx&¸žD‚ ž‚·ºuÝýðy®‹\;<Ý ÞLïU½;e>ø®õÅy®³à@×L—? Äo"Ý?_Ñy¶··'4´õö‹:ù“N{Ò/ôO:;*£Hõõ\]~•“Á'99ðd³›3Öe7"Ž’c%ämÏ#&(†’%ËÕÑÖó×>¸FÑÁ"òv䑱.€ô÷ÓÉþ2[ÈÅÂÌÇLåòûÔþÿë–¶ÞxÓwK_,úZ`ýŒ5ƒ¢Çì~›kg#ÂÎ…ah‰©§)N/9z&›‘6-ÞßmL7Œ]Œ¹¹îf‡ÚÈúkìÀÅW/’ú®æ[Œi‰´°cÎs± ²Äe‹RMÑ·Ñ'ì\ææ˜x˜`âa‚¾­¾R>øè`l(¶ÓúÛPü×ùß—ýZB]þ»þÕ•ÁGc=܇ç;†õ°ö ÄõZÚ‹À]8>ïˆe %º–šÿ(ü£ñv#gÆŸAü«˜!'† o­ßa~¥­¥ÅÃÂYЫ7ƒ¬mxݡ”ñ‘[kž?ÿ0ï†c€•5áÝí‰ù,ÿçá©Ñ³=ML•ñy[X2×½—ÇMfŒ½c‹÷Op웩ÿJ½Ü¡ïWxw{ö?Á q1üýÂY¡P~Ѝlh`Ä‘CÌÏãì˜ñØ>ÒøœœØ°a6“ïÙ³‡_~ù…^~ùeòòòZÝ#|êÔ©xzz²bÅ ÃõÕW™3g¡¡¡¼óÎ;ˆÅbŸ˜üY¾|9éééŒ?žyóæQ\\üÈ¡î ñ;::ÀùóçÙ²e téÒE)6llÛ¶ˆˆfΜÉúõëUÂHKû/'NDQ__òĽ¿#FüȘ1'±·‰«ëóDEÝ$ `©RüÆ;ƒÃhºu ÁÇçÿae¥8ƒ+,, ¹\ŽŽŽŽòþ;¿hÿúõë9qâÊ«W¯^D÷Û·¯óÝw6ìÙãùXlÿ¨âwu¿ÿÛOlú?ùä"""(..îtåÏŸ½|UWÿÙÙÙ!‹ ÂÇÇìíݯ_?•kÇŽ;vLYf¨«?ÕÅÿ@íwmmbccY¼x1¡¡¡,]º±XLHHˆòž-[¶pèÐ! ijÏ>Kjj*o¼ñF³°æÍ›Grr2b±;;;í°víZâãã™?>!!!XYY=²üS[éWg?Mìû¸Ûêü³-ÜÝÝ•úøûû³hÑ"ŠŠŠ˜}Øú=ítDþ>ìòãAÐÔþûßÿÕâÇ3fÌàí·[o¿¨“?éhšþ–ú§êêŸõ?uhR¿ ´•š× »^ÿðÂv”-—_W¸¬É¨!÷¹í âúG×1ö0Æs™'iÿHÃz˜µZ¹:Ô=¯¥£EÓí&šªšÐi‘8'§œèÚUÈÅŽêd^¹­üÛw­/M5M\ZtIù›±«1åçÊ©H¬@K¤…}”=ÚÆÚþ´t´ðùØ] ]’$#­•*eµYµ4”5 g¥‡´NФPÒìy‘ž÷7ݹúÞUä2¹òwïÕÞèY鑹1Y½ £F”_(GR,Ñ(ý"=½WöæÒÂKÔַ˶r™œ„é ws/VÒ}Rwt-t5ÃÐÁ¦ª&$E$b‰Šnwd¥1¥ØEÚaêeÊ57è9_uÅŽ&ök¶òߨÕÇYŽœ<‹ûwj®Õ¶" ÏåžOr÷û¶"=:&:8½è„øW1•+Ÿ8ÿ(Ú_„¡!^+½Hš—Ô!ïžT.g‰#ÊÿÏß*%ªGO,õ4ŸDs35ãL‰˜„[%ˆ´´˜ÑÓ#æþ¥#ñÙ€`ºèé1çt,5MMJÙÍê*‰ÛšU IDATnI$XéëS+m¢ ®¶Ùóú"m–ùðæ…¤ò»öûWÿ ¬ X—–JTŠ‹‰)gKÅÝsHi[è‹´YÓ/WÏœ"¿¶V(ŸR~ÈÉÂÁȈúòbÜÉGonn.óçÏg÷îÝlÛ¶MõÝrscèС‘™™Éo¿ý†\.gåÊ•Ô:t Þ$%­ÀÀÀš>}–séÒjÒÒ6ŠPùù‡ÉÉÙ••?~~o‘˜¸œk×¾ÄÃãLLz°oßÝ•7……1Lœx‘Ü܃ܺ•ˆžžÕÕ9G*•PTô[»ò`È/15u!9ù}@N¿~+),Œáüù·î¶«*+UìúGlmQ[›‡…Eo–;›¼¼CÅÿÌ3{02²åÒ¥ÑÕ5¥[·¡Üº•¨qúóòò8pà;wîÄßߟ5kÖ0mÚ4å*¦‡ÿĉÉ!;ûG,-½éÓ'š¸¸¹ääì×èy O ¬ÑÖ6ÀÂB1%•J¨ªÊTëGÅÎÎŽ÷Þ{333†ÎÙ³šÄÒ£Ç$üŒ„„%TWg#i#“I‹ãÑÓÓÃÃà bcc0`çÏŸï4åOg(_ÕÕÎÎÎTVV’ŸŸOaa¡JÝ páÂåßÛ¶m£ªªŠéÓ§k\ª‹ÿÚïR)C‡UþúôifÍš¥2@ìééÉo¿ýF||<"‘ˆÙ³gcbb¢Òn8yò$o¿ý6'Nlön¨³Ï‘#G000ÀÌÌŒ… ²wï^Μ9óHÚGšÄßVúÕÙOû>îöŸ:ÿ¼ƒ®®._ý5VVVL™2…êêj¥ìÆ”””`mmMMM ¹¹¹Ì?;ª}ú8ô{Úéˆü}Øå‡:¾øâ Èûï¿O~~>¯¿þ:*gpµæ?zzz¸¸¸`nnÎþýû‰ˆˆhÖôôôÄÚÚ<=í‰DBff¦Fò-[¶àííÍŠ+°¶¶fùòå¬^½šíãI“&ñÙgŸ±dɲ³³ÑÖÖF*•¯‘üË/¿ÄÅÅ…÷ß_Y¶ÄÄÄðÖ[Šömrr2GŽáÇÄÛÛ›èèhæÎËþýû5J¿ºþ©ºúçAýOêê7ö¢úiI iÊIW=¼Vz!ÒQy±i­™D¦V.Òo{Ë!uÏ»ÿÝ]ñ"ÕJ97íÎsœ¹¹î&…û ñþÀ[møšãºÐ=+=.¼pAå÷›ëoâºÐ‡itÜO²·dwXø®‹\q™ïÂÙÉgiªij&7êa„®….:æ:ÈêetÖ•ÊKª“ î‹Ý©8_AéÉR•ßó¿ÏÇg½ÞéEÁ¾ ÷¶Gk˜ô2AKG‹Êäʲ¯Ó N8>ïHâˉÔåÖiü\Eb§†ŸBKG‹.ƒºàõ/r¾Í!ç› ‘ÕÉÈܘIÐAÔ\¯¡äx ½–öBÇD§]ök¶ò_¯‹žâ=.màêÒ«Èd˜÷1GÛH‘¾™DÖfØv˜zšr.êµÙŠÉ §ðýÎN:ûÄùGÅ… g9>”÷oŽ[/^rsç¹Ød×TküÜÚÔ+ü?o_fº¸bÓÞl¼–¦rÏß{û²ÈË›ÑGSÝÔØ,ŒžÆ¦Xêéc¡«G½TJxw{’Ên©Üóޝ?gKJ8VT òûw™¬Ä?üû²+;“ï³2[Œ£5¼Ì-ЉHüC|OçJK˜íÖë‘Æ)¿g²öܸqƒéÓ§sèÐ!,-«noß¾Ýâ—‚«W¯&66–C‡iþLMMqssÃÉÉ úõëǵk×{~ÜÙò£¸¸˜yóæ!‘HÆÄÄêëë…ø¤ÍåªØ*÷âÅ‹-Êe²**ÒÐ×ïÒ¢ÜÒÒ?¿·8p`(••é-Þ³aÃ~úé'®_¿NII fff46*Êg‡Q88ŒbÇärE]]Q‘BxøÏdfîB") ¬ìÅűÇRR’@xø~²³ÀÐЖºº"•øêêŠ9††ŠíâNžœhag7œÞ½bbâHLÌsTT¤©o39ÇÉi2Y!!_)÷ð˜MRÒ ššj077' àî$ÛÍ›7¹}ûî‡UÅÅñÆPXƒ‰IO\]Ÿ×h‚ËÁa4¶¶ÁlßnÏïÇcmŒ®®q»ò9!!ãÇsüøqzöìÉË/¿¬ÑWGÅëV’2ÿLLœpqyNã ®ŠŠ4êëKJë[ͳÖücôèBCCÑÓÓS–ƒ!!!*üš “I¸ys{óþcCW®\¡k×®²üé 建ú/>>wwwtuu>|8ëׯgýúõ|öÙg*÷EGGcccCxxx»êOMêߎà¯ý+óçÏgôèÑܼyw‡ˆ+V°|ùræÎˈ#ð÷÷gíÚµØÚÚKHHEEEôìÙ³]öqrrÂßߟAƒqãÆ .\H\\ xèí#Mâ×4[³Ÿ¦òÇÝþkË?£££y÷Ýw ¤ªªªÅv@—.]°´´¤®®Ž±cÇ’ðHü³#Ú§O‚~O;÷“¿¢üh‹ˆˆÆ‡££#M¿p;yòdÌÍÍ5òŸ††ÒÒÒTvDø#iii”””P__OZZZ»ä£FbÔ¨Q888 “)ÚÇ)))üüóÏìÚµ‹²2EûX"‘°}ûöVÓК|üøñŒ7ކ†¾úênûvöìÙ¬X±‚šEû6))‰ØØXbccqrrâ¹çžSNp©Ó¯­þ©&õσúŸ:4­4EãY!‹>èëP|¨]s]´ µ)þ¥Ëþ–ˆôEjå÷’·#Ò˜Òv…ŠÕ ÓÜHîÖ\>ÀÔÛ”¼yBNvÆ=qœéÈÕeWU~7r6Âçc_I$og—^"}E:Þx7ïŒOw kX×v…‡ŒO3HZDÐÞ å¤æ½Ôf×R}­šâƒÅdn̤ۘn*r3_3ºëFúªæƒ<Dg#Ï’÷]½W÷ÆçcmS^¼IŽy€ù}ÙÖÔË”S!ÜN¹MÜȸV'·Ú²€¼IέS·(ü±P¹:RßZi½â‹‡³“ÎreɤuŠÿõºêil¿ÖP—ÿ+hªiÂv´-•Hë¤ØŽ²¥ü|y³É­–ô«/¬§©¦ «!w¿øÐ6ÒVêð¤ù‡y€¹ÊŠÄŽÀÛÂ’Äg'r©¢Œ¡¿üÜêäÖ,7FtW]:îbjÊgÁÌŒaëͼzæK/^àߪܷ&õ2sâc94b$ïú6?ç"³¦Š´Ê ~ÊËa]Z*ãTä–VLvræ½äæ“Óço•2ðÐOŒ>v˜o2®ó¯þA|¬±þW++h’Éè×EX•û´Óת+ÉåOÖDçñãÇñôôÄÖÖ–—_~33³f[ õïߟ3f´¸õ&TUUqñâEþýï³yóf^zé¥'B÷3gÎPUUETTåååÔÖÖIllì#ÜíìñŸ8q‚›7o²iÓ¦6ïklTÔ ºº¦ð› ¤ÒzìíÃ[}ÖÎÎŽääd^yåvìØAZZFFFŠº¯" --¬¬ú)ï·± ¦¾^¬œÜú#VV}HÊ‘HÊÈÍý+«¾˜›ß”vs›Icc ……Çïm½PPp”£GÇ“’ò¡¡Š/‰³²²ðñ¹[ßP\\L}}ýï«ÕäüöÛ‹ìØá ¼¾ûÎF9¹wWpݹîÜú#2™‘H³ô)hiéЭÛ6ïkjR|œ££c¤6L™L†¶¶öc‹_.—¡¥¥Ý.?ml¬FW×L£{ïõäädtttxæ™g:,ý-q'¿ÍÌÌ:UùÓÙËWUkä×_å»ï¾k¶Eb¯^½˜?>¯½öÚW››Kbb"^^^*ƒ{|óÍ7Œ;–M›61mÚ4-ZÄ–-[”ŸcÇŽÅÔÔwwwzôPlýîì쌡¡¡ZûäææRUUEDDÄݾ¶±±r`ôaÓžø[Ë߶짉üIhÿ©óÏèèh&OžÌ¹sçX½zuóñŒ ®\¹Â®]»øðÙ6mÚ#ñÏŽjŸ>Nýžv$wùqãÆ ´µµñókûLouþsgµ ©©iËcxÕÕm¶ Z“§¥¥)'tïŒX,VNn=IIIÈår^|ñE”—M«yÐRûQ~­õOÛSÿ¼úê«-nͯ©ÿµö¼&õ¿€@{P™y*ú¹ˆ˜À.-º„\&'&0†óÏ+¶yÐÒÑbÐáAT]­"6,–ø‘ñ˜x˜à¿Á_#¹²SÕDþ®| TÝVÝó¥1¥¤­HcàÑ6ÒÆíïn¤.Måvòm죄}:; ›‘6T]­R®¢¹CmV-^¸€ÏÇ>„œ a𯃱~ÆšsSΩܧcªƒ}”=Ý'toWø÷Rs£F9‚¡£¡b•`yÁûƒ =ÊÀŸbìjÌ™‰ªK¨=—y’¹!S¹"ð^<Þô ø@0¡ñ¡ ¦±²‘ôéÛFÖ #uY*¾k}1tlÿù0Þz#ÒðßÂÎ…v.ŒÁGkl¿^ïôbÐÁA„œ !pW ·Iœ­Ø¢F¯‹^³‰$¹T޼IŽž•žÆök uù/o’?2S/S†Æ eÐáAT_«&y~²fúÉáô˜Ó»34f(CŽ œŸqþ‰ó®!]qzÉ©ÕIÚûåÓÑióõ RÆG’2>’¸QãTî1ÕÕeFOW"T¿°¹YUEÔÉc¬ æâ³“85êY"ììsüp³x®Ý®TN ];‘Æ&H¤RÊ$Ž…áÒ¸É »©G~QyveŸ~üûj ·$Í·~\æ×‡cI~v1c©hh`YÒõ—Ȥ,ILà¿ÓÃØD(ŒŸR†uëÎ\÷^,¹pî‘Æ;}útÄb1;vì@[[±X̉'”òM›6‘ššÊÖ­[ihhÀÖÖ¶ÙŸ~ú)«V­jñËÞ¶Â×ÖÖV†_PPÀ… (--m³#𨽼¼ð÷÷'33“ÔÔT®\¹Bdd¤¿†lÞ¼¹\Nhh(o¾ù&r¹œW^yE)wuueß¾}$''#‘H(..fëÖ­ÊI(E§¶ãÇ# \Ãôéy<óÌE»º©–;{ ‘T0zô ¦NÍfÊ”ë ¶Pœg•žžŽ¯¯/Û¶mcÉ’%,]º”’’ìì쨮Îâûïqs›ÅÔ©YDF^E.—²w¯êîî/2yr*QQugïÞÞ”•%³w¯7~~o1uj6‘‘阘8³{·R©‘H>d„ LŸžÏäÉWèÒÅŸC‡†Š .WWWV¯^MYYùùùxyyáææö{Ç=‡;±± fÒ¤ËLŸžÇøñ ô쥒¾ & —ËU®;Ûµ<ÕÕ9|ÿ}Æ2eÊu¦MËÅÆ&˜ÒRÕúM*­çäÉ™¯û=vwˆÿ=îøïô|NAÁ¢¢2ˆŠÊPú—:ÿÈÌÌÄØØ˜I“&Q^^N]]!!!ͶÁyÐô7440bÄ6nÜH}}=GíåOg(_ÕÕ¯Ÿ|ò —/_&//øøxÊ˲Փ&M"))I¹ÊàšÔŸêâP¶lÙ‚¾¾>?üðb±±XLzº¢ÿpíÚ5FŒÁ·ß~K^^iiiŒ7Žà`Å`\¿~]yegg+Ëź߷ønË>r¹___åÀâõëבÉd„……=’üÓ$~uùÛ–ý4‘? í¿Öüó^®^½ª´SNN...ÔÕÕQZZÊÅ‹)(( 11OOO•õ‡éŸÙ>}\ú=íŠò£-nÞ¼‰‡‡ûÛßÈÍÍ%!!AY6ûOCC‘‘‘¬Y³†¼¼<öìÙ£"ÿüóÏ9räddd°sçNäYYY8;;3kÖ,²²²¸zõ*R©T僬!''GGG‚ƒƒ•edBBQQQí G~­õO5©@±Cœ9s˜9sf»ýOÝóšÔÿíA‹ß÷»;&X£ÓéutœåH÷ Ý›Mºu4Ý èóEªÒª¸²øJ§³£ïZ_ªR«ÈÚ”%øÇ=èëÐ÷«¾4ÜjàÒÂKÈeOU2Û̓H§žŒmaÒ¬#±34âCÂH©,gá¹ÓÎŽ‚“RQÎÒS…ŠéLttÙ>t·$õÌ=sŠFÙŸëýZ°`3gÎTé˜ t&NLæòåÉÈØ*C@ðNɶmÛHJJâã?ôüSà1°nÝ:ŒUÎàú§š¢œà*ˆ)XC@@@à!ðÂráÀL?/õ%¼€€€€€€€€€€€€€€€€€@G"jÏÍ}'žä»ý÷¼«q=¿%ÜrFþ¶ò2sßMê°ð4ÉßΔ?m?MøäËôCI [ä=*òŠêè?é$ÿ÷^òŸ*¿*n72`òIž{ý<÷¹zêÙ¹g°|»Á‡ñyì‰Öwñâż÷Þ{­ûÒ'Ÿ0oÞ¼ó…^`çÎʃ”ÿˆµµµ°­Ä}âììÌ‘#G”WG瀀€€€€€€€€€€€€€€€ÀÓ†èIKÐöýy|ôÅõ‡vNaýçeœB~Åqè¯ÍäSçÙ¹gˆM¸Å×{sèv„C'‹;,ü•ÿ¹FïÑÇÙ¼ˆM;³±r˜ƒí¿³çÏ“Àÿ[ÂÐçNñùö,bnq«¢ùDÔ¦Ùôx»Á‡)·ïæyÏ9³ýßý±î¢÷Xô;SLèóqü°!Ïÿéß.ý ÅõØ >̹Kå¤\¯"åzâö@Ý’ýÞú8•]‡ Øü}6+ÿs €Å¦°ö« åsfº$ì eâˆîxD£¨äþ¿þÇBO âF’vxøŸÖOÃÃÃéÑ£›6mêÐpwïÞÍ›o¾Iyyy‹òÑ£G?Òƒ»;YYY„‡‡NLLŒ`?àääĆ ((( °°ð¾ÂX»v-ñññÌŸ?Ÿ¬¬¬”²!C†PPPÀúõë fâĉDGGàîîŽX,&$$-ZDQQ“'O~âì4oÞ<’““‹ÅØÙÙ Ž# ðT£2Áå9ò?Ÿ¸;áÒÒ —ò9x²˜­?æÑ+âŸ|yCãçûN<É’R8u¡Œ/vfã0ôW•ûÓnVSZÞ@]ƒŒ´›Õ¤Ý¬&+¯¶]ék Çn†¬{Ï—o>êÛL–‘Séó·X¿Ü¡¬xi²ÿ\äÉòÏÒ;$ü´›Õlø.“ƒ›òÝþ<ŠK%üëþ¶Ró3œ¦.:Oèó§øùD1;~Î'öB™ŠüÕ¥IŒx1ž£ñ%;]Âàé±¼û¯«Jù¼eÉL|íq‰e\L­dס‚'(›ä¼°8‘±sÏP]Û¤qþÌ}7‰AÓb9SÌ×{sp~”M;³Uòÿí5©œºPƆm™8‡á«=9ë_\*áp¬˜ÄÔJö.À#ü˜2ü=‡ 4-–‹©•FþÆÂ—ùéX=B¥âv£Fö5û4‰)TÕ4±þ™>%ÆÌXG)—4È<=wgcö®Ю­±Qa³ÔU<3+Žä´ÛÍîQ—?êì«IƒŒùË“ù棾8v7l&W§V~-f&:ØÛâéj‚·»)v6튿5ûéèhQYÕHeu"m7ï,#Yóúˮ͙6ÖžùÏ÷d~ô¥GZXþx´žÃްó@>§/–qêü-N_,Óøý³²²bРAxzz2|øp~üñG•ô>úˆ/¿ü’FEŸ>}ZL‡žž .díÚµÈ~?§èµ×^ã7ÞÀÒÒ6nÜHHHÆ ãÀŒ9???úô郟Ÿßïö×ÁÙÙ6mÚ„‡‡G³x±°°@OOgggœUØ—-[ÆÆ "00¯¿þš¿þõ¯ÛwÙ²e¬]»–€€<== ÇÚÚZ)ß¾}; .$ €iÓ¦qðàA&L˜ ±}ÛÒ_“øT?¶ÉÍÍeþüù-@« GŽ¡ÿþ˜™™±páBFEUUöööìÝ»—)S¦ð—¿ü…Ó§O³oß>å×nܸAjj*)))ÔÔÔ››«qüÉÉÉ|ôÑG :”¿üå/äåå1gΕ{|}}‹Åäææ¢¥¥Õ.ýôõõ9sæ ×®]câĉ‚Ã:í}`úX{Æ„Úàåj¸ygyq²]-5[‘àeÎ~]Ò¯ 9µì<ϳÃáyº˜ÐÕRC=ž.&÷¥Ð°™q¤gV0k¢#.î­”µ5žäêd̶Oúñì«g)¿­Xµbj¬ƒu}ãn+üÒ2 6]õÙí¾¾ˆ3IåT×6Q/‘b ¯ÝfúùMÌ™‹edŸŒPÆs&©Œš:ÅÙ>ûñó‰bôtE¼òŽbÒO|µ'‡w^óÀØP›—#xéÍD˜ÂÌ Ìšàˆ©±ª üs}:«?¿Nü÷C›ÉÚÊŸ_O‰9+&+&‘H‘@o73&¼v–ÈQÝéb®ðß^fÊüïïkÁÄ×Î1aD7¥¼­ü«“HÙq Ÿó—+ÐÑÖÂ@_ĉ³¥ÌÖ3cúô6§¯·9ö¶ŒÞ7Þ¿BFn %·Ú´_Na—Òo»}®NƬÿ_&!3NqzWÅ·$„=GÌÖÁØvÕW™ØÓ]]…ÍÊ*[ßš°­üÑÔ¾mqåÚm›äùY4“©Ó ¸OÒ§±IÎñÓ¥,\q™Ï÷ä/³zª[ýV¾î@umaÏÇñúË®¬øÏ5¶ý”Ç+ý•ïÇ‚ûtá?[3y©¯'bÚXûf¿«{ÿ@1@=räH¼½½‘J¥4440`ÀöîÝËàÁƒñóócôèÑÈårÅ»âë‹¡aó‰È¿üå/$%%§üíÒ¥K¼ôÒKðí·ßRTTÄ‚ èÙ³'IIw?hlläðáÃÍÂljj"++ ssóVuÏÊÊ¢¢¢‚††²²²Td!!!„„„ÐØØÈòåË/µ?~<›7o¦®®N­m÷íÛÇ?ÿùO^ýu8ÀÏ?ÿLm­ªŸ\¿~¤¤$’’’HIIaíÚµÄÄÄPYYÙ¦}Õé¯.þŽÐO mîøýýàää„¿¿?ƒ âÆ ÅG7 .$..Žг§¢ŒJMMU>ãííÍÞ½{8pàÝv€«+]ºtÁÒÒ’ºº:ÆŽKBB‚Æé¸té±±±ÄÆÆ’Àþýûùá‡(+SL„_¾|›vëgkkKll,!!!)õxÚQ™ÁènmÀµ¬jÀV£‡cÏßÂÆJ_9¹ÕÞçE"-¤2ÕA-c*«›Z¼_“ðOl|߯6°+WàÐÉb^y7©ÅÕX›¿ÏÆÞրѡ¶‡ÐScvÿRÀ Ø{¸€!ýº¨ Þ·–þÞî¦4IåÄ]¸ÅþVÍäþ^æhiÁ–úðÌÀ®-†10ÀR¹-[“T±JË@_Ä–ÕwWм÷—^ôémΠ©±ŒÞUoxi”?=Mh’ÊIL©¤¿¯båLr6Vú­N¾$]½¥¹®Š¼5ý+n72hj,»Ö à«éýçútÒnV7»·¥­÷ÔÙϱ›!¦Æ:‰+QNðÔÔ5ad¤xE ôDìßDUMU5Mä+VVeå×ba¦‹¡¶Fþaú{xU5MíÊŸû±ïññ0CWG‹³ÉåÍl Nÿ{ÑÕÑ"|°53ÆÙsðdq³ ®–ô×Ä~7²kxîõóÄl̨ÙgØóŸlû)Íßç4‹ãÜ¥rúùX<1©º÷ÏÔÔˆo¾ù†Å‹+'HæÍ›‡³³3hkkÀÅ‹[§wïÞŒ5ŠiÓ¦©ü~úôiÞ}÷]¢££ùàƒðóócÕªU¤¤¤pûömõ¨©©ÀÈȨEymm-ÆÆÆÍ~¿vír¹œèèhÎ;w_6¼|ù2“&M@[[›•+W"‘Hš­²¹C¯^½¸}û6•••˜šš¶iß¿#ôè^}õUòòò8xð ò·ÜÜ\ªªªˆˆˆPNp+ýùÔ©Sddd°jÕ*,X (Çtu±´´TYI•‘‘AAAW®\ÁÀÀ€wÞy§UÿSGŸ>}(//WNnµ•~uH$ÆŽ‹©©)¦¦¦ØÛ+&Ù)//&XžZT¶(<°y Yyµ¸?Šëð£œM.'ÀëîýCúuáãM7èú+ý&ÄÔX‡¤ŸÂ4~^^æÌˆAÖôŠ8F¯ˆcÌxãB‡…¿ó`>vƒóüÿ»€T&ÇnðaF¼¯”ÿß²düž=Á‹KÑÓ‘j$Aþ–*aÜ®nbËž¾ÛŸß®ðuu´¸|`—Ònã>â(~ÏžÀÛÝŒï?Ól«;§î†dÁ¡ßÄxŽç°#GýÆî_ ”a¼½&•>bèú+}'Ä`i®Ë¿Þöi——«)— ÃÅÑ—gŽ’™[«6JÓnªòIDATœí¸qlÛ~ÊÃmøQ|Çž@[¤¥âßþ‹ß³'èqŒBq=—~¦‘þfºýfk·dà6ü(=‡aÿñ"¼ÝM;Ä~ZZpñ§0Ò2ªð?†çÈcˆDZûf榺¸õ0V^=ì •zß;¹Õ–€b%×÷ŸögÉG)8‡aê¢óå¦öm }=ë—û1óï‰*yª‰þ 8ëŽo }îfºìÿ"H£÷Cý,æõ÷¯pnO(&F:¬|Ý“ùË/‘p©œ—§8©„õë)1뾽Ɇh¿'¦ U÷þUUU1oÞ¤B!fP\\Šy”‹ƒXÊ[Zí0H 15ýsÈçwº—{Îùq9Ë—ó»3331==Õj5æææ®Ü___íííÈó<ò<ÙÙÙËùF¹\ŽÕÕÕ¨V«Q©T¢¿¿ÿÚcONNF–eQ«Õ"˲8;;‹………+Ï ÅÚÚZäy1<<|­úÞtüO±>Þott4Š¢ˆ,Ë¢T*EQ±¹¹yu¹};&&&Þicxqqår9º»»ãðð0FœŸŸÇƒo÷Ǿ¾¾¨×ë±µµÇÇDZ´´õz=Z­V´Z­899‰ÝÝÝh6›±³³]]]ÑÛÛûQk‹ýýý888ˆÎÎÎèéé¹Öü?äôô4Æåõúõ›Ö´GGGÂ-à³Öo:iEó—oUƒÔ×O~Ž'¾Š§C÷ã?tük+žüð*îw}yåôÞÿÝo¿ÿ¾wï|+?õÆ­[íýŽGß½Œ‡ßÜgïE{{Ûµ[«ÞÔóÞø###100ãããŸåw»²²•J%jµZ’ó/•J—- §¦¦¢ÙlÆââbsßØØ°q~ÀÞÞ^ÌÏÏÇòò²büK.®¢(Þûàßùo|jíJ@J\$EÀ@R\$EÀ@R\$EÀ@RÚ"âBH…\$EÀ@R\$EÀ@R\$EÀ@R\$EÀ@Rþ»vo  ÑDIEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/bitcoin.png0000664000175000017500000000506314152763504020537 0ustar arvidarvid‰PNG  IHDR¾¾"Ê úIDATxÚí=OM†Í«G"T@°É(ÂG‰ø¨\‡’2 ¤@tùq~‚É ‹RD²RÒòÑ™*¹ 6Žd [³U’Š·yeÍsöõY3ks]ÝÄÞ³³ã;ì½³sÎ Üßß'ìùCH @:H @:€t @:€té @:€téü‹{:ÙÏ««+óÔGGGñ]µ~ttß°ˆàWWWå×ç¯päHú™<Æ:==M¥R¾¢ÍÎÎúuÙfóãÇfsggg||¼Ù\[[3¿?22¢Ñôa) oß¾}pÏ]¨V«étºŸ°ÄC#~Ÿ°bí¹Ë³aä–Ç!õœàuéÀ“³É‚ƒƒƒ‹‹ ó¶:00ÐêË ›››íN6ÝÉîïï?þ¼Ù|õêÕÒÒR³Y,•®ê=) _¿~m6———­<¸Õ¨Š¦í¨öŠMÎåríw#—ËuÑÉ „uÆ6ÜU1úkH'ë2ªØdÀëÒlò£¡R©\^^6›/^¼˜™™i6ƒ øþý»pJ´|>ÿéÓ§fóììL8zóðd2)?991›ëëëʹDpÑs¤;år9“ɘ?­ùÜÝݽ|ùRøAýç4›>|ºÑVç ¤Òá†Hàub$™Lš“cº ‰©³Ÿ?šÍéééöÏU«ÕÌÃÃÓâVÓt»»»óóóŠéF:ñ²´´d¾+Œg³Yó_Äm5¿¹¼Æ*Úöö¶nº¹a^éÀãð:‹‹‹íûÇÅÅÅN^¶pÍFCq²‚F£±··÷àS×ëuóìÃÃÃÃÃÃrTéÚäN.ºp\á«ÿÒ¬M¼Ò¤ý.ÙÙÙèç:>>6¿|||l~Z©TD4+žH$”à‘ˆSomm¹$zR¿ µüÕ¤Hô3N/":YønrrRù4ŸÏŸŸŸ7›©TÊ¥o"µ´\.›É£¿~ýß×SKõà"ûsrr²ÃåÎýãDN‰LÐÔŸ°¬ÎÕΰû~„àué@ÿÛd‘õ¸ººj.=)‹···¦©2çˆÇÆÆÌÅÅá|Ͱ'S22ÏÎÎÌÔ¸R©¤gd ûR.—Í\RiÀ@¡P0ƒ‹ ‰Ì[ÕsIÅ ëÑÂc¨Ñ&ë~P_§Y¿CG¯cb{™V) ~q\¯£W`‰Ul2àué@ß3à²ÁŒð\WWW¦G+‹777m^«ÕÞ¼y£8YýpqµZMä݉…Âê]Ü/¹\nuuµÕ…$þ_ò¡rásssæOP©Tô…NÛ ukå¹£ƒ³-\írÕŽ³É¶Jr©çíw±É€×¤}€Ól²˜jÿØpHÐö°V«y >11188ØêË¢ K$ÂSg³ÙÑÑÑf³T*™u ©V«æ°è¹¤™LÆiúØ£QŠ««pÜž³wöÔ±µÉú8›l[,› x@:€tà Ó±Ùd¿û»øµÉCÇ Å88Îàc“ @:=f“¶8:¦ðù]eáqG¿›¨û>Æ&7,@:€tà ásY{6›57šßÙÙo6ƒ ¸»»kjhhÈür"‘¨T*f³P(T«Õfsyyynn®ýhQÖD,ÒƒW«Õt:-WÎU¯×ÿþÝlŽŒŒ(KjêõúçÏŸÍyýúµ\–F£qxxØê2‰Äû÷ï{â ËêËÇ竞û­ÖkAu²?¯H s6ùË—/ÍæÚÚšéŦö¢HJQåDO‹Œ,5¾Ç›Í|>o.5×76‚àÛ·oÊ8„Ï%ò5•æõõµž·ªgŠÎ„£éãÐ5›ìw½ŽÜoög¬ï bÅêý 6ð:€tà â”ý©Wä¥ý_P&ÛaccceeåÁÑDW3™Œòôàˆpô¢Pa¢â2ÞˆoÂ×ïR+'ë,jwSKý.ïÇ&^`“-»·7 1Íj~:55eV*yöì™X&!ꘈúFóŽXl·­Ѭ‚ etD–d2©|ùïß¿¢¸ÌôôtOØd—õ~‹ƒÄºèÂïâÛ§²?¯Hé@GèÍýf=ê+:üÎÿ:þ@VÛÿ0› ܰéÒèˆM¡:Y$ű«Vß¶»Cê=÷;~3±ÉÀ  €ÿá´^G¼ÄŸœœlÿØl6ûîÝ»f3¼!’¼X,*å?677•³‹")[[[Íf¹\6¿pqq¡ô<M°¿¿oÖŽÑür>Ÿ???o5á ,]+’Ò;ï lŸSb}rÁo{õ:€×¤Ød'ŠÅâíím+ëšøwb¢X€ÝNY%šØÅ¾T*‰+ŽþÃÌ /׳?­ˆì¹‡R©Ô5íôHbbd¾¦Í1[ÖªK/×LÁ&^@Œ6Y”è•GFFFlýŠi'Í)ÔD"±»»»½½­«;Ù¹¹9— ,âBDY݃G¢GÓM÷õõuÚä.®c×ía‡ë˜ÄZÖÄq‘<6ð:€t›l^jÄ¥fbbbpp°Õ§»»»óóóÍæââ¢Õ…T«UERDåQ;¦T*)>׶މ(’"h4{{{æÃÁúúzO¥Nj¼“¾ŽÑ\RK#'|­Š¤DV¢Á&^ €ø¥ãwNÖêÔ™LfÀÀ|¬x"š ÜãÓÃÌÌŒU´ÙÙY³ob$-›ÍòW¸aÒ¤ÐÿÄúààÀÌtÔ_5Dæk ÖÖÖ”åÌá\R‘ iµºP(˜;hžœœèïL¬R*E¾fä }Ñ»-¼kÙŸú–ÕÊ’îÖ×qYd;¤Û¯*æ_ŸàuéÀS·É±âX$ÅÊÑGI± ®I‰ ¾¿¿oNgŸžž¦R©6{R­VÓéôS—ÎÍÍ2­žË嬤óãÇ3ïXgtttff¦[ÁÅ®T*eÕnX€×¤Øä~ \jDLĉOWVV”’+‘ERô^QÇDO÷Ô7ïL„RlËåòååe+ƒ?66¶´´×(?ÒÙdÇ^«à‘«Ü­zâ· :µ¯H k6Yd=F~Ù*x2™ôXóAdŠüËz½næw†w±=i°Dj©È‚ÕyjjÊ<¼Ñhø,”ѱMz9¸¶Xm²Ë8ý x@:>m²0›~‹¤‚ ‚ ÙeMÂ¥FtôR#º÷´¥V«™‡;ŽC½^ÿóçO«qˆ—¾,’b[ÀÛÅ{v«½?±É€×¤€tà ôÔN*À_@:H @:€t @:€t @:€té @:€tà±ò_êà3Öùø,FIEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/write_disk_buffers.diagram0000664000175000017500000000220414152763504023602 0ustar arvidarvid "decrypt in place" "move buffer ref." +------------------+ "(no copy)" +--------------+ "(no copy)" +----------------+ | "receive buffer" +--=------------>| "plain text" +--=------------->| "store buffer" | +------------------+ | "buffer" | +------+---------+ ^ +--------------+ | | "read() on socket" "write() to file" | | "(copy)" "(copy)" | ---=----|---------------------------------=---------------------------------|--=---- | "kernel space" memcpy() into | | mmap v +-------+---------+ +---------------------+ | "socket kernel" | | "kernel page cache" | | "buffer" | | | +-----------------+ +---------------------+ libtorrent-rasterbar-2.0.5/docs/img/read_disk_buffers.png0000664000175000017500000002026314152763504022550 0ustar arvidarvid‰PNG  IHDRs£¯ýП zIDATxœíÝ}LwþÀñïXõº ¢<(Ú¥¢È“¬VD¶I± #M­&ÐØ*=ÔÔ¶š^/¥ÞEï|È%jƒ¹ÄÐô¢mÚœõášKõð Ú(¦€¥Õn(U<‘Ýuå¡b­ÙÎïÉñ£3»°ÀÀû~ýµ;;ßï|g™ù쇙ÝÏW’eYC6ÁßÀ8Af }Y@d–Й%ôAf }Y@d–Й%ôAf‰±êøñãEEEþE_vîÜùç?ÿÙߣ—.QbÕªU’$mÞ¼Y—!ã™%ƪõë×úé§}¬`·Û_{íµVXXXhh¨ŒW>žÝýF _œ9s¦¢¢bˆƒÌÃèàÁƒ‘‘‘AAAùùù<BìÞ½{úô饥¥Bˆ»w獵§gggoÚ´IqèС}ûö)Í÷ïßèÐ!=/^¼X’¤ž«wïÞÍÌÌ\±b…ÑhTÞ¿?::úرc’$åää(«©¶®¥2Œˆˆˆ˜˜˜²²2oKrssOœ8a2™ ƒÍfS†††öÎ,÷ìÙ\\\<¨·ÕTç…ö¬žb‚êÜÑFíYéñìÖê7JhyŒ*?^½zµÑh ?|ø°·ýÒF PÈÀ𨭭MII¹sçNÏ’k×®%%%577Ûl¶¤¤¤ÚÚZ›Íf0êëëN§Ùl®««ëììœ?þãÇÝnwjjêÏ?ÿì­ÿ‹/*m6Û“O>yùòå{÷îEEE9Y–+++7lØÐÇÖµ}jÇsýúõ´´4‡Ãát:ÓÓÓ›šš´KdYÞºuëÒ¥Kº»»Ýn·ÇÇÇÇ744 æ­F=íy¡=+µ1AÖœ;Ú =+eÍÙíM¿QBÅã¶dY®¨¨())Q­lµZgÏž-{Šu£ &ú;³Å¸ÕØØ˜••5kÖ,Õ’™3g !233oݺ=oÞ¼ÔÔT!DFFFssóÂ… óóóOŸ>üüóχ„„ø¸¹ùóç[,!Äœ9sººº¼§÷ÖŸyæíjªñüúë¯555‘‘‘Ê«õõõ²,«–ÄÆÆNš4©¤¤$>>¾–———––:Ž‚‚‚íÛ·û¸_À˜ÐØØ¨:/ÒÓÓUg¥6&!TçNpp°*tuui£ÄàÙo”š ÝÖƒŠŠŠ*++»ºº¢££…—X§ƒ30æp7Ã%!!¡ªªª¥¥¥gÉܹs«ªª‡Íf»téRbb¢¢±±Ñjµ¶µµUWW›L&!Ä›o¾ùá‡9rä­·Þò}sO<ñ„j‰$Iv»Ýårµ¶¶zÛº–j<ñññ‹Åét*ÿŠåççk—( ûM‚³³³OžýôÓ{>sæŒ$IYYYŸ}ö™$I»víò¸ZJJÊíÛ·§L™¢|ËãÖµTãIJJ*((HNN Z»v­ËåÒ.ñåÝp¹\yyyƒ!22rÉ’%QQQ¾´Æ _Î mLðØ•6h£„êìÖò1Jh©¶uüøqI’rssËËË%I:pà@FFFKKK\\\MMMbbbqq±v¿%€ñA’eÙßc@à²ÛíkÖ¬¹råJï…N§sݺuûöíSî[ù}<F’*ŒäYI†Žk–]~øá‡ØØØÌÌÌ‘O+øë¸f }pÍ£—Åb±ÛíÚåv»ÝÇë;wîœ:uªÁ`øâ‹/¼- —¶¶¶¥K—Þ¿ßßB‡Ã‘‘‘áíÛœ† U‡0n¹Ýî>úÈjµFDDx[@Gï¿ÿþ;ï¼3JίÈÈÈ·ß~»´´ôÈ‘#þ @¸f‰a¤uÆ—Y:^ýõeË–)SYxôèÑ£åË—‡„„(=÷¾Š™™™ÙÔÔtêÔ©‰':Ž˜˜˜É“'WWWk—hÇ#¼Ì¦ _><þ|AAòÔãÙÝïöîÝ{ðàÁÖÖÖޮǙ{îÝ»÷ÁìÝ»w„¸Ñ’Y?~¼§,ÅàP=@”ÓUÂÂÂ.]º>¬[‰ŠŠR]°LJJêêêúË_þÒ{áŒ3®\¹Â—,1DÞ‚ ¼-•Òׯ_¿~ýúØÕ³ô Èn·¿÷Þ{Gõ÷@Ƨ!]³ÔÖ”ÖÖÖÖ¼Õ®³xñbI’z®Y0é |9ñµ…êdÔÖÌ×ÖÕ¿ÿ~ttô±cÇ$IÊÉÉñ¸uá[g½‹[ŠNWÕ”ÖÖÖÖ¼õX›Z–å‹/*ÛÚÚž~úi—ËÕÝÝ={öìŸþÙ[«Þ¨ž=2z`üñ@z^Po”ÓÍ8ßÑ7½¢/'¾6£5'£¶f¾¶®¾,Ë•••6lècë¾™€2 P0¤»áªšÒÚºÓÝÝÝÚš·ÚÚÔªnCCCsrrþõ¯ýòË/ùùù!!!¾´TÏ)¿Eå`‡ðóOÊérœïðÑP¢/'¾¶Š¾Ðä!ÁÁÁªšù]]]Úºúýn]áKGCýžeïšÒÚºÓõõõªš·ÞjS«lÛ¶íøCww÷?þñß[Q={d %À¸1ôœRA9ýQŽóýz4ðåÄ×VÑW¨NFmÍ|m]}I’ìv»Ëåzøðaxx¸vë555¾x¤çoõu§µ5oµëœ9sF’¤¬¬¬Ï>ûL’¤]»v !Ìf³Ûíž6mšò¿‚/­©ž Œ åûU=·H†‚rúÀ˜¦W4ðåDÓf»ÒÖÌ×ÖÕOII¹}ûö”)S”ïYj·îK7TJÇÀp2_®Lp„Œ'ü5áͨªšùëêc ¨”`XèrÀ80:£Çšùa\³ÄÀp o!ã M ÇϸÁ5K@˜Žkô-sðøÓqéˆk–ÀϘŽkÜàš%ð³O>ùäêÕ«=5Ïoܸqúôé7nL˜0!//oÍš5¿ûÝïjjj*++çÌ™c6›ïÝ»×ÒÒR]]ÝÔÔd·Û—,Yâ­çüñ“O>™5kÖ²eË®]»Ö{ÒÅK/½ÔÙÙi±XzWºU-ÑŽ'666..®¬¬ì«¯¾2™L“&MÒû-«È,€Ÿ1׸ÁÝpàgÙÙÙ'OžÔ•Ò%IòË8Œ„ ¢A¢"ôÁÝpèƒÌú ³€>1³ä ÅŒZ|Li˜Y`8\f©ü'ÄÿCº ¸ÌÃ$@3KY–¹l  ¯Í, »ÀÊ,%éÿçâ²%€¾+³Àð ¬ÌR5I:s¦è(°2K 2KèƒÌrØY,»Ý®ö=""B‰³»wï^µjÕÌ™3ÿøÇ?†„„|ýõ×>ö¼xñbI’ú¾œ ÚwB¤¥¥õŽuiiiÂS°R™û÷ïGGG;vL’¤œœe¡6È "xzìY*=Ú³gOhhhpppqq±·VŒŒŒ ÊÏÏïÙk!D]]]NNŽr%UµÇŒOràè^oݺuéÒ¥ ÝÝÝn·ûúõëiii‡Ãét¦§§755õ¬iµZgÏž-Ër]]]jjjkkëõë׃‚‚l6›,Ë.\xùå—µý¿øâ‹/^ô¶õÎÎΔ””>ÆsíÚµ¤¤¤ææf›Í–””T[[û׿þuÇŽúÓŸ6oÞ\VVö·¿ýÍÇžeY¾xñbaaaï%%%%Êã>ö@ Û°aÃåË—ÿûßoÙ²å믿~õÕWeM°RÖT™ÊÊÊ 6ô<õdûì3I’víÚuüøqI’rssËËË%I:pà€vß=lã‰ÙlþꫯV­Z•››{ñâÅ h×Ñ!DJJÊíÛ·§L™¢|ûÐc\ðTõìK¨t¹\yyyƒ!22rÉ’%QQQÚVf³¹°°0--Íh4®\¹²'å¶lÙò /ôþúçŸ~áÂ…#GŽøe<0&<Š?¦1tøÇóã!ÛÖÖ¶zõêÿûßáááBˆ{÷î­^½ú?ÿùÏ@ï†@@!x2Ë1»á>Qé´°°°K—.)‘Qüï·oºüB¯P©âp8rss¿üòËžà9cÆŒ+W®V£P þ[0ˆ†¶lÙ²|ùò_|Q÷ÁüóŸÿ¬ªªâ†€q€P ]pÍrLãšeÿ´EzµerU¥tïÞ½›žžž¼iÓ&!Ä¡C‡öíÛ§4ß¿ÿ¡C‡”Ç}û´ìv»ÅbQgff655 Oåµå¦µe«µTýhdóhÏ*ê B%!²é@÷ZU¤W[&W[J×f³ †úúz§Ói6›ëêê:;;çÏŸÿøñc·ÛššúóÏ?÷4ï»Ø/ b³Ù222”ÇÏ=÷Ü­[·dMyg…š=–­VQõ£=’{^ê™@{FPQ?0*¡—ÀLNÆ *¥÷OU¤W)œÛ»L®¶”nttô¼yóRSS…ÍÍÍ .ÌÏÏ?}útppðóÏ?ß»ÆÛ@+¥=Ün·ò@[ÞY[¨Ù—²Õª~„ª#9..N5/€Ç3‚2шP @p7ܪ"½Ú2¹ ð666Z­Ö¶¶¶êêj“É$„xóÍ7?üðÃ#G޼õÖ[½ûD¥t2ƒÁÐÜÜÜÑÑñí·ß~ÿý÷ÊBUygo5íû-[­êGhŽdí¼Ú3‚Šú‰P @YúBU¤W[&×c^“É´qãF“É”žžn6›…QQQsæÌ1O?ýtOçò+¥#ÐL:5333**jÛ¶m‹-’eY[Þyp5íµýÍ‘¬@{FPQ?0*~î#m‘Þ¾Ùíö5kÖ\¹r¥÷B§Ó¹nݺ}ûöõüüBP죛Ç#ð†P ]ðÛð1k–>Ù»wïÁƒ‡2Ùë?ü›™™Ù;VÞ»wïƒ>Ø»w¯c?#TÄ øg€Q‹é1k–Й%ôAf }Y@%Iêãå>¾B;L ûh;è†CïÏPÞXÞŸ>öÛ–÷‡÷§†ý¶åýáýé£a¿mGÕû3hcëý øó+~tÀ¨ÅÇô˜ÆÝpèƒÌú ³€>È, 2K`”JLLìîW­Z%IÒæÍ›‡£s@ #³Ι3g***ü= À8Df Œjuuu999íííBˆýû÷GDDÄÄÄ”••)¯æææž8qÂd2 ›Ív÷îÝÌÌÌ+VÆ¢¢"em+_ìÙ³'44488¸¸¸Xq÷îÝôôôìììàààM›6 !?~¼zõj£Ñ~øða¥ÕÁƒ###ƒ‚‚òóó¦Ç´‰þÎlxµqãÆœœœiÓ¦ !kjj"##•—êëëccc'MšTRRßÓdþüù‹E1gΜ®®.­|Ùtyyyii©Ãá(((ؾ}»bÞ¼y©©©BˆŒŒŒæææ¸¸¸¢¢¢ÊÊÊ®®®èèhe„YYY³fÍêédÐ[ŒQÜ F¯ªªªÆÆÆÓ§O !âãã-‹ÓéTþ)ÌÏÏWÖ éÝä‰'žèýÔ[«~eggŸÈ,À¨ I’ÇÇCÈ, 2K0*Ȳ¬\ªä«–c™%ôAf }Y@d–`´P¾^É—,Ç.2KèƒÌŒ"\°ÓÈ, 2KèƒÌúøM{æè„ñÅ&|¾C1µG~“€Q†Ÿï™Zî†@d–Й%ô1¤Ì211±»»[¯¡ô¶jÕ*I’6oÞ<»Ýn±Xü= üF¯¬€ìbL¥×,Ïœ9SQQáïQ=Ùíö×^{Í_['»:d–uuu999íííBˆýû÷GDDÄÄÄ”••)¯æææž8qÂd2 ›Ív÷îÝÌÌÌ+VÆ¢¢"em«~ݽ{7===;;;88xÓ¦MBˆÇ¯^½Úh4†‡‡>|XYmË–-S¦LY±bÅsÏ=×ÔÔäã¶<”ŸŸÿàÁ=«ÖBüòË/Ë—/7¯¾úê ÷ ¿Û³gOhhhpppqq±²d÷îÝÓ§Oˆˆ(--U–h?}d÷ïߎŽ>vì˜$I999}Á/Ùt ÷¢zÚ¯„„„ššš¼¼¼öövY–¯_¿ž––æp8œNgzzzSS“,Ë[·n]ºtiCCCww·Ûí¶ÙlO>ùäåË—ïÝ»åp8<¶’e¹¢¢¢¤¤ÄÛ¦m6›Á`¨¯¯w:f³¹®®®ç%«Õ:{ölY–¿û¤$‡ÃñÍ7ß †[·nyÛVoµµµ)))wîÜѾÔÓ³vÕ~9N_¶…=ö¾hŒohhèyzíÚµ¤¤¤ææf›Í–””T[[ëñ³Ò—¬ ²²rÆ }oÝÙÅø62µêz–µqãÆœœœiÓ¦ !kjj"##•—êëëccc'MšTRRßÓdþüùÊWçÌ™ÓÕÕ展/›ž7o^jjª"##£¹¹9..®¨¨¨²²²««+::ZÑÒÒ’žž>cÆŒ3f¤¤¤x¡ªÛÆÆÆ¬¬¬Y³fõ,yðàªgí:ªýzøðá ÷ ÿ*///--u8Û·oW>õfΜ)„ÈÌ̼uë–ÛíÖ~ ²àÇìC4Ô»áUUU§OŸBÄÇÇ[,§Ó©$­ùùùÊ:!!!½›<ñĽŸzkÕ¯ÆÆF«ÕÚÖÖV]]m2™ÎŸ?ßÙÙyóæÍ³gÏ>zôÈår͘1£®®®£££®®îÆ>n+!!¡ªªª¥¥¥g‰¶gí::îþ•}òäÉsçÎ=z´¥¥eîܹUUU‡Ãf³]ºt)11Ñãç ð!+$Én·»\®ÖÖÖ>àÇìC4ÔÌròäÉüñÞ½{­VkRRRAAArrrPPÐÚµk].—/=h[?~\’¤ÜÜÜòòrI’8ౡÉdÚ¸q£ÉdJOO7›Í---qqq555‰‰‰ÅÅÅ .LII‰‰‰y÷Ýw“““%Iòe„f³¹°°0--Íh4®\¹²½½]Û³v_ök@o,~ár¹òòò Cddä’%K¢¢¢,X°nݺääd³ÙüÊ+¯(<~ö›¤¤¤Ü¾}{Ê”)}ÏÒÙ†H=o¸\³¿ñã?~òÉ'³fÍZ¶lÙµk×¢¢¢T+¼ôÒK‹åûï¿ïY¨ZrãÆÓ§O߸qc„ yyykÖ¬‰‹‹+++ûꫯL&Ó¤I“Fn—0RÈ,ÀoÌ›7oÁ‚B‹ÅÒÜÜÜ;³t»Ý>vâãÜ9g¸~ã§Ÿ~Rf¹»zõªr纹¹¹££ãÛo¿í}‘²o>΃q†Ìü?·ÛÿÆoÄÆÆ>ûì³f³yêÔ©™™™QQQÛ¶m[´h‘•k˜‹.0Q죂 b,õ,0¶Y@d–Й%ôAf }¨+¥K’ä—q€áÃç;Fe î†@d–Й%ôAf }Y@d–Й%ôAf }Y@d–Й%ôAf }Y@ÿÆ–\ž&_½¾IEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/utp_stack.diagram0000664000175000017500000000036314152763504021723 0ustar arvidarvid+------------------------+ | "BitTorrent protocol" | +------------------------+ | "SSL" | +------------+-----------+ | "TCP" | "uTP" | | +-----------+ | | "UDP" | +------------+-----------+ libtorrent-rasterbar-2.0.5/docs/img/troubleshooting_thumb.png0000664000175000017500000013267314152763504023546 0ustar arvidarvid‰PNG  IHDR #`r­dgAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿ‡Ì¿tIMEå  ŒG]€IDATxÚìýyŒY¾à÷}"î~oÞÜ÷dr'«ÈÚ·®ÞûõöÞIo–7#=c4‚alÀ0!Á’/ @š?¼† À† ÿa[‚í‘5’Þ,¯»_wuUWwí{‹;3ÉdîÛͼkÜðL&YÜ‹I²ªîèjæ½7"Ήq~çüÖ ŽuèÐákLÍŒöC¹ò€Þ‡Ýù»ÉzÐ :|½9㤉m »ñ‹à^§„­3_½ÎºØ÷vç;ì&ëé‡Ý‚:ì.m{ÛþkÁ»Q¾áoç,{쯳鄒£Û/9ñ°»Þa—é¾Q´¬ô/’sÔ{ŠÚj²à¨¦×Åò–Är¨*:nÖ´^—ôÚT6‚õÉZ5h^Ù’’¦½ï;"ؾVpoMìð•¡#@:tø†ã¢PÕ~uŸд  mL,ç=Yç=fÖ>ïuØIo›Ð6+킃–L9oÚ° )bÏzWZÛ:BãEG€tèð"m@àï›R7¤âe'W·(-pP,Ôï€=öëÕ#kÔs22"‘XA[Õ˾mS¿9½xÚPßÃî^‡JLjޡÃלSšŽiZS–¹f‡›Ö«¬%J>iI Äš×ýZ.‘·bÁ¡[ì56´•-ùÜ·vç;ì&#z‡ß >·dÖ-+Zh)k*™’wIà{"çe¼á%‘œ×=© –Ò2ˆºEóbi§LÊ»lΠ¶ºnKŠVåº|ìÇ»ÃÒ¡Ã7‚9]êÞѰˆç}dÐ'†5•E†Ðð†.›æ}¢-´â#-yU/ËY÷¶’””Øš@Fì¨KNYµªWE^·¼aŸû¡‡ÝဎéÐáÁ¨MûäT Ø0`Ô1¡A B%-±}Ú†Uõ t˰nĺ@,0 Ò ´´´U=©)#c]YÍ~›êdm>ì.wØu:6¾æœÒp\ˆnĉ8ˆ·m±@Óý‰;ï͸z,ys*zKB¯žµ¦­dÉ ßyØï°›tl :|ÝÉøÌÚöÄc-ó¦ïêÌ›–­[Þ0UʦÒÃîz‡]¦³éÐákN¤rË\X¡ÈE§•=!wWgn:ë²´Q£J;Ò˜\¡x—çë𣓠«C‡o6m—–sDï=¶-»dIÞ˜‘ŽÀøfÑ :|si›uJÆý_2‚¼eÑ%«JÆ ÝÆ’ÒákCG€tèðͤmÎ)¡£î[ú‘†—T”MyØ]ì°ÛtH‡ßñ­˜Rs⾜1tèMMg4ïÀÊ* ½æŸšò8àÁ¬ice{;6˜/IgҡîñkýÊ7œ["¡ö&leÄw8ojËJIí¨vÞ”ÚfMé/Lu雸Ö>÷¬‘»îý²×ÓR—–»î.õ- lªi+|!¡|¨-Öúj¸€¤‚ÉÖÿ7ŲšÎúÙ#¿?{Äéì@:tØ=2öé¹á7g²×¬‹“"L±” ‰È¸R»#…HÕ+^j;ãE½ZBH,-&Ss[ˆÔvLG,¥íœyßÖÆ»Ê&¿ú­£FE$% 5[ñã›L¨‹÷´+ˆõ9`Þ/Œ™t éU¨-eӼТc"¤Ì+m§„·ïÁy“"¯ø¡¼(¹SRâD_¹O¡¶¶@ô+–㢲nLëQ;ãsßÒçòÚë|éi—Db¯ÙÔЧjÙaÏyË’¼ݪú½àsÕ-òK¬ùµS&|Ç¿ÈXUVTõøžO,k[•ѧ.tJ]¬aÓºY—uI™¶ÏEïêUkèUÔëÒ}WèlMô9ûüs‡ÄjÚº5üÀ¢_:ê+æ~î+úmjHiÊ«ké²nЧþ̈Y¿²ßEuÝ–´ü‘Àïô¹¬àû*~«Çº!—ŒÛ”²jŸgüAlÊATÌÚoYà…N±ÝûÆÃpïÐáOS¯=ÖœuZÑVT5œuÒ¬@ͪPΜ¦e}R†“½Ê'VT…jšNY´bZͺQ%Óš².™QS÷©ݦ\T3oÆ´kæe5ŒY¶®ªâ’YußÝ•èð–uÓúTÌ;«ªfΪnÝ*Ê>7­ªeHࢺ9}º Ú´¡"0g@U$§îçmX–7¯ªeÞŸ©[·lÍ‚ªªƒ²iÉš²"õ«8儲ä^=iè–%¶:Ü)H‡»ÆkžÔ³­ßÉš5EB‘>M]æõ)˜³)QuÁ3T-(¨Ó´,BN¤¬äŸØï˜5EM±†‚¶¦!‘ÙäŠy i Ô¥ÕÒŠšÖ нéE±M=e”d®ië•©!ð–=Fïº÷K>÷m›.)´(#­.gô9‘X(+ЯaIN5±Í¤e­Ë¨!+§ä2BM5uCêæÜÖË©è³lÄ’ŒªE‹š ªÚšJ‰¯$Ò¥áuß}Dœ¿2tÜx;tØ=¶È´‚/èÛ+Òºpšçmò‚w¤üX¤®˜LåUï8`ÿ5çX“—E mÁ€PËì5É ªŸoiY^!±!Ô“¸‹­oÞ²ÏXÓ^G`Ã{F +)rkZÎëÒwƒ‰<ÐPÑoËæ±*£ˆYÅ¢Í ìƒ·¹rG€Ü:Fôv—È»&¼©_KC·E=·Ï9‰–Ìï”J{×¢œÏ,rI$gÐqS>Öoڸߠגn m‘”çd}$£¦ÏG2ΚЭéS%UmuCjêN;(Ôô-YïK‰Í’Ñ4eÊ1‹Ò¦5•¬´â‚¢/ïâݹì”9Ç5Ä6å¬P•‰œð÷å|dÓ%½†­»¤[Y(kÙcBmÓÖåUµä¥µ…ª,øùÃøoҡîÒÖY3eÙ°E½2&PsY˪¬ Ózä Xñ‰)EãV,9fưÿÖßZ”õ¶œ.KF´½ KÓ"RVô;§`Ó³"sžö{CLKÉiÚô±~O(X°&§aIÝKÚR^Ó«æ²e‘3†„µ]½; ¡AóVÄVýÌ”ý^7,P´ªKCβóú´|è²=2¦Õt[ÐcDÝŠröÙPpNÁEG›zØÃþ ¡£ÂêÐaרRa}h֜tYV´a̦UM)‘È ue9UumU‘ÅAË.©6á¿°Çc–ôª¢®[Z””¦@¿UC‘y“–ÑÐD(¯©Û†P¬K[Ó¢Œ@¬¤™Ø#)5Myóš"cÆvQ…µéc#ZZB5#fMZª‹dDJRjz­j«éÉXÔ­¡_J¬®&”Ò–Z” 5½Í•;*¬û@G…Õ¡Ãî‹´3$N&àØ°X`QÕØvŒH¼mµ¸ZŸ¼jØ ¢¶H^ÄZ¾cHÑPbÇ å²Øq™íh’‰äL#b=l~õ¿m³êFM^×Ö຿Ñß³ÇR¤}›X‹œ§¥·AcƒbÝÛw$0gð’8 dÜú|oòï-‚íÞmõZ"˜oÍíZÖáNèì@:tØ5Þ´"çFÆÞ`;dîFMkæ_ãkÿEóø’ò]¯£ol|¾9ß½‡ú¿Ýv¸Wv¶tËàÆ,Z4¬7 ,¼ZR~Љcørt¼°:tØ="­»š¨·¢¨kÍZ“6d\é6GüÞcúvy5Ê܃ ˆµîc­Ã”·˜¸¡€ÔL™‘2fLñÜ‘tÇüe騰:tØ=RwšÛ0oNUɘ§îhÒÎÊÝaF­M s_m 9Ù›æËéqÜŠ)ï)Ùc¨#»Ü¡ÃC§eÕ¬E±^ûõuJ,ÝÛí)Býú5͹à„{ôtTT»LG€tèðЈ5v¨«žRÞ•d"ß,2&Œ«ºä#Qãw¸“ëp/tH‡¶ æUuv¬Sü¾(:ì USÞP´ÇPÇawWè(WÔU-u{íEɲò=—s­;/’·bøk®új™–ÑeÑàM½±vêÓ§iÞEŸë·G¯m3² %UEÝ»c_a:^X:<buK.[—1hDÉ_ U-èÕò¸—îñ¼ÿÓöjÊö‡ÝÉ]åU¯zLSAÁÏîêÈXÍ%3b£Æ•ü3um—õˆð½‡Ý±¯./¬v›¶ sæÕuòø¶Nþ€“žt¨•/áîê—QxØÝuúä䄆îò¸@Á!¬™ö¦¢’%/ X×þBe‡;§³éÐa×hY1kI¬ÏÈu9g#1ª!%Ú}·üÎAýB‘ì×|"|[¿=‘Ì—ð®j™óšÐÃÂŽ§Ö½Ó $ìÐáþ«[0g]ÆaåLRqRËâËòºÇõ=ì?Þ1b⾜)V7ã’Ȉ ¥¯¹àÝE:*¬î'móæÔuqLþ¦“Óýî@Þû­™ö¶¬=F¾æ»EG€tèp_¸ª®êwXoÇmô‘'УGË¢i§õ˜T0g_G¥utH‡_Š8É]U‘3è] è+EÚˆ —ñŽÿÜÿܿљï˜ÎêÐái«$ÞUe#ŽßB]ÕááSóÁö¿¯¯ú¾¥PL™UóÒðÄ]&§ î2eæÊðÞ8UË~ÛVvüyÖ:¤C‡»¦iŬeôuÔU_Ö­{F[ ²®R’„2vE¤üOýODbéÕS®Láíkv–íĆ µmîH[sa²õMKó a±†Xþ GĪòÉuƒ$Ãp î?"Io:¤C‡;&V³¨«†:êªÌ—]s— ‚Ц”õú¶–êRšÚ!B Zbg 販b95\TP‘qZÚG¾§WMVàc¤Ú¢ÄI8 T,:Š‹>ñS‘´–Œº@lÑ¢E?jÊhÈikJ‹¼íI{ÔN8’žú DÍâ#@:t¸vª«F >2¹«ª–-ë}DZ³›4-Ë»"»ËãV÷Ц55?WñŠ>ö8oÜV÷¤_K¹è° ƬyGZ—Muî¼ KFüØGú¬û.—ôm°i^lͤó&×­%#cÍQŸ:aÝ?ÕT+‹µ¬ÉËšöÏUµôªú¡Ð/´Xñºƒfd5¼½sytb/: ¨nB¤¦9zÕêŽø¾ìy„¬oûŸùßj=ìf<Nú÷üG6î˹ZêšzÍY–F]SZ쀜q-5‘Ò2 «‰´!”¦†PÓºœE-ãjRµ¥¤MXÖTÓt@Öžä̶¢ª:bkR2Ö,z [’UK>¯Z5 Ô‚ÏûܼÃ*{n@gÒ¡Ã ™òö3=Vå 9ø¥‹³îeúFØ`öè2©|_ÎÕï "¯¥Ç€aYU]~¤ÏŒº’Ð Ú²jZºü¡ ïÙ‡çTB§U´²ZJøXSJCÉõúךšBm¡§ìȉdÔ”T¤ÄÒ&Å ²ªò6õàoh‹ÕŠ‘~$G¹#@:<"4\ºãzÖ»Mà¬ÿØ+Vý…!y¹{TÄõ€–K»°SˆýØaçïcéØ+縇*èw~öYw)C?pä®{zõþ鸞 N–[zªê†EúQB¤$Ë ´åfŒø‰‚XEèsßHÐ4«_,mïN,HëÃIï)Ùô' jºXG¿Pݼ±¤š{μ²P[^Õ„žÑ¿m²ôè¤2éðˆ0íûµµ¥nêÉr·iï®8G^{¾Ø•UÝÍY±¨©ßèŽêÚwç¬Ù ,Iû6Xôºƒwìªy£ïoìþ¹)+u÷æVw4°Ì.f©mù—&¤mMßW¼Œ¶|›n~WjR2·½_±`»W;ïÿ¼³¾µãw‘_‹ä´­ë±¬×œ?òŠšŒÈ¦^ iËúÍëñ¿ª8êˆÿ«ç½çœËžWòÿö=³ÒVôZ6`Y¯Ý–ôø"åw ª©Ûï1¿‘Qñm›þ©#Ò"Ëz4õ¨ë3«ßEÈ€Çw´¼î÷¾ÿhxauR™txTˆM8î´O zBÙU÷Ê«øI±£v:^^=úÊo®þXMòÔ.ê•Þ>jÍÇêOT×ùÅ¿—¶Ý=·þ_sBêj[U‹½dÎùäÓ¶ák¦ÛŸÿµ§wä—¯ësË’¡d}Ü{ݵ"Ëhyó¨ïÈ‹uEtÞ¨…[E>³è[7ðê™wvWÇºä¸ V¼î'rØÐrÂÑí}ϲ‚üÆ5дšä¾v¬¯0뜼 ß’fÇý¿ž”‚·åŒ›ÖRÓLž‡nï =¯*°iIZCEŸª”Um¡33lSÁe‹²V éwZhIÆÓ¥M‰T5¥„æôKkhÉjšãœÇ¬cÞ¢A=úýι ©fÆ^‹NÉ( ûÐßÝűørtH‡GŠH^ìŸÕã1¯êÕJVž±—4½©¡mMSYdÕˆg|î²²ËúlèqÔ†2B)ç Ê+zÛ·­ËZuÑEUYÖ,ûŽº÷õX7 fUQ·Ðª´PΧisÔ_Ù+Ðò‚ 2¥[]Ù¯èV°dÈ¢’U#rNxñö,+>Ó’•S•ömŸ¨ 5ËÙ«äC@`Æ“ft[UVÑo]¯7ýÀ”>uŸz²ójо¥á]½f´ô8èW Ê X“QUP3¦ß»ž}ˆn¡)kÞ•ò¢Ì ]vÄE½^ðWöHiªK[×§.ªéñÓ†?èÓg^·H[KQÓª~5½àc/$;œ›óŒƒb=欣¨%ö¸Q±¬Q#fm ,ûØ<«-”ÂwlE—º9ß‘·®`CŸgWÜ>ç–Z—‚¶–´”‚Ø“B-£r¾£â˜^‘o dÔåMЍyÀœã>5æSuO8á”qiU-u/úЪ%-e±ËÚz,:™ø´œ2,eI ð¦’64¥K *Öô+héÒ0cÃQýV- rÙ‡ú¥¬ëõ¡¿'°hÓΪQó²3~xG/ýI“N(û–?ðŒéI3š"¡¢²ydQô¦H·²5§ jªêó©K Š2"‘Y-Ë–U|$//£Ï{þ–”E%ÐmÊšQ ßñ¡ ǼôP+òEê-{Re ¼ªjÂsú­Y’¶äGfí÷KýR Öuk`Ùš“VìAUÙ¦E]N¨ø^²k¼1u›ú•Ì;iR¯a±@݆–^yôãh¸à9ÇqPì#YôÊéÆœuû0)N¢L}bûúÔLë1$O~Á–`Û¿-ÞöZ³_ÊŸéOzŸêN2¯9ê‚vÒ–GŽéðHÑo~/šÖ/Уßç}˪Ma)m)u6 Ûc@Ú“&¥d4͛ijΰiÍ€š0YÓ h ¥=­®)Hi™V•zÌ„=,zÕ1y)Ym ]6ŒËáë¶TQ„´¶ª¼n+ê^ôC+-*Y’³÷Ž&æ¶!O8©a¿ƒn›ö{Á”¬ŒyCRžHÉi)Ú”W7j¿>+ºÔäl質"«7‰P.(ú5µ ‰4<î{–ô[•³fÀsB=y ÈxFYKÆ>¡¶ÀbÝRžNîvK¿§Œú;"‘¦Rj~(mEŸM‘"òªºÍÊT¼åU—œÒ–7ès+Ö ¨ê²"2mR-1©g=kÆm'½lÉIéòª—ý^ÖG~좲iO:a^Ñš@¨¨)kÅ1 ¯ØëC/ÚûÈSžÂ´ – Êٶ꘢·ôÚTvV—¶ ë>wYZ]>1Ô :Üž#à8"“úe=‰aèJ&‡!<`]#V|æ1O$g»(kß5ç¯ùÜÛȦË~® }ÉÙ” ìPéÄ>¶/q6ŒHÆãf ZRFÞŸ—2‚Lp“)¬iÞèŽð«ÐA<'²nŸ@Ã'Ž($–žÍíig'gœõ˜\r§$mƒ.6ÅJ1㸌%‡5Õý±!m}ÒÛö–-KBCMCaÛItEü€ê‹Ä.+x"™„ÒÉhnÑV2”ìàêzåô©³½¯ýéM‚ ‡ûDY÷MýÈ"—5e½oòœO7®`YÆ;ŽxËc>ÐvÉ‚¼¡é{ú­øÈ°’Ï}lHØ«"]†eÄÎÊ›6aÈ‚¼–”7´¬ÒVÑå}±KÊfU½è·Rº5£Ë ÉŠ5õ¸ì°÷<æM=jÆ4U¡è£«tH‡G–”Ñë>©zˆm ä­*XuØÒª†¼âIïTƺ÷äUD‰Wÿª¶!§¬²hؼ)ßÂ93BÝÈ[¶š˜MÇä]ÔÖP¶¨G—uS¹à{Ϊ'â)oòûtÎ%…Ͱ.¥&ãq-)jK9oÔ»&dmúkýΛÕkݲn‘£ò^±WÙ¤§ H©0§Û‚=ö™¶¦©×'JÚJµœWYuÒ˜²†XKVK·MëÈ©U³¤ÏE?£Xó¾ª Ý"­d”b¡Meoù»ºL[¶¨æ¸5óêö e¬šT²lJݨuyu¡¬5£.éÖô¦gôÓ›\»`ŸPè¸Mm¡²–#†õji¶Ç¤y/™rئȸo;¨KA’­…Â[‘É∇´¤ô{ ƒšM}ª>ñ’o™vĆXIä_±îÐQGå•ÕµeUì×mQCÈ™ûÔó`Tî–Žéð¢®aɲ·Ôô[Ò£d@VTÔ]TvQÖIßx]Þ´u M‹zLZqIäu}Þ‹õIikûƒŒ¶Ð¦Uieë– Ù#ô†ªA‘Œ ê²"÷õX»ë¬Ê8¥è¯tI«ù¾Œ–±”P¯å-;®¦G¿óêzÅÊô+ œ4k¯Š NºlȺ¬~<ƒª)Uš³ª^ÔmÝŒªŒØšWõIyÌoeô¨”¶ ©é¤z¬ß÷¨’SÕR²â”ŒßvÖa¿Ô++/”á¢Ï HûÀiãú|®%cYËÎ }(­¥W,gÙgfä¥e­Þ4®h`Gýø-ÁõE¶v±C†ÄšB“É"á%pIEÚR‚íï¶C[CÖÓÎ+ëO>ßRÁ-*ØsÍÏêñž¾A+¶bXö‹ÄªVä¶ÏöhÐ ¾Bt²ªág‰åbSV¬eS‚´†¶QK“ÂsfIÉ걂¢E ôÙ°×’¬¬5›BO{ψ^kžQ7ê‚!O‹¬(û–ª^‹¨9눲–}b-ãw݃=N«óç– YR´¢læ)i e£b¡q9E=XwÉS•t{ʦ–6ª^”ÒÐcAåÄqyH(Ö2hS^ e-aòÿ?–V5âg*ẕ %–ִꢖÉcëÕm̺!‘=úì7æ“i6Ä*5bA¬`PdÂe=Fô'q#)ß¶Œ^ z 볪OŲú KCͺ¨[Í€U›òŠêÖäd‘–ÒvÀ-Aâ•Ò/å¿ñcKú™VQR³î¢ÐA¿2¬OC[CSQ ª¢·ü™.-ø¶ ¡šº13ÞÕ+Ö6¨€M+.0«¬)P×pHÁ9 Ô´ä“ÅMÝEœ÷ƒG*ÿTG€txdˆÝ.M\Ê Î+Ù³ãw±KÖ=¶#ÉÅÕ@³£ÛŸí‡opÍi—ìUÖt`û¸‰ä»‹*žPÞŽ5X4bŸ.1Új · ¼¾ÃòºQÛ²ÞPw^Úwo0m_µß\ð˜ƒÉÔñ\rî²ïo÷ð X4gб/œgÔÍ8´Ý bSŽ—aGøänËyQfǴﺖκhÔ!ñv q¥ä˜!ƒ7iií†bpÁ”†Y¡a›º„mŽzEŸ¢À¸šß™´¬¥¦×aG´½§¡îϼ⠟»`oröØ’2æ½è´ƒ^Õ#''dRK©zU˲>¡wu ¥¼®â gÅ^sDËÇ–õÉYÖ笊ÿZYÆQìuRÙŒ'TôúTU×.ÌÝÐ ²¦Tn;m‚/¹‹¶GÕ¼ÀømWi±•$‡íÕ£§oxµÅëÊ-ßEdz ’˜·ÉšóÛäï\wd(vé¦ý­¹¬lÀå|7gUiû5–œ¸ç11+ØØ¡ä¹ÿ„~w‹Œ;{sõn¯Éî-Ü:Ï¢X`Í’a¥kÄÞVåÕû¿Eјç ™sÒs.Éjë²Ïw¤¬Œ*xÆ))y—ää’·®_Îq-}Biim™Ó•D‹7ûX¤%0dUFÖ¸º­Ú#y‘PEÆ“ªÉ"è Ue}šz-è’6¨%ö²´ºm㉟ݰ.óz“åË£B'•I‡G„XísaI‘ 9óšºL¼•×=f༌¹dzÕïÒ¶Š,™²¢Çᛤ üÁQ}»ÐÜ®®.šwyDè]Ã&nøŒT± l¯©ë~q¥[©L®Š£º÷=¡èú(ýÀE‘½É/cÁŽT2‹Òz®RW> lš7.³#í̬E£É3vm:š†ÌM“é´œÕv@ö ß4Uä”:©L:tø"Áê´Ý­¤:`lÀ³zïxÚÛoåŽ}§îOÿî&Þ;V5í²”=^¼eP\^ñ6Q"ÙL·£ p“g¤dPÓe]0jÏ-ž¤«‚"·ëúÅÆÄö§±¿vXCê:(HlÓ˜)3¾«%ò‘ªPN] -0,¯$rQ— 9‘X[CZÞ´‘U£×µ6³Cñzý={´ ètTX¾²ÄêÍZ—5äé»®8êmÑ£±Ž»Ž–yS6 zZ÷#èûÿ°¸õ.+cÒk.ø½.û ܇± ,HYÐösïÊhXð¶n½æ (Zñ_YS–ÖíM ëŽyG—¿cÊiu+z5MXKTjie‘3B¡uÿÚ=.œ :¤ÃW޶MsæÔ•Œ8vV]2–v$1|ˆ­›² oÒÐ#YÿáÑ&Ðã) —ô©1{¾¤>¨¢,7lI ¬ ÏŠœØ¨|¤<˜H }|×G5îº×nö C‡G˜Ø¦ys68ú¥U;)Ê[¸EŒÄƒè]Õ%3BãˆIÕ¿®dMÚcÝ”7ìÑ%ý"\vŸ}L0aG€txD‰¬›µ¨©Ç^ý2»°êsé¡ –S6 xJ÷#3!|ýt{BÓ¬‹¦oã£ÕánéMË.[‘Òïq=»¨Ôqö!˜1cë¦ÍË™4Ü1•?2ö˜H|´Jöì¨ ï Òá‘!V³`VEÁ°ƒJ»®éÍ+šOüþ —]Ô4ì…п;Ù²‹4]vÚgFMÞW…è7“ŽéðÐV1gAC—q²ìÅ7ó€HÛŠ)+ºº/1 îLb9|´:tH‡‡ÊVù–‡ý¸>9‘”MùôZ9¥ª-S•ß•"VsÉ%aÊRªŠ÷Íê©Ê µ¥5¿ÖkêØ†ZRÏýË=nOišuÆ #×Ä‹Ä6“‹-©¯xœÆnÓÉ…Õá¡pmù°²U¿0hA]ŸMß3ö€Zò¶>ïÈèRÓu‡uÌïœÈ‚)ý&õ¹ì—ú…9~Ÿ®ðO¬8hF KäǵÂùîòª?x\NÍ—ïÓ9¯Ø£J&·í"ÿmsz´Lzék,’¿4\X47‹#ï•Ëhʨ[}`dÜØŒ^ÕûxÞXÅ´99{Œ$¦òXÆšXQã¾]gÈyÝ.ÊÉ™µñ5 ±”†UeõûvÎ@·ãšæœñ©Q“Jzų.É`^Ü · ³éðÀØŠ#_ÔÖgä qä›ÞvL· y›ÊLuÐô[Gåe5tݧXŒ†9S†íѵcª[È©ë»o*º¿Ró3±†Œú®ú¬=lÞ”3!«®{žŽØº æU xÆŠœºÌ#U}ã‘c½#@:ì:WâÈפuÕ&¹Hã³Z}YÞÕgÿ}:WÛª)KIRù1™¿êðC †|p¼cdךf›0ùÌqüÀ騰:ì&WãÈK†oGžzh^ãÎܲe*gÌ‘& ›šÚ5Ë}c+^d=É£µ·/r:¤Ã®°G¾ µ‹qä÷‹ŸÚ¸§¤vW{»hʺ>Çõ>Шò7ü»þÈÚñºº=©iÞ¹ÄG«“ÜòftH‡ûÌ•8òЀc_ |Z¿ËÝÓ±± ÓfeíñÔC˜Æ÷X7Ô»@Ƹ1ÓÞR´ÇPg²¼{Òá>±3Ž|èÄ‘ß?ƸÒ4kZݰç¯1•ߊë÷ù¾üÄq—î±ðˆ¥ÑZ$þy ”sÄ\²™üJ=Õ‚Žéð¥i«˜µ ¡ü€ãÈï}b«Êw¬|j[5mQÉ~ƒwõ½­”Øz‚[ä…Ý*§z¥‚vØ8nüëSÁÜuG]©Lá†Ç·¸n,0í9ã»x·ï•‡åï“Nö"¼©hog/²ƒŽV‡/ÁÕ8ò>#wQüQ£î?÷®ÿȾ[þjkB®™qIÛ˜‰»6•Ç^õ‚ªODÚž6x“ßU¤åµ}쬦‚‹š·5ô_Ôp' ê³®[`Ææu{«5Sž¸Ië>¶_—÷ <ÐjñwÆIÿ}þ#凨†–YÔ“½ˆ¤¨Ô7˜ŽV‡»'òƒ†ÍX“3äY¥¯ø‹ûÈ_ú÷où›šÿÂ>ý–õ9ö%Lå±.5±ßzÑ2)mOXqRNQ]^UÓ9‹ºœñ÷lxC Oà3#ƽoSF¯º@ɲ çÄšqÂ1 ú-jš‹­Éª8†÷]”²)­"«Wƪœã6½aà‘{(ûLñ!»Ö¦M·á‚w”,9ç|ÓÃwÈׂ¦êÚà6ü_üïüMÿCƒWˆ­ßð·…lÜlÞ£- ôLY³~“ãþþþ¶ÿ¥'äoÚã;ësNQMÞš_Y4 ö´¿V2¢îr æõ[S´hIZ$–öªy†ÅÞÐë/\PÊi‰l:¬-í]„>²é”¼¬¬7Ì*ËÛ£Çk–Ôüsey)±”¬ó&pJZFt_F¢mã>Ze®ÜÙŸzFMë>Ÿ7}«[·?0iÔ¬ìÿç„Wi×Þ½Ì#ŸÛ¬#@¾|bV—0yƒíúË×jϷּ߈pû÷W4ë«BÿИŒ5«;®sõ¿[¿ÜÔåÛô.Ìx×@R±új¯N7ÓýoÕ±þ‡V¾PòôJïkýo [³vÍo¶~q¥ÏUEß¹ƒ––ÄrB±¬¼U£þDÃ%’V÷¹(´W[NKSɈãRšF¬y\Nd¯*Òr jJɉµ Êk`Ó9Çeµ‰üïÄ7ˆÃ;zw>½¤èÃÔ¿þ ¿“¿rTlÙO¾°¯™÷†däÃD¨^ûöø¹ge¼¯ûº«\{Õ›[¯nÔ®-q±ÕƒØšŸ<âu*;6¯oÙcا†´4T•E¬%-VKÖ1‘¶iãrw|Þ¶ F“G8B ‘à:õMœToI ´œ—³Ç²Ïîh2½œQõ„ó{‹T-Û»ÝÊHê†ë¹­žÕ¤¿°žšÒ³#·ÔœŒ¾ë~qA¿.Mç[õ‘ïÝ¢…±W=Ÿ¬X·Äü%};”FW'§ºóz ƒË2Ä‚ml‰\²W$–oßý\V±OJ[k.é‘VµG[CV¬½ý,\‚û`9gÝS.X2hü&ʾie=·=Ó•§îêˆô~Á ²)—ü¦¥aξä>Ä7¸'WÏzYÍ>i¯zú ùæ,x¬šöxòÜ·M™ÜöOkÝäij'÷ûf=¸K64ä'bçUÏ=²*Etl _'BŸ:뢧RwÄ¢œßù¹´Ï MxOÕœEGÍë6謆a+ŠÚê5{­[RÒ0`YŸŠßú¹Qó6MI; éœ¬½6íU7cÐ’´7ýHÑ_úuEu¿óí>LiŠôëòß9à?R²hš_ù‘eEk‘.MEkŠÎ)xÉiimýF\Ò«(:mP—’¦´Œßó‚“)ƒåñš§mxã.ú¼5ñœq9ÏY•³®m¯´ šy‹*²æ¬8Ž §dEúø­²ÏÕ¤Ä2tùï<'–RÕÖRÈ×pÖŸH‹¼)T0¤%ã²)Ç4åät›•·ÿ¾*KL«¸`YÁ¬iy¡MyÀ„³ª¾e]hSA`Ó^3"± E-iãÞÄ @FVΊ“ºMªË[—Ð焲¦aþ¥ hë3o\è/ýК‚u´t‰äUdÍ«:à5%£7ìu°ý馔“–Ħ­9hN¯ÿÌRuQr¿Sš"±þ†Ø´.5¡sB‡­Ù§jZVF¯Eeóº¬pEM=ÞSµßïýÅWF5ôUig‡;`Ò» =ΘwYN]$tÊ9¡?ÓP•rΧ–ûsïKù(YÓ+í€ÃÎ[0oÓ M‘b¢‚øÄEEeï8g@¯7eü«ê^Õã‚> -[/Û†–ƒž–µñîBÖ’ß:îmüÞ’È·´éM- BOú\·S†4ui™À¼5ëºü-'¬‹­)h˜U²$gMQN$ö¦@V,cI[Ù*õì]‡L¶l*›ó[uY¡È„× [ µlj°®Ï¯µ×¼uëÊþ¦šœ”åEVó¢ª35¬û¶wõ{ƒE)‘–PŸ@Ê””iÛ°î’u›º…Ü÷‘ÈèµìŽúÌϽ¡ßª.iú»Ò–¼¢aE¬ªyû±·\4¬)gÕ>{Ôð¦cNYTò„ 9ä¼A ÏxßQß3㼪lCKè+jžõ‚MïÛ°ªé%ï›ð!-e±^)ûoêw•”Л2þ5um)§}`Å^SÕyó"«^ö¾Çü΀PAF³~­ +ÐVò+Y5}Þ’7às£Ö”֥ǂMy‘%‘g¾BÓòW§¥nËAu]ŠˆÔõÉÉ©èWÖgSl¯Ït‹Œ˜¢íekTdÔ I+±ÏŒn3e«" ÃjF- Óò„P¯Mãz”ŒXW1쀬P¯Cñ.¤”uÉ U1„Am{”ìQTqHÕUG¤ Y(‰EŠêJ"Mû|"c΄¶¬H YýªòÚ† …ÄÖŒ«9 ¼‡„†#.bHU—œ¼¬XÖ^9ÝæQsħŠÊʪ&PÔÐ%ÒrÈŒ>)M%e9ÃZ¤¬0î ªnë-Œêö”Ш”HJÙ€º¼‚”‚E#»23üÜeãrÆåísÉK¥µä «II{̪aŸ;,–7¤ OZhDè€sz šé±OÎãÍ·&/V’Ö-%vÔšA¡-ûå•ÒoàQÇ´ Z*ŠDŽÜÁô×V4¨&vÀ%½Fí:¢jX Ç€qûmê²´¦M>]MÚTV7ª•ìwÚFdŒŠÄFäTÈZRTÚ•±Ø-:6¯oÙct[ïH®wŸ»åss5Ð Þ0f¯˜$’#j»bzßú_ÝgB“ú\ÕÐ_ R«%†à ù¼-ÐN4ÞÁC³´U夃çÕ¾lµ¹-ÔNZ½3Øîª`ë¯5yÁªþDÓcQ·ìuî ›êúH®y§6«ãt-Úʉ¹öSk&¼é§º-šsTJ¬mAŸ¬XÓ²!+IÂñ`{twŽ»;®ºå QNƾæ¢ýFÄõÈÜHÅ“ÚÚIm¿”š“)ŠWšì¶mäÊýv©W½ï%¥m'†­TømƒRÚÛOÜ•ѶhPèjf ª-#–MFúŠ“I¼mDðš§¾`™¶àYm5yWÍç×¾=×ß߫׽ê¸rõï¶”xÛábç³¶î3#ö%çÖ´åå;6–àºÿ¿Âº÷A¯Š¼H$Ö0àŸ™Kùg¾£¥G(²ŠŒ@VM· Îú;bËïyJ ã-ÏŠe}ähâõ´EèÎÍ…»GÅû"GåiŠe¤"mM§}WÚº–³ŠÆÅN+EFU·PdS vPÕ^è¶¡¤é/ÛcUUZ^hCS.úÈŒ”£wØÂزŒš¶Œv"êê²J>Võcsr¥½#%gMݸ”Àq@EÚo|ßŒŠ§µõjX–½ï˜~K2BµÄÄÞkU,V—V¶æ¼E?ÐÒò¡~kÙÐð+?ºëß0)ä<¹ýïÀªD“h}aŒÎøŽ> Ÿ;®"g=¦¼+ë{舽aŸ¬”@ISÕëžÕ«)gCJ(vR^Ú¦om?•wgå¹ìœšç“g²È¨I[´æ¬âC¥½gŸ2Ò‰ŸÛ†P[`Ý/Y×+gÚ´´¼ y늎kª[–’+xO$çù»pvyxtÈ7€Y5¯ -h)ÚP”2áe¡3N©éøX¨äqM¯÷±.£.ê¨ lú+Îð™”Ui™ÐkÆÀÃîܘSµ$´ mÕ1Ÿ;èC=By«^–ö¦U-C¦]’1æs)i‹^TÔò¡´¶um¿“U‹¥lhácgdERfŒXó_ÊzÊü À¦WÔ†Í(X5*²¤$B¯ZУ$#¥)ð¹Ó¨:ಌe‘Oµä5¼¡!㟛ô¯ØPQUR±W_éS‘7oHËŸùÄŠ¶ j™óWZÒ–}jÚ”¢¼Íûr£^_;F5 Ræµ­:îD2F¬¼5/#ô™ËÚ"i@SÞ_©xÌ!-gä}ê¸Si‡,ú­¼e}ZÆMRPpÙŠÚ=†^» mIͦ'|jÒg4•A˯åÌ)šVU“1‹Œ /Ȫû̲nYu U%?uÉ洛ŒøÌ˜y=ºÕ#eYSFJÞ°U+_‰*/ò  +QM «´¨[ͨ‚†X Ç¦²nU]b±‚}•Ô)Š4úDöšÓÓ4`Dí¡¦•¸yoS&Uå7oŸ9½ªRB½IüõŠq‘1-–WS’Òç’¢ºnUy´M‘>-2zÐ’Ç´¼’nñ¸¤^¡¡¦®hRCË+RʶÔL!!eÄ” ™>ë¥ì·!V©YMV¬#Î’’3¯¨d@ÓšÆÔí5gªš–!…JR"‰M'T©êOÜ&vK€\?F¡Iõí1š½fŒzTôKéµ ¥¥$¯*§®¥,¯_,´_E·>-m%‘‚&õÛtÀbâÀžW¸çÄ=VìÑ”‘‘2aÆA F¬$q3UýÖ쳬ªiL,cÅ„ª¦œ–M-%‹ú¤IF9Lž”9Š^ ‹b Œ^m5‘ð+áÞ ßF´}ä˜IÍmMläs-´½MNkÉhcLƱPSJ[Ã)¡ïÉ‹Ÿ¬0 ÖZ|¨Æò›1,ÖŸX9ÚB£2Æ'ö™K.Ùï))-(Qª´\ãÚ¦\ð}m)-­Äø9ï{=#N~›ÑH&ýå;ÖUÇzýmíÄ`%^;WÆ {Òq¶ãä¥ö- 9£I?rš‰µ*mAƲá°yi±º¢'!ÑЖvp;AâÖuÚ‚ä¿qr¦Hë©MF¸fŒF’1j'Ù¥.¹è©D¨nÕ¥’´Hz{”Ú²ö ÔödbAµdŒH™Ë‹ïY€²hP Фý©¬ ¡H,¥eZÓs IDÏ•¼XQò$ÅFЖÖJbþ[*>ÐãO¯éÑÖ¿V|hÒam¡¦–ÊÂM:Fô¯<±¶WT )ÜÔˆ’—«m#YÝ´Ä2_ˆÕm‹¿p–&7| ¿çÛQcMËè8ë„ÉmÓøÍˆ´o^ve­µ';åÅ* rš"©ÄáF÷bCÍnqíkèwÊ–¨ÐÔÚnW¨%´hÓž$¡åU7&–K Ø÷—7¢Ÿ÷Iâžq3îdŒ®fVh ¤wѸ£e;ì7#vο ü/zß¾Û>I-ñM·¾ ]BÙ Õ¤¿àB]óÞm¹œ¿A”ü#ELjþU$ÖÖPµa݆ºH i]·HðbÓŒÓu“#tÙ’ã_"Ñ’O دGQï¾/ã·yáoEè¢5ÇnÒó¶KN´Wß5©2®§ø…HõûÁ•QmúoÕ0(6«[UI+ U+ZPÒ’JÊ=ýPÝFï2aέiûÈñ§B§U<}Ÿ®ðü ¦è!O|É\^¡Oô½áY6}ªlŸDµ|«¶=Ú‰L:*¬¯ ±H݆ŠuZy]ú•än»‹,˜¶aÐszn™G6#s›¤æ·æ€ï˜6­íðw@Ì}©ÊæKöl§=ù"‡ÔL¹¬f¯¡‡49Ç6äpÂ.Ȩ‰d¤µÍK«˜Õ%e¿wìKì ‹/7×sÎ!O]óÉoŠî±†äýRïÀK†MÜð›^2cÊŒ=ö<’¥»îœŽy„‰5Õl¨¨¨j ä”ôÚ£({‡ ŠØš) &ï¨Îܽ¯á¯uÐ^SÞ48Ó~ˆ¬ÝÆ‹*æœOjÓ=ø:ÙY®©ËãŠö')á·bâ7dD‰aÁóö}^ìº3^¼î³”g½®ô•ðSºi“&,;ïŒû’ØŸ¯"_ŸçìkB¬©ªb]% „Ê)Ò¥ s—5(j.»¨mÄKw<ÝÝŸ9í€=Nûƒö~%j…T¤î@Ûœ2fTÅ”7•ì3p×{‘ºiÅ{ÒV–¶ÃàªÉçµí‘K°léžïDhñ‘rÎ>iø ~ä=ë]v˜Ý- P5í]yûÚ¾öËÑ1¢?\j")y]ʺna¤»mËÎ[ÕgRß]Mà—Ma½wïT|„§mC 8¥zšäÖ4ÍšÒ4nâ®.ÏYþ Ô#̈­{Ó÷n¢Ž;oÊ·Ù5ð»7Ua]OdÞy5ã&¿2;ö„õŽyHÄZjÖ­[SKo ü= +Ô\rQ`â®·_aÖ/ÝÇ~¶sÎ|~Ÿ?Ø×mŒ“ˆîûîRLw¸SÞ4ààM¿}_xWbÿArç„«ÏRŸýz¾: ­ŽÖƒdË^±¦bSKJA—=÷Ahl±µïX×çÉÛ˜ÊoÎý~tCõyOÅÁGøµh¨ÞƒÏX ÇÓ.ù”{Ønżê-ÍÙǽîÒv|ËW™­g©î¢dì5òÈå«Ñʯ4m kÖU5òJ†”îÈ—ýNi˜1-¶Ç“_ªªÜ—7¢‘>ßñ–ºc¬Y•»çÉ?k¿½VœwN¿}_¥õã#NÛgŽÞÒ2ñ´wô>2 ·/KÎAû,8ç¤q“_hôŽÙb-UëÖTÔÄ2ºôÙ«¸m¿ZêójIÔÿ}ûkm¸`NÙã7Q¤\ üâ¹wduM¦Ð›]íJ€ÚÝ´3ïeoûÄñÛþ~Ë“èæç¿Tw?™»ƒÊ·"Ô¯_ÍEH›4úwÎ|4˜’¹­ŸU¯½>òÒ×Hh§ŒVqÎô8ðˆ/H:ä>ÒVW±nͦ¦”‚û”’‚²X”Sø@Ó³R÷ô'éœ!òº}ú•Ä+šÂ›No±%g­óR² »šÂœYRÚ^7æ @ íwžI2XmMÏW®ÖeÖßrµžú΄ç¡EY]©y.i÷ûz¸FàÄIí¼A)WÀG~ï¸ÏœräšdóWS­Ï+)àO oš4¶#Iý¬gÌÈxùš8ñ/KlÙñé´ï•¼CXtÞiCöêº.õ÷•~ß϶}i8íùOËÍÆå YS·ˆàyxlùÕgüÎ ”=•(´²öÞÞ‡]IoÿåžÔûGG€|I¶*oW¬Z·)ÓeÀ~]>3-rQ¤dY·ϘpFݪaÙï·zŒJ[vÒyuyëµæs+2JR-û‹¬h#—Ùë0­ÇrR)¥íyeŸJÙ0äc)SFõ‹“t±PÙÓšÞrRM· CNí÷™å¤Æ`—eÝ–=mÒ9U«†|b¯W•I[ñ™iUYyGõù¦1å}êYÒr¶OLÛð„ÓzM›ÕgC(gMIÅsFœÔ¶jÄ»óŠ~ÃRMÔVð„œO\tVFÊïløö œ;կǂ}_2<-4dPÕ”wäì3”¼b[‘±.--ãùÎå¶œ1¥ˆu9‚çn¢Ì =å-CœºgÍ'·¡¦WÅó÷`cÛRhÍ;çs“&äÐð×òÍuüawQG€Ü#±¦MkVlª •”íÕ%¿ã!¯[w^Åe]Ö”ŒaÓ‚¶3ŠVfõ 4¥]Ò²`ÂKb-Mk"+²I½ƒk'œ†iS 'Et–Å>êµ`Hà˜^mËÚBgô¹(邏J 5ó6¼,cÁEYÖÔ]Ð눚 ÓÖ [VÒ­`U³"•¤¾ôLÒ"óƼ(°Œß©Ó£ä]5[•¶àû¦}âYOùD˦3j†,èU0hëb§•-J™×/Ö¸lÓŠC¾¥mѽê"çtY¿odQÉŒºÏ ;}â›E9lÎ'ŒšT2ì·žõ±E›žèÛP1ã{~ái’×ðÄMED· Ÿyîa7ù:ЦM8-P±jï=&öI5bÍ9¿3d¿¬eY§Œúü‘°)vÜxï‚XSŪUUu%=ºuÝ$Àï ç}_K[Ѫœº~ÖŠ´ XÓ#UU£ÚZ¶ÊÕ¬JïHäVÔ´gÇËSuÞŒ‡to?@ÿ•O[UÒÒÉ˨[‘’Ò°’ä]ÛcU «… UiYmYbãþ†ýP$R´*¯jÀ†Šx»Ý뺥Vm'í®[“–ÑÖcCI ]Ö5´u«¨0î#¿3æ[jR2*2ZzlZHii´šØrVÔŒkh …êVõ$¿+i™¼o«Ÿw•´ÅJ6LÜ7±´õÄT\0¯KÞy?6'%P³¿³r» oëQò¾™‘iÚ szËkž|¤ÂyÓg~*cMÙ’‰/]ú ê‚9íd2ô(ô·r{âÄ‹jņ¶Œ’^=wàCµ$¾nˆ—T Ü2kÛ¼¦á›úQUœ¶dØþkλ¬ûšOÚæD†néÕ4'õ…ø× ¿òël.ËÖõß2æw«ÝCwàÉTõßùþ5¦ÑØ¢ª[zÒDæ´ ïʺ=òšî:CîÝÐ4ë#-Çìé8úÞ‹>ô}á‹óKÎúî#°"¿Êrž¹Ïçlš1-´ßð£aGë›kÚ°jUEC^YnÅû¯qoíYsÚª=öîê$´áßÛÕ‡óc™;.þºûÄV|ò¦ž­@±%Ý ÃÛûýw„·uÌëö?R!wHxç´-8£nÒž/å°_è^K,²aÕ² MÝúíˆbãJ«–œVµ×S»®;ßý~îõŽCLÞŸKþWöyf×s*]t¸Ç˜œèž+v|½¹(¸kQ8â3£Œh>í›ô¿Þ…š¡aCVuΘýÙy #@@[Õªeu¡.½ö)=d±q¥e‹Nk8hô Vp_+9܈²ŒEà/wBì¯}ësÖ~û,'A‡¯zâ–å§¾™´œòô=ŒÈSf=ìæ'”|(µk“{ ×s6÷ý\ã0þ`ùF -ëÆŠ(è3ªKö[´Í;­í ‘¶b}uù¦$VÕz@}%ÔpÜ?ÂÚ.]!µ9²™ˆæ¬#jÞöŸýïýœ]Ù÷Œü®?!gôè¿§#8s¤©¶ë÷;PòsOjØÜÕ«ì5lÊzÔ÷Pæ­o¤i«Z±bUC^·1= Ìæ÷Jg:ø€Íe»¿aÈtRŸü‹ÔýêšØÛ«áRííOn6áîüfgl}{;íú¾êþ¾Ø{7¡(x7¹o·zF¶~}%äÐ5ç»öï+)üwŽahÕ!É:dàÏbß(Ù°dYE¬¤Ï¸®GBMu=m—:šDybû«´Í8#í1ƒE´m­…vû]Voj¶¾²ÎÚ"«ä‚1¯úž¦MÇœô¹-Ê[³¥,¨+YÖç/:à‘Œ.ó-ª» íM߶χ64+§*/VuTÚI}F}¤(¶¡Ë²¦²œÃ.©»¨ÛeE‘š~ë }¬,%[•’ÕòqS“±áðM§°«=ë¶©Û´º=VuÙës«2úD6 ZГ„k¶õ‘Ëš.yÒ¬.ý• e ‘–º’ª’·ý¹ªÓÊŠö™sYÙš¢e}>‰-X–UÖ¶.'–‘÷¦ÃºýüØ’>“>Ö0aNÊ[þ†¡¤ý»¯h[¶¼cùp÷LøƒÆmöH×&FIéuÂc^XЯOee ¹hЦ¬u‘a öËúÿ:îc”e›óº˜S´"%Ò­ªlI¯OðŒÏôª;¢mÙªuy%iU±@ZÞ².-pT M{QÍ)£ÆqÆœŠ?3¥"kSÅ‚k憭=TʸQóÎ8õ@UÞ_kÒR±hIUJ·1½ò¬ààÊÎ#嘇¶/ ¸ÅVû~Ñmõ]³ze ˜òªY%ÒÚ^ÕeÚÝê>Qч´–ŸkI)Y󹜜´wµDbSfÍèQ·ÇgIßËùÌÉ;gXËË^ñ”PhÊ´n±}.Ú´!8à3…$؆XNQʯÍ”3yGëç.Ee=“Œe{M™bNA¯Y£Îɨ›” ­úK+Fí“¶è3 ¾í¼Ã~£OV^(i;#”7éuc>Ôë’¼<†}*%j©;ê×zµõ‹¤¤|¤îSÏ)‘÷õYÑ|OÃbŸ9ô¥ü ‹ºÌš¼‹#2úd Èxs J9!Pð†Š>±š²´ó–¥<&Жö†Y9%]x]ÞE}ö»lÊ%ƒ"9‘óf-è5©ÛkZºÖ,ê“U°bM^^Ê„ ¡K6½í‡ ÈY±*%ÖôK /X‘º© ¶è”S{ Bäk)@"-ÚÒgR¯Ü#¨¨º–¶ËNK{ü! nea¸Ÿ”]¸ã߆úeíÑvDh@—%#BeuGÌè¶,NâÉ÷ˆéRsÁcÒÚŠ"mcˆ”ôÈë5fݸšýR"Ï:kÒ óF ˜´å/VH9à²ØUÚ/ÐcQJ¿-ÅQÎa)-ïp,ËTÖ* ÅÛaŸGl­‹Ó2"]êB“*ÚRƵ JyÌ’^m£úì3á§hiHi«KÕ…À3æ=gÙ¨M±–’½Ö]ô Úbûý‘‚ȼ²ŒÇd­ë×2Žƒ»þ4\aFdÏ—<ÇçïJ€À Ð¤X¤G¯ö ªé5§!++4¤[Æ1-“Úk“¶WɺQ CRFœÓg]BmƒÒz0d¿#æ7fΤ% u{}ƒ‰bñVU ƒ,9嬃Fw]ˆ|­ Û6-ZL"Xõ=Ÿ‘ûÓî9§¤yÈÂc«-¯ya×ë+¬{ß÷nØ×Š÷’ob3B£\gU°ýÉ•ã[fŒoÇTÄfô(aÚºC²×'«–“5ýUÍöÎìÀ Öö µMYê2á¥m Æ õ‘@CöûÛ7ìO<Î>‘KòlÅ.éSܶrlU:¯Ýnͦeã×´k+‘þVñ¤hÛ´uôe i)#75¿^ÝÀùDu·uì‚ð:Ÿ§šùíiåílÌ­d$c‘i}z\µ¼\ÍØ<¯nLëšÌ;ߜӎ}¡—±%'5Ú]!òÕ$¬ªêS³lÞªX?âªªÄæ8jè¡ Œ¬¶èÛ߆KÒþ…ŸY5«Gʦ^KŠVe1,oV ©nÈ‚×ü=¡KŠÖ•|&ç FD–ªŠÖÔõ úk½È©+hëÆ‚~Kº4µ½©ËAÊbmo;æ ?—“qÁ ¼‹‰ý$¥*£$´iy½Z2JJ6¶'¤k‰Í{Õ³ò2šòZ6e4œh)ØÔçs§ý=kV,+i(øDÉÇt©ÈËë2/o3ÎXõÇfµ¶G/T–1£ HÞ²nozÁÿÜ€º¢A«ÞÔí€XSA¬"Pð–œM}Võ›÷ª?ßÕD/W8«ô¥Åiý.ßUBÌ ¹_ð¸}–uë3+ö± } UzI(#ôš§<æZÚ†,É«Ëòš²Ï¼hÌ‚ÿÌ‹ZÒªÚ"EdôX1mÆÓÆ,XP”5á¢_zQo²¬iJ{ßÏe\”ñ Ï+9kÚ÷ï½90 ß’SÎö©ŸïÒ~ÅÈiÿ‰œK]É ƒ‰9ñ«BlÑI‘ÃJf\ö¡¬w¹=MË.›¸‰È |`ڪЈóÞYTVêÓ¶ßg~`¯ß[Ò#Ò– ¼mÁ²¶9góŽ « šº4BŸ(j[QPW”1ŒŒ¼a'½mζš~û=æË&ô8mš¢U ±eŸXÖòg~¥mÞœMu”lêÖö+j²ò"íž\»CÕ§}羜k܉{ȨŠñ×B{ü™75Õ}fI— kN{_—”¬¶9¯‰­éÓÒ#ã#Ãþuë2xÝš£~bÅg–ÔlxÉ{yÛ ¶’Þµä_³é”u9?éõ™ ç,ꑳ†3>PS5¦éŒõm¾;eKˆ¬øÏücÿžWR ÝB€Ìúl;¨îNýá¯ß4_ûÉ­½×ïäìמmÍÿËoí3cPËe3wµvn{á¡¥hxÝ~—“-æ£"<à=ÿ¾ÿ—vù*¿ñü…ÿô¦ÓÒˆ%ebi5 å­ê·jŸe´¥•äÔdÑ2¦bRM aŸMJyƬ#ΰìi§ËFQÖ^Uë2ºtÒ#kÈ’’تœn‘)“"YuM]ÒH™P×£©`Kùp@J¿%¡´‚Xä P¯™›ô-k̲nmOÙÔPÖ­iSYN¬®­[JF¤­WlX[QÕ“N'Y–S„²Võ›6)–Ò-²ÏÛŽ;)s9[—êŰH¯ŠŒ‚ä.L˜U’6¨dI¨Ç’š¬-yk‰ƒÀ‡¿Çо;墿ïÛ÷I€ôi©Üujš–’´gTì³`†PIθŒºÃúÕ¬”  KNS^·#F¤tYYFÙ ÒŠuë³nȈÃ6ôY‘’M–±´´4duiÛ«­™¤i-Xׯ[¯u[¾†ýÖܲK>”ÙV¼]q~µ<ï7özü¦÷¦uh{æV65í3§=׬Bb´¤¯ñ‹¬Ê%ž+¿­©éu¥ò\KEï5úæ­ÿÕÕ¶‡ÄÛç„Âmmc;q`ءю´EÊ×¹~Úq…«×qMëïxú!%Dnû¿ùýÛþÇÐÎã sþ¶Ç¿±ËW9çOý»þG7øfËBK¨-ã¼)I EB±0Ñ.··«ümÕL Dˆ¤UÌÝ~-¶BÄf­xÜ•ëÊ}¬‹u'çÞúuèJeÅ­µ·Ÿ 0±wÐTÑ#H’Ü_)S|åœ[­L nh‰¶¿ß)ko_kU·@¨Ôö²­és{õ&1WžçŸ;lT -BÆ´‹Ž+%glkV[¬*ÒMò]ݦ>’ÞÉ9Û"+z¥µ¥DåÔmÚ#c7m ¿ôý/üÃû¤ù@é{ëm ’»ºUøùʳY×½`yuöˆ¬mº^y&ÖÑm«Hu¬©¦œ(£¶îihÝšXŸ’¶¦ªÞd®hÞzvC+JI)‡«ÏZœxF†;žÚ\µœ¶à˜5+¶<²B‘ŒX(ÔÖJœ½¯Î‡W#–•wÌæ7æÊ;É$½çð­l ².§}hÂI"­*­*¯¥¬íŒ‰äÕ[×%£êcŒ µdEêRZ>õMy5].yÇß²©.#´lÑq›z,ùÀaÃHɘµnÀ§”¥”Ô4¬ùƒ¦§ô)©©9áE«BymÝZ6…RšÒ¶ÄP Ûš¶²My‘H¬)-•d޹j(žrñ:CÓú"]XvmˆÙÏ:ãÿnĺiS_8ßõ&ãø†Ÿ_ÒŒ§’—î´…©ùîl=qãþXÆÛ·pÞ¼Y¿¾øyËm%NÃÌŽ ´ØŸu~Ç'ƒ×$îdÂ^ûüÂã*2jbYUE)u¡º. +ÒBóªVä,ú¡À{z j¡Œ kh }â-e ï*Zð-œUpXú 2¦ ÚòÅZIjšl­ÿÓ¨ù?BJÕ¢–ªƒ2Â+ß›/ RæöŒ ‹N{Iˆng­›vÈ!k²ŠÞ6¬W[¬aTd-Y¶ñ©oÉ$ÉÂ+fU<«eQÎ)‰7XSÊY-%‘=yŸ[óc›jÒB¿ñE)«Ò%kJ6üÚO…ÊioK[öÇ7°åœ°²]»þæOè=;)ùï{þ&ùîìœ-‡¶ÓãŒ9yWJ¬¦UEU95)´MY¯úÀšyO¨*¨ê’±î×¾+'-’ÕÐ’qÉ’gÒRtÚYG ¡lCKŸPÕ›RžéµâußÕ–R¶.­%'R0½=þYE5ëYdU±’Ò¸Eô@—n'ä-yÙ #B%kšRIEªœ yHóVÌØçˆ YEïÐ/JÞš0û¦À§^R·`T¨d+ ø6"?ãqç<á_ú¥ÄºiÅÓžõ™SÚþÄœß8ä%ÿ†ŠSÖ55ØÄ  …¬E½"BXÑ弑³–|Ï„–SNªHéÕ²ì.¨Y1ìg>õ!Y‘)o+)ö¡g¬{Ml]Ñsü3#Vä,Õ´êIÇüRÖŠ†¢M¡aKºüôºP£)}®yx×4ô|! ézùÛPi*ْɲ۞ò×ÜÞ¶@(õ½DÞÇ×Lù¡ª8YáŶR®„Uazm{Þs4¹Æûä­ˆÑh;¯Ý3^½R;©W¾)#½½.¹Â¿-Ü1ù]߆FR­ýú»QÙîï•Õû´™m2ï“ußù·dT¶ü%‹7Q›m­?¶bE¤¡¨"Z“UéµfïzÃ%y½=í’WüÜ9ÝÞX¶×Œq§äåĺÍÈ8åÇŠ>õ¬K~-kFʇýFEJ ’uRÅA/û¥œU½6mê·aP8k$™xæDž¼CÕÉš“ Þ3émÓ²þ¦9sï9iÆ ¿å¬u+X±ß”IŸ+Êt¹ì—½­‰nRžõŽYëšF}hVËš. )3š –”5•Ä~‰iCb¯(yNÖ_Ê(ʉ,*Ùð k^ðpÚŒËY+ÞÁŠ}.Úãs9±²Ϫù؇úü(™#n»glj©ëÕêKâ(#=h*[Ö²¦nYM¡À ÈºŒAÕäó­ y]YFKhXEÍ€´†>]š"m)%l`D#YyuÛв¬¡¢[ZIY¿¦’q«ŠRÈË[qXAQ jXE$cRF,R’1hA¯šqy³¦Œ]㨚6¸m»ÅûÖü‘Œ¶¶X$%”©ÉªIÙ2]þÂAŸù¡–¬†SºÖ–Ñöާõ«Ë$ÛÓ%ëÊ ‰hªÉɩښҋZ>–3ãG‰O >pܘŒY›žùB4K¼íPËÖö©Yy£^‰ÔÕå’Épkå™›1޼7Ä& Š}ê1¡PSÊšH—tâeTP ´>Ôå3?•VW¨ÊˆÄÒ>¶Ç¤¶Ø OÈ¡jy»­mc·¨á|Ùô-žÁPËZZbEkºu)I‰Ut©àeŒš6lEŸ ‘½æ…B9ãj&-ˉZ†´¤m2bE¿5±M“Z")5Y-5]2ÊVÑÖV*Z¶ªmËÁrÕ„´YÞ¿ã(†>=¦4ÍÉZ–Ó/mÔ‚–²u%{- ²&¬Ûk^I$LjB¦¥d–Œ¨«É äúœhØä)‘UUYY¶¬–¼¢e¡½Î³ d+õFVQFVZ¯Ð¬-n(c9Ãø…½.›°Ï)%Ϩ%êŸ-NÁ)9b¡´@ÃÇ&íÑ–Ò(ØDJà”Á$iL¡‚”z¢0Ii ä45´“§-ÔXqưçUlìxŸ»ÍÛ{‡cANCAC.± T5äµdôµ¬¥Ç€YúegíIKê‰-cQ(…U5Y-u)%+rZæm¥nɈe4e- åm(Ô¶&­läºñÏYÒ+¶.¯Ç˜9UyÙ[F\™³ëRÊVźlˆ¥”6eT5,)«ë±ªiÄå× íµ°ýÖlš´(/ˆ Z—ÖЫ²Ëì_•5„¬H -ïiy?ªj;bŸPÊOÕeµÏfšª2RÒ"ui‘XʳHyQ,VLŠ?I&™†œ@F,ðm›ò)ß÷’+[-YyG¤eü,Ñ…§UŒzRAMAEM^I[Éãö«%‚ -å@ò8ß~jþKe5i)½Öuù±Ë^3â²!ŒøW5¼#§é¯´mš´äc—M+ÉXvÜ¢_‰Œ -°nÓUKÉnì˜}~ƒu9Ï÷†—\ð U?Õð®U§’ºêïËß ¾Y|Í¿»Ñ´×6,jûW\òœ ¡Œª^›¾¯è#)û±Ð¬%Uƒ>SwBª’.‘=UC¾íbëRŽxÆ›^0ë—Z–}Ǩa̪HÝ>ËÎÙã¢.óÜÆã£­zMýø[{9±b4½âyUgýHh-¹F &bG…‰u$ð¤dÊiQ²7±’l¥2|V^ÊÏmJ%–ŒXÊ!uÞa÷héò„½ªZ~å»ú­kÊIk‰Û]Ûi/Þ±¿Ç4“§:­!o!M-E±4Ž'ûÄXʸ¬="q¢£ÏHùi2)§µe=팦¦ Cê^ñ-½Éª¾)”Ñ”’ò£d×Lä”ï ôùS12Zrš"Y­ÄÉú[‰æüF£KËyÌ?±à„UÅ^·¤`Cɦßñ™’ß›´¬.¯ß’óÆ]ÒgÝóûKÃÎ*Yö„5¡X[MäqOyÃeÝVuÙ0ì;Þu ›2$Jô‚ ?Ü æÆ°Ëw!@^R•S¨Ê ²ä»š2Zòê2²ê R~®)§™ÜÃ@C¬ÌXArÌÖþ;P÷¾‘Ä™ûyPKQä$ö–Ôvì5œÌem)?ôŽ–ç4¡¿%žrw°Ç}aÛŽvEt¿´6#’¶&”¢ªeÀO’öRÏj&v¿À„Œ½ZÛ錆K+l?鷵ᦕ唕唤“fYÁ«~ïwIMðP^ ›¼¾)yoi* dÅrÒ2ºBYYeç}.Ñ@^ZFÚÛ2‰Œ…Þ@AM,'4­ˆ‚¶?¸¨!R—±d΢¼¼§•DR>Wñ¾3Ò?·_¨(#§ $/¯ wÛ©«å°o‹å´0fØ’–E+.ÊÚ“´$–¶©¡!RjÛ´—Õ4”¬ŸÖ-XÓe͆‚ëêRb‘Y òF­èµbC^J„”Mm5+ê.›¾­Ž¸©®©×¼šB¢3mjÊ‹¤eí±•³iIKSSEƺq«bi±%9–5’i»­­`^hÒŠn›Vå¤Ò´DêBm è3jÊÅ[¶sÍ›^»Ã×;–•‘Qò½Æ}_Ö¼×TådÍš‘’Š“•yNA˦߉E~­"–²nA>yb+.úÔe%i…Ä”Y´fÑÔÐTÐ’•Òk¯ª£7°w ظã¢[ËÖ–¬eï)È8êEi]Ò2)©DuxÖ’´T°æ7úMÛçÛ^õ¤%¬3m‹Éb)gÞA‹Î¨:èI¿qQ—) 5¡n"c6üZK—ƒÖÌJ9cÅÐÿ¿½ÿz²ëÊ|¿Ï>>Ož“ÞÂ;€ž,’U¬ª®®îéî1=£™ÑÄÕÅHqCÿzUÈ<)¤ÝÝîËHŠÐ\£™é˜žéé2]ŽÞ Â{¤wÇ›½õ›É„%@d"r+ˆÊ³Ï6k¯³÷ú­õ³šü@Æo,š3ê¸Ïú‰i+>’·š åÎDòþLFIU6VÈþ™Ž®”ª‚8ª¦«äïÇ«›§´‘“U—“òGzüŒv<›_]_¤eü©Ò*.xI?ÐɪËè(˜T\KÖ¿žYK÷écùž9-%u+þJGVÞkú¼kQk,ö3ïÙ¦.T1lʤr2:úµS¯ÍhÉsUGœ´´9Çt±,Ò/Ôµ¤WYKMËöKmiHˈª9£ºÎii«÷¦”}Îð‰®×¿!ãð˜³þ½—ÌZÔÒTRÑ‹½ÒnxÝ0ú<­¢âv:ê—òÎ9nI[KÑ ÿÔ¨“¦òc”òBôÝ´ªû¦¨×HÎÑûþuöù+/8­Gü­¡$¯àªiû,9o—P mQŸE-ei=šä•]uIÊŠI9×d4•êêUUö¥ŽšAy7l7fI¿kªÊºXDÍŠ¢’e×-™QÒÄ5,« «ÈÝg¨×65yu×¥tµ­Èihj¹¦bJפYÀ‘Ž´íæÕtÕìuÃ6_(jKk*iˆ,ȸá‹ò±Í&kV׈e—„Úò¾Ô2cTFE ë’¬¦”²×¥- ,ë7§!gDäjlˆ¾`û3ܦ¹nJɶا§OäšK^2‡wö tc+˪]ï”7Pò™À¡¬¶;eâ V¨7¶ðõU:&É]}k°§ºãdeÈÌ} E Fô«éšÑ¯a"vâèZ¶l@`›Šª”eÏY´ÍYM9ˆÔôJ™5©é¬i»d5,P3g‡È¢Ž²%Ë"9YÓjÚJB«–æ)#êrnˆô{þ-è5í²I9-UU¡æ7ÜQ’ee×嬈¤ÔäM dbÙ5oHGÓ¢®%0e̼«júSS5¦bDSÇ¢]ι¡®@ì†ÃC êzEWŨ%ûö”–’9¡×…±¿{ŒçU ý}‘À›æå‘QЈì¢'žÈ 4•”MÈ äÕõIùQüøDB¢ŽŒ]ô«*ÆP_):bÁQ¿ª» ê‡¦ýÂn9mKú´ôëèw݈ºÈ¯ ™°Ó_KËuÑ€‚ª´“¦´ÛßÔÒ*ˆ´d¼ê¼/tÕœ“·â7^×ãSŸ+{ÅIWÕõZˆ•}ó>ÕPŠÝ§ÏkxG¿® ^ú†Y>u8/#pÅoø­%“–d¼áS_*© öŠyYo¸¨iÙ †üNÉ2šÚ²ÕVLª˜÷mšö–†º¬@ÞœAo¬3ï}Sˇ 0ш¿ÔgGlÞ´»ŒHkɉôZ2-²#vîUÏ>Ž>)¯ËiÊ •U4¤µ1ê‡k“ŽÕõSÆOâ¼¾=ZFÔý0öŸ+ˆ´cÿý@Ú~ãú¬(«É`Yÿ}ÝÏ+ªžF¦>=þ8vA'k«XÖµº-áu]i-E?2ìŸ ´„2"9“Þ(Jùc "iŽ–¶´¢–‚y¡vlÙ uMŸ>?VP1(íDz"%“úô¨HéŠÌÝÃ9àSEpØ‚a³&,Ëû\ײUÐWôúke rºÒzLû1ès—ôYqVAMÙ§þ±ŒŽÏDúEºêš²ö8bÞ¯ `Åy}–ŒXpÔ5wlݨS÷ùt½iA^ÃˆÙØQ&R±‚§íQ¶¬¬&/ðâš“@ÁëúüS]8KUÅœ1;”bLYyݸ|ÕŸú½¢h*j)[$NdsJÕfYVH¬RëêQWÐ@A ò¢¼®Ðpl¡¸;~‡/Ô,8á§þÎnϲM5C±ånØõ[0,ð’HNÓq‘Ao ¤ýHA$ëçªöªcÕíá+R…5‰9»ÑëU+z…ZzâÚ¯œï‚Ø+ƒÀ®¸á¥øÛiç¼KÝUSpèÇ•­ÎT‹Þ¶Ï¨H¤dÕŒ6¿ôŸ¡`D¤GÊ¢@Ó¢}ßên¾Š¾*ÔoÚ’>}†¼ç‡®ikš±×´ónèÅŸzu)mSªÚ±ãqÁ¹ØÑ±äŠA KòêòŽëuUZÛŒ>7„®yQÑŒ>ó^t]C䚣®:ªá’AŸJ©Rp9Ö8gïc¶Û‘1-§fHˆºÐ Úš®ÊZ0£n̬óÚ^Õ0oÙ´^Óú]W6§_KEJ ã3½êÒq+/ë•rQÛ«¦ÌX¹ÿ¯¸“áó^ÏÙ Èúu½dÚ^Xw†ÀL™þÕʧï¦ã#“ë•{DÊj>5(sSö¥ þŒM¢]P7l»¦%ã˜7#ãˆH ¢)…Qâ;¿ñ±êqW´šÎ労ããG¡~ ÆÖ”aE-ÂØÉû´qy9«Bú²ë"£JÞ²OYÁy;íU1åº×rÙ /˜’WöµÃv$0çbīىø»’’@ÁŠiýž‹÷w¾Ÿ’~‹úUqÅ^7ô˜3*tTŸPÕS>3¢£hF¿Ð‚‘sΚбl\ÕKæÕ•jRftbß²–‹ŽH« ]3hQu»]vÅÝ¢Oú´4ïáÊñUÆ@΄÷Õm‹'¦ YUT÷™–ò¾×¥Ö~·¯Ÿ°‚”ë®zY§–É[Í•û®²Ã(XZ7 ¾é- †õ‹X‹*/húS½²Fã«OûÒDÄ®¶„~ïÙu Ò·í_ÛûVf£ÿ:Ûõú™¬cRÎêןµG¯š3Î8fH´ö|Íê*êÅ«jòëž… ý<¡ß“nœsÀ)Ï«[ѯhZZ`¯ýæý.v†›4'ã´È„œ9ç,[YÏËj«·ì3uªz5}n̘n¶$0å ëž³]ÛU³êÈ4ë¬?wÂÄ·Ê&[òª/‹„ztŒH{Í‚cJ?Ò•×PðTü˜-;¦OÛëVS,wõ¨i dDRzuõ8j¿ë†¬h â Ó‘‚H¨­¨ÇrRÒ^7eL]É]9ƒ ª~`yU}ZúTÔÖ\xïþŠW7¢¦¦OGä¸vGqÙ ºHÑ¢²E]/ãCýj Ǻ$”V5lVÙ‚’-¸.T8hÜÛΨéSUrÒ3uô¸bN¤`VÕ„À¢IM³ŽÛs÷qÊ5YKŽëuÂ9jÚ'² fô«˜³WËgº&Ì©ú¹â~~άwlwÚ3¦e¼á¼O5c£õ¢ß{IÏôù[ýjü^Í€«²^ð…”eûöŽHÁ‚´e9%EW5à-YEË2Rúsͯíó™e³¯ÝqÍøŒ†×täeìVÔ‘ö_õÄ~mW´UUÓÑÒ0iÆ%£>·d‡QœÑéPÓ§««¢#k ó~à]ãk¢yHG×´Y7Œ)ÉéW5«mEÕ°–P`¿”Euç-;m¿² † Ó‰Õ9œyÉ”s³†})­fH^E NØ¡èC¡¶kk™Ö–’¶ëù»`ž]%ÔÔ¶M´NôtuÊÙ%òG†ñÂú«yf¯‚:&×=–ëÑHÃ.eQ\Åau[]æ–RJ¶†”mqtÇj´|¤/þouf0Ï›† ‹Ô×yd„²·ˆ”a«1È«G5Öt‘zìI¶úiuÓŽÓÌDêñÌçÖùM¤WJJ'N²Þ/Šçú“ñqëIiÞÔžY—ïòˤLc©Ôë¾Ð+§æ”Q]¡Od,š1(o¿š)i=j.«3¯lEŸ~ï; 2­ès5Ãr.5ÏQ/M¨¨™“vQW à¢¢kòªjVŒé3¯Oݬ¼‹2BeE :"'dÜo®3¸nÄóf””õ¸¤âiuG½§Œi)yoÇ~÷ƒªNéqÕ¨¢†‚w­Ór‘)%+¸äYeƒ®9eRFËeeçëbIg²ì]ÓoÙ¼%ŒÛeÎŒmz|é¨s^×QRÒÐã}ËFn™Ï‡ñ\=ŠÝï1š—1!£OäÅØ³WŸeiƒ ¾JU_¾éͺ™¶yý~nX`Ld4~GÆ„q Ý­ÏÚê»2{h;툓†]7윲‚Ï ªJ›Ž³ œÖõ‚-Ó>•1b›Eu™Ø31¶$ï’kF ÷‰+z•-¸¦£¢+VÕŠäC'7)ë3 ]°Í”²š!ËžuAGÕy9œfmDœ[7"¬˜5"sËZ{õ­¯X3ëMs†üÒ€´‚ª-tõøH×’Qo–Òô…–ŒaEÛ} ­fÙ„å8º/íšEÃ"YóÆb+ÈC–¼õ2š&µ –|îq)W-jy]Þ’’ŽŒ*”‘óªY‡õh‹µ‚ƒB¡AÏ[é±"í²!%iãútÕ”\Vöt¬nXÍ?”×±ÿ烾¸«Fþ«AôÌ¿¹÷ pÕWŒ(|£ º_½R<Œm.Rn*ÐðÔÚ§acë o%ýE€¶û©U³iª¼À?RU0/1$tÍ«Q©¼ey-ƒz +èÊú¡¶@F»h™“ñ·^±Sèyï›p\¨Èȉô[‰}ø+BCRf jİ¡«.Þg ú݈îzÉêñgÈZÔï9E ÃM_* Ч jÀq!R2²z¼;K…"ÏJËyV]R"iem%ÓòBGtâ ÏØ§lÁq5«S”ºm?Ó•Òµ[$RS7èùØÎ˜“^«ÜÎjQâîëyK‹|â’>»Öžž ~g/›×]Wßûî¬zž»Ç³V÷ô-Û†}q—½#9?Õð§VÅ‚1gä½lFZ`§ƒ/Y6Œ^M“R^BIe͈ê(+ªÈêà‚‚ŠÀ°×ã¿«JΊ´²¦À)‘¢HѬ×Ìk+êÊzÉ娗qÌ’è–q)V-–t´Ý¸ƒ9nE ««Ï³FümaìåUQ3d$v7IÉH 5¤ôkŠ<­ÏN+J ›Ó‰ï '%oÑôZ5îYPꤴ÷5¯ ïø(*–ŒÈk˜Ñ•Ž‹þ¬Oäµ>eÁz{ÉÍ9s – ޤà ,Z2뿦ë›M¸«äÛÅsòûË5üàtüÎ+z}`ÐÞ^ÝÁºÞ{+ƒ÷õ[¬çë‚R4…k )VœP±Ïøó׉;>ÙA) ô¥þ›fŸ¡šOYŒ³êλ¾ÎS¯ë‡W÷6°fÏiùT`ï78N.êºã½ÞžL1R¹KÙVìÑ·Jל¢ºN8tÏÔKÒ²ò"ŸÙ¹6“?iB¿ý-Û»K.9ºÖê†Ï#ªW«$]Yç-·>™âý3Ry1ï°ëòªz…ªËúLÙ²‚”)uû5œvÙQSzÞõ†ŒrRšf×õš6*TwXÚ%¿ˆ³´Ž ½äs׌ÇeƒîLZÑ5+Z~êKE¿1Ç åE\É(:ë)×üX cÁÌ)Hs^WɤÏìpÕŒ½r:RÞò‚PÃßXR’ŠËR]ÆÙ…ßÖ«áY_èÊÊ:%ï}½>Ô”6&%0çŠU+Áÿ䘪¿Q²íÆ‚¶i—µLxEÏ=M¤±©Å“û-|«‡‘ -Êhˆì·Ã9UsrJFäD®‰d0jÁ€†=z\Ôã„HÛ çÜP7¦aÁ–”½"+2-熖)uÛº'÷ÏkË µ}â’íg㜿÷ϸ?y¤zˆ ÎL}ׯ$Žûþ˜rÒ6îñzíõ™C›>´?æÂj\ìò&—äù.²[GQŨeCò&”šôž#]=ž‰³ô”TLâ‡Ò–‘Sˆ+ndÓ±OW¨Ï¸^¡}Ëæ¼è]}þ¹ýæEzâçúR9cž²ÃŠç]EJ ¥ß?7oÔ‚K†=£éSÏÝc`Ì8f5±]EÙe•,Y;i´Ïªž¾OŸ–íB;EºÆôè×ã)óöH9fÐnmY5YM{tíÁnôišÕ+m§@Z–¢eû•TqCäU½šXPD]×H\ƒ¢O5¾³÷= GV\2£l¯‘o|‹»º°Bxpóîž²¬ÏŠÓ¶I;¤¦WÕ¨»Ôí’1§UÕÔ5yÊœŒ¡WtÕô(:¤m/¨Ùm»šm³ k"öoLé ,-e‘¸òaÖòÁÁLRïaÙhÚ>·àØ7 ¤‘ßzæ;1Ø6¼åøø\ÚÁ­nÐÁzÈíÜVt%ž‚t\´;~i¦âênëiY²„=ë^¬¯LÉt51¥a‡3v*Zõ%+H¡ã‚Ýñï·äŠ~Û¤|¥y^=×i»oaœ‡l•;”º¦E÷¨B׎Û¬§#ÐPŒ¯?mEöŽiÏ)­¥?¿_î]Pªå†«Z&í¸çºãkª>ðÆ&ªvkÞóÆmbìn6»ÑŽ“{Ô̬[øhÆé Ž–wMù V¬xÛv‹ºìs\Ú)g•ìЖIyϬ9U½qÍÀϵ-Êû‚®ýNÕ€¶c^pÕ%-³~,í7†ü;GŒù\AÇ)Ë z½« «Ïþ¡ì#v_8ã-ãq>Ø«f°¤$­¨mVÉóN:æKí’–ö‘¢ŸnJ[" ×]Ã6¸ØmmSÊã~MJåo)@*þ ßy}VWqÝŠ‚š‘]ÞÔô®¢È‚ãFœTrHÆuÈ(; ¢âŠÏmó¥À9äït-ZÑVWQ2iA¯È¯õûƒ½§,ø¹ñMv¼ÙYö‰¢×ï[ÛYÔkê¾Kó<®„×E&g-®UçKxJV“F¶dåuìð¡cNKË»aÁçŽ8¿ø—âôqã.*:lµÌèj櫃*¶ÉÊk;jɘY‘’PVVGѰ¦jãi‘ ]—Yr\Ö¼]·ó ¬I#ºjFtMb(V­å¤iˆëN dä (uÌýÑ1ëŠÃŽøVC]e“³Ðoq] ïƒ·GÖ€Y{´õ ôš1lPNSGÓn)yeyÖÖÐ+mL^QÎSš&e T1¤i¯kJò͈҆ ËkbRCŸE½–Œ)X‘»Ït[É&Û@Bç]tÐözÉ®»è[Ü1ËŠýpÝkuVͱ­nÔÀ½m ¸Í™ûª¶=k>ìU_G2íç^qʸk{}lÔ¶‡tQ?©_÷^­}×î5Hn-ŠåaxÐV·±{C†ê¯l ¡eWÌ)Ønì!-ïÚuŸZ‰oË”‹^¹eÛýÚ@îÔÏYçí3¬î‚¦š—oËÿàŽÇE¸fÁvƒkOáÝ®²þ¸oæ¬æ=j}n2›k©:!ðƒÖ :¥ºé³“ÍeNÿM³²Q‹ñ\õI$eÁGÔO>ºéSt‡}2æÌ®ûÓ]|Ÿ)xõëÁVž„ëf4Œ:¬_J¤½i’5ýZ2q¡Í¢GK] §ýl.ß?6,dÉ ½ŽùÔ—&4t½ú I¦|aÉ€šECªŽ®+OôxsÃÇ–ô+¨Ú½®êĬ·µŒXÐ0¨êõï¬Á8áÉ"RuÝ´®;œ² gZAFq-ŸÛF_ñwqþ²ŠŒoÚÐúŠº1)o&Ù 6–• ™‡Îxß^ÏÉèȺ`Qõ–§Έ”¬ii5-MS[ÝY÷Í´a,º¤s“¶_¯šŽ†–Žeó[ÝЄï=‘Š3þà}M‡½áˆ>ûœÕoA[èºö¦\·#”Æ KëJ3o4)yË2ΨÇe}6’ X;V}"íµØëè€mR²ºmOrÙ«v™×«òĸÀ†–¶ =ê7õBVZÞQ%+zT{H©˜2¥cØÓú×)ˆkŽ:ÆÝ¬X¦ÀkB¡ü¦°] ™ÄwÃyH¹ìŒ}v­ió¾¡øçƒ°ÃE»dóĈª¢8;‘ÛDÄ„¬Qô<Ì [D¨ê†i]Cž6p›mqĨì&çaªÉor“¯èÕL²Ðm%@Nh{yÓ†Â~CÎÛõ„é-oMb²žq7’„& [F¨â†i¡a‡oZu¬g³Œà¶ð¾Í£×Â#ºÒ÷‘o-@"7|n§}›èÕò7þGÿ·¤k¾-·&1YO’Ð$ak­¸aVhØ3ú¶Ü£ñѽ=ß©Ô8ßR€´|né¡Ã¿‰¬a—U· [¾-‘®Æ=¼ÏRúÍ'$áÒµìº9ŒxFßcà: Ô™b^7 àÝ4¸_[êÚ>5zK¸`Ë”pƒøŸ¸æê&zi@ÑÈ©•êþk ÏÜUé¹â¿õ¯<¿©÷“ð}'t,¹n^Ú¨ãÊèX%ðKÿoÿÌŸ<eníD€lܯÿ½ÿÞÿÂË·ùX]wÒ¡`tüÁºJÿ•ÐÜÚ§«†ÄÕî}LǧþdƒüÐ#ÿ?Kþå=Ö ïúoüi"@6‘Eÿ/Ï0'gÌÞ‡L»¾Lû×^|D­JÉj<2‹Ë÷L¤}߃rʧþwüÏ ®é¿Š¦ítÔïñô-iת>õÒ-Z×l[·ˆý\ïZVûÈ¢r,Ù>1l8®æ\W“2pÇÇ·lëZ2¨kå¦c>6~‹OFÛÊ·N³Ý½emÚæ_Ù÷NJ&¾r{ þ•ßËëèÞÔ¯™ÇîOxXÚ„üw Lù?úïü/ýWvè•RQùÆ£"™5ÏÁ¯¶Üÿ¸ð ¤íò¡µ)Wn‹Ï©'.ó›Dp=úàtò'wÐÎ5ÍŠÃqÁœóªŽºèß{USY‘Çe}ä’çTt䤅– [V*éHÉøÄaÇüʶ‚5)y%³Îù瓳Ë%UeG|윧ÕD^6å‚I—œð/4ü;ošRV—õ¢ßÅÕ š röÐö{¯}ËÄ+o©Ütd×§Ž©ùqœ0îs±P |aÐøM¯ÎŠÅB2á»ÃY_˜X÷;ßOº¯÷ýjíüMëçÛ™sIǘ½B7¯æ£›®ps[®ùÑMƒìŒ·7ñ™\veÓªèU¿%qþIyû7í^¾×¬dª¶yö¦ùð½xC aü襹%Þ|»²Šy)i½Æ}h^×'ú5ÌhúyËR®ò©¬e}ÊÚ˜²Ûo5 »áÓ¸]M74ˆë_—µeLKÉ™qÝ€Ž]ò:²~¯jÌ3–qÁ‚ %meŸÊ{Ç]‡Dβ¢mÞ亪å߆HËË·” z“µ’•X‹|mx~­”åë· )o'~"ßAºö{zݧ?˜T•7~‘R-:¢e^롆¾ŽF<=lùÔ³ºB=˜vÞž›â0Þ-ÜjÓ4·IDAT¾e hØæùûœŒ÷GÚçj·l+ܶ%a£È< )$}‡¿¾â˜ífôbNV‡d´ ¨ÚiN¤¬,Ò1 î¨Š–>KÆpÔˆ—„J»eM®Í‚d¤¤ä¤í’2e/¶+xES OäeC [({NEÏZ‘S2iBÓ`¼Dï<äcÜ3Åcê>÷Ûj—Ê„Í'­â#WuÃ Š¼®´ãª¾4쪒–’~>øÐqUÿƒ£Néj«8nÑ)CÒ*†Më3¯WÛAýNZU9Q3nJÉ€ëÆ,k8íM×Xð©£>2ã;̉¾!ïÁDžǃÔmjÃb’4hÓ¸å YV\·éËu9WéúÂ>=*ξÍê@ÆósÞŠœ½J(:Û’Qb݃[3›·.™õœ†I+±R¬¥í€šHF^Sw­~ÀskÇ×M·¢ß‚lÜžHÁ6eãˆD†ì²Zƒ9r`;sÁEO?aa ŠÝþ³!'µŒéxÎ/ Ù犷 #£×þY_ eL.^Y¿cFÉvmלwØe9ÃRûP¯´Oö‘ASFMkÈ™–Ùm\ÞÛæF¥… "ïèU׿î-º;g]3êÀ]ÉY}Fï°ýŠeOßÃç+ÒT3»Vò ÔT¸£µhµjá)ú¿±­ó.ØyÇöäµ6õ—ý>?MÉ)™—Õ5jYÀÛ^“wBVÖ˜ëúÔ½#­nLÃw _±è?ùKKN3«Ç¢‚ƒ]’–ó´Š/åttt (x×Ãþ#>CΊ-ì‚)óþÒ ó²FL8««¥a̲¼Œ“–,™UQ·lØ)+øBAÝ6;œvÕ˜Þõ¦Š¢–¢Ý›`Þ|OËñoÜ+tVá'¶ÖI·c—?RÖTÕkÞ.ÐgØ RRHKÒq Guízã.©ûŒ¦~sú,ØæY#Êž“ö-ût´¤k5kPZ¯Š³ªB{t=¥bæ}Õ\ÔrÞœ²1ý¾P²š„$-rÐŒs&Ô )˜—’–‘¶Û/íqBÑ‚!{œ–Ó–YÔ§nÒˆÿÞaŸ Ç¬§ÔüŸšÖkAF[Ÿ¦’eç ú‹Î{Á¼ û\0cTKW¯EK fTî"@:ÂÇÆ‰ù»E,@n8#“6ä]/øHIFPÛR >2àŒ!Y¿Ör\ÖîqÚ”E³ÞVÓÑÖ+«Ïe Ã8%PPÔQ•RWÖ•ˆ¤½'ï¢IƒX¶ i9£i‡q§¬HÉûPŸÀk®È™tÕ ZvŠ0§¡iÚT\Öõ´¼3N–U¶c–çÙ[Ž/è4 ¯õçõßõ]Hɽã 3þ¡ÓzÔ”\6¦å€ÐÛ~芌†asªê~b¿’Y fñt|*«ku¨¹áœCþT ’õ¡ii)»Þ•vCcÎéqÚ˜®¡dÌû­šªa=n¸æ=C••õë÷¥Ÿ*ÜÅ=>#ÒMȦ?9v!DÞó¼¦_켔ݢ¦ŸhY2¬aß=ã­éñ„bÄ”A¿3n‡º!i”L¼D†…z,ë“vXÇ.])£:Úúdµ4LÈ)a¯%ׄþÔ²>-m“B9„ʦd…†ÕeÐ1¦îi'íQ)ÐÔÙ÷Ê¡ûŠ&)z“MNU—ð¸pJ]QÞ€Y£æ¬è±Ç’óŠr朕’6jм_è5 0bNMId·Ž¿ö‚¢1M'ŒèèÄ3ïEÛŒ8'¥cЯíÑ6 -³Ê–-)‰ÔLZ”“Ró‰ý:J"㦅– ßµÒNYcþ‰Ë&dl“5é’æ4t xYÓ.ôjxÞuì3`Év+J2žÒQtMAÎNCöHyFÃN‘ý:ö(ڧײIuC¶Û§ß°Y”…Bƒ Zu ê ÐðCM9iU]cB»ïRã0#¥“Úbrð%X¿âÍ;n½÷¼þ< ®éˆ¼’Ÿ|ÃYŸ÷µ ã*Gb3w1vÍ 9%¯¸öÝÍ/­}~E`AÖäMsþ ‘cÜGe:¾Ë„ïÓ|¨Ç9}B-#Z~&ÐqQC^FÁ‡{í°¢_Ÿ .ÈèSÕ¯bļ¬÷Íû—]ö+¬(*+؇9 ª 2¦ÍÆj®·m÷¡’)%‘ÈGfõJyÅŠ¶‹:2ÞÕ§ê°é» CñÛ´K eÌ.…uŠëïÛ7ˆßÐÈë7m}6Þw•Õ¬c7]%ðêºOÛ¹%ÍÉs·ì=nÒž[Þýí÷x£RÒI%M" =œÝ|¾žxiy?W¹¢iÔŠŒº”íæuõX4dAQM^MÆNŸûØ_Þw»A Ñý÷a"<¾?LZÒ´Ã.U£¦ ›Ò¯¥£WŸŒ–^imC")ƒ2˜”ÒÔ²Û¬À}–äV󜦼´ª¢¶œ†‚¢>m]í”yJÕ!‹žVG(¯c{|Ý£šÊRrê–нG²óõOj.žd~ÓÓ|ÃçûÝçîì{àc²‰£ü&‘¡«û-ý½7^®>¹¢kPÛk"ï©YÑا¥¡¦i@CQgüÙJ"»Fìëz5¼Ç~©MÎô•°•4-ð‚œÏ °â´Ò2AMÆó}:NÉ8?ß_­Ö¼êÐ-áóºíÉÚá~¨;eÐÐ]?o=.Ü‹»§# ¢‡ŽIëÜÁÚ‘Í"SrÚï¾åϨ޴ˆÝmGU ™5*cÒ cÔ X0 .«$º`×–zªz¼ w¢±æiÕë#ù»îWK\¿ƒdœ´,Hùð¶o«¦Ò2¯x‡\޽ö?h¬ÙW9ým L›ajMx­Òcú[ ÷º^UÝÈι$m»ôC¦d Tc¥Ùzr‰#ï&„Q÷!“@:žG­¦2yX"ïØfgü‚µt P*Î-­¥l܈Èä2 ï9GK­…Þ{¿¯{1á»CÇò=Ã@`Å%ÓŠžÖwß)NªNÜd1Ø(2·$z≮p7RÞ7hßûeÑ)M{m—y(!r§·é¬æ¦¥Nù^³’Ù¨hÓ´‹:Ð=gÖÌMY€‚5ñµàXecð®ê·vñKÝç‘÷»_Âw‡Ì=ü#‹Î©÷Â]Hw#¯Íw3Ùœ(ôŠªçî’•aÔˆg\±Çö Îν„’ ߆ {J&e7¼È£b’L$á‘™wFÓnÇ¿w®¥çMÞc­ò²Egœ·Çö aùÄ k“ذß(kr«ï%!á±gÙ)uûM|'- ³÷ ?†À —,:ã ‘l⨲I<‰ÙÒžHZN›²ÏÎï¡ð€‹†ï«°ÓªYrÆ»7$gDfó ¿IHBÂ# 2å #Þ¸¯TßEÚ®­ ïý&^\";r Ê“lX›B"@6¶Ï-8~Ïô?ßu®êS~ #V…Ȳ3.ÚmÇCXŒ2¢D€l ‰IHØdV|hÐô²Õ-éÕâý·¶–Ð9ûÕ: zî³7ý^°âŒ‹vÙ ‘®Š´‚ªÞû:OÀëâóx“„„MeʧÝ3WÓƒö‰YCZB?z‚V47ðŽaó*†Ô¼'$¹}ž_"»d5ü{e9ƒÞ¸3¬ÖQMØx’U]BÂ&rÉg^´cC#7zÍmJ˜ßæ9ï˜aMƒòJKx†U!ò’e¿uV[A×¢û ©$aÐ&‘¬@6s.yuCUM]G½¦>˜Ea+™)ëqčЂú-éXî@ÙóVœuÞ.»•×*¾ó‘A⇵)$$!a“¸è’WïËqõAX­òdqÎ/È ôóPžheÏ©8ë¤ívß·a=•¨°6…D€$$l 7œÝññäÑpCˤ‡7Sò¬Š³~g»Ý÷uÞT²ÙHBÂ&°â³ÎsõÝäSÿÜ6ÁbSò¬W4üÞ©ûHÖžNȦ„„ §ã# lu3 ¦Uܤ¦×q¯h~£ µ,=QnO ‰ +!aÃùRi]é×#ôWþ“Ì7f”zæ,oàÙ2Îù—þžK5|é¿ëw½Ž«9ë÷&íQ×{‡t_úߨáÿ~³$|;’°Á,ºq_Ñ NÊyÿÿbÛùHß:ËÍú ë·ÝÊ­û}ý÷+~¨©ù­H`Éõ›ê¬ßNÑ1uçýÆëMÿ«ÛrM¢¬oûíûJ"@6˜SöË‹t7Üó'íÇþα»–G~˜3¯º‘œ#zyÛ°Š’À®u³úeç_ó;'m·HUÝÔZI¹®ÚMNÆs®?D¹¹Ygã¿" wõAuÆöeüƒ[ú'åç&Ì| ;H¤`ð‰óz{t$$!aCYÔ°5¿Ùp¬@ÝŸûbÃ´ŽŒ7o9k åcW¼¨cIMIÍeC>qÝ€jZvû7žõ‘PÁŒg4ý/Z4¤jÒ´È鏯zJÓ1¡S†]1 R±Ã‚UÑÅœ1) )Gn³"µüÞøí)«ÕGü?Õ”\c]ñ¹$åÊZ‰º`­¶)_‚ï\=4íçß²^é÷D€$$l(×âZ-e?ØÃíoÂ9›ÞÞ¦øÙã}ÛÌêsIÑ”)CZ&œvÁ%“zŒû+»duä4%§ÏN3"³>–³Û˜Ó2®qPŸ¼cDdi§õièè•ÕtEÛ‹~¡ ï6êóâȲ“^”Å g ¹b»/å5ì¶÷¦}+.9â´!ÃÒcÁ^ƒw8o×o“’{„„ ea­úvꉩûѽã <îO jª+)uň9#B)cÒŠúü<§î)‘ãZö*8¬«WVJ²~†ò:Êñ‚” B9@NÖ”¼@¨ˆ?W¿eØÿ¦;8§_ÚAUs8eAÝeϺêy §äU¥msCÙ;BS–\QÖô–¹¬{—dó‰úê^$$!aéèÜwšŽö=*_V4|Ï£#möMW›Ö4¤gŸ­ÉÉH¡&«a–]2jÉù{Š·+Úöxæ¦mcwIŸí뮺¼åøgãÿ¿=eâ%óvرö¹é’}Ò8ðýàK »¥¤¥…²òzõËéwÊß)ºè†>i_¨¹jAAQF ÿ–{M¸?’°t¹i`®»¨¤*¯"«Ç‚1mM}–œWöº®óò–FÍP“’÷Ž}†qÃ’^+z,TŸ)š>rT¤¬£«m—>Ë>7©WWF¯ë.{Á^œ•Ò1h‡wLÛç†Ïì6¢‰¦½· mÿÉ>+JšŠ–dåìÑqQ¯OzÕÌË¢-#-²¬ß„/e ›1lEZ]€~Û,˜Q2cHÆ[+ûBZÚ¸EéèQ·KÖy½Z¡š^ »î3Û†Õ¥deå½ì¢ !‘~¤ßœ”޲H¨O(§eزY{“œߊD€$$l it×½VŸš©©j”ÖpÒ´¢ŽWT¬Úú,èóWzdUô¡_G¤ëWùƒQW•4å¼eE^ÙQ5 ŸË ,Ä)ÒÓB—´u¥•4ÔutdÌ›×Òò‚ºq×¥´Íû²´ƒrwÐòµ]UQtM9ƒê~« ( ýÆnSzÌšYö'øPŸ/õJ«Ñõœ“†L:å=ÛÕ¥´äuu}(%¯ÏuysšjÚÞ°Û[&¬ £×5/{å¶¶E–”oY?•½®vØŽÀ˜Œ]¢8ò$žøJ%µêfü•!=ÐÒZ3•G–uåE÷-¼¾¿$$!aIKk¬ËδKÀy“j2Úµm——ÓrÐ’‘="³rþȲQsJºæUœôŒÃÚŽª:¢£­,gDhIJ´ÃZ¶)ˆŒH 4uERR¡¼f-{QÙŠEGÒÐÔØ©áy #²·EqGFôêQrÙ ‘HWÆ82 ês@¿†®Ëè5 ¥£×[2fF¿9cÚº(Ø©`PGÁŠ‚È6))¡q¡>‘mÒvÊÛ§dÀ¬‚1;]dë ÌøÜSRr–•UôY¨Ôj—ƃBã ê>sQÇK**~(tQG^V¤jÀЬf,tófE®бâ‡IªŽo  H dq]Äó˜Ñ;Ù")Mçñ‚”´§õÇÎ¥«ÔD8ïûõñ_»§~5{^ý¼à”A?»¥5M-¼`Ä¢c/¬¹²®gqÎÏT4Ø·nÀŸ›Ñ•7dÞ³vÙ ŽaZ¤ë€ÕÖ_%2©ƒg=+°¬eXKFÚÏÌëCÛœñµuÁË–Œ­]ñàÚ˜Õñ¾Ž‘~mÛ\±Ë i) úm³WèªKæüÄnï˜IûD¤W„·tVNZEɲ‚´ô¨Ø®ÏYÕ[¢Yn' ʨëñÀÊjÌuª“¯¶®þ—÷t¼åUÜœš®÷®Çßú×ê¿Cw¬OXˆ;»ìZw¾ÛÏt3-¿2éK$£‚¬À|aÙ€ŠŒªªÊªÐõw^5hTÛß9®ONEs »Tµ,»àÑ/Rô×1$å×^7bYŸeüÒOô[TV1pËDdÐ  iv]ŸqiýzDze…B‘‚´”P×¸š¶Œ¬‚¶ª¬;5M)(j’Ñ–6¦+oΤ´}‚5A˜p7’°¡ ;ëÓÃ'¦n`ç+HäŠ1¿² ”—óŒï¸fRF$ò[ye] ¡¶OœÐñŽeCú4l³à¤=jÎÙ.‹ËΪè9碎c:Þ1êœKöèúƒšªM/­¹D¯oÛ¸¼>i«+¨g×Vh««´¯VU«~^³>5îOã#S:Îkû‰£kç Ö­Ê®¹è: B¹'æÜ*’°¡ÍÚ&¯â·[ݘû¤#wÓê'g·EúFdìó»uµ¤TåD"£æLˆ4⺀!2Šªzô5'»ô µä,I i(±bÒ„~iór:†5õ dõ7­âÊ:‡_R–½#u‡ì\¦¥XEµžÈ%—5‘ ŸÞµ'9gÖª$v{D‰€MHØP.›ò’Ûçõ3_å ýÎ zuE"‘´ÈemÑÆV—¬ÎZBnüW:þ;”J ã£#)¡´®H £³6çOëÊ¢#’Z³ ­·zDZ$mÖÙXÅYÒº©Ý«Åj\¶ ßÓŠw\1¤œ’µï[ýy}I0áÝXIV ̘3 Oäò>Ðr"Öý¯:¹®Š‰âoqÛìÿk5Pp‹Bè«mëýz0þú(ë”P7"°¼Ö“Á-ÉM"uWÝö”‰ØÚsgfdluç~yŸñ„„Çš¼~Së éO­lu#na莥¹Z¦\Õ4âx²FØ2’°áìpæ  <ö•WUVKÊöN†°-%éý„„ gØç–’úwN¤âªiÛ¾§Ê*áÑ„„ 'mÂ%Ƕºß)šn¸¦eÔsʉÊê1! ›ÀNo¯Ë®”ð0tÍ»bIŸ†ž˜ùß’° õ»b‡ÐWÑß¡|2o~@"+±ÊjÈ>e‡8SC ]9-¹D m‰IHØöúÔœ)E7äåôx3Y‘< 7\Ó1æÿÞY½j½þ­ÎÖôK æÔ ªúÁMበߞD€$$l ƒrŠ®zÍ9=Òf´r_t̹bE¿ƒ¥Ñi»WDù6ôÈhÆ!ŽMó‰Ù ’°Iì÷·Ž:b—”H7)YôD–]1+g»cëÄmÖO×Ô÷-ÏÜ6ì˜A+zT¿õYn%Ie’°iüÊž;T´H¸HÓu×tÛ®wíE'u¯¸'Ie’°y<ã »’d|ß@Ǭ+*®3[ñÑ °„Í& ›Ì~¿3gx«›a¯ã%ï Drö*y×iyUY‹ÆŒùk¯8꺇]•Sѯ©â9Þ—·„¬”²#~#4`^YK(èê÷¼ŸuÙ€^_±ßo jkJÉ‹¼ì‚ZÚÚšºöjøïüÏônu÷$| ’°Édò¹×·ÜwÌ€†Múµ]“uÒˆ«úU7¡+’ÖòŽ%E9\Ò¶SÊImrúœó3 2>–U6oLä¸ëN9ê²O ÊXV1¬-¯á²@Ú”> /8#²ä¼´#®yÁZ›*@nø?Ëø?Ýâ_à»G"@6IWœÛr|è9ãä¥Í6ä¥87ÔQU^Ð9,éÊ)Ë9nÁ.¼¦+%­£cÚFýK‹ú4DZú «ËÚé')¢ee]ÃÊvºâU šxÅOˉtuõ(zi““ö:-§¸Åýÿ]$ €#Þ6¡´…-hû̹¸2øv¸Í;lMä!ž·?ï³l—¢y¯Ñs‡9ýÈMµÇßSSó¬¢þµ3õ dpÖ‘xº“—Z¤©»A÷žõs9éoIëV2r‰‰IHx$ôÚëS¯ná°“ö¹ª®)¨ëª;,ã ƒvúDZMUE{}`Å‹Éú€º.eõ»bQÉuM>QV6k̬^‹ :vš@¯_{Ùr")»d”³ä†IçÕípUŸ9öÝÒ7-¿P’ òp΢)G¥¼wÓY)¡hM±­s¸y¿¯ÝREªþ(®ßw’ðHØã† öna ²n˜qÀ¦>—Ö¯ä]yÿÒ’÷äuJIdÂÓrÚÞR”2î]Mýžñ¾~W´äÜ0îcm9{œ“sΰ–Ð¨Ž—½­f@ÞSÞ¶lÁ²´Œ²¶_—‘ɸâCm#ºŽÞÖÚŽ’Yð™AûÖ<ž™ öîŠÖ}ji˜^S!®:3_ó‰çŒ;¡aRMVÃ’®¬ƒ}íIvQ±Ø½ùœ¦ƒR~»ak£'D€$$<ǼmDy‹®ډР²¢~;¬Ø®é ´®£úD†²–íØ#²GÕ~Êr^õ¡C i‘ ÛÍÚ§£î°ç-3­ßŒQGõšµMä€Ýnè™’3æÇÊôiØ)eŸ¶³zî°6 Z®Êù¥òv:¥€º¼»´]0nVA æ)K.Ê)pC¯Ee £Fý[Oùýæ”M±Ûœy-ËÆ½%¥Ç’]æ)¸hÎ6‘‚÷L˜WÐÔ#ç·&7-_דH"@%ûðƒ-~Ò^Y7HOtEo …† ]ênØiÕ–ÑUHoZµ‰d-ph-@0´SFÅ’Æœ‚qY³ƒ¤ü;8‚À˾0üJmtÓ‚;XTRrJ~«©á™v]IhV”A5ï*»¬dQ¿~MŸ äµ ºjHÑ)ûý}¡PÆGŠÎÙ¡á¢í¶k8a—´¢H$#cDÝ —\sRVÛ¬ÝNY6 kÐ!Ï|HuÚw‹D€$$<2v›q:6R?J"çuŒ›Ó«££ä}e£®ëØéŒ ^4¯ÇŠHJÉE‹ú½ï9Û\Ѓk:–ä\1©Ï”¦.ùÌ3šú\6lÆœiÇD»5M)Z2*cAV )+%gÔ9ãf•â½§ÿŽn¶Y+þ©+ vZòª/ìÑ4‹>ûô7 !4l.Ue5ÏêØ§h·”Ãj¶!°_ΰPWSËa”ÝðŒ†‚~i%  +/pÈ¢1¡A ¡{o œLHHBÂ##pÌŒ<ò ÂÀGB óŠ–õ + ½ï’ÿRÇŠ_*¸f\¯¶i5ºŠ*ZR>tͰ!M‘¼izÓGNûŸŠÔ|!¯íŒ²²>9£_ài¿¹¡äÏ´üÊN3Цm“÷s Õ-¬kÑí>j‘Q!Øþ¡a= 2V×0?¡¶œÀ6ÛÖî8 LŠ„ŽÝ2ì·Ì¼,+ôúM‘ïûÝP_‚õ-õ›{HHBÂ#¤à'¼öˆ}x"£:º& [R2§G(oTÓ¤zÔ=¥ ¬i—ëú- iH9feU‘1i¡‚ m#†DÆ-7('ã ÀVŒÉØëºèê³[¿Š]nÈ‹âuÀ¸‹zæîÐò¯2w­þ{5ïzF¤dAŸeÓ¶«ÉªQÖ6-寫K{ßs2¡tœ¢å²÷åÔ뜟J¹®mÄ¢~ëY%E5E'<«öîL"@)cæ}â¥GèÐhÙ.oȬ B‘í&¤üÌêÐ|Ô€´ÔšçÑá5_¦yuûÖÖL5 ƒ˜·Ó‘޵ćׄ†T<¥¡¥kÌ;„ºY ž²OZ´¶ø‘=‘Ù¸öùý°¨æ3sZV hÛኦT0£dÜO-ú[Û̸ä}ªÎYÔéõŒŒÓf…R>—×Jû@M kQ¤àm+ú…éšIÈ=IHBÂ#æ ·}¤qéMg¿Ï\÷Š¿sÜg^3è-/hëQò®ÝžR‘SÖ°"§¦„ÐçýÞOµ”uÙ_ˆ,û].ø£–”¼mÄGBc®4m»!5i)³VœÇtÌ(ʨ›ÖòœÓZ^Õyß>}Ê÷¥0*ÉP5¢fÜ´¬1‘¼^¡IYczì0§G^YE)CšB¡u‘¬^iy+úõÊiÊ+ Õ 0fYGd`Kž'‡D€$$}þÖy9cºR"‘¿Ð¯+犽H»dÑ”=¾Ð’ñîã^Ê^Vòœ@(ÿ¬¥ª§ê =~&Çn@gC^]õmó̺h‘Ë®z^™8¨0”I …–’õÇ7„„GNã>ñƒG–©£é´cÎÛ횺HGÁN-Yy«ÃÀ¨ºI)ƒèSÓÐÐU•—ÖÔ/#§©ë‚¡†^–£è:e‡ºI¦POYÀ6_ Б2 +'ã€H[`PÝ@¼"hÞ_Xrꎊ¾À,Vã»jR·T[Ik9wË1]Á]ܧCS¦îø]`îŽG,'‰Lb’‚R [Â9×½ºé3¸ŽßyMZ]J^SFGVK”–@GFFSWAGJV¨ª­€´®H £+£#§)–E]FW$#”•R)hǦꮌ¬0Ž×na5¯V -y-]´ŸizEZÅGÞˆcL.kÜE€"u f,ÊØoüz!嬌Ý éÓHI0!IA©„„­bŸŸzö‘ÌeÓ±u¡ˆq…¯ÿ*Ä{AÊ{ ŽÉi ôhèHk™•3$j;oЀ”¼«šv©Éhdžh"¡Ð'öÊÈÊÄ×à+…G.¾âzO´ç¸eHNÙ}Ç{éZ6kN[É^#wŒa¿vR‘pSHHBÂqÔÛÎÙ¿Õ͸…ÐU#þNDzìóïuÓ’2¬iÅŠnü… ¦×T“וWÑVV5ì¼¶³žsð¾®úÍóùPÕœ5YÞҟ ^Éo°E¤=ï-E“[Ý[(££Ž½rZrê&õh¸j¿O,Ø©n%Ž™µ ¯fR¤ ¥ƒ¼%cªB³÷)@îN¤aÞŒe~Û É'ˆÇ†D€$$l=ž÷¾žÇÊY4ð†‚¦œ†¬Žœç kËàEyÛtäER"½ö–Ó Ž©Éh"'rôóöƒéX2m^GɈýz»ÃcG"@¶ÏøÐ«›èÕ²°Î q?d´¥ud­½®GG ‹®6²º± @KZhÕe¶æé"¥¡þWÔtuUÌšÓÐcÐ3ÊÉ0õØ’ü2 [Ê„º÷½*·)gOsæ¡fîë *m« Kºªf¤üNÚ =’º=‰oB–ó¹%/or]ðÇ—HÂ9‹è7ªÿ>=«„Ï/¬Í`% [Näc¡ç¿góíHË¢Y :ÊF m¢•# ›B"@ºÞWôÌ÷B„D:q,GKѰaåM_}%dSH Òž÷®/· ØÔ£¤kÅœY yƒê—ù^ˆÌï.‰IHx,ÈzÑÛ2]`áF°8«.eÐ>ý²‰àøN„„Ç„¼—½-mÏV7dÃÕÍ›UA¿m¦e¥]3#’uàÆut|¬jÔuãvlu·|‡HHBÂcC—½#p}rYõ«šµ$R6ì )¬ø½>2¤ c×kn§å½gÜÛ“Õφ‘„„LjÞX„<™³äU¿ª9 ºzŒØ£÷&óø/èSÒUÄnËûl·[ËX">6Ä +!á1cŻپÕÍx"mËf-hê1bè.Ñã×&ÖÂå@¾ê…õUy©„ "ñÂJHxÜ({Ù{¢'bÒ‰G]ÞƒúîéWµš6rëðDtl4‰IHxì({É»<Æ"¤£bΜºìàW5ãÿ!ëmx«ò# !e¯xW÷.E•¶Ž®ªys*2úí2ðD$WÏúܦ”L¸’ðXRòŠw…önuC@¨fÞ¬ª@ŸIƒ ,8ºTpöN”ý=9%íM»Bê{šÉ,1¢'$<¶Ô½k›ý[8ÇÕ-˜µ"ÒgÄ`ì»ÑÔüÝZíT\ýkc{J$ÄUH‘PpÇÁ«{®þ®eN¹$eÇ]EÔê~Á}g¾5Cq¤éÇÔ)ù1!É…•ð8ÓðžÃúnª ¾ùDêÌY*1¤¸©a >óÚ.jbÌx<¨×œ×kÄu£® ´õÙ¡¥G D±ˆ\5"/ÐvÝó#B‘”@ˆ@W`UÐ J ZÆÔÖÎÆû|}îÕó­h˜X'âø½”é/ôXxa%$<μêôó¿õg›~­ª¦AM æ,é(¾-’cóHÇúô®¦íò¥?–R1©ë#O9eÊË~ëû±®³&EÆ-šWV—’–r¸§­È{GGÕ ÏbÔœŠ5‘Ù᪂ՕCª)ó›3¦kÄ¢–º®+©èQ‰u”µÔ°Ó/ʈWÑ÷T•Ø@s²ÚÎù¯½¡o¯ùÜÿɈ¡©hØN¥- v;gŸË~iNäëµÍiŠ‚}ÎÚ­íŒ :þ+>i8è’¼y§¥º>SÓë?Ûeܮʄ¦ìx×u2Jf¥=í#9KÎ!”³ä_xGhQÊ¢Žc¾0êK½zrÍv¿6â‡[ÒC‰IHx¤4½Wàûš ÖªßYŸ¼ÃÿÞßù+{6ÍÌXò¯ýÒöÞòA¡#­cD×NiCÚ:.xÉi;LiÈè"gÐ’PFÃ.»µtrŠV´eõÈëÓ5&¥hXSAʘº”ÃÊØîªÚ†í°„¢œªŽ®Œq7LX²MÝ„YOkS‘vÀ‚m½[ÜW[MbIHx¤,úÀK·l«XFÚ¨TlÊýÊL»*hR›L½w6û7}¿J(”‰÷¾»©8TõŽ—lÛ¢uÇ‚/¼¦¦&OlÝXµBd„:B9¡–†ݵšë´3æ½$\3´‡Ò±u"˜sÒk:ÂØk,Ð4§¤Ç²^+Úy%5e¤ÐtBÑ1«‚¬+­+%”Ñ]³œDjÎÚ¦/6üG~çÙï¥ äÑ¥ÃLHH}·ü¯ã#çýÞ¢^‘¼>_ªÆÂ¤¥¥]-'ebߢHJJNŸŒ´”¶”P Ÿ µÔ¥¬XÐéÑ*;¥!%uK  Þ2ññÿÖGfUÕ5µ¥T-XÑrQò«~«á„¨hjX6ê¸E Ÿº"ãc3jê²¨Š¤ÌhúØIYM i ~åïú®ø·Îùóê~­†e‘¶ÃªV¬˜÷žšuUmsšRj–tÕ¥<ㄳ*[ý8m)[½ZMHH°ËÛu¼ã¤k&ü¹/U-ˆ,Úç‚]Në•–ÒkÊó®y߈%i£½ì×ôK™Óò†A'uÌjé•ײ¨Ϥÿ¡/ÔÍ‹üTÿVßömŒÙnÁŠ®%ã²~â7Vd ©ú\GÖ¢_˜“1á×”Œ¹bÔ”~ËØí´‹B?¶ä÷úu¬ø…¦ ¼ãª,§ßNoi¹¦×ó©XôK ýf ª™“uÚ¸«jªÊ.³ àÏ}èš>-M)óÞ6æ/ž€PÊÍ"Y$$<´5d-ëÑ/e—:R²¶ë³KÉ€¼¡AËv«——2hAUÇœF•” «óš);cµÐŠ&Ø¥æ«X‹Ç!E!KªÈ葳¤¡¥-£ê»å…rjfu iŠìÒ@JÊ‚º9)9‘ŒHÛ¼+:–\vHÙ^Y m]9iYdжiÈHP5¦«fI[i%KV}Ʋ(Øê.ÛRHBÂ#eÑI¯ƒP[.¶LTdt…B)9-´…z´ôÄß…Ò(˜s΋:ºzT¥e5…"99 EšPà’”ýj±5à„ké Š·´«áol™ kÕB]¤+TR•Ò«ª.;éC"ÙØ©¶‹”zlïXݺÚo‘^mK²RêÊš²²ªºú±"'¯&¯%¯¡,R•RPS\K3ßUÐJKk:eÞÔt¤iu9‘¬Ü÷Ø’¨°¶ˆº_û±ŒŠ:R2>Vt@GJNÆ -/Æ¶Žœn8Ç€c9¡Ym;| ë˜BùØâ‘Ò±WZ¨W„Ƥt¥¤¤ttt¤xÌ’ ¶,¸fTY­8|2­c—³ú•E:RÚ¡”¢YEPKVYWzÏO ˆ¼­&ë ç)é*¤ô MKÕUÔ5¯"tDZ$’Š”Ì9*¯%'#eåt¾·)L¾" [ÂŒwÜðvlêŽô›2 `ÊE)9e׌á¯udí°¨©iÀÓB¿6*­iÊ€"¨iYÖ5 iίúÈuesúU {Ñ)çÕ¤äTõ©ëU÷CC[Ýë¸æ}Û¼cÖU#j ˆª–ª_y]Þ/mwYZ^NFSNW[dIÙY—T]—sÝ5¡Ðo\6䢶 ~àˆ9¿2¢)”–7£$¥ª eÁ›>´Ýi,ÙïyMoyÊ55ÖT¼d‡ßHùÉ÷Ú„„-¡¦&톲¼Æ×||z-k[ѯoM‘ùRCÃ^7üÈ5)¡~YY¡>gt-;æ† Ëš:.¸fLA]SWP˲š3 2zm÷ŽË¢Ç(Íù€^5%—EÆ|¡ƒy¡²š]Óvjº`ΰ´9£f”-PÑU3g›¦‹æ ([BFGdNN]ŸYƒVcÇ]Ô”2mTè²²ÐnY)½*êZjöJKÉúTMÁ€¶ºº¶ŠKš^[Ëáõ}$ [ÂNy-eµx¦±[¤£¨#¯£©¨ªGè5¡@ -Wì‘2ä  ý*lCJÇ ŽÞ¸°ÓÕÒ.:Œ®²¿ˆc"*ršJUÔ#2æu¡Hㆰ¢å#Û<-TÒëÇzbËH[NS ­#«.—“÷3ÝØÊÑÕ4eÆëZ±²© æ´À«ÆŒ+é¨(kËi ¤´,8 ©c¯^Yu½"/ B)%)eÃ/ޱùþòý¾û„„-#e 4|êu%«¾x5V‹¬*—&ã#¡A½"=¶¯Enò Œ DFâO£J"G¤­(F:&pEÊΛn-é¸WV™0£Ï€®=kõ<ÆÑ²²&ö"32¼*kѯŒ™ð‰gýÞ Y#ž1(k5Œ²écG•E&uÍÙ§Oœ•R’3†H*¾ÒW× Ö‚ƒ5„m[Ý][N"@¶„†ä-aÜUÓ^wÕ—-èâ× ©£`IÉŠ‘—,ù@¯¶ŽH¯¢Ã~­)k»-u}¶ëõ®®ÉÊXñ²¼”M+«È{ÍE×4U<㺼Š+Š^Ùêî¸#‘¿ö´jò¨Ê uò_ºîŒ¬Œe3ö;§éÒº¶ù–^sÞð+¯Hù[=FÌ(ª9¯dÑ%ÏéqBZÛqýN¸ìeG¥œqYÞ‚g ø­~y FÍ*[°Ã3ßsÃùz’°%,:©­_3ñœ÷œOŒ)袮꼚QsúõÔë#ûŒø¹*oQIÉóÚRf5-Ùï”c–\7ë†!³ú=%㤔Û½eÌ *Κ”õ™ ¶kX°Íó[Ýw$0bÎ"ý±«ö{Ç(ŠV”5 øRÝsV”teÍ™1¨nNÙ’I祴dEæåœ¶ÍûvJ{_ÖŠe˜ȸàsú´-ô¥ÐCv¨šWsÞˆ ZÆÕ½ñ½6šßJ"@¶„~¯éJI;Çf<¥_°…øK-¼e9ІumwØ>UC®+ =³–b±¥fX¯(kÈI©Ù¡é !vùK½vɱ °%‘^¹8Ìðqãyu!Zú=k»Œ–NìÔÜç/òôhè“õŒ’§\6ìEYÏ!åy‘¢º¬¨ÒÐgÞ¤ÀQ”Ž)©8ë%¯¹î˜º´®–WýÔ‚asJæãÈ„U’@„„GÊׄw¢ã¤Còf¥ ¢!%·îûššá›†°ÐIãÊ BsúoÚûAx< ïÕ¾@]ù-ì:iÀλj˜ÅÕåëÒ÷ì¡P[7¶pD¾ÐU2ꊑ5‹Ë9Œ)›6ꌜ–ƒvùmH˜°„Îj‹,ÛnÞûöZpÖ¸YU—õù±Ï­(h°¢ä C2ªÒ*¶©x×ý†ä|iÜ~_ uÔue,KË·€ºŒGq…ÃûcÙY%9+rzÍšˆ3ð.» WѸE †E8dÑ9ið/\rɈPSl­è:¤íßyÚ¡PÓyƒ^wÝ }¦”Õí4â}Ycf º®æ†®é”œßøGjþƒ§¼`NÆ3*ºn8mÅ‚ª]*‘Û£' [LËÇ®›òEœiwÙEç…ú\s Wõø@ _Ó˜e§tL¸nÔiY9Ë–Õ\ÐT–¶Ó‡f äÍxÚ]ŸËk[öª_ê3`×ch >eÎ 5çMëÓôš@Êu_uEŸËršöùÄŠ)ƒ\vÍgŒZÔ«_>2`\FWÚ;R®›0„/|l‡S.YöSg”|¢©Ç͈|é’EECÚR"mÿÙ¼ûqõ–¼"вq¤ÿ÷“D€$$l1i» ÉÉ ¥-£d¯H¯–£Vtë5aÑ 7¼,­f‡®nl#!%TsÞ!i{ŒËÊI‰ìˆCã2R5“þD(WÀx¼x åÔ¤´åt=#­hÙ3æåT³C]WIKÊ3ÎÚeEˆº EŠ”TíÔRVô´Ðmi#F„BãŽË*›°Í‘–!ûÍ ¤íTÕt@Û>˺ÆìéÉèUP”2f¿i#–ä¿×ëÄ’ðˆYô™×o+µžèŸS–·³>¨/rQÓ¸iïyFNN§al:aŸ=ë2€e½ÇyoýæN¿Ü÷wž„„GJÑÏuKWÐÇ+/ïÃ8¡¡eÖ ¶ª_ªÛgE¯)ÏýƤð1—O>‰IHx¤k*¦„ÍcPKר1½Ž¨¨ë5,’rNÚØV7ò;@"@¾cDÞ¸éóÁµíÁm%< ‰IHHØrÒf½·ÕøÖDæC§èGA-ou¾ï¬ÖV|rÉþþÙT+ÿð‚œ~¢/ï%tEXtdate:create2021-12-04T23:10:08+01:00È/-£%tEXtdate:modify2021-12-04T23:10:08+01:00¹r•IEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/logo-color-text.png0000664000175000017500000004201414152763504022143 0ustar arvidarvid‰PNG  IHDR]‹¾0gAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDùC» pHYséé3BtIMEä/-BÖIDATxÚíy|Õ}è¿¿3swí²6K²ñ†7VÞØ!„@ MH›¤Išä%Lš&¯M_ûÒ÷Ò6]Þk_Ú4ì¤Í¾²$@Xm˄հÁ»-[¶eíËÝæ÷þ8W×’-Ý{eË–±çKôq¤;÷Ì™33çwÎoNþcý¿"€ 1‚k"h‘ˆ©‘JƒT‰˜r)1˜ˆˆŒˆ &."½F¤S6sÀØ;Eu@ŒA2mÎzïD_®Ïۙȓÿë ÿˆAD2à 2YDæd¾ˆ™kD¦1µ‚)3"Q0"®`äðw1IAâF¤Ç Ù-ÈyMļj­FÌAoðœÆ5\WÓDߟ·']€|鹿# v§!€cÜ#2_0—‘å"fžP<Òª¤ñðÔÃÃC³`w,Ž&@иM  0.ޏ8b‘N"ò¢ O‘fÙŽJÒˆ†k§ø‚ÄÇÇǧPNšùÒ³_Ȫ‘ãÎ1bn‘ f¡)!GBSÄ5IÜKÐ$IM“Ö4Šª¢YñqäÅXaâŠCÀ¸„Mˆ˜¥$PD‰#æF ™ FŒ'"»AšEäAƒ<…°W2bíêÆwMô}ññññ9å9áä‹Í•UQ9Æ)d¹óA#rµ`êHá1à%èÓ8q/AjPXd…C7‡ A—¨¡>>>o/N¨ù›µŸÏØ6œ"×Ì'˜ËE$æ¡ h’>3  ÒjÕR'²CƒBÅCÔ‰Rª .RMe°Œ  ‚°SŸŠÈ· W•4F„Ëëßq"‡ÉÇÇÇçmÉ ™¯ÿÇêÏeTI®+Âe‚|Úˆ¹ND¢i<úIÒ§ ’š:áBc4…I@\*‚eL‰M¦.\MØ !";ù.È;|!âãããs4ã>wþ™?C׸ÓùŒóa©H£ H’~M’Æ›è놢 åÁR¦5R©%ì„~/"ÿ&È}@¯ˆpÙäë&º»>>>>§ã&@>÷Ä Œãà'(ðƒù+9WEˆKŠR§œà8’AARªàìâiÔFªq3 È/@þô5_ˆøøøøXÆE€üÙ“·#ãLäóFä"¦(%Ê€I‘:ÅÇ‘(J@L‰Õ1§d¥€Í‚ü­÷$QX^íDwÕÇÇÇgÂ8nòé'nC=ºîE‚ü_#æJ!i”„Iâp{|xj£CDW\\q‰{ñq?¢”Š™[2‹)±z\qº¾&È¿í¾ñññ9“9.²âñO4AñÔ»Ùˆü‹ˆÌT#$HËøŠOí.&ì„© U092™†h=“£ut'{¸oÇÏN˜qÅeFÑTæ•Î"êF<àçÀ_ˆÈvaiíÕã~^ŸSc M}׸®À'DäïEL•çRè8YV48r‚ÔEê˜S2‡³KfQ©£È-Â5Cë@+ÿ¾é?hOtSÌH¡ÔEª9¿|.åÁ2€gù4èï1†e¾ñññ9Ã8¦ÙöSþ Ž8A¹SD¾hÄ{®!íšqéÔ à(sNé.¨8ŸéEÓ(r‹‘aÑè‚Лêå«oÜÅÎÞ]H&-ɉ$ŠR(åŠÔFªäe„&”猖øBÄÇÇç b̳ì'ù0®MEòYAþ·%àâ¹Î¸tÈS¢@ç–/dɤÅ4ƘÀBD¬°RUúÓýüç[ßdcç&*Bå¤Õ£7ÕKÊK`d|X!s£\T±€Æèdy á¨<'ư´öÊq;—ϩ̘ÈÇ~ó!ã8‚¬äŒ˜"BAá1hk˜W:—+k¯`zÑ4\ãfm`Á À8?Èî¾=ìéÛCk+;{wÒ“êå–Æ›YX>Ÿ=}-lïÙÎÖžmìh¥?Õo3]ÉñïL%ℹ¨bSc ˆÈzAþDÑWæFæRQ6ùÜ*ŸS‹‚gÓüê„Ý ¤¼ô‡Èˆ˜R #÷¸;á©Gu¸škë®æÂÊ ‰8á¬àœôãé8{ú[ØÐ±7º6³·½©^ërkDœQ7ʵµW³¬ziV Ö›êeO ¯w¼ÎkØ?°Ÿ´¦{W2(D.®<—)ÑzÖ òЭKë®9Á·ÍÇÇÇgâ)H€üÑýïÅ :¸â^#"ß5bêœP ×É÷æ—ÍãÆú¨ÕƒN3bÄЛêcSç&žo{-=[éMõ0ªB“hŒ52%:…ÚH eÁRbnŒˆÁ‘Ã;¢A¤ª´'Úyµãu~wð9vöí$íy˜ãØ‘(J̉²xÒÔEªAø… ŸÚ–ÖùöŸÓ›‚fÏ=|+Ž˜Ù"òcÁœç†Â¸áÈqXQ‚&È5—qmÝ5ÄÜXv×aÄOÇy½s«÷¯ak÷V^2÷Q©ar¤Ž’@ Q'BÔQ(¦,XFY ”X f“#ÂQw¡+ÙŎֳzÿZú÷f?;Öë( ”°´ê"*BeðeÁüOÐı‘¦u+ OôŒ¨pÏ’»Žkü…¦æÏ=[…@Êå«—}å¤÷ÏÇÇçä’WÿôGý@©§úç.N(|\'µ†è7ÖßÀÒª%8â SYíìÝÅo÷>Îï;^e =ÜU•¤&ÙÓ·‡Ý½»3 ß5[$lB”K¨ ×pVl*3ŠgPLÌeUZªJ±[Ìå5—1·ôžn}†uG_ªï˜ÔZ‚Бìâ¥C¯±¤êBu#·+Þk±@Ñwš÷>Á’º«ÆÚdȵµS H¥Ñ¦æ£7(ʪÅwÒŒA%Šh®J"ôy }||Þvä ïûå-ˆ£ª·!¼Û7³!ZQ¢N€¾tÅn10åU^”ý\’^’gÛžã±–ÇØ?€+.ÅbÊ¥T„*(–QävÂ8â xÄÓ zS½t$;Ø?p€½ý{ÙÛ·ß·¿JÄ092™eóYX>Ÿšp F žz¨*“B“¸¥ñf•Ìâá=¿bwïžc2² ¾¼ÖñT,ˆ¹Æù_½ÉžW€õcnLù,ÈÍ9ŽPø ðJ¡M65¯@DQ•éÀy@ÞÖ‹Ê¡¦æ¬Ì¿«©îA¥.Ç1¤ï‹äÛFùøø¼íɽQÏK/‘Ï98`8ŠqÆæq¥ªÔG'S,ç®ÍÄÜïòU^4ÌÖÑ‘èäW{~ͳÀ²Ì-ËÔX#•¡IÄÜ(@Ì÷—ŒRU<õèM÷±¹k3kö¯eKÏVúSýléÞÂÖž­¬Þ¿†ó*Îeñ¤K¨‹ÔeÛ1"œ[¾Úp î~ˆõí¯dÚXÙÒ³ƒŠP3‹Îšü Ÿ¬Ùûx÷²±©²f—äø<”ÚXfçQ¤*wÿ ˜:ä¾÷/ÿ$ðë¦æ;uå’¯åj.\4æ8fV5ê ŸÓœQÈ-Þˆ eªú Æ ‡qƒ¡15®(ç”Îafñ žl}#ÂÍ 7qQå…ÄǾþV~ºóglèÜ@È„èO÷ózçëlîÚLÄP(aR¨’šp ““(v‹p›µqˆÅnU^È9¥sxéÐË<¹ïiö ì„C‰C<¾÷ Öz…%U‹YZµ˜Ò`©­±®5‘>8í(–óÌþÕ¤45f!’Ò4¯wl¦2XNy°ôF”ÝØª1Þ“|™'SŒmrv¿þ ñY Xü—ÂGÁ{´€öò©ÎÞ^™3}||Ž™Qˆ]4î}HE¯ 8!BáXA ®ìå¼òsY\u)÷ïz€ÞT/7Ô_Ï¥“/®öôíáGÛïå­î-1Ö‚Ç®ŒÃÃ#íÙ·!ì„)–ÑkdvÉlfÏ 2T9L5u¢,¯^ÆÙųxlïoyþЋ$½$F ‡‡xxϯØÔ¹‰wÖ_Ïì’³O=¢N”w7ÞHÄ óHËc¤uLf¡+ÕÆÎ7¹xÒyAWœÏ&R=¯nyì­å“',éâ¹Àí-<†R |äY k¢:êããóöbDòî_\ÉéžÈGŠ0&·êJ&…'Ñ“ì¦7ÕÇ¹å ¹©á]ür÷ÃìékáâI‹¸ªæÊŒíB1bØÛ¿—nû1[{¶1§d6çWœGI dˆCIzIúR}t$:Ø;°·ºÞ¢¥/-ý{y±í%*C•Ì+;‡‹*/bJ´1|¨ªTGªyÿY·2µh*¿Þóí‰ö¬¡üÍî·hÝò]®­»šåÕËš`6{i #fÌdpvöµPßWËÔXýlEo>ÏÞãÁ•{WÀ6®ª 8ü"`ðÜÉî§ÏÛ“ˆˆE?†2;  Žî²«(Ž8œ[¾ždûû÷svÉÙÜ:õ½¼Òþ{^iÿ=ÑÞU7Œ§Ö¾p(ÞÎOvüŒ-=[™Q<ƒ÷O}“£“³üP÷ÛAÒšfÿÀ~š<ËsŸ§+ÙÅþìß·ŸÚ^âÜò…\V½œ†h}¶ W\–U-¥*TÅÏvþœÝ}{0b0bèNuóàî‡8oãÆúˆ¹1Ö|–vÿ’„—8f×Þ”¦ØÔµ…êp%'ü!àGÏ´<úÂÉ.D•½é^LÁ >>>r”y×O¯ÅóôlýcǸ‰ê™4˜~䊚ËÖz…ÚH ïŸú^Ò<±ïI&Àõõï &\§‚÷âür÷ClêÜ”&‡¸wÇ}”˨ ×Ò«gr¤Ž²@ŽqÛ9j#µ¼§ñfÎ-_È£-±¡s#=©Öì_ËÆÎ\VsK«gcKeNél>:ãÃÜ»ý>¶ôlµ1!iM³zÿúÓý4Fydï£ô¦z+£ ´ÅÛÙÑ»‡Ù%Ók€OŠÈz¬ý⤲ÎÀ…ú&ËŽ=e¹mÝŠ¼¡*ƒàuæãsZ‘ËÿH y?Ž ‚ˆâ}•©Á`„@`tù#×Ö]Í”X#ßßö#BNˆ›ßMm¤–lûãm,«ZʲÙ8EY½ Ï·½@Ôs£$¼;zwòf×[¤I4A*ƒL+žÆ‚²ùÌ*žIq 8Ç0³xu3jY½ ï{’ždoÆÆÑ΃»~É–î-ÜÔp# Ñú¬¡|rd2³Jf±µgÛQ×òBÛ‹¼tèeÒš—L¾[{vÒ­#êDnVtÕ3{}é²ú“· ñìï*ðð> å¤uîÄ!Àd šã˜4°HLtg}|N2.Ð@n›è°‡b† «v9^£¨¼_Œ‘h¤(“õvä%ÝeÕ˹tÒ¥|wë÷èIöpCý;YX¶€M]o°¾ý&…*¹¢ör&€§F ov½Éo÷>Aйuêû8»x&q/Noª—¶ø!ZúZx£k3;ûv±o •Û^¢!ZÏÅ“q~ùyÃ<§¢N”ëꮥ.RÇý»`_«M¸ˆòûöW90p?˜r óJçâáñLëjžn}fT7ÝÁÒx ‰.v÷íeVñ´”1ë ¹)ãÅcUw1£yÅÓ@'Pšçð×€ '«o' ð/@®´È­À['º³>>'™JàûÀŒǼ ü!Я±aÄM jôEg†1‚# UåüŠó¸¡þzži]Ã[Ý[8»dWÔ\FJS¬Ù¿–¾TWÖ\A}drvbîMõòÈÞÇèJvqmÝÕ\R¹h˜zlf±Ý¡t%ºxöàïxzÿjÚãílëÙÎÎÞ]:ý#\Qs9 bÓ4XÇ7·|‹Í]ofó`méÞÂo÷>AR“Ãúlö ’^ò¤ ARšfwß^ÒšvT¹Ù`Ž/‘ØÉÂÚ€ÿ\|ø_™ß?Ü vK›Z•; ÝÇÇÇgYbÔ èužz¥á`Çy‡¿¸êæ—Ícwß^>´žÒ@ ˪—0ÆÛØÐ¹‘Ò@1ç—Ÿw¸¼¬/·¿Âž¾–ì®a0ðooß>Ýû[îÙ¼Šûw=ÈølŠuO=ŠÝ"nn¼‰n êD²ímïÙÁw·~õí¯ðV÷~¸ýÇìîÛ=!B"ûã‡èIöz±¢³×ìÿÕI=Fˆ¤°ù³þø{àÿ?v+¾G’ÏØÉJ ϤŠQs•c ‘pÑœS™ÏÕ£>ZÏåÕ—aÄðÒ¡—hOt°¬j Ñes×fÚâmœWq.uѺ¬í£;ÙÍ m/d éC‘LFÛNß÷:7r]Ý5\Pq>®¸Ùà¾åÕËx³ë-^íx-Çq(ÞηßKÀ84$HðTBúRýŒ¢8›¤èò~-8âxá ŸñÆÔÿf*ž2KÕ›ë8BðQA|ŽqX^½”ªpíñv›íÖ‰pQåE¸Æ%é%Ù˜‰ë˜_6/[CDx«{ {2|£1—ÑÒ×¶ßË»¤'ÕƒCR“<¾÷ 6w¿9¬ ¡;ÕáDû)¹óÄã5~´¦E•+Œ#ãoÕÇÇÇgbq¦µÕ Žw‘"¡@×>¿yê1-vçWœØ4 ûZ™]r6S‹¦ОhgGïNJƒ¥Ì(šž@iMójÇk$2¹¨òaÄð<Ùú4í‰njx/´½Ä£{1Áá©,8†Òžèd 'â„ÏS¥–Âã3N ššïdd»œÂÊ%_è.žàëÏÀ•V.?µlPºöOIkš´¦Y¹|åI9çmOÞ†ƒÃÝWTŸ¦ ò½xpϲ‰ß¡ß±î<a>aåâSëÙÄPÁ¨êÅFR_1,ª\DI „¤—dCçFÒšf~Ù<"޵ ïîÛCG¢ƒ¹¥çP¬@S–$ÚÙÒ½uLu6…ÂúöWØÝ·‡Îdç1eÇ=UTcu%{;¡ÉØœS'E€¬hþ éàÇ[Í5üÅõ a f2Hýà¥Cq«Îž-ȃ$•ob9žñ8²mvñRƒ×ïb%g ˆ+: šýŽÀÊÅÇ~îÛšWä}SFº¶#…|‚tÆñÛ9êzŽü~þgeå’á÷õ¶µ+iZðFhO`LU8GèÃábmNæ4q… é¡Çë}?–çièwºëÁÇ®k|÷ ?¯yØ"R£áa‹_[HSó PD§K@.ÆÖ:©Â¾ÈÐ ºëJÜ ¼,*íMÍ+ð<øza«ÂÀ´Á_ŒGëÇž‹p¹ó„í6Óu¦˜œï ¤æcë¨Td®_°.Ö‚ìÁq¾üýƒíãdæ0rð¨b)ÙgÁC‘ªLŸÏÁF,G°Y vgú¸AãÎÁO=»‚¯_:¬o Ø…ÑHì}5sî#Ç(Œ½‡ 2ÿ–gŽ;¼‰}6¶{Öå¼àñW[á¡8[Ãfö(Æ ð4Ð%°؈Í÷’"ûl…OÔC˜„Í~}äd•^nj¾³c°ÞNvÌUDE' óÐaïH hǼ¾¼°áÕíjj¶Íç6T2ãZ}øæK%¶ŒC.J¹[/h46{ìDµtŠã„¸¡a»UeNé*BìékáP¢™Å3¨ OÊ–™méÛK@4D†}w{ÏŽl*õcáí.8²cÒ™è¬ 1œ„x±{âÏÊqØ62û‰q¹TE™è'€wc‹XåJçü~ìúëRüSc8ØÔ|'+ó»ÿ1¶ÖÉPòÙ˜*€Uäöuÿ*¶ŽJAÞA!¢ÌÞ¼ ;qØLð&ÂÃÀ½‚÷jSó UîY:¦É,‚Æ¿t„Ï<à“ý»Ïÿ ÝëAUÈ,|g+òAà&àlFždz€7$”þ Ê÷Žøìz`´›õ˜÷ýC„G ðNàƒÀÅØIóÈg$‰]zTà¯ý£]ðíÍwÎ[°H„ïÀ..r•ˆdØ,èýÀ³¹À*CYÜ;ÂùÒÀ_zŽ~mÈõ»ÀE*úà:à,¬Ð$°uî‚oÿø&ðfþþ‰ýkà–#>È7gg®#·ß2ŠNñÐr× â‘¶=è™[zNVììÝIÂK056•±y²úSýŒ·u£L ^ü Ö/÷±ô¤úHi U¡ªÑão1?ñÀ®ºsýŒ— [ÄÓtððgØU~!e,cÀRì$ôàrcœB’¿¹Çp-‚}‰rGÁ‘êMk³}låKÀ¯€/b'”B…Øü]çb'ˇów@Š =G!亾0ûPºµúöb?ÆÆÏè+Ô"ìj~úªz—ÑÇrPÞÔ|®Õž,~|»À¨eäg$€Ýµ-#Ç=mj^1(<¦ÿx{M³)Lx€¼fÆà—ŠÞDššWÐÔü¹BÇÝdÚ9òú£ÀMšòÌq3€ÒÏ9äƒc1¿õð‡(NïÇHï~¾U¹!ÿ|á ˆªw–ª ¸ÁaÑçªJe°’ÆX£ÝixIöôµàŠKc´Áºàf<¡ºSÝ”Š)eí}©>Úâ‡N›]Äñ2à O'êTµl¢ûs‚¸õ^hù#q°y¬~èy©BA/É„aûæ p pvòŸ2M7_~ \‚n¿q˜YÔëM:ù5à_Éi(ýÀºþžk7WÔ‚š”ÊG°«Û±Q!¼郦uwbìôr-ðSà3Vÿ&gÿŽ•*·šÆ‚m.À>#×cã¯î<Ž~ž¬Dhb‚ßsÁw h£¢pƒÃ&{EiŒ5PâÚETz€ƒñƒDœÕáÃ×Þì&žŽS(!dBÙ³=ÉzR=ùåÝ€ $¼q/Ž¢åŠæÓÓ¿])%ÿjª&cWiFDnÛ ü¤yq bþ›oì’ãkqD.¾‡ê5in[wçx´9µ'&s€{€_å7”ÝÀ†#ìù(¦ùð쮢PX§#d»mí O¹øv’/ÂÀ à¢qÞ!àKÀ·±»Ìã¥,ÓÞ{t«0PñTk¬ûîÉ^D˜›‚cèMõЕì¦8PLq $³Ó€žT)MQ(Æ5‡wþÝ©žã*Ìtº‘Ö4ñtU¨jåD÷çm@9ðO¨^åb1¢w4¯ £úVÐÕg“¹˜ÜmT/-°ØInfwcÕGcå÷ØlÆcÁîþ ;ñ….à…Èk’¦æ?ÇÏ{'V(ÕÇÀ>Õ÷Çx6P3Žý+¾(xÓ›ÖMÌˈwp2:ùMºˆMÚh#Ê{HP(&섬؟êϤW`†Œs_ª´žÔJ§4ªJÂK¢hPÑŠ‰îÏÛ„ZàïE©³n¦Gq¢V'9' @d9VÍq2³°†ñÚQÆa,Ô;Ý}.žÅ+Ì#j\ű©l¶oþû’ÿwÄŸûñs2cRˆðŽsØ“lÖ8_Èä>«pá)ªJ |\GNÔÒK\Ï)3¬î¹¢Dœ0åÁ²l’þT/)MQä Ëz›ðìó4AD$[ô)îÅñÆgÅtZ0Xã]Uµ^(§;Àà-¬[¦`'‘YXƒg¡:ðK€aW°G>P-Øúƒ˜LÛ¹Æ7™éÓ@ŽcFÓÉL$5XB¡+ßAwÑÁBVeØÀ,¬qº–·£ü-“Q¸x®à»6>¼„ueÍÒÔÜÖ௰h.z°FçŸ`…Gö)Ã: üÖ[+×UÕaw!ë)ÐxŒtaköı«Œüõ{à}¢¬âÈgÖnW·0üý`Ÿ¹\×Û‡}?Ò9Ž9પKFgmÄd_OU%êÆˆ:1P±6O="Nx˜[®§i02Ü‘"­~Öì¡(JJÓƒ;·“â…5A$ß`7>§Ð¶jq}òO^ØI8é°Bd ðß°F÷|Oø(蛚?½ýˆ¨õo?ò{ëásUŽöÚ€ luݦ:ªå4ãªû'X¯±|´ßÀx·"Úp5J;؉âB¬šäÝä·àãˆÞ×´nÅkÇl8 ­Ø‘ ™ÿïa]žgb=”z7V.·óöodι-Ó~k#™‡õNZÇQÂÒûÜüAžö÷‰}>޼Ÿû°;‘_·a½¯r-:næ~jõ¯|}ù¸DÉwÏ¿Æ ¦ÖL]¬ÀZ|83îù˜,¹½ùŽ{ï»’Æóù"ðCŽ­ÅzÍÌÑÞFà½XÁ6}`ˆ£‚«š‘Cˆ9Q‚N0£¨2Ö%`‚âÕ£Ì 6¾íã(l5E…±.ßNôÿ«—Î>€Mëöyñ“ØIõ§ÀãÀgÿN~:¸’G¾½ý(ýƒ¿¨!(š·èЇ}Û «zp˜¦u+@9 ø8ùÕ€;cÝÞ“½Å™CUˆ‡Ò`WwmÀ£À¬0ý"d]=G£ø#¿¡Àš ° ëp6x²ÿˆÏ]¬SC]¦ÏÇKxø/ Y…ƒC³oÏ„K±dDZ‘Ìxå ˆ¾è‰ù¶Q´„ùÆâáj°Û×ÞŠô`ŸÕr¬‹ìh.çÕÀ5NÀo"Ô6Þê_±÷½„cvÏ?Çz4Þœ§M»˜ù Þ ¤gØS"„È¿{M‡Ð 3S»«(öG× 9!Ü!»ŠAuÔ‘iI&€À z房 …e–83PUïtöL{ +@â⥹gÙÈ9”îX{'žh;V äŸ'÷NÄ7‚ó-†¼tGN.·­[a“kåGV.ûJÚ¤ÏћȽ‚»¢ü ðdo‘ÉðÕÔ¼¢O…¯eLüòïDnTå+ŒâÚ:x øBÅâËŸ?´îéìƒýýÔº%…Ìßyœç»òÿV`uˆB*”à?/üÆàx€ð¿;òË·¯½µ«òËòœç à{F½QÇ~08³©yE ë‘v30”öX®ž~Ž«*ÜlðëÁ;0ÒsxÛº;•­ÀŸcUNùTus 3äÝXµäž£jj^QлAªBZU‡MþpX¹R'[0=äLBÈ„„ôÀ0aq"1¤5·#g Yª&¨zûÑi0‰»ó$G¼{i6¥Cüµ˜ü†Ýs±1oLÔÅyŽÆ°ÑÚ¹vŠ]]?HÞhú•Ky…‡Uu-Æêås1 8·iÝ¿=Ž${v…û åк§Gœh¿>¾j²ÝÀ®˜Rê—d岯8£aðHã\KîZ›Ñ §Hò•Kîâöæ{Ôª]çç8t6V¥·/o££Ó é6“3çÛàgŸzöŽ·Œ'?À Ý\“ÿ`š–~N"ÆCSª·ª•ÑWÆÊa÷YA¡(áŒM¤'Õ3LXbLÀßd$ëd èI½Ñ'õ2ǰ¿Ê¼à‡€•äØªÆêÆ'’ä÷ãoÁN`^¡|fú»8Âh<Q`‘;wÌ´a'¥œôɪóC‰÷=Êì FùH‹ÆÚrÑÁ0X˜ëL£ŒÂ²;Ÿ<ƘYñtÇìüèfÝ®ªÉþDŸu1%SE/ÝGgò° ;aªÃU ¤Ø×ØÁ‡)Q›mGïŽa†ô©±©¹Eg¼!ÝÆÏpÄà©¶ªú*¬è%¿1Lœ´CþÕ¯ÇñG+÷’ßUtLÎ §…¤#?Q$À·]%“Î]w(tö'ûI¥kâé8­ý‡k¸¸Æ¥!Ú€‡ÇÎÞÖk+ÃÔ¢©D;{wÑìF<õ¨ WÑ­?ÊEøL$lB Š·MÑ|^>#“dbÒx€¸ò­~ …× B^– Æ;˜Èô}@ÇDÀ©Ä`A©E÷Ä“ý ¤²±žzìêÛ=\PĦvÂìèÝIoª×Æ5¨R©¥6RËÁøAvõîÎÍÃNˆùeó|5B4S?ÞSÝ êÇŒ@ù'艚8ë¸ç"T65âxÎ#¿ê&w.¯Ó•^ò ‘46 Âxÿì ÃÈ”´õ:@6&ÓÉs{º)‰”f×@;{wÑŸîϺæNŽÖQ®fß@+-ý{™]rv&o”9¥³ÙÒ³• ˜Wf'U•sJÏ¡"XN[âÌ-.å Äœ0ªš^ 8gº@NÆÝ²ü¤µ;š¨Uh! ˜iíÛcç¶gW€G-ùUe{9ÉAc§mX!ž+Z6}üx;ªôŠïü2 À8NÚK§ŸOkú:ûÛ©-³ FE„ÖVöõïcFñ <õ(r‹˜U<‹½;ÙØ¹‰³‹geW:—§[W³±ë ÚíT+P”êp Êðä¾§ÎXwÞ€ 6!<¼ýÞwöG&ºK§ŠArF²5–8žLÇÑEѤ¨´pèE AŽ!å…XѸ€ü;7{Fª°Z°»¯\¤ë&ÿÜxŸÜWÄÇèkï TRôJwWGq2$àØ¨óþt?›ºÞ`z±­PjÄ0¿lk4óz箬¹œ’@ žz4D˜^4×;7ðzçF.«^†ªbÄpqå"^:ô2]É®3n¢(1'L@T½×AvOtŸN%n[w'¨Ö¿¢ß°ñë—~µ€VO…¤Q¹˜ÕÔ¼âõ±Ä=|ê¹Ï@*®Èsh xù 5+¶`S¢äª-R ¼1Ï®\<¡ÏÊÛ•‚Ÿ,°ë¿B• oöÆ{èwΰ«ÊkèIödíScS˜›BK_ ›ºÞÈrB\Xy‚ðüÁèÉØH<õhŒ5paÅùg¤„b'žêêï¬+9U*Șî²xØš ù"Œ[°©¦—cò`ʤŸx…ü.¶uÀÌXJñšT l.¬KóºxñžKNjà)‚v`k„äãVÔ›zŠ:Õ)ØÓ1«ˆO{Þ!EW'Ó Úzd'z#†–¾Þì~+ëÎu£\XqŠòÜÁçéOõg…ËÜÒs˜›Â¶žm¼ÞñzV¸1,¯^Fu¤úŒóÈ ˆK‘AÕëRô©/=.OÀSÝ}srštISó òMž+Ö|ÚÚ>D±õ§óÅ5<‡Õý>8Ö_¼€X*Žqry[¤'g7€ ,WB*fúR|Žüńւî8–οýø-ù]¥gŸ¾†’ß ¡(º}]þç6+@DPÐßxªým=ûI Ik’ðüîàsÄÓ6†FUYP>ŸúÈdÞì~‹]›²Â¥$PÂ’ªKQ”Õû×Ò•qéUUjÂ5\UsÅQ¥sOg¬ú*BÐðÐWTõÕÍùdî¯äÆJNá—bðw@¹KN!ç+î~ŒUËÜ„­÷q=Ð|óò''Lß8ØÑ¸ÕÒÜ/ñžä€ɯâ8 [÷lŠö"¬ïm96¡ãy$Λ—)²óð³Çâl±eSß‹-·ûl)Ûo!¿ ¯ø2J×Ê’;8c±+ïQ˜-¤ ø[ìýú0 e“ḇåµ7…Ã%u¯þøðôÔy¹Ž‡©©þ$öýÈÇbìâç±;’Xflª€‹™MÍ+†¯v2ª¥ûÛvï¯ïè¢4ZvxÒý&/´½ÀeÕËQ”Ò`)WÕ^Á÷¶þ€'[ŸbVñLc xê1¿lV\@óu<ÒòšöB&dUY‘þ ñf¾»õt$:Nk×ÞR§W<ÕGExã¿ÍϻބUÃäZ‰6b+º=‹­¥1«›ÿ§Vtr%V@܂ГXác;?©*Û•÷Ào-ù2MÍ+ž¶bõ๘ |7°»û+ÅŽïsìy#ë%±eP¯Î. ÿal½Ë°÷'‰šc[3åqu&*Ô©ÁÊÅwÑÔ|g èßc"ùR¬;ÀåXõêN`£*oak}™ÏKM¸¿˜ LǾSƒÁ<‘ç4È ýf JPõqì£,Ïá—`ç™XÇ4ön¾ üŰ•ߎ¦½x꽡èC©Z:v 3x§5ÍãûždwŸÝQxê±°|V^Àüºå7ôev(àÚºk˜©ãåCëY³¿9›ËSÙ%³yÏ”›‰b§mž¬ ¸”ØÌnÅû>H!9’^ÂNfù¨nÀ–Ǽ ¸¨ŸèkÎA»S«ðØ üo ãžÂ]b÷pT}èQ1ØIc V \€]eŸùûQ¬\rE»R±;Š|ö–#q±ÓXÇá~¬J0¹êÒÿãWO?ÄÚþ™Â#òìäàO±µ¾Œ×/`ë¬_‹Ý‘,hƒGÝ©Ê7m³—)ÌŽVe> XŽu/_€ØK€ò£T"’Bù¶ªÜ×¹‡îÎìA àW-¿Î¦1 ˜ï¨»–†h=¯´ÿž§ZŸÆÃ˦7¹¡þL€G÷>ƆÎY»‡¢\Xqïi¼%k;9•QW\›Ú¾@WâĈ‹§ÞãžêÚ¦…ZÈ×¶cÕc¥¸ä43øµÞZÜþ‚8cÚ¥–‡-d«>5ÀE£gO£ V-òEò%—‡€Ïm'©rà)Ï=Ö‘þ+DNdZûbàªÓh¡;€œÇ6˜”Ùq[ Š÷"p¢]mÛ‡ÙBŒ^mÇ÷>a+fTR75ÜHĉðÛ}OðbÛKÙøóÊÏ劚ËéIõðó¿`GïÎaÆóK']Ì­SÞKi°ô”µ‰¨ÚLÄ76ÜÀ­Sßk^ž‡Éî>b™Ý‡®B¥ÐØ4p7ù½LŽ$\+ùí 'Šn¬¡{¼Ø܉rmw9÷\Rxíï•KîeðÀ¶c<ÿ ÚcÄñÌLä)l ÚÏS˜íj¬Ä±µÕ?ìÔÓXÕ{,dîÁðOX•L!;÷cå*)™èk2‹õç°»®cUË•WŽ2ÙHRÑ{Ý»·s7í½Ã+ zx<Ùú4ë>kÏØ<Þ1ùZ’^’ûw=Ým8âpMÝÕ\Tq!-ý{ùÉŽûØ×¿o˜YTyžþ!ê£õ§œñÔ£ÿUXýí‘ä_.…'ŽdÜc™›±^MŸÃFŒå&¦×°«ù?Ö¦Ðc®Ÿ½rñ]à)ÀÀû€ÅPÇB0%çy–Ü…±‘÷eÎógÀ [á¡°Gs° è[¹ä.îY:æq(äž'…ì|OÈîxå’»Ú–×aß™?çøw…XAþ_XÏÁ­yŽò{Ò«D¾û5–wؾW"i<¾õ üp`Œ}š>j§ñ])È;vï?wûNΚ4“Á9AzR½ülç/P”E•t¼«þĽ8k÷7óÃí?âÖ©ïc~é<*BåüáÔ÷ñC/Ŧ®7øþ¶òþ©·2%ãÎë©G]¤Ž?žöAÖ|–'[ŸæàÀADä¤çÎòÔ£8PÌÒªÅ\Qsù0õšC[¼í=ÛñF°Û8Êœ¢â)úŸÏæ‚Ïéü«ß=¼´»ª¿xÖ½´šÃ‰ä°[ÐíØUöS±ÚÎÂ'Ƚ*KR˜>´ø!GWåÛ £…ì,wbmo¹„ÄóŒ=¡S{ôlŽc:cªù!ïÇKX5éBì\³ë‰VÎáPÁñÙ‡Í÷"°>çÌØý m‰6®«»†Ò@)ïi¼…ˆæÉÖ§¹wÇ}ì8ÀÕµWR®áCÓ>À/v=À‹‡^â;[¿Çõ“ßÁ’ªK 9¡ìJ¿!ZÏN½•‹+±îà³lèÜHW²+“2^ ž/æF™Y<“ÅU—2§dv¶/ƒB-­i^>´ž_îy˜ÖþÖû‘ EFÑ6O½¿=ápwFm‘¹¹Ù|$£¶9‚Mu«qzœàˆóÖÿ¼ôï&úÞúøøøœP VJ6ÜSä Æ . ª¸fT—[O=\ã2%ÖÈÅ•‹˜]2›ñ<Ýú otmÆS©±)\âˆÓü7‹¿4¡7ÕÇÇÇçd0&«VFˆ òOÀíE¡bg~ÃùL*ªÎ·á©‡äP%³Kf356…öD:7°»oiMSªdNÉl&Gë80p€›Ø?p#†ºH-óÊæ1·tu‘:¢NtXÅıČ µ™¨*q/NëÀ~ÞèÚÌkí¯±³oñt¼ ¯¯ˆçÁÅ`ZD䶈‰<”–4s©/@|||NÆìÑh…H"ÿ|<,2óêÏ£º¸6ïD>è*0ʃ唊éIõÒo#¥)T•  R*'æDéLvÒ‘è$­Öêu#ÔFj˜;‹³ŠÎ¢&\Ci°”ˆÆ'»[açÌü«JJSÄÓqºSÝ´öïgGïN¶õl£¥/=©ž‚=¼y!ÏÁˆÙ/"ŸN%R? ‡ÃüÝ’žè{êãããsR8&¿ºÆ{jÊþYODQgNÝ|êÊ ncP˜Œ4aµIŒô°©ç#N„Ò@)å¡2ÊeЉ:&5ˆ'½$ýé~º“=t&:iO´Ó™ì¢7ÕKÒ³®§c‰1 ˜‚žƒÙ+"ŸõÔûIЄôKËþ_>>>>§ Çì˜Ý¸² Tÿ ÜtC¡Ug3¥r:®qOJ*’¡%{AC2ç:æX‚E!‚€ "²M0Ö›î°,PÌ?.ÿ'üz}|||N%޹2M×C=”ÞXž¤ßóÒ‹õ Ç“”DJ ¸ÁÞùAú°† ‡ÑŽó¹<ÅM)Ž‚/·…œÐcÇ埗ù„_«Ï©Æq•6Ë‘ð,ÈVTÏïè¬èèk'ˆ ÆNz«qGIy8©4Fñ@îîpļœÆã_.ûÊD÷ÐÇÇÇgB8îÚ˜]õPvc± ò:Ð,"S’ýÓÛzöKÚK pò%¨>>g.ãR\¹ÓîD¤á7‚$<Ï›×Ñw(ÚÙwȼƒQóö¨å¬ž‡&h"1˜üù¬‡÷ Ç8}F ÿv¥_ÎÇÇçÌf\õKSVÖ"bň˜+EøK+]㺕EÕ4VL¥,V‰cœS²„­z^2—L‚*9(b¾-"_uÅÙ‰w]ý‰î¦Ï)Á 1Pœµª~0`¯Br;0/詈UQWÖ@Y¬Âª¶”“ⱕ ÏK“NÄI'¨ça>ó¨ˆü»¨®q@„•×~sBûéãããs*qÂ,ÜÓVM1³Dä> r¶ë¸”Fʨ*®¥¼h‘@cÌI&ªéT’d"N:e‡ ýFÌ3Fäë"òˆ#N¯ |ãß=)}òñññy;qÂ]¤¦½ÑºÒªAŒNyŸˆ¼_FL0S)§¼¨’âpá@cÏ1.eðÏK“J[¡‘JÆñÒ¶fŒ9$˜§Œ˜ï‰ÈŽ8]"‚Áá¿®÷…‡ÏHœ4ۙߘš9™A„jA®‘÷²L ÞGBnˆh°ˆ¢p1±p1‘@” ÂqÜ!iJdä^ëðzªžç‘ò’¤’ ’©©TõÒ  "FÌ&yÄ`îa½#îÀ` â÷n¸wbïŒÏ)ÎIÒ˜õŸSÌ`€_@"²\«DäAD$ꈃë¸A×þÜ ãfŠˆU©Z•”§ž—ö£ê Œ´ÁtˆÈ›FL³y\0/„áý©´­óapùÁ¾àðñññ)„ ò›ó_3GŠC@Ä4ržˆ\j‹Dd® Õ"bƒAÄþk0™ÈrkgÉF¡g>Ï?`Äì‘W35ÊŸ3b6†L¨-M:{îûÞýÀDߟ·ÿ°ÃÖGÚG%tEXtdate:create2020-06-05T14:22:02+02:00× ‹I%tEXtdate:modify2020-06-05T14:22:02+02:00¦ý3õtEXtSoftwarewww.inkscape.org›î<IEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/pp-acceptance-medium.png0000664000175000017500000000220714152763504023066 0ustar arvidarvidÿØÿàJFIFÿÛ  )  )?'.''.'?8C737C8dNFFNdsa\asŒ}}Œ°§°ææ5  )  )?'.''.'?8C737C8dNFFNdsa\asŒ}}Œ°§°ææ5ÿÂ,D"ÿÄÿÚµ>‚~ ™I»dâöJ?±· ØúNà^À‚ñ¿$[Wùôc rÿÄÿÚQÞ­FPãŸÿÄÿÚš‚yïé„¿_ÿÄ1 A±!34RSrs‘’2aCQÂÑÿÚ?‚L1Qw ä!ò“ê+‡ÊO¨­!Ò <kx޳™T¶å¤Óë Ã>@õ)«pûûXn­ã¢‘vƒW!”ŸQ\„>R}EbH‰:„P£ êfóPv1z†½<œIŽäò QY›û$î¡3KÍeú׊÷„öÇPv1z†¼eÖóIï7¯/”Ò Â´zKÐÒÛEa[)cXVm“6g'k¶¼W¼'¶8šƒ±‹Ð¼5 7ÆÇž§8“!ò«Ýî‘òA2³æ2ª õl¶8ªE5ÏæìCÿ•±ÍɆFA ñN¬Ñ8`©?±«ï íŽ& ìbô/ I£˜«Ù^]]n¹ÌÓÁÕØõ©íqKë—[«}œ×šG$æVyCuޝC„b\¥«\NâWM4£¯#Éühà)°Ëøe1E ÙTÈ%Ø¢-àäÖ–ö¬«–BÎî?lub½á=±ÄÒbS¢"MŠFºVãÁÁ®•¸ðGðhâs’ Hþ t­Ç‚?ƒ]+qàà×JÜx#ø5Ò·þ \\=ÇpgUÿÄ!A 3ÿÚ?ÍhÖI@abŽlkƱüÑH£ßÓZA–êEŒÙžI.¿+몼 Ž#a½‹Á²ãŪÆbÌÌ}7ÇÿÄ!" !1qÿÚ?ÉXª1&=Õûµ×ç£aHœ!ò£_y§­D7?_+k#X<ôú±±&ÚɼEŠ£à8ÿÙlibtorrent-rasterbar-2.0.5/docs/img/delays.png0000664000175000017500000002517314152763504020375 0ustar arvidarvid‰PNG  IHDR KF?É#PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@ÈÈAiáÿÀ €@À€ÿ0`€‹@€ÿ€ÿÿÔ¥**ÿÿ@àÐ333MMMfff™™™³³³ÀÀÀÌÌÌåååÿÿÿð22î­ØæðUðàÿÿîÝ‚ÿ¶Á¯îîÿ×ÿdÿ"‹".‹Wÿ‹p€Í‡ÎëÿÿÿÿÎÑÿ“ÿPð€€ÿEú€ré–zðæŒ½·k¸† õõÜ € ÿ¥î‚î”ÓÝ ÝP@Uk/€€€@€@€€`À€`ÿ€€ÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿ€ÿÿÀÍ·žðÿð ¶ÍÁÿÁÍÀ°|ÿ@ ÿ ¾¾¾ÿ²²–%š IDATxœíÝ vâ8·P³¾‰¾ùâu ’+6¶%ÛWÒÞ«û„6)WÐÏi„L´îñøïŸ/ÓôL€A<þàëâ4i@`Ç÷=@Œåy÷ïÕ|Ï*ü½  û/yüûø}4üu ¸]Ça¬¶3VÛ«íàOuþÞ,9á ŒÕvÆj;cµÝá±z{¬1VÛ«íŒÕv%øýú—·GÒ;cµ±ÚÎXmW}¬ þvÆj;cµ±ÚNÞÈXmg¬¶3VÛ)À«íŒÕvÆj;x#cµ±ÚÎXm§a)@hÈÛOT?÷®3ÿ|öÁ/hõ¦\õõ òÞjâç'Þ>÷ùß2qÛŸfùgÞSþþ²?_÷ö%ýo‹÷smýj·R€pžƒ8{Ç’ï:ûy=oö™kVÿòJ¸úç~߆jö%ýïÿ>S€Ð¸ŸBz|ßg{¤W&oÒô˜ý×óÃ[y|÷PV• ðçnaú×Îï2NÙÁ?‹/)ãßs>ÞÎòý™Óûß§a0ï[?¿c–”Uòð6i°ïx¤ÿõö¸ø·T{éç¼}ïwÅVîGþ~!ùwçŸùÖÐïw_“SMï&8P€oßàû©¼¤mþ¼øº/–´ßR¾×R^€¯¯âC&Ÿšß”ôsÓÿúýO8rð¯ü£ÁføWŸÍ¾ˆ¼´æßûùæ}öÇߕݫ|ûüåÿP€0€·{eÓã¯Z›Êò#Ì? ðý¾Û†?¾ø÷ýœyKþyÎù'§g}¿Î³À0‚·' ÒG˜ï~>%¹+–<Mž·Hï§½ýô3ç×ýq²÷¿ïýàôýøœÞÎòxÿÌ·{€ñ‡òø½è„ÀªŸ(i‚cã†Ï+ÿ¢ÎRåÖ*@hÜe½·_ÙݳºgùûÔáOp KÃR€À° 0, KÃR€À° 0, KÃR€À° 0, KÃR€À° 0, KÃR€À° 0, KÃR€À° 0, KÃR€À° 0, KÃR€À° 0, K²×ÿžîþ2 œd¯ÿýßH {)@º¡ÙKÒ È^ n(@öÚ^€ž.!8È^; Ð}EbS€ì¥é†d/H7 {)@º¡ÙKÒ È^ n(@öR€tC²—¤ ½ ÝP€ì¥é†d/H7 {)@º¡ÙkwzK¢R€ìµ»Ý$*È^ n(@öR€tC²—¤ ½¶?µ¡ N²×[­­Ö $¸Ã}õx|ýû•ß OH+ÞjmµÜ Áí«¯Î{và÷‡ÂÒŒƒèÕ€Äs°¯ p\ Ðý@â9ÖWÏÚû÷ÏχŸ«^ª}‰œ äþ˜¤yE=õs×/-Áïëê}œ§¤Ž Ý8X€7NÂTö,°lWüô¤ ð2˜15P€î1r>/„S[èÞ 'Q€cj¬Ýä pL &8*“•„IŽªõô´U(À15_€îRƒ“„IŽêX¼x*@z¡Çt°óBS€´LŽI¤G¥aR€£R€0)ÀQ)@˜à¨ L pT¯Ùùó Î(À1•’¤ pL &8ª³ pïÏŒ,þ]ÙåüZ8LŽ#ýŽßé¸ó¾ââß•]ί…Ãà8þ¨ÈØà8 Ì(Àq(@˜Q€ãP€0£Ç¡aFŽCÂŒ‡„83 p fà8N,Àì]e MP€ã8±— J›‡„83 p fà8¢àúò+@. Ç®WÿvÈà8ú(À·÷šÞü•ßà8:)ÀC_9üIŽ£•Ìïã)@N¢ÇÑLfŸ¯9‰‡„83 p fà8 Ì(Àq(@˜Q€ãP€0£Ç¡aFŽCÂŒ‡„8Žk ðíÙ6`úÖX Ë(Àq\T€{ï%nøÚ 'Q€ãP€0£Ç¡aFŽCÂŒ‡„83 p fà8 Ì(Àq(@˜Q€ãP€0£Ç¡aFŽCÂŒ‡„83 p! 0Û« _›ä$ p! p½Ö¾6ÈIà8 Ì(Àq(@˜Q€ãP€0£ÇÑ|æ¿mäymòÄ ì¢ÇÑ|n8ì¢Ç±~?jÇ ½P€ãX¯‘vý—]–`zæü ¾rÈa pE¸·ÖŽ}f~|ÃW®9ìX_=þóÌï…'ä‹5²áIH—õÕ³õ¦Wí½þ«ä„\aK)ü³ 6î«øø.?Ø€M¥´poPÒ¥²‡Àßw“ÇÀoÕ¾D*ÙQJéŸÚòô‡¤-Å=õûø÷ñûhxr0°ƒ¸¥Ð mªR€7AÂLé“ ° fJ¾8ûPrB.ð¡”²$oúS –y!ô8öVÙî?UþtI~|ýkH¯­=\Œ@ŽãôÜy~Èíà8(À¥7¼R€œCŽ£Üû™éµµ‡‹(Àq(@˜Q€ãP€0£Ç¡aFŽCÂŒ‡„83 p fà8 Ì(Àq(@˜Q€ãP€0£Ç¡aFŽCÂŒ‡„83 p; *ùíÀ Ž)ÀqœXS 6)Àq(@˜Q€ãP€0£Ç¡aFŽ£É\ÿU›éyN7:¦ÇÑdn?ÏI£F×à8 Ì(Àq(@˜Q€ãP€Æ'yù7ƒP€ãP€›Æ§ø<4DŽCnŸâóÐ8¸i|ŠÏCCà8à¦ñ)> Q€ãP€›Æ§ø<4DŽCnŸâóÐ8¸i|ŠÏCCà8à¦ñ)> Q€ãP€›Æ§ø<4DŽCnŸâóÐ8‚o*Õn¦·«|”àxàn®©kÎ\k”ŠÏCCàÕ”$8‚@5¥‰DŽ PM)@"Q€#TS HàÕ”$8‚@5¥‰DŽ PM)@"Q€#TS HàÕ”$8‚@5¥‰DŽà`¥û bH;àN)1HûàB”ž$8‚¥ _ê×GiÃyè†AˆÒ‹P€«Ÿ©¤G¢ô ñ(À„(=H< p!JOAˆÒS€Ä£G¢ô ñ(À„(½› 0}éKþ™ë×Ò=8‚¥wWæãBé)À)À„(½8¸Pz p@ p!JOAˆÒS€Ä£G¢ô ñ(À„(½4Ïx§ÁõÛžÃÒµãLsàB”ÞÙ¹~ÛóqXºöð(Ó 8‚uv®ßö|–®=<Ê4HŽ DAë·=‡¥k2 R€};ñ÷zDË¥È+n¡ôà€`ßBTÓ5™ßö´üóÑHd—„ì[ˆjº&×oûú‘ì2ƒP€} QM×äúm_?’]f °o!ªéš\¿íëG²Ë âX_=þ“}(9!' QM×äúm_?’]f‡úê«ïþû÷ýCÉ 9Kˆjº&×oûú‘ì2ƒ8ÜW ° !ªéš\¿íëG²Ë ¢ä!ð¿ò{|H®z¼=(æF!ªéš\¿íëG²Ët®¸§ÞÛÏ=À BTÓ5¹~Û×d—„‡À} QM×äúm_?’½dšAx¤o!ªéš\¿í[Ž,œ‡ŽyLßBTÓ5¹~Û·Y8óBè¾…¨¦krý¶o9²p:¦û¢š®ÉõÛ¾åÈÂyè˜ì[ˆjº&×oû–# ç¡c °o!ªéš\¿í[Ž,œ‡Ž)À¾…¨¦krý¶o9²p:¦û¢š®Éçí}Êoû–#Éq¡û¢š®Éôöæ·}Ë‘ä8ƒP€} QM×dz{óÛ¾åHrœA(À¾…¨¦k2½½ùmßr$9Î `ßBTÓ5™ÞÞü¶o9’g °o!ªéšÜþ;à–Ž$Ç„ì[ˆjº>óÛ¾åHrœA(À¾…¨£ë3¿í[Ž$Ç„ì[ˆ:º>óÛ¾åHrœA(À¾…¨£ë3¿í[Ž$Ç„ì[ˆ:º>óÛ¾åHrœA(À¾…¨£ë3¿íésÄKŸ“g °o!êèúÜrÛ—>§âèžì[ˆ:º>·Üö¥Ï©8ú„§û¢Ž®Ï-·}és*Ž>á)À¾…¨£ësËm_úœŠ£Ox °o!êèúÜrÛ—>§âèžì[ˆ:º>·Üö¥Ï©8ú„§û¢Ž®Ï-·}és*Ž>á)À¾…¨£ësËm_úœŠ£Ox °o!êèúÜrÛ—>§âèžì[ˆ:º>óŸûÈsi|*Ï¡)À¾…¨£˜¹4>UÇŸà`ßBTMÌ\ŸªãOp °o!ª&f.OÕñ'8Ø·U3—Ƨêøœì[ˆª‰™KãSuü Nö-DÕÄÌ¥ñ©:þ§û¢jbæÒøT‚S€} Q51si|ªŽ?Á)À¾…¨š˜¹4>UÇŸà`ßBTMÌ\úi‘ês@` °o!ª¦­¬<„¦û¢RÚÊÊ3@h °o!*¥­¬<„¦û¢RÚÊÊ3@h °¯oéçÇ#TJ[Y:´Döai󆨔¶²p&hŠìƒT€ û  (À>(@È ° Pr€ìƒT€ û Ï.À¥Ñ4Øxz®^K£``µ\IùÎy!8Øxöý@Ø%ب9@öA*@P€}P€ ` äب9@öA*@P€}P€ `òí¹økå–Ì^­»¤ûðGF¨‘Ösu„éÀ§¾zì­4x ¨9àC_=ÿý³«Óà- ä€OøõŒO*@øX€{+À[(@È=®xBΡ x¤¯í™¼x#D´žù—MÑxLòm¢@ZÏ|„‹f‰p6ô•{€ xÛ¶^]+ó.ž)Bùü,°ï¶ D]ô—ùÎÁl(@Ï7 D]ô—ùÎÁ¬öÕã¥Ú 9Kˆºè/ó.œ'‚ÙR€õNÈYBÔE™pá<Ì–‡À5OÈ9BÔE™pá<Œ—Áô!D]ô—ùÎÁ||!ôŸ? ü|`üýùía²¼Eˆºè/ó.œ'‚9ô£pÏÖû¾âõ_ÛNÈ9BÔE™pá<Ì¡7Cø)ÀÇwù)À›…¨‹þ2áÂy"˜Ãïóºøü<~yí ¥BÔE™pá<ÄÆžZúœŸƒ¯ösðf!ꢿÌG¸pžæó“ ÷_rÉCàBÔE™pá<Ì¡¾zöC¢.úË|„ ç‰`ý,ðìõ/^s¿uÑ_æ#\8Oóù—"y7˜„¨‹þ2áÂy"˜cß,8!•y÷?ÈaûjïëYàÅBE¯™sÙdÍZ_zIŸ¼Xˆ¢è5óq.›,¢Q€­ Q½f>Îe“E4Þ ¦u!Š¢×Ìǹl²ˆÆ¯Ål]ˆ¢è5óq.›,¢ñ2˜Ö…(Š^3ç²É"¿©u!Š¢×Ìǹl²ˆF¶.DQôšù8—MÑ|7˜Ã'¤¶EÑkæã\6YDã'AZ¢(zÍ|œË&‹h¼ ¦u!Š¢×Ìǹl²ˆfË=@# Q½f>Îe“E4¾غEÑkæã\6YDsøw‚þ(\åR[ˆZ'Ó1/ž;n·åÍjžÚBÔÂ8™ŽyñÜq;غµ0N¦c^?ÞùRx±U0fV˜=nöñYà‡ß [ˆ*3+Ì7S€­ Qcf…Ùãfžn]ˆ*3ŸãÿT:ÜÃ/Ej]ˆ*3Óñ/œEnâe0­ Qcf:þ…³ÈMÜl]ˆ*3Óñ/œEnâ{€­ Qcf:þ…³ÈM¶¼‚Œ,DŒ™éøÎ"7Q€­ Qcf:þ…³ÈMÖúêñ­Ö 9Aˆ*3Óñ/œEnr¬_ß?|>!'Qcf:þ…³ÈMõÕWß½~Hø÷CÉ 9.DŒ™éøÎ"7Ùò2˜ìs` !ª`ÌLÇ¿p¹Éá—Á<›ïñûáíOì}õ ‡…¨‚13ÿÂYäb{jéÏ»}i ~_SõËä£U0f¦ã_8‹Üdâ.õ8‚U0f¦ã_8‹ÜäÐCà×Aˆ*3Óñ/œEnr°ß½ æn!ª`ÌLÇ¿p¹‰wƒi]ˆ*3ý‚¤öy3„Ö…¨Y<ÜB¶.Äö—ÅóÈ-¶ô•Œ,Äö—ÅóÈ-`ëBlY<ÜÂCàÖ…Øþ²x¹Å–¬yBj ±ýeñ³t2¹‡lWˆ/ŸY:™ÜC¶+ÄÆ—Ï,Lî¡ÛbãËg–N&÷P€í ±ñå3K'“{(Àv…Øøò™¥“É=`»Bl|ùÌÒÉä °]!6¾|fédrØ®_>³t2¹‡lWˆ/ŸY:™ÜC¶+ÄÆ—Ï,Lî¡ÛbãËg–N&÷P€í ±ñå3K'“{(Àv…Øøò™¥“É=`»Bl|ùÌÒÉä °]!6¾|fédrØ®_>³t2¹‡lWˆ/ŸY:™ÜC¶+ÄÆ—Ï,Lî¡ÛbãËg–N&÷P€í ±ñå3K'“{(Àv…Øøò™¥“É=`»Bl|ùÌÒÉä °Eÿ{аñå3ŸŠg–‹)À…Øò2ϲiåz °-îû…ÎÂÙår °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °-!¶¹\Ê¢¹å °~R™ÎTÁ\sØŠ\®g:SG'š+)ÀøÜ÷k&Ÿó•\&8_ˆ­-·d:_g›K)ÀøBlm¹%Óù:8Û\JÆbkË-™Î×ÁÙæR 0¾[[nÉt¾Î6—:ØWÇ¿øòüXzB–…ØÚrK¦óup¶¹Ô±¾z¼ ðõ?Ÿ!¶¶Ü’é|œm.u¨¯É=@xº[[nÉt¾Î6—*{üïßÿüà·J_ Sˆ­-·d:_g›KöÔÏŸ{µŸ{€' ±µå–Lçëàls©*è!ð©Blm¹%Óù:8Û\ªÎC`x¦[[nÉt¾Î6—:ö$Èûë_¼ æ\!¶¶Ü’é|œm.å…Ðñ…ØÚrK¦óup¶¹”Œ/ÄÖ–[2¯ƒ³Í¥`|!¶¶Ü’é|œm.¥ã ±µå–Lß¹ÑûB·@ÆbkËcytÒ¹†Œ/ÄF–Çòè¤s _ˆ,åÑIç 0¾YË£“Î5`|!6²<–G'k(ÀøBldy,N:×P€ñ…ØÈòXt®¡ã ±‘å±<:é\CÆb#ËcytÒ¹†Œ/ÄF–Çòè¤s _ˆ,åÑIç 0¾YË|6ýŒp$ 0¾YË¥ÙÜ:ùœKÆb#Ëc¹4›['Ÿs)ÀÈÞÞ^I¶˜Ù^ŠŒ,Ä–å™ÏéžeÀy`d!6¯,Ï|N÷,Σ# ±yeyæsºgpYˆÍ+Ë3ŸÓ=Ë€ó(ÀÈBl^YžÉS! 0YˆÍ+ke:§»×§P€‘…ض²V¦sº{-p Yˆm+ke:§»×§P€‘…ض²V¦sº{-p Yˆm+ke:§»×§P€‘…ض²V¦sº{-p Yˆm+ke:§»×§P€‘…ض²V¦sº{-p Yˆm+ke:§»×§P€‘…ض²V¦sº{-p Yˆm+ke:§»×§P€‘…ض²V¦sº{-p Yˆm+ke:§»×§P€‘…ض²V¦sº{-p Yˆm+ke:§»×§P€‘…ض²V¦sº{-p Yˆm+ke:§»×§P€1ù…˜æsf“ËÜNÆbÃʺ™ÎìÞÁ9`L!6¬¬›é½ú#‹‚ú`L!6¬R€u)@y[.¬:V(Àº T€ Q€u)@©¢ëR€R6DÖ¥¥lˆ¬KJØX×K1{)ÏÈlò‘¬ë¥¸tDʺ™­@>R€u½–_þ&–~÷‡<;Ó¸´@y§ë ±䘙®@o‰°¬+ÄFcf¾ÿX¡¼Q€u…ØrÌÌWà+”7 °®AŽ™ù üc…òFÖb#È13_¬PÞ(ÀºBl9fæ+ðÊXWˆ ÇÌ|þ±By£kñJ?©›£k ±äÈ™¯Ã|™òNÖb È‘3_‡ù2å¬%Ä#g¾óUê'DÞ)ÀZBl9ræëpi•fLJ¥ËyúC†È|¦ëóy99Τk±ø¥Ì3]ŸÙe&XCˆ¥.ežéúÌ.3)ÀB,u)óL×gv™IÖb©K™gº>³ËL p¿ü…!–º”y¦ë3»Ì¤÷Ë—Pˆ¥.ežÙŠU€3 p/(›ÉlÅ*À¸×Ûrò @9ó›\fR€ûý±œ¤Œ™K+vâEî¥e3¹´b'^à^ P6“K+vâEî¥e3¹´b'^à^ P6“K+vâEî¥e3¹´b'^à^ P6“éË´²Õˤ÷S€²ÉÌV/“ÜOÊ&3[½L p?(›Ìlõ2)Àý l2³Õˤ÷{-!?,ÛÊtõN¼(À½B,f)÷fºz'^à^!³”{3]½/%}õøçù±Ê ›b1K¹7ÓÕ;ñRV€?~PJ1ÓÕ;ñR|PJÙB¦«÷y9ûí6*½øß¿ÿþù-Ào¾¸B,f)÷fºz³ËéÕS¯ösPÊØ™®Þìò°ª ‡ÀRFÏtõf—‡Uç!°”2x¦«7»<¬¢¾z=„ö2)Ãgºz³ËÃòBè½B,f)÷fºz³ËÃR€{…XÌRîÍtõf—‡¥÷ ±˜¥Ü›éêÍ.Kîb1K¹7ÓÕ›]–Ü+Äb–ro¦«7»<,¸WˆÅ,åÞLWovyX p¯‹Yʽ™®Þìò°àºüÆC,f)÷fºzÓ÷3û-àºüÿ’!³”{s}õNƒR€ë ì$×Wï4(¸îmñøEH²Ý\_½Ó ືŒ°Œ¥<#§A)À%oÿÇ|‰°P¥<#SÓ@à’üÿ!ª”gç4¸DÊAsˆ\¢å 9 D.Q€rМ¢—(@9hNQ€K 4§(À% PšÓ@à(Íi p‰”ƒæ4¸ämIø)`9NNQ€©ôGB,E)¯Ïi 0•.€KQÊësˆL¥ ÄR”òúœ¢Sé±¥¼>§(ÀTºB,E)¯Ïi 0•.€KQÊësˆL¥ ÄR”òúœ¢Sé±¥¼>§(ÀTºB,E)¯Ïi 0•.€KQÊësˆL¥ ÄR”òúœ¢Sé±¥¼>§(ÀTºB,E)¯Ïi 0•.€KQÊësˆL¥ ÄR”òúœ¢Sé±¥¼>§(ÀTºB,E)¯Ïi 0õZÞÿYŽœÓ—ÿ¥¦n)ÀTˆå'å½9}ÉtIz|)ß24ukä|›èç‘ËOÊh9ukè̦8Äb“2ZNÝR€é‡XlRFËéK—O‹(À·)Ž°Ø¤Œ–Ó—üHàâK)ŸÙïÓ" 0ЋMÊø9uB¦biI?§N(ÀWúé)·çÔ (¥ÜS' ”rwNP€RÊÝÙË« ”ò`Nͳ=å!e…œš7hFX,Kjé<ÛÏ/¥ŒÓ—½Ÿ?­ÿ©õÏ™æ~Ž×)Àä1ð 5 ð1Õ8@sÞ DãªóH€ˆ<'¼Í÷ëÐ×'Ïñy“áZõ3F–Ö'ï ªÚXyUàF¯A2^Ÿ|/Ð×]®¿c5YZëÞT½±2êýü_Úx­zL p«Ÿ±²´>:±ÝñÞâwä׺ï|®fÿ³0V«~©ÞXyk„~GŸeß÷j ×g?cc¬>úþ>iݱr¿{é¶ðx»÷4V+¾Ÿ[ó=À{ØÑ[)ÀíŒÕVïÏU+Ͻoäu›Ì^Óa¸V«íŒp@ò“Hë?•ôÇ•~Š hZZbk…öçuh™Æ4û->ßùÇ»ÿ|Âû{xh@ Qó7e[y[Ïßn|»Nú)ÀŸ7g{}|(À·¦hQrðç¿—Þ«7½nrhÝŸ¿øX*Àü13@kÞžI߬ü§8ÒgFÞ2tHÁcòëjNñÿèû˜J³<IEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/hash_distribution.png0000664000175000017500000002151314152763504022630 0ustar arvidarvid‰PNG  IHDR ôòž¹J PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@ÈÈAiáÿÀ €@À€ÿ0`€‹@€ÿ€ÿÿÔ¥**ÿÿ@àÐ333MMMfff™™™³³³ÀÀÀÌÌÌåååÿÿÿð22î­ØæðUðàÿÿîÝ‚ÿ¶Á¯îîÿ×ÿdÿ"‹".‹Wÿ‹p€Í‡ÎëÿÿÿÿÎÑÿ“ÿPð€€ÿEú€ré–zðæŒ½·k¸† õõÜ € ÿ¥î‚î”ÓÝ ÝP@Uk/€€€@€@€€`À€`ÿ€€ÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿ€ÿÿÀÍ·žðÿð ¶ÍÁÿÁÍÀ°|ÿ@ ÿ ¾¾¾ÌK pHYsÄÄ•+ IDATxœí‹‚£ª1æÿ¿y7Q AžǪ{7'[h¥ÉÌ(à°,‹xj¿Ð¯E^xËþO‰ÿНý"‚Àc1‚l7Šýv±ˆøE,±”¾e,û²ê(Èpk~QÄy®Kñÿc Š;sYÉŒ¯iªd’ç˜M‚ !™ jòã·‡\b‰Ã®·k,Éœyh2Þ û–ÜnÏuš¿E¿[cIæDÈC“9ÅÝK2'B&I¦éö|A^ÅÄ\B2ãkJ†4šÓÓÐH°-Žï¨VÎF¿‰}wuqßf­û®ß4‚Ügq{uM$óSˆÙîw–›ÞAîÓóW×D2?…˜ï>,þ·åì³5‰ž@€¦,úÿÊ|FP|ª¦˜ÚS~Aàjäâ*v),Aàïñ×¹ÏâöêšHæ§ù6¯³I¯ûô:‚üB2ãkâ;é¿‚  Á_ä>‹Û«k"™ŸBdlÉŒ¯©ä]¬åðC}u¿‚aAšrü>Hè{"EÅ ü=ü+ú¯VÓ« âÿí;‰WLÿd“Ügq{uM$óSÈ>³Í÷Óí«|Ô䊒_SÑσ>‡U7Ù§ )fqå}"«r."üMœŸIoðÞõÊMá…cCHf|M|'½>æiÓàêšî“Ì_ûÍŠ=h£"‚$@€rŸÅíÕ5‘̉F HuÉŒ¯éºd& ÐH0 ]Ü’LßF HuÉŒ¯‰M:ÀI ;`Aº¸%™¾!@ê’_›t€“ @w Á‚F·g9ü 8ñw®*©!!HáÙYbé"×Ãk©ÊR‚ž§å«Tx[>GÎN`óG®Œ.æ 嬤vä%§_D½9Ênò—xˆò²/˜êz{=ž " ¿ Q]@Õž¶^"Èj«Ô™‰ÜF}^WABKò‹±]sCA̸UžD] Ȫ3²Ïòƒ ò¸/Xb‰QSòÊh¾”wcS‡¥‹Ð3Éõ- ˆ{í´ÿi$ˆoˆ~9-ˆ×­«|&ú)#ˆÓN•ë¨Ïé'0·Ä2Ý{D¶>/È¡ Q'ˆî3=$ë‚è;äQgžDÔ¤§v… r>ÅÑS²BÙ^+ˆÈÚěЦíUpJ1NÕ‚¨K²µ~µ—sO=1WŸDL%ŠQžŠBõ0o+±i¯âÈ‚èóNQAtWÄtÂËNõ€¸tˆÖ -Ì3»¦ ò/ù‚ÈÉf v&¿­1*ˆîcG›½ÈJ9{S¬’1/'WeÇ¥ù½c^ ò/Ú^q»A™"üÙ–ÄVD´ok¶[jD{Al*ˆ>v™ ï÷·¦÷§î·Rï÷û“Ãçñ›Íû#ÈûËç•÷º¾÷u;ü9ÿ½³·óûÚÿÐÏÿc¿'¼ßv½÷ þ?ùÔü-òÛðMoôÞ[2Z½0Ý埧{bûË[GþR{[Ä÷ÙVû7Z}sÝ*xï«íÈÞ¾ýü½vÝ´Ï9ï=‰o“¶°÷{³­ÖýA'¥Þû”T{¦[÷ž1³]÷á{Ki;ßä½×õí†u2¾¡O¢ïo+tKöÞÞ+Ü«_uÔÖØ·¼@ì])¢ç¤N@í |¯æð.ˆîBS¦äýֵ蹴 ÚÛL´ÕÎ*“ši‘žŠ[rp_ú/±6I÷ëÉ~½Ý¯zë~?0XsÕSo%®¿Û•äýÞ¯æSîª/³ú©]Ú¼M™úÊ).Þoýõ67Ø÷–œ{Y·kæ÷º²•iîQ[„¾!¾õågÏVí—Ó½†o3ßû‹ú¢÷­foˆ¹Ôë•ÜVó7Z)ݽ6x›µá÷Ò¾õì[ßõÝàmoJêm.´º—ÌÎÆÜ=í5x_›¼í]xµ©®²Þ[Íf9¼Ýž”í}“Ñv§ÙÒ_õMü;šû CwÊÖ¤ïØl õ¶K¬ýÖ²W£ìúÒÜjÅýTéf|§ÑªoY{¿Ú%Ö>ßzÜ>Å_¾9 ¢× zV AVëZß¶”€ zi»:+Ô}&Ùû¸ð ùv›^b­Ž J ¢u2‰¯v`÷Ť]ÕŠu´Ä9Åé ½3[ ³FÏ "ÎpÛ¹/Ö„ fý-1‰÷Þ€ zéhÚª»p= ¢—+Jt‘î°]»9Ý&ŒY(¯ÆyS€d_ކ1Ë¿¸ kTÕ ²ŽÄLa#ˆÜ¤ëY¡Û´ÚWd)Ê„9þ2ÛD%ëPF½*­v:Ù~v¶ùêM§®Q2ØÒô<2‚ø5|þ÷rа¤¡¾ŸÐgë!4Ózo½¹ˆÊu“ý˜âM7iAT~“¾ÿl¯¹9ãé¬ õA¸ Ó ò²¥šÞ2RHAL3”²y›¤k6“IÉ8]œé,;-Ìÿól*A„¦-V;\z^HAVG;=ÚbGÇÔè b¯|¶G9’½±Sê´ 6:&ˆÎOdâÞÌ› ¢‡ÀÄÎ}!ˆž/Ž(v^™ÑöM'ˆh™îº-‚Øó1³Âœmó°³R)Wwz)= ~ÄL&“ULcë^iV¯ò¤ «ùZ b'Çj#äs ìgÙ¦£ ^í¦×ò‚(§5£YçD&oçBXeJ±Zóµ±eA쑌 zæW bfª’/¬6»ˆ “·Ä•Âv’ÄLàŒ ‡ÚmÊQ¦+DÉ$ï"ˆÑZ¤¨“6ÓÀÄôKDÛp_Z-ˆ¼Fÿ ÈÞlq¤B;M-aAl˜˜¼Ñ3' ˆ~PnÈöõDÙFžD+1¡ ÎЩïovj!È+!ÈÞ!‡=H3A„„J¤™äDÿG©ý3ÁNͽ1¸¸ ¯AL×1/8‚hÖ}R*ˆL¡B£„ÄΔë±Öö–+ÈÞ7΃êgÑÃÔX¡ÁÓ@OÓMÛŠÕÄ^Çb‚˜þï$ˆn¹93+ˆ™T‚(ÛG×b« ¢}øQe‡HŒ—5Ý,t(ÄæzVý‚/ˆ™æö§#”xnk>)ˆNÄÎ{k¨œÀAœMbe b_0Ex‚ØY,zK7¬X[½-W‰¢³‚¨1‚ضœD™žÐ±¦*DÉW˜=ˆi²É[w’Þƒ«±í°Z†y].ˆßKU/'Õ‚˜ò¿ð»Ÿ ²!gYD÷JF#Rµ ¶ÓóÅ‚¸¿G~€ b~|½èÖ b¼g«lRVqЉr¬œ2íì6ÃÕTÛù^㕜4Aäó€ nì)ADÂ{m²^“pNÙCiAŽ¥›WŒ>AÜésDþ¹I•D™ö‹ü~}AÌ}¹?+ˆìw=Å‚(é˜ýê(ˆßøA¢ÈÙR.ˆ®ª± r¼^²Ã{$Ô w&*ñ+ "¾žDý¤¹ N\#A̬®'ˆÄ;í¤ ¶&[¥'ˆ<ÇÄvP Jœ+ªTþ,Gb IíA‚ç†9îAäYº&w¢ê࣠6æ(ÈK)– ¢³IìA¼Šä™qAô‹ëa®¿ò‚¼'y%Ù‹q›ÄmSP½õòÌ*Äë)!bÿ¼ b¦ü.ˆ-úZAôœ"ˆ8ÙÄÈ'±˜DuÄï½Õ}.ò\à=+Ä)BvÙA' DoÚ»„Æ/*Hèüú%– «ÄÎÔà%u?+"ˆò&ñ‹>”{lM@]À ‚\ôWn•S÷YAÖ5:û:ÝŒ Çör•‚Hó¢/È~ àyJ¯ÜÛ ®Ê­Ö-94#Õ-Q1/4$N¸Œ‘‚¸g%q‹WnïùÏäù·D”5£ µ{ˆ /ï”ÜD]'ˆÙƒÄyÙ×bò„„òÄD±{ Ÿ×{c•=ȱó…}uõ“qÏ Òbjgä¹-]ÎGV‚8ÕßUóڱʫ± È "³8 ’Ùƒx! b¼gqA¢·í´ Á“êIƉ|Ì·Ô52,ˆÊ rhH´Ê¨ áóë—X¶é-Hàåœ ê΂¸Ç ˆ›ã©%–¨Äa„ öy± ñ±þEjî1O•ê´¼ â[ ’Ê,Йk´æ? H€}q›:ºñм.ˆcÏîA¾Ç̓Šo¸IS»‰Ô™Ùí|޼ò¦ºM ‡×ïAT@HϬŽhÏ RÎÌ‚$–Ñô‚Þ18ÖßGÔ$]“dAª©?«f‰•Dœtv‰õÅK¬ÒÓ²k àI…‡‚„ê/«¼h½š$‚Îx¬ ™þ  m¨dYñtñÏ_¼×{x¦ Ö¨5‚dJ!Èo¤´ò{²ˆs–Ñÿ‹{¬ ü ö 6$7á+÷ ~ìAªkªÛƒ”Åø‚¤‹)߃$C¦Dž³ß(öÛÅ"þÙbg$ÁšqŠAxL|I{ Ãö Îä_ôã×–€ _>‰¼š=lŸÖiWÞþ°Ö¦q|m]ûgê×Ѧ;gºêgëZšA6®aQeKh‘Ç_XéRü¡è6ôX٫첺$¾Sf}ëøiRUx“ †õÕP¿I÷¿”» i’IºZ¹¦¨_6éßÿ.r‰%»~ÜiR›LÁ¤G2Í÷ íB‚ß,(¦K“Q-ˆÙ™+½=wÖiî¤ ƒC¤"f  mŠûB¨çŠe\;®^b ä™üAAfAîÆ½¦Ü½² 0 w݃L2{2E{>É´AªCH¦"f  ìA`~.± ;`AþÀJ{\ÉtAªCHf|MlÒN‚ ÝA€òÐÅ-Éô i‚T‡ÌøšØ¤œAºƒ &ä¡‹[’éÒ©!™ñ5±I8 ‚tAL ÈC·$Ó7¤RB2ãkb“pè‚$˜@‡.nI¦oH#¤:„dÆ×Ä&à$ÐH0 ]Ü’LßF HuÉŒ¯‰M:ÀI ;`Aº¸%™¾!@ê’_›t€“ @w’x9?ÁnMjý89ÃÙƒô !™Î¤9 A¾!$Ó¹˜ èÁ›tö ðtx An_pyèâ–dú†4"ó.›ô‘5‘̉K6陀XbÁ z ²lTdTW>À ÈÞA:–0=¼‹õÐÅ-Éô i‚T‡ÌøšæØ¤—t=àW.Ú¤'7)Ç£‹>3[>À H’ Ødpãÿ4[ÓàmÜýv±ˆ¶Xö }CH¦3ç·›Û²* È—O{^æá5QÈÿ©2OÈ–ò$!çJ¶™ïʇÿÏF àÕ$äÔ‡›‚ÀäÌÛ¼Ë1`ñü@¸7§ÙWÎ2Ìÿ€#›ô¾!$Ó™ì¤cù;·ëy’^ÓuÉLðQ€\ ?“Og‚ß‹0/üÚŸ‡.nI¦oH#¤:„dÆ×4É&=ÜÞÅèNúr~z#Üö Õ!$3¾&6éõ1$Ó·˜ èÁïbñ‹ãàáð.@‚üDu,ã¡‹[’éÒˆ ~õèízžd†×4Ë&ý<,±`×|Ôä,·æÜo59W>ÀôLð.ÖC·$Ó7¤RB2ãkšc“Þ–X0è‚$˜@‡.nI¦oH#¤:„dÆ×4Å&½‰;,±`½Y’GKA¸5 ÷ËÛ/ø¨ÉC·$Ó7¤é |Éäv=O2Ãkšb“Þ–X0ˆ+>îÎϤÃÃÉþÀw‡'3 ]Ü’LßF HuÉŒ¯i’M:{¸/¼‹ÐH0 ]Ü’LßF HuÉŒ¯i’MzXbÁ  ;`‚_=úÐÅ-Éô iÄ¿¼úv=O2Ãkšc“Îow‡sÅGMJséZÀ8øíî &xë¡‹[’é҈̧yû–¿q»ž'™á5ͲIçï¤ÃmA€î @‚ ~¢ð¡‹[’éÒÞŪ!™ñ5ͱIßAç°|ñ^g‰ƒ¸è£&÷¸½¸ÇnM­ ‹wÙþ£—ÃY·&÷Y¬äKia–}YäËçVöú3¯‰Bþ¯æ ÙRž$äüCæ£VKäÏø +äÿ EyåCþâîdú†\±I/8Ã.¹~ ’¸ƒ,‹\b‰ƒ®÷¦ö¦Ì‚Ênωü=‚À­á;éÕ!$3¾¦’dÚ0ÁÜÞ®çIfxMslÒù‰B¸1£ÞŪAàÖpH›ÀlÒÖD2'B‘Àýï ·ëy’^Ó›ô²€®§üÊEïbçS_>Àôð.@‚úÏb5,ã¡‹[’éÒ¾“^B2ãkšc“~‘ =¸âãt-`|' Áïb=tqK2}C Õ!$3¾¦96é-`‰ƒ@€î @‚ yèâ–dú†4AªCHf|MlÒN‚ ÝA€òÐÅ-Éô i‚T‡ÌøšØ¤œAºƒ &ä¡‹[’éÒ©!™ñ5±I8 ‚tAL ÈC·$Ó7¤RB2ãkb“pè‚$˜@‡.nI¦oH#¤:„dÆ×Ä&à$ÐH0 ]Ü’LßF HuÉŒ¯‰M:ÀI ;`Aº¸%™¾!@ê’_›t€“ @w Á‚¨‹ 6"Ý)ȧÁœÌß’¿fÉäK¹Ÿ ùbl:ƒQ™­Í^m*j±ÅDw´¹’¼Ëq<$s4·ûK5ËïùpÈÉ´j’;Ûâ~\’L‹>L»ÌLþ™L©Î;ráãeï&KjSŠw42S¶ŠÒÍÊ–²ÞÉ4jÒ"ÿ“t¨2öîÑçÇŠ M˜>~Àõ>3”> ð$ Á"~\Ñühùp«ù€g²x?,±ØЪ<—ãOï˜kXO@sQOÇ,±äÏ´/R³ì¿rn‘›tó\/¸Á?<øù3.9}êIEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/write_disk_buffers.png0000664000175000017500000002206514152763504022771 0ustar arvidarvid‰PNG  IHDRL™“ä-á#üIDATxœíÝLSçâ?ðç¨[°ò£Ú¼E‘ò›‚VF‡åF"Ná 3‡ xÝ”]ÔÈœfq‘¹lf¢Ù½â‚ÉcÙ‚înñ's7Ó ÉeÁ‹.Š”±©½ c¥-å—Ô TÒÏç›~»sP Ph߯¿8‡óü8íy~ô9ç<EÓ4Ï2ÇÝ×C'À¡“àÐÉð@èäx tò<:y<„N€B'¦ƒZ­6îÎ!„\¸p!??’‘lÚ´‰¢¨Ý»w»$KžÁh4ªÕjgŽ|¸¢¢bê’pT]]ýí·ß~úé§Ó“ÀÌg47oÞ|çÎѳÙl!!!Z­V,B|||¸{¦.“Ó™€Ûa$¦Ð›o¾)‰Ö®]ÛßßÏì9qâ„X,.++cö”––J$__߬¬,æ°ŒŒŒK—.Éår@`0N:uüøq{ðS§N=}ú4)))--ÍÏÏo×®]„®®.™LvöìYŠ¢ÒÓÓGÊÏêÕ«)вä=}úT£ÑlذA(Ž4¼ÇM‹kxx8;;[(>}z¤óâž;Àô;zôè¦M›BBBÞ}÷]‘HôÃ?0;/^,‹‹‹‹ !¥¥¥‡fŽ?tèsÅ:s®_¿^$ßíi4šööö+W®Ì›7Ïd2ÏŸ?¿¾¾ž»‡7-VµÀ›:÷V<¼ix2`jhµÚøøøîîî{÷îùúú †{÷î©T*“Éd6›“’’ÚÛÛcccŸúèàÁƒï¿ÿþîÝ»ËÊÊ>þøã¦¦¦èèh½^o0¢££{zz–-[fµZ‡††–/_þìÙ3g.`¦°455uuuÅÅÅiµZƒÁœœÌüwÍš5mmm4M[,–ØØXÇ€¬=¼i±ªÞScÃ7u6ÏÝLðXOž>>……… …‚ÙôóóËÊʪ¬¬ôóó[·nH$ˆˆˆˆ'„$''ëõúÄÄĉe2..ŽiX±bÅÀÀï1c¦ÕßߟŸŸ_[[;00 “ɘ3e÷ÜCCC'–g€IR©Týýý2™lñâÅ:޹\CBB!¦­­måÊ•éééß|óÍ‹/²²²D"‘“pDDDBB!D­VëõzÇ'4l6›“ÙãM‹U-ðbƒB€Ûµ0U‚ƒƒüñǾ¾¾æææ––BˆB¡P«Õf³™ù…‘••YWW×ÑÑÁ +‰7ßzë­Ï>ûìÌ™3û÷ïgö´¶¶êtºžžžúúz¹\N¡(Êh4Z­Öîînç39wîÜ1á¦ÅRSSc±X=ztýúõÁÁA«ÕÊ=/î¹;ŸIך3g!„¢(f3<<¼®®Îd2 †[·nEEEBŠŠŠ***¾øâ‹¢¢"âôüðáC¦°Ü½{—¹mª×ëûúú~úé§_~ùÅÉ씫Zàåx :y0UT*ULLÌþð‡ƒFGGÓ4““ãëë»uëV«ÕªT*óòòT*•P(ܸqcoo/oTR©tÅŠB¡pÙ²e̹\¾sçN¹\ž””¤T* !±±±?^¸páHÏä]»v¢¨ÔÔÔ¯¿þš¢¨?üÐÉa¥uኢ222ÊËË)Š:yòdrrrGGGXXXCCCTTTAA÷¼¸ç>ÞÏ`Š$$$äææÆÄÄ(•ÊíÛ·ÇÄÄB”J¥Ífó÷÷g†á¹€m6›B¡Ø·o_hhèË/¿¬T*-Z¤Ñh¤RiQQѪU«hçÞósUaq>ž}ûö½ýöÛK`&ÃÛµ0 ˜ÍæÜÜÜãÇ3·V|‰Ï%¦3-ÂHÌt< Õh4NNÁ#y #y0µzzzRRRºººÜB1™LÉÉÉ#=ùà=P0¼Fò`jíÙ³gýúõ[¶lqwFþŸóçÏ×ÕÕ9sÆÝp'Lo€‘<˜BÏŸ?¯©©ÉÉÉa6yW˜`MµÏ‹»z+w] î:ÌßÛ¶m«®®iJ<o€‚ à-¦mÚeðB7nÜxíµ×ì›Ü&¸Sís#á®Á Å]—‚»N†=ø–-[nÞ¼9¥'0“¡`x‰ß­xaŸ`´Ó·øûúú÷°V˜àjŸ ïê¬P2™Œ».k {ð   žžž‰œ¹7Am0ë `Š­÷p²¼³o׺¹Ï 3Þ¸®BÖÃÔ¬&x§Úgá®ÁŠ».w Fwww``à¸NÄ;¹ûZƒq×7‹‚éÁÜ}%ÂtpþzÀ3y0…T*s£g¤x§Úgá®ÁŠ»w BMÓ«V­rýÙÌ(˜^âwo×R^¶…1Œ÷"Ù³gÏ+¯¼bÄ{Šð®KÁZ'ƒqñâÅ7nà%¾1¡6˜]P0 Øz ç¿hŒäÁÔ*)))--íîîžæty×Éèììüä“OJJJ¦933 &€W`ÝåÖ»ÊΟ?Ÿ——7™ Crr²3G¾÷Þ{"‘hÁ‚ß|óÍH{`$n¼H`:Mò‹þÓŸþD),,ý°É|` `=S/´Î.çüí9·k\HÞf³…„„hµZ±XLñññáìÎZ³ú"çMþ‹®®®þöÛo?ýôSWe‰a4>\QQ1 ¡fL “¾ ¦¨˜ uv¹iº]›‘‘qéÒ%¹\. !äĉb±888¸¬¬Œ9†;[&÷˜Õ«WSeŸ„³´´ôðáÃÌ߇bã†â\¿~½H$*(( „FûFÓÞÞ~åÊ•yóæ™L¦àààùóç×××s÷ð¦Å=S€Ù‹¢(NµÀð–kxx8;;[(>}šÙÉ*ø¼Sò²tuuÉd²³gÏR•žžÎìdض¶6Fóüùó¾¾>µZ­×ëyCÌ.®-¶„cÇŽøùù1-&o1áΉíL»Ï…ÖÙm&6ÈØ»woJJJKKËÐÐÍf»wïžJ¥2™Lf³9))©½½;[&÷fÿÍ›7íwmzzz–-[fµZ‡††–/_þìÙ³‘B9bfÝljjêêꊋ‹ÓjµŽCÄkÖ¬ikk£iÚb±ÄÆÆ:díáM‹u¦ãú”<Ìx/˜±Fªìÿu2î„·Ìþªª*îíZN·|ùrû¦cÁçNÉË›\mmíŽ;웼ößÿþ÷ŸÿüçÜÜÜÿüç?¼¡< ¦—pU±¥iZ¡P´´´8îaÞ9±Çl÷¹ ¡uv9ç¿èßM†<^>>>……… …‚ÙlmmmhhH$ÌfssóÐÐw¶LÖ1¡¡¡¬hÒÓÓ¿ùæ›/^dee‰D"gBB"""!ÌÏw©Tjÿ—Ífsò¤xÓb©—Ã|›ž‡ùNé‰ÞèáNxË: ¿¿???¿¶¶v``@&“kJ^g’æ-°éé饥¥ ,øãÿ8±3šP0½Í$‹myyyqq±ÉdÊÉÉ9pà÷Þ9±Çl÷Ñ:Ï(“}»Öq¾r…B¡V«Íf3ÓÌÊÊâΖÉ=†7Ú¢¢¢ŠŠŠ/¾ø¢¨¨ÈùP>dfݼ{÷.3x«×ëûúú~úé§_~ùÅÉ3)-Ç3õr.ü9nçøNø’àNxËRSSc±X=ztýúõÁÁA«ÕÊkJ^^EF«ÕʼÊ[`ÿñDEEI$’‹/ò†òH`º9~ã¾`ÒÒÒ._¾\]]]QQÁ4Ó¬b2Ҝأ·û¼i¡uvWN¡““ãëë»uëV«ÕÊ-“{̵k×(ŠJMMýúë¯)Šúðà !J¥Òf³ùûû‡‡‡óÆÌMÝf³)Š}ûö…††¾üòËJ¥rÑ¢EF*•­ZµÊÉÂàLZ€yÄg’íƒ5áí… (ŠÊÈÈ(//§(êäÉ“ÉÉÉaaa QQQ¼ß±±±?^¸p!óØ·À655;wî¯ýkYYÙßÿþ÷Ÿþ™ `–rU±µZ­™™™@"‘¼ôÒKÌЫ˜83'6ZçÎsÞ®…é‹Ä8s—Çù/ÚÉWç`J¡`z<×[˜Õœÿ¢'õLÌFhf[˜ŒäÁøà"ñø¢g|_@px ,kÓÄqÊ«Ñ9rdÑ¢EàêÕ«#íWÁíZ˜6›íóÏ?×étÌäõ¼{À…0’“…éìf ŒäÀdýúë¯_~ùåÒ¥K×®]ÛÔÔä8Ó)ãÕW_µX,jµÚqN,Öžû÷ïWVVÞ¿Μ9™™™›7o +++ûþûïår9V®v's¦Àxa:{€88ú]'oåÀ0ÓÙ/Y²äîÝ»EEEöéì?~<Þéì¿ûî;Ö#z˜ÎÀIÓˆã5aWÁ3y0)˜Î`fBgxà—ôì‚ï < ®gWÁH€òÆNžKç<çu}š õæ›oŠD¢µk×ö÷÷3{ž?^SS“““ãù¶mÛª««FJýèÑ£‹/‹ÅL­ôôéSF³aáP8ÊÚcÇŽøùùðÆC)--•H$¾¾¾YYYöLB´Zmzz:óK—u¦]]]2™ììÙ³E¥§§÷“`Q©TŽ•¤J¥"|µîêÕ«)вWz¼u«¾"ªuycæÖŸ,W®\™7ožÉd ž?~}}=7ϼ¸yp%ÚûŒ÷¬÷îÝ›’’ÒÒÒ244d³ÙîÝ»§R©L&“ÙlNJJjoo·©Óé–/_NÓ´V«ïîî¾w¯¯Á` iúƯ½ö7þ-[¶Ü¼y“7馦¦èèh½^o0¢££  nß¾ÝÙÙ)•JM&o@…BÑÒÒ2J<±±±Ož>>……… …‚ÙlmmmhhH$Ìfsss@@@~~~mmíÀÀ€L&#„ø 00P,?~œ¦iƒÁœœÌükÍš5mmmÜ CCC ,ðóóÛµks³ƒMÓ%%%R©T lذ¡§§‡¦éÈÈÈÁÁÁ¾¾¾•+W>xð€{¦4M›Í樨(ŸÄÄÄq}Œ\F£qîܹ>lnnž;w.ó¬«Öýî»ï›­>ø€æ«‹¸õÕÄj]nÌÜú“‹u»–›çóçÏ;îùÛßþÆ›g q»Öuþÿ2_ÞÃqq³i¶gÏžW^yÅñ)à‹/Þ¸qãÌ™3nÉ€gC­;¹±™ö0Þø9ºñêéééÉÎÎþç?ÿDéììÌÎÎþ׿þ5ʘ0Ôº³:y®âŸ#®€ Í´«àÅ §°æLw•™¶â€[ Ž˜ ÞØYžÀO„={ö¬_¿~Ë–-.ÏÌùóçëêêðtx3Ô±à#y®‚‘¼±qçLç®Á]—")))--y¿•rêÔ©ãÇ3ÁOœ8qêÔ)æï1W¼ðl¨c¦Š{^êu«ñž5kÎtîZ¼ëR‚ææf³Ù¬T*µZ­Åb‰‹‹¶ÙlñññÏž=³}îuφ:X¼³s2°âÅØXs¦3³Ÿ;®Á».EDDD||ôÖÖVN×ÓÓS__/—Ë !o½õÖgŸ}væÌ™ýû÷;Æ?úÜëž u,ÀA'ol*•ŠY‘šÙT*•yyy*•J(nܸ±··7!!!777&&F©Tnß¾=&&†"—ËwîÜ)—Ë“’’”J%!D*•®X±B(.[¶Ì9MÓ«V­rÇ™¸êX€)â/°LìíZÖœé£3›7o¾sçŽãN³Ùœ››{üøqµZm߉¹×PÇ‚#¼]ë*ÉsJIIIii)³XõÄŸ|òIII‰+ò0[¡Ž˜ ÞØYÆO€ Í´«`$À¡“àÐÉð@ó(Šrw¦Ã(w÷½ä˜±¼¤™žæg çáÙF|3šé ÃíZ„N€B'À¡“^‡õ,¿'=Ú`‡NÀ 54441oÚ´‰¢¨Ý»wOEä0Šžžž”””®®.fÓd2%''÷ööŽêÂ… ùùùSŸ;ð4èäxk×®UUU¹;Þè½÷Þ{çwÄb1³)‘HÞ~ûíâââÑCmÛ¶í«¯¾å£ÑøÆo¸,—à)ÐɘѴZmzz:óCÿĉb±888¸¬¬ŒùoFFÆ¥K—är¹@ 0 OŸ>Õh46l …ößýÜPÎ8vìX@@€ŸŸ_AA!äéÓ§IIIiii~~~»ví"„ ggg …   Ó§O3¡JKK%‰¯¯oVVVÿ„Sp#ÖE{ôèÑM›6…„„¼ûî»"‘è‡~ œK[@N:uüøq{„§N"„<þ¼¦¦&''Ç1¹mÛ¶UWW Œ”ŸÕ«WSe/ÑÜbÞÕÕ%“ÉΞ=KQTzz:sØÑ£G/^,‹ÇìA‚'£½wž5Ì:‘‘‘ ™™™½½½4Mß»wO¥R™L&³Ùœ””ÔÞÞNÓôÞ½{SRRZZZ†††l6›Á`X°`ÁíÛ·;;;¥R©Édâ EÓtUUUaaá(©+Š––û¦Á`ÍÍÍf³Y©TjµZû¿t:ÝòåËišnllŒ}òä‰ý_#¥àv¬†À¾É½h?ú裃¾ÿþû»wï.++ûøã¹—:·€X,–¸¸¸ááa›ÍÿìÙ3š¦oܸñÚk¯q3³eË–›7oŽ’Û›7oæååÙÓbsš¦kkkwìØa?¾©©)::Z¯× †èèèÆÆÆ‰}Jî‚fÚUæ¹·‹ £Ø¹sgzzº¿¿?!¤µµµ¡¡A"‘0ÿjnn õññ),,T(ö qqqjµš²bÅŠÞPÎ$]^^^\\l2™rrr8@‰ˆˆˆ'„$''ëõú°°°üüüÚÚÚ™LÆä055uéÒ¥öH&œ:€»p/ZBˆJ¥êïï—Éd‹/ÖétÜKp HbbbVVVee¥ŸŸßºuëD"!¤¯¯/ €›hPPPOOó™dsÞ³HMM !„h4š¶¶¶•+W:?x Ü®˜¹êêêZ[[+++ ! …B­V›Ífæ÷YVVs ÓxØÍ;×qs¤PcJKK»|ùruuuEEEGG!¤µµU§ÓõôôÔ××Ëåòšš‹ÅòèÑ£ëׯZ­ÖÈÈȺº:æàI¦à.¼íœ9sˆÃ¸ÜKp !ä­·Þúì³ÏΜ9³ÿ~æÞw,º»»Ï$«˜3y3V«µ»»›^WWg2™ í[·¢¢¢œ< :y3×üùóÏ;WRR¢Ó颣£srrbbb|}}·nÝjµZ‰êÂ… Eedd”——SuòäIn(«Õš™™)$ÉK/½$•J !r¹|çÎr¹<))I©T&''wtt„……544DEE(•ʼ¼<•J% 7nÜØÛÛ;±<¸‘3-÷R'œB‘J¥+V¬ …Ë–-cªT*æÎ©cl4M766®ZµŠ7?×®]£(*55õ믿¦(êÃ?ä=,66öñãÇ .džÉKHHÈÍ͉‰Q*•Û·o‰‰™ð³E{ß’påg 0F£qóæÍwîÜqwF\ƒÕL²]à- f³977÷øñãÌ­UÆž={^yåÇw/.^¼xãÆ3gÎL8uσfÚU0’àb< Õh4Ž=˜~ÓÐÚâv-€B'À¡“àÐÉð@nèäEEE Íœx¸6mÚDQÔîÝ»§"r˜½ÐôØFµZíî\ÀhfèHžÑh|ã7Ü•úµkתªªÜ•:x!4=àr“êä;v, ÀÏϯ  €ÙsôèÑÅ‹‹ÅâââbfOii©D"ñõõÍÊÊêïï·‡Õjµééé½½½„'NˆÅâààಲ2BHWW—L&;{ö,EQééé£ça”x!—.]’ËåÀ`0<}úT£ÑlذA(æçç3ÇpCŒÂ-MÏÓ§O“’’ÒÒÒüüüvíÚEÎÎÎ …AAA§OŸfÛ³gÏÂ… 7lذfÍšööv'Ób5Ö¼1sô/^¬_¿^(¾þúë>/˜B´Öæ˜ EKK‹}³©©)::Z¯× †èèèÆÆÆÆÆÆØØØ'Ož8†ŠŒŒlhhÈÌÌìíí¥iúÞ½{*•Êd2™Í椤¤öövš¦kkkwìØ1zêÎijwïÞ”””–––¡¡!›Íf0,XpûöíÎÎN©Tj2™xCÑ4]UUUXX8®OÃcŒ÷2˜ÕÆUé¹±é1  ¹¹Ùl6+•J­Vkÿ—N§[¾|9MÓ?ÿüstt´ÉdúñÇA[[ÛHi9âm¬Y1sa—Ùlv&-°›†Ö–=ò¸”——›L¦œœœ´¶¶¦¦¦†„„B4M[[›ÍfKMM]ºt)+àÎ;ÓÓÓýýý !­­­ ‰„ùWssshh¨“3ŸÂÂB…BaÇÜmx$Làp»À¡“àÐÉð@èäx tò<:y<„N€B'À¡“àÐÉð@èäx ÿT…”ê{üÿIEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/delays_thumb.png0000664000175000017500000002526514152763504021576 0ustar arvidarvid‰PNG  IHDRúņgAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEå 1fì«_)¹IDATxÚíÝéog~ðï33¼‘uP‡I¶eÇv²Qäæpۛͅ¢A³X 4í.Ú¢»/‚"úºoöh ôE‹¾œM6‡³É®“øHìØ1bÇ÷%Ë’lÝ"ER¼o9Ó3:lë²,ixü>‡3’~¤†_>óÌ3ÏÃdY!„”Në!d¹„åì4·ÆÓºfBH•Z,°$Iúê«¯ÆÆÆ8ŽÛ±cÇÐÐP{{ûsÏ=§l’$IëâKŽ’æt–ý ze£—e^<Ï?ØräˆÙlþÙÏ~ÆqÜøø¸Ýn·ÛíÊAÂãy¾««kænllÌårÅãñP(´e˃ÁP(FFFGFFìv;Ïóz½>ß¼yó'?ùI"‘¨«« n·; 9ŽL&#ÇqÙl¶££C„ .¸ÝîÍ›7ÿøã5553¿Èb±©6Œ1“É”J¥¾üòKÆØ7ß|óì³ÏšL¦©©©—_~¹¥¥Åëõž8qÂl6›L¦b±xäÈ‘W^yåÆ###»víÚ´i“^¯?räÈo¼qèСšš‡ÃÑÙÙ988XSSsôèÑË—/?óÌ3²,›ÍfŸÏ—ÏçcÅb1ŸÏÿÛ¿ý[{{û… &''ßzë­sçÎÕÖÖ=z´¶¶öðáðÙlcccõõõ‘HDÅ\.×ÝÝ=11Ç€Õjݹs§ÙlæyÀÅ‹Ãáp6›M$}}}MMMgÏžeŒ9ŽH$²gÏžöööp8üÿñï¾ûî÷ß_WWçóùnß¾ý/ÿò/§OcjjÁ}zbbblllhh(‹ÕÕÕE£ÑóçÏg2™L&Ãó¼ÑhܵkÇqÇŽâ8Î`0¼öÚk3ÝÞwïÞ½té«ÕÊó|0L&“ÃÃò,‡Ãa“ÉÔÕÕ¥P`²¶ššš~ñ‹_är¹––ŸÏ755uàÀM›6:tè•W^±ÙlJ|H’ÔÐÐ055õä“O†Ãa«Õ*B>Ÿ7›ÍÍÍÍ6l°Z­‰DBÉ5·Û½}ûöÎÎÎææfŸÏ÷ôÓO‡B¡æææ­[·êt:žç³ÙlMM͹sç^zé¥b±˜ÍfC¡P]]ݾ}ûÌf³Õjõûý]]]‘HÄï÷Ÿ:ujÿþý»vír¹\?ÿùÏóù¼ËåbŒÍm8pÀív;Ž\.g·Û[ZZc{öìÑétgΜPNùEQ|å•WL&ÓÐÐN§Û¹s§ÅbQ¯þìgˆÅ°ÈÐŽC}ýâ/æJÆ€„Ãák×®íÛ·Oë#2#Ër:6ÊyV)Èçóñx¼¦¦fÅ—D²Ùl*•r8«ø¤ ja²~c3—ÚK„^¯w»Ýò”KsëS- W#„” ,BHÙ À"„” ,BHÙ À"„” ,BHÙ À"„” ,BHÙ £Õ*ÆÉ“ÈfÑÝ ´®†e¡ÀªV‰n߆  ±q±À’e$“EX, ù…ˆÖ(°ª˜Éƒ‹ÏsÍâ½÷JaÏÐÝ£DkÔ‡EU,‚çÑØˆ\NëR¡À"„” ,²<Ù,2‹Z×Aªõa‘e` çÎáî]8€'žÐºR½–,Y–•i畯´aE‘eôö‚ãÐØ«N'šƒÍé„ÃtZëŠIU[,°ŠÅâ¡C‡²Ùl6›mllœœœìèèØ¿¿²IE‚ P„iL’Ô®ñ,Æ)˘˜ÀÄ X­øÛ¿…Ç3ÿnŒA–qý:D?e–nBV[±X”$)ŸÏÏ;òbuøðáƒò<_WW Nçèè¨XwîÜ) V«µ»»›–ÿÒ’$áÓOá÷£³/¿üÐßΜNx’„Ba‰ýÄ㨭]:°dù<èõ 4²l>Ÿ¯§§'Ï,‹ÖÖ­[_yå•`0ÈëììŒÅbÛ¶m›ÙôÒK/ɲLKlk¬XD4 »áðJ¾]–ïùoIŒÆe׋O?…,ãÍ7áratF#6oFÉÌeNJSSS“ÇãQÖ^|pëbµ}ûööövI’r¹œÙlÎd23373Æ(ªJcàùujÅ,3×d2ÐéÀ²Y\½Š~ÇáŸþ‰Î%Éâ”`Yh=‹%:Ý•´•œ¢uÆ+Š$-7zVlî2sÒiõ7J¾þ~?¶nÅÞ½Z¿¤œÐ°†ê“Ëá³Ï09‰luuëôKçæc±ˆ±1èt×úµ e†Nëª("‚Ͷ’«Š«…ça4jY)OtÄTŽC_B_ß²öçyí/Þ­õ )©DtJXž|>ŒÃnÇæÍê#¢¿F#¦¯ä.aɼ$|û-ÆÇ15…M›´~„XåêìY Bðÿ >b0Àf[ÍAÅ"îÜ PSˆ”:%,O<&Ó=i²êÉ"°Xhä)ÔÂ*[’´Ê?°PÀð0ƒÇC!EJµ°¨#˜Já‹/Ëaï^lÙ¢õ JJÝb•L&“ɤÁ`H§Ó6›MùjYþ{ƒ¬)ŽÃä$B(·[}0†× §SuIÂ_`bSS°ÙVþ«ç&ÇabÂëÅc-Q°Ápÿ<©‚Aèt)°È’ ¬K—.?~<›Í …ÎÎÎŽŽŽßüæ7B¡Ðàà N§kjjâi*MÈ2L&l܈lVÆpíFGqàÚÚðã<û,¬V15…ÁA¸ÝˆDV³ A€ÝŽ`p‰=ƒÁ0Ï=Ò:h-^2-OMME"‘¼²ï½ ¬ÆÆFžç7nÜh0Nžû ££Ø¾}%d³ˆÅP,B¯×úµ eÉív»Ýîp8|íÚµ·.X;wîܹs'€îîn­Ÿyn·zæußÊ˶¾²ÑêŒáúuŒC’hº+²¨_‰V0H}†2cÌŠWùv8ÐÒŽnÐ!k‹R6(°!eƒ«¢I¢Q$“t‚F*t¯\Œ!ÆçŸÃnǯ~E·Ñ @UÑx^@}¾!-ë¡XÄ… H$è¢!YtJHÖ’$abÀÚþ–H˜˜ 3ߊG-,²–ƒËµæ«Qœ:…¾>øç¦»|*µ°È{صW€147Ãh¤VÅ£À*7Ê{²bÞ™«gó‚EÑ)a¹¹qgÏbt;vh]Ê£a W¯ÂëE:=ÿd8„<€ZXåfj W!ïpƒ6Mó@–Ž•rÃt:TÆ”><Žˆ‘å£ÀªÅ""ärZ×AÈ£¢ÀªtÊdêŸ|‚ÞÞ2>ù’e„Ãðû‘Éh] ÑuºW½--ÈçËøRZ&ƒƒ‘Éà©§ðÓŸj] Ñ )a… $ z=œN ê&IB>¯ÎOª)a‡ch--xõUõ‘+WÉ`ϤÓ8|‚€_þ’ºí«YIB,¶æ=JÉ$Üî{¦ÇEŒÁãɳ…²Y­_ ²~ʶ¶ •Îweâš?þ—.­yG>ÇÍ6 dF#¬Võ‘¹›Hu Vù·ßb|›7k] Àó¨¯Ç­U€bpããØ°Aë§JJÈbFãñ¸ÃáˆD".—+‰8»Ý®uÍÕ*A¡ð«Ò—µ+W01xœÚPd®Åëúõë_ý5Ïó©TŠçùB¡ÐÖÖöÎ;ï·oßÖëõ6lj¦­ Æ 2Æ}I‚€ÚZÄbZ×AÖ[4œœŒF£¹ù†:/–5uuu&“©¿¿ßd2E£Q«Õ‡•MÅb1ŸÏ3úô#kg9'›é4þüg˜^â—”;I’DQEQžïX,°c]]]¯¿þº×ëmnnöz½7nT6y<žÝ»wkýÔy„e_IIr¹\.—k%+?wvvvvvÎü/­MOÖc(àóçÑØøße6C¯×ºz²N¨û‰”ŽÃíÛøÓŸÀqøû¿§¾v2/ ,R$ gÏ‚çQ[ IÒlRò(°HiÈdÔ鱨CŠ,ŒFº“Ò`±Ì?ÄŒ1ܹƒ?D PÆÓãUBG) ‹4¬xz=¥)<£‘‹€‹”ÆÉàèQܼI Ƀ(°H‰‘e¤Ó4=™)1ŒÁj…Ѩu¤ѰRn$ ×®©ó&“*CU’DÅ"4Ƽü~ð<\.­ë ëÞ¥§XÄÇ#@g'^{MëjJRM zå«õa•IB*…ÚZ$Z—Rªd™ÄW'ja•$ÆhØÑCËåà÷ÃéÄÜIqƒA|ý5d/¿Œ¦&­K$ŠÞ¤"p&'ñÑGøì³{_±¢QÄãˆD´.‘¬ ,Rd&Z[ç9[Ôéh¬ŠAU²Yô÷chˆ:n–âæMøýZ×AÖ„XwïÞ=yòäÈȈÖõùx½8tׯÓÈ£%('†ÇŽáäI­K!kB ¬ .;vìöíÛZ×C¦1†T r9H\.44Ð…ü%È2,47Ó%‹J¥^%ܳgÛínmmÕº21ܺ…`V+œNärÕ²À×££çÊ%‡Ã}ô‘$I¶mÛ¦uIdšÃH¥ªhEBB&ÁårI’ôØcÍÝ655‡Ífs<w»Ý±X¬¶¶ÖE÷C¬3› .’I­ë D{»Ýn·Û¯\¹rçÎÇ3³íÌ™3—.] …B‚ lذahh¨­­í_ÿõ_ø|¾ëׯ †öövZùymѨnRMÂáðÄÄD4Íf³nU³Æét¦ÓiƒÁ0w›N§³Ûí/¼ðÂÐÐЩS§ôz}*•R6ñ<¯×ëu:ÖÏŽRQ8ŽÓét:nÞ…åÕÀÒëõ7näïí%q¹\O=õ”ÒæzöÙg}>߆ ”Mõõõs×X%«æÖ-Œ©}í„T‡Ãáp8[ùùìÙ³Ÿþù7ž}öÙ¹ÛžyæåJ6íܹSëçR~ü©¦[²„¹»wïƒÏ?ÿ<âiO¯‡É„pXë:)E‹Å"IÒõë×SôÁ®9êb'daê€àšššžžžFúÊ&It{SYS;݉DCCµ°H…$‹÷ µå8ôôàûïa±à­·`6k]"Y 5°:::Z[[wïÞ­u=„<2Æpõ*¦¦°gÜîÙ§¦ÀqˆF‘ËQ`•)õ”ðòåË^¯÷Æ¢(j]!ÌbÅ‚HäžÛŃNGw8•5µ…µiÓ&ŸÏ7::šÍféZ!){ž§É-*X{÷îÝ»w¯ÖÅBÈb8ù|>ŸÏk] !„,ApêÔ©H$ÒÞÞÞÖÖæt:µ.‰BæÇhnn¾téÒ{ï½7::ªu=„² ÀŽ;~úÓŸšL¦B¡ u=„¬ž‘ôô€Žê ¢vº'“É\.ǵ®‡U††05£‘–ùªj`½üòË;vìØ¸q£Öõ²zœNÔÖ"‘к²jÔÀ²Z­4›;©4²LwVu¤ûÈÈH(ÒºBYŒX?üðÃéÓ§ý´^.!¤„©eµZ9B+?“Ê$ŠøòKœ>­uäQ©}XÑhÔd2Ñô2¤bét˜{c4ŠxV+hÙº²¢¶°ššš&''iÍAR™ƒÁ€¹wõù%þðüñ4¿kyá …P(ÔÔÔFµ®‡õÒÚ ž§À*/€üñرc…B!yïòÂ.\nllôz½ÍÍÍ>ŸoÓ¦MÝÝÝ3;H’Äc4‰)G’DiU‚dY -0EðôÓOß½{÷“O>©­­»-÷ôô9r„1 …Gss³Xýýý¢(Z,–îîn= #&„¬¯×ÛÓÓÇç ÏóÙlV’¤û÷ù|n·»µµõÖ­[™L¦µµUÙ´yóæ^xÍöGÊL>ñq$°Ûµ.…Ì£¡¡Áår…Ãá¾¾¾· 3;Ùíö@ 0wÛ«¯¾šËål6[*•r8±XÌf³)›t:ÑhÔú©òC,†¯¾ÂÔž|RëjÈ<AÁd2-¶T½Óéܸqã}m0÷ôþv»€ÉdÒú¹òÈôz´¶‚f¬,Oê°†T*5<är00:ŠÚZ´¶ÂlÖº¬*Åó<Ïóz½~±•Ÿçe·Û•5Ÿ•å¿èÔT Æ02‚DÅ"l6ôô`hõWرCëÊÈ<¨—‘T=»ÍÍP:7êêàvÓÍR%‹‹9·@ÓõÒF]æ„,åêUŒÁãÁSOi]Jµ£ÀZG¢ˆï¾ÃÄ’I¸\ZWCP(à»ï04„_„ÍW® †Ï‡'Ÿ¤±ZÚ¢WårèéA*E'%M–‘Í¢·ÃÃH&!ËÐéàtB¯×º2BµÎ Ølô)]ÒƒÕ YÆçŸãÿþ‰£iËJ½sÖ÷eçÑÒŽ&P.)X„²AE)X„²AÃÖ…,£·ˆÇ1}?&)Ê8RY¦iËJÖº(qâ ¤Ótè— Æãƒàóa×.­«!®Y†Ñˆ†ËSfx6ýÕJµ°ÖR0ˆÉIX­hn¦ü~LMi] Y34A¦kaݺu«···½½ýܹsMMM“““û÷ïP,EQ ­ü<Ëh¤ì•>¶×R±X”$)ŸÏÏÛ<ý4¬ÖÙÇEÅ"´ÒðCòù|+\ùY’$QkjjZ[[wíڋŶmÛ¦lÚºuëK/½$Ë2Gmã1†Dccê0wRÁd‘¢QlÛ6û·.ññÇÐÙ‰×^ÓºÄ2ÓÔÔäñxÂáðÍ›7ܺX`=þøãÛ·o7o¼ñ†ÉdÊd2F£QÙÄ£¨ZÇáÊœ=‹H„nš­pŒ¡¦æþ>xIB*…ÚZ$Z×W~”`á¸y`±À²X,ÊÚô&“ ­M?b7n ÆÈ¢Q0“IÝÔØHUaÞ»D£Žùµ@'Ø&“Á·ß@*·ùüì&ºÛ¹Ú$“‡a2ÁáP‘$‹à8  ˨¯G¡€©)èõ¨¯§P{XXF–a6Ãj…Ͻžîp®^‡ï¾COÌfüú×ê#W¯bj {ö ±¿ÿ=d¿ø&'ñý÷Ðéðÿˆš­ë.3ðF¹&HÃ+cÁŸÿŒPhÁf‘,£¹zýìñ`±ÀbA$‚bN'Ün $x<°Xè°Yja=$Ÿãã°Û±eËü®(âØ1¤ÓhlÔºV²ªD©Ôb«~=Ø ÀqàyõSmîVê.X) ¬eÈç‚ãàvãìY B°i€&IôáYôzØíïœ1¤Óøì3LMaÛ6x½øðCŒaÇ­+®@XËÐׇÇÁóø»¿ƒ ÀãQW0Ÿ—r¡«"-òG×ë!êÈa½þžÖw8 Ÿ’4O“<E<«•n¥^& ¬eEµ÷¡P–×cE þjc0¨ƒÚyFã줌áÊô÷ÃjÇal ‘Èìw}ù%&&P[‹_ÿšî‘Xêt_6Ê ²2n7š›Áóê}8»wÓÚ¨ä!‰àË/9K ÷LRõ(°¦?ŽÁA´´à7 ËEØí0¨‹Š¬ MMH§ï9”eÔÔÌÞòEíúP`Móûa4"@6«Îo+Ѝ¯×º,R¹æí¥û¢EyÓƒNŽƒ("™Dm-˜¤•¢jaÍgî¬ „¬ÆÐÓƒh‰¦WN ¢Öʘã@ù<¥Yo²L·é,iéÀŠÇããããñx|rr2•Ji]ðZb CCêÀ+ ,²Îôz˜Í4äjqKŸ~ñÅçÏŸì±Ç:::~ó›ß…Bƒƒƒ:®©©‰¯¤¾«6àî]­ë dcÀíÛp¹ðôÓßµǧ¦¦"‘H~¾ñKÖîÝ»‰Ä©S§ ƒeú.ßL&‰D CcccEhRbÃÍ›Çà ºº*>°òù|$‰ÅbÅùîUZ:°\.WCCÃoû[ŸÏ×ÖÖ¦<ØÒÒÒÕÕ¥õS#¤:œNTv‡Ì4·Ûív»Ãáðµk׿y%–üþÖÖÖÖÖV­Ÿ!UŒgM«Ö¾P'Nàôi¤ÓZ—BÈÂr9üðîÜÇ!ÂÉ“¸~]ëš´T}ã°”cúûqñ"dmm˜˜@_†‡ÑÑ¡uq„’„‹Õâ Œ!Fc#2ܽ‹¡!tt¨³*ëtߥuŸê ¬¹3Æ(w;ß¼ ¯™ŒÖ•2-ÏÃáÏ£¶V‘MYÝþòeüïÿ"‡Í†în<÷œÖµ®«ê;%ÌdÀóp»é ‚‚‡ƒ†“b³ÁncjïÕL–2}ˆrô:ˆÇµ.t½U_`à¸Ùq¡Ê¢§Ô£IJÊ"½ìŒãÔÿªoxsuœ ¸t ‰:;gÿÆŒ!•Â'Ÿ ÆöíZ—HYZuV6‹3gÔ™:;gç8Ølt¡rQÀl†Å2Ï%•ê»ÎBHùª¦>,ê¨"¤ÌUS`BÊ\Õœ*Âaø|(«ðò ©L’¤ÒõõêˆÓ U¡Ï-A(„ñq$“ðx°m0†+WÐß›Â!eO™¤tjJ ‰1èõxûíÙex*Q…Ö©Sèï‡Ï‡­[áõbËê ƒ.-„C*D"Æàp¨×ŽŠE$“¸rƒƒÈç¡×ÃãÁ3ÏTÒùD…chiA>§±" ³ã† ©  jjLªGu2‰O?E8Œ-[0<ŒÍ›ãé§+)°*·Ó]¿ÎîÞÅG!¨¤?!Àâyjka³ÁlV×aõû+锢âkb'NàÎ5ždV+Z[éVARf{L¯Qpð ŽÕº¬USquû6®^E$¢u„hmæÓ:—C.‡lÙìü«·–òéÃEd³Ðé`0̞ܥÓ8yÙ,º»ÑÚŠlù¼:!Dqí‚A¤R0›±?vïÖº •+ŸÀRæZt8ðöÛ³ƒ ܾ A€ÝŽ`'O"¶mÔ³NÈ,«2X­H¥J¡¯Œ¡¹::Ó–Å¢^•J&!аX`0h]÷­ëžÇŠ‹1üðìv<õÔü;ܺ…‰ 44ÌÓøTf(\ ^‰*Ÿ_}YÆë¯£¥Eý¥Ê'@.‡' I8|MMH§QW§ð¥E( Y„$áøquSƒN'|>xùé4ƒÛt¹ÆÆpýºú“·oG*…|©&&‹ÁlF$‚b™ >‡‰„Õjå8neíú c³Ù†††öîÝ{úôé3gΘÍf¿ß¯uQÚ3™LÇy<žK—.‹Åt:m6›£Ñ¨²u%e·ÛþóŸçr¹»Äª™Ùl¶Ùlo¾ù¦$I¢(Ò‹£( [¶lÙ±c‡ÝnojjòûýÍÍÍ|Õ/ü!I’ÅbillÔëõ[·nÝ»wïøøxWW—ÖuiOE—˵uëÖ¶¶¶B¡`±XB¡ÐŽé+†+ìÃ"„õWíý„2BEVG$¹víšòïË—/ßU&ÀÀÀÀèèèÜG¼^ooo¯Öå“òP>³5>ýôÓáááááaÇ300`0t:ݵk׬V«Ñht»Ý[¶lÉf³üñ_þå_ž={Ön·[­Ö|>ßÞÞþÉ'Ÿ¼ûî»4Ö,‰‹¬‚óçÏz½Þ>úèÙgŸµX,¢(=zôøñãµµµF£qïÞ½[¶l‘eY–åX,öÁèõú={ö …ææfeÄÖO‚”êt'«`rròìÙ³f³Y–e·Û …dY¶Z­“““mmmŸþùK/½´ÿ~·nÝÊçóétºX,Èd2mmmétzw9Ï*GÖ Y[©TJÊ`(É áHyùÅÌÄ`±3%tEXtdate:create2021-12-04T23:07:49+01:00É@ìT%tEXtdate:modify2021-12-04T23:07:49+01:00¸TèIEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/hacking.diagram0000664000175000017500000000375314152763504021340 0ustar arvidarvid+--------------+ "pimpl" +----------------+ | "session" +--------------------------->| "session_impl" | +--------------+ +------+-----+---+ "m_torrents[]" | | +---------------------+ | | | "torrent_handle" +--------+ | | +---------------------+ "weak" | +--------------+ | | | | "m_connections[]" | | +-------------+ +--+ | | | | | "m_picker" v v | v v "peers we are connected to" +----------------+ +----------++ +-------------------+ | "piece_picker" |<---+-+ "torrent" ++ +--+ "peer_connection" ++ +----------------+ | ++----------+| | ++------------------+| "m_torrent_file" | +-----------+ | +-------------------+ +-------------------+ | | | "torrent_info" |<---+ | "m_socket" +-------------------+ | | +----------------------------+ | +->| "socket_type (variant)" | "m_peer_list" v | | "(TCP/uTP/SSL/socks5/...)" | +--------------+ | +----------------------------+ | "peer_list" | | +------------+-+ | "m_peer_info" "list of all" | "m_peers[]" | "contains contact information" "peers we" | | "for peers we're not necessarily" "know of" | v "connected to" | +----------------+ +---->| "torrent_peer" ++ ++---------------+| +----------------+ libtorrent-rasterbar-2.0.5/docs/img/hacking.png0000664000175000017500000003651414152763504020521 0ustar arvidarvid‰PNG  IHDR9)?9{ü=IDATxœíÝPSg¾?ð籊CÀ"$@Pc4ã†ÝRs/‚{Ëâ pU´‹u¶?tî®SÖîÈËtFÛ¡3wZvÜ;:‹?ØöÞÒÑ{G‡?Fi `ZØ\nnHB@,XšTñ|ÿ8÷æËž BNÂûõy8çyžsòœ‡ON>‡¢iš/ùºàcõõõÅÅÅ Ú%''‡¢¨cÇŽy©KàDa] ûìã?öuGÖÕVŠ¡¡!µZ‘‘~äȦpçÎE9×Õ***rrrbccO:ÑÖÖær/X6«f¾ (ÊWýϸ¿,*º»»ÛÛÛ%ÉÞ½{»ºº¶mÛvïÞ½ÖÖVçò˜@ HLLܱc‡Íf«¬¬lkk‹çîå­ƒXv˜ôV|ˆþkë5F³Y蟙­[·¦¦¦BvïÞ=88è2êR©T‰$**Êh4º¹€ÿ¤· (¿†Ï@W“Éd4>|ØÞÞ.•J]nDþ~^sg/ðÄj+ˆT*---•J¥jµZ©T666R•žž~ùòeŠ¢Îœ9ãÎ^õõõEeeeÕÔÔPuîܹå=€•åï¾JQøZ¨?YÐûe±XòòòîÞ½» &<Û À_`Ò[!ðFƒ_úñ%Vó #+,Htt´Ëcžís[ª¹¬V|êÇð~,ÒʼˆV`.ë•ùFCÀXÔºZeeedddxxøÑ£G™’ªª*‘HS]]=Û6ÜVFVBHEEETT”H$*//'„ iµÚÌÌÌÐÐP,¿€;(ŠZÚL |›ñË`¥ g`½œ—L&ëííu¾ìîîV©TV«Õf³©Õêþþ~î6.Khšnii)**b~îêê’Ë僃ƒf³Y.—wtt˜Íæ;wŒDGG[­Öõ3P-ôýXf›îœ¿u¿*Îx3ëyçwNž<ùöÛo;v¬ººú½÷Þ3›ÍB¡Ð`0Øl6¥RÙÙÙÉlyãÆ²²2÷<`¶¿ÆÎ…» 555åååV«5??ÿĉ&“I¯×‹Åbæ·ƒ!..޵ w/nµ&“)===66–¢Õjûúú$IJJŠF£!„ÄÇÇOMM-¦Û ÜÇ\/´§Ÿ…ñÆC.k€€´¨X-#####cjjJ£ÑÊd2Fóù矋D¢Ù¶‰‰‰á–°ªMHH8}ú´Õj}öìYkkë›o¾I‹éj òø¯À 1óÿ™E^/üŸñfËe½aÆööößþö·Ô >çùýj‡#;;[(ŠÅâ]»vEGGËåòüü|…BVPPàp8¸ÛpK¸YÓÒÒ  …R©,))Q(KxÀ°B0÷«Íüa1µñmÆC.k€•ßõcx¿)°/"ä²v ì7_ò«€Kv»âxúô©¯ûËëj~ ïÀ"á"Z!ðFƒ_ú!Và/Äjü…X €¿Ø¹p‘VLzÀsøj €ßó¯ï9úWo|Ÿðb5þB¬À_ˆÕÀ¿1Ï\zùå—™—yyyE­ZÅþ‟B¬ `±X>Ì«¶âââhš¾~ý:óò³Ï>£izãÆ^îÀ2A¬„RQQ‘““{êÔ©ˆˆˆ¶¶6î6£££‰¤®®Ž¢(NçÜ1**J$•——3%YYYW¯^•J¥B¡Ðl6»,©ªª‰D111ÕÕÕ„¡¡!­V›™™Z\\<[[•••‘‘‘áááGõþ)à|L„"wìØa³Ù*++ÛÚÚ~ö³Ÿ±¶‰DMMMuuuuuuLÉýû÷¯\¹ÒÕÕ%^z饂‚‚íÛ·oÙ²¥ººúöíÛR©488˜Â*éééihhèéé ÊÎÎÎËË{î¹çôz}SSS||¼R©Ù°a«-BÈ'Ÿ|òÕW_Éd²e:)<€u5ø_*•*&&F©TÆÄÄüôÓOîìb2™ÒÓÓccc£££µZm__!$88¸¬¬L&“=÷ÜsAAAÜ“ɤ×ëÅbqTTÔ×_m0!)))&***>>~jjÊes555ååå?ÿùÏ?øàƒ¥;n^C¬ÿ‹‰«æÎãOQ”Åbq8ccc„„„„ææf«Õj6›[[[“’’˜Í"""X;Î,‘ÉdÆf³Ñ4MÓtnn.!D ÌÝ!$##ãÚµk7oÞ¬­­^ÔÑø Äj°ÉÉÉkÖ¬aî!KKK+,,T(J¥²¤¤D¡P¸S‰\.ÏÏÏW(aaa‡Ã¶Gvv¶P(‹Å»v튎Ž^Âãà-<èüÛ¦M›úûûÝ) `þõÔ&ÿê-€Ïa] \°ÛíÇÓ§O}Ý/¸ùÕ}Û+€¥‚nüž­TùWo|ëjü…X €¿«ðb5þú»gLÍÀ«p¯1ûy ø{ >ÿ\Âg ü…X €¿«ðb5þ œXÍb±h4šÅÔ Ñh, !$''‡¢¨cÇŽ-Q×<´¨XÍb±>|x©ºÂŸ¶oܸ±))éèÑ£ÜmT*•B¡xá…Nž<)—Ëi𮝝§(*++«¦¦†¢¨sçιÙC€%GÍüà‰¢¨þ9ø ÆÎ,†ÿê-€Ïùe~5»ÝNq<}úÔ×ýXb~«…„„¸ø–Ī¥üžž¤¤$»Ýîë^,Œ_Æj+b5ð3*•Ê™µøñãÇ*•Šp’sÓ ;uvvêtºñññåï9€ð¹!ø™ÔÔÔžžžÚÚZ@P\\¬T*{zzzzz‚‚‚²³³óòòâââþýßÿò_ÿõ_YYY¯¿þ:³oOOÏÛo¿}ýúõµk×úòÜÆŽÕxN©T~óÍ7“““„ƒÁ°mÛ6n²âÈÈHndBHii©N§C æL<ñw±¾D ü—ššzîܹ_þò—v»ýÊ•+gΜٰaƒF£ùüóÏE"³Í_ÿúW& ²^¯/**r8Ï=÷!¤¹¹ùŸÿùŸþéŸþɧá0!ðîW?£T*oß¾“““••ÕÒÒ’––ÆMV<[äÕ«W_¼xñìÙ³F£Ñ·Gà&$$à¾eå[ `t,ÖÕø ±!VðúúúâââÅ×ÉD’’’¢Ñh!ñññSSS!!!¬î£Sìv;«fw¸Ó:!¤¦¦¦¼¼ÜjµæççŸ8q³“þŸ@ "s>--11±¹¹yxxØY’ÐÜÜlµZÍfskkkRR!D °vd•Èd2Fc³Ùhš¦i:77—[3Ó‹Åâp8ÆÆÆ\öÇÍÖ322®]»vóæÍÚÚZV¨«ÀJ¤T*‹ŠŠT*Uhhè¾}ûÆÇÇÓÒÒ  …R©,))Q(îÔÃ}t ·fBHrròÀÀÀš5k˜ûÕ)ŠJOO¿|ù2EQgΜq§u‡Ã‘- Åbñ®]»¢££—öœ?­Ä/ãð߾Ƿþ@ ÁèZrøh`ú8»ÝNq<}úÔ×ýZ2Üüjƒƒƒ¾í,üsÀ |[ià[ `t,ÖÕø ±!Và/䀥4G:+ð!Ïîû ÀˆÕ`‰á¶q¾YLÈ…wÀçð(!Và/Äjü…X €¿«ðb5þB¬À_ˆÕø ±!Và/Äjü…X €¿«ðb5þB¬ÆGõõõÅÅÅsl””d·Û—­?ÀÆb±øº°ô«ñÑ.]ºäë^À2¡(ÊåϾ·þ€ÇXoŸûï¦Ç;Â’³X,‡æO=àˆÕ¼¥¢¢"'''66öÔ©SmmmÜm†††ÔjuFFFxxø‘#G˜Â;wR5s]íüùób±8,,,77wbbÂYÞÙÙ©ÓéÆÇÇ !UUU"‘(&&¦ººšùmVVÖÕ«W¥R©P(4›Í^;;{||œ¦éîîn•JeµZm6›Z­îïï§iúøñã{öìéííµÛíÓÓÓÞ·jقˆùçO"‘DEEF—Ûlݺ555•²{÷îÁÁÁmÛ¶±60™Lééé7nd•—––êtºµk×2Ûèõz±XÌüÊ`0ÄÅÅ—••Éd²%=&×X³Ù³gÏXóMÓîÌT555åååV«5??ÿĉ܆”Jå7ß|399ÉT²mÛ6—s k¯‰‰‰ââ⦦¦©©)‰D²Zw§îœÌ”ÄÆÆB´Zm__ŸD"IIIÑh4„øøø©©©V ·-»Ýîr¶gµÎÚ‹¢ÑhÖ­[·nݺ„„„9öåÅÌ>oß¾ÝÍ}aùá3P/ "óÝêa2™ŒFãÇÛÛÛ¥R)wƒÄÄÄæææááaVyss³Édjhh „Èd2Fc³Ù˜<77—Ù&""biŽüMÓžÝmæÁŽ¬ÙŒ;/¹9Sedd\»víæÍ›µµµÜ©’ššzýúuF³mÛ¶+W®lÛ¶m¶šgºuëÖäääwß}÷Å_üøã‡ƒÛº;õpçä„„„ææffñ¬µµ5))‰"X;²J¸m¹œí)вX,‡cllÌå^111÷îÝ{ôè‘Á`èííåvØe=.û ¼…XÍǤRiii©T*U«ÕJ¥²±±‘¢¨ôôôË—/SuæÌ¥RYTT¤R©BCC÷íÛÇÜFY½zõŋϞ=k4åry~~¾B¡ +((pÎAˆ5›qç%wf*‡Ã‘- Åbñ®]»¢££¹Û(•ÊÛ·oçäädeeµ´´¤¥¥¹SóîÝ»‡‡‡·lÙ¢×ë“’’\Þ çN=Ü99--­°°P¡P(•Ê’’…BáÎéâ¶år¶ONNX³f sŸw/•J¥P(^xá…“'OÊårzÆ= 3±êñ¬Ïà+Ôlï+,‹Å’——w÷î]_w|¢øu1zܾey71›xÖÕ–‰Ýn§8|Ý)à;ü À_XWà/Äjü…X €¿|Ÿ ·Ø¯qs$F¬÷Æñ KX$\}|æûX`ˆ¬ ô·#Öi„ø†%x WÏá3PþB¬À_ˆÕø ±B¬V___\\Ì“¶’’’ìvûòtfZÎ?ËÆ÷Ϙ °'='%%uuu…„„øº#¼3ïÍ|‰ÿƒa¡#Öb±¼õÖ[µµµÞë’OÚZr6,³xöüz´óÍ ?þÅŸÖÕ†††ÔjuFFFxxø‘#G˜Â;wR5󩪪*‘HS]]Í”œ?^,‡……åææNLL¸ÜƳ¶¸53:;;u:Ýøø¸Ë¶²²²®^½*•J…B¡Ùl^ªó㿘'ÙÓ4x“Åèè¨D"©««£(J§Ó1…QQQ"‘¨¼¼œ)á n k iµÚÌÌÌÐÐPfLºl €Åå䯦<›¸¸S"k´sÇ-·Äe묚]Žvî=oëþö5÷û`6›…B¡Á`°ÙlJ¥²³³“)oii)**b~îîîV©TV«Õf³©ÕêþþþŽŽŽäää8ëánãY[ÜšišNLLÔëõÙÙÙããã³µuüøñ={öôööÚíöééi7ßß¹|£y2d¡njj:xð óeWW—\.4›Ír¹¼££ƒv5$X%Üd6›CBBîܹ322mµZ¹mù¿ ¼²˜‰”;º<›¸¸S"w´sÇ-·Äiœže´Ïœ¢ÝiÝíàpõñ/ráºoëÖ­©©©„Ý»wnÛ¶µÉdÒëõb±˜yi0ìv{zzúÆçØ&..γ¶X53JKKu:ÝÚµkgk+88¸¬¬L&“-üŽ™©WTFfØÄÆÆB´Zm__ßöíÛ¹C‚UÂHjµ:%%E£ÑBâã㧦¦–ýP–ÞÜ#ˆeW>ŒvÖäöìÙ3Öè¢iÚƒ‰‹;%rG»D"aÛV‰;Ó¸;Üi}A¶•põù/ú ”b2™ŒFãÇÛÛÛ¥R)w™L¦Ñhl6Šæææ&&&677ϱgmqkf477›L¦†††9ÚŠˆˆðì  æ„pK–Ç-.ôH)вX,‡cllŒ’ÐÜÜÌ,'´¶¶&%%1›q‡ÄÌ—I ÌÝ–ßYÂÓÎgž ¼%–¬É;º<›¸¸S¢ËÑη¬w¦qâÆhw³u`¬«ÏOùY¬&•JKKK¥R©Z­V*•E¥§§_¾|™¢¨3gÎÈåòüü|…BVPPàp8”JeQQ‘J¥ Ý·oßøø8wÏÚâÖÌì¸zõê‹/ž={Öh4ºÙÖŠ5s:`îZóu–^rròÀÀÀš5k˜»jÒÒÒ  …R©,))Q(îTâæ@bµàkrãŽ.Ï&.T£ÝådËíÜ)Ú³ÖxÈ÷_ýpÿë'‹%//ïîÝ»ÞîÒ2·µBðí{F÷‡o0æ>±sÚ½t üœHÁ_¬«ÏùÙºš7ØívŠÃ×à/—ÓæÓ§O}Ý/€Àäû`û Á·7ëj|³Bþ³÷ùº× ¹úüÖÕø ±!Và/^äÂŽüà_0b‡0,•ïc5ܱþeî‹›pÁ'0,>à/Äjü…X €¿«ðb5?vúôéçŸ^(~úé§LI}}}qq±sƒœœŠ¢Ž;æ£Àb!Vs—Åb9|ø0Úšžž¾pá‚Ñhœ˜˜ÈÉÉa 8péÒ%ç67nÜðbGÀË«‘ŠŠŠœœœØØØS§NEDD´µµq·•H$uuuEét:çŽQQQ"‘¨¼¼œ)ÉÊʺzõªT* …f³ÙeIUU•H$Љ‰©®®&„ iµÚÌÌÌÐÐPfIÌe[,ׯ__µj•Õj‰‰Y½zu{{;!dçÎEÍ\Wãbµ<‡X‚ÄÄÄ#GŽLLLTVVºŒÕD"QSSÓÁƒiš¾uë!äþýûW®\éêêúöÛo?ûì³ÎÎNBÈ–-[ª««oß¾ýèÑ#±XÌ-éééihhèéé1 —/_z½¾¢¢b``àöíÛ###ܶ¸^~ùåÉÉÉäädš¦išÖjµ„{÷îµ´´Ìq¤ÜÖöÀ«|Ÿ —T*ÕÄÄ„D"‰ŠŠ2îìb2™ÒÓÓccc !Z­¶¯¯oûöíÁÁÁeee2™Ì¹«Äd2éõz&Œ#„ µZ’’¢Ñh!ñññSSSK|lßgVëqqqÞknÅBúxà! Kÿ…XB‚‚‚È|sEQ‹Åáp<~üxýúõ §OŸ¶Z­Ïž=kmm}óÍ7™Í"""X;Î,‘ÉdæóÏ?‰DL‰Åbs·µ¸ƒûÿ¸­Ã’Cvxà! K¿†Ï@Ý•œœ<00°fÍæ²´´´ÂÂB…B¡T*KJJ …;•Èåòüü|…BVPPàp8ÜiËE¥§§_¾|™¢¨3gÎÔ××S•••USSCQÔ¹sçÜlø‰ƒ OHŸÀÀ€…º›Ýn§8ž>}ŠþÀòÃx°Bay| ëjü…X €¿«ð×ò«!•",nÓX¨…åÂÅßZðb}à3PþB¬À_ˆÕø ±­ X­¾¾¾¸¸xîmNŸ>ýüóÏ …ÂO?ýtyzàIIIv»Ý×½€ùy+V³X,‡öRåžµuàÀK—.ͱÁôôô… ŒFãÄÄDNNÎÒuÀ/-çL³ñJ¬6::*‘Hêêê(ŠÒétLaEEETT”H$*//gJ²²²®^½*•J…B¡ÙlvYRUU%‰bbbª«« !CCCZ­633344”Y$sÙ×Î;)Šr®«që¹~ýúªU«¬VkLLÌêÕ«ÛÛÛ]ö¼‡y,½¯{À#999±±±§NŠˆˆhkks¹YeeedddxxøÑ£G;²æ®óçÏ‹Åâ°°°ÜÜ܉‰ ç¾:n||œpæ[7gWð:Úm Ú¸©©éàÁƒÎ—]]]r¹|ppÐl6ËåòŽŽš¦?¾gÏžÞÞ^»Ý>==Í-éîîV©TV«Õf³©Õêþþ~³ÙrçΑ‘‘èèh«ÕÊmk6---EEEÌÏ.뙜œLNNž»Ïà1—ãdz¡è½þxÛ‚Þ;ï¼sòäÉ·ß~ûرcÕÕÕï½÷žËÍd2Yoo¯ó%wîêèèHNN~ðàÁ̽õz}vvöøø8MÓÜù–v{v¯ZX.\™L¦ôôôØØXBˆV«íëëÛ¾}{pppYY™L&snÆ*1™Lz½^,3/ ƒZ­NIIÑh4„øøø©©)»4o=.ûìqsÀÂ]Bâ—J¥š˜˜H$QQQF£Ñå6555åååV«5??ÿĉܹkzz:==}ãÆ¬KKKu:ÝÚµk‰«ù6..΋nóÖýjEY,‡Ã166FIHHhnn¶Z­f³¹µµ5))‰Ù,""‚µãÌ™L¦Ñhl6WæææBÁÜm¹‰[Ël}†%Á¼§Ü’eã«X   2ß2×®]»yófmmíðð0wîJLLlnnfíØÜÜl2™È,ó­g³+,-oÅjÉÉÉkÖ¬aîrHKK+,,T(J¥²¤¤D¡P¸S‰\.ÏÏÏW(aaa‡Ã¶¸)ŠJOO¿|ù2EQgΜq§uÏú 23xÂýjp8ÙÙÙB¡P,ïÚµ+::š;w)•Ê¢¢"•Jºoß>æî4BÈêÕ«/^¼xöìY£Ñèr¾wv€e@¹¿À@Q Ø€…oã‡oý*Ðò«ÙívŠãéÓ§¾îÀba~X™°®Ë„oã‡oý*ÐÖÕ b5þB¬À_ˆÕøkaÏ-@ú+Âä °H|þÒÏb5>À ‡)Àc<ÿoŸðb5þB¬À_ˆÕ`~IIIv»Ý×½˜ÇÇ÷ìÙ3::ºÈzêëë‹‹‹Y‰Õjݽ{÷øøø"ë@¬KÃb±>|xñÛxìøÃ¿üË¿ˆD¢EÖsàÀK—.-hîq‰Åâ7ß|³¼¼|‘@¬ÀkÌ3Ú—°ÂÊÊÊÈÈÈððð£G2%QQQ"‘ÈXœ?^,‡……åææNLL8÷íììÔétÌZQUU•H$Љ‰©®®&„ŒŽŽJ$’ºº:Š¢t:˦¹Û¼ÿþûï¾û.óÛªªª÷ßhhH­Vgdd„‡‡9rÄù«™m¹ôøñã[·nåçç;á­·Þb~þýï_]]ýäÉ“ýû÷‡††®_¿þÃ?d~•••uõêU©T* Íf3!dçÎE9×Õ¸{ iµÚÌÌÌÐÐPf³ÙŽýÀ7oÞœššrë˜ °"aðƒOx<ðæž·T­L&ëííu¾ìêê’Ë僃ƒf³Y.—wttttt$''?xð`æ^‰‰‰z½>;;{||œ¦éîîn•JeµZm6›Z­îïï§iº©©éàÁƒs·ÎÚfrr2%%åÉ“'ÓÓÓ©©©ßÿ½Ùl …ƒÁf³)•ÊÎÎN—mq}ùå—¿þõ¯/>|¸iÓ&‡Ãa·Û7oÞüý÷ß;e47oÞÌü|üøñ={öôööÚíöééi¦°¥¥¥¨¨ˆU¿s/³ÙrçΑ‘‘èèh«Õ:DZÿêW¿jii™ûœ€Ïñü/ÂÂráÀ"-~‘Œ©ö4¡ZMMMyy¹ÕjÍÏÏ?qâ„ÉdJOO%„hµÚ¾¾¾éééôôô7²v,--Õétk×®%„˜L&½^/‹™_ †¸¸8:ž››ÛÐоwïÞˆˆˆ©©©­[·¦¦¦BvïÞ=88øìÙ3wÚzôèQdd¤óedd¤N§ûë_ÿúÓO?åææFDDLLL755MMMI$f³ààಲ2™L6[]î•’’¢Ñh!ñññs/›­_¿þáÇ ;)Ÿ,«Åü{=³;‘‘qíÚµ›7oÖÖÖ'$$477[­V³ÙÜÚÚš”””˜˜ØÜÜ<<<ÌÚ±¹¹Ùd2544Bd2™F£±ÙlLgrss !EY,‡Ã1666[ëÜm^ýõ?ýéO}ôÑo¼Á”˜L&£ÑøðáÃööv©Tê²-®µkײnäíµ×jkkÿüç?¿öÚk„[·nMNN~÷Ýw_|ñÅ?þèp8˜Í"""æ8].÷óclllݺusÔ0/Äj~€¹km‘Q!Äápdgg …B±X¼k×®èèè´´´ÂÂB…B¡T*KJJ˜ŠŠŠT*Uhhè¾}ûœÐêÕ«/^¼xöìY£Ñ(—Ëóóó EXXXAAÁ$'' ¬Y³f¶ûÕ\nºiÓ&¦D*•–––J¥RµZ­T*]¶Å¥R©:::fž¥R9==½víÚ„„BÈîÝ»‡‡‡·lÙ¢×ë“’’œ·ëÍÔØØHQTzzúåË—)Š:sæŒ;{Ívì4MwttìØ±cÖ÷À Ô"/{?ÅüÙóu/`Åñ`à¹ó‰§_g›ÍVXXøî»ï2Ÿ*Z,–¼¼¼»wïzPÕ«¯¾úÿøÎ¯øÜ•+W¾üòË>úÈ×yðü º¯-~-Í'ìv;ÅñôéSÖfûÛßâââ´Z-¨-ÒÙ³gÏŸ??Ç'°Ëiddäƒ>8{ö¬¯;~×$€÷ðü¿(T^xÏ‹Áó+ëj+''‡¢¨cÇŽÍ,\’dÜàïfæ÷?tèÐÌ¥¯C‡B.]º¿víÚßýîw„{÷î1¿]»vmQQ뎱_þò—===ÜV¸5»SϳgÏŽ?ùûßÿžÂ-!„$%%Y,—G7[ÜäΞ{î9æ@BBB–¶u<í¸«¬ÆÆÆ7n° çMÆíÕ”â<13cÂÒ¦ð3óû×ÕÕÑ4]UUUUUEÓt]]Ýððð‰'®\¹b2™z{{™[Ç233išþî»ï?~ü—¿üÅYUccã¦M› ·nÍîÔÓÞÞþí·ßöõõÆæææo¾ù†[2Ç¡ÍÑŸ¥òý÷ßoÛ¶ùlšÕ-¾u<í¸«yKEEENNNllì©S§"""ÚÚÚ¸Û¸™ž›[ÂM´íV2nÂI_îNÚqðw¬üþ\_~ùå¾}ûvîÜ)‰þíßþmædÏž=s8ÎŤ'Ožœ={¶¢¢‚b±Xœ[jµÚþþþ9ú0G="‘hxxØ`0¬_¿þîÝ»©©©Ü’ÙªYYº'4°êûꫯ(ЉDï½÷Þl­{ O;ÄjÞ"9211QYYé2VÝÝÝ~øaÿ½{÷ºººzzzzzz ÃåË—¸%„-[¶TWWß¾}ûÑ£GÎüóºwï^KKËÌ’O>ù䫯¾züøñ… !"‘È™zûÖ­[‹>ÀGz½~ÇŽs,*mذUøÿñEmݺ5..®  €)ü×ý×_ÿú× zþæ¼õÈd²ººº .$''¿ñƇƒ[2[å¬þ°¦¸û÷ï_¹r¥««ëÛo¿ýì³Ï:;;;;;kkkõzý?üðùçŸ;­õôôœ>}úúõëLr]V=[¶laÕ¾þúë?ÿùÏß~û­ÇgÃ%Š¢vìØÑÑѱÈz `à¹^¤R©&&&$ITT”Ñht¹Í¼é¹išæ&ìž7Ѷ›XéËY›¿ išù+Åó›I¼„•ߟkÆ wîÜafffÞ¼ysfÉØØØ_þò—ÖÖVn ÓÓÓ³UîN=Z­V«Õ>}ú´¨¨¨®®®¬¬Œ[­™[Ï’<¡[s³Í›7ïÝ»÷¿ÿû¿SRRæ8ÀÓ`&¬«yQPP™ïލyÓsÏ–°{îDÛnb¥/'ÆÍïϲwïÞ[·nݽ{wbbâ•W^¹víšËÍþøÇ?þáf^ …ÂÁÁÁGݿ߹ÔäV=üñÑ£G'&&~üñÇ   ééin‰;õ%zB·ž»wïþâ¿°Ùl&“é?ÿó?•J¥ËÖO;€™«ùؼé¹ÝLØÍR__OQTVVVMM EQçÎã&ãæ¦/'ÆÍïÏ"‰.\¸pðàÁ7ýêW¿ânÓÓÓó?ÿó?û÷ïw–<ÿüóZ­6::úµ×^Û±c‡›‹ÖÜzJJJ~øá‡^xá…^ „>|˜[Âl)‘H˜/cÖÕÕqëYª'4pëÑh4»ví’Éd¿øÅ/~÷»ßÅÇÇs[güö·¿}óÍ7Z‚§ >ò¥Å¤ç†Åp.vbüÃ2ãI~5¾å÷‡™ð´ƒåÇó[b°®¶L\¦ðö^ÍÜäà0sMòùÊð*^å÷‡™ð´àâu à=<ÿ/ OÖÕ`&ž_AXWƒŠÏ—%€b5þB¬À_È… ËOÞô;ø˜Ø¿àTˆÕ`ùào¿Á~ÿ‚‹ €á3PþB¬À_ˆÕø ±!Vƒ•%''‡¢¨cÇŽÍ,¬¯¯/..öU—æ€X V–ÆÆÆ7n° 8péÒ¥9ö²X,‡öf¿\C¬¼344¤V«322ÂÃÃ9ÂVUU‰D¢˜˜˜êêêÙJ²²²®^½*•J…B¡Ùlv³¹;wR5s]­²²2222<<üèÑ£„ÑÑQ‰DRWWGQ”N§[²ãpò«ï‚îîîööv‰D²wïÞ®®®Õ«W744ôôôeggçååýðì’¸¸¸-[¶TWWß¾}[*•»Ùܽ{÷Z[[?þøcgÉ'Ÿ|òÕW_Éd2æ¥H$jjjª«««««[òƒ˜b5࣭[·¦¦¦BvïÞ=88øìÙ3½^/‹™ß š¦Y%qqqÁÁÁeeeÎËc555åååV«5??ÿĉ‹¬ `1ð(ð‘Éd2>loo—J¥2™L£ÑØl6š¦išÎÍÍå–0;FDD,¾õŒŒŒk׮ݼy³¶¶vxx˜BQ”Åbq8ccc‹¯À}ˆÕ€¤Riii©T*U«ÕJ¥R.—ççç+а°°‚‚‡ÃÁ-q§ÚúúzŠ¢²²²jjj(Š:wî\cc#EQééé—/_¦(êÌ™3‡#;;[(ŠÅâ]»vEGGB’““Ö¬YƒûÕ`™QxŠ,Šrw°Y,–¼¼¼»wïz»K0÷ß/XœXX(¬«A`²ÛíÇÓ§O}Ý/€…Áx°L°œà_ð~y N,,ÖÕ`Vî<ÕãôéÓÏ?ÿ¼P(üôÓO—§W+ þÃe‚åÿ‚÷ËKïÄNOOÇÆÆvvvŠD"Bˆû© ÀMXWà©ŠŠŠœœœØØØS§NEDD´µµq·ñês>XOõÒjµ™™™¡¡¡Láõë×W­ZeµZcbbV¯^ÝÞÞÎt;**J$•——/éùX¡ €§AbbâŽ;l6[eee[[ÛÏ~ö3î6Þ{Îë©@¯×755ÅÇÇ+•Ê‘‘‘—_~yrrR£Ñ|ûí·Ì6÷ïß¿råJWW—@ x饗 ¶oßî½S° VƒåCQ”¯»àgT*ÕÄÄ„D"‰ŠŠ2.·YÎç|¤¤¤h4BH||üÔÔw“É”žžKÑjµ}}}ˆÕ ŸÂ2¡Ásæ}=d€B‚‚‚È|ÿç,çs>ÁÜ$$$477[­V³ÙÜÚÚš””´Ð&€±€óÒs>¸Oõpg¯´´´ÂÂB…B¡T*KJJ Å¢Ž ð=P€Àxß:ôwKþŽà9ëjþÁåÓ8¼W3žóÀˆÕ`±rrr(Š:vìØÌBwògzƃ¬›Üºì3ø"¼üòËÌ˼¼<Š¢V­ÂW þWHH÷¶ÂèèèÅ/ª¹¬yŽ3ï½ Ü·ø–ø7PÏ3,˜Ç÷8ݸq£¬¬lA»˜ÍæC‡-´¡§OŸŠÅâáááŸ~úé§Ÿ~rGn=è³?ò¯k<..ÎÍBÿÅówij s9yÖÃ¥:.§ yñÿ̃a] –+&!¤²²2222<<üèÑ£„ÑÑQ‰DRWWGQ”N§›­VFM—Y7Yž==M»4ÖÕ–NGGGrròƒœ%Ü Êl6‡„„ܹsgdd$::ÚjµÒ³_˜¬ jæî²—ïïòô[ó{±Ì{\¬)Èå4Åís\Y3ϪËÎì›çÖÕ`9ÔÔÔ”——ÿüç?ÿàƒÜÜÅ™Q3::šÉ¨éÎ^û÷ï_³fB¡øé§ŸÑå•H¥RÅÄÄ(•ʘ˜˜ÙΓvU$1iWM&“d5**ê믿6 ÜBˆ3íêsÏ=Ç$ ó`H€û˜ËgãÆ¬ÖÅ$¶ŠŠš-±­›·žyß_ïõ[³ÇæmÝeŸ¹£uey6Myv~ 0 Vƒå‘‘qíÚµ›7oÖÖÖB(вX,‡cllÌå.žeÔ¼uëÖäääwß}÷Å_üøãnæ‘Ær¦]å XB‰‰‰ÍÍÍ3O¬Ë Š›Ø–uaºyAqë™÷ýõ^¹5s÷r“ljY£ue¹<«žM‰óöb5X”úúzŠ¢²²²jjj(Š:wî7¦ÃáÈÎÎ …b±x×®]ÑÑÑ„äää5kÖÌvûˆg5wïÞ=<<¼e˽^Ÿ””tôèQn¹%KyFÝ’¤]u9$` )•Ê¢¢"•Jºoß¾ññq7/(օɽ ÜIëÎûë½rkæîŵœ‰¹}æöÛ$^É' -mæUo§]Ý´iS¿;…þ Ù‰`¡°®.x/íê¸ùÕ½Ý.Ÿá?<€@†U¾Á; …u5€À´œö—ÓéÓ§ÿøÇ?úºüÅzÚÓ« ééé .Ɖ‰‰œœ_wg)­[·.22r²X,‡^††–Ö.]ºä|ÙØØxãÆ ö±øÆrfÀW©TLVtBÈãÇU*•Ëš†gö¹õðó:ŒŒœ«qÛš÷êv™ñŸu~ÜyÚËz¸­sŸÐÀ݆{~X%.ŸÐÀ=vîÓXÞÿýwß}×ÙÕ÷ß¶-G|‘€Àëðg:xðà;w~ó›ß¼úê«mmm‡rYs@Â5Î7ËöŽxaŸ[‰_\§¬¶ÜÙ‹›ñßåù™÷iÜz¸­sŸ£à²‡Üó3Û›ù´—ï ë±1ôß?¦err2%%åÉ“'ÓÓÓ©©©ßÿý<±Ê×±"¬\L|B“ÿÙ³gL¾{æ·ƒ¦iVI\\œ3'¸³&CºÕjÍÏÏ?qâ·!¥RùÍ7ßLNN2•lÛ¶Í™[fÍ^=Xßrf½'„0Yï·oßνš¸ø²Úrs/&ã?!„ÉøïòüÌqZ樇պÝnç>¡ÛCîùa•LLL755MMMI$—ÇîŽðððÜÜ܆††ððð½{÷²Òö?á3Pð™eË€ŸššzýúuF³mÛ¶+W®lÛ¶m¶š•›ö¹üâ:Ù–›{±2þ»½þúÀJñ·¿ý-..N«Õ"Pó#þô,”­â¬xG`¡°®>“””d·Û—­¹@Íáà_4Åbñu/ü b5X8‡;ø Š¢æxé×–*¿¿Ÿ>'ÀÛ«uvvêtºññqw2‰»ÌlÎÅÚËew€ÀÆÍ•Ϻ.¸WœgYø]æ÷çîõÊ+¯DDD¼øâ‹ÎK˜Åe=Üg-¬DÞI± 0¿ÄÄD½^Ÿ=>>N»—Iœ›Ùœ[­Ëüã¬î+®q^qκÞ~_¸¹ò¹×÷Šó, ?ÍÉïÏÝ«³³355ull¬»»;,,Ìl6»ì6«—×2À „ç€/•––êtºµk×2/çÍ$ÎÍlέÓãüヹ X¹òY×…D"a]q!!!dáwÙ:k/BˆF£Y·nݺuët¸–ð(øRss³Édjhh`^ΛIœ›Ùœ[çlùÙxb¾ ÊÍ•ïòº`]qÜw²ðN~î^111÷îÝ{ôè‘Á`èíí­Û¬zp-0«/­^½úâÅ‹gÏž5Üßr3‰s3›»³—÷€_¸¹ò=».ÜÉÂO8ùý¹{©T*…Bñ /œà/Äjü…X €¿«ðb5þB¬^GQÔ’õÏb±>|xiëäC[,ˆÕÀëhš¦išú?‹¯pttT"‘ÔÕÕQ¥Óé˜ÂŠŠŠ¨¨(‘HT^^Δdee]½zU*• …B³Ù첤ªªJ$ÅÄÄTWWB†††´Zmfffhhhqqñlm± ©ÕꌌŒððð#GŽ0…¬š]–pûÀF@àâç5îròYhW›šš<è|ÙÕÕ%—ËÍf³\.ïèè iúøñã{öìéííµÛíÓÓÓÜ’îîn•JeµZm6›Z­îïï7›Í!!!wîÜ‰ŽŽ¶Z­Ü¶¸Ìf³P(4 6›M©Tvvvrkæ–¸ìáJÀÏa À[È… àx›w”é½DùoM&Szzzll,!D«Õöõõmß¾=88¸¬¬L&“97c•˜L&½^/‹™—ƒA­V§¤¤h4BH||üÔÔ”›غukjj*!d÷î݃ƒƒÏž=cÕLÓ4«$..ŽÛÃbŽa¹TC `à3P€@æã9¸}óøÐ(вX,‡cllŒ’ÐÜÜlµZÍfskkkRR³YDDkÇ™%2™L£ÑØl6¦3¹¹¹„@0w[.™L&£ÑøðáÃööv©TÊ­Ùe[.{¸¸3B€X ¼Îy§ÚþUNNNX³f sYZZZaa¡B¡P*•%%% …ÂJäry~~¾B¡ +((p8î´å’T*---•J¥jµZ©Trkv³- ÿÇ0‘œ¯{á!‹Å’——w÷î]_wÄ?Ìñ^ûõ0ð¬«,€Ýn§8|Ý)døx *+ÖÕëjü…X €¿«ðrá_à&}.ÄjÀ sßQŽ[Î`ÅÂg ü…X €¿«ðb5þB¬À_ˆÕø ±!Và/äÂÿ€§ÀÊ„Tàü…Ï@ø ±!Và/Äjü…X €¿«ðb5þB¬À_ˆÕø ±!Và/Äjüõÿaš¬¿$ªêIEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/cwnd.png0000664000175000017500000004506614152763504020052 0ustar arvidarvid‰PNG  IHDR KF?É#PLTEÿÿÿ¾¾¾ ÿ |ÿ@ÍÀ°ÁÿÁ ¶ÍðÿðÍ·žÿÿÀÿÿ€ÿÀÀÿ pÿ `ÿ @ÿ€@€€€`ÿ€`À€@€€@€€Uk/P@Ý Ý”Óî‚îÿ¥ € õõܸ† ½·kðæŒé–zú€rÿEð€€ÿPÿ“ÎÑÿÿÿÿ‡ÎëÍ€p‹ÿ.‹W"‹"ÿdÿÿׯîîÿ¶ÁîÝ‚àÿÿðUð­Øæîð22ÿÿÿåååÌÌÌÀÀÀ³³³™™™fffMMM333@àÐÿÿ¥**ÿÔÿ€ÿ@€‹0`€À€ÿ€@ÿÀ AiáÈÈÀ@îîÀÿ€ÿÀÿ   ÿÿÿ//õtRNS@æØf IDATxœím–£*@]Rú‡Ëy'ìoº£ò(¥æÞ3Óé(BÊ4Æž À—2õ Sïz1õ Sïz1õ Sïz1õ Sïz1õ Sïz1õ Sïz1õ Sïz1õ¾•÷»wSïà[A€ÐŸ©wð­ @èÏÔ;x:ï÷¯ê–ÿïϳí +SïàálæKduŸ\øíX¨›ù°Ï ˆs¿Ýï¢e è/<)I¨›£œçãÊØ¡›_âÒïì³mz¢LÍ5 Àãd òÈyý¦­?Û[Ь?£)àºÿm f€Ï‚D÷Äšá­Ú[¥¸~/Ã-™Ÿ$Î5x¯ *‚Ähv¾i›š®—­x'‹GÉ5Áx¢LÍ5 ÀSÄ€ Ì5t'tá­ vC€_Ä 2i®9>'À`¡=‡x.ïA”©¹xø3]pŇ ¿•ÚÏB‚Aüe‰Û± ŸŒÅ{ej®ÎGm†átï‰-×I#Àz R`jvˆá ðäÌoÛÜ{ej®"@Ѐb6‚è1 ÀLÍ5 @8r”™ùÞî{û™ø¸w§n†p/z ‚AŠBJo×»œ%%·TÜ ¡z ‚AGXÚ>±aY€…«œ¹ÂU(º¡  l_B³Ý{=ßÛŸÑys·u¡ûø¶o[ubÿ«pΪ77C¸Ãß] _×ðôTúÇömÿØ×/b¢*Âoy8—EWÝ á§†¥!ïA”©¹†ÃQÉìúÀ##@;/ ʆ_׎sëèÿÆÍv9xE€Ù ]í• •– ñ«œD€YdÔUªåæÓƒ4`-õ¶.¬8ö–_€ÞÁíVSº–p³›!8ÎÕ-®M0½ó§7zÛÍ lÞ០@ƒ‡ãHj݆Güp4ãþ¾wºx°nKÿÕ/< LÔ‘­ÂE\/À–L¸R€Ûð9~ãÍ`v”Ø ‡x¨{ê³2WƒÿZ3üIL.zG ðþ³åp’çðXh³³ËÕ pûqd«, I/?„".ï-¼û\œå@j|£¿O€É†¼kýÞ^ùõ·9,˜Ø6Èûò=Ó+Q€Ÿˆ_öã¸<äcÉ Ð¾ 8™œÎ=%Àó¹쉅³në눊D×úmå}&ëö70¶älŸœ;8¤ŸÑòç °KN€Žà'ûaÙú¢þfw ÐÔ pö8çêN ð½ p®º:Íóè/?ü®·/ÀÛ”Ò.ÀìÆ Œ\NgËö ýF›{9ßßåŸOeg\–—½ÂoÉy^.ƒ±â|ço†0¯×šå²Ãøû$ÿUá½²çÐ\-Àû”rB€3ELí2Ùà;¼ýAò«iÙ/v¼{|ÎZ7¾Ó7C˜½Zf§-˜X~øÄÇàô3äëqÚ˜u 0.— ÷¥ÿ ¥/o¸3@_€& gÊU€Þ<ÒÕ!çËÏû ÜÎꜫX5ò©]&)@g^÷yºÉ(<” ¿ïë Ð[güŸÑexöjè1øó”—ÿxËÂ绉ó³l8¿ê ~²±|N'Vù›ü> @ýÌ?ó_jUZí\ε[¥v­X€ïðÆ/ÛÃÏOè»ô!ðçÙoéЖø9ÇÌÿ^ÆÚÂßÂuó³þQ€ÿößý”`$¼ã?ßÝù—â‰ê;ß)q=kìYÆ«~¼G8ü´Ýù›%Ë¿̈́hì‡ á ðçs˜’o†`>>[ãsçtñÍf«×_~>µÛ£ë£Œ(@S/À9`ò À[ö Îp p–`¾©&X¼T÷:lc?þfë¼úU€§ù6&/ M€óçúwø>ö«ǬX€Ÿ«Z*EnÛfygø}7CÈ p®`êÓáø9Qè8"õ4r̵5'XÉüþ=E÷žkË¿¶¿Ç¶ŸßÊ-Ø-üíϲ¼À£ÝYÁÔ\ÃAš/àŒŸC•?’þÞ<¥ƒ«°çeŽ'â˶’8Ø#`f×O ð7Y¼‚ ·"C€¹^@€#bX™åKcŸS™,, ÔLþŠ˜³œ`ÀÔ\CZ€æ€M…ýEnfÞX2Çrß“M€É-µâ 0[öW€gäsxŽ-Ss · ÐY6Š ì@öoë´]?Î* p^ŽTÊ, ôÇݪ(ÀS×ú#À©¹†kèoÞ\m.Ë+˜ø°ž¥£×TU,ÀºLÍ5\"À`tfcŽ ð&Ì"Œ“‘»DŸf«Ÿ?•àŒKˆ 0q/]•¼>­ ià|µMG¶'ô“è /àö#»H^€g8­ƒ fØ‹®3À•’³|¼‰3 À•H€îæJ¸<"ÀÛÑ-ÀÒßÀZ8¯Osi‰¥˜škÐ!@›) )®nŒ.TH °TÁG€fÞ+:†}àkíÙWÍ&ÀÒ<:P%@ç÷p›ˆÚׂcŠLìÙ?uœý­ÌaêïÓW À/a`úÖÑ»ö°p.š¼MR€³·m0òAzÍ<–§ÿp)üœûú$¶´ p.ü½@e wxX€®ÞœŸË’xR8­œàÜ-ÀĤÒ-xƒg)Š]˜ö½ –´¿[€~ÍÌ„ûP#@wQö8¤N€sñoÐýeÍÅœS4{\´ýúø)ü3PÙ¨î Õžóׯ; 0¨>‹’ç ˜:rË]%@;‘°c¡×/«:Ús7Û&!°E€³·•·$%@+γ<5@RŒû ª¢(ÀÄ€ +@w’àúj}Ö yŒíR~¯ft{pJ¼½ƒbº[†“ÂKxn Ø$Ày`¢Ÿ *öèL›g+Àô4í”·ÓŠEÎë}­ 3 íwù °«ë-“ “?ñéÁ}&nˆs<4¤B€Þ²Fš8ëýr§øù¹s<Û Ã3z®Ñ>U€·;[Îa*Œ&ÀÔ¾aþRbÎ0^t<4¤ Àù€KW7[Á¸ùx¿ýäs&pG€îkZN"@sX€¡øfw#‰¸ÃW£Ý$/ ð· ‚’£Œ•œ)Œ¡ SmÔ ðóÓ¶îè,#@'Ì%õ#À /ƒ™ÝEޝN pº3ôàVCI€C^€ëËõ̦¦'@o‹¨ÜEÜö"XËIn(%À-·ÚxàÖY®¿Ë ö  Àåç3¸>ì Ð=ìu7,°9q¿L€áXÜ(ÀúmSœÛ8Gñø¡"À|«çœÝÂÎïy¶'îÓ¸}Û1)Àh,Æ i`⛥n¨°÷ 0Ú"*wB€öšzG€³Q&ÀíDÜçS‰øô\SkP 0Ì,{Ú0'@çýêÎmüûp›?f¾ÊYÀ.Ü!ÀùbºÁíÐû’éöZN p¾J€›êÞ¹h+˜ZƒÚ`”,®?ÎÊ0Î,…4›í}2Ó´9•à¶gÌfçk L;0øó¹ªá“ôkœ 9$Àb$ÎûLÞÙÕõغ #@{K'÷ízùüÏ`®/óž-¦{k`ðª]Îóº7—èÝug}Ì pvXßá±+·µtò6#ÀmYJ€vϘ]&CE€÷3›‚W;·ÐçÇ…,çAâM<`ØÐ_‘4ž×Ÿó²GA¦¾löY¾üÌ}K­‚élP6ŠÄ²¤·éÞ*Àmo. Рqx Ã#Ön[+ÀÙÉÈ9-Àõ}j$)ÀeÈ–!¾J€‰Â× 0jÔ™Rì pž/àJR€É/«Õ3µuL€fW€óì×r‡·“‘ö©¬Í¾—‹±·Ó¹øýØ8xzçzä˜*\'Àð(ø”Í!šåàVr¼jÅžt&ÌŽƒZÜ~sd Àyý&Çìt÷ú-ÏõÛ pÉž¥[¼€‚Xýì„;H ð“)Jmº+Àà®VÛ¯Gh\Úwˆë¸ü¢J€îÑ€;—^ûf 9'@ ÐØ’:hè˜=£åèΪà=¤8Ÿ`zØô0hì³M×¶WÙ‡ ö´ ¶Ë`Ü\pµâ pYX s”ì®Ë pÖ"@##Àt:úo*uqB#¾·„3›ê˜I/íœU P†©¹1&Žœ[“9ë\:ãì¼!?C€É |¶'Tá 0~Ç}²íkÙâ›?À"À_¤jèï‰?"±½q^€aþ!@5¤¸]xz½ƒ¡R€©ÝÇä}jâh"ºShD˜Á¢·Îo`ÝÆÂLÆ/C€·“àzXx¯çZ†[¹Q&˜«²J€ë'šÞŸÕÐ. 8 w”{©+7®à|F€É£_€ðܮܼ_€æ”í¯Íœ >úC€uü,Ú|^º”J åt®ä3Ž·…õL Ξ¸`ÚH p]w@€vä2on9Ú TŒš¤M,@gwý"zWàNk#И´×9CN€ñ>‘8-è½`¯%¸)®É“}˜;- 0üꂳ…»»~“?ß,@‹+@S`ÂeñDÁ už m ФG;'@'.`¶®&ª@€fÛõgéw ð/ü#LïAá4®F^€©YÚäè(Àõg^€ÑЙõ»¸“s•ß&@s…1à \$Àè²Ï¬?Û—>÷˜¸ª¦˜šk@€f‹&ÑÊ:>%@c·ŒC ;.D‹kg€‰Ãƒ ¸ê8»l`|ÓÆ¿óëB+@·ØÏºåYþ$7NòJI€??þ‰€¿˜¸3¥»lW€ðzfgL Мm'X2lö“%àûÇs Ðûã³þžS'@?Q¶Ø¸fÃýñ·@€;4;ŒÞ3Œ%þ>žà߯Uõ+À5Ì¢£é½ðÄ·ãü®B€×3{’«`ðöåî\sçœ}ç|æ—m´O“4^¸tÕ²Ï&ÀºáªàÖÒ|\€‰ãx7Bt‹Õ Ðh A€+{Lè%<æû®ßbr6@€# A€SÁyÞÞE Ss Šö¸8$— ÐY_%Àåbj®A¯£G€p’«è®ßàŒ[+H05×àÏÏÖÃÐo H,ÀðÛŽÁïЈ 0œ÷Z`ŠŒF¦?Ú .ÖŒü4ö¹ˆç¬çU€3”fj®AT€uRœO Ðû^EÎ’E€Uãå 0¨g‹EP€®«àˆП4.´Ã˜ »±2÷À 8#Àc4ÁŠØ tëT€ÎÃí|ÝÔŽBÖûüq^€Þ&ËÝWnà|½qŒ_dÙ© ±?  ×Wðr>)½ $@sL€¶’süT˜`|ʧJ€nyãA€‹ýcÛ;8[–¸>ê ßWðrº 0 å"FuTÐ/oü"péŽ8]d8çTçe[Æ*fDÞaÀׇZÒH(À9Ìèèw¸Î^`­ã›?U ÐŒ$ÀY\€wM¿Õ~& 0¡P€³X-Àul½ A€""À9Ø$ü«×‡˜÷et?c6¦»[Uà§Î'(Œ/GF€Æßdö‡ñ° 㾠ЩÝ»£õ`s¢"ÀO¡nIü)—¡˜zp±Ãé\ø{½·1E€;<_€áYT€Þµ#©k¢ç¥Ø4ñR¸Š„íÊ6Ú1}¦gx@€AMIÎg¸ý0E®YqÆ~ 𬠠iàúÇ$wX1\ðK@€0Çí<}üù±þ%ÿO­ÚGœÃM<Îs_&Žw`qTŸŽX†ÓJÊ®Í 0U“¼·xæÀXëÜB€ˆM°‰/@cú 0®V1®Mh¬P€»ã…¿„k8;Yx•½Ã15×P!ÀùBÎ8× p¼à— 0:ž ¯àgùš‹WÐ?¿ÓC€î³Æ+¡G ¹P€æ°?› @8@(Àø„^ø{½·7ã ¾)â#/@»ë.Këi» Û%Œî„ÇG@€a^8tÎã\%À9)À0÷}`š˜ÖÄvÓ…k¼ø"?æ…óE]ç3Ó"ÀÙ_Þ*À°º ømç;ß‘_•ײáÀ'è½Ë#Àˆ©¹†koàœ`xÖ¶bûû‡gUw››ïµ;ÃÎçí0ØßäFÎ0ÃÔ\CoÎeš¤ÝE¾3¹á™0 )·â9Œ*ÀO†Îñ&²œ‹\+Ô%ÀƒïÛpYê Ј p® A€÷3¨Mo:Çßê7Z.K/ z ³5ù÷Ë]Œ_CÀ°'#0Ìõí&sF™íYI¸.jàü|&^C¼”sÝš¸45G² \–z4»\mµ•V€ùs&ðRš8_-Àù¤ o­°Š¢CÕ™4ç¸yG‹Ãra¸†v&6‘ qøÜÒ7`éØâRÎ'@Ó{ø)à=˜z:[úg[à—Ñ*ÀÈu©Ä– “(Žm…*¸ÌJ ]Ô$@s·í‰\ø4 0žì]$@“à¬L€Š ð³ÈoÞ[{ ü* ЖM¥tB€˜šk@€Ûfð©è ÿ¨^€ŸO'àºH­íù KÎÁKùŠ/Ãõ£U€! ¿ï9ë W%pYÚQ€³é"@³'@怗2š?[ÿx Epcj®aÎg¸}=àgSø @QÎ0Xt‡m‰ÜËÙÒn…¿ÝœÃ»þtšU!@ƒàgµ3Xö —ð›P.ÀÐc°š©¹†ïàV‰+À~ Z§¶ýY)ÀèQІóZ„x¸,í&À9 A€ßRæRû€ ™…«x¼œšíù–ÏWàw Z€Þì cÚiòÏ£ rQ© qÖ$.  h7÷ò ~ºFª_€ç®Zí4ü'»ƒ‡lT 0ùV”`|Oøè`˜Âƒ0ó²Êô઻ÿQšmU½ç0Kà÷ Y€áÛ²A€˜ö[]­÷¶õïõ@yA›‰äeWÔ ÐD7µD€_ìX€a¨ÛZ¦O„›0Q¿U€ëI¿X‚Ù¨  E( Ï`æ“@&ê— päCà’“×?yçn `PHN€Ù4µáÀU @YžLÖüˆî±L_êm|P€qU"L|câp z¥ÄÚÍJ±Û~ZEš,v,k‡`¼`ysø±ïA?v…Ý̱Cе'Óõoc¯ž ¨âÇk4Õü6•Þñfo‘mæ'ªµFÕ¤ç6¾Ÿ­ƒ¸ƒW W‘¡ì¼>¹µ}ÏËÜ—Ýg‚c ·…ßóO©:¯g‹Ýx~Škã•?ÛŽÖ’Ù‘w@€§8/Àvº­íG‹Ãø{ã*ãä „# @·µýh`¸ · „ó<[€76B€gC€6‚  »Œ$À¿ËŽ Ð ÀàVS_rÌe<[€—´"À³ À­&øPž/ÀÔKD€U À­&øP ÛÚ~´0\ðL)Ÿ t[Û†  è¶¶íw 0>ŸŠ%8#À^ @·µýhoàz«ªìZ*˜ư¼F€f0¾Kõæé4É—¨]€ïÝ{•V0Œa7*ˆÿ@€ÎÖЯEB€ïý›5W0Œa/*ƒ/àŒ;£2w 0þ³CërûKòïU0(›‰.\€àëƒH) À¨Lÿ {·æðÏÕ3Œa?*ˆaèlýZ$˜ú«õLcØ*/Àå&ŠŸE°ÐfR€ö"5B°èܦêøùõÇ}D€é6Ï P—Ÿ-À¸ˆ"Î_!Àå´àzvPÿe0Ÿ_àU䯂\Æhô WóÊ05×€·§ð¡ %À`j®nOàCI€aj®nOàCA€Q¸‚·§ÿ*¼ •A€+p{Š ŒÊ À¸=E€Feà Üž®~> •A€+Ð>E€Ïd,ΰž©¹hŸ"Àg2”—31°Š©¹hŸ"Àg‚£2pÚ§ð™ À¨ \A€öig*»Âs@€Q¸‚íÓ¾4Ì/Feà ´Oà3A€Q¸Ò$@·–¦šR.ÀŸŸ‹øóƒ»òx&öXI‹c 1 p{° _kªlY€å@ D€C3– ¬gj®!ŒjF€ða @·µ}¾[€q?!@84ÐmmèƒàÐ @·µ} D€CƒÝÖöA€> t[Ûú|gøD ÛÚ>Ðçkhà#A€nkû @ˆ‡º­íƒ} è¶¶ôA€ph ÛÚ>Ð"À¡A€nkû @ˆ‡º­íƒ}¾G€>è¶¶ôA€pdâÛ{Ä ÀxS¸p¹íвìȸÛÖ 0Z%s•ãjÎ 0Ü ^F«íXI‹ IDATЦ— ÓÂúS‰ãr[„œ ³º(ÀT+?ÞÓ‚+ïm¾kjIÖ¼/ÀD4ð"T Ð+'®œKíïtçÙ7x˜Fñ!ÀÞ À°ý½‚Ð"À‘A€aû{ D€#ƒÃö÷ "@ŸØ0°T Ûß+ˆs À *`Øþ^A˜Ö€UÃö÷ "À°¨ ¶¿Wæ@€5 @U À°ý½‚0¬ª†íïD€9` P0l¯ Ìk@€ª@€aû{`XT Ûß+ˆs À *`Øþ^A˜Ö€UÃö÷ "À°¨ ¶¿Wæ@€5 @U À°ý½‚0¬ª†íïD€9` P0l¯àsøþGî!D€†íï|ŒE÷ïò!D€†íï|”Mƃ™¨ |0l¯àƒøÞ¬÷Ü"ÎA1D€†íï|3öcˆ¿¶¿Wðyä8±~0l¯ Ìk@€ª@€aû{#@.ƒA€€Ãö÷ >G€û @·.ø@`Øþ^A˜ÖpZ€ÿ8Ð ÔÃö÷ "À°†³4L¯†íïD€9` P0l¯ Ìk@€ª@€aû{`XT Ûß+ˆs À *`Øþ^A˜Ö€UÃö÷ "À°¨ ¶¿Wæ@€5 @U À°ý½‚_-À ‡!À2P0l¯àw °TÖ€UÃö÷ "À°¨ ¶¿Wæ@€5 @U À°ý½‚0¬ª†íïD€9` P0l¯ Ìkh †íïD€9` d ( Ûß+ˆs À *`Øþ^A˜Ö€UÃö÷ "À°¨ ¶¿Wæ@€5 @U À°ý½‚0¬ª†íï¼G€Ÿ?Î[ø“½LcØ "À‡Ãö÷ Þ"ÀÕxÿý‡z¦ƒ1ìF…àÓ@€aû{ïàÇvÐ_ 80l¯ ¬ß+Ñr³Xï<Ô3(›‰.xŽàÃ@€aû{ï˜n í‡ÃåÛD+ö@€aû{o ‡ÀÎjˆÅA€aû{`XT Ûß+x‡×Ó‚\ã®F€P¶¿Wðž Ss Э >¶¿Wð›X~Y]ø.`¸fiFV€[2E¯"nü(NÍØ©àš'†;C1¯’íïD€ryÕíÝI ?ÜUœ{†Y0›T%¦\0ðžªÛS•g ?‹ƒ[@€Â ÀPØ–@€âÔ|"ÜÞÓ@u{ªòlŠƒ›@€Â ÀPØ–@€â À& 0°6…A€% 8° ( ,ÅA€M @a` (l ƒK @q`_&ÀvŠƒ›@€Â ÀPØ–@€â À& 0°6…A€% 8° ( ,ÅA€M|›kÜ–@€â À& 0°6…A€% 8° ( ,ÅA€M @a` (l ƒK @q`PXŠƒ›@€Â ÀPØ–@€â À& 0°6…A€% 8° ( ,ÅA€M @a` (l ƒK @q`PXŠƒ›@€Â ÀPØ–@€â À& 0°6…A€% 8° ( ,¥™`PXJ3ØÂÐ|ÿñy4áC2*Ø( lcpnÿþûé¨`_ 4°Áø^u‡¬é”¶1¸Wå½£‡­È{=PþöJƒÛZ€ͦìÇ °¸¦PØÆ3È!ð¡5ý@€Ò À6†`Ò|pwM? 4°¡˜¾þ…Ë`öÖôJƒÛ[€û @U @i`PXJƒÛ@€Â À?ƒØœ±hnÚ]¿‡»(ˆªÄD€ƒƒ¿ØøÝ À6àà Àï¶ÑY€î%{ ¦S‘x øO`oT50°®ôîSb:ÍÖ„ÿöFePƒÛè)Àí‹ÙÓùpÖ6ü§°7*ƒØFWîn9 %ÑÆìÊ ¶Á‡ ƒƒ¿ØøÝ À6z ð]Üp:Š_¿ ìÊ ¶Ñý2>i~7°Þüý‡@€ß l£»‹ÇÀÓÙ`œ<`oT50°Þôþ‚QÄt6Û€ÿöFePƒÛàCÁA€ß l£·ËLnígO2º ÀÞ¨ j``½Xþ2ðd‹íÝ7!W¿ÿöFePƒÛè°N€åO‹ øO`oT50°þ,­žlå' 2T50°þ‡À¥µ“-Vü´¸P¿ÿöFePƒÛè?¬û&‚d@€ß lcž*CePƒÛè}\f²µŸû jCePƒÛD€œÌ¿ØÆ w„æSàð»A€m ò7A`øÝ À6ù«p{k£B€½QÔÀ À6ú \Z=¹ù$ün`— ð½à:G™¤£B€½QÔÀ À6®à¯ï–OníÃa¦|§¢B€ÝQÔÀ À6àÛœ«jCePƒÛhæýN~–ñY²ÜÆêìݬ¦­¶íÇÑèü§°7*ƒØÆå3À·óp˜i­ŒOs Àï¶1Ä!ðyÿQͰ7*ƒØÆløž] Àñ²eøÝ ˜Òªó».ƒ0[ö@€ßÍ€)­*1ǹÂ9‡"@e¨ j`LiU‰Ù[€åÛ\M¶ØI"@e¨ j`LiU‰©à«pµ7D=u;¨ •A Ì€)­*1{ °¬µ)hF ÀïfÀ”V•˜ƒp9þE€ð»0¥U%foVÿaôs—"@m¨ j`LiU‰ÙÿCªûž*CeP3`J«JÌÞ,3­uŸü.1T‡Ê fÀ”V•˜½Xu,ö]à³eøÝ ˜Òªsˆs€ËÇ0ünLiU‰Ù_€¥ÕÓV5Ì€¿›SZUbö?.­ÖBç@€ßÍ€)­*1ûÏ9ØünLiU‰9„@€ÊPÔÀ ˜Òª³÷!p™©¹¨ •A Ì€)­*15`ð»0¥U%&øÝ ˜Òª³§?ßïà`à pþ¥wÏaÀ”V•˜pp†àï(Æ€)­*1{ \Þr:JØÀÆ€Ù²ünLiU‰É9ÀÁA€ßÍ€)­*150ÏÔ\Te0¥U%fWîn2ˆ£ÔĬªïE@€_ÍÏÎa.¡*âo`s…Ð…„VÃî}Çw:ÎÚ„÷ vŠBB«BPZ CPZ *@€¢Ðjâ2ò¥7PZ *@€¢Ðj@€P…„VC'þ~†¼|’ì?¤¢B€ÝA€¢Ðjè#À÷ß-e–;˸ɨ`w ($´ºðŠBB«¡‡?¾ûÜW0xØJ¸[#Àî @QHh5tà6çKH0ì…„VCr<PZ ý>F€E!¡ÕÀe0P…„VBCPZ *@€¢Ðj@€P…„V„  ($´ T€E!¡Õ€¡( ­ @QHh5 @¨ŠBB«BPZ *@€¢Ðj@€P…„V„  ($´ T€E!¡Õ€¡( ­ @QHh5 @¨ŠBB«BPZ *øpF2Ðj@€PÁ2PZ *@€¢Ðj@€P…„V„  ($´ T€E!¡Õ€¡( ­ @QHh5 @¨ŠBB«BPZ *@€¢Ðj@€P…„V„  ($´ T€E!¡Õ€¡( ­ @QHh5 @¨ŠBB«B? @!Hh5 @¨JAB«B-P Z jA€RÐj@€P ”‚„V„Z $´ Ô‚¥ ¡Õ€¡( ­µ @)Hh5|ÿ#z8Ê$Ô”‚„Vƒ¯š_ßýûï?fŽ êJAB«!  =x˜I8*¨( Ý÷J¼t‘ß{}8ÌÔ÷ êJAB«!süv3 G…u€¥ ¡ÕÀ9@¨JAB«B-P Z \µ @)Hh5p!4Ô‚¥ ¡Õ€¡( ­µ @)Hh5 @¨JAB«B-P Z jA€RÐj@€P ”‚„V„Z $´ Ô‚¥ ¡Õ€¡( ­µ @)Hh5 @¨JAB«B-P Z jA€RÐj@€P ”‚„V„Z $´ Ô‚¥ ¡Õ€¡( ­µ @)Hh5 @¨JAB«B-P Z =˜üÓsÞ_ C€A€RÐjè Àäöÿ1Ô”‚„VC§C`8 P Z ýÿ¬÷œïå xž  $´zÎCû¥g€3ù¢( ­ý‡ÀP P Z ú?A€Z@€RÐjÐ Ô”‚„Vƒþ ¡  $´ Ô‚¥ ¡Õ€¡( ­µ @)Hh5 @¨JAB«B-P Z jA€RÐj@€P ”‚„V„Z $´ Ô‚¥ ¡Õ€¡( ­µ @)Hh5 @¨ Á~õ€¡(Ôƒ~þü£¹B€‚~ÔÃ$_ÔÀ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£ ÔÃ@ˆ@7êB= „t£b¾ß¿ÿ®G™ZƒB€Ja D õ î×y®‡™D£B€z` D õúí! !ÝØŸ÷J¸xû·=fjÎùênÔƒï·mêçJð0“hTP „t£Br yèF=$?F€„nÔ—Á@= „t£¸êa D õ€¡BºQêa D õ€¡BºQêa D õ€¡žúx]ÅðÏz@€P|Ö„z ä³ ÔS9¯ׯ20ä³ Ôà PòYêA€"Ïzè!@ÿ›Æ©ï#@ @Èg=t ¯™äg NèF= @¨‡nÔC§s€Ñ}÷ýÛï»7ìG€z` D õÐE€ï垃ÙÛï3Ô !ݨ‡>‚¬?9 BºQÎ8" „t£ºð½sÌX0"ÐzàBh¨‡nÔ„zèF= @¨‡nÔ„zø‚›ä³ ÔƒE Ÿõ€¡(ù¬•p›S)Èg= @¨û‰@>ëB=PòYêA€"Ïz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨõ0"Ðz@€P!ݨ¥œ-P „t£” ÐùênÔ„zèF= @¨‡nÔ„zèF= @¨‡nÔ„zèF= @¨‡nÔ„z~/m- @¨‡à‡|VÄ-0Љš@€Pc!¨ õ0Љš@€Pc!¨ õ0Љš@€Pc!¨ õ0Љš@€Pc!¨ õ0Љš@€Pc!¨ õ0Љš@€Pc!¨ õ0Љš@€Pc!¨ õ0Љš@€Pc!¨ õ¼zðHhM @¨ @Bk"àûÑÃQ&ѨÈ= @HhMø‚ûõÝ¿ÿþÃa&ѨÈ%¼>ôcxHhM @¨û @BkདྷXóù·=fjÎù|Ñ€„ÖDè·÷gÚçJð0“hTä‹^ŸPZч ëOÁ²±€NÔD|Ð @A€rЉšø^¹ ^½cy$´&¸*`(¨‰.\Ï4f/ºF€Ê@€rЉšè!ÀÕxùk 2 t¢&:p¹¶Žc!¨‰~‡ÀþÕÖþE×îeÚä‹ èDMô`h?f€Úa, 5ÑuÈ!ð`0Љš@€Pc!¨‰‚$¯¶æ2˜`, 5Á…ÐPc!¨ õ0Љš@€Pc!¨ õ0Љš@€Pc!¨ õ0Љš@€Pc!¨ ¨]· ýNÔÔ |t¢& j”Ý„þ«ÇB :QP1êþÇ…t¢& j4ÙÏ|ùXHA'jF¨Q޶ùû®ÏîDMéZŒÐ4„ºü÷ð}÷&žÝ‰ªòµ¡i5Åbž¾ïÞij;QYÆî‚}”vª äó÷Ý›P݉m©¯lï©FŒ5€—ãö†ê}wTwbsò¶ó ÀˆQxS˜P˜æN¼2AÿÕÝVû ;Ï Å_™;u_ñ z(qÝ)\€Ft G`°G @ô ÐÌ›¸¹½g ð\oŽ Àý÷jf€JiëÄk¿ÔZ{{Xkhnp@xÍ}(’ªùíã¯m¡à^‚…iìÄK?f}5Îà/Ss 7 ðÚ)·@B¤«x•(Ò´­t­  ëÄÊ»B€‡Þ6/<ì8þ¾óœNÑìºN€©W†G ݉•ûýNRŸtãË­û´[;¶‰çÞ™í—÷¤ý8g4{Ígf€åmvkôc¹®4UI¼ð”>ü:^‰gŸ#"(I‹÷Ò¿I€•Û—g€‡¦oîÛõ îßg4šlª¼G…»ofK>½Üå-vj G¨Q€é”ÌíÉãâLÕ{‹üIÁÒ Ù‰õoìåO¾Nä›ÛtrûýI—ÝX¬!œ_ @oéQ.uÙ Kyø)ºW³ì 0—’Ù<¬Õ73Àn$:±òàs)›^|¬–L•¹SË;4 Ð}“-Õ¾Ào<ξêX€•‡&`¡¬m:yä²îPéø;¬,Š%Y]•5'_"@I²3ÀºÍ3Å 3¸ÝJüLˆ JûÛ1’—„u4áìç g€¹¹»»®Ë*úìÞKNé²Îà§hÎÑw˜ :#ÀLf€ùH­ù˜Š“Vl›ÏÏ«˜z¯,•Ø}¶Ü6óöÀŠ-„®ˆM€fë…{¯uŸë¨â”Пæl‹’yE=¿»ç5²¹SÔ¨»ubÛå÷ãô_hP Œu™ç­ @âN<²+O‰Ô‹4Ú6ñ$Ùdº„÷ëyš½`Ðv³þFà+!@㯻n,©¨×ºŸû•;냆·:÷Ðdþ¥4…ÕµÇâ´‰^Næå¦2={ìòéMx™`åÖ¹‚N^&K¤Þ˜Ã÷ãø‰I¤F"„ð½¹v¿åzLžèr7ò2¶®Í§ ЗÈÞIÁŒÃ¶‡/7Ñ–u¶ŠÜs«l¹­ Ó4¨,õ{”ÖÑI•ÄëuOºUÈœÔNeg¼$]ÒÔ0ΟH€É­k˜°ë>î ·RN0ý¦í¶{dÞé3 ÷¦wÁ¬¦<¹OLçü¶ç/ë׬/Ǻ)ß$ µutŸàË}-¯à•¸ñ‡É±çc+Ü ˜øU. @ªg€q‚»¾=V еN°AZ€ÁL-5 u6|Ey˜ '±2ÿàÍO^îK]¾F€B|^KŽØ²þSuÝà¬Ù-¶uÎx;m'BMÇžx%n•ûcï{ʯÑ\\§ß¾_Òñ.P€¤S“ïð¯àùRÒæjjÜüÁ^’&Q2§N·dºã§SÀ¥_b>ætJ{LUÅ`4¹]󳯨}<1¯`'/x—u%)@ÛHê]y{‡5^f8Õ'^VüÊò4Ë[ŸŸz¥nr²g[• _• P'ÀxT¼‡HA¦ªsóR)0îâeƒðÔ’_&z#ö^@ø.oWef€až¿¾ ½ÃN€CüUÆýÐ(nï¹èd[ílîû®¯Nÿo[^ æw.Þj·µ '¼lµ¹àDì”°¯ÌF»uËVq_Ï–[n›æå¼&(@¹½”Ù–ùƒÊ*X§ÑzXä`”s¹IZ¸O…ÇßþtÍÉQ/Ý×êñ¥ç3Á1±¹z%ÙWPd@¦º&ÛµŸâóÆIO€qZxvˆófïh{'V/€°ÆUZÛúÔÆ f€iã»Övw¦E€~nú{ÏëåGž 8ƒN'žÊÅ¿Fïõ¯p3gȼ$XWn‰çM¢„ Þ¶œß£©¢ß¢'ÀõU¸ûT°~0¶ὧ»;¤·2WO™Q¸>seã ³ÞÑW<ã ~³céÆÝÌzÎÏ6w`¢Ú×< ÒåˆeÛö>pºÆËz¿ÿü0|Iúéí‚p;Ñ3™Ÿ¿n^„—–D’{­©ê¬K»{Á¶2ˆÆ>1¯0<+±pŠ{Ý´LÏLœÚâöÂñuV}„±è¾È`6N%{$¯Ê¥ÀÖŽ±Brl¶°~Åñ·.7«m㽟æ.  ègÓf Ú‰×Åé¾É¶×ËËA§´·ñË$ÒoM›üÄËU¨Ù._që16Em¶ûñ¹\ ¦¸c@Ûiñ´`a÷û 0öÍ1úm†ƒn¦çQFÍ&žÚw¹è- ØÂÏ‚5“÷_¬l(@0ôsSg¬ðy0KŽY´êõ²‡‰«SÄÏ|ÝNÚ Ò[ØêœÂ»/ùU<Ûl Á§Àa¦~–»o¼^a“Ú:=fA"†;ƺUN€ÞD"< 2ÎçÁ‰„çˆ~¡äDïeçØnMÊP±AÐQƒ•Œ"Àô ‹’ÄDÞNœ&æf€~œQ~„Û:íd.o°•ù ÝK¿BÌɸC ®oÞŸ_컩¿6ÜíMA€&NóTÑuÔ“ûHQ€®ßr3@ï-Ø{-ÆKKß] zí§òù³àýÌHŒ/·o‹ p[—Z–O¼hã’ƒL w[¦A&ºèÅš0¿üvóq‡ @rt“ š¿/Ï’ú'|“LѰšÈ`îÁÃNþ$÷¦P’‘ý _¯õÜ‘³Éö$NÖdüÏ`â­Ë߷ʼnçÁ†ù… “mûuïPòÀ Ðxù·–ˆêóëÊ4™êÁmq²S ÑßyMþ^K¨¦P™û3ÀO¹bÂfR£F€‰ o2Øô»²Ÿå©×ðP¦ûÿ安KEÇÍͿг •½‚7<·êp˜¨ù¤ƒ¥Ìï Ð‰'hJ3@“~»L5¼óî÷·*)ÀR¥Éˆâ#· oÓ¿_·#ô`Â’oøCÐ$v_Û‡I½E£ 0«OSѤ­¢æ¸‰Ä Ðk-sô<ð*ìx 0á±²£Ü†÷Yö£âÕÙÝ/¹ß¸ñ¬¿f(Ä Lvö6#ŠÆîŒ )ëzR†^¼õc— q^ïNe§ãàˆwbqXqL¸;ý ŽZk«.T¹'Àô&ÞÓªöD€ås€;µÕuqyø3‹¼h›zad?£yÕ$ëVÔæ‚¸¶OЬy°·¾ ÀÔ{g©ÊƒŒÓþÛ˜Ú­e§ÄѼüa…-äMòÂé_n:x:Â+f€‡- Î…­Ô¾ñÖå^M‘b[±«š®ÏDiE‰†áåŽhq*Ÿ,t~¸€Jƒêà\+ÀˆŠá­sU¹ŠAß/”šQü2ޝ&74•,.G€°¢O€U¥öž#8ˆ†¦ö8Ædê@/¦Þôbê@/¦Þôbj¯BûgŸèôF¹D¦7À"\/ŠÐàúEÝí^Ð…Ss 2—ã\Ç:°Z£\"ÓàÚ¯( p Ko„#Œñ%NÍ5hï3ƒPá[½ßkt:#Toè_®è©¹™ï$_È*@ÅQ~ö^µn{¯Ö×þÓ îßêÇØ8½¨L€ßI¾õ܆Ú(×Sj4[ÞéŒÐÙ1tø‡êGèÂKv䩹ݳfcg€Z£\?¤Qà/ª0—óãzüCu„#œˆ¹dGžškPÝg¿( þ³/#ìÊTß…ê¼j¢0µW¡÷“ó_Ô_€ >À.‘0Ú/ƒÑß…ê´3Ñ'Áº†bê@/¦Þôbê@/¦Þôbê@/¦Þôbê@/¦Þôbê@/¦ÞÀã)~uÉ]©ö[XðX¦ÞÀcY}Vòš¿ÂÍL½€ÇR£3]™zOåmo0b¶{-7óïðá^¦ÞÀcñÓ7- ïñ†á^¦ÞÀcI Л†?÷2õK @{œ+ƒÿàn¦ÞÀc±§ýLöžëþß+@€p3Sïà¹l·úwÌÞÑÜýdÿÁÝL½èÅÔ;€^L½èÅÔ;€^L½èÅÿ%O„6˧IEND®B`‚libtorrent-rasterbar-2.0.5/docs/img/utp_stack.png0000664000175000017500000000374114152763504021106 0ustar arvidarvid‰PNG  IHDR`–¤€Ü¨IDATxœíÝ[H“oðß³fm³ƒÒ;5L]nË©4b^DÁR; ]˜¸NBѺ*ºð¦ˆî „¤IÝ4Ê +œ¬¬L!DÒjóÝZN-‡èþÈþÛ|`Œ1Æ”Jå•+W¦ÛOœ81ÓOY­VÄjµ.x«Ã¡C‡cç΋÷BÖ¼@›³s8‹%¸\.FÓÓÓ±›(ŠV«5¤±®®®®®nþs-XÄÙ—ÛÈ/^¼¨®®ŽÉP,ªçs ÎŽ&&&’““‰(??Ÿ16½'üùó'==½¡¡1vðàÁ™F¸~ýºR©áêÕ«¼¥¸¸øéÓ§jµZ.—‹¢±¥®®N„m۶ݹs‡ˆ\.—Ùl¶X, …‚/`>³»\®‚‚‚ýû÷oܸñôéÓ3Ͳˆ#‡?Š[·n¥¦¦&&&–””ŒŒŒDìËÅ‚3äp8¦¹xñâää$oûömEEÅt·×¯_WUU…ülðžðùógNçt:EQÔét@ ¦¦fß¾}===ããã|ä–îîî¼¼<Çãõz úûûEQ”Édmmm¿ÿNKKóx<3ÍLE¹\ÞÙÙéõzFã§OŸÂ犸‘Ãûttt †_¿~ÍÒ‡·cOX"Q=Ÿµ'𳣡¡¡±±±Û·o/lÞÞÞÂÂÂíÛ·§¥¥™Íæ¾¾>"JHH¨®®ÎÎÎÞ°aƒD" oéííýøñcjjªR©t8D´k×.“ɤT*333ÿþý;ÏhµÚÜÜ\AöîÝët:#ξÂ9oQ©T³?RX&bpv” •J½^oÄ{cn·Ûï÷Fì••ÕÚÚêñxDQ|÷î]NNoß¼ysHÏà–ììl“Éäõzy KJJˆhݺuÑÎND½½½ß¾}óù|íííjµ:|®ˆ+ 9¼ÏÎ;[[[æ|¤°,* ÍÍÍü½£žžž .4551Æ ?~Ì»ví †?~lÚ´i¦3õÝ»w?~\¯×ÆÊÊJ½^?Ÿ©u:Ý‘#Gôz}bbbyy¹ßïØmÎÙ‰H­VŸ:uJ­VÆy®0däð>F£±¢¢"//O¡P …÷illdŒß»w1vóæÍùl·Û㽈½¨žÏød €{¬bØ¢†$! ’@^½‰RfX›PÇ «ê˜¢†$! ’0‡©©©šššääääääË—/Gl!¢œœ·Ûו¢„¾b†ííí]]]}}}~¿¿¬¬ìëׯ£££!-¹¹¹ñ^&,ö„9‚000ÐÙÙ¹uëV»ÝÎkzBZâ½Fˆ$aÙÙÙ õõõƒ¡¶¶Öï÷‡·Ä{HÂÜÌf󃺻»ÝnwCCCÄXé„9ܽ{÷Ì™3###ÿþý“H$“““á-ñ^#Ä’0‡ÊÊʱ±±ŒŒŒŒŒ ":yòdx žÎ¿Î »ÄJ„JXµP©5$€Ià"$€CˆP½ À¡z3þð1ÎAõ&@Ô"$€Cˆ“„ˆ×“}ôèQfffRRÒ¥K—(èJµIII(jY á¿ö…XðÚ¸àkº\.A‡×ë---mkk›¾Ríàà`iiéýû÷£-XÀaü‹Àaç¢:°±<;zóæMQQQ~~¾ 6›Íd2Mß555å÷ûe2Y §[›Ün÷ô5›Íýýý³tÆaŸ¿X&app0%%%¤‘_‹M«ÕîØ±£¼¼<†ÓÁ,pØ£ËoyIIIikk i´X,/_¾Œá,0m–ÂQöhÅrO8pà@KK‹Ýn9{öì³gÏb88pr¹Üétùò¥««+ÞËY=b™Aêë뫪ªT*•D"9zôh nË–-f³9--íüùó{öì àÏ4buÌñ‡Ã¾DPÇ 5$€Ià"$€Ãõ–ÍÆ’°,à]Ô¥€êM€¨! DH‡$! +ÎóçÏy¡,Y­Ö¦¦&^«©P(òóó[ZZE³ ‚$¬‹Åçóݸq£²²REÞ¾ÿ>::úäÉ“x/p@V ™LV\\|ìØ1›Í6݈êÍùCV•J5<Y[a¤RéÄÄÿ÷øøøúõëƒïíïï/,,$ToF{ £Ñhìv»Çãùùóçû÷ï³²²xûÄÄÄ«W¯l6›Åb‰ï W(ì +Œ^¯/++ÓjµR©´¶¶V£Ñø|¾ææf¹\n0>|(Âì_ý¡z3þpØ—ª7¢†$! ’@„$p¸öæ²€Ãwxÿ€gG’@„$pH’À! DH‡$! ’@„$pH’Àý4AW?Ý^ˆIEND®B`‚libtorrent-rasterbar-2.0.5/docs/python_binding.html0000664000175000017500000005311314152763504021526 0ustar arvidarvid libtorrent libtorrent-rasterbar-2.0.5/docs/upgrade_to_1.2-ref.html0000664000175000017500000003710614152763504022002 0ustar arvidarvid libtorrent
libtorrent logo

Upgrading to libtorrent 1.2

Author: Arvid Norberg, arvid@libtorrent.org

libtorrent version 1.2 comes with some significant updates in the API. This document summarizes the changes affecting library users.

C++98 no longer supported

With libtorrent 1.2, C++98 is no longer supported, you need a compiler capable of at least C++11 to build libtorrent.

This also means libtorrent types now support move.

listen interfaces

There's a subtle change in how the listen_interfaces setting is interpreted in 1.2 compared to 1.1.

In libtorrent-1.1, if you listen to 0.0.0.0:6881 (which was the default), not only would an IPv4 listen socket be opened (bound to INADDR_ANY) but also an IPv6 socket would be opened.

In libtorrent-1.2, if you listen to 0.0.0.0:6881 only the IPv4 INADDR_ANY is opened as a listen socket. If you want to listen to both IPv4 and IPv6, you need to listen to 0.0.0.0:6881,[::]:6881.

forward declaring libtorrent types deprecated

Clients are discouraged from forward declaring types from libtorrent. Instead, include the <libtorrent/fwd.hpp> header.

A future release will introduce ABI versioning using an inline namespace, which will break any forward declarations by clients.

There is a new namespace alias, lt which is shorthand for libtorrent. In the future, libtorrent will be the alias and lt the namespace name. With no forward declarations inside libtorrent's namespace though, there should not be any reason for clients to re-open the namespace.

resume data handling

To significantly simplify handling of resume data, the previous way of handling it is deprecated. resume data is no longer passed in as a flat buffer in the add_torrent_params. The add_torrent_params structure itself is the resume data now.

In order to parse the bencoded fast resume file (which is still the same format, and backwards compatible) use the read_resume_data() function.

Similarly, when saving resume data, the save_resume_data_alert now has a params field of type add_torrent_params which contains the resume data. This object can be serialized into the bencoded form using write_resume_data().

This give the client full control over which properties should be loaded from the resume data and which should be controlled by the client directly. The flags flag_override_resume_data, flag_merge_resume_trackers, flag_use_resume_save_path and flag_merge_resume_http_seeds have all been deprecated, since they are no longer needed.

The old API is still supported as long as libtorrent is built with deprecated functions enabled (which is the default). It will be performing slightly better without deprecated functions present.

rate_limit_utp changed defaults

The setting rate_limit_utp was deprecated in libtorrent 1.1. When building without deprecated features (deprecated-functions=off) the default behavior also changed to have rate limits apply to utp sockets too. In order to be more consistent between the two build configurations, the default value has changed to true. The new mechanism provided to apply special rate limiting rules is peer classes. In order to implement the old behavior of not rate limiting uTP peers, one can set up a peer class for all uTP peers, to make the normal peer classes not apply to them (which is where the rate limits are set).

announce entry multi-home support

The announce_entry type now captures status on individual endpoints, as opposed to treating every tracker behind the same name as a single tracker. This means some properties has moved into the announce_endpoint structure, and an announce entry has 0 or more endpoints.

alerts no longer cloneable

As part of the transition to a more efficient handling of alerts, 1.1 allocated them in a contiguous, heterogeneous, vector. This means they are no longer heap allocated nor held by a smart pointer. The clone() member on alerts was deprecated in 1.1 and removed in 1.2. To pass alerts across threads, instead pull out the relevant information from the alerts and pass that across.

progress alert category

The alert::progress_notification category has been deprecated. Alerts posted in this category are now also posted in one of these new categories:

  • alert::block_progress_notification
  • alert::piece_progress_notification
  • alert::file_progress_notification
  • alert::upload_notification

boost replaced by std

boost::shared_ptr has been replaced by std::shared_ptr in the libtorrent API. The same goes for <cstdint> types, instead of boost::int64_t, libtorrent now uses std::int64_t. Instead of boost::array, std::array is used, and boost::function has been replaced by std::function.

strong typedefs

In order to strengthen type-safety, libtorrent now uses special types to represent certain indexes and ID types. Any integer referring to a piece index, now has the type piece_index_t, and indices to files in a torrent, use file_index_t. Similarly, time points and duration now use time_point and duration from the <chrono> standard library.

The specific types have typedefs at lt::time_point and lt::duration, and the clock used by libtorrent is lt::clock_type.`

strongly typed flags

Enum flags have been replaced by strongly typed flags. This means their implicit conversion to and from int is deprecated. For example, the following expressions are deprecated:

if ((atp.flags & add_torrent_params::flag_paused) == 0)

atp.flags = 0;

Insted say:

if (!(atp.flags & torrent_flags::paused))

atp.flags = {};

(Also note that in this specific example, the flags moved out of the add_torrent_params structure, but this is unrelated to them also having stronger types).

span<> and string_view

The interface has adopted string_view (from boost for now) and span<> (custom implementation for now). This means some function calls that previously took char const* or std::string may now take an lt::string_view. Similarly, functions that previously would take a pointer and length pair will now take a span<>.

periphery utility functions no longer exported

Historically, libtorrent has exported functions not essential to its core bittorrent functionality. Such as filesystem functions like directory, file classes and remove, create_directory functions. Path manipulation functions like combine_path, extension, split_path etc. String manipulation functions like from_hex and to_hex. Time functions like time_now. These functions are no longer available to clients, and some have been removed from the library. Instead, it is recommended to use boost.filesystem or the experimental filesystem TS.

plugins

libtorrent session plugins no longer have all callbacks called unconditionally. The plugin has to register which callbacks it's interested in receiving by returning a bitmask from feature_flags_t implemented_features(). The return value is documented in the plugin class.

RSS functions removed

The deprecated RSS functions have been removed from the library interface.

libtorrent-rasterbar-2.0.5/docs/reference-PeerClass.html0000664000175000017500000003072514152763504022334 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

peer_class_info

Declared in "libtorrent/peer_class.hpp"

holds settings for a peer class. Used in set_peer_class() and get_peer_class() calls.

struct peer_class_info
{
   bool ignore_unchoke_slots;
   int connection_limit_factor;
   std::string label;
   int upload_limit;
   int download_limit;
   int upload_priority;
   int download_priority;
};
[report issue]
ignore_unchoke_slots
ignore_unchoke_slots determines whether peers should always unchoke a peer, regardless of the choking algorithm, or if it should honor the unchoke slot limits. It's used for local peers by default. If any of the peer classes a peer belongs to has this set to true, that peer will be unchoked at all times.
[report issue]
connection_limit_factor
adjusts the connection limit (global and per torrent) that applies to this peer class. By default, local peers are allowed to exceed the normal connection limit for instance. This is specified as a percent factor. 100 makes the peer class apply normally to the limit. 200 means as long as there are fewer connections than twice the limit, we accept this peer. This factor applies both to the global connection limit and the per-torrent limit. Note that if not used carefully one peer class can potentially completely starve out all other over time.
[report issue]
label
not used by libtorrent. It's intended as a potentially user-facing identifier of this peer class.
[report issue]
upload_limit download_limit
transfer rates limits for the whole peer class. They are specified in bytes per second and apply to the sum of all peers that are members of this class.
[report issue]
upload_priority download_priority
relative priorities used by the bandwidth allocator in the rate limiter. If no rate limits are in use, the priority is not used either. Priorities start at 1 (0 is not a valid priority) and may not exceed 255.
[report issue]

peer_class_type_filter

Declared in "libtorrent/peer_class_type_filter.hpp"

peer_class_type_filter is a simple container for rules for adding and subtracting peer-classes from peers. It is applied after the peer class filter is applied (which is based on the peer's IP address).

struct peer_class_type_filter
{
   void remove (socket_type_t const st, peer_class_t const peer_class);
   void add (socket_type_t const st, peer_class_t const peer_class);
   void disallow (socket_type_t const st, peer_class_t const peer_class);
   void allow (socket_type_t const st, peer_class_t const peer_class);
   std::uint32_t apply (socket_type_t const st, std::uint32_t peer_class_mask);
   friend bool operator== (peer_class_type_filter const& lhs
      , peer_class_type_filter const& rhs);

   enum socket_type_t
   {
      tcp_socket,
      utp_socket,
      ssl_tcp_socket,
      ssl_utp_socket,
      i2p_socket,
      num_socket_types,
   };
};
[report issue]

add() remove()

void remove (socket_type_t const st, peer_class_t const peer_class);
void add (socket_type_t const st, peer_class_t const peer_class);

add() and remove() adds and removes a peer class to be added to new peers based on socket type.

[report issue]

allow() disallow()

void disallow (socket_type_t const st, peer_class_t const peer_class);
void allow (socket_type_t const st, peer_class_t const peer_class);

disallow() and allow() adds and removes a peer class to be removed from new peers based on socket type.

The peer_class argument cannot be greater than 31. The bitmasks representing peer classes in the peer_class_type_filter are 32 bits.

[report issue]

apply()

std::uint32_t apply (socket_type_t const st, std::uint32_t peer_class_mask);

takes a bitmask of peer classes and returns a new bitmask of peer classes after the rules have been applied, based on the socket type argument (st).

[report issue]

enum socket_type_t

Declared in "libtorrent/peer_class_type_filter.hpp"

name value description
tcp_socket 0 these match the socket types from socket_type.hpp shifted one down
utp_socket 1  
ssl_tcp_socket 2  
ssl_utp_socket 3  
i2p_socket 4  
num_socket_types 5  
libtorrent-rasterbar-2.0.5/docs/reference-ed25519.html0000664000175000017500000002157314152763504021452 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

ed25519_create_seed()

Declared in "libtorrent/kademlia/ed25519.hpp"

std::array<char, 32> ed25519_create_seed ();

See documentation of internal random_bytes

[report issue]

ed25519_create_keypair()

Declared in "libtorrent/kademlia/ed25519.hpp"

std::tuple<public_key, secret_key> ed25519_create_keypair (
   std::array<char, 32> const& seed);

Creates a new key pair from the given seed.

It's important to clarify that the seed completely determines the key pair. Then it's enough to save the seed and the public key as the key-pair in a buffer of 64 bytes. The standard is (32 bytes seed, 32 bytes public key).

This function does work with a given seed, giving you a pair of (64 bytes private key, 32 bytes public key). It's a trade-off between space and CPU, saving in one format or another.

The smaller format is not weaker by any means, in fact, it is only the seed (32 bytes) that determines the point in the curve.

[report issue]

ed25519_sign()

Declared in "libtorrent/kademlia/ed25519.hpp"

signature ed25519_sign (span<char const> msg
   , public_key const& pk, secret_key const& sk);

Creates a signature of the given message with the given key pair.

[report issue]

ed25519_verify()

Declared in "libtorrent/kademlia/ed25519.hpp"

bool ed25519_verify (signature const& sig
   , span<char const> msg, public_key const& pk);

Verifies the signature on the given message using pk

[report issue]

ed25519_add_scalar()

Declared in "libtorrent/kademlia/ed25519.hpp"

secret_key ed25519_add_scalar (secret_key const& sk
   , std::array<char, 32> const& scalar);
public_key ed25519_add_scalar (public_key const& pk
   , std::array<char, 32> const& scalar);

Adds a scalar to the given key pair where scalar is a 32 byte buffer (possibly generated with ed25519_create_seed), generating a new key pair.

You can calculate the public key sum without knowing the private key and vice versa by passing in null for the key you don't know. This is useful when a third party (an authoritative server for example) needs to enforce randomness on a key pair while only knowing the public key of the other side.

Warning: the last bit of the scalar is ignored - if comparing scalars make sure to clear it with scalar[31] &= 127.

see http://crypto.stackexchange.com/a/6215/4697 see test_ed25519 for a practical example

[report issue]

ed25519_key_exchange()

Declared in "libtorrent/kademlia/ed25519.hpp"

std::array<char, 32> ed25519_key_exchange (
   public_key const& pk, secret_key const& sk);

Performs a key exchange on the given public key and private key, producing a shared secret. It is recommended to hash the shared secret before using it.

This is useful when two parties want to share a secret but both only knows their respective public keys. see test_ed25519 for a practical example

libtorrent-rasterbar-2.0.5/docs/examples.rst0000664000175000017500000000165714152763504020203 0ustar arvidarvid.. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none 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. __ client_test.html simple client ------------- This is a simple client. It doesn't have much output to keep it simple: .. include:: ../examples/simple_client.cpp :code: c++ :tab-width: 2 :start-after: */ make_torrent ------------ Shows how to create a torrent from a directory tree: .. include:: ../examples/make_torrent.cpp :code: c++ :tab-width: 2 :start-after: */ 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:: ../examples/dump_torrent.cpp :code: c++ :tab-width: 2 :start-after: */ libtorrent-rasterbar-2.0.5/docs/reference-Storage.html0000664000175000017500000015345114152763504022061 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

storage_params

Declared in "libtorrent/storage_defs.hpp"

a parameter pack used to construct the storage for a torrent, used in disk_interface

struct storage_params
{
   storage_params (file_storage const& f, file_storage const* mf
      , std::string const& sp, storage_mode_t const sm
      , aux::vector<download_priority_t, file_index_t> const& prio
      , sha1_hash const& ih);

   file_storage const& files;
   file_storage const* mapped_files  = nullptr;
   std::string const& path;
   storage_mode_t mode {storage_mode_sparse};
   aux::vector<download_priority_t, file_index_t> const& priorities;
   sha1_hash info_hash;
};
[report issue]

file_slice

Declared in "libtorrent/file_storage.hpp"

represents a window of a file in a torrent.

The file_index refers to the index of the file (in the torrent_info). To get the path and filename, use file_path() and give the file_index as argument. The offset is the byte offset in the file where the range starts, and size is the number of bytes this range is. The size + offset will never be greater than the file size.

struct file_slice
{
   file_index_t file_index;
   std::int64_t offset;
   std::int64_t size;
};
[report issue]
file_index
the index of the file
[report issue]
offset
the offset from the start of the file, in bytes
[report issue]
size
the size of the window, in bytes
[report issue]

file_storage

Declared in "libtorrent/file_storage.hpp"

The file_storage class represents a file list and the piece size. Everything necessary to interpret a regular bittorrent storage file structure.

class file_storage
{
   bool is_valid () const;
   void reserve (int num_files);
   void add_file (std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}
      , std::time_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
   void add_file (error_code& ec, std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}
      , std::time_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
   void add_file_borrow (error_code& ec, string_view filename
      , std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}, char const* filehash = nullptr
      , std::int64_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
   void add_file_borrow (string_view filename
      , std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}, char const* filehash = nullptr
      , std::int64_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
   void rename_file (file_index_t index, std::string const& new_filename);
   std::vector<file_slice> map_block (piece_index_t piece, std::int64_t offset
      , std::int64_t size) const;
   peer_request map_file (file_index_t file, std::int64_t offset, int size) const;
   int num_files () const noexcept;
   file_index_t end_file () const noexcept;
   index_range<file_index_t> file_range () const noexcept;
   std::int64_t total_size () const;
   int num_pieces () const;
   void set_num_pieces (int n);
   piece_index_t end_piece () const;
   piece_index_t last_piece () const;
   index_range<piece_index_t> piece_range () const noexcept;
   void set_piece_length (int l);
   int piece_length () const;
   int piece_size (piece_index_t index) const;
   int piece_size2 (piece_index_t index) const;
   int blocks_in_piece2 (piece_index_t index) const;
   void set_name (std::string const& n);
   std::string const& name () const;
   void swap (file_storage& ti) noexcept;
   void canonicalize ();
   bool pad_file_at (file_index_t index) const;
   std::string file_path (file_index_t index, std::string const& save_path = "") const;
   std::string symlink (file_index_t index) const;
   sha256_hash root (file_index_t index) const;
   char const* root_ptr (file_index_t const index) const;
   std::time_t mtime (file_index_t index) const;
   string_view file_name (file_index_t index) const;
   std::int64_t file_size (file_index_t index) const;
   std::int64_t file_offset (file_index_t index) const;
   sha1_hash hash (file_index_t index) const;
   int file_num_blocks (file_index_t index) const;
   index_range<piece_index_t::diff_type> file_piece_range (file_index_t) const;
   int file_num_pieces (file_index_t index) const;
   int file_first_block_node (file_index_t index) const;
   int file_first_piece_node (file_index_t index) const;
   std::uint32_t file_path_hash (file_index_t index, std::string const& save_path) const;
   void all_path_hashes (std::unordered_set<std::uint32_t>& table) const;
   file_flags_t file_flags (file_index_t index) const;
   bool file_absolute_path (file_index_t index) const;
   file_index_t file_index_at_piece (piece_index_t piece) const;
   file_index_t file_index_at_offset (std::int64_t offset) const;
   file_index_t file_index_for_root (sha256_hash const& root_hash) const;
   piece_index_t piece_index_at_file (file_index_t f) const;
   void sanitize_symlinks ();
   bool v2 () const;

   static constexpr file_flags_t flag_pad_file  = 0_bit;
   static constexpr file_flags_t flag_hidden  = 1_bit;
   static constexpr file_flags_t flag_executable  = 2_bit;
   static constexpr file_flags_t flag_symlink  = 3_bit;
};
[report issue]

is_valid()

bool is_valid () const;

returns true if the piece length has been initialized on the file_storage. This is typically taken as a proxy of whether the file_storage as a whole is initialized or not.

[report issue]

reserve()

void reserve (int num_files);

allocates space for num_files in the internal file list. This can be used to avoid reallocating the internal file list when the number of files to be added is known up-front.

[report issue]

add_file() add_file_borrow()

void add_file (std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}
      , std::time_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
void add_file (error_code& ec, std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}
      , std::time_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
void add_file_borrow (error_code& ec, string_view filename
      , std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}, char const* filehash = nullptr
      , std::int64_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
void add_file_borrow (string_view filename
      , std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}, char const* filehash = nullptr
      , std::int64_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);

Adds a file to the file storage. The add_file_borrow version expects that filename is the file name (without a path) of the file that's being added. This memory is borrowed, i.e. it is the caller's responsibility to make sure it stays valid throughout the lifetime of this file_storage object or any copy of it. The same thing applies to filehash, which is an optional pointer to a 20 byte binary SHA-1 hash of the file.

if filename is empty, the filename from path is used and not borrowed.

The path argument is the full path (in the torrent file) to the file to add. Note that this is not supposed to be an absolute path, but it is expected to include the name of the torrent as the first path element.

file_size is the size of the file in bytes.

The file_flags argument sets attributes on the file. The file attributes is an extension and may not work in all bittorrent clients.

For possible file attributes, see file_storage::flags_t.

The mtime argument is optional and can be set to 0. If non-zero, it is the posix time of the last modification time of this file.

symlink_path is the path the file is a symlink to. To make this a symlink you also need to set the file_storage::flag_symlink file flag.

root_hash is an optional pointer to a 32 byte SHA-256 hash, being the merkle tree root hash for this file. This is only used for v2 torrents. If the root hash is specified for one file, it has to be specified for all, otherwise this function will fail. Note that the buffer root_hash points to must out-live the file_storage object, it will not be copied. This parameter is only used when loading torrents, that already have their file hashes computed. When creating torrents, the file hashes will be computed by the piece hashes.

If more files than one are added, certain restrictions to their paths apply. In a multi-file file storage (torrent), all files must share the same root directory.

That is, the first path element of all files must be the same. This shared path element is also set to the name of the torrent. It can be changed by calling set_name.

The overloads that take an error_code reference will report failures via that variable, otherwise system_error is thrown.

[report issue]

rename_file()

void rename_file (file_index_t index, std::string const& new_filename);

renames the file at index to new_filename. Keep in mind that filenames are expected to be UTF-8 encoded.

[report issue]

map_block()

std::vector<file_slice> map_block (piece_index_t piece, std::int64_t offset
      , std::int64_t size) const;

returns a list of file_slice objects representing the portions of files the specified piece index, byte offset and size range overlaps. this is the inverse mapping of map_file().

Preconditions of this function is that the input range is within the torrents address space. piece may not be negative and

piece * piece_size + offset + size

may not exceed the total size of the torrent.

[report issue]

map_file()

peer_request map_file (file_index_t file, std::int64_t offset, int size) const;

returns a peer_request representing the piece index, byte offset and size the specified file range overlaps. This is the inverse mapping over map_block(). Note that the peer_request return type is meant to hold bittorrent block requests, which may not be larger than 16 kiB. Mapping a range larger than that may return an overflown integer.

[report issue]

num_files()

int num_files () const noexcept;

returns the number of files in the file_storage

[report issue]

end_file()

file_index_t end_file () const noexcept;

returns the index of the one-past-end file in the file storage

[report issue]

file_range()

index_range<file_index_t> file_range () const noexcept;

returns an implementation-defined type that can be used as the container in a range-for loop. Where the values are the indices of all files in the file_storage.

[report issue]

total_size()

std::int64_t total_size () const;

returns the total number of bytes all the files in this torrent spans

[report issue]

num_pieces() set_num_pieces()

int num_pieces () const;
void set_num_pieces (int n);

set and get the number of pieces in the torrent

[report issue]

end_piece()

piece_index_t end_piece () const;

returns the index of the one-past-end piece in the file storage

[report issue]

last_piece()

piece_index_t last_piece () const;

returns the index of the last piece in the torrent. The last piece is special in that it may be smaller than the other pieces (and the other pieces are all the same size).

[report issue]

piece_range()

index_range<piece_index_t> piece_range () const noexcept;

returns an implementation-defined type that can be used as the container in a range-for loop. Where the values are the indices of all pieces in the file_storage.

[report issue]

piece_length() set_piece_length()

void set_piece_length (int l);
int piece_length () const;

set and get the size of each piece in this torrent. It must be a power of two and at least 16 kiB.

[report issue]

piece_size()

int piece_size (piece_index_t index) const;

returns the piece size of index. This will be the same as piece_length(), except for the last piece, which may be shorter.

[report issue]

piece_size2()

int piece_size2 (piece_index_t index) const;

Returns the size of the given piece. If the piece spans multiple files, only the first file is considered part of the piece. This is used for v2 torrents, where all files are piece aligned and padded. i.e. The pad files are not considered part of the piece for this purpose.

[report issue]

blocks_in_piece2()

int blocks_in_piece2 (piece_index_t index) const;

returns the number of blocks in the specified piece, for v2 torrents.

[report issue]

set_name() name()

void set_name (std::string const& n);
std::string const& name () const;

set and get the name of this torrent. For multi-file torrents, this is also the name of the root directory all the files are stored in.

[report issue]

swap()

void swap (file_storage& ti) noexcept;

swap all content of this with ti.

[report issue]

canonicalize()

void canonicalize ();

arrange files and padding to match the canonical form required by BEP 52

[report issue]

file_num_blocks() file_piece_range() file_num_pieces()

int file_num_blocks (file_index_t index) const;
index_range<piece_index_t::diff_type> file_piece_range (file_index_t) const;
int file_num_pieces (file_index_t index) const;

Returns the number of pieces or blocks the file at index spans, under the assumption that the file is aligned to the start of a piece. This is only meaningful for v2 torrents, where files are guaranteed such alignment. These numbers are used to size and navigate the merkle hash tree for each file.

[report issue]

file_first_piece_node() file_first_block_node()

int file_first_block_node (file_index_t index) const;
int file_first_piece_node (file_index_t index) const;

index of first piece node in the merkle tree

[report issue]

file_path_hash()

std::uint32_t file_path_hash (file_index_t index, std::string const& save_path) const;

returns the crc32 hash of file_path(index)

[report issue]

all_path_hashes()

void all_path_hashes (std::unordered_set<std::uint32_t>& table) const;

this will add the CRC32 hash of all directory entries to the table. No filename will be included, just directories. Every depth of directories are added separately to allow test for collisions with files at all levels. i.e. if one path in the torrent is foo/bar/baz, the CRC32 hashes for foo, foo/bar and foo/bar/baz will be added to the set.

[report issue]

file_flags()

file_flags_t file_flags (file_index_t index) const;

returns a bitmask of flags from file_flags_t that apply to file at index.

[report issue]

file_absolute_path()

bool file_absolute_path (file_index_t index) const;

returns true if the file at the specified index has been renamed to have an absolute path, i.e. is not anchored in the save path of the torrent.

[report issue]

file_index_at_offset() file_index_at_piece()

file_index_t file_index_at_piece (piece_index_t piece) const;
file_index_t file_index_at_offset (std::int64_t offset) const;

returns the index of the file at the given offset in the torrent

[report issue]

file_index_for_root()

file_index_t file_index_for_root (sha256_hash const& root_hash) const;

finds the file with the given root hash and returns its index if there is no file with the root hash, file_index_t{-1} is returned

[report issue]

piece_index_at_file()

piece_index_t piece_index_at_file (file_index_t f) const;

returns the piece index the given file starts at

[report issue]

v2()

bool v2 () const;

returns true if this torrent contains v2 metadata.

[report issue]
flag_pad_file
the file is a pad file. It's required to contain zeros at it will not be saved to disk. Its purpose is to make the following file start on a piece boundary.
[report issue]
flag_hidden
this file has the hidden attribute set. This is primarily a windows attribute
[report issue]
flag_executable
this file has the executable attribute set.
[report issue]
flag_symlink
this file is a symbolic link. It should have a link target string associated with it.
[report issue]

default_disk_io_constructor()

Declared in "libtorrent/session.hpp"

std::unique_ptr<disk_interface> default_disk_io_constructor (
   io_context& ios, settings_interface const&, counters& cnt);

the constructor function for the default storage. On systems that support memory mapped files (and a 64 bit address space) the memory mapped storage will be constructed, otherwise the portable posix storage.

[report issue]

posix_disk_io_constructor()

Declared in "libtorrent/posix_disk_io.hpp"

std::unique_ptr<disk_interface> posix_disk_io_constructor (
   io_context& ios, settings_interface const&, counters& cnt);

this is a simple posix disk I/O back-end, used for systems that don't have a 64 bit virtual address space or don't support memory mapped files. It's implemented using portable C file functions and is single-threaded.

[report issue]

disabled_disk_io_constructor()

Declared in "libtorrent/disabled_disk_io.hpp"

std::unique_ptr<disk_interface> disabled_disk_io_constructor (
   io_context& ios, settings_interface const&, counters& cnt);

creates a disk io object that discards all data written to it, and only returns zero-buffers when read from. May be useful for testing and benchmarking.

[report issue]

mmap_disk_io_constructor()

Declared in "libtorrent/mmap_disk_io.hpp"

std::unique_ptr<disk_interface> mmap_disk_io_constructor (
   io_context& ios, settings_interface const&, counters& cnt);

constructs a memory mapped file disk I/O object.

[report issue]

enum storage_mode_t

Declared in "libtorrent/storage_defs.hpp"

name value description
storage_mode_allocate 0 All pieces will be written to their final position, all files will be allocated in full when the torrent is first started. This mode minimizes fragmentation but could be a costly operation.
storage_mode_sparse 1 All pieces will be written to the place where they belong and sparse files will be used. This is the recommended, and default mode.
[report issue]

enum status_t

Declared in "libtorrent/storage_defs.hpp"

name value description
no_error 0  
fatal_disk_error 1  
need_full_check 2  
file_exist 3  
[report issue]

enum move_flags_t

Declared in "libtorrent/storage_defs.hpp"

name value description
always_replace_files 0 replace any files in the destination when copying or moving the storage
fail_if_exist 1 if any files that we want to copy exist in the destination exist, fail the whole operation and don't perform any copy or move. There is an inherent race condition in this mode. The files are checked for existence before the operation starts. In between the check and performing the copy, the destination files may be created, in which case they are replaced.
dont_replace 2 if any file exist in the target, take those files instead of the ones we may have in the source.
libtorrent-rasterbar-2.0.5/docs/manual-ref.html0000664000175000017500000041537714152763504020560 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

overview

The interface of libtorrent consists of a few classes. The main class is the session, it contains the main loop that serves all torrents.

The basic usage is as follows:

Each class and function is described in this manual, you may want to have a look at the tutorial as well.

For a description on how to create torrent files, see create_torrent.

forward declarations

Forward declaring types from the libtorrent namespace is discouraged as it may break in future releases. Instead include libtorrent/fwd.hpp for forward declarations of all public types in libtorrent.

trouble shooting

A common problem developers are facing is torrents stopping without explanation. Here is a description on which conditions libtorrent will stop your torrents, how to find out about it and what to do about it.

Make sure to keep track of the paused state, the error state and the upload mode of your torrents. By default, torrents are auto-managed, which means libtorrent will pause, resume, scrape them and take them out of upload-mode automatically.

Whenever a torrent encounters a fatal error, it will be stopped, and the torrent_status::error will describe the error that caused it. If a torrent is auto managed, it is scraped periodically and paused or resumed based on the number of downloaders per seed. This will effectively seed torrents that are in the greatest need of seeds.

If a torrent hits a disk write error, it will be put into upload mode. This means it will not download anything, but only upload. The assumption is that the write error is caused by a full disk or write permission errors. If the torrent is auto-managed, it will periodically be taken out of the upload mode, trying to write things to the disk again. This means torrent will recover from certain disk errors if the problem is resolved. If the torrent is not auto managed, you have to call set_upload_mode() to turn downloading back on again.

For a more detailed guide on how to trouble shoot performance issues, see troubleshooting

ABI considerations

libtorrent maintains a stable ABI for versions with the same major and minor versions.

e.g. libtorrent-1.2.0 is ABI compatible with libtorrent-1.2.1 but not with libtorrent-1.1

network primitives

There are a few typedefs in the libtorrent namespace which pulls in network types from the boost::asio namespace. These are:

using address = boost::asio::ip::address;
using address_v4 = boost::asio::ip::address_v4;
using address_v6 = boost::asio::ip::address_v6;
using boost::asio::ip::tcp;
using boost::asio::ip::udp;

These are declared in the <libtorrent/socket.hpp> header.

The using statements will give easy access to:

tcp::endpoint
udp::endpoint

Which are the endpoint types used in libtorrent. An endpoint is an address with an associated port.

For documentation on these types, please refer to the asio documentation.

exceptions

Many functions in libtorrent have two versions, one that throws exceptions on errors and one that takes an error_code reference which is filled with the error code on errors.

On exceptions, libtorrent will throw boost::system::system_error exceptions carrying an error_code describing the underlying error.

translating error codes

The error_code::message() function will typically return a localized error string, for system errors. That is, errors that belong to the generic or system category.

Errors that belong to the libtorrent error category are not localized however, they are only available in English. In order to translate libtorrent errors, compare the error category of the error_code object against lt::libtorrent_category(), and if matches, you know the error code refers to the list above. You can provide your own mapping from error code to string, which is localized. In this case, you cannot rely on error_code::message() to generate your strings.

The numeric values of the errors are part of the API and will stay the same, although new error codes may be appended at the end.

Here's a simple example of how to translate error codes:

std::string error_code_to_string(boost::system::error_code const& ec)
{
        if (ec.category() != lt::libtorrent_category())
        {
                return ec.message();
        }
        // the error is a libtorrent error

        int code = ec.value();
        static const char const* swedish[] =
        {
                "inget fel",
                "en fil i torrenten kolliderar med en fil fran en annan torrent",
                "hash check misslyckades",
                "torrentfilen ar inte en dictionary",
                "'info'-nyckeln saknas eller ar korrupt i torrentfilen",
                "'info'-faltet ar inte en dictionary",
                "'piece length' faltet saknas eller ar korrupt i torrentfilen",
                "torrentfilen saknar namnfaltet",
                "ogiltigt namn i torrentfilen (kan vara en attack)",
                // ... more strings here
        };

        // use the default error string in case we don't have it
        // in our translated list
        if (code < 0 || code >= sizeof(swedish)/sizeof(swedish[0]))
                return ec.message();

        return swedish[code];
}

queuing

libtorrent supports queuing. Queuing is a mechanism to automatically pause and resume torrents based on certain criteria. The criteria depends on the overall state the torrent is in (checking, downloading or seeding).

To opt-out of the queuing logic, make sure your torrents are added with the torrent_flags::auto_managed bit cleared from add_torrent_params::flags. Or call torrent_handle::unset_flags() and pass in torrent_flags::auto_managed on the torrent handle.

The overall purpose of the queuing logic is to improve performance under arbitrary torrent downloading and seeding load. For example, if you want to download 100 torrents on a limited home connection, you improve performance by downloading them one at a time (or maybe two at a time), over downloading them all in parallel. The benefits are:

  • the average completion time of a torrent is half of what it would be if all downloaded in parallel.
  • The amount of upload capacity is more likely to reach the reciprocation rate of your peers, and is likely to improve your return on investment (download to upload ratio)
  • your disk I/O load is likely to be more local which may improve I/O performance and decrease fragmentation.

There are fundamentally 3 separate queues:

  • checking torrents
  • downloading torrents
  • seeding torrents

Every torrent that is not seeding has a queue number associated with it, this is its place in line to be started. See torrent_status::queue_position.

On top of the limits of each queue, there is an over arching limit, set in settings_pack::active_limit. The auto manager will never start more than this number of torrents (with one exception described below). Non-auto-managed torrents are exempt from this logic, and not counted.

At a regular interval, torrents are checked if there needs to be any re-ordering of which torrents are active and which are queued. This interval can be controlled via settings_pack::auto_manage_interval.

For queuing to work, resume data needs to be saved and restored for all torrents. See torrent_handle::save_resume_data().

queue position

The torrents in the front of the queue are started and the rest are ordered by their queue position. Any newly added torrent is placed at the end of the queue. Once a torrent is removed or turns into a seed, its queue position is -1 and all torrents that used to be after it in the queue, decreases their position in order to fill the gap.

The queue positions are always contiguous, in a sequence without any gaps.

Lower queue position means closer to the front of the queue, and will be started sooner than torrents with higher queue positions.

To query a torrent for its position in the queue, or change its position, see: torrent_handle::queue_position(), torrent_handle::queue_position_up(), torrent_handle::queue_position_down(), torrent_handle::queue_position_top() and torrent_handle::queue_position_bottom().

checking queue

The checking queue affects torrents in the torrent_status::checking or torrent_status::allocating state that are auto-managed.

The checking queue will make sure that (of the torrents in its queue) no more than settings_pack::active_checking_limit torrents are started at any given time. Once a torrent completes checking and moves into a different state, the next in line will be started for checking.

Any torrent added force-started or force-stopped (i.e. the auto managed flag is not set), will not be subject to this limit and they will all check independently and in parallel.

Once a torrent completes the checking of its files, or resume data, it will be put in the queue for downloading and potentially start downloading immediately. In order to add a torrent and check its files without starting the download, it can be added in stop_when_ready mode. See add_torrent_params::flag_stop_when_ready. This flag will stop the torrent once it is ready to start downloading.

This is conceptually the same as waiting for the torrent_checked_alert and then call:

h.set_flags(torrent_flags::paused, torrent_flags::paused | torrent_flags::auto_managed);

With the important distinction that it entirely avoids the brief window where the torrent is in downloading state.

downloading queue

Similarly to the checking queue, the downloading queue will make sure that no more than settings_pack::active_downloads torrents are in the downloading state at any given time.

The torrent_status::queue_position is used again here to determine who is next in line to be started once a downloading torrent completes or is stopped/removed.

seeding queue

The seeding queue does not use torrent_status::queue_position to determine which torrent to seed. Instead, it estimates the demand for the torrent to be seeded. A torrent with few other seeds and many downloaders is assumed to have a higher demand of more seeds than one with many seeds and few downloaders.

It limits the number of started seeds to settings_pack::active_seeds.

On top of this basic bias, seed priority can be controller by specifying a seed ratio (the upload to download ratio), a seed-time ratio (the download time to seeding time ratio) and a seed-time (the absolute time to be seeding a torrent). Until all those targets are hit, the torrent will be prioritized for seeding.

Among torrents that have met their seed target, torrents where we don't know of any other seed take strict priority.

In order to avoid flapping, torrents that were started less than 30 minutes ago also have priority to keep seeding.

Finally, for torrents where none of the above apply, they are prioritized based on the download to seed ratio.

The relevant settings to control these limits are settings_pack::share_ratio_limit, settings_pack::seed_time_ratio_limit and settings_pack::seed_time_limit.

queuing options

In addition to simply starting and stopping torrents, the queuing mechanism can have more fine grained control of the resources used by torrents.

half-started torrents

In addition to the downloading and seeding limits, there are limits on actions torrents perform. The downloading and seeding limits control whether peers are allowed at all, and if peers are not allowed, torrents are stopped and don't do anything. If peers are allowed, torrents may:

  1. announce to trackers
  2. announce to the DHT
  3. announce to local peer discovery (local service discovery)

Each of those actions are associated with a cost and hence may need a separate limit. These limits are controlled by settings_pack::active_tracker_limit, settings_pack::active_dht_limit and settings_pack::active_lsd_limit respectively.

Specifically, announcing to a tracker is typically cheaper than announcing to the DHT. settings_pack::active_dht_limit will limit the number of torrents that are allowed to announce to the DHT. The highest priority ones will, and the lower priority ones won't. The will still be considered started though, and any incoming peers will still be accepted.

If you do not wish to impose such limits (basically, if you do not wish to have half-started torrents) make sure to set these limits to -1 (infinite).

prefer seeds

In the case where active_downloads + active_seeds > active_limit, there's an ambiguity whether the downloads should be satisfied first or the seeds. To disambiguate this case, the settings_pack::auto_manage_prefer_seeds determines whether seeds are preferred or not.

inactive torrents

Torrents that are not transferring any bytes (downloading or uploading) have a relatively low cost to be started. It's possible to exempt such torrents from the download and seed queues by setting settings_pack::dont_count_slow_torrents to true.

Since it sometimes may take a few minutes for a newly started torrent to find peers and be unchoked, or find peers that are interested in requesting data, torrents are not considered inactive immediately. There must be an extended period of no transfers before it is considered inactive and exempt from the queuing limits.

fast resume

The fast resume mechanism is a way to remember which pieces are downloaded and where they are put between sessions. You can generate fast resume data by:

When adding a torrent using resume data, load it using read_resume_data(). This populates an add_torrent_params object, which can be passed directly to add_torrent() or async_add_torrent() on the session object. libtorrent will not check the piece hashes then, and rely on the information given in the fast-resume data. The fast-resume data also contains information about which blocks, in the unfinished pieces, were downloaded, so it will not have to start from scratch on the partially downloaded pieces.

To use the fast-resume data you pass it to read_resume_data(), which will return an add_torrent_params object. Fields of this object can then be altered before passing it to async_add_torrent() or add_torrent(). The session will then skip the time consuming checks. It may have to do the checking anyway, if the fast-resume data is corrupt or doesn't fit the storage for that torrent.

file format

The file format is a bencoded dictionary containing the following fields:

file-format string: "libtorrent resume file"
info-hash string, the info hash of the torrent this data is saved for. This is a 20 byte SHA-1 hash of the info section of the torrent if this is a v1 or v1+v2-hybrid torrent.
info-hash2 string, the v2 info hash of the torrent this data is saved. for, in case it is a v2 or v1+v2-hybrid torrent. This is a 32 byte SHA-256 hash of the info section of the torrent.
pieces A string with piece flags, one character per piece. Bit 1 means we have that piece. Bit 2 means we have verified that this piece is correct. This only applies when the torrent is in seed_mode.
total_uploaded integer. The number of bytes that have been uploaded in total for this torrent.
total_downloaded integer. The number of bytes that have been downloaded in total for this torrent.
active_time integer. The number of seconds this torrent has been active. i.e. not paused.
seeding_time integer. The number of seconds this torrent has been active and seeding.
last_upload integer. The number of seconds since epoch when we last uploaded payload to a peer on this torrent.
last_download integer. The number of seconds since epoch when we last downloaded payload from a peer on this torrent.
upload_rate_limit integer. In case this torrent has a per-torrent upload rate limit, this is that limit. In bytes per second.
download_rate_limit integer. The download rate limit for this torrent in case one is set, in bytes per second.
max_connections integer. The max number of peer connections this torrent may have, if a limit is set.
max_uploads integer. The max number of unchoked peers this torrent may have, if a limit is set.
file_priority list of integers. One entry per file in the torrent. Each entry is the priority of the file with the same index.
piece_priority string of bytes. Each byte is interpreted as an integer and is the priority of that piece.
seed_mode integer. 1 if the torrent is in seed mode, 0 otherwise.
upload_mode integer. 1 if the torrent_flags::upload_mode is set.
share_mode integer. 1 if the torrent_flags::share_mode is set.
apply_ip_filter integer. 1 if the torrent_flags::apply_ip_filter is set.
paused integer. 1 if the torrent is paused, 0 otherwise.
auto_managed integer. 1 if the torrent is auto managed, otherwise 0.
super_seeding integer. 1 if the torrent_flags::super_seeding is set.
sequential_download integer. 1 if the torrent is in sequential download mode, 0 otherwise.
stop_when_ready integer. 1 if the torrent_flags::stop_when_ready is set.
disable_dht integer. 1 if the torrent_flags::disable_dht is set.
disable_lsd integer. 1 if the torrent_flags::disable_lsd is set.
disable_pex integer. 1 if the torrent_flags::disable_pex is set.
trackers list of lists of strings. The top level list lists all tracker tiers. Each second level list is one tier of trackers.
mapped_files list of strings. If any file in the torrent has been renamed, this entry contains a list of all the filenames. In the same order as in the torrent file.
url-list list of strings. List of url-seed URLs used by this torrent. The URLs are expected to be properly encoded and not contain any illegal url characters.
httpseeds list of strings. List of HTTP seed URLs used by this torrent. The URLs are expected to be properly encoded and not contain any illegal url characters.
trees

list. In case this is a v2 (or v1+v2-hybrid) torrent, this is an optional list containing the merkle tree nodes we know of so far, for all files. It's a list of dictionaries, one entry for each file in the torrent. The entries have the following structure:

hashes string. Sequence of 32 byte (SHA-256) hashes, representing the nodes in the merkle hash tree for this file. Some hashes may be all zeros, if we haven't downloaded them yet.
mask string. When present, a bitmask (of 0 and 1 characters, indicating which hashes of the full tree are included in the hashes key. This is used to avoid storing large numbers of zeros.
verified string. This indicates which leaf nodes in the tree have been verified correct. There is one character per leaf, 0 means not verified, 1 means verified.
save_path string. The save path where this torrent was saved. This is especially useful when moving torrents with move_storage() since this will be updated.
peers string. This string contains IPv4 and port pairs of peers we were connected to last session. The endpoints are in compact representation. 4 bytes IPv4 address followed by 2 bytes port. Hence, the length of this string should be divisible by 6.
banned_peers string. This string has the same format as peers but instead represent IPv4 peers that we have banned.
peers6 string. This string contains IPv6 and port pairs of peers we were connected to last session. The endpoints are in compact representation. 16 bytes IPv6 address followed by 2 bytes port. The length of this string should be divisible by 18.
banned_peers6 string. This string has the same format as peers6 but instead represent IPv6 peers that we have banned.
info If this field is present, it should be the info-dictionary of the torrent this resume data is for. Its SHA-1 hash must match the one in the info-hash field. When present, the torrent is loaded from here, meaning the torrent can be added purely from resume data (no need to load the .torrent file separately). This may have performance advantages.
unfinished

list of dictionaries. Each dictionary represents an piece, and has the following layout:

piece integer, the index of the piece this entry refers to.
bitmask string, a binary bitmask representing the blocks that have been downloaded in this piece.
adler32 The adler32 checksum of the data in the blocks specified by bitmask.
allocation The allocation mode for the storage. Can be either allocate or sparse.

storage allocation

There are two modes in which storage (files on disk) are allocated in libtorrent.

  1. The traditional full allocation mode, where the entire files are filled up with zeros before anything is downloaded. Files are allocated on demand, the first time anything is written to them. The main benefit of this mode is that it avoids creating heavily fragmented files.
  2. The sparse allocation, sparse files are used, and pieces are downloaded directly to where they belong. This is the recommended (and default) mode.

sparse allocation

On filesystems that supports sparse files, this allocation mode will only use as much space as has been downloaded.

The main drawback of this mode is that it may create heavily fragmented files.

  • It does not require an allocation pass on startup.

full allocation

When a torrent is started in full allocation mode, the disk-io thread will make sure that the entire storage is allocated, and fill any gaps with zeros. It will of course still check for existing pieces and fast resume data. The main drawbacks of this mode are:

  • It may take longer to start the torrent, since it will need to fill the files with zeros. This delay is linear to the size of the download.
  • The download may occupy unnecessary disk space between download sessions.
  • Disk caches usually perform poorly with random access to large files and may slow down the download some.

The benefits of this mode are:

  • Downloaded pieces are written directly to their final place in the files and the total number of disk operations will be fewer and may also play nicer to the filesystem file allocation, and reduce fragmentation.
  • No risk of a download failing because of a full disk during download, once all files have been created.

HTTP seeding

There are two kinds of HTTP seeding. One with that assumes a smart (and polite) client and one that assumes a smart server. These are specified in BEP 19 and BEP 17 respectively.

libtorrent supports both. In the libtorrent source code and API, BEP 19 URLs are typically referred to as url seeds and BEP 17 URLs are typically referred to as HTTP seeds.

The libtorrent implementation of BEP 19 assumes that, if the URL ends with a slash ('/'), the filename should be appended to it in order to request pieces from that file. The way this works is that if the torrent is a single-file torrent, only that filename is appended. If the torrent is a multi-file torrent, the torrent's name '/' the file name is appended. This is the same directory structure that libtorrent will download torrents into.

There is limited support for HTTP redirects. In case some files are redirected to different hosts, the files must be piece aligned or padded to be piece aligned.

piece picker

The piece picker in libtorrent has the following features:

  • rarest first
  • sequential download
  • random pick
  • reverse order picking
  • parole mode
  • prioritize partial pieces
  • prefer whole pieces
  • piece affinity by speed category
  • piece priorities

internal representation

It is optimized by, at all times, keeping a list of pieces ordered by rarity, randomly shuffled within each rarity class. This list is organized as a single vector of contiguous memory in RAM, for optimal memory locality and to eliminate heap allocations and frees when updating rarity of pieces.

Expensive events, like a peer joining or leaving, are evaluated lazily, since it's cheaper to rebuild the whole list rather than updating every single piece in it. This means as long as no blocks are picked, peers joining and leaving is no more costly than a single peer joining or leaving. Of course the special cases of peers that have all or no pieces are optimized to not require rebuilding the list.

picker strategy

The normal mode of the picker is of course rarest first, meaning pieces that few peers have are preferred to be downloaded over pieces that more peers have. This is a fundamental algorithm that is the basis of the performance of bittorrent. However, the user may set the piece picker into sequential download mode. This mode simply picks pieces sequentially, always preferring lower piece indices.

When a torrent starts out, picking the rarest pieces means increased risk that pieces won't be completed early (since there are only a few peers they can be downloaded from), leading to a delay of having any piece to offer to other peers. This lack of pieces to trade, delays the client from getting started into the normal tit-for-tat mode of bittorrent, and will result in a long ramp-up time. The heuristic to mitigate this problem is to, for the first few pieces, pick random pieces rather than rare pieces. The threshold for when to leave this initial picker mode is determined by settings_pack::initial_picker_threshold.

reverse order

An orthogonal setting is reverse order, which is used for snubbed peers. Snubbed peers are peers that appear very slow, and might have timed out a piece request. The idea behind this is to make all snubbed peers more likely to be able to do download blocks from the same piece, concentrating slow peers on as few pieces as possible. The reverse order means that the most common pieces are picked, instead of the rarest pieces (or in the case of sequential download, the last pieces, instead of the first).

parole mode

Peers that have participated in a piece that failed the hash check, may be put in parole mode. This means we prefer downloading a full piece from this peer, in order to distinguish which peer is sending corrupt data. Whether to do this is or not is controlled by settings_pack::use_parole_mode.

In parole mode, the piece picker prefers picking one whole piece at a time for a given peer, avoiding picking any blocks from a piece any other peer has contributed to (since that would defeat the purpose of parole mode).

prioritize partial pieces

This setting determines if partially downloaded or requested pieces should always be preferred over other pieces. The benefit of doing this is that the number of partial pieces is minimized (and hence the turn-around time for downloading a block until it can be uploaded to others is minimized). It also puts less stress on the disk cache, since fewer partial pieces need to be kept in the cache. Whether or not to enable this is controlled by setting_pack::prioritize_partial_pieces.

The main benefit of not prioritizing partial pieces is that the rarest first algorithm gets to have more influence on which pieces are picked. The picker is more likely to truly pick the rarest piece, and hence improving the performance of the swarm.

This setting is turned on automatically whenever the number of partial pieces in the piece picker exceeds the number of peers we're connected to times 1.5. This is in order to keep the waste of partial pieces to a minimum, but still prefer rarest pieces.

prefer whole pieces

The prefer whole pieces setting makes the piece picker prefer picking entire pieces at a time. This is used by web connections (both http seeding standards), in order to be able to coalesce the small bittorrent requests to larger HTTP requests. This significantly improves performance when downloading over HTTP.

It is also used by peers that are downloading faster than a certain threshold. The main advantage is that these peers will better utilize the other peer's disk cache, by requesting all blocks in a single piece, from the same peer.

This threshold is controlled by the settings_pack::whole_pieces_threshold setting.

TODO: piece priorities

Multi-homed hosts

The settings_pack::listen_interfaces setting is used to specify which interfaces/IP addresses to listen on, and accept incoming connections via.

Each item in listen_interfaces is an IP address or a device name, followed by a listen port number. Each item (called listen_socket_t) will have the following objects associated with it:

  • a listen socket accepting incoming TCP connections
  • a UDP socket: 1. to accept incoming uTP connections 2. to run a DHT instance on 3. to announce to UDP trackers from 4. a SOCKS5 UDP tunnel (if applicable)
  • a listen address and netmask, describing the network the sockets are bound to
  • a Local service discovery object, broadcasting to the specified subnet
  • a NAT-PMP/PCP port mapper (if applicable), to map ports on the gateway for the specified subnet.
  • a UPnP port mapper (if applicable), to map ports on any
  • InternetGatewayDevice found on the specified local subnet.

A listen_socket_t item may be specified to only be a local network (with the l suffix). Such listen socket will only be used to talk to peers and trackers within the same local network. The netmask defining the network is queried from the operating system by enumerating network interfaces.

An item that's considered to be "local network" will not be used to announce to trackers outside of that network. For example, 10.0.0.2:6881l is marked as "local network" and it will only be used as the source address announcing to a tracker if the tracker is also within the same local network (e.g. 10.0.0.0/8).

The NAT-PMP/PCP and UPnP port mapper objects are only created for networks that are expected to be externally available (i.e. not "local network"). If there are multiple subnets connected to the internet, they will have separate port mappings.

expanding device names

If a device name is specified, libtorrent will expand it to the IP addresses associated with that device, but also retain the device name in order to attempt to bind the listen sockets to that specific device.

expanding unspecified addresses

If an IP address is the unspecified address (i.e. 0.0.0.0 or ::), libtorrent will expand it to specific IP addresses. This expansion will enumerate all addresses it can find for the corresponding address family. The expanded IP addresses are considered "local network" if any of the following conditions are met:

  • the IP address is in a known link-local range
  • the IP address is in a known loopback range
  • the item the IP address was expanded from was marked local (l)
  • the network interface has the loopback flag set
  • NONE of the following conditions are met: 1. the IP address is in a globally reachable IP address range 2. the network interface has the point-to-point flag set 3. the routing table contains a route for at least one global internet address (e.g. a default route) for the address family of the expanded IP that points to the network interface of the expanded IP.

routing

A listen_socket_t item is considered able to route to a destination address if any of these hold:

  • the destination address falls inside its subnet (i.e. interface address masked by netmask is the same as the destination address masked by the netmask).
  • the listen_socket_t does not have the "local network" flag set, and the address family matches the destination address.

The ability to route to an address is used when determining whether to announce to a tracker from a listen_socket_t and whether to open a SOCKS5 UDP tunnel for a listen_socket_t.

Note that the actual IP stack routing table is not considered for this purpose. This mechanism is to determine which IP addresses should be announced to trackers.

tracker announces

Trackers are announced to from all network interfaces listening for incoming connections. However, interfaces that cannot be used to reach the tracker, such as loopback, are not used as the source address for announces. A listen_socket_t item that can route to at least one of the tracker IP addresses will be used as the source address for an announce. Each such item will also have an announce_endpoint item associated with it, in the tracker list.

If a tracker can be reached on a loopback address, then the loopback interface will be used to announce to that tracker. But under normal circumstances, loopback will not be used for announcing to trackers.

For more details, see BEP 7.

SOCKS5 UDP tunnels

When using a SOCKS5 proxy, each interface that can route to one of the SOCKS5 proxy's addresses will be used to open a UDP tunnel, via that proxy. For example, if a client has both IPv4 and IPv6 connectivity, but the socks5 proxy only resolves to IPv4, only the IPv4 address will have a UDP tunnel. In that case, the IPv6 connection will not be used, since it cannot use the proxy.

rate based choking

libtorrent supports a choking algorithm that automatically determines the number of upload slots (unchoke slots) based on the upload rate to peers. It is controlled by the settings_pack::choking_algorithm setting. The settings_pack::unchoke_slots_limit is ignored in this mode.

The algorithm is designed to stay stable, and not oscillate the number of upload slots.

The initial rate threshold is set to settings_pack::rate_choker_initial_threshold.

It sorts all peers by on the rate at which we are uploading to them.

  1. Compare the fastest peer against the initial threshold.
  2. Increment the threshold by 2 kiB/s.
  3. The next fastest peer is compared against the threshold. If the peer rate is higher than the threshold. goto 2
  4. Terminate. The number of peers visited is the number of unchoke slots, but never less than 2.

In other words, the more upload slots you have, the higher rate does the slowest unchoked peer upload at in order to open another slot.

predictive piece announce

In order to improve performance, libtorrent supports a feature called predictive piece announce. When enabled, it will make libtorrent announce that we have pieces to peers, before we truly have them. The most important case is to announce a piece as soon as it has been downloaded and passed the hash check, but not yet been written to disk. In this case, there is a risk the piece will fail to be written to disk, in which case we won't have the piece anymore, even though we announced it to peers.

The other case is when we're very close to completing the download of a piece and assume it will pass the hash check, we can announce it to peers to make it available one round-trip sooner than otherwise. This lets libtorrent start uploading the piece to interested peers immediately when the piece complete, instead of waiting one round-trip for the peers to request it.

This makes for the implementation slightly more complicated, since piece will have more states and more complicated transitions. For instance, a piece could be:

  1. hashed but not fully written to disk
  2. fully written to disk but not hashed
  3. not fully downloaded
  4. downloaded and hash checked

Once a piece is fully downloaded, the hash check could complete before any of the write operations or it could complete after all write operations are complete.

peer classes

The peer classes feature in libtorrent allows a client to define custom groups of peers and rate limit them individually. Each such group is called a peer class. There are a few default peer classes that are always created:

  • global - all peers belong to this class, except peers on the local network
  • local peers - all peers on the local network belongs to this class TCP peers
  • tcp class - all peers connected over TCP belong to this class

The TCP peers class is used by the uTP/TCP balancing logic, if it's enabled, to throttle TCP peers. The global and local classes are used to adjust the global rate limits.

When the rate limits are adjusted for a specific torrent, a class is created implicitly for that torrent.

The default peer class IDs are defined as enums in the session class:

enum {
        global_peer_class_id,
        tcp_peer_class_id,
        local_peer_class_id
};

The default peer classes are automatically created on session startup, and configured to apply to each respective type of connection. There's nothing preventing a client from reconfiguring the peer class ip- and type filters to disable or customize which peers they apply to. See set_peer_class_filter() and set_peer_class_type_filter().

A peer class can be considered a more general form of labels that some clients have. Peer classes however are not just applied to torrents, but ultimately the peers.

Peer classes can be created with the create_peer_class() call (on the session object), and deleted with the delete_peer_class() call.

Peer classes are configured with the set_peer_class() get_peer_class() calls.

Custom peer classes can be assigned based on the peer's IP address or the type of transport protocol used. See set_peer_class_filter() and set_peer_class_type_filter() for more information.

peer class examples

Here are a few examples of common peer class operations.

To make the global rate limit apply to local peers as well, update the IP-filter based peer class assignment:

std::uint32_t const mask = 1 << lt::session::global_peer_class_id;
ip_filter f;

// for every IPv4 address, assign the global peer class
f.add_rule(make_address("0.0.0.0"), make_address("255.255.255.255"), mask);

// for every IPv6 address, assign the global peer class
f.add_rule(make_address("::")
        , make_address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
        , mask);
ses.set_peer_class_filter(f);

To make uTP sockets exempt from rate limiting:

peer_class_type_filter flt = ses.get_peer_class_type_filter();
// filter out the global and local peer class for uTP sockets, if these
// classes are set by the IP filter
flt.disallow(peer_class_type_filter::utp_socket, session::global_peer_class_id);
flt.disallow(peer_class_type_filter::utp_socket, session::local_peer_class_id);

// this filter should not add the global or local peer class to utp sockets
flt.remove(peer_class_type_filter::utp_socket, session::global_peer_class_id);
flt.remove(peer_class_type_filter::utp_socket, session::local_peer_class_id);

ses.set_peer_class_type_filter(flt);

To make all peers on the internal network not subject to throttling:

std::uint32_t const mask = 1 << lt::session::global_peer_class_id;
ip_filter f;

// for every IPv4 address, assign the global peer class
f.add_rule(make_address("0.0.0.0"), make_address("255.255.255.255"), mask);

// for every address on the local metwork, set the mask to 0
f.add_rule(make_address("10.0.0.0"), make_address("10.255.255.255"), 0);
ses.set_peer_class_filter(f);

SSL torrents

Torrents may have an SSL root (CA) certificate embedded in them. Such torrents are called SSL torrents. An SSL torrent talks to all bittorrent peers over SSL. The protocols are layered like this:

img/utp_stack.png

During the SSL handshake, both peers need to authenticate by providing a certificate that is signed by the CA certificate found in the .torrent file. These peer certificates are expected to be provided to peers through some other means than bittorrent. Typically by a peer generating a certificate request which is sent to the publisher of the torrent, and the publisher returning a signed certificate.

In libtorrent, set_ssl_certificate() in torrent_handle is used to tell libtorrent where to find the peer certificate and the private key for it. When an SSL torrent is loaded, the torrent_need_cert_alert is posted to remind the user to provide a certificate.

A peer connecting to an SSL torrent MUST provide the SNI TLS extension (server name indication). The server name is the hex encoded info-hash of the torrent to connect to. This is required for the client accepting the connection to know which certificate to present.

SSL connections are accepted on a separate socket from normal bittorrent connections. To enable support for SSL torrents, add a listen interface to the settings_pack::listen_interfaces setting with the s suffix. For example:

0.0.0.0:6881,0.0.0.0:6882s

That will listen for normal bittorrent connections on port 6881 and for SSL torrent connections on port 6882.

This feature is only available if libtorrent is built with SSL torrent support (TORRENT_SSL_PEERS) and requires at least OpenSSL version 1.0, since it needs SNI support.

Peer certificates must have at least one SubjectAltName field of type DNSName. At least one of the fields must exactly match the name of the torrent. This is a byte-by-byte comparison, the UTF-8 encoding must be identical (i.e. there's no unicode normalization going on). This is the recommended way of verifying certificates for HTTPS servers according to RFC 2818. Note the difference that for torrents only DNSName fields are taken into account (not IP address fields). The most specific (i.e. last) Common Name field is also taken into account if no SubjectAltName did not match.

If any of these fields contain a single asterisk ("*"), the certificate is considered covering any torrent, allowing it to be reused for any torrent.

The purpose of matching the torrent name with the fields in the peer certificate is to allow a publisher to have a single root certificate for all torrents it distributes, and issue separate peer certificates for each torrent. A peer receiving a certificate will not necessarily be able to access all torrents published by this root certificate (only if it has a "star cert").

testing

To test incoming SSL connections to an SSL torrent, one can use the following openssl command:

openssl s_client -cert <peer-certificate>.pem -key <peer-private-key>.pem -CAfile \
   <torrent-cert>.pem -debug -connect 127.0.0.1:4433 -tls1 -servername <info-hash>

To create a root certificate, the Distinguished Name (DN) is not taken into account by bittorrent peers. You still need to specify something, but from libtorrent's point of view, it doesn't matter what it is. libtorrent only makes sure the peer certificates are signed by the correct root certificate.

One way to create the certificates is to use the CA.sh script that comes with openssl, like this (don't forget to enter a common Name for the certificate):

CA.sh -newca
CA.sh -newreq
CA.sh -sign

The torrent certificate is located in ./demoCA/private/demoCA/cacert.pem, this is the pem file to include in the .torrent file.

The peer's certificate is located in ./newcert.pem and the certificate's private key in ./newkey.pem.

session statistics

libtorrent provides a mechanism to query performance and statistics counters from its internals.

The statistics consists of two fundamental types. counters and gauges. A counter is a monotonically increasing value, incremented every time some event occurs. For example, every time the network thread wakes up because a socket became readable will increment a counter. Another example is every time a socket receives n bytes, a counter is incremented by n.

Counters are the most flexible of metrics. It allows the program to sample the counter at any interval, and calculate average rates of increments to the counter. Some events may be rare and need to be sampled over a longer period in order to get useful rates, where other events may be more frequent and evenly distributed that sampling it frequently yields useful values. Counters also provides accurate overall counts. For example, converting samples of a download rate into a total transfer count is not accurate and takes more samples. Converting an increasing counter into a rate is easy and flexible.

Gauges measure the instantaneous state of some kind. This is used for metrics that are not counting events or flows, but states that can fluctuate. For example, the number of torrents that are currently being downloaded.

It's important to know whether a value is a counter or a gauge in order to interpret it correctly. In order to query libtorrent for which counters and gauges are available, call session_stats_metrics(). This will return metadata about the values available for inspection in libtorrent. It will include whether a value is a counter or a gauge. The key information it includes is the index used to extract the actual measurements for a specific counter or gauge.

In order to take a sample, call post_session_stats() in the session object. This will result in a session_stats_alert being posted. In this alert object, there is an array of values, these values make up the sample. The value index in the stats metric indicates which index the metric's value is stored in.

The mapping between metric and value is not stable across versions of libtorrent. Always query the metrics first, to find out the index at which the value is stored, before interpreting the values array in the session_stats_alert. The mapping will not change during the runtime of your process though, it's tied to a specific libtorrent version. You only have to query the mapping once on startup (or every time libtorrent.so is loaded, if it's done dynamically).

The available stats metrics are:

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).

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)

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.

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.

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

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

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.boost_connection_attempts counter
peer.missed_connection_attempts counter
peer.no_peer_connection_attempts counter
peer.incoming_connections counter

these counters break down the reasons to disconnect peers.

name type
peer.num_tcp_peers gauge
peer.num_socks5_peers gauge
peer.num_http_proxy_peers gauge
peer.num_utp_peers gauge
peer.num_i2p_peers gauge
peer.num_ssl_peers gauge
peer.num_ssl_socks5_peers gauge
peer.num_ssl_http_proxy_peers gauge
peer.num_ssl_utp_peers gauge
peer.num_peers_half_open gauge
peer.num_peers_connected gauge
peer.num_peers_up_interested gauge
peer.num_peers_down_interested gauge
peer.num_peers_up_unchoked_all gauge
peer.num_peers_up_unchoked_optimistic gauge
peer.num_peers_up_unchoked gauge
peer.num_peers_down_unchoked gauge
peer.num_peers_up_requests gauge
peer.num_peers_down_requests gauge
peer.num_peers_end_game gauge
peer.num_peers_up_disk gauge
peer.num_peers_down_disk gauge

the number of peer connections for each kind of socket. num_peers_half_open counts half-open (connecting) peers, no other count includes those 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.

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.

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

name type
net.limiter_up_queue gauge
net.limiter_down_queue gauge

the number of sockets currently waiting for upload and download bandwidth from the rate limiter.

name type
net.limiter_up_bytes gauge
net.limiter_down_bytes gauge

the number of upload and download bytes waiting to be handed out from the rate limiter.

name type
net.recv_failed_bytes counter

the number of bytes downloaded that had to be discarded because they failed the hash check

name type
net.recv_redundant_bytes counter

the number of downloaded bytes that were discarded because they were downloaded multiple times (from different peers)

name type
net.has_incoming_connections gauge

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.

name type
ses.num_checking_torrents gauge
ses.num_stopped_torrents gauge
ses.num_upload_only_torrents gauge
ses.num_downloading_torrents gauge
ses.num_seeding_torrents gauge
ses.num_queued_seeding_torrents gauge
ses.num_queued_download_torrents gauge
ses.num_error_torrents gauge

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.

name type
ses.non_filter_torrents gauge

the number of torrents that don't have the IP filter applied to them.

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.

name type
ses.num_unchoke_slots gauge

the number of allowed unchoked peers

name type
ses.num_outstanding_accept gauge

the number of listen sockets that are currently accepting incoming connections

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
ses.num_outgoing_hash_request counter
ses.num_outgoing_hashes counter
ses.num_outgoing_hash_reject 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.

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.

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

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

This breaks down the piece picks into the event that triggered it

name type
disk.request_latency gauge
disk.disk_blocks_in_use gauge

the number of microseconds it takes from receiving a request from a peer until we're sending the response back on the socket.

name type
disk.queued_disk_jobs gauge
disk.num_running_disk_jobs gauge
disk.num_read_jobs gauge
disk.num_write_jobs gauge
disk.num_jobs gauge
disk.blocked_disk_jobs gauge
disk.num_writing_threads gauge
disk.num_running_threads gauge

queued_disk_jobs is the number of disk jobs currently queued, waiting to be executed by a disk thread.

name type
disk.queued_write_bytes gauge

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)

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. num_blocks_written and num_blocks_read

name type
disk.num_blocks_hashed counter

the total number of blocks run through SHA-1 hashing

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.

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)

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

name type
disk.num_fenced_read gauge
disk.num_fenced_write gauge
disk.num_fenced_hash gauge
disk.num_fenced_move_storage gauge
disk.num_fenced_release_files gauge
disk.num_fenced_delete_files gauge
disk.num_fenced_check_fastresume gauge
disk.num_fenced_save_resume_data gauge
disk.num_fenced_rename_file gauge
disk.num_fenced_stop_torrent gauge
disk.num_fenced_flush_piece gauge
disk.num_fenced_flush_hashed gauge
disk.num_fenced_flush_storage gauge
disk.num_fenced_file_priority gauge
disk.num_fenced_load_torrent gauge
disk.num_fenced_clear_piece gauge
disk.num_fenced_tick_storage gauge

for each kind of disk job, a counter of how many jobs of that kind are currently blocked by a disk fence

name type
dht.dht_nodes gauge

The number of nodes in the DHT routing table

name type
dht.dht_node_cache gauge

The number of replacement nodes in the DHT routing table

name type
dht.dht_torrents gauge

the number of torrents currently tracked by our DHT node

name type
dht.dht_peers gauge

the number of peers currently tracked by our DHT node

name type
dht.dht_immutable_data gauge

the number of immutable data items tracked by our DHT node

name type
dht.dht_mutable_data gauge

the number of mutable data items tracked by our DHT node

name type
dht.dht_allocated_observers gauge

the number of RPC observers currently allocated

name type
dht.dht_messages_in counter
dht.dht_messages_out counter

the total number of DHT messages sent and received

name type
dht.dht_messages_in_dropped counter

the number of incoming DHT requests that were dropped. There are a few different reasons why incoming DHT packets may be dropped:

  1. there wasn't enough send quota to respond to them.
  2. the Denial of service logic kicked in, blocking the peer
  3. ignore_dark_internet is enabled, and the packet came from a non-public IP address
  4. the bencoding of the message was invalid
name type
dht.dht_messages_out_dropped counter

the number of outgoing messages that failed to be sent

name type
dht.dht_bytes_in counter
dht.dht_bytes_out counter

the total number of bytes sent and received by the DHT

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
dht.dht_sample_infohashes_in counter
dht.dht_sample_infohashes_out counter

the number of DHT messages we've sent and received by kind.

name type
dht.dht_invalid_announce counter
dht.dht_invalid_get_peers counter
dht.dht_invalid_find_node counter
dht.dht_invalid_put counter
dht.dht_invalid_get counter
dht.dht_invalid_sample_infohashes counter

the number of failed incoming DHT requests by kind of request

name type
utp.utp_packet_loss counter

The number of times a lost packet has been interpreted as congestion, cutting the congestion window in half. Some lost packets are not interpreted as congestion, notably MTU-probes

name type
utp.utp_timeout counter

The number of timeouts experienced. This is when a connection doesn't hear back from the other end within a sliding average RTT + 2 average deviations from the mean (approximately). The actual time out is configurable and also depends on the state of the socket.

name type
utp.utp_packets_in counter
utp.utp_packets_out counter

The total number of packets sent and received

name type
utp.utp_fast_retransmit counter

The number of packets lost but re-sent by the fast-retransmit logic. This logic is triggered after 3 duplicate ACKs.

name type
utp.utp_packet_resend counter

The number of packets that were re-sent, for whatever reason

name type
utp.utp_samples_above_target counter
utp.utp_samples_below_target counter

The number of incoming packets where the delay samples were above and below the delay target, respectively. The delay target is configurable and is a parameter to the LEDBAT congestion control.

name type
utp.utp_payload_pkts_in counter
utp.utp_payload_pkts_out counter

The total number of packets carrying payload received and sent, respectively.

name type
utp.utp_invalid_pkts_in counter

The number of packets received that are not valid uTP packets (but were sufficiently similar to not be treated as DHT or UDP tracker packets).

name type
utp.utp_redundant_pkts_in counter

The number of duplicate payload packets received. This may happen if the outgoing ACK is lost.

name type
utp.num_utp_idle gauge
utp.num_utp_syn_sent gauge
utp.num_utp_connected gauge
utp.num_utp_fin_sent gauge
utp.num_utp_close_wait gauge
utp.num_utp_deleted gauge

the number of uTP sockets in each respective state

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

name type
tracker.num_queued_tracker_announces gauge

if the outstanding tracker announce limit is reached, tracker announces are queued, to be issued when an announce slot opens up. this measure the number of tracker announces currently in the queue

glossary

The libtorrent documentation use words that are bittorrent terms of art. This section defines some of these words. For an overview of what bittorrent is and how it works, see these slides. For an introduction to the bittorrent DHT, see this presentation.

announce
The act of telling a tracker or the DHT network about the existence of oneself and how other peers can connect, by specifying port one is listening on.
block
A subset of a piece. Almost always 16 kiB of payload, unless the piece size is smaller. This is the granularity file payload is requested from peers on the network.
DHT
The distributed hash table is a cross-swarm, world-wide network of bittorrent peers. It's loosely connected, implementing the Kademlia protocol. Its purpose is to act as a tracker. Peers can announce their presence to nodes on the DHT and other peers can discover them to join the swarm.
HTTP tracker
A tracker that uses the HTTP protocol for announces.
info dictionary
The subset of a torrent file that describes piece hashes and file names. This is the only mandatory part necessary to join the swarm (network of peers) for the torrent.
info hash
The hash of the info dictionary. This uniquely identifies a torrent and is used by the protocol to ensure peers talking to each other agree on which swarm they are participating in. Sometimes spelled info-hash.
leecher
A peer that is still interested in downloading more pieces for the torrent. It is not a seed.
magnet link
A URI containing the info hash for a torrent, allowing peers to join its swarm. May optionally contain a display name, trackers and web seeds. Typically magnet links rely on peers joining the swarm via the DHT.
metadata
Synonymous to a torrent file
peer
A computer running bittorrent client software that participates in the network for a particular torrent/set of files.
piece
The smallest number of bytes that can be validated when downloading (no longer the case in bittorrent V2). The smallest part of the files that can be advertised to other peers. The size of a piece is determined by the info dictionary inside the torrent file.
seed
A computer running bittorrent client software that has the complete files for a specific torrent, able to share any piece for that file with other peers in the network
swarm
The network of peers participating in sharing and downloading of a specific torrent.
torrent
May refer to a torrent file or the swarm (network of peers) created around the torrent file.
torrent file
A file ending in .torrent describing the content of a set of files (but not containing the content). Importantly, it contains hashes of all files, split up into pieces. It may optionally contain references to trackers and nodes on the DHT network to aid peers in joining the network of peers sharing these files.
tracker
A server peers can announce to and receive other peers back belonging to the same swarm. Trackers are used to introduce peers to each other, within a swarm. When announcing, the info hash of the torrent is included. Trackers can introduce peers to any info-hash that's specified, given other peers also use the same tracker. Some trackers restrict which info hashes they support based on a white list.
UDP tracker
A tracker that uses a UDP based protocol for announces.
web seed
A web server that is acting a seed, providing access to all pieces of all files over HTTP. This is an extension that client software may or may not support.
libtorrent-rasterbar-2.0.5/docs/reference-Plugins.html0000664000175000017500000020315414152763504022072 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

libtorrent has a plugin interface for implementing extensions to the protocol. These can be general extensions for transferring metadata or peer exchange extensions, or it could be used to provide a way to customize the protocol to fit a particular (closed) network.

In short, the plugin interface makes it possible to:

  • register extension messages (sent in the extension handshake), see extensions.
  • add data and parse data from the extension handshake.
  • send extension messages and standard bittorrent messages.
  • override or block the handling of standard bittorrent messages.
  • save and restore state via the session state
  • see all alerts that are posted

a word of caution

Writing your own plugin is a very easy way to introduce serious bugs such as dead locks and race conditions. Since a plugin has access to internal structures it is also quite easy to sabotage libtorrent's operation.

All the callbacks are always called from the libtorrent network thread. In case portions of your plugin are called from other threads, typically the main thread, you cannot use any of the member functions on the internal structures in libtorrent, since those require being called from the libtorrent network thread . Furthermore, you also need to synchronize your own shared data within the plugin, to make sure it is not accessed at the same time from the libtorrent thread (through a callback). If you need to send out a message from another thread, it is advised to use an internal queue, and do the actual sending in tick().

Since the plugin interface gives you easy access to internal structures, it is not supported as a stable API. Plugins should be considered specific to a specific version of libtorrent. Although, in practice the internals mostly don't change that dramatically.

plugin-interface

The plugin interface consists of three base classes that the plugin may implement. These are called plugin, torrent_plugin and peer_plugin. They are found in the <libtorrent/extensions.hpp> header.

These plugins are instantiated for each session, torrent and possibly each peer, respectively.

For plugins that only need per torrent state, it is enough to only implement torrent_plugin and pass a constructor function or function object to session::add_extension() or torrent_handle::add_extension() (if the torrent has already been started and you want to hook in the extension at run-time).

The signature of the function is:

std::shared_ptr<torrent_plugin> (*)(torrent_handle const&, client_data_t);

The second argument is the userdata passed to session::add_torrent() or torrent_handle::add_extension().

The function should return a std::shared_ptr<torrent_plugin> which may or may not be 0. If it is a nullptr, the extension is simply ignored for this torrent. If it is a valid pointer (to a class inheriting torrent_plugin), it will be associated with this torrent and callbacks will be made on torrent events.

For more elaborate plugins which require session wide state, you would implement plugin, construct an object (in a std::shared_ptr) and pass it in to session::add_extension().

custom alerts

Since plugins are running within internal libtorrent threads, one convenient way to communicate with the client is to post custom alerts.

The expected interface of any alert, apart from deriving from the alert base class, looks like this:

static const int alert_type = <unique alert ID>;
virtual int type() const { return alert_type; }

virtual std::string message() const;

static const alert_category_t static_category = <bitmask of alert::category_t flags>;
virtual alert_category_t category() const { return static_category; }

virtual char const* what() const { return <string literal of the name of this alert>; }

The alert_type is used for the type-checking in alert_cast. It must not collide with any other alert. The built-in alerts in libtorrent will not use alert type IDs greater than user_alert_id. When defining your own alert, make sure it's greater than this constant.

type() is the run-time equivalence of the alert_type.

The message() virtual function is expected to construct a useful string representation of the alert and the event or data it represents. Something convenient to put in a log file for instance.

clone() is used internally to copy alerts. The suggested implementation of simply allocating a new instance as a copy of *this is all that's expected.

The static category is required for checking whether or not the category for a specific alert is enabled or not, without instantiating the alert. The category virtual function is the run-time equivalence.

The what() virtual function may simply be a string literal of the class name of your alert.

For more information, see the alert section.

[report issue]

plugin

Declared in "libtorrent/extensions.hpp"

this is the base class for a session plugin. One primary feature is that it is notified of all torrents that are added to the session, and can add its own torrent_plugins.

struct plugin
{
   virtual feature_flags_t implemented_features ();
   virtual std::shared_ptr<torrent_plugin> new_torrent (torrent_handle const&, client_data_t);
   virtual void added (session_handle const&);
   virtual void abort ();
   virtual bool on_dht_request (string_view /* query */
      , udp::endpoint const& /* source */, bdecode_node const& /* message */
      , entry& /* response */);
   virtual void on_alert (alert const*);
   virtual bool on_unknown_torrent (info_hash_t const& /* info_hash */
      , peer_connection_handle const& /* pc */, add_torrent_params& /* p */);
   virtual void on_tick ();
   virtual uint64_t get_unchoke_priority (peer_connection_handle const& /* peer */);
   virtual std::map<std::string, std::string> save_state () const;
   virtual void load_state (std::map<std::string, std::string> const&);

   static constexpr feature_flags_t optimistic_unchoke_feature  = 1_bit;
   static constexpr feature_flags_t tick_feature  = 2_bit;
   static constexpr feature_flags_t dht_request_feature  = 3_bit;
   static constexpr feature_flags_t alert_feature  = 4_bit;
};
[report issue]

implemented_features()

virtual feature_flags_t implemented_features ();

This function is expected to return a bitmask indicating which features this plugin implements. Some callbacks on this object may not be called unless the corresponding feature flag is returned here. Note that callbacks may still be called even if the corresponding feature is not specified in the return value here. See feature_flags_t for possible flags to return.

[report issue]

new_torrent()

virtual std::shared_ptr<torrent_plugin> new_torrent (torrent_handle const&, client_data_t);

this is called by the session every time a new torrent is added. The torrent* points to the internal torrent object created for the new torrent. The client_data_t is the userdata pointer as passed in via add_torrent_params.

If the plugin returns a torrent_plugin instance, it will be added to the new torrent. Otherwise, return an empty shared_ptr to a torrent_plugin (the default).

[report issue]

added()

virtual void added (session_handle const&);

called when plugin is added to a session

[report issue]

abort()

virtual void abort ();

called when the session is aborted the plugin should perform any cleanup necessary to allow the session's destruction (e.g. cancel outstanding async operations)

[report issue]

on_dht_request()

virtual bool on_dht_request (string_view /* query */
      , udp::endpoint const& /* source */, bdecode_node const& /* message */
      , entry& /* response */);

called when a dht request is received. If your plugin expects this to be called, make sure to include the flag dht_request_feature in the return value from implemented_features().

[report issue]

on_alert()

virtual void on_alert (alert const*);

called when an alert is posted alerts that are filtered are not posted. If your plugin expects this to be called, make sure to include the flag alert_feature in the return value from implemented_features().

[report issue]

on_unknown_torrent()

virtual bool on_unknown_torrent (info_hash_t const& /* info_hash */
      , peer_connection_handle const& /* pc */, add_torrent_params& /* p */);

return true if the add_torrent_params should be added

[report issue]

on_tick()

virtual void on_tick ();

called once per second. If your plugin expects this to be called, make sure to include the flag tick_feature in the return value from implemented_features().

[report issue]

get_unchoke_priority()

virtual uint64_t get_unchoke_priority (peer_connection_handle const& /* peer */);

called when choosing peers to optimistically unchoke. The return value indicates the peer's priority for unchoking. Lower return values correspond to higher priority. Priorities above 2^63-1 are reserved. If your plugin has no priority to assign a peer it should return 2^64-1. If your plugin expects this to be called, make sure to include the flag optimistic_unchoke_feature in the return value from implemented_features(). If multiple plugins implement this function the lowest return value (i.e. the highest priority) is used.

[report issue]

load_state()

virtual void load_state (std::map<std::string, std::string> const&);

called on startup while loading settings state from the session_params

[report issue]
optimistic_unchoke_feature
include this bit if your plugin needs to alter the order of the optimistic unchoke of peers. i.e. have the on_optimistic_unchoke() callback be called.
[report issue]
tick_feature
include this bit if your plugin needs to have on_tick() called
[report issue]
dht_request_feature
include this bit if your plugin needs to have on_dht_request() called
[report issue]
alert_feature
include this bit if your plugin needs to have on_alert() called
[report issue]

torrent_plugin

Declared in "libtorrent/extensions.hpp"

Torrent plugins are associated with a single torrent and have a number of functions called at certain events. Many of its functions have the ability to change or override the default libtorrent behavior.

struct torrent_plugin
{
   virtual std::shared_ptr<peer_plugin> new_connection (peer_connection_handle const&);
   virtual void on_piece_failed (piece_index_t);
   virtual void on_piece_pass (piece_index_t);
   virtual void tick ();
   virtual bool on_pause ();
   virtual bool on_resume ();
   virtual void on_files_checked ();
   virtual void on_state (torrent_status::state_t);
   virtual void on_add_peer (tcp::endpoint const&,
      peer_source_flags_t, add_peer_flags_t);

   static constexpr add_peer_flags_t first_time  = 1_bit;
   static constexpr add_peer_flags_t filtered  = 2_bit;
};
[report issue]

new_connection()

virtual std::shared_ptr<peer_plugin> new_connection (peer_connection_handle const&);

This function is called each time a new peer is connected to the torrent. You may choose to ignore this by just returning a default constructed shared_ptr (in which case you don't need to override this member function).

If you need an extension to the peer connection (which most plugins do) you are supposed to return an instance of your peer_plugin class. Which in turn will have its hook functions called on event specific to that peer.

The peer_connection_handle will be valid as long as the shared_ptr is being held by the torrent object. So, it is generally a good idea to not keep a shared_ptr to your own peer_plugin. If you want to keep references to it, use weak_ptr.

If this function throws an exception, the connection will be closed.

[report issue]

on_piece_pass() on_piece_failed()

virtual void on_piece_failed (piece_index_t);
virtual void on_piece_pass (piece_index_t);

These hooks are called when a piece passes the hash check or fails the hash check, respectively. The index is the piece index that was downloaded. It is possible to access the list of peers that participated in sending the piece through the torrent and the piece_picker.

[report issue]

tick()

virtual void tick ();

This hook is called approximately once per second. It is a way of making it easy for plugins to do timed events, for sending messages or whatever.

[report issue]

on_resume() on_pause()

virtual bool on_pause ();
virtual bool on_resume ();

These hooks are called when the torrent is paused and resumed respectively. The return value indicates if the event was handled. A return value of true indicates that it was handled, and no other plugin after this one will have this hook function called, and the standard handler will also not be invoked. So, returning true effectively overrides the standard behavior of pause or resume.

Note that if you call pause() or resume() on the torrent from your handler it will recurse back into your handler, so in order to invoke the standard handler, you have to keep your own state on whether you want standard behavior or overridden behavior.

[report issue]

on_files_checked()

virtual void on_files_checked ();

This function is called when the initial files of the torrent have been checked. If there are no files to check, this function is called immediately.

i.e. This function is always called when the torrent is in a state where it can start downloading.

[report issue]

on_state()

virtual void on_state (torrent_status::state_t);

called when the torrent changes state the state is one of torrent_status::state_t enum members

[report issue]

on_add_peer()

virtual void on_add_peer (tcp::endpoint const&,
      peer_source_flags_t, add_peer_flags_t);

called every time a new peer is added to the peer list. This is before the peer is connected to. For flags, see torrent_plugin::flags_t. The source argument refers to the source where we learned about this peer from. It's a bitmask, because many sources may have told us about the same peer. For peer source flags, see peer_info::peer_source_flags.

[report issue]
first_time
this is the first time we see this peer
[report issue]
filtered
this peer was not added because it was filtered by the IP filter
[report issue]

peer_plugin

Declared in "libtorrent/extensions.hpp"

peer plugins are associated with a specific peer. A peer could be both a regular bittorrent peer (bt_peer_connection) or one of the web seed connections (web_peer_connection or http_seed_connection). In order to only attach to certain peers, make your torrent_plugin::new_connection only return a plugin for certain peer connection types

struct peer_plugin
{
   virtual string_view type () const;
   virtual void add_handshake (entry&);
   virtual void on_disconnect (error_code const&);
   virtual void on_connected ();
   virtual bool on_handshake (span<char const>);
   virtual bool on_extension_handshake (bdecode_node const&);
   virtual bool on_unchoke ();
   virtual bool on_dont_have (piece_index_t);
   virtual bool on_bitfield (bitfield const& /*bitfield*/);
   virtual bool on_have (piece_index_t);
   virtual bool on_choke ();
   virtual bool on_request (peer_request const&);
   virtual bool on_have_none ();
   virtual bool on_interested ();
   virtual bool on_not_interested ();
   virtual bool on_have_all ();
   virtual bool on_allowed_fast (piece_index_t);
   virtual bool on_piece (peer_request const& /*piece*/
      , span<char const> /*buf*/);
   virtual bool on_suggest (piece_index_t);
   virtual bool on_reject (peer_request const&);
   virtual bool on_cancel (peer_request const&);
   virtual void sent_have_all ();
   virtual void sent_allow_fast (piece_index_t);
   virtual void sent_choke ();
   virtual void sent_have_none ();
   virtual void sent_suggest (piece_index_t);
   virtual void sent_reject_request (peer_request const&);
   virtual void sent_request (peer_request const&);
   virtual void sent_cancel (peer_request const&);
   virtual void sent_interested ();
   virtual void sent_piece (peer_request const&);
   virtual void sent_have (piece_index_t);
   virtual void sent_not_interested ();
   virtual void sent_unchoke ();
   virtual void sent_payload (int /* bytes */);
   virtual bool can_disconnect (error_code const& /*ec*/);
   virtual bool on_extended (int /*length*/, int /*msg*/,
      span<char const> /*body*/);
   virtual bool on_unknown_message (int /*length*/, int /*msg*/,
      span<char const> /*body*/);
   virtual void on_piece_failed (piece_index_t);
   virtual void on_piece_pass (piece_index_t);
   virtual void tick ();
   virtual bool write_request (peer_request const&);
};
[report issue]

type()

virtual string_view type () const;

This function is expected to return the name of the plugin.

[report issue]

add_handshake()

virtual void add_handshake (entry&);

can add entries to the extension handshake this is not called for web seeds

[report issue]

on_disconnect()

virtual void on_disconnect (error_code const&);

called when the peer is being disconnected.

[report issue]

on_connected()

virtual void on_connected ();

called when the peer is successfully connected. Note that incoming connections will have been connected by the time the peer plugin is attached to it, and won't have this hook called.

[report issue]

on_handshake()

virtual bool on_handshake (span<char const>);

this is called when the initial bittorrent handshake is received. Returning false means that the other end doesn't support this extension and will remove it from the list of plugins. this is not called for web seeds

[report issue]

on_extension_handshake()

virtual bool on_extension_handshake (bdecode_node const&);

called when the extension handshake from the other end is received if this returns false, it means that this extension isn't supported by this peer. It will result in this peer_plugin being removed from the peer_connection and destructed. this is not called for web seeds

[report issue]

on_have() on_unchoke() on_not_interested() on_choke() on_allowed_fast() on_interested() on_have_none() on_have_all() on_dont_have() on_request() on_bitfield()

virtual bool on_unchoke ();
virtual bool on_dont_have (piece_index_t);
virtual bool on_bitfield (bitfield const& /*bitfield*/);
virtual bool on_have (piece_index_t);
virtual bool on_choke ();
virtual bool on_request (peer_request const&);
virtual bool on_have_none ();
virtual bool on_interested ();
virtual bool on_not_interested ();
virtual bool on_have_all ();
virtual bool on_allowed_fast (piece_index_t);

returning true from any of the message handlers indicates that the plugin has handled the message. it will break the plugin chain traversing and not let anyone else handle the message, including the default handler.

[report issue]

on_piece()

virtual bool on_piece (peer_request const& /*piece*/
      , span<char const> /*buf*/);

This function is called when the peer connection is receiving a piece. buf points (non-owning pointer) to the data in an internal immutable disk buffer. The length of the data is specified in the length member of the piece parameter. returns true to indicate that the piece is handled and the rest of the logic should be ignored.

[report issue]

sent_interested() sent_unchoke() sent_piece() sent_not_interested() sent_have()

virtual void sent_interested ();
virtual void sent_piece (peer_request const&);
virtual void sent_have (piece_index_t);
virtual void sent_not_interested ();
virtual void sent_unchoke ();

called after a choke message has been sent to the peer

[report issue]

sent_payload()

virtual void sent_payload (int /* bytes */);

called after piece data has been sent to the peer this can be used for stats book keeping

[report issue]

can_disconnect()

virtual bool can_disconnect (error_code const& /*ec*/);

called when libtorrent think this peer should be disconnected. if the plugin returns false, the peer will not be disconnected.

[report issue]

on_extended()

virtual bool on_extended (int /*length*/, int /*msg*/,
      span<char const> /*body*/);

called when an extended message is received. If returning true, the message is not processed by any other plugin and if false is returned the next plugin in the chain will receive it to be able to handle it. This is not called for web seeds. thus function may be called more than once per incoming message, but only the last of the calls will the body size equal the length. i.e. Every time another fragment of the message is received, this function will be called, until finally the whole message has been received. The purpose of this is to allow early disconnects for invalid messages and for reporting progress of receiving large messages.

[report issue]

on_unknown_message()

virtual bool on_unknown_message (int /*length*/, int /*msg*/,
      span<char const> /*body*/);

this is not called for web seeds

[report issue]

on_piece_pass() on_piece_failed()

virtual void on_piece_failed (piece_index_t);
virtual void on_piece_pass (piece_index_t);

called when a piece that this peer participated in either fails or passes the hash_check

[report issue]

tick()

virtual void tick ();

called approximately once every second

[report issue]

write_request()

virtual bool write_request (peer_request const&);

called each time a request message is to be sent. If true is returned, the original request message won't be sent and no other plugin will have this function called.

[report issue]

crypto_plugin

Declared in "libtorrent/extensions.hpp"

struct crypto_plugin
{
   virtual void set_outgoing_key (span<char const> key) = 0;
   virtual void set_incoming_key (span<char const> key) = 0;
   encrypt (span<span<char>> /*send_vec*/) = 0;
   virtual std::tuple<int, int, int> decrypt (span<span<char>> /*receive_vec*/) = 0;
};
[report issue]

decrypt()

virtual std::tuple<int, int, int> decrypt (span<span<char>> /*receive_vec*/) = 0;

decrypt the provided buffers. returns is a tuple representing the values (consume, produce, packet_size)

consume is set to the number of bytes which should be trimmed from the head of the buffers, default is 0

produce is set to the number of bytes of payload which are now ready to be sent to the upper layer. default is the number of bytes passed in receive_vec

packet_size is set to the minimum number of bytes which must be read to advance the next step of decryption. default is 0

[report issue]

peer_connection_handle

Declared in "libtorrent/peer_connection_handle.hpp"

the peer_connection_handle class provides a handle to the internal peer connection object, to be used by plugins. This is a low level interface that may not be stable across libtorrent versions

struct peer_connection_handle
{
   explicit peer_connection_handle (std::weak_ptr<peer_connection> impl);
   connection_type type () const;
   void add_extension (std::shared_ptr<peer_plugin>);
   peer_plugin const* find_plugin (string_view type) const;
   bool is_seed () const;
   bool upload_only () const;
   peer_id const& pid () const;
   bool has_piece (piece_index_t i) const;
   bool is_interesting () const;
   bool is_choked () const;
   bool is_peer_interested () const;
   bool has_peer_choked () const;
   void maybe_unchoke_this_peer ();
   void choke_this_peer ();
   void get_peer_info (peer_info& p) const;
   torrent_handle associated_torrent () const;
   tcp::endpoint const& remote () const;
   tcp::endpoint local_endpoint () const;
   bool is_connecting () const;
   bool is_outgoing () const;
   bool is_disconnecting () const;
   void disconnect (error_code const& ec, operation_t op
      , disconnect_severity_t = peer_connection_interface::normal);
   bool ignore_unchoke_slots () const;
   bool on_local_network () const;
   bool failed () const;
   void peer_log (peer_log_alert::direction_t direction
      , char const* event, char const* fmt = "", ...) const TORRENT_FORMAT(4,5);
   bool should_log (peer_log_alert::direction_t direction) const;
   bool can_disconnect (error_code const& ec) const;
   bool has_metadata () const;
   bool in_handshake () const;
   void send_buffer (char const* begin, int size);
   time_point time_of_last_unchoke () const;
   std::time_t last_seen_complete () const;
   bool operator< (peer_connection_handle const& o) const;
   bool operator== (peer_connection_handle const& o) const;
   bool operator!= (peer_connection_handle const& o) const;
   std::shared_ptr<peer_connection> native_handle () const;
};
[report issue]

bt_peer_connection_handle

Declared in "libtorrent/peer_connection_handle.hpp"

The bt_peer_connection_handle provides a handle to the internal bittorrent peer connection object to plugins. It's low level and may not be a stable API across libtorrent versions.

struct bt_peer_connection_handle : peer_connection_handle
{
   explicit bt_peer_connection_handle (peer_connection_handle pc);
   bool packet_finished () const;
   bool support_extensions () const;
   bool supports_encryption () const;
   void switch_recv_crypto (std::shared_ptr<crypto_plugin> crypto);
   void switch_send_crypto (std::shared_ptr<crypto_plugin> crypto);
   std::shared_ptr<bt_peer_connection> native_handle () const;
};
[report issue]

create_ut_metadata_plugin()

Declared in "libtorrent/extensions/ut_metadata.hpp"

std::shared_ptr<torrent_plugin> create_ut_metadata_plugin (torrent_handle const&, client_data_t);

constructor function for the ut_metadata extension. The ut_metadata extension allows peers to request the .torrent file (or more specifically the info-dictionary of the .torrent file) from each other. This is the main building block in making magnet links work. This extension is enabled by default unless explicitly disabled in the session constructor.

This can either be passed in the add_torrent_params::extensions field, or via torrent_handle::add_extension().

[report issue]

create_smart_ban_plugin()

Declared in "libtorrent/extensions/smart_ban.hpp"

std::shared_ptr<torrent_plugin> create_smart_ban_plugin (torrent_handle const&, client_data_t);

constructor function for the smart ban extension. The extension keeps track of the data peers have sent us for failing pieces and once the piece completes and passes the hash check bans the peers that turned out to have sent corrupt data. This function can either be passed in the add_torrent_params::extensions field, or via torrent_handle::add_extension().

[report issue]

create_ut_pex_plugin()

Declared in "libtorrent/extensions/ut_pex.hpp"

std::shared_ptr<torrent_plugin> create_ut_pex_plugin (torrent_handle const&, client_data_t);

constructor function for the ut_pex extension. The ut_pex extension allows peers to gossip about their connections, allowing the swarm stay well connected and peers aware of more peers in the swarm. This extension is enabled by default unless explicitly disabled in the session constructor.

This can either be passed in the add_torrent_params::extensions field, or via torrent_handle::add_extension().

libtorrent-rasterbar-2.0.5/docs/reference.html0000664000175000017500000007745214152763504020465 0ustar arvidarvid libtorrent
libtorrent logo

reference documentation

single-page version

Alerts

libtorrent-rasterbar-2.0.5/docs/dht_extensions.html0000664000175000017500000001246514152763504021556 0ustar arvidarvid libtorrent
libtorrent logo

Mainline DHT extensions

Version: 2.0.5

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 a lot 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:

uTorrent UT
libtorrent LT
MooPolice MP
GetRight GR

IPv6 support

This extension is superseded 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.

libtorrent-rasterbar-2.0.5/docs/single-page-ref.html0000664000175000017500000466341714152763504021502 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

Table of contents

[report issue]

client_data_t

Declared in "libtorrent/client_data.hpp"

A thin wrapper around a void pointer used as "user data". i.e. an opaque cookie passed in to libtorrent and returned on demand. It adds type-safety by requiring the same type be requested out of it as was assigned to it.

struct client_data_t
{
   client_data_t () = default;
   explicit client_data_t (T* v);
   client_data_t& operator= (T* v);
   explicit operator T () const;
   T* get () const;
   operator void* () const = delete;
   operator void const* () const = delete;
   client_data_t& operator= (void*) = delete;
   client_data_t& operator= (void const*) = delete;

   template <typename T, typename U  = typename std::enable_if<std::is_pointer<T>::value>::type>
};
[report issue]

client_data_t()

client_data_t () = default;

construct a nullptr client data

[report issue]

operator=() const*() void*()

operator void* () const = delete;
operator void const* () const = delete;
client_data_t& operator= (void*) = delete;
client_data_t& operator= (void const*) = delete;

we don't allow type-unsafe operations

[report issue]

add_torrent_params

Declared in "libtorrent/add_torrent_params.hpp"

The add_torrent_params is a parameter pack for adding torrents to a session. The key fields when adding a torrent are:

  • ti - when you have loaded a .torrent file into a torrent_info object
  • info_hash - when you don't have the metadata (.torrent file) but. This is set when adding a magnet link.

one of those fields must be set. Another mandatory field is save_path. The add_torrent_params object is passed into one of the session::add_torrent() overloads or session::async_add_torrent().

If you only specify the info-hash, the torrent file will be downloaded from peers, which requires them to support the metadata extension. For the metadata extension to work, libtorrent must be built with extensions enabled (TORRENT_DISABLE_EXTENSIONS must not be defined). It also takes an optional name argument. This may be left empty in case no name should be assigned to the torrent. In case it's not, the name is used for the torrent as long as it doesn't have metadata. See torrent_handle::name.

The add_torrent_params is also used when requesting resume data for a torrent. It can be saved to and restored from a file and added back to a new session. For serialization and de-serialization of add_torrent_params objects, see read_resume_data() and write_resume_data().

struct add_torrent_params
{
   int version  = LIBTORRENT_VERSION_NUM;
   std::shared_ptr<torrent_info> ti;
   aux::noexcept_movable<std::vector<std::string>> trackers;
   aux::noexcept_movable<std::vector<int>> tracker_tiers;
   aux::noexcept_movable<std::vector<std::pair<std::string, int>>> dht_nodes;
   std::string name;
   std::string save_path;
   storage_mode_t storage_mode  = storage_mode_sparse;
   client_data_t userdata;
   aux::noexcept_movable<std::vector<download_priority_t>> file_priorities;
   std::string trackerid;
   torrent_flags_t flags  = torrent_flags::default_flags;
   info_hash_t info_hashes;
   int max_uploads  = -1;
   int max_connections  = -1;
   int upload_limit  = -1;
   int download_limit  = -1;
   std::int64_t total_uploaded  = 0;
   std::int64_t total_downloaded  = 0;
   int active_time  = 0;
   int finished_time  = 0;
   int seeding_time  = 0;
   std::time_t added_time  = 0;
   std::time_t completed_time  = 0;
   std::time_t last_seen_complete  = 0;
   int num_complete  = -1;
   int num_incomplete  = -1;
   int num_downloaded  = -1;
   aux::noexcept_movable<std::vector<std::string>> http_seeds;
   aux::noexcept_movable<std::vector<std::string>> url_seeds;
   aux::noexcept_movable<std::vector<tcp::endpoint>> peers;
   aux::noexcept_movable<std::vector<tcp::endpoint>> banned_peers;
   aux::noexcept_movable<std::map<piece_index_t, bitfield>> unfinished_pieces;
   typed_bitfield<piece_index_t> have_pieces;
   typed_bitfield<piece_index_t> verified_pieces;
   aux::noexcept_movable<std::vector<download_priority_t>> piece_priorities;
   aux::vector<std::vector<sha256_hash>, file_index_t> merkle_trees;
   aux::vector<std::vector<bool>, file_index_t> merkle_tree_mask;
   aux::vector<std::vector<bool>, file_index_t> verified_leaf_hashes;
   aux::noexcept_movable<std::map<file_index_t, std::string>> renamed_files;
   std::time_t last_download  = 0;
   std::time_t last_upload  = 0;
};
[report issue]
version
filled in by the constructor and should be left untouched. It is used for forward binary compatibility.
[report issue]
ti
torrent_info object with the torrent to add. Unless the info_hash is set, this is required to be initialized.
[report issue]
trackers
If the torrent doesn't have a tracker, but relies on the DHT to find peers, the trackers can specify tracker URLs for the torrent.
[report issue]
tracker_tiers
the tiers the URLs in trackers belong to. Trackers belonging to different tiers may be treated differently, as defined by the multi tracker extension. This is optional, if not specified trackers are assumed to be part of tier 0, or whichever the last tier was as iterating over the trackers.
[report issue]
dht_nodes
a list of hostname and port pairs, representing DHT nodes to be added to the session (if DHT is enabled). The hostname may be an IP address.
[report issue]
name
in case there's no other name in this torrent, this name will be used. The name out of the torrent_info object takes precedence if available.
[report issue]
save_path

the path where the torrent is or will be stored.

Note

On windows this path (and other paths) are interpreted as UNC paths. This means they must use backslashes as directory separators and may not contain the special directories "." or "..".

Setting this to an absolute path performs slightly better than a relative path.

[report issue]
storage_mode
One of the values from storage_mode_t. For more information, see storage allocation.
[report issue]
userdata
The userdata parameter is optional and will be passed on to the extension constructor functions, if any (see torrent_handle::add_extension()). It will also be stored in the torrent object and can be retrieved by calling userdata().
[report issue]
file_priorities
can be set to control the initial file priorities when adding a torrent. The semantics are the same as for torrent_handle::prioritize_files(). The file priorities specified in here take precedence over those specified in the resume data, if any.
[report issue]
trackerid
the default tracker id to be used when announcing to trackers. By default this is empty, and no tracker ID is used, since this is an optional argument. If a tracker returns a tracker ID, that ID is used instead of this.
[report issue]
flags

flags controlling aspects of this torrent and how it's added. See torrent_flags_t for details.

Note

The flags field is initialized with default flags by the constructor. In order to preserve default behavior when clearing or setting other flags, make sure to bitwise OR or in a flag or bitwise AND the inverse of a flag to clear it.

[report issue]
info_hashes
set this to the info hash of the torrent to add in case the info-hash is the only known property of the torrent. i.e. you don't have a .torrent file nor a magnet link. To add a magnet link, use parse_magnet_uri() to populate fields in the add_torrent_params object.
[report issue]
max_uploads max_connections

max_uploads, max_connections, upload_limit, download_limit correspond to the set_max_uploads(), set_max_connections(), set_upload_limit() and set_download_limit() functions on torrent_handle. These values let you initialize these settings when the torrent is added, instead of calling these functions immediately following adding it.

-1 means unlimited on these settings just like their counterpart functions on torrent_handle

For fine grained control over rate limits, including making them apply to local peers, see peer classes.

[report issue]
upload_limit download_limit
the upload and download rate limits for this torrent, specified in bytes per second. -1 means unlimited.
[report issue]
total_uploaded total_downloaded
the total number of bytes uploaded and downloaded by this torrent so far.
[report issue]
active_time finished_time seeding_time
the number of seconds this torrent has spent in started, finished and seeding state so far, respectively.
[report issue]
added_time completed_time
if set to a non-zero value, this is the posix time of when this torrent was first added, including previous runs/sessions. If set to zero, the internal added_time will be set to the time of when add_torrent() is called.
[report issue]
last_seen_complete
if set to non-zero, initializes the time (expressed in posix time) when we last saw a seed or peers that together formed a complete copy of the torrent. If left set to zero, the internal counterpart to this field will be updated when we see a seed or a distributed copies >= 1.0.
[report issue]
num_complete num_incomplete num_downloaded

these field can be used to initialize the torrent's cached scrape data. The scrape data is high level metadata about the current state of the swarm, as returned by the tracker (either when announcing to it or by sending a specific scrape request). num_complete is the number of peers in the swarm that are seeds, or have every piece in the torrent. num_incomplete is the number of peers in the swarm that do not have every piece. num_downloaded is the number of times the torrent has been downloaded (not initiated, but the number of times a download has completed).

Leaving any of these values set to -1 indicates we don't know, or we have not received any scrape data.

[report issue]
http_seeds url_seeds

URLs can be added to these two lists to specify additional web seeds to be used by the torrent. If the flag_override_web_seeds is set, these will be the _only_ ones to be used. i.e. any web seeds found in the .torrent file will be overridden.

http_seeds expects URLs to web servers implementing the original HTTP seed specification BEP 17.

url_seeds expects URLs to regular web servers, aka "get right" style, specified in BEP 19.

[report issue]
peers
peers to add to the torrent, to be tried to be connected to as bittorrent peers.
[report issue]
banned_peers
peers banned from this torrent. The will not be connected to
[report issue]
unfinished_pieces
this is a map of partially downloaded piece. The key is the piece index and the value is a bitfield where each bit represents a 16 kiB block. A set bit means we have that block.
[report issue]
have_pieces
this is a bitfield indicating which pieces we already have of this torrent.
[report issue]
verified_pieces
when in seed_mode, pieces with a set bit in this bitfield have been verified to be valid. Other pieces will be verified the first time a peer requests it.
[report issue]
piece_priorities
this sets the priorities for each individual piece in the torrent. Each element in the vector represent the piece with the same index. If you set both file- and piece priorities, file priorities will take precedence.
[report issue]
merkle_trees
v2 hashes, if known
[report issue]
merkle_tree_mask
if set, indicates which hashes are included in the corresponding vector of merkle_trees. These bitmasks always cover the full tree, a cleared bit means the hash is all zeros (i.e. not set) and set bit means the next hash in the corresponding vector in merkle_trees is the hash for that node. This is an optimization to avoid storing a lot of zeros.
[report issue]
verified_leaf_hashes
bit-fields indicating which v2 leaf hashes have been verified against the root hash. If this vector is empty and merkle_trees is non-empty it implies that all hashes in merkle_trees are verified.
[report issue]
renamed_files
this is a map of file indices in the torrent and new filenames to be applied before the torrent is added.
[report issue]
last_download last_upload
the posix time of the last time payload was received or sent for this torrent, respectively.
[report issue]

counters

Declared in "libtorrent/performance_counters.hpp"

struct counters
{
   counters () ;
   counters& operator= (counters const&) & ;
   counters (counters const&) ;
   std::int64_t inc_stats_counter (int c, std::int64_t value = 1) ;
   std::int64_t operator[] (int i) const ;
   void blend_stats_counter (int c, std::int64_t value, int ratio) ;
   void set_value (int c, std::int64_t value) ;
};
[report issue]

operator[]() inc_stats_counter()

std::int64_t inc_stats_counter (int c, std::int64_t value = 1) ;
std::int64_t operator[] (int i) const ;

returns the new value

[report issue]

stats_metric

Declared in "libtorrent/session_stats.hpp"

describes one statistics metric from the session. For more information, see the session statistics section.

struct stats_metric
{
   char const* name;
   int value_index;
   metric_type_t type;
};
[report issue]
name
the name of the counter or gauge
[report issue]
value_index type
the index into the session stats array, where the underlying value of this counter or gauge is found. The session stats array is part of the session_stats_alert object.
[report issue]

session_stats_metrics()

Declared in "libtorrent/session_stats.hpp"

std::vector<stats_metric> session_stats_metrics ();

This free function returns the list of available metrics exposed by libtorrent's statistics API. Each metric has a name and a value index. The value index is the index into the array in session_stats_alert where this metric's value can be found when the session stats is sampled (by calling post_session_stats()).

[report issue]

find_metric_idx()

Declared in "libtorrent/session_stats.hpp"

int find_metric_idx (string_view name);

given a name of a metric, this function returns the counter index of it, or -1 if it could not be found. The counter index is the index into the values array returned by session_stats_alert.

[report issue]

enum metric_type_t

Declared in "libtorrent/session_stats.hpp"

name value description
counter 0  
gauge 1  
[report issue]

storage_error

Declared in "libtorrent/error_code.hpp"

used by storage to return errors also includes which underlying file the error happened on

struct storage_error
{
   explicit operator bool () const;
   file_index_t file () const;
   void file (file_index_t f);

   error_code ec;
   operation_t operation;
};
[report issue]

bool()

explicit operator bool () const;

explicitly converts to true if this object represents an error, and false if it does not.

[report issue]

file()

file_index_t file () const;
void file (file_index_t f);

set and query the index (in the torrent) of the file this error occurred on. This may also have special values defined in torrent_status.

[report issue]
ec
the error that occurred
[report issue]
operation
A code from operation_t enum, indicating what kind of operation failed.
[report issue]

libtorrent_category()

Declared in "libtorrent/error_code.hpp"

boost::system::error_category& libtorrent_category ();

return the instance of the libtorrent_error_category which maps libtorrent error codes to human readable error messages.

[report issue]

http_category()

Declared in "libtorrent/error_code.hpp"

boost::system::error_category& http_category ();

returns the error_category for HTTP errors

[report issue]

pcp_category()

Declared in "libtorrent/natpmp.hpp"

boost::system::error_category& pcp_category ();
[report issue]

upnp_category()

Declared in "libtorrent/upnp.hpp"

boost::system::error_category& upnp_category ();

the boost.system error category for UPnP errors

[report issue]

gzip_category()

Declared in "libtorrent/gzip.hpp"

boost::system::error_category& gzip_category ();

get the error_category for zip errors

[report issue]

bdecode_category()

Declared in "libtorrent/bdecode.hpp"

boost::system::error_category& bdecode_category ();
[report issue]

socks_category()

Declared in "libtorrent/socks5_stream.hpp"

boost::system::error_category& socks_category ();

returns the error_category for SOCKS5 errors

[report issue]

i2p_category()

Declared in "libtorrent/i2p_stream.hpp"

boost::system::error_category& i2p_category ();

returns the error category for I2P errors

[report issue]

enum error_code_enum

Declared in "libtorrent/error_code.hpp"

name value description
no_error 0 Not an error
file_collision 1 Two torrents has files which end up overwriting each other
failed_hash_check 2 A piece did not match its piece hash
torrent_is_no_dict 3 The .torrent file does not contain a bencoded dictionary at its top level
torrent_missing_info 4 The .torrent file does not have an info dictionary
torrent_info_no_dict 5 The .torrent file's info entry is not a dictionary
torrent_missing_piece_length 6 The .torrent file does not have a piece length entry
torrent_missing_name 7 The .torrent file does not have a name entry
torrent_invalid_name 8 The .torrent file's name entry is invalid
torrent_invalid_length 9 The length of a file, or of the whole .torrent file is invalid. Either negative or not an integer
torrent_file_parse_failed 10 Failed to parse a file entry in the .torrent
torrent_missing_pieces 11 The pieces field is missing or invalid in the .torrent file
torrent_invalid_hashes 12 The pieces string has incorrect length
too_many_pieces_in_torrent 13 The .torrent file has more pieces than is supported by libtorrent
invalid_swarm_metadata 14 The metadata (.torrent file) that was received from the swarm matched the info-hash, but failed to be parsed
invalid_bencoding 15 The file or buffer is not correctly bencoded
no_files_in_torrent 16 The .torrent file does not contain any files
invalid_escaped_string 17 The string was not properly url-encoded as expected
session_is_closing 18 Operation is not permitted since the session is shutting down
duplicate_torrent 19 There's already a torrent with that info-hash added to the session
invalid_torrent_handle 20 The supplied torrent_handle is not referring to a valid torrent
invalid_entry_type 21 The type requested from the entry did not match its type
missing_info_hash_in_uri 22 The specified URI does not contain a valid info-hash
file_too_short 23 One of the files in the torrent was unexpectedly small. This might be caused by files being changed by an external process
unsupported_url_protocol 24 The URL used an unknown protocol. Currently http and https (if built with openssl support) are recognized. For trackers udp is recognized as well.
url_parse_error 25 The URL did not conform to URL syntax and failed to be parsed
peer_sent_empty_piece 26 The peer sent a piece message of length 0
parse_failed 27 A bencoded structure was corrupt and failed to be parsed
invalid_file_tag 28 The fast resume file was missing or had an invalid file version tag
missing_info_hash 29 The fast resume file was missing or had an invalid info-hash
mismatching_info_hash 30 The info-hash did not match the torrent
invalid_hostname 31 The URL contained an invalid hostname
invalid_port 32 The URL had an invalid port
port_blocked 33 The port is blocked by the port-filter, and prevented the connection
expected_close_bracket_in_address 34 The IPv6 address was expected to end with "]"
destructing_torrent 35 The torrent is being destructed, preventing the operation to succeed
timed_out 36 The connection timed out
upload_upload_connection 37 The peer is upload only, and we are upload only. There's no point in keeping the connection
uninteresting_upload_peer 38 The peer is upload only, and we're not interested in it. There's no point in keeping the connection
invalid_info_hash 39 The peer sent an unknown info-hash
torrent_paused 40 The torrent is paused, preventing the operation from succeeding
invalid_have 41 The peer sent an invalid have message, either wrong size or referring to a piece that doesn't exist in the torrent
invalid_bitfield_size 42 The bitfield message had the incorrect size
too_many_requests_when_choked 43 The peer kept requesting pieces after it was choked, possible abuse attempt.
invalid_piece 44 The peer sent a piece message that does not correspond to a piece request sent by the client
no_memory 45 memory allocation failed
torrent_aborted 46 The torrent is aborted, preventing the operation to succeed
self_connection 47 The peer is a connection to ourself, no point in keeping it
invalid_piece_size 48 The peer sent a piece message with invalid size, either negative or greater than one block
timed_out_no_interest 49 The peer has not been interesting or interested in us for too long, no point in keeping it around
timed_out_inactivity 50 The peer has not said anything in a long time, possibly dead
timed_out_no_handshake 51 The peer did not send a handshake within a reasonable amount of time, it might not be a bittorrent peer
timed_out_no_request 52 The peer has been unchoked for too long without requesting any data. It might be lying about its interest in us
invalid_choke 53 The peer sent an invalid choke message
invalid_unchoke 54 The peer send an invalid unchoke message
invalid_interested 55 The peer sent an invalid interested message
invalid_not_interested 56 The peer sent an invalid not-interested message
invalid_request 57 The peer sent an invalid piece request message
invalid_hash_list 58 The peer sent an invalid hash-list message (this is part of the merkle-torrent extension)
invalid_hash_piece 59 The peer sent an invalid hash-piece message (this is part of the merkle-torrent extension)
invalid_cancel 60 The peer sent an invalid cancel message
invalid_dht_port 61 The peer sent an invalid DHT port-message
invalid_suggest 62 The peer sent an invalid suggest piece-message
invalid_have_all 63 The peer sent an invalid have all-message
invalid_have_none 64 The peer sent an invalid have none-message
invalid_reject 65 The peer sent an invalid reject message
invalid_allow_fast 66 The peer sent an invalid allow fast-message
invalid_extended 67 The peer sent an invalid extension message ID
invalid_message 68 The peer sent an invalid message ID
sync_hash_not_found 69 The synchronization hash was not found in the encrypted handshake
invalid_encryption_constant 70 The encryption constant in the handshake is invalid
no_plaintext_mode 71 The peer does not support plain text, which is the selected mode
no_rc4_mode 72 The peer does not support RC4, which is the selected mode
unsupported_encryption_mode 73 The peer does not support any of the encryption modes that the client supports
unsupported_encryption_mode_selected 74 The peer selected an encryption mode that the client did not advertise and does not support
invalid_pad_size 75 The pad size used in the encryption handshake is of invalid size
invalid_encrypt_handshake 76 The encryption handshake is invalid
no_incoming_encrypted 77 The client is set to not support incoming encrypted connections and this is an encrypted connection
no_incoming_regular 78 The client is set to not support incoming regular bittorrent connections, and this is a regular connection
duplicate_peer_id 79 The client is already connected to this peer-ID
torrent_removed 80 Torrent was removed
packet_too_large 81 The packet size exceeded the upper sanity check-limit
reserved 82  
http_error 83 The web server responded with an error
missing_location 84 The web server response is missing a location header
invalid_redirection 85 The web seed redirected to a path that no longer matches the .torrent directory structure
redirecting 86 The connection was closed because it redirected to a different URL
invalid_range 87 The HTTP range header is invalid
no_content_length 88 The HTTP response did not have a content length
banned_by_ip_filter 89 The IP is blocked by the IP filter
too_many_connections 90 At the connection limit
peer_banned 91 The peer is marked as banned
stopping_torrent 92 The torrent is stopping, causing the operation to fail
too_many_corrupt_pieces 93 The peer has sent too many corrupt pieces and is banned
torrent_not_ready 94 The torrent is not ready to receive peers
peer_not_constructed 95 The peer is not completely constructed yet
session_closing 96 The session is closing, causing the operation to fail
optimistic_disconnect 97 The peer was disconnected in order to leave room for a potentially better peer
torrent_finished 98 The torrent is finished
no_router 99 No UPnP router found
metadata_too_large 100 The metadata message says the metadata exceeds the limit
invalid_metadata_request 101 The peer sent an invalid metadata request message
invalid_metadata_size 102 The peer advertised an invalid metadata size
invalid_metadata_offset 103 The peer sent a message with an invalid metadata offset
invalid_metadata_message 104 The peer sent an invalid metadata message
pex_message_too_large 105 The peer sent a peer exchange message that was too large
invalid_pex_message 106 The peer sent an invalid peer exchange message
invalid_lt_tracker_message 107 The peer sent an invalid tracker exchange message
too_frequent_pex 108 The peer sent an pex messages too often. This is a possible attempt of and attack
no_metadata 109 The operation failed because it requires the torrent to have the metadata (.torrent file) and it doesn't have it yet. This happens for magnet links before they have downloaded the metadata, and also torrents added by URL.
invalid_dont_have 110 The peer sent an invalid dont_have message. The don't have message is an extension to allow peers to advertise that the no longer has a piece they previously had.
requires_ssl_connection 111 The peer tried to connect to an SSL torrent without connecting over SSL.
invalid_ssl_cert 112 The peer tried to connect to a torrent with a certificate for a different torrent.
not_an_ssl_torrent 113 the torrent is not an SSL torrent, and the operation requires an SSL torrent
banned_by_port_filter 114 peer was banned because its listen port is within a banned port range, as specified by the port_filter.
invalid_session_handle 115 The session_handle is not referring to a valid session_impl
invalid_listen_socket 116 the listen socket associated with this request was closed
invalid_hash_request 117  
invalid_hashes 118  
invalid_hash_reject 119  
deprecated_120 120  
deprecated_121 121  
deprecated_122 122  
deprecated_123 123  
deprecated_124 124  
missing_file_sizes 130 The resume data file is missing the file sizes entry
no_files_in_resume_data 131 The resume data file file sizes entry is empty
missing_pieces 132 The resume data file is missing the pieces and slots entry
mismatching_number_of_files 133 The number of files in the resume data does not match the number of files in the torrent
mismatching_file_size 134 One of the files on disk has a different size than in the fast resume file
mismatching_file_timestamp 135 One of the files on disk has a different timestamp than in the fast resume file
not_a_dictionary 136 The resume data file is not a dictionary
invalid_blocks_per_piece 137 The blocks per piece entry is invalid in the resume data file
missing_slots 138 The resume file is missing the slots entry, which is required for torrents with compact allocation. DEPRECATED
too_many_slots 139 The resume file contains more slots than the torrent
invalid_slot_list 140 The slot entry is invalid in the resume data
invalid_piece_index 141 One index in the slot list is invalid
pieces_need_reorder 142 The pieces on disk needs to be re-ordered for the specified allocation mode. This happens if you specify sparse allocation and the files on disk are using compact storage. The pieces needs to be moved to their right position. DEPRECATED
resume_data_not_modified 143 this error is returned when asking to save resume data and specifying the flag to only save when there's anything new to save (torrent_handle::only_if_modified) and there wasn't anything changed.
http_parse_error 150 The HTTP header was not correctly formatted
http_missing_location 151 The HTTP response was in the 300-399 range but lacked a location header
http_failed_decompress 152 The HTTP response was encoded with gzip or deflate but decompressing it failed
no_i2p_router 160 The URL specified an i2p address, but no i2p router is configured
no_i2p_endpoint 161 i2p acceptor is not available yet, can't announce without endpoint
scrape_not_available 170 The tracker URL doesn't support transforming it into a scrape URL. i.e. it doesn't contain "announce.
invalid_tracker_response 171 invalid tracker response
invalid_peer_dict 172 invalid peer dictionary entry. Not a dictionary
tracker_failure 173 tracker sent a failure message
invalid_files_entry 174 missing or invalid files entry
invalid_hash_entry 175 missing or invalid hash entry
invalid_peers_entry 176 missing or invalid peers and peers6 entry
invalid_tracker_response_length 177 UDP tracker response packet has invalid size
invalid_tracker_transaction_id 178 invalid transaction id in UDP tracker response
invalid_tracker_action 179 invalid action field in UDP tracker response
announce_skipped 180 skipped announce (because it's assumed to be unreachable over the given source network interface)
no_entropy 200 random number generation failed
ssrf_mitigation 201 blocked by SSRF mitigation
blocked_by_idna 202 blocked because IDNA host names are banned
torrent_unknown_version 210 the torrent file has an unknown meta version
torrent_missing_file_tree 211 the v2 torrent file has no file tree
torrent_missing_meta_version 212 the torrent contains v2 keys but does not specify meta version 2
torrent_inconsistent_files 213 the v1 and v2 file metadata does not match
torrent_missing_piece_layer 214 one or more files are missing piece layer hashes
torrent_invalid_piece_layer 215 a piece layer has the wrong size or failed hash check
torrent_missing_pieces_root 216 a v2 file entry has no root hash
torrent_inconsistent_hashes 217 the v1 and v2 hashes do not describe the same data
torrent_invalid_pad_file 218 a file in the v2 metadata has the pad attribute set
error_code_max 219 the number of error codes
[report issue]

enum http_errors

Declared in "libtorrent/error_code.hpp"

name value description
cont 100  
ok 200  
created 201  
accepted 202  
no_content 204  
multiple_choices 300  
moved_permanently 301  
moved_temporarily 302  
not_modified 304  
bad_request 400  
unauthorized 401  
forbidden 403  
not_found 404  
internal_server_error 500  
not_implemented 501  
bad_gateway 502  
service_unavailable 503  
[report issue]

enum pcp_errors

Declared in "libtorrent/natpmp.hpp"

name value description
pcp_success 0  
pcp_unsupp_version 1  
pcp_not_authorized 2  
pcp_malformed_request 3  
pcp_unsupp_opcode 4  
pcp_unsupp_option 5  
pcp_malformed_option 6  
pcp_network_failure 7  
pcp_no_resources 8  
pcp_unsupp_protocol 9  
pcp_user_ex_quota 10  
pcp_cannot_provide_external 11  
pcp_address_mismatch 12  
pcp_excessive_remote_peers 13  
[report issue]

enum error_code_enum

Declared in "libtorrent/upnp.hpp"

name value description
no_error 0 No error
invalid_argument 402 One of the arguments in the request is invalid
action_failed 501 The request failed
value_not_in_array 714 The specified value does not exist in the array
source_ip_cannot_be_wildcarded 715 The source IP address cannot be wild-carded, but must be fully specified
external_port_cannot_be_wildcarded 716 The external port cannot be a wildcard, but must be specified
port_mapping_conflict 718 The port mapping entry specified conflicts with a mapping assigned previously to another client
internal_port_must_match_external 724 Internal and external port value must be the same
only_permanent_leases_supported 725 The NAT implementation only supports permanent lease times on port mappings
remote_host_must_be_wildcard 726 RemoteHost must be a wildcard and cannot be a specific IP address or DNS name
external_port_must_be_wildcard 727 ExternalPort must be a wildcard and cannot be a specific port
[report issue]

enum error_code_enum

Declared in "libtorrent/gzip.hpp"

name value description
no_error 0 Not an error
invalid_gzip_header 1 the supplied gzip buffer has invalid header
inflated_data_too_large 2 the gzip buffer would inflate to more bytes than the specified maximum size, and was rejected.
data_did_not_terminate 3 available inflate data did not terminate
space_exhausted 4 output space exhausted before completing inflate
invalid_block_type 5 invalid block type (type == 3)
invalid_stored_block_length 6 stored block length did not match one's complement
too_many_length_or_distance_codes 7 dynamic block code description: too many length or distance codes
code_lengths_codes_incomplete 8 dynamic block code description: code lengths codes incomplete
repeat_lengths_with_no_first_length 9 dynamic block code description: repeat lengths with no first length
repeat_more_than_specified_lengths 10 dynamic block code description: repeat more than specified lengths
invalid_literal_length_code_lengths 11 dynamic block code description: invalid literal/length code lengths
invalid_distance_code_lengths 12 dynamic block code description: invalid distance code lengths
invalid_literal_code_in_block 13 invalid literal/length or distance code in fixed or dynamic block
distance_too_far_back_in_block 14 distance is too far back in fixed or dynamic block
unknown_gzip_error 15 an unknown error occurred during gzip inflation
error_code_max 16 the number of error codes
[report issue]

enum error_code_enum

Declared in "libtorrent/bdecode.hpp"

name value description
no_error 0 Not an error
expected_digit 1 expected digit in bencoded string
expected_colon 2 expected colon in bencoded string
unexpected_eof 3 unexpected end of file in bencoded string
expected_value 4 expected value (list, dict, int or string) in bencoded string
depth_exceeded 5 bencoded recursion depth limit exceeded
limit_exceeded 6 bencoded item count limit exceeded
overflow 7 integer overflow
error_code_max 8 the number of error codes
[report issue]

enum socks_error_code

Declared in "libtorrent/socks5_stream.hpp"

name value description
no_error 0  
unsupported_version 1  
unsupported_authentication_method 2  
unsupported_authentication_version 3  
authentication_error 4  
username_required 5  
general_failure 6  
command_not_supported 7  
no_identd 8  
identd_error 9  
num_errors 10  
[report issue]

enum i2p_error_code

Declared in "libtorrent/i2p_stream.hpp"

name value description
no_error 0  
parse_failed 1  
cant_reach_peer 2  
i2p_error 3  
invalid_key 4  
invalid_id 5  
timeout 6  
key_not_found 7  
duplicated_id 8  
num_errors 9  
[report issue]

session_params

Declared in "libtorrent/session_params.hpp"

The session_params is a parameters pack for configuring the session before it's started.

struct session_params
{
   session_params (settings_pack&& sp);
   session_params (settings_pack const& sp);
   session_params ();
   session_params (settings_pack const& sp
      , std::vector<std::shared_ptr<plugin>> exts);
   session_params (settings_pack&& sp
      , std::vector<std::shared_ptr<plugin>> exts);

   settings_pack settings;
   std::vector<std::shared_ptr<plugin>> extensions;
   dht::dht_state dht_state;
   dht::dht_storage_constructor_type dht_storage_constructor;
   disk_io_constructor_type disk_io_constructor;
   std::map<std::string, std::string> ext_state;
   libtorrent::ip_filter ip_filter;
};
[report issue]

session_params()

session_params (settings_pack&& sp);
session_params (settings_pack const& sp);
session_params ();

This constructor can be used to start with the default plugins (ut_metadata, ut_pex and smart_ban). Pass a settings_pack to set the initial settings when the session starts.

[report issue]

session_params()

session_params (settings_pack const& sp
      , std::vector<std::shared_ptr<plugin>> exts);
session_params (settings_pack&& sp
      , std::vector<std::shared_ptr<plugin>> exts);

This constructor helps to configure the set of initial plugins to be added to the session before it's started.

[report issue]
settings
The settings to configure the session with
[report issue]
extensions
the plugins to add to the session as it is constructed
[report issue]
dht_state
DHT node ID and node addresses to bootstrap the DHT with.
[report issue]
dht_storage_constructor
function object to construct the storage object for DHT items.
[report issue]
disk_io_constructor
function object to create the disk I/O subsystem. Defaults to default_disk_io_constructor.
[report issue]
ext_state
this container can be used by extensions/plugins to store settings. It's primarily here to make it convenient to save and restore state across sessions, using read_session_params() and write_session_params().
[report issue]
ip_filter
the IP filter to use for the session. This restricts which peers are allowed to connect. As if passed to set_ip_filter().
[report issue]

session_handle

Declared in "libtorrent/session_handle.hpp"

this class provides a non-owning handle to a session and a subset of the interface of the session class. If the underlying session is destructed any handle to it will no longer be valid. is_valid() will return false and any operation on it will throw a system_error exception, with error code invalid_session_handle.

struct session_handle
{
   bool is_valid () const;
   session_params session_state (save_state_flags_t flags = save_state_flags_t::all()) const;
   std::vector<torrent_status> get_torrent_status (
      std::function<bool(torrent_status const&)> const& pred
      , status_flags_t flags = {}) const;
   void refresh_torrent_status (std::vector<torrent_status>* ret
      , status_flags_t flags = {}) const;
   void post_torrent_updates (status_flags_t flags = status_flags_t::all());
   void post_session_stats ();
   void post_dht_stats ();
   void set_dht_state (dht::dht_state const& st);
   void set_dht_state (dht::dht_state&& st);
   torrent_handle find_torrent (sha1_hash const& info_hash) const;
   std::vector<torrent_handle> get_torrents () const;
   torrent_handle add_torrent (add_torrent_params const& params);
   void async_add_torrent (add_torrent_params const& params);
   torrent_handle add_torrent (add_torrent_params const& params, error_code& ec);
   torrent_handle add_torrent (add_torrent_params&& params);
   void async_add_torrent (add_torrent_params&& params);
   torrent_handle add_torrent (add_torrent_params&& params, error_code& ec);
   void resume ();
   void pause ();
   bool is_paused () const;
   bool is_dht_running () const;
   void set_dht_storage (dht::dht_storage_constructor_type sc);
   void add_dht_node (std::pair<std::string, int> const& node);
   void dht_get_item (sha1_hash const& target);
   void dht_get_item (std::array<char, 32> key
      , std::string salt = std::string());
   sha1_hash dht_put_item (entry data);
   void dht_put_item (std::array<char, 32> key
      , std::function<void(entry&, std::array<char, 64>&
      , std::int64_t&, std::string const&)> cb
      , std::string salt = std::string());
   void dht_announce (sha1_hash const& info_hash, int port = 0, dht::announce_flags_t flags = {});
   void dht_get_peers (sha1_hash const& info_hash);
   void dht_live_nodes (sha1_hash const& nid);
   void dht_sample_infohashes (udp::endpoint const& ep, sha1_hash const& target);
   void dht_direct_request (udp::endpoint const& ep, entry const& e, client_data_t userdata = {});
   void add_extension (std::shared_ptr<plugin> ext);
   void add_extension (std::function<std::shared_ptr<torrent_plugin>(
      torrent_handle const&, client_data_t)> ext);
   ip_filter get_ip_filter () const;
   void set_ip_filter (ip_filter f);
   void set_port_filter (port_filter const& f);
   unsigned short ssl_listen_port () const;
   unsigned short listen_port () const;
   bool is_listening () const;
   void set_peer_class_filter (ip_filter const& f);
   ip_filter get_peer_class_filter () const;
   peer_class_type_filter get_peer_class_type_filter () const;
   void set_peer_class_type_filter (peer_class_type_filter const& f);
   peer_class_t create_peer_class (char const* name);
   void delete_peer_class (peer_class_t cid);
   void set_peer_class (peer_class_t cid, peer_class_info const& pci);
   peer_class_info get_peer_class (peer_class_t cid) const;
   void remove_torrent (const torrent_handle&, remove_flags_t = {});
   void apply_settings (settings_pack&&);
   settings_pack get_settings () const;
   void apply_settings (settings_pack const&);
   alert* wait_for_alert (time_duration max_wait);
   void pop_alerts (std::vector<alert*>* alerts);
   void set_alert_notify (std::function<void()> const& fun);
   void delete_port_mapping (port_mapping_t handle);
   std::vector<port_mapping_t> add_port_mapping (portmap_protocol t, int external_port, int local_port);
   void reopen_network_sockets (reopen_network_flags_t options = reopen_map_ports);
   std::shared_ptr<aux::session_impl> native_handle () const;

   static constexpr save_state_flags_t save_settings  = 0_bit;
   static constexpr save_state_flags_t save_dht_state  = 2_bit;
   static constexpr save_state_flags_t save_extension_state  = 11_bit;
   static constexpr save_state_flags_t save_ip_filter  = 12_bit;
   static constexpr peer_class_t global_peer_class_id {0};
   static constexpr peer_class_t tcp_peer_class_id {1};
   static constexpr peer_class_t local_peer_class_id {2};
   static constexpr remove_flags_t delete_files  = 0_bit;
   static constexpr remove_flags_t delete_partfile  = 1_bit;
   static constexpr session_flags_t paused  = 2_bit;
   static constexpr portmap_protocol udp  = portmap_protocol::udp;
   static constexpr portmap_protocol tcp  = portmap_protocol::tcp;
   static constexpr reopen_network_flags_t reopen_map_ports  = 0_bit;
};
[report issue]

is_valid()

bool is_valid () const;

returns true if this handle refers to a valid session object. If the session has been destroyed, all session_handle objects will expire and not be valid.

[report issue]

session_state()

session_params session_state (save_state_flags_t flags = save_state_flags_t::all()) const;

returns the current session state. This can be passed to write_session_params() to save the state to disk and restored using read_session_params() when constructing a new session. The kind of state that's included is all settings, the DHT routing table, possibly plugin-specific state. the flags parameter can be used to only save certain parts of the session state

[report issue]

refresh_torrent_status() get_torrent_status()

std::vector<torrent_status> get_torrent_status (
      std::function<bool(torrent_status const&)> const& pred
      , status_flags_t flags = {}) const;
void refresh_torrent_status (std::vector<torrent_status>* ret
      , status_flags_t flags = {}) const;

Note

these calls are potentially expensive and won't scale well with lots of torrents. If you're concerned about performance, consider using post_torrent_updates() instead.

get_torrent_status returns a vector of the torrent_status for every torrent which satisfies pred, which is a predicate function which determines if a torrent should be included in the returned set or not. Returning true means it should be included and false means excluded. The flags argument is the same as to torrent_handle::status(). Since pred is guaranteed to be called for every torrent, it may be used to count the number of torrents of different categories as well.

refresh_torrent_status takes a vector of torrent_status structs (for instance the same vector that was returned by get_torrent_status() ) and refreshes the status based on the handle member. It is possible to use this function by first setting up a vector of default constructed torrent_status objects, only initializing the handle member, in order to request the torrent status for multiple torrents in a single call. This can save a significant amount of time if you have a lot of torrents.

Any torrent_status object whose handle member is not referring to a valid torrent are ignored.

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.

[report issue]

post_torrent_updates()

void post_torrent_updates (status_flags_t flags = status_flags_t::all());

This functions instructs the session to post the state_update_alert, containing the status of all torrents whose state changed since the last time this function was called.

Only torrents who has the state subscription flag set will be included. This flag is on by default. See add_torrent_params. the flags argument is the same as for torrent_handle::status(). see status_flags_t in torrent_handle.

[report issue]

post_session_stats()

void post_session_stats ();

This function will post a session_stats_alert object, containing a snapshot of the performance counters from the internals of libtorrent. To interpret these counters, query the session via session_stats_metrics().

For more information, see the session statistics section.

[report issue]

post_dht_stats()

void post_dht_stats ();

This will cause a dht_stats_alert to be posted.

[report issue]

set_dht_state()

void set_dht_state (dht::dht_state const& st);
void set_dht_state (dht::dht_state&& st);

set the DHT state for the session. This will be taken into account the next time the DHT is started, as if it had been passed in via the session_params on startup.

[report issue]

get_torrents() find_torrent()

torrent_handle find_torrent (sha1_hash const& info_hash) const;
std::vector<torrent_handle> get_torrents () const;

find_torrent() looks for a torrent with the given info-hash. In case there is such a torrent in the session, a torrent_handle to that torrent is returned. In case the torrent cannot be found, an invalid torrent_handle is returned.

See torrent_handle::is_valid() to know if the torrent was found or not.

get_torrents() returns a vector of torrent_handles to all the torrents currently in the session.

[report issue]

async_add_torrent() add_torrent()

torrent_handle add_torrent (add_torrent_params const& params);
void async_add_torrent (add_torrent_params const& params);
torrent_handle add_torrent (add_torrent_params const& params, error_code& ec);
torrent_handle add_torrent (add_torrent_params&& params);
void async_add_torrent (add_torrent_params&& params);
torrent_handle add_torrent (add_torrent_params&& params, error_code& ec);

You add torrents through the add_torrent() function where you give an object with all the parameters. The add_torrent() overloads will block until the torrent has been added (or failed to be added) and returns an error code and a torrent_handle. In order to add torrents more efficiently, consider using async_add_torrent() which returns immediately, without waiting for the torrent to add. Notification of the torrent being added is sent as add_torrent_alert.

The overload that does not take an error_code throws an exception on error and is not available when building without exception support. The torrent_handle returned by add_torrent() can be used to retrieve information about the torrent's progress, its peers etc. It is also used to abort a torrent.

If the torrent you are trying to add already exists in the session (is either queued for checking, being checked or downloading) add_torrent() will throw system_error which derives from std::exception unless duplicate_is_error is set to false. In that case, add_torrent() will return the handle to the existing torrent.

The add_torrent_params class has a flags field. It can be used to control what state the new torrent will be added in. Common flags to want to control are torrent_flags::paused and torrent_flags::auto_managed. In order to add a magnet link that will just download the metadata, but no payload, set the torrent_flags::upload_mode flag.

[report issue]

is_paused() pause() resume()

void resume ();
void pause ();
bool is_paused () const;

Pausing the session has the same effect as pausing every torrent in it, except that torrents will not be resumed by the auto-manage mechanism. Resuming will restore the torrents to their previous paused state. i.e. the session pause state is separate from the torrent pause state. A torrent is inactive if it is paused or if the session is paused.

[report issue]

is_dht_running()

bool is_dht_running () const;

is_dht_running() returns true if the DHT support has been started and false otherwise.

[report issue]

set_dht_storage()

void set_dht_storage (dht::dht_storage_constructor_type sc);

set_dht_storage set a dht custom storage constructor function to be used internally when the dht is created.

Since the dht storage is a critical component for the dht behavior, this function will only be effective the next time the dht is started. If you never touch this feature, a default map-memory based storage is used.

If you want to make sure the dht is initially created with your custom storage, create a session with the setting settings_pack::enable_dht to false, set your constructor function and call apply_settings with settings_pack::enable_dht to true.

[report issue]

add_dht_node()

void add_dht_node (std::pair<std::string, int> const& node);

add_dht_node takes a host name and port pair. That endpoint will be pinged, and if a valid DHT reply is received, the node will be added to the routing table.

[report issue]

dht_get_item()

void dht_get_item (sha1_hash const& target);

query the DHT for an immutable item at the target hash. the result is posted as a dht_immutable_item_alert.

[report issue]

dht_get_item()

void dht_get_item (std::array<char, 32> key
      , std::string salt = std::string());

query the DHT for a mutable item under the public key key. this is an ed25519 key. salt is optional and may be left as an empty string if no salt is to be used. if the item is found in the DHT, a dht_mutable_item_alert is posted.

[report issue]

dht_put_item()

sha1_hash dht_put_item (entry data);

store the given bencoded data as an immutable item in the DHT. the returned hash is the key that is to be used to look the item up again. It's just the SHA-1 hash of the bencoded form of the structure.

[report issue]

dht_put_item()

void dht_put_item (std::array<char, 32> key
      , std::function<void(entry&, std::array<char, 64>&
      , std::int64_t&, std::string const&)> cb
      , std::string salt = std::string());

store a mutable item. The key is the public key the blob is to be stored under. The optional salt argument is a string that is to be mixed in with the key when determining where in the DHT the value is to be stored. The callback function is called from within the libtorrent network thread once we've found where to store the blob, possibly with the current value stored under the key. The values passed to the callback functions are:

entry& value
the current value stored under the key (may be empty). Also expected to be set to the value to be stored by the function.
std::array<char,64>& signature
the signature authenticating the current value. This may be zeros if there is currently no value stored. The function is expected to fill in this buffer with the signature of the new value to store. To generate the signature, you may want to use the sign_mutable_item function.
std::int64_t& seq
current sequence number. May be zero if there is no current value. The function is expected to set this to the new sequence number of the value that is to be stored. Sequence numbers must be monotonically increasing. Attempting to overwrite a value with a lower or equal sequence number will fail, even if the signature is correct.
std::string const& salt
this is the salt that was used for this put call.

Since the callback function cb is called from within libtorrent, it is critical to not perform any blocking operations. Ideally not even locking a mutex. Pass any data required for this function along with the function object's context and make the function entirely self-contained. The only reason data blob's value is computed via a function instead of just passing in the new value is to avoid race conditions. If you want to update the value in the DHT, you must first retrieve it, then modify it, then write it back. The way the DHT works, it is natural to always do a lookup before storing and calling the callback in between is convenient.

[report issue]

dht_announce() dht_get_peers()

void dht_announce (sha1_hash const& info_hash, int port = 0, dht::announce_flags_t flags = {});
void dht_get_peers (sha1_hash const& info_hash);

dht_get_peers() will issue a DHT get_peer request to the DHT for the specified info-hash. The response (the peers) will be posted back in a dht_get_peers_reply_alert.

dht_announce() will issue a DHT announce request to the DHT to the specified info-hash, advertising the specified port. If the port is left at its default, 0, the port will be implied by the DHT message's source port (which may improve connectivity through a NAT).

Both these functions are exposed for advanced custom use of the DHT. All torrents eligible to be announce to the DHT will be automatically, by libtorrent.

For possible flags, see announce_flags_t.

[report issue]

dht_live_nodes()

void dht_live_nodes (sha1_hash const& nid);

Retrieve all the live DHT (identified by nid) nodes. All the nodes id and endpoint will be returned in the list of nodes in the alert dht_live_nodes_alert. Since this alert is a response to an explicit call, it will always be posted, regardless of the alert mask.

[report issue]

dht_sample_infohashes()

void dht_sample_infohashes (udp::endpoint const& ep, sha1_hash const& target);

Query the DHT node specified by ep to retrieve a sample of the info-hashes that the node currently have in their storage. The target is included for iterative lookups so that indexing nodes can perform a key space traversal with a single RPC per node by adjusting the target value for each RPC. It has no effect on the returned sample value. The result is posted as a dht_sample_infohashes_alert.

[report issue]

dht_direct_request()

void dht_direct_request (udp::endpoint const& ep, entry const& e, client_data_t userdata = {});

Send an arbitrary DHT request directly to the specified endpoint. This function is intended for use by plugins. When a response is received or the request times out, a dht_direct_response_alert will be posted with the response (if any) and the userdata pointer passed in here. Since this alert is a response to an explicit call, it will always be posted, regardless of the alert mask.

[report issue]

add_extension()

void add_extension (std::shared_ptr<plugin> ext);
void add_extension (std::function<std::shared_ptr<torrent_plugin>(
      torrent_handle const&, client_data_t)> ext);

This function adds an extension to this session. The argument is a function object that is called with a torrent_handle and which should return a std::shared_ptr<torrent_plugin>. To write custom plugins, see libtorrent plugins. For the typical bittorrent client all of these extensions should be added. The main plugins implemented in libtorrent are:

uTorrent metadata
Allows peers to download the metadata (.torrent files) from the swarm directly. Makes it possible to join a swarm with just a tracker and info-hash.
#include <libtorrent/extensions/ut_metadata.hpp>
ses.add_extension(&lt::create_ut_metadata_plugin);
uTorrent peer exchange
Exchanges peers between clients.
#include <libtorrent/extensions/ut_pex.hpp>
ses.add_extension(&lt::create_ut_pex_plugin);
smart ban plugin
A plugin that, with a small overhead, can ban peers that sends bad data with very high accuracy. Should eliminate most problems on poisoned torrents.
#include <libtorrent/extensions/smart_ban.hpp>
ses.add_extension(&lt::create_smart_ban_plugin);
[report issue]

set_ip_filter() get_ip_filter()

ip_filter get_ip_filter () const;
void set_ip_filter (ip_filter f);

Sets a filter that will be used to reject and accept incoming as well as outgoing connections based on their originating ip address. The default filter will allow connections to any ip address. To build a set of rules for which addresses are accepted and not, see ip_filter.

Each time a peer is blocked because of the IP filter, a peer_blocked_alert is generated. get_ip_filter() Returns the ip_filter currently in the session. See ip_filter.

[report issue]

set_port_filter()

void set_port_filter (port_filter const& f);

apply port_filter f to incoming and outgoing peers. a port filter will reject making outgoing peer connections to certain remote ports. The main intention is to be able to avoid triggering certain anti-virus software by connecting to SMTP, FTP ports.

[report issue]

listen_port() is_listening() ssl_listen_port()

unsigned short ssl_listen_port () const;
unsigned short listen_port () const;
bool is_listening () const;

is_listening() will tell you whether or not the session has successfully opened a listening port. If it hasn't, this function will return false, and then you can set a new settings_pack::listen_interfaces to try another interface and port to bind to.

listen_port() returns the port we ended up listening on.

[report issue]

set_peer_class_filter() get_peer_class_filter()

void set_peer_class_filter (ip_filter const& f);
ip_filter get_peer_class_filter () const;

Sets the peer class filter for this session. All new peer connections will take this into account and be added to the peer classes specified by this filter, based on the peer's IP address.

The ip-filter essentially maps an IP -> uint32. Each bit in that 32 bit integer represents a peer class. The least significant bit represents class 0, the next bit class 1 and so on.

For more info, see ip_filter.

For example, to make all peers in the range 200.1.1.0 - 200.1.255.255 belong to their own peer class, apply the following filter:

ip_filter f = ses.get_peer_class_filter();
peer_class_t my_class = ses.create_peer_class("200.1.x.x IP range");
f.add_rule(make_address("200.1.1.0"), make_address("200.1.255.255")
        , 1 << static_cast<std::uint32_t>(my_class));
ses.set_peer_class_filter(f);

This setting only applies to new connections, it won't affect existing peer connections.

This function is limited to only peer class 0-31, since there are only 32 bits in the IP range mapping. Only the set bits matter; no peer class will be removed from a peer as a result of this call, peer classes are only added.

The peer_class argument cannot be greater than 31. The bitmasks representing peer classes in the peer_class_filter are 32 bits.

The get_peer_class_filter() function returns the current filter.

For more information, see peer classes.

[report issue]

set_peer_class_type_filter() get_peer_class_type_filter()

peer_class_type_filter get_peer_class_type_filter () const;
void set_peer_class_type_filter (peer_class_type_filter const& f);

Sets and gets the peer class type filter. This is controls automatic peer class assignments to peers based on what kind of socket it is.

It does not only support assigning peer classes, it also supports removing peer classes based on socket type.

The order of these rules being applied are:

  1. peer-class IP filter
  2. peer-class type filter, removing classes
  3. peer-class type filter, adding classes

For more information, see peer classes.

[report issue]

create_peer_class()

peer_class_t create_peer_class (char const* name);

Creates a new peer class (see peer classes) with the given name. The returned integer is the new peer class identifier. Peer classes may have the same name, so each invocation of this function creates a new class and returns a unique identifier.

Identifiers are assigned from low numbers to higher. So if you plan on using certain peer classes in a call to set_peer_class_filter(), make sure to create those early on, to get low identifiers.

For more information on peer classes, see peer classes.

[report issue]

delete_peer_class()

void delete_peer_class (peer_class_t cid);

This call dereferences the reference count of the specified peer class. When creating a peer class it's automatically referenced by 1. If you want to recycle a peer class, you may call this function. You may only call this function once per peer class you create. Calling it more than once for the same class will lead to memory corruption.

Since peer classes are reference counted, this function will not remove the peer class if it's still assigned to torrents or peers. It will however remove it once the last peer and torrent drops their references to it.

There is no need to call this function for custom peer classes. All peer classes will be properly destructed when the session object destructs.

For more information on peer classes, see peer classes.

[report issue]

get_peer_class() set_peer_class()

void set_peer_class (peer_class_t cid, peer_class_info const& pci);
peer_class_info get_peer_class (peer_class_t cid) const;

These functions queries information from a peer class and updates the configuration of a peer class, respectively.

cid must refer to an existing peer class. If it does not, the return value of get_peer_class() is undefined.

set_peer_class() sets all the information in the peer_class_info object in the specified peer class. There is no option to only update a single property.

A peer or torrent belonging to more than one class, the highest priority among any of its classes is the one that is taken into account.

For more information, see peer classes.

[report issue]

remove_torrent()

void remove_torrent (const torrent_handle&, remove_flags_t = {});

remove_torrent() will close all peer connections associated with the torrent and tell the tracker that we've stopped participating in the swarm. This operation cannot fail. When it completes, you will receive a torrent_removed_alert.

remove_torrent() is non-blocking, but will remove the torrent from the session synchronously. Calling session_handle::add_torrent() immediately afterward with the same torrent will succeed. Note that this creates a new handle which is not equal to the removed one.

The optional second argument options can be used to delete all the files downloaded by this torrent. To do so, pass in the value session_handle::delete_files. Once the torrent is deleted, a torrent_deleted_alert is posted.

The torrent_handle remains valid for some time after remove_torrent() is called. It will become invalid only after all libtorrent tasks (such as I/O tasks) release their references to the torrent. Until this happens, torrent_handle::is_valid() will return true, and other calls such as torrent_handle::status() will succeed. Because of this, and because remove_torrent() is non-blocking, the following sequence usually succeeds (does not throw system_error): .. code:: c++

session.remove_handle(handle); handle.save_resume_data();

Note that when a queued or downloading torrent is removed, its position in the download queue is vacated and every subsequent torrent in the queue has their queue positions updated. This can potentially cause a large state_update to be posted. When removing all torrents, it is advised to remove them from the back of the queue, to minimize the shifting.

[report issue]

get_settings() apply_settings()

void apply_settings (settings_pack&&);
settings_pack get_settings () const;
void apply_settings (settings_pack const&);

Applies the settings specified by the settings_pack s. This is an asynchronous operation that will return immediately and actually apply the settings to the main thread of libtorrent some time later.

[report issue]

set_alert_notify() pop_alerts() wait_for_alert()

alert* wait_for_alert (time_duration max_wait);
void pop_alerts (std::vector<alert*>* alerts);
void set_alert_notify (std::function<void()> const& fun);

Alerts is the main mechanism for libtorrent to report errors and events. pop_alerts fills in the vector passed to it with pointers to new alerts. The session still owns these alerts and they will stay valid until the next time pop_alerts is called. You may not delete the alert objects.

It is safe to call pop_alerts from multiple different threads, as long as the alerts themselves are not accessed once another thread calls pop_alerts. Doing this requires manual synchronization between the popping threads.

wait_for_alert will block the current thread for max_wait time duration, or until another alert is posted. If an alert is available at the time of the call, it returns immediately. The returned alert pointer is the head of the alert queue. wait_for_alert does not pop alerts from the queue, it merely peeks at it. The returned alert will stay valid until pop_alerts is called twice. The first time will pop it and the second will free it.

If there is no alert in the queue and no alert arrives within the specified timeout, wait_for_alert returns nullptr.

In the python binding, wait_for_alert takes the number of milliseconds to wait as an integer.

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 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 be disabled by the alert_mask. For instance, save_resume_data_alert and save_resume_data_failed_alert are always posted, regardless of the alert mask.

To control which alerts are posted, set the alert_mask (settings_pack::alert_mask).

If the alert queue fills up to the point where alerts are dropped, this will be indicated by a alerts_dropped_alert, which contains a bitmask of which types of alerts were dropped. Generally it is a good idea to make sure the alert queue is large enough, the alert_mask doesn't have unnecessary categories enabled and to call pop_alert() frequently, to avoid alerts being dropped.

the set_alert_notify function lets the client set a function object to be invoked every time the alert queue goes from having 0 alerts to 1 alert. This function is called from within libtorrent, it may be the main thread, or it may be from within a user call. The intention of of the function is that the client wakes up its main thread, to poll for more alerts using pop_alerts(). If the notify function fails to do so, it won't be called again, until pop_alerts is called for some other reason. For instance, it could signal an eventfd, post a message to an HWND or some other main message pump. The actual retrieval of alerts should not be done in the callback. In fact, the callback should not block. It should not perform any expensive work. It really should just notify the main application thread.

The type of an alert is returned by the polymorphic function alert::type() but can also be queries from a concrete type via T::alert_type, as a static constant.

[report issue]

add_port_mapping() delete_port_mapping()

void delete_port_mapping (port_mapping_t handle);
std::vector<port_mapping_t> add_port_mapping (portmap_protocol t, int external_port, int local_port);

add_port_mapping adds one or more port forwards on UPnP and/or NAT-PMP, whichever is enabled. A mapping is created for each listen socket in the session. The return values are all handles referring to the port mappings that were just created. Pass them to delete_port_mapping() to remove them.

[report issue]

reopen_network_sockets()

void reopen_network_sockets (reopen_network_flags_t options = reopen_map_ports);

Instructs the session to reopen all listen and outgoing sockets.

It's useful in the case your platform doesn't support the built in IP notifier mechanism, or if you have a better more reliable way to detect changes in the IP routing table.

[report issue]

native_handle()

std::shared_ptr<aux::session_impl> native_handle () const;

This function is intended only for use by plugins. This type does not have a stable API and should be relied on as little as possible.

[report issue]
save_settings
saves settings (i.e. the settings_pack)
[report issue]
save_dht_state
saves dht state such as nodes and node-id, possibly accelerating joining the DHT if provided at next session startup.
[report issue]
save_extension_state
load or save state from plugins
[report issue]
save_ip_filter
load or save the IP filter set on the session
[report issue]
global_peer_class_id tcp_peer_class_id local_peer_class_id
built-in peer classes
[report issue]
delete_files
delete the files belonging to the torrent from disk. including the part-file, if there is one
[report issue]
delete_partfile
delete just the part-file associated with this torrent
[report issue]
paused
when set, the session will start paused. Call session_handle::resume() to start
[report issue]
udp tcp
protocols used by add_port_mapping()
[report issue]
reopen_map_ports
This option indicates if the ports are mapped using natpmp and upnp. If mapping was already made, they are deleted and added again. This only works if natpmp and/or upnp are configured to be enable.
[report issue]

session_proxy

Declared in "libtorrent/session.hpp"

this is a holder for the internal session implementation object. Once the session destruction is explicitly initiated, this holder is used to synchronize the completion of the shutdown. The lifetime of this object may outlive session, causing the session destructor to not block. The session_proxy destructor will block however, until the underlying session is done shutting down.

struct session_proxy
{
   session_proxy ();
   ~session_proxy ();
   session_proxy (session_proxy const&);
   session_proxy& operator= (session_proxy const&) &;
   session_proxy& operator= (session_proxy&&) & noexcept;
   session_proxy (session_proxy&&) noexcept;
};
[report issue]

operator=() ~session_proxy() session_proxy()

session_proxy ();
~session_proxy ();
session_proxy (session_proxy const&);
session_proxy& operator= (session_proxy const&) &;
session_proxy& operator= (session_proxy&&) & noexcept;
session_proxy (session_proxy&&) noexcept;

default constructor, does not refer to any session implementation object.

[report issue]

session

Declared in "libtorrent/session.hpp"

The session holds all state that spans multiple torrents. Among other things it runs the network loop and manages all torrents. Once it's created, the session object will spawn the main thread that will do all the work. The main thread will be idle as long it doesn't have any torrents to participate in.

You have some control over session configuration through the session_handle::apply_settings() member function. To change one or more configuration options, create a settings_pack. object and fill it with the settings to be set and pass it in to session::apply_settings().

see apply_settings().

struct session : session_handle
{
   session (session_params&& params, session_flags_t flags);
   session ();
   session (session_params const& params, session_flags_t flags);
   explicit session (session_params const& params);
   explicit session (session_params&& params);
   session (session_params&& params, io_context& ios);
   session (session_params const& params, io_context& ios, session_flags_t);
   session (session_params&& params, io_context& ios, session_flags_t);
   session (session_params const& params, io_context& ios);
   ~session ();
   session_proxy abort ();
};
[report issue]

session()

session (session_params&& params, session_flags_t flags);
session ();
session (session_params const& params, session_flags_t flags);
explicit session (session_params const& params);
explicit session (session_params&& params);

Constructs the session objects which acts as the container of torrents. In order to avoid a race condition between starting the session and configuring it, you can pass in a session_params object. Its settings will take effect before the session starts up.

The overloads taking flags can be used to start a session in paused mode (by passing in session::paused). Note that add_default_plugins do not have an affect on constructors that take a session_params object. It already contains the plugins to use.

[report issue]

session()

session (session_params&& params, io_context& ios);
session (session_params const& params, io_context& ios, session_flags_t);
session (session_params&& params, io_context& ios, session_flags_t);
session (session_params const& params, io_context& ios);

Overload of the constructor that takes an external io_context to run the session object on. This is primarily useful for tests that may want to run multiple sessions on a single io_context, or low resource systems where additional threads are expensive and sharing an io_context with other events is fine.

Warning

The session object does not cleanly terminate with an external io_context. The io_context::run() call must have returned before it's safe to destruct the session. Which means you MUST call session::abort() and save the session_proxy first, then destruct the session object, then sync with the io_context, then destruct the session_proxy object.

[report issue]

~session()

~session ();

The destructor of session will notify all trackers that our torrents have been shut down. If some trackers are down, they will time out. All this before the destructor of session returns. So, it's advised that any kind of interface (such as windows) are closed before destructing the session object. Because it can take a few second for it to finish. The timeout can be set with apply_settings().

[report issue]

abort()

session_proxy abort ();

In case you want to destruct the session asynchronously, you can request a session destruction proxy. If you don't do this, the destructor of the session object will block while the trackers are contacted. If you keep one session_proxy to the session when destructing it, the destructor will not block, but start to close down the session, the destructor of the proxy will then synchronize the threads. So, the destruction of the session is performed from the session destructor call until the session_proxy destructor call. The session_proxy does not have any operations on it (since the session is being closed down, no operations are allowed on it). The only valid operation is calling the destructor:

struct session_proxy {};
[report issue]

write_session_params_buf() write_session_params() read_session_params()

Declared in "libtorrent/session_params.hpp"

session_params read_session_params (bdecode_node const& e
   , save_state_flags_t flags = save_state_flags_t::all());
entry write_session_params (session_params const& sp
   , save_state_flags_t flags = save_state_flags_t::all());
std::vector<char> write_session_params_buf (session_params const& sp
   , save_state_flags_t flags = save_state_flags_t::all());
session_params read_session_params (span<char const> buf
   , save_state_flags_t flags = save_state_flags_t::all());

These functions serialize and de-serialize a session_params object to and from bencoded form. The session_params object is used to initialize a new session using the state from a previous one (or by programmatically configure the session up-front). The flags parameter can be used to only save and load certain aspects of the session's state. The _buf suffix indicates the function operates on buffer rather than the bencoded structure. The torrents in a session are not part of the session_params state, they have to be restored separately.

[report issue]

peer_class_info

Declared in "libtorrent/peer_class.hpp"

holds settings for a peer class. Used in set_peer_class() and get_peer_class() calls.

struct peer_class_info
{
   bool ignore_unchoke_slots;
   int connection_limit_factor;
   std::string label;
   int upload_limit;
   int download_limit;
   int upload_priority;
   int download_priority;
};
[report issue]
ignore_unchoke_slots
ignore_unchoke_slots determines whether peers should always unchoke a peer, regardless of the choking algorithm, or if it should honor the unchoke slot limits. It's used for local peers by default. If any of the peer classes a peer belongs to has this set to true, that peer will be unchoked at all times.
[report issue]
connection_limit_factor
adjusts the connection limit (global and per torrent) that applies to this peer class. By default, local peers are allowed to exceed the normal connection limit for instance. This is specified as a percent factor. 100 makes the peer class apply normally to the limit. 200 means as long as there are fewer connections than twice the limit, we accept this peer. This factor applies both to the global connection limit and the per-torrent limit. Note that if not used carefully one peer class can potentially completely starve out all other over time.
[report issue]
label
not used by libtorrent. It's intended as a potentially user-facing identifier of this peer class.
[report issue]
upload_limit download_limit
transfer rates limits for the whole peer class. They are specified in bytes per second and apply to the sum of all peers that are members of this class.
[report issue]
upload_priority download_priority
relative priorities used by the bandwidth allocator in the rate limiter. If no rate limits are in use, the priority is not used either. Priorities start at 1 (0 is not a valid priority) and may not exceed 255.
[report issue]

peer_class_type_filter

Declared in "libtorrent/peer_class_type_filter.hpp"

peer_class_type_filter is a simple container for rules for adding and subtracting peer-classes from peers. It is applied after the peer class filter is applied (which is based on the peer's IP address).

struct peer_class_type_filter
{
   void add (socket_type_t const st, peer_class_t const peer_class);
   void remove (socket_type_t const st, peer_class_t const peer_class);
   void allow (socket_type_t const st, peer_class_t const peer_class);
   void disallow (socket_type_t const st, peer_class_t const peer_class);
   std::uint32_t apply (socket_type_t const st, std::uint32_t peer_class_mask);
   friend bool operator== (peer_class_type_filter const& lhs
      , peer_class_type_filter const& rhs);

   enum socket_type_t
   {
      tcp_socket,
      utp_socket,
      ssl_tcp_socket,
      ssl_utp_socket,
      i2p_socket,
      num_socket_types,
   };
};
[report issue]

remove() add()

void add (socket_type_t const st, peer_class_t const peer_class);
void remove (socket_type_t const st, peer_class_t const peer_class);

add() and remove() adds and removes a peer class to be added to new peers based on socket type.

[report issue]

disallow() allow()

void allow (socket_type_t const st, peer_class_t const peer_class);
void disallow (socket_type_t const st, peer_class_t const peer_class);

disallow() and allow() adds and removes a peer class to be removed from new peers based on socket type.

The peer_class argument cannot be greater than 31. The bitmasks representing peer classes in the peer_class_type_filter are 32 bits.

[report issue]

apply()

std::uint32_t apply (socket_type_t const st, std::uint32_t peer_class_mask);

takes a bitmask of peer classes and returns a new bitmask of peer classes after the rules have been applied, based on the socket type argument (st).

[report issue]

enum socket_type_t

Declared in "libtorrent/peer_class_type_filter.hpp"

name value description
tcp_socket 0 these match the socket types from socket_type.hpp shifted one down
utp_socket 1  
ssl_tcp_socket 2  
ssl_utp_socket 3  
i2p_socket 4  
num_socket_types 5  

libtorrent has a plugin interface for implementing extensions to the protocol. These can be general extensions for transferring metadata or peer exchange extensions, or it could be used to provide a way to customize the protocol to fit a particular (closed) network.

In short, the plugin interface makes it possible to:

  • register extension messages (sent in the extension handshake), see extensions.
  • add data and parse data from the extension handshake.
  • send extension messages and standard bittorrent messages.
  • override or block the handling of standard bittorrent messages.
  • save and restore state via the session state
  • see all alerts that are posted

a word of caution

Writing your own plugin is a very easy way to introduce serious bugs such as dead locks and race conditions. Since a plugin has access to internal structures it is also quite easy to sabotage libtorrent's operation.

All the callbacks are always called from the libtorrent network thread. In case portions of your plugin are called from other threads, typically the main thread, you cannot use any of the member functions on the internal structures in libtorrent, since those require being called from the libtorrent network thread . Furthermore, you also need to synchronize your own shared data within the plugin, to make sure it is not accessed at the same time from the libtorrent thread (through a callback). If you need to send out a message from another thread, it is advised to use an internal queue, and do the actual sending in tick().

Since the plugin interface gives you easy access to internal structures, it is not supported as a stable API. Plugins should be considered specific to a specific version of libtorrent. Although, in practice the internals mostly don't change that dramatically.

plugin-interface

The plugin interface consists of three base classes that the plugin may implement. These are called plugin, torrent_plugin and peer_plugin. They are found in the <libtorrent/extensions.hpp> header.

These plugins are instantiated for each session, torrent and possibly each peer, respectively.

For plugins that only need per torrent state, it is enough to only implement torrent_plugin and pass a constructor function or function object to session::add_extension() or torrent_handle::add_extension() (if the torrent has already been started and you want to hook in the extension at run-time).

The signature of the function is:

std::shared_ptr<torrent_plugin> (*)(torrent_handle const&, client_data_t);

The second argument is the userdata passed to session::add_torrent() or torrent_handle::add_extension().

The function should return a std::shared_ptr<torrent_plugin> which may or may not be 0. If it is a nullptr, the extension is simply ignored for this torrent. If it is a valid pointer (to a class inheriting torrent_plugin), it will be associated with this torrent and callbacks will be made on torrent events.

For more elaborate plugins which require session wide state, you would implement plugin, construct an object (in a std::shared_ptr) and pass it in to session::add_extension().

custom alerts

Since plugins are running within internal libtorrent threads, one convenient way to communicate with the client is to post custom alerts.

The expected interface of any alert, apart from deriving from the alert base class, looks like this:

static const int alert_type = <unique alert ID>;
virtual int type() const { return alert_type; }

virtual std::string message() const;

static const alert_category_t static_category = <bitmask of alert::category_t flags>;
virtual alert_category_t category() const { return static_category; }

virtual char const* what() const { return <string literal of the name of this alert>; }

The alert_type is used for the type-checking in alert_cast. It must not collide with any other alert. The built-in alerts in libtorrent will not use alert type IDs greater than user_alert_id. When defining your own alert, make sure it's greater than this constant.

type() is the run-time equivalence of the alert_type.

The message() virtual function is expected to construct a useful string representation of the alert and the event or data it represents. Something convenient to put in a log file for instance.

clone() is used internally to copy alerts. The suggested implementation of simply allocating a new instance as a copy of *this is all that's expected.

The static category is required for checking whether or not the category for a specific alert is enabled or not, without instantiating the alert. The category virtual function is the run-time equivalence.

The what() virtual function may simply be a string literal of the class name of your alert.

For more information, see the alert section.

[report issue]

plugin

Declared in "libtorrent/extensions.hpp"

this is the base class for a session plugin. One primary feature is that it is notified of all torrents that are added to the session, and can add its own torrent_plugins.

struct plugin
{
   virtual feature_flags_t implemented_features ();
   virtual std::shared_ptr<torrent_plugin> new_torrent (torrent_handle const&, client_data_t);
   virtual void added (session_handle const&);
   virtual void abort ();
   virtual bool on_dht_request (string_view /* query */
      , udp::endpoint const& /* source */, bdecode_node const& /* message */
      , entry& /* response */);
   virtual void on_alert (alert const*);
   virtual bool on_unknown_torrent (info_hash_t const& /* info_hash */
      , peer_connection_handle const& /* pc */, add_torrent_params& /* p */);
   virtual void on_tick ();
   virtual uint64_t get_unchoke_priority (peer_connection_handle const& /* peer */);
   virtual std::map<std::string, std::string> save_state () const;
   virtual void load_state (std::map<std::string, std::string> const&);

   static constexpr feature_flags_t optimistic_unchoke_feature  = 1_bit;
   static constexpr feature_flags_t tick_feature  = 2_bit;
   static constexpr feature_flags_t dht_request_feature  = 3_bit;
   static constexpr feature_flags_t alert_feature  = 4_bit;
};
[report issue]

implemented_features()

virtual feature_flags_t implemented_features ();

This function is expected to return a bitmask indicating which features this plugin implements. Some callbacks on this object may not be called unless the corresponding feature flag is returned here. Note that callbacks may still be called even if the corresponding feature is not specified in the return value here. See feature_flags_t for possible flags to return.

[report issue]

new_torrent()

virtual std::shared_ptr<torrent_plugin> new_torrent (torrent_handle const&, client_data_t);

this is called by the session every time a new torrent is added. The torrent* points to the internal torrent object created for the new torrent. The client_data_t is the userdata pointer as passed in via add_torrent_params.

If the plugin returns a torrent_plugin instance, it will be added to the new torrent. Otherwise, return an empty shared_ptr to a torrent_plugin (the default).

[report issue]

added()

virtual void added (session_handle const&);

called when plugin is added to a session

[report issue]

abort()

virtual void abort ();

called when the session is aborted the plugin should perform any cleanup necessary to allow the session's destruction (e.g. cancel outstanding async operations)

[report issue]

on_dht_request()

virtual bool on_dht_request (string_view /* query */
      , udp::endpoint const& /* source */, bdecode_node const& /* message */
      , entry& /* response */);

called when a dht request is received. If your plugin expects this to be called, make sure to include the flag dht_request_feature in the return value from implemented_features().

[report issue]

on_alert()

virtual void on_alert (alert const*);

called when an alert is posted alerts that are filtered are not posted. If your plugin expects this to be called, make sure to include the flag alert_feature in the return value from implemented_features().

[report issue]

on_unknown_torrent()

virtual bool on_unknown_torrent (info_hash_t const& /* info_hash */
      , peer_connection_handle const& /* pc */, add_torrent_params& /* p */);

return true if the add_torrent_params should be added

[report issue]

on_tick()

virtual void on_tick ();

called once per second. If your plugin expects this to be called, make sure to include the flag tick_feature in the return value from implemented_features().

[report issue]

get_unchoke_priority()

virtual uint64_t get_unchoke_priority (peer_connection_handle const& /* peer */);

called when choosing peers to optimistically unchoke. The return value indicates the peer's priority for unchoking. Lower return values correspond to higher priority. Priorities above 2^63-1 are reserved. If your plugin has no priority to assign a peer it should return 2^64-1. If your plugin expects this to be called, make sure to include the flag optimistic_unchoke_feature in the return value from implemented_features(). If multiple plugins implement this function the lowest return value (i.e. the highest priority) is used.

[report issue]

load_state()

virtual void load_state (std::map<std::string, std::string> const&);

called on startup while loading settings state from the session_params

[report issue]
optimistic_unchoke_feature
include this bit if your plugin needs to alter the order of the optimistic unchoke of peers. i.e. have the on_optimistic_unchoke() callback be called.
[report issue]
tick_feature
include this bit if your plugin needs to have on_tick() called
[report issue]
dht_request_feature
include this bit if your plugin needs to have on_dht_request() called
[report issue]
alert_feature
include this bit if your plugin needs to have on_alert() called
[report issue]

torrent_plugin

Declared in "libtorrent/extensions.hpp"

Torrent plugins are associated with a single torrent and have a number of functions called at certain events. Many of its functions have the ability to change or override the default libtorrent behavior.

struct torrent_plugin
{
   virtual std::shared_ptr<peer_plugin> new_connection (peer_connection_handle const&);
   virtual void on_piece_failed (piece_index_t);
   virtual void on_piece_pass (piece_index_t);
   virtual void tick ();
   virtual bool on_pause ();
   virtual bool on_resume ();
   virtual void on_files_checked ();
   virtual void on_state (torrent_status::state_t);
   virtual void on_add_peer (tcp::endpoint const&,
      peer_source_flags_t, add_peer_flags_t);

   static constexpr add_peer_flags_t first_time  = 1_bit;
   static constexpr add_peer_flags_t filtered  = 2_bit;
};
[report issue]

new_connection()

virtual std::shared_ptr<peer_plugin> new_connection (peer_connection_handle const&);

This function is called each time a new peer is connected to the torrent. You may choose to ignore this by just returning a default constructed shared_ptr (in which case you don't need to override this member function).

If you need an extension to the peer connection (which most plugins do) you are supposed to return an instance of your peer_plugin class. Which in turn will have its hook functions called on event specific to that peer.

The peer_connection_handle will be valid as long as the shared_ptr is being held by the torrent object. So, it is generally a good idea to not keep a shared_ptr to your own peer_plugin. If you want to keep references to it, use weak_ptr.

If this function throws an exception, the connection will be closed.

[report issue]

on_piece_pass() on_piece_failed()

virtual void on_piece_failed (piece_index_t);
virtual void on_piece_pass (piece_index_t);

These hooks are called when a piece passes the hash check or fails the hash check, respectively. The index is the piece index that was downloaded. It is possible to access the list of peers that participated in sending the piece through the torrent and the piece_picker.

[report issue]

tick()

virtual void tick ();

This hook is called approximately once per second. It is a way of making it easy for plugins to do timed events, for sending messages or whatever.

[report issue]

on_resume() on_pause()

virtual bool on_pause ();
virtual bool on_resume ();

These hooks are called when the torrent is paused and resumed respectively. The return value indicates if the event was handled. A return value of true indicates that it was handled, and no other plugin after this one will have this hook function called, and the standard handler will also not be invoked. So, returning true effectively overrides the standard behavior of pause or resume.

Note that if you call pause() or resume() on the torrent from your handler it will recurse back into your handler, so in order to invoke the standard handler, you have to keep your own state on whether you want standard behavior or overridden behavior.

[report issue]

on_files_checked()

virtual void on_files_checked ();

This function is called when the initial files of the torrent have been checked. If there are no files to check, this function is called immediately.

i.e. This function is always called when the torrent is in a state where it can start downloading.

[report issue]

on_state()

virtual void on_state (torrent_status::state_t);

called when the torrent changes state the state is one of torrent_status::state_t enum members

[report issue]

on_add_peer()

virtual void on_add_peer (tcp::endpoint const&,
      peer_source_flags_t, add_peer_flags_t);

called every time a new peer is added to the peer list. This is before the peer is connected to. For flags, see torrent_plugin::flags_t. The source argument refers to the source where we learned about this peer from. It's a bitmask, because many sources may have told us about the same peer. For peer source flags, see peer_info::peer_source_flags.

[report issue]
first_time
this is the first time we see this peer
[report issue]
filtered
this peer was not added because it was filtered by the IP filter
[report issue]

peer_plugin

Declared in "libtorrent/extensions.hpp"

peer plugins are associated with a specific peer. A peer could be both a regular bittorrent peer (bt_peer_connection) or one of the web seed connections (web_peer_connection or http_seed_connection). In order to only attach to certain peers, make your torrent_plugin::new_connection only return a plugin for certain peer connection types

struct peer_plugin
{
   virtual string_view type () const;
   virtual void add_handshake (entry&);
   virtual void on_disconnect (error_code const&);
   virtual void on_connected ();
   virtual bool on_handshake (span<char const>);
   virtual bool on_extension_handshake (bdecode_node const&);
   virtual bool on_unchoke ();
   virtual bool on_allowed_fast (piece_index_t);
   virtual bool on_have_none ();
   virtual bool on_choke ();
   virtual bool on_dont_have (piece_index_t);
   virtual bool on_request (peer_request const&);
   virtual bool on_not_interested ();
   virtual bool on_interested ();
   virtual bool on_have (piece_index_t);
   virtual bool on_bitfield (bitfield const& /*bitfield*/);
   virtual bool on_have_all ();
   virtual bool on_piece (peer_request const& /*piece*/
      , span<char const> /*buf*/);
   virtual bool on_suggest (piece_index_t);
   virtual bool on_cancel (peer_request const&);
   virtual bool on_reject (peer_request const&);
   virtual void sent_have_all ();
   virtual void sent_cancel (peer_request const&);
   virtual void sent_request (peer_request const&);
   virtual void sent_reject_request (peer_request const&);
   virtual void sent_allow_fast (piece_index_t);
   virtual void sent_suggest (piece_index_t);
   virtual void sent_choke ();
   virtual void sent_have_none ();
   virtual void sent_piece (peer_request const&);
   virtual void sent_have (piece_index_t);
   virtual void sent_unchoke ();
   virtual void sent_interested ();
   virtual void sent_not_interested ();
   virtual void sent_payload (int /* bytes */);
   virtual bool can_disconnect (error_code const& /*ec*/);
   virtual bool on_extended (int /*length*/, int /*msg*/,
      span<char const> /*body*/);
   virtual bool on_unknown_message (int /*length*/, int /*msg*/,
      span<char const> /*body*/);
   virtual void on_piece_failed (piece_index_t);
   virtual void on_piece_pass (piece_index_t);
   virtual void tick ();
   virtual bool write_request (peer_request const&);
};
[report issue]

type()

virtual string_view type () const;

This function is expected to return the name of the plugin.

[report issue]

add_handshake()

virtual void add_handshake (entry&);

can add entries to the extension handshake this is not called for web seeds

[report issue]

on_disconnect()

virtual void on_disconnect (error_code const&);

called when the peer is being disconnected.

[report issue]

on_connected()

virtual void on_connected ();

called when the peer is successfully connected. Note that incoming connections will have been connected by the time the peer plugin is attached to it, and won't have this hook called.

[report issue]

on_handshake()

virtual bool on_handshake (span<char const>);

this is called when the initial bittorrent handshake is received. Returning false means that the other end doesn't support this extension and will remove it from the list of plugins. this is not called for web seeds

[report issue]

on_extension_handshake()

virtual bool on_extension_handshake (bdecode_node const&);

called when the extension handshake from the other end is received if this returns false, it means that this extension isn't supported by this peer. It will result in this peer_plugin being removed from the peer_connection and destructed. this is not called for web seeds

[report issue]

on_interested() on_allowed_fast() on_not_interested() on_choke() on_have_none() on_have_all() on_bitfield() on_dont_have() on_request() on_have() on_unchoke()

virtual bool on_unchoke ();
virtual bool on_allowed_fast (piece_index_t);
virtual bool on_have_none ();
virtual bool on_choke ();
virtual bool on_dont_have (piece_index_t);
virtual bool on_request (peer_request const&);
virtual bool on_not_interested ();
virtual bool on_interested ();
virtual bool on_have (piece_index_t);
virtual bool on_bitfield (bitfield const& /*bitfield*/);
virtual bool on_have_all ();

returning true from any of the message handlers indicates that the plugin has handled the message. it will break the plugin chain traversing and not let anyone else handle the message, including the default handler.

[report issue]

on_piece()

virtual bool on_piece (peer_request const& /*piece*/
      , span<char const> /*buf*/);

This function is called when the peer connection is receiving a piece. buf points (non-owning pointer) to the data in an internal immutable disk buffer. The length of the data is specified in the length member of the piece parameter. returns true to indicate that the piece is handled and the rest of the logic should be ignored.

[report issue]

sent_piece() sent_interested() sent_not_interested() sent_unchoke() sent_have()

virtual void sent_piece (peer_request const&);
virtual void sent_have (piece_index_t);
virtual void sent_unchoke ();
virtual void sent_interested ();
virtual void sent_not_interested ();

called after a choke message has been sent to the peer

[report issue]

sent_payload()

virtual void sent_payload (int /* bytes */);

called after piece data has been sent to the peer this can be used for stats book keeping

[report issue]

can_disconnect()

virtual bool can_disconnect (error_code const& /*ec*/);

called when libtorrent think this peer should be disconnected. if the plugin returns false, the peer will not be disconnected.

[report issue]

on_extended()

virtual bool on_extended (int /*length*/, int /*msg*/,
      span<char const> /*body*/);

called when an extended message is received. If returning true, the message is not processed by any other plugin and if false is returned the next plugin in the chain will receive it to be able to handle it. This is not called for web seeds. thus function may be called more than once per incoming message, but only the last of the calls will the body size equal the length. i.e. Every time another fragment of the message is received, this function will be called, until finally the whole message has been received. The purpose of this is to allow early disconnects for invalid messages and for reporting progress of receiving large messages.

[report issue]

on_unknown_message()

virtual bool on_unknown_message (int /*length*/, int /*msg*/,
      span<char const> /*body*/);

this is not called for web seeds

[report issue]

on_piece_pass() on_piece_failed()

virtual void on_piece_failed (piece_index_t);
virtual void on_piece_pass (piece_index_t);

called when a piece that this peer participated in either fails or passes the hash_check

[report issue]

tick()

virtual void tick ();

called approximately once every second

[report issue]

write_request()

virtual bool write_request (peer_request const&);

called each time a request message is to be sent. If true is returned, the original request message won't be sent and no other plugin will have this function called.

[report issue]

crypto_plugin

Declared in "libtorrent/extensions.hpp"

struct crypto_plugin
{
   virtual void set_outgoing_key (span<char const> key) = 0;
   virtual void set_incoming_key (span<char const> key) = 0;
   encrypt (span<span<char>> /*send_vec*/) = 0;
   virtual std::tuple<int, int, int> decrypt (span<span<char>> /*receive_vec*/) = 0;
};
[report issue]

decrypt()

virtual std::tuple<int, int, int> decrypt (span<span<char>> /*receive_vec*/) = 0;

decrypt the provided buffers. returns is a tuple representing the values (consume, produce, packet_size)

consume is set to the number of bytes which should be trimmed from the head of the buffers, default is 0

produce is set to the number of bytes of payload which are now ready to be sent to the upper layer. default is the number of bytes passed in receive_vec

packet_size is set to the minimum number of bytes which must be read to advance the next step of decryption. default is 0

[report issue]

peer_connection_handle

Declared in "libtorrent/peer_connection_handle.hpp"

the peer_connection_handle class provides a handle to the internal peer connection object, to be used by plugins. This is a low level interface that may not be stable across libtorrent versions

struct peer_connection_handle
{
   explicit peer_connection_handle (std::weak_ptr<peer_connection> impl);
   connection_type type () const;
   peer_plugin const* find_plugin (string_view type) const;
   void add_extension (std::shared_ptr<peer_plugin>);
   bool is_seed () const;
   bool upload_only () const;
   bool has_piece (piece_index_t i) const;
   peer_id const& pid () const;
   bool is_choked () const;
   bool is_interesting () const;
   bool has_peer_choked () const;
   bool is_peer_interested () const;
   void choke_this_peer ();
   void maybe_unchoke_this_peer ();
   void get_peer_info (peer_info& p) const;
   torrent_handle associated_torrent () const;
   tcp::endpoint local_endpoint () const;
   tcp::endpoint const& remote () const;
   void disconnect (error_code const& ec, operation_t op
      , disconnect_severity_t = peer_connection_interface::normal);
   bool is_outgoing () const;
   bool is_disconnecting () const;
   bool is_connecting () const;
   bool on_local_network () const;
   bool ignore_unchoke_slots () const;
   bool failed () const;
   bool should_log (peer_log_alert::direction_t direction) const;
   void peer_log (peer_log_alert::direction_t direction
      , char const* event, char const* fmt = "", ...) const TORRENT_FORMAT(4,5);
   bool can_disconnect (error_code const& ec) const;
   bool has_metadata () const;
   bool in_handshake () const;
   void send_buffer (char const* begin, int size);
   time_point time_of_last_unchoke () const;
   std::time_t last_seen_complete () const;
   bool operator!= (peer_connection_handle const& o) const;
   bool operator< (peer_connection_handle const& o) const;
   bool operator== (peer_connection_handle const& o) const;
   std::shared_ptr<peer_connection> native_handle () const;
};
[report issue]

bt_peer_connection_handle

Declared in "libtorrent/peer_connection_handle.hpp"

The bt_peer_connection_handle provides a handle to the internal bittorrent peer connection object to plugins. It's low level and may not be a stable API across libtorrent versions.

struct bt_peer_connection_handle : peer_connection_handle
{
   explicit bt_peer_connection_handle (peer_connection_handle pc);
   bool packet_finished () const;
   bool support_extensions () const;
   bool supports_encryption () const;
   void switch_send_crypto (std::shared_ptr<crypto_plugin> crypto);
   void switch_recv_crypto (std::shared_ptr<crypto_plugin> crypto);
   std::shared_ptr<bt_peer_connection> native_handle () const;
};
[report issue]

create_ut_metadata_plugin()

Declared in "libtorrent/extensions/ut_metadata.hpp"

std::shared_ptr<torrent_plugin> create_ut_metadata_plugin (torrent_handle const&, client_data_t);

constructor function for the ut_metadata extension. The ut_metadata extension allows peers to request the .torrent file (or more specifically the info-dictionary of the .torrent file) from each other. This is the main building block in making magnet links work. This extension is enabled by default unless explicitly disabled in the session constructor.

This can either be passed in the add_torrent_params::extensions field, or via torrent_handle::add_extension().

[report issue]

create_smart_ban_plugin()

Declared in "libtorrent/extensions/smart_ban.hpp"

std::shared_ptr<torrent_plugin> create_smart_ban_plugin (torrent_handle const&, client_data_t);

constructor function for the smart ban extension. The extension keeps track of the data peers have sent us for failing pieces and once the piece completes and passes the hash check bans the peers that turned out to have sent corrupt data. This function can either be passed in the add_torrent_params::extensions field, or via torrent_handle::add_extension().

[report issue]

create_ut_pex_plugin()

Declared in "libtorrent/extensions/ut_pex.hpp"

std::shared_ptr<torrent_plugin> create_ut_pex_plugin (torrent_handle const&, client_data_t);

constructor function for the ut_pex extension. The ut_pex extension allows peers to gossip about their connections, allowing the swarm stay well connected and peers aware of more peers in the swarm. This extension is enabled by default unless explicitly disabled in the session constructor.

This can either be passed in the add_torrent_params::extensions field, or via torrent_handle::add_extension().

[report issue]

info_hash_t

Declared in "libtorrent/info_hash.hpp"

class holding the info-hash of a torrent. It can hold a v1 info-hash (SHA-1) or a v2 info-hash (SHA-256) or both.

Note

If has_v2() is false then the v1 hash might actually be a truncated v2 hash

struct info_hash_t
{
   info_hash_t (sha1_hash h1, sha256_hash h2) noexcept;
   explicit info_hash_t (sha256_hash h2) noexcept;
   explicit info_hash_t (sha1_hash h1) noexcept;
   info_hash_t () noexcept = default;
   bool has_v2 () const;
   bool has (protocol_version v) const;
   bool has_v1 () const;
   sha1_hash get (protocol_version v) const;
   sha1_hash get_best () const;
   friend bool operator!= (info_hash_t const& lhs, info_hash_t const& rhs);
   friend bool operator== (info_hash_t const& lhs, info_hash_t const& rhs) noexcept;
   template <typename F> void for_each (F f) const;
   bool operator< (info_hash_t const& o) const;
   friend std::ostream& operator<< (std::ostream& os, info_hash_t const& ih);

   sha1_hash v1;
   sha256_hash v2;
};
[report issue]

info_hash_t()

info_hash_t (sha1_hash h1, sha256_hash h2) noexcept;
explicit info_hash_t (sha256_hash h2) noexcept;
explicit info_hash_t (sha1_hash h1) noexcept;
info_hash_t () noexcept = default;

The default constructor creates an object that has neither a v1 or v2 hash.

For backwards compatibility, make it possible to construct directly from a v1 hash. This constructor allows implicit conversion from a v1 hash, but the implicitness is deprecated.

[report issue]

has_v1() has_v2() has()

bool has_v2 () const;
bool has (protocol_version v) const;
bool has_v1 () const;

returns true if the corresponding info hash is present in this object.

[report issue]

get()

sha1_hash get (protocol_version v) const;

returns the has for the specified protocol version

[report issue]

get_best()

sha1_hash get_best () const;

returns the v2 (truncated) info-hash, if there is one, otherwise returns the v1 info-hash

[report issue]

for_each()

template <typename F> void for_each (F f) const;

calls the function object f for each hash that is available. starting with v1. The signature of F is:

void(sha1_hash, protocol_version);
[report issue]

piece_block

Declared in "libtorrent/piece_block.hpp"

struct piece_block
{
   piece_block (piece_index_t p_index, int b_index);
   piece_block () = default;
   bool operator< (piece_block const& b) const;
   bool operator== (piece_block const& b) const;
   bool operator!= (piece_block const& b) const;

   static const piece_block invalid;
   piece_index_t piece_index {0};
   int block_index  = 0;
};
[report issue]

peer_info

Declared in "libtorrent/peer_info.hpp"

holds information and statistics about one peer that libtorrent is connected to

struct peer_info
{
   std::string client;
   typed_bitfield<piece_index_t> pieces;
   std::int64_t total_download;
   std::int64_t total_upload;
   time_duration last_request;
   time_duration last_active;
   time_duration download_queue_time;
   static constexpr peer_flags_t interesting  = 0_bit;
   static constexpr peer_flags_t choked  = 1_bit;
   static constexpr peer_flags_t remote_interested  = 2_bit;
   static constexpr peer_flags_t remote_choked  = 3_bit;
   static constexpr peer_flags_t supports_extensions  = 4_bit;
   static constexpr peer_flags_t outgoing_connection  = 5_bit;
   static constexpr peer_flags_t local_connection  = 5_bit;
   static constexpr peer_flags_t handshake  = 6_bit;
   static constexpr peer_flags_t connecting  = 7_bit;
   static constexpr peer_flags_t on_parole  = 9_bit;
   static constexpr peer_flags_t seed  = 10_bit;
   static constexpr peer_flags_t optimistic_unchoke  = 11_bit;
   static constexpr peer_flags_t snubbed  = 12_bit;
   static constexpr peer_flags_t upload_only  = 13_bit;
   static constexpr peer_flags_t endgame_mode  = 14_bit;
   static constexpr peer_flags_t holepunched  = 15_bit;
   static constexpr peer_flags_t i2p_socket  = 16_bit;
   static constexpr peer_flags_t utp_socket  = 17_bit;
   static constexpr peer_flags_t ssl_socket  = 18_bit;
   static constexpr peer_flags_t rc4_encrypted  = 19_bit;
   static constexpr peer_flags_t plaintext_encrypted  = 20_bit;
   peer_flags_t flags;
   static constexpr peer_source_flags_t tracker  = 0_bit;
   static constexpr peer_source_flags_t dht  = 1_bit;
   static constexpr peer_source_flags_t pex  = 2_bit;
   static constexpr peer_source_flags_t lsd  = 3_bit;
   static constexpr peer_source_flags_t resume_data  = 4_bit;
   static constexpr peer_source_flags_t incoming  = 5_bit;
   peer_source_flags_t source;
   int up_speed;
   int down_speed;
   int payload_up_speed;
   int payload_down_speed;
   peer_id pid;
   int queue_bytes;
   int request_timeout;
   int send_buffer_size;
   int used_send_buffer;
   int receive_buffer_size;
   int used_receive_buffer;
   int receive_buffer_watermark;
   int num_hashfails;
   int download_queue_length;
   int timed_out_requests;
   int busy_requests;
   int requests_in_buffer;
   int target_dl_queue_length;
   int upload_queue_length;
   int failcount;
   piece_index_t downloading_piece_index;
   int downloading_block_index;
   int downloading_progress;
   int downloading_total;
   static constexpr connection_type_t standard_bittorrent  = 0_bit;
   static constexpr connection_type_t web_seed  = 1_bit;
   static constexpr connection_type_t http_seed  = 2_bit;
   connection_type_t connection_type;
   int pending_disk_bytes;
   int pending_disk_read_bytes;
   int send_quota;
   int receive_quota;
   int rtt;
   int num_pieces;
   int download_rate_peak;
   int upload_rate_peak;
   float progress;
   int progress_ppm;
   tcp::endpoint ip;
   tcp::endpoint local_endpoint;
   static constexpr bandwidth_state_flags_t bw_idle  = 0_bit;
   static constexpr bandwidth_state_flags_t bw_limit  = 1_bit;
   static constexpr bandwidth_state_flags_t bw_network  = 2_bit;
   static constexpr bandwidth_state_flags_t bw_disk  = 4_bit;
   bandwidth_state_flags_t read_state;
   bandwidth_state_flags_t write_state;
};
[report issue]
client
A human readable string describing the software at the other end of the connection. In some cases this information is not available, then it will contain a string that may give away something about which software is running in the other end. In the case of a web seed, the server type and version will be a part of this string. This is UTF-8 encoded.
[report issue]
pieces
a bitfield, with one bit per piece in the torrent. Each bit tells you if the peer has that piece (if it's set to 1) or if the peer miss that piece (set to 0).
[report issue]
total_download total_upload
the total number of bytes downloaded from and uploaded to this peer. These numbers do not include the protocol chatter, but only the payload data.
[report issue]
last_request last_active
the time since we last sent a request to this peer and since any transfer occurred with this peer
[report issue]
download_queue_time
the time until all blocks in the request queue will be downloaded
[report issue]
interesting
we are interested in pieces from this peer.
[report issue]
choked
we have choked this peer.
[report issue]
remote_interested
the peer is interested in us
[report issue]
remote_choked
the peer has choked us.
[report issue]
supports_extensions
means that this peer supports the extension protocol.
[report issue]
outgoing_connection
The connection was initiated by us, the peer has a listen port open, and that port is the same as in the address of this peer. If this flag is not set, this peer connection was opened by this peer connecting to us.
[report issue]
local_connection
deprecated synonym for outgoing_connection
[report issue]
handshake
The connection is opened, and waiting for the handshake. Until the handshake is done, the peer cannot be identified.
[report issue]
connecting
The connection is in a half-open state (i.e. it is being connected).
[report issue]
on_parole
The peer has participated in a piece that failed the hash check, and is now "on parole", which means we're only requesting whole pieces from this peer until it either fails that piece or proves that it doesn't send bad data.
[report issue]
seed
This peer is a seed (it has all the pieces).
[report issue]
optimistic_unchoke
This peer is subject to an optimistic unchoke. It has been unchoked for a while to see if it might unchoke us in return an earn an upload/unchoke slot. If it doesn't within some period of time, it will be choked and another peer will be optimistically unchoked.
[report issue]
snubbed
This peer has recently failed to send a block within the request timeout from when the request was sent. We're currently picking one block at a time from this peer.
[report issue]
upload_only
This peer has either explicitly (with an extension) or implicitly (by becoming a seed) told us that it will not downloading anything more, regardless of which pieces we have.
[report issue]
endgame_mode
This means the last time this peer picket a piece, it could not pick as many as it wanted because there were not enough free ones. i.e. all pieces this peer has were already requested from other peers.
[report issue]
holepunched
This flag is set if the peer was in holepunch mode when the connection succeeded. This typically only happens if both peers are behind a NAT and the peers connect via the NAT holepunch mechanism.
[report issue]
i2p_socket
indicates that this socket is running on top of the I2P transport.
[report issue]
utp_socket
indicates that this socket is a uTP socket
[report issue]
ssl_socket
indicates that this socket is running on top of an SSL (TLS) channel
[report issue]
rc4_encrypted
this connection is obfuscated with RC4
[report issue]
plaintext_encrypted
the handshake of this connection was obfuscated with a Diffie-Hellman exchange
[report issue]
flags
tells you in which state the peer is in. It is set to any combination of the peer_flags_t flags above.
[report issue]
tracker
The peer was received from the tracker.
[report issue]
dht
The peer was received from the kademlia DHT.
[report issue]
pex
The peer was received from the peer exchange extension.
[report issue]
lsd
The peer was received from the local service discovery (The peer is on the local network).
[report issue]
resume_data
The peer was added from the fast resume data.
[report issue]
incoming
we received an incoming connection from this peer
[report issue]
source
a combination of flags describing from which sources this peer was received. A combination of the peer_source_flags_t above.
[report issue]
up_speed down_speed
the current upload and download speed we have to and from this peer (including any protocol messages). updated about once per second
[report issue]
payload_up_speed payload_down_speed
The transfer rates of payload data only updated about once per second
[report issue]
pid
the peer's id as used in the bit torrent protocol. This id can be used to extract 'fingerprints' from the peer. Sometimes it can tell you which client the peer is using. See identify_client()_
[report issue]
queue_bytes
the number of bytes we have requested from this peer, but not yet received.
[report issue]
request_timeout
the number of seconds until the current front piece request will time out. This timeout can be adjusted through settings_pack::request_timeout. -1 means that there is not outstanding request.
[report issue]
send_buffer_size used_send_buffer
the number of bytes allocated and used for the peer's send buffer, respectively.
[report issue]
receive_buffer_size used_receive_buffer receive_buffer_watermark
the number of bytes allocated and used as receive buffer, respectively.
[report issue]
num_hashfails
the number of pieces this peer has participated in sending us that turned out to fail the hash check.
[report issue]
download_queue_length
this is the number of requests we have sent to this peer that we haven't got a response for yet
[report issue]
timed_out_requests
the number of block requests that have timed out, and are still in the download queue
[report issue]
busy_requests
the number of busy requests in the download queue. A busy request is a request for a block we've also requested from a different peer
[report issue]
requests_in_buffer
the number of requests messages that are currently in the send buffer waiting to be sent.
[report issue]
target_dl_queue_length
the number of requests that is tried to be maintained (this is typically a function of download speed)
[report issue]
upload_queue_length
the number of piece-requests we have received from this peer that we haven't answered with a piece yet.
[report issue]
failcount
the number of times this peer has "failed". i.e. failed to connect or disconnected us. The failcount is decremented when we see this peer in a tracker response or peer exchange message.
[report issue]
downloading_piece_index downloading_block_index downloading_progress downloading_total
You can know which piece, and which part of that piece, that is currently being downloaded from a specific peer by looking at these four members. downloading_piece_index is the index of the piece that is currently being downloaded. This may be set to -1 if there's currently no piece downloading from this peer. If it is >= 0, the other three members are valid. downloading_block_index is the index of the block (or sub-piece) that is being downloaded. downloading_progress is the number of bytes of this block we have received from the peer, and downloading_total is the total number of bytes in this block.
[report issue]
standard_bittorrent
Regular bittorrent connection
[report issue]
web_seed
HTTP connection using the BEP 19 protocol
[report issue]
http_seed
HTTP connection using the BEP 17 protocol
[report issue]
connection_type
the kind of connection this peer uses. See connection_type_t.
[report issue]
pending_disk_bytes
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 settings_pack::max_queued_disk_bytes.
[report issue]
pending_disk_read_bytes
number of outstanding bytes to read from disk
[report issue]
send_quota receive_quota
the number of bytes this peer has been assigned to be allowed to send and receive until it has to request more quota from the bandwidth manager.
[report issue]
rtt
an estimated round trip time to this peer, in milliseconds. It is estimated by timing the TCP connect(). It may be 0 for incoming connections.
[report issue]
num_pieces
the number of pieces this peer has.
[report issue]
download_rate_peak upload_rate_peak
the highest download and upload rates seen on this connection. They are given in bytes per second. This number is reset to 0 on reconnect.
[report issue]
progress
the progress of the peer in the range [0, 1]. This is always 0 when floating point operations are disabled, instead use progress_ppm.
[report issue]
progress_ppm
indicates the download progress of the peer in the range [0, 1000000] (parts per million).
[report issue]
ip
the IP-address to this peer. The type is an asio endpoint. For more info, see the asio documentation.
[report issue]
local_endpoint
the IP and port pair the socket is bound to locally. i.e. the IP address of the interface it's going out over. This may be useful for multi-homed clients with multiple interfaces to the internet.
[report issue]
bw_idle
The peer is not waiting for any external events to send or receive data.
[report issue]
bw_limit
The peer is waiting for the rate limiter.
[report issue]
bw_network
The peer has quota and is currently waiting for a network read or write operation to complete. This is the state all peers are in if there are no bandwidth limits.
[report issue]
bw_disk
The peer is waiting for the disk I/O thread to catch up writing buffers to disk before downloading more.
[report issue]
read_state write_state
bitmasks indicating what state this peer is in with regards to sending and receiving data. The states are defined as independent flags of type bandwidth_state_flags_t, in this class.
[report issue]

peer_request

Declared in "libtorrent/peer_request.hpp"

represents a byte range within a piece. Internally this is is used for incoming piece requests.

struct peer_request
{
   bool operator== (peer_request const& r) const;

   piece_index_t piece;
   int start;
   int length;
};
[report issue]

operator==()

bool operator== (peer_request const& r) const;

returns true if the right hand side peer_request refers to the same range as this does.

[report issue]
piece
The index of the piece in which the range starts.
[report issue]
start
The byte offset within that piece where the range starts.
[report issue]
length
The size of the range, in bytes.
[report issue]

make_magnet_uri()

Declared in "libtorrent/magnet_uri.hpp"

std::string make_magnet_uri (torrent_info const& info);
std::string make_magnet_uri (torrent_handle const& handle);

Generates a magnet URI from the specified torrent. If the torrent handle is invalid, an empty string is returned.

For more information about magnet links, see magnet links.

[report issue]

parse_magnet_uri()

Declared in "libtorrent/magnet_uri.hpp"

add_torrent_params parse_magnet_uri (string_view uri);
add_torrent_params parse_magnet_uri (string_view uri, error_code& ec);
void parse_magnet_uri (string_view uri, add_torrent_params& p, error_code& ec);

This function parses out information from the magnet link and populates the add_torrent_params object. The overload that does not take an error_code reference will throw a system_error on error The overload taking an add_torrent_params reference will fill in the fields specified in the magnet URI.

[report issue]

version()

Declared in "libtorrent/version.hpp"

char const* version ();

returns the libtorrent version as string form in this format: "<major>.<minor>.<tiny>.<tag>"

[report issue]

enum connection_type

Declared in "libtorrent/peer_connection.hpp"

name value description
bittorrent 0  
url_seed 1  
http_seed 2  
[report issue]

enum protocol_version

Declared in "libtorrent/info_hash.hpp"

name value description
V1 0 The original BitTorrent version, using SHA-1 hashes
V2 1 Version 2 of the BitTorrent protocol, using SHA-256 hashes
NUM 2  
[report issue]

enum socket_type_t

Declared in "libtorrent/socket_type.hpp"

name value description
tcp 0  
socks5 1  
http 2  
utp 3  
i2p 4  
tcp_ssl 5  
socks5_ssl 6  
http_ssl 7  
utp_ssl 8  
[report issue]

enum portmap_transport

Declared in "libtorrent/portmap.hpp"

name value description
natpmp 0 natpmp can be NAT-PMP or PCP
upnp 1  
[report issue]

enum portmap_protocol

Declared in "libtorrent/portmap.hpp"

name value description
none 0  
tcp 1  
udp 2  
[report issue]

enum event_t

Declared in "libtorrent/tracker_manager.hpp"

name value description
none 0  
completed 1  
started 2  
stopped 3  
paused 4  
[report issue]

torrent_flags_t

Declared in "libtorrent/torrent_flags.hpp"

seed_mode

If seed_mode is set, libtorrent will assume that all files are present for this torrent and that they all match the hashes in the torrent file. Each time a peer requests to download a block, the piece is verified against the hash, unless it has been verified already. If a hash fails, the torrent will automatically leave the seed mode and recheck all the files. The use case for this mode is if a torrent is created and seeded, or if the user already know that the files are complete, this is a way to avoid the initial file checks, and significantly reduce the startup time.

Setting seed_mode on a torrent without metadata (a .torrent file) is a no-op and will be ignored.

It is not possible to set the seed_mode flag on a torrent after it has been added to a session. It is possible to clear it though.

upload_mode

If upload_mode is set, the torrent will be initialized in upload-mode, which means it will not make any piece requests. This state is typically entered on disk I/O errors, and if the torrent is also auto managed, it will be taken out of this state periodically (see settings_pack::optimistic_disk_retry).

This mode can be used to avoid race conditions when adjusting priorities of pieces before allowing the torrent to start downloading.

If the torrent is auto-managed (auto_managed), the torrent will eventually be taken out of upload-mode, regardless of how it got there. If it's important to manually control when the torrent leaves upload mode, don't make it auto managed.

share_mode

determines if the torrent should be added in share mode or not. Share mode indicates that we are not interested in downloading the torrent, but merely want to improve our share ratio (i.e. increase it). A torrent started in share mode will do its best to never download more than it uploads to the swarm. If the swarm does not have enough demand for upload capacity, the torrent will not download anything. This mode is intended to be safe to add any number of torrents to, without manual screening, without the risk of downloading more than is uploaded.

A torrent in share mode sets the priority to all pieces to 0, except for the pieces that are downloaded, when pieces are decided to be downloaded. This affects the progress bar, which might be set to "100% finished" most of the time. Do not change file or piece priorities for torrents in share mode, it will make it not work.

The share mode has one setting, the share ratio target, see settings_pack::share_mode_target for more info.

apply_ip_filter
determines if the IP filter should apply to this torrent or not. By default all torrents are subject to filtering by the IP filter (i.e. this flag is set by default). This is useful if certain torrents needs to be exempt for some reason, being an auto-update torrent for instance.
paused
specifies whether or not the torrent is paused. i.e. it won't connect to the tracker or any of the peers until it's resumed. Note that a paused torrent that also has the auto_managed flag set can be started at any time by libtorrent's queuing logic. See queuing.
auto_managed

If the torrent is auto-managed (auto_managed), the torrent may be resumed at any point, regardless of how it paused. If it's important to manually control when the torrent is paused and resumed, don't make it auto managed.

If auto_managed is set, the torrent will be queued, started and seeded automatically by libtorrent. When this is set, the torrent should also be started as paused. The default queue order is the order the torrents were added. They are all downloaded in that order. For more details, see queuing.

duplicate_is_error
used in add_torrent_params to indicate that it's an error to attempt to add a torrent that's already in the session. If it's not considered an error, a handle to the existing torrent is returned. This flag is not saved by write_resume_data(), since it is only meant for adding torrents.
update_subscribe
on by default and means that this torrent will be part of state updates when calling post_torrent_updates(). This flag is not saved by write_resume_data().
super_seeding
sets the torrent into super seeding/initial seeding mode. If the torrent is not a seed, this flag has no effect.
sequential_download
sets the sequential download state for the torrent. In this mode the piece picker will pick pieces with low index numbers before pieces with high indices. The actual pieces that are picked depend on other factors still, such as which pieces a peer has and whether it is in parole mode or "prefer whole pieces"-mode. Sequential mode is not ideal for streaming media. For that, see set_piece_deadline() instead.
stop_when_ready

When this flag is set, the torrent will force stop whenever it transitions from a non-data-transferring state into a data-transferring state (referred to as being ready to download or seed). This is useful for torrents that should not start downloading or seeding yet, but want to be made ready to do so. A torrent may need to have its files checked for instance, so it needs to be started and possibly queued for checking (auto-managed and started) but as soon as it's done, it should be stopped.

Force stopped means auto-managed is set to false and it's paused. As if the auto_manages flag is cleared and the paused flag is set on the torrent.

Note that the torrent may transition into a downloading state while setting this flag, and since the logic is edge triggered you may miss the edge. To avoid this race, if the torrent already is in a downloading state when this call is made, it will trigger the stop-when-ready immediately.

When the stop-when-ready logic fires, the flag is cleared. Any subsequent transitions between downloading and non-downloading states will not be affected, until this flag is set again.

The behavior is more robust when setting this flag as part of adding the torrent. See add_torrent_params.

The stop-when-ready flag fixes the inherent race condition of waiting for the state_changed_alert and then call pause(). The download/seeding will most likely start in between posting the alert and receiving the call to pause.

A downloading state is one where peers are being connected. Which means just downloading the metadata via the ut_metadata extension counts as a downloading state. In order to stop a torrent once the metadata has been downloaded, instead set all file priorities to dont_download

override_trackers
when this flag is set, the tracker list in the add_torrent_params object override any trackers from the torrent file. If the flag is not set, the trackers from the add_torrent_params object will be added to the list of trackers used by the torrent. This flag is set by read_resume_data() if there are trackers present in the resume data file. This effectively makes the trackers saved in the resume data take precedence over the original trackers. This includes if there's an empty list of trackers, to support the case where they were explicitly removed in the previous session. This flag is not saved by write_resume_data()
override_web_seeds
If this flag is set, the web seeds from the add_torrent_params object will override any web seeds in the torrent file. If it's not set, web seeds in the add_torrent_params object will be added to the list of web seeds used by the torrent. This flag is set by read_resume_data() if there are web seeds present in the resume data file. This effectively makes the web seeds saved in the resume data take precedence over the original ones. This includes if there's an empty list of web seeds, to support the case where they were explicitly removed in the previous session. This flag is not saved by write_resume_data()
need_save_resume
if this flag is set (which it is by default) the torrent will be considered needing to save its resume data immediately as it's added. New torrents that don't have any resume data should do that. This flag is cleared by a successful call to save_resume_data() This flag is not saved by write_resume_data(), since it represents an ephemeral state of a running torrent.
disable_dht
set this flag to disable DHT for this torrent. This lets you have the DHT enabled for the whole client, and still have specific torrents not participating in it. i.e. not announcing to the DHT nor picking up peers from it.
disable_lsd
set this flag to disable local service discovery for this torrent.
disable_pex
set this flag to disable peer exchange for this torrent.
no_verify_files
if this flag is set, the resume data will be assumed to be correct without validating it against any files on disk. This may be used when restoring a session by loading resume data from disk. It will save time and also delay any hard disk errors until files are actually needed. If the resume data cannot be trusted, or if a torrent is added for the first time to some save path that may already have some of the files, this flag should not be set.
all
all torrent flags combined. Can conveniently be used when creating masks for flags
[report issue]

download_priority_t

Declared in "libtorrent/download_priority.hpp"

dont_download
Don't download the file or piece. Partial pieces may still be downloaded when setting file priorities.
default_priority
The default priority for files and pieces.
low_priority
The lowest priority for files and pieces.
top_priority
The highest priority for files and pieces.
[report issue]

pex_flags_t

Declared in "libtorrent/pex_flags.hpp"

pex_encryption
the peer supports protocol encryption
pex_seed
the peer is a seed
pex_utp
the peer supports the uTP, transport protocol over UDP.
pex_holepunch
the peer supports the holepunch extension If this flag is received from a peer, it can be used as a rendezvous point in case direct connections to the peer fail
pex_lt_v2
protocol v2 this is not a standard flag, it is only used internally
[report issue]

int

Declared in "libtorrent/version.hpp"

version_major
the major, minor and tiny versions of libtorrent
version_minor
the major, minor and tiny versions of libtorrent
version_tiny
the major, minor and tiny versions of libtorrent
[report issue]

char const*

Declared in "libtorrent/version.hpp"

version_str
the libtorrent version in string form
[report issue]

std::uint64_t

Declared in "libtorrent/version.hpp"

version_revision
the git commit of this libtorrent version
[report issue]

bdecode_node

Declared in "libtorrent/bdecode.hpp"

Sometimes it's important to get a non-owning reference to the root node ( to be able to copy it as a reference for instance). For that, use the non_owning() member function.

There are 5 different types of nodes, see type_t.

struct bdecode_node
{
   bdecode_node () = default;
   bdecode_node (bdecode_node&&) noexcept;
   bdecode_node& operator= (bdecode_node const&) &;
   bdecode_node (bdecode_node const&);
   bdecode_node& operator= (bdecode_node&&) & = default;
   type_t type () const noexcept;
   explicit operator bool () const noexcept;
   bdecode_node non_owning () const;
   span<char const> data_section () const noexcept;
   std::ptrdiff_t data_offset () const noexcept;
   std::int64_t list_int_value_at (int i
      , std::int64_t default_val = 0) const;
   bdecode_node list_at (int i) const;
   int list_size () const;
   string_view list_string_value_at (int i
      , string_view default_val = string_view()) const;
   bdecode_node dict_find_int (string_view key) const;
   int dict_size () const;
   std::int64_t dict_find_int_value (string_view key
      , std::int64_t default_val = 0) const;
   bdecode_node dict_find (string_view key) const;
   bdecode_node dict_find_dict (string_view key) const;
   std::pair<bdecode_node, bdecode_node> dict_at_node (int i) const;
   bdecode_node dict_find_list (string_view key) const;
   bdecode_node dict_find_string (string_view key) const;
   string_view dict_find_string_value (string_view key
      , string_view default_value = string_view()) const;
   std::pair<string_view, bdecode_node> dict_at (int i) const;
   std::int64_t int_value () const;
   std::ptrdiff_t string_offset () const;
   char const* string_ptr () const;
   int string_length () const;
   string_view string_value () const;
   void clear ();
   void swap (bdecode_node& n);
   void reserve (int tokens);
   void switch_underlying_buffer (char const* buf) noexcept;
   bool has_soft_error (span<char> error) const;

   enum type_t
   {
      none_t,
      dict_t,
      list_t,
      string_t,
      int_t,
   };
};
[report issue]

bdecode_node()

bdecode_node () = default;

creates a default constructed node, it will have the type none_t.

[report issue]

operator=() bdecode_node()

bdecode_node (bdecode_node&&) noexcept;
bdecode_node& operator= (bdecode_node const&) &;
bdecode_node (bdecode_node const&);
bdecode_node& operator= (bdecode_node&&) & = default;

For owning nodes, the copy will create a copy of the tree, but the underlying buffer remains the same.

[report issue]

type()

type_t type () const noexcept;

the type of this node. See type_t.

[report issue]

bool()

explicit operator bool () const noexcept;

returns true if type() != none_t.

[report issue]

non_owning()

bdecode_node non_owning () const;

return a non-owning reference to this node. This is useful to refer to the root node without copying it in assignments.

[report issue]

data_section() data_offset()

span<char const> data_section () const noexcept;
std::ptrdiff_t data_offset () const noexcept;

returns the buffer and length of the section in the original bencoded buffer where this node is defined. For a dictionary for instance, this starts with d and ends with e, and has all the content of the dictionary in between. the data_offset() function returns the byte-offset to this node in, starting from the beginning of the buffer that was parsed.

[report issue]

list_string_value_at() list_size() list_int_value_at() list_at()

std::int64_t list_int_value_at (int i
      , std::int64_t default_val = 0) const;
bdecode_node list_at (int i) const;
int list_size () const;
string_view list_string_value_at (int i
      , string_view default_val = string_view()) const;

functions with the list_ prefix operate on lists. These functions are only valid if type() == list_t. list_at() returns the item in the list at index i. i may not be greater than or equal to the size of the list. size() returns the size of the list.

[report issue]

dict_at() dict_find_string() dict_at_node() dict_find_int_value() dict_find() dict_find_int() dict_find_list() dict_find_dict() dict_size() dict_find_string_value()

bdecode_node dict_find_int (string_view key) const;
int dict_size () const;
std::int64_t dict_find_int_value (string_view key
      , std::int64_t default_val = 0) const;
bdecode_node dict_find (string_view key) const;
bdecode_node dict_find_dict (string_view key) const;
std::pair<bdecode_node, bdecode_node> dict_at_node (int i) const;
bdecode_node dict_find_list (string_view key) const;
bdecode_node dict_find_string (string_view key) const;
string_view dict_find_string_value (string_view key
      , string_view default_value = string_view()) const;
std::pair<string_view, bdecode_node> dict_at (int i) const;

Functions with the dict_ prefix operates on dictionaries. They are only valid if type() == dict_t. In case a key you're looking up contains a 0 byte, you cannot use the 0-terminated string overloads, but have to use string_view instead. dict_find_list will return a valid bdecode_node if the key is found _and_ it is a list. Otherwise it will return a default-constructed bdecode_node.

Functions with the _value suffix return the value of the node directly, rather than the nodes. In case the node is not found, or it has a different type, a default value is returned (which can be specified).

dict_at() returns the (key, value)-pair at the specified index in a dictionary. Keys are only allowed to be strings. dict_at_node() also returns the (key, value)-pair, but the key is returned as a bdecode_node (and it will always be a string).

[report issue]

int_value()

std::int64_t int_value () const;

this function is only valid if type() == int_t. It returns the value of the integer.

[report issue]

string_offset() string_value() string_length() string_ptr()

std::ptrdiff_t string_offset () const;
char const* string_ptr () const;
int string_length () const;
string_view string_value () const;

these functions are only valid if type() == string_t. They return the string values. Note that string_ptr() is not 0-terminated. string_length() returns the number of bytes in the string. string_offset() returns the byte offset from the start of the parsed bencoded buffer this string can be found.

[report issue]

clear()

void clear ();

resets the bdecoded_node to a default constructed state. If this is an owning node, the tree is freed and all child nodes are invalidated.

[report issue]

swap()

void swap (bdecode_node& n);

Swap contents.

[report issue]

reserve()

void reserve (int tokens);

preallocate memory for the specified numbers of tokens. This is useful if you know approximately how many tokens are in the file you are about to parse. Doing so will save realloc operations while parsing. You should only call this on the root node, before passing it in to bdecode().

[report issue]

switch_underlying_buffer()

void switch_underlying_buffer (char const* buf) noexcept;

this buffer MUST be identical to the one originally parsed. This operation is only defined on owning root nodes, i.e. the one passed in to decode().

[report issue]

has_soft_error()

bool has_soft_error (span<char> error) const;

returns true if there is a non-fatal error in the bencoding of this node or its children

[report issue]

enum type_t

Declared in "libtorrent/bdecode.hpp"

name value description
none_t 0 uninitialized or default constructed. This is also used to indicate that a node was not found in some cases.
dict_t 1 a dictionary node. The dict_find_ functions are valid.
list_t 2 a list node. The list_ functions are valid.
string_t 3 a string node, the string_ functions are valid.
int_t 4 an integer node. The int_ functions are valid.
[report issue]

print_entry()

Declared in "libtorrent/bdecode.hpp"

std::string print_entry (bdecode_node const& e
   , bool single_line = false, int indent = 0);

print the bencoded structure in a human-readable format to a string that's returned.

[report issue]

bdecode()

Declared in "libtorrent/bdecode.hpp"

bdecode_node bdecode (span<char const> buffer
   , error_code& ec, int* error_pos = nullptr, int depth_limit = 100
   , int token_limit = 2000000);
int bdecode (char const* start, char const* end, bdecode_node& ret
   , error_code& ec, int* error_pos = nullptr, int depth_limit = 100
   , int token_limit = 2000000);
bdecode_node bdecode (span<char const> buffer
   , int depth_limit = 100, int token_limit = 2000000);

This function decodes/parses bdecoded data (for example a .torrent file). The data structure is returned in the ret argument. the buffer to parse is specified by the start of the buffer as well as the end, i.e. one byte past the end. If the buffer fails to parse, the function returns a non-zero value and fills in ec with the error code. The optional argument error_pos, if set to non-nullptr, will be set to the byte offset into the buffer where the parse failure occurred.

depth_limit specifies the max number of nested lists or dictionaries are allowed in the data structure. (This affects the stack usage of the function, be careful not to set it too high).

token_limit is the max number of tokens allowed to be parsed from the buffer. This is simply a sanity check to not have unbounded memory usage.

The resulting bdecode_node is an owning node. That means it will be holding the whole parsed tree. When iterating lists and dictionaries, those bdecode_node objects will simply have references to the root or owning bdecode_node. If the root node is destructed, all other nodes that refer to anything in that tree become invalid.

However, the underlying buffer passed in to this function (start, end) must also remain valid while the bdecoded tree is used. The parsed tree produced by this function does not copy any data out of the buffer, but simply produces references back into it.

The disk I/O can be customized in libtorrent. In previous versions, the customization was at the level of each torrent. Now, the customization point is at the session level. All torrents added to a session will use the same disk I/O subsystem, as determined by the disk_io_constructor (in session_params).

This allows the disk subsystem to also customize threading and disk job management.

To customize the disk subsystem, implement disk_interface and provide a factory function to the session constructor (via session_params).

Example use:

struct temp_storage
{
  explicit temp_storage(lt::file_storage const& fs) : m_files(fs) {}

  lt::span<char const> readv(lt::peer_request const r, lt::storage_error& ec) const
  {
    auto const i = m_file_data.find(r.piece);
    if (i == m_file_data.end())
    {
      ec.operation = lt::operation_t::file_read;
      ec.ec = boost::asio::error::eof;
      return {};
    }
    if (int(i->second.size()) <= r.start)
    {
      ec.operation = lt::operation_t::file_read;
      ec.ec = boost::asio::error::eof;
      return {};
    }
    return { i->second.data() + r.start, std::min(r.length, int(i->second.size()) - r.start) };
  }
  void writev(lt::span<char const> const b, lt::piece_index_t const piece, int const offset)
  {
    auto& data = m_file_data[piece];
    if (data.empty())
    {
      // allocate the whole piece, otherwise we'll invalidate the pointers
      // we have returned back to libtorrent
      int const size = piece_size(piece);
      data.resize(std::size_t(size));
    }
    TORRENT_ASSERT(offset + b.size() <= int(data.size()));
    std::memcpy(data.data() + offset, b.data(), std::size_t(b.size()));
  }
  lt::sha1_hash hash(lt::piece_index_t const piece
    , lt::span<lt::sha256_hash> const block_hashes, lt::storage_error& ec) const
  {
    auto const i = m_file_data.find(piece);
    if (i == m_file_data.end())
    {
      ec.operation = lt::operation_t::file_read;
      ec.ec = boost::asio::error::eof;
      return {};
    }
    if (!block_hashes.empty())
    {
      int const piece_size2 = m_files.piece_size2(piece);
      int const blocks_in_piece2 = m_files.blocks_in_piece2(piece);
      char const* buf = i->second.data();
      std::int64_t offset = 0;
      for (int k = 0; k < blocks_in_piece2; ++k)
      {
        lt::hasher256 h2;
        std::ptrdiff_t const len2 = std::min(lt::default_block_size, int(piece_size2 - offset));
        h2.update({ buf, len2 });
        buf += len2;
        offset += len2;
        block_hashes[k] = h2.final();
      }
    }
    return lt::hasher(i->second).final();
  }
  lt::sha256_hash hash2(lt::piece_index_t const piece, int const offset, lt::storage_error& ec)
  {
    auto const i = m_file_data.find(piece);
    if (i == m_file_data.end())
    {
      ec.operation = lt::operation_t::file_read;
      ec.ec = boost::asio::error::eof;
      return {};
    }

    int const piece_size = m_files.piece_size2(piece);

    std::ptrdiff_t const len = std::min(lt::default_block_size, piece_size - offset);

    lt::span<char const> b = {i->second.data() + offset, len};
    return lt::hasher256(b).final();
  }

private:
  int piece_size(lt::piece_index_t piece) const
  {
    int const num_pieces = static_cast<int>((m_files.total_size() + m_files.piece_length() - 1) / m_files.piece_length());
    return static_cast<int>(piece) < num_pieces - 1
      ? m_files.piece_length() : static_cast<int>(m_files.total_size() - std::int64_t(num_pieces - 1) * m_files.piece_length());
  }

  lt::file_storage const& m_files;
  std::map<lt::piece_index_t, std::vector<char>> m_file_data;
};

lt::storage_index_t pop(std::vector<lt::storage_index_t>& q)
{
  TORRENT_ASSERT(!q.empty());
  lt::storage_index_t const ret = q.back();
  q.pop_back();
  return ret;
}

struct temp_disk_io final : lt::disk_interface
  , lt::buffer_allocator_interface
{
  explicit temp_disk_io(lt::io_context& ioc): m_ioc(ioc) {}

  void settings_updated() override {}

  lt::storage_holder new_torrent(lt::storage_params const& params
    , std::shared_ptr<void> const&) override
  {
    lt::storage_index_t const idx = m_free_slots.empty()
      ? m_torrents.end_index()
      : pop(m_free_slots);
    auto storage = std::make_unique<temp_storage>(params.files);
    if (idx == m_torrents.end_index()) m_torrents.emplace_back(std::move(storage));
    else m_torrents[idx] = std::move(storage);
    return lt::storage_holder(idx, *this);
  }

  void remove_torrent(lt::storage_index_t const idx) override
  {
    m_torrents[idx].reset();
    m_free_slots.push_back(idx);
  }

  void abort(bool) override {}

  void async_read(lt::storage_index_t storage, lt::peer_request const& r
    , std::function<void(lt::disk_buffer_holder block, lt::storage_error const& se)> handler
    , lt::disk_job_flags_t) override
  {
    // this buffer is owned by the storage. It will remain valid for as
    // long as the torrent remains in the session. We don't need any lifetime
    // management of it.
    lt::storage_error error;
    lt::span<char const> b = m_torrents[storage]->readv(r, error);

    post(m_ioc, [handler, error, b, this]
      { handler(lt::disk_buffer_holder(*this, const_cast<char*>(b.data()), int(b.size())), error); });
  }

  bool async_write(lt::storage_index_t storage, lt::peer_request const& r
    , char const* buf, std::shared_ptr<lt::disk_observer>
    , std::function<void(lt::storage_error const&)> handler
    , lt::disk_job_flags_t) override
  {
    lt::span<char const> const b = { buf, r.length };

    m_torrents[storage]->writev(b, r.piece, r.start);

    post(m_ioc, [=]{ handler(lt::storage_error()); });
    return false;
  }

  void async_hash(lt::storage_index_t storage, lt::piece_index_t const piece
    , lt::span<lt::sha256_hash> block_hashes, lt::disk_job_flags_t
    , std::function<void(lt::piece_index_t, lt::sha1_hash const&, lt::storage_error const&)> handler) override
  {
    lt::storage_error error;
    lt::sha1_hash const hash = m_torrents[storage]->hash(piece, block_hashes, error);
    post(m_ioc, [=]{ handler(piece, hash, error); });
  }

  void async_hash2(lt::storage_index_t storage, lt::piece_index_t const piece
    , int const offset, lt::disk_job_flags_t
    , std::function<void(lt::piece_index_t, lt::sha256_hash const&, lt::storage_error const&)> handler) override
  {
    lt::storage_error error;
    lt::sha256_hash const hash = m_torrents[storage]->hash2(piece, offset, error);
    post(m_ioc, [=]{ handler(piece, hash, error); });
  }

  void async_move_storage(lt::storage_index_t, std::string p, lt::move_flags_t
    , std::function<void(lt::status_t, std::string const&, lt::storage_error const&)> handler) override
  {
    post(m_ioc, [=]{
      handler(lt::status_t::fatal_disk_error, p
        , lt::storage_error(lt::error_code(boost::system::errc::operation_not_supported, lt::system_category())));
    });
  }

  void async_release_files(lt::storage_index_t, std::function<void()>) override {}

  void async_delete_files(lt::storage_index_t, lt::remove_flags_t
    , std::function<void(lt::storage_error const&)> handler) override
  {
    post(m_ioc, [=]{ handler(lt::storage_error()); });
  }

  void async_check_files(lt::storage_index_t
    , lt::add_torrent_params const*
    , lt::aux::vector<std::string, lt::file_index_t>
    , std::function<void(lt::status_t, lt::storage_error const&)> handler) override
  {
    post(m_ioc, [=]{ handler(lt::status_t::no_error, lt::storage_error()); });
  }

  void async_rename_file(lt::storage_index_t
    , lt::file_index_t const idx
    , std::string const name
    , std::function<void(std::string const&, lt::file_index_t, lt::storage_error const&)> handler) override
  {
    post(m_ioc, [=]{ handler(name, idx, lt::storage_error()); });
  }

  void async_stop_torrent(lt::storage_index_t, std::function<void()> handler) override
  {
    post(m_ioc, handler);
  }

  void async_set_file_priority(lt::storage_index_t
    , lt::aux::vector<lt::download_priority_t, lt::file_index_t> prio
    , std::function<void(lt::storage_error const&
      , lt::aux::vector<lt::download_priority_t, lt::file_index_t>)> handler) override
  {
    post(m_ioc, [=]{
      handler(lt::storage_error(lt::error_code(
        boost::system::errc::operation_not_supported, lt::system_category())), std::move(prio));
    });
  }

  void async_clear_piece(lt::storage_index_t, lt::piece_index_t index
    , std::function<void(lt::piece_index_t)> handler) override
  {
    post(m_ioc, [=]{ handler(index); });
  }

  // implements buffer_allocator_interface
  void free_disk_buffer(char*) override
  {
    // never free any buffer. We only return buffers owned by the storage
    // object
  }

  void update_stats_counters(lt::counters&) const override {}

  std::vector<lt::open_file_state> get_status(lt::storage_index_t) const override
  { return {}; }

  void submit_jobs() override {}

private:

  lt::aux::vector<std::shared_ptr<temp_storage>, lt::storage_index_t> m_torrents;

  // slots that are unused in the m_torrents vector
  std::vector<lt::storage_index_t> m_free_slots;

  // callbacks are posted on this
  lt::io_context& m_ioc;
};

std::unique_ptr<lt::disk_interface> temp_disk_constructor(
  lt::io_context& ioc, lt::settings_interface const&, lt::counters&)
{
  return std::make_unique<temp_disk_io>(ioc);
}
[report issue]

settings_interface

Declared in "libtorrent/settings_pack.hpp"

the common interface to settings_pack and the internal representation of settings.

struct settings_interface
{
   virtual bool has_val (int name) const = 0;
   virtual void set_str (int name, std::string val) = 0;
   virtual void set_bool (int name, bool val) = 0;
   virtual void set_int (int name, int val) = 0;
   virtual bool get_bool (int name) const = 0;
   virtual int get_int (int name) const = 0;
   virtual std::string const& get_str (int name) const = 0;
};
[report issue]

open_file_state

Declared in "libtorrent/disk_interface.hpp"

this contains information about a file that's currently open by the libtorrent disk I/O subsystem. It's associated with a single torrent.

struct open_file_state
{
   file_index_t file_index;
   file_open_mode_t open_mode;
   time_point last_use;
};
[report issue]
file_index
the index of the file this entry refers to into the file_storage file list of this torrent. This starts indexing at 0.
[report issue]
open_mode

open_mode is a bitmask of the file flags this file is currently opened with. For possible flags, see file_open_mode_t.

Note that the read/write mode is not a bitmask. The two least significant bits are used to represent the read/write mode. Those bits can be masked out using the rw_mask constant.

[report issue]
last_use
a (high precision) timestamp of when the file was last used.
[report issue]

disk_interface

Declared in "libtorrent/disk_interface.hpp"

The disk_interface is the customization point for disk I/O in libtorrent. implement this interface and provide a factory function to the session constructor use custom disk I/O. All functions on the disk subsystem (implementing disk_interface) are called from within libtorrent's network thread. For disk I/O to be performed in a separate thread, the disk subsystem has to manage that itself.

Although the functions are called async_*, they do not technically have to be asynchronous, but they support being asynchronous, by expecting the result passed back into a callback. The callbacks must be posted back onto the network thread via the io_context object passed into the constructor. The callbacks will be run in the network thread.

struct disk_interface
{
   virtual storage_holder new_torrent (storage_params const& p
      , std::shared_ptr<void> const& torrent) = 0;
   virtual void remove_torrent (storage_index_t) = 0;
   virtual bool async_write (storage_index_t storage, peer_request const& r
      , char const* buf, std::shared_ptr<disk_observer> o
      , std::function<void(storage_error const&)> handler
      , disk_job_flags_t flags = {}) = 0;
   virtual void async_read (storage_index_t storage, peer_request const& r
      , std::function<void(disk_buffer_holder, storage_error const&)> handler
      , disk_job_flags_t flags = {}) = 0;
   virtual void async_hash (storage_index_t storage, piece_index_t piece, span<sha256_hash> v2
      , disk_job_flags_t flags
      , std::function<void(piece_index_t, sha1_hash const&, storage_error const&)> handler) = 0;
   virtual void async_hash2 (storage_index_t storage, piece_index_t piece, int offset, disk_job_flags_t flags
      , std::function<void(piece_index_t, sha256_hash const&, storage_error const&)> handler) = 0;
   virtual void async_move_storage (storage_index_t storage, std::string p, move_flags_t flags
      , std::function<void(status_t, std::string const&, storage_error const&)> handler) = 0;
   virtual void async_release_files (storage_index_t storage
      , std::function<void()> handler = std::function<void()>()) = 0;
   virtual void async_check_files (storage_index_t storage
      , add_torrent_params const* resume_data
      , aux::vector<std::string, file_index_t> links
      , std::function<void(status_t, storage_error const&)> handler) = 0;
   virtual void async_stop_torrent (storage_index_t storage
      , std::function<void()> handler = std::function<void()>()) = 0;
   virtual void async_rename_file (storage_index_t storage
      , file_index_t index, std::string name
      , std::function<void(std::string const&, file_index_t, storage_error const&)> handler) = 0;
   virtual void async_delete_files (storage_index_t storage, remove_flags_t options
      , std::function<void(storage_error const&)> handler) = 0;
   virtual void async_set_file_priority (storage_index_t storage
      , aux::vector<download_priority_t, file_index_t> prio
      , std::function<void(storage_error const&
      , aux::vector<download_priority_t, file_index_t>)> handler) = 0;
   virtual void async_clear_piece (storage_index_t storage, piece_index_t index
      , std::function<void(piece_index_t)> handler) = 0;
   virtual void update_stats_counters (counters& c) const = 0;
   virtual std::vector<open_file_state> get_status (storage_index_t) const = 0;
   virtual void abort (bool wait) = 0;
   virtual void submit_jobs () = 0;
   virtual void settings_updated () = 0;

   static constexpr disk_job_flags_t force_copy  = 0_bit;
   static constexpr disk_job_flags_t sequential_access  = 3_bit;
   static constexpr disk_job_flags_t volatile_read  = 4_bit;
   static constexpr disk_job_flags_t v1_hash  = 5_bit;
};
[report issue]

new_torrent()

virtual storage_holder new_torrent (storage_params const& p
      , std::shared_ptr<void> const& torrent) = 0;

this is called when a new torrent is added. The shared_ptr can be used to hold the internal torrent object alive as long as there are outstanding disk operations on the storage. The returned storage_holder is an owning reference to the underlying storage that was just created. It is fundamentally a storage_index_t

[report issue]

remove_torrent()

virtual void remove_torrent (storage_index_t) = 0;

remove the storage with the specified index. This is not expected to delete any files from disk, just to clean up any resources associated with the specified storage.

[report issue]

async_read() async_write()

virtual bool async_write (storage_index_t storage, peer_request const& r
      , char const* buf, std::shared_ptr<disk_observer> o
      , std::function<void(storage_error const&)> handler
      , disk_job_flags_t flags = {}) = 0;
virtual void async_read (storage_index_t storage, peer_request const& r
      , std::function<void(disk_buffer_holder, storage_error const&)> handler
      , disk_job_flags_t flags = {}) = 0;

perform a read or write operation from/to the specified storage index and the specified request. When the operation completes, call handler possibly with a disk_buffer_holder, holding the buffer with the result. Flags may be set to affect the read operation. See disk_job_flags_t.

The disk_observer is a callback to indicate that the store buffer/disk write queue is below the watermark to let peers start writing buffers to disk again. When async_write() returns true, indicating the write queue is full, the peer will stop further writes and wait for the passed-in disk_observer to be notified before resuming.

Note that for async_read, the peer_request (r) is not necessarily aligned to blocks (but it is most of the time). However, all writes (passed to async_write) are guaranteed to be block aligned.

[report issue]

async_hash()

virtual void async_hash (storage_index_t storage, piece_index_t piece, span<sha256_hash> v2
      , disk_job_flags_t flags
      , std::function<void(piece_index_t, sha1_hash const&, storage_error const&)> handler) = 0;

Compute hash(es) for the specified piece. Unless the v1_hash flag is set (in flags), the SHA-1 hash of the whole piece does not need to be computed.

The v2 span is optional and can be empty, which means v2 hashes should not be computed. If v2 is non-empty it must be at least large enough to hold all v2 blocks in the piece, and this function will fill in the span with the SHA-256 block hashes of the piece.

[report issue]

async_hash2()

virtual void async_hash2 (storage_index_t storage, piece_index_t piece, int offset, disk_job_flags_t flags
      , std::function<void(piece_index_t, sha256_hash const&, storage_error const&)> handler) = 0;

computes the v2 hash (SHA-256) of a single block. The block at offset in piece piece.

[report issue]

async_move_storage()

virtual void async_move_storage (storage_index_t storage, std::string p, move_flags_t flags
      , std::function<void(status_t, std::string const&, storage_error const&)> handler) = 0;

called to request the files for the specified storage/torrent be moved to a new location. It is the disk I/O object's responsibility to synchronize this with any currently outstanding disk operations to the storage. Whether files are replaced at the destination path or not is controlled by flags (see move_flags_t).

[report issue]

async_release_files()

virtual void async_release_files (storage_index_t storage
      , std::function<void()> handler = std::function<void()>()) = 0;

This is called on disk I/O objects to request they close all open files for the specified storage/torrent. If file handles are not pooled/cached, it can be a no-op. For truly asynchronous disk I/O, this should provide at least one point in time when all files are closed. It is possible that later asynchronous operations will re-open some of the files, by the time this completion handler is called, that's fine.

[report issue]

async_check_files()

virtual void async_check_files (storage_index_t storage
      , add_torrent_params const* resume_data
      , aux::vector<std::string, file_index_t> links
      , std::function<void(status_t, storage_error const&)> handler) = 0;

this is called when torrents are added to validate their resume data against the files on disk. This function is expected to do a few things:

if links is non-empty, it contains a string for each file in the torrent. The string being a path to an existing identical file. The default behavior is to create hard links of those files into the storage of the new torrent (specified by storage). An empty string indicates that there is no known identical file. This is part of the "mutable torrent" feature, where files can be reused from other torrents.

The resume_data points the resume data passed in by the client.

If the resume_data->flags field has the seed_mode flag set, all files/pieces are expected to be on disk already. This should be verified. Not just the existence of the file, but also that it has the correct size.

Any file with a piece set in the resume_data->have_pieces bitmask should exist on disk, this should be verified. Pad files and files with zero priority may be skipped.

[report issue]

async_stop_torrent()

virtual void async_stop_torrent (storage_index_t storage
      , std::function<void()> handler = std::function<void()>()) = 0;

This is called when a torrent is stopped. It gives the disk I/O object an opportunity to flush any data to disk that's currently kept cached. This function should at least do the same thing as async_release_files().

[report issue]

async_rename_file()

virtual void async_rename_file (storage_index_t storage
      , file_index_t index, std::string name
      , std::function<void(std::string const&, file_index_t, storage_error const&)> handler) = 0;

This function is called when the name of a file in the specified storage has been requested to be renamed. The disk I/O object is responsible for renaming the file without racing with other potentially outstanding operations against the file (such as read, write, move, etc.).

[report issue]

async_delete_files()

virtual void async_delete_files (storage_index_t storage, remove_flags_t options
      , std::function<void(storage_error const&)> handler) = 0;

This function is called when some file(s) on disk have been requested to be removed by the client. storage indicates which torrent is referred to. See session_handle for remove_flags_t flags indicating which files are to be removed. e.g. session_handle::delete_files - delete all files session_handle::delete_partfile - only delete part file.

[report issue]

async_set_file_priority()

virtual void async_set_file_priority (storage_index_t storage
      , aux::vector<download_priority_t, file_index_t> prio
      , std::function<void(storage_error const&
      , aux::vector<download_priority_t, file_index_t>)> handler) = 0;

This is called to set the priority of some or all files. Changing the priority from or to 0 may involve moving data to and from the partfile. The disk I/O object is responsible for correctly synchronizing this work to not race with any potentially outstanding asynchronous operations affecting these files.

prio is a vector of the file priority for all files. If it's shorter than the total number of files in the torrent, they are assumed to be set to the default priority.

[report issue]

async_clear_piece()

virtual void async_clear_piece (storage_index_t storage, piece_index_t index
      , std::function<void(piece_index_t)> handler) = 0;

This is called when a piece fails the hash check, to ensure there are no outstanding disk operations to the piece before blocks are re-requested from peers to overwrite the existing blocks. The disk I/O object does not need to perform any action other than synchronize with all outstanding disk operations to the specified piece before posting the result back.

[report issue]

update_stats_counters()

virtual void update_stats_counters (counters& c) const = 0;

update_stats_counters() is called to give the disk storage an opportunity to update gauges in the c stats counters, that aren't updated continuously as operations are performed. This is called before a snapshot of the counters are passed to the client.

[report issue]

get_status()

virtual std::vector<open_file_state> get_status (storage_index_t) const = 0;

Return a list of all the files that are currently open for the specified storage/torrent. This is is just used for the client to query the currently open files, and which modes those files are open in.

[report issue]

abort()

virtual void abort (bool wait) = 0;

this is called when the session is starting to shut down. The disk I/O object is expected to flush any outstanding write jobs, cancel hash jobs and initiate tearing down of any internal threads. If wait is true, this should be asynchronous. i.e. this call should not return until all threads have stopped and all jobs have either been aborted or completed and the disk I/O object is ready to be destructed.

[report issue]

submit_jobs()

virtual void submit_jobs () = 0;

This will be called after a batch of disk jobs has been issues (via the async_* ). It gives the disk I/O object an opportunity to notify any potential condition variables to wake up the disk thread(s). The async_* calls can of course also notify condition variables, but doing it in this call allows for batching jobs, by issuing the notification once for a collection of jobs.

[report issue]

settings_updated()

virtual void settings_updated () = 0;

This is called to notify the disk I/O object that the settings have been updated. In the disk io constructor, a settings_interface reference is passed in. Whenever these settings are updated, this function is called to allow the disk I/O object to react to any changed settings relevant to its operations.

[report issue]
force_copy
force making a copy of the cached block, rather than getting a reference to a block already in the cache. This is used the block is expected to be overwritten very soon, by async_write()`, and we need access to the previous content.
[report issue]
sequential_access
hint that there may be more disk operations with sequential access to the file
[report issue]
volatile_read
don't keep the read block in cache. This is a hint that this block is unlikely to be read again anytime soon, and caching it would be wasteful.
[report issue]
v1_hash
compute a v1 piece hash. This is only used by the async_hash() call. If this flag is not set in the async_hash() call, the SHA-1 piece hash does not need to be computed.
[report issue]

storage_holder

Declared in "libtorrent/disk_interface.hpp"

a unique, owning, reference to the storage of a torrent in a disk io subsystem (class that implements disk_interface). This is held by the internal libtorrent torrent object to tie the storage object allocated for a torrent to the lifetime of the internal torrent object. When a torrent is removed from the session, this holder is destructed and will inform the disk object.

struct storage_holder
{
   ~storage_holder ();
   storage_holder (storage_index_t idx, disk_interface& disk_io);
   storage_holder () = default;
   explicit operator bool () const;
   operator storage_index_t () const;
   void reset ();
   storage_holder& operator= (storage_holder const&) = delete;
   storage_holder (storage_holder const&) = delete;
   storage_holder (storage_holder&& rhs) noexcept;
   storage_holder& operator= (storage_holder&& rhs) noexcept;
};
[report issue]

buffer_allocator_interface

Declared in "libtorrent/disk_buffer_holder.hpp"

the interface for freeing disk buffers, used by the disk_buffer_holder. when implementing disk_interface, this must also be implemented in order to return disk buffers back to libtorrent

struct buffer_allocator_interface
{
   virtual void free_disk_buffer (char* b) = 0;
};
[report issue]

disk_buffer_holder

Declared in "libtorrent/disk_buffer_holder.hpp"

The disk buffer holder acts like a unique_ptr that frees a disk buffer when it's destructed

If this buffer holder is moved-from, default constructed or reset, data() will return nullptr.

struct disk_buffer_holder
{
   disk_buffer_holder (disk_buffer_holder&&) noexcept;
   disk_buffer_holder& operator= (disk_buffer_holder&&) & noexcept;
   disk_buffer_holder& operator= (disk_buffer_holder const&) = delete;
   disk_buffer_holder (disk_buffer_holder const&) = delete;
   disk_buffer_holder (buffer_allocator_interface& alloc
      , char* buf, int sz) noexcept;
   disk_buffer_holder () noexcept = default;
   ~disk_buffer_holder ();
   char* data () const noexcept;
   void reset ();
   void swap (disk_buffer_holder& h) noexcept;
   bool is_mutable () const noexcept;
   explicit operator bool () const noexcept;
   std::ptrdiff_t size () const;
};
[report issue]

disk_buffer_holder()

disk_buffer_holder (buffer_allocator_interface& alloc
      , char* buf, int sz) noexcept;

construct a buffer holder that will free the held buffer using a disk buffer pool directly (there's only one disk_buffer_pool per session)

[report issue]

disk_buffer_holder()

disk_buffer_holder () noexcept = default;

default construct a holder that does not own any buffer

[report issue]

~disk_buffer_holder()

~disk_buffer_holder ();

frees disk buffer held by this object

[report issue]

data()

char* data () const noexcept;

return a pointer to the held buffer, if any. Otherwise returns nullptr.

[report issue]

reset()

void reset ();

free the held disk buffer, if any, and clear the holder. This sets the holder object to a default-constructed state

[report issue]

swap()

void swap (disk_buffer_holder& h) noexcept;

swap pointers of two disk buffer holders.

[report issue]

is_mutable()

bool is_mutable () const noexcept;

if this returns true, the buffer may not be modified in place

[report issue]

bool()

explicit operator bool () const noexcept;

implicitly convertible to true if the object is currently holding a buffer

[report issue]

disk_observer

Declared in "libtorrent/disk_observer.hpp"

struct disk_observer
{
   virtual void on_disk () = 0;
};
[report issue]

on_disk()

virtual void on_disk () = 0;

called when the disk cache size has dropped below the low watermark again and we can resume downloading from peers

[report issue]

file_open_mode_t

Declared in "libtorrent/disk_interface.hpp"

read_only
open the file for reading only
write_only
open the file for writing only
read_write
open the file for reading and writing
rw_mask
the mask for the bits determining read or write mode
sparse
open the file in sparse mode (if supported by the filesystem).
no_atime
don't update the access timestamps on the file (if supported by the operating system and filesystem). this generally improves disk performance.
random_access
open the file for random access. This disables read-ahead logic

You have some control over session configuration through the session::apply_settings() member function. To change one or more configuration options, create a settings_pack object and fill it with the settings to be set and pass it in to session::apply_settings().

The settings_pack object is a collection of settings updates that are applied to the session when passed to session::apply_settings(). It's empty when constructed.

You have control over proxy and authorization settings and also the user-agent that will be sent to the tracker. The user-agent will also be used to identify the client with other peers.

Each configuration option is named with an enum value inside the settings_pack class. These are the available settings:

[report issue]

settings_pack

Declared in "libtorrent/settings_pack.hpp"

The settings_pack struct, contains the names of all settings as enum values. These values are passed in to the set_str(), set_int(), set_bool() functions, to specify the setting to change.

name type default
user_agent string libtorrent/

this is the client identification to the tracker. The recommended format of this string is: "client-name/client-version libtorrent/libtorrent-version". 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

name type default
announce_ip string nullptr

announce_ip is the ip address passed along to trackers as the &ip= parameter. If left as the default, that parameter is omitted.

Note

This setting is only meant for very special cases where a seed is running on the same host as the tracker, and the tracker accepts the IP parameter (which normal trackers don't). Do not set this option unless you also control the tracker.

name type default
handshake_client_version string nullptr

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. This string must be a UTF-8 encoded unicode string.

name type default
outgoing_interfaces string  

This controls which IP address outgoing TCP peer connections are bound to, in addition to controlling whether such connections are also bound to a specific network interface/adapter (bind-to-device).

This string is a comma-separated list of IP addresses and interface names. An empty string will not bind TCP sockets to a device, and let the network stack assign the local address.

A list of names will be used to bind outgoing TCP sockets in a round-robin fashion. An IP address will simply be used to bind() the socket. An interface name will attempt to bind the socket to that interface. If that fails, or is unsupported, one of the IP addresses configured for that interface is used to bind() the socket to. If the interface or adapter doesn't exist, the outgoing peer connection will fail with an error message suggesting the device cannot be found. Adapter names on Unix systems are of the form "eth0", "eth1", "tun0", etc. 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.

When outgoing interfaces are specified, incoming connections or packets sent to a local interface or IP that's not in this list will be rejected with a peer_blocked_alert with invalid_local_interface as the reason.

Note that these are just interface/adapter names or IP addresses. There are no ports specified in this list. IPv6 addresses without port should be specified without enclosing [, ].

name type default
listen_interfaces string 0.0.0.0:6881,[::]:6881

a comma-separated list of (IP or device name, port) pairs. These are the listen ports that will be opened for accepting incoming uTP and TCP peer connections. These are also used for outgoing uTP and UDP tracker connections and DHT nodes.

It is possible to listen on multiple interfaces and multiple ports. Binding to port 0 will make the operating system pick the port.

Note

There are reasons to stick to the same port across sessions, which would mean only using port 0 on the first start, and recording the port that was picked for subsequent startups. Trackers, the DHT and other peers will remember the port they see you use and hand that port out to other peers trying to connect to you, as well as trying to connect to you themselves.

A port that has an "s" suffix will accept SSL peer connections. (note that SSL sockets are only available in builds with SSL support)

A port that has an "l" suffix will be considered a local network. i.e. it's assumed to only be able to reach hosts in the same local network as the IP address (based on the netmask associated with the IP, queried from the operating system).

if binding fails, the listen_failed_alert is posted. Once a socket binding succeeds (if it does), the listen_succeeded_alert is posted. There may be multiple failures before a success.

If a device name that does not exist is configured, no listen socket will be opened for that interface. If this is the only interface configured, it will be as if no listen ports are configured.

If no listen ports are configured (e.g. listen_interfaces is an empty string), networking will be disabled. No DHT will start, no outgoing uTP or tracker connections will be made. No incoming TCP or uTP connections will be accepted. (outgoing TCP connections will still be possible, depending on settings_pack::outgoing_interfaces).

For example: [::1]:8888 - will only accept connections on the IPv6 loopback address on port 8888.

eth0:4444,eth1:4444 - will accept connections on port 4444 on any IP address bound to device eth0 or eth1.

[::]:0s - will accept SSL connections on a port chosen by the OS. And not accept non-SSL connections at all.

0.0.0.0:6881,[::]:6881 - binds to all interfaces on port 6881.

10.0.1.13:6881l - binds to the local IP address, port 6881, but only allow talking to peers on the same local network. The netmask is queried from the operating system. Interfaces marked l are not announced to trackers, unless the tracker is also on the same local network.

Windows OS network adapter device name must be specified with GUID. It can be obtained from "netsh lan show interfaces" command output. GUID must be uppercased string embraced in curly brackets. {E4F0B674-0DFC-48BB-98A5-2AA730BDB6D6}:7777 - will accept connections on port 7777 on adapter with this GUID.

For more information, see the Multi-homed hosts section.

name type default
proxy_hostname string  

when using a proxy, this is the hostname where the proxy is running see proxy_type. Note that when using a proxy, the settings_pack::listen_interfaces setting is overridden and only a single interface is created, just to contact the proxy. This means a proxy cannot be combined with SSL torrents or multiple listen interfaces. This proxy listen interface will not accept incoming TCP connections, will not map ports with any gateway and will not enable local service discovery. All traffic is supposed to be channeled through the proxy.

name type default
proxy_username string  
proxy_password string  

when using a proxy, these are the credentials (if any) to use when connecting to it. see proxy_type

name type default
i2p_hostname string  

sets the i2p SAM bridge to connect to. set the port with the i2p_port setting.

name type default
peer_fingerprint string -LT2050-

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 truncated to 20 bytes and used as the entire peer-id

There is a utility function, generate_fingerprint() that can be used to generate a standard client peer ID fingerprint prefix.

name type default
dht_bootstrap_nodes string dht.libtorrent.org:25401

This is a comma-separated list of IP port-pairs. They will be added to the DHT node (if it's enabled) as back-up nodes in case we don't know of any.

Changing these after the DHT has been started may not have any effect until the DHT is restarted.

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. Rejecting multiple connections from the same IP address will prevent abusive behavior by peers. The logic for determining whether connections are to the same peer is more complicated with this enabled, and more likely to fail in some edge cases. It is not recommended to enable this feature.

name type default
send_redundant_have bool true

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.

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. If this is false, the DHT is used regardless of if the trackers fail or not.

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 on our subnet. i.e. it's a way to not talk to other people's routers by mistake.

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.

name type default
auto_manage_prefer_seeds bool false

if true, prefer seeding torrents when determining which torrents to give active slots to. If false, give preference to downloading torrents

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.

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.

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.

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

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.

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. To be compliant with the Multi-tracker specification, set it to false.

name type default
prefer_udp_trackers bool true

prefer_udp_trackers: true 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 tracker's tier is respected and there's no preference of one protocol over another.

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)

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.

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.

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.

name type default
incoming_starts_queued_torrents bool false

incoming_starts_queued_torrents. 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.

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

name type default
strict_end_game_mode bool true

strict_end_game_mode controls when a block may be requested twice. If this is true, a block may only be requested twice when there's at 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.

name type default
enable_outgoing_utp bool true
enable_incoming_utp bool true
enable_outgoing_tcp bool true
enable_incoming_tcp bool true

Enables incoming and outgoing, TCP and uTP peer connections. false is disabled and true is enabled. When outgoing connections are disabled, libtorrent will simply not make outgoing peer connections with the specific transport protocol. Disabled incoming peer connections will simply be rejected. These options only apply to peer connections, not tracker- or any other kinds of connections.

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. If false, any existing files will be checked. By setting this setting to true, the files won't be checked, but will go straight to download mode.

name type default
anonymous_mode bool false

anonymous_mode: When set to true, the client tries to hide its identity to a certain degree. The user-agent will be reset to an empty string (except for private torrents). 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.

name type default
report_web_seed_downloads bool true

specifies whether downloads from web seeds is reported to the tracker or not. Turning it off also excludes web seed traffic from other stats and download rate reporting via the libtorrent API.

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. 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.

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

name type default
smooth_connects bool true

smooth_connects 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.

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

name type default
apply_ip_filter_to_trackers bool true

apply_ip_filter_to_trackers 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.

name type default
ban_web_seeds bool true

when true, web seeds sending bad data will be banned

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.

name type default
support_share_mode bool true

if false, prevents libtorrent to advertise share-mode support

name type default
report_redundant_bytes bool true

if this is true, the number of redundant bytes is sent to the tracker

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.

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

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.

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.

name type default
enable_lsd bool true

Starts and stops Local Service Discovery. This service will broadcast the info-hashes of all the non-private torrents on the local network to look for peers on the same swarm within multicast reach.

name type default
enable_dht bool true

starts the dht node and makes the trackerless service available to torrents.

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, plain text otherwise

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.

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).

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

name type default
proxy_tracker_connections bool true

if true, tracker connections are made over the configured proxy, if any.

name type default
enable_ip_notifier bool true

Starts and stops the internal IP table route changes notifier.

The current implementation supports multiple platforms, and it is recommended to have it enable, but you may want to disable it if it's supported but unreliable, or if you have a better way to detect the changes. In the later case, you should manually call session_handle::reopen_network_sockets to ensure network changes are taken in consideration.

name type default
dht_prefer_verified_node_ids bool true

when this is true, nodes whose IDs are derived from their source IP according to BEP 42 are preferred in the routing table.

name type default
dht_restrict_routing_ips bool true

determines if the routing table entries should restrict entries to one per IP. This defaults to true, which helps mitigate some attacks on the DHT. It prevents adding multiple nodes with IPs with a very close CIDR distance.

when set, nodes whose IP address that's in the same /24 (or /64 for IPv6) range in the same routing table bucket. This is an attempt to mitigate node ID spoofing attacks also restrict any IP to only have a single entry in the whole routing table

name type default
dht_restrict_search_ips bool true

determines if DHT searches should prevent adding nodes with IPs with very close CIDR distance. This also defaults to true and helps mitigate certain attacks on the DHT.

name type default
dht_extended_routing_table bool true

makes the first buckets in the DHT routing table fit 128, 64, 32 and 16 nodes respectively, as opposed to the standard size of 8. All other buckets have size 8 still.

name type default
dht_aggressive_lookups bool true

slightly changes the lookup behavior in terms of how many outstanding requests we keep. Instead of having branch factor be a hard limit, we always keep branch factor outstanding requests to the closest nodes. i.e. every time we get results back with closer nodes, we query them right away. It lowers the lookup times at the cost of more outstanding queries.

name type default
dht_privacy_lookups bool false

when set, perform lookups in a way that is slightly more expensive, but which minimizes the amount of information leaked about you.

name type default
dht_enforce_node_id bool false

when set, node's whose IDs that are not correctly generated based on its external IP are ignored. When a query arrives from such node, an error message is returned with a message saying "invalid node ID".

name type default
dht_ignore_dark_internet bool true

ignore DHT messages from parts of the internet we wouldn't expect to see any traffic from

name type default
dht_read_only bool false

when set, the other nodes won't keep this node in their routing tables, it's meant for low-power and/or ephemeral devices that cannot support the DHT, it is also useful for mobile devices which are sensitive to network traffic and battery life. this node no longer responds to 'query' messages, and will place a 'ro' key (value = 1) in the top-level message dictionary of outgoing query messages.

name type default
piece_extent_affinity bool false

when this is true, create an affinity for downloading 4 MiB extents of adjacent pieces. This is an attempt to achieve better disk I/O throughput by downloading larger extents of bytes, for torrents with small piece sizes

name type default
validate_https_trackers bool true

when set to true, the certificate of HTTPS trackers and HTTPS web seeds will be validated against the system's certificate store (as defined by OpenSSL). If the system does not have a certificate store, this option may have to be disabled in order to get trackers and web seeds to work).

name type default
ssrf_mitigation bool true

when enabled, tracker and web seed requests are subject to certain restrictions.

An HTTP(s) tracker requests to localhost (loopback) must have the request path start with "/announce". This is the conventional bittorrent tracker request. Any other HTTP(S) tracker request to loopback will be rejected. This applies to trackers that redirect to loopback as well.

Web seeds that end up on the client's local network (i.e. in a private IP address range) may not include query string arguments. This applies to web seeds redirecting to the local network as well.

Web seeds on global IPs (i.e. not local network) may not redirect to a local network address

name type default
allow_idna bool false

when disabled, any tracker or web seed with an IDNA hostname (internationalized domain name) is ignored. This is a security precaution to avoid various unicode encoding attacks that might happen at the application level.

name type default
enable_set_file_valid_data bool false

when set to true, enables the attempt to use SetFileValidData() to pre-allocate disk space. This system call will only work when running with Administrator privileges on Windows, and so this setting is only relevant in that scenario. Using SetFileValidData() poses a security risk, as it may reveal previously deleted information from the disk.

name type default
socks5_udp_send_local_ep bool false

When using a SOCKS5 proxy, UDP traffic is routed through the proxy by sending a UDP ASSOCIATE command. If this option is true, the UDP ASSOCIATE command will include the IP address and listen port to the local UDP socket. This indicates to the proxy which source endpoint to expect our packets from. The benefit is that incoming packets can be forwarded correctly, before any outgoing packets are sent. The risk is that if there's a NAT between the client and the proxy, the IP address specified in the protocol may not be valid from the proxy's point of view.

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.

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.

name type default
stop_tracker_timeout int 5

stop_tracker_timeout is the number of seconds 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. If the value is set to 0, the connections to trackers with the stopped event are suppressed.

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 MiB).

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.

name type default
request_timeout int 60

the number of seconds one block (16 kiB) is expected to be received within. If it's not, the block is requested from a different peer

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.

name type default
max_allowed_in_request_queue int 2000

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.

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.

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.

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. 120 seconds is specified in the protocol specification. After half the time out, a keep alive message is sent.

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.

name type default
urlseed_pipeline_size int 5

controls the pipelining size of url and http 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

name type default
urlseed_wait_retry int 30

number of seconds until a new retry of a url-seed takes place. Default retry value for http-seeds that don't provide a valid retry-after header.

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.

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 failure counter is reset. If a peer is retrieved from a peer source (other than DHT) the failcount is decremented by one, allowing another try.

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.

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.

name type default
connection_speed int 30

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.

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.

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.

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.

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.

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. The first initial_picker_threshold pieces in any torrent are picked at random , the following pieces are picked in rarest first order.

name type default
allowed_fast_set_size int 5

the number of allowed pieces to send to peers that supports the fast extensions

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_suggestions which 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.
name type default
max_queued_disk_bytes int 1024 * 1024

max_queued_disk_bytes is the 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.

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.

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 16 kiB 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.

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 how many peers to unchoke. The unchoking algorithm for downloading torrents is always "tit-for-tat", i.e. the peers we download the fastest from are unchoked.

The options for choking algorithms are defined in the choking_algorithm_t enum.

seed_choking_algorithm controls the seeding unchoke behavior. i.e. How we select which peers to unchoke for seeding torrents. Since a seeding torrent isn't downloading anything, the tit-for-tat mechanism cannot be used. The available options are defined in the seed_choking_algorithm_t enum.

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
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.

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.

name type default
peer_tos int 0x20

peer_tos determines the TOS byte set in the IP header of every packet sent to peers (including web seeds). 0x0 means no marking, 0x20 represents the QBone scavenger service. For more details, see QBSS.

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 500

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.

active_tracker_limit is the max number of torrents to announce to their trackers.

active_lsd_limit is the max number of torrents to announce to the local network over the local service discovery protocol.

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.

name type default
auto_manage_interval int 30

auto_manage_interval is the number of seconds between the torrent queue is updated, and rotated.

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.

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.

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 can be used to save memory for paused torrents, since it's not as important for them to keep a large peer list.

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 mis-configured trackers.

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.

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.

name type default
max_rejects int 50

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.

name type default
recv_socket_buffer_size int 0
send_socket_buffer_size int 0

specifies the buffer sizes set on peer sockets. 0 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.

name type default
max_peer_recv_buffer_size int 2 * 1024 * 1024

the max number of bytes a single peer connection's receive buffer is allowed to grow to.

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.

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().

name type default
max_suggest_pieces int 16

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.

name type default
local_service_announce_interval int 5 * 60

local_service_announce_interval is the time between local network announces for a torrent. This interval is specified in seconds.

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).

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. 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.

name type default
num_optimistic_unchoke_slots int 0

num_optimistic_unchoke_slots is the number of optimistic unchoke slots to use. 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. 0 means automatic, where libtorrent opens up 20% of your allowed upload slots as optimistic unchoke slots.

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

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.

name type default
share_mode_target int 3

share_mode_target specifies the target share ratio for share mode torrents. If set to 3, 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.

name type default
upload_rate_limit int 0
download_rate_limit int 0

upload_rate_limit and download_rate_limit sets the session-global limits of upload and download rate limits, in bytes per second. By default peers on the local network are not rate limited.

A value of 0 means unlimited.

For fine grained control over rate limits, including making them apply to local peers, see peer classes.

name type default
dht_upload_rate_limit int 8000

the number of bytes per second (on average) the DHT is allowed to send. If the incoming requests causes to many bytes to be sent in responses, incoming requests will be dropped until the quota has been replenished.

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. Setting this limit to -1 means unlimited, i.e. all peers will always be unchoked.

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.

name type default
connections_slack int 10

connections_slack is the number of incoming connections exceeding the connection limit to accept in order to potentially replace existing ones.

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. utp_gain_factor is the number of bytes the uTP congestion window can increase at the most in one RTT. 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. 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 lost 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. Do not change this value unless you know what you're doing. Never set it higher than 100.

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).

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. 5 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 the listen_interfaces settings is updated.

name type default
torrent_connect_boost int 30

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. This may not be set higher than 255.

name type default
alert_queue_size int 2000

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. Once the alert queue is full, additional alerts will be dropped, and not delivered to the client. Once the client drains the queue, new alerts may be delivered again. In order to know that alerts have been dropped, see session_handle::dropped_alerts().

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.

name type default
hashing_threads int 2

hashing_threads is the number of disk I/O threads to use for piece hash verification. These threads are in addition to the regular disk I/O threads specified by settings_pack::aio_threads. The hasher threads do not only compute hashes, but also perform the read from disk. On storage optimal for sequential access, such as hard drives, this setting should probably be set to 1.

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

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.

name type default
aio_threads int 10

for some aio back-ends, aio_threads specifies the number of io-threads to use.

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.

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. Torrents that are considered done will still be allowed to be seeded, they just won't have priority anymore. For more, see queuing.

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

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.

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.

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

name type default
alert_mask int int

a bitmask combining flags from alert_category_t defining which kinds of alerts to receive

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.
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.

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.

name type default
proxy_type int settings_pack::none

proxy to use. see proxy_type_t.

name type default
proxy_port int 0

the port of the proxy server

name type default
i2p_port int 0

sets the i2p SAM bridge port to connect to. set the hostname with the i2p_hostname setting.

name type default
urlseed_max_request_bytes int 16 * 1024 * 1024

The maximum request range of an url seed in bytes. This value defines the largest possible sequential web seed request. Lower values are possible but will be ignored if they are lower then piece size. This value should be related to your download speed to prevent libtorrent from creating too many expensive http requests per second. You can select a value as high as you want but keep in mind that libtorrent can't create parallel requests if the first request did already select the whole file. If you combine bittorrent seeds with web seeds and pick strategies like rarest first you may find your web seed requests split into smaller parts because we don't download already picked pieces twice.

name type default
web_seed_name_lookup_retry int 1800

time to wait until a new retry of a web seed name lookup

name type default
close_file_interval int CLOSE_FILE_INTERVAL

the number of seconds between closing the file opened the longest ago. 0 means to disable the feature. The purpose of this is to periodically close files to trigger the operating system flushing disk cache. Specifically it has been observed to be required on windows to not have the disk cache grow indefinitely. This defaults to 240 seconds on windows, and disabled on other systems.

name type default
utp_cwnd_reduce_timer int 100

When uTP experiences packet loss, it will reduce the congestion window, and not reduce it again for this many milliseconds, even if experiencing another lost packet.

name type default
max_web_seed_connections int 3

the max number of web seeds to have connected per torrent at any given time.

name type default
resolver_cache_timeout int 1200

the number of seconds before the internal host name resolver considers a cache value timed out, negative values are interpreted as zero.

name type default
send_not_sent_low_watermark int 16384

specify the not-sent low watermark for socket send buffers. This corresponds to the, Linux-specific, TCP_NOTSENT_LOWAT TCP socket option.

name type default
rate_choker_initial_threshold int 1024

the rate based choker compares the upload rate to peers against a threshold that increases proportionally by its size for every peer it visits, visiting peers in decreasing upload rate. The number of upload slots is determined by the number of peers whose upload rate exceeds the threshold. This option sets the start value for this threshold. A higher value leads to fewer unchoke slots, a lower value leads to more.

name type default
upnp_lease_duration int 3600

The expiration time of UPnP port-mappings, specified in seconds. 0 means permanent lease. Some routers do not support expiration times on port-maps (nor correctly returning an error indicating lack of support). In those cases, set this to 0. Otherwise, don't set it any lower than 5 minutes.

name type default
max_concurrent_http_announces int 50

limits the number of concurrent HTTP tracker announces. Once the limit is hit, tracker requests are queued and issued when an outstanding announce completes.

name type default
dht_max_peers_reply int 100

the maximum number of peers to send in a reply to get_peers

name type default
dht_search_branching int 5

the number of concurrent search request the node will send when announcing and refreshing the routing table. This parameter is called alpha in the kademlia paper

name type default
dht_max_fail_count int 20

the maximum number of failed tries to contact a node before it is removed from the routing table. If there are known working nodes that are ready to replace a failing node, it will be replaced immediately, this limit is only used to clear out nodes that don't have any node that can replace them.

name type default
dht_max_torrents int 2000

the total number of torrents to track from the DHT. This is simply an upper limit to make sure malicious DHT nodes cannot make us allocate an unbounded amount of memory.

name type default
dht_max_dht_items int 700

max number of items the DHT will store

name type default
dht_max_peers int 500

the max number of peers to store per torrent (for the DHT)

name type default
dht_max_torrent_search_reply int 20

the max number of torrents to return in a torrent search query to the DHT

name type default
dht_block_timeout int 5 * 60

the number of seconds a DHT node is banned if it exceeds the rate limit. The rate limit is averaged over 10 seconds to allow for bursts above the limit.

name type default
dht_block_ratelimit int 5

the max number of packets per second a DHT node is allowed to send without getting banned.

name type default
dht_item_lifetime int 0

the number of seconds a immutable/mutable item will be expired. default is 0, means never expires.

name type default
dht_sample_infohashes_interval int 21600

the info-hashes sample recomputation interval (in seconds). The node will precompute a subset of the tracked info-hashes and return that instead of calculating it upon each request. The permissible range is between 0 and 21600 seconds (inclusive).

name type default
dht_max_infohashes_sample_count int 20

the maximum number of elements in the sampled subset of info-hashes. If this number is too big, expect the DHT storage implementations to clamp it in order to allow UDP packets go through

name type default
max_piece_count int 0x200000

max_piece_count is the maximum allowed number of pieces in metadata received via magnet links. Loading large torrents (with more pieces than the default limit) may also require passing in a higher limit to read_resume_data() and torrent_info::parse_info_section(), if those are used.

name type default
metadata_token_limit int 2500000

when receiving metadata (torrent file) from peers, this is the max number of bencoded tokens we're willing to parse. This limit is meant to prevent DoS attacks on peers. For very large torrents, this limit may have to be raised.

struct settings_pack final : settings_interface
{
   friend  void apply_pack_impl (settings_pack const*
      , aux::session_settings_single_thread&
      , std::vector<void(aux::session_impl::*)()>*);
   void set_str (int name, std::string val) override;
   void set_bool (int name, bool val) override;
   void set_int (int name, int val) override;
   void set_int (int name, flags::bitfield_flag<Type, Tag> const val);
   bool has_val (int name) const override;
   void clear ();
   void clear (int name);
   int get_int (int name) const override;
   bool get_bool (int name) const override;
   std::string const& get_str (int name) const override;
   void for_each (Fun&& f) const;

   enum type_bases
   {
      string_type_base,
      int_type_base,
      bool_type_base,
      type_mask,
      index_mask,
   };

   enum suggest_mode_t
   {
      no_piece_suggestions,
      suggest_read_cache,
   };

   enum choking_algorithm_t
   {
      fixed_slots_choker,
      rate_based_choker,
      deprecated_bittyrant_choker,
   };

   enum seed_choking_algorithm_t
   {
      round_robin,
      fastest_upload,
      anti_leech,
   };

   enum io_buffer_mode_t
   {
      enable_os_cache,
      deprecated_disable_os_cache_for_aligned_files,
      disable_os_cache,
   };

   enum bandwidth_mixed_algo_t
   {
      prefer_tcp,
      peer_proportional,
   };

   enum enc_policy
   {
      pe_forced,
      pe_enabled,
      pe_disabled,
   };

   enum enc_level
   {
      pe_plaintext,
      pe_rc4,
      pe_both,
   };

   enum proxy_type_t
   {
      none,
      socks4,
      socks5,
      socks5_pw,
      http,
      http_pw,
      i2p_proxy,
   };
};
[report issue]

set_int() set_bool() set_str()

void set_str (int name, std::string val) override;
void set_bool (int name, bool val) override;
void set_int (int name, int val) override;
void set_int (int name, flags::bitfield_flag<Type, Tag> const val);

set a configuration option in the settings_pack. name is one of the enum values from string_types, int_types or bool_types. They must match the respective type of the set_* function.

[report issue]

has_val()

bool has_val (int name) const override;

queries whether the specified configuration option has a value set in this pack. name can be any enumeration value from string_types, int_types or bool_types.

[report issue]

clear()

void clear ();

clear the settings pack from all settings

[report issue]

clear()

void clear (int name);

clear a specific setting from the pack

[report issue]

get_int() get_str() get_bool()

int get_int (int name) const override;
bool get_bool (int name) const override;
std::string const& get_str (int name) const override;

queries the current configuration option from the settings_pack. name is one of the enumeration values from string_types, int_types or bool_types. The enum value must match the type of the get_* function.

[report issue]

enum type_bases

Declared in "libtorrent/settings_pack.hpp"

name value description
string_type_base 0  
int_type_base 16384  
bool_type_base 32768  
type_mask 49152  
index_mask 16383  
[report issue]

enum suggest_mode_t

Declared in "libtorrent/settings_pack.hpp"

name value description
no_piece_suggestions 0  
suggest_read_cache 1  
[report issue]

enum choking_algorithm_t

Declared in "libtorrent/settings_pack.hpp"

name value description
fixed_slots_choker 0 This is the traditional choker with a fixed number of unchoke slots (as specified by settings_pack::unchoke_slots_limit).
rate_based_choker 2

This 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. Configure the initial threshold with settings_pack::rate_choker_initial_threshold.

For more information, see rate based choking.

deprecated_bittyrant_choker 3  
[report issue]

enum seed_choking_algorithm_t

Declared in "libtorrent/settings_pack.hpp"

name value description
round_robin 0 which round-robins the peers that are unchoked when seeding. This distributes the upload bandwidth uniformly and fairly. It minimizes the ability for a peer to download everything without redistributing it.
fastest_upload 1 unchokes the peers we can send to the fastest. This might be a bit more reliable in utilizing all available capacity.
anti_leech 2 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. This does not just take into account the pieces a peer is reporting having downloaded, but also the pieces we have sent to it.
[report issue]

enum io_buffer_mode_t

Declared in "libtorrent/settings_pack.hpp"

name value description
enable_os_cache 0  
deprecated_disable_os_cache_for_aligned_files 1  
disable_os_cache 2  
[report issue]

enum bandwidth_mixed_algo_t

Declared in "libtorrent/settings_pack.hpp"

name value description
prefer_tcp 0 disables the mixed mode bandwidth balancing
peer_proportional 1 does not throttle uTP, throttles TCP to the same proportion of throughput as there are TCP connections
[report issue]

enum enc_policy

Declared in "libtorrent/settings_pack.hpp"

name value description
pe_forced 0 Only encrypted connections are allowed. Incoming connections that are not encrypted are closed and if the encrypted outgoing connection fails, a non-encrypted retry will not be made.
pe_enabled 1 encrypted connections are enabled, but non-encrypted connections are allowed. An incoming non-encrypted connection will be accepted, and if an outgoing encrypted connection fails, a non- encrypted connection will be tried.
pe_disabled 2 only non-encrypted connections are allowed.
[report issue]

enum enc_level

Declared in "libtorrent/settings_pack.hpp"

name value description
pe_plaintext 1 use only plain text encryption
pe_rc4 2 use only RC4 encryption
pe_both 3 allow both
[report issue]

enum proxy_type_t

Declared in "libtorrent/settings_pack.hpp"

name value description
none 0 No proxy server is used and all other fields are ignored.
socks4 1 The server is assumed to be a SOCKS4 server that requires a username.
socks5 2 The server is assumed to be a SOCKS5 server (RFC 1928) that does not require any authentication. The username and password are ignored.
socks5_pw 3 The server is assumed to be a SOCKS5 server that supports plain text username and password authentication (RFC 1929). The username and password specified may be sent to the proxy if it requires.
http 4 The server is assumed to be an HTTP proxy. If the transport used for the connection is non-HTTP, the server is assumed to support the CONNECT method. i.e. for web seeds and HTTP trackers, a plain proxy will suffice. The proxy is assumed to not require authorization. The username and password will not be used.
http_pw 5 The server is assumed to be an HTTP proxy that requires user authorization. The username and password will be sent to the proxy.
i2p_proxy 6 route through a i2p SAM proxy
[report issue]

min_memory_usage() high_performance_seed()

Declared in "libtorrent/session.hpp"

settings_pack min_memory_usage ();
settings_pack high_performance_seed ();

The default values of the session settings are set for a regular bittorrent client running on a desktop system. There are functions that can set the session settings to pre set settings for other environments. These can be used for the basis, and should be tweaked to fit your needs better.

min_memory_usage returns settings that will use the minimal amount of RAM, at the potential expense of upload and download performance. It adjusts the socket buffer sizes, disables the disk cache, lowers the send buffer watermarks so that each connection only has at most one block in use at any one time. It lowers the outstanding blocks send to the disk I/O thread so that connections only have one block waiting to be flushed to disk at any given time. It lowers the max number of peers in the peer list for torrents. It performs multiple smaller reads when it hashes pieces, instead of reading it all into memory before hashing.

This configuration is intended to be the starting point for embedded devices. It will significantly reduce memory usage.

high_performance_seed returns settings optimized for a seed box, serving many peers and that doesn't do any downloading. It has a 128 MB disk cache and has a limit of 400 files in its file pool. It support fast upload rates by allowing large send buffers.

[report issue]

name_for_setting() setting_by_name()

Declared in "libtorrent/settings_pack.hpp"

char const* name_for_setting (int s);
int setting_by_name (string_view name);

converts a setting integer (from the enums string_types, int_types or bool_types) to a string, and vice versa.

[report issue]

default_settings()

Declared in "libtorrent/settings_pack.hpp"

settings_pack default_settings ();

returns a settings_pack with every setting set to its default value

[report issue]

generate_fingerprint()

Declared in "libtorrent/fingerprint.hpp"

std::string generate_fingerprint (std::string name
   , int major, int minor = 0, int revision = 0, int tag = 0);

This is a utility function to produce a client ID fingerprint formatted to the most common convention. The fingerprint can be set via the peer_fingerprint setting, in settings_pack.

The name string should contain exactly two characters. These are the characters unique to your client, used to identify it. Make sure not to clash with anybody else. Here are some taken id's:

id chars client
LT libtorrent (default)
UT uTorrent
UM uTorrent Mac
qB qBittorrent
BP BitTorrent Pro
BT BitTorrent
DE Deluge
AZ Azureus
TL Tribler

There's an informal directory of client id's here.

The major, minor, revision and tag parameters are used to identify the version of your client.

This section describes the functions and classes that are used to create torrent files. It is a layered API with low level classes and higher level convenience functions. A torrent is created in 4 steps:

  1. first the files that will be part of the torrent are determined.
  2. the torrent properties are set, such as tracker url, web seeds, DHT nodes etc.
  3. Read through all the files in the torrent, SHA-1 all the data and set the piece hashes.
  4. The torrent is bencoded into a file or buffer.

If there are a lot of files and or deep directory hierarchies to traverse, step one can be time consuming.

Typically step 3 is by far the most time consuming step, since it requires to read all the bytes from all the files in the torrent.

All of these classes and functions are declared by including libtorrent/create_torrent.hpp.

example:

file_storage fs;

// recursively adds files in directories
add_files(fs, "./my_torrent");

create_torrent t(fs);
t.add_tracker("http://my.tracker.com/announce");
t.set_creator("libtorrent example");

// reads the files and calculates the hashes
set_piece_hashes(t, ".");

ofstream out("my_torrent.torrent", std::ios_base::binary);
bencode(std::ostream_iterator<char>(out), t.generate());
[report issue]

create_torrent

Declared in "libtorrent/create_torrent.hpp"

This class holds state for creating a torrent. After having added all information to it, call create_torrent::generate() to generate the torrent. The entry that's returned can then be bencoded into a .torrent file using bencode().

struct create_torrent
{
   explicit create_torrent (file_storage& fs, int piece_size = 0
      , create_flags_t flags = {});
   explicit create_torrent (torrent_info const& ti);
   entry generate () const;
   file_storage const& files () const;
   void set_comment (char const* str);
   void set_creator (char const* str);
   void set_creation_date (std::time_t timestamp);
   void set_hash (piece_index_t index, sha1_hash const& h);
   void set_hash2 (file_index_t file, piece_index_t::diff_type piece, sha256_hash const& h);
   void add_url_seed (string_view url);
   void add_http_seed (string_view url);
   void add_node (std::pair<std::string, int> node);
   void add_tracker (string_view url, int tier = 0);
   void set_root_cert (string_view cert);
   void set_priv (bool p);
   bool priv () const;
   bool is_v1_only () const;
   bool is_v2_only () const;
   int num_pieces () const;
   int piece_size (piece_index_t i) const;
   int piece_length () const;
   void add_similar_torrent (sha1_hash ih);
   void add_collection (string_view c);

   static constexpr create_flags_t modification_time  = 2_bit;
   static constexpr create_flags_t symlinks  = 3_bit;
   static constexpr create_flags_t v2_only  = 5_bit;
   static constexpr create_flags_t v1_only  = 6_bit;
   static constexpr create_flags_t canonical_files  = 7_bit;
};
[report issue]

create_torrent()

explicit create_torrent (file_storage& fs, int piece_size = 0
      , create_flags_t flags = {});
explicit create_torrent (torrent_info const& ti);

The piece_size is the size of each piece in bytes. It must be a power of 2 and a minimum of 16 kiB. If a piece size of 0 is specified, a piece_size will be set automatically.

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 the info dictionary will be used by create_torrent::generate(). This means that none of the member functions of create_torrent that affects the content of the info dictionary (such as set_hash()), will have any affect.

The flags arguments specifies options for the torrent creation. It can be any combination of the flags defined by create_flags_t.

[report issue]

generate()

entry generate () const;

This function will generate the .torrent file as a bencode tree. In order to generate the flat file, use the bencode() function.

It may be useful to add custom entries to the torrent file before bencoding it and saving it to disk.

Whether the resulting torrent object is v1, v2 or hybrid depends on whether any of the v1_only or v2_only flags were set on the constructor. If neither were set, the resulting torrent depends on which hashes were set. If both v1 and v2 hashes were set, a hybrid torrent is created.

Any failure will cause this function to throw system_error, with an appropriate error message. These are the reasons this call may throw:

  • the file storage has 0 files
  • the total size of the file storage is 0 bytes (i.e. it only has empty files)
  • not all v1 hashes (set_hash()) and not all v2 hashes (set_hash2()) were set
  • for v2 torrents, you may not have a directory with the same name as a file. If that's encountered in the file storage, generate() fails.
[report issue]

files()

file_storage const& files () const;

returns an immutable reference to the file_storage used to create the torrent from.

[report issue]

set_comment()

void set_comment (char const* str);

Sets the comment for the torrent. The string str should be utf-8 encoded. The comment in a torrent file is optional.

[report issue]

set_creator()

void set_creator (char const* str);

Sets the creator of the torrent. The string str should be utf-8 encoded. This is optional.

[report issue]

set_creation_date()

void set_creation_date (std::time_t timestamp);

sets the "creation time" field. Defaults to the system clock at the time of construction of the create_torrent object. The timestamp is specified in seconds, posix time. If the creation date is set to 0, the "creation date" field will be omitted from the generated torrent.

[report issue]

set_hash()

void set_hash (piece_index_t index, sha1_hash const& h);

This sets the SHA-1 hash for the specified piece (index). You are required to set the hash for every piece in the torrent before generating it. If you have the files on disk, you can use the high level convenience function to do this. See set_piece_hashes(). A SHA-1 hash of all zeros is internally used to indicate a hash that has not been set. Setting such hash will not be considered set when calling generate(). This function will throw std::system_error if it is called on an object constructed with the v2_only flag.

[report issue]

set_hash2()

void set_hash2 (file_index_t file, piece_index_t::diff_type piece, sha256_hash const& h);

sets the bittorrent v2 hash for file file of the piece piece. piece is relative to the first piece of the file, starting at 0. The first piece in the file can be computed with file_storage::file_index_at_piece(). The hash, h, is the root of the merkle tree formed by the piece's 16 kiB blocks. Note that piece sizes must be powers-of-2, so all per-piece merkle trees are complete. A SHA-256 hash of all zeros is internally used to indicate a hash that has not been set. Setting such hash will not be considered set when calling generate(). This function will throw std::system_error if it is called on an object constructed with the v1_only flag.

[report issue]

add_http_seed() add_url_seed()

void add_url_seed (string_view url);
void add_http_seed (string_view url);

This adds a url seed to the torrent. You can have any number of url seeds. For a single file torrent, this should be an HTTP url, pointing to a file with identical content as the file of the torrent. For a multi-file torrent, it should point to a directory containing a directory with the same name as this torrent, and all the files of the torrent in it.

The second function, add_http_seed() adds an HTTP seed instead.

[report issue]

add_node()

void add_node (std::pair<std::string, int> node);

This adds a DHT node to the torrent. This especially useful if you're creating a tracker less torrent. It can be used by clients to bootstrap their DHT node from. The node is a hostname and a port number where there is a DHT node running. You can have any number of DHT nodes in a torrent.

[report issue]

add_tracker()

void add_tracker (string_view url, int tier = 0);

Adds a tracker to the torrent. This is not strictly required, but most torrents use a tracker as their main source of peers. The url should be an http:// or udp:// url to a machine running a bittorrent tracker that accepts announces for this torrent's info-hash. The tier is the fallback priority of the tracker. All trackers with tier 0 are tried first (in any order). If all fail, trackers with tier 1 are tried. If all of those fail, trackers with tier 2 are tried, and so on.

[report issue]

set_root_cert()

void set_root_cert (string_view cert);

This function sets an X.509 certificate in PEM format to the torrent. This makes the torrent an SSL torrent. An SSL torrent requires that each peer has a valid certificate signed by this root certificate. For SSL torrents, all peers are connecting over SSL connections. For more information, see the section on ssl torrents.

The string is not the path to the cert, it's the actual content of the certificate.

[report issue]

set_priv() priv()

void set_priv (bool p);
bool priv () const;

Sets and queries the private flag of the torrent. Torrents with the private flag set ask the client to not use any other sources than the tracker for peers, and to not use DHT to advertise itself publicly, only the tracker.

[report issue]

num_pieces()

int num_pieces () const;

returns the number of pieces in the associated file_storage object.

[report issue]

piece_size() piece_length()

int piece_size (piece_index_t i) const;
int piece_length () const;

piece_length() returns the piece size of all pieces but the last one. piece_size() returns the size of the specified piece. these functions are just forwarding to the associated file_storage.

[report issue]

add_collection() add_similar_torrent()

void add_similar_torrent (sha1_hash ih);
void add_collection (string_view c);

Add similar torrents (by info-hash) or collections of similar torrents. Similar torrents are expected to share some files with this torrent. Torrents sharing a collection name with this torrent are also expected to share files with this torrent. A torrent may have more than one collection and more than one similar torrents. For more information, see BEP 38.

[report issue]
modification_time
This will include the file modification time as part of the torrent. This is not enabled by default, as it might cause problems when you create a torrent from separate files with the same content, hoping to yield the same info-hash. If the files have different modification times, with this option enabled, you would get different info-hashes for the files.
[report issue]
symlinks
If this flag is set, files that are symlinks get a symlink attribute set on them and their data will not be included in the torrent. This is useful if you need to reconstruct a file hierarchy which contains symlinks.
[report issue]
v2_only
Do not generate v1 metadata. The resulting torrent will only be usable by clients which support v2. This requires setting all v2 hashes, with set_hash2() before calling generate(). Setting v1 hashes (with set_hash()) is an error with this flag set.
[report issue]
v1_only
do not generate v2 metadata or enforce v2 alignment and padding rules this is mainly for tests, not recommended for production use. This requires setting all v1 hashes, with set_hash(), before calling generate(). Setting v2 hashes (with set_hash2()) is an error with this flag set.
[report issue]
canonical_files
This flag only affects v1-only torrents, and is only relevant together with the v1_only_flag. This flag will force the same file order and padding as a v2 (or hybrid) torrent would have. It has the effect of ordering files and inserting pad files to align them with piece boundaries.
[report issue]

add_files()

Declared in "libtorrent/create_torrent.hpp"

void add_files (file_storage& fs, std::string const& file
   , create_flags_t flags = {});
void add_files (file_storage& fs, std::string const& file
   , std::function<bool(std::string)> p, create_flags_t flags = {});

Adds the file specified by path to the file_storage object. In case path refers to a directory, files will be added recursively from the directory.

If specified, the predicate p is called once for every file and directory that is encountered. Files for which p returns true are added, and directories for which p returns true are traversed. p must have the following signature:

bool Pred(std::string const& p);

The path that is passed in to the predicate is the full path of the file or directory. If no predicate is specified, all files are added, and all directories are traversed.

The ".." directory is never traversed.

The flags argument should be the same as the flags passed to the create_torrent constructor.

[report issue]

set_piece_hashes()

Declared in "libtorrent/create_torrent.hpp"

inline void set_piece_hashes (create_torrent& t, std::string const& p
   , settings_interface const& settings
   , std::function<void(piece_index_t)> const& f);
void set_piece_hashes (create_torrent& t, std::string const& p
   , settings_interface const& settings
   , std::function<void(piece_index_t)> const& f, error_code& ec);
inline void set_piece_hashes (create_torrent& t, std::string const& p
   , std::function<void(piece_index_t)> const& f);
void set_piece_hashes (create_torrent& t, std::string const& p
   , std::function<void(piece_index_t)> const& f, error_code& ec);
void set_piece_hashes (create_torrent& t, std::string const& p
   , settings_interface const& settings, disk_io_constructor_type disk_io
   , std::function<void(piece_index_t)> const& f, error_code& ec);
inline void set_piece_hashes (create_torrent& t, std::string const& p);
inline void set_piece_hashes (create_torrent& t, std::string const& p, error_code& ec);

This function will assume that the files added to the torrent file exists at path p, read those files and hash the content and set the hashes in the create_torrent object. The optional function f is called in between every hash that is set. f must have the following signature:

void Fun(piece_index_t);

The overloads taking a settings_pack may be used to configure the underlying disk access. Such as settings_pack::aio_threads.

The overloads that don't take an error_code& may throw an exception in case of a file error, the other overloads sets the error code to reflect the error, if any.

The pop_alerts() function on session is the main interface for retrieving 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. settings_pack::alert_mask can be used to specify which kinds of events should be reported. The alert mask is a combination of the alert_category_t flags in the alert class.

Every alert belongs to one or more category. There is a cost associated with posting alerts. Only alerts that belong to an enabled category are posted. Setting the alert bitmask to 0 will disable all alerts (except those that are non-discardable). Alerts that are responses to API calls such as save_resume_data() and post_session_stats() are non-discardable and will be posted even if their category is disabled.

There are other alert base classes that some alerts derive from, all the alerts that are generated for a specific torrent are derived from torrent_alert, and tracker events derive from tracker_alert.

Alerts returned by pop_alerts() are only valid until the next call to pop_alerts(). You may not copy an alert object to access it after the next call to pop_alerts(). Internal members of alerts also become invalid once pop_alerts() is called again.

[report issue]

alert

Declared in "libtorrent/alert.hpp"

The alert class is the base class that specific messages are derived from. alert types are not copyable, and cannot be constructed by the client. The pointers returned by libtorrent are short lived (the details are described under session_handle::pop_alerts())

struct alert
{
   time_point timestamp () const;
   virtual int type () const noexcept = 0;
   virtual char const* what () const noexcept = 0;
   virtual std::string message () const = 0;
   virtual alert_category_t category () const noexcept = 0;

   static constexpr alert_category_t error_notification  = 0_bit;
   static constexpr alert_category_t peer_notification  = 1_bit;
   static constexpr alert_category_t port_mapping_notification  = 2_bit;
   static constexpr alert_category_t storage_notification  = 3_bit;
   static constexpr alert_category_t tracker_notification  = 4_bit;
   static constexpr alert_category_t connect_notification  = 5_bit;
   static constexpr alert_category_t status_notification  = 6_bit;
   static constexpr alert_category_t ip_block_notification  = 8_bit;
   static constexpr alert_category_t performance_warning  = 9_bit;
   static constexpr alert_category_t dht_notification  = 10_bit;
   static constexpr alert_category_t session_log_notification  = 13_bit;
   static constexpr alert_category_t torrent_log_notification  = 14_bit;
   static constexpr alert_category_t peer_log_notification  = 15_bit;
   static constexpr alert_category_t incoming_request_notification  = 16_bit;
   static constexpr alert_category_t dht_log_notification  = 17_bit;
   static constexpr alert_category_t dht_operation_notification  = 18_bit;
   static constexpr alert_category_t port_mapping_log_notification  = 19_bit;
   static constexpr alert_category_t picker_log_notification  = 20_bit;
   static constexpr alert_category_t file_progress_notification  = 21_bit;
   static constexpr alert_category_t piece_progress_notification  = 22_bit;
   static constexpr alert_category_t upload_notification  = 23_bit;
   static constexpr alert_category_t block_progress_notification  = 24_bit;
   static constexpr alert_category_t all_categories  = alert_category_t::all();
};
[report issue]

timestamp()

time_point timestamp () const;

a timestamp is automatically created in the constructor

[report issue]

type()

virtual int type () const noexcept = 0;

returns an integer that is unique to this alert type. It can be compared against a specific alert by querying a static constant called alert_type in the alert. It can be used to determine the run-time type of an alert* in order to cast to that alert type and access specific members.

e.g:

std::vector<alert*> alerts;
ses.pop_alerts(&alerts);
for (alert* a : alerts) {
        switch (a->type()) {

                case read_piece_alert::alert_type:
                {
                        auto* p = static_cast<read_piece_alert*>(a);
                        if (p->ec) {
                                // read_piece failed
                                break;
                        }
                        // use p
                        break;
                }
                case file_renamed_alert::alert_type:
                {
                        // etc...
                }
        }
}
[report issue]

what()

virtual char const* what () const noexcept = 0;

returns a string literal describing the type of the alert. It does not include any information that might be bundled with the alert.

[report issue]

message()

virtual std::string message () const = 0;

generate a string describing the alert and the information bundled with it. This is mainly intended for debug and development use. It is not suitable to use this for applications that may be localized. Instead, handle each alert type individually and extract and render the information from the alert depending on the locale.

[report issue]

category()

virtual alert_category_t category () const noexcept = 0;

returns a bitmask specifying which categories this alert belong to.

[report issue]

dht_routing_bucket

Declared in "libtorrent/alert_types.hpp"

struct to hold information about a single DHT routing table bucket

struct dht_routing_bucket
{
   int num_nodes;
   int num_replacements;
   int last_active;
};
[report issue]
num_nodes num_replacements
the total number of nodes and replacement nodes in the routing table
[report issue]
last_active
number of seconds since last activity
[report issue]

torrent_alert

Declared in "libtorrent/alert_types.hpp"

This is a base class for alerts that are associated with a specific torrent. It contains a handle to the torrent.

Note that by the time the client receives a torrent_alert, its handle member may be invalid.

struct torrent_alert : alert
{
   std::string message () const override;
   char const* torrent_name () const;

   torrent_handle handle;
};
[report issue]

message()

std::string message () const override;

returns the message associated with this alert

[report issue]
handle
The torrent_handle pointing to the torrent this alert is associated with.
[report issue]

peer_alert

Declared in "libtorrent/alert_types.hpp"

The peer alert is a base class for alerts that refer to a specific peer. It includes all the information to identify the peer. i.e. ip and peer-id.

struct peer_alert : torrent_alert
{
   std::string message () const override;

   aux::noexcept_movable<tcp::endpoint> endpoint;
   peer_id pid;
};
[report issue]
endpoint
The peer's IP address and port.
[report issue]
pid
the peer ID, if known.
[report issue]

tracker_alert

Declared in "libtorrent/alert_types.hpp"

This is a base class used for alerts that are associated with a specific tracker. It derives from torrent_alert since a tracker is also associated with a specific torrent.

struct tracker_alert : torrent_alert
{
   std::string message () const override;
   char const* tracker_url () const;

   aux::noexcept_movable<tcp::endpoint> local_endpoint;
};
[report issue]

tracker_url()

char const* tracker_url () const;

returns a 0-terminated string of the tracker's URL

[report issue]
local_endpoint
endpoint of the listen interface being announced
[report issue]

torrent_removed_alert

Declared in "libtorrent/alert_types.hpp"

The torrent_removed_alert is posted whenever a torrent is removed. Since the torrent handle in its base class will usually be invalid (since the torrent is already removed) it has the info hash as a member, to identify it. It's posted when the alert_category::status bit is set in the alert_mask.

Note that the handle remains valid for some time after torrent_removed_alert is posted, as long as some internal libtorrent task (such as an I/O task) refers to it. Additionally, other alerts like save_resume_data_alert may be posted after torrent_removed_alert. To synchronize on whether the torrent has been removed or not, call torrent_handle::in_session(). This will return true before torrent_removed_alert is posted, and false afterward.

Even though the handle member doesn't point to an existing torrent anymore, it is still useful for comparing to other handles, which may also no longer point to existing torrents, but to the same non-existing torrents.

The torrent_handle acts as a weak_ptr, even though its object no longer exists, it can still compare equal to another weak pointer which points to the same non-existent object.

struct torrent_removed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   info_hash_t info_hashes;
   client_data_t userdata;
};
[report issue]
userdata
'userdata` as set in add_torrent_params at torrent creation. This can be used to associate this torrent with related data in the client application more efficiently than info_hashes.
[report issue]

read_piece_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when the asynchronous read operation initiated by a call to torrent_handle::read_piece() is completed. If the read failed, the torrent is paused and an error state is set and the buffer member of the alert is 0. If successful, buffer points to a buffer containing all the data of the piece. piece is the piece index that was read. size is the number of bytes that was read.

If the operation fails, error will indicate what went wrong.

struct read_piece_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage;
   error_code const error;
   boost::shared_array<char> const buffer;
   piece_index_t const piece;
   int const size;
};
[report issue]

file_completed_alert

Declared in "libtorrent/alert_types.hpp"

This is posted whenever an individual file completes its download. i.e. All pieces overlapping this file have passed their hash check.

struct file_completed_alert final : torrent_alert
{
   std::string message () const override;

   file_index_t const index;
};
[report issue]
index
refers to the index of the file that completed.
[report issue]

file_renamed_alert

Declared in "libtorrent/alert_types.hpp"

This is posted as a response to a torrent_handle::rename_file() call, if the rename operation succeeds.

struct file_renamed_alert final : torrent_alert
{
   std::string message () const override;
   char const* old_name () const;
   char const* new_name () const;

   static constexpr alert_category_t static_category  = alert_category::storage;
   file_index_t const index;
};
[report issue]

old_name() new_name()

char const* old_name () const;
char const* new_name () const;

returns the new and previous file name, respectively.

[report issue]
index
refers to the index of the file that was renamed,
[report issue]

file_rename_failed_alert

Declared in "libtorrent/alert_types.hpp"

This is posted as a response to a torrent_handle::rename_file() call, if the rename operation failed.

struct file_rename_failed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage;
   file_index_t const index;
   error_code const error;
};
[report issue]
index error
refers to the index of the file that was supposed to be renamed, error is the error code returned from the filesystem.
[report issue]

performance_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a limit is reached that might have a negative impact on upload or download rate performance.

struct performance_alert final : torrent_alert
{
   std::string message () const override;

   enum performance_warning_t
   {
      outstanding_disk_buffer_limit_reached,
      outstanding_request_limit_reached,
      upload_limit_too_low,
      download_limit_too_low,
      send_buffer_watermark_too_low,
      too_many_optimistic_unchoke_slots,
      too_high_disk_queue_limit,
      aio_limit_reached,
      deprecated_bittyrant_with_no_uplimit,
      too_few_outgoing_ports,
      too_few_file_descriptors,
      num_warnings,
   };

   static constexpr alert_category_t static_category  = alert_category::performance_warning;
   performance_warning_t const warning_code;
};
[report issue]

enum performance_warning_t

Declared in "libtorrent/alert_types.hpp"

name value description
outstanding_disk_buffer_limit_reached 0 This warning means that the number of bytes queued to be written to disk exceeds the max disk byte queue setting (settings_pack::max_queued_disk_bytes). This might restrict the download rate, by not queuing up enough write jobs to the disk I/O thread. When this alert is posted, peer connections are temporarily stopped from downloading, until the queued disk bytes have fallen below the limit again. Unless your max_queued_disk_bytes setting is already high, you might want to increase it to get better performance.
outstanding_request_limit_reached 1 This is posted when libtorrent would like to send more requests to a peer, but it's limited by settings_pack::max_out_request_queue. The queue length libtorrent is trying to achieve is determined by the download rate and the assumed round-trip-time (settings_pack::request_queue_time). The assumed round-trip-time is not limited to just the network RTT, but also the remote disk access time and message handling time. It defaults to 3 seconds. The target number of outstanding requests is set to fill the bandwidth-delay product (assumed RTT times download rate divided by number of bytes per request). When this alert is posted, there is a risk that the number of outstanding requests is too low and limits the download rate. You might want to increase the max_out_request_queue setting.
upload_limit_too_low 2 This warning is posted when the amount of TCP/IP overhead is greater than the upload rate limit. When this happens, the TCP/IP overhead is caused by a much faster download rate, triggering TCP ACK packets. These packets eat into the rate limit specified to libtorrent. When the overhead traffic is greater than the rate limit, libtorrent will not be able to send any actual payload, such as piece requests. This means the download rate will suffer, and new requests can be sent again. There will be an equilibrium where the download rate, on average, is about 20 times the upload rate limit. If you want to maximize the download rate, increase the upload rate limit above 5% of your download capacity.
download_limit_too_low 3 This is the same warning as upload_limit_too_low but referring to the download limit instead of upload. This suggests that your download rate limit is much lower than your upload capacity. Your upload rate will suffer. To maximize upload rate, make sure your download rate limit is above 5% of your upload capacity.
send_buffer_watermark_too_low 4

We're stalled on the disk. We want to write to the socket, and we can write but our send buffer is empty, waiting to be refilled from the disk. This either means the disk is slower than the network connection or that our send buffer watermark is too small, because we can send it all before the disk gets back to us. The number of bytes that we keep outstanding, requested from the disk, is calculated as follows:

min(512, max(upload_rate * send_buffer_watermark_factor / 100, send_buffer_watermark))

If you receive this alert, you might want to either increase your send_buffer_watermark or send_buffer_watermark_factor.

too_many_optimistic_unchoke_slots 5 If the half (or more) of all upload slots are set as optimistic unchoke slots, this warning is issued. You probably want more regular (rate based) unchoke slots.
too_high_disk_queue_limit 6 If the disk write queue ever grows larger than half of the cache size, this warning is posted. The disk write queue eats into the total disk cache and leaves very little left for the actual cache. This causes the disk cache to oscillate in evicting large portions of the cache before allowing peers to download any more, onto the disk write queue. Either lower max_queued_disk_bytes or increase cache_size.
aio_limit_reached 7  
deprecated_bittyrant_with_no_uplimit 8  
too_few_outgoing_ports 9 This is generated if outgoing peer connections are failing because of address in use errors, indicating that settings_pack::outgoing_ports is set and is too small of a range. Consider not using the outgoing_ports setting at all, or widen the range to include more ports.
too_few_file_descriptors 10  
num_warnings 11  
[report issue]

state_changed_alert

Declared in "libtorrent/alert_types.hpp"

Generated whenever a torrent changes its state.

struct state_changed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   torrent_status::state_t const state;
   torrent_status::state_t const prev_state;
};
[report issue]
state
the new state of the torrent.
[report issue]
prev_state
the previous state.
[report issue]

tracker_error_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated on tracker time outs, premature disconnects, invalid response or a HTTP response other than "200 OK". From the alert you can get the handle to the torrent the tracker belongs to.

struct tracker_error_alert final : tracker_alert
{
   std::string message () const override;
   char const* failure_reason () const;

   static constexpr alert_category_t static_category  = alert_category::tracker | alert_category::error;
   int const times_in_row;
   error_code const error;
   operation_t op;
};
[report issue]

failure_reason()

char const* failure_reason () const;

if the tracker sent a "failure reason" string, it will be returned here.

[report issue]
times_in_row
This member says how many times in a row this tracker has failed.
[report issue]
error
the error code indicating why the tracker announce failed. If it is is lt::errors::tracker_failure the failure_reason() might contain a more detailed description of why the tracker rejected the request. HTTP status codes indicating errors are also set in this field.
[report issue]

tracker_warning_alert

Declared in "libtorrent/alert_types.hpp"

This alert is triggered if the tracker reply contains a warning field. Usually this means that the tracker announce was successful, but the tracker has a message to the client.

struct tracker_warning_alert final : tracker_alert
{
   std::string message () const override;
   char const* warning_message () const;

   static constexpr alert_category_t static_category  = alert_category::tracker | alert_category::error;
};
[report issue]

warning_message()

char const* warning_message () const;

the message associated with this warning

[report issue]

scrape_reply_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a scrape request succeeds.

struct scrape_reply_alert final : tracker_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::tracker;
   int const incomplete;
   int const complete;
};
[report issue]
incomplete complete
the data returned in the scrape response. These numbers may be -1 if the response was malformed.
[report issue]

scrape_failed_alert

Declared in "libtorrent/alert_types.hpp"

If a scrape request fails, this alert is generated. This might be due to the tracker timing out, refusing connection or returning an http response code indicating an error.

struct scrape_failed_alert final : tracker_alert
{
   std::string message () const override;
   char const* error_message () const;

   static constexpr alert_category_t static_category  = alert_category::tracker | alert_category::error;
   error_code const error;
};
[report issue]

error_message()

char const* error_message () const;

if the error indicates there is an associated message, this returns that message. Otherwise and empty string.

[report issue]
error
the error itself. This may indicate that the tracker sent an error message (error::tracker_failure), in which case it can be retrieved by calling error_message().
[report issue]

tracker_reply_alert

Declared in "libtorrent/alert_types.hpp"

This alert is only for informational purpose. It is generated when a tracker announce succeeds. It is generated regardless what kind of tracker was used, be it UDP, HTTP or the DHT.

struct tracker_reply_alert final : tracker_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::tracker;
   int const num_peers;
};
[report issue]
num_peers
tells how many peers the tracker returned in this response. This is not expected to be greater than the num_want settings. These are not necessarily all new peers, some of them may already be connected.
[report issue]

dht_reply_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated each time the DHT receives peers from a node. num_peers is the number of peers we received in this packet. Typically these packets are received from multiple DHT nodes, and so the alerts are typically generated a few at a time.

struct dht_reply_alert final : tracker_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht | alert_category::tracker;
   int const num_peers;
};
[report issue]

tracker_announce_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated each time a tracker announce is sent (or attempted to be sent). There are no extra data members in this alert. The url can be found in the base class however.

struct tracker_announce_alert final : tracker_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::tracker;
   event_t const event;
};
[report issue]
event
specifies what event was sent to the tracker. See event_t.
[report issue]

hash_failed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a finished piece fails its hash check. You can get the handle to the torrent which got the failed piece and the index of the piece itself from the alert.

struct hash_failed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   piece_index_t const piece_index;
};
[report issue]

peer_ban_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer is banned because it has sent too many corrupt pieces to us. ip is the endpoint to the peer that was banned.

struct peer_ban_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
};
[report issue]

peer_unsnubbed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer is un-snubbed. Essentially when it was snubbed for stalling sending data, and now it started sending data again.

struct peer_unsnubbed_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
};
[report issue]

peer_snubbed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer is snubbed, when it stops sending data when we request it.

struct peer_snubbed_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
};
[report issue]

peer_error_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer sends invalid data over the peer-peer protocol. The peer will be disconnected, but you get its ip address from the alert, to identify it.

struct peer_error_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
   operation_t op;
   error_code const error;
};
[report issue]
op
a 0-terminated string of the low-level operation that failed, or nullptr if there was no low level disk operation.
[report issue]
error
tells you what error caused this alert.
[report issue]

peer_connect_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted every time an incoming peer connection both successfully passes the protocol handshake and is associated with a torrent, or an outgoing peer connection attempt succeeds. For arbitrary incoming connections, see incoming_connection_alert.

struct peer_connect_alert final : peer_alert
{
   std::string message () const override;

   enum direction_t
   {
      in,
      out,
   };

   static constexpr alert_category_t static_category  = alert_category::connect;
   direction_t direction;
   socket_type_t socket_type;
};
[report issue]

enum direction_t

Declared in "libtorrent/alert_types.hpp"

name value description
in 0  
out 1  
[report issue]
direction
Tells you if the peer was incoming or outgoing
[report issue]

peer_disconnected_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer is disconnected for any reason (other than the ones covered by peer_error_alert ).

struct peer_disconnected_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::connect;
   socket_type_t const socket_type;
   operation_t const op;
   error_code const error;
   close_reason_t const reason;
};
[report issue]
socket_type
the kind of socket this peer was connected over
[report issue]
op
the operation or level where the error occurred. Specified as an value from the operation_t enum. Defined in operations.hpp.
[report issue]
error
tells you what error caused peer to disconnect.
[report issue]
reason
the reason the peer disconnected (if specified)
[report issue]

invalid_request_alert

Declared in "libtorrent/alert_types.hpp"

This is a debug alert that is generated by an incoming invalid piece request. ip is the address of the peer and the request is the actual incoming request from the peer. See peer_request for more info.

struct invalid_request_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
   peer_request const request;
   bool const we_have;
   bool const peer_interested;
   bool const withheld;
};
[report issue]
request
the request we received from the peer
[report issue]
we_have
true if we have this piece
[report issue]
peer_interested
true if the peer indicated that it was interested to download before sending the request
[report issue]
withheld
if this is true, the peer is not allowed to download this piece because of super-seeding rules.
[report issue]

torrent_finished_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a torrent switches from being a downloader to a seed. It will only be generated once per torrent. It contains a torrent_handle to the torrent in question.

struct torrent_finished_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

piece_finished_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted every time a piece completes downloading and passes the hash check. This alert derives from torrent_alert which contains the torrent_handle to the torrent the piece belongs to. Note that being downloaded and passing the hash check may happen before the piece is also fully flushed to disk. So torrent_handle::have_piece() may still return false

struct piece_finished_alert final : torrent_alert
{
   std::string message () const override;

   piece_index_t const piece_index;
};
[report issue]
piece_index
the index of the piece that finished
[report issue]

request_dropped_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a peer rejects or ignores a piece request.

struct request_dropped_alert final : peer_alert
{
   std::string message () const override;

   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

block_timeout_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a block request times out.

struct block_timeout_alert final : peer_alert
{
   std::string message () const override;

   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

block_finished_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a block request receives a response.

struct block_finished_alert final : peer_alert
{
   std::string message () const override;

   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

block_downloading_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a block request is sent to a peer.

struct block_downloading_alert final : peer_alert
{
   std::string message () const override;

   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

unwanted_block_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a block is received that was not requested or whose request timed out.

struct unwanted_block_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

storage_moved_alert

Declared in "libtorrent/alert_types.hpp"

The storage_moved_alert is generated when all the disk IO has completed and the files have been moved, as an effect of a call to torrent_handle::move_storage. This is useful to synchronize with the actual disk. The storage_path() member return the new path of the storage.

struct storage_moved_alert final : torrent_alert
{
   std::string message () const override;
   char const* storage_path () const;
   char const* old_path () const;

   static constexpr alert_category_t static_category  = alert_category::storage;
};
[report issue]

old_path() storage_path()

char const* storage_path () const;
char const* old_path () const;

the path the torrent was moved to and from, respectively.

[report issue]

storage_moved_failed_alert

Declared in "libtorrent/alert_types.hpp"

The storage_moved_failed_alert is generated when an attempt to move the storage, via torrent_handle::move_storage(), fails.

struct storage_moved_failed_alert final : torrent_alert
{
   std::string message () const override;
   char const* file_path () const;

   static constexpr alert_category_t static_category  = alert_category::storage;
   error_code const error;
   operation_t op;
};
[report issue]

file_path()

char const* file_path () const;

If the error happened for a specific file, this returns its path.

[report issue]
op
this indicates what underlying operation caused the error
[report issue]

torrent_deleted_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a request to delete the files of a torrent complete.

This alert is posted in the alert_category::storage category, and that bit needs to be set in the alert_mask.

struct torrent_deleted_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage;
   info_hash_t info_hashes;
};
[report issue]
info_hashes
The info-hash of the torrent that was just deleted. Most of the time the torrent_handle in the torrent_alert will be invalid by the time this alert arrives, since the torrent is being deleted. The info_hashes member is hence the main way of identifying which torrent just completed the delete.
[report issue]

torrent_delete_failed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a request to delete the files of a torrent fails. Just removing a torrent from the session cannot fail

struct torrent_delete_failed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage
   | alert_category::error;
   error_code const error;
   info_hash_t info_hashes;
};
[report issue]
error
tells you why it failed.
[report issue]
info_hashes
the info hash of the torrent whose files failed to be deleted
[report issue]

save_resume_data_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated as a response to a torrent_handle::save_resume_data request. It is generated once the disk IO thread is done writing the state for this torrent.

struct save_resume_data_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage;
   add_torrent_params params;
};
[report issue]
params
the params structure is populated with the fields to be passed to add_torrent() or async_add_torrent() to resume the torrent. To save the state to disk, you may pass it on to write_resume_data().
[report issue]

save_resume_data_failed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated instead of save_resume_data_alert if there was an error generating the resume data. error describes what went wrong.

struct save_resume_data_failed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage
   | alert_category::error;
   error_code const error;
};
[report issue]
error
the error code from the resume_data failure
[report issue]

torrent_paused_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated as a response to a torrent_handle::pause request. It is generated once all disk IO is complete and the files in the torrent have been closed. This is useful for synchronizing with the disk.

struct torrent_paused_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

torrent_resumed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated as a response to a torrent_handle::resume() request. It is generated when a torrent goes from a paused state to an active state.

struct torrent_resumed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

torrent_checked_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when a torrent completes checking. i.e. when it transitions out of the checking files state into a state where it is ready to start downloading

struct torrent_checked_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

url_seed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a HTTP seed name lookup fails.

struct url_seed_alert final : torrent_alert
{
   std::string message () const override;
   char const* server_url () const;
   char const* error_message () const;

   static constexpr alert_category_t static_category  = alert_category::peer | alert_category::error;
   error_code const error;
};
[report issue]

server_url()

char const* server_url () const;

the URL the error is associated with

[report issue]

error_message()

char const* error_message () const;

in case the web server sent an error message, this function returns it.

[report issue]
error
the error the web seed encountered. If this is not set, the server sent an error message, call error_message().
[report issue]

file_error_alert

Declared in "libtorrent/alert_types.hpp"

If the storage fails to read or write files that it needs access to, this alert is generated and the torrent is paused.

struct file_error_alert final : torrent_alert
{
   std::string message () const override;
   char const* filename () const;

   static constexpr alert_category_t static_category  = alert_category::status
   | alert_category::storage;
   error_code const error;
   operation_t op;
};
[report issue]

filename()

char const* filename () const;

the file that experienced the error

[report issue]
error
the error code describing the error.
[report issue]
op
indicates which underlying operation caused the error
[report issue]

metadata_failed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when the metadata has been completely received and the info-hash failed to match it. i.e. the metadata that was received was corrupt. libtorrent will automatically retry to fetch it in this case. This is only relevant when running a torrent-less download, with the metadata extension provided by libtorrent.

struct metadata_failed_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   error_code const error;
};
[report issue]
error
indicates what failed when parsing the metadata. This error is what's returned from lazy_bdecode().
[report issue]

metadata_received_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when the metadata has been completely received and the torrent can start downloading. It is not generated on torrents that are started with metadata, but only those that needs to download it from peers (when utilizing the libtorrent extension).

There are no additional data members in this alert.

Typically, when receiving this alert, you would want to save the torrent file in order to load it back up again when the session is restarted. Here's an example snippet of code to do that:

torrent_handle h = alert->handle();
std::shared_ptr<torrent_info const> ti = h.torrent_file();
create_torrent ct(*ti);
entry te = ct.generate();
std::vector<char> buffer;
bencode(std::back_inserter(buffer), te);
FILE* f = fopen((to_hex(ti->info_hashes().get_best().to_string()) + ".torrent").c_str(), "wb+");
if (f) {
        fwrite(&buffer[0], 1, buffer.size(), f);
        fclose(f);
}
struct metadata_received_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

udp_error_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when there is an error on a UDP socket. The UDP sockets are used for all uTP, DHT and UDP tracker traffic. They are global to the session.

struct udp_error_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   aux::noexcept_movable<udp::endpoint> endpoint;
   operation_t operation;
   error_code const error;
};
[report issue]
endpoint
the source address associated with the error (if any)
[report issue]
operation
the operation that failed
[report issue]
error
the error code describing the error
[report issue]

external_ip_alert

Declared in "libtorrent/alert_types.hpp"

Whenever libtorrent learns about the machines external IP, this alert is generated. The external IP address can be acquired from the tracker (if it supports that) or from peers that supports the extension protocol. The address can be accessed through the external_address member.

struct external_ip_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   aux::noexcept_movable<address> external_address;
};
[report issue]
external_address
the IP address that is believed to be our external IP
[report issue]

listen_failed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when none of the ports, given in the port range, to session can be opened for listening. The listen_interface member is the interface that failed, error is the error code describing the failure.

In the case an endpoint was created before generating the alert, it is represented by address and port. The combinations of socket type and operation in which such address and port are not valid are: accept - i2p accept - socks5 enum_if - tcp

libtorrent may sometimes try to listen on port 0, if all other ports failed. Port 0 asks the operating system to pick a port that's free). If that fails you may see a listen_failed_alert with port 0 even if you didn't ask to listen on it.

struct listen_failed_alert final : alert
{
   std::string message () const override;
   char const* listen_interface () const;

   static constexpr alert_category_t static_category  = alert_category::status | alert_category::error;
   error_code const error;
   operation_t op;
   lt::socket_type_t const socket_type;
   aux::noexcept_movable<lt::address> address;
   int const port;
};
[report issue]

listen_interface()

char const* listen_interface () const;

the network device libtorrent attempted to listen on, or the IP address

[report issue]
error
the error the system returned
[report issue]
op
the underlying operation that failed
[report issue]
socket_type
the type of listen socket this alert refers to.
[report issue]
address
the address libtorrent attempted to listen on see alert documentation for validity of this value
[report issue]
port
the port libtorrent attempted to listen on see alert documentation for validity of this value
[report issue]

listen_succeeded_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when the listen port succeeds to be opened on a particular interface. address and port is the endpoint that successfully was opened for listening.

struct listen_succeeded_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   aux::noexcept_movable<lt::address> address;
   int const port;
   lt::socket_type_t const socket_type;
};
[report issue]
address
the address libtorrent ended up listening on. This address refers to the local interface.
[report issue]
port
the port libtorrent ended up listening on.
[report issue]
socket_type
the type of listen socket this alert refers to.
[report issue]

portmap_error_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a NAT router was successfully found but some part of the port mapping request failed. It contains a text message that may help the user figure out what is wrong. This alert is not generated in case it appears the client is not running on a NAT:ed network or if it appears there is no NAT router that can be remote controlled to add port mappings.

struct portmap_error_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::port_mapping
   | alert_category::error;
   port_mapping_t const mapping;
   portmap_transport map_transport;
   aux::noexcept_movable<address> local_address;
   error_code const error;
};
[report issue]
mapping
refers to the mapping index of the port map that failed, i.e. the index returned from add_mapping().
[report issue]
map_transport
UPnP or NAT-PMP
[report issue]
local_address
the local network the port mapper is running on
[report issue]
error
tells you what failed.
[report issue]

portmap_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a NAT router was successfully found and a port was successfully mapped on it. On a NAT:ed network with a NAT-PMP capable router, this is typically generated once when mapping the TCP port and, if DHT is enabled, when the UDP port is mapped.

struct portmap_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::port_mapping;
   port_mapping_t const mapping;
   int const external_port;
   portmap_protocol const map_protocol;
   portmap_transport const map_transport;
   aux::noexcept_movable<address> local_address;
};
[report issue]
mapping
refers to the mapping index of the port map that failed, i.e. the index returned from add_mapping().
[report issue]
external_port
the external port allocated for the mapping.
[report issue]
local_address
the local network the port mapper is running on
[report issue]

portmap_log_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated to log informational events related to either UPnP or NAT-PMP. They contain a log line and the type (0 = NAT-PMP and 1 = UPnP). Displaying these messages to an end user is only useful for debugging the UPnP or NAT-PMP implementation. This alert is only posted if the alert_category::port_mapping_log flag is enabled in the alert mask.

struct portmap_log_alert final : alert
{
   std::string message () const override;
   char const* log_message () const;

   static constexpr alert_category_t static_category  = alert_category::port_mapping_log;
   portmap_transport const map_transport;
   aux::noexcept_movable<address> local_address;
};
[report issue]

log_message()

char const* log_message () const;

the message associated with this log line

[report issue]
local_address
the local network the port mapper is running on
[report issue]

fastresume_rejected_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a fast resume file has been passed to add_torrent() but the files on disk did not match the fast resume file. The error_code explains the reason why the resume file was rejected.

struct fastresume_rejected_alert final : torrent_alert
{
   std::string message () const override;
   char const* file_path () const;

   static constexpr alert_category_t static_category  = alert_category::status
   | alert_category::error;
   error_code error;
   operation_t op;
};
[report issue]

file_path()

char const* file_path () const;

If the error happened to a specific file, this returns the path to it.

[report issue]
op
the underlying operation that failed
[report issue]

peer_blocked_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when an incoming peer connection, or a peer that's about to be added to our peer list, is blocked for some reason. This could be any of:

  • the IP filter
  • i2p mixed mode restrictions (a normal peer is not allowed on an i2p swarm)
  • the port filter
  • the peer has a low port and no_connect_privileged_ports is enabled
  • the protocol of the peer is blocked (uTP/TCP blocking)
struct peer_blocked_alert final : peer_alert
{
   std::string message () const override;

   enum reason_t
   {
      ip_filter,
      port_filter,
      i2p_mixed,
      privileged_ports,
      utp_disabled,
      tcp_disabled,
      invalid_local_interface,
      ssrf_mitigation,
   };

   static constexpr alert_category_t static_category  = alert_category::ip_block;
   int const reason;
};
[report issue]

enum reason_t

Declared in "libtorrent/alert_types.hpp"

name value description
ip_filter 0  
port_filter 1  
i2p_mixed 2  
privileged_ports 3  
utp_disabled 4  
tcp_disabled 5  
invalid_local_interface 6  
ssrf_mitigation 7  
[report issue]
reason
the reason for the peer being blocked. Is one of the values from the reason_t enum.
[report issue]

dht_announce_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a DHT node announces to an info-hash on our DHT node. It belongs to the alert_category::dht category.

struct dht_announce_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   aux::noexcept_movable<address> ip;
   int port;
   sha1_hash info_hash;
};
[report issue]

dht_get_peers_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when a DHT node sends a get_peers message to our DHT node. It belongs to the alert_category::dht category.

struct dht_get_peers_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   sha1_hash info_hash;
};
[report issue]

cache_flushed_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when the disk cache has been flushed for a specific torrent as a result of a call to torrent_handle::flush_cache(). This alert belongs to the alert_category::storage category, which must be enabled to let this alert through. The alert is also posted when removing a torrent from the session, once the outstanding cache flush is complete and the torrent does no longer have any files open.

struct cache_flushed_alert final : torrent_alert
{
   static constexpr alert_category_t static_category  = alert_category::storage;
};
[report issue]

lsd_peer_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when we receive a local service discovery message from a peer for a torrent we're currently participating in.

struct lsd_peer_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
};
[report issue]

trackerid_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted whenever a tracker responds with a trackerid. The tracker ID is like a cookie. libtorrent will store the tracker ID for this tracker and repeat it in subsequent announces.

struct trackerid_alert final : tracker_alert
{
   std::string message () const override;
   char const* tracker_id () const;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

tracker_id()

char const* tracker_id () const;

The tracker ID returned by the tracker

[report issue]

dht_bootstrap_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when the initial DHT bootstrap is done.

struct dht_bootstrap_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
};
[report issue]

torrent_error_alert

Declared in "libtorrent/alert_types.hpp"

This is posted whenever a torrent is transitioned into the error state.

struct torrent_error_alert final : torrent_alert
{
   std::string message () const override;
   char const* filename () const;

   static constexpr alert_category_t static_category  = alert_category::error | alert_category::status;
   error_code const error;
};
[report issue]

filename()

char const* filename () const;

the filename (or object) the error occurred on.

[report issue]
error
specifies which error the torrent encountered.
[report issue]

torrent_need_cert_alert

Declared in "libtorrent/alert_types.hpp"

This is always posted for SSL torrents. This is a reminder to the client that the torrent won't work unless torrent_handle::set_ssl_certificate() is called with a valid certificate. Valid certificates MUST be signed by the SSL certificate in the .torrent file.

struct torrent_need_cert_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
};
[report issue]

incoming_connection_alert

Declared in "libtorrent/alert_types.hpp"

The incoming connection alert is posted every time we successfully accept an incoming connection, through any mean. The most straight-forward ways of accepting incoming connections are through the TCP listen socket and the UDP listen socket for uTP sockets. However, connections may also be accepted through a Socks5 or i2p listen socket, or via an SSL listen socket.

struct incoming_connection_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::peer;
   socket_type_t socket_type;
   aux::noexcept_movable<tcp::endpoint> endpoint;
};
[report issue]
socket_type
tells you what kind of socket the connection was accepted
[report issue]
endpoint
is the IP address and port the connection came from.
[report issue]

add_torrent_alert

Declared in "libtorrent/alert_types.hpp"

This alert is always posted when a torrent was attempted to be added and contains the return status of the add operation. The torrent handle of the new torrent can be found as the handle member in the base class. If adding the torrent failed, error contains the error code.

struct add_torrent_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   add_torrent_params params;
   error_code error;
};
[report issue]
params

This contains copies of the most important fields from the original add_torrent_params object, passed to add_torrent() or async_add_torrent(). Specifically, these fields are copied:

  • version
  • ti
  • name
  • save_path
  • userdata
  • tracker_id
  • flags
  • info_hash

the info_hash field will be updated with the info-hash of the torrent specified by ti.

[report issue]
error
set to the error, if one occurred while adding the torrent.
[report issue]

state_update_alert

Declared in "libtorrent/alert_types.hpp"

This alert is only posted when requested by the user, by calling session::post_torrent_updates() on the session. It contains the torrent status of all torrents that changed since last time this message was posted. Its category is alert_category::status, but it's not subject to filtering, since it's only manually posted anyway.

struct state_update_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::status;
   std::vector<torrent_status> status;
};
[report issue]
status
contains the torrent status of all torrents that changed since last time this message was posted. Note that you can map a torrent status to a specific torrent via its handle member. The receiving end is suggested to have all torrents sorted by the torrent_handle or hashed by it, for efficient updates.
[report issue]

session_stats_alert

Declared in "libtorrent/alert_types.hpp"

The session_stats_alert is posted when the user requests session statistics by calling post_session_stats() on the session object. This alert does not have a category, since it's only posted in response to an API call. It is not subject to the alert_mask filter.

the message() member function returns a string representation of the values that properly match the line returned in session_stats_header_alert::message().

this specific output is parsed by tools/parse_session_stats.py if this is changed, that parser should also be changed

struct session_stats_alert final : alert
{
   std::string message () const override;
   span<std::int64_t const> counters () const;

   static constexpr alert_category_t static_category  = {};
};
[report issue]

counters()

span<std::int64_t const> counters () const;

An array are a mix of counters and gauges, which meanings can be queries via the session_stats_metrics() function on the session. The mapping from a specific metric to an index into this array is constant for a specific version of libtorrent, but may differ for other versions. The intended usage is to request the mapping, i.e. call session_stats_metrics(), once on startup, and then use that mapping to interpret these values throughout the process' runtime.

For more information, see the session statistics section.

[report issue]

dht_error_alert

Declared in "libtorrent/alert_types.hpp"

posted when something fails in the DHT. This is not necessarily a fatal error, but it could prevent proper operation

struct dht_error_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error | alert_category::dht;
   error_code error;
   operation_t op;
};
[report issue]
error
the error code
[report issue]
op
the operation that failed
[report issue]

dht_immutable_item_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted as a response to a call to session::get_item(), specifically the overload for looking up immutable items in the DHT.

struct dht_immutable_item_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   sha1_hash target;
   entry item;
};
[report issue]
target
the target hash of the immutable item. This must match the SHA-1 hash of the bencoded form of item.
[report issue]
item
the data for this item
[report issue]

dht_mutable_item_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted as a response to a call to session::get_item(), specifically the overload for looking up mutable items in the DHT.

struct dht_mutable_item_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   std::array<char, 32> key;
   std::array<char, 64> signature;
   std::int64_t seq;
   std::string salt;
   entry item;
   bool authoritative;
};
[report issue]
key
the public key that was looked up
[report issue]
signature
the signature of the data. This is not the signature of the plain encoded form of the item, but it includes the sequence number and possibly the hash as well. See the dht_store document for more information. This is primarily useful for echoing back in a store request.
[report issue]
seq
the sequence number of this item
[report issue]
salt
the salt, if any, used to lookup and store this item. If no salt was used, this is an empty string
[report issue]
item
the data for this item
[report issue]
authoritative
the last response for mutable data is authoritative.
[report issue]

dht_put_alert

Declared in "libtorrent/alert_types.hpp"

this is posted when a DHT put operation completes. This is useful if the client is waiting for a put to complete before shutting down for instance.

struct dht_put_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   sha1_hash target;
   std::array<char, 32> public_key;
   std::array<char, 64> signature;
   std::string salt;
   std::int64_t seq;
   int num_success;
};
[report issue]
target
the target hash the item was stored under if this was an immutable item.
[report issue]
public_key signature salt seq
if a mutable item was stored, these are the public key, signature, salt and sequence number the item was stored under.
[report issue]
num_success
DHT put operation usually writes item to k nodes, maybe the node is stale so no response, or the node doesn't support 'put', or the token for write is out of date, etc. num_success is the number of successful responses we got from the puts.
[report issue]

i2p_alert

Declared in "libtorrent/alert_types.hpp"

this alert is used to report errors in the i2p SAM connection

struct i2p_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   error_code error;
};
[report issue]
error
the error that occurred in the i2p SAM connection
[report issue]

dht_outgoing_get_peers_alert

Declared in "libtorrent/alert_types.hpp"

This alert is generated when we send a get_peers request It belongs to the alert_category::dht category.

struct dht_outgoing_get_peers_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::dht;
   sha1_hash info_hash;
   sha1_hash obfuscated_info_hash;
   aux::noexcept_movable<udp::endpoint> endpoint;
};
[report issue]
info_hash
the info_hash of the torrent we're looking for peers for.
[report issue]
obfuscated_info_hash
if this was an obfuscated lookup, this is the info-hash target actually sent to the node.
[report issue]
endpoint
the endpoint we're sending this query to
[report issue]

log_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted by some session wide event. Its main purpose is trouble shooting and debugging. It's not enabled by the default alert mask and is enabled by the alert_category::session_log bit. Furthermore, it's by default disabled as a build configuration.

struct log_alert final : alert
{
   std::string message () const override;
   char const* log_message () const;

   static constexpr alert_category_t static_category  = alert_category::session_log;
};
[report issue]

log_message()

char const* log_message () const;

returns the log message

[report issue]

torrent_log_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted by torrent wide events. It's meant to be used for trouble shooting and debugging. It's not enabled by the default alert mask and is enabled by the alert_category::torrent_log bit. By default it is disabled as a build configuration.

struct torrent_log_alert final : torrent_alert
{
   std::string message () const override;
   char const* log_message () const;

   static constexpr alert_category_t static_category  = alert_category::torrent_log;
};
[report issue]

log_message()

char const* log_message () const;

returns the log message

[report issue]

peer_log_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted by events specific to a peer. It's meant to be used for trouble shooting and debugging. It's not enabled by the default alert mask and is enabled by the alert_category::peer_log bit. By default it is disabled as a build configuration.

struct peer_log_alert final : peer_alert
{
   std::string message () const override;
   char const* log_message () const;

   enum direction_t
   {
      incoming_message,
      outgoing_message,
      incoming,
      outgoing,
      info,
   };

   static constexpr alert_category_t static_category  = alert_category::peer_log;
   char const* event_type;
   direction_t direction;
};
[report issue]

log_message()

char const* log_message () const;

returns the log message

[report issue]

enum direction_t

Declared in "libtorrent/alert_types.hpp"

name value description
incoming_message 0  
outgoing_message 1  
incoming 2  
outgoing 3  
info 4  
[report issue]
event_type
string literal indicating the kind of event. For messages, this is the message name.
[report issue]

lsd_error_alert

Declared in "libtorrent/alert_types.hpp"

posted if the local service discovery socket fails to start properly. it's categorized as alert_category::error.

struct lsd_error_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   aux::noexcept_movable<address> local_address;
   error_code error;
};
[report issue]
local_address
the local network the corresponding local service discovery is running on
[report issue]
error
The error code
[report issue]

dht_lookup

Declared in "libtorrent/alert_types.hpp"

holds statistics about a current dht_lookup operation. a DHT lookup is the traversal of nodes, looking up a set of target nodes in the DHT for retrieving and possibly storing information in the DHT

struct dht_lookup
{
   char const* type;
   int outstanding_requests;
   int timeouts;
   int responses;
   int branch_factor;
   int nodes_left;
   int last_sent;
   int first_timeout;
   sha1_hash target;
};
[report issue]
type
string literal indicating which kind of lookup this is
[report issue]
outstanding_requests
the number of outstanding request to individual nodes this lookup has right now
[report issue]
timeouts
the total number of requests that have timed out so far for this lookup
[report issue]
responses
the total number of responses we have received for this lookup so far for this lookup
[report issue]
branch_factor
the branch factor for this lookup. This is the number of nodes we keep outstanding requests to in parallel by default. when nodes time out we may increase this.
[report issue]
nodes_left
the number of nodes left that could be queries for this lookup. Many of these are likely to be part of the trail while performing the lookup and would never end up actually being queried.
[report issue]
last_sent
the number of seconds ago the last message was sent that's still outstanding
[report issue]
first_timeout
the number of outstanding requests that have exceeded the short timeout and are considered timed out in the sense that they increased the branch factor
[report issue]
target
the node-id or info-hash target for this lookup
[report issue]

dht_stats_alert

Declared in "libtorrent/alert_types.hpp"

contains current DHT state. Posted in response to session::post_dht_stats().

struct dht_stats_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = {};
   std::vector<dht_lookup> active_requests;
   std::vector<dht_routing_bucket> routing_table;
   sha1_hash nid;
   aux::noexcept_movable<udp::endpoint> local_endpoint;
};
[report issue]
active_requests
a vector of the currently running DHT lookups.
[report issue]
routing_table
contains information about every bucket in the DHT routing table.
[report issue]
nid
the node ID of the DHT node instance
[report issue]
local_endpoint
the local socket this DHT node is running on
[report issue]

incoming_request_alert

Declared in "libtorrent/alert_types.hpp"

posted every time an incoming request from a peer is accepted and queued up for being serviced. This alert is only posted if the alert_category::incoming_request flag is enabled in the alert mask.

struct incoming_request_alert final : peer_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::incoming_request;
   peer_request req;
};
[report issue]
req
the request this peer sent to us
[report issue]

dht_log_alert

Declared in "libtorrent/alert_types.hpp"

debug logging of the DHT when alert_category::dht_log is set in the alert mask.

struct dht_log_alert final : alert
{
   std::string message () const override;
   char const* log_message () const;

   enum dht_module_t
   {
      tracker,
      node,
      routing_table,
      rpc_manager,
      traversal,
   };

   static constexpr alert_category_t static_category  = alert_category::dht_log;
   dht_module_t module;
};
[report issue]

log_message()

char const* log_message () const;

the log message

[report issue]

enum dht_module_t

Declared in "libtorrent/alert_types.hpp"

name value description
tracker 0  
node 1  
routing_table 2  
rpc_manager 3  
traversal 4  
[report issue]
module
the module, or part, of the DHT that produced this log message.
[report issue]

dht_pkt_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted every time a DHT message is sent or received. It is only posted if the alert_category::dht_log alert category is enabled. It contains a verbatim copy of the message.

struct dht_pkt_alert final : alert
{
   std::string message () const override;
   span<char const> pkt_buf () const;

   enum direction_t
   {
      incoming,
      outgoing,
   };

   static constexpr alert_category_t static_category  = alert_category::dht_log;
   direction_t direction;
   aux::noexcept_movable<udp::endpoint> node;
};
[report issue]

pkt_buf()

span<char const> pkt_buf () const;

returns a pointer to the packet buffer and size of the packet, respectively. This buffer is only valid for as long as the alert itself is valid, which is owned by libtorrent and reclaimed whenever pop_alerts() is called on the session.

[report issue]

enum direction_t

Declared in "libtorrent/alert_types.hpp"

name value description
incoming 0  
outgoing 1  
[report issue]
direction
whether this is an incoming or outgoing packet.
[report issue]
node
the DHT node we received this packet from, or sent this packet to (depending on direction).
[report issue]

dht_get_peers_reply_alert

Declared in "libtorrent/alert_types.hpp"

Posted when we receive a response to a DHT get_peers request.

struct dht_get_peers_reply_alert final : alert
{
   std::string message () const override;
   int num_peers () const;
   std::vector<tcp::endpoint> peers () const;

   static constexpr alert_category_t static_category  = alert_category::dht_operation;
   sha1_hash info_hash;
};
[report issue]

dht_direct_response_alert

Declared in "libtorrent/alert_types.hpp"

This is posted exactly once for every call to session_handle::dht_direct_request. If the request failed, response() will return a default constructed bdecode_node.

struct dht_direct_response_alert final : alert
{
   std::string message () const override;
   bdecode_node response () const;

   static constexpr alert_category_t static_category  = alert_category::dht;
   client_data_t userdata;
   aux::noexcept_movable<udp::endpoint> endpoint;
};
[report issue]

picker_log_alert

Declared in "libtorrent/alert_types.hpp"

this is posted when one or more blocks are picked by the piece picker, assuming the verbose piece picker logging is enabled (see alert_category::picker_log).

struct picker_log_alert final : peer_alert
{
   std::string message () const override;
   std::vector<piece_block> blocks () const;

   static constexpr alert_category_t static_category  = alert_category::picker_log;
   static constexpr picker_flags_t partial_ratio  = 0_bit;
   static constexpr picker_flags_t prioritize_partials  = 1_bit;
   static constexpr picker_flags_t rarest_first_partials  = 2_bit;
   static constexpr picker_flags_t rarest_first  = 3_bit;
   static constexpr picker_flags_t reverse_rarest_first  = 4_bit;
   static constexpr picker_flags_t suggested_pieces  = 5_bit;
   static constexpr picker_flags_t prio_sequential_pieces  = 6_bit;
   static constexpr picker_flags_t sequential_pieces  = 7_bit;
   static constexpr picker_flags_t reverse_pieces  = 8_bit;
   static constexpr picker_flags_t time_critical  = 9_bit;
   static constexpr picker_flags_t random_pieces  = 10_bit;
   static constexpr picker_flags_t prefer_contiguous  = 11_bit;
   static constexpr picker_flags_t reverse_sequential  = 12_bit;
   static constexpr picker_flags_t backup1  = 13_bit;
   static constexpr picker_flags_t backup2  = 14_bit;
   static constexpr picker_flags_t end_game  = 15_bit;
   static constexpr picker_flags_t extent_affinity  = 16_bit;
   picker_flags_t const picker_flags;
};
[report issue]
picker_flags
this is a bitmask of which features were enabled for this particular pick. The bits are defined in the picker_flags_t enum.
[report issue]

session_error_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted when the session encounters a serious error, potentially fatal

struct session_error_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   error_code const error;
};
[report issue]
error
The error code, if one is associated with this error
[report issue]

dht_live_nodes_alert

Declared in "libtorrent/alert_types.hpp"

posted in response to a call to session::dht_live_nodes(). It contains the live nodes from the DHT routing table of one of the DHT nodes running locally.

struct dht_live_nodes_alert final : alert
{
   std::string message () const override;
   int num_nodes () const;
   std::vector<std::pair<sha1_hash, udp::endpoint>> nodes () const;

   static constexpr alert_category_t static_category  = alert_category::dht;
   sha1_hash node_id;
};
[report issue]

nodes() num_nodes()

int num_nodes () const;
std::vector<std::pair<sha1_hash, udp::endpoint>> nodes () const;

the number of nodes in the routing table and the actual nodes.

[report issue]
node_id
the local DHT node's node-ID this routing table belongs to
[report issue]

session_stats_header_alert

Declared in "libtorrent/alert_types.hpp"

The session_stats_header alert is posted the first time post_session_stats() is called

the message() member function returns a string representation of the header that properly match the stats values string returned in session_stats_alert::message().

this specific output is parsed by tools/parse_session_stats.py if this is changed, that parser should also be changed

struct session_stats_header_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = {};
};
[report issue]

dht_sample_infohashes_alert

Declared in "libtorrent/alert_types.hpp"

posted as a response to a call to session::dht_sample_infohashes() with the information from the DHT response message.

struct dht_sample_infohashes_alert final : alert
{
   std::string message () const override;
   int num_samples () const;
   std::vector<sha1_hash> samples () const;
   int num_nodes () const;
   std::vector<std::pair<sha1_hash, udp::endpoint>> nodes () const;

   static constexpr alert_category_t static_category  = alert_category::dht_operation;
   sha1_hash node_id;
   aux::noexcept_movable<udp::endpoint> endpoint;
   time_duration const interval;
   int const num_infohashes;
};
[report issue]

num_samples() samples()

int num_samples () const;
std::vector<sha1_hash> samples () const;

returns the number of info-hashes returned by the node, as well as the actual info-hashes. num_samples() is more efficient than samples().size().

[report issue]

num_nodes()

int num_nodes () const;

The total number of nodes returned by nodes().

[report issue]

nodes()

std::vector<std::pair<sha1_hash, udp::endpoint>> nodes () const;

This is the set of more DHT nodes returned by the request.

The information is included so that indexing nodes can perform a key space traversal with a single RPC per node by adjusting the target value for each RPC.

[report issue]
node_id
id of the node the request was sent to (and this response was received from)
[report issue]
endpoint
the node the request was sent to (and this response was received from)
[report issue]
interval
the interval to wait before making another request to this node
[report issue]
num_infohashes
This field indicates how many info-hash keys are currently in the node's storage. If the value is larger than the number of returned samples it indicates that the indexer may obtain additional samples after waiting out the interval.
[report issue]

block_uploaded_alert

Declared in "libtorrent/alert_types.hpp"

This alert is posted when a block intended to be sent to a peer is placed in the send buffer. Note that if the connection is closed before the send buffer is sent, the alert may be posted without the bytes having been sent to the peer. It belongs to the alert_category::upload category.

struct block_uploaded_alert final : peer_alert
{
   std::string message () const override;

   int const block_index;
   piece_index_t const piece_index;
};
[report issue]

alerts_dropped_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted to indicate to the client that some alerts were dropped. Dropped meaning that the alert failed to be delivered to the client. The most common cause of such failure is that the internal alert queue grew too big (controlled by alert_queue_size).

struct alerts_dropped_alert final : alert
{
   static_assert (num_alert_types <= abi_alert_count, "need to increase bitset. This is an ABI break");
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   std::bitset<abi_alert_count> dropped_alerts;
};
[report issue]
dropped_alerts
a bitmask indicating which alerts were dropped. Each bit represents the alert type ID, where bit 0 represents whether any alert of type 0 has been dropped, and so on.
[report issue]

socks5_alert

Declared in "libtorrent/alert_types.hpp"

this alert is posted with SOCKS5 related errors, when a SOCKS5 proxy is configured. It's enabled with the alert_category::error alert category.

struct socks5_alert final : alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::error;
   error_code error;
   operation_t op;
   aux::noexcept_movable<tcp::endpoint> ip;
};
[report issue]
error
the error
[report issue]
op
the operation that failed
[report issue]
ip
the endpoint configured as the proxy
[report issue]

file_prio_alert

Declared in "libtorrent/alert_types.hpp"

posted when a prioritize_files() or file_priority() update of the file priorities complete, which requires a round-trip to the disk thread.

If the disk operation fails this alert won't be posted, but a file_error_alert is posted instead, and the torrent is stopped.

struct file_prio_alert final : torrent_alert
{
   std::string message () const override;

   static constexpr alert_category_t static_category  = alert_category::storage;
   error_code error;
   operation_t op;
};
[report issue]
error
the error
[report issue]
op
the operation that failed
[report issue]

alert_cast()

Declared in "libtorrent/alert.hpp"

template <typename T> T* alert_cast (alert* a);
template <typename T> T const* alert_cast (alert const* a);

When you get an alert, you can use alert_cast<> to attempt to cast the pointer to a specific alert type, in order to query it for more information.

Note

alert_cast<> can only cast to an exact alert type, not a base class

[report issue]

operation_name()

Declared in "libtorrent/operations.hpp"

char const* operation_name (operation_t op);

maps an operation id (from peer_error_alert and peer_disconnected_alert) to its name. See operation_t for the constants

[report issue]

enum operation_t

Declared in "libtorrent/operations.hpp"

name value description
unknown 0 the error was unexpected and it is unknown which operation caused it
bittorrent 1 this is used when the bittorrent logic determines to disconnect
iocontrol 2 a call to iocontrol failed
getpeername 3 a call to getpeername() failed (querying the remote IP of a connection)
getname 4 a call to getname failed (querying the local IP of a connection)
alloc_recvbuf 5 an attempt to allocate a receive buffer failed
alloc_sndbuf 6 an attempt to allocate a send buffer failed
file_write 7 writing to a file failed
file_read 8 reading from a file failed
file 9 a non-read and non-write file operation failed
sock_write 10 a socket write operation failed
sock_read 11 a socket read operation failed
sock_open 12 a call to open(), to create a socket socket failed
sock_bind 13 a call to bind() on a socket failed
available 14 an attempt to query the number of bytes available to read from a socket failed
encryption 15 a call related to bittorrent protocol encryption failed
connect 16 an attempt to connect a socket failed
ssl_handshake 17 establishing an SSL connection failed
get_interface 18 a connection failed to satisfy the bind interface setting
sock_listen 19 a call to listen() on a socket
sock_bind_to_device 20 a call to the ioctl to bind a socket to a specific network device or adapter
sock_accept 21 a call to accept() on a socket
parse_address 22 convert a string into a valid network address
enum_if 23 enumeration network devices or adapters
file_stat 24 invoking stat() on a file
file_copy 25 copying a file
file_fallocate 26 allocating storage for a file
file_hard_link 27 creating a hard link
file_remove 28 removing a file
file_rename 29 renaming a file
file_open 30 opening a file
mkdir 31 creating a directory
check_resume 32 check fast resume data against files on disk
exception 33 an unknown exception
alloc_cache_piece 34 allocate space for a piece in the cache
partfile_move 35 move a part-file
partfile_read 36 read from a part file
partfile_write 37 write to a part-file
hostname_lookup 38 a hostname lookup
symlink 39 create or read a symlink
handshake 40 handshake with a peer or server
sock_option 41 set socket option
enum_route 42 enumeration of network routes
file_seek 43 moving read/write position in a file, operation_t::hostname_lookup
timer 44 an async wait operation on a timer
file_mmap 45 call to mmap() (or windows counterpart)
file_truncate 46 call to ftruncate() (or SetEndOfFile() on windows)
[report issue]

alert_category_t

Declared in "libtorrent/alert.hpp"

error

Enables alerts that report an error. This includes:

  • tracker errors
  • tracker warnings
  • file errors
  • resume data failures
  • web seed errors
  • .torrent files errors
  • listen socket errors
  • port mapping errors
peer
Enables alerts when peers send invalid requests, get banned or snubbed.
port_mapping
Enables alerts for port mapping events. For NAT-PMP and UPnP.
storage
Enables alerts for events related to the storage. File errors and synchronization events for moving the storage, renaming files etc.
tracker
Enables all tracker events. Includes announcing to trackers, receiving responses, warnings and errors.
connect
Low level alerts for when peers are connected and disconnected.
status
Enables alerts for when a torrent or the session changes state.
ip_block
Alerts when a peer is blocked by the ip blocker or port blocker.
performance_warning
Alerts when some limit is reached that might limit the download or upload rate.
dht
Alerts on events in the DHT node. For incoming searches or bootstrapping being done etc.
stats
If you enable these alerts, you will receive a stats_alert approximately once every second, for every active torrent. These alerts contain all statistics counters for the interval since the lasts stats alert.
session_log
Enables debug logging alerts. These are available unless libtorrent was built with logging disabled (TORRENT_DISABLE_LOGGING). The alerts being posted are log_alert and are session wide.
torrent_log
Enables debug logging alerts for torrents. These are available unless libtorrent was built with logging disabled (TORRENT_DISABLE_LOGGING). The alerts being posted are torrent_log_alert and are torrent wide debug events.
peer_log
Enables debug logging alerts for peers. These are available unless libtorrent was built with logging disabled (TORRENT_DISABLE_LOGGING). The alerts being posted are peer_log_alert and low-level peer events and messages.
incoming_request
enables the incoming_request_alert.
dht_log
enables dht_log_alert, debug logging for the DHT
dht_operation
enable events from pure dht operations not related to torrents
port_mapping_log
enables port mapping log events. This log is useful for debugging the UPnP or NAT-PMP implementation
picker_log
enables verbose logging from the piece picker.
file_progress
alerts when files complete downloading
piece_progress
alerts when pieces complete downloading or fail hash check
upload
alerts when we upload blocks to other peers
block_progress
alerts on individual blocks being requested, downloading, finished, rejected, time-out and cancelled. This is likely to post alerts at a high rate.
all

The full bitmask, representing all available categories.

since the enum is signed, make sure this isn't interpreted as -1. For instance, boost.python does that and fails when assigning it to an unsigned parameter.

[report issue]

int

Declared in "libtorrent/alert_types.hpp"

user_alert_id
user defined alerts should use IDs greater than this
num_alert_types
this constant represents "max_alert_index" + 1
[report issue]

torrent_status

Declared in "libtorrent/torrent_status.hpp"

holds a snapshot of the status of a torrent, as queried by torrent_handle::status().

struct torrent_status
{
   bool operator== (torrent_status const& st) const;

   enum state_t
   {
      checking_files,
      downloading_metadata,
      downloading,
      finished,
      seeding,
      unused_enum_for_backwards_compatibility_allocating,
      checking_resume_data,
   };

   torrent_handle handle;
   error_code errc;
   file_index_t error_file  = torrent_status::error_file_none;
   static constexpr file_index_t error_file_none {-1};
   static constexpr file_index_t error_file_ssl_ctx {-3};
   static constexpr file_index_t error_file_metadata {-4};
   static constexpr file_index_t error_file_exception {-5};
   static constexpr file_index_t error_file_partfile {-6};
   std::string save_path;
   std::string name;
   std::weak_ptr<const torrent_info> torrent_file;
   time_duration next_announce  = seconds{0};
   std::string current_tracker;
   std::int64_t total_download  = 0;
   std::int64_t total_upload  = 0;
   std::int64_t total_payload_download  = 0;
   std::int64_t total_payload_upload  = 0;
   std::int64_t total_failed_bytes  = 0;
   std::int64_t total_redundant_bytes  = 0;
   typed_bitfield<piece_index_t> pieces;
   typed_bitfield<piece_index_t> verified_pieces;
   std::int64_t total_done  = 0;
   std::int64_t total  = 0;
   std::int64_t total_wanted_done  = 0;
   std::int64_t total_wanted  = 0;
   std::int64_t all_time_upload  = 0;
   std::int64_t all_time_download  = 0;
   std::time_t added_time  = 0;
   std::time_t completed_time  = 0;
   std::time_t last_seen_complete  = 0;
   storage_mode_t storage_mode  = storage_mode_sparse;
   float progress  = 0.f;
   int progress_ppm  = 0;
   queue_position_t queue_position {};
   int download_rate  = 0;
   int upload_rate  = 0;
   int download_payload_rate  = 0;
   int upload_payload_rate  = 0;
   int num_seeds  = 0;
   int num_peers  = 0;
   int num_complete  = -1;
   int num_incomplete  = -1;
   int list_seeds  = 0;
   int list_peers  = 0;
   int connect_candidates  = 0;
   int num_pieces  = 0;
   int distributed_full_copies  = 0;
   int distributed_fraction  = 0;
   float distributed_copies  = 0.f;
   int block_size  = 0;
   int num_uploads  = 0;
   int num_connections  = 0;
   int uploads_limit  = 0;
   int connections_limit  = 0;
   int up_bandwidth_queue  = 0;
   int down_bandwidth_queue  = 0;
   int seed_rank  = 0;
   state_t state  = checking_resume_data;
   bool need_save_resume  = false;
   bool is_seeding  = false;
   bool is_finished  = false;
   bool has_metadata  = false;
   bool has_incoming  = false;
   bool moving_storage  = false;
   bool announcing_to_trackers  = false;
   bool announcing_to_lsd  = false;
   bool announcing_to_dht  = false;
   info_hash_t info_hashes;
   time_point last_upload;
   time_point last_download;
   seconds active_duration;
   seconds finished_duration;
   seconds seeding_duration;
   torrent_flags_t flags {};
};
[report issue]

operator==()

bool operator== (torrent_status const& st) const;

compares if the torrent status objects come from the same torrent. i.e. only the torrent_handle field is compared.

[report issue]

enum state_t

Declared in "libtorrent/torrent_status.hpp"

name value description
checking_files 1 The torrent has not started its download yet, and is currently checking existing files.
downloading_metadata 2 The torrent is trying to download metadata from peers. This implies the ut_metadata extension is in use.
downloading 3 The torrent is being downloaded. This is the state most torrents will be in most of the time. The progress meter will tell how much of the files that has been downloaded.
finished 4 In this state the torrent has finished downloading but still doesn't have the entire torrent. i.e. some pieces are filtered and won't get downloaded.
seeding 5 In this state the torrent has finished downloading and is a pure seeder.
unused_enum_for_backwards_compatibility_allocating 6 If the torrent was started in full allocation mode, this indicates that the (disk) storage for the torrent is allocated.
checking_resume_data 7 The torrent is currently checking the fast resume data and comparing it to the files on disk. This is typically completed in a fraction of a second, but if you add a large number of torrents at once, they will queue up.
[report issue]
handle
a handle to the torrent whose status the object represents.
[report issue]
errc
may be set to an error code describing why the torrent was paused, in case it was paused by an error. If the torrent is not paused or if it's paused but not because of an error, this error_code is not set. if the error is attributed specifically to a file, error_file is set to the index of that file in the .torrent file.
[report issue]
error_file
if the torrent is stopped because of an disk I/O error, this field contains the index of the file in the torrent that encountered the error. If the error did not originate in a file in the torrent, there are a few special values this can be set to: error_file_none, error_file_ssl_ctx, error_file_exception, error_file_partfile or error_file_metadata;
[report issue]
error_file_none
special values for error_file to describe which file or component encountered the error (errc). the error did not occur on a file
[report issue]
error_file_ssl_ctx
the error occurred setting up the SSL context
[report issue]
error_file_metadata
the error occurred while loading the metadata for the torrent
[report issue]
error_file_exception
there was a serious error reported in this torrent. The error code or a torrent log alert may provide more information.
[report issue]
error_file_partfile
the error occurred with the partfile
[report issue]
save_path
the path to the directory where this torrent's files are stored. It's typically the path as was given to async_add_torrent() or add_torrent() when this torrent was started. This field is only included if the torrent status is queried with torrent_handle::query_save_path.
[report issue]
name
the name of the torrent. Typically this is derived from the .torrent file. In case the torrent was started without metadata, and hasn't completely received it yet, it returns the name given to it when added to the session. See session::add_torrent. This field is only included if the torrent status is queried with torrent_handle::query_name.
[report issue]
torrent_file
set to point to the torrent_info object for this torrent. It's only included if the torrent status is queried with torrent_handle::query_torrent_file.
[report issue]
next_announce
the time until the torrent will announce itself to the tracker.
[report issue]
current_tracker
the URL of the last working tracker. If no tracker request has been successful yet, it's set to an empty string.
[report issue]
total_download total_upload
the number of bytes downloaded and uploaded to all peers, accumulated, this session only. The session is considered to restart when a torrent is paused and restarted again. When a torrent is paused, these counters are reset to 0. If you want complete, persistent, stats, see all_time_upload and all_time_download.
[report issue]
total_payload_download total_payload_upload
counts the amount of bytes send and received this session, but only the actual payload data (i.e the interesting data), these counters ignore any protocol overhead. The session is considered to restart when a torrent is paused and restarted again. When a torrent is paused, these counters are reset to 0.
[report issue]
total_failed_bytes
the number of bytes that has been downloaded and that has failed the piece hash test. In other words, this is just how much crap that has been downloaded since the torrent was last started. If a torrent is paused and then restarted again, this counter will be reset.
[report issue]
total_redundant_bytes
the number of bytes that has been downloaded even though that data already was downloaded. The reason for this is that in some situations the same data can be downloaded by mistake. When libtorrent sends requests to a peer, and the peer doesn't send a response within a certain timeout, libtorrent will re-request that block. Another situation when libtorrent may re-request blocks is when the requests it sends out are not replied in FIFO-order (it will re-request blocks that are skipped by an out of order block). This is supposed to be as low as possible. This only counts bytes since the torrent was last started. If a torrent is paused and then restarted again, this counter will be reset.
[report issue]
pieces
a bitmask that represents which pieces we have (set to true) and the pieces we don't have. It's a pointer and may be set to 0 if the torrent isn't downloading or seeding.
[report issue]
verified_pieces
a bitmask representing which pieces has had their hash checked. This only applies to torrents in seed mode. If the torrent is not in seed mode, this bitmask may be empty.
[report issue]
total_done
the total number of bytes of the file(s) that we have. All this does not necessarily has to be downloaded during this session (that's total_payload_download).
[report issue]
total
the total number of bytes to download for this torrent. This may be less than the size of the torrent in case there are pad files. This number only counts bytes that will actually be requested from peers.
[report issue]
total_wanted_done
the number of bytes we have downloaded, only counting the pieces that we actually want to download. i.e. excluding any pieces that we have but have priority 0 (i.e. not wanted). Once a torrent becomes seed, any piece- and file priorities are forgotten and all bytes are considered "wanted".
[report issue]
total_wanted
The total number of bytes we want to download. This may be smaller than the total torrent size in case any pieces are prioritized to 0, i.e. not wanted. Once a torrent becomes seed, any piece- and file priorities are forgotten and all bytes are considered "wanted".
[report issue]
all_time_upload all_time_download
are accumulated upload and download payload byte counters. They are saved in and restored from resume data to keep totals across sessions.
[report issue]
added_time
the posix-time when this torrent was added. i.e. what time(nullptr) returned at the time.
[report issue]
completed_time
the posix-time when this torrent was finished. If the torrent is not yet finished, this is 0.
[report issue]
last_seen_complete
the time when we, or one of our peers, last saw a complete copy of this torrent.
[report issue]
storage_mode
The allocation mode for the torrent. See storage_mode_t for the options. For more information, see storage allocation.
[report issue]
progress
a value in the range [0, 1], that represents the progress of the torrent's current task. It may be checking files or downloading.
[report issue]
progress_ppm

progress parts per million (progress * 1000000) when disabling floating point operations, this is the only option to query progress

reflects the same value as progress, but instead in a range [0, 1000000] (ppm = parts per million). When floating point operations are disabled, this is the only alternative to the floating point value in progress.

[report issue]
queue_position
the position this torrent has in the download queue. If the torrent is a seed or finished, this is -1.
[report issue]
download_rate upload_rate
the total rates for all peers for this torrent. These will usually have better precision than summing the rates from all peers. The rates are given as the number of bytes per second.
[report issue]
download_payload_rate upload_payload_rate
the total transfer rate of payload only, not counting protocol chatter. This might be slightly smaller than the other rates, but if projected over a long time (e.g. when calculating ETA:s) the difference may be noticeable.
[report issue]
num_seeds
the number of peers that are seeding that this client is currently connected to.
[report issue]
num_peers
the number of peers this torrent currently is connected to. Peer connections that are in the half-open state (is attempting to connect) or are queued for later connection attempt do not count. Although they are visible in the peer list when you call get_peer_info().
[report issue]
num_complete num_incomplete
if the tracker sends scrape info in its announce reply, these fields will be set to the total number of peers that have the whole file and the total number of peers that are still downloading. set to -1 if the tracker did not send any scrape data in its announce reply.
[report issue]
list_seeds list_peers
the number of seeds in our peer list and the total number of peers (including seeds). We are not necessarily connected to all the peers in our peer list. This is the number of peers we know of in total, including banned peers and peers that we have failed to connect to.
[report issue]
connect_candidates
the number of peers in this torrent's peer list that is a candidate to be connected to. i.e. It has fewer connect attempts than the max fail count, it is not a seed if we are a seed, it is not banned etc. If this is 0, it means we don't know of any more peers that we can try.
[report issue]
num_pieces
the number of pieces that has been downloaded. It is equivalent to: std::accumulate(pieces->begin(), pieces->end()). So you don't have to count yourself. This can be used to see if anything has updated since last time if you want to keep a graph of the pieces up to date.
[report issue]
distributed_full_copies
the number of distributed copies of the torrent. Note that one copy may be spread out among many peers. It tells how many copies there are currently of the rarest piece(s) among the peers this client is connected to.
[report issue]
distributed_fraction

tells the share of pieces that have more copies than the rarest piece(s). Divide this number by 1000 to get the fraction.

For example, if distributed_full_copies is 2 and distributed_fraction is 500, it means that the rarest pieces have only 2 copies among the peers this torrent is connected to, and that 50% of all the pieces have more than two copies.

If we are a seed, the piece picker is deallocated as an optimization, and piece availability is no longer tracked. In this case the distributed copies members are set to -1.

[report issue]
distributed_copies

the number of distributed copies of the file. note that one copy may be spread out among many peers. This is a floating point representation of the distributed copies.

the integer part tells how many copies
there are of the rarest piece(s)
the fractional part tells the fraction of pieces that
have more copies than the rarest piece(s).
[report issue]
block_size
the size of a block, in bytes. A block is a sub piece, it is the number of bytes that each piece request asks for and the number of bytes that each bit in the partial_piece_info's bitset represents, see get_download_queue(). This is typically 16 kB, but it may be smaller, if the pieces are smaller.
[report issue]
num_uploads
the number of unchoked peers in this torrent.
[report issue]
num_connections
the number of peer connections this torrent has, including half-open connections that hasn't completed the bittorrent handshake yet. This is always >= num_peers.
[report issue]
uploads_limit
the set limit of upload slots (unchoked peers) for this torrent.
[report issue]
connections_limit
the set limit of number of connections for this torrent.
[report issue]
up_bandwidth_queue down_bandwidth_queue
the number of peers in this torrent that are waiting for more bandwidth quota from the torrent rate limiter. This can determine if the rate you get from this torrent is bound by the torrents limit or not. If there is no limit set on this torrent, the peers might still be waiting for bandwidth quota from the global limiter, but then they are counted in the session_status object.
[report issue]
seed_rank
A rank of how important it is to seed the torrent, it is used to determine which torrents to seed and which to queue. It is based on the peer to seed ratio from the tracker scrape. For more information, see queuing. Higher value means more important to seed
[report issue]
state
the main state the torrent is in. See torrent_status::state_t.
[report issue]
need_save_resume
true if this torrent has unsaved changes to its download state and statistics since the last resume data was saved.
[report issue]
is_seeding
true if all pieces have been downloaded.
[report issue]
is_finished
true if all pieces that have a priority > 0 are downloaded. There is only a distinction between finished and seeding if some pieces or files have been set to priority 0, i.e. are not downloaded.
[report issue]
has_metadata
true if this torrent has metadata (either it was started from a .torrent file or the metadata has been downloaded). The only scenario where this can be false is when the torrent was started torrent-less (i.e. with just an info-hash and tracker ip, a magnet link for instance).
[report issue]
has_incoming
true if there has ever been an incoming connection attempt to this torrent.
[report issue]
moving_storage
this is true if this torrent's storage is currently being moved from one location to another. This may potentially be a long operation if a large file ends up being copied from one drive to another.
[report issue]
announcing_to_trackers announcing_to_lsd announcing_to_dht
these are set to true if this torrent is allowed to announce to the respective peer source. Whether they are true or false is determined by the queue logic/auto manager. Torrents that are not auto managed will always be allowed to announce to all peer sources.
[report issue]
info_hashes
the info-hash for this torrent
[report issue]
last_upload last_download
the timestamps of the last time this torrent uploaded or downloaded payload to any peer.
[report issue]
active_duration finished_duration seeding_duration
these are cumulative counters of for how long the torrent has been in different states. active means not paused and added to session. Whether it has found any peers or not is not relevant. finished means all selected files/pieces were downloaded and available to other peers (this is always a subset of active time). seeding means all files/pieces were downloaded and available to peers. Being available to peers does not imply there are other peers asking for the payload.
[report issue]
flags
reflects several of the torrent's flags. For more information, see torrent_handle::flags().
[report issue]

announce_infohash

Declared in "libtorrent/announce_entry.hpp"

struct announce_infohash
{
   std::string message;
   error_code last_error;
   int scrape_incomplete  = -1;
   int scrape_complete  = -1;
   int scrape_downloaded  = -1;
   std::uint8_t fails : 7;
   bool updating : 1;
   bool start_sent : 1;
   bool complete_sent : 1;
};
[report issue]
message
if this tracker has returned an error or warning message that message is stored here
[report issue]
last_error
if this tracker failed the last time it was contacted this error code specifies what error occurred
[report issue]
scrape_incomplete scrape_complete scrape_downloaded
if this tracker has returned scrape data, these fields are filled in with valid numbers. Otherwise they are set to -1. incomplete counts the number of current downloaders. complete counts the number of current peers completed the download, or "seeds". downloaded is the cumulative number of completed downloads.
[report issue]
fails
the number of times in a row we have failed to announce to this tracker.
[report issue]
updating
true while we're waiting for a response from the tracker.
[report issue]
start_sent
set to true when we get a valid response from an announce with event=started. If it is set, we won't send start in the subsequent announces.
[report issue]
complete_sent
set to true when we send a event=completed.
[report issue]

announce_endpoint

Declared in "libtorrent/announce_entry.hpp"

announces are sent to each tracker using every listen socket this class holds information about one listen socket for one tracker

struct announce_endpoint
{
   announce_endpoint ();

   tcp::endpoint local_endpoint;
   aux::array<announce_infohash, num_protocols, protocol_version> info_hashes;
   bool enabled  = true;
};
[report issue]
local_endpoint
the local endpoint of the listen interface associated with this endpoint
[report issue]
info_hashes
info_hashes[0] is the v1 info hash (SHA1) info_hashes[1] is the v2 info hash (truncated SHA-256)
[report issue]
enabled
set to false to not announce from this endpoint
[report issue]

announce_entry

Declared in "libtorrent/announce_entry.hpp"

this class holds information about one bittorrent tracker, as it relates to a specific torrent.

struct announce_entry
{
   announce_entry (announce_entry const&);
   ~announce_entry ();
   announce_entry ();
   announce_entry& operator= (announce_entry const&) &;
   explicit announce_entry (string_view u);

   enum tracker_source
   {
      source_torrent,
      source_client,
      source_magnet_link,
      source_tex,
   };

   std::string url;
   std::string trackerid;
   std::vector<announce_endpoint> endpoints;
   std::uint8_t tier  = 0;
   std::uint8_t fail_limit  = 0;
   std::uint8_t source:4;
   bool verified:1;
};
[report issue]

~announce_entry() operator=() announce_entry()

announce_entry (announce_entry const&);
~announce_entry ();
announce_entry ();
announce_entry& operator= (announce_entry const&) &;
explicit announce_entry (string_view u);

constructs a tracker announce entry with u as the URL.

[report issue]

enum tracker_source

Declared in "libtorrent/announce_entry.hpp"

name value description
source_torrent 1 the tracker was part of the .torrent file
source_client 2 the tracker was added programmatically via the add_tracker() function
source_magnet_link 4 the tracker was part of a magnet link
source_tex 8 the tracker was received from the swarm via tracker exchange
[report issue]
url
tracker URL as it appeared in the torrent file
[report issue]
trackerid
the current &trackerid= argument passed to the tracker. this is optional and is normally empty (in which case no trackerid is sent).
[report issue]
endpoints
each local listen socket (endpoint) will announce to the tracker. This list contains state per endpoint.
[report issue]
tier
the tier this tracker belongs to
[report issue]
fail_limit
the max number of failures to announce to this tracker in a row, before this tracker is not used anymore. 0 means unlimited
[report issue]
source
a bitmask specifying which sources we got this tracker from.
[report issue]
verified
set to true the first time we receive a valid response from this tracker.
[report issue]

bitfield

Declared in "libtorrent/bitfield.hpp"

The bitfield type stores any number of bits as a bitfield in a heap allocated array.

struct bitfield
{
   bitfield (bitfield const& rhs);
   bitfield () noexcept = default;
   bitfield (char const* b, int bits);
   explicit bitfield (int bits);
   bitfield (bitfield&& rhs) noexcept = default;
   bitfield (int bits, bool val);
   void assign (char const* b, int const bits);
   bool operator[] (int index) const noexcept;
   bool get_bit (int index) const noexcept;
   void clear_bit (int index) noexcept;
   void set_bit (int index) noexcept;
   bool all_set () const noexcept;
   bool none_set () const noexcept;
   int size () const noexcept;
   int num_words () const noexcept;
   bool empty () const noexcept;
   char* data () noexcept;
   char const* data () const noexcept;
   void swap (bitfield& rhs) noexcept;
   int count () const noexcept;
   int find_first_set () const noexcept;
   int find_last_clear () const noexcept;
};
[report issue]

bitfield()

bitfield (bitfield const& rhs);
bitfield () noexcept = default;
bitfield (char const* b, int bits);
explicit bitfield (int bits);
bitfield (bitfield&& rhs) noexcept = default;
bitfield (int bits, bool val);

constructs a new bitfield. The default constructor creates an empty bitfield. bits is the size of the bitfield (specified in bits). val is the value to initialize the bits to. If not specified all bits are initialized to 0.

The constructor taking a pointer b and bits copies a bitfield from the specified buffer, and bits number of bits (rounded up to the nearest byte boundary).

[report issue]

assign()

void assign (char const* b, int const bits);

copy bitfield from buffer b of bits number of bits, rounded up to the nearest byte boundary.

[report issue]

operator[]() get_bit()

bool operator[] (int index) const noexcept;
bool get_bit (int index) const noexcept;

query bit at index. Returns true if bit is 1, otherwise false.

[report issue]

clear_bit() set_bit()

void clear_bit (int index) noexcept;
void set_bit (int index) noexcept;

set bit at index to 0 (clear_bit) or 1 (set_bit).

[report issue]

all_set()

bool all_set () const noexcept;

returns true if all bits in the bitfield are set

[report issue]

none_set()

bool none_set () const noexcept;

returns true if no bit in the bitfield is set

[report issue]

size()

int size () const noexcept;

returns the size of the bitfield in bits.

[report issue]

num_words()

int num_words () const noexcept;

returns the number of 32 bit words are needed to represent all bits in this bitfield.

[report issue]

empty()

bool empty () const noexcept;

returns true if the bitfield has zero size.

[report issue]

data()

char* data () noexcept;
char const* data () const noexcept;

returns a pointer to the internal buffer of the bitfield, or nullptr if it's empty.

[report issue]

swap()

void swap (bitfield& rhs) noexcept;

swaps the bit-fields two variables refer to

[report issue]

count()

int count () const noexcept;

count the number of bits in the bitfield that are set to 1.

[report issue]

find_first_set()

int find_first_set () const noexcept;

returns the index of the first set bit in the bitfield, i.e. 1 bit.

[report issue]

find_last_clear()

int find_last_clear () const noexcept;

returns the index to the last cleared bit in the bitfield, i.e. 0 bit.

[report issue]

hasher

Declared in "libtorrent/hasher.hpp"

this is a SHA-1 hash class.

You use it by first instantiating it, then call update() to feed it with data. i.e. you don't have to keep the entire buffer of which you want to create the hash in memory. You can feed the hasher parts of it at a time. When You have fed the hasher with all the data, you call final() and it will return the sha1-hash of the data.

The constructor that takes a char const* and an integer will construct the sha1 context and feed it the data passed in.

If you want to reuse the hasher object once you have created a hash, you have to call reset() to reinitialize it.

The built-in software version of sha1-algorithm was implemented by Steve Reid and released as public domain. For more info, see src/sha1.cpp.

class hasher
{
   hasher ();
   explicit hasher (span<char const> data);
   hasher (char const* data, int len);
   hasher (hasher const&);
   hasher& operator= (hasher const&) &;
   hasher& update (char const* data, int len);
   hasher& update (span<char const> data);
   sha1_hash final ();
   void reset ();
};
[report issue]

operator=() hasher()

explicit hasher (span<char const> data);
hasher (char const* data, int len);
hasher (hasher const&);
hasher& operator= (hasher const&) &;

this is the same as default constructing followed by a call to update(data, len).

[report issue]

update()

hasher& update (char const* data, int len);
hasher& update (span<char const> data);

append the following bytes to what is being hashed

[report issue]

final()

sha1_hash final ();

returns the SHA-1 digest of the buffers previously passed to update() and the hasher constructor.

[report issue]

reset()

void reset ();

restore the hasher state to be as if the hasher has just been default constructed.

[report issue]

hasher256

Declared in "libtorrent/hasher.hpp"

class hasher256
{
   hasher256 ();
   explicit hasher256 (span<char const> data);
   hasher256 (char const* data, int len);
   hasher256 (hasher256 const&);
   hasher256& operator= (hasher256 const&) &;
   hasher256& update (char const* data, int len);
   hasher256& update (span<char const> data);
   sha256_hash final ();
   void reset ();
   ~hasher256 ();
};
[report issue]

hasher256() operator=()

explicit hasher256 (span<char const> data);
hasher256 (char const* data, int len);
hasher256 (hasher256 const&);
hasher256& operator= (hasher256 const&) &;

this is the same as default constructing followed by a call to update(data, len).

[report issue]

update()

hasher256& update (char const* data, int len);
hasher256& update (span<char const> data);

append the following bytes to what is being hashed

[report issue]

final()

sha256_hash final ();

returns the SHA-1 digest of the buffers previously passed to update() and the hasher constructor.

[report issue]

reset()

void reset ();

restore the hasher state to be as if the hasher has just been default constructed.

Bencoding is a common representation in bittorrent used for dictionary, list, int and string hierarchies. It's used to encode .torrent files and some messages in the network protocol. libtorrent also uses it to store settings, resume data and other session state.

Strings in bencoded structures do not necessarily represent text. Strings are raw byte buffers of a certain length. If a string is meant to be interpreted as text, it is required to be UTF-8 encoded. See BEP 3.

The function for decoding bencoded data bdecode(), returning a bdecode_node. This function builds a tree that points back into the original buffer. The returned bdecode_node will not be valid once the buffer it was parsed out of is discarded.

It's possible to construct an entry from a bdecode_node, if a structure needs to be altered and re-encoded.

[report issue]

entry

Declared in "libtorrent/entry.hpp"

The entry class represents one node in a bencoded hierarchy. It works as a variant type, it can be either a list, a dictionary (std::map), an integer or a string.

class entry
{
   data_type type () const;
   entry (preformatted_type);
   entry (integer_type);
   entry (list_type);
   entry (span<char const>);
   entry (dictionary_type);
   entry (U v);
   entry (data_type t);
   entry (bdecode_node const& n);
   entry& operator= (dictionary_type) &;
   entry& operator= (entry const&) &;
   entry& operator= (integer_type) &;
   entry& operator= (entry&&) & noexcept;
   entry& operator= (preformatted_type) &;
   entry& operator= (span<char const>) &;
   entry& operator= (list_type) &;
   entry& operator= (bdecode_node const&) &;
   entry& operator= (U v) &;
   list_type const& list () const;
   integer_type& integer ();
   dictionary_type& dict ();
   preformatted_type const& preformatted () const;
   list_type& list ();
   dictionary_type const& dict () const;
   preformatted_type& preformatted ();
   integer_type const& integer () const;
   string_type const& string () const;
   string_type& string ();
   void swap (entry& e);
   entry const& operator[] (string_view key) const;
   entry& operator[] (string_view key);
   entry* find_key (string_view key);
   entry const* find_key (string_view key) const;
   std::string to_string (bool single_line = false) const;

   enum data_type
   {
      int_t,
      string_t,
      list_t,
      dictionary_t,
      undefined_t,
      preformatted_t,
   };
};
[report issue]

type()

data_type type () const;

returns the concrete type of the entry

[report issue]

entry()

entry (preformatted_type);
entry (integer_type);
entry (list_type);
entry (span<char const>);
entry (dictionary_type);

constructors directly from a specific type. The content of the argument is copied into the newly constructed entry

[report issue]

entry()

entry (data_type t);

construct an empty entry of the specified type. see data_type enum.

[report issue]

entry()

entry (bdecode_node const& n);

construct from bdecode_node parsed form (see bdecode())

[report issue]

operator=()

entry& operator= (dictionary_type) &;
entry& operator= (entry const&) &;
entry& operator= (integer_type) &;
entry& operator= (entry&&) & noexcept;
entry& operator= (preformatted_type) &;
entry& operator= (span<char const>) &;
entry& operator= (list_type) &;
entry& operator= (bdecode_node const&) &;

copies the structure of the right hand side into this entry.

[report issue]

dict() string() preformatted() integer() list()

list_type const& list () const;
integer_type& integer ();
dictionary_type& dict ();
preformatted_type const& preformatted () const;
list_type& list ();
dictionary_type const& dict () const;
preformatted_type& preformatted ();
integer_type const& integer () const;
string_type const& string () const;
string_type& string ();

The integer(), string(), list() and dict() functions are accessors that return the respective type. If the entry object isn't of the type you request, the accessor will throw system_error. You can ask an entry for its type through the type() function.

If you want to create an entry you give it the type you want it to have in its constructor, and then use one of the non-const accessors to get a reference which you then can assign the value you want it to have.

The typical code to get info from a torrent file will then look like this:

entry torrent_file;
// ...

// throws if this is not a dictionary
entry::dictionary_type const& dict = torrent_file.dict();
entry::dictionary_type::const_iterator i;
i = dict.find("announce");
if (i != dict.end())
{
        std::string tracker_url = i->second.string();
        std::cout << tracker_url << "\n";
}

The following code is equivalent, but a little bit shorter:

entry torrent_file;
// ...

// throws if this is not a dictionary
if (entry* i = torrent_file.find_key("announce"))
{
        std::string tracker_url = i->string();
        std::cout << tracker_url << "\n";
}

To make it easier to extract information from a torrent file, the class torrent_info exists.

[report issue]

swap()

void swap (entry& e);

swaps the content of this with e.

[report issue]

operator[]()

entry const& operator[] (string_view key) const;
entry& operator[] (string_view key);

All of these functions requires the entry to be a dictionary, if it isn't they will throw system_error.

The non-const versions of the operator[] will return a reference to either the existing element at the given key or, if there is no element with the given key, a reference to a newly inserted element at that key.

The const version of operator[] will only return a reference to an existing element at the given key. If the key is not found, it will throw system_error.

[report issue]

find_key()

entry* find_key (string_view key);
entry const* find_key (string_view key) const;

These functions requires the entry to be a dictionary, if it isn't they will throw system_error.

They will look for an element at the given key in the dictionary, if the element cannot be found, they will return nullptr. If an element with the given key is found, the return a pointer to it.

[report issue]

to_string()

std::string to_string (bool single_line = false) const;

returns a pretty-printed string representation of the bencoded structure, with JSON-style syntax

[report issue]

enum data_type

Declared in "libtorrent/entry.hpp"

name value description
int_t 0  
string_t 1  
list_t 2  
dictionary_t 3  
undefined_t 4  
preformatted_t 5  
[report issue]

bencode()

Declared in "libtorrent/bencode.hpp"

template<class OutIt> int bencode (OutIt out, const entry& e);

This function will encode data to bencoded form.

The entry class is the internal representation of the bencoded data and it can be used to retrieve information, an entry can also be build by the program and given to bencode() to encode it into the OutIt iterator.

OutIt is an OutputIterator. It's a template and usually instantiated as ostream_iterator or back_insert_iterator. This function assumes the value_type of the iterator is a char. In order to encode entry e into a buffer, do:

std::vector<char> buffer;
bencode(std::back_inserter(buf), e);
[report issue]

operator<<()

Declared in "libtorrent/entry.hpp"

inline std::ostream& operator<< (std::ostream& os, const entry& e);

prints the bencoded structure to the ostream as a JSON-style structure.

[report issue]

block_info

Declared in "libtorrent/torrent_handle.hpp"

holds the state of a block in a piece. Who we requested it from and how far along we are at downloading it.

struct block_info
{
   tcp::endpoint peer () const;
   void set_peer (tcp::endpoint const& ep);

   enum block_state_t
   {
      none,
      requested,
      writing,
      finished,
   };

   unsigned bytes_progress:15;
   unsigned block_size:15;
   unsigned state:2;
   unsigned num_peers:14;
};
[report issue]

peer() set_peer()

tcp::endpoint peer () const;
void set_peer (tcp::endpoint const& ep);

The peer is the ip address of the peer this block was downloaded from.

[report issue]

enum block_state_t

Declared in "libtorrent/torrent_handle.hpp"

name value description
none 0 This block has not been downloaded or requested form any peer.
requested 1 The block has been requested, but not completely downloaded yet.
writing 2 The block has been downloaded and is currently queued for being written to disk.
finished 3 The block has been written to disk.
[report issue]
bytes_progress
the number of bytes that have been received for this block
[report issue]
block_size
the total number of bytes in this block.
[report issue]
state
the state this block is in (see block_state_t)
[report issue]
num_peers
the number of peers that is currently requesting this block. Typically this is 0 or 1, but at the end of the torrent blocks may be requested by more peers in parallel to speed things up.
[report issue]

partial_piece_info

Declared in "libtorrent/torrent_handle.hpp"

This class holds information about pieces that have outstanding requests or outstanding writes

struct partial_piece_info
{
   piece_index_t piece_index;
   int blocks_in_piece;
   int finished;
   int writing;
   int requested;
   block_info* blocks;
};
[report issue]
piece_index
the index of the piece in question. blocks_in_piece is the number of blocks in this particular piece. This number will be the same for most pieces, but the last piece may have fewer blocks than the standard pieces.
[report issue]
blocks_in_piece
the number of blocks in this piece
[report issue]
finished
the number of blocks that are in the finished state
[report issue]
writing
the number of blocks that are in the writing state
[report issue]
requested
the number of blocks that are in the requested state
[report issue]
blocks

this is an array of blocks_in_piece number of items. One for each block in the piece.

Warning

This is a pointer that points to an array that's owned by the session object. The next time get_download_queue() is called, it will be invalidated.

[report issue]

torrent_handle

Declared in "libtorrent/torrent_handle.hpp"

You will usually have to store your torrent handles somewhere, since it's the object through which you retrieve information about the torrent and aborts the torrent.

Warning

Any member function that returns a value or fills in a value has to be made synchronously. This means it has to wait for the main thread to complete the query before it can return. This might potentially be expensive if done from within a GUI thread that needs to stay responsive. Try to avoid querying for information you don't need, and try to do it in as few calls as possible. You can get most of the interesting information about a torrent from the torrent_handle::status() call.

The default constructor will initialize the handle to an invalid state. Which means you cannot perform any operation on it, unless you first assign it a valid handle. If you try to perform any operation on an uninitialized handle, it will throw invalid_handle.

Warning

All operations on a torrent_handle may throw system_error exception, in case the handle is no longer referring to a torrent. There is one exception is_valid() will never throw. Since the torrents are processed by a background thread, there is no guarantee that a handle will remain valid between two calls.

struct torrent_handle
{
   friend std::size_t hash_value (torrent_handle const& th);
   torrent_handle () noexcept = default;
   void add_piece (piece_index_t piece, char const* data, add_piece_flags_t flags = {}) const;
   void read_piece (piece_index_t piece) const;
   bool have_piece (piece_index_t piece) const;
   void get_peer_info (std::vector<peer_info>& v) const;
   torrent_status status (status_flags_t flags = status_flags_t::all()) const;
   std::vector<partial_piece_info> get_download_queue () const;
   void get_download_queue (std::vector<partial_piece_info>& queue) const;
   void clear_piece_deadlines () const;
   void reset_piece_deadline (piece_index_t index) const;
   void set_piece_deadline (piece_index_t index, int deadline, deadline_flags_t flags = {}) const;
   std::vector<std::int64_t> file_progress (file_progress_flags_t flags = {}) const;
   void file_progress (std::vector<std::int64_t>& progress, file_progress_flags_t flags = {}) const;
   std::vector<open_file_state> file_status () const;
   void clear_error () const;
   void replace_trackers (std::vector<announce_entry> const&) const;
   std::vector<announce_entry> trackers () const;
   void add_tracker (announce_entry const&) const;
   void add_url_seed (std::string const& url) const;
   void remove_url_seed (std::string const& url) const;
   std::set<std::string> url_seeds () const;
   void remove_http_seed (std::string const& url) const;
   std::set<std::string> http_seeds () const;
   void add_http_seed (std::string const& url) const;
   void add_extension (
      std::function<std::shared_ptr<torrent_plugin>(torrent_handle const&, client_data_t)> const& ext
      , client_data_t userdata = client_data_t{});
   bool set_metadata (span<char const> metadata) const;
   bool is_valid () const;
   void resume () const;
   void pause (pause_flags_t flags = {}) const;
   torrent_flags_t flags () const;
   void set_flags (torrent_flags_t flags, torrent_flags_t mask) const;
   void unset_flags (torrent_flags_t flags) const;
   void set_flags (torrent_flags_t flags) const;
   void flush_cache () const;
   void force_recheck () const;
   void save_resume_data (resume_data_flags_t flags = {}) const;
   bool need_save_resume_data () const;
   void queue_position_up () const;
   void queue_position_down () const;
   queue_position_t queue_position () const;
   void queue_position_bottom () const;
   void queue_position_top () const;
   void queue_position_set (queue_position_t p) const;
   void set_ssl_certificate (std::string const& certificate
      , std::string const& private_key
      , std::string const& dh_params
      , std::string const& passphrase = "");
   void set_ssl_certificate_buffer (std::string const& certificate
      , std::string const& private_key
      , std::string const& dh_params);
   std::shared_ptr<const torrent_info> torrent_file () const;
   std::shared_ptr<torrent_info> torrent_file_with_hashes () const;
   std::vector<std::vector<sha256_hash>> piece_layers () const;
   void piece_availability (std::vector<int>& avail) const;
   void prioritize_pieces (std::vector<std::pair<piece_index_t, download_priority_t>> const& pieces) const;
   void prioritize_pieces (std::vector<download_priority_t> const& pieces) const;
   std::vector<download_priority_t> get_piece_priorities () const;
   download_priority_t piece_priority (piece_index_t index) const;
   void piece_priority (piece_index_t index, download_priority_t priority) const;
   void file_priority (file_index_t index, download_priority_t priority) const;
   std::vector<download_priority_t> get_file_priorities () const;
   download_priority_t file_priority (file_index_t index) const;
   void prioritize_files (std::vector<download_priority_t> const& files) const;
   void force_lsd_announce () const;
   void force_dht_announce () const;
   void force_reannounce (int seconds = 0, int idx = -1, reannounce_flags_t = {}) const;
   void scrape_tracker (int idx = -1) const;
   int download_limit () const;
   int upload_limit () const;
   void set_download_limit (int limit) const;
   void set_upload_limit (int limit) const;
   void connect_peer (tcp::endpoint const& adr, peer_source_flags_t source = {}
      , pex_flags_t flags = pex_encryption | pex_utp | pex_holepunch) const;
   void clear_peers ();
   void set_max_uploads (int max_uploads) const;
   int max_uploads () const;
   void set_max_connections (int max_connections) const;
   int max_connections () const;
   void move_storage (std::string const& save_path
      , move_flags_t flags = move_flags_t::always_replace_files
      ) const;
   void rename_file (file_index_t index, std::string const& new_name) const;
   sha1_hash info_hash () const;
   info_hash_t info_hashes () const;
   bool operator< (const torrent_handle& h) const;
   bool operator!= (const torrent_handle& h) const;
   bool operator== (const torrent_handle& h) const;
   std::uint32_t id () const;
   std::shared_ptr<torrent> native_handle () const;
   client_data_t userdata () const;
   bool in_session () const;

   static constexpr add_piece_flags_t overwrite_existing  = 0_bit;
   static constexpr status_flags_t query_distributed_copies  = 0_bit;
   static constexpr status_flags_t query_accurate_download_counters  = 1_bit;
   static constexpr status_flags_t query_last_seen_complete  = 2_bit;
   static constexpr status_flags_t query_pieces  = 3_bit;
   static constexpr status_flags_t query_verified_pieces  = 4_bit;
   static constexpr status_flags_t query_torrent_file  = 5_bit;
   static constexpr status_flags_t query_name  = 6_bit;
   static constexpr status_flags_t query_save_path  = 7_bit;
   static constexpr deadline_flags_t alert_when_available  = 0_bit;
   static constexpr file_progress_flags_t piece_granularity  = 0_bit;
   static constexpr pause_flags_t graceful_pause  = 0_bit;
   static constexpr pause_flags_t clear_disk_cache  = 1_bit;
   static constexpr resume_data_flags_t flush_disk_cache  = 0_bit;
   static constexpr resume_data_flags_t save_info_dict  = 1_bit;
   static constexpr resume_data_flags_t only_if_modified  = 2_bit;
   static constexpr reannounce_flags_t ignore_min_interval  = 0_bit;
};
[report issue]

torrent_handle()

torrent_handle () noexcept = default;

constructs a torrent handle that does not refer to a torrent. i.e. is_valid() will return false.

[report issue]

add_piece()

void add_piece (piece_index_t piece, char const* data, add_piece_flags_t flags = {}) const;

This function will write data to the storage as piece piece, as if it had been downloaded from a peer. data is expected to point to a buffer of as many bytes as the size of the specified piece. The data in the buffer is copied and passed on to the disk IO thread to be written at a later point.

By default, data that's already been downloaded is not overwritten by this buffer. If you trust this data to be correct (and pass the piece hash check) you may pass the overwrite_existing flag. This will instruct libtorrent to overwrite any data that may already have been downloaded with this data.

Since the data is written asynchronously, you may know that is passed or failed the hash check by waiting for piece_finished_alert or hash_failed_alert.

Adding pieces while the torrent is being checked (i.e. in torrent_status::checking_files state) is not supported.

[report issue]

read_piece()

void read_piece (piece_index_t piece) const;

This function starts an asynchronous read operation of the specified piece from this torrent. You must have completed the download of the specified piece before calling this function.

When the read operation is completed, it is passed back through an alert, read_piece_alert. Since this alert is a response to an explicit call, it will always be posted, regardless of the alert mask.

Note that if you read multiple pieces, the read operations are not guaranteed to finish in the same order as you initiated them.

[report issue]

have_piece()

bool have_piece (piece_index_t piece) const;

Returns true if this piece has been completely downloaded and written to disk, and false otherwise.

[report issue]

get_peer_info()

void get_peer_info (std::vector<peer_info>& v) const;

takes a reference to a vector that will be cleared and filled with one entry for each peer connected to this torrent, given the handle is valid. If the torrent_handle is invalid, it will throw system_error exception. Each entry in the vector contains information about that particular peer. See peer_info.

[report issue]

status()

torrent_status status (status_flags_t flags = status_flags_t::all()) const;

status() will return a structure with information about the status of this torrent. If the torrent_handle is invalid, it will throw system_error exception. See torrent_status. The flags argument filters what information is returned in the torrent_status. Some information in there is relatively expensive to calculate, and if you're not interested in it (and see performance issues), you can filter them out.

By default everything is included. The flags you can use to decide what to include are defined in this class.

[report issue]

get_download_queue()

std::vector<partial_piece_info> get_download_queue () const;
void get_download_queue (std::vector<partial_piece_info>& queue) const;

get_download_queue() returns a vector with information about pieces that are partially downloaded or not downloaded but partially requested. See partial_piece_info for the fields in the returned vector.

[report issue]

reset_piece_deadline() set_piece_deadline() clear_piece_deadlines()

void clear_piece_deadlines () const;
void reset_piece_deadline (piece_index_t index) const;
void set_piece_deadline (piece_index_t index, int deadline, deadline_flags_t flags = {}) const;

This function sets or resets the deadline associated with a specific piece index (index). libtorrent will attempt to download this entire piece before the deadline expires. This is not necessarily possible, but pieces with a more recent deadline will always be prioritized over pieces with a deadline further ahead in time. The deadline (and flags) of a piece can be changed by calling this function again.

If the piece is already downloaded when this call is made, nothing happens, unless the alert_when_available flag is set, in which case it will have the same effect as calling read_piece() for index.

deadline is the number of milliseconds until this piece should be completed.

reset_piece_deadline removes the deadline from the piece. If it hasn't already been downloaded, it will no longer be considered a priority.

clear_piece_deadlines() removes deadlines on all pieces in the torrent. As if reset_piece_deadline() was called on all pieces.

[report issue]

file_progress()

std::vector<std::int64_t> file_progress (file_progress_flags_t flags = {}) const;
void file_progress (std::vector<std::int64_t>& progress, file_progress_flags_t flags = {}) const;

This function fills in the supplied vector, or returns a vector, with the number of bytes downloaded of each file in this torrent. The progress values are ordered the same as the files in the torrent_info.

This operation is not very cheap. Its complexity is O(n + mj). Where n is the number of files, m is the number of currently downloading pieces and j is the number of blocks in a piece.

The flags parameter can be used to specify the granularity of the file progress. If left at the default value of 0, the progress will be as accurate as possible, but also more expensive to calculate. If torrent_handle::piece_granularity is specified, the progress will be specified in piece granularity. i.e. only pieces that have been fully downloaded and passed the hash check count. When specifying piece granularity, the operation is a lot cheaper, since libtorrent already keeps track of this internally and no calculation is required.

[report issue]

file_status()

std::vector<open_file_state> file_status () const;

This function returns a vector with status about files that are open for this torrent. Any file that is not open will not be reported in the vector, i.e. it's possible that the vector is empty when returning, if none of the files in the torrent are currently open.

See open_file_state

[report issue]

clear_error()

void clear_error () const;

If the torrent is in an error state (i.e. torrent_status::error is non-empty), this will clear the error and start the torrent again.

[report issue]

replace_trackers() trackers() add_tracker()

void replace_trackers (std::vector<announce_entry> const&) const;
std::vector<announce_entry> trackers () const;
void add_tracker (announce_entry const&) const;

trackers() will return the list of trackers for this torrent. The announce entry contains both a string url which specify the announce url for the tracker as well as an int tier, which is specifies the order in which this tracker is tried. If you want libtorrent to use another list of trackers for this torrent, you can use replace_trackers() which takes a list of the same form as the one returned from trackers() and will replace it. If you want an immediate effect, you have to call force_reannounce(). See announce_entry.

add_tracker() will look if the specified tracker is already in the set. If it is, it doesn't do anything. If it's not in the current set of trackers, it will insert it in the tier specified in the announce_entry.

The updated set of trackers will be saved in the resume data, and when a torrent is started with resume data, the trackers from the resume data will replace the original ones.

[report issue]

remove_url_seed() url_seeds() add_url_seed()

void add_url_seed (std::string const& url) const;
void remove_url_seed (std::string const& url) const;
std::set<std::string> url_seeds () const;

add_url_seed() adds another url to the torrent's list of url seeds. If the given url already exists in that list, the call has no effect. The torrent will connect to the server and try to download pieces from it, unless it's paused, queued, checking or seeding. remove_url_seed() removes the given url if it exists already. url_seeds() return a set of the url seeds currently in this torrent. Note that URLs that fails may be removed automatically from the list.

See http seeding for more information.

[report issue]

add_http_seed() remove_http_seed() http_seeds()

void remove_http_seed (std::string const& url) const;
std::set<std::string> http_seeds () const;
void add_http_seed (std::string const& url) const;

These functions are identical as the *_url_seed() variants, but they operate on BEP 17 web seeds instead of BEP 19.

See http seeding for more information.

[report issue]

add_extension()

void add_extension (
      std::function<std::shared_ptr<torrent_plugin>(torrent_handle const&, client_data_t)> const& ext
      , client_data_t userdata = client_data_t{});

add the specified extension to this torrent. The ext argument is a function that will be called from within libtorrent's context passing in the internal torrent object and the specified userdata pointer. The function is expected to return a shared pointer to a torrent_plugin instance.

[report issue]

set_metadata()

bool set_metadata (span<char const> metadata) const;

set_metadata expects the info section of metadata. i.e. The buffer passed in will be hashed and verified against the info-hash. If it fails, a metadata_failed_alert will be generated. If it passes, a metadata_received_alert is generated. The function returns true if the metadata is successfully set on the torrent, and false otherwise. If the torrent already has metadata, this function will not affect the torrent, and false will be returned.

[report issue]

is_valid()

bool is_valid () const;

Returns true if this handle refers to a valid torrent and false if it hasn't been initialized or if the torrent it refers to has been removed from the session AND destructed.

To tell if the torrent_handle is in the session, use torrent_handle::in_session(). This will return true before session_handle::remove_torrent() is called, and false afterward.

Clients should only use is_valid() to determine if the result of session::find_torrent() was successful.

Unlike other member functions which return a value, is_valid() completes immediately, without blocking on a result from the network thread. Also unlike other functions, it never throws the system_error exception.

[report issue]

pause() resume()

void resume () const;
void pause (pause_flags_t flags = {}) const;

pause(), and resume() will disconnect all peers and reconnect all peers respectively. When a torrent is paused, it will however remember all share ratios to all peers and remember all potential (not connected) peers. Torrents may be paused automatically if there is a file error (e.g. disk full) or something similar. See file_error_alert.

To know if a torrent is paused or not, call torrent_handle::status() and inspect torrent_status::paused.

Note

Torrents that are auto-managed may be automatically resumed again. It does not make sense to pause an auto-managed torrent without making it not auto-managed first. Torrents are auto-managed by default when added to the session. For more information, see queuing.

[report issue]

set_flags() flags() unset_flags()

torrent_flags_t flags () const;
void set_flags (torrent_flags_t flags, torrent_flags_t mask) const;
void unset_flags (torrent_flags_t flags) const;
void set_flags (torrent_flags_t flags) const;

sets and gets the torrent state flags. See torrent_flags_t. The set_flags overload that take a mask will affect all flags part of the mask, and set their values to what the flags argument is set to. This allows clearing and setting flags in a single function call. The set_flags overload that just takes flags, sets all the specified flags and leave any other flags unchanged. unset_flags clears the specified flags, while leaving any other flags unchanged.

The seed_mode flag is special, it can only be cleared once the torrent has been added, and it can only be set as part of the add_torrent_params flags, when adding the torrent.

[report issue]

flush_cache()

void flush_cache () const;

Instructs libtorrent to flush all the disk caches for this torrent and close all file handles. This is done asynchronously and you will be notified that it's complete through cache_flushed_alert.

Note that by the time you get the alert, libtorrent may have cached more data for the torrent, but you are guaranteed that whatever cached data libtorrent had by the time you called torrent_handle::flush_cache() has been written to disk.

[report issue]

force_recheck()

void force_recheck () const;

force_recheck puts the torrent back in a state where it assumes to have no resume data. All peers will be disconnected and the torrent will stop announcing to the tracker. The torrent will be added to the checking queue, and will be checked (all the files will be read and compared to the piece hashes). Once the check is complete, the torrent will start connecting to peers again, as normal. The torrent will be placed last in queue, i.e. its queue position will be the highest of all torrents in the session.

[report issue]

save_resume_data()

void save_resume_data (resume_data_flags_t flags = {}) const;

save_resume_data() asks libtorrent to generate fast-resume data for this torrent.

This operation is asynchronous, save_resume_data will return immediately. The resume data is delivered when it's done through an save_resume_data_alert.

The fast resume data will be empty in the following cases:

  1. The torrent handle is invalid.
  2. The torrent hasn't received valid metadata and was started without metadata (see libtorrent's metadata from peers extension)

Note that by the time you receive the fast resume data, it may already be invalid if the torrent is still downloading! The recommended practice is to first pause the session, then generate the fast resume data, and then close it down. Make sure to not remove_torrent() before you receive the save_resume_data_alert though. There's no need to pause when saving intermittent resume data.

Warning

If you pause every torrent individually instead of pausing the session, every torrent will have its paused state saved in the resume data!

Note

It is typically a good idea to save resume data whenever a torrent is completed or paused. In those cases you don't need to pause the torrent or the session, since the torrent will do no more writing to its files. If you save resume data for torrents when they are paused, you can accelerate the shutdown process by not saving resume data again for paused torrents. Completed torrents should have their resume data saved when they complete and on exit, since their statistics might be updated.

In full allocation mode the resume data is never invalidated by subsequent writes to the files, since pieces won't move around. This means that you don't need to pause before writing resume data in full or sparse mode. If you don't, however, any data written to disk after you saved resume data and before the session closed is lost.

It also means that if the resume data is out dated, libtorrent will not re-check the files, but assume that it is fairly recent. The assumption is that it's better to loose a little bit than to re-check the entire file.

It is still a good idea to save resume data periodically during download as well as when closing down.

Example code to pause and save resume data for all torrents and wait for the alerts:

extern int outstanding_resume_data; // global counter of outstanding resume data
std::vector<torrent_handle> handles = ses.get_torrents();
ses.pause();
for (torrent_handle const& h : handles) try
{
        torrent_status s = h.status();
        if (!s.has_metadata || !s.need_save_resume_data()) continue;

        h.save_resume_data();
        ++outstanding_resume_data;
}
catch (lt::system_error const& e)
{
        // the handle was invalid, ignore this one and move to the next
}

while (outstanding_resume_data > 0)
{
        alert const* a = ses.wait_for_alert(seconds(10));

        // if we don't get an alert within 10 seconds, abort
        if (a == nullptr) break;

        std::vector<alert*> alerts;
        ses.pop_alerts(&alerts);

        for (alert* i : alerts)
        {
                if (alert_cast<save_resume_data_failed_alert>(i))
                {
                        process_alert(i);
                        --outstanding_resume_data;
                        continue;
                }

                save_resume_data_alert const* rd = alert_cast<save_resume_data_alert>(i);
                if (rd == nullptr)
                {
                        process_alert(i);
                        continue;
                }

                torrent_handle h = rd->handle;
                torrent_status st = h.status(torrent_handle::query_save_path
                        | torrent_handle::query_name);
                std::ofstream out((st.save_path
                        + "/" + st.name + ".fastresume").c_str()
                        , std::ios_base::binary);
                std::vector<char> buf = write_resume_data_buf(rd->params);
                out.write(buf.data(), buf.size());
                --outstanding_resume_data;
        }
}

Note

Note how outstanding_resume_data is a global counter in this example. This is deliberate, otherwise there is a race condition for torrents that was just asked to save their resume data, they posted the alert, but it has not been received yet. Those torrents would report that they don't need to save resume data again, and skipped by the initial loop, and thwart the counter otherwise.

[report issue]

need_save_resume_data()

bool need_save_resume_data () const;

This function returns true if any whole chunk has been downloaded since the torrent was first loaded or since the last time the resume data was saved. When saving resume data periodically, it makes sense to skip any torrent which hasn't downloaded anything since the last time.

Note

A torrent's resume data is considered saved as soon as the save_resume_data_alert is posted. It is important to make sure this alert is received and handled in order for this function to be meaningful.

[report issue]

queue_position() queue_position_down() queue_position_top() queue_position_up() queue_position_bottom()

void queue_position_up () const;
void queue_position_down () const;
queue_position_t queue_position () const;
void queue_position_bottom () const;
void queue_position_top () const;

Every torrent that is added is assigned a queue position exactly one greater than the greatest queue position of all existing torrents. Torrents that are being seeded have -1 as their queue position, since they're no longer in line to be downloaded.

When a torrent is removed or turns into a seed, all torrents with greater queue positions have their positions decreased to fill in the space in the sequence.

queue_position() returns the torrent's position in the download queue. The torrents with the smallest numbers are the ones that are being downloaded. The smaller number, the closer the torrent is to the front of the line to be started.

The queue position is also available in the torrent_status.

The queue_position_*() functions adjust the torrents position in the queue. Up means closer to the front and down means closer to the back of the queue. Top and bottom refers to the front and the back of the queue respectively.

[report issue]

queue_position_set()

void queue_position_set (queue_position_t p) const;

updates the position in the queue for this torrent. The relative order of all other torrents remain intact but their numerical queue position shifts to make space for this torrent's new position

[report issue]

set_ssl_certificate() set_ssl_certificate_buffer()

void set_ssl_certificate (std::string const& certificate
      , std::string const& private_key
      , std::string const& dh_params
      , std::string const& passphrase = "");
void set_ssl_certificate_buffer (std::string const& certificate
      , std::string const& private_key
      , std::string const& dh_params);

For SSL torrents, use this to specify a path to a .pem file to use as this client's certificate. The certificate must be signed by the certificate in the .torrent file to be valid.

The set_ssl_certificate_buffer() overload takes the actual certificate, private key and DH params as strings, rather than paths to files.

cert is a path to the (signed) certificate in .pem format corresponding to this torrent.

private_key is a path to the private key for the specified certificate. This must be in .pem format.

dh_params is a path to the Diffie-Hellman parameter file, which needs to be in .pem format. You can generate this file using the openssl command like this: openssl dhparam -outform PEM -out dhparams.pem 512.

passphrase may be specified if the private key is encrypted and requires a passphrase to be decrypted.

Note that when a torrent first starts up, and it needs a certificate, it will suspend connecting to any peers until it has one. It's typically desirable to resume the torrent after setting the SSL certificate.

If you receive a torrent_need_cert_alert, you need to call this to provide a valid cert. If you don't have a cert you won't be allowed to connect to any peers.

[report issue]

torrent_file_with_hashes() torrent_file()

std::shared_ptr<const torrent_info> torrent_file () const;
std::shared_ptr<torrent_info> torrent_file_with_hashes () const;

torrent_file() returns a pointer to the torrent_info object associated with this torrent. The torrent_info object may be a copy of the internal object. If the torrent doesn't have metadata, the pointer will not be initialized (i.e. a nullptr). The torrent may be in a state without metadata only if it was started without a .torrent file, e.g. by being added by magnet link.

Note that the torrent_info object returned here may be a different instance than the one added to the session, with different attributes like piece layers, dht nodes and trackers. A torrent_info object does not round-trip cleanly when added to a session.

This means if you want to create a .torrent file by passing the torrent_info object into create_torrent, you need to use torrent_file_with_hashes() instead.

torrent_file_with_hashes() returns a copy of the internal torrent_info and piece layer hashes (if it's a v2 torrent). The piece layers will only be included if they are available. If this torrent was added from a .torrent file with piece layers or if it's seeding, the piece layers are available. This function is more expensive than torrent_file() since it needs to make copies of this information.

When constructing a create_torrent object from a torrent_info that's in a session, you need to use this function.

Note that a torrent added from a magnet link may not have the full merkle trees for all files, and hence not have the complete piece layers. In that state, you cannot create a .torrent file even from the torrent_info returned from torrent_file_with_hashes(). Once the torrent completes downloading all files, becoming a seed, you can make a .torrent file from it.

[report issue]

piece_layers()

std::vector<std::vector<sha256_hash>> piece_layers () const;

returns the piece layers for all files in the torrent. If this is a v1 torrent (and doesn't have any piece layers) it returns an empty vector. This is a blocking call that will synchronize with the libtorrent network thread.

[report issue]

piece_availability()

void piece_availability (std::vector<int>& avail) const;

Fills the specified std::vector<int> with the availability for each piece in this torrent. libtorrent does not keep track of availability for seeds, so if the torrent is seeding the availability for all pieces is reported as 0.

The piece availability is the number of peers that we are connected that has advertised having a particular piece. This is the information that libtorrent uses in order to prefer picking rare pieces.

[report issue]

piece_priority() get_piece_priorities() prioritize_pieces()

void prioritize_pieces (std::vector<std::pair<piece_index_t, download_priority_t>> const& pieces) const;
void prioritize_pieces (std::vector<download_priority_t> const& pieces) const;
std::vector<download_priority_t> get_piece_priorities () const;
download_priority_t piece_priority (piece_index_t index) const;
void piece_priority (piece_index_t index, download_priority_t priority) const;

These functions are used to set and get the priority of individual pieces. By default all pieces have priority 4. That means that the random rarest first algorithm is effectively active for all pieces. You may however change the priority of individual pieces. There are 8 priority levels. 0 means not to download the piece at all. Otherwise, lower priority values means less likely to be picked. Piece priority takes precedence over piece availability. Every piece with priority 7 will be attempted to be picked before a priority 6 piece and so on.

The default priority of pieces is 4.

Piece priorities can not be changed for torrents that have not downloaded the metadata yet. Magnet links won't have metadata immediately. see the metadata_received_alert.

piece_priority sets or gets the priority for an individual piece, specified by index.

prioritize_pieces takes a vector of integers, one integer per piece in the torrent. All the piece priorities will be updated with the priorities in the vector. The second overload of prioritize_pieces that takes a vector of pairs will update the priorities of only select pieces, and leave all other unaffected. Each pair is (piece, priority). That is, the first item is the piece index and the second item is the priority of that piece. Invalid entries, where the piece index or priority is out of range, are not allowed.

get_piece_priorities returns a vector with one element for each piece in the torrent. Each element is the current priority of that piece.

It's possible to cancel the effect of file priorities by setting the priorities for the affected pieces. Care has to be taken when mixing usage of file- and piece priorities.

[report issue]

get_file_priorities() file_priority() prioritize_files()

void file_priority (file_index_t index, download_priority_t priority) const;
std::vector<download_priority_t> get_file_priorities () const;
download_priority_t file_priority (file_index_t index) const;
void prioritize_files (std::vector<download_priority_t> const& files) const;

index must be in the range [0, number_of_files).

file_priority() queries or sets the priority of file index.

prioritize_files() takes a vector that has at as many elements as there are files in the torrent. Each entry is the priority of that file. The function sets the priorities of all the pieces in the torrent based on the vector.

get_file_priorities() returns a vector with the priorities of all files.

The priority values are the same as for piece_priority(). See download_priority_t.

Whenever a file priority is changed, all other piece priorities are reset to match the file priorities. In order to maintain special priorities for particular pieces, piece_priority() has to be called again for those pieces.

You cannot set the file priorities on a torrent that does not yet have metadata or a torrent that is a seed. file_priority(int, int) and prioritize_files() are both no-ops for such torrents.

Since changing file priorities may involve disk operations (of moving files in- and out of the part file), the internal accounting of file priorities happen asynchronously. i.e. setting file priorities and then immediately querying them may not yield the same priorities just set. To synchronize with the priorities taking effect, wait for the file_prio_alert.

When combining file- and piece priorities, the resume file will record both. When loading the resume data, the file priorities will be applied first, then the piece priorities.

[report issue]

force_lsd_announce() force_dht_announce() force_reannounce()

void force_lsd_announce () const;
void force_dht_announce () const;
void force_reannounce (int seconds = 0, int idx = -1, reannounce_flags_t = {}) const;

force_reannounce() will force this torrent to do another tracker request, to receive new peers. The seconds argument specifies how many seconds from now to issue the tracker announces.

If the tracker's min_interval has not passed since the last announce, the forced announce will be scheduled to happen immediately as the min_interval expires. This is to honor trackers minimum re-announce interval settings.

The tracker_index argument specifies which tracker to re-announce. If set to -1 (which is the default), all trackers are re-announce.

The flags argument can be used to affect the re-announce. See ignore_min_interval.

force_dht_announce will announce the torrent to the DHT immediately.

force_lsd_announce will announce the torrent on LSD immediately.

[report issue]

scrape_tracker()

void scrape_tracker (int idx = -1) const;

scrape_tracker() will send a scrape request to a tracker. By default (idx = -1) it will scrape the last working tracker. If idx is >= 0, the tracker with the specified index will scraped.

A scrape request queries the tracker for statistics such as total number of incomplete peers, complete peers, number of downloads etc.

This request will specifically update the num_complete and num_incomplete fields in the torrent_status struct once it completes. When it completes, it will generate a scrape_reply_alert. If it fails, it will generate a scrape_failed_alert.

[report issue]

set_upload_limit() download_limit() upload_limit() set_download_limit()

int download_limit () const;
int upload_limit () const;
void set_download_limit (int limit) const;
void set_upload_limit (int limit) const;

set_upload_limit will limit the upload bandwidth used by this particular torrent to the limit you set. It is given as the number of bytes per second the torrent is allowed to upload. 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 (settings_pack::upload_rate_limit) will not override the global rate limit. The torrent can never upload more than the global rate limit.

upload_limit and download_limit will return the current limit setting, for upload and download, respectively.

Local peers are not rate limited by default. see peer classes.

[report issue]

connect_peer()

void connect_peer (tcp::endpoint const& adr, peer_source_flags_t source = {}
      , pex_flags_t flags = pex_encryption | pex_utp | pex_holepunch) const;

connect_peer() is a way to manually connect to peers that one believe is a part of the torrent. If the peer does not respond, or is not a member of this torrent, it will simply be disconnected. No harm can be done by using this other than an unnecessary connection attempt is made. If the torrent is uninitialized or in queued or checking mode, this will throw system_error. The second (optional) argument will be bitwise ORed into the source mask of this peer. Typically this is one of the source flags in peer_info. i.e. tracker, pex, dht etc.

For possible values of flags, see pex_flags_t.

[report issue]

clear_peers()

void clear_peers ();

This will disconnect all peers and clear the peer list for this torrent. New peers will have to be acquired before resuming, from trackers, DHT or local service discovery, for example.

[report issue]

max_uploads() set_max_uploads()

void set_max_uploads (int max_uploads) const;
int max_uploads () const;

set_max_uploads() sets the maximum number of peers that's unchoked 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 settings_pack.

max_uploads() returns the current settings.

[report issue]

max_connections() set_max_connections()

void set_max_connections (int max_connections) const;
int max_connections () const;

set_max_connections() sets the maximum number of connection this torrent will open. If all connections are used up, incoming connections may be refused or poor connections may be closed. This 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 settings_pack.

max_connections() returns the current settings.

[report issue]

move_storage()

void move_storage (std::string const& save_path
      , move_flags_t flags = move_flags_t::always_replace_files
      ) const;

Moves the file(s) that this torrent are currently seeding from or downloading to. If the given save_path is not located on the same drive as the original save path, the files will be copied to the new drive and removed from their original location. This will block all other disk IO, and other torrents download and upload rates may drop while copying the file.

Since disk IO is performed in a separate thread, this operation is also asynchronous. Once the operation completes, the storage_moved_alert is generated, with the new path as the message. If the move fails for some reason, storage_moved_failed_alert is generated instead, containing the error message.

The flags argument determines the behavior of the copying/moving of the files in the torrent. see move_flags_t.

always_replace_files is the default and replaces any file that exist in both the source directory and the target directory.

fail_if_exist first check to see that none of the copy operations would cause an overwrite. If it would, it will fail. Otherwise it will proceed as if it was in always_replace_files mode. Note that there is an inherent race condition here. If the files in the target directory appear after the check but before the copy or move completes, they will be overwritten. When failing because of files already existing in the target path, the error of move_storage_failed_alert is set to boost::system::errc::file_exists.

The intention is that a client may use this as a probe, and if it fails, ask the user which mode to use. The client may then re-issue the move_storage call with one of the other modes.

dont_replace always keeps the existing file in the target directory, if there is one. The source files will still be removed in that case. Note that it won't automatically re-check files. If an incomplete torrent is moved into a directory with the complete files, pause, move, force-recheck and resume. Without the re-checking, the torrent will keep downloading and files in the new download directory will be overwritten.

Files that have been renamed to have absolute paths are not moved by this function. Keep in mind that files that don't belong to the torrent but are stored in the torrent's directory may be moved as well. This goes for files that have been renamed to absolute paths that still end up inside the save path.

[report issue]

rename_file()

void rename_file (file_index_t index, std::string const& new_name) const;

Renames the file with the given index asynchronously. The rename operation is complete when either a file_renamed_alert or file_rename_failed_alert is posted.

[report issue]

info_hashes() info_hash()

sha1_hash info_hash () const;
info_hash_t info_hashes () const;

returns the info-hash(es) of the torrent. If this handle is to a torrent that hasn't loaded yet (for instance by being added) by a URL, the returned value is undefined. The info_hash() returns the SHA-1 info-hash for v1 torrents and a truncated hash for v2 torrents. For the full v2 info-hash, use info_hashes() instead.

[report issue]

operator<() operator==() operator!=()

bool operator< (const torrent_handle& h) const;
bool operator!= (const torrent_handle& h) const;
bool operator== (const torrent_handle& h) const;

comparison operators. The order of the torrents is unspecified but stable.

[report issue]

id()

std::uint32_t id () const;

returns a unique identifier for this torrent. It's not a dense index. It's not preserved across sessions.

[report issue]

native_handle()

std::shared_ptr<torrent> native_handle () const;

This function is intended only for use by plugins and the alert dispatch function. This type does not have a stable ABI and should be relied on as little as possible. Accessing the handle returned by this function is not thread safe outside of libtorrent's internal thread (which is used to invoke plugin callbacks). The torrent class is not only eligible for changing ABI across minor versions of libtorrent, its layout is also dependent on build configuration. This adds additional requirements on a client to be built with the exact same build configuration as libtorrent itself. i.e. the TORRENT_ macros must match between libtorrent and the client builds.

[report issue]

userdata()

client_data_t userdata () const;

returns the userdata pointer as set in add_torrent_params

[report issue]

in_session()

bool in_session () const;

Returns true if the torrent is in the session. It returns true before session::remove_torrent() is called, and false afterward.

Note that this is a blocking function, unlike torrent_handle::is_valid() which returns immediately.

[report issue]
overwrite_existing
instruct libtorrent to overwrite any data that may already have been downloaded with the data of the new piece being added. Using this flag when adding a piece that is actively being downloaded from other peers may have some unexpected consequences, as blocks currently being downloaded from peers may not be replaced.
[report issue]
query_distributed_copies
calculates distributed_copies, distributed_full_copies and distributed_fraction.
[report issue]
query_accurate_download_counters
includes partial downloaded blocks in total_done and total_wanted_done.
[report issue]
query_last_seen_complete
includes last_seen_complete.
[report issue]
query_pieces
populate the pieces field in torrent_status.
[report issue]
query_verified_pieces
includes verified_pieces (only applies to torrents in seed mode).
[report issue]
query_torrent_file
includes torrent_file, which is all the static information from the .torrent file.
[report issue]
query_name
includes name, the name of the torrent. This is either derived from the .torrent file, or from the &dn= magnet link argument or possibly some other source. If the name of the torrent is not known, this is an empty string.
[report issue]
query_save_path
includes save_path, the path to the directory the files of the torrent are saved to.
[report issue]
alert_when_available
used to ask libtorrent to send an alert once the piece has been downloaded, by passing alert_when_available. When set, the read_piece_alert alert will be delivered, with the piece data, when it's downloaded.
[report issue]
piece_granularity
only calculate file progress at piece granularity. This makes the file_progress() call cheaper and also only takes bytes that have passed the hash check into account, so progress cannot regress in this mode.
[report issue]
graceful_pause clear_disk_cache
will delay the disconnect of peers that we're still downloading outstanding requests from. The torrent will not accept any more requests and will disconnect all idle peers. As soon as a peer is done transferring the blocks that were requested from it, it is disconnected. This is a graceful shut down of the torrent in the sense that no downloaded bytes are wasted.
[report issue]
flush_disk_cache
the disk cache will be flushed before creating the resume data. This avoids a problem with file timestamps in the resume data in case the cache hasn't been flushed yet.
[report issue]
save_info_dict
the resume data will contain the metadata from the torrent file as well. This is default for any torrent that's added without a torrent file (such as a magnet link or a URL).
[report issue]
only_if_modified
if nothing significant has changed in the torrent since the last time resume data was saved, fail this attempt. Significant changes primarily include more data having been downloaded, file or piece priorities having changed etc. If the resume data doesn't need saving, a save_resume_data_failed_alert is posted with the error resume_data_not_modified.
[report issue]
ignore_min_interval
by default, force-reannounce will still honor the min-interval published by the tracker. If this flag is set, it will be ignored and the tracker is announced immediately.
[report issue]

hash_value()

Declared in "libtorrent/torrent_handle.hpp"

std::size_t hash_value (torrent_handle const& h);

for std::hash (and to support using this type in unordered_map etc.)

[report issue]

web_seed_entry

Declared in "libtorrent/torrent_info.hpp"

the web_seed_entry holds information about a web seed (also known as URL seed or HTTP seed). It is essentially a URL with some state associated with it. For more information, see BEP 17 and BEP 19.

struct web_seed_entry
{
   bool operator== (web_seed_entry const& e) const;
   bool operator< (web_seed_entry const& e) const;

   enum type_t
   {
      url_seed,
      http_seed,
   };

   std::string url;
   std::string auth;
   headers_t extra_headers;
   std::uint8_t type;
};
[report issue]

operator==()

bool operator== (web_seed_entry const& e) const;

URL and type comparison

[report issue]

operator<()

bool operator< (web_seed_entry const& e) const;

URL and type less-than comparison

[report issue]

enum type_t

Declared in "libtorrent/torrent_info.hpp"

name value description
url_seed 0  
http_seed 1  
[report issue]
url
The URL of the web seed
[report issue]
auth
Optional authentication. If this is set, it's passed in as HTTP basic auth to the web seed. The format is: username:password.
[report issue]
extra_headers
Any extra HTTP headers that need to be passed to the web seed
[report issue]
type
The type of web seed (see type_t)
[report issue]

load_torrent_limits

Declared in "libtorrent/torrent_info.hpp"

this object holds configuration options for limits to use when loading torrents. They are meant to prevent loading potentially malicious torrents that cause excessive memory allocations.

struct load_torrent_limits
{
   int max_buffer_size  = 10000000;
   int max_pieces  = 0x200000;
   int max_decode_depth  = 100;
   int max_decode_tokens  = 3000000;
};
[report issue]
max_buffer_size
the max size of a .torrent file to load into RAM
[report issue]
max_pieces
the max number of pieces allowed in the torrent
[report issue]
max_decode_depth
the max recursion depth in the bdecoded structure
[report issue]
max_decode_tokens
the max number of bdecode tokens
[report issue]

torrent_info

Declared in "libtorrent/torrent_info.hpp"

the torrent_info class holds the information found in a .torrent file.

class torrent_info
{
   explicit torrent_info (info_hash_t const& info_hash);
   explicit torrent_info (bdecode_node const& torrent_file);
   torrent_info (bdecode_node const& torrent_file, error_code& ec);
   torrent_info (char const* buffer, int size, error_code& ec);
   torrent_info (std::string const& filename, error_code& ec);
   torrent_info (std::string const& filename, load_torrent_limits const& cfg);
   explicit torrent_info (std::string const& filename);
   explicit torrent_info (span<char const> buffer, from_span_t);
   torrent_info (span<char const> buffer, error_code& ec, from_span_t);
   torrent_info (span<char const> buffer, load_torrent_limits const& cfg, from_span_t);
   torrent_info (char const* buffer, int size);
   torrent_info (bdecode_node const& torrent_file, load_torrent_limits const& cfg);
   torrent_info (torrent_info const& t);
   ~torrent_info ();
   file_storage const& orig_files () const;
   file_storage const& files () const;
   void rename_file (file_index_t index, std::string const& new_filename);
   void remap_files (file_storage const& f);
   void clear_trackers ();
   void add_tracker (std::string const& url, int tier = 0);
   std::vector<announce_entry> const& trackers () const;
   void add_tracker (std::string const& url, int tier
      , announce_entry::tracker_source source);
   std::vector<sha1_hash> similar_torrents () const;
   std::vector<std::string> collections () const;
   void add_http_seed (std::string const& url
      , std::string const& extern_auth = std::string()
      , web_seed_entry::headers_t const& extra_headers = web_seed_entry::headers_t());
   void set_web_seeds (std::vector<web_seed_entry> seeds);
   std::vector<web_seed_entry> const& web_seeds () const;
   void add_url_seed (std::string const& url
      , std::string const& ext_auth = std::string()
      , web_seed_entry::headers_t const& ext_headers = web_seed_entry::headers_t());
   std::int64_t total_size () const;
   int num_pieces () const;
   int piece_length () const;
   piece_index_t last_piece () const;
   index_range<piece_index_t> piece_range () const;
   piece_index_t end_piece () const;
   info_hash_t const& info_hashes () const;
   sha1_hash info_hash () const noexcept;
   bool v2 () const;
   bool v1 () const;
   int num_files () const;
   std::vector<file_slice> map_block (piece_index_t const piece
      , std::int64_t offset, int size) const;
   peer_request map_file (file_index_t const file, std::int64_t offset, int size) const;
   string_view ssl_cert () const;
   bool is_valid () const;
   bool priv () const;
   bool is_i2p () const;
   int piece_size (piece_index_t index) const;
   char const* hash_for_piece_ptr (piece_index_t const index) const;
   sha1_hash hash_for_piece (piece_index_t index) const;
   bool is_loaded () const;
   const std::string& name () const;
   std::time_t creation_date () const;
   const std::string& creator () const;
   const std::string& comment () const;
   std::vector<std::pair<std::string, int>> const& nodes () const;
   void add_node (std::pair<std::string, int> const& node);
   bool parse_info_section (bdecode_node const& info, error_code& ec, int max_pieces);
   bdecode_node info (char const* key) const;
   span<char const> info_section () const;
   span<char const> piece_layer (file_index_t) const;
   void free_piece_layers ();
};
[report issue]

torrent_info()

explicit torrent_info (info_hash_t const& info_hash);
explicit torrent_info (bdecode_node const& torrent_file);
torrent_info (bdecode_node const& torrent_file, error_code& ec);
torrent_info (char const* buffer, int size, error_code& ec);
torrent_info (std::string const& filename, error_code& ec);
torrent_info (std::string const& filename, load_torrent_limits const& cfg);
explicit torrent_info (std::string const& filename);
explicit torrent_info (span<char const> buffer, from_span_t);
torrent_info (span<char const> buffer, error_code& ec, from_span_t);
torrent_info (span<char const> buffer, load_torrent_limits const& cfg, from_span_t);
torrent_info (char const* buffer, int size);
torrent_info (bdecode_node const& torrent_file, load_torrent_limits const& cfg);
torrent_info (torrent_info const& t);

The constructor that takes an info-hash will initialize the info-hash to the given value, but leave all other fields empty. This is used internally when downloading torrents without the metadata. The metadata will be created by libtorrent as soon as it has been downloaded from the swarm.

The constructor that takes a bdecode_node will create a torrent_info object from the information found in the given torrent_file. The bdecode_node represents a tree node in an bencoded file. To load an ordinary .torrent file into a bdecode_node, use bdecode().

The version that takes a buffer pointer and a size will decode it as a .torrent file and initialize the torrent_info object for you.

The version that takes a filename will simply load the torrent file and decode it inside the constructor, for convenience. This might not be the most suitable for applications that want to be able to report detailed errors on what might go wrong.

There is an upper limit on the size of the torrent file that will be loaded by the overload taking a filename. If it's important that even very large torrent files are loaded, use one of the other overloads.

The overloads that takes an error_code const& never throws if an error occur, they will simply set the error code to describe what went wrong and not fully initialize the torrent_info object. The overloads that do not take the extra error_code parameter will always throw if an error occurs. These overloads are not available when building without exception support.

The overload that takes a span also needs an extra parameter of type from_span_t to disambiguate the std::string overload for string literals. There is an object in the libtorrent namespace of this type called from_span.

[report issue]

~torrent_info()

~torrent_info ();

frees all storage associated with this torrent_info object

[report issue]

orig_files() files()

file_storage const& orig_files () const;
file_storage const& files () const;

The file_storage object contains the information on how to map the pieces to files. It is separated from the torrent_info object because when creating torrents a storage object needs to be created without having a torrent file. When renaming files in a storage, the storage needs to make its own copy of the file_storage in order to make its mapping differ from the one in the torrent file.

orig_files() returns the original (unmodified) file storage for this torrent. This is used by the web server connection, which needs to request files with the original names. Filename may be changed using torrent_info::rename_file().

For more information on the file_storage object, see the separate document on how to create torrents.

[report issue]

rename_file()

void rename_file (file_index_t index, std::string const& new_filename);

Renames the file with the specified index to the new name. The new filename is reflected by the file_storage returned by files() but not by the one returned by orig_files().

If you want to rename the base name of the torrent (for a multi file torrent), you can copy the file_storage (see files() and orig_files() ), change the name, and then use remap_files().

The new_filename can both be a relative path, in which case the file name is relative to the save_path of the torrent. If the new_filename is an absolute path (i.e. is_complete(new_filename) == true), then the file is detached from the save_path of the torrent. In this case the file is not moved when move_storage() is invoked.

[report issue]

remap_files()

void remap_files (file_storage const& f);

Warning

Using remap_files() is discouraged as it's incompatible with v2 torrents. This is because the piece boundaries and piece hashes in v2 torrents are intimately tied to the file boundaries. Instead, just rename individual files, or implement a custom disk_interface to customize how to store files.

Remaps the file storage to a new file layout. This can be used to, for instance, download all data in a torrent to a single file, or to a number of fixed size sector aligned files, regardless of the number and sizes of the files in the torrent.

The new specified file_storage must have the exact same size as the current one.

[report issue]

clear_trackers() trackers() add_tracker()

void clear_trackers ();
void add_tracker (std::string const& url, int tier = 0);
std::vector<announce_entry> const& trackers () const;
void add_tracker (std::string const& url, int tier
      , announce_entry::tracker_source source);

add_tracker() adds a tracker to the announce-list. The tier determines the order in which the trackers are to be tried. The trackers() function will return a sorted vector of announce_entry. Each announce entry contains a string, which is the tracker url, and a tier index. The tier index is the high-level priority. No matter which trackers that works or not, the ones with lower tier will always be tried before the one with higher tier number. For more information, see announce_entry.

trackers() returns all entries from announce-list.

clear_trackers() removes all trackers from announce-list.

[report issue]

collections() similar_torrents()

std::vector<sha1_hash> similar_torrents () const;
std::vector<std::string> collections () const;

These two functions are related to BEP 38 (mutable torrents). The vectors returned from these correspond to the "similar" and "collections" keys in the .torrent file. Both info-hashes and collections from within the info-dict and from outside of it are included.

[report issue]

web_seeds() add_http_seed() add_url_seed() set_web_seeds()

void add_http_seed (std::string const& url
      , std::string const& extern_auth = std::string()
      , web_seed_entry::headers_t const& extra_headers = web_seed_entry::headers_t());
void set_web_seeds (std::vector<web_seed_entry> seeds);
std::vector<web_seed_entry> const& web_seeds () const;
void add_url_seed (std::string const& url
      , std::string const& ext_auth = std::string()
      , web_seed_entry::headers_t const& ext_headers = web_seed_entry::headers_t());

web_seeds() returns all url seeds and http seeds in the torrent. Each entry is a web_seed_entry and may refer to either a url seed or http seed.

add_url_seed() and add_http_seed() adds one url to the list of url/http seeds.

set_web_seeds() replaces all web seeds with the ones specified in the seeds vector.

The extern_auth argument can be used for other authorization schemes than basic HTTP authorization. If set, it will override any username and password found in the URL itself. The string will be sent as the HTTP authorization header's value (without specifying "Basic").

The extra_headers argument defaults to an empty list, but can be used to insert custom HTTP headers in the requests to a specific web seed.

See http seeding for more information.

[report issue]

total_size()

std::int64_t total_size () const;

total_size() returns the total number of bytes the torrent-file represents. Note that this is the number of pieces times the piece size (modulo the last piece possibly being smaller). With pad files, the total size will be larger than the sum of all (regular) file sizes.

[report issue]

num_pieces() piece_length()

int num_pieces () const;
int piece_length () const;

piece_length() and num_pieces() returns the number of byte for each piece and the total number of pieces, respectively. The difference between piece_size() and piece_length() is that piece_size() takes the piece index as argument and gives you the exact size of that piece. It will always be the same as piece_length() except in the case of the last piece, which may be smaller.

[report issue]

end_piece() piece_range() last_piece()

piece_index_t last_piece () const;
index_range<piece_index_t> piece_range () const;
piece_index_t end_piece () const;

last_piece() returns the index to the last piece in the torrent and end_piece() returns the index to the one-past-end piece in the torrent piece_range() returns an implementation-defined type that can be used as the container in a range-for loop. Where the values are the indices of all pieces in the file_storage.

[report issue]

info_hashes() info_hash()

info_hash_t const& info_hashes () const;
sha1_hash info_hash () const noexcept;

returns the info-hash of the torrent. For BitTorrent v2 support, use info_hashes() to get an object that may hold both a v1 and v2 info-hash

[report issue]

v2() v1()

bool v2 () const;
bool v1 () const;

returns whether this torrent has v1 and/or v2 metadata, respectively. Hybrid torrents have both. These are shortcuts for info_hashes().has_v1() and info_hashes().has_v2() calls.

[report issue]

num_files()

int num_files () const;

If you need index-access to files you can use the num_files() along with the file_path(), file_size()-family of functions to access files using indices.

[report issue]

map_block()

std::vector<file_slice> map_block (piece_index_t const piece
      , std::int64_t offset, int size) const;

This function will map a piece index, a byte offset within that piece and a size (in bytes) into the corresponding files with offsets where that data for that piece is supposed to be stored. See file_slice.

[report issue]

map_file()

peer_request map_file (file_index_t const file, std::int64_t offset, int size) const;

This function will map a range in a specific file into a range in the torrent. The file_offset parameter is the offset in the file, given in bytes, where 0 is the start of the file. See peer_request.

The input range is assumed to be valid within the torrent. file_offset + size is not allowed to be greater than the file size. file_index must refer to a valid file, i.e. it cannot be >= num_files().

[report issue]

ssl_cert()

string_view ssl_cert () const;

Returns the SSL root certificate for the torrent, if it is an SSL torrent. Otherwise returns an empty string. The certificate is the public certificate in x509 format.

[report issue]

is_valid()

bool is_valid () const;

returns true if this torrent_info object has a torrent loaded. This is primarily used to determine if a magnet link has had its metadata resolved yet or not.

[report issue]

priv()

bool priv () const;

returns true if this torrent is private. i.e., the client should not advertise itself on the trackerless network (the Kademlia DHT) for this torrent.

[report issue]

is_i2p()

bool is_i2p () const;

returns true if this is an i2p torrent. This is determined by whether or not it has a tracker whose URL domain name ends with ".i2p". i2p torrents disable the DHT and local peer discovery as well as talking to peers over anything other than the i2p network.

[report issue]

piece_size()

int piece_size (piece_index_t index) const;

returns the piece size of file with index. This will be the same as piece_length(), except for the last piece, which may be shorter.

[report issue]

hash_for_piece() hash_for_piece_ptr()

char const* hash_for_piece_ptr (piece_index_t const index) const;
sha1_hash hash_for_piece (piece_index_t index) const;

hash_for_piece() takes a piece-index and returns the 20-bytes sha1-hash for that piece and info_hash() returns the 20-bytes sha1-hash for the info-section of the torrent file. hash_for_piece_ptr() returns a pointer to the 20 byte sha1 digest for the piece. Note that the string is not 0-terminated.

[report issue]

name()

const std::string& name () const;

name() returns the name of the torrent. name contains UTF-8 encoded string.

[report issue]

creation_date()

std::time_t creation_date () const;

creation_date() returns the creation date of the torrent as time_t (posix time). If there's no time stamp in the torrent file, 0 is returned. .. posix time: http://www.opengroup.org/onlinepubs/009695399/functions/time.html

[report issue]

creator()

const std::string& creator () const;

creator() returns the creator string in the torrent. If there is no creator string it will return an empty string.

[report issue]

comment()

const std::string& comment () const;

comment() returns the comment associated with the torrent. If there's no comment, it will return an empty string. comment contains UTF-8 encoded string.

[report issue]

nodes()

std::vector<std::pair<std::string, int>> const& nodes () const;

If this torrent contains any DHT nodes, they are put in this vector in their original form (host name and port number).

[report issue]

add_node()

void add_node (std::pair<std::string, int> const& node);

This is used when creating torrent. Use this to add a known DHT node. It may be used, by the client, to bootstrap into the DHT network.

[report issue]

parse_info_section()

bool parse_info_section (bdecode_node const& info, error_code& ec, int max_pieces);

populates the torrent_info by providing just the info-dict buffer. This is used when loading a torrent from a magnet link for instance, where we only have the info-dict. The bdecode_node e points to a parsed info-dictionary. ec returns an error code if something fails (typically if the info dictionary is malformed). The max_pieces parameter allows limiting the amount of memory dedicated to loading the torrent, and fails for torrents that exceed the limit. To load large torrents, this limit may also need to be raised in settings_pack::max_piece_count and in calls to read_resume_data().

[report issue]

info()

bdecode_node info (char const* key) const;

This function looks up keys from the info-dictionary of the loaded torrent file. It can be used to access extension values put in the .torrent file. If the specified key cannot be found, it returns nullptr.

[report issue]

info_section()

span<char const> info_section () const;

returns a the raw info section of the torrent file. The underlying buffer is still owned by the torrent_info object

[report issue]

piece_layer()

span<char const> piece_layer (file_index_t) const;

return the bytes of the piece layer hashes for the specified file. If the file doesn't have a piece layer, an empty span is returned. The span size is divisible by 32, the size of a SHA-256 hash. If the size of the file is smaller than or equal to the piece size, the files "root hash" is the hash of the file and is not saved separately in the "piece layers" field, but this function still returns the root hash of the file in that case.

[report issue]

free_piece_layers()

void free_piece_layers ();

clears the piece layers from the torrent_info. This is done by the session when a torrent is added, to avoid storing it twice. The piece layer (or other hashes part of the merkle tree) are stored in the internal torrent object.

[report issue]

storage_params

Declared in "libtorrent/storage_defs.hpp"

a parameter pack used to construct the storage for a torrent, used in disk_interface

struct storage_params
{
   storage_params (file_storage const& f, file_storage const* mf
      , std::string const& sp, storage_mode_t const sm
      , aux::vector<download_priority_t, file_index_t> const& prio
      , sha1_hash const& ih);

   file_storage const& files;
   file_storage const* mapped_files  = nullptr;
   std::string const& path;
   storage_mode_t mode {storage_mode_sparse};
   aux::vector<download_priority_t, file_index_t> const& priorities;
   sha1_hash info_hash;
};
[report issue]

file_slice

Declared in "libtorrent/file_storage.hpp"

represents a window of a file in a torrent.

The file_index refers to the index of the file (in the torrent_info). To get the path and filename, use file_path() and give the file_index as argument. The offset is the byte offset in the file where the range starts, and size is the number of bytes this range is. The size + offset will never be greater than the file size.

struct file_slice
{
   file_index_t file_index;
   std::int64_t offset;
   std::int64_t size;
};
[report issue]
file_index
the index of the file
[report issue]
offset
the offset from the start of the file, in bytes
[report issue]
size
the size of the window, in bytes
[report issue]

file_storage

Declared in "libtorrent/file_storage.hpp"

The file_storage class represents a file list and the piece size. Everything necessary to interpret a regular bittorrent storage file structure.

class file_storage
{
   bool is_valid () const;
   void reserve (int num_files);
   void add_file (std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}
      , std::time_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
   void add_file_borrow (error_code& ec, string_view filename
      , std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}, char const* filehash = nullptr
      , std::int64_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
   void add_file_borrow (string_view filename
      , std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}, char const* filehash = nullptr
      , std::int64_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
   void add_file (error_code& ec, std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}
      , std::time_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
   void rename_file (file_index_t index, std::string const& new_filename);
   std::vector<file_slice> map_block (piece_index_t piece, std::int64_t offset
      , std::int64_t size) const;
   peer_request map_file (file_index_t file, std::int64_t offset, int size) const;
   int num_files () const noexcept;
   file_index_t end_file () const noexcept;
   index_range<file_index_t> file_range () const noexcept;
   std::int64_t total_size () const;
   void set_num_pieces (int n);
   int num_pieces () const;
   piece_index_t end_piece () const;
   piece_index_t last_piece () const;
   index_range<piece_index_t> piece_range () const noexcept;
   void set_piece_length (int l);
   int piece_length () const;
   int piece_size (piece_index_t index) const;
   int piece_size2 (piece_index_t index) const;
   int blocks_in_piece2 (piece_index_t index) const;
   std::string const& name () const;
   void set_name (std::string const& n);
   void swap (file_storage& ti) noexcept;
   void canonicalize ();
   std::int64_t file_offset (file_index_t index) const;
   std::string file_path (file_index_t index, std::string const& save_path = "") const;
   char const* root_ptr (file_index_t const index) const;
   string_view file_name (file_index_t index) const;
   std::string symlink (file_index_t index) const;
   sha256_hash root (file_index_t index) const;
   bool pad_file_at (file_index_t index) const;
   sha1_hash hash (file_index_t index) const;
   std::time_t mtime (file_index_t index) const;
   std::int64_t file_size (file_index_t index) const;
   int file_num_blocks (file_index_t index) const;
   int file_num_pieces (file_index_t index) const;
   index_range<piece_index_t::diff_type> file_piece_range (file_index_t) const;
   int file_first_piece_node (file_index_t index) const;
   int file_first_block_node (file_index_t index) const;
   std::uint32_t file_path_hash (file_index_t index, std::string const& save_path) const;
   void all_path_hashes (std::unordered_set<std::uint32_t>& table) const;
   file_flags_t file_flags (file_index_t index) const;
   bool file_absolute_path (file_index_t index) const;
   file_index_t file_index_at_piece (piece_index_t piece) const;
   file_index_t file_index_at_offset (std::int64_t offset) const;
   file_index_t file_index_for_root (sha256_hash const& root_hash) const;
   piece_index_t piece_index_at_file (file_index_t f) const;
   void sanitize_symlinks ();
   bool v2 () const;

   static constexpr file_flags_t flag_pad_file  = 0_bit;
   static constexpr file_flags_t flag_hidden  = 1_bit;
   static constexpr file_flags_t flag_executable  = 2_bit;
   static constexpr file_flags_t flag_symlink  = 3_bit;
};
[report issue]

is_valid()

bool is_valid () const;

returns true if the piece length has been initialized on the file_storage. This is typically taken as a proxy of whether the file_storage as a whole is initialized or not.

[report issue]

reserve()

void reserve (int num_files);

allocates space for num_files in the internal file list. This can be used to avoid reallocating the internal file list when the number of files to be added is known up-front.

[report issue]

add_file() add_file_borrow()

void add_file (std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}
      , std::time_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
void add_file_borrow (error_code& ec, string_view filename
      , std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}, char const* filehash = nullptr
      , std::int64_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
void add_file_borrow (string_view filename
      , std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}, char const* filehash = nullptr
      , std::int64_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);
void add_file (error_code& ec, std::string const& path, std::int64_t file_size
      , file_flags_t file_flags = {}
      , std::time_t mtime = 0, string_view symlink_path = string_view()
      , char const* root_hash = nullptr);

Adds a file to the file storage. The add_file_borrow version expects that filename is the file name (without a path) of the file that's being added. This memory is borrowed, i.e. it is the caller's responsibility to make sure it stays valid throughout the lifetime of this file_storage object or any copy of it. The same thing applies to filehash, which is an optional pointer to a 20 byte binary SHA-1 hash of the file.

if filename is empty, the filename from path is used and not borrowed.

The path argument is the full path (in the torrent file) to the file to add. Note that this is not supposed to be an absolute path, but it is expected to include the name of the torrent as the first path element.

file_size is the size of the file in bytes.

The file_flags argument sets attributes on the file. The file attributes is an extension and may not work in all bittorrent clients.

For possible file attributes, see file_storage::flags_t.

The mtime argument is optional and can be set to 0. If non-zero, it is the posix time of the last modification time of this file.

symlink_path is the path the file is a symlink to. To make this a symlink you also need to set the file_storage::flag_symlink file flag.

root_hash is an optional pointer to a 32 byte SHA-256 hash, being the merkle tree root hash for this file. This is only used for v2 torrents. If the root hash is specified for one file, it has to be specified for all, otherwise this function will fail. Note that the buffer root_hash points to must out-live the file_storage object, it will not be copied. This parameter is only used when loading torrents, that already have their file hashes computed. When creating torrents, the file hashes will be computed by the piece hashes.

If more files than one are added, certain restrictions to their paths apply. In a multi-file file storage (torrent), all files must share the same root directory.

That is, the first path element of all files must be the same. This shared path element is also set to the name of the torrent. It can be changed by calling set_name.

The overloads that take an error_code reference will report failures via that variable, otherwise system_error is thrown.

[report issue]

rename_file()

void rename_file (file_index_t index, std::string const& new_filename);

renames the file at index to new_filename. Keep in mind that filenames are expected to be UTF-8 encoded.

[report issue]

map_block()

std::vector<file_slice> map_block (piece_index_t piece, std::int64_t offset
      , std::int64_t size) const;

returns a list of file_slice objects representing the portions of files the specified piece index, byte offset and size range overlaps. this is the inverse mapping of map_file().

Preconditions of this function is that the input range is within the torrents address space. piece may not be negative and

piece * piece_size + offset + size

may not exceed the total size of the torrent.

[report issue]

map_file()

peer_request map_file (file_index_t file, std::int64_t offset, int size) const;

returns a peer_request representing the piece index, byte offset and size the specified file range overlaps. This is the inverse mapping over map_block(). Note that the peer_request return type is meant to hold bittorrent block requests, which may not be larger than 16 kiB. Mapping a range larger than that may return an overflown integer.

[report issue]

num_files()

int num_files () const noexcept;

returns the number of files in the file_storage

[report issue]

end_file()

file_index_t end_file () const noexcept;

returns the index of the one-past-end file in the file storage

[report issue]

file_range()

index_range<file_index_t> file_range () const noexcept;

returns an implementation-defined type that can be used as the container in a range-for loop. Where the values are the indices of all files in the file_storage.

[report issue]

total_size()

std::int64_t total_size () const;

returns the total number of bytes all the files in this torrent spans

[report issue]

num_pieces() set_num_pieces()

void set_num_pieces (int n);
int num_pieces () const;

set and get the number of pieces in the torrent

[report issue]

end_piece()

piece_index_t end_piece () const;

returns the index of the one-past-end piece in the file storage

[report issue]

last_piece()

piece_index_t last_piece () const;

returns the index of the last piece in the torrent. The last piece is special in that it may be smaller than the other pieces (and the other pieces are all the same size).

[report issue]

piece_range()

index_range<piece_index_t> piece_range () const noexcept;

returns an implementation-defined type that can be used as the container in a range-for loop. Where the values are the indices of all pieces in the file_storage.

[report issue]

piece_length() set_piece_length()

void set_piece_length (int l);
int piece_length () const;

set and get the size of each piece in this torrent. It must be a power of two and at least 16 kiB.

[report issue]

piece_size()

int piece_size (piece_index_t index) const;

returns the piece size of index. This will be the same as piece_length(), except for the last piece, which may be shorter.

[report issue]

piece_size2()

int piece_size2 (piece_index_t index) const;

Returns the size of the given piece. If the piece spans multiple files, only the first file is considered part of the piece. This is used for v2 torrents, where all files are piece aligned and padded. i.e. The pad files are not considered part of the piece for this purpose.

[report issue]

blocks_in_piece2()

int blocks_in_piece2 (piece_index_t index) const;

returns the number of blocks in the specified piece, for v2 torrents.

[report issue]

set_name() name()

std::string const& name () const;
void set_name (std::string const& n);

set and get the name of this torrent. For multi-file torrents, this is also the name of the root directory all the files are stored in.

[report issue]

swap()

void swap (file_storage& ti) noexcept;

swap all content of this with ti.

[report issue]

canonicalize()

void canonicalize ();

arrange files and padding to match the canonical form required by BEP 52

[report issue]

file_piece_range() file_num_pieces() file_num_blocks()

int file_num_blocks (file_index_t index) const;
int file_num_pieces (file_index_t index) const;
index_range<piece_index_t::diff_type> file_piece_range (file_index_t) const;

Returns the number of pieces or blocks the file at index spans, under the assumption that the file is aligned to the start of a piece. This is only meaningful for v2 torrents, where files are guaranteed such alignment. These numbers are used to size and navigate the merkle hash tree for each file.

[report issue]

file_first_block_node() file_first_piece_node()

int file_first_piece_node (file_index_t index) const;
int file_first_block_node (file_index_t index) const;

index of first piece node in the merkle tree

[report issue]

file_path_hash()

std::uint32_t file_path_hash (file_index_t index, std::string const& save_path) const;

returns the crc32 hash of file_path(index)

[report issue]

all_path_hashes()

void all_path_hashes (std::unordered_set<std::uint32_t>& table) const;

this will add the CRC32 hash of all directory entries to the table. No filename will be included, just directories. Every depth of directories are added separately to allow test for collisions with files at all levels. i.e. if one path in the torrent is foo/bar/baz, the CRC32 hashes for foo, foo/bar and foo/bar/baz will be added to the set.

[report issue]

file_flags()

file_flags_t file_flags (file_index_t index) const;

returns a bitmask of flags from file_flags_t that apply to file at index.

[report issue]

file_absolute_path()

bool file_absolute_path (file_index_t index) const;

returns true if the file at the specified index has been renamed to have an absolute path, i.e. is not anchored in the save path of the torrent.

[report issue]

file_index_at_offset() file_index_at_piece()

file_index_t file_index_at_piece (piece_index_t piece) const;
file_index_t file_index_at_offset (std::int64_t offset) const;

returns the index of the file at the given offset in the torrent

[report issue]

file_index_for_root()

file_index_t file_index_for_root (sha256_hash const& root_hash) const;

finds the file with the given root hash and returns its index if there is no file with the root hash, file_index_t{-1} is returned

[report issue]

piece_index_at_file()

piece_index_t piece_index_at_file (file_index_t f) const;

returns the piece index the given file starts at

[report issue]

v2()

bool v2 () const;

returns true if this torrent contains v2 metadata.

[report issue]
flag_pad_file
the file is a pad file. It's required to contain zeros at it will not be saved to disk. Its purpose is to make the following file start on a piece boundary.
[report issue]
flag_hidden
this file has the hidden attribute set. This is primarily a windows attribute
[report issue]
flag_executable
this file has the executable attribute set.
[report issue]
flag_symlink
this file is a symbolic link. It should have a link target string associated with it.
[report issue]

default_disk_io_constructor()

Declared in "libtorrent/session.hpp"

std::unique_ptr<disk_interface> default_disk_io_constructor (
   io_context& ios, settings_interface const&, counters& cnt);

the constructor function for the default storage. On systems that support memory mapped files (and a 64 bit address space) the memory mapped storage will be constructed, otherwise the portable posix storage.

[report issue]

posix_disk_io_constructor()

Declared in "libtorrent/posix_disk_io.hpp"

std::unique_ptr<disk_interface> posix_disk_io_constructor (
   io_context& ios, settings_interface const&, counters& cnt);

this is a simple posix disk I/O back-end, used for systems that don't have a 64 bit virtual address space or don't support memory mapped files. It's implemented using portable C file functions and is single-threaded.

[report issue]

disabled_disk_io_constructor()

Declared in "libtorrent/disabled_disk_io.hpp"

std::unique_ptr<disk_interface> disabled_disk_io_constructor (
   io_context& ios, settings_interface const&, counters& cnt);

creates a disk io object that discards all data written to it, and only returns zero-buffers when read from. May be useful for testing and benchmarking.

[report issue]

mmap_disk_io_constructor()

Declared in "libtorrent/mmap_disk_io.hpp"

std::unique_ptr<disk_interface> mmap_disk_io_constructor (
   io_context& ios, settings_interface const&, counters& cnt);

constructs a memory mapped file disk I/O object.

[report issue]

enum storage_mode_t

Declared in "libtorrent/storage_defs.hpp"

name value description
storage_mode_allocate 0 All pieces will be written to their final position, all files will be allocated in full when the torrent is first started. This mode minimizes fragmentation but could be a costly operation.
storage_mode_sparse 1 All pieces will be written to the place where they belong and sparse files will be used. This is the recommended, and default mode.
[report issue]

enum status_t

Declared in "libtorrent/storage_defs.hpp"

name value description
no_error 0  
fatal_disk_error 1  
need_full_check 2  
file_exist 3  
[report issue]

enum move_flags_t

Declared in "libtorrent/storage_defs.hpp"

name value description
always_replace_files 0 replace any files in the destination when copying or moving the storage
fail_if_exist 1 if any files that we want to copy exist in the destination exist, fail the whole operation and don't perform any copy or move. There is an inherent race condition in this mode. The files are checked for existence before the operation starts. In between the check and performing the copy, the destination files may be created, in which case they are replaced.
dont_replace 2 if any file exist in the target, take those files instead of the ones we may have in the source.
[report issue]

ip_filter

Declared in "libtorrent/ip_filter.hpp"

The ip_filter class is a set of rules that uniquely categorizes all ip addresses as allowed or disallowed. The default constructor creates a single rule that allows all addresses (0.0.0.0 - 255.255.255.255 for the IPv4 range, and the equivalent range covering all addresses for the IPv6 range).

A default constructed ip_filter does not filter any address.

struct ip_filter
{
   ip_filter (ip_filter&&);
   ~ip_filter ();
   ip_filter ();
   ip_filter (ip_filter const&);
   ip_filter& operator= (ip_filter&&);
   ip_filter& operator= (ip_filter const&);
   bool empty () const;
   void add_rule (address const& first, address const& last, std::uint32_t flags);
   std::uint32_t access (address const& addr) const;
   filter_tuple_t export_filter () const;

   enum access_flags
   {
      blocked,
   };
};
[report issue]

empty()

bool empty () const;

returns true if the filter does not contain any rules

[report issue]

add_rule()

void add_rule (address const& first, address const& last, std::uint32_t flags);

Adds a rule to the filter. first and last defines a range of ip addresses that will be marked with the given flags. The flags can currently be 0, which means allowed, or ip_filter::blocked, which means disallowed.

precondition: first.is_v4() == last.is_v4() && first.is_v6() == last.is_v6()

postcondition: access(x) == flags for every x in the range [first, last]

This means that in a case of overlapping ranges, the last one applied takes precedence.

[report issue]

access()

std::uint32_t access (address const& addr) const;

Returns the access permissions for the given address (addr). The permission can currently be 0 or ip_filter::blocked. The complexity of this operation is O(log n), where n is the minimum number of non-overlapping ranges to describe the current filter.

[report issue]

export_filter()

filter_tuple_t export_filter () const;

This function will return the current state of the filter in the minimum number of ranges possible. They are sorted from ranges in low addresses to high addresses. Each entry in the returned vector is a range with the access control specified in its flags field.

The return value is a tuple containing two range-lists. One for IPv4 addresses and one for IPv6 addresses.

[report issue]

enum access_flags

Declared in "libtorrent/ip_filter.hpp"

name value description
blocked 1 indicates that IPs in this range should not be connected to nor accepted as incoming connections
[report issue]

port_filter

Declared in "libtorrent/ip_filter.hpp"

the port filter maps non-overlapping port ranges to flags. This is primarily used to indicate whether a range of ports should be connected to or not. The default is to have the full port range (0-65535) set to flag 0.

class port_filter
{
   port_filter& operator= (port_filter const&);
   port_filter& operator= (port_filter&&);
   port_filter (port_filter const&);
   ~port_filter ();
   port_filter ();
   port_filter (port_filter&&);
   void add_rule (std::uint16_t first, std::uint16_t last, std::uint32_t flags);
   std::uint32_t access (std::uint16_t port) const;

   enum access_flags
   {
      blocked,
   };
};
[report issue]

add_rule()

void add_rule (std::uint16_t first, std::uint16_t last, std::uint32_t flags);

set the flags for the specified port range (first, last) to flags overwriting any existing rule for those ports. The range is inclusive, i.e. the port last also has the flag set on it.

[report issue]

access()

std::uint32_t access (std::uint16_t port) const;

test the specified port (port) for whether it is blocked or not. The returned value is the flags set for this port. see access_flags.

[report issue]

enum access_flags

Declared in "libtorrent/ip_filter.hpp"

name value description
blocked 1 this flag indicates that destination ports in the range should not be connected to
[report issue]

dht_storage_counters

Declared in "libtorrent/kademlia/dht_storage.hpp"

This structure hold the relevant counters for the storage

struct dht_storage_counters
{
   void reset ();

   std::int32_t torrents  = 0;
   std::int32_t peers  = 0;
   std::int32_t immutable_data  = 0;
   std::int32_t mutable_data  = 0;
};
[report issue]

reset()

void reset ();

This member function set the counters to zero.

[report issue]

dht_storage_interface

Declared in "libtorrent/kademlia/dht_storage.hpp"

The DHT storage interface is a pure virtual class that can be implemented to customize how the data for the DHT is stored.

The default storage implementation uses three maps in RAM to save the peers, mutable and immutable items and it's designed to provide a fast and fully compliant behavior of the BEPs.

libtorrent comes with one built-in storage implementation: dht_default_storage (private non-accessible class). Its constructor function is called dht_default_storage_constructor(). You should know that if this storage becomes full of DHT items, the current implementation could degrade in performance.

struct dht_storage_interface
{
   virtual void update_node_ids (std::vector<node_id> const& ids) = 0;
   virtual bool get_peers (sha1_hash const& info_hash
      , bool noseed, bool scrape, address const& requester
      , entry& peers) const = 0;
   virtual void announce_peer (sha1_hash const& info_hash
      , tcp::endpoint const& endp
      , string_view name, bool seed) = 0;
   virtual bool get_immutable_item (sha1_hash const& target
      , entry& item) const = 0;
   virtual void put_immutable_item (sha1_hash const& target
      , span<char const> buf
      , address const& addr) = 0;
   virtual bool get_mutable_item_seq (sha1_hash const& target
      , sequence_number& seq) const = 0;
   virtual bool get_mutable_item (sha1_hash const& target
      , sequence_number seq, bool force_fill
      , entry& item) const = 0;
   virtual void put_mutable_item (sha1_hash const& target
      , span<char const> buf
      , signature const& sig
      , sequence_number seq
      , public_key const& pk
      , span<char const> salt
      , address const& addr) = 0;
   virtual int get_infohashes_sample (entry& item) = 0;
   virtual void tick () = 0;
   virtual dht_storage_counters counters () const = 0;
};
[report issue]

update_node_ids()

virtual void update_node_ids (std::vector<node_id> const& ids) = 0;

This member function notifies the list of all node's ids of each DHT running inside libtorrent. It's advisable that the concrete implementation keeps a copy of this list for an eventual prioritization when deleting an element to make room for a new one.

[report issue]

get_peers()

virtual bool get_peers (sha1_hash const& info_hash
      , bool noseed, bool scrape, address const& requester
      , entry& peers) const = 0;

This function retrieve the peers tracked by the DHT corresponding to the given info_hash. You can specify if you want only seeds and/or you are scraping the data.

For future implementers: If the torrent tracked contains a name, such a name must be stored as a string in peers["n"]

If the scrape parameter is true, you should fill these keys:

peers["BFpe"]
with the standard bit representation of a 256 bloom filter containing the downloaders
peers["BFsd"]
with the standard bit representation of a 256 bloom filter containing the seeders

If the scrape parameter is false, you should fill the key peers["values"] with a list containing a subset of peers tracked by the given info_hash. Such a list should consider the value of settings_pack::dht_max_peers_reply. If noseed is true only peers marked as no seed should be included.

returns true if the maximum number of peers are stored for this info_hash.

[report issue]

announce_peer()

virtual void announce_peer (sha1_hash const& info_hash
      , tcp::endpoint const& endp
      , string_view name, bool seed) = 0;

This function is named announce_peer for consistency with the upper layers, but has nothing to do with networking. Its only responsibility is store the peer in such a way that it's returned in the entry with the lookup_peers.

The name parameter is the name of the torrent if provided in the announce_peer DHT message. The length of this value should have a maximum length in the final storage. The default implementation truncate the value for a maximum of 50 characters.

[report issue]

get_immutable_item()

virtual bool get_immutable_item (sha1_hash const& target
      , entry& item) const = 0;

This function retrieves the immutable item given its target hash.

For future implementers: The value should be returned as an entry in the key item["v"].

returns true if the item is found and the data is returned inside the (entry) out parameter item.

[report issue]

put_immutable_item()

virtual void put_immutable_item (sha1_hash const& target
      , span<char const> buf
      , address const& addr) = 0;

Store the item's data. This layer is only for storage. The authentication of the item is performed by the upper layer.

For implementers: This data can be stored only if the target is not already present. The implementation should consider the value of settings_pack::dht_max_dht_items.

[report issue]

get_mutable_item_seq()

virtual bool get_mutable_item_seq (sha1_hash const& target
      , sequence_number& seq) const = 0;

This function retrieves the sequence number of a mutable item.

returns true if the item is found and the data is returned inside the out parameter seq.

[report issue]

get_mutable_item()

virtual bool get_mutable_item (sha1_hash const& target
      , sequence_number seq, bool force_fill
      , entry& item) const = 0;

This function retrieves the mutable stored in the DHT.

For implementers: The item sequence should be stored in the key item["seq"]. if force_fill is true or (0 <= seq and seq < item["seq"]) the following keys should be filled item["v"] - with the value no encoded. item["sig"] - with a string representation of the signature. item["k"] - with a string representation of the public key.

returns true if the item is found and the data is returned inside the (entry) out parameter item.

[report issue]

put_mutable_item()

virtual void put_mutable_item (sha1_hash const& target
      , span<char const> buf
      , signature const& sig
      , sequence_number seq
      , public_key const& pk
      , span<char const> salt
      , address const& addr) = 0;

Store the item's data. This layer is only for storage. The authentication of the item is performed by the upper layer.

For implementers: The sequence number should be checked if the item is already present. The implementation should consider the value of settings_pack::dht_max_dht_items.

[report issue]

get_infohashes_sample()

virtual int get_infohashes_sample (entry& item) = 0;

This function retrieves a sample info-hashes

For implementers: The info-hashes should be stored in ["samples"] (N x 20 bytes). the following keys should be filled item["interval"] - the subset refresh interval in seconds. item["num"] - number of info-hashes in storage.

Internally, this function is allowed to lazily evaluate, cache and modify the actual sample to put in item

returns the number of info-hashes in the sample.

[report issue]

tick()

virtual void tick () = 0;

This function is called periodically (non-constant frequency).

For implementers: Use this functions for expire peers or items or any other storage cleanup.

[report issue]

counters()

virtual dht_storage_counters counters () const = 0;

return stats counters for the store

[report issue]

dht_state

Declared in "libtorrent/kademlia/dht_state.hpp"

This structure helps to store and load the state of the dht_tracker. At this moment the library is only a dual stack implementation of the DHT. See BEP 32

struct dht_state
{
   void clear ();

   node_ids_t nids;
   std::vector<udp::endpoint> nodes;
   std::vector<udp::endpoint> nodes6;
};
[report issue]
nodes
the bootstrap nodes saved from the buckets node
[report issue]
nodes6
the bootstrap nodes saved from the IPv6 buckets node
[report issue]

dht_default_storage_constructor()

Declared in "libtorrent/kademlia/dht_storage.hpp"

std::unique_ptr<dht_storage_interface> dht_default_storage_constructor (
   settings_interface const& settings);

constructor for the default DHT storage. The DHT storage is responsible for maintaining peers and mutable and immutable items announced and stored/put to the DHT node.

[report issue]

sign_mutable_item()

Declared in "libtorrent/kademlia/item.hpp"

signature sign_mutable_item (
   span<char const> v
   , span<char const> salt
   , sequence_number seq
   , public_key const& pk
   , secret_key const& sk);

given a byte range v and an optional byte range salt, a sequence number, public key pk (must be 32 bytes) and a secret key sk (must be 64 bytes), this function produces a signature which is written into a 64 byte buffer pointed to by sig. The caller is responsible for allocating the destination buffer that's passed in as the sig argument. Typically it would be allocated on the stack.

[report issue]

announce_flags_t

Declared in "libtorrent/kademlia/announce_flags.hpp"

seed
announce to DHT as a seed
implied_port
announce to DHT with the implied-port flag set. This tells the network to use your source UDP port as your listen port, rather than the one specified in the message. This may improve the chances of traversing NATs when using uTP.
ssl_torrent
Specify the port number for the SSL listen socket in the DHT announce.
[report issue]

write_resume_data() write_resume_data_buf()

Declared in "libtorrent/write_resume_data.hpp"

std::vector<char> write_resume_data_buf (add_torrent_params const& atp);
entry write_resume_data (add_torrent_params const& atp);

this function turns the resume data in an add_torrent_params object into a bencoded structure

[report issue]

write_torrent_file()

Declared in "libtorrent/write_resume_data.hpp"

entry write_torrent_file (add_torrent_params const& atp);

writes only the fields to create a .torrent file. This function may fail with a std::system_error exception if:

  • The add_torrent_params object passed to this function does not contain the info dictionary (the ti field)
  • The piece layers are not complete for all files that need them
[report issue]

read_resume_data()

Declared in "libtorrent/read_resume_data.hpp"

add_torrent_params read_resume_data (bdecode_node const& rd
   , error_code& ec, int piece_limit = 0x200000);
add_torrent_params read_resume_data (span<char const> buffer
   , load_torrent_limits const& cfg = {});
add_torrent_params read_resume_data (bdecode_node const& rd
   , int piece_limit = 0x200000);
add_torrent_params read_resume_data (span<char const> buffer
   , error_code& ec, load_torrent_limits const& cfg = {});

these functions are used to parse resume data and populate the appropriate fields in an add_torrent_params object. This object can then be used to add the actual torrent_info object to and pass to session::add_torrent() or session::async_add_torrent().

If the client wants to override any field that was loaded from the resume data, e.g. save_path, those fields must be changed after loading resume data but before adding the torrent.

The piece_limit parameter determines the largest number of pieces allowed in the torrent that may be loaded as part of the resume data, if it contains an info field. The overloads that take a flat buffer are instead configured with limits on torrent sizes via load_torrent limits.

In order to support large torrents, it may also be necessary to raise the settings_pack::max_piece_count setting and pass a higher limit to calls to torrent_info::parse_info_section().

[report issue]

ed25519_create_seed()

Declared in "libtorrent/kademlia/ed25519.hpp"

std::array<char, 32> ed25519_create_seed ();

See documentation of internal random_bytes

[report issue]

ed25519_create_keypair()

Declared in "libtorrent/kademlia/ed25519.hpp"

std::tuple<public_key, secret_key> ed25519_create_keypair (
   std::array<char, 32> const& seed);

Creates a new key pair from the given seed.

It's important to clarify that the seed completely determines the key pair. Then it's enough to save the seed and the public key as the key-pair in a buffer of 64 bytes. The standard is (32 bytes seed, 32 bytes public key).

This function does work with a given seed, giving you a pair of (64 bytes private key, 32 bytes public key). It's a trade-off between space and CPU, saving in one format or another.

The smaller format is not weaker by any means, in fact, it is only the seed (32 bytes) that determines the point in the curve.

[report issue]

ed25519_sign()

Declared in "libtorrent/kademlia/ed25519.hpp"

signature ed25519_sign (span<char const> msg
   , public_key const& pk, secret_key const& sk);

Creates a signature of the given message with the given key pair.

[report issue]

ed25519_verify()

Declared in "libtorrent/kademlia/ed25519.hpp"

bool ed25519_verify (signature const& sig
   , span<char const> msg, public_key const& pk);

Verifies the signature on the given message using pk

[report issue]

ed25519_add_scalar()

Declared in "libtorrent/kademlia/ed25519.hpp"

secret_key ed25519_add_scalar (secret_key const& sk
   , std::array<char, 32> const& scalar);
public_key ed25519_add_scalar (public_key const& pk
   , std::array<char, 32> const& scalar);

Adds a scalar to the given key pair where scalar is a 32 byte buffer (possibly generated with ed25519_create_seed), generating a new key pair.

You can calculate the public key sum without knowing the private key and vice versa by passing in null for the key you don't know. This is useful when a third party (an authoritative server for example) needs to enforce randomness on a key pair while only knowing the public key of the other side.

Warning: the last bit of the scalar is ignored - if comparing scalars make sure to clear it with scalar[31] &= 127.

see http://crypto.stackexchange.com/a/6215/4697 see test_ed25519 for a practical example

[report issue]

ed25519_key_exchange()

Declared in "libtorrent/kademlia/ed25519.hpp"

std::array<char, 32> ed25519_key_exchange (
   public_key const& pk, secret_key const& sk);

Performs a key exchange on the given public key and private key, producing a shared secret. It is recommended to hash the shared secret before using it.

This is useful when two parties want to share a secret but both only knows their respective public keys. see test_ed25519 for a practical example

libtorrent-rasterbar-2.0.5/docs/reference-Filter.html0000664000175000017500000003151614152763504021677 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

ip_filter

Declared in "libtorrent/ip_filter.hpp"

The ip_filter class is a set of rules that uniquely categorizes all ip addresses as allowed or disallowed. The default constructor creates a single rule that allows all addresses (0.0.0.0 - 255.255.255.255 for the IPv4 range, and the equivalent range covering all addresses for the IPv6 range).

A default constructed ip_filter does not filter any address.

struct ip_filter
{
   ip_filter ();
   ip_filter& operator= (ip_filter const&);
   ip_filter (ip_filter&&);
   ~ip_filter ();
   ip_filter (ip_filter const&);
   ip_filter& operator= (ip_filter&&);
   bool empty () const;
   void add_rule (address const& first, address const& last, std::uint32_t flags);
   std::uint32_t access (address const& addr) const;
   filter_tuple_t export_filter () const;

   enum access_flags
   {
      blocked,
   };
};
[report issue]

empty()

bool empty () const;

returns true if the filter does not contain any rules

[report issue]

add_rule()

void add_rule (address const& first, address const& last, std::uint32_t flags);

Adds a rule to the filter. first and last defines a range of ip addresses that will be marked with the given flags. The flags can currently be 0, which means allowed, or ip_filter::blocked, which means disallowed.

precondition: first.is_v4() == last.is_v4() && first.is_v6() == last.is_v6()

postcondition: access(x) == flags for every x in the range [first, last]

This means that in a case of overlapping ranges, the last one applied takes precedence.

[report issue]

access()

std::uint32_t access (address const& addr) const;

Returns the access permissions for the given address (addr). The permission can currently be 0 or ip_filter::blocked. The complexity of this operation is O(log n), where n is the minimum number of non-overlapping ranges to describe the current filter.

[report issue]

export_filter()

filter_tuple_t export_filter () const;

This function will return the current state of the filter in the minimum number of ranges possible. They are sorted from ranges in low addresses to high addresses. Each entry in the returned vector is a range with the access control specified in its flags field.

The return value is a tuple containing two range-lists. One for IPv4 addresses and one for IPv6 addresses.

[report issue]

enum access_flags

Declared in "libtorrent/ip_filter.hpp"

name value description
blocked 1 indicates that IPs in this range should not be connected to nor accepted as incoming connections
[report issue]

port_filter

Declared in "libtorrent/ip_filter.hpp"

the port filter maps non-overlapping port ranges to flags. This is primarily used to indicate whether a range of ports should be connected to or not. The default is to have the full port range (0-65535) set to flag 0.

class port_filter
{
   ~port_filter ();
   port_filter (port_filter&&);
   port_filter& operator= (port_filter const&);
   port_filter (port_filter const&);
   port_filter& operator= (port_filter&&);
   port_filter ();
   void add_rule (std::uint16_t first, std::uint16_t last, std::uint32_t flags);
   std::uint32_t access (std::uint16_t port) const;

   enum access_flags
   {
      blocked,
   };
};
[report issue]

add_rule()

void add_rule (std::uint16_t first, std::uint16_t last, std::uint32_t flags);

set the flags for the specified port range (first, last) to flags overwriting any existing rule for those ports. The range is inclusive, i.e. the port last also has the flag set on it.

[report issue]

access()

std::uint32_t access (std::uint16_t port) const;

test the specified port (port) for whether it is blocked or not. The returned value is the flags set for this port. see access_flags.

[report issue]

enum access_flags

Declared in "libtorrent/ip_filter.hpp"

name value description
blocked 1 this flag indicates that destination ports in the range should not be connected to
libtorrent-rasterbar-2.0.5/docs/building.html0000664000175000017500000014013114152763504020305 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

downloading and building

To download the latest version of libtorrent, clone the github repository.

The build systems supported "out of the box" in libtorrent are boost-build cmake. 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_* and BOOST_* macros are defined when you link against libtorrent as when you build it. The simplest way to see the full list of macros defined is to build libtorrent with -n -a switches added to b2 command line, which output all compiler switches.

Boost-build supports propagating configuration options to dependencies.

building from git

To build libtorrent from git you need to clone the libtorrent repository from github. Note that the git repository depends on other git repositories via submodules, which also need to be initialized and updated. If you downloaded a release tarball, you can skip this section.

git clone --recurse-submodules https://github.com/arvidn/libtorrent.git

building with boost build

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).

build commands

Linux:

sudo apt install libboost-tools-dev libboost-dev libboost-system-dev
echo "using gcc ;" >>~/user-config.jam
b2 crypto=openssl cxxstd=14 release

Mac OS:

brew install boost-build boost openssl@1.1
echo "using darwin ;" >>~/user-config.jam
b2 crypto=openssl cxxstd=14 release

Windows (assuming the boost package is saved to C:\boost_1_69_0):

set BOOST_ROOT=c:\boost_1_69_0
set BOOST_BUILD_PATH=%BOOST_ROOT%\tools\build
(cd %BOOST_ROOT% && .\bootstrap.bat)
echo using msvc ; >>%HOMEDRIVE%%HOMEPATH%\user-config.jam
%BOOST_ROOT%\b2.exe --hash cxxstd=14 release

docker file

A Docker file is available that's used to build and run the fuzzers, at OSS-Fuzz.

Step 1: Download boost

If you want to build against boost installed on your system, you can skip this strep. Just make sure to have BOOST_ROOT unset for the b2 invocation.

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_69_0. You'll need at least version 1.66 of the boost library in order to build libtorrent.

Step 2: Setup BBv2

If you have installed boost-build via a package manager, you can skip this step. If not, you need to build boost build from the boost source package.

First you need to build b2. You do this by opening a terminal (In windows, run cmd). Change directory to c:\boost_1_68_0\tools\build. Then run the script called bootstrap.bat or bootstrap.sh on a Unix system. This will build b2 and place it in a directory src/engine/bin.<architecture>. Copy the b2.exe (or b2 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 b2 installed. b2 can be considered an interpreter that the boost-build system is implemented on. So boost-build uses b2. 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 b2 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_68_0\tools\build.

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

set BOOST_BUILD_PATH=c:\boost_1_68_0\tools\build\v2

In a terminal window.

The last thing to do is to configure which compiler(s) to use. Create a file user-config.jam in your home directory. 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 14.2 (2019), just add a line:

using msvc : 14.2 ;

If you use GCC, add the line:

using gcc ;

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

using gcc : 6.0 : g++-6 ;
using gcc : 7.0 : g++-7 ;

Another toolset worth mentioning is the darwin toolset (for macOS). From Tiger (10.4) macOS 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 boost-build documentation.

Step 3: Building libtorrent

When building libtorrent, boost is either picked up from system installed locations or from a boost source package, if the BOOST_ROOT environment variable is set pointing to one. If you're building boost from source, set BOOST_ROOT to your boost directory, e.g. c:\boost_1_68_0.

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

b2 msvc-14.2
b2 gcc-7.0
b2 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. In this case it's critical that you build your project with the same version of C++ and the same build flags as the system libraries were built with.

Note

Also see the Visual Studio versions.

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 command line, either to shared or static. Most operating systems will only allow linking shared against the runtime, but on windows you can do both. Example:

b2 msvc-14.2 variant=release link=static runtime-link=static debug-symbols=on

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 --hash on the b2 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

When building on Solaris, you may have to specify stdlib=sun-stlport on the b2 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 b2 from there. To build and run the tests, go to the test directory and run b2.

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_68_0). In the windows environment, they should have the typical windows format (c:/boost_1_68_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.

Jamfile will look in some default directory for the openssl headers and libraries. On macOS, it will look for the homebrew openssl package. On Windows, it will look in C:\OpenSSL-Win32, or C:\OpenSSL-Win64 if compiling in 64-bit.

To customize the library path and include path for openssl, set the features openssl-lib and openssl-include respectively.

The option to link with wolfSSL (by setting the crypto feature to wolfssl), requires a custom build of wolfSSL using the following options: --enable-asio --enable-sni --enable-nginx.

To customize the library path and include path for wolfSSL, set the features wolfssl-lib and wolfssl-include respectively.

To disable linking against any SSL library, set the crypto build feature to built-in. This will use an embedded version if SHA-1.

Build features

boost build feature values
cxxstd The version of C++ to use, e.g. 11, 14, 17, 20. The C++ version may affect the libtorrent ABI (the ambition is to avoid that).
boost-link
  • static - links statically against the boost libraries.
  • shared - links dynamically against the boost libraries.
openssl-lib can be used to specify the directory where libssl and libcrypto are installed (or the windows counterparts).
openssl-include can be used to specify the include directory where the openssl headers are installed.
logging
  • off - logging alerts disabled. The reason to disable logging is to keep the binary size low where that matters.
  • on - default. logging alerts available, still need to be enabled by the alert mask.
lto
  • on - enables link time optimization, also known as whole program optimization.
alert-msg
  • on - (default) return human readable messages from the alert::message() call.
  • off - Always return empty strings from alert::message(), and save binary size.
dht
  • on - build with DHT support
  • 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).(default)
  • 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
  • openssl - (default) links against openssl and libcrypto to use for SHA-1 hashing. This also enables HTTPS-tracker support and support for bittorrent over SSL.
  • built-in - (default) uses built-in SHA-1 implementation. In macOS/iOS it uses CommonCrypto SHA-1 implementation.
  • wolfssl - links against wolfssl to use it for SHA-1 hashing and HTTPS tracker support.
  • libcrypto - links against libcrypto to use the SHA-1 implementation. (no SSL support)
  • gcrypt - links against libgcrypt to use the SHA-1 implementation. (no SSL support)
openssl-version

This can be used on windows to link against the special OpenSSL library names used on windows prior to OpenSSL 1.1.

  • 1.1 - link against the normal openssl library name. (default)
  • pre1.1 - link against the old windows names (i.e. ssleay32 and libeay32.
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.
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.
i2p
  • on - default. 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.
utp-log
  • off - default. Do not print verbose uTP log.
  • on - Print verbose uTP log, used to debug the uTP implementation.
picker-debugging
  • off - default. no extra invariant checks in piece picker.
  • on - include additional invariant checks in piece picker. Used for testing the piece picker.
extensions
  • on - enable extensions to the bittorrent protocol.(default)
  • off - disable bittorrent extensions.
streaming
  • on - enable streaming functionality. i.e. set_piece_deadline(). (default)
  • off - disable streaming functionality.
super-seeding
  • on - enable super seeding feature. (default)
  • off - disable super seeding feature
share-mode
  • on - enable share-mode feature. (default)
  • off - disable share-mode feature
predictive-pieces
  • on - enable predictive piece announce feature. i.e. settings_pack::predictive_piece_announce (default)
  • off - disable feature.
fpic
  • off - default. Build without specifying -fPIC.
  • on - Force build with -fPIC (useful for building a static library to be linked into a shared library).
mmap-disk-io
  • on - default. Enable mmap disk storage (if available.
  • off - disable mmap storage, and fall back to single-threaded, portable file operations.

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

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 built-in features.

Step 4: Installing libtorrent

To install libtorrent run b2 with the install target:

b2 install --prefix=/usr/local

Change the value of the --prefix argument to install it in a different location.

Custom build flags

Custom build flags can be passed to the command line via the cflags, cxxflags and linkflags features. When specifying custom flags, make sure to build everything from scratch, to not accidentally mix incompatible flags. Example:

b2 cxxflags=-msse4.1

Custom flags can also be configured in the toolset, in ~/user-config.jam, Jamroot.jam or project-config.jam. Example:

using gcc : sse41 : g++ : <cxxflags>-msse4.1 ;

Cross compiling

To cross compile libtorrent, configure a new toolset for b2 to use. Toolsets can be configured in ~/user-config.jam, Jamroot.jam or project-config.jam. The last two live in the libtorrent root directory.

A toolset configuration is in this form:

using toolset : version : command-line : features ;

Toolset is essentially the family of compiler you're setting up, choose from this list.

Perhaps the most common ones would be gcc, clang, msvc and darwin (Apple's version of clang).

The version can be left empty to be auto configured, or a custom name can be used to identify this toolset.

The command-line is what to execute to run the compiler. This is also an opportunity to insert a call to ccache for example.

features are boost-build features. Typical features to set here are <compileflags>, <cflags> and <cxxflags>. For the gcc toolset, the <archiver> can be set to specify which tool to use to create a static library/archive. This is especially handy when cross compiling.

Here's an example toolset for cross compiling for ARM Linux:

using gcc : arm : arm-linux-gnueabihf-g++ : <archiver>arm-linux-gnueabihf-ar ;

To build using this toolset, specify gcc-arm as the toolset on the b2 command line. For example:

b2 toolset=gcc-arm

building with cmake

First of all, you need to install cmake. Additionally you need a build system to actually schedule builds, for example ninja.

Step 1: Generating the build system

Create a build directory for out-of-source build inside the libtorrent root directory:

mkdir build

and cd there:

cd build

Run cmake in the build directory, like this:

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=14 -G Ninja ..

The CMAKE_CXX_STANDARD has to be at least 14, but you may want to raise it to 17 if your project use a newer version of the C++ standard.

Warning

The detection of boost sometimes fail in subtle ways. If you have the BOOST_ROOT environment variable set, it may find the pre-built system libraries, but use the header files from your source package. To avoid this, invoke cmake with BOOST_ROOT set to an empty string: BOOST_ROOT="" cmake ....

Other build options are:

BUILD_SHARED_LIBS Defaults ON. Builds libtorrent as a shared library.
static_runtime Defaults OFF. Link libtorrent statically against the runtime libraries.
build_tests Defaults OFF. Also build the libtorrent tests.
build_examples Defaults OFF. Also build the examples in the examples directory.
build_tools Defaults OFF. Also build the tools in the tools directory.
python-bindings Defaults OFF. Also build the python bindings in bindings/python directory.
encryption Defaults ON. Support trackers and bittorrent over TLS, and obfuscated bittorrent connections.

Options are set on the cmake command line with the -D option or later on using ccmake or cmake-gui applications. cmake run outputs a summary of all available options and their current values.

Step 2: Building libtorrent

In the terminal, run:

ninja

If you enabled test in the configuration step, to run them, run:

ctest

building with VCPKG

You can download and install libtorrent using the vcpkg dependency manager:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install libtorrent

The libtorrent port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please create an issue or pull request on the vcpkg repository.

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. Make sure to define the same macros in your own code that compiles and links with libtorrent.

macro description
NDEBUG If 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_LOGGING This 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_DISABLE_ALERT_MSG Human readable messages returned from the alert message() member functions will return empty strings.
TORRENT_DISABLE_SUPERSEEDING This macro will disable support for super seeding. The settings will exist, but will not have an effect, when this macro is defined.
TORRENT_DISABLE_SHARE_MODE This macro will disable support for share-mode. i.e. the mode to maximize upload/download ratio for a torrent.
TORRENT_DISABLE_MUTABLE_TORRENTS Disables mutable torrent support (BEP 38)
TORRENT_DISABLE_STREAMING Disables set_piece_deadline() and associated functionality.
TORRENT_DISABLE_PREDICTIVE_PIECES Disables settings_pack::predictive_piece_announce feature.
TORRENT_LINKING_SHARED If 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_SHARED If 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_DHT If this is defined, the support for trackerless torrents will be disabled.
TORRENT_DISABLE_ENCRYPTION This 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_LIBCRYPTO or TORRENT_USE_LIBGCRYPT must be defined.
TORRENT_DISABLE_EXTENSIONS When defined, libtorrent plugin support is disabled along with support for the extension handshake (BEP 10).
TORRENT_USE_INVARIANT_CHECKS If defined to non-zero, this will enable internal invariant checks in libtorrent. The invariant checks can sometimes be quite expensive, they typically don't scale very well.
TORRENT_EXPENSIVE_INVARIANT_CHECKS This will enable extra expensive invariant checks. Useful for finding particular bugs or for running before releases.
TORRENT_NO_DEPRECATE This will exclude all deprecated functions from the header files and source files.
TORRENT_PRODUCTION_ASSERTS Define to either 0 or 1. Enables assert logging in release builds.
TORRENT_USE_ASSERTS Define as 0 to disable asserts unconditionally.
TORRENT_USE_SYSTEM_ASSERTS Uses the libc assert macro rather then the custom one.
TORRENT_HAVE_MMAP Define as 0 to disable mmap support.
TORRENT_USE_OPENSSL Link against libssl for SSL support. Must be combined with TORRENT_USE_LIBCRYPTO
TORRENT_USE_GNUTLS Link against libgnutls for SSL support.
TORRENT_USE_LIBCRYPTO Link against libcrypto for SHA-1 support and other hashing algorithms.
TORRENT_USE_LIBGCRYPT Link against libgcrypt for SHA-1 support and other hashing algorithms.
TORRENT_SSL_PEERS Define to enable support for SSL torrents, peers are connected over authenticated SSL streams.

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.

list of macros

The following is a list of defines that libtorrent is built with: BOOST_ALL_NO_LIB, BOOST_ASIO_ENABLE_CANCELIO, BOOST_ASIO_HAS_STD_CHRONO, BOOST_MULTI_INDEX_DISABLE_SERIALIZATION, BOOST_NO_DEPRECATED, BOOST_SYSTEM_NO_DEPRECATED

Make sure you define the same at compile time for your code to avoid any runtime errors and other issues.

These might change in the future, so it's always best to verify these every time you upgrade to a new version of libtorrent. The simplest way to see the full list of macros defined is to build libtorrent with -n -a switches added to b2 command line:

b2 -n -a toolset=msvc-14.2 link=static runtime-link=static boost-link=static variant=release

This will output all compiler switches, including defines (such as -DBOOST_ASIO_ENABLE_CANCELIO).

libtorrent-rasterbar-2.0.5/docs/hacking.rst0000664000175000017500000001041014152763504017754 0ustar arvidarvid================== libtorrent hacking ================== .. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none This describe some of the internals of libtorrent. If you're looking for something to contribute, please take a look at the `todo list`_. .. _`todo list`: todo.html terminology =========== This section describes some of the terminology used throughout the libtorrent source. Having a good understanding of some of these keywords helps understanding what's going on. A *piece* is a part of the data of a torrent that has a SHA-1 hash in the .torrent file. Pieces are almost always a power of two in size, but not necessarily. Each piece is split up in *blocks*, which is a 16 kiB. A block never spans two pieces. If a piece is smaller than 16 kiB or not divisible by 16 kiB, there are blocks smaller than that. 16 kiB is a de-facto standard of the largest transfer unit in the bittorrent protocol. Clients typically reject any request for larger pieces than this. The *piece picker* is the part of a bittorrent client that is responsible for the logic to determine which requests to send to peers. It doesn't actually pick full pieces, but blocks (from pieces). The file layout of a torrent is represented by *file storage* objects. This class contains a list of all files in the torrent (in a well defined order), the size of the pieces and implicitly the total size of the whole torrent and number of pieces. The file storage determines the mapping from *pieces* to *files*. This representation may be quite complex in order to keep it extremely compact. This is useful to load very large torrents without exploding in memory usage. A *torrent* object represents all the state of swarm download. This includes a piece picker, a list of peer connections, file storage (torrent file). One important distinction is between a connected peer (*peer_connection*) and a peer we just know about, and may have been connected to, and may connect to in the future (*torrent_peer*). The list of (not connected) peers may grow very large if not limited (through tracker responses, DHT and peer exchange). This list is typically limited to a few thousand peers. The *peer_list* maintains a potentially large list of known peers for a swarm (not necessarily connected). structure ========= This is the high level structure of libtorrent. Bold types are part of the public interface: .. image:: img/hacking.png :class: bw session_impl ------------ This is the session state object, containing all session global information, such as: * the list of all torrents ``m_torrent``. * the list of all peer connections ``m_connections``. * the global rate limits ``m_settings``. * the DHT state ``m_dht``. * the port mapping state, ``m_upnp`` and ``m_natpmp``. session ------- This is the public interface to the session. It implements pimpl (pointer to implementation) in order to hide the internal representation of the ``session_impl`` object from the user and make binary compatibility simpler to maintain. torrent_handle -------------- This is the public interface to a ``torrent``. It holds a weak reference to the internal ``torrent`` object and manipulates it by sending messages to the network thread. torrent ------- peer_connection --------------- peer_list --------- piece_picker ------------ torrent_info ------------ threads ======= libtorrent starts at least 3 threads, but likely more, depending on the settings_pack::aio_threads setting. The kinds of threads are: * The main network thread that manages all sockets; sending and receiving messages and maintaining all session, torrent and peer state. In an idle session, this thread will mostly be blocked in a system call, waiting for socket activity, such as ``epoll()``. * A disk I/O thread. There may be multiple disk threads. All disk read and write operations are passed to this thread and messages are passed back to the main thread when the operation completes. This kind of thread also performs the SHA-1/SHA-256 calculations to verify pieces. Some disk threads may have an affinity for those jobs, to avoid starvation of the disk. * At least one thread is spawned by boost.asio on systems that don't support asynchronous host name resolution, in order to simulate non-blocking ``getaddrinfo()``. libtorrent-rasterbar-2.0.5/docs/reference-Bdecoding.html0000664000175000017500000006521414152763504022332 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

bdecode_node

Declared in "libtorrent/bdecode.hpp"

Sometimes it's important to get a non-owning reference to the root node ( to be able to copy it as a reference for instance). For that, use the non_owning() member function.

There are 5 different types of nodes, see type_t.

struct bdecode_node
{
   bdecode_node () = default;
   bdecode_node& operator= (bdecode_node const&) &;
   bdecode_node& operator= (bdecode_node&&) & = default;
   bdecode_node (bdecode_node const&);
   bdecode_node (bdecode_node&&) noexcept;
   type_t type () const noexcept;
   explicit operator bool () const noexcept;
   bdecode_node non_owning () const;
   std::ptrdiff_t data_offset () const noexcept;
   span<char const> data_section () const noexcept;
   int list_size () const;
   std::int64_t list_int_value_at (int i
      , std::int64_t default_val = 0) const;
   bdecode_node list_at (int i) const;
   string_view list_string_value_at (int i
      , string_view default_val = string_view()) const;
   bdecode_node dict_find (string_view key) const;
   std::pair<bdecode_node, bdecode_node> dict_at_node (int i) const;
   bdecode_node dict_find_list (string_view key) const;
   std::int64_t dict_find_int_value (string_view key
      , std::int64_t default_val = 0) const;
   string_view dict_find_string_value (string_view key
      , string_view default_value = string_view()) const;
   bdecode_node dict_find_string (string_view key) const;
   bdecode_node dict_find_int (string_view key) const;
   bdecode_node dict_find_dict (string_view key) const;
   int dict_size () const;
   std::pair<string_view, bdecode_node> dict_at (int i) const;
   std::int64_t int_value () const;
   char const* string_ptr () const;
   string_view string_value () const;
   int string_length () const;
   std::ptrdiff_t string_offset () const;
   void clear ();
   void swap (bdecode_node& n);
   void reserve (int tokens);
   void switch_underlying_buffer (char const* buf) noexcept;
   bool has_soft_error (span<char> error) const;

   enum type_t
   {
      none_t,
      dict_t,
      list_t,
      string_t,
      int_t,
   };
};
[report issue]

bdecode_node()

bdecode_node () = default;

creates a default constructed node, it will have the type none_t.

[report issue]

operator=() bdecode_node()

bdecode_node& operator= (bdecode_node const&) &;
bdecode_node& operator= (bdecode_node&&) & = default;
bdecode_node (bdecode_node const&);
bdecode_node (bdecode_node&&) noexcept;

For owning nodes, the copy will create a copy of the tree, but the underlying buffer remains the same.

[report issue]

type()

type_t type () const noexcept;

the type of this node. See type_t.

[report issue]

bool()

explicit operator bool () const noexcept;

returns true if type() != none_t.

[report issue]

non_owning()

bdecode_node non_owning () const;

return a non-owning reference to this node. This is useful to refer to the root node without copying it in assignments.

[report issue]

data_offset() data_section()

std::ptrdiff_t data_offset () const noexcept;
span<char const> data_section () const noexcept;

returns the buffer and length of the section in the original bencoded buffer where this node is defined. For a dictionary for instance, this starts with d and ends with e, and has all the content of the dictionary in between. the data_offset() function returns the byte-offset to this node in, starting from the beginning of the buffer that was parsed.

[report issue]

list_size() list_string_value_at() list_at() list_int_value_at()

int list_size () const;
std::int64_t list_int_value_at (int i
      , std::int64_t default_val = 0) const;
bdecode_node list_at (int i) const;
string_view list_string_value_at (int i
      , string_view default_val = string_view()) const;

functions with the list_ prefix operate on lists. These functions are only valid if type() == list_t. list_at() returns the item in the list at index i. i may not be greater than or equal to the size of the list. size() returns the size of the list.

[report issue]

dict_at() dict_find_dict() dict_find_int() dict_at_node() dict_find_string_value() dict_size() dict_find() dict_find_string() dict_find_list() dict_find_int_value()

bdecode_node dict_find (string_view key) const;
std::pair<bdecode_node, bdecode_node> dict_at_node (int i) const;
bdecode_node dict_find_list (string_view key) const;
std::int64_t dict_find_int_value (string_view key
      , std::int64_t default_val = 0) const;
string_view dict_find_string_value (string_view key
      , string_view default_value = string_view()) const;
bdecode_node dict_find_string (string_view key) const;
bdecode_node dict_find_int (string_view key) const;
bdecode_node dict_find_dict (string_view key) const;
int dict_size () const;
std::pair<string_view, bdecode_node> dict_at (int i) const;

Functions with the dict_ prefix operates on dictionaries. They are only valid if type() == dict_t. In case a key you're looking up contains a 0 byte, you cannot use the 0-terminated string overloads, but have to use string_view instead. dict_find_list will return a valid bdecode_node if the key is found _and_ it is a list. Otherwise it will return a default-constructed bdecode_node.

Functions with the _value suffix return the value of the node directly, rather than the nodes. In case the node is not found, or it has a different type, a default value is returned (which can be specified).

dict_at() returns the (key, value)-pair at the specified index in a dictionary. Keys are only allowed to be strings. dict_at_node() also returns the (key, value)-pair, but the key is returned as a bdecode_node (and it will always be a string).

[report issue]

int_value()

std::int64_t int_value () const;

this function is only valid if type() == int_t. It returns the value of the integer.

[report issue]

string_offset() string_ptr() string_value() string_length()

char const* string_ptr () const;
string_view string_value () const;
int string_length () const;
std::ptrdiff_t string_offset () const;

these functions are only valid if type() == string_t. They return the string values. Note that string_ptr() is not 0-terminated. string_length() returns the number of bytes in the string. string_offset() returns the byte offset from the start of the parsed bencoded buffer this string can be found.

[report issue]

clear()

void clear ();

resets the bdecoded_node to a default constructed state. If this is an owning node, the tree is freed and all child nodes are invalidated.

[report issue]

swap()

void swap (bdecode_node& n);

Swap contents.

[report issue]

reserve()

void reserve (int tokens);

preallocate memory for the specified numbers of tokens. This is useful if you know approximately how many tokens are in the file you are about to parse. Doing so will save realloc operations while parsing. You should only call this on the root node, before passing it in to bdecode().

[report issue]

switch_underlying_buffer()

void switch_underlying_buffer (char const* buf) noexcept;

this buffer MUST be identical to the one originally parsed. This operation is only defined on owning root nodes, i.e. the one passed in to decode().

[report issue]

has_soft_error()

bool has_soft_error (span<char> error) const;

returns true if there is a non-fatal error in the bencoding of this node or its children

[report issue]

enum type_t

Declared in "libtorrent/bdecode.hpp"

name value description
none_t 0 uninitialized or default constructed. This is also used to indicate that a node was not found in some cases.
dict_t 1 a dictionary node. The dict_find_ functions are valid.
list_t 2 a list node. The list_ functions are valid.
string_t 3 a string node, the string_ functions are valid.
int_t 4 an integer node. The int_ functions are valid.
[report issue]

print_entry()

Declared in "libtorrent/bdecode.hpp"

std::string print_entry (bdecode_node const& e
   , bool single_line = false, int indent = 0);

print the bencoded structure in a human-readable format to a string that's returned.

[report issue]

bdecode()

Declared in "libtorrent/bdecode.hpp"

int bdecode (char const* start, char const* end, bdecode_node& ret
   , error_code& ec, int* error_pos = nullptr, int depth_limit = 100
   , int token_limit = 2000000);
bdecode_node bdecode (span<char const> buffer
   , error_code& ec, int* error_pos = nullptr, int depth_limit = 100
   , int token_limit = 2000000);
bdecode_node bdecode (span<char const> buffer
   , int depth_limit = 100, int token_limit = 2000000);

This function decodes/parses bdecoded data (for example a .torrent file). The data structure is returned in the ret argument. the buffer to parse is specified by the start of the buffer as well as the end, i.e. one byte past the end. If the buffer fails to parse, the function returns a non-zero value and fills in ec with the error code. The optional argument error_pos, if set to non-nullptr, will be set to the byte offset into the buffer where the parse failure occurred.

depth_limit specifies the max number of nested lists or dictionaries are allowed in the data structure. (This affects the stack usage of the function, be careful not to set it too high).

token_limit is the max number of tokens allowed to be parsed from the buffer. This is simply a sanity check to not have unbounded memory usage.

The resulting bdecode_node is an owning node. That means it will be holding the whole parsed tree. When iterating lists and dictionaries, those bdecode_node objects will simply have references to the root or owning bdecode_node. If the root node is destructed, all other nodes that refer to anything in that tree become invalid.

However, the underlying buffer passed in to this function (start, end) must also remain valid while the bdecoded tree is used. The parsed tree produced by this function does not copy any data out of the buffer, but simply produces references back into it.

libtorrent-rasterbar-2.0.5/docs/reference-Resume_Data.html0000664000175000017500000001630614152763504022643 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

write_resume_data() write_resume_data_buf()

Declared in "libtorrent/write_resume_data.hpp"

entry write_resume_data (add_torrent_params const& atp);
std::vector<char> write_resume_data_buf (add_torrent_params const& atp);

this function turns the resume data in an add_torrent_params object into a bencoded structure

[report issue]

write_torrent_file()

Declared in "libtorrent/write_resume_data.hpp"

entry write_torrent_file (add_torrent_params const& atp);

writes only the fields to create a .torrent file. This function may fail with a std::system_error exception if:

  • The add_torrent_params object passed to this function does not contain the info dictionary (the ti field)
  • The piece layers are not complete for all files that need them
[report issue]

read_resume_data()

Declared in "libtorrent/read_resume_data.hpp"

add_torrent_params read_resume_data (span<char const> buffer
   , load_torrent_limits const& cfg = {});
add_torrent_params read_resume_data (bdecode_node const& rd
   , int piece_limit = 0x200000);
add_torrent_params read_resume_data (span<char const> buffer
   , error_code& ec, load_torrent_limits const& cfg = {});
add_torrent_params read_resume_data (bdecode_node const& rd
   , error_code& ec, int piece_limit = 0x200000);

these functions are used to parse resume data and populate the appropriate fields in an add_torrent_params object. This object can then be used to add the actual torrent_info object to and pass to session::add_torrent() or session::async_add_torrent().

If the client wants to override any field that was loaded from the resume data, e.g. save_path, those fields must be changed after loading resume data but before adding the torrent.

The piece_limit parameter determines the largest number of pieces allowed in the torrent that may be loaded as part of the resume data, if it contains an info field. The overloads that take a flat buffer are instead configured with limits on torrent sizes via load_torrent limits.

In order to support large torrents, it may also be necessary to raise the settings_pack::max_piece_count setting and pass a higher limit to calls to torrent_info::parse_info_section().

libtorrent-rasterbar-2.0.5/docs/utp.html0000664000175000017500000005131214152763504017322 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

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. a home router that crashes or slows down by UDP traffic (caused by the DHT)
  3. 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.

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 advertising (because it's often much lower than the download capacity) which might make it hard to find.
  2. 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.

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)
img/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 causes 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.

img/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 boundary 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. 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.
  3. 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).

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. 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.

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 advertise 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

img/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 (artificially 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.
libtorrent-rasterbar-2.0.5/docs/features.rst0000664000175000017500000003265714152763504020207 0ustar arvidarvid.. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none 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. BitTorrent v2 is supported as of libtorrent 2.0. This replaces the previous merkle hash tree extension. features ======== libtorrent is an ongoing project under active development. Its current state supports and includes the following features: BitTorrent v2 ------------- Starting with version 2.0, libtorrent supports BitTorrent V2 (as specified in `BEP 52`_). BitTorrent V2 introduces a new format for .torrent files, which generally has a smaller info-dict than the original format. The .torrent files still contain piece hashes by default, but they can also be downloaded from peers. 1. Files are organized in a directory structure, instead of listing full paths. Torrents that have a lot of files in deep directory structures will use a lot less space to represent that structure in a v2 torrent. 2. Piece hashes are organized in a merkle hash trees per file, and only the roots of the trees are included in the .torrent file. The actual hashes are delivered by peers. The hash tree allows validating payload received from a peer immediately, down to 16 kiB blocks. In the original bittorrent protocol a whole piece would have to be downloaded before it could be validated against the hashes. The fact that each file has its own hash tree, and that its leaves are defined to be 16 kiB, means that files with identical content will always have the same merkle root. This enables finding matches of the same file across different torrents. The new format for torrent files is compatible with the original torrent file format, which enables *hybrid* torrents. Such torrents that can be used both as V1 and V2 and will have two swarms, one with V1 and V2 clients and one with only V2 clients. Another major feature of the BitTorrent V2 protocol is that the SHA-1 hash function has been replaced by SHA-256. 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 (multicast for peers on the same local network) * multi-tracker 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`_. * share-mode. This is a special mode torrents can be put in to optimize share ratio rather than downloading the torrent. * supports the Magnet URI extension - Select specific file indices for download. `BEP 53`_. .. _article: utp.html .. _extensions: manual-ref.html#extensions .. _`http seeding`: manual-ref.html#http-seeding disk management --------------- * can use multiple 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. * queues torrents for file check, instead of checking all of them in parallel. 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. 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 gzip 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, PCP 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. .. _`DHT extensions`: dht_extensions.html .. _`BEP 5`: https://www.bittorrent.org/beps/bep_0005.html .. _`BEP 7`: https://www.bittorrent.org/beps/bep_0007.html .. _`BEP 9`: https://www.bittorrent.org/beps/bep_0009.html .. _`BEP 10`: https://www.bittorrent.org/beps/bep_0010.html .. _`BEP 12`: https://www.bittorrent.org/beps/bep_0012.html .. _`BEP 15`: https://www.bittorrent.org/beps/bep_0015.html .. _`BEP 16`: https://www.bittorrent.org/beps/bep_0016.html .. _`BEP 17`: https://www.bittorrent.org/beps/bep_0017.html .. _`BEP 19`: https://www.bittorrent.org/beps/bep_0019.html .. _`BEP 21`: https://www.bittorrent.org/beps/bep_0021.html .. _`BEP 24`: https://www.bittorrent.org/beps/bep_0024.html .. _`BEP 27`: https://www.bittorrent.org/beps/bep_0027.html .. _`BEP 29`: https://www.bittorrent.org/beps/bep_0029.html .. _`BEP 52`: https://www.bittorrent.org/beps/bep_0052.html .. _`BEP 53`: https://www.bittorrent.org/beps/bep_0053.html .. _`extension protocol`: extension_protocol.html highlighted features ==================== disk I/O -------- All disk I/O in libtorrent is done asynchronously to the network thread, by the disk io threads. Files are mapped into memory and the kernel's page cache is relied on for caching disk blocks. This has the advantage that the disk cache size adapts to global system load and memory pressure, maximizing the cache without bogging down the whole system. Since memory mapped I/O is inherently synchronous, files can be accessed from multiple disk I/O threads. Similarly, for write requests, blocks are queued in a store-buffer while waiting to be flushed to disk. Read requests that happen before a block has been flushed, will short circuit by picking the block from the store buffer. Memory mapped files are available on Windows and posix 64 bit systems. When building on other, simpler platforms, or 32 bits, a simple portable and single-threaded disk I/O back-end is available, using `fopen()` and `fclose()` family of functions. 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 system call. This means a single copy into user space memory, and a single copy back into kernel memory, as illustrated by this figure: .. image:: img/write_disk_buffers.png :width: 100% :class: bw 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: .. image:: img/read_disk_buffers.png :width: 100% :class: bw 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. customizable file I/O --------------------- .. image:: img/storage.png :align: right :class: bw libtorrent's disk I/O 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 disk I/O class can be implemented (inheriting from the disk_interface) that avoids the unnecessary step of mapping pieces 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). 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: .. code:: c++ #include #include "libtorrent/session.hpp" // usage a.out [torrent-file] int main(int argc, char* argv[]) try { lt::session s; lt::add_torrent_params p; p.save_path = "./"; p.ti = std::make_shared(argv[1]); lt::torrent_handle h = 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 const& 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`_. .. _`python bindings`: python_binding.html portability =========== libtorrent runs on most major operating systems including: * Windows * macOS * Linux * BSD * Solaris It uses Boost.Asio, Boost.Optional, Boost.System, Boost.Multiprecision, Boost.Pool, Boost.Python (for bindings), Boost.CRC and various other boost libraries. At least version 1.70 of boost is required. Since libtorrent uses Boost.Asio 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 and BSD. libtorrent requires a C++11 compiler and does not build with the following compilers: * GCC older than 5.4 * Visual Studio older than Visual Studio 15 2017 (aka msvc-14.1) libtorrent-rasterbar-2.0.5/docs/dht_store.html0000664000175000017500000006034614152763504020514 0ustar arvidarvid libtorrent
libtorrent logo

BitTorrent extension for arbitrary DHT store

Version: 2.0.5

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 each other. 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-code description
205 message (v field) too big.
206 invalid signature
207 salt (salt field) too big.
301 the CAS hash mismatched, re-read value and try again.
302 sequence 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. 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.
  3. sign or verify the concatenated string

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:

libtorrent-rasterbar-2.0.5/docs/projects.rst0000664000175000017500000001333514152763504020212 0ustar arvidarvidprojects using libtorrent ========================= These are some of the public projects that use libtorrent. If you want your project listed here, let me_ know. .. _me: mailto:arvid@libtorrent.org 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. .. _`deluge Torrent`: http://deluge-torrent.org/ qBittorrent ----------- qBittorrent_ is a free and open-source cross-platform bittorrent client written in Qt, that is available for Linux, macOS and Windows and is released under GPLv2 license. It comes with a powerful and easy-to-use graphical interface, as well as an embedded Web interface. It has a range of features such as an RSS downloader, scheduling rate limits, torrent queueing, automatic resuming, background downloading, and system tray icon with a password-protected lock. Originally written by Christophe Dumez, currently maintained by sledgehammer999. .. _qBittorrent: http://www.qbittorrent.org/ DownZemAll ---------- `DownZemAll!`_ is a mass download manager for Windows, Mac OS X and Linux. It helps you to select, organize, prioritize and run your downloads in parallel. Based on the Qt5 framework, DownZemAll! is written in C/C++. It's a free (as in "free speech" and also as in "free beer") software. Its use is governed by LGPL License. .. _`DownZemAll!`: https://setvisible.github.io/DownZemAll/ Tonidoplug ---------- Tonidoplug_ is a tiny, low-power, low-cost home server and NAS device powered by Tonido software that allows you to access your applications, files, music and media from anywhere. .. _Tonidoplug: http://www.tonidoplug.com/ Folx ---- Folx_ is a torrent client and download manager for macOS. 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. .. _folx: http://www.mac-downloader.com/ 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. .. _Miro: http://getmiro.com MooPolice --------- MooPolice_ is a windows bittorrent client with a unique look. .. _MooPolice: http://www.moopolice.de 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. .. _LeechCraft: http://leechcraft.org/ 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. .. _FDM: http://www.freedownloadmanager.org/ 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 (accessible through a web browser). Written by Michael Wojciechowski and Johan Strom. .. _btg: https://sourceforge.net/projects/btg/ electric sheep -------------- `electric sheep`_ is a screensaver which collectively generates animations and lets the users vote which one to live on. .. _`electric sheep`: http://electricsheep.org Tvitty ------ Tvitty_ is a bittorrent client for Vista Media Center, which allows searching and downloading of torrents directly on your TV. .. _Tvitty: https://tvitty.soft112.com/ hrktorrent ---------- hrktorrent_ hrktorrent is a light console torrent client written in C++. .. _hrktorrent: http://50hz.ws/hrktorrent/ halite BitTorrent ----------------- Halite_ is a windows bittorrent client controllable via an XML-RPC interface. .. _Halite: http://www.binarynotions.com/halite-bittorrent-client Arctic Torrent -------------- `Arctic Torrent`_ is a light-weight bittorrent client for windows. Written by Cory Nelson. .. _`Arctic Torrent`: https://www.softpedia.com/get/Internet/File-Sharing/Arctic-Torrent.shtml 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. .. _Bubba: https://excitostore.com/ Flush ----- Flush_ is a GTK-based BitTorrent client. .. _Flush: https://sourceforge.net/projects/flush/ 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. .. _Lince: http://lincetorrent.sourceforge.net/ BitSlug ------- BitSlug_ is a macOS cocoa client. .. _BitSlug: http://bitslug.sourceforge.net/ DelCo ----- DelCo_ is a research project at Tampere university of technology, Finland. .. _DelCo: http://delco.cs.tut.fi/ 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. .. _Torrent2Exe: http://torrent2exe.com 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. .. _ZyXEL: https://www.zyxel.com/uk/en/products_services/nsa_220_plus.shtml libtorrent-rasterbar-2.0.5/docs/upgrade_to_2.0-ref.html0000664000175000017500000007642514152763504022010 0ustar arvidarvid libtorrent
libtorrent logo

Upgrading to libtorrent 2.0

Author: Arvid Norberg, arvid@libtorrent.org

In libtorrent 2.0, some parts of the API has changed and some deprecated parts have been removed. This document summarizes the changes affecting library clients.

C++11 no longer supported

libtorrent 2.0 requires at least C++-14. To build with boost build, specify the C++ version using the cxxstd=14 build feature (14 is the default).

BitTorrent v2 support

Supporting bittorrent v2 come with some changes to the API. Specifically to support hybrid torrents. i.e. torrents that are compatible with v1-only bittorrent clients as well as supporting v2 features among the peers that support them.

info-hashes

With bittorrent v2 support, each torrent may now have two separate info hashes, one SHA-1 hash and one SHA-256 hash. These are bundled in a new type called info_hash_t. Many places that previously took an info-hash as sha1_hash now takes an info_hash_t. For backwards compatibility, info_hash_t is implicitly convertible to and from sha1_hash and is interpreted as the v1 info-hash. The implicit conversion is deprecated though.

Perhaps most noteworthy is that add_torrent_params::info_hash is now deprecated in favor of add_torrent_params::info_hashes which is an info_hash_t.

The alerts torrent_removed_alert, torrent_deleted_alert, torrent_delete_failed_alert all have info_hash members. Those members are now deprecated in favor of an info_hashes member, which is of type info_hash_t.

An info_hash_t object for a hybrid torrent will have both the v1 and v2 hashes set, it will compare false to a sha1_hash of just the v1 hash.

Calls to torrent_handle::info_hash() may need to be replaced by torrent_handle::info_hashes(), in order to get both v1 and v2 hashes.

announce_entry/tracker changes

On major change in the API is reporting of trackers. Since hybrid torrents announce once per info-hash (once for v1 and once for v2), the tracker results are also reported per bittorrent version.

Each tracker (announce_entry) has a list of endpoints. Each corresponding to a local listen socket. Each listen socket is announced independently. The announce_endpoint in turn has an array info_hashes, containing objects of type announce_infohash, for each bittorrent version. The array is indexed by the enum protocol_version. There are two members, V1 and V2.

Example:

std::vector<lt::announce_entry> tr = h.trackers();
for (lt::announce_entry const& ae : h.trackers()) {
    for (lt::announce_endpoint const& aep : ae.endpoints) {
        int version = 1;
        for (lt::announce_infohash const& ai : aep.info_hashes) {
            std::cout << "[V" << version << "] " << ae.tier << " " << ae.url
                << " " << (ih.updating ? "updating" : "")
                << " " << (ih.start_sent ? "start-sent" : "")
                << " fails: " << ih.fails
                << " msg: " << ih.message
                << "\n";
            ++version;
        }
    }
}

Merkle tree support removed

The old merkle tree torrent support has been removed, as BitTorrent v2 has better support for merkle trees, where each file has its own merkle tree.

This means add_torrent_params no longer has the merkle_tree member. Instead it has the new verified_leaf_hashes and merkle_trees members.

It also means the merkle flag for create_torrent has been removed. torrent_info no longer has set_merkle_tree() and merkle_tree() member functions.

create_torrent changes

The create_torrent class creates hybrid torrents by default. i.e. torrents compatible with both v1 and v2 bittorrent clients.

To create v1-only torrents use the v1_only flag. To create v2-only torrents, use the v2_only flag.

Perhaps the most important addition for v2 torrents is the new member function set_hash2(), which is similar to set_hash(), but for the v2-part of a torrent. One important difference is that v2 hashes are SHA-256 hashes, and they are set per file. In v2 torrents, each file forms a merkle tree and each v2 piece hash is the SHA-256 merkle root hash of the 16 kiB blocks in that piece.

All v2 torrents have pieces aligned to files, so the optimize_alignment flag is no longer relevant (as it's effectively always on). Similarly, the mutable_torrent_support flag is also always on.

pad_file_limit and alignment parameters to the create_torrent constructor have also been removed. The rules for padding and alignment is well defined for v2 torrents.

set_file_hash() and file_hash() functions are obsolete, as v2 torrents have a file_root() for each file.

on_unknown_torrent() plugin API

Since hybrid torrents have two info-hashes, the on_unknown_torrent() function on the plugin class now takes an info_hash_t instead of a sha1_hash.

socket_type_t

There is a new enum class called socket_type_t used to identify different kinds of sockets. In previous versions of libtorrent this was exposed as plain int with subtly different sets of meanings.

Previously there was an enum value udp, which has been deprecated in favor of utp.

The socket type is exposed in the following alerts, which now use the socket_type_t enum instead of int:

  • peer_connect_alert
  • peer_disconnected_alert
  • incoming_connection_alert
  • listen_failed_alert
  • listen_succeeded_alert

DHT settings

DHT configuration options have previously been set separately from the main client settings. In libtorrent 2.0 they have been unified into the main settings_pack.

Hence, lt::dht::dht_settings is now deprecated, in favor of the new dht_* settings in settings_pack.

Deprecating dht_settings also causes an API change to the dht custom storage constructor (see session_params). Instead of taking a dht_settings object, it is now passed the full settings_pack. This is considered a niche interface, so there is no backward compatibility option provided.

stats_alert

The stats_alert is deprecated. Instead, call session::post_torrent_updates(). This will post a state_update_alert containing torrent_status of all torrents that have any updates since last time this function was called.

The new mechanism scales a lot better.

saving and restoring session state

The functions save_state() and load_state() on the session object have been deprecated in favor loading the session state up-front using read_session_params() and construct the session from it.

The session state can be acquired, in the form of a session_params object, by calling session::session_state().

The session_params object is passed to the session constructor, and will restore the state from a previous session.

Use read_session_params() and write_session_params() to serialize and de-serialize the session_params object.

As a result of this, plugins that wish to save and restore state or settings must now use the new overload of load_state(), that takes a std::map<std::string, std::string>. Similarly, for saving state, it now has to be saved to a std::map<std::string, std::string> via the new overload of save_state().

A lot of session constructors have been deprecated in favor of the ones that take a session_params object. The session_params object can be implicitly constructed from a settings_pack, to cover one of the now-deprecated constructors. However, to access this conversion libtorrent/session_params.hpp must be included.

userdata is no longer a void*

The userdata field in add_torrent_params is no longer a raw void pointer. Instead it is a type-safe client_data_t object. client_data_t is similar to std::any, it can hold a pointer of any type by assignment and can be cast back to that pointer via static_cast (explicit conversion). However, if the pointer type it is cast to is not identical to what was assigned, a nullptr is returned. Note that the type has to be identical in CV-qualifiers as well.

This userdata field affects the plugin APIs that has this field passed into it.

Additionally, there's now a way to ask a torrent_handle for the userdata, so it is associated with the torrent itself.

Adding torrents by URL no longer supported

The URL covers 3 separate features, all deprecated in the previous version and removed in 2.0.

downloading over HTTP

One used to be able to add a torrent by specifying an HTTP URL in the add_torrent_params::url member. Libtorrent would download the file and attempt to load the file as a .torrent file. The torrent_handle in this mode would not represent a torrent, but a potential torrent. Its info-hash was the hash of the URL until the torrent file could be loaded, at which point the info hash changed. The corresponding torrent_update_alert has also been removed. In libtorrent 2.0 info-hashes cannot change. (Although they can be amended with bittorrent v1 or v2 info-hashes).

Instead of using this feature, clients should download the .torrent files themselves, possibly spawn their own threads, before adding them to the session.

async loading of .torrent files

The add_torrent_params::url field also supported file:// URLs. This would use a libtorrent thread to load the file from disk, asynchronously (in the case of async_add_torrent()). This feature has been removed. Clients should instead load their torrents from disk themselves, before adding them to the session. Possibly spawning their own threads.

Disk I/O overhaul

In libtorrent 2.0, the disk I/O subsystem underwent a significant update. In previous versions of libtorrent, each torrent has had its own, isolated, disk storage object. This was a customization point. In order to share things like a pool of open file handles across torrents (to have a global limit on open file descriptors) all storage objects would share a file_pool object passed in to them.

In libtorrent 2.0, the default disk I/O uses memory mapped files, which means a lot more of what used to belong in the disk caching subsystem is now handled by the kernel. This greatly simplifies the disk code and also has the potential of making a lot more efficient use of modern disks as well as physical memory.

In this new system, the customization point is the whole disk I/O subsystem. Instead of configuring a custom storage (implementing storage_interface) when adding a torrent, you can now configure a disk subsystem (implementing disk_interface) when creating a session.

Systems that don't support memory mapped files can still be used with a simple fopen()/fclose() family of functions. This disk subsystem is also not threaded and generally more primitive than the memory mapped file one.

Clients that need to customize storage should implement the disk_interface and configure it at session creation time instead of storage_interface configured in add_torrent_params. add_torrent_params no longer has a storage_constructor member.

As a consequence of this, get_storage_impl() has been removed from torrent_handle.

aio_threads and hashing_threads

In previous versions of libtorrent, the number of disk threads to use were configured by settings_pack::aio_threads. Every fourth thread was dedicated to run hash jobs, i.e. computing SHA-1 piece hashes to compare them against the expected hash.

This setting has now been split up to allow controlling the number of dedicated hash threads independently from the number of generic disk I/O threads. settings_pack::hashing_threads is now used to control the number of threads dedicated to computing hashes.

cache_size

The cache_size setting is no longer used. The caching of disk I/O is handled by the operating system.

get_cache_info() get_cache_status()

Since libtorrent no longer manages the disk cache (except for a store-buffer), get_cache_info() and get_cache_status() on the session object has also been removed. They cannot return anything useful.

last remnants of RSS support removed

The rss_notification alert category flag has been removed, which has been unused and deprecated since libtorrent 1.2.

The uuid member of add_torrent_params has been removed. Torrents can no longer be added under a specific UUID. This feature was specifically meant for RSS feeds, which was removed in the previous version of libtorrent.

libtorrent-rasterbar-2.0.5/docs/settings.rst0000664000175000017500000033136014152763504020222 0ustar arvidarvid.. _user_agent: .. raw:: html +------------+--------+-------------+ | name | type | default | +============+========+=============+ | user_agent | string | libtorrent/ | +------------+--------+-------------+ this is the client identification to the tracker. The recommended format of this string is: "client-name/client-version libtorrent/libtorrent-version". 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 | nullptr | +-------------+--------+---------+ ``announce_ip`` is the ip address passed along to trackers as the ``&ip=`` parameter. If left as the default, that parameter is omitted. .. note:: This setting is only meant for very special cases where a seed is running on the same host as the tracker, and the tracker accepts the IP parameter (which normal trackers don't). Do not set this option unless you also control the tracker. .. _handshake_client_version: .. raw:: html +--------------------------+--------+---------+ | name | type | default | +==========================+========+=========+ | handshake_client_version | string | nullptr | +--------------------------+--------+---------+ 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. This string must be a UTF-8 encoded unicode string. .. _outgoing_interfaces: .. raw:: html +---------------------+--------+---------+ | name | type | default | +=====================+========+=========+ | outgoing_interfaces | string | | +---------------------+--------+---------+ This controls which IP address outgoing TCP peer connections are bound to, in addition to controlling whether such connections are also bound to a specific network interface/adapter (*bind-to-device*). This string is a comma-separated list of IP addresses and interface names. An empty string will not bind TCP sockets to a device, and let the network stack assign the local address. A list of names will be used to bind outgoing TCP sockets in a round-robin fashion. An IP address will simply be used to `bind()` the socket. An interface name will attempt to bind the socket to that interface. If that fails, or is unsupported, one of the IP addresses configured for that interface is used to `bind()` the socket to. If the interface or adapter doesn't exist, the outgoing peer connection will fail with an error message suggesting the device cannot be found. Adapter names on Unix systems are of the form "eth0", "eth1", "tun0", etc. 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. When outgoing interfaces are specified, incoming connections or packets sent to a local interface or IP that's *not* in this list will be rejected with a peer_blocked_alert with ``invalid_local_interface`` as the reason. Note that these are just interface/adapter names or IP addresses. There are no ports specified in this list. IPv6 addresses without port should be specified without enclosing ``[``, ``]``. .. _listen_interfaces: .. raw:: html +-------------------+--------+------------------------+ | name | type | default | +===================+========+========================+ | listen_interfaces | string | 0.0.0.0:6881,[::]:6881 | +-------------------+--------+------------------------+ a comma-separated list of (IP or device name, port) pairs. These are the listen ports that will be opened for accepting incoming uTP and TCP peer connections. These are also used for *outgoing* uTP and UDP tracker connections and DHT nodes. It is possible to listen on multiple interfaces and multiple ports. Binding to port 0 will make the operating system pick the port. .. note:: There are reasons to stick to the same port across sessions, which would mean only using port 0 on the first start, and recording the port that was picked for subsequent startups. Trackers, the DHT and other peers will remember the port they see you use and hand that port out to other peers trying to connect to you, as well as trying to connect to you themselves. A port that has an "s" suffix will accept SSL peer connections. (note that SSL sockets are only available in builds with SSL support) A port that has an "l" suffix will be considered a local network. i.e. it's assumed to only be able to reach hosts in the same local network as the IP address (based on the netmask associated with the IP, queried from the operating system). if binding fails, the listen_failed_alert is posted. Once a socket binding succeeds (if it does), the listen_succeeded_alert is posted. There may be multiple failures before a success. If a device name that does not exist is configured, no listen socket will be opened for that interface. If this is the only interface configured, it will be as if no listen ports are configured. If no listen ports are configured (e.g. listen_interfaces is an empty string), networking will be disabled. No DHT will start, no outgoing uTP or tracker connections will be made. No incoming TCP or uTP connections will be accepted. (outgoing TCP connections will still be possible, depending on settings_pack::outgoing_interfaces). For example: ``[::1]:8888`` - will only accept connections on the IPv6 loopback address on port 8888. ``eth0:4444,eth1:4444`` - will accept connections on port 4444 on any IP address bound to device ``eth0`` or ``eth1``. ``[::]:0s`` - will accept SSL connections on a port chosen by the OS. And not accept non-SSL connections at all. ``0.0.0.0:6881,[::]:6881`` - binds to all interfaces on port 6881. ``10.0.1.13:6881l`` - binds to the local IP address, port 6881, but only allow talking to peers on the same local network. The netmask is queried from the operating system. Interfaces marked ``l`` are not announced to trackers, unless the tracker is also on the same local network. Windows OS network adapter device name must be specified with GUID. It can be obtained from "netsh lan show interfaces" command output. GUID must be uppercased string embraced in curly brackets. ``{E4F0B674-0DFC-48BB-98A5-2AA730BDB6D6}:7777`` - will accept connections on port 7777 on adapter with this GUID. For more information, see the `Multi-homed hosts`_ section. .. _`Multi-homed hosts`: manual-ref.html#multi-homed-hosts .. _proxy_hostname: .. raw:: html +----------------+--------+---------+ | name | type | default | +================+========+=========+ | proxy_hostname | string | | +----------------+--------+---------+ when using a proxy, this is the hostname where the proxy is running see proxy_type. Note that when using a proxy, the settings_pack::listen_interfaces setting is overridden and only a single interface is created, just to contact the proxy. This means a proxy cannot be combined with SSL torrents or multiple listen interfaces. This proxy listen interface will not accept incoming TCP connections, will not map ports with any gateway and will not enable local service discovery. All traffic is supposed to be channeled through the proxy. .. _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 when 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 | -LT2050- | +------------------+--------+----------+ 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 truncated to 20 bytes and used as the entire peer-id There is a utility function, generate_fingerprint() that can be used to generate a standard client peer ID fingerprint prefix. .. _dht_bootstrap_nodes: .. raw:: html +---------------------+--------+--------------------------+ | name | type | default | +=====================+========+==========================+ | dht_bootstrap_nodes | string | dht.libtorrent.org:25401 | +---------------------+--------+--------------------------+ This is a comma-separated list of IP port-pairs. They will be added to the DHT node (if it's enabled) as back-up nodes in case we don't know of any. Changing these after the DHT has been started may not have any effect until the DHT is restarted. .. _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. Rejecting multiple connections from the same IP address will prevent abusive behavior by peers. The logic for determining whether connections are to the same peer is more complicated with this enabled, and more likely to fail in some edge cases. It is not recommended to enable this feature. .. _send_redundant_have: .. raw:: html +---------------------+------+---------+ | name | type | default | +=====================+======+=========+ | send_redundant_have | bool | true | +---------------------+------+---------+ ``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. .. _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. If this is false, the DHT is used 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 on our subnet. 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. .. _auto_manage_prefer_seeds: .. raw:: html +--------------------------+------+---------+ | name | type | default | +==========================+======+=========+ | auto_manage_prefer_seeds | bool | false | +--------------------------+------+---------+ if true, prefer seeding torrents when determining which torrents to give active slots to. If false, give 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. ``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. To be compliant with the Multi-tracker specification, set it to false. .. _prefer_udp_trackers: .. raw:: html +---------------------+------+---------+ | name | type | default | +=====================+======+=========+ | prefer_udp_trackers | bool | true | +---------------------+------+---------+ ``prefer_udp_trackers``: true 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 tracker's tier is respected and there's no preference of one protocol over another. .. _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. .. _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. .. _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``. 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`` controls when a block may be requested twice. If this is ``true``, a block may only be requested twice when there's at 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. .. _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 | +---------------------+------+---------+ Enables incoming and outgoing, TCP and uTP peer connections. ``false`` is disabled and ``true`` is enabled. When outgoing connections are disabled, libtorrent will simply not make outgoing peer connections with the specific transport protocol. Disabled incoming peer connections will simply be rejected. These options only apply to peer connections, not tracker- or any other kinds of connections. .. _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. If false, any existing files will be checked. 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``: When set to true, the client tries to hide its identity to a certain degree. The user-agent will be reset to an empty string (except for private torrents). 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. Turning it off also excludes web seed traffic from other stats and download rate reporting via the libtorrent API. .. _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. 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`` 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`` 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. .. _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. .. _support_share_mode: .. raw:: html +--------------------+------+---------+ | name | type | default | +====================+======+=========+ | support_share_mode | bool | true | +--------------------+------+---------+ if false, prevents libtorrent to advertise share-mode support .. _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. .. _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 info-hashes 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, plain text 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. .. _enable_ip_notifier: .. raw:: html +--------------------+------+---------+ | name | type | default | +====================+======+=========+ | enable_ip_notifier | bool | true | +--------------------+------+---------+ Starts and stops the internal IP table route changes notifier. The current implementation supports multiple platforms, and it is recommended to have it enable, but you may want to disable it if it's supported but unreliable, or if you have a better way to detect the changes. In the later case, you should manually call ``session_handle::reopen_network_sockets`` to ensure network changes are taken in consideration. .. _dht_prefer_verified_node_ids: .. raw:: html +------------------------------+------+---------+ | name | type | default | +==============================+======+=========+ | dht_prefer_verified_node_ids | bool | true | +------------------------------+------+---------+ when this is true, nodes whose IDs are derived from their source IP according to `BEP 42`_ are preferred in the routing table. .. _dht_restrict_routing_ips: .. raw:: html +--------------------------+------+---------+ | name | type | default | +==========================+======+=========+ | dht_restrict_routing_ips | bool | true | +--------------------------+------+---------+ determines if the routing table entries should restrict entries to one per IP. This defaults to true, which helps mitigate some attacks on the DHT. It prevents adding multiple nodes with IPs with a very close CIDR distance. when set, nodes whose IP address that's in the same /24 (or /64 for IPv6) range in the same routing table bucket. This is an attempt to mitigate node ID spoofing attacks also restrict any IP to only have a single entry in the whole routing table .. _dht_restrict_search_ips: .. raw:: html +-------------------------+------+---------+ | name | type | default | +=========================+======+=========+ | dht_restrict_search_ips | bool | true | +-------------------------+------+---------+ determines if DHT searches should prevent adding nodes with IPs with very close CIDR distance. This also defaults to true and helps mitigate certain attacks on the DHT. .. _dht_extended_routing_table: .. raw:: html +----------------------------+------+---------+ | name | type | default | +============================+======+=========+ | dht_extended_routing_table | bool | true | +----------------------------+------+---------+ makes the first buckets in the DHT routing table fit 128, 64, 32 and 16 nodes respectively, as opposed to the standard size of 8. All other buckets have size 8 still. .. _dht_aggressive_lookups: .. raw:: html +------------------------+------+---------+ | name | type | default | +========================+======+=========+ | dht_aggressive_lookups | bool | true | +------------------------+------+---------+ slightly changes the lookup behavior in terms of how many outstanding requests we keep. Instead of having branch factor be a hard limit, we always keep *branch factor* outstanding requests to the closest nodes. i.e. every time we get results back with closer nodes, we query them right away. It lowers the lookup times at the cost of more outstanding queries. .. _dht_privacy_lookups: .. raw:: html +---------------------+------+---------+ | name | type | default | +=====================+======+=========+ | dht_privacy_lookups | bool | false | +---------------------+------+---------+ when set, perform lookups in a way that is slightly more expensive, but which minimizes the amount of information leaked about you. .. _dht_enforce_node_id: .. raw:: html +---------------------+------+---------+ | name | type | default | +=====================+======+=========+ | dht_enforce_node_id | bool | false | +---------------------+------+---------+ when set, node's whose IDs that are not correctly generated based on its external IP are ignored. When a query arrives from such node, an error message is returned with a message saying "invalid node ID". .. _dht_ignore_dark_internet: .. raw:: html +--------------------------+------+---------+ | name | type | default | +==========================+======+=========+ | dht_ignore_dark_internet | bool | true | +--------------------------+------+---------+ ignore DHT messages from parts of the internet we wouldn't expect to see any traffic from .. _dht_read_only: .. raw:: html +---------------+------+---------+ | name | type | default | +===============+======+=========+ | dht_read_only | bool | false | +---------------+------+---------+ when set, the other nodes won't keep this node in their routing tables, it's meant for low-power and/or ephemeral devices that cannot support the DHT, it is also useful for mobile devices which are sensitive to network traffic and battery life. this node no longer responds to 'query' messages, and will place a 'ro' key (value = 1) in the top-level message dictionary of outgoing query messages. .. _piece_extent_affinity: .. raw:: html +-----------------------+------+---------+ | name | type | default | +=======================+======+=========+ | piece_extent_affinity | bool | false | +-----------------------+------+---------+ when this is true, create an affinity for downloading 4 MiB extents of adjacent pieces. This is an attempt to achieve better disk I/O throughput by downloading larger extents of bytes, for torrents with small piece sizes .. _validate_https_trackers: .. raw:: html +-------------------------+------+---------+ | name | type | default | +=========================+======+=========+ | validate_https_trackers | bool | true | +-------------------------+------+---------+ when set to true, the certificate of HTTPS trackers and HTTPS web seeds will be validated against the system's certificate store (as defined by OpenSSL). If the system does not have a certificate store, this option may have to be disabled in order to get trackers and web seeds to work). .. _ssrf_mitigation: .. raw:: html +-----------------+------+---------+ | name | type | default | +=================+======+=========+ | ssrf_mitigation | bool | true | +-----------------+------+---------+ when enabled, tracker and web seed requests are subject to certain restrictions. An HTTP(s) tracker requests to localhost (loopback) must have the request path start with "/announce". This is the conventional bittorrent tracker request. Any other HTTP(S) tracker request to loopback will be rejected. This applies to trackers that redirect to loopback as well. Web seeds that end up on the client's local network (i.e. in a private IP address range) may not include query string arguments. This applies to web seeds redirecting to the local network as well. Web seeds on global IPs (i.e. not local network) may not redirect to a local network address .. _allow_idna: .. raw:: html +------------+------+---------+ | name | type | default | +============+======+=========+ | allow_idna | bool | false | +------------+------+---------+ when disabled, any tracker or web seed with an IDNA hostname (internationalized domain name) is ignored. This is a security precaution to avoid various unicode encoding attacks that might happen at the application level. .. _enable_set_file_valid_data: .. raw:: html +----------------------------+------+---------+ | name | type | default | +============================+======+=========+ | enable_set_file_valid_data | bool | false | +----------------------------+------+---------+ when set to true, enables the attempt to use SetFileValidData() to pre-allocate disk space. This system call will only work when running with Administrator privileges on Windows, and so this setting is only relevant in that scenario. Using SetFileValidData() poses a security risk, as it may reveal previously deleted information from the disk. .. _socks5_udp_send_local_ep: .. raw:: html +--------------------------+------+---------+ | name | type | default | +==========================+======+=========+ | socks5_udp_send_local_ep | bool | false | +--------------------------+------+---------+ When using a SOCKS5 proxy, UDP traffic is routed through the proxy by sending a UDP ASSOCIATE command. If this option is true, the UDP ASSOCIATE command will include the IP address and listen port to the local UDP socket. This indicates to the proxy which source endpoint to expect our packets from. The benefit is that incoming packets can be forwarded correctly, before any outgoing packets are sent. The risk is that if there's a NAT between the client and the proxy, the IP address specified in the protocol may not be valid from the proxy's point of view. .. _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. .. _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 | +----------------------+------+---------+ ``stop_tracker_timeout`` is the number of seconds 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. If the value is set to 0, the connections to trackers with the stopped event are suppressed. .. _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 MiB). .. _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 (16 kiB) 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 | 2000 | +------------------------------+------+---------+ 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. 120 seconds is 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 and http 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 | +--------------------+------+---------+ number of seconds until a new retry of a url-seed takes place. Default retry value for http-seeds that don't provide a valid ``retry-after`` header. .. _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. .. _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 failure counter 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 | 30 | +------------------+------+---------+ ``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. .. _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. The first ``initial_picker_threshold`` 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 | 5 | +-----------------------+------+---------+ 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_suggestions`` which 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 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 16 kiB 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 how many peers to unchoke. The unchoking algorithm for downloading torrents is always "tit-for-tat", i.e. the peers we download the fastest from are unchoked. The options for choking algorithms are defined in the choking_algorithm_t enum. ``seed_choking_algorithm`` controls the seeding unchoke behavior. i.e. How we select which peers to unchoke for seeding torrents. Since a seeding torrent isn't downloading anything, the tit-for-tat mechanism cannot be used. The available options are defined in the seed_choking_algorithm_t enum. .. _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 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 | 0x20 | +----------+------+---------+ ``peer_tos`` determines the TOS byte set in the IP header of every packet sent to peers (including web seeds). ``0x0`` means no marking, ``0x20`` 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: .. 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 | 500 | +----------------------+------+---------+ 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. ``active_tracker_limit`` is the max number of torrents to announce to their trackers. ``active_lsd_limit`` is the max number of torrents to announce to the local network over the local service discovery protocol. 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. .. _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 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 mis-configured 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. .. _max_rejects: .. raw:: html +-------------+------+---------+ | name | type | default | +=============+======+=========+ | max_rejects | int | 50 | +-------------+------+---------+ ``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 | +-------------------------+------+---------+ specifies the buffer sizes set on peer sockets. 0 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. .. _max_peer_recv_buffer_size: .. raw:: html +---------------------------+------+-----------------+ | name | type | default | +===========================+======+=================+ | max_peer_recv_buffer_size | int | 2 * 1024 * 1024 | +---------------------------+------+-----------------+ the max number of bytes a single peer connection's receive buffer is allowed to grow to. .. _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 | 16 | +--------------------+------+---------+ ``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. .. _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. 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. 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. .. _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. 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. 0 means automatic, where libtorrent opens up 20% of your allowed upload slots as optimistic unchoke slots. .. _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. If set to 3, 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`` and ``download_rate_limit`` sets the session-global limits of upload and download rate limits, in bytes per second. By default peers on the local network are not rate limited. A value of 0 means unlimited. For fine grained control over rate limits, including making them apply to local peers, see peer-classes_. .. _dht_upload_rate_limit: .. raw:: html +-----------------------+------+---------+ | name | type | default | +=======================+======+=========+ | dht_upload_rate_limit | int | 8000 | +-----------------------+------+---------+ the number of bytes per second (on average) the DHT is allowed to send. If the incoming requests causes to many bytes to be sent in responses, incoming requests will be dropped until the quota has been replenished. .. _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. Setting this limit to -1 means unlimited, i.e. all peers will always be unchoked. .. _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 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. ``utp_gain_factor`` is the number of bytes the uTP congestion window can increase at the most in one RTT. 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. 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 lost 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``. 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. 5 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 the ``listen_interfaces`` settings is updated. .. _torrent_connect_boost: .. raw:: html +-----------------------+------+---------+ | name | type | default | +=======================+======+=========+ | torrent_connect_boost | int | 30 | +-----------------------+------+---------+ ``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. This may not be set higher than 255. .. _alert_queue_size: .. raw:: html +------------------+------+---------+ | name | type | default | +==================+======+=========+ | alert_queue_size | int | 2000 | +------------------+------+---------+ ``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. Once the alert queue is full, additional alerts will be dropped, and not delivered to the client. Once the client drains the queue, new alerts may be delivered again. In order to know that alerts have been dropped, see session_handle::dropped_alerts(). .. _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 | 2 | +-----------------+------+---------+ ``hashing_threads`` is the number of disk I/O threads to use for piece hash verification. These threads are *in addition* to the regular disk I/O threads specified by settings_pack::aio_threads. The hasher threads do not only compute hashes, but also perform the read from disk. On storage optimal for sequential access, such as hard drives, this setting should probably be set to 1. .. _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: .. raw:: html +-------------+------+---------+ | name | type | default | +=============+======+=========+ | aio_threads | int | 10 | +-------------+------+---------+ for some aio back-ends, ``aio_threads`` specifies the number of io-threads to use. .. _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. Torrents that are considered done will still be allowed to be seeded, they just won't have priority anymore. For more, see queuing_. .. _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 | int | +------------+------+---------+ 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. 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 .. _urlseed_max_request_bytes: .. raw:: html +---------------------------+------+------------------+ | name | type | default | +===========================+======+==================+ | urlseed_max_request_bytes | int | 16 * 1024 * 1024 | +---------------------------+------+------------------+ The maximum request range of an url seed in bytes. This value defines the largest possible sequential web seed request. Lower values are possible but will be ignored if they are lower then piece size. This value should be related to your download speed to prevent libtorrent from creating too many expensive http requests per second. You can select a value as high as you want but keep in mind that libtorrent can't create parallel requests if the first request did already select the whole file. If you combine bittorrent seeds with web seeds and pick strategies like rarest first you may find your web seed requests split into smaller parts because we don't download already picked pieces twice. .. _web_seed_name_lookup_retry: .. raw:: html +----------------------------+------+---------+ | name | type | default | +============================+======+=========+ | web_seed_name_lookup_retry | int | 1800 | +----------------------------+------+---------+ time to wait until a new retry of a web seed name lookup .. _close_file_interval: .. raw:: html +---------------------+------+---------------------+ | name | type | default | +=====================+======+=====================+ | close_file_interval | int | CLOSE_FILE_INTERVAL | +---------------------+------+---------------------+ the number of seconds between closing the file opened the longest ago. 0 means to disable the feature. The purpose of this is to periodically close files to trigger the operating system flushing disk cache. Specifically it has been observed to be required on windows to not have the disk cache grow indefinitely. This defaults to 240 seconds on windows, and disabled on other systems. .. _utp_cwnd_reduce_timer: .. raw:: html +-----------------------+------+---------+ | name | type | default | +=======================+======+=========+ | utp_cwnd_reduce_timer | int | 100 | +-----------------------+------+---------+ When uTP experiences packet loss, it will reduce the congestion window, and not reduce it again for this many milliseconds, even if experiencing another lost packet. .. _max_web_seed_connections: .. raw:: html +--------------------------+------+---------+ | name | type | default | +==========================+======+=========+ | max_web_seed_connections | int | 3 | +--------------------------+------+---------+ the max number of web seeds to have connected per torrent at any given time. .. _resolver_cache_timeout: .. raw:: html +------------------------+------+---------+ | name | type | default | +========================+======+=========+ | resolver_cache_timeout | int | 1200 | +------------------------+------+---------+ the number of seconds before the internal host name resolver considers a cache value timed out, negative values are interpreted as zero. .. _send_not_sent_low_watermark: .. raw:: html +-----------------------------+------+---------+ | name | type | default | +=============================+======+=========+ | send_not_sent_low_watermark | int | 16384 | +-----------------------------+------+---------+ specify the not-sent low watermark for socket send buffers. This corresponds to the, Linux-specific, ``TCP_NOTSENT_LOWAT`` TCP socket option. .. _rate_choker_initial_threshold: .. raw:: html +-------------------------------+------+---------+ | name | type | default | +===============================+======+=========+ | rate_choker_initial_threshold | int | 1024 | +-------------------------------+------+---------+ the rate based choker compares the upload rate to peers against a threshold that increases proportionally by its size for every peer it visits, visiting peers in decreasing upload rate. The number of upload slots is determined by the number of peers whose upload rate exceeds the threshold. This option sets the start value for this threshold. A higher value leads to fewer unchoke slots, a lower value leads to more. .. _upnp_lease_duration: .. raw:: html +---------------------+------+---------+ | name | type | default | +=====================+======+=========+ | upnp_lease_duration | int | 3600 | +---------------------+------+---------+ The expiration time of UPnP port-mappings, specified in seconds. 0 means permanent lease. Some routers do not support expiration times on port-maps (nor correctly returning an error indicating lack of support). In those cases, set this to 0. Otherwise, don't set it any lower than 5 minutes. .. _max_concurrent_http_announces: .. raw:: html +-------------------------------+------+---------+ | name | type | default | +===============================+======+=========+ | max_concurrent_http_announces | int | 50 | +-------------------------------+------+---------+ limits the number of concurrent HTTP tracker announces. Once the limit is hit, tracker requests are queued and issued when an outstanding announce completes. .. _dht_max_peers_reply: .. raw:: html +---------------------+------+---------+ | name | type | default | +=====================+======+=========+ | dht_max_peers_reply | int | 100 | +---------------------+------+---------+ the maximum number of peers to send in a reply to ``get_peers`` .. _dht_search_branching: .. raw:: html +----------------------+------+---------+ | name | type | default | +======================+======+=========+ | dht_search_branching | int | 5 | +----------------------+------+---------+ the number of concurrent search request the node will send when announcing and refreshing the routing table. This parameter is called alpha in the kademlia paper .. _dht_max_fail_count: .. raw:: html +--------------------+------+---------+ | name | type | default | +====================+======+=========+ | dht_max_fail_count | int | 20 | +--------------------+------+---------+ the maximum number of failed tries to contact a node before it is removed from the routing table. If there are known working nodes that are ready to replace a failing node, it will be replaced immediately, this limit is only used to clear out nodes that don't have any node that can replace them. .. _dht_max_torrents: .. raw:: html +------------------+------+---------+ | name | type | default | +==================+======+=========+ | dht_max_torrents | int | 2000 | +------------------+------+---------+ the total number of torrents to track from the DHT. This is simply an upper limit to make sure malicious DHT nodes cannot make us allocate an unbounded amount of memory. .. _dht_max_dht_items: .. raw:: html +-------------------+------+---------+ | name | type | default | +===================+======+=========+ | dht_max_dht_items | int | 700 | +-------------------+------+---------+ max number of items the DHT will store .. _dht_max_peers: .. raw:: html +---------------+------+---------+ | name | type | default | +===============+======+=========+ | dht_max_peers | int | 500 | +---------------+------+---------+ the max number of peers to store per torrent (for the DHT) .. _dht_max_torrent_search_reply: .. raw:: html +------------------------------+------+---------+ | name | type | default | +==============================+======+=========+ | dht_max_torrent_search_reply | int | 20 | +------------------------------+------+---------+ the max number of torrents to return in a torrent search query to the DHT .. _dht_block_timeout: .. raw:: html +-------------------+------+---------+ | name | type | default | +===================+======+=========+ | dht_block_timeout | int | 5 * 60 | +-------------------+------+---------+ the number of seconds a DHT node is banned if it exceeds the rate limit. The rate limit is averaged over 10 seconds to allow for bursts above the limit. .. _dht_block_ratelimit: .. raw:: html +---------------------+------+---------+ | name | type | default | +=====================+======+=========+ | dht_block_ratelimit | int | 5 | +---------------------+------+---------+ the max number of packets per second a DHT node is allowed to send without getting banned. .. _dht_item_lifetime: .. raw:: html +-------------------+------+---------+ | name | type | default | +===================+======+=========+ | dht_item_lifetime | int | 0 | +-------------------+------+---------+ the number of seconds a immutable/mutable item will be expired. default is 0, means never expires. .. _dht_sample_infohashes_interval: .. raw:: html +--------------------------------+------+---------+ | name | type | default | +================================+======+=========+ | dht_sample_infohashes_interval | int | 21600 | +--------------------------------+------+---------+ the info-hashes sample recomputation interval (in seconds). The node will precompute a subset of the tracked info-hashes and return that instead of calculating it upon each request. The permissible range is between 0 and 21600 seconds (inclusive). .. _dht_max_infohashes_sample_count: .. raw:: html +---------------------------------+------+---------+ | name | type | default | +=================================+======+=========+ | dht_max_infohashes_sample_count | int | 20 | +---------------------------------+------+---------+ the maximum number of elements in the sampled subset of info-hashes. If this number is too big, expect the DHT storage implementations to clamp it in order to allow UDP packets go through .. _max_piece_count: .. raw:: html +-----------------+------+----------+ | name | type | default | +=================+======+==========+ | max_piece_count | int | 0x200000 | +-----------------+------+----------+ ``max_piece_count`` is the maximum allowed number of pieces in metadata received via magnet links. Loading large torrents (with more pieces than the default limit) may also require passing in a higher limit to read_resume_data() and torrent_info::parse_info_section(), if those are used. .. _metadata_token_limit: .. raw:: html +----------------------+------+---------+ | name | type | default | +======================+======+=========+ | metadata_token_limit | int | 2500000 | +----------------------+------+---------+ when receiving metadata (torrent file) from peers, this is the max number of bencoded tokens we're willing to parse. This limit is meant to prevent DoS attacks on peers. For very large torrents, this limit may have to be raised. libtorrent-rasterbar-2.0.5/docs/reference-Create_Torrents.html0000664000175000017500000010516214152763504023554 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

This section describes the functions and classes that are used to create torrent files. It is a layered API with low level classes and higher level convenience functions. A torrent is created in 4 steps:

  1. first the files that will be part of the torrent are determined.
  2. the torrent properties are set, such as tracker url, web seeds, DHT nodes etc.
  3. Read through all the files in the torrent, SHA-1 all the data and set the piece hashes.
  4. The torrent is bencoded into a file or buffer.

If there are a lot of files and or deep directory hierarchies to traverse, step one can be time consuming.

Typically step 3 is by far the most time consuming step, since it requires to read all the bytes from all the files in the torrent.

All of these classes and functions are declared by including libtorrent/create_torrent.hpp.

example:

file_storage fs;

// recursively adds files in directories
add_files(fs, "./my_torrent");

create_torrent t(fs);
t.add_tracker("http://my.tracker.com/announce");
t.set_creator("libtorrent example");

// reads the files and calculates the hashes
set_piece_hashes(t, ".");

ofstream out("my_torrent.torrent", std::ios_base::binary);
bencode(std::ostream_iterator<char>(out), t.generate());
[report issue]

create_torrent

Declared in "libtorrent/create_torrent.hpp"

This class holds state for creating a torrent. After having added all information to it, call create_torrent::generate() to generate the torrent. The entry that's returned can then be bencoded into a .torrent file using bencode().

struct create_torrent
{
   explicit create_torrent (file_storage& fs, int piece_size = 0
      , create_flags_t flags = {});
   explicit create_torrent (torrent_info const& ti);
   entry generate () const;
   file_storage const& files () const;
   void set_comment (char const* str);
   void set_creator (char const* str);
   void set_creation_date (std::time_t timestamp);
   void set_hash (piece_index_t index, sha1_hash const& h);
   void set_hash2 (file_index_t file, piece_index_t::diff_type piece, sha256_hash const& h);
   void add_url_seed (string_view url);
   void add_http_seed (string_view url);
   void add_node (std::pair<std::string, int> node);
   void add_tracker (string_view url, int tier = 0);
   void set_root_cert (string_view cert);
   bool priv () const;
   void set_priv (bool p);
   bool is_v1_only () const;
   bool is_v2_only () const;
   int num_pieces () const;
   int piece_size (piece_index_t i) const;
   int piece_length () const;
   void add_collection (string_view c);
   void add_similar_torrent (sha1_hash ih);

   static constexpr create_flags_t modification_time  = 2_bit;
   static constexpr create_flags_t symlinks  = 3_bit;
   static constexpr create_flags_t v2_only  = 5_bit;
   static constexpr create_flags_t v1_only  = 6_bit;
   static constexpr create_flags_t canonical_files  = 7_bit;
};
[report issue]

create_torrent()

explicit create_torrent (file_storage& fs, int piece_size = 0
      , create_flags_t flags = {});
explicit create_torrent (torrent_info const& ti);

The piece_size is the size of each piece in bytes. It must be a power of 2 and a minimum of 16 kiB. If a piece size of 0 is specified, a piece_size will be set automatically.

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 the info dictionary will be used by create_torrent::generate(). This means that none of the member functions of create_torrent that affects the content of the info dictionary (such as set_hash()), will have any affect.

The flags arguments specifies options for the torrent creation. It can be any combination of the flags defined by create_flags_t.

[report issue]

generate()

entry generate () const;

This function will generate the .torrent file as a bencode tree. In order to generate the flat file, use the bencode() function.

It may be useful to add custom entries to the torrent file before bencoding it and saving it to disk.

Whether the resulting torrent object is v1, v2 or hybrid depends on whether any of the v1_only or v2_only flags were set on the constructor. If neither were set, the resulting torrent depends on which hashes were set. If both v1 and v2 hashes were set, a hybrid torrent is created.

Any failure will cause this function to throw system_error, with an appropriate error message. These are the reasons this call may throw:

  • the file storage has 0 files
  • the total size of the file storage is 0 bytes (i.e. it only has empty files)
  • not all v1 hashes (set_hash()) and not all v2 hashes (set_hash2()) were set
  • for v2 torrents, you may not have a directory with the same name as a file. If that's encountered in the file storage, generate() fails.
[report issue]

files()

file_storage const& files () const;

returns an immutable reference to the file_storage used to create the torrent from.

[report issue]

set_comment()

void set_comment (char const* str);

Sets the comment for the torrent. The string str should be utf-8 encoded. The comment in a torrent file is optional.

[report issue]

set_creator()

void set_creator (char const* str);

Sets the creator of the torrent. The string str should be utf-8 encoded. This is optional.

[report issue]

set_creation_date()

void set_creation_date (std::time_t timestamp);

sets the "creation time" field. Defaults to the system clock at the time of construction of the create_torrent object. The timestamp is specified in seconds, posix time. If the creation date is set to 0, the "creation date" field will be omitted from the generated torrent.

[report issue]

set_hash()

void set_hash (piece_index_t index, sha1_hash const& h);

This sets the SHA-1 hash for the specified piece (index). You are required to set the hash for every piece in the torrent before generating it. If you have the files on disk, you can use the high level convenience function to do this. See set_piece_hashes(). A SHA-1 hash of all zeros is internally used to indicate a hash that has not been set. Setting such hash will not be considered set when calling generate(). This function will throw std::system_error if it is called on an object constructed with the v2_only flag.

[report issue]

set_hash2()

void set_hash2 (file_index_t file, piece_index_t::diff_type piece, sha256_hash const& h);

sets the bittorrent v2 hash for file file of the piece piece. piece is relative to the first piece of the file, starting at 0. The first piece in the file can be computed with file_storage::file_index_at_piece(). The hash, h, is the root of the merkle tree formed by the piece's 16 kiB blocks. Note that piece sizes must be powers-of-2, so all per-piece merkle trees are complete. A SHA-256 hash of all zeros is internally used to indicate a hash that has not been set. Setting such hash will not be considered set when calling generate(). This function will throw std::system_error if it is called on an object constructed with the v1_only flag.

[report issue]

add_http_seed() add_url_seed()

void add_url_seed (string_view url);
void add_http_seed (string_view url);

This adds a url seed to the torrent. You can have any number of url seeds. For a single file torrent, this should be an HTTP url, pointing to a file with identical content as the file of the torrent. For a multi-file torrent, it should point to a directory containing a directory with the same name as this torrent, and all the files of the torrent in it.

The second function, add_http_seed() adds an HTTP seed instead.

[report issue]

add_node()

void add_node (std::pair<std::string, int> node);

This adds a DHT node to the torrent. This especially useful if you're creating a tracker less torrent. It can be used by clients to bootstrap their DHT node from. The node is a hostname and a port number where there is a DHT node running. You can have any number of DHT nodes in a torrent.

[report issue]

add_tracker()

void add_tracker (string_view url, int tier = 0);

Adds a tracker to the torrent. This is not strictly required, but most torrents use a tracker as their main source of peers. The url should be an http:// or udp:// url to a machine running a bittorrent tracker that accepts announces for this torrent's info-hash. The tier is the fallback priority of the tracker. All trackers with tier 0 are tried first (in any order). If all fail, trackers with tier 1 are tried. If all of those fail, trackers with tier 2 are tried, and so on.

[report issue]

set_root_cert()

void set_root_cert (string_view cert);

This function sets an X.509 certificate in PEM format to the torrent. This makes the torrent an SSL torrent. An SSL torrent requires that each peer has a valid certificate signed by this root certificate. For SSL torrents, all peers are connecting over SSL connections. For more information, see the section on ssl torrents.

The string is not the path to the cert, it's the actual content of the certificate.

[report issue]

set_priv() priv()

bool priv () const;
void set_priv (bool p);

Sets and queries the private flag of the torrent. Torrents with the private flag set ask the client to not use any other sources than the tracker for peers, and to not use DHT to advertise itself publicly, only the tracker.

[report issue]

num_pieces()

int num_pieces () const;

returns the number of pieces in the associated file_storage object.

[report issue]

piece_length() piece_size()

int piece_size (piece_index_t i) const;
int piece_length () const;

piece_length() returns the piece size of all pieces but the last one. piece_size() returns the size of the specified piece. these functions are just forwarding to the associated file_storage.

[report issue]

add_collection() add_similar_torrent()

void add_collection (string_view c);
void add_similar_torrent (sha1_hash ih);

Add similar torrents (by info-hash) or collections of similar torrents. Similar torrents are expected to share some files with this torrent. Torrents sharing a collection name with this torrent are also expected to share files with this torrent. A torrent may have more than one collection and more than one similar torrents. For more information, see BEP 38.

[report issue]
modification_time
This will include the file modification time as part of the torrent. This is not enabled by default, as it might cause problems when you create a torrent from separate files with the same content, hoping to yield the same info-hash. If the files have different modification times, with this option enabled, you would get different info-hashes for the files.
[report issue]
symlinks
If this flag is set, files that are symlinks get a symlink attribute set on them and their data will not be included in the torrent. This is useful if you need to reconstruct a file hierarchy which contains symlinks.
[report issue]
v2_only
Do not generate v1 metadata. The resulting torrent will only be usable by clients which support v2. This requires setting all v2 hashes, with set_hash2() before calling generate(). Setting v1 hashes (with set_hash()) is an error with this flag set.
[report issue]
v1_only
do not generate v2 metadata or enforce v2 alignment and padding rules this is mainly for tests, not recommended for production use. This requires setting all v1 hashes, with set_hash(), before calling generate(). Setting v2 hashes (with set_hash2()) is an error with this flag set.
[report issue]
canonical_files
This flag only affects v1-only torrents, and is only relevant together with the v1_only_flag. This flag will force the same file order and padding as a v2 (or hybrid) torrent would have. It has the effect of ordering files and inserting pad files to align them with piece boundaries.
[report issue]

add_files()

Declared in "libtorrent/create_torrent.hpp"

void add_files (file_storage& fs, std::string const& file
   , create_flags_t flags = {});
void add_files (file_storage& fs, std::string const& file
   , std::function<bool(std::string)> p, create_flags_t flags = {});

Adds the file specified by path to the file_storage object. In case path refers to a directory, files will be added recursively from the directory.

If specified, the predicate p is called once for every file and directory that is encountered. Files for which p returns true are added, and directories for which p returns true are traversed. p must have the following signature:

bool Pred(std::string const& p);

The path that is passed in to the predicate is the full path of the file or directory. If no predicate is specified, all files are added, and all directories are traversed.

The ".." directory is never traversed.

The flags argument should be the same as the flags passed to the create_torrent constructor.

[report issue]

set_piece_hashes()

Declared in "libtorrent/create_torrent.hpp"

inline void set_piece_hashes (create_torrent& t, std::string const& p, error_code& ec);
void set_piece_hashes (create_torrent& t, std::string const& p
   , std::function<void(piece_index_t)> const& f, error_code& ec);
inline void set_piece_hashes (create_torrent& t, std::string const& p);
inline void set_piece_hashes (create_torrent& t, std::string const& p
   , settings_interface const& settings
   , std::function<void(piece_index_t)> const& f);
void set_piece_hashes (create_torrent& t, std::string const& p
   , settings_interface const& settings, disk_io_constructor_type disk_io
   , std::function<void(piece_index_t)> const& f, error_code& ec);
inline void set_piece_hashes (create_torrent& t, std::string const& p
   , std::function<void(piece_index_t)> const& f);
void set_piece_hashes (create_torrent& t, std::string const& p
   , settings_interface const& settings
   , std::function<void(piece_index_t)> const& f, error_code& ec);

This function will assume that the files added to the torrent file exists at path p, read those files and hash the content and set the hashes in the create_torrent object. The optional function f is called in between every hash that is set. f must have the following signature:

void Fun(piece_index_t);

The overloads taking a settings_pack may be used to configure the underlying disk access. Such as settings_pack::aio_threads.

The overloads that don't take an error_code& may throw an exception in case of a file error, the other overloads sets the error code to reflect the error, if any.

libtorrent-rasterbar-2.0.5/docs/reference-Trackers.html0000664000175000017500000004004414152763504022224 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

announce_infohash

Declared in "libtorrent/announce_entry.hpp"

struct announce_infohash
{
   std::string message;
   error_code last_error;
   int scrape_incomplete  = -1;
   int scrape_complete  = -1;
   int scrape_downloaded  = -1;
   std::uint8_t fails : 7;
   bool updating : 1;
   bool start_sent : 1;
   bool complete_sent : 1;
};
[report issue]
message
if this tracker has returned an error or warning message that message is stored here
[report issue]
last_error
if this tracker failed the last time it was contacted this error code specifies what error occurred
[report issue]
scrape_incomplete scrape_complete scrape_downloaded
if this tracker has returned scrape data, these fields are filled in with valid numbers. Otherwise they are set to -1. incomplete counts the number of current downloaders. complete counts the number of current peers completed the download, or "seeds". downloaded is the cumulative number of completed downloads.
[report issue]
fails
the number of times in a row we have failed to announce to this tracker.
[report issue]
updating
true while we're waiting for a response from the tracker.
[report issue]
start_sent
set to true when we get a valid response from an announce with event=started. If it is set, we won't send start in the subsequent announces.
[report issue]
complete_sent
set to true when we send a event=completed.
[report issue]

announce_endpoint

Declared in "libtorrent/announce_entry.hpp"

announces are sent to each tracker using every listen socket this class holds information about one listen socket for one tracker

struct announce_endpoint
{
   announce_endpoint ();

   tcp::endpoint local_endpoint;
   aux::array<announce_infohash, num_protocols, protocol_version> info_hashes;
   bool enabled  = true;
};
[report issue]
local_endpoint
the local endpoint of the listen interface associated with this endpoint
[report issue]
info_hashes
info_hashes[0] is the v1 info hash (SHA1) info_hashes[1] is the v2 info hash (truncated SHA-256)
[report issue]
enabled
set to false to not announce from this endpoint
[report issue]

announce_entry

Declared in "libtorrent/announce_entry.hpp"

this class holds information about one bittorrent tracker, as it relates to a specific torrent.

struct announce_entry
{
   announce_entry ();
   announce_entry& operator= (announce_entry const&) &;
   ~announce_entry ();
   explicit announce_entry (string_view u);
   announce_entry (announce_entry const&);

   enum tracker_source
   {
      source_torrent,
      source_client,
      source_magnet_link,
      source_tex,
   };

   std::string url;
   std::string trackerid;
   std::vector<announce_endpoint> endpoints;
   std::uint8_t tier  = 0;
   std::uint8_t fail_limit  = 0;
   std::uint8_t source:4;
   bool verified:1;
};
[report issue]

announce_entry() operator=() ~announce_entry()

announce_entry ();
announce_entry& operator= (announce_entry const&) &;
~announce_entry ();
explicit announce_entry (string_view u);
announce_entry (announce_entry const&);

constructs a tracker announce entry with u as the URL.

[report issue]

enum tracker_source

Declared in "libtorrent/announce_entry.hpp"

name value description
source_torrent 1 the tracker was part of the .torrent file
source_client 2 the tracker was added programmatically via the add_tracker() function
source_magnet_link 4 the tracker was part of a magnet link
source_tex 8 the tracker was received from the swarm via tracker exchange
[report issue]
url
tracker URL as it appeared in the torrent file
[report issue]
trackerid
the current &trackerid= argument passed to the tracker. this is optional and is normally empty (in which case no trackerid is sent).
[report issue]
endpoints
each local listen socket (endpoint) will announce to the tracker. This list contains state per endpoint.
[report issue]
tier
the tier this tracker belongs to
[report issue]
fail_limit
the max number of failures to announce to this tracker in a row, before this tracker is not used anymore. 0 means unlimited
[report issue]
source
a bitmask specifying which sources we got this tracker from.
[report issue]
verified
set to true the first time we receive a valid response from this tracker.
libtorrent-rasterbar-2.0.5/docs/reference-Error_Codes.html0000664000175000017500000013627314152763504022666 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

storage_error

Declared in "libtorrent/error_code.hpp"

used by storage to return errors also includes which underlying file the error happened on

struct storage_error
{
   explicit operator bool () const;
   void file (file_index_t f);
   file_index_t file () const;

   error_code ec;
   operation_t operation;
};
[report issue]

bool()

explicit operator bool () const;

explicitly converts to true if this object represents an error, and false if it does not.

[report issue]

file()

void file (file_index_t f);
file_index_t file () const;

set and query the index (in the torrent) of the file this error occurred on. This may also have special values defined in torrent_status.

[report issue]
ec
the error that occurred
[report issue]
operation
A code from operation_t enum, indicating what kind of operation failed.
[report issue]

libtorrent_category()

Declared in "libtorrent/error_code.hpp"

boost::system::error_category& libtorrent_category ();

return the instance of the libtorrent_error_category which maps libtorrent error codes to human readable error messages.

[report issue]

http_category()

Declared in "libtorrent/error_code.hpp"

boost::system::error_category& http_category ();

returns the error_category for HTTP errors

[report issue]

pcp_category()

Declared in "libtorrent/natpmp.hpp"

boost::system::error_category& pcp_category ();
[report issue]

upnp_category()

Declared in "libtorrent/upnp.hpp"

boost::system::error_category& upnp_category ();

the boost.system error category for UPnP errors

[report issue]

gzip_category()

Declared in "libtorrent/gzip.hpp"

boost::system::error_category& gzip_category ();

get the error_category for zip errors

[report issue]

bdecode_category()

Declared in "libtorrent/bdecode.hpp"

boost::system::error_category& bdecode_category ();
[report issue]

socks_category()

Declared in "libtorrent/socks5_stream.hpp"

boost::system::error_category& socks_category ();

returns the error_category for SOCKS5 errors

[report issue]

i2p_category()

Declared in "libtorrent/i2p_stream.hpp"

boost::system::error_category& i2p_category ();

returns the error category for I2P errors

[report issue]

enum error_code_enum

Declared in "libtorrent/error_code.hpp"

name value description
no_error 0 Not an error
file_collision 1 Two torrents has files which end up overwriting each other
failed_hash_check 2 A piece did not match its piece hash
torrent_is_no_dict 3 The .torrent file does not contain a bencoded dictionary at its top level
torrent_missing_info 4 The .torrent file does not have an info dictionary
torrent_info_no_dict 5 The .torrent file's info entry is not a dictionary
torrent_missing_piece_length 6 The .torrent file does not have a piece length entry
torrent_missing_name 7 The .torrent file does not have a name entry
torrent_invalid_name 8 The .torrent file's name entry is invalid
torrent_invalid_length 9 The length of a file, or of the whole .torrent file is invalid. Either negative or not an integer
torrent_file_parse_failed 10 Failed to parse a file entry in the .torrent
torrent_missing_pieces 11 The pieces field is missing or invalid in the .torrent file
torrent_invalid_hashes 12 The pieces string has incorrect length
too_many_pieces_in_torrent 13 The .torrent file has more pieces than is supported by libtorrent
invalid_swarm_metadata 14 The metadata (.torrent file) that was received from the swarm matched the info-hash, but failed to be parsed
invalid_bencoding 15 The file or buffer is not correctly bencoded
no_files_in_torrent 16 The .torrent file does not contain any files
invalid_escaped_string 17 The string was not properly url-encoded as expected
session_is_closing 18 Operation is not permitted since the session is shutting down
duplicate_torrent 19 There's already a torrent with that info-hash added to the session
invalid_torrent_handle 20 The supplied torrent_handle is not referring to a valid torrent
invalid_entry_type 21 The type requested from the entry did not match its type
missing_info_hash_in_uri 22 The specified URI does not contain a valid info-hash
file_too_short 23 One of the files in the torrent was unexpectedly small. This might be caused by files being changed by an external process
unsupported_url_protocol 24 The URL used an unknown protocol. Currently http and https (if built with openssl support) are recognized. For trackers udp is recognized as well.
url_parse_error 25 The URL did not conform to URL syntax and failed to be parsed
peer_sent_empty_piece 26 The peer sent a piece message of length 0
parse_failed 27 A bencoded structure was corrupt and failed to be parsed
invalid_file_tag 28 The fast resume file was missing or had an invalid file version tag
missing_info_hash 29 The fast resume file was missing or had an invalid info-hash
mismatching_info_hash 30 The info-hash did not match the torrent
invalid_hostname 31 The URL contained an invalid hostname
invalid_port 32 The URL had an invalid port
port_blocked 33 The port is blocked by the port-filter, and prevented the connection
expected_close_bracket_in_address 34 The IPv6 address was expected to end with "]"
destructing_torrent 35 The torrent is being destructed, preventing the operation to succeed
timed_out 36 The connection timed out
upload_upload_connection 37 The peer is upload only, and we are upload only. There's no point in keeping the connection
uninteresting_upload_peer 38 The peer is upload only, and we're not interested in it. There's no point in keeping the connection
invalid_info_hash 39 The peer sent an unknown info-hash
torrent_paused 40 The torrent is paused, preventing the operation from succeeding
invalid_have 41 The peer sent an invalid have message, either wrong size or referring to a piece that doesn't exist in the torrent
invalid_bitfield_size 42 The bitfield message had the incorrect size
too_many_requests_when_choked 43 The peer kept requesting pieces after it was choked, possible abuse attempt.
invalid_piece 44 The peer sent a piece message that does not correspond to a piece request sent by the client
no_memory 45 memory allocation failed
torrent_aborted 46 The torrent is aborted, preventing the operation to succeed
self_connection 47 The peer is a connection to ourself, no point in keeping it
invalid_piece_size 48 The peer sent a piece message with invalid size, either negative or greater than one block
timed_out_no_interest 49 The peer has not been interesting or interested in us for too long, no point in keeping it around
timed_out_inactivity 50 The peer has not said anything in a long time, possibly dead
timed_out_no_handshake 51 The peer did not send a handshake within a reasonable amount of time, it might not be a bittorrent peer
timed_out_no_request 52 The peer has been unchoked for too long without requesting any data. It might be lying about its interest in us
invalid_choke 53 The peer sent an invalid choke message
invalid_unchoke 54 The peer send an invalid unchoke message
invalid_interested 55 The peer sent an invalid interested message
invalid_not_interested 56 The peer sent an invalid not-interested message
invalid_request 57 The peer sent an invalid piece request message
invalid_hash_list 58 The peer sent an invalid hash-list message (this is part of the merkle-torrent extension)
invalid_hash_piece 59 The peer sent an invalid hash-piece message (this is part of the merkle-torrent extension)
invalid_cancel 60 The peer sent an invalid cancel message
invalid_dht_port 61 The peer sent an invalid DHT port-message
invalid_suggest 62 The peer sent an invalid suggest piece-message
invalid_have_all 63 The peer sent an invalid have all-message
invalid_have_none 64 The peer sent an invalid have none-message
invalid_reject 65 The peer sent an invalid reject message
invalid_allow_fast 66 The peer sent an invalid allow fast-message
invalid_extended 67 The peer sent an invalid extension message ID
invalid_message 68 The peer sent an invalid message ID
sync_hash_not_found 69 The synchronization hash was not found in the encrypted handshake
invalid_encryption_constant 70 The encryption constant in the handshake is invalid
no_plaintext_mode 71 The peer does not support plain text, which is the selected mode
no_rc4_mode 72 The peer does not support RC4, which is the selected mode
unsupported_encryption_mode 73 The peer does not support any of the encryption modes that the client supports
unsupported_encryption_mode_selected 74 The peer selected an encryption mode that the client did not advertise and does not support
invalid_pad_size 75 The pad size used in the encryption handshake is of invalid size
invalid_encrypt_handshake 76 The encryption handshake is invalid
no_incoming_encrypted 77 The client is set to not support incoming encrypted connections and this is an encrypted connection
no_incoming_regular 78 The client is set to not support incoming regular bittorrent connections, and this is a regular connection
duplicate_peer_id 79 The client is already connected to this peer-ID
torrent_removed 80 Torrent was removed
packet_too_large 81 The packet size exceeded the upper sanity check-limit
reserved 82  
http_error 83 The web server responded with an error
missing_location 84 The web server response is missing a location header
invalid_redirection 85 The web seed redirected to a path that no longer matches the .torrent directory structure
redirecting 86 The connection was closed because it redirected to a different URL
invalid_range 87 The HTTP range header is invalid
no_content_length 88 The HTTP response did not have a content length
banned_by_ip_filter 89 The IP is blocked by the IP filter
too_many_connections 90 At the connection limit
peer_banned 91 The peer is marked as banned
stopping_torrent 92 The torrent is stopping, causing the operation to fail
too_many_corrupt_pieces 93 The peer has sent too many corrupt pieces and is banned
torrent_not_ready 94 The torrent is not ready to receive peers
peer_not_constructed 95 The peer is not completely constructed yet
session_closing 96 The session is closing, causing the operation to fail
optimistic_disconnect 97 The peer was disconnected in order to leave room for a potentially better peer
torrent_finished 98 The torrent is finished
no_router 99 No UPnP router found
metadata_too_large 100 The metadata message says the metadata exceeds the limit
invalid_metadata_request 101 The peer sent an invalid metadata request message
invalid_metadata_size 102 The peer advertised an invalid metadata size
invalid_metadata_offset 103 The peer sent a message with an invalid metadata offset
invalid_metadata_message 104 The peer sent an invalid metadata message
pex_message_too_large 105 The peer sent a peer exchange message that was too large
invalid_pex_message 106 The peer sent an invalid peer exchange message
invalid_lt_tracker_message 107 The peer sent an invalid tracker exchange message
too_frequent_pex 108 The peer sent an pex messages too often. This is a possible attempt of and attack
no_metadata 109 The operation failed because it requires the torrent to have the metadata (.torrent file) and it doesn't have it yet. This happens for magnet links before they have downloaded the metadata, and also torrents added by URL.
invalid_dont_have 110 The peer sent an invalid dont_have message. The don't have message is an extension to allow peers to advertise that the no longer has a piece they previously had.
requires_ssl_connection 111 The peer tried to connect to an SSL torrent without connecting over SSL.
invalid_ssl_cert 112 The peer tried to connect to a torrent with a certificate for a different torrent.
not_an_ssl_torrent 113 the torrent is not an SSL torrent, and the operation requires an SSL torrent
banned_by_port_filter 114 peer was banned because its listen port is within a banned port range, as specified by the port_filter.
invalid_session_handle 115 The session_handle is not referring to a valid session_impl
invalid_listen_socket 116 the listen socket associated with this request was closed
invalid_hash_request 117  
invalid_hashes 118  
invalid_hash_reject 119  
deprecated_120 120  
deprecated_121 121  
deprecated_122 122  
deprecated_123 123  
deprecated_124 124  
missing_file_sizes 130 The resume data file is missing the file sizes entry
no_files_in_resume_data 131 The resume data file file sizes entry is empty
missing_pieces 132 The resume data file is missing the pieces and slots entry
mismatching_number_of_files 133 The number of files in the resume data does not match the number of files in the torrent
mismatching_file_size 134 One of the files on disk has a different size than in the fast resume file
mismatching_file_timestamp 135 One of the files on disk has a different timestamp than in the fast resume file
not_a_dictionary 136 The resume data file is not a dictionary
invalid_blocks_per_piece 137 The blocks per piece entry is invalid in the resume data file
missing_slots 138 The resume file is missing the slots entry, which is required for torrents with compact allocation. DEPRECATED
too_many_slots 139 The resume file contains more slots than the torrent
invalid_slot_list 140 The slot entry is invalid in the resume data
invalid_piece_index 141 One index in the slot list is invalid
pieces_need_reorder 142 The pieces on disk needs to be re-ordered for the specified allocation mode. This happens if you specify sparse allocation and the files on disk are using compact storage. The pieces needs to be moved to their right position. DEPRECATED
resume_data_not_modified 143 this error is returned when asking to save resume data and specifying the flag to only save when there's anything new to save (torrent_handle::only_if_modified) and there wasn't anything changed.
http_parse_error 150 The HTTP header was not correctly formatted
http_missing_location 151 The HTTP response was in the 300-399 range but lacked a location header
http_failed_decompress 152 The HTTP response was encoded with gzip or deflate but decompressing it failed
no_i2p_router 160 The URL specified an i2p address, but no i2p router is configured
no_i2p_endpoint 161 i2p acceptor is not available yet, can't announce without endpoint
scrape_not_available 170 The tracker URL doesn't support transforming it into a scrape URL. i.e. it doesn't contain "announce.
invalid_tracker_response 171 invalid tracker response
invalid_peer_dict 172 invalid peer dictionary entry. Not a dictionary
tracker_failure 173 tracker sent a failure message
invalid_files_entry 174 missing or invalid files entry
invalid_hash_entry 175 missing or invalid hash entry
invalid_peers_entry 176 missing or invalid peers and peers6 entry
invalid_tracker_response_length 177 UDP tracker response packet has invalid size
invalid_tracker_transaction_id 178 invalid transaction id in UDP tracker response
invalid_tracker_action 179 invalid action field in UDP tracker response
announce_skipped 180 skipped announce (because it's assumed to be unreachable over the given source network interface)
no_entropy 200 random number generation failed
ssrf_mitigation 201 blocked by SSRF mitigation
blocked_by_idna 202 blocked because IDNA host names are banned
torrent_unknown_version 210 the torrent file has an unknown meta version
torrent_missing_file_tree 211 the v2 torrent file has no file tree
torrent_missing_meta_version 212 the torrent contains v2 keys but does not specify meta version 2
torrent_inconsistent_files 213 the v1 and v2 file metadata does not match
torrent_missing_piece_layer 214 one or more files are missing piece layer hashes
torrent_invalid_piece_layer 215 a piece layer has the wrong size or failed hash check
torrent_missing_pieces_root 216 a v2 file entry has no root hash
torrent_inconsistent_hashes 217 the v1 and v2 hashes do not describe the same data
torrent_invalid_pad_file 218 a file in the v2 metadata has the pad attribute set
error_code_max 219 the number of error codes
[report issue]

enum http_errors

Declared in "libtorrent/error_code.hpp"

name value description
cont 100  
ok 200  
created 201  
accepted 202  
no_content 204  
multiple_choices 300  
moved_permanently 301  
moved_temporarily 302  
not_modified 304  
bad_request 400  
unauthorized 401  
forbidden 403  
not_found 404  
internal_server_error 500  
not_implemented 501  
bad_gateway 502  
service_unavailable 503  
[report issue]

enum pcp_errors

Declared in "libtorrent/natpmp.hpp"

name value description
pcp_success 0  
pcp_unsupp_version 1  
pcp_not_authorized 2  
pcp_malformed_request 3  
pcp_unsupp_opcode 4  
pcp_unsupp_option 5  
pcp_malformed_option 6  
pcp_network_failure 7  
pcp_no_resources 8  
pcp_unsupp_protocol 9  
pcp_user_ex_quota 10  
pcp_cannot_provide_external 11  
pcp_address_mismatch 12  
pcp_excessive_remote_peers 13  
[report issue]

enum error_code_enum

Declared in "libtorrent/upnp.hpp"

name value description
no_error 0 No error
invalid_argument 402 One of the arguments in the request is invalid
action_failed 501 The request failed
value_not_in_array 714 The specified value does not exist in the array
source_ip_cannot_be_wildcarded 715 The source IP address cannot be wild-carded, but must be fully specified
external_port_cannot_be_wildcarded 716 The external port cannot be a wildcard, but must be specified
port_mapping_conflict 718 The port mapping entry specified conflicts with a mapping assigned previously to another client
internal_port_must_match_external 724 Internal and external port value must be the same
only_permanent_leases_supported 725 The NAT implementation only supports permanent lease times on port mappings
remote_host_must_be_wildcard 726 RemoteHost must be a wildcard and cannot be a specific IP address or DNS name
external_port_must_be_wildcard 727 ExternalPort must be a wildcard and cannot be a specific port
[report issue]

enum error_code_enum

Declared in "libtorrent/gzip.hpp"

name value description
no_error 0 Not an error
invalid_gzip_header 1 the supplied gzip buffer has invalid header
inflated_data_too_large 2 the gzip buffer would inflate to more bytes than the specified maximum size, and was rejected.
data_did_not_terminate 3 available inflate data did not terminate
space_exhausted 4 output space exhausted before completing inflate
invalid_block_type 5 invalid block type (type == 3)
invalid_stored_block_length 6 stored block length did not match one's complement
too_many_length_or_distance_codes 7 dynamic block code description: too many length or distance codes
code_lengths_codes_incomplete 8 dynamic block code description: code lengths codes incomplete
repeat_lengths_with_no_first_length 9 dynamic block code description: repeat lengths with no first length
repeat_more_than_specified_lengths 10 dynamic block code description: repeat more than specified lengths
invalid_literal_length_code_lengths 11 dynamic block code description: invalid literal/length code lengths
invalid_distance_code_lengths 12 dynamic block code description: invalid distance code lengths
invalid_literal_code_in_block 13 invalid literal/length or distance code in fixed or dynamic block
distance_too_far_back_in_block 14 distance is too far back in fixed or dynamic block
unknown_gzip_error 15 an unknown error occurred during gzip inflation
error_code_max 16 the number of error codes
[report issue]

enum error_code_enum

Declared in "libtorrent/bdecode.hpp"

name value description
no_error 0 Not an error
expected_digit 1 expected digit in bencoded string
expected_colon 2 expected colon in bencoded string
unexpected_eof 3 unexpected end of file in bencoded string
expected_value 4 expected value (list, dict, int or string) in bencoded string
depth_exceeded 5 bencoded recursion depth limit exceeded
limit_exceeded 6 bencoded item count limit exceeded
overflow 7 integer overflow
error_code_max 8 the number of error codes
[report issue]

enum socks_error_code

Declared in "libtorrent/socks5_stream.hpp"

name value description
no_error 0  
unsupported_version 1  
unsupported_authentication_method 2  
unsupported_authentication_version 3  
authentication_error 4  
username_required 5  
general_failure 6  
command_not_supported 7  
no_identd 8  
identd_error 9  
num_errors 10  
[report issue]

enum i2p_error_code

Declared in "libtorrent/i2p_stream.hpp"

name value description
no_error 0  
parse_failed 1  
cant_reach_peer 2  
i2p_error 3  
invalid_key 4  
invalid_id 5  
timeout 6  
key_not_found 7  
duplicated_id 8  
num_errors 9  
libtorrent-rasterbar-2.0.5/docs/building.rst0000664000175000017500000012534014152763504020156 0ustar arvidarvid.. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none downloading and building ------------------------ To download the latest version of libtorrent, clone the `github repository`__. __ https://github.com/arvidn/libtorrent The build systems supported "out of the box" in libtorrent are boost-build cmake. 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_* and BOOST_* macros are defined when you link against libtorrent as when you build it. The simplest way to see the full list of macros defined is to build libtorrent with ``-n -a`` switches added to ``b2`` command line, which output all compiler switches. Boost-build supports propagating configuration options to dependencies. building from git ----------------- To build libtorrent from git you need to clone the libtorrent repository from github. Note that the git repository depends on other git repositories via submodules, which also need to be initialized and updated. If you downloaded a release `tarball`__, you can skip this section. __ https://github.com/arvidn/libtorrent/releases/latest :: git clone --recurse-submodules https://github.com/arvidn/libtorrent.git building with boost build ------------------------- 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). __ https://boost.org/more/separate_compilation.html 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). build commands ~~~~~~~~~~~~~~ Linux:: sudo apt install libboost-tools-dev libboost-dev libboost-system-dev echo "using gcc ;" >>~/user-config.jam b2 crypto=openssl cxxstd=14 release Mac OS:: brew install boost-build boost openssl@1.1 echo "using darwin ;" >>~/user-config.jam b2 crypto=openssl cxxstd=14 release Windows (assuming the boost package is saved to ``C:\boost_1_69_0``):: set BOOST_ROOT=c:\boost_1_69_0 set BOOST_BUILD_PATH=%BOOST_ROOT%\tools\build (cd %BOOST_ROOT% && .\bootstrap.bat) echo using msvc ; >>%HOMEDRIVE%%HOMEPATH%\user-config.jam %BOOST_ROOT%\b2.exe --hash cxxstd=14 release docker file ~~~~~~~~~~~ A Docker file is available that's used to build and run the fuzzers, at OSS-Fuzz__. __ https://github.com/google/oss-fuzz/tree/master/projects/libtorrent Step 1: Download boost ~~~~~~~~~~~~~~~~~~~~~~ If you want to build against boost installed on your system, you can skip this strep. Just make sure to have `BOOST_ROOT` unset for the `b2` invocation. You'll find boost here__. __ https://www.boost.org/users/download/#live 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_69_0``. You'll need at least version 1.66 of the boost library in order to build libtorrent. Step 2: Setup BBv2 ~~~~~~~~~~~~~~~~~~ If you have installed ``boost-build`` via a package manager, you can skip this step. If not, you need to build boost build from the boost source package. First you need to build ``b2``. You do this by opening a terminal (In windows, run ``cmd``). Change directory to ``c:\boost_1_68_0\tools\build``. Then run the script called ``bootstrap.bat`` or ``bootstrap.sh`` on a Unix system. This will build ``b2`` and place it in a directory ``src/engine/bin.``. Copy the ``b2.exe`` (or ``b2`` 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 ``b2`` installed. ``b2`` can be considered an interpreter that the boost-build system is implemented on. So boost-build uses ``b2``. 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 ``b2`` 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_68_0\tools\build``. To set an environment variable in windows, type for example:: set BOOST_BUILD_PATH=c:\boost_1_68_0\tools\build\v2 In a terminal window. The last thing to do is to configure which compiler(s) to use. Create a file ``user-config.jam`` in your home directory. 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 14.2 (2019), just add a line:: using msvc : 14.2 ; If you use GCC, add the line:: using gcc ; If you have more than one version of GCC installed, you can add the command line used to invoke g++ after the version number, like this:: using gcc : 6.0 : g++-6 ; using gcc : 7.0 : g++-7 ; Another toolset worth mentioning is the ``darwin`` toolset (for macOS). From Tiger (10.4) macOS 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 `boost-build documentation`_. .. _`boost-build documentation`: https://boostorg.github.io/build/ Step 3: Building libtorrent ~~~~~~~~~~~~~~~~~~~~~~~~~~~ When building libtorrent, boost is either picked up from system installed locations or from a boost source package, if the ``BOOST_ROOT`` environment variable is set pointing to one. If you're building boost from source, set ``BOOST_ROOT`` to your boost directory, e.g. ``c:\boost_1_68_0``. Then the only thing left is simply to invoke ``b2``. If you want to specify a specific toolset to use (compiler) you can just add that to the command line. For example:: b2 msvc-14.2 b2 gcc-7.0 b2 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. In this case it's critical that you build your project with the same version of C++ and the same build flags as the system libraries were built with. .. note:: Also see the `Visual Studio versions`_. .. _`Visual Studio versions`: https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering 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 command line, either to ``shared`` or ``static``. Most operating systems will only allow linking shared against the runtime, but on windows you can do both. Example:: b2 msvc-14.2 variant=release link=static runtime-link=static debug-symbols=on .. 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 --hash on the ``b2`` 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:: When building on Solaris, you may have to specify ``stdlib=sun-stlport`` on the b2 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 ``b2`` from there. To build and run the tests, go to the test directory and run ``b2``. 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_68_0``). In the windows environment, they should have the typical windows format (``c:/boost_1_68_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`_. Jamfile will look in some default directory for the openssl headers and libraries. On macOS, it will look for the homebrew openssl package. On Windows, it will look in ``C:\OpenSSL-Win32``, or ``C:\OpenSSL-Win64`` if compiling in 64-bit. To customize the library path and include path for openssl, set the features ``openssl-lib`` and ``openssl-include`` respectively. The option to link with wolfSSL (by setting the ``crypto`` feature to ``wolfssl``), requires a custom build of wolfSSL using the following options: ``--enable-asio --enable-sni --enable-nginx``. To customize the library path and include path for wolfSSL, set the features ``wolfssl-lib`` and ``wolfssl-include`` respectively. To disable linking against any SSL library, set the ``crypto`` build feature to ``built-in``. This will use an embedded version if SHA-1. Build features ~~~~~~~~~~~~~~ +--------------------------+----------------------------------------------------+ | boost build feature | values | +==========================+====================================================+ | ``cxxstd`` | The version of C++ to use, e.g. ``11``, ``14``, | | | ``17``, ``20``. The C++ version *may* affect the | | | libtorrent ABI (the ambition is to avoid that). | +--------------------------+----------------------------------------------------+ | ``boost-link`` | * ``static`` - links statically against the boost | | | libraries. | | | * ``shared`` - links dynamically against the boost | | | libraries. | +--------------------------+----------------------------------------------------+ | ``openssl-lib`` | can be used to specify the directory where libssl | | | and libcrypto are installed (or the windows | | | counterparts). | +--------------------------+----------------------------------------------------+ | ``openssl-include`` | can be used to specify the include directory where | | | the openssl headers are installed. | +--------------------------+----------------------------------------------------+ | ``logging`` | * ``off`` - logging alerts disabled. The | | | reason to disable logging is to keep the binary | | | size low where that matters. | | | * ``on`` - default. logging alerts available, | | | still need to be enabled by the alert mask. | +--------------------------+----------------------------------------------------+ | ``lto`` | * ``on`` - enables link time optimization, also | | | known as whole program optimization. | +--------------------------+----------------------------------------------------+ | ``alert-msg`` | * ``on`` - (default) return human readable | | | messages from the ``alert::message()`` call. | | | * ``off`` - Always return empty strings from | | | ``alert::message()``, and save binary size. | +--------------------------+----------------------------------------------------+ | ``dht`` | * ``on`` - build with DHT support | | | * ``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).(default) | | | * ``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`` | * ``openssl`` - (default) links against openssl | | | and libcrypto to use for SHA-1 hashing. | | | This also enables HTTPS-tracker support and | | | support for bittorrent over SSL. | | | * ``built-in`` - (default) uses built-in SHA-1 | | | implementation. In macOS/iOS it uses | | | CommonCrypto SHA-1 implementation. | | | * ``wolfssl`` - links against wolfssl to use it | | | for SHA-1 hashing and HTTPS tracker support. | | | * ``libcrypto`` - links against libcrypto | | | to use the SHA-1 implementation. (no SSL support)| | | * ``gcrypt`` - links against libgcrypt | | | to use the SHA-1 implementation. (no SSL support)| +--------------------------+----------------------------------------------------+ | ``openssl-version`` | This can be used on windows to link against the | | | special OpenSSL library names used on windows | | | prior to OpenSSL 1.1. | | | | | | * ``1.1`` - link against the normal openssl | | | library name. (default) | | | * ``pre1.1`` - link against the old windows names | | | (i.e. ``ssleay32`` and ``libeay32``. | +--------------------------+----------------------------------------------------+ | ``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. | +--------------------------+----------------------------------------------------+ | ``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. | +--------------------------+----------------------------------------------------+ | ``i2p`` | * ``on`` - default. 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. | +--------------------------+----------------------------------------------------+ | ``utp-log`` | * ``off`` - default. Do not print verbose uTP | | | log. | | | * ``on`` - Print verbose uTP log, used to debug | | | the uTP implementation. | +--------------------------+----------------------------------------------------+ | ``picker-debugging`` | * ``off`` - default. no extra invariant checks in | | | piece picker. | | | * ``on`` - include additional invariant checks in | | | piece picker. Used for testing the piece picker. | +--------------------------+----------------------------------------------------+ | ``extensions`` | * ``on`` - enable extensions to the bittorrent | | | protocol.(default) | | | * ``off`` - disable bittorrent extensions. | +--------------------------+----------------------------------------------------+ | ``streaming`` | * ``on`` - enable streaming functionality. i.e. | | | ``set_piece_deadline()``. (default) | | | * ``off`` - disable streaming functionality. | +--------------------------+----------------------------------------------------+ | ``super-seeding`` | * ``on`` - enable super seeding feature. (default) | | | * ``off`` - disable super seeding feature | +--------------------------+----------------------------------------------------+ | ``share-mode`` | * ``on`` - enable share-mode feature. (default) | | | * ``off`` - disable share-mode feature | +--------------------------+----------------------------------------------------+ | ``predictive-pieces`` | * ``on`` - enable predictive piece announce | | | feature. i.e. | | | settings_pack::predictive_piece_announce | | | (default) | | | * ``off`` - disable feature. | +--------------------------+----------------------------------------------------+ | ``fpic`` | * ``off`` - default. Build without specifying | | | ``-fPIC``. | | | * ``on`` - Force build with ``-fPIC`` (useful for | | | building a static library to be linked into a | | | shared library). | +--------------------------+----------------------------------------------------+ | ``mmap-disk-io`` | * ``on`` - default. Enable mmap disk storage (if | | | available. | | | * ``off`` - disable mmap storage, and fall back to | | | single-threaded, portable file operations. | +--------------------------+----------------------------------------------------+ The ``variant`` feature is *implicit*, which means you don't need to specify the name of the feature, just the value. 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 built-in features`__. __ https://boostorg.github.io/build/manual/develop/index.html __ https://boostorg.github.io/build/manual/develop/index.html#bbv2.overview.builtins.features Step 4: Installing libtorrent ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To install libtorrent run ``b2`` with the ``install`` target:: b2 install --prefix=/usr/local Change the value of the ``--prefix`` argument to install it in a different location. Custom build flags ~~~~~~~~~~~~~~~~~~ Custom build flags can be passed to the command line via the ``cflags``, ``cxxflags`` and ``linkflags`` features. When specifying custom flags, make sure to build everything from scratch, to not accidentally mix incompatible flags. Example:: b2 cxxflags=-msse4.1 Custom flags can also be configured in the toolset, in ``~/user-config.jam``, ``Jamroot.jam`` or ``project-config.jam``. Example:: using gcc : sse41 : g++ : -msse4.1 ; Cross compiling ~~~~~~~~~~~~~~~ To cross compile libtorrent, configure a new toolset for ``b2`` to use. Toolsets can be configured in ``~/user-config.jam``, ``Jamroot.jam`` or ``project-config.jam``. The last two live in the libtorrent root directory. A toolset configuration is in this form: .. parsed-literal:: using *toolset* : *version* : *command-line* : *features* ; Toolset is essentially the family of compiler you're setting up, choose from `this list`__. __ https://boostorg.github.io/build/manual/master/index.html#bbv2.reference.tools.compilers Perhaps the most common ones would be ``gcc``, ``clang``, ``msvc`` and ``darwin`` (Apple's version of clang). The version can be left empty to be auto configured, or a custom name can be used to identify this toolset. The *command-line* is what to execute to run the compiler. This is also an opportunity to insert a call to ``ccache`` for example. *features* are boost-build features. Typical features to set here are ````, ```` and ````. For the ``gcc`` toolset, the ```` can be set to specify which tool to use to create a static library/archive. This is especially handy when cross compiling. Here's an example toolset for cross compiling for ARM Linux:: using gcc : arm : arm-linux-gnueabihf-g++ : arm-linux-gnueabihf-ar ; To build using this toolset, specify ``gcc-arm`` as the toolset on the ``b2`` command line. For example:: b2 toolset=gcc-arm building with cmake ------------------- First of all, you need to install ``cmake``. Additionally you need a build system to actually schedule builds, for example ``ninja``. Step 1: Generating the build system ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Create a build directory for out-of-source build inside the libtorrent root directory:: mkdir build and ``cd`` there:: cd build Run ``cmake`` in the build directory, like this:: cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=14 -G Ninja .. The ``CMAKE_CXX_STANDARD`` has to be at least 14, but you may want to raise it to ``17`` if your project use a newer version of the C++ standard. .. warning:: The detection of boost sometimes fail in subtle ways. If you have the ``BOOST_ROOT`` environment variable set, it may find the pre-built system libraries, but use the header files from your source package. To avoid this, invoke ``cmake`` with ``BOOST_ROOT`` set to an empty string: ``BOOST_ROOT="" cmake ...``. Other build options are: +-----------------------+---------------------------------------------------+ | ``BUILD_SHARED_LIBS`` | Defaults ``ON``. Builds libtorrent as a shared | | | library. | +-----------------------+---------------------------------------------------+ | ``static_runtime`` | Defaults ``OFF``. Link libtorrent statically | | | against the runtime libraries. | +-----------------------+---------------------------------------------------+ | ``build_tests`` | Defaults ``OFF``. Also build the libtorrent | | | tests. | +-----------------------+---------------------------------------------------+ | ``build_examples`` | Defaults ``OFF``. Also build the examples in the | | | examples directory. | +-----------------------+---------------------------------------------------+ | ``build_tools`` | Defaults ``OFF``. Also build the tools in the | | | tools directory. | +-----------------------+---------------------------------------------------+ | ``python-bindings`` | Defaults ``OFF``. Also build the python bindings | | | in bindings/python directory. | +-----------------------+---------------------------------------------------+ | ``encryption`` | Defaults ``ON``. Support trackers and bittorrent | | | over TLS, and obfuscated bittorrent connections. | +-----------------------+---------------------------------------------------+ Options are set on the ``cmake`` command line with the ``-D`` option or later on using ``ccmake`` or ``cmake-gui`` applications. ``cmake`` run outputs a summary of all available options and their current values. Step 2: Building libtorrent ~~~~~~~~~~~~~~~~~~~~~~~~~~~ In the terminal, run:: ninja If you enabled test in the configuration step, to run them, run:: ctest building with VCPKG ------------------- You can download and install libtorrent using the vcpkg_ dependency manager:: git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh ./vcpkg integrate install ./vcpkg install libtorrent .. _vcpkg: https://github.com/Microsoft/vcpkg/ The libtorrent port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please `create an issue or pull request`__ on the vcpkg repository. __ https://github.com/Microsoft/vcpkg 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. Make sure to define the same macros in your own code that compiles and links with libtorrent. +----------------------------------------+-------------------------------------------------+ | macro | description | +========================================+=================================================+ | ``NDEBUG`` | If 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_LOGGING`` | This 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_DISABLE_ALERT_MSG`` | Human readable messages returned from the alert | | | ``message()`` member functions will return | | | empty strings. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_DISABLE_SUPERSEEDING`` | This macro will disable support for super | | | seeding. The settings will exist, but will not | | | have an effect, when this macro is defined. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_DISABLE_SHARE_MODE`` | This macro will disable support for share-mode. | | | i.e. the mode to maximize upload/download | | | ratio for a torrent. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_DISABLE_MUTABLE_TORRENTS`` | Disables mutable torrent support (`BEP 38`_) | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_DISABLE_STREAMING`` | Disables set_piece_deadline() and associated | | | functionality. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_DISABLE_PREDICTIVE_PIECES`` | Disables | | | settings_pack::predictive_piece_announce | | | feature. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_LINKING_SHARED`` | If 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_SHARED`` | If 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_DHT`` | If this is defined, the support for trackerless | | | torrents will be disabled. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_DISABLE_ENCRYPTION`` | This 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_LIBCRYPTO`` or | | | ``TORRENT_USE_LIBGCRYPT`` must be defined. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_DISABLE_EXTENSIONS`` | When defined, libtorrent plugin support is | | | disabled along with support for the extension | | | handshake (BEP 10). | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_USE_INVARIANT_CHECKS`` | If defined to non-zero, this will enable | | | internal invariant checks in libtorrent. | | | The invariant checks can sometimes | | | be quite expensive, they typically don't scale | | | very well. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_EXPENSIVE_INVARIANT_CHECKS`` | This will enable extra expensive invariant | | | checks. Useful for finding particular bugs | | | or for running before releases. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_NO_DEPRECATE`` | This will exclude all deprecated functions from | | | the header files and source files. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_PRODUCTION_ASSERTS`` | Define to either 0 or 1. Enables assert logging | | | in release builds. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_USE_ASSERTS`` | Define as 0 to disable asserts unconditionally. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_USE_SYSTEM_ASSERTS`` | Uses the libc assert macro rather then the | | | custom one. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_HAVE_MMAP`` | Define as 0 to disable mmap support. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_USE_OPENSSL`` | Link against ``libssl`` for SSL support. Must | | | be combined with ``TORRENT_USE_LIBCRYPTO`` | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_USE_GNUTLS`` | Link against ``libgnutls`` for SSL support. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_USE_LIBCRYPTO`` | Link against ``libcrypto`` for SHA-1 support | | | and other hashing algorithms. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_USE_LIBGCRYPT`` | Link against ``libgcrypt`` for SHA-1 support | | | and other hashing algorithms. | +----------------------------------------+-------------------------------------------------+ | ``TORRENT_SSL_PEERS`` | Define to enable support for SSL torrents, | | | peers are connected over authenticated SSL | | | streams. | +----------------------------------------+-------------------------------------------------+ .. _`BEP 38`: https://www.bittorrent.org/beps/bep_0038.html 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. list of macros -------------- The following is a list of defines that libtorrent is built with: ``BOOST_ALL_NO_LIB``, ``BOOST_ASIO_ENABLE_CANCELIO``, ``BOOST_ASIO_HAS_STD_CHRONO``, ``BOOST_MULTI_INDEX_DISABLE_SERIALIZATION``, ``BOOST_NO_DEPRECATED``, ``BOOST_SYSTEM_NO_DEPRECATED`` Make sure you define the same at compile time for your code to avoid any runtime errors and other issues. These might change in the future, so it's always best to verify these every time you upgrade to a new version of libtorrent. The simplest way to see the full list of macros defined is to build libtorrent with ``-n -a`` switches added to ``b2`` command line:: b2 -n -a toolset=msvc-14.2 link=static runtime-link=static boost-link=static variant=release This will output all compiler switches, including defines (such as ``-DBOOST_ASIO_ENABLE_CANCELIO``). libtorrent-rasterbar-2.0.5/docs/dht_sec.html0000664000175000017500000003501414152763504020124 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

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 estimated 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 remain 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.

img/ip_id_v4.png img/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 requester'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. produces well distributed results
  3. 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).
  4. CRC32C (Castagnoli) is supported in hardware by SSE 4.2, which can significantly speed up computation

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.

img/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 extremely 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 integer) 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.

img/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.

libtorrent-rasterbar-2.0.5/docs/header.rst0000664000175000017500000000002014152763504017574 0ustar arvidarvid:Version: 2.0.5 libtorrent-rasterbar-2.0.5/docs/troubleshooting.html0000664000175000017500000000571314152763504021745 0ustar arvidarvid libtorrent
libtorrent logo

libtorrent manual

Version: 2.0.5

The following troubleshooting chart may help in finding out why torrents fail to download. It is not complete, please submit suggestions via pull requests at https://github.com/arvidn/libtorrent or to the mailing list. Ideally in the form of patches against docs/troubleshooting.dot.

img/troubleshooting_thumb.png
libtorrent-rasterbar-2.0.5/docs/udp_tracker_protocol.html0000664000175000017500000003765714152763504022756 0ustar arvidarvid libtorrent
libtorrent logo

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 descriptions 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:

size name description
int64_t connection_id Must be initialized to 0x41727101980 in network byte order. This will identify the protocol.
int32_t action 0 for a connection request
int32_t transaction_id Randomized by client.

Server replies with packet:

size name description
int32_t action Describes the type of packet, in this case it should be 0, for connect. If 3 (for error) see errors.
int32_t transaction_id Must match the transaction_id sent from the client.
int64_t connection_id A 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:

size name description
int64_t connection_id The connection id acquired from establishing the connection.
int32_t action Action. in this case, 1 for announce. See actions.
int32_t transaction_id Randomized by client.
int8_t[20] info_hash The info-hash of the torrent you want announce yourself in.
int8_t[20] peer_id Your peer id.
int64_t downloaded The number of byte you've downloaded in this session.
int64_t left The number of bytes you have left to download until you're finished.
int64_t uploaded The number of bytes you have uploaded in this session.
int32_t event

The event, one of

  • none = 0
  • completed = 1
  • started = 2
  • stopped = 3
uint32_t ip Your ip address. Set to 0 if you want the tracker to use the sender of this UDP packet.
uint32_t key A unique key that is randomized by the client.
int32_t num_want The maximum number of peers you want in the reply. Use -1 for default.
uint16_t port The port you're listening on.
uint16_t extensions See extensions

Server replies with packet:

size name description
int32_t action The action this is a reply to. Should in this case be 1 for announce. If 3 (for error) see errors. See actions.
int32_t transaction_id Must match the transaction_id sent in the announce request.
int32_t interval the number of seconds you should wait until re-announcing yourself.
int32_t leechers The number of peers in the swarm that has not finished downloading.
int32_t seeders The 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:

size name description
int32_t ip The ip of a peer in the swarm.
uint16_t port The peer's listen port.

scraping

Client sends packet:

size name description
int64_t connection_id The connection id retrieved from the establishing of the connection.
int32_t action The action, in this case, 2 for scrape. See actions.
int32_t transaction_id Randomized by client.

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

size name description
int8_t[20] info_hash The info hash that is to be scraped.

Server replies with packet:

size name description
int32_t action The action, should in this case be 2 for scrape. If 3 (for error) see errors.
int32_t transaction_id Must 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.

size name description
int32_t complete The current number of connected seeds.
int32_t downloaded The number of times this torrent has been downloaded.
int32_t incomplete The current number of connected leechers.

errors

In case of a tracker error,

server replies packet:

size name description
int32_t action The action, in this case 3, for error. See actions.
int32_t transaction_id Must match the transaction_id sent from the client.
int8_t[] error_string The 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:

size name description
int8_t username_length The number of characters in the username.
int8_t[] username The username, the number of characters as specified in the previous field.
uint8_t[8] passwd_hash sha1(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:

size name description
int8_t request length The number of bytes in the request string.
int8_t[] request string The 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

libtorrent-rasterbar-2.0.5/docs/reference-Custom_Storage.html0000664000175000017500000033577614152763504023427 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

The disk I/O can be customized in libtorrent. In previous versions, the customization was at the level of each torrent. Now, the customization point is at the session level. All torrents added to a session will use the same disk I/O subsystem, as determined by the disk_io_constructor (in session_params).

This allows the disk subsystem to also customize threading and disk job management.

To customize the disk subsystem, implement disk_interface and provide a factory function to the session constructor (via session_params).

Example use:

struct temp_storage
{
  explicit temp_storage(lt::file_storage const& fs) : m_files(fs) {}

  lt::span<char const> readv(lt::peer_request const r, lt::storage_error& ec) const
  {
    auto const i = m_file_data.find(r.piece);
    if (i == m_file_data.end())
    {
      ec.operation = lt::operation_t::file_read;
      ec.ec = boost::asio::error::eof;
      return {};
    }
    if (int(i->second.size()) <= r.start)
    {
      ec.operation = lt::operation_t::file_read;
      ec.ec = boost::asio::error::eof;
      return {};
    }
    return { i->second.data() + r.start, std::min(r.length, int(i->second.size()) - r.start) };
  }
  void writev(lt::span<char const> const b, lt::piece_index_t const piece, int const offset)
  {
    auto& data = m_file_data[piece];
    if (data.empty())
    {
      // allocate the whole piece, otherwise we'll invalidate the pointers
      // we have returned back to libtorrent
      int const size = piece_size(piece);
      data.resize(std::size_t(size));
    }
    TORRENT_ASSERT(offset + b.size() <= int(data.size()));
    std::memcpy(data.data() + offset, b.data(), std::size_t(b.size()));
  }
  lt::sha1_hash hash(lt::piece_index_t const piece
    , lt::span<lt::sha256_hash> const block_hashes, lt::storage_error& ec) const
  {
    auto const i = m_file_data.find(piece);
    if (i == m_file_data.end())
    {
      ec.operation = lt::operation_t::file_read;
      ec.ec = boost::asio::error::eof;
      return {};
    }
    if (!block_hashes.empty())
    {
      int const piece_size2 = m_files.piece_size2(piece);
      int const blocks_in_piece2 = m_files.blocks_in_piece2(piece);
      char const* buf = i->second.data();
      std::int64_t offset = 0;
      for (int k = 0; k < blocks_in_piece2; ++k)
      {
        lt::hasher256 h2;
        std::ptrdiff_t const len2 = std::min(lt::default_block_size, int(piece_size2 - offset));
        h2.update({ buf, len2 });
        buf += len2;
        offset += len2;
        block_hashes[k] = h2.final();
      }
    }
    return lt::hasher(i->second).final();
  }
  lt::sha256_hash hash2(lt::piece_index_t const piece, int const offset, lt::storage_error& ec)
  {
    auto const i = m_file_data.find(piece);
    if (i == m_file_data.end())
    {
      ec.operation = lt::operation_t::file_read;
      ec.ec = boost::asio::error::eof;
      return {};
    }

    int const piece_size = m_files.piece_size2(piece);

    std::ptrdiff_t const len = std::min(lt::default_block_size, piece_size - offset);

    lt::span<char const> b = {i->second.data() + offset, len};
    return lt::hasher256(b).final();
  }

private:
  int piece_size(lt::piece_index_t piece) const
  {
    int const num_pieces = static_cast<int>((m_files.total_size() + m_files.piece_length() - 1) / m_files.piece_length());
    return static_cast<int>(piece) < num_pieces - 1
      ? m_files.piece_length() : static_cast<int>(m_files.total_size() - std::int64_t(num_pieces - 1) * m_files.piece_length());
  }

  lt::file_storage const& m_files;
  std::map<lt::piece_index_t, std::vector<char>> m_file_data;
};

lt::storage_index_t pop(std::vector<lt::storage_index_t>& q)
{
  TORRENT_ASSERT(!q.empty());
  lt::storage_index_t const ret = q.back();
  q.pop_back();
  return ret;
}

struct temp_disk_io final : lt::disk_interface
  , lt::buffer_allocator_interface
{
  explicit temp_disk_io(lt::io_context& ioc): m_ioc(ioc) {}

  void settings_updated() override {}

  lt::storage_holder new_torrent(lt::storage_params const& params
    , std::shared_ptr<void> const&) override
  {
    lt::storage_index_t const idx = m_free_slots.empty()
      ? m_torrents.end_index()
      : pop(m_free_slots);
    auto storage = std::make_unique<temp_storage>(params.files);
    if (idx == m_torrents.end_index()) m_torrents.emplace_back(std::move(storage));
    else m_torrents[idx] = std::move(storage);
    return lt::storage_holder(idx, *this);
  }

  void remove_torrent(lt::storage_index_t const idx) override
  {
    m_torrents[idx].reset();
    m_free_slots.push_back(idx);
  }

  void abort(bool) override {}

  void async_read(lt::storage_index_t storage, lt::peer_request const& r
    , std::function<void(lt::disk_buffer_holder block, lt::storage_error const& se)> handler
    , lt::disk_job_flags_t) override
  {
    // this buffer is owned by the storage. It will remain valid for as
    // long as the torrent remains in the session. We don't need any lifetime
    // management of it.
    lt::storage_error error;
    lt::span<char const> b = m_torrents[storage]->readv(r, error);

    post(m_ioc, [handler, error, b, this]
      { handler(lt::disk_buffer_holder(*this, const_cast<char*>(b.data()), int(b.size())), error); });
  }

  bool async_write(lt::storage_index_t storage, lt::peer_request const& r
    , char const* buf, std::shared_ptr<lt::disk_observer>
    , std::function<void(lt::storage_error const&)> handler
    , lt::disk_job_flags_t) override
  {
    lt::span<char const> const b = { buf, r.length };

    m_torrents[storage]->writev(b, r.piece, r.start);

    post(m_ioc, [=]{ handler(lt::storage_error()); });
    return false;
  }

  void async_hash(lt::storage_index_t storage, lt::piece_index_t const piece
    , lt::span<lt::sha256_hash> block_hashes, lt::disk_job_flags_t
    , std::function<void(lt::piece_index_t, lt::sha1_hash const&, lt::storage_error const&)> handler) override
  {
    lt::storage_error error;
    lt::sha1_hash const hash = m_torrents[storage]->hash(piece, block_hashes, error);
    post(m_ioc, [=]{ handler(piece, hash, error); });
  }

  void async_hash2(lt::storage_index_t storage, lt::piece_index_t const piece
    , int const offset, lt::disk_job_flags_t
    , std::function<void(lt::piece_index_t, lt::sha256_hash const&, lt::storage_error const&)> handler) override
  {
    lt::storage_error error;
    lt::sha256_hash const hash = m_torrents[storage]->hash2(piece, offset, error);
    post(m_ioc, [=]{ handler(piece, hash, error); });
  }

  void async_move_storage(lt::storage_index_t, std::string p, lt::move_flags_t
    , std::function<void(lt::status_t, std::string const&, lt::storage_error const&)> handler) override
  {
    post(m_ioc, [=]{
      handler(lt::status_t::fatal_disk_error, p
        , lt::storage_error(lt::error_code(boost::system::errc::operation_not_supported, lt::system_category())));
    });
  }

  void async_release_files(lt::storage_index_t, std::function<void()>) override {}

  void async_delete_files(lt::storage_index_t, lt::remove_flags_t
    , std::function<void(lt::storage_error const&)> handler) override
  {
    post(m_ioc, [=]{ handler(lt::storage_error()); });
  }

  void async_check_files(lt::storage_index_t
    , lt::add_torrent_params const*
    , lt::aux::vector<std::string, lt::file_index_t>
    , std::function<void(lt::status_t, lt::storage_error const&)> handler) override
  {
    post(m_ioc, [=]{ handler(lt::status_t::no_error, lt::storage_error()); });
  }

  void async_rename_file(lt::storage_index_t
    , lt::file_index_t const idx
    , std::string const name
    , std::function<void(std::string const&, lt::file_index_t, lt::storage_error const&)> handler) override
  {
    post(m_ioc, [=]{ handler(name, idx, lt::storage_error()); });
  }

  void async_stop_torrent(lt::storage_index_t, std::function<void()> handler) override
  {
    post(m_ioc, handler);
  }

  void async_set_file_priority(lt::storage_index_t
    , lt::aux::vector<lt::download_priority_t, lt::file_index_t> prio
    , std::function<void(lt::storage_error const&
      , lt::aux::vector<lt::download_priority_t, lt::file_index_t>)> handler) override
  {
    post(m_ioc, [=]{
      handler(lt::storage_error(lt::error_code(
        boost::system::errc::operation_not_supported, lt::system_category())), std::move(prio));
    });
  }

  void async_clear_piece(lt::storage_index_t, lt::piece_index_t index
    , std::function<void(lt::piece_index_t)> handler) override
  {
    post(m_ioc, [=]{ handler(index); });
  }

  // implements buffer_allocator_interface
  void free_disk_buffer(char*) override
  {
    // never free any buffer. We only return buffers owned by the storage
    // object
  }

  void update_stats_counters(lt::counters&) const override {}

  std::vector<lt::open_file_state> get_status(lt::storage_index_t) const override
  { return {}; }

  void submit_jobs() override {}

private:

  lt::aux::vector<std::shared_ptr<temp_storage>, lt::storage_index_t> m_torrents;

  // slots that are unused in the m_torrents vector
  std::vector<lt::storage_index_t> m_free_slots;

  // callbacks are posted on this
  lt::io_context& m_ioc;
};

std::unique_ptr<lt::disk_interface> temp_disk_constructor(
  lt::io_context& ioc, lt::settings_interface const&, lt::counters&)
{
  return std::make_unique<temp_disk_io>(ioc);
}
[report issue]

settings_interface

Declared in "libtorrent/settings_pack.hpp"

the common interface to settings_pack and the internal representation of settings.

struct settings_interface
{
   virtual void set_bool (int name, bool val) = 0;
   virtual void set_str (int name, std::string val) = 0;
   virtual bool has_val (int name) const = 0;
   virtual void set_int (int name, int val) = 0;
   virtual std::string const& get_str (int name) const = 0;
   virtual int get_int (int name) const = 0;
   virtual bool get_bool (int name) const = 0;
};
[report issue]

open_file_state

Declared in "libtorrent/disk_interface.hpp"

this contains information about a file that's currently open by the libtorrent disk I/O subsystem. It's associated with a single torrent.

struct open_file_state
{
   file_index_t file_index;
   file_open_mode_t open_mode;
   time_point last_use;
};
[report issue]
file_index
the index of the file this entry refers to into the file_storage file list of this torrent. This starts indexing at 0.
[report issue]
open_mode

open_mode is a bitmask of the file flags this file is currently opened with. For possible flags, see file_open_mode_t.

Note that the read/write mode is not a bitmask. The two least significant bits are used to represent the read/write mode. Those bits can be masked out using the rw_mask constant.

[report issue]
last_use
a (high precision) timestamp of when the file was last used.
[report issue]

disk_interface

Declared in "libtorrent/disk_interface.hpp"

The disk_interface is the customization point for disk I/O in libtorrent. implement this interface and provide a factory function to the session constructor use custom disk I/O. All functions on the disk subsystem (implementing disk_interface) are called from within libtorrent's network thread. For disk I/O to be performed in a separate thread, the disk subsystem has to manage that itself.

Although the functions are called async_*, they do not technically have to be asynchronous, but they support being asynchronous, by expecting the result passed back into a callback. The callbacks must be posted back onto the network thread via the io_context object passed into the constructor. The callbacks will be run in the network thread.

struct disk_interface
{
   virtual storage_holder new_torrent (storage_params const& p
      , std::shared_ptr<void> const& torrent) = 0;
   virtual void remove_torrent (storage_index_t) = 0;
   virtual bool async_write (storage_index_t storage, peer_request const& r
      , char const* buf, std::shared_ptr<disk_observer> o
      , std::function<void(storage_error const&)> handler
      , disk_job_flags_t flags = {}) = 0;
   virtual void async_read (storage_index_t storage, peer_request const& r
      , std::function<void(disk_buffer_holder, storage_error const&)> handler
      , disk_job_flags_t flags = {}) = 0;
   virtual void async_hash (storage_index_t storage, piece_index_t piece, span<sha256_hash> v2
      , disk_job_flags_t flags
      , std::function<void(piece_index_t, sha1_hash const&, storage_error const&)> handler) = 0;
   virtual void async_hash2 (storage_index_t storage, piece_index_t piece, int offset, disk_job_flags_t flags
      , std::function<void(piece_index_t, sha256_hash const&, storage_error const&)> handler) = 0;
   virtual void async_move_storage (storage_index_t storage, std::string p, move_flags_t flags
      , std::function<void(status_t, std::string const&, storage_error const&)> handler) = 0;
   virtual void async_release_files (storage_index_t storage
      , std::function<void()> handler = std::function<void()>()) = 0;
   virtual void async_check_files (storage_index_t storage
      , add_torrent_params const* resume_data
      , aux::vector<std::string, file_index_t> links
      , std::function<void(status_t, storage_error const&)> handler) = 0;
   virtual void async_stop_torrent (storage_index_t storage
      , std::function<void()> handler = std::function<void()>()) = 0;
   virtual void async_rename_file (storage_index_t storage
      , file_index_t index, std::string name
      , std::function<void(std::string const&, file_index_t, storage_error const&)> handler) = 0;
   virtual void async_delete_files (storage_index_t storage, remove_flags_t options
      , std::function<void(storage_error const&)> handler) = 0;
   virtual void async_set_file_priority (storage_index_t storage
      , aux::vector<download_priority_t, file_index_t> prio
      , std::function<void(storage_error const&
      , aux::vector<download_priority_t, file_index_t>)> handler) = 0;
   virtual void async_clear_piece (storage_index_t storage, piece_index_t index
      , std::function<void(piece_index_t)> handler) = 0;
   virtual void update_stats_counters (counters& c) const = 0;
   virtual std::vector<open_file_state> get_status (storage_index_t) const = 0;
   virtual void abort (bool wait) = 0;
   virtual void submit_jobs () = 0;
   virtual void settings_updated () = 0;

   static constexpr disk_job_flags_t force_copy  = 0_bit;
   static constexpr disk_job_flags_t sequential_access  = 3_bit;
   static constexpr disk_job_flags_t volatile_read  = 4_bit;
   static constexpr disk_job_flags_t v1_hash  = 5_bit;
};
[report issue]

new_torrent()

virtual storage_holder new_torrent (storage_params const& p
      , std::shared_ptr<void> const& torrent) = 0;

this is called when a new torrent is added. The shared_ptr can be used to hold the internal torrent object alive as long as there are outstanding disk operations on the storage. The returned storage_holder is an owning reference to the underlying storage that was just created. It is fundamentally a storage_index_t

[report issue]

remove_torrent()

virtual void remove_torrent (storage_index_t) = 0;

remove the storage with the specified index. This is not expected to delete any files from disk, just to clean up any resources associated with the specified storage.

[report issue]

async_read() async_write()

virtual bool async_write (storage_index_t storage, peer_request const& r
      , char const* buf, std::shared_ptr<disk_observer> o
      , std::function<void(storage_error const&)> handler
      , disk_job_flags_t flags = {}) = 0;
virtual void async_read (storage_index_t storage, peer_request const& r
      , std::function<void(disk_buffer_holder, storage_error const&)> handler
      , disk_job_flags_t flags = {}) = 0;

perform a read or write operation from/to the specified storage index and the specified request. When the operation completes, call handler possibly with a disk_buffer_holder, holding the buffer with the result. Flags may be set to affect the read operation. See disk_job_flags_t.

The disk_observer is a callback to indicate that the store buffer/disk write queue is below the watermark to let peers start writing buffers to disk again. When async_write() returns true, indicating the write queue is full, the peer will stop further writes and wait for the passed-in disk_observer to be notified before resuming.

Note that for async_read, the peer_request (r) is not necessarily aligned to blocks (but it is most of the time). However, all writes (passed to async_write) are guaranteed to be block aligned.

[report issue]

async_hash()

virtual void async_hash (storage_index_t storage, piece_index_t piece, span<sha256_hash> v2
      , disk_job_flags_t flags
      , std::function<void(piece_index_t, sha1_hash const&, storage_error const&)> handler) = 0;

Compute hash(es) for the specified piece. Unless the v1_hash flag is set (in flags), the SHA-1 hash of the whole piece does not need to be computed.

The v2 span is optional and can be empty, which means v2 hashes should not be computed. If v2 is non-empty it must be at least large enough to hold all v2 blocks in the piece, and this function will fill in the span with the SHA-256 block hashes of the piece.

[report issue]

async_hash2()

virtual void async_hash2 (storage_index_t storage, piece_index_t piece, int offset, disk_job_flags_t flags
      , std::function<void(piece_index_t, sha256_hash const&, storage_error const&)> handler) = 0;

computes the v2 hash (SHA-256) of a single block. The block at offset in piece piece.

[report issue]

async_move_storage()

virtual void async_move_storage (storage_index_t storage, std::string p, move_flags_t flags
      , std::function<void(status_t, std::string const&, storage_error const&)> handler) = 0;

called to request the files for the specified storage/torrent be moved to a new location. It is the disk I/O object's responsibility to synchronize this with any currently outstanding disk operations to the storage. Whether files are replaced at the destination path or not is controlled by flags (see move_flags_t).

[report issue]

async_release_files()

virtual void async_release_files (storage_index_t storage
      , std::function<void()> handler = std::function<void()>()) = 0;

This is called on disk I/O objects to request they close all open files for the specified storage/torrent. If file handles are not pooled/cached, it can be a no-op. For truly asynchronous disk I/O, this should provide at least one point in time when all files are closed. It is possible that later asynchronous operations will re-open some of the files, by the time this completion handler is called, that's fine.

[report issue]

async_check_files()

virtual void async_check_files (storage_index_t storage
      , add_torrent_params const* resume_data
      , aux::vector<std::string, file_index_t> links
      , std::function<void(status_t, storage_error const&)> handler) = 0;

this is called when torrents are added to validate their resume data against the files on disk. This function is expected to do a few things:

if links is non-empty, it contains a string for each file in the torrent. The string being a path to an existing identical file. The default behavior is to create hard links of those files into the storage of the new torrent (specified by storage). An empty string indicates that there is no known identical file. This is part of the "mutable torrent" feature, where files can be reused from other torrents.

The resume_data points the resume data passed in by the client.

If the resume_data->flags field has the seed_mode flag set, all files/pieces are expected to be on disk already. This should be verified. Not just the existence of the file, but also that it has the correct size.

Any file with a piece set in the resume_data->have_pieces bitmask should exist on disk, this should be verified. Pad files and files with zero priority may be skipped.

[report issue]

async_stop_torrent()

virtual void async_stop_torrent (storage_index_t storage
      , std::function<void()> handler = std::function<void()>()) = 0;

This is called when a torrent is stopped. It gives the disk I/O object an opportunity to flush any data to disk that's currently kept cached. This function should at least do the same thing as async_release_files().

[report issue]

async_rename_file()

virtual void async_rename_file (storage_index_t storage
      , file_index_t index, std::string name
      , std::function<void(std::string const&, file_index_t, storage_error const&)> handler) = 0;

This function is called when the name of a file in the specified storage has been requested to be renamed. The disk I/O object is responsible for renaming the file without racing with other potentially outstanding operations against the file (such as read, write, move, etc.).

[report issue]

async_delete_files()

virtual void async_delete_files (storage_index_t storage, remove_flags_t options
      , std::function<void(storage_error const&)> handler) = 0;

This function is called when some file(s) on disk have been requested to be removed by the client. storage indicates which torrent is referred to. See session_handle for remove_flags_t flags indicating which files are to be removed. e.g. session_handle::delete_files - delete all files session_handle::delete_partfile - only delete part file.

[report issue]

async_set_file_priority()

virtual void async_set_file_priority (storage_index_t storage
      , aux::vector<download_priority_t, file_index_t> prio
      , std::function<void(storage_error const&
      , aux::vector<download_priority_t, file_index_t>)> handler) = 0;

This is called to set the priority of some or all files. Changing the priority from or to 0 may involve moving data to and from the partfile. The disk I/O object is responsible for correctly synchronizing this work to not race with any potentially outstanding asynchronous operations affecting these files.

prio is a vector of the file priority for all files. If it's shorter than the total number of files in the torrent, they are assumed to be set to the default priority.

[report issue]

async_clear_piece()

virtual void async_clear_piece (storage_index_t storage, piece_index_t index
      , std::function<void(piece_index_t)> handler) = 0;

This is called when a piece fails the hash check, to ensure there are no outstanding disk operations to the piece before blocks are re-requested from peers to overwrite the existing blocks. The disk I/O object does not need to perform any action other than synchronize with all outstanding disk operations to the specified piece before posting the result back.

[report issue]

update_stats_counters()

virtual void update_stats_counters (counters& c) const = 0;

update_stats_counters() is called to give the disk storage an opportunity to update gauges in the c stats counters, that aren't updated continuously as operations are performed. This is called before a snapshot of the counters are passed to the client.

[report issue]

get_status()

virtual std::vector<open_file_state> get_status (storage_index_t) const = 0;

Return a list of all the files that are currently open for the specified storage/torrent. This is is just used for the client to query the currently open files, and which modes those files are open in.

[report issue]

abort()

virtual void abort (bool wait) = 0;

this is called when the session is starting to shut down. The disk I/O object is expected to flush any outstanding write jobs, cancel hash jobs and initiate tearing down of any internal threads. If wait is true, this should be asynchronous. i.e. this call should not return until all threads have stopped and all jobs have either been aborted or completed and the disk I/O object is ready to be destructed.

[report issue]

submit_jobs()

virtual void submit_jobs () = 0;

This will be called after a batch of disk jobs has been issues (via the async_* ). It gives the disk I/O object an opportunity to notify any potential condition variables to wake up the disk thread(s). The async_* calls can of course also notify condition variables, but doing it in this call allows for batching jobs, by issuing the notification once for a collection of jobs.

[report issue]

settings_updated()

virtual void settings_updated () = 0;

This is called to notify the disk I/O object that the settings have been updated. In the disk io constructor, a settings_interface reference is passed in. Whenever these settings are updated, this function is called to allow the disk I/O object to react to any changed settings relevant to its operations.

[report issue]
force_copy
force making a copy of the cached block, rather than getting a reference to a block already in the cache. This is used the block is expected to be overwritten very soon, by async_write()`, and we need access to the previous content.
[report issue]
sequential_access
hint that there may be more disk operations with sequential access to the file
[report issue]
volatile_read
don't keep the read block in cache. This is a hint that this block is unlikely to be read again anytime soon, and caching it would be wasteful.
[report issue]
v1_hash
compute a v1 piece hash. This is only used by the async_hash() call. If this flag is not set in the async_hash() call, the SHA-1 piece hash does not need to be computed.
[report issue]

storage_holder

Declared in "libtorrent/disk_interface.hpp"

a unique, owning, reference to the storage of a torrent in a disk io subsystem (class that implements disk_interface). This is held by the internal libtorrent torrent object to tie the storage object allocated for a torrent to the lifetime of the internal torrent object. When a torrent is removed from the session, this holder is destructed and will inform the disk object.

struct storage_holder
{
   storage_holder (storage_index_t idx, disk_interface& disk_io);
   storage_holder () = default;
   ~storage_holder ();
   explicit operator bool () const;
   operator storage_index_t () const;
   void reset ();
   storage_holder (storage_holder const&) = delete;
   storage_holder& operator= (storage_holder const&) = delete;
   storage_holder (storage_holder&& rhs) noexcept;
   storage_holder& operator= (storage_holder&& rhs) noexcept;
};
[report issue]

buffer_allocator_interface

Declared in "libtorrent/disk_buffer_holder.hpp"

the interface for freeing disk buffers, used by the disk_buffer_holder. when implementing disk_interface, this must also be implemented in order to return disk buffers back to libtorrent

struct buffer_allocator_interface
{
   virtual void free_disk_buffer (char* b) = 0;
};
[report issue]

disk_buffer_holder

Declared in "libtorrent/disk_buffer_holder.hpp"

The disk buffer holder acts like a unique_ptr that frees a disk buffer when it's destructed

If this buffer holder is moved-from, default constructed or reset, data() will return nullptr.

struct disk_buffer_holder
{
   disk_buffer_holder (disk_buffer_holder&&) noexcept;
   disk_buffer_holder& operator= (disk_buffer_holder&&) & noexcept;
   disk_buffer_holder& operator= (disk_buffer_holder const&) = delete;
   disk_buffer_holder (disk_buffer_holder const&) = delete;
   disk_buffer_holder (buffer_allocator_interface& alloc
      , char* buf, int sz) noexcept;
   disk_buffer_holder () noexcept = default;
   ~disk_buffer_holder ();
   char* data () const noexcept;
   void reset ();
   void swap (disk_buffer_holder& h) noexcept;
   bool is_mutable () const noexcept;
   explicit operator bool () const noexcept;
   std::ptrdiff_t size () const;
};
[report issue]

disk_buffer_holder()

disk_buffer_holder (buffer_allocator_interface& alloc
      , char* buf, int sz) noexcept;

construct a buffer holder that will free the held buffer using a disk buffer pool directly (there's only one disk_buffer_pool per session)

[report issue]

disk_buffer_holder()

disk_buffer_holder () noexcept = default;

default construct a holder that does not own any buffer

[report issue]

~disk_buffer_holder()

~disk_buffer_holder ();

frees disk buffer held by this object

[report issue]

data()

char* data () const noexcept;

return a pointer to the held buffer, if any. Otherwise returns nullptr.

[report issue]

reset()

void reset ();

free the held disk buffer, if any, and clear the holder. This sets the holder object to a default-constructed state

[report issue]

swap()

void swap (disk_buffer_holder& h) noexcept;

swap pointers of two disk buffer holders.

[report issue]

is_mutable()

bool is_mutable () const noexcept;

if this returns true, the buffer may not be modified in place

[report issue]

bool()

explicit operator bool () const noexcept;

implicitly convertible to true if the object is currently holding a buffer

[report issue]

disk_observer

Declared in "libtorrent/disk_observer.hpp"

struct disk_observer
{
   virtual void on_disk () = 0;
};
[report issue]

on_disk()

virtual void on_disk () = 0;

called when the disk cache size has dropped below the low watermark again and we can resume downloading from peers

[report issue]

file_open_mode_t

Declared in "libtorrent/disk_interface.hpp"

read_only
open the file for reading only
write_only
open the file for writing only
read_write
open the file for reading and writing
rw_mask
the mask for the bits determining read or write mode
sparse
open the file in sparse mode (if supported by the filesystem).
no_atime
don't update the access timestamps on the file (if supported by the operating system and filesystem). this generally improves disk performance.
random_access
open the file for random access. This disables read-ahead logic
libtorrent-rasterbar-2.0.5/docs/index.html0000664000175000017500000002304514152763504017623 0ustar arvidarvid libtorrent
libtorrent logo

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.

screenshot of libtorrent's client_test

The main goals of libtorrent are:

  • to be CPU efficient
  • to be memory efficient
  • to be very easy to use

getting started

The tutorial is an introduction to using libtorrent (C++). Also see the reference documentation.


bitcoin address for libtorrent donations

contribute

If your organization uses libtorrent, please consider supporting its development. See the contributing page for other ways to help out.

support

Please direct questions to the 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-2018

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

Thanks to Reimond Retz for bug fixes, suggestions and testing

See github for full list of contributors.

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

Project is hosted by github.

libtorrent-rasterbar-2.0.5/docs/udp_tracker_protocol.rst0000664000175000017500000004141414152763504022604 0ustar arvidarvidBittorrent UDP-tracker protocol extension ========================================= :Author: Arvid Norberg, arvid@libtorrent.org .. contents:: Table of contents :depth: 2 :backlinks: none 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_. .. _xbt-tracker: http://xbtt.sourceforge.net For additional information and descriptions of the terminology used in this document, see the `protocol specification`__ __ http://wiki.theory.org/index.php/BitTorrentSpecification 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: +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int64_t | connection_id | Must be initialized to 0x41727101980 | | | | in network byte order. This will | | | | identify the protocol. | +-------------+---------------------+----------------------------------------+ | int32_t | action | 0 for a connection request | +-------------+---------------------+----------------------------------------+ | int32_t | transaction_id | Randomized by client. | +-------------+---------------------+----------------------------------------+ Server replies with packet: +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int32_t | action | Describes the type of packet, in this | | | | case it should be 0, for connect. | | | | If 3 (for error) see errors_. | +-------------+---------------------+----------------------------------------+ | int32_t | transaction_id | Must match the transaction_id sent | | | | from the client. | +-------------+---------------------+----------------------------------------+ | int64_t | connection_id | A 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: +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int64_t | connection_id | The connection id acquired from | | | | establishing the connection. | +-------------+---------------------+----------------------------------------+ | int32_t | action | Action. in this case, 1 for announce. | | | | See actions_. | +-------------+---------------------+----------------------------------------+ | int32_t | transaction_id | Randomized by client. | +-------------+---------------------+----------------------------------------+ | int8_t[20] | info_hash | The info-hash of the torrent you want | | | | announce yourself in. | +-------------+---------------------+----------------------------------------+ | int8_t[20] | peer_id | Your peer id. | +-------------+---------------------+----------------------------------------+ | int64_t | downloaded | The number of byte you've downloaded | | | | in this session. | +-------------+---------------------+----------------------------------------+ | int64_t | left | The number of bytes you have left to | | | | download until you're finished. | +-------------+---------------------+----------------------------------------+ | int64_t | uploaded | The number of bytes you have uploaded | | | | in this session. | +-------------+---------------------+----------------------------------------+ | int32_t | event | The event, one of | | | | | | | | * none = 0 | | | | * completed = 1 | | | | * started = 2 | | | | * stopped = 3 | +-------------+---------------------+----------------------------------------+ | uint32_t | ip | Your ip address. Set to 0 if you want | | | | the tracker to use the ``sender`` of | | | | this UDP packet. | +-------------+---------------------+----------------------------------------+ | uint32_t | key | A unique key that is randomized by the | | | | client. | +-------------+---------------------+----------------------------------------+ | int32_t | num_want | The maximum number of peers you want | | | | in the reply. Use -1 for default. | +-------------+---------------------+----------------------------------------+ | uint16_t | port | The port you're listening on. | +-------------+---------------------+----------------------------------------+ | uint16_t | extensions | See extensions_ | +-------------+---------------------+----------------------------------------+ Server replies with packet: +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int32_t | action | The action this is a reply to. Should | | | | in this case be 1 for announce. | | | | If 3 (for error) see errors_. | | | | See actions_. | +-------------+---------------------+----------------------------------------+ | int32_t | transaction_id | Must match the transaction_id sent | | | | in the announce request. | +-------------+---------------------+----------------------------------------+ | int32_t | interval | the number of seconds you should wait | | | | until re-announcing yourself. | +-------------+---------------------+----------------------------------------+ | int32_t | leechers | The number of peers in the swarm that | | | | has not finished downloading. | +-------------+---------------------+----------------------------------------+ | int32_t | seeders | The 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: +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int32_t | ip | The ip of a peer in the swarm. | +-------------+---------------------+----------------------------------------+ | uint16_t | port | The peer's listen port. | +-------------+---------------------+----------------------------------------+ scraping -------- Client sends packet: +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int64_t | connection_id | The connection id retrieved from the | | | | establishing of the connection. | +-------------+---------------------+----------------------------------------+ | int32_t | action | The action, in this case, 2 for | | | | scrape. See actions_. | +-------------+---------------------+----------------------------------------+ | int32_t | transaction_id | Randomized by client. | +-------------+---------------------+----------------------------------------+ The following structure is repeated for each info-hash to scrape, but limited by the MTU. +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int8_t[20] | info_hash | The info hash that is to be scraped. | +-------------+---------------------+----------------------------------------+ Server replies with packet: +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int32_t | action | The action, should in this case be | | | | 2 for scrape. | | | | If 3 (for error) see errors_. | +-------------+---------------------+----------------------------------------+ | int32_t | transaction_id | Must 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. +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int32_t | complete | The current number of connected seeds. | +-------------+---------------------+----------------------------------------+ | int32_t | downloaded | The number of times this torrent has | | | | been downloaded. | +-------------+---------------------+----------------------------------------+ | int32_t | incomplete | The current number of connected | | | | leechers. | +-------------+---------------------+----------------------------------------+ errors ------ In case of a tracker error, server replies packet: +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int32_t | action | The action, in this case 3, for error. | | | | See actions_. | +-------------+---------------------+----------------------------------------+ | int32_t | transaction_id | Must match the transaction_id sent | | | | from the client. | +-------------+---------------------+----------------------------------------+ | int8_t[] | error_string | The 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: * 1 = authentication_. * 2 = `request string`_. 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: +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int8_t | username_length | The number of characters in the | | | | username. | +-------------+---------------------+----------------------------------------+ | int8_t[] | username | The username, the number of characters | | | | as specified in the previous field. | +-------------+---------------------+----------------------------------------+ | uint8_t[8] | passwd_hash | sha1(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: +-------------+---------------------+----------------------------------------+ | size | name | description | +=============+=====================+========================================+ | int8_t | request length | The number of bytes in the request | | | | string. | +-------------+---------------------+----------------------------------------+ | int8_t[] | request string | The 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 libtorrent-rasterbar-2.0.5/docs/extension_protocol.rst0000664000175000017500000004034514152763504022317 0ustar arvidarvid: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: +------------------------+----+ |name | id | +========================+====+ |``extended`` | 20 | +------------------------+----+ 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): +----------+---------------------------------------------------------+ | size | description | +==========+=========================================================+ | uint32_t | length prefix. Specifies the number of bytes for the | | | entire message. (big-endian) | +----------+---------------------------------------------------------+ | uint8_t | bittorrent message ID, = 20 | +----------+---------------------------------------------------------+ | uint8_t | extended 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: +-------+-----------------------------------------------------------+ | name | description | +=======+===========================================================+ | 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: +--------+-----------------------------------------------------------+ | name | description | +========+===========================================================+ | p | Local 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. | +--------+-----------------------------------------------------------+ | v | Client 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. | +--------+-----------------------------------------------------------+ | yourip | A 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. | +--------+-----------------------------------------------------------+ | ipv6 | If 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. | +--------+-----------------------------------------------------------+ | ipv4 | If 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. | +--------+-----------------------------------------------------------+ | reqq | An 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_metadata`` | 1 | | | | +----------------------+---+ | | | | ``ut_pex`` | 2 | | | | +----------------------+---+ | | | | +-------------------+----------------------------------+ | ``p`` | 6881 | +-------------------+----------------------------------+ | ``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, because 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 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). .. _`extension protocol`: extension_protocol.html 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: +-----------+---------------+----------------------------------------+ | size | name | description | +===========+===============+========================================+ | uint8_t | msg_type | Determines the kind of message this is | | | | 0 means *request metadata* | +-----------+---------------+----------------------------------------+ | uint8_t | start | The start of the metadata block that | | | | is requested. It is given in 256ths | | | | of the total size of the metadata, | | | | since the requesting client don't know | | | | the size of the metadata. | +-----------+---------------+----------------------------------------+ | uint8_t | size | The size of the metadata block that is | | | | requested. This is also given in | | | | 256ths 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: +-----------+---------------+----------------------------------------+ | size | name | description | +===========+===============+========================================+ | uint8_t | msg_type | 1 means *metadata* | +-----------+---------------+----------------------------------------+ | int32_t | total_size | The total size of the metadata, given | | | | in number of bytes. | +-----------+---------------+----------------------------------------+ | int32_t | offset | The offset of where the metadata block | | | | in this message belongs in the final | | | | metadata. This is given in bytes. | +-----------+---------------+----------------------------------------+ | uint8_t[] | metadata | The actual metadata block. The size of | | | | this part is given implicit by the | | | | length prefix in the bittorrent | | | | protocol packet. | +-----------+---------------+----------------------------------------+ Don't have metadata: +-----------+---------------+----------------------------------------+ | size | name | description | +===========+===============+========================================+ | uint8_t | msg_type | 2 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. | +-----------+---------------+----------------------------------------+ .. _`BEP 9`: https://www.bittorrent.org/beps/bep_0009.html 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 message itself are 20 (the bittorrent extension message) and the message ID assigned to this extension in the ``m`` dictionary in the handshake. +-----------+---------------+----------------------------------------+ | size | name | description | +===========+===============+========================================+ | uint32_t | piece | index 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. libtorrent-rasterbar-2.0.5/docs/extension_protocol.html0000664000175000017500000004347214152763504022457 0ustar arvidarvid libtorrent
libtorrent logo
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:

name id
extended 20

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):

size description
uint32_t length prefix. Specifies the number of bytes for the entire message. (big-endian)
uint8_t bittorrent message ID, = 20
uint8_t extended 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:

name description
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:

name description
p Local 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.
v Client 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.
yourip A 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.
ipv6 If 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.
ipv4 If 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.
reqq An 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_metadata 1
ut_pex 2
p 6881
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, because 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 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:

size name description
uint8_t msg_type Determines the kind of message this is 0 means request metadata
uint8_t start The start of the metadata block that is requested. It is given in 256ths of the total size of the metadata, since the requesting client don't know the size of the metadata.
uint8_t size The size of the metadata block that is requested. This is also given in 256ths 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:

size name description
uint8_t msg_type 1 means metadata
int32_t total_size The total size of the metadata, given in number of bytes.
int32_t offset The offset of where the metadata block in this message belongs in the final metadata. This is given in bytes.
uint8_t[] metadata The actual metadata block. The size of this part is given implicit by the length prefix in the bittorrent protocol packet.

Don't have metadata:

size name description
uint8_t msg_type 2 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 message itself are 20 (the bittorrent extension message) and the message ID assigned to this extension in the m dictionary in the handshake.

size name description
uint32_t piece index 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.

libtorrent-rasterbar-2.0.5/docs/style.css0000664000175000017500000001513214152763504017476 0ustar arvidarvid@media (prefers-color-scheme: light) { body { background-color: white; color: black; } } @media (prefers-color-scheme: dark) { body { background-color: black; color: #ddd; } } /* STYLE */ body { margin: 0px; font-size: 12pt; } dt { margin-bottom: 0.3em; font-style: italic; font-weight: 600; } dd { margin-left: 2em; margin-bottom: 1em; } tt { font-family: monospace; } h1 { font-size: 1.7em; } h2 { font-size: 1.5em; } @media (prefers-color-scheme: light) { tt { background-color: rgba(0, 0, 0, 0.05); } table { border-color: #ccc; } th, td { border-color: #ddd; } th { border-bottom-color: black; } a.reference, a { color: #000070; } hr { border-color: #eee; } } @media (prefers-color-scheme: dark) { tt { background-color: rgba(255, 255, 255, 0.2); } table { border-color: #777; } th, td { border-color: #444; } th { border-bottom-color: white; } a.reference, a { color: #bbf; } hr { border-color: #777; } } hr { border-bottom-width: 1px; border-style: solid; } table { margin-bottom: 1em; border-collapse: collapse; border-style: solid; } th, td { padding: 0.2em; } th { border-bottom-style: solid; border-bottom-width: 1px; } a { text-decoration: none; } a:hover { text-decoration: underline; } p.last { margin-bottom: 0.3em; } p.first { margin-top: 0.3em; } .align-right { float: right; } @media (prefers-color-scheme: dark) { .bw { filter: invert(1); } } /* TEMPLATE */ @media (prefers-color-scheme: light) { #footer { color: #777; } #footer a { color: #555; } #footer a:hover { color: #000; } #gradient { background: linear-gradient(#aaa, #ddd); } #filler { background: linear-gradient(#ddd, #fff); } } @media (prefers-color-scheme: dark) { #footer { color: #888; } #footer a { color: #ccc; } #footer a:hover { color: #fff; } #gradient { background: #444; } #filler { background: linear-gradient(#444, black); } } #container { text-align: left; max-width: 60em; margin: 5px auto; position: relative; padding: 3px; } #gradient { height: 40px; } #filler { min-height: 400px; height: 100%; } #footer { margin-bottom: 0px; margin-left: auto; margin-right: auto; column-count: 3; column-width: 7em; max-width: 40em; } #footer a { text-decoration: none; } #footer a:hover { text-decoration: underline; } table.docinfo { float: right; width: 200px; margin-right: 0px; margin-left: 20px; margin-bottom: 20px; border: none; } @media screen and (max-width: 499px) { table.docinfo { display: none; } } table.docinfo th { text-align: right; background-color: transparent; border: none; } table.docinfo td { padding-left: 10px; } /* FRONT PAGE */ @media screen and (min-width: 500px) { #librarySidebar { float: left; width: 13em; } #libraryBody { margin-left: 13em; } } @media screen and (max-width: 240px) { #librarySidebar ul { list-style-type: none; padding-inline-start: 0px; } } #librarySidebar li { padding-bottom: 0.35em; } @media (prefers-color-scheme: light) { #libraryBody { border-color: #eee; } } @media (prefers-color-scheme: dark) { #libraryBody { border-color: #777; } } #libraryBody { border-left-style: solid; border-left-width: 1px; padding-left: 10px; margin-right: 10px; } .screenshot { width: 100%; } .front-page-screenshot { float: right; } @media screen and (max-width: 890px) { .front-page-screenshot { display: none; } } .front-page-qr { float: right; clear: right; } @media screen and (max-width: 600px) { .front-page-qr { display: none; } } .report-issue { float: right; font-size: 90%; } /* REFERENCE MAIN TABLE OF CONTENT */ @media (prefers-color-scheme: light) { div.main-toc { border-color: #999; } } @media (prefers-color-scheme: dark) { div.main-toc { border-color: #888; } } div.main-toc { column-count: 4; column-width: 13em; border-style: solid; border-width: 1px; padding: 5px; margin-bottom: 10px; } .rubric { margin-top: 5px; margin-bottom: 5px; font-size: 120%; font-weight: bold; } /* TABLE OF CONTENT */ @media (prefers-color-scheme: light) { #table-of-contents { background-color: white; border-color: #a1c5d6; } } @media (prefers-color-scheme: dark) { #table-of-contents { background-color: black; border-color: #76c; } } #table-of-contents { margin-left: 20px; padding: 0.8em; border-style: solid; border-width: 1px; position: relative; z-index: 1; } @media screen and (min-width: 500px) { #table-of-contents { width: 15em; float: right; clear: right; } } #table-of-contents p { font-size: 140%; font-weight: bold; padding-bottom: 0.5em; margin: 0; } #table-of-contents ul { margin: 0; padding: 0 0 0 0.8em; list-style: square; text-align: left; line-height: 1.5em; } @media screen and (max-width: 319px) { #table-of-contents ul { list-style-type: none; padding-inline-start: 0px; } } #table-of-contents a.reference { border: none; font-weight: bold; } #table-of-contents li li a.reference { font-weight: normal; padding: 0; } /* CODE BLOCKS */ @media (prefers-color-scheme: light) { pre { background: #f6f6f6; border-color: #bbb; } } @media (prefers-color-scheme: dark) { pre { background: #222; border-color: #666; } } pre { font-family: monospace; padding: 5px 10px 5px 10px; border-style: solid; border-width: 1px; margin: 1em 0; } /* SYNTAX HIGHLIGHTING */ .keyword { font-weight: bold } @media (prefers-color-scheme: light) { .string { color: #771; } .comment { font-style: italic; color: #559; } .preproc { font-style: italic; color: #959; } .number { color: #595; } } @media (prefers-color-scheme: dark) { .string { color: #ff6; } .comment { font-style: italic; color: #99f; } .preproc { font-style: italic; color: #f7f; } .number { color: #7f7; } } /* ALERT BOXES */ @media (prefers-color-scheme: light) { div.warning, div.note, div.important { background: #f1fff5; border-color: #d1dfd5; } div.warning { background: #fffdca; border-color: #dddd80; } div.note .admonition-title { border-bottom-color: #d1dfd5; } div.warning .admonition-title { border-bottom-color: #dddd80; } } @media (prefers-color-scheme: dark) { div.warning, div.note, div.important { background: #0f3a0f; border-color: #5d9e5d; } div.warning { background: #666507; border-color: #dbd818; } div.warning .admonition-title { border-bottom-color: #dbd818; } div.note .admonition-title { border-bottom-color: #5d9e5d; } } div.warning, div.note, div.important { width: 80%; margin: 1.5em auto; border-style: solid; border-width: 1px; padding: 5px 10px 5px 10px; } div.warning { border-style: solid; border-width: 1px; } p.admonition-title { font-size: 128%; letter-spacing: 2px; text-transform: uppercase; margin: 0 0 0.5em 0; border-bottom-style: solid; border-bottom-width: 1px; } libtorrent-rasterbar-2.0.5/docs/dht_rss.rst0000664000175000017500000003205314152763504020025 0ustar arvidarvid====================================== BitTorrent extension for DHT RSS feeds ====================================== .. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none This proposal has been superseded by the dht_put_ feature. This may still be implemented on top of that. .. _dht_put: dht_store.html 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 general 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 zeros. The ID an items is announced to is determined by the SHA1 hash of the bencoded representation of the item itself. 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 store 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. .. parsed-literal:: { "a": { "id": *<20 byte ID of sending node>*, "key": *<64 byte public curve25519 key for this list>*, "n": ** "target": ** }, "q": "get_item", "t": **, "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: .. parsed-literal:: { "r": { "head": { "key": *<64 byte public curve25519 key for this list>*, "next": *<20 bytes item ID>*, "n": **, "seq": ** }, "sig": **, "id": *<20 byte id of sending node>*, "token": **, "nodes": **, "nodes6": ** }, "t": **, "y": "r", } This is the format of a response of a list item: .. parsed-literal:: { "r": { "item": { "key": *<64 byte public curve25519 key for this list>*, "next": *<20 bytes item ID>*, ... }, "sig": **, "id": *<20 byte id of sending node>*, "token": **, "nodes": **, "nodes6": ** }, "t": **, "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: .. parsed-literal:: { "a": { "head": { "key": *<64 byte public curve25519 key for this list>*, "next": *<20 bytes item ID>*, "n": **, "seq": ** }, "sig": **, "id": *<20 byte node-id of origin node>*, "target": **, "token": ** }, "y": "q", "q": "announce_item", "t": ** } The message format for announcing a list item: .. parsed-literal:: { "a": { "item": { "key": *<64 byte public curve25519 key for this list>*, "next": *<20 bytes item ID>*, ... }, "sig": **, "id": *<20 byte node-id of origin node>*, "target": **, "token": ** }, "y": "q", "q": "announce_item", "t": ** } 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. .. parsed-literal:: 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: .. parsed-literal:: { "a": { "item": { "key": "6bc1de5443d1a7c536cdf69433ac4a7163d3c63e2f9c92d 78f6011cf63dbcd5b638bbc2119cdad0c57e4c61bc69ba5e2c08 b918c2db8d1848cf514bd9958d307", "info-hash": "7ea94c240691311dc0916a2a91eb7c3db2c6f3e4", "size": 24315329, "n": "my stuff", "next": "c68f29156404e8e0aas8761ef5236bcagf7f8f2e" } "sig": ** "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: .. parsed-literal:: magnet:?xt=btfd:** &dn= ** 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 https://cr.yp.to/, curve25519 is free from patent claims and there are open implementations in both C and Java. .. _curve25519: https://cr.yp.to/ecdh.html libtorrent-rasterbar-2.0.5/docs/client_test.rst0000664000175000017500000000417114152763504020674 0ustar arvidarvid=========================== client_test example program =========================== .. include:: header.rst 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 hard coded. The command line arguments are:: client_test ... You can start any number of torrent downloads/seeds via the command line. 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: .. image:: img/screenshot.png :class: screenshot :target: img/screenshot.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`` resume 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 downloading parts of pieces. It may make it easier to determine which peer that sent the corrupt data if a piece fails the hash test. libtorrent-rasterbar-2.0.5/docs/tuning-ref.html0000664000175000017500000006067714152763504020606 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

tuning libtorrent

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 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.

profiling

libtorrent is instrumented with a number of counters and gauges you can have access to via the session_stats_alert. To get a snapshot of the counters, call session::post_session_stats(). This call should be made periodically, with whatever granularity you want:

ses.post_session_stats();

Then print alerts to a file:

std::vector<lt::alert*> alerts;
ses.pop_alerts(&alerts);

for (auto* a : alerts) {
        if (lt::alert_cast<lt::session_stats_alert>(a)
                || lt::alert_cast<lt::session_stats_header_alert>(a))
        {
                std::cout << a->message() << "\n";
        }

        // ...
}

The alerts with data will have the type session_stats_alert and there is one session_stats_header_alert that will be posted on startup containing the column names for all metrics. Logging this line will greatly simplify interpreting the output, and is required for the script to work out-of-the-box.

The python scrip in tools/parse_session_stats.py can parse the resulting file and produce graphs of relevant stats. It requires gnuplot.

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 settings_pack 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 bytes of 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 bytes of 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.

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 settings_pack::recv_socket_buffer_size and settings_pack::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 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 peer lists 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 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 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 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.

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.

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. Some of these macros may affect ABI (although they are not intended to).

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 shave off some size from the executable.

For all available options, see the building libtorrent section. Look specifically for the TORRENT_DISABLE_* macros.

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 cache for open file handles. 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 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.

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 advised to experiment with the settings_pack::mixed_mode_algorithm, setting it to settings_pack::prefer_tcp. This setting entirely disables the balancing and un-throttles 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 settings_pack::send_buffer_watermark.

peers

First of all, in order to allow many connections, set the global connection limit high, settings_pack::connections_limit. Also set the upload rate limit to infinite, settings_pack::upload_rate_limit, 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: 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 settings_pack::allow_multiple_connections_per_ip.

In order to always unchoke peers, turn off automatic unchoke by setting settings_pack::choking_algorithm to settings_pack::fixed_slots_choker and set the number of upload slots to a large number via settings_pack::unchoke_slots_limit, or use -1 (which means infinite).

torrent limits

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

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 and/or SHA-256. In order to enable computing hashes in parallel, on multi-core systems, set settings_pack::aio_threads to the number of threads libtorrent should perform I/O and settings_pack::hashing_threads to the number of threads to compute piece hashes in.

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::post_torrent_updates(). 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, performing the work asynchronously. 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. session::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.

To use session::post_torrent_updates() torrents need to have the flag_update_subscribe flag set. When post_torrent_updates() is called, a state_update_alert alert is posted, with all the torrents that have updated since the last time this function was called. The client have to keep its own state of all torrents, and update it based on this alert.

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. 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.

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 are 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.

libtorrent-rasterbar-2.0.5/docs/reference-DHT.html0000664000175000017500000006036714152763504021077 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

dht_storage_counters

Declared in "libtorrent/kademlia/dht_storage.hpp"

This structure hold the relevant counters for the storage

struct dht_storage_counters
{
   void reset ();

   std::int32_t torrents  = 0;
   std::int32_t peers  = 0;
   std::int32_t immutable_data  = 0;
   std::int32_t mutable_data  = 0;
};
[report issue]

reset()

void reset ();

This member function set the counters to zero.

[report issue]

dht_storage_interface

Declared in "libtorrent/kademlia/dht_storage.hpp"

The DHT storage interface is a pure virtual class that can be implemented to customize how the data for the DHT is stored.

The default storage implementation uses three maps in RAM to save the peers, mutable and immutable items and it's designed to provide a fast and fully compliant behavior of the BEPs.

libtorrent comes with one built-in storage implementation: dht_default_storage (private non-accessible class). Its constructor function is called dht_default_storage_constructor(). You should know that if this storage becomes full of DHT items, the current implementation could degrade in performance.

struct dht_storage_interface
{
   virtual void update_node_ids (std::vector<node_id> const& ids) = 0;
   virtual bool get_peers (sha1_hash const& info_hash
      , bool noseed, bool scrape, address const& requester
      , entry& peers) const = 0;
   virtual void announce_peer (sha1_hash const& info_hash
      , tcp::endpoint const& endp
      , string_view name, bool seed) = 0;
   virtual bool get_immutable_item (sha1_hash const& target
      , entry& item) const = 0;
   virtual void put_immutable_item (sha1_hash const& target
      , span<char const> buf
      , address const& addr) = 0;
   virtual bool get_mutable_item_seq (sha1_hash const& target
      , sequence_number& seq) const = 0;
   virtual bool get_mutable_item (sha1_hash const& target
      , sequence_number seq, bool force_fill
      , entry& item) const = 0;
   virtual void put_mutable_item (sha1_hash const& target
      , span<char const> buf
      , signature const& sig
      , sequence_number seq
      , public_key const& pk
      , span<char const> salt
      , address const& addr) = 0;
   virtual int get_infohashes_sample (entry& item) = 0;
   virtual void tick () = 0;
   virtual dht_storage_counters counters () const = 0;
};
[report issue]

update_node_ids()

virtual void update_node_ids (std::vector<node_id> const& ids) = 0;

This member function notifies the list of all node's ids of each DHT running inside libtorrent. It's advisable that the concrete implementation keeps a copy of this list for an eventual prioritization when deleting an element to make room for a new one.

[report issue]

get_peers()

virtual bool get_peers (sha1_hash const& info_hash
      , bool noseed, bool scrape, address const& requester
      , entry& peers) const = 0;

This function retrieve the peers tracked by the DHT corresponding to the given info_hash. You can specify if you want only seeds and/or you are scraping the data.

For future implementers: If the torrent tracked contains a name, such a name must be stored as a string in peers["n"]

If the scrape parameter is true, you should fill these keys:

peers["BFpe"]
with the standard bit representation of a 256 bloom filter containing the downloaders
peers["BFsd"]
with the standard bit representation of a 256 bloom filter containing the seeders

If the scrape parameter is false, you should fill the key peers["values"] with a list containing a subset of peers tracked by the given info_hash. Such a list should consider the value of settings_pack::dht_max_peers_reply. If noseed is true only peers marked as no seed should be included.

returns true if the maximum number of peers are stored for this info_hash.

[report issue]

announce_peer()

virtual void announce_peer (sha1_hash const& info_hash
      , tcp::endpoint const& endp
      , string_view name, bool seed) = 0;

This function is named announce_peer for consistency with the upper layers, but has nothing to do with networking. Its only responsibility is store the peer in such a way that it's returned in the entry with the lookup_peers.

The name parameter is the name of the torrent if provided in the announce_peer DHT message. The length of this value should have a maximum length in the final storage. The default implementation truncate the value for a maximum of 50 characters.

[report issue]

get_immutable_item()

virtual bool get_immutable_item (sha1_hash const& target
      , entry& item) const = 0;

This function retrieves the immutable item given its target hash.

For future implementers: The value should be returned as an entry in the key item["v"].

returns true if the item is found and the data is returned inside the (entry) out parameter item.

[report issue]

put_immutable_item()

virtual void put_immutable_item (sha1_hash const& target
      , span<char const> buf
      , address const& addr) = 0;

Store the item's data. This layer is only for storage. The authentication of the item is performed by the upper layer.

For implementers: This data can be stored only if the target is not already present. The implementation should consider the value of settings_pack::dht_max_dht_items.

[report issue]

get_mutable_item_seq()

virtual bool get_mutable_item_seq (sha1_hash const& target
      , sequence_number& seq) const = 0;

This function retrieves the sequence number of a mutable item.

returns true if the item is found and the data is returned inside the out parameter seq.

[report issue]

get_mutable_item()

virtual bool get_mutable_item (sha1_hash const& target
      , sequence_number seq, bool force_fill
      , entry& item) const = 0;

This function retrieves the mutable stored in the DHT.

For implementers: The item sequence should be stored in the key item["seq"]. if force_fill is true or (0 <= seq and seq < item["seq"]) the following keys should be filled item["v"] - with the value no encoded. item["sig"] - with a string representation of the signature. item["k"] - with a string representation of the public key.

returns true if the item is found and the data is returned inside the (entry) out parameter item.

[report issue]

put_mutable_item()

virtual void put_mutable_item (sha1_hash const& target
      , span<char const> buf
      , signature const& sig
      , sequence_number seq
      , public_key const& pk
      , span<char const> salt
      , address const& addr) = 0;

Store the item's data. This layer is only for storage. The authentication of the item is performed by the upper layer.

For implementers: The sequence number should be checked if the item is already present. The implementation should consider the value of settings_pack::dht_max_dht_items.

[report issue]

get_infohashes_sample()

virtual int get_infohashes_sample (entry& item) = 0;

This function retrieves a sample info-hashes

For implementers: The info-hashes should be stored in ["samples"] (N x 20 bytes). the following keys should be filled item["interval"] - the subset refresh interval in seconds. item["num"] - number of info-hashes in storage.

Internally, this function is allowed to lazily evaluate, cache and modify the actual sample to put in item

returns the number of info-hashes in the sample.

[report issue]

tick()

virtual void tick () = 0;

This function is called periodically (non-constant frequency).

For implementers: Use this functions for expire peers or items or any other storage cleanup.

[report issue]

counters()

virtual dht_storage_counters counters () const = 0;

return stats counters for the store

[report issue]

dht_state

Declared in "libtorrent/kademlia/dht_state.hpp"

This structure helps to store and load the state of the dht_tracker. At this moment the library is only a dual stack implementation of the DHT. See BEP 32

struct dht_state
{
   void clear ();

   node_ids_t nids;
   std::vector<udp::endpoint> nodes;
   std::vector<udp::endpoint> nodes6;
};
[report issue]
nodes
the bootstrap nodes saved from the buckets node
[report issue]
nodes6
the bootstrap nodes saved from the IPv6 buckets node
[report issue]

dht_default_storage_constructor()

Declared in "libtorrent/kademlia/dht_storage.hpp"

std::unique_ptr<dht_storage_interface> dht_default_storage_constructor (
   settings_interface const& settings);

constructor for the default DHT storage. The DHT storage is responsible for maintaining peers and mutable and immutable items announced and stored/put to the DHT node.

[report issue]

sign_mutable_item()

Declared in "libtorrent/kademlia/item.hpp"

signature sign_mutable_item (
   span<char const> v
   , span<char const> salt
   , sequence_number seq
   , public_key const& pk
   , secret_key const& sk);

given a byte range v and an optional byte range salt, a sequence number, public key pk (must be 32 bytes) and a secret key sk (must be 64 bytes), this function produces a signature which is written into a 64 byte buffer pointed to by sig. The caller is responsible for allocating the destination buffer that's passed in as the sig argument. Typically it would be allocated on the stack.

[report issue]

announce_flags_t

Declared in "libtorrent/kademlia/announce_flags.hpp"

seed
announce to DHT as a seed
implied_port
announce to DHT with the implied-port flag set. This tells the network to use your source UDP port as your listen port, rather than the one specified in the message. This may improve the chances of traversing NATs when using uTP.
ssl_torrent
Specify the port number for the SSL listen socket in the DHT announce.
libtorrent-rasterbar-2.0.5/docs/utp.rst0000664000175000017500000004042114152763504017165 0ustar arvidarvid.. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none 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. a home router that crashes or slows down by UDP traffic (caused by the DHT) 3. 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. 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 advertising (because it's often much lower than the download capacity) which might make it hard to find. 2. 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. 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) .. image:: img/cwnd_thumb.png :target: cwnd.png :class: bw :align: right 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 causes 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. .. image:: img/delays_thumb.png :target: delays.png :class: bw :align: right 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 boundary 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. 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. 3. 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). 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. 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. 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 advertise 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 ----------- .. image:: img/our_delay_base_thumb.png :target: our_delay_base.png :class: bw :align: right 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 (artificially 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_. .. _IPTPS10: http://www.usenix.org/event/iptps10/tech/slides/cohen.pdf .. _LEDBAT: https://datatracker.ietf.org/doc/draft-ietf-ledbat-congestion/ 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. libtorrent-rasterbar-2.0.5/docs/hacking.html0000664000175000017500000002103014152763504020110 0ustar arvidarvid libtorrent
libtorrent logo

libtorrent hacking

Version: 2.0.5

This describe some of the internals of libtorrent. If you're looking for something to contribute, please take a look at the todo list.

terminology

This section describes some of the terminology used throughout the libtorrent source. Having a good understanding of some of these keywords helps understanding what's going on.

A piece is a part of the data of a torrent that has a SHA-1 hash in the .torrent file. Pieces are almost always a power of two in size, but not necessarily. Each piece is split up in blocks, which is a 16 kiB. A block never spans two pieces. If a piece is smaller than 16 kiB or not divisible by 16 kiB, there are blocks smaller than that.

16 kiB is a de-facto standard of the largest transfer unit in the bittorrent protocol. Clients typically reject any request for larger pieces than this.

The piece picker is the part of a bittorrent client that is responsible for the logic to determine which requests to send to peers. It doesn't actually pick full pieces, but blocks (from pieces).

The file layout of a torrent is represented by file storage objects. This class contains a list of all files in the torrent (in a well defined order), the size of the pieces and implicitly the total size of the whole torrent and number of pieces. The file storage determines the mapping from pieces to files. This representation may be quite complex in order to keep it extremely compact. This is useful to load very large torrents without exploding in memory usage.

A torrent object represents all the state of swarm download. This includes a piece picker, a list of peer connections, file storage (torrent file). One important distinction is between a connected peer (peer_connection) and a peer we just know about, and may have been connected to, and may connect to in the future (torrent_peer). The list of (not connected) peers may grow very large if not limited (through tracker responses, DHT and peer exchange). This list is typically limited to a few thousand peers.

The peer_list maintains a potentially large list of known peers for a swarm (not necessarily connected).

structure

This is the high level structure of libtorrent. Bold types are part of the public interface:

img/hacking.png

session_impl

This is the session state object, containing all session global information, such as:

  • the list of all torrents m_torrent.
  • the list of all peer connections m_connections.
  • the global rate limits m_settings.
  • the DHT state m_dht.
  • the port mapping state, m_upnp and m_natpmp.

session

This is the public interface to the session. It implements pimpl (pointer to implementation) in order to hide the internal representation of the session_impl object from the user and make binary compatibility simpler to maintain.

torrent_handle

This is the public interface to a torrent. It holds a weak reference to the internal torrent object and manipulates it by sending messages to the network thread.

torrent

peer_connection

peer_list

piece_picker

torrent_info

threads

libtorrent starts at least 3 threads, but likely more, depending on the settings_pack::aio_threads setting. The kinds of threads are:

  • The main network thread that manages all sockets; sending and receiving messages and maintaining all session, torrent and peer state. In an idle session, this thread will mostly be blocked in a system call, waiting for socket activity, such as epoll().
  • A disk I/O thread. There may be multiple disk threads. All disk read and write operations are passed to this thread and messages are passed back to the main thread when the operation completes. This kind of thread also performs the SHA-1/SHA-256 calculations to verify pieces. Some disk threads may have an affinity for those jobs, to avoid starvation of the disk.
  • At least one thread is spawned by boost.asio on systems that don't support asynchronous host name resolution, in order to simulate non-blocking getaddrinfo().
libtorrent-rasterbar-2.0.5/docs/streaming.html0000664000175000017500000002360714152763504020511 0ustar arvidarvid libtorrent
libtorrent logo

Streaming implementation

Version: 2.0.5

This documents describes the algorithm libtorrent uses to satisfy time critical piece requests, i.e. streaming.

streaming vs sequential_download

Libtorrent's sequential_download mode and the time-critical logic can be understood as two different ways of managing peer request queues.

sequential_download will simply wait until a queue slot opens up, and request the next piece in the sequence. This mechanism is even simpler than the classic "rarest-first" algorithm; it does a good job of keeping request queues full, thus saturating available download bandwidth; and pieces do arrive roughly in-order. However, it's sub-optimal for streaming: piece 0 may be requested from a slow peer, and fast peers will get requests for later-index pieces instead of retrying more-critical ones.

The time-critical logic does more active management of peer request queues, such that the most time-critical pieces occupy the "best" queue slots, across all peers. It can be considered an advanced version of sequential_download. The main trade-off is that it is more complex to implement and utilize.

piece picking

The standard bittorrent piece picker is peer-centric. A peer unchokes us or we complete a block from a peer and we want to make another request to that peer. The piece picker answers the question: which block should we request from this peer.

When streaming, we have a number of time critical pieces, the ones the video or audio player will need next to keep up with the stream. To keep the deadlines of these pieces, we need a mechanism to answer the question: I want to request blocks from this piece, which peer is the most likely to be able to deliver it to me the soonest.

This question is answered by torrent::request_time_critical_pieces() in libtorrent.

At a high level, this algorithm keeps a list of peers, sorted by the estimated download queue time. That is, the estimated time for a new request to this peer to be received. The bottom 10th percentile of the peers (the 10% slowest peers) are ignored and not included in the peer list. Peers that have choked us, are not interesting, is on parole, disconnecting, have too many outstanding block requests or is snubbed are also excluded from the peer list.

The time critical pieces are also kept sorted by their deadline. Pieces with an earlier deadline first. This list of pieces is iterated, starting at the top, and blocks are requested from a piece until we cannot make any more requests from it. We then move on to the next piece and request blocks from it until we cannot make any more. The peer each request is sent to is the one with the lowest download queue time. Each time a request is made, this estimate is updated and the peer is resorted in this list.

Any peer that doesn't have the piece is ignored until we move on to the next piece.

If the top peer's download queue time is more than 2 seconds, the loop is terminated. This is to not over-request. request_time_critical_pieces() is called once per second, so this will keep the queue full with margin.

download queue time

Each peer maintains the number of bytes that have been requested from it but not yet been received. This is referred to as outstanding_bytes. This number is incremented by the size of each outgoing request and decremented for each payload byte received.

This counter is divided by an estimated download rate from the peer to form the estimated download queue time. That is, the estimated time it will take any new request to this peer to begin being received.

The estimated download rate of a peer is not trivial. There may not be any outstanding requests to the peer, in which case the payload download rate will be zero. That would not be a reasonable estimate of the rate we would see once we make a request.

If we have not received any payload from a peer in the last 30 seconds, we must use an alternative estimate of the download rate. If we have received payload from this peer previously, we can use the peak download rate.

If we have received less than 2 blocks (32 kiB) and we have been unchoked for less than 5 seconds ago, use the average download rate of all peers (that have outstanding requests).

timeouts

An observation that is useful to keep in mind when streaming is that your download capacity is likely to be saturated by your peers. In this case, if the swarm is well seeded, most peers will send data to you at close to the same rate. This makes it important to support streaming from many slow peers. For instance, this means you can't make assumptions about the download time of a block being less than some absolute time. You may be downloading at well above the bit rate of the video, but each individual peer only transfers at 5 kiB/s.

In this state, your download rate is a zero-sum-game. Any block you request that is not urgent, will take away from the bandwidth you get for peers that are urgent. Make sure to limit requests to useful blocks only.

Some requests will stall. It appears to be very hard to have enough accuracy in the prediction of download queue time such that all requests come back within a reasonable amount of time.

To support adaptive timeouts, each torrent maintains a running average of how long it takes to complete a piece. There is also a running average of the deviation from the mean download time.

This download time is used as the benchmark to determine when blocks have timed out, and should be re-requested from another peer.

If any time-critical piece has taken more than the average piece download time + a half average deviation form that, the piece is considered to have timed out. This means we are allowed to double-request blocks. Subsequent passes over this piece will make sure that any blocks we don't already have are requested one more time.

In fact, this scales to multiple time-outs. The time since a download was started is divided by average download time + average deviation time / 2. The resulting integer is the number if times the piece has timed out.

Each time a piece times out, another busy request is allowed to try to make it complete sooner. A busy request is where a block is requested from a peer even though it has already been requested from another peer.

This has the effect of getting more and more aggressive in requesting blocks the longer it takes to complete the piece. If this mechanism is too aggressive, a significant amount of bandwidth may be lost in redundant download (keep in mind the zero-sum game).

It never makes sense to request a block twice from the same peer. There is logic in place to prevent this.

optimizations

One optimization is to buffer all piece requests while looping over the time- critical pieces and not send them until one round is complete. This increases the chances that the request messages are coalesced into the same packet. This in turn lowers the number of system calls and network overhead.

libtorrent-rasterbar-2.0.5/docs/dht_rss.html0000664000175000017500000005044114152763504020162 0ustar arvidarvid libtorrent
libtorrent logo

BitTorrent extension for DHT RSS feeds

Version: 2.0.5

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 general 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 zeros.

The ID an items is announced to is determined by the SHA1 hash of the bencoded representation of the item itself. 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 store 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 https://cr.yp.to/, curve25519 is free from patent claims and there are open implementations in both C and Java.

libtorrent-rasterbar-2.0.5/docs/reference-Core.html0000664000175000017500000023307214152763504021343 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

info_hash_t

Declared in "libtorrent/info_hash.hpp"

class holding the info-hash of a torrent. It can hold a v1 info-hash (SHA-1) or a v2 info-hash (SHA-256) or both.

Note

If has_v2() is false then the v1 hash might actually be a truncated v2 hash

struct info_hash_t
{
   explicit info_hash_t (sha1_hash h1) noexcept;
   info_hash_t () noexcept = default;
   info_hash_t (sha1_hash h1, sha256_hash h2) noexcept;
   explicit info_hash_t (sha256_hash h2) noexcept;
   bool has_v1 () const;
   bool has (protocol_version v) const;
   bool has_v2 () const;
   sha1_hash get (protocol_version v) const;
   sha1_hash get_best () const;
   friend bool operator!= (info_hash_t const& lhs, info_hash_t const& rhs);
   friend bool operator== (info_hash_t const& lhs, info_hash_t const& rhs) noexcept;
   template <typename F> void for_each (F f) const;
   bool operator< (info_hash_t const& o) const;
   friend std::ostream& operator<< (std::ostream& os, info_hash_t const& ih);

   sha1_hash v1;
   sha256_hash v2;
};
[report issue]

info_hash_t()

explicit info_hash_t (sha1_hash h1) noexcept;
info_hash_t () noexcept = default;
info_hash_t (sha1_hash h1, sha256_hash h2) noexcept;
explicit info_hash_t (sha256_hash h2) noexcept;

The default constructor creates an object that has neither a v1 or v2 hash.

For backwards compatibility, make it possible to construct directly from a v1 hash. This constructor allows implicit conversion from a v1 hash, but the implicitness is deprecated.

[report issue]

has() has_v2() has_v1()

bool has_v1 () const;
bool has (protocol_version v) const;
bool has_v2 () const;

returns true if the corresponding info hash is present in this object.

[report issue]

get()

sha1_hash get (protocol_version v) const;

returns the has for the specified protocol version

[report issue]

get_best()

sha1_hash get_best () const;

returns the v2 (truncated) info-hash, if there is one, otherwise returns the v1 info-hash

[report issue]

for_each()

template <typename F> void for_each (F f) const;

calls the function object f for each hash that is available. starting with v1. The signature of F is:

void(sha1_hash, protocol_version);
[report issue]

piece_block

Declared in "libtorrent/piece_block.hpp"

struct piece_block
{
   piece_block () = default;
   piece_block (piece_index_t p_index, int b_index);
   bool operator< (piece_block const& b) const;
   bool operator== (piece_block const& b) const;
   bool operator!= (piece_block const& b) const;

   static const piece_block invalid;
   piece_index_t piece_index {0};
   int block_index  = 0;
};
[report issue]

peer_info

Declared in "libtorrent/peer_info.hpp"

holds information and statistics about one peer that libtorrent is connected to

struct peer_info
{
   std::string client;
   typed_bitfield<piece_index_t> pieces;
   std::int64_t total_download;
   std::int64_t total_upload;
   time_duration last_request;
   time_duration last_active;
   time_duration download_queue_time;
   static constexpr peer_flags_t interesting  = 0_bit;
   static constexpr peer_flags_t choked  = 1_bit;
   static constexpr peer_flags_t remote_interested  = 2_bit;
   static constexpr peer_flags_t remote_choked  = 3_bit;
   static constexpr peer_flags_t supports_extensions  = 4_bit;
   static constexpr peer_flags_t outgoing_connection  = 5_bit;
   static constexpr peer_flags_t local_connection  = 5_bit;
   static constexpr peer_flags_t handshake  = 6_bit;
   static constexpr peer_flags_t connecting  = 7_bit;
   static constexpr peer_flags_t on_parole  = 9_bit;
   static constexpr peer_flags_t seed  = 10_bit;
   static constexpr peer_flags_t optimistic_unchoke  = 11_bit;
   static constexpr peer_flags_t snubbed  = 12_bit;
   static constexpr peer_flags_t upload_only  = 13_bit;
   static constexpr peer_flags_t endgame_mode  = 14_bit;
   static constexpr peer_flags_t holepunched  = 15_bit;
   static constexpr peer_flags_t i2p_socket  = 16_bit;
   static constexpr peer_flags_t utp_socket  = 17_bit;
   static constexpr peer_flags_t ssl_socket  = 18_bit;
   static constexpr peer_flags_t rc4_encrypted  = 19_bit;
   static constexpr peer_flags_t plaintext_encrypted  = 20_bit;
   peer_flags_t flags;
   static constexpr peer_source_flags_t tracker  = 0_bit;
   static constexpr peer_source_flags_t dht  = 1_bit;
   static constexpr peer_source_flags_t pex  = 2_bit;
   static constexpr peer_source_flags_t lsd  = 3_bit;
   static constexpr peer_source_flags_t resume_data  = 4_bit;
   static constexpr peer_source_flags_t incoming  = 5_bit;
   peer_source_flags_t source;
   int up_speed;
   int down_speed;
   int payload_up_speed;
   int payload_down_speed;
   peer_id pid;
   int queue_bytes;
   int request_timeout;
   int send_buffer_size;
   int used_send_buffer;
   int receive_buffer_size;
   int used_receive_buffer;
   int receive_buffer_watermark;
   int num_hashfails;
   int download_queue_length;
   int timed_out_requests;
   int busy_requests;
   int requests_in_buffer;
   int target_dl_queue_length;
   int upload_queue_length;
   int failcount;
   piece_index_t downloading_piece_index;
   int downloading_block_index;
   int downloading_progress;
   int downloading_total;
   static constexpr connection_type_t standard_bittorrent  = 0_bit;
   static constexpr connection_type_t web_seed  = 1_bit;
   static constexpr connection_type_t http_seed  = 2_bit;
   connection_type_t connection_type;
   int pending_disk_bytes;
   int pending_disk_read_bytes;
   int send_quota;
   int receive_quota;
   int rtt;
   int num_pieces;
   int download_rate_peak;
   int upload_rate_peak;
   float progress;
   int progress_ppm;
   tcp::endpoint ip;
   tcp::endpoint local_endpoint;
   static constexpr bandwidth_state_flags_t bw_idle  = 0_bit;
   static constexpr bandwidth_state_flags_t bw_limit  = 1_bit;
   static constexpr bandwidth_state_flags_t bw_network  = 2_bit;
   static constexpr bandwidth_state_flags_t bw_disk  = 4_bit;
   bandwidth_state_flags_t read_state;
   bandwidth_state_flags_t write_state;
};
[report issue]
client
A human readable string describing the software at the other end of the connection. In some cases this information is not available, then it will contain a string that may give away something about which software is running in the other end. In the case of a web seed, the server type and version will be a part of this string. This is UTF-8 encoded.
[report issue]
pieces
a bitfield, with one bit per piece in the torrent. Each bit tells you if the peer has that piece (if it's set to 1) or if the peer miss that piece (set to 0).
[report issue]
total_download total_upload
the total number of bytes downloaded from and uploaded to this peer. These numbers do not include the protocol chatter, but only the payload data.
[report issue]
last_request last_active
the time since we last sent a request to this peer and since any transfer occurred with this peer
[report issue]
download_queue_time
the time until all blocks in the request queue will be downloaded
[report issue]
interesting
we are interested in pieces from this peer.
[report issue]
choked
we have choked this peer.
[report issue]
remote_interested
the peer is interested in us
[report issue]
remote_choked
the peer has choked us.
[report issue]
supports_extensions
means that this peer supports the extension protocol.
[report issue]
outgoing_connection
The connection was initiated by us, the peer has a listen port open, and that port is the same as in the address of this peer. If this flag is not set, this peer connection was opened by this peer connecting to us.
[report issue]
local_connection
deprecated synonym for outgoing_connection
[report issue]
handshake
The connection is opened, and waiting for the handshake. Until the handshake is done, the peer cannot be identified.
[report issue]
connecting
The connection is in a half-open state (i.e. it is being connected).
[report issue]
on_parole
The peer has participated in a piece that failed the hash check, and is now "on parole", which means we're only requesting whole pieces from this peer until it either fails that piece or proves that it doesn't send bad data.
[report issue]
seed
This peer is a seed (it has all the pieces).
[report issue]
optimistic_unchoke
This peer is subject to an optimistic unchoke. It has been unchoked for a while to see if it might unchoke us in return an earn an upload/unchoke slot. If it doesn't within some period of time, it will be choked and another peer will be optimistically unchoked.
[report issue]
snubbed
This peer has recently failed to send a block within the request timeout from when the request was sent. We're currently picking one block at a time from this peer.
[report issue]
upload_only
This peer has either explicitly (with an extension) or implicitly (by becoming a seed) told us that it will not downloading anything more, regardless of which pieces we have.
[report issue]
endgame_mode
This means the last time this peer picket a piece, it could not pick as many as it wanted because there were not enough free ones. i.e. all pieces this peer has were already requested from other peers.
[report issue]
holepunched
This flag is set if the peer was in holepunch mode when the connection succeeded. This typically only happens if both peers are behind a NAT and the peers connect via the NAT holepunch mechanism.
[report issue]
i2p_socket
indicates that this socket is running on top of the I2P transport.
[report issue]
utp_socket
indicates that this socket is a uTP socket
[report issue]
ssl_socket
indicates that this socket is running on top of an SSL (TLS) channel
[report issue]
rc4_encrypted
this connection is obfuscated with RC4
[report issue]
plaintext_encrypted
the handshake of this connection was obfuscated with a Diffie-Hellman exchange
[report issue]
flags
tells you in which state the peer is in. It is set to any combination of the peer_flags_t flags above.
[report issue]
tracker
The peer was received from the tracker.
[report issue]
dht
The peer was received from the kademlia DHT.
[report issue]
pex
The peer was received from the peer exchange extension.
[report issue]
lsd
The peer was received from the local service discovery (The peer is on the local network).
[report issue]
resume_data
The peer was added from the fast resume data.
[report issue]
incoming
we received an incoming connection from this peer
[report issue]
source
a combination of flags describing from which sources this peer was received. A combination of the peer_source_flags_t above.
[report issue]
up_speed down_speed
the current upload and download speed we have to and from this peer (including any protocol messages). updated about once per second
[report issue]
payload_up_speed payload_down_speed
The transfer rates of payload data only updated about once per second
[report issue]
pid
the peer's id as used in the bit torrent protocol. This id can be used to extract 'fingerprints' from the peer. Sometimes it can tell you which client the peer is using. See identify_client()_
[report issue]
queue_bytes
the number of bytes we have requested from this peer, but not yet received.
[report issue]
request_timeout
the number of seconds until the current front piece request will time out. This timeout can be adjusted through settings_pack::request_timeout. -1 means that there is not outstanding request.
[report issue]
send_buffer_size used_send_buffer
the number of bytes allocated and used for the peer's send buffer, respectively.
[report issue]
receive_buffer_size used_receive_buffer receive_buffer_watermark
the number of bytes allocated and used as receive buffer, respectively.
[report issue]
num_hashfails
the number of pieces this peer has participated in sending us that turned out to fail the hash check.
[report issue]
download_queue_length
this is the number of requests we have sent to this peer that we haven't got a response for yet
[report issue]
timed_out_requests
the number of block requests that have timed out, and are still in the download queue
[report issue]
busy_requests
the number of busy requests in the download queue. A busy request is a request for a block we've also requested from a different peer
[report issue]
requests_in_buffer
the number of requests messages that are currently in the send buffer waiting to be sent.
[report issue]
target_dl_queue_length
the number of requests that is tried to be maintained (this is typically a function of download speed)
[report issue]
upload_queue_length
the number of piece-requests we have received from this peer that we haven't answered with a piece yet.
[report issue]
failcount
the number of times this peer has "failed". i.e. failed to connect or disconnected us. The failcount is decremented when we see this peer in a tracker response or peer exchange message.
[report issue]
downloading_piece_index downloading_block_index downloading_progress downloading_total
You can know which piece, and which part of that piece, that is currently being downloaded from a specific peer by looking at these four members. downloading_piece_index is the index of the piece that is currently being downloaded. This may be set to -1 if there's currently no piece downloading from this peer. If it is >= 0, the other three members are valid. downloading_block_index is the index of the block (or sub-piece) that is being downloaded. downloading_progress is the number of bytes of this block we have received from the peer, and downloading_total is the total number of bytes in this block.
[report issue]
standard_bittorrent
Regular bittorrent connection
[report issue]
web_seed
HTTP connection using the BEP 19 protocol
[report issue]
http_seed
HTTP connection using the BEP 17 protocol
[report issue]
connection_type
the kind of connection this peer uses. See connection_type_t.
[report issue]
pending_disk_bytes
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 settings_pack::max_queued_disk_bytes.
[report issue]
pending_disk_read_bytes
number of outstanding bytes to read from disk
[report issue]
send_quota receive_quota
the number of bytes this peer has been assigned to be allowed to send and receive until it has to request more quota from the bandwidth manager.
[report issue]
rtt
an estimated round trip time to this peer, in milliseconds. It is estimated by timing the TCP connect(). It may be 0 for incoming connections.
[report issue]
num_pieces
the number of pieces this peer has.
[report issue]
download_rate_peak upload_rate_peak
the highest download and upload rates seen on this connection. They are given in bytes per second. This number is reset to 0 on reconnect.
[report issue]
progress
the progress of the peer in the range [0, 1]. This is always 0 when floating point operations are disabled, instead use progress_ppm.
[report issue]
progress_ppm
indicates the download progress of the peer in the range [0, 1000000] (parts per million).
[report issue]
ip
the IP-address to this peer. The type is an asio endpoint. For more info, see the asio documentation.
[report issue]
local_endpoint
the IP and port pair the socket is bound to locally. i.e. the IP address of the interface it's going out over. This may be useful for multi-homed clients with multiple interfaces to the internet.
[report issue]
bw_idle
The peer is not waiting for any external events to send or receive data.
[report issue]
bw_limit
The peer is waiting for the rate limiter.
[report issue]
bw_network
The peer has quota and is currently waiting for a network read or write operation to complete. This is the state all peers are in if there are no bandwidth limits.
[report issue]
bw_disk
The peer is waiting for the disk I/O thread to catch up writing buffers to disk before downloading more.
[report issue]
read_state write_state
bitmasks indicating what state this peer is in with regards to sending and receiving data. The states are defined as independent flags of type bandwidth_state_flags_t, in this class.
[report issue]

peer_request

Declared in "libtorrent/peer_request.hpp"

represents a byte range within a piece. Internally this is is used for incoming piece requests.

struct peer_request
{
   bool operator== (peer_request const& r) const;

   piece_index_t piece;
   int start;
   int length;
};
[report issue]

operator==()

bool operator== (peer_request const& r) const;

returns true if the right hand side peer_request refers to the same range as this does.

[report issue]
piece
The index of the piece in which the range starts.
[report issue]
start
The byte offset within that piece where the range starts.
[report issue]
length
The size of the range, in bytes.
[report issue]

make_magnet_uri()

Declared in "libtorrent/magnet_uri.hpp"

std::string make_magnet_uri (torrent_info const& info);
std::string make_magnet_uri (torrent_handle const& handle);

Generates a magnet URI from the specified torrent. If the torrent handle is invalid, an empty string is returned.

For more information about magnet links, see magnet links.

[report issue]

parse_magnet_uri()

Declared in "libtorrent/magnet_uri.hpp"

add_torrent_params parse_magnet_uri (string_view uri);
add_torrent_params parse_magnet_uri (string_view uri, error_code& ec);
void parse_magnet_uri (string_view uri, add_torrent_params& p, error_code& ec);

This function parses out information from the magnet link and populates the add_torrent_params object. The overload that does not take an error_code reference will throw a system_error on error The overload taking an add_torrent_params reference will fill in the fields specified in the magnet URI.

[report issue]

version()

Declared in "libtorrent/version.hpp"

char const* version ();

returns the libtorrent version as string form in this format: "<major>.<minor>.<tiny>.<tag>"

[report issue]

enum connection_type

Declared in "libtorrent/peer_connection.hpp"

name value description
bittorrent 0  
url_seed 1  
http_seed 2  
[report issue]

enum protocol_version

Declared in "libtorrent/info_hash.hpp"

name value description
V1 0 The original BitTorrent version, using SHA-1 hashes
V2 1 Version 2 of the BitTorrent protocol, using SHA-256 hashes
NUM 2  
[report issue]

enum socket_type_t

Declared in "libtorrent/socket_type.hpp"

name value description
tcp 0  
socks5 1  
http 2  
utp 3  
i2p 4  
tcp_ssl 5  
socks5_ssl 6  
http_ssl 7  
utp_ssl 8  
[report issue]

enum portmap_transport

Declared in "libtorrent/portmap.hpp"

name value description
natpmp 0 natpmp can be NAT-PMP or PCP
upnp 1  
[report issue]

enum portmap_protocol

Declared in "libtorrent/portmap.hpp"

name value description
none 0  
tcp 1  
udp 2  
[report issue]

enum event_t

Declared in "libtorrent/tracker_manager.hpp"

name value description
none 0  
completed 1  
started 2  
stopped 3  
paused 4  
[report issue]

torrent_flags_t

Declared in "libtorrent/torrent_flags.hpp"

seed_mode

If seed_mode is set, libtorrent will assume that all files are present for this torrent and that they all match the hashes in the torrent file. Each time a peer requests to download a block, the piece is verified against the hash, unless it has been verified already. If a hash fails, the torrent will automatically leave the seed mode and recheck all the files. The use case for this mode is if a torrent is created and seeded, or if the user already know that the files are complete, this is a way to avoid the initial file checks, and significantly reduce the startup time.

Setting seed_mode on a torrent without metadata (a .torrent file) is a no-op and will be ignored.

It is not possible to set the seed_mode flag on a torrent after it has been added to a session. It is possible to clear it though.

upload_mode

If upload_mode is set, the torrent will be initialized in upload-mode, which means it will not make any piece requests. This state is typically entered on disk I/O errors, and if the torrent is also auto managed, it will be taken out of this state periodically (see settings_pack::optimistic_disk_retry).

This mode can be used to avoid race conditions when adjusting priorities of pieces before allowing the torrent to start downloading.

If the torrent is auto-managed (auto_managed), the torrent will eventually be taken out of upload-mode, regardless of how it got there. If it's important to manually control when the torrent leaves upload mode, don't make it auto managed.

share_mode

determines if the torrent should be added in share mode or not. Share mode indicates that we are not interested in downloading the torrent, but merely want to improve our share ratio (i.e. increase it). A torrent started in share mode will do its best to never download more than it uploads to the swarm. If the swarm does not have enough demand for upload capacity, the torrent will not download anything. This mode is intended to be safe to add any number of torrents to, without manual screening, without the risk of downloading more than is uploaded.

A torrent in share mode sets the priority to all pieces to 0, except for the pieces that are downloaded, when pieces are decided to be downloaded. This affects the progress bar, which might be set to "100% finished" most of the time. Do not change file or piece priorities for torrents in share mode, it will make it not work.

The share mode has one setting, the share ratio target, see settings_pack::share_mode_target for more info.

apply_ip_filter
determines if the IP filter should apply to this torrent or not. By default all torrents are subject to filtering by the IP filter (i.e. this flag is set by default). This is useful if certain torrents needs to be exempt for some reason, being an auto-update torrent for instance.
paused
specifies whether or not the torrent is paused. i.e. it won't connect to the tracker or any of the peers until it's resumed. Note that a paused torrent that also has the auto_managed flag set can be started at any time by libtorrent's queuing logic. See queuing.
auto_managed

If the torrent is auto-managed (auto_managed), the torrent may be resumed at any point, regardless of how it paused. If it's important to manually control when the torrent is paused and resumed, don't make it auto managed.

If auto_managed is set, the torrent will be queued, started and seeded automatically by libtorrent. When this is set, the torrent should also be started as paused. The default queue order is the order the torrents were added. They are all downloaded in that order. For more details, see queuing.

duplicate_is_error
used in add_torrent_params to indicate that it's an error to attempt to add a torrent that's already in the session. If it's not considered an error, a handle to the existing torrent is returned. This flag is not saved by write_resume_data(), since it is only meant for adding torrents.
update_subscribe
on by default and means that this torrent will be part of state updates when calling post_torrent_updates(). This flag is not saved by write_resume_data().
super_seeding
sets the torrent into super seeding/initial seeding mode. If the torrent is not a seed, this flag has no effect.
sequential_download
sets the sequential download state for the torrent. In this mode the piece picker will pick pieces with low index numbers before pieces with high indices. The actual pieces that are picked depend on other factors still, such as which pieces a peer has and whether it is in parole mode or "prefer whole pieces"-mode. Sequential mode is not ideal for streaming media. For that, see set_piece_deadline() instead.
stop_when_ready

When this flag is set, the torrent will force stop whenever it transitions from a non-data-transferring state into a data-transferring state (referred to as being ready to download or seed). This is useful for torrents that should not start downloading or seeding yet, but want to be made ready to do so. A torrent may need to have its files checked for instance, so it needs to be started and possibly queued for checking (auto-managed and started) but as soon as it's done, it should be stopped.

Force stopped means auto-managed is set to false and it's paused. As if the auto_manages flag is cleared and the paused flag is set on the torrent.

Note that the torrent may transition into a downloading state while setting this flag, and since the logic is edge triggered you may miss the edge. To avoid this race, if the torrent already is in a downloading state when this call is made, it will trigger the stop-when-ready immediately.

When the stop-when-ready logic fires, the flag is cleared. Any subsequent transitions between downloading and non-downloading states will not be affected, until this flag is set again.

The behavior is more robust when setting this flag as part of adding the torrent. See add_torrent_params.

The stop-when-ready flag fixes the inherent race condition of waiting for the state_changed_alert and then call pause(). The download/seeding will most likely start in between posting the alert and receiving the call to pause.

A downloading state is one where peers are being connected. Which means just downloading the metadata via the ut_metadata extension counts as a downloading state. In order to stop a torrent once the metadata has been downloaded, instead set all file priorities to dont_download

override_trackers
when this flag is set, the tracker list in the add_torrent_params object override any trackers from the torrent file. If the flag is not set, the trackers from the add_torrent_params object will be added to the list of trackers used by the torrent. This flag is set by read_resume_data() if there are trackers present in the resume data file. This effectively makes the trackers saved in the resume data take precedence over the original trackers. This includes if there's an empty list of trackers, to support the case where they were explicitly removed in the previous session. This flag is not saved by write_resume_data()
override_web_seeds
If this flag is set, the web seeds from the add_torrent_params object will override any web seeds in the torrent file. If it's not set, web seeds in the add_torrent_params object will be added to the list of web seeds used by the torrent. This flag is set by read_resume_data() if there are web seeds present in the resume data file. This effectively makes the web seeds saved in the resume data take precedence over the original ones. This includes if there's an empty list of web seeds, to support the case where they were explicitly removed in the previous session. This flag is not saved by write_resume_data()
need_save_resume
if this flag is set (which it is by default) the torrent will be considered needing to save its resume data immediately as it's added. New torrents that don't have any resume data should do that. This flag is cleared by a successful call to save_resume_data() This flag is not saved by write_resume_data(), since it represents an ephemeral state of a running torrent.
disable_dht
set this flag to disable DHT for this torrent. This lets you have the DHT enabled for the whole client, and still have specific torrents not participating in it. i.e. not announcing to the DHT nor picking up peers from it.
disable_lsd
set this flag to disable local service discovery for this torrent.
disable_pex
set this flag to disable peer exchange for this torrent.
no_verify_files
if this flag is set, the resume data will be assumed to be correct without validating it against any files on disk. This may be used when restoring a session by loading resume data from disk. It will save time and also delay any hard disk errors until files are actually needed. If the resume data cannot be trusted, or if a torrent is added for the first time to some save path that may already have some of the files, this flag should not be set.
all
all torrent flags combined. Can conveniently be used when creating masks for flags
[report issue]

download_priority_t

Declared in "libtorrent/download_priority.hpp"

dont_download
Don't download the file or piece. Partial pieces may still be downloaded when setting file priorities.
default_priority
The default priority for files and pieces.
low_priority
The lowest priority for files and pieces.
top_priority
The highest priority for files and pieces.
[report issue]

pex_flags_t

Declared in "libtorrent/pex_flags.hpp"

pex_encryption
the peer supports protocol encryption
pex_seed
the peer is a seed
pex_utp
the peer supports the uTP, transport protocol over UDP.
pex_holepunch
the peer supports the holepunch extension If this flag is received from a peer, it can be used as a rendezvous point in case direct connections to the peer fail
pex_lt_v2
protocol v2 this is not a standard flag, it is only used internally
[report issue]

int

Declared in "libtorrent/version.hpp"

version_major
the major, minor and tiny versions of libtorrent
version_minor
the major, minor and tiny versions of libtorrent
version_tiny
the major, minor and tiny versions of libtorrent
[report issue]

char const*

Declared in "libtorrent/version.hpp"

version_str
the libtorrent version in string form
[report issue]

std::uint64_t

Declared in "libtorrent/version.hpp"

version_revision
the git commit of this libtorrent version
libtorrent-rasterbar-2.0.5/docs/security-audit.html0000664000175000017500000007073114152763504021473 0ustar arvidarvid libtorrent
libtorrent logo

Security audit of libtorrent

Author: Arvid Norberg, arvid@libtorrent.org

In the 4th quarter of 2020 Mozilla Open Source Support Awards commissioned a security audit of libtorrent, to be performed by include security.

The full report from the audit can be found here.

This document discusses the issues raised by the report as well as describes the changes made to libtorrent in response to it. These changes were included in libtorrent version 1.2.12 and version 2.0.2.

Comments on this document are welcome through any of these means:

F1: Server-Side Request Forgery (SSRF)

For background, see OWASP definition of SSRF.

Running a tracker on the local network is an established use case for BitTorrent (here). Filtering all tracker requests to the local network is not feasible. Running a tracker on the loopback device would seem to only make sense for testing.

The SSRF issue is not limited to tracker URLs, but also applies to web seeds. A web seed can be embedded in a .torrent file as well as included in a magnet link.

The report says:

If user-controllable URLs must be requested then sanitizing them in a manner similar to the SafeCurl library is recommended (see the link in the reference section).

The SafeCurl library, as I understand is, sanitizes URLs based on include- and exclude lists of host names, IP addresses, ports, schemes.

tracker and web seed protocols

Tracker URLs can be arbitrary URLs that libtorrent appends certain query string parameters to (like &info_hash= etc.). The path component of a tracker URL is typically not relevant, and most trackers follow the convention of using /announce.

A web seed for a multi-file torrent cannot include any query string arguments and libtorrent will append the path to the file that's being requested. However, the response from the web seed can redirect to any arbitrary URL, including on the local network. A web seed for a single-file torrent can be any arbitrary URL.

Web seed HTTP requests will almost always be a range request (unless the file is so small to fit in one or a few pieces).

What heuristics and restrictions could libtorrent implement to mitigate attacks?

Both trackers and web seeds only use HTTP GET request, i.e. no POST for example. This ought to protect certain APIs that mutate state.

The examples in the OWASP article are:

Cloud server meta-data

Cloud services such as AWS provide a REST interface on http://169.254.169.254/ where important configuration and sometimes even authentication keys can be extracted

The response from a REST API would have to be compatible with the BitTorrent tracker protocol, which is a bencoded structure with specific keys being mandatory (the protocol is defined here, with amendments here, here and here).

A tracker response that doesn't match this protocol will be ignored by libtorrent. The response will not be published and made available anywhere, including the logs. Therefore it's not likely there would be a way to extract data from a REST API via a tracker request.

Database HTTP interfaces

NoSQL database such as MongoDB provide REST interfaces on HTTP ports. If the database is expected to only be available to internally, authentication may be disabled and the attacker can extract data

Since libtorrent doesn't make the response from a tracker request available to anybody, especially not if it's not a valid BitTorrent tracker response, it's not likely data can be extracted via such tracker URL. See previous section for details.

Internal REST interfaces

libtorrent can definitely hit a REST interface and may affect configuration changes in other software that's installed on the local machine. This is assuming that the software does not use any authentication other than checking the source IP being the localhost.

As mentioned earlier, extracting data from a REST API via a tracker URL is not likely to be possible.

It is established practice to include arbitrary URL query parameters in tracker URLs, and clients amend them with the query parameters required by the tracker protocol. This makes it difficult to sanitize the query string.

One way to mitigate hitting REST APIs on local host is to require that tracker URLs, for local host specifically, use the request path /announce. This is the convention for bittorrent trackers.

Web seeds that resolve to a local network address are not allowed to have query string parameters.

This SSRF mitigation was implemented for trackers in #5303 and for web seeds in #5319.

Web Seeds that resolve to a global address (i.e. not loopback, local network or multicast address) are not allowed to redirect to a non-global IP. This mitigation was implemented in #5846, for libtorrent-2.0.3.

Files

The attacker may be able to read files using <file://> URIs

libtorrent only supports http, https and udp protocol schemes, and will reject any other tracker URL. Specifically, libtorrent does not support the file:// URL scheme.

Additionally, #5346 implements checks for tracker URLs that include query string arguments that are supposed to be added by clients.

F2: Compile Options Can Remove Assert Security Validation

The comments have been addressed in #5308. The changes include:

  • use span<char> to simplify updates of pointer + length
  • use span<char const> for (immutable) write buffers, to improve const correctness and avoid a const_cast
  • introduce additional sanity checks that no buffer lengths are < 0
  • introduce additional check to ensure buffer lengths fit in unsigned 16 bit field (in the case where it's stored in one)
  • generally reduce signed <-> unsigned casts

F3: Confidential and Security Relevant Information Stored in Logs

The secret keys for protocol encryption are not particularly sensitive, since it's primarily an obfuscation feature. However, I have never had to use these keys for debugging, so they don't have much value in the log anyway.

Addressed in #5299.

F4: Pseudo Random Number Generator Is Vulnerable to Prediction Attack

These are the places random_bytes(), random() and random_shuffle() are used in libtorrent. The "crypto" column indicates whether the random number is sensitive and must be hard to predict, i.e. have high entropy.

crypto Use Description
Yes PCP nonce

generating a nonce for PCP (Port Control Protocol). The PCP RFC section 11.2 references RFC 4086 Randomness Requirements for Security for the nonce generation.

This was fixed.

Yes DHT ed25519 keys

used for kademlia mutable put feature. These keys are sensitive an should use an appropriate entropy source. This is not done as part of normal libtorrent operations, it's a utility function a client using the mutable PUT-feature can call. This functionality is exposed in the ed25519_create_seed() function.

This was fixed.

Maybe DHT write-token

The DHT maintains a secret 32 bit number which is updated every 5 minutes to a new random number. The secret from the last 5 minute period is also remembered. In responses to get and get_peers messages a write token is generated and included. The write token is the first 32 bits of a SHA-1 of the source IP address, the current secret and the info_hash. put and announce_peer requests are ignored if the write token is invalid given the current or the last secret. This is like a SYN-cookie.

This was changed to use cryptographic random numbers.

Maybe DHT transaction ID

Each DHT request that is sent to a node includes a 16 bit transaction ID that must be returned in the response. This is used to map responses to the correct request (required when making multiple requests to the same IP), but also to make it harder for a 3rd party to spoof the source IP and fake a response. Presumably the fact that there are only 65536 different transaction IDs would be a problem before someone guesses the random number. Additionally, a request is only valid for a few tens of seconds, which further mitigates spoofed responses.

This has been left using pseudo random numbers.

Maybe uTP sequence numbers

When connecting a uTP socket, the initial sequence number is chosen at random.

This has been left using pseudo random numbers.

No protocol encryption (obfuscation) both key generation for DH handshake as well as random padding ahead of handshake. The protocol encryption feature is not intended to provide any authentication or confidentiality.
No i2p session-id generation of the session ID, not key generation. All crypto, including key generation is done by the i2p daemon implementing the SAM bridge.
No DHT node-id The node ID does not need to be hard to guess, just uniformly distributed.
No DHT node-id fingerprint Used to identify announces to fake info-hashes. More info here.
No DHT peer storage When returning peers from peer storage, in response to a DHT get_peers request, we pick n of m random peers.
No peer-id In bittorrent, each peer generates a random peer-id used in interactions with other peers as well as HTTP(S) trackers. The peer-id is not secret and does not need to be hard to guess. In fact, for each peer libtorrent connects to, it generates a different peer-id. Additionally, each torrent has a unique peer-id that's advertised to trackers. Trackers need a consistent peer-id for its book keeping.
No ip_voter

The ip_voter maintains a list of possible external IP addresses, based on how many peer interactions we've seen telling us that's our external IP as observed by them. Knowing our external IP is not critical, it's primarily used to generate our DHT node ID according to this.

The ip_voter uses random() to probabilistically drop a record of a possible external IP, if there are too many.

No local service discovery In order to ignore our own service discovery messages sent on a multi-cast group, we include a "cookie". If we see our own cookie, we ignore the message. The cookie is generated by random().
No piece picker The order pieces are picked in is rarest first. Pieces of the same rarity are picked in random order, using random().
No smart-ban

If a piece fails the hash check, we may not know which peer sent the corrupt data. The smart ban function will record the hashes of all blocks of the failed piece. Once the piece passes, it can compare the passing blocks against the failing one, identifying exactly which peer sent corrupt data. This is a property of how bittorrent checks data at the piece level, but downloads smaller parts (called "blocks") from potentially different peers.

In earlier version of libtorrent, the block hash would use CRC32, and a secret salt to prevent trivial exploiting by malicious peers. This is no longer the case, smart-ban uses SHA-1 now, so there is no need for the salt.

It was removed in #5295.

No peer-list pruning When the peer list has too many peers in it, random low quality peers are pruned.
No peer-list duplicate peer When receiving a connection from an IP we're already connected to, the connection to keep and which one to disconnect is based on the local and remote port numbers. If the ports are the same, one of the two connections are closed randomly.
No UPnP external port When the external port of a mapping conflicts with an existing map, the port mapping is re-attempted with a random external port.
No ut_metadata re-request timeout When a peer responds to a metadata request with "don't have", we delay randomly between 20 - 70 seconds before re-requesting.
No web seeds Web seeds are shuffled, to attempt connecting to them in random order
No trackers Trackers within the same tier are shuffled, to try them in random order (for load balancing)
No resume data peers When saving resume data and we have more than 100 peers, once "high quality peers" have been saved, pick low quality peers at random to save.
No share mode seeds In share mode, where libtorrent attempts to maximize its upload to download ratio, if we're connected to too many seeds, some random seeds are disconnected.
No share mode pick In share mode, when more than one piece has the lowest availability, one of them is picked at random
No http_connection endpoints After a successful hostname lookup, the endpoints are randomized to try them in an arbitrary order, for load balancing.
No super seeding piece picking In Super seeding mode, the rarest piece is selected for upload. If there's a tie, a piece is chosen at random.
No UDP listen socket When using a proxy, but not connecting peer via the proxy, the local UDP socket, used for uTP and DHT traffic will bind to the listen socket of the first configured listen interface. If there is no listen interface configured, a random port is chosen.
No bind outgoing uTP socket When bind-outgoing-sockets is enabled, uTP sockets are bound to the listen interface matching the target IP. If there is no match, an interface is picked at random to bind the outgoing socket to.
No uTP send ID uTP connections are assigned send ID, to allow multiple connections to the same IP. Similar to port number, but all uTP connections run over a single UDP socket.

The following issues were addressed:

  • the existing random_bytes() function was made to unconditionally produce pseudo random bytes.
  • increase amount of entropy to seed the pseudo random number generator.
  • a new function crypto_random_bytes() was added which unconditionally use a strong entropy source.
  • If no specialized API is available for high-entropy random numbers is available (like libcrypto or CryptoAPI on windows) random numbers are pulled from /dev/urandom.
  • The PCP nonce was changed to use crypto_random_bytes()
  • The ed25519 key seed function was changed to use crypto_random_bytes()

Addressed in #5298.

F5: Potential Null Pointer Dereference Issues

This was fundamentally caused by the boost.pool default allocator using new (std::nothrow), rather than plain (throwing) new. The code using the pool added to the confusion by checking for a nullptr return value, but further up the call chain that check was not made. The fix was to remove the check for nullptr and replace the boost.pool allocator to throw std::bad_alloc on memory exhaustion.

Addressed in #5293.

F6: Integer Overflow

This was a bug in the fuzzer itself, not in the production code (as far as I could find). The parse_int fuzzer used an uninitialized variable.

Addressed in #5292.

F7: Magnet URIs Allow IDNA Domain Names

My understanding of this attack is that a tracker hostname could be crafted to look like a well known host, but in fact be a different host, by using look-alike unicode characters in the hostname.

For example, the well-known tracker http://bt1.archive.org:6969/announce could be spoofed by using bt1.archivï½….org (the e at the end is really U+ff45).

The issue of trusting trackers goes beyond tracker host names in magnet links. Normal .torrent files also contain tracker URLs, and they could also use misleading tracker host names. However, this highlights a more fundamental issue that libtorrent does not provide an API for clients to vet trackers before announcing to them. libtorrent provides an IP filter that will block announcing to trackers, but not the URLs or host names directly.

Having an ability to vet trackers before using them would also mitigate the F1: Server-Side Request Forgery (SSRF).

This issue also goes beyond trackers. Web seeds are also URLs embedded in .torrent files or magnet links which libtorrent will make requests to.

These are the changes I'm making to mitigate this issue:

  • enable validate_https_trackers by default. #5314. The name of this setting is misleading. It does not only affect trackers, but also web seeds.
  • Support loading the system certificate store on windows, to authenticate trackers with, #5313.
  • add an option to allow IDNA domain names, and disable it by default. This applies to both trackers and web seeds. #5316.

I1: Additional Documentation and Automation

Addressed in:

I2: Automated Fuzzer Generation

No effort has been put into generating fuzzers with FuzzGen, but it's an intriguing project I hope to have time to put some effort towards in the future.

I3: Type Confusion and Integer Overflow Improvements

Addressed in:

libtorrent-rasterbar-2.0.5/docs/reference-Torrent_Info.html0000664000175000017500000015237514152763504023071 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

web_seed_entry

Declared in "libtorrent/torrent_info.hpp"

the web_seed_entry holds information about a web seed (also known as URL seed or HTTP seed). It is essentially a URL with some state associated with it. For more information, see BEP 17 and BEP 19.

struct web_seed_entry
{
   bool operator== (web_seed_entry const& e) const;
   bool operator< (web_seed_entry const& e) const;

   enum type_t
   {
      url_seed,
      http_seed,
   };

   std::string url;
   std::string auth;
   headers_t extra_headers;
   std::uint8_t type;
};
[report issue]

operator==()

bool operator== (web_seed_entry const& e) const;

URL and type comparison

[report issue]

operator<()

bool operator< (web_seed_entry const& e) const;

URL and type less-than comparison

[report issue]

enum type_t

Declared in "libtorrent/torrent_info.hpp"

name value description
url_seed 0  
http_seed 1  
[report issue]
url
The URL of the web seed
[report issue]
auth
Optional authentication. If this is set, it's passed in as HTTP basic auth to the web seed. The format is: username:password.
[report issue]
extra_headers
Any extra HTTP headers that need to be passed to the web seed
[report issue]
type
The type of web seed (see type_t)
[report issue]

load_torrent_limits

Declared in "libtorrent/torrent_info.hpp"

this object holds configuration options for limits to use when loading torrents. They are meant to prevent loading potentially malicious torrents that cause excessive memory allocations.

struct load_torrent_limits
{
   int max_buffer_size  = 10000000;
   int max_pieces  = 0x200000;
   int max_decode_depth  = 100;
   int max_decode_tokens  = 3000000;
};
[report issue]
max_buffer_size
the max size of a .torrent file to load into RAM
[report issue]
max_pieces
the max number of pieces allowed in the torrent
[report issue]
max_decode_depth
the max recursion depth in the bdecoded structure
[report issue]
max_decode_tokens
the max number of bdecode tokens
[report issue]

torrent_info

Declared in "libtorrent/torrent_info.hpp"

the torrent_info class holds the information found in a .torrent file.

class torrent_info
{
   torrent_info (span<char const> buffer, error_code& ec, from_span_t);
   explicit torrent_info (info_hash_t const& info_hash);
   explicit torrent_info (std::string const& filename);
   torrent_info (std::string const& filename, error_code& ec);
   torrent_info (char const* buffer, int size);
   torrent_info (bdecode_node const& torrent_file, load_torrent_limits const& cfg);
   torrent_info (char const* buffer, int size, error_code& ec);
   torrent_info (bdecode_node const& torrent_file, error_code& ec);
   torrent_info (span<char const> buffer, load_torrent_limits const& cfg, from_span_t);
   explicit torrent_info (bdecode_node const& torrent_file);
   torrent_info (torrent_info const& t);
   explicit torrent_info (span<char const> buffer, from_span_t);
   torrent_info (std::string const& filename, load_torrent_limits const& cfg);
   ~torrent_info ();
   file_storage const& files () const;
   file_storage const& orig_files () const;
   void rename_file (file_index_t index, std::string const& new_filename);
   void remap_files (file_storage const& f);
   void add_tracker (std::string const& url, int tier
      , announce_entry::tracker_source source);
   std::vector<announce_entry> const& trackers () const;
   void clear_trackers ();
   void add_tracker (std::string const& url, int tier = 0);
   std::vector<sha1_hash> similar_torrents () const;
   std::vector<std::string> collections () const;
   void set_web_seeds (std::vector<web_seed_entry> seeds);
   void add_http_seed (std::string const& url
      , std::string const& extern_auth = std::string()
      , web_seed_entry::headers_t const& extra_headers = web_seed_entry::headers_t());
   std::vector<web_seed_entry> const& web_seeds () const;
   void add_url_seed (std::string const& url
      , std::string const& ext_auth = std::string()
      , web_seed_entry::headers_t const& ext_headers = web_seed_entry::headers_t());
   std::int64_t total_size () const;
   int num_pieces () const;
   int piece_length () const;
   piece_index_t end_piece () const;
   piece_index_t last_piece () const;
   index_range<piece_index_t> piece_range () const;
   sha1_hash info_hash () const noexcept;
   info_hash_t const& info_hashes () const;
   bool v1 () const;
   bool v2 () const;
   int num_files () const;
   std::vector<file_slice> map_block (piece_index_t const piece
      , std::int64_t offset, int size) const;
   peer_request map_file (file_index_t const file, std::int64_t offset, int size) const;
   string_view ssl_cert () const;
   bool is_valid () const;
   bool priv () const;
   bool is_i2p () const;
   int piece_size (piece_index_t index) const;
   sha1_hash hash_for_piece (piece_index_t index) const;
   char const* hash_for_piece_ptr (piece_index_t const index) const;
   bool is_loaded () const;
   const std::string& name () const;
   std::time_t creation_date () const;
   const std::string& creator () const;
   const std::string& comment () const;
   std::vector<std::pair<std::string, int>> const& nodes () const;
   void add_node (std::pair<std::string, int> const& node);
   bool parse_info_section (bdecode_node const& info, error_code& ec, int max_pieces);
   bdecode_node info (char const* key) const;
   span<char const> info_section () const;
   span<char const> piece_layer (file_index_t) const;
   void free_piece_layers ();
};
[report issue]

torrent_info()

torrent_info (span<char const> buffer, error_code& ec, from_span_t);
explicit torrent_info (info_hash_t const& info_hash);
explicit torrent_info (std::string const& filename);
torrent_info (std::string const& filename, error_code& ec);
torrent_info (char const* buffer, int size);
torrent_info (bdecode_node const& torrent_file, load_torrent_limits const& cfg);
torrent_info (char const* buffer, int size, error_code& ec);
torrent_info (bdecode_node const& torrent_file, error_code& ec);
torrent_info (span<char const> buffer, load_torrent_limits const& cfg, from_span_t);
explicit torrent_info (bdecode_node const& torrent_file);
torrent_info (torrent_info const& t);
explicit torrent_info (span<char const> buffer, from_span_t);
torrent_info (std::string const& filename, load_torrent_limits const& cfg);

The constructor that takes an info-hash will initialize the info-hash to the given value, but leave all other fields empty. This is used internally when downloading torrents without the metadata. The metadata will be created by libtorrent as soon as it has been downloaded from the swarm.

The constructor that takes a bdecode_node will create a torrent_info object from the information found in the given torrent_file. The bdecode_node represents a tree node in an bencoded file. To load an ordinary .torrent file into a bdecode_node, use bdecode().

The version that takes a buffer pointer and a size will decode it as a .torrent file and initialize the torrent_info object for you.

The version that takes a filename will simply load the torrent file and decode it inside the constructor, for convenience. This might not be the most suitable for applications that want to be able to report detailed errors on what might go wrong.

There is an upper limit on the size of the torrent file that will be loaded by the overload taking a filename. If it's important that even very large torrent files are loaded, use one of the other overloads.

The overloads that takes an error_code const& never throws if an error occur, they will simply set the error code to describe what went wrong and not fully initialize the torrent_info object. The overloads that do not take the extra error_code parameter will always throw if an error occurs. These overloads are not available when building without exception support.

The overload that takes a span also needs an extra parameter of type from_span_t to disambiguate the std::string overload for string literals. There is an object in the libtorrent namespace of this type called from_span.

[report issue]

~torrent_info()

~torrent_info ();

frees all storage associated with this torrent_info object

[report issue]

orig_files() files()

file_storage const& files () const;
file_storage const& orig_files () const;

The file_storage object contains the information on how to map the pieces to files. It is separated from the torrent_info object because when creating torrents a storage object needs to be created without having a torrent file. When renaming files in a storage, the storage needs to make its own copy of the file_storage in order to make its mapping differ from the one in the torrent file.

orig_files() returns the original (unmodified) file storage for this torrent. This is used by the web server connection, which needs to request files with the original names. Filename may be changed using torrent_info::rename_file().

For more information on the file_storage object, see the separate document on how to create torrents.

[report issue]

rename_file()

void rename_file (file_index_t index, std::string const& new_filename);

Renames the file with the specified index to the new name. The new filename is reflected by the file_storage returned by files() but not by the one returned by orig_files().

If you want to rename the base name of the torrent (for a multi file torrent), you can copy the file_storage (see files() and orig_files() ), change the name, and then use remap_files().

The new_filename can both be a relative path, in which case the file name is relative to the save_path of the torrent. If the new_filename is an absolute path (i.e. is_complete(new_filename) == true), then the file is detached from the save_path of the torrent. In this case the file is not moved when move_storage() is invoked.

[report issue]

remap_files()

void remap_files (file_storage const& f);

Warning

Using remap_files() is discouraged as it's incompatible with v2 torrents. This is because the piece boundaries and piece hashes in v2 torrents are intimately tied to the file boundaries. Instead, just rename individual files, or implement a custom disk_interface to customize how to store files.

Remaps the file storage to a new file layout. This can be used to, for instance, download all data in a torrent to a single file, or to a number of fixed size sector aligned files, regardless of the number and sizes of the files in the torrent.

The new specified file_storage must have the exact same size as the current one.

[report issue]

clear_trackers() trackers() add_tracker()

void add_tracker (std::string const& url, int tier
      , announce_entry::tracker_source source);
std::vector<announce_entry> const& trackers () const;
void clear_trackers ();
void add_tracker (std::string const& url, int tier = 0);

add_tracker() adds a tracker to the announce-list. The tier determines the order in which the trackers are to be tried. The trackers() function will return a sorted vector of announce_entry. Each announce entry contains a string, which is the tracker url, and a tier index. The tier index is the high-level priority. No matter which trackers that works or not, the ones with lower tier will always be tried before the one with higher tier number. For more information, see announce_entry.

trackers() returns all entries from announce-list.

clear_trackers() removes all trackers from announce-list.

[report issue]

collections() similar_torrents()

std::vector<sha1_hash> similar_torrents () const;
std::vector<std::string> collections () const;

These two functions are related to BEP 38 (mutable torrents). The vectors returned from these correspond to the "similar" and "collections" keys in the .torrent file. Both info-hashes and collections from within the info-dict and from outside of it are included.

[report issue]

add_http_seed() web_seeds() set_web_seeds() add_url_seed()

void set_web_seeds (std::vector<web_seed_entry> seeds);
void add_http_seed (std::string const& url
      , std::string const& extern_auth = std::string()
      , web_seed_entry::headers_t const& extra_headers = web_seed_entry::headers_t());
std::vector<web_seed_entry> const& web_seeds () const;
void add_url_seed (std::string const& url
      , std::string const& ext_auth = std::string()
      , web_seed_entry::headers_t const& ext_headers = web_seed_entry::headers_t());

web_seeds() returns all url seeds and http seeds in the torrent. Each entry is a web_seed_entry and may refer to either a url seed or http seed.

add_url_seed() and add_http_seed() adds one url to the list of url/http seeds.

set_web_seeds() replaces all web seeds with the ones specified in the seeds vector.

The extern_auth argument can be used for other authorization schemes than basic HTTP authorization. If set, it will override any username and password found in the URL itself. The string will be sent as the HTTP authorization header's value (without specifying "Basic").

The extra_headers argument defaults to an empty list, but can be used to insert custom HTTP headers in the requests to a specific web seed.

See http seeding for more information.

[report issue]

total_size()

std::int64_t total_size () const;

total_size() returns the total number of bytes the torrent-file represents. Note that this is the number of pieces times the piece size (modulo the last piece possibly being smaller). With pad files, the total size will be larger than the sum of all (regular) file sizes.

[report issue]

num_pieces() piece_length()

int num_pieces () const;
int piece_length () const;

piece_length() and num_pieces() returns the number of byte for each piece and the total number of pieces, respectively. The difference between piece_size() and piece_length() is that piece_size() takes the piece index as argument and gives you the exact size of that piece. It will always be the same as piece_length() except in the case of the last piece, which may be smaller.

[report issue]

end_piece() last_piece() piece_range()

piece_index_t end_piece () const;
piece_index_t last_piece () const;
index_range<piece_index_t> piece_range () const;

last_piece() returns the index to the last piece in the torrent and end_piece() returns the index to the one-past-end piece in the torrent piece_range() returns an implementation-defined type that can be used as the container in a range-for loop. Where the values are the indices of all pieces in the file_storage.

[report issue]

info_hashes() info_hash()

sha1_hash info_hash () const noexcept;
info_hash_t const& info_hashes () const;

returns the info-hash of the torrent. For BitTorrent v2 support, use info_hashes() to get an object that may hold both a v1 and v2 info-hash

[report issue]

v1() v2()

bool v1 () const;
bool v2 () const;

returns whether this torrent has v1 and/or v2 metadata, respectively. Hybrid torrents have both. These are shortcuts for info_hashes().has_v1() and info_hashes().has_v2() calls.

[report issue]

num_files()

int num_files () const;

If you need index-access to files you can use the num_files() along with the file_path(), file_size()-family of functions to access files using indices.

[report issue]

map_block()

std::vector<file_slice> map_block (piece_index_t const piece
      , std::int64_t offset, int size) const;

This function will map a piece index, a byte offset within that piece and a size (in bytes) into the corresponding files with offsets where that data for that piece is supposed to be stored. See file_slice.

[report issue]

map_file()

peer_request map_file (file_index_t const file, std::int64_t offset, int size) const;

This function will map a range in a specific file into a range in the torrent. The file_offset parameter is the offset in the file, given in bytes, where 0 is the start of the file. See peer_request.

The input range is assumed to be valid within the torrent. file_offset + size is not allowed to be greater than the file size. file_index must refer to a valid file, i.e. it cannot be >= num_files().

[report issue]

ssl_cert()

string_view ssl_cert () const;

Returns the SSL root certificate for the torrent, if it is an SSL torrent. Otherwise returns an empty string. The certificate is the public certificate in x509 format.

[report issue]

is_valid()

bool is_valid () const;

returns true if this torrent_info object has a torrent loaded. This is primarily used to determine if a magnet link has had its metadata resolved yet or not.

[report issue]

priv()

bool priv () const;

returns true if this torrent is private. i.e., the client should not advertise itself on the trackerless network (the Kademlia DHT) for this torrent.

[report issue]

is_i2p()

bool is_i2p () const;

returns true if this is an i2p torrent. This is determined by whether or not it has a tracker whose URL domain name ends with ".i2p". i2p torrents disable the DHT and local peer discovery as well as talking to peers over anything other than the i2p network.

[report issue]

piece_size()

int piece_size (piece_index_t index) const;

returns the piece size of file with index. This will be the same as piece_length(), except for the last piece, which may be shorter.

[report issue]

hash_for_piece_ptr() hash_for_piece()

sha1_hash hash_for_piece (piece_index_t index) const;
char const* hash_for_piece_ptr (piece_index_t const index) const;

hash_for_piece() takes a piece-index and returns the 20-bytes sha1-hash for that piece and info_hash() returns the 20-bytes sha1-hash for the info-section of the torrent file. hash_for_piece_ptr() returns a pointer to the 20 byte sha1 digest for the piece. Note that the string is not 0-terminated.

[report issue]

name()

const std::string& name () const;

name() returns the name of the torrent. name contains UTF-8 encoded string.

[report issue]

creation_date()

std::time_t creation_date () const;

creation_date() returns the creation date of the torrent as time_t (posix time). If there's no time stamp in the torrent file, 0 is returned. .. posix time: http://www.opengroup.org/onlinepubs/009695399/functions/time.html

[report issue]

creator()

const std::string& creator () const;

creator() returns the creator string in the torrent. If there is no creator string it will return an empty string.

[report issue]

comment()

const std::string& comment () const;

comment() returns the comment associated with the torrent. If there's no comment, it will return an empty string. comment contains UTF-8 encoded string.

[report issue]

nodes()

std::vector<std::pair<std::string, int>> const& nodes () const;

If this torrent contains any DHT nodes, they are put in this vector in their original form (host name and port number).

[report issue]

add_node()

void add_node (std::pair<std::string, int> const& node);

This is used when creating torrent. Use this to add a known DHT node. It may be used, by the client, to bootstrap into the DHT network.

[report issue]

parse_info_section()

bool parse_info_section (bdecode_node const& info, error_code& ec, int max_pieces);

populates the torrent_info by providing just the info-dict buffer. This is used when loading a torrent from a magnet link for instance, where we only have the info-dict. The bdecode_node e points to a parsed info-dictionary. ec returns an error code if something fails (typically if the info dictionary is malformed). The max_pieces parameter allows limiting the amount of memory dedicated to loading the torrent, and fails for torrents that exceed the limit. To load large torrents, this limit may also need to be raised in settings_pack::max_piece_count and in calls to read_resume_data().

[report issue]

info()

bdecode_node info (char const* key) const;

This function looks up keys from the info-dictionary of the loaded torrent file. It can be used to access extension values put in the .torrent file. If the specified key cannot be found, it returns nullptr.

[report issue]

info_section()

span<char const> info_section () const;

returns a the raw info section of the torrent file. The underlying buffer is still owned by the torrent_info object

[report issue]

piece_layer()

span<char const> piece_layer (file_index_t) const;

return the bytes of the piece layer hashes for the specified file. If the file doesn't have a piece layer, an empty span is returned. The span size is divisible by 32, the size of a SHA-256 hash. If the size of the file is smaller than or equal to the piece size, the files "root hash" is the hash of the file and is not saved separately in the "piece layers" field, but this function still returns the root hash of the file in that case.

[report issue]

free_piece_layers()

void free_piece_layers ();

clears the piece layers from the torrent_info. This is done by the session when a torrent is added, to avoid storing it twice. The piece layer (or other hashes part of the merkle tree) are stored in the internal torrent object.

libtorrent-rasterbar-2.0.5/docs/reference-Add_Torrent.html0000664000175000017500000007742214152763504022665 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

client_data_t

Declared in "libtorrent/client_data.hpp"

A thin wrapper around a void pointer used as "user data". i.e. an opaque cookie passed in to libtorrent and returned on demand. It adds type-safety by requiring the same type be requested out of it as was assigned to it.

struct client_data_t
{
   client_data_t () = default;
   explicit client_data_t (T* v);
   client_data_t& operator= (T* v);
   T* get () const;
   explicit operator T () const;
   operator void const* () const = delete;
   client_data_t& operator= (void const*) = delete;
   operator void* () const = delete;
   client_data_t& operator= (void*) = delete;

   template <typename T, typename U  = typename std::enable_if<std::is_pointer<T>::value>::type>
};
[report issue]

client_data_t()

client_data_t () = default;

construct a nullptr client data

[report issue]

void*() operator=() const*()

operator void const* () const = delete;
client_data_t& operator= (void const*) = delete;
operator void* () const = delete;
client_data_t& operator= (void*) = delete;

we don't allow type-unsafe operations

[report issue]

add_torrent_params

Declared in "libtorrent/add_torrent_params.hpp"

The add_torrent_params is a parameter pack for adding torrents to a session. The key fields when adding a torrent are:

  • ti - when you have loaded a .torrent file into a torrent_info object
  • info_hash - when you don't have the metadata (.torrent file) but. This is set when adding a magnet link.

one of those fields must be set. Another mandatory field is save_path. The add_torrent_params object is passed into one of the session::add_torrent() overloads or session::async_add_torrent().

If you only specify the info-hash, the torrent file will be downloaded from peers, which requires them to support the metadata extension. For the metadata extension to work, libtorrent must be built with extensions enabled (TORRENT_DISABLE_EXTENSIONS must not be defined). It also takes an optional name argument. This may be left empty in case no name should be assigned to the torrent. In case it's not, the name is used for the torrent as long as it doesn't have metadata. See torrent_handle::name.

The add_torrent_params is also used when requesting resume data for a torrent. It can be saved to and restored from a file and added back to a new session. For serialization and de-serialization of add_torrent_params objects, see read_resume_data() and write_resume_data().

struct add_torrent_params
{
   int version  = LIBTORRENT_VERSION_NUM;
   std::shared_ptr<torrent_info> ti;
   aux::noexcept_movable<std::vector<std::string>> trackers;
   aux::noexcept_movable<std::vector<int>> tracker_tiers;
   aux::noexcept_movable<std::vector<std::pair<std::string, int>>> dht_nodes;
   std::string name;
   std::string save_path;
   storage_mode_t storage_mode  = storage_mode_sparse;
   client_data_t userdata;
   aux::noexcept_movable<std::vector<download_priority_t>> file_priorities;
   std::string trackerid;
   torrent_flags_t flags  = torrent_flags::default_flags;
   info_hash_t info_hashes;
   int max_uploads  = -1;
   int max_connections  = -1;
   int upload_limit  = -1;
   int download_limit  = -1;
   std::int64_t total_uploaded  = 0;
   std::int64_t total_downloaded  = 0;
   int active_time  = 0;
   int finished_time  = 0;
   int seeding_time  = 0;
   std::time_t added_time  = 0;
   std::time_t completed_time  = 0;
   std::time_t last_seen_complete  = 0;
   int num_complete  = -1;
   int num_incomplete  = -1;
   int num_downloaded  = -1;
   aux::noexcept_movable<std::vector<std::string>> http_seeds;
   aux::noexcept_movable<std::vector<std::string>> url_seeds;
   aux::noexcept_movable<std::vector<tcp::endpoint>> peers;
   aux::noexcept_movable<std::vector<tcp::endpoint>> banned_peers;
   aux::noexcept_movable<std::map<piece_index_t, bitfield>> unfinished_pieces;
   typed_bitfield<piece_index_t> have_pieces;
   typed_bitfield<piece_index_t> verified_pieces;
   aux::noexcept_movable<std::vector<download_priority_t>> piece_priorities;
   aux::vector<std::vector<sha256_hash>, file_index_t> merkle_trees;
   aux::vector<std::vector<bool>, file_index_t> merkle_tree_mask;
   aux::vector<std::vector<bool>, file_index_t> verified_leaf_hashes;
   aux::noexcept_movable<std::map<file_index_t, std::string>> renamed_files;
   std::time_t last_download  = 0;
   std::time_t last_upload  = 0;
};
[report issue]
version
filled in by the constructor and should be left untouched. It is used for forward binary compatibility.
[report issue]
ti
torrent_info object with the torrent to add. Unless the info_hash is set, this is required to be initialized.
[report issue]
trackers
If the torrent doesn't have a tracker, but relies on the DHT to find peers, the trackers can specify tracker URLs for the torrent.
[report issue]
tracker_tiers
the tiers the URLs in trackers belong to. Trackers belonging to different tiers may be treated differently, as defined by the multi tracker extension. This is optional, if not specified trackers are assumed to be part of tier 0, or whichever the last tier was as iterating over the trackers.
[report issue]
dht_nodes
a list of hostname and port pairs, representing DHT nodes to be added to the session (if DHT is enabled). The hostname may be an IP address.
[report issue]
name
in case there's no other name in this torrent, this name will be used. The name out of the torrent_info object takes precedence if available.
[report issue]
save_path

the path where the torrent is or will be stored.

Note

On windows this path (and other paths) are interpreted as UNC paths. This means they must use backslashes as directory separators and may not contain the special directories "." or "..".

Setting this to an absolute path performs slightly better than a relative path.

[report issue]
storage_mode
One of the values from storage_mode_t. For more information, see storage allocation.
[report issue]
userdata
The userdata parameter is optional and will be passed on to the extension constructor functions, if any (see torrent_handle::add_extension()). It will also be stored in the torrent object and can be retrieved by calling userdata().
[report issue]
file_priorities
can be set to control the initial file priorities when adding a torrent. The semantics are the same as for torrent_handle::prioritize_files(). The file priorities specified in here take precedence over those specified in the resume data, if any.
[report issue]
trackerid
the default tracker id to be used when announcing to trackers. By default this is empty, and no tracker ID is used, since this is an optional argument. If a tracker returns a tracker ID, that ID is used instead of this.
[report issue]
flags

flags controlling aspects of this torrent and how it's added. See torrent_flags_t for details.

Note

The flags field is initialized with default flags by the constructor. In order to preserve default behavior when clearing or setting other flags, make sure to bitwise OR or in a flag or bitwise AND the inverse of a flag to clear it.

[report issue]
info_hashes
set this to the info hash of the torrent to add in case the info-hash is the only known property of the torrent. i.e. you don't have a .torrent file nor a magnet link. To add a magnet link, use parse_magnet_uri() to populate fields in the add_torrent_params object.
[report issue]
max_uploads max_connections

max_uploads, max_connections, upload_limit, download_limit correspond to the set_max_uploads(), set_max_connections(), set_upload_limit() and set_download_limit() functions on torrent_handle. These values let you initialize these settings when the torrent is added, instead of calling these functions immediately following adding it.

-1 means unlimited on these settings just like their counterpart functions on torrent_handle

For fine grained control over rate limits, including making them apply to local peers, see peer classes.

[report issue]
upload_limit download_limit
the upload and download rate limits for this torrent, specified in bytes per second. -1 means unlimited.
[report issue]
total_uploaded total_downloaded
the total number of bytes uploaded and downloaded by this torrent so far.
[report issue]
active_time finished_time seeding_time
the number of seconds this torrent has spent in started, finished and seeding state so far, respectively.
[report issue]
added_time completed_time
if set to a non-zero value, this is the posix time of when this torrent was first added, including previous runs/sessions. If set to zero, the internal added_time will be set to the time of when add_torrent() is called.
[report issue]
last_seen_complete
if set to non-zero, initializes the time (expressed in posix time) when we last saw a seed or peers that together formed a complete copy of the torrent. If left set to zero, the internal counterpart to this field will be updated when we see a seed or a distributed copies >= 1.0.
[report issue]
num_complete num_incomplete num_downloaded

these field can be used to initialize the torrent's cached scrape data. The scrape data is high level metadata about the current state of the swarm, as returned by the tracker (either when announcing to it or by sending a specific scrape request). num_complete is the number of peers in the swarm that are seeds, or have every piece in the torrent. num_incomplete is the number of peers in the swarm that do not have every piece. num_downloaded is the number of times the torrent has been downloaded (not initiated, but the number of times a download has completed).

Leaving any of these values set to -1 indicates we don't know, or we have not received any scrape data.

[report issue]
http_seeds url_seeds

URLs can be added to these two lists to specify additional web seeds to be used by the torrent. If the flag_override_web_seeds is set, these will be the _only_ ones to be used. i.e. any web seeds found in the .torrent file will be overridden.

http_seeds expects URLs to web servers implementing the original HTTP seed specification BEP 17.

url_seeds expects URLs to regular web servers, aka "get right" style, specified in BEP 19.

[report issue]
peers
peers to add to the torrent, to be tried to be connected to as bittorrent peers.
[report issue]
banned_peers
peers banned from this torrent. The will not be connected to
[report issue]
unfinished_pieces
this is a map of partially downloaded piece. The key is the piece index and the value is a bitfield where each bit represents a 16 kiB block. A set bit means we have that block.
[report issue]
have_pieces
this is a bitfield indicating which pieces we already have of this torrent.
[report issue]
verified_pieces
when in seed_mode, pieces with a set bit in this bitfield have been verified to be valid. Other pieces will be verified the first time a peer requests it.
[report issue]
piece_priorities
this sets the priorities for each individual piece in the torrent. Each element in the vector represent the piece with the same index. If you set both file- and piece priorities, file priorities will take precedence.
[report issue]
merkle_trees
v2 hashes, if known
[report issue]
merkle_tree_mask
if set, indicates which hashes are included in the corresponding vector of merkle_trees. These bitmasks always cover the full tree, a cleared bit means the hash is all zeros (i.e. not set) and set bit means the next hash in the corresponding vector in merkle_trees is the hash for that node. This is an optimization to avoid storing a lot of zeros.
[report issue]
verified_leaf_hashes
bit-fields indicating which v2 leaf hashes have been verified against the root hash. If this vector is empty and merkle_trees is non-empty it implies that all hashes in merkle_trees are verified.
[report issue]
renamed_files
this is a map of file indices in the torrent and new filenames to be applied before the torrent is added.
[report issue]
last_download last_upload
the posix time of the last time payload was received or sent for this torrent, respectively.
libtorrent-rasterbar-2.0.5/docs/tutorial-ref.rst0000664000175000017500000003730314152763504020777 0ustar arvidarvid .. include:: header.rst .. contents:: Table of contents :depth: 2 :backlinks: none tutorial ======== The fundamental feature of starting and downloading torrents in libtorrent is achieved by creating a *session*, which provides the context and a container for torrents. This is done with via the `session`__ class, most of its interface is documented under `session_handle`__ though. To add a torrent to the `session`__, you fill in an `add_torrent_params`__ object and pass it either to `add_torrent()`__ or `async_add_torrent()`__. ``add_torrent()`` is a blocking call which returns a `torrent_handle`__. For example: .. code:: c++ #include #include #include #include int main(int argc, char const* argv[]) { if (argc != 2) { fprintf(stderr, "usage: %s \n"); return 1; } lt::session ses; lt::add_torrent_params atp = lt::parse_magnet_uri(argv[1]); atp.save_path = "."; // save in current dir lt::torrent_handle h = ses.add_torrent(atp); // ... } Once you have a `torrent_handle`__, you can affect it as well as querying status. First, let's extend the example to print out messages from the bittorrent engine about progress and events happening under the hood. libtorrent has a mechanism referred to as *alerts* to communicate back information to the client application. Clients can poll a `session`__ for new alerts via the `pop_alerts()`__ call. This function fills in a vector of `alert`__ pointers with all new alerts since the last call to this function. The pointers are owned by the `session`__ object at will become invalidated by the next call to `pop_alerts()`__. The alerts form a class hierarchy with `alert`__ as the root class. Each specific kind of `alert`__ may include additional state, specific to the kind of message. All alerts implement a `message()`__ function that prints out pertinent information of the `alert`__ message. This can be convenient for simply logging events. For programmatically react to certain events, use alert_cast to attempt a down cast of an `alert`__ object to a more specific type. In order to print out events from libtorrent as well as exiting when the torrent completes downloading, we can poll the `session`__ for alerts periodically and print them out, as well as listening for the `torrent_finished_alert`__, which is posted when a torrent completes. __ reference-Session.html#session __ reference-Session.html#session_handle __ reference-Session.html#session __ reference-Add_Torrent.html#add_torrent_params __ reference-Session.html#add_torrent() __ reference-Session.html#async_add_torrent() __ reference-Torrent_Handle.html#torrent_handle __ reference-Torrent_Handle.html#torrent_handle __ reference-Session.html#session __ reference-Session.html#pop_alerts() __ reference-Alerts.html#alert __ reference-Session.html#session __ reference-Session.html#pop_alerts() __ reference-Alerts.html#alert __ reference-Alerts.html#alert __ reference-Alerts.html#message() __ reference-Alerts.html#alert __ reference-Alerts.html#alert __ reference-Session.html#session __ reference-Alerts.html#torrent_finished_alert .. include:: ../examples/bt-get.cpp :code: c++ :tab-width: 2 :start-after: */ alert masks ----------- The output from this program will be quite verbose, which is probably a good starting point to get some understanding of what's going on. Alerts are categorized into `alert`__ categories. Each category can be enabled and disabled independently via the *alert mask*. The `alert`__ mask is a configuration option offered by libtorrent. There are many configuration options, see `settings_pack`__. The alert_mask setting is an integer of the category flags ORed together. For instance, to only see the most pertinent alerts, the `session`__ can be constructed like this: .. code:: c++ lt::settings_pack pack; pack.set_int(lt::settings_pack::alert_mask , lt::alert_category::error | lt::alert_category::storage | lt::alert_category::status); lt::session ses(pack); Configuration options can be updated after the `session`__ is started by calling `apply_settings()`__. Some settings are best set before starting the `session`__ though, like listen_interfaces, to avoid race conditions. If you start the `session`__ with the default settings and then immediately change them, there will still be a window where the default settings apply. Changing the settings may trigger listen sockets to close and re-open and NAT-PMP, UPnP updates to be sent. For this reason, it's typically a good idea to batch settings updates into a single call. session destruction ------------------- The `session`__ destructor is blocking by default. When shutting down, trackers will need to be contacted to stop torrents and other outstanding operations need to be cancelled. Shutting down can sometimes take several seconds, primarily because of trackers that are unresponsive (and time out) and also DNS servers that are unresponsive. DNS lookups are especially difficult to abort when stalled. In order to be able to start destruction asynchronously, one can call `session::abort()`__. This call returns a `session_proxy`__ object, which is a handle keeping the `session`__ state alive while shutting it down. It deliberately does not provide any of the `session`__ operations, since it's shutting down. After having a `session_proxy`__ object, the `session`__ destructor does not block. However, the `session_proxy`__ destructor *will*. This can be used to shut down multiple sessions or other parts of the application in parallel. asynchronous operations ----------------------- Essentially any call to a member function of `session`__ or `torrent_handle`__ that returns a value is a blocking synchronous call. Meaning it will post a message to the main libtorrent thread and wait for a response. Such calls may be expensive, and in applications where stalls should be avoided (such as user interface threads), blocking calls should be avoided. In the example above, session::add_torrent() returns a `torrent_handle`__ and is thus blocking. For higher efficiency, `async_add_torrent()`__ will post a message to the main thread to add a torrent, and post the resulting `torrent_handle`__ back in an `alert`__ (`add_torrent_alert`__). This is especially useful when adding a lot of torrents in quick succession, as there's no stall in between calls. In the example above, we don't actually use the `torrent_handle`__ for anything, so converting it to use `async_add_torrent()`__ is just a matter of replacing the `add_torrent()`__ call with `async_add_torrent()`__. torrent_status_updates ---------------------- To get updates to the status of torrents, call `post_torrent_updates()`__ on the `session`__ object. This will cause libtorrent to post a `state_update_alert`__ containing `torrent_status`__ objects for all torrents whose status has *changed* since the last call to `post_torrent_updates()`__. The `state_update_alert`__ looks something like this: .. code:: c++ struct state_update_alert : alert { virtual std::string message() const; std::vector status; }; The ``status`` field only contains the `torrent_status`__ for torrents with updates since the last call. It may be empty if no torrent has updated its state. This feature is critical for scalability. See the `torrent_status`__ object for more information on what is in there. Perhaps the most interesting fields are ``total_payload_download``, ``total_payload_upload``, ``num_peers`` and ``state``. resuming torrents ----------------- Since bittorrent downloads pieces of files in random order, it's not trivial to resume a partial download. When resuming a download, the bittorrent engine must restore the state of the downloading torrent, specifically which parts of the file(s) are downloaded. There are two approaches to doing this: 1. read every piece of the downloaded files from disk and compare it against its expected hash. 2. save, to disk, the state of which pieces (and partial pieces) are downloaded, and load it back in again when resuming. If no resume data is provided with a torrent that's added, libtorrent will employ (1) by default. To save resume data, call `save_resume_data()`__ on the `torrent_handle`__ object. This will ask libtorrent to generate the resume data and post it back in a `save_resume_data_alert`__. If generating the resume data fails for any reason, a `save_resume_data_failed_alert`__ is posted instead. Exactly one of those alerts will be posted for every call to `save_resume_data()`__. This is an important property when shutting down a `session`__ with multiple torrents, every resume `alert`__ must be handled before resuming with shut down. Any torrent may fail to save resume data, so the client would need to keep a count of the outstanding resume files, decremented on either `save_resume_data_alert`__ or `save_resume_data_failed_alert`__. The `save_resume_data_alert`__ looks something like this: .. code:: c++ struct save_resume_data_alert : torrent_alert { virtual std::string message() const; // the resume data add_torrent_params params; }; The ``params`` field is an `add_torrent_params`__ object containing all the state to add the torrent back to the `session`__ again. This object can be serialized using `write_resume_data()`__ or `write_resume_data_buf()`__, and de-serialized with `read_resume_data()`__. example ------- Here's an updated version of the above example with the following updates: 1. not using blocking calls 2. printing torrent status updates rather than the raw log 3. saving and loading resume files __ reference-Alerts.html#alert __ reference-Alerts.html#alert __ reference-Settings.html#settings_pack __ reference-Session.html#session __ reference-Session.html#session __ reference-Session.html#apply_settings() __ reference-Session.html#session __ reference-Session.html#session __ reference-Session.html#session __ reference-Session.html#abort() __ reference-Session.html#session_proxy __ reference-Session.html#session __ reference-Session.html#session __ reference-Session.html#session_proxy __ reference-Session.html#session __ reference-Session.html#session_proxy __ reference-Session.html#session __ reference-Torrent_Handle.html#torrent_handle __ reference-Torrent_Handle.html#torrent_handle __ reference-Session.html#async_add_torrent() __ reference-Torrent_Handle.html#torrent_handle __ reference-Alerts.html#alert __ reference-Alerts.html#add_torrent_alert __ reference-Torrent_Handle.html#torrent_handle __ reference-Session.html#async_add_torrent() __ reference-Session.html#add_torrent() __ reference-Session.html#async_add_torrent() __ reference-Session.html#post_torrent_updates() __ reference-Session.html#session __ reference-Alerts.html#state_update_alert __ reference-Torrent_Status.html#torrent_status __ reference-Session.html#post_torrent_updates() __ reference-Alerts.html#state_update_alert __ reference-Torrent_Status.html#torrent_status __ reference-Torrent_Status.html#torrent_status __ reference-Torrent_Handle.html#save_resume_data() __ reference-Torrent_Handle.html#torrent_handle __ reference-Alerts.html#save_resume_data_alert __ reference-Alerts.html#save_resume_data_failed_alert __ reference-Torrent_Handle.html#save_resume_data() __ reference-Session.html#session __ reference-Alerts.html#alert __ reference-Alerts.html#save_resume_data_alert __ reference-Alerts.html#save_resume_data_failed_alert __ reference-Alerts.html#save_resume_data_alert __ reference-Add_Torrent.html#add_torrent_params __ reference-Session.html#session __ reference-Resume_Data.html#write_resume_data() __ reference-Resume_Data.html#write_resume_data_buf() __ reference-Resume_Data.html#read_resume_data() .. include:: ../examples/bt-get2.cpp :code: c++ :tab-width: 2 :start-after: */ session state ------------- On construction, a `session`__ object is configured by a `session_params`__ object. The `session_params`__ object notably contain session_settings, the state of the DHT node (e.g. routing table), the session's IP filter as well as the disk I/O back-end and dht storage to use. There are functions to serialize and de-serialize the `session_params`__ object to help in restoring `session`__ state from last run. Doing so is especially helpful for bootstrapping the DHT, using nodes from last run. Before destructing the `session`__ object, call ``session::session_state()`` to get the current state as a `session_params`__ object. Call `write_session_params()`__ or `write_session_params_buf()`__ to serialize the state into a bencoded `entry`__ or to a flat buffer (``std::vector``) respectively. On startup, before constructing the `session`__ object, load the buffer back from disk and call `read_session_params()`__ to de-serialize it back into a `session_params`__ object. Before passing it into the `session`__ constructor is your chance to set update the `settings_pack`__ (``params``) member of settings_params, or configuring the disk_io_constructor. example ------- Another updated version of the above example with the following updates: 1. load and save `session_params`__ to file ".session" 2. allow shutting down on ``SIGINT`` __ reference-Session.html#session __ reference-Session.html#session_params __ reference-Session.html#session_params __ reference-Session.html#session_params __ reference-Session.html#session __ reference-Session.html#session __ reference-Session.html#session_params __ reference-Session.html#write_session_params() __ reference-Session.html#write_session_params_buf() __ reference-Bencoding.html#entry __ reference-Session.html#session __ reference-Session.html#read_session_params() __ reference-Session.html#session_params __ reference-Session.html#session __ reference-Settings.html#settings_pack __ reference-Session.html#session_params .. include:: ../examples/bt-get3.cpp :code: c++ :tab-width: 2 :start-after: */ torrent files ------------- To add torrent files to a `session`__ (as opposed to a magnet link), it must first be loaded into a `torrent_info`__ object. The `torrent_info`__ object can be created either by filename a buffer or a bencoded structure. When adding by filename, there's a sanity check limit on the size of the file, for adding arbitrarily large torrents, load the file outside of the constructor. The `torrent_info`__ object provides an opportunity to query information about the .torrent file as well as mutating it before adding it to the `session`__. bencoding --------- bencoded structures is the default data storage format used by bittorrent, such as .torrent files, tracker announce and scrape responses and some wire protocol extensions. libtorrent provides an efficient framework for decoding bencoded data through `bdecode()`__ function. There are two separate mechanisms for *encoding* and *decoding*. When decoding, use the `bdecode()`__ function that returns a `bdecode_node`__. When encoding, use `bencode()`__ taking an `entry`__ object. The key property of `bdecode()`__ is that it does not copy any data out of the buffer that was parsed. It builds the tree structures of references pointing into the buffer. The buffer must stay alive and valid for as long as the `bdecode_node`__ is in use. For performance details on `bdecode()`__, see the `blog post`_ about it. .. _`blog post`: https://blog.libtorrent.org/2015/03/bdecode-parsers/ __ reference-Session.html#session __ reference-Torrent_Info.html#torrent_info __ reference-Torrent_Info.html#torrent_info __ reference-Torrent_Info.html#torrent_info __ reference-Session.html#session __ reference-Bdecoding.html#bdecode() __ reference-Bdecoding.html#bdecode() __ reference-Bdecoding.html#bdecode_node __ reference-Bencoding.html#bencode() __ reference-Bencoding.html#entry __ reference-Bdecoding.html#bdecode() __ reference-Bdecoding.html#bdecode_node __ reference-Bdecoding.html#bdecode() libtorrent-rasterbar-2.0.5/docs/reference-Session.html0000664000175000017500000030434514152763504022100 0ustar arvidarvid libtorrent
libtorrent logo
Version: 2.0.5

home

[report issue]

session_params

Declared in "libtorrent/session_params.hpp"

The session_params is a parameters pack for configuring the session before it's started.

struct session_params
{
   session_params ();
   session_params (settings_pack&& sp);
   session_params (settings_pack const& sp);
   session_params (settings_pack const& sp
      , std::vector<std::shared_ptr<plugin>> exts);
   session_params (settings_pack&& sp
      , std::vector<std::shared_ptr<plugin>> exts);

   settings_pack settings;
   std::vector<std::shared_ptr<plugin>> extensions;
   dht::dht_state dht_state;
   dht::dht_storage_constructor_type dht_storage_constructor;
   disk_io_constructor_type disk_io_constructor;
   std::map<std::string, std::string> ext_state;
   libtorrent::ip_filter ip_filter;
};
[report issue]

session_params()

session_params ();
session_params (settings_pack&& sp);
session_params (settings_pack const& sp);

This constructor can be used to start with the default plugins (ut_metadata, ut_pex and smart_ban). Pass a settings_pack to set the initial settings when the session starts.

[report issue]

session_params()

session_params (settings_pack const& sp
      , std::vector<std::shared_ptr<plugin>> exts);
session_params (settings_pack&& sp
      , std::vector<std::shared_ptr<plugin>> exts);

This constructor helps to configure the set of initial plugins to be added to the session before it's started.

[report issue]
settings
The settings to configure the session with
[report issue]
extensions
the plugins to add to the session as it is constructed
[report issue]
dht_state
DHT node ID and node addresses to bootstrap the DHT with.
[report issue]
dht_storage_constructor
function object to construct the storage object for DHT items.
[report issue]
disk_io_constructor
function object to create the disk I/O subsystem. Defaults to default_disk_io_constructor.
[report issue]
ext_state
this container can be used by extensions/plugins to store settings. It's primarily here to make it convenient to save and restore state across sessions, using read_session_params() and write_session_params().
[report issue]
ip_filter
the IP filter to use for the session. This restricts which peers are allowed to connect. As if passed to set_ip_filter().
[report issue]

session_handle

Declared in "libtorrent/session_handle.hpp"

this class provides a non-owning handle to a session and a subset of the interface of the session class. If the underlying session is destructed any handle to it will no longer be valid. is_valid() will return false and any operation on it will throw a system_error exception, with error code invalid_session_handle.

struct session_handle
{
   bool is_valid () const;
   session_params session_state (save_state_flags_t flags = save_state_flags_t::all()) const;
   std::vector<torrent_status> get_torrent_status (
      std::function<bool(torrent_status const&)> const& pred
      , status_flags_t flags = {}) const;
   void refresh_torrent_status (std::vector<torrent_status>* ret
      , status_flags_t flags = {}) const;
   void post_torrent_updates (status_flags_t flags = status_flags_t::all());
   void post_session_stats ();
   void post_dht_stats ();
   void set_dht_state (dht::dht_state&& st);
   void set_dht_state (dht::dht_state const& st);
   torrent_handle find_torrent (sha1_hash const& info_hash) const;
   std::vector<torrent_handle> get_torrents () const;
   torrent_handle add_torrent (add_torrent_params const& params);
   torrent_handle add_torrent (add_torrent_params const& params, error_code& ec);
   void async_add_torrent (add_torrent_params const& params);
   void async_add_torrent (add_torrent_params&& params);
   torrent_handle add_torrent (add_torrent_params&& params, error_code& ec);
   torrent_handle add_torrent (add_torrent_params&& params);
   void pause ();
   void resume ();
   bool is_paused () const;
   bool is_dht_running () const;
   void set_dht_storage (dht::dht_storage_constructor_type sc);
   void add_dht_node (std::pair<std::string, int> const& node);
   void dht_get_item (sha1_hash const& target);
   void dht_get_item (std::array<char, 32> key
      , std::string salt = std::string());
   sha1_hash dht_put_item (entry data);
   void dht_put_item (std::array<char, 32> key
      , std::function<void(entry&, std::array<char, 64>&
      , std::int64_t&, std::string const&)> cb
      , std::string salt = std::string());
   void dht_get_peers (sha1_hash const& info_hash);
   void dht_announce (sha1_hash const& info_hash, int port = 0, dht::announce_flags_t flags = {});
   void dht_live_nodes (sha1_hash const& nid);
   void dht_sample_infohashes (udp::endpoint const& ep, sha1_hash const& target);
   void dht_direct_request (udp::endpoint const& ep, entry const& e, client_data_t userdata = {});
   void add_extension (std::shared_ptr<plugin> ext);
   void add_extension (std::function<std::shared_ptr<torrent_plugin>(
      torrent_handle const&, client_data_t)> ext);
   void set_ip_filter (ip_filter f);
   ip_filter get_ip_filter () const;
   void set_port_filter (port_filter const& f);
   bool is_listening () const;
   unsigned short listen_port () const;
   unsigned short ssl_listen_port () const;
   void set_peer_class_filter (ip_filter const& f);
   ip_filter get_peer_class_filter () const;
   peer_class_type_filter get_peer_class_type_filter () const;
   void set_peer_class_type_filter (peer_class_type_filter const& f);
   peer_class_t create_peer_class (char const* name);
   void delete_peer_class (peer_class_t cid);
   void set_peer_class (peer_class_t cid, peer_class_info const& pci);
   peer_class_info get_peer_class (peer_class_t cid) const;
   void remove_torrent (const torrent_handle&, remove_flags_t = {});
   void apply_settings (settings_pack&&);
   void apply_settings (settings_pack const&);
   settings_pack get_settings () const;
   void set_alert_notify (std::function<void()> const& fun);
   void pop_alerts (std::vector<alert*>* alerts);
   alert* wait_for_alert (time_duration max_wait);
   std::vector<port_mapping_t> add_port_mapping (portmap_protocol t, int external_port, int local_port);
   void delete_port_mapping (port_mapping_t handle);
   void reopen_network_sockets (reopen_network_flags_t options = reopen_map_ports);
   std::shared_ptr<aux::session_impl> native_handle () const;

   static constexpr save_state_flags_t save_settings  = 0_bit;
   static constexpr save_state_flags_t save_dht_state  = 2_bit;
   static constexpr save_state_flags_t save_extension_state  = 11_bit;
   static constexpr save_state_flags_t save_ip_filter  = 12_bit;
   static constexpr peer_class_t global_peer_class_id {0};
   static constexpr peer_class_t tcp_peer_class_id {1};
   static constexpr peer_class_t local_peer_class_id {2};
   static constexpr remove_flags_t delete_files  = 0_bit;
   static constexpr remove_flags_t delete_partfile  = 1_bit;
   static constexpr session_flags_t paused  = 2_bit;
   static constexpr portmap_protocol udp  = portmap_protocol::udp;
   static constexpr portmap_protocol tcp  = portmap_protocol::tcp;
   static constexpr reopen_network_flags_t reopen_map_ports  = 0_bit;
};
[report issue]

is_valid()

bool is_valid () const;

returns true if this handle refers to a valid session object. If the session has been destroyed, all session_handle objects will expire and not be valid.

[report issue]

session_state()

session_params session_state (save_state_flags_t flags = save_state_flags_t::all()) const;

returns the current session state. This can be passed to write_session_params() to save the state to disk and restored using read_session_params() when constructing a new session. The kind of state that's included is all settings, the DHT routing table, possibly plugin-specific state. the flags parameter can be used to only save certain parts of the session state

[report issue]

get_torrent_status() refresh_torrent_status()

std::vector<torrent_status> get_torrent_status (
      std::function<bool(torrent_status const&)> const& pred
      , status_flags_t flags = {}) const;
void refresh_torrent_status (std::vector<torrent_status>* ret
      , status_flags_t flags = {}) const;

Note

these calls are potentially expensive and won't scale well with lots of torrents. If you're concerned about performance, consider using post_torrent_updates() instead.

get_torrent_status returns a vector of the torrent_status for every torrent which satisfies pred, which is a predicate function which determines if a torrent should be included in the returned set or not. Returning true means it should be included and false means excluded. The flags argument is the same as to torrent_handle::status(). Since pred is guaranteed to be called for every torrent, it may be used to count the number of torrents of different categories as well.

refresh_torrent_status takes a vector of torrent_status structs (for instance the same vector that was returned by get_torrent_status() ) and refreshes the status based on the handle member. It is possible to use this function by first setting up a vector of default constructed torrent_status objects, only initializing the handle member, in order to request the torrent status for multiple torrents in a single call. This can save a significant amount of time if you have a lot of torrents.

Any torrent_status object whose handle member is not referring to a valid torrent are ignored.

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.

[report issue]

post_torrent_updates()

void post_torrent_updates (status_flags_t flags = status_flags_t::all());

This functions instructs the session to post the state_update_alert, containing the status of all torrents whose state changed since the last time this function was called.

Only torrents who has the state subscription flag set will be included. This flag is on by default. See add_torrent_params. the flags argument is the same as for torrent_handle::status(). see status_flags_t in torrent_handle.

[report issue]

post_session_stats()

void post_session_stats ();

This function will post a session_stats_alert object, containing a snapshot of the performance counters from the internals of libtorrent. To interpret these counters, query the session via session_stats_metrics().

For more information, see the session statistics section.

[report issue]

post_dht_stats()

void post_dht_stats ();

This will cause a dht_stats_alert to be posted.

[report issue]

set_dht_state()

void set_dht_state (dht::dht_state&& st);
void set_dht_state (dht::dht_state const& st);

set the DHT state for the session. This will be taken into account the next time the DHT is started, as if it had been passed in via the session_params on startup.

[report issue]

get_torrents() find_torrent()

torrent_handle find_torrent (sha1_hash const& info_hash) const;
std::vector<torrent_handle> get_torrents () const;

find_torrent() looks for a torrent with the given info-hash. In case there is such a torrent in the session, a torrent_handle to that torrent is returned. In case the torrent cannot be found, an invalid torrent_handle is returned.

See torrent_handle::is_valid() to know if the torrent was found or not.

get_torrents() returns a vector of torrent_handles to all the torrents currently in the session.

[report issue]

add_torrent() async_add_torrent()

torrent_handle add_torrent (add_torrent_params const& params);
torrent_handle add_torrent (add_torrent_params const& params, error_code& ec);
void async_add_torrent (add_torrent_params const& params);
void async_add_torrent (add_torrent_params&& params);
torrent_handle add_torrent (add_torrent_params&& params, error_code& ec);
torrent_handle add_torrent (add_torrent_params&& params);

You add torrents through the add_torrent() function where you give an object with all the parameters. The add_torrent() overloads will block until the torrent has been added (or failed to be added) and returns an error code and a torrent_handle. In order to add torrents more efficiently, consider using async_add_torrent() which returns immediately, without waiting for the torrent to add. Notification of the torrent being added is sent as add_torrent_alert.

The overload that does not take an error_code throws an exception on error and is not available when building without exception support. The torrent_handle returned by add_torrent() can be used to retrieve information about the torrent's progress, its peers etc. It is also used to abort a torrent.

If the torrent you are trying to add already exists in the session (is either queued for checking, being checked or downloading) add_torrent() will throw system_error which derives from std::exception unless duplicate_is_error is set to false. In that case, add_torrent() will return the handle to the existing torrent.

The add_torrent_params class has a flags field. It can be used to control what state the new torrent will be added in. Common flags to want to control are torrent_flags::paused and torrent_flags::auto_managed. In order to add a magnet link that will just download the metadata, but no payload, set the torrent_flags::upload_mode flag.

[report issue]

resume() is_paused() pause()

void pause ();
void resume ();
bool is_paused () const;

Pausing the session has the same effect as pausing every torrent in it, except that torrents will not be resumed by the auto-manage mechanism. Resuming will restore the torrents to their previous paused state. i.e. the session pause state is separate from the torrent pause state. A torrent is inactive if it is paused or if the session is paused.

[report issue]

is_dht_running()

bool is_dht_running () const;

is_dht_running() returns true if the DHT support has been started and false otherwise.

[report issue]

set_dht_storage()

void set_dht_storage (dht::dht_storage_constructor_type sc);

set_dht_storage set a dht custom storage constructor function to be used internally when the dht is created.

Since the dht storage is a critical component for the dht behavior, this function will only be effective the next time the dht is started. If you never touch this feature, a default map-memory based storage is used.

If you want to make sure the dht is initially created with your custom storage, create a session with the setting settings_pack::enable_dht to false, set your constructor function and call apply_settings with settings_pack::enable_dht to true.

[report issue]

add_dht_node()

void add_dht_node (std::pair<std::string, int> const& node);

add_dht_node takes a host name and port pair. That endpoint will be pinged, and if a valid DHT reply is received, the node will be added to the routing table.

[report issue]

dht_get_item()

void dht_get_item (sha1_hash const& target);

query the DHT for an immutable item at the target hash. the result is posted as a dht_immutable_item_alert.

[report issue]

dht_get_item()

void dht_get_item (std::array<char, 32> key
      , std::string salt = std::string());

query the DHT for a mutable item under the public key key. this is an ed25519 key. salt is optional and may be left as an empty string if no salt is to be used. if the item is found in the DHT, a dht_mutable_item_alert is posted.

[report issue]

dht_put_item()

sha1_hash dht_put_item (entry data);

store the given bencoded data as an immutable item in the DHT. the returned hash is the key that is to be used to look the item up again. It's just the SHA-1 hash of the bencoded form of the structure.

[report issue]

dht_put_item()

void dht_put_item (std::array<char, 32> key
      , std::function<void(entry&, std::array<char, 64>&
      , std::int64_t&, std::string const&)> cb
      , std::string salt = std::string());

store a mutable item. The key is the public key the blob is to be stored under. The optional salt argument is a string that is to be mixed in with the key when determining where in the DHT the value is to be stored. The callback function is called from within the libtorrent network thread once we've found where to store the blob, possibly with the current value stored under the key. The values passed to the callback functions are:

entry& value
the current value stored under the key (may be empty). Also expected to be set to the value to be stored by the function.
std::array<char,64>& signature
the signature authenticating the current value. This may be zeros if there is currently no value stored. The function is expected to fill in this buffer with the signature of the new value to store. To generate the signature, you may want to use the sign_mutable_item function.
std::int64_t& seq
current sequence number. May be zero if there is no current value. The function is expected to set this to the new sequence number of the value that is to be stored. Sequence numbers must be monotonically increasing. Attempting to overwrite a value with a lower or equal sequence number will fail, even if the signature is correct.
std::string const& salt
this is the salt that was used for this put call.

Since the callback function cb is called from within libtorrent, it is critical to not perform any blocking operations. Ideally not even locking a mutex. Pass any data required for this function along with the function object's context and make the function entirely self-contained. The only reason data blob's value is computed via a function instead of just passing in the new value is to avoid race conditions. If you want to update the value in the DHT, you must first retrieve it, then modify it, then write it back. The way the DHT works, it is natural to always do a lookup before storing and calling the callback in between is convenient.

[report issue]

dht_get_peers() dht_announce()

void dht_get_peers (sha1_hash const& info_hash);
void dht_announce (sha1_hash const& info_hash, int port = 0, dht::announce_flags_t flags = {});

dht_get_peers() will issue a DHT get_peer request to the DHT for the specified info-hash. The response (the peers) will be posted back in a dht_get_peers_reply_alert.

dht_announce() will issue a DHT announce request to the DHT to the specified info-hash, advertising the specified port. If the port is left at its default, 0, the port will be implied by the DHT message's source port (which may improve connectivity through a NAT).

Both these functions are exposed for advanced custom use of the DHT. All torrents eligible to be announce to the DHT will be automatically, by libtorrent.

For possible flags, see announce_flags_t.

[report issue]

dht_live_nodes()

void dht_live_nodes (sha1_hash const& nid);

Retrieve all the live DHT (identified by nid) nodes. All the nodes id and endpoint will be returned in the list of nodes in the alert dht_live_nodes_alert. Since this alert is a response to an explicit call, it will always be posted, regardless of the alert mask.

[report issue]

dht_sample_infohashes()

void dht_sample_infohashes (udp::endpoint const& ep, sha1_hash const& target);

Query the DHT node specified by ep to retrieve a sample of the info-hashes that the node currently have in their storage. The target is included for iterative lookups so that indexing nodes can perform a key space traversal with a single RPC per node by adjusting the target value for each RPC. It has no effect on the returned sample value. The result is posted as a dht_sample_infohashes_alert.

[report issue]

dht_direct_request()

void dht_direct_request (udp::endpoint const& ep, entry const& e, client_data_t userdata = {});

Send an arbitrary DHT request directly to the specified endpoint. This function is intended for use by plugins. When a response is received or the request times out, a dht_direct_response_alert will be posted with the response (if any) and the userdata pointer passed in here. Since this alert is a response to an explicit call, it will always be posted, regardless of the alert mask.

[report issue]

add_extension()

void add_extension (std::shared_ptr<plugin> ext);
void add_extension (std::function<std::shared_ptr<torrent_plugin>(
      torrent_handle const&, client_data_t)> ext);

This function adds an extension to this session. The argument is a function object that is called with a torrent_handle and which should return a std::shared_ptr<torrent_plugin>. To write custom plugins, see libtorrent plugins. For the typical bittorrent client all of these extensions should be added. The main plugins implemented in libtorrent are:

uTorrent metadata
Allows peers to download the metadata (.torrent files) from the swarm directly. Makes it possible to join a swarm with just a tracker and info-hash.
#include <libtorrent/extensions/ut_metadata.hpp>
ses.add_extension(&lt::create_ut_metadata_plugin);
uTorrent peer exchange
Exchanges peers between clients.
#include <libtorrent/extensions/ut_pex.hpp>
ses.add_extension(&lt::create_ut_pex_plugin);
smart ban plugin
A plugin that, with a small overhead, can ban peers that sends bad data with very high accuracy. Should eliminate most problems on poisoned torrents.
#include <libtorrent/extensions/smart_ban.hpp>
ses.add_extension(&lt::create_smart_ban_plugin);
[report issue]

get_ip_filter() set_ip_filter()

void set_ip_filter (ip_filter f);
ip_filter get_ip_filter () const;

Sets a filter that will be used to reject and accept incoming as well as outgoing connections based on their originating ip address. The default filter will allow connections to any ip address. To build a set of rules for which addresses are accepted and not, see ip_filter.

Each time a peer is blocked because of the IP filter, a peer_blocked_alert is generated. get_ip_filter() Returns the ip_filter currently in the session. See ip_filter.

[report issue]

set_port_filter()

void set_port_filter (port_filter const& f);

apply port_filter f to incoming and outgoing peers. a port filter will reject making outgoing peer connections to certain remote ports. The main intention is to be able to avoid triggering certain anti-virus software by connecting to SMTP, FTP ports.

[report issue]

listen_port() ssl_listen_port() is_listening()

bool is_listening () const;
unsigned short listen_port () const;
unsigned short ssl_listen_port () const;

is_listening() will tell you whether or not the session has successfully opened a listening port. If it hasn't, this function will return false, and then you can set a new settings_pack::listen_interfaces to try another interface and port to bind to.

listen_port() returns the port we ended up listening on.

[report issue]

set_peer_class_filter() get_peer_class_filter()

void set_peer_class_filter (ip_filter const& f);
ip_filter get_peer_class_filter () const;

Sets the peer class filter for this session. All new peer connections will take this into account and be added to the peer classes specified by this filter, based on the peer's IP address.

The ip-filter essentially maps an IP -> uint32. Each bit in that 32 bit integer represents a peer class. The least significant bit represents class 0, the next bit class 1 and so on.

For more info, see ip_filter.

For example, to make all peers in the range 200.1.1.0 - 200.1.255.255 belong to their own peer class, apply the following filter:

ip_filter f = ses.get_peer_class_filter();
peer_class_t my_class = ses.create_peer_class("200.1.x.x IP range");
f.add_rule(make_address("200.1.1.0"), make_address("200.1.255.255")
        , 1 << static_cast<std::uint32_t>(my_class));
ses.set_peer_class_filter(f);

This setting only applies to new connections, it won't affect existing peer connections.

This function is limited to only peer class 0-31, since there are only 32 bits in the IP range mapping. Only the set bits matter; no peer class will be removed from a peer as a result of this call, peer classes are only added.

The peer_class argument cannot be greater than 31. The bitmasks representing peer classes in the peer_class_filter are 32 bits.

The get_peer_class_filter() function returns the current filter.

For more information, see peer classes.

[report issue]

get_peer_class_type_filter() set_peer_class_type_filter()

peer_class_type_filter get_peer_class_type_filter () const;
void set_peer_class_type_filter (peer_class_type_filter const& f);

Sets and gets the peer class type filter. This is controls automatic peer class assignments to peers based on what kind of socket it is.

It does not only support assigning peer classes, it also supports removing peer classes based on socket type.

The order of these rules being applied are:

  1. peer-class IP filter
  2. peer-class type filter, removing classes
  3. peer-class type filter, adding classes

For more information, see peer classes.

[report issue]

create_peer_class()

peer_class_t create_peer_class (char const* name);

Creates a new peer class (see peer classes) with the given name. The returned integer is the new peer class identifier. Peer classes may have the same name, so each invocation of this function creates a new class and returns a unique identifier.

Identifiers are assigned from low numbers to higher. So if you plan on using certain peer classes in a call to set_peer_class_filter(), make sure to create those early on, to get low identifiers.

For more information on peer classes, see peer classes.

[report issue]

delete_peer_class()

void delete_peer_class (peer_class_t cid);

This call dereferences the reference count of the specified peer class. When creating a peer class it's automatically referenced by 1. If you want to recycle a peer class, you may call this function. You may only call this function once per peer class you create. Calling it more than once for the same class will lead to memory corruption.

Since peer classes are reference counted, this function will not remove the peer class if it's still assigned to torrents or peers. It will however remove it once the last peer and torrent drops their references to it.

There is no need to call this function for custom peer classes. All peer classes will be properly destructed when the session object destructs.

For more information on peer classes, see peer classes.

[report issue]

set_peer_class() get_peer_class()

void set_peer_class (peer_class_t cid, peer_class_info const& pci);
peer_class_info get_peer_class (peer_class_t cid) const;

These functions queries information from a peer class and updates the configuration of a peer class, respectively.

cid must refer to an existing peer class. If it does not, the return value of get_peer_class() is undefined.

set_peer_class() sets all the information in the peer_class_info object in the specified peer class. There is no option to only update a single property.

A peer or torrent belonging to more than one class, the highest priority among any of its classes is the one that is taken into account.

For more information, see peer classes.

[report issue]

remove_torrent()

void remove_torrent (const torrent_handle&, remove_flags_t = {});

remove_torrent() will close all peer connections associated with the torrent and tell the tracker that we've stopped participating in the swarm. This operation cannot fail. When it completes, you will receive a torrent_removed_alert.

remove_torrent() is non-blocking, but will remove the torrent from the session synchronously. Calling session_handle::add_torrent() immediately afterward with the same torrent will succeed. Note that this creates a new handle which is not equal to the removed one.

The optional second argument options can be used to delete all the files downloaded by this torrent. To do so, pass in the value session_handle::delete_files. Once the torrent is deleted, a torrent_deleted_alert is posted.

The torrent_handle remains valid for some time after remove_torrent() is called. It will become invalid only after all libtorrent tasks (such as I/O tasks) release their references to the torrent. Until this happens, torrent_handle::is_valid() will return true, and other calls such as torrent_handle::status() will succeed. Because of this, and because remove_torrent() is non-blocking, the following sequence usually succeeds (does not throw system_error): .. code:: c++

session.remove_handle(handle); handle.save_resume_data();

Note that when a queued or downloading torrent is removed, its position in the download queue is vacated and every subsequent torrent in the queue has their queue positions updated. This can potentially cause a large state_update to be posted. When removing all torrents, it is advised to remove them from the back of the queue, to minimize the shifting.

[report issue]

apply_settings() get_settings()

void apply_settings (settings_pack&&);
void apply_settings (settings_pack const&);
settings_pack get_settings () const;

Applies the settings specified by the settings_pack s. This is an asynchronous operation that will return immediately and actually apply the settings to the main thread of libtorrent some time later.

[report issue]

set_alert_notify() wait_for_alert() pop_alerts()

void set_alert_notify (std::function<void()> const& fun);
void pop_alerts (std::vector<alert*>* alerts);
alert* wait_for_alert (time_duration max_wait);

Alerts is the main mechanism for libtorrent to report errors and events. pop_alerts fills in the vector passed to it with pointers to new alerts. The session still owns these alerts and they will stay valid until the next time pop_alerts is called. You may not delete the alert objects.

It is safe to call pop_alerts from multiple different threads, as long as the alerts themselves are not accessed once another thread calls pop_alerts. Doing this requires manual synchronization between the popping threads.

wait_for_alert will block the current thread for max_wait time duration, or until another alert is posted. If an alert is available at the time of the call, it returns immediately. The returned alert pointer is the head of the alert queue. wait_for_alert does not pop alerts from the queue, it merely peeks at it. The returned alert will stay valid until pop_alerts is called twice. The first time will pop it and the second will free it.

If there is no alert in the queue and no alert arrives within the specified timeout, wait_for_alert returns nullptr.

In the python binding, wait_for_alert takes the number of milliseconds to wait as an integer.

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 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 be disabled by the alert_mask. For instance, save_resume_data_alert and save_resume_data_failed_alert are always posted, regardless of the alert mask.

To control which alerts are posted, set the alert_mask (settings_pack::alert_mask).

If the alert queue fills up to the point where alerts are dropped, this will be indicated by a alerts_dropped_alert, which contains a bitmask of which types of alerts were dropped. Generally it is a good idea to make sure the alert queue is large enough, the alert_mask doesn't have unnecessary categories enabled and to call pop_alert() frequently, to avoid alerts being dropped.

the set_alert_notify function lets the client set a function object to be invoked every time the alert queue goes from having 0 alerts to 1 alert. This function is called from within libtorrent, it may be the main thread, or it may be from within a user call. The intention of of the function is that the client wakes up its main thread, to poll for more alerts using pop_alerts(). If the notify function fails to do so, it won't be called again, until pop_alerts is called for some other reason. For instance, it could signal an eventfd, post a message to an HWND or some other main message pump. The actual retrieval of alerts should not be done in the callback. In fact, the callback should not block. It should not perform any expensive work. It really should just notify the main application thread.

The type of an alert is returned by the polymorphic function alert::type() but can also be queries from a concrete type via T::alert_type, as a static constant.

[report issue]

add_port_mapping() delete_port_mapping()

std::vector<port_mapping_t> add_port_mapping (portmap_protocol t, int external_port, int local_port);
void delete_port_mapping (port_mapping_t handle);

add_port_mapping adds one or more port forwards on UPnP and/or NAT-PMP, whichever is enabled. A mapping is created for each listen socket in the session. The return values are all handles referring to the port mappings that were just created. Pass them to delete_port_mapping() to remove them.

[report issue]

reopen_network_sockets()

void reopen_network_sockets (reopen_network_flags_t options = reopen_map_ports);

Instructs the session to reopen all listen and outgoing sockets.

It's useful in the case your platform doesn't support the built in IP notifier mechanism, or if you have a better more reliable way to detect changes in the IP routing table.

[report issue]

native_handle()

std::shared_ptr<aux::session_impl> native_handle () const;

This function is intended only for use by plugins. This type does not have a stable API and should be relied on as little as possible.

[report issue]
save_settings
saves settings (i.e. the settings_pack)
[report issue]
save_dht_state
saves dht state such as nodes and node-id, possibly accelerating joining the DHT if provided at next session startup.
[report issue]
save_extension_state
load or save state from plugins
[report issue]
save_ip_filter
load or save the IP filter set on the session
[report issue]
global_peer_class_id tcp_peer_class_id local_peer_class_id
built-in peer classes
[report issue]
delete_files
delete the files belonging to the torrent from disk. including the part-file, if there is one
[report issue]
delete_partfile
delete just the part-file associated with this torrent
[report issue]
paused
when set, the session will start paused. Call session_handle::resume() to start
[report issue]
udp tcp
protocols used by add_port_mapping()
[report issue]
reopen_map_ports
This option indicates if the ports are mapped using natpmp and upnp. If mapping was already made, they are deleted and added again. This only works if natpmp and/or upnp are configured to be enable.
[report issue]

session_proxy

Declared in "libtorrent/session.hpp"

this is a holder for the internal session implementation object. Once the session destruction is explicitly initiated, this holder is used to synchronize the completion of the shutdown. The lifetime of this object may outlive session, causing the session destructor to not block. The session_proxy destructor will block however, until the underlying session is done shutting down.

struct session_proxy
{
   session_proxy ();
   session_proxy& operator= (session_proxy&&) & noexcept;
   session_proxy (session_proxy&&) noexcept;
   session_proxy& operator= (session_proxy const&) &;
   ~session_proxy ();
   session_proxy (session_proxy const&);
};
[report issue]

operator=() ~session_proxy() session_proxy()

session_proxy ();
session_proxy& operator= (session_proxy&&) & noexcept;
session_proxy (session_proxy&&) noexcept;
session_proxy& operator= (session_proxy const&) &;
~session_proxy ();
session_proxy (session_proxy const&);

default constructor, does not refer to any session implementation object.

[report issue]

session

Declared in "libtorrent/session.hpp"

The session holds all state that spans multiple torrents. Among other things it runs the network loop and manages all torrents. Once it's created, the session object will spawn the main thread that will do all the work. The main thread will be idle as long it doesn't have any torrents to participate in.

You have some control over session configuration through the session_handle::apply_settings() member function. To change one or more configuration options, create a settings_pack. object and fill it with the settings to be set and pass it in to session::apply_settings().

see apply_settings().

struct session : session_handle
{
   session (session_params&& params, session_flags_t flags);
   explicit session (session_params&& params);
   session ();
   session (session_params const& params, session_flags_t flags);
   explicit session (session_params const& params);
   session (session_params&& params, io_context& ios);
   session (session_params&& params, io_context& ios, session_flags_t);
   session (session_params const& params, io_context& ios, session_flags_t);
   session (session_params const& params, io_context& ios);
   ~session ();
   session_proxy abort ();
};
[report issue]

session()

session (session_params&& params, session_flags_t flags);
explicit session (session_params&& params);
session ();
session (session_params const& params, session_flags_t flags);
explicit session (session_params const& params);

Constructs the session objects which acts as the container of torrents. In order to avoid a race condition between starting the session and configuring it, you can pass in a session_params object. Its settings will take effect before the session starts up.

The overloads taking flags can be used to start a session in paused mode (by passing in session::paused). Note that add_default_plugins do not have an affect on constructors that take a session_params object. It already contains the plugins to use.

[report issue]

session()

session (session_params&& params, io_context& ios);
session (session_params&& params, io_context& ios, session_flags_t);
session (session_params const& params, io_context& ios, session_flags_t);
session (session_params const& params, io_context& ios);

Overload of the constructor that takes an external io_context to run the session object on. This is primarily useful for tests that may want to run multiple sessions on a single io_context, or low resource systems where additional threads are expensive and sharing an io_context with other events is fine.

Warning

The session object does not cleanly terminate with an external io_context. The io_context::run() call must have returned before it's safe to destruct the session. Which means you MUST call session::abort() and save the session_proxy first, then destruct the session object, then sync with the io_context, then destruct the session_proxy object.

[report issue]

~session()

~session ();

The destructor of session will notify all trackers that our torrents have been shut down. If some trackers are down, they will time out. All this before the destructor of session returns. So, it's advised that any kind of interface (such as windows) are closed before destructing the session object. Because it can take a few second for it to finish. The timeout can be set with apply_settings().

[report issue]

abort()

session_proxy abort ();

In case you want to destruct the session asynchronously, you can request a session destruction proxy. If you don't do this, the destructor of the session object will block while the trackers are contacted. If you keep one session_proxy to the session when destructing it, the destructor will not block, but start to close down the session, the destructor of the proxy will then synchronize the threads. So, the destruction of the session is performed from the session destructor call until the session_proxy destructor call. The session_proxy does not have any operations on it (since the session is being closed down, no operations are allowed on it). The only valid operation is calling the destructor:

struct session_proxy {};
[report issue]

write_session_params() read_session_params() write_session_params_buf()

Declared in "libtorrent/session_params.hpp"

session_params read_session_params (bdecode_node const& e
   , save_state_flags_t flags = save_state_flags_t::all());
session_params read_session_params (span<char const> buf
   , save_state_flags_t flags = save_state_flags_t::all());
entry write_session_params (session_params const& sp
   , save_state_flags_t flags = save_state_flags_t::all());
std::vector<char> write_session_params_buf (session_params const& sp
   , save_state_flags_t flags = save_state_flags_t::all());

These functions serialize and de-serialize a session_params object to and from bencoded form. The session_params object is used to initialize a new session using the state from a previous one (or by programmatically configure the session up-front). The flags parameter can be used to only save and load certain aspects of the session's state. The _buf suffix indicates the function operates on buffer rather than the bencoded structure. The torrents in a session are not part of the session_params state, they have to be restored separately.

libtorrent-rasterbar-2.0.5/LibtorrentRasterbarConfig.cmake.in0000664000175000017500000000042114152763504023416 0ustar arvidarvid# - Config file for the @PROJECT_NAME@ package # It defines the LibtorrentRasterbar::torrent-rasterbar target to link against @PACKAGE_INIT@ include(CMakeFindDependencyMacro) @_find_dependency_calls@ include("${CMAKE_CURRENT_LIST_DIR}/LibtorrentRasterbarTargets.cmake") libtorrent-rasterbar-2.0.5/cmake/0000775000175000017500000000000014152763504015752 5ustar arvidarvidlibtorrent-rasterbar-2.0.5/cmake/Modules/0000775000175000017500000000000014152763504017362 5ustar arvidarvidlibtorrent-rasterbar-2.0.5/cmake/Modules/ucm_flags.cmake0000664000175000017500000000755214152763504022335 0ustar arvidarvid# taken from https://github.com/onqtam/ucm/blob/master/cmake/ucm.cmake # # ucm.cmake - useful cmake macros # # Copyright (c) 2016 Viktor Kirilov # # Distributed under the MIT Software License # See accompanying file LICENSE.txt or copy at # https://opensource.org/licenses/MIT # # The documentation can be found at the library's page: # https://github.com/onqtam/ucm include(CMakeParseArguments) # ucm_gather_flags # Gathers all lists of flags for printing or manipulation macro(ucm_gather_flags with_linker result) set(${result} "") # add the main flags without a config list(APPEND ${result} CMAKE_C_FLAGS) list(APPEND ${result} CMAKE_CXX_FLAGS) if(${with_linker}) list(APPEND ${result} CMAKE_EXE_LINKER_FLAGS) list(APPEND ${result} CMAKE_MODULE_LINKER_FLAGS) list(APPEND ${result} CMAKE_SHARED_LINKER_FLAGS) list(APPEND ${result} CMAKE_STATIC_LINKER_FLAGS) endif() if("${CMAKE_CONFIGURATION_TYPES}" STREQUAL "" AND NOT "${CMAKE_BUILD_TYPE}" STREQUAL "") # handle single config generators - like makefiles/ninja - when CMAKE_BUILD_TYPE is set string(TOUPPER ${CMAKE_BUILD_TYPE} config) list(APPEND ${result} CMAKE_C_FLAGS_${config}) list(APPEND ${result} CMAKE_CXX_FLAGS_${config}) if(${with_linker}) list(APPEND ${result} CMAKE_EXE_LINKER_FLAGS_${config}) list(APPEND ${result} CMAKE_MODULE_LINKER_FLAGS_${config}) list(APPEND ${result} CMAKE_SHARED_LINKER_FLAGS_${config}) list(APPEND ${result} CMAKE_STATIC_LINKER_FLAGS_${config}) endif() else() # handle multi config generators (like msvc, xcode) foreach(config ${CMAKE_CONFIGURATION_TYPES}) string(TOUPPER ${config} config) list(APPEND ${result} CMAKE_C_FLAGS_${config}) list(APPEND ${result} CMAKE_CXX_FLAGS_${config}) if(${with_linker}) list(APPEND ${result} CMAKE_EXE_LINKER_FLAGS_${config}) list(APPEND ${result} CMAKE_MODULE_LINKER_FLAGS_${config}) list(APPEND ${result} CMAKE_SHARED_LINKER_FLAGS_${config}) list(APPEND ${result} CMAKE_STATIC_LINKER_FLAGS_${config}) endif() endforeach() endif() endmacro() # ucm_set_runtime # Sets the runtime (static/dynamic) for msvc/gcc macro(ucm_set_runtime) cmake_parse_arguments(ARG "STATIC;DYNAMIC" "" "" ${ARGN}) if(ARG_UNPARSED_ARGUMENTS) message(FATAL_ERROR "unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}") endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" STREQUAL "") message(AUTHOR_WARNING "ucm_set_runtime() does not support clang yet!") endif() ucm_gather_flags(0 flags_configs) # add/replace the flags # note that if the user has messed with the flags directly this function might fail # - for example if with MSVC and the user has removed the flags - here we just switch/replace them if("${ARG_STATIC}") foreach(flags ${flags_configs}) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") if(NOT ${flags} MATCHES "-static-libstdc\\+\\+") set(${flags} "${${flags}} -static-libstdc++") endif() if(NOT ${flags} MATCHES "-static-libgcc") set(${flags} "${${flags}} -static-libgcc") endif() elseif(MSVC) if(${flags} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${flags} "${${flags}}") endif() endif() endforeach() elseif("${ARG_DYNAMIC}") foreach(flags ${flags_configs}) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") if(${flags} MATCHES "-static-libstdc\\+\\+") string(REGEX REPLACE "-static-libstdc\\+\\+" "" ${flags} "${${flags}}") endif() if(${flags} MATCHES "-static-libgcc") string(REGEX REPLACE "-static-libgcc" "" ${flags} "${${flags}}") endif() elseif(MSVC) if(${flags} MATCHES "/MT") string(REGEX REPLACE "/MT" "/MD" ${flags} "${${flags}}") endif() endif() endforeach() endif() endmacro() # ucm_print_flags # Prints all compiler flags for all configurations macro(ucm_print_flags) ucm_gather_flags(1 flags_configs) message("") foreach(flags ${flags_configs}) message("${flags}: ${${flags}}") endforeach() message("") endmacro() libtorrent-rasterbar-2.0.5/cmake/Modules/GeneratePkgConfig.cmake0000664000175000017500000001723614152763504023717 0ustar arvidarvid# This module provides generate_and_install_pkg_config_file() function. # The function takes target name and expects a fully configured project, i.e. with set version and # description. The function extracts interface libraries, include dirs, definitions and options # from the target and generates pkg-config file with install() command # The function expands imported targets and generator expressions # save the current file dir for later use in the generate_and_install_pkg_config_file() function set(_GeneratePkGConfigDir "${CMAKE_CURRENT_LIST_DIR}/GeneratePkgConfig") include(GNUInstallDirs) function(_get_target_property_merging_configs _var_name _target_name _propert_name) get_property(prop_set TARGET ${_target_name} PROPERTY ${_propert_name} SET) if (prop_set) get_property(vals TARGET ${_target_name} PROPERTY ${_propert_name}) else() if (CMAKE_BUILD_TYPE) list(APPEND configs ${CMAKE_BUILD_TYPE}) elseif(CMAKE_CONFIGURATION_TYPES) list(APPEND configs ${CMAKE_CONFIGURATION_TYPES}) endif() foreach(cfg ${configs}) string(TOUPPER "${cfg}" UPPERCFG) get_property(mapped_configs TARGET ${_target_name} PROPERTY "MAP_IMPORTED_CONFIG_${UPPERCFG}") if (mapped_configs) list(GET "${mapped_configs}" 0 target_cfg) else() set(target_cfg "${UPPERCFG}") endif() get_property(prop_set TARGET ${_target_name} PROPERTY ${_propert_name}_${target_cfg} SET) if (prop_set) get_property(val_for_cfg TARGET ${_target_name} PROPERTY ${_propert_name}_${target_cfg}) list(APPEND vals "$<$:${val_for_cfg}>") break() endif() endforeach() if (NOT prop_set) get_property(imported_cfgs TARGET ${_target_name} PROPERTY IMPORTED_CONFIGURATIONS) # CMake docs say we can use any of the imported configs list(GET imported_cfgs 0 imported_config) get_property(vals TARGET ${_target_name} PROPERTY ${_propert_name}_${imported_config}) # remove config generator expression. Only in this case! Notice we use such expression # ourselves in the loop above string(REPLACE "$<$:" "$<1:" vals "${vals}") endif() endif() # HACK for static libraries cmake populates link dependencies as $. # pkg-config does not support special handling for static libraries and as such we will remove # that generator expression string(REPLACE "$" "" _interface_compile_options "${_interface_compile_options}") endif() # put target and project properties into a file configure_file("${_GeneratePkGConfigDir}/target-compile-settings.cmake.in" "${_generate_target_dir}/compile-settings.cmake" @ONLY) get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if (NOT _isMultiConfig) set(_variables_file_name "${_generate_target_dir}/compile-settings-expanded.cmake") file(GENERATE OUTPUT "${_variables_file_name}" INPUT "${_generate_target_dir}/compile-settings.cmake" ${_target_arg}) configure_file("${_GeneratePkGConfigDir}/generate-pkg-config.cmake.in" "${_generate_target_dir}/generate-pkg-config.cmake" @ONLY) install(SCRIPT "${_generate_target_dir}/generate-pkg-config.cmake") else() foreach(cfg IN LISTS CMAKE_CONFIGURATION_TYPES) set(_variables_file_name "${_generate_target_dir}/${cfg}/compile-settings-expanded.cmake") file(GENERATE OUTPUT "${_variables_file_name}" INPUT "${_generate_target_dir}/compile-settings.cmake" CONDITION "$" ${_target_arg}) configure_file("${_GeneratePkGConfigDir}/generate-pkg-config.cmake.in" "${_generate_target_dir}/${cfg}/generate-pkg-config.cmake" @ONLY) install(SCRIPT "${_generate_target_dir}/${cfg}/generate-pkg-config.cmake") endforeach() endif() endfunction() libtorrent-rasterbar-2.0.5/cmake/Modules/FindLibGcrypt.cmake0000664000175000017500000001142014152763504023062 0ustar arvidarvid#.rst: # FindLibGcrypt # ------------- # # Try to find libgcrypt. # # This will define the following variables: # # ``LibGcrypt_FOUND`` # True if libgcrypt is available. # # ``LibGcrypt_VERSION`` # The version of LibGcrypt # # ``LibGcrypt_INCLUDE_DIRS`` # This should be passed to target_include_directories() if # the target is not used for linking # # ``LibGcrypt_LIBRARIES`` # This can be passed to target_link_libraries() instead of # the ``LibGcrypt::LibGcrypt`` target # # If ``LibGcrypt_FOUND`` is TRUE, the following imported target # will be available: # # ``LibGcrypt::LibGcrypt`` # The libgcrypt library # # Since 1.9.50. #============================================================================= # Copyright 2007 Charles Connell (This was based upon FindKopete.cmake) # Copyright 2010 Joris Guisson # Copyright 2016 Christophe Giboudeaux # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #============================================================================= find_path(LibGcrypt_INCLUDE_DIRS NAMES gcrypt.h PATH_SUFFIXES libgcrypt ) find_library(LibGcrypt_LIBRARIES NAMES gcrypt ) if(MSVC) find_library(LibGcrypt_LIBRARIES_DEBUG NAMES gcryptd ) if(NOT LibGcrypt_LIBRARIES_DEBUG) unset(LibGcrypt_LIBRARIES CACHE) endif() if(MSVC_IDE) if(NOT (LibGcrypt_LIBRARIES_DEBUG AND LibGcrypt_LIBRARIES)) message(STATUS "\nCould NOT find the debug AND release version of the libgcrypt library.\n You need to have both to use MSVC projects.\n Please build and install both libgcrypt libraries first.\n" ) unset(LibGcrypt_LIBRARIES CACHE) endif() else() string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_TOLOWER) if(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug) set(LibGcrypt_LIBRARIES ${LibGcrypt_LIBRARIES_DEBUG}) endif() endif() endif() # Get version from gcrypt.h # #define GCRYPT_VERSION "1.6.4" if(LibGcrypt_INCLUDE_DIRS AND LibGcrypt_LIBRARIES) file(STRINGS ${LibGcrypt_INCLUDE_DIRS}/gcrypt.h _GCRYPT_H REGEX "^#define GCRYPT_VERSION[ ]+.*$") string(REGEX REPLACE "^.*GCRYPT_VERSION[ ]+\"([0-9]+).([0-9]+).([0-9]+).*\".*$" "\\1" LibGcrypt_MAJOR_VERSION "${_GCRYPT_H}") string(REGEX REPLACE "^.*GCRYPT_VERSION[ ]+\"([0-9]+).([0-9]+).([0-9]+).*\".*$" "\\2" LibGcrypt_MINOR_VERSION "${_GCRYPT_H}") string(REGEX REPLACE "^.*GCRYPT_VERSION[ ]+\"([0-9]+).([0-9]+).([0-9]+).*\".*$" "\\3" LibGcrypt_PATCH_VERSION "${_GCRYPT_H}") set(LibGcrypt_VERSION "${LibGcrypt_MAJOR_VERSION}.${LibGcrypt_MINOR_VERSION}.${LibGcrypt_PATCH_VERSION}") unset(_GCRYPT_H) endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(LibGcrypt FOUND_VAR LibGcrypt_FOUND REQUIRED_VARS LibGcrypt_INCLUDE_DIRS LibGcrypt_LIBRARIES VERSION_VAR LibGcrypt_VERSION ) if(LibGcrypt_FOUND AND NOT TARGET LibGcrypt::LibGcrypt) add_library(LibGcrypt::LibGcrypt UNKNOWN IMPORTED) set_target_properties(LibGcrypt::LibGcrypt PROPERTIES IMPORTED_LOCATION "${LibGcrypt_LIBRARIES}" INTERFACE_INCLUDE_DIRECTORIES "${LibGcrypt_INCLUDE_DIRS}") endif() mark_as_advanced(LibGcrypt_INCLUDE_DIRS LibGcrypt_LIBRARIES) include(FeatureSummary) set_package_properties(LibGcrypt PROPERTIES URL "http://directory.fsf.org/wiki/Libgcrypt" DESCRIPTION "General purpose crypto library based on the code used in GnuPG." ) libtorrent-rasterbar-2.0.5/cmake/Modules/LibtorrentMacros.cmake0000664000175000017500000000666414152763504023671 0ustar arvidarvid# Various helper function and macros for building libtorrent include(FeatureSummary) # macro for issuing option() and add_feature_info() in a single call. # Synopsis: # feature_option( ) macro(feature_option _name _description _default) option(${_name} "${_description}" ${_default}) add_feature_info(${_name} ${_name} "${_description}") endmacro() # function to add a simple build option which controls compile definition(s) for a target. # Synopsis: # target_optional_compile_definitions( [FEATURE] # NAME DESCRIPTION DEFAULT # [ENABLED [enabled_compile_definitions...]] # [DISABLED [disabled_compile_defnitions...]] # ) # NAME, DESCRIPTION and DEFAULT are passed to option() call # if FEATURE is given, they are passed to add_feature_info() # ENABLED lists compile definitions that will be set on when option is enabled, # DISABLED lists definitions that will be set otherwise function(target_optional_compile_definitions _target _scope) set(options FEATURE) set(oneValueArgs NAME DESCRIPTION DEFAULT) set(multiValueArgs ENABLED DISABLED) cmake_parse_arguments(TOCD ${options} "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) option(${TOCD_NAME} "${TOCD_DESCRIPTION}" ${TOCD_DEFAULT}) if (${${TOCD_NAME}}) target_compile_definitions(${_target} ${_scope} ${TOCD_ENABLED}) else() target_compile_definitions(${_target} ${_scope} ${TOCD_DISABLED}) endif() if(${TOCD_FEATURE}) add_feature_info(${TOCD_NAME} ${TOCD_NAME} "${TOCD_DESCRIPTION}") endif() endfunction() # a helper macro that calls find_package() and appends the package (if found) to the # _package_dependencies list, which can be used later to generate package config file macro(find_public_dependency _name) find_package(${_name} ${ARGN}) string(TOUPPER "${_name}" _name_uppercased) if (${_name}_FOUND OR ${_name_uppercased}_FOUND) # Dependencies to be used below for generating Config.cmake file # We don't need the 'REQUIRED' argument there set(_args "${_name}") list(APPEND _args "${ARGN}") list(REMOVE_ITEM _args "REQUIRED") list(REMOVE_ITEM _args "") # just in case string(REPLACE ";" " " _args "${_args}") list(APPEND _package_dependencies "${_args}") endif() endmacro() # function for parsing version variables that are set in version.hpp file # the version identifiers there are defined as follows: # #define LIBTORRENT_VERSION_MAJOR 1 # #define LIBTORRENT_VERSION_MINOR 2 # #define LIBTORRENT_VERSION_TINY 0 function(read_version _verFile _outVarMajor _outVarMinor _outVarTiny) file(STRINGS ${_verFile} verFileContents REGEX ".+LIBTORRENT_VERSION_[A-Z]+.[0-9]+.*") # message(STATUS "version file contents: ${verFileContents}") # the verFileContents variable contains something like the following: # #define LIBTORRENT_VERSION_MAJOR 1;#define LIBTORRENT_VERSION_MINOR 2;#define LIBTORRENT_VERSION_TINY 0 set(_regex ".+_MAJOR +([0-9]+);.+_MINOR +([0-9]+);.+_TINY +([0-9]+)") # note quotes around _regex, they are needed because the variable contains semicolons string(REGEX MATCH "${_regex}" _tmp "${verFileContents}") if (NOT _tmp) message(FATAL_ERROR "Could not detect project version number from ${_verFile}") endif() # message(STATUS "Matched version string: ${_tmp}") set(${_outVarMajor} ${CMAKE_MATCH_1} PARENT_SCOPE) set(${_outVarMinor} ${CMAKE_MATCH_2} PARENT_SCOPE) set(${_outVarTiny} ${CMAKE_MATCH_3} PARENT_SCOPE) endfunction() libtorrent-rasterbar-2.0.5/cmake/Modules/GeneratePkgConfig/0000775000175000017500000000000014152763504022704 5ustar arvidarvidlibtorrent-rasterbar-2.0.5/cmake/Modules/GeneratePkgConfig/pkg-config.cmake.in0000664000175000017500000000046614152763504026345 0ustar arvidarvidprefix=@CMAKE_INSTALL_PREFIX@ libdir=${prefix}/@_INSTALL_LIBDIR@ Name: @_PROJECT_NAME@ Description: @_PROJECT_DESCRIPTION@ Version: @_PROJECT_VERSION@ Libs: -L${libdir} -l@_TARGET_OUTPUT_NAME@ @_interface_link_libraries@ Cflags: @_interface_compile_options@ @_interface_include_dirs@ @_interface_definitions@ libtorrent-rasterbar-2.0.5/cmake/Modules/GeneratePkgConfig/target-compile-settings.cmake.in0000664000175000017500000000112414152763504031063 0ustar arvidarvidset(_TARGET_INTERFACE_LINK_LIBRARIES "@_interface_link_libraries@") set(_TARGET_INTERFACE_COMPILE_OPTIONS "@_interface_compile_options@") set(_TARGET_INTERFACE_INCLUDE_DIRS "@_interface_include_dirs@") set(_TARGET_INTERFACE_DEFINITIONS "@_interface_definitions@") set(_TARGET_OUTPUT_NAME "@_output_name@") set(_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@") set(_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@") set(_SHARED_LIBRARY_PREFIX "@CMAKE_SHARED_LIBRARY_PREFIX@") set(_PROJECT_NAME "@PROJECT_NAME@") set(_PROJECT_DESCRIPTION "@PROJECT_DESCRIPTION@") set(_PROJECT_VERSION "@PROJECT_VERSION@") libtorrent-rasterbar-2.0.5/cmake/Modules/GeneratePkgConfig/generate-pkg-config.cmake.in0000664000175000017500000000451714152763504030136 0ustar arvidarvidinclude("@_variables_file_name@") function (cmake_list_to_pkg_config _result _list _prefix) set(_tmp_list "${_list}") list(REMOVE_ITEM _tmp_list "") # remove prefix from prefixed items string(REGEX REPLACE "(^|;)(${_prefix})" "\\1" _tmp_list "${_tmp_list}") # append 'prefix' to each element string(REGEX REPLACE "([^;]+)" "${_prefix}\\1" _tmp_list "${_tmp_list}") # transform cmake list into a space delimited list string(REPLACE ";" " " _tmp_list "${_tmp_list}") set(${_result} "${_tmp_list}" PARENT_SCOPE) endfunction() # Helper function for splitting full library paths into [dir, name] and merging repetitive dir entries function(split_library_dirs _libraries _base_library_dir _library_dirs_var _library_names_var) set(libdirs "${_base_library_dir}") set(libs "") foreach (l IN LISTS _libraries) get_filename_component(lDir "${l}" DIRECTORY) if (lDir) get_filename_component(lDir "${lDir}" REALPATH) endif() get_filename_component(lFile "${l}" NAME_WE) string(REPLACE "${_SHARED_LIBRARY_PREFIX}" "" lFile "${lFile}") list(APPEND libdirs "${lDir}") list(APPEND libs "${lFile}") endforeach() list(REMOVE_DUPLICATES libdirs) list(REMOVE_AT libdirs 0) # as it is the base libdir and will be handled separately set(${_library_dirs_var} "${libdirs}" PARENT_SCOPE) set(${_library_names_var} "${libs}" PARENT_SCOPE) endfunction() split_library_dirs("${_TARGET_INTERFACE_LINK_LIBRARIES}" "${CMAKE_INSTALL_PREFIX}/${_INSTALL_LIBDIR}" _lib_dirs _library_names) cmake_list_to_pkg_config(_libs "${_library_names}" "-l") list(LENGTH _lib_dirs _additional_libdirs_count) if (_additional_libdirs_count GREATER 0) cmake_list_to_pkg_config(_additional_libdirs "${_lib_dirs}" "-L") set(_interface_link_libraries "${_additional_libdirs} ${_libs}") else() set(_interface_link_libraries "${_libs}") endif() cmake_list_to_pkg_config(_interface_definitions "${_TARGET_INTERFACE_DEFINITIONS}" "-D") cmake_list_to_pkg_config(_interface_include_dirs "${_TARGET_INTERFACE_INCLUDE_DIRS}" "-I") set(_interface_compile_options "${_TARGET_INTERFACE_COMPILE_OPTIONS}") string(REPLACE ";" " " _interface_compile_options "${_interface_compile_options}") configure_file("@_pkg_config_file_template_filename@" "@_generate_target_dir@/@_package_name@.pc" @ONLY) file(INSTALL "@_generate_target_dir@/@_package_name@.pc" DESTINATION "@CMAKE_INSTALL_FULL_LIBDIR@/pkgconfig") libtorrent-rasterbar-2.0.5/bindings/0000755000175000017500000000000014152763504016465 5ustar arvidarvidlibtorrent-rasterbar-2.0.5/bindings/python/0000755000175000017500000000000014152763504020006 5ustar arvidarvidlibtorrent-rasterbar-2.0.5/bindings/python/client.py0000775000175000017500000002644414152763504021655 0ustar arvidarvid#!/usr/bin/env python3 # Copyright Daniel Wallin 2006. Use, modification and distribution is # subject to the Boost Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) import sys import atexit import libtorrent as lt import time import os.path class WindowsConsole: def __init__(self): self.console = Console.getconsole() def clear(self): self.console.page() def write(self, str): self.console.write(str) def sleep_and_input(self, seconds): time.sleep(seconds) if msvcrt.kbhit(): return msvcrt.getch() return None class UnixConsole: def __init__(self): self.fd = sys.stdin self.old = termios.tcgetattr(self.fd.fileno()) new = termios.tcgetattr(self.fd.fileno()) new[3] = new[3] & ~termios.ICANON new[6][termios.VTIME] = 0 new[6][termios.VMIN] = 1 termios.tcsetattr(self.fd.fileno(), termios.TCSADRAIN, new) atexit.register(self._onexit) def _onexit(self): termios.tcsetattr(self.fd.fileno(), termios.TCSADRAIN, self.old) def clear(self): sys.stdout.write('\033[2J\033[0;0H') sys.stdout.flush() def write(self, str): sys.stdout.write(str) sys.stdout.flush() def sleep_and_input(self, seconds): read, __, __ = select.select( [self.fd.fileno()], [], [], seconds) if len(read) > 0: return self.fd.read(1) return None if os.name == 'nt': import Console import msvcrt else: import termios import select def write_line(console, line): console.write(line) def add_suffix(val): prefix = ['B', 'kB', 'MB', 'GB', 'TB'] for i in range(len(prefix)): if abs(val) < 1000: if i == 0: return '%5.3g%s' % (val, prefix[i]) else: return '%4.3g%s' % (val, prefix[i]) val /= 1000 return '%6.3gPB' % val def progress_bar(progress, width): assert(progress <= 1) progress_chars = int(progress * width + 0.5) return progress_chars * '#' + (width - progress_chars) * '-' def print_peer_info(console, peers): out = (' down (total ) up (total )' ' q r flags block progress client\n') for p in peers: out += '%s/s ' % add_suffix(p.down_speed) out += '(%s) ' % add_suffix(p.total_download) out += '%s/s ' % add_suffix(p.up_speed) out += '(%s) ' % add_suffix(p.total_upload) out += '%2d ' % p.download_queue_length out += '%2d ' % p.upload_queue_length out += 'I' if p.flags & lt.peer_info.interesting else '.' out += 'C' if p.flags & lt.peer_info.choked else '.' out += 'i' if p.flags & lt.peer_info.remote_interested else '.' out += 'c' if p.flags & lt.peer_info.remote_choked else '.' out += 'e' if p.flags & lt.peer_info.supports_extensions else '.' out += 'l' if p.flags & lt.peer_info.local_connection else 'r' out += ' ' if p.downloading_piece_index >= 0: assert(p.downloading_progress <= p.downloading_total) out += progress_bar(float(p.downloading_progress) / p.downloading_total, 15) else: out += progress_bar(0, 15) out += ' ' if p.flags & lt.peer_info.handshake: id = 'waiting for handshake' elif p.flags & lt.peer_info.connecting: id = 'connecting to peer' else: id = p.client out += '%s\n' % id[:10] write_line(console, out) def print_download_queue(console, download_queue): out = "" for e in download_queue: out += '%4d: [' % e['piece_index'] for b in e['blocks']: s = b['state'] if s == 3: out += '#' elif s == 2: out += '=' elif s == 1: out += '-' else: out += ' ' out += ']\n' write_line(console, out) def add_torrent(ses, filename, options): atp = lt.add_torrent_params() if filename.startswith('magnet:'): atp = lt.parse_magnet_uri(filename) else: ti = lt.torrent_info(filename) resume_file = os.path.join(options.save_path, ti.name() + '.fastresume') try: atp = lt.read_resume_data(open(resume_file, 'rb').read()) except Exception as e: print('failed to open resume file "%s": %s' % (resume_file, e)) atp.ti = ti atp.save_path = options.save_path atp.storage_mode = lt.storage_mode_t.storage_mode_sparse atp.flags |= lt.torrent_flags.duplicate_is_error \ | lt.torrent_flags.auto_managed \ | lt.torrent_flags.duplicate_is_error ses.async_add_torrent(atp) def main(): from optparse import OptionParser parser = OptionParser() parser.add_option('-p', '--port', type='int', help='set listening port') parser.add_option( '-i', '--listen-interface', type='string', help='set interface for incoming connections', ) parser.add_option( '-o', '--outgoing-interface', type='string', help='set interface for outgoing connections') parser.add_option( '-d', '--max-download-rate', type='float', help='the maximum download rate given in kB/s. 0 means infinite.') parser.add_option( '-u', '--max-upload-rate', type='float', help='the maximum upload rate given in kB/s. 0 means infinite.') parser.add_option( '-s', '--save-path', type='string', help='the path where the downloaded file/folder should be placed.') parser.add_option( '-r', '--proxy-host', type='string', help='sets HTTP proxy host and port (separated by \':\')') parser.set_defaults( port=6881, listen_interface='0.0.0.0', outgoing_interface='', max_download_rate=0, max_upload_rate=0, save_path='.', proxy_host='' ) (options, args) = parser.parse_args() if options.port < 0 or options.port > 65525: options.port = 6881 options.max_upload_rate *= 1000 options.max_download_rate *= 1000 if options.max_upload_rate <= 0: options.max_upload_rate = -1 if options.max_download_rate <= 0: options.max_download_rate = -1 settings = { 'user_agent': 'python_client/' + lt.__version__, 'listen_interfaces': '%s:%d' % (options.listen_interface, options.port), 'download_rate_limit': int(options.max_download_rate), 'upload_rate_limit': int(options.max_upload_rate), 'alert_mask': lt.alert.category_t.all_categories, 'outgoing_interfaces': options.outgoing_interface, } if options.proxy_host != '': settings['proxy_hostname'] = options.proxy_host.split(':')[0] settings['proxy_type'] = lt.proxy_type_t.http settings['proxy_port'] = options.proxy_host.split(':')[1] ses = lt.session(settings) # map torrent_handle to torrent_status torrents = {} alerts_log = [] for f in args: add_torrent(ses, f, options) if os.name == 'nt': console = WindowsConsole() else: console = UnixConsole() alive = True while alive: console.clear() out = '' for h, t in torrents.items(): out += 'name: %-40s\n' % t.name[:40] if t.state != lt.torrent_status.seeding: state_str = ['queued', 'checking', 'downloading metadata', 'downloading', 'finished', 'seeding', '', 'checking fastresume'] out += state_str[t.state] + ' ' out += '%5.4f%% ' % (t.progress * 100) out += progress_bar(t.progress, 49) out += '\n' out += 'total downloaded: %d Bytes\n' % t.total_done out += 'peers: %d seeds: %d distributed copies: %d\n' % \ (t.num_peers, t.num_seeds, t.distributed_copies) out += '\n' out += 'download: %s/s (%s) ' \ % (add_suffix(t.download_rate), add_suffix(t.total_download)) out += 'upload: %s/s (%s) ' \ % (add_suffix(t.upload_rate), add_suffix(t.total_upload)) if t.state != lt.torrent_status.seeding: out += 'info-hash: %s\n' % t.info_hashes out += 'next announce: %s\n' % t.next_announce out += 'tracker: %s\n' % t.current_tracker write_line(console, out) print_peer_info(console, t.handle.get_peer_info()) print_download_queue(console, t.handle.get_download_queue()) if t.state != lt.torrent_status.seeding: try: out = '\n' fp = h.file_progress() ti = t.torrent_file for idx, p in enumerate(fp): out += progress_bar(p / float(ti.files().file_size(idx)), 20) out += ' ' + ti.files().file_path(idx) + '\n' write_line(console, out) except Exception: pass write_line(console, 76 * '-' + '\n') write_line(console, '(q)uit), (p)ause), (u)npause), (r)eannounce\n') write_line(console, 76 * '-' + '\n') alerts = ses.pop_alerts() for a in alerts: alerts_log.append(a.message()) # add new torrents to our list of torrent_status if isinstance(a, lt.add_torrent_alert): h = a.handle h.set_max_connections(60) h.set_max_uploads(-1) torrents[h] = h.status() # update our torrent_status array for torrents that have # changed some of their state if isinstance(a, lt.state_update_alert): for s in a.status: torrents[s.handle] = s if len(alerts_log) > 20: alerts_log = alerts_log[-20:] for a in alerts_log: write_line(console, a + '\n') c = console.sleep_and_input(0.5) ses.post_torrent_updates() if not c: continue if c == 'r': for h in torrents: h.force_reannounce() elif c == 'q': alive = False elif c == 'p': for h in torrents: h.pause() elif c == 'u': for h in torrents: h.resume() ses.pause() for h, t in torrents.items(): if not h.is_valid() or not t.has_metadata: continue h.save_resume_data() while len(torrents) > 0: alerts = ses.pop_alerts() for a in alerts: if isinstance(a, lt.save_resume_data_alert): print(a) data = lt.write_resume_data_buf(a.params) h = a.handle if h in torrents: open(os.path.join(options.save_path, torrents[h].name + '.fastresume'), 'wb').write(data) del torrents[h] if isinstance(a, lt.save_resume_data_failed_alert): h = a.handle if h in torrents: print('failed to save resume data for ', torrents[h].name) del torrents[h] time.sleep(0.5) main() libtorrent-rasterbar-2.0.5/bindings/python/setup.py0000664000175000017500000004272614152763504021535 0ustar arvidarvid#!/usr/bin/env python3 from distutils import log import distutils.debug import distutils.sysconfig import distutils.util import os import pathlib import sys import sysconfig import tempfile import subprocess import contextlib import warnings import re import shlex import setuptools import setuptools.command.build_ext as _build_ext_lib def b2_bool(value): if value: return "on" return "off" # Frustratingly, the "bdist_*" unconditionally (re-)run "build" without # args, even ignoring "build_*" earlier on the same command line. This # means "build_*" must be a no-op if some build output exists, even if that # output might have been generated with different args (like # "--define=FOO"). b2 does not know how to be "naively idempotent" like # this; it will only generate outputs that exactly match the build request. # # It doesn't work to short-circuit initialize_options() / finalize_options(), # as this doesn't play well with the way options are externally manipulated by # distutils. # # It DOES work to short-circuit Distribution.reinitialize_command(), so we do # that here. class B2Distribution(setuptools.Distribution): def reinitialize_command(self, command, reinit_subcommands=0): if command == "build_ext": return self.get_command_obj("build_ext") return super().reinitialize_command( command, reinit_subcommands=reinit_subcommands ) # Various setuptools logic expects us to provide Extension instances for each # extension in the distro. class StubExtension(setuptools.Extension): def __init__(self, name): # An empty sources list ensures the base build_ext command won't build # anything super().__init__(name, sources=[]) def b2_escape(value): value = value.replace("\\", "\\\\") value = value.replace('"', '\\"') return f'"{value}"' def write_b2_python_config(config): write = config.write # b2 keys python environments by X.Y version, breaking ties by matching # a property list, called the "condition" of the environment. To ensure # b2 always picks the environment we define here, we define a special # feature for the condition and include that in the build request. # Note that we might try to reuse a property we know will be set, like # TORRENT_FOO. But python.jam actually modifies the build request # in this case, so that TORRENT_FOO becomes something like # TORRENT_FOO,3.7,linux:... which causes chaos. # We should always define a custom feature for the condition. write("import feature ;\n") write("feature.feature libtorrent-python : on ;\n") # python.jam tries to determine correct include and library paths. Per # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=691378 , include # detection is broken, but debian's fix is also broken (invokes a global # pythonX.Y instead of the passed interpreter) paths = sysconfig.get_paths() includes = [paths["include"], paths["platinclude"]] write("using python") write(f" : {sysconfig.get_python_version()}") write(f" : {b2_escape(sys.executable)}") write(" : ") write(" ".join(b2_escape(path) for path in includes)) write(" :") # libraries write(" : on") # Note that all else being equal, we'd like to exactly control the output # filename, so distutils can find it. However: # 1. We can only control part of the filename; the prefix is controlled by # our Jamfile and the final suffix is controlled by python.jam. # 2. Debian patched python.jam to disregard the configured ext_suffix # anyway; they always override it with the same sysconfig var we use, # found by invoking the executable. # So instead of applying an arbitrary name, we just try to guarantee that # b2 produces a name that distutils would expect, on all platforms. In # other words we apply debian's override everywhere, and hope no other # overrides ever disagree with us. # Note that sysconfig and distutils.sysconfig disagree here, especially on # windows. ext_suffix = distutils.sysconfig.get_config_var("EXT_SUFFIX") # python.jam appends the platform-specific final suffix on its own. I can't # find a consistent value from sysconfig or distutils.sysconfig for this. for plat_suffix in (".pyd", ".dll", ".so", ".sl"): if ext_suffix.endswith(plat_suffix): ext_suffix = ext_suffix[: -len(plat_suffix)] break write(f" : {b2_escape(ext_suffix)}") write(" ;\n") BuildExtBase = _build_ext_lib.build_ext class LibtorrentBuildExt(BuildExtBase): CONFIG_MODE_DISTUTILS = "distutils" CONFIG_MODE_B2 = "b2" CONFIG_MODES = (CONFIG_MODE_DISTUTILS, CONFIG_MODE_B2) user_options = BuildExtBase.user_options + [ ( "config-mode=", None, "'b2' or 'distutils' (default). " "In b2 mode, setup.py will just invoke b2 using --b2-args. " "It will not attempt to auto-configure b2 or override any " "args. " "In distutils mode, setup.py will attempt to configure " "and invoke b2 to match the expectations and behavior of " "distutils (libtorrent will be built against the invoking " "python, etc; note not all behaviors are currently supported). " "The feature set will match the version found on pypi. " "You can selectively override the auto-configuration in " "this mode with --no-autoconf or --b2-args. For example " "--b2-args=python=x.y or --no-autoconf=python will prevent " "python from being auto-configured. " "Note that --b2-args doesn't currently understand implicit features. " "Be sure to include their names, e.g. --b2-args=variant=debug", ), ( "b2-args=", None, "The full argument string to pass to b2. This is parsed with shlex, to " "support arguments with spaces. For example: --b2-args 'variant=debug " '"my-feature=a value with spaces"\'', ), ( "no-autoconf=", None, "Space-separated list of b2 arguments that should not be " "auto-configured in distutils mode.", ), ( "libtorrent-link=", None, "(DEPRECATED; use --b2-args=libtorrent-link=...) ", ), ( "boost-link=", None, "(DEPRECATED; use --b2-args=boost-link=...) " ), ("toolset=", None, "(DEPRECATED; use --b2-args=toolset=...) b2 toolset"), ( "pic", None, "(DEPRECATED; use --b2-args=libtorrent-python-pic=on) " "whether to compile with -fPIC", ), ( "optimization=", None, "(DEPRECATED; use --b2-args=optimization=...) " "b2 optimization mode", ), ( "hash", None, "(DEPRECATED; use --b2-args=--hash) " "use a property hash for the build directory, rather than " "property subdirectories", ), ( "cxxstd=", None, "(DEPRECATED; use --b2-args=cxxstd=...) " "boost cxxstd value (14, 17, 20, etc.)", ), ] boolean_options = BuildExtBase.boolean_options + ["pic", "hash"] def initialize_options(self): self.config_mode = self.CONFIG_MODE_DISTUTILS self.b2_args = "" self.no_autoconf = "" self.cxxflags = None self.linkflags = None # TODO: this is for backwards compatibility # loading these files will be removed in libtorrent-2.0 try: with open('compile_flags') as f: opts = f.read() if '-std=c++' in opts: self.cxxflags = ['-std=c++' + opts.split('-std=c++')[-1].split()[0]] except OSError: pass # TODO: this is for backwards compatibility # loading these files will be removed in libtorrent-2.0 try: with open('link_flags') as f: opts = f.read().split(' ') opts = [x for x in opts if x.startswith('-L')] if len(opts): self.linkflags = opts except OSError: pass self.toolset = None self.libtorrent_link = None self.boost_link = None self.pic = None self.optimization = None self.hash = None self.cxxstd = None self._b2_args_split = [] self._b2_args_configured = set() return super().initialize_options() def finalize_options(self): super().finalize_options() if self.config_mode not in self.CONFIG_MODES: raise distutils.errors.DistutilsOptionError( f"--config-mode must be one of {self.CONFIG_MODES}" ) # shlex the args here to warn early on bad config self._b2_args_split = shlex.split(self.b2_args or "") self._b2_args_configured.update(shlex.split(self.no_autoconf or "")) # In b2's arg system only single-character args can consume the next # arg, but it may also be concatenated. So we may have "-x", # "-x value", or "-xvalue". All --long args which take a value must # appear as "--long=value" i = 0 while i < len(self._b2_args_split): arg = self._b2_args_split[i] m = re.match(r"(-[dfjlmopst])(.*)", arg) if m: name = m.group(1) # An arg that takes a value but wasn't concatenated. Treat the # next option as the value if not m.group(2): i += 1 else: name = arg.split("=", 1)[0] self._b2_args_configured.add(name) i += 1 # Add deprecated args if self.libtorrent_link: warnings.warn( "--libtorrent-link is deprecated; use --b2-args=libtorrent-link=..." ) self._maybe_add_arg(f"libtorrent-link={self.libtorrent_link}") self._b2_args_configured.add("libtorrent-link") if self.boost_link: warnings.warn("--boost-link is deprecated; use --b2-args=boost-link=...") self._maybe_add_arg(f"boost-link={self.boost_link}") self._b2_args_configured.add("boost-link") if self.toolset: warnings.warn("--toolset is deprecated; use --b2-args=toolset=...") self._maybe_add_arg(f"toolset={self.toolset}") self._b2_args_configured.add("toolset") if self.pic: warnings.warn("--pic is deprecated; use --b2-args=libtorrent-python-pic=on") self._maybe_add_arg("libtorrent-python-pic=on") self._b2_args_configured.add("libtorrent-python-pic") if self.optimization: warnings.warn( "--optimization is deprecated; use --b2-args=optimization=..." ) self._maybe_add_arg(f"optimization={self.optimization}") self._b2_args_configured.add("optimization") if self.hash: warnings.warn("--hash is deprecated; use --b2-args=--hash") self._maybe_add_arg("--hash") if self.cxxstd: warnings.warn("--cxxstd is deprecated; use --b2-args=cxxstd=...") self._maybe_add_arg(f"cxxstd={self.cxxstd}") self._b2_args_configured.add("cxxstd") def _should_add_arg(self, arg): m = re.match(r"(-\w).*", arg) if m: name = m.group(1) else: name = arg.split("=", 1)[0] return name not in self._b2_args_configured def _maybe_add_arg(self, arg): if self._should_add_arg(arg): self._b2_args_split.append(arg) return True return False def run(self): # The current jamfile layout just supports one extension self._build_extension_with_b2() return super().run() def _build_extension_with_b2(self): python_binding_dir = pathlib.Path(__file__).parent.absolute() with self._configure_b2(): if self.linkflags: for lf in self.linkflags: # since b2 may be running with a different directory as cwd, # relative # paths need to be converted to absolute if lf[2] != '/': lf = '-L' + str(pathlib.Path(lf[2:]).absolute()) self._b2_args_split.append("linkflags=" + lf) if self.cxxflags: for f in self.cxxflags: self._b2_args_split.append("cxxflags=" + f) command = ["b2"] + self._b2_args_split log.info(" ".join(command)) subprocess.run(command, cwd=python_binding_dir, check=True) @contextlib.contextmanager def _configure_b2(self): if self.config_mode == self.CONFIG_MODE_DISTUTILS: # If we're using distutils mode, we'll auto-configure a lot of args # and write temporary config. yield from self._configure_b2_with_distutils() else: # If we're using b2 mode, no configuration needed yield def _configure_b2_with_distutils(self): if os.name == "nt": self._maybe_add_arg("--abbreviate-paths") self._maybe_add_arg("boost-link=static") self._maybe_add_arg("libtorrent-link=static") self._maybe_add_arg("crypto=openssl") if distutils.debug.DEBUG: self._maybe_add_arg("--debug-configuration") self._maybe_add_arg("--debug-building") self._maybe_add_arg("--debug-generators") # Default feature configuration self._maybe_add_arg("deprecated-functions=on") variant = "debug" if self.debug else "release" self._maybe_add_arg(f"variant={variant}") bits = 64 if sys.maxsize > 2 ** 32 else 32 self._maybe_add_arg(f"address-model={bits}") # Cross-compiling logic: tricky, because autodetection is usually # better than our matching if sys.platform == "darwin": # macOS uses multi-arch binaries. Attempt to match the # configuration of the running python by translating distutils # platform modes to b2 architecture modes machine = distutils.util.get_platform().split("-")[-1] if machine == "arm64": self._maybe_add_arg("architecture=arm") elif machine in ("ppc", "ppc64"): self._maybe_add_arg("architecture=power") elif machine in ("i386", "x86_64", "intel"): self._maybe_add_arg("architecture=x86") elif machine in ("universal", "fat", "fat3", "fat64"): self._maybe_add_arg("architecture=combined") # NB: as of boost 1.75.0, b2 doesn't have a straightforward way to # build a "universal2" (arm64 + x86_64) binary if self.parallel: self._maybe_add_arg(f"-j{self.parallel}") # We use a "project-config.jam" to instantiate a python environment # to exactly match the running one. override_project_config = False if self._should_add_arg("--project-config"): if self._maybe_add_arg(f"python={sysconfig.get_python_version()}"): override_project_config = True # Jamfile hacks to ensure we select the python environment defined in # our project-config.jam self._maybe_add_arg("libtorrent-python=on") # Our goal is to produce an artifact at this path. If we do this, the # distutils build system will skip trying to build it. target = pathlib.Path(self.get_ext_fullpath("libtorrent")).absolute() self.announce(f"target: {target}") # b2 doesn't provide a way to signal the name or paths of its outputs. # We try to convince python.jam to name its output file like our target # and copy it to our target directory. See comments in # write_b2_python_config for limitations on controlling the filename. # Jamfile hack to copy the module to our target directory self._maybe_add_arg(f"python-install-path={target.parent}") self._maybe_add_arg("install_module") # We use a "project-config.jam" to instantiate a python environment # to exactly match the running one. if override_project_config: config = tempfile.NamedTemporaryFile(mode="w+", delete=False) try: write_b2_python_config(config) config.seek(0) log.info("project-config.jam contents:") log.info(config.read()) config.close() self._b2_args_split.append(f"--project-config={config.name}") yield finally: # If we errored while writing config, windows may complain about # unlinking a file "in use" config.close() os.unlink(config.name) else: yield setuptools.setup( name="libtorrent", version="2.0.5", author="Arvid Norberg", author_email="arvid@libtorrent.org", description="Python bindings for libtorrent-rasterbar", long_description="Python bindings for libtorrent-rasterbar", url="http://libtorrent.org", license="BSD", ext_modules=[StubExtension("libtorrent")], cmdclass={ "build_ext": LibtorrentBuildExt, }, distclass=B2Distribution, ) libtorrent-rasterbar-2.0.5/bindings/python/make_torrent.py0000775000175000017500000000267614152763504023072 0ustar arvidarvid#!/usr/bin/env python3 import sys import os import libtorrent if len(sys.argv) < 3: print('usage make_torrent.py file tracker-url') sys.exit(1) input = os.path.abspath(sys.argv[1]) fs = libtorrent.file_storage() # def predicate(f): # print f # return True # libtorrent.add_files(fs, input, predicate) parent_input = os.path.split(input)[0] # if we have a single file, use it because os.walk does not work on a single files if os.path.isfile(input): size = os.path.getsize(input) fs.add_file(input, size) for root, dirs, files in os.walk(input): # skip directories starting with . if os.path.split(root)[1][0] == '.': continue for f in files: # skip files starting with . if f[0] == '.': continue # skip thumbs.db on windows if f == 'Thumbs.db': continue fname = os.path.join(root[len(parent_input) + 1:], f) size = os.path.getsize(os.path.join(parent_input, fname)) print('%10d kiB %s' % (size / 1024, fname)) fs.add_file(fname, size) if fs.num_files() == 0: print('no files added') sys.exit(1) t = libtorrent.create_torrent(fs, 0, 4 * 1024 * 1024) t.add_tracker(sys.argv[2]) t.set_creator('libtorrent %s' % libtorrent.__version__) libtorrent.set_piece_hashes(t, parent_input, lambda x: sys.stdout.write('.')) sys.stdout.write('\n') f = open('out.torrent', 'wb+') f.write(libtorrent.bencode(t.generate())) f.close() libtorrent-rasterbar-2.0.5/bindings/python/setup.py.cmake.in0000664000175000017500000000073314152763504023211 0ustar arvidarvidfrom setuptools import setup import platform setup( name='libtorrent', version='@libtorrent_VERSION@', author='Arvid Norberg', author_email='arvid@libtorrent.org', description='Python bindings for libtorrent-rasterbar', long_description='Python bindings for libtorrent-rasterbar', url='http://libtorrent.org', platforms=[platform.system() + '-' + platform.machine()], license='BSD', package_dir = {'': '@CMAKE_CURRENT_BINARY_DIR@'} ) libtorrent-rasterbar-2.0.5/bindings/python/Jamfile0000664000175000017500000002334214152763504021306 0ustar arvidarvidimport python ; import feature ; import feature : feature ; import project ; import targets ; import "class" : new ; import modules ; use-project /torrent : ../.. ; BOOST_ROOT = [ modules.peek : BOOST_ROOT ] ; CXXFLAGS = [ modules.peek : CXXFLAGS ] ; LDFLAGS = [ modules.peek : LDFLAGS ] ; ECHO "CXXFLAGS =" $(CXXFLAGS) ; ECHO "LDFLAGS =" $(LDFLAGS) ; # this is used to make bjam use the same version of python which is executing setup.py feature libtorrent-link : shared static prebuilt : composite propagated ; feature libtorrent-python-pic : off on : composite propagated link-incompatible ; feature.compose on : -fPIC ; # when invoking the install_module target, this feature can be specified to # install the python module to a specific directory feature python-install-path : : free path ; # when not specifying a custom install path, this controls whether to install # the python module in the system directory or user-specifc directory feature python-install-scope : user system : ; # copied from boost 1.63's boost python jamfile rule find-py3-version { local BOOST_VERSION_TAG = [ modules.peek boostcpp : BOOST_VERSION_TAG ] ; if $(BOOST_VERSION_TAG) >= 1_67 { # starting with boost 1.67.0 boost python no longer define a separate # target for python3 (boost_python3) so then we just use the regular # boost_python target return ; } local versions = [ feature.values python ] ; local py3ver ; for local v in $(versions) { if $(v) >= 3.0 { py3ver = $(v) ; } } return $(py3ver) ; } if $(BOOST_ROOT) { use-project /boost : $(BOOST_ROOT) ; alias boost_python : /boost/python//boost_python : : : $(BOOST_ROOT) ; if [ find-py3-version ] { alias boost_python3 : /boost/python//boost_python3 : : : $(BOOST_ROOT) ; } else { alias boost_python3 : boost_python ; } } else { local boost-lib-search-path = /opt/local/lib /usr/lib /usr/local/lib /sw/lib /usr/g++/lib ; local boost-include-path = /opt/local/include /usr/local/include /usr/sfw/include ; rule boost_python_version ( name : type ? : properties * ) { # examples of names for the boost_python library: # ubuntu bionic (1.65.1): libboost_python3-py36.so.1.65.1 # ubuntu bionic (1.65): libboost_python-py36.so # libboost_python3-py36.so # libboost_python3.so # ubuntu bionic (1.62.0): libboost_python-py36.so.1.62.0 # ubuntu focal (1.67.0): libboost_python38.so.1.67.0 # ubuntu focal (1.71.0): libboost_python38.so # ubuntu groovy (1.71.0): libboost_python38.so # ubuntu hirsute(1.71.0): libboost_python39.so # debian buster (1.67.0): libboost_python37.so # libboost_python3.so # libboost_python3-py37.so # debian sid (1.74.0): libboost_python39.so # debian sid (1.71.0): libboost_python39.so # debian bullseye (1.71): libboost_python39.so # devian buster-backports (1.71): libboost_python37.so # debian buster (1.67): libboost_python37.so.1.67.0 # debian stretch (1.62.0): libboost_python-py35.so.1.62.0 # debian stretch (1.62): libboost_python-py35.so # debian jessie (1.55.0): libboost_python-py34.so.1.55.0 # boost Jamfile: libboost_python38.so.1.73.0 local py-version = [ $(properties).get ] ; local infix = "" ; if $(py-version) < 3.7 && [ $(properties).get ] = linux { infix = "-py" ; } local boost-python-lib = "boost_python" $(infix) [ SPLIT_BY_CHARACTERS $(py-version) : "." ] ; if $(type) in SEARCHED_LIB { return $(boost-python-lib:J) ; } return ; } lib boost_python : : @boost_python_version : : $(boost-include-path) ; alias boost_python3 : boost_python ; } lib prebuilt_libtorrent : : torrent-rasterbar : : ../../include ; lib prebuilt_libtorrent : : windows torrent : : ../../include ; rule libtorrent_linking ( properties * ) { local result ; # allow larger .obj files (with more sections) if msvc in $(properties) || intel-win in $(properties) { # allow larger .obj files (with more sections) result += /bigobj ; } if gcc in $(properties) && windows in $(properties) { # allow larger .obj files (with more sections) result += -Wa,-mbig-obj ; } if ! windows in $(properties) && gcc in $(properties) && static in $(properties) { result += on ; } if gcc in $(properties) || darwin in $(properties) || clang in $(properties) || clang-darwin in $(properties) { # hide non-external symbols result += -fvisibility=hidden ; result += -fvisibility-inlines-hidden ; if ( gcc in $(properties) ) { result += -Wl,-Bsymbolic ; } } if static in $(properties) { ECHO "WARNING: you probably want to specify libtorrent-link=static rather than link=static" ; } local BOOST_VERSION_TAG = [ modules.peek boostcpp : BOOST_VERSION_TAG ] ; if static in $(properties) && $(BOOST_VERSION_TAG) < 1_74 && linux in $(properties) { ECHO "WARNING: you cannot link statically against boost-python on linux before version 1.74.0, because it links against pthread statically in that case, which is not allowed" ; } local boost_python_lib ; for local prop in $(properties) { switch $(prop) { case 2.* : boost_python_lib = boost_python ; case 3.* : boost_python_lib = boost_python3 ; } } if ! $(boost_python_lib) { ECHO "WARNING: unknown python version" ; boost_python_lib = boost_python ; } # linux must link dynamically against boost python because it pulls # in libpthread, which must be linked dynamically since we're building a .so # (the static build of libpthread is not position independent) if shared in $(properties) || ( linux in $(properties) && $(BOOST_VERSION_TAG) < 1_74 ) { result += $(boost_python_lib)/shared/off ; } else { result += $(boost_python_lib)/static/off ; } if shared in $(properties) { result += /torrent//torrent/shared ; } else if static in $(properties) { result += /torrent//torrent/static ; } else { result += prebuilt_libtorrent ; } return $(result) ; } # this is a copy of the rule from boost-build's python-extension, but without # specifying no as a mandatory property. That property # would otherwise cause build failures because it suppresses linking against the # runtime library and kernel32 on windows rule my-python-extension ( name : sources * : requirements * : default-build * : usage-requirements * ) { requirements += /python//python_for_extensions ; local project = [ project.current ] ; targets.main-target-alternative [ new typed-target $(name) : $(project) : PYTHON_EXTENSION : [ targets.main-target-sources $(sources) : $(name) ] : [ targets.main-target-requirements $(requirements) : $(project) ] : [ targets.main-target-default-build $(default-build) : $(project) ] ] ; } my-python-extension libtorrent : # sources src/module.cpp src/sha1_hash.cpp src/sha256_hash.cpp src/info_hash.cpp src/converters.cpp src/create_torrent.cpp src/fingerprint.cpp src/utility.cpp src/session.cpp src/entry.cpp src/torrent_info.cpp src/string.cpp src/torrent_handle.cpp src/torrent_status.cpp src/session_settings.cpp src/version.cpp src/alert.cpp src/datetime.cpp src/peer_info.cpp src/ip_filter.cpp src/magnet_uri.cpp src/error_code.cpp : # requirements src gcc:-Wno-deprecated-declarations darwin:-Wno-deprecated-declarations darwin:-Wno-unused-command-line-argument @libtorrent_linking openssl:/torrent//ssl openssl:/torrent//crypto "$(CXXFLAGS:J= )" "$(LDFLAGS:J= )" # C4268: 'identifier' : 'const' static/global data initialized # with compiler generated default constructor fills the object with zeros msvc:/wd4268 : # default-build all 14 : # usage-requirements false ; rule python-install-dir ( properties * ) { local install-dir = [ feature.get-values python-install-path : $(properties) ] ; if ( $(install-dir) != "" ) { # if the user has provided an install location, use that one return $(install-dir) ; } local python-interpreter = [ feature.get-values python.interpreter : $(properties) ] ; if ( $(python-interpreter) = "" ) { return . ; } # sys.path are defined differently between python2 and python3 local python-path ; if system in $(properties) { python-path = [ SHELL "$(python-interpreter) -c \"import distutils.sysconfig; import sys; sys.stdout.write(distutils.sysconfig.get_python_lib())\"" ] ; } else { python-path = [ SHELL "$(python-interpreter) -c \"import site; import sys; sys.stdout.write(site.USER_SITE)\"" ] ; } if $(python-path) = "" { return . ; } ECHO "python install directory:" $(python-path) ; return $(python-path) ; } install install_module : libtorrent : @python-install-dir PYTHON_EXTENSION ; explicit install_module ; install stage_module : libtorrent : . PYTHON_EXTENSION : 14 ; install stage_dependencies : /torrent//torrent boost_python boost_python3 : dependencies on SHARED_LIB : 14 ; explicit stage_module ; explicit stage_dependencies ; libtorrent-rasterbar-2.0.5/bindings/python/CMakeLists.txt0000664000175000017500000001146714152763504022561 0ustar arvidarvidcmake_minimum_required(VERSION 3.17.0 FATAL_ERROR) # Configurable policies: <= CMP0102 # To build python bindings we need a python executable and boost python module. Unfortunately, # their names might not be interlinked and we can not implement a general solution. # The code below assumes default boost installation, when the module for python 3 is named 'python3'. # To customize that one can provide a name for the Boost::python module via # 'boost-python-module-name' variable when invoking cmake. # E.g. on Gentoo with python 3.6 and Boost::python library name 'libboost_python-3.6.so' # the parameter would be -Dboost-python-module-name="python-3.6". # The extension module and the cpython executable have to use the same C runtime library. On Windows # Python is compiled with MSVC and we will test MSVC version to make sure that it is the same for # the given Python version and our extension module. See https://wiki.python.org/moin/WindowsCompilers # for details. We provide a flag to skip this test for whatever reason (pass -Dskip-python-runtime-test=True) # Sets _ret to a list of python versions (major.minor) that use the same MSVC runtime as this build does # assumes MSVC was detected already # See https://en.wikipedia.org/wiki/Microsoft_Visual_C++#Internal_version_numbering # See https://devguide.python.org/#status-of-python-branches for supported python versions function(_get_compatible_python_versions _ret) if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 20) list(APPEND _tmp 3.6 3.7 3.8 3.9) endif() set(${_ret} ${_tmp} PARENT_SCOPE) endfunction() if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" AND NOT skip-python-runtime-test) _get_compatible_python_versions(Python_ADDITIONAL_VERSIONS) endif() find_package(Python3 COMPONENTS Interpreter Development REQUIRED) if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" AND NOT skip-python-runtime-test) message(STATUS "Testing found python version. Requested: ${Python_ADDITIONAL_VERSIONS}, found: ${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}") if (NOT "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}" IN_LIST Python_ADDITIONAL_VERSIONS) message(FATAL_ERROR "Incompatible Python and C runtime: MSVC ${CMAKE_CXX_COMPILER_VERSION} and Python ${Python3_VERSION}") endif() endif() set(boost-python-module-name "python${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR}" CACHE STRING "Boost::python module name, e.g. 'python-3.6'") find_package(Boost REQUIRED COMPONENTS ${boost-python-module-name}) Python3_add_library(python-libtorrent MODULE WITH_SOABI src/alert.cpp src/converters.cpp src/create_torrent.cpp src/datetime.cpp src/entry.cpp src/error_code.cpp src/fingerprint.cpp src/info_hash.cpp src/ip_filter.cpp src/magnet_uri.cpp src/module.cpp src/peer_info.cpp src/session.cpp src/session_settings.cpp src/sha1_hash.cpp src/sha256_hash.cpp src/string.cpp src/torrent_handle.cpp src/torrent_info.cpp src/torrent_status.cpp src/utility.cpp src/version.cpp ) set_target_properties(python-libtorrent PROPERTIES OUTPUT_NAME libtorrent ) if (MSVC) target_compile_options(python-libtorrent PRIVATE /bigobj) endif() target_link_libraries(python-libtorrent PRIVATE torrent-rasterbar "Boost::${boost-python-module-name}" ) # Bindings module uses deprecated libtorrent features, thus we disable these warnings if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") check_cxx_compiler_flag("-Wno-deprecated-declarations" _WNO_DEPRECATED_DECLARATIONS) if (_WNO_DEPRECATED_DECLARATIONS) target_compile_options(python-libtorrent PRIVATE -Wno-deprecated-declarations) endif() endif() if (python-install-system-dir) set(_PYTHON3_SITE_ARCH "${Python3_SITEARCH}") else() execute_process( COMMAND "${Python3_EXECUTABLE}" -c [=[ import distutils.sysconfig print(distutils.sysconfig.get_python_lib(prefix='', plat_specific=True)) ]=] OUTPUT_VARIABLE _PYTHON3_SITE_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE ) endif() message(STATUS "Python 3 site packages: ${_PYTHON3_SITE_ARCH}") message(STATUS "Python 3 extension suffix: ${Python3_SOABI}") install(TARGETS python-libtorrent DESTINATION "${_PYTHON3_SITE_ARCH}") if (python-egg-info) set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.cmake.in") set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py") set(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/timestamp") set(DEPS python-libtorrent "${SETUP_PY}") configure_file(${SETUP_PY_IN} ${SETUP_PY} @ONLY) add_custom_command(OUTPUT ${OUTPUT} COMMAND ${Python3_EXECUTABLE} ${SETUP_PY} build -b "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND ${Python3_EXECUTABLE} ${SETUP_PY} egg_info -b "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT} DEPENDS ${DEPS} ) add_custom_target(python_bindings ALL DEPENDS ${OUTPUT}) install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/libtorrent.egg-info" DESTINATION "${_PYTHON3_SITE_ARCH}") endif() libtorrent-rasterbar-2.0.5/bindings/python/simple_client.py0000775000175000017500000000170614152763504023220 0ustar arvidarvid#!/usr/bin/env python3 # Copyright Arvid Norberg 2008. Use, modification and distribution is # subject to the Boost Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) from __future__ import print_function import libtorrent as lt import time import sys ses = lt.session({'listen_interfaces': '0.0.0.0:6881'}) info = lt.torrent_info(sys.argv[1]) h = ses.add_torrent({'ti': info, 'save_path': '.'}) s = h.status() print('starting', s.name) while (not s.is_seeding): s = h.status() print('\r%.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, s.state), end=' ') alerts = ses.pop_alerts() for a in alerts: if a.category() & lt.alert.category_t.error_notification: print(a) sys.stdout.flush() time.sleep(1) print(h.status().name, 'complete') libtorrent-rasterbar-2.0.5/bindings/python/src/0000755000175000017500000000000014152763504020575 5ustar arvidarvidlibtorrent-rasterbar-2.0.5/bindings/python/src/optional.hpp0000664000175000017500000000141114152763504023132 0ustar arvidarvid// Copyright Daniel Wallin 2007. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef OPTIONAL_070108_HPP # define OPTIONAL_070108_HPP # include "boost_python.hpp" # include template struct optional_to_python { optional_to_python() { boost::python::to_python_converter< boost::optional, optional_to_python >(); } static PyObject* convert(boost::optional const& x) { if (!x) return boost::python::incref(Py_None); return boost::python::incref(boost::python::object(*x).ptr()); } }; #endif // OPTIONAL_070108_HPP libtorrent-rasterbar-2.0.5/bindings/python/src/version.cpp0000664000175000017500000000114214152763504022766 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include using namespace boost::python; using lt::version; void bind_version() { scope().attr("__version__") = version(); #if TORRENT_ABI_VERSION == 1 scope().attr("version") = lt::version_str; scope().attr("version_major") = LIBTORRENT_VERSION_MAJOR; scope().attr("version_minor") = LIBTORRENT_VERSION_MINOR; #endif } libtorrent-rasterbar-2.0.5/bindings/python/src/utility.cpp0000664000175000017500000000666314152763504023021 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include #include #include "bytes.hpp" using namespace boost::python; using namespace lt; #ifdef _MSC_VER #pragma warning(push) // warning C4996: X: was declared deprecated #pragma warning( disable : 4996 ) #endif struct bytes_to_python { static PyObject* convert(bytes const& p) { #if PY_MAJOR_VERSION >= 3 PyObject *ret = PyBytes_FromStringAndSize(p.arr.c_str(), p.arr.size()); #else PyObject *ret = PyString_FromStringAndSize(p.arr.c_str(), p.arr.size()); #endif return ret; } }; template struct array_to_python { static PyObject* convert(std::array const& p) { #if PY_MAJOR_VERSION >= 3 PyObject *ret = PyBytes_FromStringAndSize(p.data(), p.size()); #else PyObject *ret = PyString_FromStringAndSize(p.data(), p.size()); #endif return ret; } }; struct bytes_from_python { bytes_from_python() { converter::registry::push_back( &convertible, &construct, type_id()); } static void* convertible(PyObject* x) { #if PY_MAJOR_VERSION >= 3 return (PyBytes_Check(x) || PyByteArray_Check(x)) ? x : nullptr; #else return PyString_Check(x) ? x : nullptr; #endif } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { #if PY_MAJOR_VERSION >= 3 void* storage = ((converter::rvalue_from_python_storage*)data)->storage.bytes; bytes* ret = new (storage) bytes(); if (PyByteArray_Check(x)) { ret->arr.resize(PyByteArray_Size(x)); memcpy(&ret->arr[0], PyByteArray_AsString(x), ret->arr.size()); } else { ret->arr.resize(PyBytes_Size(x)); memcpy(&ret->arr[0], PyBytes_AsString(x), ret->arr.size()); } data->convertible = storage; #else void* storage = ((converter::rvalue_from_python_storage*)data)->storage.bytes; bytes* ret = new (storage) bytes(); ret->arr.resize(PyString_Size(x)); memcpy(&ret->arr[0], PyString_AsString(x), ret->arr.size()); data->convertible = storage; #endif } }; #if TORRENT_ABI_VERSION == 1 object client_fingerprint_(peer_id const& id) { python_deprecated("client_fingerprint is deprecated"); boost::optional result = client_fingerprint(id); return result ? object(*result) : object(); } #endif entry bdecode_(bytes const& data) { return bdecode(data.arr); } bytes bencode_(entry const& e) { bytes result; bencode(std::back_inserter(result.arr), e); return result; } void bind_utility() { // TODO: it would be nice to install converters for sha1_hash as well to_python_converter(); to_python_converter, array_to_python<32>>(); to_python_converter, array_to_python<64>>(); bytes_from_python(); #if TORRENT_ABI_VERSION == 1 def("identify_client", <::identify_client); def("client_fingerprint", &client_fingerprint_); #endif def("bdecode", &bdecode_); def("bencode", &bencode_); } #ifdef _MSC_VER #pragma warning(pop) #endif libtorrent-rasterbar-2.0.5/bindings/python/src/fingerprint.cpp0000664000175000017500000000224414152763504023634 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include "gil.hpp" #include void bind_fingerprint() { using namespace boost::python; using namespace lt; def("generate_fingerprint", &generate_fingerprint); #if TORRENT_ABI_VERSION == 1 #include "libtorrent/aux_/disable_deprecation_warnings_push.hpp" class_("fingerprint", no_init) .def( init( (arg("id"), "major", "minor", "revision", "tag") ) ) .def("__str__", depr(&fingerprint::to_string)) .def_readonly("major_version", depr(&fingerprint::major_version)) .def_readonly("minor_version", depr(&fingerprint::minor_version)) .def_readonly("revision_version", depr(&fingerprint::revision_version)) .def_readonly("tag_version", depr(&fingerprint::tag_version)) ; #include "libtorrent/aux_/disable_warnings_pop.hpp" #endif // TORRENT_ABI_VERSION } libtorrent-rasterbar-2.0.5/bindings/python/src/datetime.cpp0000664000175000017500000000730514152763504023104 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include "optional.hpp" #include #include "libtorrent/time.hpp" #include using namespace boost::python; object datetime_timedelta; object datetime_datetime; template struct chrono_duration_to_python { static PyObject* convert(Duration const& d) { std::int64_t const us = lt::total_microseconds(d); object result = datetime_timedelta( 0 // days , us / 1000000 // seconds , us % 1000000 // microseconds ); return incref(result.ptr()); } }; struct time_duration_to_python { static PyObject* convert(boost::posix_time::time_duration const& d) { object result = datetime_timedelta( 0 // days , 0 // seconds , d.total_microseconds() ); return incref(result.ptr()); } }; template struct tag {}; lt::time_point now(::tag) { return lt::clock_type::now(); } lt::time_point32 now(::tag) { return lt::time_point_cast(lt::clock_type::now()); } template struct time_point_to_python { static PyObject* convert(T const pt) { using std::chrono::system_clock; using std::chrono::duration_cast; object result; if (pt > T()) { time_t const tm = system_clock::to_time_t(system_clock::now() + duration_cast(pt - now(::tag()))); #ifdef TORRENT_WINDOWS std::tm const* date = localtime(&tm); #else std::tm buf; std::tm const* date = localtime_r(&tm, &buf); #endif result = datetime_datetime( (int)1900 + date->tm_year // tm use 0-11 and we need 1-12 , (int)date->tm_mon + 1 , (int)date->tm_mday , date->tm_hour , date->tm_min , date->tm_sec ); } else { result = object(); } return incref(result.ptr()); } }; struct ptime_to_python { static PyObject* convert(boost::posix_time::ptime const& pt) { boost::gregorian::date date = pt.date(); boost::posix_time::time_duration td = pt.time_of_day(); object result = datetime_datetime( (int)date.year() , (int)date.month() , (int)date.day() , td.hours() , td.minutes() , td.seconds() ); return incref(result.ptr()); } }; void bind_datetime() { object datetime = import("datetime").attr("__dict__"); datetime_timedelta = datetime["timedelta"]; datetime_datetime = datetime["datetime"]; to_python_converter(); to_python_converter(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); optional_to_python(); optional_to_python(); } libtorrent-rasterbar-2.0.5/bindings/python/src/torrent_info.cpp0000664000175000017500000004360014152763504024016 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 #include "boost_python.hpp" #include #include "libtorrent/torrent_info.hpp" #include "libtorrent/time.hpp" #include "libtorrent/socket_io.hpp" #include "libtorrent/announce_entry.hpp" #include "libtorrent/info_hash.hpp" // for protocol_version #include "libtorrent/tracker_manager.hpp" // for event_t #include "bytes.hpp" #include "gil.hpp" #ifdef _MSC_VER #pragma warning(push) // warning C4996: X: was declared deprecated #pragma warning( disable : 4996 ) #endif using namespace boost::python; using namespace lt; namespace { std::vector::const_iterator begin_trackers(torrent_info& i) { return i.trackers().begin(); } std::vector::const_iterator end_trackers(torrent_info& i) { return i.trackers().end(); } void add_node(torrent_info& ti, char const* hostname, int port) { ti.add_node(std::make_pair(hostname, port)); } list nodes(torrent_info const& ti) { list result; for (auto const& i : ti.nodes()) result.append(boost::python::make_tuple(i.first, i.second)); return result; } list get_web_seeds(torrent_info const& ti) { std::vector const& ws = ti.web_seeds(); list ret; for (std::vector::const_iterator i = ws.begin() , end(ws.end()); i != end; ++i) { dict d; d["url"] = i->url; d["type"] = i->type; d["auth"] = i->auth; ret.append(d); } return ret; } void set_web_seeds(torrent_info& ti, list ws) { std::vector web_seeds; int const len = static_cast(boost::python::len(ws)); for (int i = 0; i < len; i++) { dict e = extract(ws[i]); int const type = extract(e["type"]); web_seeds.push_back(web_seed_entry( extract(e["url"]) , static_cast(type) , extract(e["auth"]))); } ti.set_web_seeds(web_seeds); } #if TORRENT_ABI_VERSION <= 2 list get_merkle_tree(torrent_info const& ti) { std::vector const& mt = ti.merkle_tree(); list ret; for (std::vector::const_iterator i = mt.begin() , end(mt.end()); i != end; ++i) { ret.append(bytes(i->to_string())); } return ret; } void set_merkle_tree(torrent_info& ti, list hashes) { std::vector h; for (int i = 0, e = int(len(hashes)); i < e; ++i) h.push_back(sha1_hash(bytes(extract(hashes[i])).arr.data())); ti.set_merkle_tree(h); } #endif bytes hash_for_piece(torrent_info const& ti, piece_index_t i) { return bytes(ti.hash_for_piece(i).to_string()); } #if TORRENT_ABI_VERSION <= 2 bytes metadata(torrent_info const& ti) { auto const s = ti.info_section(); return bytes(s.data(), s.size()); } #endif bytes get_info_section(torrent_info const& ti) { auto const s = ti.info_section(); return bytes(s.data(), s.size()); } list map_block(torrent_info& ti, piece_index_t piece, std::int64_t offset, int size) { std::vector p = ti.map_block(piece, offset, size); list result; for (std::vector::iterator i(p.begin()), e(p.end()); i != e; ++i) result.append(*i); return result; } #if TORRENT_ABI_VERSION == 1 // Create getters for announce_entry data members with non-trivial types which need converting. lt::time_point get_next_announce(announce_entry const& ae) { python_deprecated("next_announce is deprecated"); return ae.endpoints.empty() ? lt::time_point() : lt::time_point(ae.endpoints.front().info_hashes[protocol_version::V1].next_announce); } lt::time_point get_min_announce(announce_entry const& ae) { python_deprecated("min_announce is deprecated"); return ae.endpoints.empty() ? lt::time_point() : lt::time_point(ae.endpoints.front().info_hashes[protocol_version::V1].min_announce); } // announce_entry data member bit-fields. int get_fails(announce_entry const& ae) { python_deprecated("fails is deprecated"); return ae.endpoints.empty() ? 0 : ae.endpoints.front().info_hashes[protocol_version::V1].fails; } bool get_updating(announce_entry const& ae) { python_deprecated("updating is deprecated"); return ae.endpoints.empty() ? false : ae.endpoints.front().info_hashes[protocol_version::V1].updating; } bool get_start_sent(announce_entry const& ae) { python_deprecated("start_sent is deprecated"); return ae.endpoints.empty() ? false : ae.endpoints.front().info_hashes[protocol_version::V1].start_sent; } bool get_complete_sent(announce_entry const& ae) { python_deprecated("complete_sent is deprecated"); return ae.endpoints.empty() ? false : ae.endpoints.front().info_hashes[protocol_version::V1].complete_sent; } // announce_entry method requires lt::time_point. bool can_announce(announce_entry const& ae, bool is_seed) { python_deprecated("can_announce() is deprecated"); // an entry without endpoints implies it has never been announced so it can be now if (ae.endpoints.empty()) return true; lt::time_point now = lt::clock_type::now(); return ae.endpoints.front().can_announce(now, is_seed, ae.fail_limit); } bool is_working(announce_entry const& ae) { python_deprecated("is_working is deprecated"); return ae.endpoints.empty() ? false : ae.endpoints.front().is_working(); } #endif int get_source(announce_entry const& ae) { return ae.source; } bool get_verified(announce_entry const& ae) { return ae.verified; } #if TORRENT_ABI_VERSION == 1 std::string get_message(announce_entry const& ae) { python_deprecated("message is deprecated"); return ae.endpoints.empty() ? "" : ae.endpoints.front().info_hashes[protocol_version::V1].message; } error_code get_last_error(announce_entry const& ae) { python_deprecated("last_error is deprecated"); return ae.endpoints.empty() ? error_code() : ae.endpoints.front().info_hashes[protocol_version::V1].last_error; } int get_scrape_incomplete(announce_entry const& ae) { python_deprecated("scrape_incomplete is deprecated"); return ae.endpoints.empty() ? 0 : ae.endpoints.front().info_hashes[protocol_version::V1].scrape_incomplete; } int get_scrape_complete(announce_entry const& ae) { python_deprecated("scrape_complete is deprecated"); return ae.endpoints.empty() ? 0 : ae.endpoints.front().info_hashes[protocol_version::V1].scrape_complete; } int get_scrape_downloaded(announce_entry const& ae) { python_deprecated("scrape_downloaded is deprecated"); return ae.endpoints.empty() ? 0 : ae.endpoints.front().info_hashes[protocol_version::V1].scrape_downloaded; } int next_announce_in(announce_entry const&) { python_deprecated("next_announce_in is deprecated"); return 0; } int min_announce_in(announce_entry const&) { python_deprecated("min_announce_in is deprecated"); return 0; } bool get_send_stats(announce_entry const& ae) { python_deprecated("send_stats is deprecated"); return ae.send_stats; } std::int64_t get_size(file_entry const& fe) { python_deprecated("file_entry is deprecated"); return fe.size; } std::int64_t get_offset(file_entry const& fe) { python_deprecated("file_entry is deprecated"); return fe.offset; } bool get_pad_file(file_entry const& fe) { python_deprecated("file_entry is deprecated"); return fe.pad_file; } bool get_executable_attribute(file_entry const& fe) { python_deprecated("file_entry is deprecated"); return fe.executable_attribute; } bool get_hidden_attribute(file_entry const& fe) { python_deprecated("file_entry is deprecated"); return fe.hidden_attribute; } bool get_symlink_attribute(file_entry const& fe) { python_deprecated("file_entry is deprecated"); return fe.symlink_attribute; } #endif } // namespace unnamed load_torrent_limits dict_to_limits(dict limits) { load_torrent_limits ret; list items = limits.items(); int const len = int(boost::python::len(limits)); for (int i = 0; i < len; i++) { boost::python::api::object_item item = items[i]; std::string const key = extract(item[0]); object const value = item[1]; if (key == "max_buffer_size") { ret.max_buffer_size = extract(value); continue; } else if (key == "max_pieces") { ret.max_pieces = extract(value); continue; } else if (key == "max_decode_depth") { ret.max_decode_depth = extract(value); continue; } else if (key == "max_decode_tokens") { ret.max_decode_tokens = extract(value); continue; } } return ret; } std::shared_ptr buffer_constructor0(bytes b) { return std::make_shared(b.arr, from_span); } std::shared_ptr buffer_constructor1(bytes b, dict limits) { std::shared_ptr ret = std::make_shared(b.arr , dict_to_limits(limits), from_span); return ret; } std::shared_ptr file_constructor0(lt::string_view filename) { return std::make_shared(std::string(filename)); } std::shared_ptr file_constructor1(lt::string_view filename, dict limits) { return std::make_shared(std::string(filename), dict_to_limits(limits)); } std::shared_ptr sha1_constructor0(sha1_hash const& ih) { return std::make_shared(info_hash_t(ih)); } std::shared_ptr sha256_constructor0(sha256_hash const& ih) { return std::make_shared(info_hash_t(ih)); } std::shared_ptr bencoded_constructor0(dict d) { entry ent = extract(d); std::vector buf; bencode(std::back_inserter(buf), ent); return std::make_shared(buf, lt::from_span); } std::shared_ptr bencoded_constructor1(dict d, dict limits) { entry ent = extract(d); std::vector buf; bencode(std::back_inserter(buf), ent); return std::make_shared(buf, dict_to_limits(limits) , lt::from_span); } using by_value = return_value_policy; void bind_torrent_info() { return_value_policy copy; void (torrent_info::*rename_file0)(file_index_t, std::string const&) = &torrent_info::rename_file; class_("file_slice") .add_property("file_index", make_getter((&file_slice::file_index), by_value())) .def_readwrite("offset", &file_slice::offset) .def_readwrite("size", &file_slice::size) ; enum_("protocol_version") .value("V1", protocol_version::V1) .value("V2", protocol_version::V2) ; enum_("tracker_source") .value("source_torrent", announce_entry::source_torrent) .value("source_client", announce_entry::source_client) .value("source_magnet_link", announce_entry::source_magnet_link) .value("source_tex", announce_entry::source_tex) ; using add_tracker1 = void (torrent_info::*)(std::string const&, int, announce_entry::tracker_source); class_>("torrent_info", no_init) .def(init(arg("info_hash"))) .def("__init__", make_constructor(&bencoded_constructor0)) .def("__init__", make_constructor(&bencoded_constructor1)) .def("__init__", make_constructor(&buffer_constructor0)) .def("__init__", make_constructor(&buffer_constructor1)) .def("__init__", make_constructor(&file_constructor0)) .def("__init__", make_constructor(&file_constructor1)) .def(init((arg("ti")))) .def("__init__", make_constructor(&sha1_constructor0)) .def("__init__", make_constructor(&sha256_constructor0)) .def("add_tracker", (add_tracker1)&torrent_info::add_tracker , (arg("url"), arg("tier") = 0 , arg("source") = announce_entry::source_client)) .def("add_url_seed", &torrent_info::add_url_seed, (arg("url") , arg("extern_auth") = std::string{} , arg("extra_headers") = web_seed_entry::headers_t{})) .def("add_http_seed", &torrent_info::add_http_seed, (arg("url") , arg("extern_auth") = std::string{} , arg("extra_headers") = web_seed_entry::headers_t{})) .def("web_seeds", get_web_seeds) .def("set_web_seeds", set_web_seeds) .def("name", &torrent_info::name, copy) .def("comment", &torrent_info::comment, copy) .def("creator", &torrent_info::creator, copy) .def("total_size", &torrent_info::total_size) .def("piece_length", &torrent_info::piece_length) .def("num_pieces", &torrent_info::num_pieces) .def("info_hash", &torrent_info::info_hash) .def("info_hashes", &torrent_info::info_hashes, copy) .def("hash_for_piece", &hash_for_piece) #if TORRENT_ABI_VERSION <= 2 .def("merkle_tree", depr(&get_merkle_tree)) .def("set_merkle_tree", depr(&set_merkle_tree)) #endif .def("piece_size", &torrent_info::piece_size) .def("similar_torrents", &torrent_info::similar_torrents) .def("collections", &torrent_info::collections) .def("ssl_cert", &torrent_info::ssl_cert) .def("num_files", &torrent_info::num_files) .def("rename_file", rename_file0) .def("remap_files", &torrent_info::remap_files) .def("files", &torrent_info::files, return_internal_reference<>()) .def("orig_files", &torrent_info::orig_files, return_internal_reference<>()) #if TORRENT_ABI_VERSION == 1 .def("file_at", depr(&torrent_info::file_at)) #endif // TORRENT_ABI_VERSION .def("is_valid", &torrent_info::is_valid) .def("priv", &torrent_info::priv) .def("is_i2p", &torrent_info::is_i2p) #if TORRENT_ABI_VERSION <= 2 .def("is_merkle_torrent", depr(&torrent_info::is_merkle_torrent)) #endif .def("trackers", range(begin_trackers, end_trackers)) .def("creation_date", &torrent_info::creation_date) .def("add_node", &add_node) .def("nodes", &nodes) #if TORRENT_ABI_VERSION <= 2 .def("metadata", depr(&metadata)) .def("metadata_size", depr(&torrent_info::metadata_size)) #endif .def("info_section", &get_info_section) .def("map_block", map_block) .def("map_file", &torrent_info::map_file) ; #if TORRENT_ABI_VERSION == 1 class_("file_entry") .def_readwrite("path", &file_entry::path) .def_readwrite("symlink_path", &file_entry::symlink_path) .def_readwrite("filehash", &file_entry::filehash) .def_readwrite("mtime", &file_entry::mtime) .add_property("pad_file", &get_pad_file) .add_property("executable_attribute", &get_executable_attribute) .add_property("hidden_attribute", &get_hidden_attribute) .add_property("symlink_attribute", &get_symlink_attribute) .add_property("offset", &get_offset) .add_property("size", &get_size) ; #endif class_("announce_entry", init()) .def_readwrite("url", &announce_entry::url) .def_readonly("trackerid", &announce_entry::trackerid) #if TORRENT_ABI_VERSION == 1 .add_property("message", &get_message) .add_property("last_error", &get_last_error) .add_property("next_announce", &get_next_announce) .add_property("min_announce", &get_min_announce) .add_property("scrape_incomplete", &get_scrape_incomplete) .add_property("scrape_complete", &get_scrape_complete) .add_property("scrape_downloaded", &get_scrape_downloaded) #endif .def_readwrite("tier", &announce_entry::tier) .def_readwrite("fail_limit", &announce_entry::fail_limit) .add_property("source", &get_source) .add_property("verified", &get_verified) #if TORRENT_ABI_VERSION == 1 .add_property("fails", &get_fails) .add_property("updating", &get_updating) .add_property("start_sent", &get_start_sent) .add_property("complete_sent", &get_complete_sent) .add_property("send_stats", &get_send_stats) .def("next_announce_in", depr(&next_announce_in)) .def("min_announce_in", depr(&min_announce_in)) .def("can_announce", depr(&can_announce)) .def("is_working", depr(&is_working)) #endif #if TORRENT_ABI_VERSION <= 2 .def("reset", depr(&announce_entry::reset)) .def("trim", depr(&announce_entry::trim)) #endif ; enum_("event_t") .value("none", event_t::none) .value("completed", event_t::completed) .value("started", event_t::started) .value("stopped", event_t::stopped) .value("paused", event_t::paused) ; implicitly_convertible, std::shared_ptr>(); boost::python::register_ptr_to_python>(); } #ifdef _MSC_VER #pragma warning(pop) #endif libtorrent-rasterbar-2.0.5/bindings/python/src/magnet_uri.cpp0000664000175000017500000000507114152763504023440 0ustar arvidarvid// Copyright Andrew Resch 2008. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt #include "boost_python.hpp" #include "bytes.hpp" #include #include #include #include "gil.hpp" #include "bytes.hpp" using namespace boost::python; using namespace lt; extern void dict_to_add_torrent_params(dict params, add_torrent_params& p); namespace { #if TORRENT_ABI_VERSION == 1 torrent_handle _add_magnet_uri(lt::session& s, std::string uri, dict params) { python_deprecated("add_magnet_uri() is deprecated"); add_torrent_params p; dict_to_add_torrent_params(params, p); allow_threading_guard guard; p.url = uri; #ifndef BOOST_NO_EXCEPTIONS return s.add_torrent(p); #else error_code ec; return s.add_torrent(p, ec); #endif } #endif dict parse_magnet_uri_dict(std::string const& uri) { error_code ec; add_torrent_params p = parse_magnet_uri(uri, ec); if (ec) throw system_error(ec); dict ret; if (p.ti) ret["ti"] = p.ti; list tracker_list; for (std::vector::const_iterator i = p.trackers.begin() , end(p.trackers.end()); i != end; ++i) tracker_list.append(*i); ret["trackers"] = tracker_list; list nodes_list; for (auto const& i : p.dht_nodes) nodes_list.append(boost::python::make_tuple(i.first, i.second)); ret["dht_nodes"] = nodes_list; if (p.info_hashes.has_v2()) ret["info_hashes"] = bytes(p.info_hashes.v2.to_string()); else ret["info_hashes"] = bytes(p.info_hashes.v1.to_string()); #if TORRENT_ABI_VERSION < 3 ret["info_hash"] = bytes(p.info_hashes.get_best().to_string()); #endif ret["name"] = p.name; ret["save_path"] = p.save_path; ret["storage_mode"] = p.storage_mode; #if TORRENT_ABI_VERSION == 1 ret["url"] = p.url; #endif ret["flags"] = p.flags; return ret; } add_torrent_params parse_magnet_uri_wrap(std::string const& uri) { error_code ec; add_torrent_params p = parse_magnet_uri(uri, ec); if (ec) throw system_error(ec); return p; } std::string (*make_magnet_uri0)(torrent_handle const&) = make_magnet_uri; std::string (*make_magnet_uri1)(torrent_info const&) = make_magnet_uri; } void bind_magnet_uri() { #if TORRENT_ABI_VERSION == 1 def("add_magnet_uri", &_add_magnet_uri); #endif def("make_magnet_uri", make_magnet_uri0); def("make_magnet_uri", make_magnet_uri1); def("parse_magnet_uri", parse_magnet_uri_wrap); def("parse_magnet_uri_dict", parse_magnet_uri_dict); } libtorrent-rasterbar-2.0.5/bindings/python/src/gil.hpp0000664000175000017500000001210614152763504022063 0ustar arvidarvid// Copyright Daniel Wallin 2007. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef GIL_070107_HPP # define GIL_070107_HPP #include # include # include # include # include #include #include //namespace libtorrent { namespace python { // RAII helper to release GIL. struct allow_threading_guard { allow_threading_guard() : save(PyEval_SaveThread()) {} ~allow_threading_guard() { PyEval_RestoreThread(save); } PyThreadState* save; }; struct lock_gil { lock_gil() : state(PyGILState_Ensure()) {} ~lock_gil() { PyGILState_Release(state); } PyGILState_STATE state; }; template struct allow_threading { allow_threading(F fn) : fn(fn) {} template R operator()(Self&& s, Args&&... args) { allow_threading_guard guard; return (std::forward(s).*fn)(std::forward(args)...); } F fn; }; template struct visitor : boost::python::def_visitor> { visitor(F fn) : fn(std::move(fn)) {} template void visit_aux( Class& cl, char const* name , Options const& options, Signature const& signature) const { typedef typename boost::mpl::at_c::type return_type; cl.def( name , boost::python::make_function( allow_threading(fn) , options.policies() , options.keywords() , signature ) ); } template void visit(Class& cl, char const* name, Options const& options) const { this->visit_aux( cl, name, options , boost::python::detail::get_signature(fn, (typename Class::wrapped_type*)0) ); } F fn; }; // Member function adaptor that releases and aqcuires the GIL // around the function call. template visitor allow_threads(F fn) { return visitor(fn); } template::type>::value, int>::type = 0> auto invoke(Fn&& fn, Self&& s, Args&&... args) -> #if TORRENT_AUTO_RETURN_TYPES decltype(auto) #else decltype((std::forward(s).*std::forward(fn))(std::forward(args)...)) #endif { return (std::forward(s).*std::forward(fn))(std::forward(args)...); } template::type>::value, int>::type = 0> auto invoke(Fn&& fn, Self&& s) -> #if TORRENT_AUTO_RETURN_TYPES decltype(auto) #else decltype((std::forward(s).*std::forward)(fn)) #endif { return (std::forward(s).*std::forward)(fn); } template::type>::value, int>::type = 0> auto invoke(Fn&& fn, Args&&... args) -> #if TORRENT_AUTO_RETURN_TYPES decltype(auto) #else decltype(std::forward(fn)(std::forward(args)...)) #endif { return std::forward(fn)(std::forward(args)...); } template struct deprecated_fun { deprecated_fun(F fn, char const* name) : fn(fn), fn_name(name) {} template R operator()(Args&&... args) { std::string const msg = std::string(fn_name) + "() is deprecated"; python_deprecated(msg.c_str()); // TODO: in C++17 use std::invoke return ::invoke(fn, std::forward(args)...); } F fn; char const* fn_name; }; template struct deprecate_visitor : boost::python::def_visitor> { deprecate_visitor(F fn) : fn(std::move(fn)) {} template void visit_aux( Class& cl, char const* name , Options const& options, Signature const& signature) const { using return_type = typename boost::mpl::at_c::type; cl.def( name , boost::python::make_function( deprecated_fun(fn, name) , options.policies() , options.keywords() , signature ) ); } template void visit(Class& cl, char const* name, Options const& options) const { this->visit_aux( cl, name, options , boost::python::detail::get_signature(fn, (typename Class::wrapped_type*)0) ); } F fn; }; template deprecate_visitor depr(F fn) { return deprecate_visitor(std::move(fn)); } //}} // namespace libtorrent::python #endif // GIL_070107_HPP libtorrent-rasterbar-2.0.5/bindings/python/src/session.cpp0000664000175000017500000014037114152763504022774 0ustar arvidarvid// Copyright Daniel Wallin, Arvid Norberg 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include // for sign_mutable_item #include #include #include #include #include #include #include #include #include namespace boost { // this fixes mysterious link error on msvc template <> inline lt::alert const volatile* get_pointer(lt::alert const volatile* p) { return p; } } #include "gil.hpp" #include "bytes.hpp" #ifdef _MSC_VER #pragma warning(push) // warning C4996: X: was declared deprecated #pragma warning( disable : 4996 ) #endif using namespace boost::python; using namespace lt; // defined in torrent_info.cpp load_torrent_limits dict_to_limits(dict limits); namespace { #if TORRENT_ABI_VERSION == 1 struct dummy {}; void listen_on(lt::session& s, int min_, int max_, char const* interface, int flags) { allow_threading_guard guard; error_code ec; s.listen_on(std::make_pair(min_, max_), ec, interface, flags); #ifndef BOOST_NO_EXCEPTIONS if (ec) throw system_error(ec); #endif } void outgoing_ports(lt::session& s, int _min, int _max) { allow_threading_guard guard; settings_pack p; p.set_int(settings_pack::outgoing_port, _min); p.set_int(settings_pack::num_outgoing_ports, _max - _min); s.apply_settings(p); return; } #endif // TORRENT_ABI_VERSION #ifndef TORRENT_DISABLE_DHT void add_dht_node(lt::session& s, tuple n) { std::string ip = extract(n[0]); int port = extract(n[1]); allow_threading_guard guard; s.add_dht_node(std::make_pair(ip, port)); } #if TORRENT_ABI_VERSION == 1 void add_dht_router(lt::session& s, std::string router_, int port_) { allow_threading_guard guard; return s.add_dht_router(std::make_pair(router_, port_)); } #endif #endif // TORRENT_DISABLE_DHT void add_extension(lt::session& s, object const& e) { #ifndef TORRENT_DISABLE_EXTENSIONS if (!extract(e).check()) return; std::string name = extract(e); if (name == "ut_metadata") s.add_extension(create_ut_metadata_plugin); else if (name == "ut_pex") s.add_extension(create_ut_pex_plugin); else if (name == "smart_ban") s.add_extension(create_smart_ban_plugin); #endif // TORRENT_DISABLE_EXTENSIONS } void make_settings_pack(lt::settings_pack& p, dict const& sett_dict) { stl_input_iterator i(sett_dict.keys()), end; for (; i != end; ++i) { std::string const key = *i; int sett = setting_by_name(key); if (sett < 0) { PyErr_SetString(PyExc_KeyError, ("unknown name in settings_pack: " + key).c_str()); throw_error_already_set(); } TORRENT_TRY { // if the dictionary doesn't contain "key", it will throw, hence // the try-catch here object const value = sett_dict[key]; switch (sett & settings_pack::type_mask) { case settings_pack::string_type_base: p.set_str(sett, extract(value)); break; case settings_pack::int_type_base: { std::int64_t const val = extract(value); // deliberately truncate and sign-convert here. If we // extract an int directly, unsigned ints may throw // an exception otherwise, if it doesn't fit. Notably for a // flag-type with all bits set. p.set_int(sett, static_cast(val)); break; } case settings_pack::bool_type_base: p.set_bool(sett, extract(value)); break; } } TORRENT_CATCH(...) {} } } dict make_dict(lt::settings_pack const& sett) { dict ret; for (int i = settings_pack::string_type_base; i < settings_pack::max_string_setting_internal; ++i) { // deprecated settings are still here, they just have empty names char const* name = name_for_setting(i); if (name[0] != '\0') ret[name] = sett.get_str(i); } for (int i = settings_pack::int_type_base; i < settings_pack::max_int_setting_internal; ++i) { char const* name = name_for_setting(i); if (name[0] != '\0') ret[name] = sett.get_int(i); } for (int i = settings_pack::bool_type_base; i < settings_pack::max_bool_setting_internal; ++i) { char const* name = name_for_setting(i); if (name[0] != '\0') ret[name] = sett.get_bool(i); } return ret; } std::shared_ptr make_session(boost::python::dict sett , session_flags_t const flags) { settings_pack p; make_settings_pack(p, sett); #if TORRENT_ABI_VERSION <= 2 if (flags & lt::session::add_default_plugins) { // TODO: this can't really be removed until there is a way to // control plugins by exposing session_params. // The simplest solution would probably be to make the default // plugins not be plugins, but just bake in support for them // python_deprecated("add_default_plugins flag is deprecated"); #endif session_params params(std::move(p)); return std::make_shared(std::move(params), flags); #if TORRENT_ABI_VERSION <= 2 } else { session_params params(std::move(p), {}); return std::make_shared(std::move(params), flags); } #endif } void session_apply_settings(lt::session& ses, dict const& sett_dict) { settings_pack p; make_settings_pack(p, sett_dict); allow_threading_guard guard; ses.apply_settings(p); } dict session_get_settings(lt::session const& ses) { settings_pack sett; { allow_threading_guard guard; sett = ses.get_settings(); } return make_dict(sett); } dict min_memory_usage_wrapper() { settings_pack ret = min_memory_usage(); return make_dict(ret); } dict default_settings_wrapper() { return make_dict(default_settings()); } dict high_performance_seed_wrapper() { settings_pack ret = high_performance_seed(); return make_dict(ret); } #ifndef BOOST_NO_EXCEPTIONS #if TORRENT_ABI_VERSION == 1 torrent_handle add_torrent_depr(lt::session& s, torrent_info const& ti , std::string const& save, entry const& resume , storage_mode_t storage_mode, bool paused) { allow_threading_guard guard; return s.add_torrent(ti, save, resume, storage_mode, paused); } #endif #endif } void dict_to_add_torrent_params(dict params, add_torrent_params& p) { list items = params.items(); int const len = int(boost::python::len(items)); for (int i = 0; i < len; i++) { boost::python::api::object_item item = items[i]; std::string const key = extract(item[0]); object const value = item[1]; // torrent_info objects are always held by a shared_ptr in the // python binding, skip it if it is a object if (key == "ti" && value != boost::python::object()) { // make a copy here. We don't want to end up holding a python-owned // object inside libtorrent. If the last reference goes out of scope // on the C++ side, it will end up freeing the python object // without holding the GIL and likely crash. // https://mail.python.org/pipermail/cplusplus-sig/2007-June/012130.html p.ti = std::make_shared( extract(value)); continue; } #if TORRENT_ABI_VERSION < 3 else if (key == "info_hash") { if (boost::python::len(value) == sha1_hash::size()) { p.info_hash = sha1_hash(bytes(extract(value)).arr.data()); } } #endif else if (key == "info_hashes") { if (boost::python::len(value) == sha1_hash::size()) { p.info_hashes = info_hash_t(sha1_hash( bytes(extract(value)).arr.data())); } else if (boost::python::len(value) == sha256_hash::size()) { p.info_hashes = info_hash_t(sha256_hash( bytes(extract(value)).arr.data())); } else { p.info_hashes = boost::python::extract(value); } continue; } else if(key == "name") { p.name = extract(value); continue; } else if(key == "save_path") { p.save_path = extract(value); continue; } #if TORRENT_ABI_VERSION == 1 else if(key == "resume_data") { python_deprecated("the resume_data member is deprecated"); std::string resume = extract(value); p.resume_data.assign(resume.begin(), resume.end()); continue; } #endif else if(key == "storage_mode") { p.storage_mode = extract(value); continue; } else if(key == "trackers") { p.trackers = extract>(value); continue; } else if(key == "url_seeds") { p.url_seeds = extract>(value); continue; } else if(key == "http_seeds") { p.http_seeds = extract(value); continue; } else if(key == "dht_nodes") { p.dht_nodes = extract>>(value); continue; } else if(key == "banned_peers") { p.banned_peers = extract>(value); continue; } else if(key == "peers") { p.peers = extract>(value); continue; } else if(key == "flags") { p.flags = extract(value); continue; } else if(key == "trackerid") { p.trackerid = extract(value); continue; } #if TORRENT_ABI_VERSION == 1 else if(key == "url") { python_deprecated("the url member is deprecated"); p.url = extract(value); continue; } #endif else if(key == "renamed_files") { p.renamed_files = extract>(value); } else if(key == "file_priorities") { p.file_priorities = extract>(value); } else { PyErr_SetString(PyExc_KeyError, ("unknown name in torrent params: " + key).c_str()); throw_error_already_set(); } } } namespace { torrent_handle add_torrent(lt::session& s, dict params) { add_torrent_params p; dict_to_add_torrent_params(params, p); allow_threading_guard guard; #ifndef BOOST_NO_EXCEPTIONS return s.add_torrent(std::move(p)); #else error_code ec; return s.add_torrent(std::move(p), ec); #endif } void async_add_torrent(lt::session& s, dict params) { add_torrent_params p; dict_to_add_torrent_params(params, p); allow_threading_guard guard; s.async_add_torrent(std::move(p)); } torrent_handle wrap_add_torrent(lt::session& s, lt::add_torrent_params const& p) { add_torrent_params atp = p; if (p.ti) atp.ti = std::make_shared(*p.ti); allow_threading_guard guard; #ifndef BOOST_NO_EXCEPTIONS return s.add_torrent(std::move(p)); #else error_code ec; return s.add_torrent(std::move(p), ec); #endif } void wrap_async_add_torrent(lt::session& s, lt::add_torrent_params const& p) { add_torrent_params atp = p; if (p.ti) atp.ti = std::make_shared(*p.ti); allow_threading_guard guard; s.async_add_torrent(std::move(p)); } #if TORRENT_ABI_VERSION == 1 void start_natpmp(lt::session& s) { allow_threading_guard guard; s.start_natpmp(); } void start_upnp(lt::session& s) { allow_threading_guard guard; s.start_upnp(); } #endif // TORRENT_ABI_VERSION void alert_notify(object cb) try { lock_gil lock; if (cb) { cb(); } } catch (boost::python::error_already_set const&) { // this callback isn't supposed to throw an error. // just swallow and ignore the exception TORRENT_ASSERT_FAIL_VAL("python notify callback threw exception"); } void set_alert_notify(lt::session& s, object cb) { s.set_alert_notify(std::bind(&alert_notify, cb)); } #ifdef TORRENT_WINDOWS void alert_socket_notify(SOCKET const fd) { std::uint8_t dummy = 0; ::send(fd, reinterpret_cast(&dummy), 1, 0); } #endif void alert_fd_notify(int const fd) { std::uint8_t dummy = 0; while (::write(fd, &dummy, 1) < 0 && errno == EINTR); } void set_alert_fd(lt::session& s, std::intptr_t const fd) { #ifdef TORRENT_WINDOWS auto const sock = static_cast(fd); int res; int res_size = sizeof(res); if (sock != INVALID_SOCKET && ::getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)&res, &res_size) == 0) { s.set_alert_notify(std::bind(&alert_socket_notify, sock)); } else #endif { s.set_alert_notify(std::bind(&alert_fd_notify, fd)); } } alert const* wait_for_alert(lt::session& s, int ms) { alert const* a; { allow_threading_guard guard; a = s.wait_for_alert(milliseconds(ms)); } return a; } list get_torrents(lt::session& s) { std::vector torrents; { allow_threading_guard guard; torrents = s.get_torrents(); } list ret; for (std::vector::iterator i = torrents.begin(); i != torrents.end(); ++i) ret.append(*i); return ret; } bool wrap_pred(object pred, torrent_status const& st) { return pred(st); } list get_torrent_status(lt::session& s, object pred, int const flags) { // keep a reference to the predicate here, in the python thread, to // ensure it's freed in this thread at the end. If we move it into the // libtorrent thread the python predicate will be freed from that // thread, which won't work auto wrapped_pred = std::bind(&wrap_pred, pred, std::placeholders::_1); std::vector torrents = s.get_torrent_status(std::ref(wrapped_pred), status_flags_t(flags)); list ret; for (std::vector::iterator i = torrents.begin(); i != torrents.end(); ++i) ret.append(*i); return ret; } list refresh_torrent_status(lt::session& s, list in_torrents, int const flags) { std::vector torrents; int const n = int(boost::python::len(in_torrents)); for (int i = 0; i < n; ++i) torrents.push_back(extract(in_torrents[i])); { allow_threading_guard guard; s.refresh_torrent_status(&torrents, status_flags_t(flags)); } list ret; for (std::vector::iterator i = torrents.begin(); i != torrents.end(); ++i) ret.append(*i); return ret; } #if TORRENT_ABI_VERSION == 1 dict get_utp_stats(session_status const& st) { python_deprecated("session_status is deprecated"); dict ret; ret["num_idle"] = st.utp_stats.num_idle; ret["num_syn_sent"] = st.utp_stats.num_syn_sent; ret["num_connected"] = st.utp_stats.num_connected; ret["num_fin_sent"] = st.utp_stats.num_fin_sent; ret["num_close_wait"] = st.utp_stats.num_close_wait; return ret; } #endif entry save_state(lt::session const& s, std::uint32_t const flags) { entry e; #if TORRENT_ABI_VERSION <= 2 allow_threading_guard guard; s.save_state(e, save_state_flags_t(flags)); #endif return e; } list pop_alerts(lt::session& ses) { std::vector alerts; { allow_threading_guard guard; ses.pop_alerts(&alerts); } list ret; for (alert* a : alerts) { ret.append(boost::python::ptr(a)); } return ret; } void load_state(lt::session& ses, entry const& st, std::uint32_t const flags) { #if TORRENT_ABI_VERSION <= 2 allow_threading_guard guard; std::vector buf; bencode(std::back_inserter(buf), st); bdecode_node e; error_code ec; bdecode(&buf[0], &buf[0] + buf.size(), e, ec); TORRENT_ASSERT(!ec); ses.load_state(e, save_state_flags_t(flags)); #endif } dict get_peer_class(lt::session& ses, lt::peer_class_t const pc) { lt::peer_class_info pci; { allow_threading_guard guard; pci = ses.get_peer_class(pc); } dict ret; ret["ignore_unchoke_slots"] = pci.ignore_unchoke_slots; ret["connection_limit_factor"] = pci.connection_limit_factor; ret["label"] = pci.label; ret["upload_limit"] = pci.upload_limit; ret["download_limit"] = pci.download_limit; ret["upload_priority"] = pci.upload_priority; ret["download_priority"] = pci.download_priority; return ret; } void set_peer_class(lt::session& ses, peer_class_t const pc, dict info) { lt::peer_class_info pci; stl_input_iterator i(info.keys()), end; for (; i != end; ++i) { std::string const key = *i; object const value = info[key]; if (key == "ignore_unchoke_slots") { pci.ignore_unchoke_slots = extract(value); } else if (key == "connection_limit_factor") { pci.connection_limit_factor = extract(value); } else if (key == "label") { pci.label = extract(value); } else if (key == "upload_limit") { pci.upload_limit = extract(value); } else if (key == "download_limit") { pci.download_limit = extract(value); } else if (key == "upload_priority") { pci.upload_priority = extract(value); } else if (key == "download_priority") { pci.download_priority = extract(value); } else { PyErr_SetString(PyExc_KeyError, ("unknown name in peer_class_info: " + key).c_str()); throw_error_already_set(); } } allow_threading_guard guard; ses.set_peer_class(pc, pci); } #ifndef TORRENT_DISABLE_DHT void dht_get_mutable_item(lt::session& ses, std::string key, std::string salt) { TORRENT_ASSERT(key.size() == 32); std::array public_key; std::copy(key.begin(), key.end(), public_key.begin()); ses.dht_get_item(public_key, salt); } void put_string(entry& e, std::array& sig, std::int64_t& seq , std::string const& salt, std::string pk, std::string sk , std::string data) { using lt::dht::sign_mutable_item; e = data; std::vector buf; bencode(std::back_inserter(buf), e); ++seq; dht::signature sign = sign_mutable_item(buf, salt , dht::sequence_number(seq) , dht::public_key(pk.data()) , dht::secret_key(sk.data())); sig = sign.bytes; } void dht_put_mutable_item(lt::session& ses, std::string private_key, std::string public_key, std::string data, std::string salt) { TORRENT_ASSERT(private_key.size() == 64); TORRENT_ASSERT(public_key.size() == 32); std::array key; std::copy(public_key.begin(), public_key.end(), key.begin()); ses.dht_put_item(key , [pk=std::move(public_key), sk=std::move(private_key), d=std::move(data)] (entry& e, std::array& sig, std::int64_t& seq, std::string const& salt) { put_string(e, sig, seq, salt, pk, sk, d); } , salt); } #endif add_torrent_params read_resume_data_wrapper0(bytes const& b) { return read_resume_data(b.arr); } add_torrent_params read_resume_data_wrapper1(bytes const& b, dict cfg) { return read_resume_data(b.arr, dict_to_limits(cfg)); } int find_metric_idx_wrap(char const* name) { return lt::find_metric_idx(name); } bytes write_resume_data_buf_(add_torrent_params const& atp) { bytes ret; auto buf = write_resume_data_buf(atp); ret.arr.resize(buf.size()); std::copy(buf.begin(), buf.end(), ret.arr.begin()); return ret; } session_params read_session_params_entry(dict e , save_state_flags_t flags) { entry ent = extract(e); std::vector buf; bencode(std::back_inserter(buf), ent); return lt::read_session_params(buf, flags); } session_params read_session_params_buffer(bytes const& bytes , save_state_flags_t flags) { return lt::read_session_params(bytes.arr, flags); } bytes write_session_params_bytes(session_params const& sp , save_state_flags_t flags) { auto buf = write_session_params_buf(sp, flags); return bytes(buf.data(), buf.size()); } struct dict_to_settings { dict_to_settings() { converter::registry::push_back( &convertible, &construct, type_id() ); } static void* convertible(PyObject* x) { return PyDict_Check(x) ? x: nullptr; } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage*)data)->storage.bytes; dict o(borrowed(x)); auto p = new (storage) lt::settings_pack; data->convertible = p; make_settings_pack(*p, o); } }; struct settings_to_dict { static PyObject* convert(lt::settings_pack const& p) { dict ret = make_dict(p); return incref(ret.ptr()); } }; } // anonymous namespace struct dummy1 {}; #if TORRENT_ABI_VERSION == 1 struct dummy2 {}; #endif struct dummy9 {}; struct dummy10 {}; struct dummy11 {}; void bind_session() { dict_to_settings(); to_python_converter(); #ifndef TORRENT_DISABLE_DHT void (lt::session::*dht_get_immutable_item)(sha1_hash const&) = <::session::dht_get_item; sha1_hash (lt::session::*dht_put_immutable_item)(entry data) = <::session::dht_put_item; #endif // TORRENT_DISABLE_DHT #if TORRENT_ABI_VERSION == 1 #ifndef TORRENT_DISABLE_DHT void (lt::session::*start_dht0)() = <::session::start_dht; void (lt::session::*start_dht1)(entry const&) = <::session::start_dht; #endif class_("session_status") .def_readonly("has_incoming_connections", &session_status::has_incoming_connections) .def_readonly("upload_rate", &session_status::upload_rate) .def_readonly("download_rate", &session_status::download_rate) .def_readonly("total_download", &session_status::total_download) .def_readonly("total_upload", &session_status::total_upload) .def_readonly("payload_upload_rate", &session_status::payload_upload_rate) .def_readonly("payload_download_rate", &session_status::payload_download_rate) .def_readonly("total_payload_download", &session_status::total_payload_download) .def_readonly("total_payload_upload", &session_status::total_payload_upload) .def_readonly("ip_overhead_upload_rate", &session_status::ip_overhead_upload_rate) .def_readonly("ip_overhead_download_rate", &session_status::ip_overhead_download_rate) .def_readonly("total_ip_overhead_download", &session_status::total_ip_overhead_download) .def_readonly("total_ip_overhead_upload", &session_status::total_ip_overhead_upload) .def_readonly("dht_upload_rate", &session_status::dht_upload_rate) .def_readonly("dht_download_rate", &session_status::dht_download_rate) .def_readonly("total_dht_download", &session_status::total_dht_download) .def_readonly("total_dht_upload", &session_status::total_dht_upload) .def_readonly("tracker_upload_rate", &session_status::tracker_upload_rate) .def_readonly("tracker_download_rate", &session_status::tracker_download_rate) .def_readonly("total_tracker_download", &session_status::total_tracker_download) .def_readonly("total_tracker_upload", &session_status::total_tracker_upload) .def_readonly("total_redundant_bytes", &session_status::total_redundant_bytes) .def_readonly("total_failed_bytes", &session_status::total_failed_bytes) .def_readonly("num_peers", &session_status::num_peers) .def_readonly("num_unchoked", &session_status::num_unchoked) .def_readonly("allowed_upload_slots", &session_status::allowed_upload_slots) .def_readonly("up_bandwidth_queue", &session_status::up_bandwidth_queue) .def_readonly("down_bandwidth_queue", &session_status::down_bandwidth_queue) .def_readonly("up_bandwidth_bytes_queue", &session_status::up_bandwidth_bytes_queue) .def_readonly("down_bandwidth_bytes_queue", &session_status::down_bandwidth_bytes_queue) .def_readonly("optimistic_unchoke_counter", &session_status::optimistic_unchoke_counter) .def_readonly("unchoke_counter", &session_status::unchoke_counter) #ifndef TORRENT_DISABLE_DHT .def_readonly("dht_nodes", &session_status::dht_nodes) .def_readonly("dht_node_cache", &session_status::dht_node_cache) .def_readonly("dht_torrents", &session_status::dht_torrents) .def_readonly("dht_global_nodes", &session_status::dht_global_nodes) .add_property("active_requests", make_getter(&session_status::active_requests, return_value_policy())) .def_readonly("dht_total_allocations", &session_status::dht_total_allocations) #endif // TORRENT_DISABLE_DHT .add_property("utp_stats", &get_utp_stats) ; #ifndef TORRENT_DISABLE_DHT class_("dht_lookup") .def_readonly("type", &dht_lookup::type) .def_readonly("outstanding_requests", &dht_lookup::outstanding_requests) .def_readonly("timeouts", &dht_lookup::timeouts) .def_readonly("response", &dht_lookup::responses) .def_readonly("branch_factor", &dht_lookup::branch_factor) ; #endif // TORRENT_DISABLE_DHT #endif // TORRENT_ABI_VERSION #define PROP(val) \ make_getter(val, return_value_policy()), \ make_setter(val, return_value_policy()) class_("add_torrent_params") .def_readwrite("version", &add_torrent_params::version) .def_readwrite("ti", &add_torrent_params::ti) .add_property("trackers", PROP(&add_torrent_params::trackers)) .add_property("tracker_tiers", PROP(&add_torrent_params::tracker_tiers)) .add_property("dht_nodes", PROP(&add_torrent_params::dht_nodes)) .def_readwrite("name", &add_torrent_params::name) .def_readwrite("save_path", &add_torrent_params::save_path) .def_readwrite("storage_mode", &add_torrent_params::storage_mode) // .def_readwrite("storage", &add_torrent_params::storage) .add_property("file_priorities", PROP(&add_torrent_params::file_priorities)) .def_readwrite("trackerid", &add_torrent_params::trackerid) .add_property("flags", PROP(&add_torrent_params::flags)) .def_readwrite("max_uploads", &add_torrent_params::max_uploads) .def_readwrite("max_connections", &add_torrent_params::max_connections) .def_readwrite("upload_limit", &add_torrent_params::upload_limit) .def_readwrite("download_limit", &add_torrent_params::download_limit) .def_readwrite("total_uploaded", &add_torrent_params::total_uploaded) .def_readwrite("total_downloaded", &add_torrent_params::total_downloaded) .def_readwrite("active_time", &add_torrent_params::active_time) .def_readwrite("finished_time", &add_torrent_params::finished_time) .def_readwrite("seeding_time", &add_torrent_params::seeding_time) .def_readwrite("added_time", &add_torrent_params::added_time) .def_readwrite("completed_time", &add_torrent_params::completed_time) .def_readwrite("last_seen_complete", &add_torrent_params::last_seen_complete) .def_readwrite("last_download", &add_torrent_params::last_download) .def_readwrite("last_upload", &add_torrent_params::last_upload) .def_readwrite("num_complete", &add_torrent_params::num_complete) .def_readwrite("num_incomplete", &add_torrent_params::num_incomplete) .def_readwrite("num_downloaded", &add_torrent_params::num_downloaded) #if TORRENT_ABI_VERSION < 3 .def_readwrite("info_hash", &add_torrent_params::info_hash) #endif .def_readwrite("info_hashes", &add_torrent_params::info_hashes) .add_property("http_seeds", PROP(&add_torrent_params::http_seeds)) .add_property("url_seeds", PROP(&add_torrent_params::url_seeds)) .add_property("peers", PROP(&add_torrent_params::peers)) .add_property("banned_peers", PROP(&add_torrent_params::banned_peers)) .add_property("unfinished_pieces", PROP(&add_torrent_params::unfinished_pieces)) .add_property("have_pieces", PROP(&add_torrent_params::have_pieces)) .add_property("verified_pieces", PROP(&add_torrent_params::verified_pieces)) .add_property("piece_priorities", PROP(&add_torrent_params::piece_priorities)) #if TORRENT_ABI_VERSION <= 2 .add_property("merkle_tree", PROP(&add_torrent_params::merkle_tree)) #endif .add_property("renamed_files", PROP(&add_torrent_params::renamed_files)) #if TORRENT_ABI_VERSION == 1 .def_readwrite("url", &add_torrent_params::url) .add_property("resume_data", PROP(&add_torrent_params::resume_data)) #endif ; #ifndef TORRENT_DISABLE_DHT class_("dht_state") .add_property("nids", <::dht::dht_state::nids) .add_property("nodes", <::dht::dht_state::nodes) .add_property("nodes6", <::dht::dht_state::nodes6) ; #endif class_("session_params") .def(init()) .def(init<>()) // TODO: since there's not binding for settings_pack, but they are just // represented as dicts, this won't return a reference, but a copy of // the settings .add_property("settings", PROP(&session_params::settings)) #ifndef TORRENT_DISABLE_DHT .def_readwrite("dht_state", &session_params::dht_state) #endif .add_property("ext_state", PROP(&session_params::ext_state)) .def_readwrite("ip_filter", &session_params::ip_filter) ; def("read_session_params", &read_session_params_entry, (arg("dict"), arg("flags")=save_state_flags_t::all())); def("read_session_params", &read_session_params_buffer, (arg("buffer"), arg("flags")=save_state_flags_t::all())); def("write_session_params", <::write_session_params, (arg("entry"), arg("flags")=save_state_flags_t::all())); def("write_session_params_buf", &write_session_params_bytes, (arg("buffer"), arg("flags")=save_state_flags_t::all())); enum_("storage_mode_t") .value("storage_mode_allocate", storage_mode_allocate) .value("storage_mode_sparse", storage_mode_sparse) ; { scope s = class_("options_t"); s.attr("delete_files") = lt::session::delete_files; } { scope s = class_("session_flags_t"); s.attr("paused") = lt::session::paused; #if TORRENT_ABI_VERSION <= 2 s.attr("add_default_plugins") = lt::session::add_default_plugins; #endif #if TORRENT_ABI_VERSION == 1 s.attr("start_default_features") = lt::session::start_default_features; #endif } { scope s = class_("torrent_flags"); s.attr("seed_mode") = torrent_flags::seed_mode; s.attr("upload_mode") = torrent_flags::upload_mode; s.attr("share_mode") = torrent_flags::share_mode; s.attr("apply_ip_filter") = torrent_flags::apply_ip_filter; s.attr("paused") = torrent_flags::paused; s.attr("auto_managed") = torrent_flags::auto_managed; s.attr("duplicate_is_error") = torrent_flags::duplicate_is_error; s.attr("update_subscribe") = torrent_flags::update_subscribe; s.attr("super_seeding") = torrent_flags::super_seeding; s.attr("sequential_download") = torrent_flags::sequential_download; s.attr("stop_when_ready") = torrent_flags::stop_when_ready; s.attr("override_trackers") = torrent_flags::override_trackers; s.attr("override_web_seeds") = torrent_flags::override_web_seeds; s.attr("disable_dht") = torrent_flags::disable_dht; s.attr("disable_lsd") = torrent_flags::disable_lsd; s.attr("disable_pex") = torrent_flags::disable_pex; s.attr("no_verify_files") = torrent_flags::no_verify_files; s.attr("default_flags") = torrent_flags::default_flags; } #if TORRENT_ABI_VERSION == 1 { scope s = class_("add_torrent_params_flags_t"); s.attr("flag_seed_mode") = add_torrent_params::flag_seed_mode; s.attr("flag_upload_mode") = add_torrent_params::flag_upload_mode; s.attr("flag_share_mode") = add_torrent_params::flag_share_mode; s.attr("flag_apply_ip_filter") = add_torrent_params::flag_apply_ip_filter; s.attr("flag_paused") = add_torrent_params::flag_paused; s.attr("flag_auto_managed") = add_torrent_params::flag_auto_managed; s.attr("flag_duplicate_is_error") = add_torrent_params::flag_duplicate_is_error; s.attr("flag_update_subscribe") = add_torrent_params::flag_update_subscribe; s.attr("flag_super_seeding") = add_torrent_params::flag_super_seeding; s.attr("flag_sequential_download") = add_torrent_params::flag_sequential_download; s.attr("flag_stop_when_ready") = add_torrent_params::flag_stop_when_ready; s.attr("flag_override_trackers") = add_torrent_params::flag_override_trackers; s.attr("flag_override_web_seeds") = add_torrent_params::flag_override_web_seeds; s.attr("flag_pinned") = add_torrent_params::flag_pinned; s.attr("flag_override_resume_data") = add_torrent_params::flag_override_resume_data; s.attr("flag_merge_resume_trackers") = add_torrent_params::flag_merge_resume_trackers; s.attr("flag_use_resume_save_path") = add_torrent_params::flag_use_resume_save_path; s.attr("flag_merge_resume_http_seeds") = add_torrent_params::flag_merge_resume_http_seeds; s.attr("default_flags") = add_torrent_params::flag_default_flags; } #endif ; enum_("portmap_protocol") .value("none", lt::portmap_protocol::none) .value("udp", lt::portmap_protocol::udp) .value("tcp", lt::portmap_protocol::tcp) ; enum_("portmap_transport") .value("natpmp", lt::portmap_transport::natpmp) .value("upnp", lt::portmap_transport::upnp) ; enum_("peer_class_type_filter_socket_type_t") .value("tcp_socket", peer_class_type_filter::tcp_socket) .value("utp_socket", peer_class_type_filter::utp_socket) .value("ssl_tcp_socket", peer_class_type_filter::ssl_tcp_socket) .value("ssl_utp_socket", peer_class_type_filter::ssl_utp_socket) .value("i2p_socket", peer_class_type_filter::i2p_socket) ; { scope s = class_("peer_class_type_filter") .def(init<>()) .def("add", <::peer_class_type_filter::add) .def("remove", <::peer_class_type_filter::remove) .def("disallow", <::peer_class_type_filter::disallow) .def("allow", <::peer_class_type_filter::allow) .def("apply", <::peer_class_type_filter::apply) ; s.attr("tcp_socket") = peer_class_type_filter::tcp_socket; s.attr("utp_socket") = peer_class_type_filter::utp_socket; s.attr("ssl_tcp_socket") = peer_class_type_filter::ssl_tcp_socket; s.attr("ssl_utp_socket") = peer_class_type_filter::ssl_utp_socket; s.attr("i2p_socket") = peer_class_type_filter::i2p_socket; } { scope s = class_("session", no_init) .def(init()) .def(init<>()) .def("__init__", boost::python::make_constructor(&make_session , default_call_policies() , (arg("settings"), arg("flags")= #if TORRENT_ABI_VERSION <= 2 lt::session::add_default_plugins #else lt::session_flags_t{} #endif )) ) #if TORRENT_ABI_VERSION == 1 .def( init(( arg("fingerprint")=fingerprint("LT",0,1,0,0) , arg("flags")=lt::session::start_default_features | lt::session::add_default_plugins , arg("alert_mask")=alert::error_notification)) ) .def("outgoing_ports", depr(&outgoing_ports)) #endif .def("post_torrent_updates", allow_threads(<::session::post_torrent_updates), arg("flags") = 0xffffffff) .def("post_dht_stats", allow_threads(<::session::post_dht_stats)) .def("post_session_stats", allow_threads(<::session::post_session_stats)) .def("is_listening", allow_threads(<::session::is_listening)) .def("listen_port", allow_threads(<::session::listen_port)) #ifndef TORRENT_DISABLE_DHT .def("add_dht_node", &add_dht_node) #if TORRENT_ABI_VERSION == 1 .def( "add_dht_router", depr(&add_dht_router) , (arg("router"), "port") ) #endif // TORRENT_ABI_VERSION .def("is_dht_running", allow_threads(<::session::is_dht_running)) #if TORRENT_ABI_VERSION <= 2 .def("set_dht_settings", allow_threads(<::session::set_dht_settings)) .def("get_dht_settings", allow_threads(<::session::get_dht_settings)) #endif .def("dht_get_immutable_item", allow_threads(dht_get_immutable_item)) .def("dht_get_mutable_item", &dht_get_mutable_item) .def("dht_put_immutable_item", allow_threads(dht_put_immutable_item)) .def("dht_put_mutable_item", &dht_put_mutable_item) .def("dht_get_peers", allow_threads(<::session::dht_get_peers)) .def("dht_announce", allow_threads(<::session::dht_announce)) .def("dht_live_nodes", allow_threads(<::session::dht_live_nodes)) .def("dht_sample_infohashes", allow_threads(<::session::dht_sample_infohashes)) #endif // TORRENT_DISABLE_DHT .def("add_torrent", &add_torrent) .def("async_add_torrent", &async_add_torrent) .def("async_add_torrent", &wrap_async_add_torrent) .def("add_torrent", &wrap_add_torrent) #ifndef BOOST_NO_EXCEPTIONS #if TORRENT_ABI_VERSION == 1 .def( "add_torrent", depr(&add_torrent_depr) , ( arg("resume_data") = entry(), arg("storage_mode") = storage_mode_sparse, arg("paused") = false ) ) #endif // TORRENT_ABI_VERSION #endif // BOOST_NO_EXCEPTIONS .def("remove_torrent", allow_threads(<::session::remove_torrent), arg("option") = 0) #if TORRENT_ABI_VERSION == 1 .def("status", depr(<::session::status)) #endif .def("get_settings", &session_get_settings) .def("apply_settings", &session_apply_settings) #if TORRENT_ABI_VERSION == 1 #ifndef TORRENT_DISABLE_ENCRYPTION .def("set_pe_settings", depr(<::session::set_pe_settings)) .def("get_pe_settings", depr(<::session::get_pe_settings)) #endif #endif .def("load_state", &load_state, (arg("entry"), arg("flags") = 0xffffffff)) .def("save_state", &save_state, (arg("entry"), arg("flags") = 0xffffffff)) .def("pop_alerts", &pop_alerts) .def("wait_for_alert", &wait_for_alert, return_internal_reference<>()) .def("set_alert_notify", &set_alert_notify) .def("set_alert_fd", &set_alert_fd) .def("add_extension", &add_extension) #if TORRENT_ABI_VERSION == 1 #if TORRENT_USE_I2P .def("set_i2p_proxy", depr(<::session::set_i2p_proxy)) .def("i2p_proxy", depr(<::session::i2p_proxy)) #endif #endif .def("set_ip_filter", allow_threads(<::session::set_ip_filter)) .def("get_ip_filter", allow_threads(<::session::get_ip_filter)) .def("find_torrent", allow_threads(<::session::find_torrent)) .def("get_torrents", &get_torrents) .def("get_torrent_status", &get_torrent_status, (arg("session"), arg("pred"), arg("flags") = 0)) .def("refresh_torrent_status", &refresh_torrent_status, (arg("session"), arg("torrents"), arg("flags") = 0)) .def("pause", allow_threads(<::session::pause)) .def("resume", allow_threads(<::session::resume)) .def("is_paused", allow_threads(<::session::is_paused)) .def("add_port_mapping", allow_threads(<::session::add_port_mapping)) .def("delete_port_mapping", allow_threads(<::session::delete_port_mapping)) .def("reopen_network_sockets", allow_threads(<::session::reopen_network_sockets)) .def("set_peer_class_filter", <::session::set_peer_class_filter) .def("set_peer_class_type_filter", <::session::set_peer_class_type_filter) .def("create_peer_class", <::session::create_peer_class) .def("delete_peer_class", <::session::delete_peer_class) .def("get_peer_class", &get_peer_class) .def("set_peer_class", &set_peer_class) #if TORRENT_ABI_VERSION == 1 .def("id", depr(<::session::id)) .def( "listen_on", depr(&listen_on) , (arg("min"), "max", arg("interface") = (char const*)nullptr, arg("flags") = 0) ) #ifndef TORRENT_DISABLE_DHT .def("start_dht", depr(start_dht0)) .def("stop_dht", depr(<::session::stop_dht)) .def("start_dht", depr(start_dht1)) .def("dht_state", depr(<::session::dht_state)) .def("set_dht_proxy", depr(<::session::set_dht_proxy)) .def("dht_proxy", depr(<::session::dht_proxy)) #endif .def("set_local_download_rate_limit", depr(<::session::set_local_download_rate_limit)) .def("local_download_rate_limit", depr(<::session::local_download_rate_limit)) .def("set_local_upload_rate_limit", depr(<::session::set_local_upload_rate_limit)) .def("local_upload_rate_limit", depr(<::session::local_upload_rate_limit)) .def("set_download_rate_limit", depr(<::session::set_download_rate_limit)) .def("download_rate_limit", depr(<::session::download_rate_limit)) .def("set_upload_rate_limit", depr(<::session::set_upload_rate_limit)) .def("upload_rate_limit", depr(<::session::upload_rate_limit)) .def("set_max_uploads", depr(<::session::set_max_uploads)) .def("set_max_connections", depr(<::session::set_max_connections)) .def("max_connections", depr(<::session::max_connections)) .def("num_connections", depr(<::session::num_connections)) .def("set_max_half_open_connections", depr(<::session::set_max_half_open_connections)) .def("set_alert_queue_size_limit", depr(<::session::set_alert_queue_size_limit)) .def("set_alert_mask", depr(<::session::set_alert_mask)) .def("set_peer_proxy", depr(<::session::set_peer_proxy)) .def("set_tracker_proxy", depr(<::session::set_tracker_proxy)) .def("set_web_seed_proxy", depr(<::session::set_web_seed_proxy)) .def("peer_proxy", depr(<::session::peer_proxy)) .def("tracker_proxy", depr(<::session::tracker_proxy)) .def("web_seed_proxy", depr(<::session::web_seed_proxy)) .def("set_proxy", depr(<::session::set_proxy)) .def("proxy", depr(<::session::proxy)) .def("start_upnp", depr(&start_upnp)) .def("stop_upnp", depr(<::session::stop_upnp)) .def("start_lsd", depr(<::session::start_lsd)) .def("stop_lsd", depr(<::session::stop_lsd)) .def("start_natpmp", depr(&start_natpmp)) .def("stop_natpmp", depr(<::session::stop_natpmp)) .def("set_peer_id", depr(<::session::set_peer_id)) #endif // TORRENT_ABI_VERSION ; s.attr("tcp") = lt::portmap_protocol::tcp; s.attr("udp") = lt::portmap_protocol::udp; s.attr("global_peer_class_id") = session::global_peer_class_id; s.attr("tcp_peer_class_id") = session::tcp_peer_class_id; s.attr("local_peer_class_id") = session::local_peer_class_id; s.attr("reopen_map_ports") = lt::session::reopen_map_ports; s.attr("delete_files") = lt::session::delete_files; s.attr("delete_partfile") = lt::session::delete_partfile; } #if TORRENT_ABI_VERSION == 1 { scope s = class_("protocol_type"); s.attr("udp") = lt::portmap_protocol::udp; s.attr("tcp") = lt::portmap_protocol::tcp; } #endif { scope s = class_("save_state_flags_t"); s.attr("save_settings") = lt::session::save_settings; #if TORRENT_ABI_VERSION <= 2 s.attr("save_dht_settings") = lt::session::save_dht_settings; #endif s.attr("save_dht_state") = lt::session::save_dht_state; #if TORRENT_ABI_VERSION == 1 s.attr("save_encryption_settings") = lt::session:: save_encryption_settings; s.attr("save_as_map") = lt::session::save_as_map; s.attr("save_i2p_proxy") = lt::session::save_i2p_proxy; s.attr("save_proxy") = lt::session::save_proxy; s.attr("save_dht_proxy") = lt::session::save_dht_proxy; s.attr("save_peer_proxy") = lt::session::save_peer_proxy; s.attr("save_web_proxy") = lt::session::save_web_proxy; s.attr("save_tracker_proxy") = lt::session::save_tracker_proxy; #endif } #if TORRENT_ABI_VERSION == 1 enum_("listen_on_flags_t") .value("listen_reuse_address", lt::session::listen_reuse_address) .value("listen_no_system_port", lt::session::listen_no_system_port) ; #endif def("high_performance_seed", high_performance_seed_wrapper); def("min_memory_usage", min_memory_usage_wrapper); def("default_settings", default_settings_wrapper); def("read_resume_data", read_resume_data_wrapper0); def("read_resume_data", read_resume_data_wrapper1); def("write_resume_data", write_resume_data); def("write_resume_data_buf", write_resume_data_buf_); class_("stats_metric") .def_readonly("name", &stats_metric::name) .def_readonly("value_index", &stats_metric::value_index) .def_readonly("type", &stats_metric::type) ; enum_("metric_type_t") .value("counter", metric_type_t::counter) .value("gauge", metric_type_t::gauge) ; def("session_stats_metrics", session_stats_metrics); def("find_metric_idx", find_metric_idx_wrap); scope().attr("create_ut_metadata_plugin") = "ut_metadata"; scope().attr("create_ut_pex_plugin") = "ut_pex"; scope().attr("create_smart_ban_plugin") = "smart_ban"; } #ifdef _MSC_VER #pragma warning(pop) #endif libtorrent-rasterbar-2.0.5/bindings/python/src/session_settings.cpp0000664000175000017500000001267714152763504024723 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include using namespace boost::python; using namespace lt; void bind_session_settings() { enum_("choking_algorithm_t") .value("fixed_slots_choker", settings_pack::fixed_slots_choker) #if TORRENT_ABI_VERSION == 1 .value("auto_expand_choker", settings_pack::rate_based_choker) #endif .value("rate_based_choker", settings_pack::rate_based_choker) #if TORRENT_ABI_VERSION == 1 .value("bittyrant_choker", settings_pack::bittyrant_choker) #endif ; enum_("seed_choking_algorithm_t") .value("round_robin", settings_pack::round_robin) .value("fastest_upload", settings_pack::fastest_upload) .value("anti_leech", settings_pack::anti_leech) ; enum_("suggest_mode_t") .value("no_piece_suggestions", settings_pack::no_piece_suggestions) .value("suggest_read_cache", settings_pack::suggest_read_cache) ; enum_("io_buffer_mode_t") .value("enable_os_cache", settings_pack::enable_os_cache) #if TORRENT_ABI_VERSION == 1 .value("disable_os_cache_for_aligned_files", settings_pack::disable_os_cache_for_aligned_files) #endif .value("disable_os_cache", settings_pack::disable_os_cache) ; enum_("bandwidth_mixed_algo_t") .value("prefer_tcp", settings_pack::prefer_tcp) .value("peer_proportional", settings_pack::peer_proportional) ; enum_("enc_policy") .value("pe_forced", settings_pack::pe_forced) .value("pe_enabled", settings_pack::pe_enabled) .value("pe_disabled", settings_pack::pe_disabled) #if TORRENT_ABI_VERSION == 1 .value("forced", settings_pack::pe_forced) .value("enabled", settings_pack::pe_enabled) .value("disabled", settings_pack::pe_disabled) #endif ; enum_("enc_level") .value("pe_rc4", settings_pack::pe_rc4) .value("pe_plaintext", settings_pack::pe_plaintext) .value("pe_both", settings_pack::pe_both) #if TORRENT_ABI_VERSION == 1 .value("rc4", settings_pack::pe_rc4) .value("plaintext", settings_pack::pe_plaintext) .value("both", settings_pack::pe_both) #endif ; { scope s = enum_("proxy_type_t") .value("none", settings_pack::none) .value("socks4", settings_pack::socks4) .value("socks5", settings_pack::socks5) .value("socks5_pw", settings_pack::socks5_pw) .value("http", settings_pack::http) .value("http_pw", settings_pack::http_pw) .value("i2p_proxy", settings_pack::i2p_proxy) ; #if TORRENT_ABI_VERSION == 1 scope().attr("proxy_type") = s; class_("proxy_settings") .def_readwrite("hostname", &proxy_settings::hostname) .def_readwrite("port", &proxy_settings::port) .def_readwrite("password", &proxy_settings::password) .def_readwrite("username", &proxy_settings::username) .def_readwrite("type", &proxy_settings::type) .def_readwrite("proxy_peer_connections", &proxy_settings::proxy_peer_connections) .def_readwrite("proxy_hostnames", &proxy_settings::proxy_hostnames) ; #endif } #ifndef TORRENT_DISABLE_DHT #if TORRENT_ABI_VERSION <= 2 class_("dht_settings") .def_readwrite("max_peers_reply", &dht::dht_settings::max_peers_reply) .def_readwrite("search_branching", &dht::dht_settings::search_branching) .def_readwrite("max_fail_count", &dht::dht_settings::max_fail_count) .def_readwrite("max_torrents", &dht::dht_settings::max_torrents) .def_readwrite("max_dht_items", &dht::dht_settings::max_dht_items) .def_readwrite("restrict_routing_ips", &dht::dht_settings::restrict_routing_ips) .def_readwrite("restrict_search_ips", &dht::dht_settings::restrict_search_ips) .def_readwrite("max_torrent_search_reply", &dht::dht_settings::max_torrent_search_reply) .def_readwrite("extended_routing_table", &dht::dht_settings::extended_routing_table) .def_readwrite("aggressive_lookups", &dht::dht_settings::aggressive_lookups) .def_readwrite("privacy_lookups", &dht::dht_settings::privacy_lookups) .def_readwrite("enforce_node_id", &dht::dht_settings::enforce_node_id) .def_readwrite("ignore_dark_internet", &dht::dht_settings::ignore_dark_internet) .def_readwrite("block_timeout", &dht::dht_settings::block_timeout) .def_readwrite("block_ratelimit", &dht::dht_settings::block_ratelimit) .def_readwrite("read_only", &dht::dht_settings::read_only) .def_readwrite("item_lifetime", &dht::dht_settings::item_lifetime) ; #endif #endif #if TORRENT_ABI_VERSION == 1 class_("pe_settings") .def_readwrite("out_enc_policy", &pe_settings::out_enc_policy) .def_readwrite("in_enc_policy", &pe_settings::in_enc_policy) .def_readwrite("allowed_enc_level", &pe_settings::allowed_enc_level) .def_readwrite("prefer_rc4", &pe_settings::prefer_rc4) ; #endif } libtorrent-rasterbar-2.0.5/bindings/python/src/string.cpp0000664000175000017500000000257314152763504022620 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include using namespace boost::python; struct unicode_from_python { unicode_from_python() { converter::registry::push_back( &convertible, &construct, type_id() ); } static void* convertible(PyObject* x) { #if PY_VERSION_HEX >= 0x03020000 return PyUnicode_Check(x) ? x : nullptr; #else return PyString_Check(x) ? x : PyUnicode_Check(x) ? x : nullptr; #endif } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage< std::string>*)data)->storage.bytes; #if PY_VERSION_HEX < 0x03000000 if (PyString_Check(x)) { data->convertible = new (storage) std::string(PyString_AsString(x) , PyString_Size(x)); } else #endif { Py_ssize_t size = 0; char const* unicode = PyUnicode_AsUTF8AndSize(x, &size); data->convertible = new (storage) std::string(unicode, size); } } }; void bind_unicode_string_conversion() { unicode_from_python(); } libtorrent-rasterbar-2.0.5/bindings/python/src/converters.cpp0000664000175000017500000005115214152763504023501 0ustar arvidarvid// Copyright Andrew Resch 2009. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include "libtorrent/socket.hpp" #include "libtorrent/address.hpp" #include "libtorrent/error_code.hpp" #include "libtorrent/session_stats.hpp" // for stats_metric #include "libtorrent/time.hpp" #include "libtorrent/torrent_flags.hpp" #include "libtorrent/units.hpp" #include "libtorrent/sha1_hash.hpp" #include "libtorrent/disk_interface.hpp" // for open_file_state #include "libtorrent/aux_/noexcept_movable.hpp" #include "libtorrent/peer_info.hpp" #include "libtorrent/alert_types.hpp" // for picker_flags_t #include "libtorrent/session_types.hpp" // for save_state_flags_t #include "libtorrent/file_storage.hpp" // for file_flags_t #include "libtorrent/alert.hpp" #include "libtorrent/create_torrent.hpp" // for create_flags_t #include "libtorrent/portmap.hpp" // for port_mapping_t #include "libtorrent/peer_class.hpp" #include "libtorrent/pex_flags.hpp" #include "libtorrent/string_view.hpp" #include "libtorrent/storage_defs.hpp" #include #include using namespace boost::python; namespace bp = boost::python; template struct endpoint_to_tuple { static PyObject* convert(T const& ep) { return incref(bp::make_tuple(ep.address().to_string(), ep.port()).ptr()); } }; template struct tuple_to_endpoint { tuple_to_endpoint() { converter::registry::push_back( &convertible, &construct, type_id() ); } static void* convertible(PyObject* x) { if (!PyTuple_Check(x)) return nullptr; if (PyTuple_Size(x) != 2) return nullptr; extract ip(object(borrowed(PyTuple_GetItem(x, 0)))); if (!ip.check()) return nullptr; extract port(object(borrowed(PyTuple_GetItem(x, 1)))); if (!port.check()) return nullptr; lt::error_code ec; lt::make_address(ip, ec); if (ec) return nullptr; return x; } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage*)data) ->storage.bytes; object o(borrowed(x)); data->convertible = new (storage) T(lt::make_address( static_cast(extract(o[0]))), extract(o[1])); } }; template struct pair_to_tuple { static PyObject* convert(const std::pair& p) { return incref(bp::make_tuple(p.first, p.second).ptr()); } }; template struct address_to_tuple { static PyObject* convert(Addr const& addr) { return incref(bp::object(addr.to_string()).ptr()); } }; template struct tuple_to_pair { tuple_to_pair() { converter::registry::push_back( &convertible, &construct, type_id>() ); } static void* convertible(PyObject* x) { return (PyTuple_Check(x) && PyTuple_Size(x) == 2) ? x: nullptr; } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage< std::pair>*)data)->storage.bytes; object o(borrowed(x)); std::pair p; p.first = extract(o[0]); p.second = extract(o[1]); data->convertible = new (storage) std::pair(p); } }; struct from_string_view { static PyObject* convert(lt::string_view v) { str ret(v.data(), v.size()); return incref(ret.ptr()); } }; struct to_string_view { to_string_view() { converter::registry::push_back( &convertible, &construct, type_id() ); } static void* convertible(PyObject* x) { return #if PY_VERSION_HEX < 0x03020000 PyString_Check(x) ? x : #endif PyUnicode_Check(x) ? x : nullptr; } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage< lt::string_view>*)data)->storage.bytes; #if PY_VERSION_HEX < 0x03020000 if (PyString_Check(x)) { data->convertible = new (storage) lt::string_view( PyString_AsString(x), PyString_Size(x)); } else #endif { Py_ssize_t size = 0; char const* unicode = PyUnicode_AsUTF8AndSize(x, &size); data->convertible = new (storage) lt::string_view(unicode, size); } } }; template struct map_to_dict { static PyObject* convert(Map const& m) { dict ret; for (auto const& e : m) ret[e.first] = e.second; return incref(ret.ptr()); } }; template> struct dict_to_map { dict_to_map() { converter::registry::push_back(&convertible, &construct, type_id()); } static void* convertible(PyObject* x) { return PyDict_Check(x) ? x: nullptr; } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage*)data)->storage.bytes; dict o(borrowed(x)); Map m; stl_input_iterator i(o.keys()), end; for (; i != end; ++i) { T1 const& key = *i; m[key] = extract(o[key]); } data->convertible = new (storage) Map(m); } }; template struct vector_to_list { static PyObject* convert(T const& v) { list l; for (int i = 0; i < int(v.size()); ++i) { l.append(v[i]); } return incref(l.ptr()); } }; template struct list_to_vector { list_to_vector() { converter::registry::push_back( &convertible, &construct, type_id() ); } static void* convertible(PyObject* x) { return PyList_Check(x) ? x: nullptr; } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage< T>*)data)->storage.bytes; T p; int const size = int(PyList_Size(x)); p.reserve(size); for (int i = 0; i < size; ++i) { object o(borrowed(PyList_GetItem(x, i))); p.push_back(extract(o)); } data->convertible = new (storage) T(std::move(p)); } }; template struct list_to_bitfield { list_to_bitfield() { converter::registry::push_back( &convertible, &construct, type_id() ); } static void* convertible(PyObject* x) { return PyList_Check(x) ? x : nullptr; } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage< T>*)data)->storage.bytes; T p; int const size = int(PyList_Size(x)); p.resize(size); for (int i = 0; i < size; ++i) { object o(borrowed(PyList_GetItem(x, i))); if (extract(o)) p.set_bit(IndexType{i}); else p.clear_bit(IndexType{i}); } data->convertible = new (storage) T(std::move(p)); } }; template struct bitfield_to_list { static PyObject* convert(T const& v) { list ret; for (auto const i : v) ret.append(i); return incref(ret.ptr()); } }; template struct from_strong_typedef { using underlying_type = typename T::underlying_type; static PyObject* convert(const T& v) { object o(static_cast(v)); return incref(o.ptr()); } }; template struct to_strong_typedef { using underlying_type = typename T::underlying_type; to_strong_typedef() { converter::registry::push_back( &convertible, &construct, type_id() ); } static void* convertible(PyObject* x) { return PyNumber_Check(x) ? x : nullptr; } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage*)data)->storage.bytes; data->convertible = new (storage) T(extract(object(borrowed(x)))); } }; template struct to_enum_class { using underlying_type = typename std::underlying_type::type; to_enum_class() { converter::registry::push_back( &convertible, &construct, type_id() ); } static void* convertible(PyObject* x) { return PyNumber_Check(x) ? x : nullptr; } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage*)data)->storage.bytes; data->convertible = new (storage) T(static_cast(static_cast(extract(object(borrowed(x)))))); } }; template struct from_bitfield_flag { using underlying_type = typename T::underlying_type; static PyObject* convert(T const v) { // this is because python uses "long int" to represent integral values // internally, it cannot hold large unsigned values auto const val = static_cast(v) & static_cast(std::numeric_limits::max()); object o(val); return incref(o.ptr()); } }; template struct to_bitfield_flag { using underlying_type = typename T::underlying_type; to_bitfield_flag() { converter::registry::push_back( &convertible, &construct, type_id() ); } static void* convertible(PyObject* x) { return PyNumber_Check(x) ? x : nullptr; } static void construct(PyObject* x, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage*)data)->storage.bytes; data->convertible = new (storage) T(extract(object(borrowed(x)))); } }; void bind_converters() { // C++ -> python conversions to_python_converter, pair_to_tuple>(); to_python_converter, pair_to_tuple>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter, pair_to_tuple>(); to_python_converter, pair_to_tuple>(); to_python_converter, vector_to_list>>(); to_python_converter, vector_to_list>>(); to_python_converter, vector_to_list>>(); to_python_converter, vector_to_list>>(); to_python_converter, vector_to_list>>(); to_python_converter, vector_to_list>>(); to_python_converter, vector_to_list>>(); to_python_converter, vector_to_list>>(); to_python_converter>, vector_to_list>>>(); to_python_converter>, vector_to_list>>>(); to_python_converter, bitfield_to_list>>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter>(); to_python_converter(); // work-around types to_python_converter, address_to_tuple< lt::aux::noexcept_movable>>(); to_python_converter, endpoint_to_tuple< lt::aux::noexcept_movable>>(); to_python_converter, endpoint_to_tuple< lt::aux::noexcept_movable>>(); to_python_converter>, vector_to_list>>>(); to_python_converter>, vector_to_list>>>(); to_python_converter>, vector_to_list>>>(); to_python_converter>, vector_to_list>>>(); to_python_converter>, vector_to_list>>>(); to_python_converter>, vector_to_list>>>(); to_python_converter>, vector_to_list>>>(); to_python_converter>, vector_to_list>>>(); to_python_converter>>, vector_to_list>>>>(); to_python_converter>, map_to_dict>>>(); to_python_converter>, map_to_dict>>>(); to_python_converter, map_to_dict>>(); to_python_converter>(); #if TORRENT_ABI_VERSION == 1 to_python_converter>, vector_to_list>>>(); list_to_vector>>(); #ifndef TORRENT_DISABLE_DHT to_python_converter, vector_to_list>>(); #endif #endif // python -> C++ conversions tuple_to_pair(); tuple_to_pair(); tuple_to_endpoint(); tuple_to_endpoint(); tuple_to_pair(); dict_to_map(); list_to_vector>(); list_to_vector>(); list_to_vector>(); list_to_vector>(); list_to_vector>(); list_to_vector>>(); list_to_vector>>(); // work-around types list_to_vector>>(); list_to_vector>>(); list_to_vector>>(); list_to_vector>>(); list_to_vector>>(); list_to_vector>>>(); list_to_vector>>(); dict_to_map>>(); dict_to_map>>(); // bitfield types list_to_bitfield, lt::piece_index_t>(); list_to_bitfield(); bitfield_to_list>(); bitfield_to_list(); to_strong_typedef(); to_strong_typedef(); to_strong_typedef(); to_strong_typedef(); to_strong_typedef(); to_strong_typedef(); to_enum_class(); #if TORRENT_ABI_VERSION <= 2 to_enum_class(); #endif to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_bitfield_flag(); to_string_view(); to_bitfield_flag(); to_bitfield_flag(); } libtorrent-rasterbar-2.0.5/bindings/python/src/peer_info.cpp0000664000175000017500000001477414152763504023266 0ustar arvidarvid// Copyright Daniel Wallin 2007. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include "bytes.hpp" #include #include #include using namespace boost::python; using namespace lt; std::int64_t get_last_active(peer_info const& pi) { return total_seconds(pi.last_active); } std::int64_t get_last_request(peer_info const& pi) { return total_seconds(pi.last_request); } std::int64_t get_download_queue_time(peer_info const& pi) { return total_seconds(pi.download_queue_time); } tuple get_local_endpoint(peer_info const& pi) { return boost::python::make_tuple(pi.local_endpoint.address().to_string(), pi.local_endpoint.port()); } tuple get_ip(peer_info const& pi) { return boost::python::make_tuple(pi.ip.address().to_string(), pi.ip.port()); } list get_pieces(peer_info const& pi) { list ret; for (bitfield::const_iterator i = pi.pieces.begin() , end(pi.pieces.end()); i != end; ++i) { ret.append(*i); } return ret; } bytes get_peer_info_client(peer_info const& pi) { return pi.client; } using by_value = return_value_policy; void bind_peer_info() { scope pi = class_("peer_info") .add_property("flags", make_getter(&peer_info::flags, by_value())) .add_property("source", make_getter(&peer_info::source, by_value())) .add_property("read_state", make_getter(&peer_info::read_state, by_value())) .add_property("write_state", make_getter(&peer_info::write_state, by_value())) .add_property("ip", get_ip) .def_readonly("up_speed", &peer_info::up_speed) .def_readonly("down_speed", &peer_info::down_speed) .def_readonly("payload_up_speed", &peer_info::payload_up_speed) .def_readonly("payload_down_speed", &peer_info::payload_down_speed) .def_readonly("total_download", &peer_info::total_download) .def_readonly("total_upload", &peer_info::total_upload) .def_readonly("pid", &peer_info::pid) .add_property("pieces", get_pieces) #if TORRENT_ABI_VERSION == 1 .def_readonly("upload_limit", &peer_info::upload_limit) .def_readonly("download_limit", &peer_info::download_limit) .def_readonly("load_balancing", &peer_info::load_balancing) .def_readonly("remote_dl_rate", &peer_info::remote_dl_rate) #endif .add_property("last_request", get_last_request) .add_property("last_active", get_last_active) .add_property("download_queue_time", get_download_queue_time) .def_readonly("queue_bytes", &peer_info::queue_bytes) .def_readonly("request_timeout", &peer_info::request_timeout) .def_readonly("send_buffer_size", &peer_info::send_buffer_size) .def_readonly("used_send_buffer", &peer_info::used_send_buffer) .def_readonly("receive_buffer_size", &peer_info::receive_buffer_size) .def_readonly("used_receive_buffer", &peer_info::used_receive_buffer) .def_readonly("num_hashfails", &peer_info::num_hashfails) .def_readonly("download_queue_length", &peer_info::download_queue_length) .def_readonly("upload_queue_length", &peer_info::upload_queue_length) .def_readonly("failcount", &peer_info::failcount) .add_property("downloading_piece_index", make_getter(&peer_info::downloading_piece_index, by_value())) .add_property("downloading_block_index", make_getter(&peer_info::downloading_block_index, by_value())) .def_readonly("downloading_progress", &peer_info::downloading_progress) .def_readonly("downloading_total", &peer_info::downloading_total) .add_property("client", get_peer_info_client) .def_readonly("connection_type", &peer_info::connection_type) .def_readonly("pending_disk_bytes", &peer_info::pending_disk_bytes) .def_readonly("send_quota", &peer_info::send_quota) .def_readonly("receive_quota", &peer_info::receive_quota) .def_readonly("rtt", &peer_info::rtt) .def_readonly("num_pieces", &peer_info::num_pieces) .def_readonly("download_rate_peak", &peer_info::download_rate_peak) .def_readonly("upload_rate_peak", &peer_info::upload_rate_peak) .def_readonly("progress", &peer_info::progress) .def_readonly("progress_ppm", &peer_info::progress_ppm) #if TORRENT_ABI_VERSION == 1 .def_readonly("estimated_reciprocation_rate", &peer_info::estimated_reciprocation_rate) #endif .add_property("local_endpoint", get_local_endpoint) ; // flags pi.attr("interesting") = peer_info::interesting; pi.attr("choked") = peer_info::choked; pi.attr("remote_interested") = peer_info::remote_interested; pi.attr("remote_choked") = peer_info::remote_choked; pi.attr("supports_extensions") = peer_info::supports_extensions; pi.attr("local_connection") = peer_info::local_connection; pi.attr("outgoing_connection") = peer_info::outgoing_connection; pi.attr("handshake") = peer_info::handshake; pi.attr("connecting") = peer_info::connecting; #if TORRENT_ABI_VERSION == 1 pi.attr("queued") = peer_info::queued; #endif pi.attr("on_parole") = peer_info::on_parole; pi.attr("seed") = peer_info::seed; pi.attr("optimistic_unchoke") = peer_info::optimistic_unchoke; pi.attr("snubbed") = peer_info::snubbed; pi.attr("upload_only") = peer_info::upload_only; pi.attr("endgame_mode") = peer_info::endgame_mode; pi.attr("holepunched") = peer_info::holepunched; #ifndef TORRENT_DISABLE_ENCRYPTION pi.attr("rc4_encrypted") = peer_info::rc4_encrypted; pi.attr("plaintext_encrypted") = peer_info::plaintext_encrypted; #endif // connection_type pi.attr("standard_bittorrent") = peer_info::standard_bittorrent; pi.attr("web_seed") = peer_info::web_seed; pi.attr("http_seed") = peer_info::http_seed; // source pi.attr("tracker") = peer_info::tracker; pi.attr("dht") = peer_info::dht; pi.attr("pex") = peer_info::pex; pi.attr("lsd") = peer_info::lsd; pi.attr("resume_data") = peer_info::resume_data; // read/write state pi.attr("bw_idle") = peer_info::bw_idle; #if TORRENT_ABI_VERSION == 1 pi.attr("bw_torrent") = peer_info::bw_torrent; pi.attr("bw_global") = peer_info::bw_global; #endif pi.attr("bw_limit") = peer_info::bw_limit; pi.attr("bw_network") = peer_info::bw_network; pi.attr("bw_disk") = peer_info::bw_disk; } libtorrent-rasterbar-2.0.5/bindings/python/src/ip_filter.cpp0000664000175000017500000000253214152763504023262 0ustar arvidarvid// Copyright Andrew Resch 2008. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include "gil.hpp" using namespace boost::python; using namespace lt; namespace { void add_rule(ip_filter& filter, std::string start, std::string end, int flags) { return filter.add_rule(make_address(start), make_address(end), flags); } int access0(ip_filter& filter, std::string addr) { return filter.access(make_address(addr)); } template list convert_range_list(std::vector> const& l) { list ret; for (auto const& r : l) ret.append(boost::python::make_tuple(r.first.to_string(), r.last.to_string())); return ret; } tuple export_filter(ip_filter const& f) { auto ret = f.export_filter(); list ipv4 = convert_range_list(std::get<0>(ret)); list ipv6 = convert_range_list(std::get<1>(ret)); return boost::python::make_tuple(ipv4, ipv6); } } void bind_ip_filter() { class_("ip_filter") .def("add_rule", &add_rule) .def("access", &access0) .def("export_filter", &export_filter) ; } libtorrent-rasterbar-2.0.5/bindings/python/src/error_code.cpp0000664000175000017500000001635514152763504023440 0ustar arvidarvid/* Copyright (c) 2011, Arvid Norberg All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "boost_python.hpp" #include #include #include #include namespace boost { // this fixe mysterious link error on msvc template <> inline boost::system::error_category const volatile* get_pointer(class boost::system::error_category const volatile* p) { return p; } } #include #if TORRENT_USE_SSL #include #include #endif #if TORRENT_USE_I2P #include #endif using namespace boost::python; using namespace lt; using boost::system::error_category; namespace { struct ec_pickle_suite : boost::python::pickle_suite { static boost::python::tuple getinitargs(error_code const&) { return boost::python::tuple(); } static boost::python::tuple getstate(error_code const& ec) { return boost::python::make_tuple(ec.value(), ec.category().name()); } static void setstate(error_code& ec, boost::python::tuple state) { using namespace boost::python; if (len(state) != 2) { PyErr_SetObject(PyExc_ValueError, ("expected 2-item tuple in call to __setstate__; got %s" % state).ptr()); throw_error_already_set(); } int const value = extract(state[0]); std::string const category = extract(state[1]); if (category == "system") ec.assign(value, lt::system_category()); else if (category == "generic") ec.assign(value, lt::generic_category()); else if (category == "libtorrent") ec.assign(value, lt::libtorrent_category()); else if (category == "http error") ec.assign(value, lt::http_category()); else if (category == "UPnP error") ec.assign(value, lt::upnp_category()); else if (category == "bdecode error") ec.assign(value, lt::bdecode_category()); else if (category == "asio.netdb") ec.assign(value, boost::asio::error::get_netdb_category()); else if (category == "asio.addinfo") ec.assign(value, boost::asio::error::get_addrinfo_category()); else if (category == "asio.misc") ec.assign(value, boost::asio::error::get_misc_category()); #if TORRENT_USE_SSL else if (category == "asio.ssl") ec.assign(value, boost::asio::error::get_ssl_category()); #endif else { PyErr_SetObject(PyExc_ValueError, ("unexpected error_category passed to __setstate__; got '%s'" % object(category)).ptr()); throw_error_already_set(); } } }; } struct category_holder { category_holder(boost::system::error_category const& cat) : m_cat(&cat) {} char const* name() const { return m_cat->name(); } std::string message(int const v) const { return m_cat->message(v); } friend bool operator==(category_holder const lhs, category_holder const rhs) { return *lhs.m_cat == *rhs.m_cat; } friend bool operator!=(category_holder const lhs, category_holder const rhs) { return *lhs.m_cat != *rhs.m_cat; } friend bool operator<(category_holder const lhs, category_holder const rhs) { return *lhs.m_cat < *rhs.m_cat; } boost::system::error_category const& ref() const { return *m_cat; } operator boost::system::error_category const&() const { return *m_cat; } private: boost::system::error_category const* m_cat; }; void error_code_assign(boost::system::error_code& me, int const v, category_holder const cat) { me.assign(v, cat.ref()); } category_holder error_code_category(boost::system::error_code const& me) { return category_holder(me.category()); } #define WRAP_CAT(name) \ category_holder wrap_ ##name## _category() { return category_holder(name## _category()); } WRAP_CAT(libtorrent) WRAP_CAT(upnp) WRAP_CAT(http) WRAP_CAT(socks) WRAP_CAT(bdecode) #if TORRENT_USE_I2P WRAP_CAT(i2p) #endif WRAP_CAT(generic) WRAP_CAT(system) #undef WRAP_CAT #if TORRENT_ABI_VERSION == 1 #define WRAP_DEPR_CAT(name) \ category_holder wrap_ ##name## _category_deprecated() { \ python_deprecated(#name " is deprecated"); \ return category_holder(name## _category()); \ } WRAP_DEPR_CAT(libtorrent) WRAP_DEPR_CAT(upnp) WRAP_DEPR_CAT(http) WRAP_DEPR_CAT(socks) WRAP_DEPR_CAT(bdecode) #if TORRENT_USE_I2P WRAP_DEPR_CAT(i2p) #endif WRAP_DEPR_CAT(generic) WRAP_DEPR_CAT(system) #undef WRAP_DEPR_CAT #endif void bind_error_code() { class_("error_category", no_init) .def("name", &category_holder::name) .def("message", &category_holder::message) .def(self == self) .def(self < self) .def(self != self) ; class_("error_code") .def(init<>()) .def(init()) .def("message", static_cast(&error_code::message)) .def("value", &error_code::value) .def("clear", &error_code::clear) .def("category", &error_code_category) .def("assign", &error_code_assign) .def_pickle(ec_pickle_suite()) ; def("libtorrent_category", &wrap_libtorrent_category); def("upnp_category", &wrap_upnp_category); def("http_category", &wrap_http_category); def("socks_category", &wrap_socks_category); def("bdecode_category", &wrap_bdecode_category); #if TORRENT_USE_I2P def("i2p_category", &wrap_i2p_category); #endif #if TORRENT_ABI_VERSION == 1 def("get_libtorrent_category", &wrap_libtorrent_category_deprecated); def("get_upnp_category", &wrap_upnp_category_deprecated); def("get_http_category", &wrap_http_category_deprecated); def("get_socks_category", &wrap_socks_category_deprecated); def("get_bdecode_category", &wrap_bdecode_category_deprecated); #if TORRENT_USE_I2P def("get_i2p_category", &wrap_i2p_category_deprecated); #endif #endif // TORRENT_ABI_VERSION def("generic_category", &wrap_generic_category); def("system_category", &wrap_system_category); } libtorrent-rasterbar-2.0.5/bindings/python/src/info_hash.cpp0000664000175000017500000000222614152763504023243 0ustar arvidarvid// Copyright Arvid Norberg 2020. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include namespace { using namespace lt; long get_hash(info_hash_t const& ih) { return std::hash{}(ih); } } void bind_info_hash() { using namespace boost::python; using namespace lt; class_("info_hash_t") .def(init(arg("sha1_hash"))) .def(init(arg("sha256_hash"))) .def(init((arg("sha1_hash"), arg("sha256_hash")))) .def("__hash__", get_hash) .def("has_v1", &info_hash_t::has_v1) .def("has_v2", &info_hash_t::has_v2) .def("has", &info_hash_t::has) .def("get", &info_hash_t::get) .def("get_best", &info_hash_t::get_best) .add_property("v1", &info_hash_t::v1) .add_property("v2", &info_hash_t::v2) .def(self == self) .def(self != self) .def(self < self) ; } libtorrent-rasterbar-2.0.5/bindings/python/src/torrent_handle.cpp0000664000175000017500000005611714152763504024325 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include #include "bytes.hpp" #include #include #include #include #include #include "libtorrent/announce_entry.hpp" #include #include "gil.hpp" using namespace boost::python; using namespace lt; #ifdef _MSC_VER #pragma warning(push) // warning c4996: x: was declared deprecated #pragma warning( disable : 4996 ) #endif namespace { list url_seeds(torrent_handle& handle) { list ret; std::set urls; { allow_threading_guard guard; urls = handle.url_seeds(); } for (std::set::iterator i(urls.begin()) , end(urls.end()); i != end; ++i) ret.append(*i); return ret; } list http_seeds(torrent_handle& handle) { list ret; std::set urls; { allow_threading_guard guard; urls = handle.http_seeds(); } for (std::set::iterator i(urls.begin()) , end(urls.end()); i != end; ++i) ret.append(*i); return ret; } list piece_availability(torrent_handle& handle) { list ret; std::vector avail; { allow_threading_guard guard; handle.piece_availability(avail); } for (auto const a : avail) ret.append(a); return ret; } list piece_priorities(torrent_handle& handle) { list ret; std::vector prio; { allow_threading_guard guard; prio = handle.get_piece_priorities(); } for (auto const p : prio) ret.append(p); return ret; } } // namespace unnamed list file_progress(torrent_handle& handle, file_progress_flags_t const flags) { std::vector p; { allow_threading_guard guard; std::shared_ptr ti = handle.torrent_file(); if (ti) { p.reserve(ti->num_files()); handle.file_progress(p, flags); } } list result; for (std::vector::iterator i(p.begin()), e(p.end()); i != e; ++i) result.append(*i); return result; } list get_peer_info(torrent_handle const& handle) { std::vector pi; { allow_threading_guard guard; handle.get_peer_info(pi); } list result; for (std::vector::iterator i = pi.begin(); i != pi.end(); ++i) result.append(*i); return result; } namespace { template T extract_fn(object o) { return boost::python::extract(o); } } void prioritize_pieces(torrent_handle& info, object o) { stl_input_iterator begin(o), end; if (begin == end) return; // determine which overload should be selected. the one taking a list of // priorities or the one taking a list of piece -> priority mappings bool const is_piece_list = extract>(*begin).check(); if (is_piece_list) { std::vector> piece_list; std::transform(begin, end, std::back_inserter(piece_list) , &extract_fn>); info.prioritize_pieces(piece_list); } else { std::vector priority_vector; std::transform(begin, end, std::back_inserter(priority_vector) , &extract_fn); info.prioritize_pieces(priority_vector); } } void prioritize_files(torrent_handle& info, object o) { stl_input_iterator begin(o), end; info.prioritize_files(std::vector(begin, end)); } list file_priorities(torrent_handle& handle) { list ret; std::vector priorities = handle.get_file_priorities(); for (auto const p : priorities) ret.append(p); return ret; } download_priority_t file_prioritity0(torrent_handle& h, file_index_t index) { return h.file_priority(index); } void file_prioritity1(torrent_handle& h, file_index_t index, download_priority_t prio) { return h.file_priority(index, prio); } void dict_to_announce_entry(dict d, announce_entry& ae) { ae.url = extract(d["url"]); if (d.has_key("tier")) ae.tier = extract(d["tier"]); if (d.has_key("fail_limit")) ae.fail_limit = extract(d["fail_limit"]); } void replace_trackers(torrent_handle& h, object trackers) { object iter(trackers.attr("__iter__")()); std::vector result; for (;;) { handle<> entry(allow_null(PyIter_Next(iter.ptr()))); if (entry == handle<>()) break; if (extract(object(entry)).check()) { result.push_back(extract(object(entry))); } else { dict d; d = extract(object(entry)); announce_entry ae; dict_to_announce_entry(d, ae); result.push_back(ae); } } allow_threading_guard guard; h.replace_trackers(result); } void add_tracker(torrent_handle& h, dict d) { announce_entry ae; dict_to_announce_entry(d, ae); h.add_tracker(ae); } namespace { using std::chrono::system_clock; object to_ptime(time_point tpt) { object ret; if (tpt > min_time()) { ret = long_(system_clock::to_time_t(system_clock::now() + duration_cast(tpt - clock_type::now()))); } return ret; } } list trackers(torrent_handle& h) { list ret; std::vector const trackers = h.trackers(); for (std::vector::const_iterator i = trackers.begin(), end(trackers.end()); i != end; ++i) { dict d; d["url"] = i->url; d["trackerid"] = i->trackerid; d["tier"] = i->tier; d["fail_limit"] = i->fail_limit; d["source"] = i->source; d["verified"] = i->verified; #if TORRENT_ABI_VERSION == 1 if (!i->endpoints.empty()) { announce_endpoint const& aep = i->endpoints.front(); announce_infohash const& aih = aep.info_hashes[protocol_version::V1]; d["message"] = aih.message; dict last_error; last_error["value"] = aih.last_error.value(); last_error["category"] = aih.last_error.category().name(); d["last_error"] = last_error; d["next_announce"] = to_ptime(aih.next_announce); d["min_announce"] = to_ptime(aih.min_announce); d["scrape_incomplete"] = aih.scrape_incomplete; d["scrape_complete"] = aih.scrape_complete; d["scrape_downloaded"] = aih.scrape_downloaded; d["fails"] = aih.fails; d["updating"] = aih.updating; d["start_sent"] = aih.start_sent; d["complete_sent"] = aih.complete_sent; } else { d["message"] = std::string(); dict last_error; last_error["value"] = 0; last_error["category"] = ""; d["last_error"] = last_error; d["next_announce"] = object(); d["min_announce"] = object(); d["scrape_incomplete"] = 0; d["scrape_complete"] = 0; d["scrape_downloaded"] = 0; d["fails"] = 0; d["updating"] = false; d["start_sent"] = false; d["complete_sent"] = false; } #endif list aeps; for (auto const& aep : i->endpoints) { dict e; e["local_address"] = boost::python::make_tuple(aep.local_endpoint.address().to_string(), aep.local_endpoint.port()); list aihs; for (auto const& aih : aep.info_hashes) { dict i; i["message"] = aih.message; dict last_error; last_error["value"] = aih.last_error.value(); last_error["category"] = aih.last_error.category().name(); i["last_error"] = last_error; i["next_announce"] = to_ptime(aih.next_announce); i["min_announce"] = to_ptime(aih.min_announce); i["scrape_incomplete"] = aih.scrape_incomplete; i["scrape_complete"] = aih.scrape_complete; i["scrape_downloaded"] = aih.scrape_downloaded; i["fails"] = aih.fails; i["updating"] = aih.updating; i["start_sent"] = aih.start_sent; i["complete_sent"] = aih.complete_sent; aihs.append(std::move(i)); } e["info_hashes"] = std::move(aihs); #if TORRENT_ABI_VERSION <= 2 announce_infohash const& aih = aep.info_hashes[protocol_version::V1]; e["message"] = aih.message; dict last_error; last_error["value"] = aih.last_error.value(); last_error["category"] = aih.last_error.category().name(); e["last_error"] = last_error; e["next_announce"] = to_ptime(aih.next_announce); e["min_announce"] = to_ptime(aih.min_announce); e["scrape_incomplete"] = aih.scrape_incomplete; e["scrape_complete"] = aih.scrape_complete; e["scrape_downloaded"] = aih.scrape_downloaded; e["fails"] = aih.fails; e["updating"] = aih.updating; e["start_sent"] = aih.start_sent; e["complete_sent"] = aih.complete_sent; #endif aeps.append(std::move(e)); } d["endpoints"] = std::move(aeps); #if TORRENT_ABI_VERSION == 1 d["send_stats"] = i->send_stats; #endif ret.append(std::move(d)); } return ret; } list get_download_queue(torrent_handle& handle) { list ret; std::vector downloading; { allow_threading_guard guard; downloading = handle.get_download_queue(); } for (std::vector::iterator i = downloading.begin() , end(downloading.end()); i != end; ++i) { dict partial_piece; partial_piece["piece_index"] = i->piece_index; partial_piece["blocks_in_piece"] = i->blocks_in_piece; list block_list; for (int k = 0; k < i->blocks_in_piece; ++k) { dict block_info; block_info["state"] = i->blocks[k].state; block_info["num_peers"] = i->blocks[k].num_peers; block_info["bytes_progress"] = i->blocks[k].bytes_progress; block_info["block_size"] = i->blocks[k].block_size; block_info["peer"] = boost::python::make_tuple( i->blocks[k].peer().address().to_string() , i->blocks[k].peer().port()); block_list.append(block_info); } partial_piece["blocks"] = block_list; ret.append(partial_piece); } return ret; } void set_metadata(torrent_handle& handle, std::string const& buf) { handle.set_metadata(buf); } #if TORRENT_ABI_VERSION == 1 std::shared_ptr get_torrent_info(torrent_handle const& h) { allow_threading_guard guard; return h.torrent_file(); } #endif // TORRENT_ABI_VERSION void add_piece_str(torrent_handle& th, piece_index_t piece, char const *data , add_piece_flags_t const flags) { th.add_piece(piece, data, flags); } void add_piece_bytes(torrent_handle& th, piece_index_t piece, bytes data , add_piece_flags_t const flags) { th.add_piece(piece, data.arr.c_str(), flags); } class dummy5 {}; class dummy {}; class dummy4 {}; class dummy6 {}; class dummy7 {}; class dummy8 {}; class dummy15 {}; class dummy16 {}; using by_value = return_value_policy; void bind_torrent_handle() { // arguments are: number of seconds and tracker index void (torrent_handle::*force_reannounce0)(int, int, reannounce_flags_t) const = &torrent_handle::force_reannounce; #if TORRENT_ABI_VERSION == 1 bool (torrent_handle::*super_seeding0)() const = &torrent_handle::super_seeding; void (torrent_handle::*super_seeding1)(bool) const = &torrent_handle::super_seeding; #endif void (torrent_handle::*set_flags0)(torrent_flags_t) const = &torrent_handle::set_flags; void (torrent_handle::*set_flags1)(torrent_flags_t, torrent_flags_t) const = &torrent_handle::set_flags; download_priority_t (torrent_handle::*piece_priority0)(piece_index_t) const = &torrent_handle::piece_priority; void (torrent_handle::*piece_priority1)(piece_index_t, download_priority_t) const = &torrent_handle::piece_priority; void (torrent_handle::*move_storage0)(std::string const&, lt::move_flags_t) const = &torrent_handle::move_storage; void (torrent_handle::*rename_file0)(file_index_t, std::string const&) const = &torrent_handle::rename_file; std::vector (torrent_handle::*file_status0)() const = &torrent_handle::file_status; #define _ allow_threads enum_("move_flags_t") .value("always_replace_files", move_flags_t::always_replace_files) .value("fail_if_exist", move_flags_t::fail_if_exist) .value("dont_replace", move_flags_t::dont_replace) ; #if TORRENT_ABI_VERSION == 1 enum_("deprecated_move_flags_t") .value("always_replace_files", deprecated_move_flags_t::always_replace_files) .value("fail_if_exist", deprecated_move_flags_t::fail_if_exist) .value("dont_replace", deprecated_move_flags_t::dont_replace) ; #endif { scope s = class_("torrent_handle") .def(self == self) .def(self != self) .def(self < self) .def("__hash__", (std::size_t (*)(torrent_handle const&))&libtorrent::hash_value) .def("get_peer_info", get_peer_info) .def("status", _(&torrent_handle::status), arg("flags") = 0xffffffff) .def("get_download_queue", get_download_queue) .def("file_progress", file_progress, arg("flags") = file_progress_flags_t{}) .def("trackers", trackers) .def("replace_trackers", replace_trackers) .def("add_tracker", add_tracker) .def("add_url_seed", _(&torrent_handle::add_url_seed)) .def("remove_url_seed", _(&torrent_handle::remove_url_seed)) .def("url_seeds", url_seeds) .def("add_http_seed", _(&torrent_handle::add_http_seed)) .def("remove_http_seed", _(&torrent_handle::remove_http_seed)) .def("http_seeds", http_seeds) .def("torrent_file", _(&torrent_handle::torrent_file)) .def("set_metadata", set_metadata) .def("is_valid", _(&torrent_handle::is_valid)) .def("pause", _(&torrent_handle::pause), arg("flags") = 0) .def("resume", _(&torrent_handle::resume)) .def("clear_error", _(&torrent_handle::clear_error)) .def("queue_position", _(&torrent_handle::queue_position)) .def("queue_position_up", _(&torrent_handle::queue_position_up)) .def("queue_position_down", _(&torrent_handle::queue_position_down)) .def("queue_position_top", _(&torrent_handle::queue_position_top)) .def("queue_position_bottom", _(&torrent_handle::queue_position_bottom)) .def("add_piece", add_piece_str) .def("add_piece", add_piece_bytes) .def("read_piece", _(&torrent_handle::read_piece)) .def("have_piece", _(&torrent_handle::have_piece)) .def("set_piece_deadline", _(&torrent_handle::set_piece_deadline) , (arg("index"), arg("deadline"), arg("flags") = 0)) .def("reset_piece_deadline", _(&torrent_handle::reset_piece_deadline), (arg("index"))) .def("clear_piece_deadlines", _(&torrent_handle::clear_piece_deadlines), (arg("index"))) .def("piece_availability", &piece_availability) .def("piece_priority", _(piece_priority0)) .def("piece_priority", _(piece_priority1)) .def("prioritize_pieces", &prioritize_pieces) .def("get_piece_priorities", &piece_priorities) .def("prioritize_files", &prioritize_files) .def("get_file_priorities", &file_priorities) .def("file_priority", &file_prioritity0) .def("file_priority", &file_prioritity1) .def("file_status", _(file_status0)) .def("save_resume_data", _(&torrent_handle::save_resume_data), arg("flags") = 0) .def("need_save_resume_data", _(&torrent_handle::need_save_resume_data)) .def("force_reannounce", _(force_reannounce0) , (arg("seconds") = 0, arg("tracker_idx") = -1, arg("flags") = reannounce_flags_t{})) #ifndef TORRENT_DISABLE_DHT .def("force_dht_announce", _(&torrent_handle::force_dht_announce)) #endif .def("scrape_tracker", _(&torrent_handle::scrape_tracker), arg("index") = -1) .def("flush_cache", &torrent_handle::flush_cache) .def("set_upload_limit", _(&torrent_handle::set_upload_limit)) .def("upload_limit", _(&torrent_handle::upload_limit)) .def("set_download_limit", _(&torrent_handle::set_download_limit)) .def("download_limit", _(&torrent_handle::download_limit)) .def("connect_peer", &torrent_handle::connect_peer, (arg("endpoint"), arg("source")=0, arg("flags")=0xd)) .def("set_max_uploads", &torrent_handle::set_max_uploads) .def("max_uploads", _(&torrent_handle::max_uploads)) .def("set_max_connections", &torrent_handle::set_max_connections) .def("max_connections", _(&torrent_handle::max_connections)) .def("move_storage", _(move_storage0), (arg("path"), arg("flags") = move_flags_t::always_replace_files)) .def("info_hash", _(&torrent_handle::info_hash)) .def("info_hashes", _(&torrent_handle::info_hashes)) .def("force_recheck", _(&torrent_handle::force_recheck)) .def("rename_file", _(rename_file0)) .def("set_ssl_certificate", &torrent_handle::set_ssl_certificate, (arg("cert"), arg("private_key"), arg("dh_params"), arg("passphrase")="")) .def("flags", _(&torrent_handle::flags)) .def("set_flags", _(set_flags0)) .def("set_flags", _(set_flags1)) .def("unset_flags", _(&torrent_handle::unset_flags)) // deprecated #if TORRENT_ABI_VERSION == 1 .def("piece_priorities", depr(&piece_priorities)) .def("file_priorities", depr(&file_priorities)) .def("stop_when_ready", depr(&torrent_handle::stop_when_ready)) .def("super_seeding", depr(super_seeding1)) .def("auto_managed", depr(&torrent_handle::auto_managed)) .def("set_priority", depr(&torrent_handle::set_priority)) .def("get_torrent_info", depr(&get_torrent_info)) .def("super_seeding", depr(super_seeding0)) .def("write_resume_data", depr(&torrent_handle::write_resume_data)) .def("is_seed", depr(&torrent_handle::is_seed)) .def("is_finished", depr(&torrent_handle::is_finished)) .def("has_metadata", depr(&torrent_handle::has_metadata)) .def("use_interface", depr(&torrent_handle::use_interface)) .def("name", depr(&torrent_handle::name)) .def("is_paused", depr(&torrent_handle::is_paused)) .def("is_auto_managed", depr(&torrent_handle::is_auto_managed)) .def("set_upload_mode", depr(&torrent_handle::set_upload_mode)) .def("set_share_mode", depr(&torrent_handle::set_share_mode)) .def("apply_ip_filter", depr(&torrent_handle::apply_ip_filter)) .def("set_sequential_download", depr(&torrent_handle::set_sequential_download)) .def("set_peer_upload_limit", depr(&torrent_handle::set_peer_upload_limit)) .def("set_peer_download_limit", depr(&torrent_handle::set_peer_download_limit)) .def("set_ratio", depr(&torrent_handle::set_ratio)) .def("save_path", depr(&torrent_handle::save_path)) .def("set_tracker_login", depr(&torrent_handle::set_tracker_login)) #endif ; s.attr("ignore_min_interval") = torrent_handle::ignore_min_interval; s.attr("overwrite_existing") = torrent_handle::overwrite_existing; s.attr("piece_granularity") = torrent_handle::piece_granularity; s.attr("graceful_pause") = torrent_handle::graceful_pause; s.attr("flush_disk_cache") = torrent_handle::flush_disk_cache; s.attr("save_info_dict") = torrent_handle::save_info_dict; s.attr("only_if_modified") = torrent_handle::only_if_modified; s.attr("alert_when_available") = torrent_handle::alert_when_available; s.attr("query_distributed_copies") = torrent_handle::query_distributed_copies; s.attr("query_accurate_download_counters") = torrent_handle::query_accurate_download_counters; s.attr("query_last_seen_complete") = torrent_handle::query_last_seen_complete; s.attr("query_pieces") = torrent_handle::query_pieces; s.attr("query_verified_pieces") = torrent_handle::query_verified_pieces; } class_("open_file_state") .add_property("file_index", make_getter((&open_file_state::file_index), by_value())) .def_readonly("last_use", &open_file_state::last_use) .def_readonly("open_mode", &open_file_state::open_mode) ; { scope s = class_("file_open_mode"); s.attr("read_only") = file_open_mode::read_only; s.attr("write_only") = file_open_mode::write_only; s.attr("read_write") = file_open_mode::read_write; s.attr("rw_mask") = file_open_mode::rw_mask; s.attr("sparse") = file_open_mode::sparse; s.attr("no_atime") = file_open_mode::no_atime; s.attr("random_access") = file_open_mode::random_access; #if TORRENT_ABI_VERSION == 1 s.attr("locked") = 0; #endif } { scope s = class_("file_progress_flags_t"); s.attr("piece_granularity") = torrent_handle::piece_granularity; } { scope s = class_("add_piece_flags_t"); s.attr("overwrite_existing") = torrent_handle::overwrite_existing; } { scope s = class_("pause_flags_t"); s.attr("graceful_pause") = torrent_handle::graceful_pause; } { scope s = class_("save_resume_flags_t"); s.attr("flush_disk_cache") = torrent_handle::flush_disk_cache; s.attr("save_info_dict") = torrent_handle::save_info_dict; s.attr("only_if_modified") = torrent_handle::only_if_modified; } { scope s = class_("reannounce_flags_t"); s.attr("ignore_min_interval") = torrent_handle::ignore_min_interval; } { scope s = class_("deadline_flags_t"); s.attr("alert_when_available") = torrent_handle::alert_when_available; } { scope s = class_("status_flags_t"); s.attr("query_distributed_copies") = torrent_handle::query_distributed_copies; s.attr("query_accurate_download_counters") = torrent_handle::query_accurate_download_counters; s.attr("query_last_seen_complete") = torrent_handle::query_last_seen_complete; s.attr("query_pieces") = torrent_handle::query_pieces; s.attr("query_verified_pieces") = torrent_handle::query_verified_pieces; } } #ifdef _MSC_VER #pragma warning(pop) #endif libtorrent-rasterbar-2.0.5/bindings/python/src/sha1_hash.cpp0000664000175000017500000000206214152763504023142 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include #include "bytes.hpp" namespace { using namespace lt; long get_hash(sha1_hash const& s) { return std::hash{}(s); } bytes sha1_hash_bytes(const sha1_hash& bn) { return bytes(bn.to_string()); } } void bind_sha1_hash() { using namespace boost::python; using namespace lt; class_("sha1_hash") .def(self == self) .def(self != self) .def(self < self) .def(self_ns::str(self)) .def(init()) .def("clear", &sha1_hash::clear) .def("is_all_zeros", &sha1_hash::is_all_zeros) .def("to_string", sha1_hash_bytes) .def("__hash__", get_hash) .def("to_bytes", sha1_hash_bytes) ; scope().attr("peer_id") = scope().attr("sha1_hash"); } libtorrent-rasterbar-2.0.5/bindings/python/src/create_torrent.cpp0000664000175000017500000002410314152763504024323 0ustar arvidarvid// Copyright Daniel Wallin & Arvid Norberg 2009. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include #include "libtorrent/torrent_info.hpp" #include #include "bytes.hpp" #include "gil.hpp" using namespace boost::python; using namespace lt; #ifdef _MSC_VER #pragma warning(push) // warning c4996: x: was declared deprecated #pragma warning( disable : 4996 ) #endif namespace { void set_hash(create_torrent& c, piece_index_t p, bytes const& b) { c.set_hash(p, sha1_hash(b.arr)); } #if TORRENT_ABI_VERSION < 3 void set_file_hash(create_torrent& c, file_index_t f, bytes const& b) { c.set_file_hash(f, sha1_hash(b.arr)); } #endif #ifndef BOOST_NO_EXCEPTIONS void set_piece_hashes_callback(create_torrent& c, std::string const& p , boost::python::object cb) { set_piece_hashes(c, p, std::function( [&](piece_index_t const i) { cb(i); })); } #else void set_piece_hashes_callback(create_torrent& c, std::string const& p , boost::python::object cb) { error_code ec; set_piece_hashes(c, p, [&](piece_index_t const i) { cb(i); }, ec); } void set_piece_hashes0(create_torrent& c, std::string const & s) { error_code ec; set_piece_hashes(c, s, ec); } #endif void add_node(create_torrent& ct, std::string const& addr, int port) { ct.add_node(std::make_pair(addr, port)); } #if TORRENT_ABI_VERSION == 1 void add_file_deprecated(file_storage& ct, file_entry const& fe) { python_deprecated("this overload of add_file() is deprecated"); ct.add_file(fe); } struct FileIter { using value_type = lt::file_entry; using reference = lt::file_entry; using pointer = lt::file_entry*; using difference_type = int; using iterator_category = std::forward_iterator_tag; FileIter(file_storage const& fs, file_index_t i) : m_fs(&fs), m_i(i) {} FileIter(FileIter const&) = default; FileIter() : m_fs(nullptr), m_i(0) {} lt::file_entry operator*() const { return m_fs->at(m_i); } FileIter operator++() { m_i++; return *this; } FileIter operator++(int) { return FileIter(*m_fs, m_i++); } bool operator==(FileIter const& rhs) const { return m_fs == rhs.m_fs && m_i == rhs.m_i; } int operator-(FileIter const& rhs) const { assert(rhs.m_fs == m_fs); return m_i - rhs.m_i; } FileIter& operator=(FileIter const&) = default; file_storage const* m_fs; file_index_t m_i; }; FileIter begin_files(file_storage const& self) { python_deprecated("__iter__ is deprecated"); return FileIter(self, file_index_t(0)); } FileIter end_files(file_storage const& self) { return FileIter(self, self.end_file()); } #endif // TORRENT_ABI_VERSION void add_files_callback(file_storage& fs, std::string const& file , boost::python::object cb, create_flags_t const flags) { add_files(fs, file, [&](std::string const& i) { return cb(i); }, flags); } void add_file(file_storage& fs, std::string const& file, std::int64_t size , file_flags_t const flags, std::time_t md, std::string link) { fs.add_file(file, size, flags, md, link); } void add_tracker(create_torrent& ct, std::string url, int tier) { ct.add_tracker(url, tier); } struct dummy13 {}; struct dummy14 {}; } void bind_create_torrent() { void (file_storage::*set_name0)(std::string const&) = &file_storage::set_name; void (file_storage::*rename_file0)(file_index_t, std::string const&) = &file_storage::rename_file; #ifndef BOOST_NO_EXCEPTIONS void (*set_piece_hashes0)(create_torrent&, std::string const&) = &set_piece_hashes; #endif void (*add_files0)(file_storage&, std::string const&, create_flags_t) = add_files; std::string (file_storage::*file_storage_symlink)(file_index_t) const = &file_storage::symlink; sha1_hash (file_storage::*file_storage_hash)(file_index_t) const = &file_storage::hash; std::string (file_storage::*file_storage_file_path)(file_index_t, std::string const&) const = &file_storage::file_path; string_view (file_storage::*file_storage_file_name)(file_index_t) const = &file_storage::file_name; std::int64_t (file_storage::*file_storage_file_size)(file_index_t) const = &file_storage::file_size; std::int64_t (file_storage::*file_storage_file_offset)(file_index_t) const = &file_storage::file_offset; file_flags_t (file_storage::*file_storage_file_flags)(file_index_t) const = &file_storage::file_flags; #if TORRENT_ABI_VERSION == 1 file_entry (file_storage::*at)(int) const = &file_storage::at; #endif // TODO: 3 move this to its own file { scope s = class_("file_storage") .def("is_valid", &file_storage::is_valid) .def("add_file", add_file, (arg("path"), arg("size"), arg("flags") = 0, arg("mtime") = 0, arg("linkpath") = "")) .def("num_files", &file_storage::num_files) #if TORRENT_ABI_VERSION == 1 .def("at", depr(at)) .def("add_file", add_file_deprecated, arg("entry")) .def("__iter__", boost::python::range(&begin_files, &end_files)) .def("__len__", depr(&file_storage::num_files)) #endif // TORRENT_ABI_VERSION .def("hash", file_storage_hash) .def("symlink", file_storage_symlink) .def("file_path", file_storage_file_path, (arg("idx"), arg("save_path") = "")) .def("file_name", file_storage_file_name) .def("file_size", file_storage_file_size) .def("root", &file_storage::root) .def("file_offset", file_storage_file_offset) .def("file_flags", file_storage_file_flags) .def("file_index_for_root", &file_storage::file_index_for_root) .def("piece_index_at_file", &file_storage::piece_index_at_file) .def("file_index_at_piece", &file_storage::file_index_at_piece) .def("file_index_at_offset", &file_storage::file_index_at_offset) .def("file_absolute_path", &file_storage::file_absolute_path) .def("v2", &file_storage::v2) .def("total_size", &file_storage::total_size) .def("set_num_pieces", &file_storage::set_num_pieces) .def("num_pieces", &file_storage::num_pieces) .def("set_piece_length", &file_storage::set_piece_length) .def("piece_length", &file_storage::piece_length) .def("piece_size", &file_storage::piece_size) .def("set_name", set_name0) .def("rename_file", rename_file0) .def("name", &file_storage::name, return_value_policy()) ; s.attr("flag_pad_file") = file_storage::flag_pad_file; s.attr("flag_hidden") = file_storage::flag_hidden; s.attr("flag_executable") = file_storage::flag_executable; s.attr("flag_symlink") = file_storage::flag_symlink; } { scope s = class_("file_flags_t"); s.attr("flag_pad_file") = file_storage::flag_pad_file; s.attr("flag_hidden") = file_storage::flag_hidden; s.attr("flag_executable") = file_storage::flag_executable; s.attr("flag_symlink") = file_storage::flag_symlink; } { scope s = class_("create_torrent", no_init) .def(init()) .def(init(arg("ti"))) .def(init((arg("storage"), arg("piece_size") = 0 , arg("flags") = create_flags_t{}))) .def("generate", &create_torrent::generate) .def("files", &create_torrent::files, return_internal_reference<>()) .def("set_comment", &create_torrent::set_comment) .def("set_creator", &create_torrent::set_creator) .def("set_hash", &set_hash) #if TORRENT_ABI_VERSION < 3 .def("set_file_hash", &set_file_hash) #endif .def("add_url_seed", &create_torrent::add_url_seed) .def("add_http_seed", &create_torrent::add_http_seed) .def("add_node", &add_node) .def("add_tracker", add_tracker, (arg("announce_url"), arg("tier") = 0)) .def("set_priv", &create_torrent::set_priv) .def("num_pieces", &create_torrent::num_pieces) .def("piece_length", &create_torrent::piece_length) .def("piece_size", &create_torrent::piece_size) .def("priv", &create_torrent::priv) .def("set_root_cert", &create_torrent::set_root_cert, (arg("pem"))) .def("add_collection", &create_torrent::add_collection) .def("add_similar_torrent", &create_torrent::add_similar_torrent) ; #if TORRENT_ABI_VERSION <= 2 s.attr("optimize_alignment") = create_torrent::optimize_alignment; s.attr("merkle") = create_torrent::merkle; #endif s.attr("v2_only") = create_torrent::v2_only; s.attr("v1_only") = create_torrent::v1_only; s.attr("canonical_files") = create_torrent::canonical_files; s.attr("modification_time") = create_torrent::modification_time; s.attr("symlinks") = create_torrent::symlinks; } { scope s = class_("create_torrent_flags_t"); #if TORRENT_ABI_VERSION == 1 s.attr("optimize") = create_torrent::optimize; #endif #if TORRENT_ABI_VERSION <= 2 s.attr("optimize_alignment") = create_torrent::optimize_alignment; s.attr("merkle") = create_torrent::merkle; #endif s.attr("v2_only") = create_torrent::v2_only; s.attr("modification_time") = create_torrent::modification_time; s.attr("symlinks") = create_torrent::symlinks; } def("add_files", add_files0, (arg("fs"), arg("path"), arg("flags") = 0)); def("add_files", add_files_callback, (arg("fs"), arg("path") , arg("predicate"), arg("flags") = 0)); def("set_piece_hashes", set_piece_hashes0); def("set_piece_hashes", set_piece_hashes_callback); } #ifdef _MSC_VER #pragma warning(pop) #endif libtorrent-rasterbar-2.0.5/bindings/python/src/alert.cpp0000664000175000017500000012555414152763504022426 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include #include // for piece_block #include #include #include #include "bytes.hpp" #include "gil.hpp" #include using namespace boost::python; using namespace lt; #ifdef _MSC_VER #pragma warning(push) // warning c4996: x: was declared deprecated #pragma warning( disable : 4996 ) #endif bytes get_buffer(read_piece_alert const& rpa) { return rpa.buffer ? bytes(rpa.buffer.get(), rpa.size) : bytes(); } #if TORRENT_ABI_VERSION <= 2 list stats_alert_transferred(stats_alert const& alert) { list result; for (int i = 0; i < alert.num_channels; ++i) { result.append(alert.transferred[i]); } return result; } #endif list get_status_from_update_alert(state_update_alert const& alert) { list result; for (std::vector::const_iterator i = alert.status.begin(); i != alert.status.end(); ++i) { result.append(*i); } return result; } list dht_stats_active_requests(dht_stats_alert const& a) { list result; for (std::vector::const_iterator i = a.active_requests.begin(); i != a.active_requests.end(); ++i) { dict d; d["type"] = i->type; d["outstanding_requests"] = i->outstanding_requests; d["timeouts"] = i->timeouts; d["responses"] = i->responses; d["branch_factor"] = i->branch_factor; d["nodes_left"] = i->nodes_left; d["last_sent"] = i->last_sent; d["first_timeout"] = i->first_timeout; result.append(d); } return result; } list dht_stats_routing_table(dht_stats_alert const& a) { list result; for (std::vector::const_iterator i = a.routing_table.begin(); i != a.routing_table.end(); ++i) { dict d; d["num_nodes"] = i->num_nodes; d["num_replacements"] = i->num_replacements; result.append(d); } return result; } dict dht_immutable_item(dht_immutable_item_alert const& alert) { dict d; d["key"] = alert.target; d["value"] = bytes(alert.item.string()); return d; } dict dht_mutable_item(dht_mutable_item_alert const& alert) { dict d; d["key"] = bytes(alert.key.data(), alert.key.size()); d["value"] = bytes(alert.item.string()); d["signature"] = bytes(alert.signature.data(), alert.signature.size()); d["seq"] = alert.seq; d["salt"] = bytes(alert.salt); d["authoritative"] = alert.authoritative; return d; } dict dht_put_item(dht_put_alert const& alert) { dict d; if (alert.target.is_all_zeros()) { d["public_key"] = bytes(alert.public_key.data(), alert.public_key.size()); d["signature"] = bytes(alert.signature.data(), alert.signature.size()); d["seq"] = alert.seq; d["salt"] = bytes(alert.salt); } else { d["target"] = alert.target; } return d; } dict session_stats_values(session_stats_alert const& alert) { std::vector map = session_stats_metrics(); dict d; auto counters = alert.counters(); for (stats_metric const& m : map) { d[m.name] = counters[m.value_index]; } return d; } list dht_live_nodes_nodes(dht_live_nodes_alert const& alert) { list result; std::vector> const nodes = alert.nodes(); for (std::pair const& node : nodes) { dict d; d["nid"] = node.first; d["endpoint"] = node.second; result.append(d); } return result; } list dht_sample_infohashes_nodes(dht_sample_infohashes_alert const& alert) { list result; std::vector> const nodes = alert.nodes(); for (std::pair const& node : nodes) { dict d; d["nid"] = node.first; d["endpoint"] = node.second; result.append(d); } return result; } #if TORRENT_ABI_VERSION == 1 entry const& get_resume_data_entry(save_resume_data_alert const& self) { python_deprecated("resume_data is deprecated"); return *self.resume_data; } #endif namespace boost { // some older compilers (like msvc-12.0) end up using // boost::is_polymorphic inside boost.python applied // to alert types. This is problematic, since it appears // to be implemented by deriving from the type, which // yields a compiler error since most alerts are final. // this just short-cuts the query to say that all these // types are indeed polymorphic, no need to derive from // them. #define POLY(x) template<> \ struct is_polymorphic : boost::mpl::true_ {}; POLY(torrent_alert) POLY(tracker_alert) POLY(torrent_removed_alert) POLY(read_piece_alert) POLY(peer_alert) POLY(tracker_error_alert) POLY(tracker_warning_alert) POLY(tracker_reply_alert) POLY(tracker_announce_alert) POLY(hash_failed_alert) POLY(peer_ban_alert) POLY(peer_error_alert) POLY(invalid_request_alert) POLY(torrent_error_alert) POLY(torrent_finished_alert) POLY(piece_finished_alert) POLY(block_finished_alert) POLY(block_downloading_alert) POLY(storage_moved_alert) POLY(storage_moved_failed_alert) POLY(torrent_deleted_alert) POLY(torrent_paused_alert) POLY(torrent_checked_alert) POLY(url_seed_alert) POLY(file_error_alert) POLY(metadata_failed_alert) POLY(metadata_received_alert) POLY(listen_failed_alert) POLY(listen_succeeded_alert) POLY(portmap_error_alert) POLY(portmap_alert) POLY(fastresume_rejected_alert) POLY(peer_blocked_alert) POLY(scrape_reply_alert) POLY(scrape_failed_alert) POLY(udp_error_alert) POLY(external_ip_alert) POLY(save_resume_data_alert) POLY(file_completed_alert) POLY(file_renamed_alert) POLY(file_rename_failed_alert) POLY(torrent_resumed_alert) POLY(state_changed_alert) POLY(state_update_alert) POLY(i2p_alert) POLY(dht_immutable_item_alert) POLY(dht_mutable_item_alert) POLY(dht_put_alert) POLY(dht_reply_alert) POLY(dht_announce_alert) POLY(dht_get_peers_alert) POLY(peer_unsnubbed_alert) POLY(peer_snubbed_alert) POLY(peer_connect_alert) POLY(peer_disconnected_alert) POLY(request_dropped_alert) POLY(block_timeout_alert) POLY(unwanted_block_alert) POLY(torrent_delete_failed_alert) POLY(save_resume_data_failed_alert) POLY(performance_alert) #if TORRENT_ABI_VERSION <= 2 POLY(stats_alert) #endif POLY(cache_flushed_alert) POLY(incoming_connection_alert) POLY(torrent_need_cert_alert) POLY(add_torrent_alert) POLY(dht_outgoing_get_peers_alert) POLY(lsd_error_alert) POLY(dht_stats_alert) POLY(incoming_request_alert) POLY(dht_log_alert) POLY(dht_pkt_alert) POLY(dht_get_peers_reply_alert) POLY(dht_direct_response_alert) POLY(session_error_alert) POLY(dht_live_nodes_alert) POLY(session_stats_header_alert) POLY(dht_sample_infohashes_alert) POLY(block_uploaded_alert) POLY(alerts_dropped_alert) POLY(session_stats_alert) POLY(socks5_alert) POLY(file_prio_alert) #if TORRENT_ABI_VERSION == 1 POLY(anonymous_mode_alert) POLY(torrent_added_alert) #endif #ifndef TORRENT_DISABLE_LOGGING POLY(portmap_log_alert) POLY(log_alert) POLY(torrent_log_alert) POLY(peer_log_alert) POLY(picker_log_alert) #endif // TORRENT_DISABLE_LOGGING #undef POLY } struct dummy3 {}; struct dummy12 {}; bytes get_pkt_buf(dht_pkt_alert const& alert) { return {alert.pkt_buf().data(), static_cast(alert.pkt_buf().size())}; } list get_dropped_alerts(alerts_dropped_alert const& alert) { list ret; for (int i = 0; i < int(alert.dropped_alerts.size()); ++i) ret.append(bool(alert.dropped_alerts[i])); return ret; } void bind_alert() { using boost::noncopyable; using by_value = return_value_policy; { scope alert_scope = class_("alert", no_init) .def("message", &alert::message) .def("what", &alert::what) .def("category", &alert::category) .def("__str__", &alert::message) ; scope s = class_("category_t"); s.attr("error_notification") = alert::error_notification; s.attr("peer_notification") = alert::peer_notification; s.attr("port_mapping_notification") = alert::port_mapping_notification; s.attr("storage_notification") = alert::storage_notification; s.attr("tracker_notification") = alert::tracker_notification; s.attr("connect_notification") = alert::connect_notification; s.attr("status_notification") = alert::status_notification; #if TORRENT_ABI_VERSION == 1 s.attr("debug_notification") = alert::debug_notification; s.attr("progress_notification") = alert::progress_notification; #endif s.attr("ip_block_notification") = alert::ip_block_notification; s.attr("performance_warning") = alert::performance_warning; s.attr("dht_notification") = alert::dht_notification; #if TORRENT_ABI_VERSION <= 2 s.attr("stats_notification") = alert::stats_notification; #endif s.attr("session_log_notification") = alert::session_log_notification; s.attr("torrent_log_notification") = alert::torrent_log_notification; s.attr("peer_log_notification") = alert::peer_log_notification; s.attr("incoming_request_notification") = alert::incoming_request_notification; s.attr("dht_log_notification") = alert::dht_log_notification; s.attr("dht_operation_notification") = alert::dht_operation_notification; s.attr("port_mapping_log_notification") = alert::port_mapping_log_notification; s.attr("picker_log_notification") = alert::picker_log_notification; s.attr("file_progress_notification") = alert::file_progress_notification; s.attr("piece_progress_notification") = alert::piece_progress_notification; s.attr("upload_notification") = alert::upload_notification; s.attr("block_progress_notification") = alert::block_progress_notification; s.attr("all_categories") = alert::all_categories; } { scope s = class_("alert_category"); s.attr("error") = alert_category::error; s.attr("peer") = alert_category::peer; s.attr("port_mapping") = alert_category::port_mapping; s.attr("storage") = alert_category::storage; s.attr("tracker") = alert_category::tracker; s.attr("connect") = alert_category::connect; s.attr("status") = alert_category::status; s.attr("ip_block") = alert_category::ip_block; s.attr("performance_warning") = alert_category::performance_warning; s.attr("dht") = alert_category::dht; s.attr("stats") = alert_category::stats; s.attr("session_log") = alert_category::session_log; s.attr("torrent_log") = alert_category::torrent_log; s.attr("peer_log") = alert_category::peer_log; s.attr("incoming_request") = alert_category::incoming_request; s.attr("dht_log") = alert_category::dht_log; s.attr("dht_operation") = alert_category::dht_operation; s.attr("port_mapping_log") = alert_category::port_mapping_log; s.attr("picker_log") = alert_category::picker_log; s.attr("file_progress") = alert_category::file_progress; s.attr("piece_progress") = alert_category::piece_progress; s.attr("upload") = alert_category::upload; s.attr("block_progress") = alert_category::block_progress; s.attr("all") = alert_category::all; } enum_("operation_t") .value("unknown", operation_t::unknown) .value("bittorrent", operation_t::bittorrent) .value("iocontrol", operation_t::iocontrol) .value("getpeername", operation_t::getpeername) .value("getname", operation_t::getname) .value("alloc_recvbuf", operation_t::alloc_recvbuf) .value("alloc_sndbuf", operation_t::alloc_sndbuf) .value("file_write", operation_t::file_write) .value("file_read", operation_t::file_read) .value("file", operation_t::file) .value("sock_write", operation_t::sock_write) .value("sock_read", operation_t::sock_read) .value("sock_open", operation_t::sock_open) .value("sock_bind", operation_t::sock_bind) .value("available", operation_t::available) .value("encryption", operation_t::encryption) .value("connect", operation_t::connect) .value("ssl_handshake", operation_t::ssl_handshake) .value("get_interface", operation_t::get_interface) .value("sock_listen", operation_t::sock_listen) .value("sock_bind_to_device", operation_t::sock_bind_to_device) .value("sock_accept", operation_t::sock_accept) .value("parse_address", operation_t::parse_address) .value("enum_if", operation_t::enum_if) .value("file_stat", operation_t::file_stat) .value("file_copy", operation_t::file_copy) .value("file_fallocate", operation_t::file_fallocate) .value("file_hard_link", operation_t::file_hard_link) .value("file_remove", operation_t::file_remove) .value("file_rename", operation_t::file_rename) .value("file_open", operation_t::file_open) .value("mkdir", operation_t::mkdir) .value("check_resume", operation_t::check_resume) .value("exception", operation_t::exception) .value("alloc_cache_piece", operation_t::alloc_cache_piece) .value("partfile_move", operation_t::partfile_move) .value("partfile_read", operation_t::partfile_read) .value("partfile_write", operation_t::partfile_write) .value("hostname_lookup", operation_t::hostname_lookup) .value("symlink", operation_t::symlink) .value("handshake", operation_t::handshake) .value("sock_option", operation_t::sock_option) ; def("operation_name", static_cast(<::operation_name)); class_, noncopyable>( "torrent_alert", no_init) .add_property("handle", make_getter(&torrent_alert::handle, by_value())) .add_property("torrent_name", &torrent_alert::torrent_name) ; class_, noncopyable>( "tracker_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def_readonly("url", &tracker_alert::url) #endif .add_property("local_endpoint", make_getter(&tracker_alert::local_endpoint, by_value())) .def("tracker_url", &tracker_alert::tracker_url) ; #if TORRENT_ABI_VERSION == 1 class_, noncopyable>( "torrent_added_alert", no_init) ; #endif class_, noncopyable>( "torrent_removed_alert", no_init) #if TORRENT_ABI_VERSION < 3 .def_readonly("info_hash", &torrent_removed_alert::info_hash) #endif .def_readonly("info_hashes", &torrent_removed_alert::info_hashes) ; class_, noncopyable>( "read_piece_alert", nullptr, no_init) .def_readonly("error", &read_piece_alert::error) #if TORRENT_ABI_VERSION == 1 .def_readonly("ec", &read_piece_alert::ec) #endif .add_property("buffer", get_buffer) .add_property("piece", make_getter(&read_piece_alert::piece, by_value())) .def_readonly("size", &read_piece_alert::size) ; class_, noncopyable>( "peer_alert", no_init) #if TORRENT_ABI_VERSION == 1 .add_property("ip", make_getter(&peer_alert::ip, by_value())) #endif .add_property("endpoint", make_getter(&peer_alert::endpoint, by_value())) .def_readonly("pid", &peer_alert::pid) ; class_, noncopyable>( "tracker_error_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def_readonly("msg", &tracker_error_alert::msg) .def_readonly("status_code", &tracker_error_alert::status_code) #endif .def("error_message", &tracker_error_alert::error_message) .def("failure_reason", &tracker_error_alert::failure_reason) .def_readonly("times_in_row", &tracker_error_alert::times_in_row) .def_readonly("error", &tracker_error_alert::error) ; class_, noncopyable>( "tracker_warning_alert", no_init); class_, noncopyable>( "tracker_reply_alert", no_init) .def_readonly("num_peers", &tracker_reply_alert::num_peers) ; class_, noncopyable>( "tracker_announce_alert", no_init) .def_readonly("event", &tracker_announce_alert::event) ; class_, noncopyable>( "hash_failed_alert", no_init) .add_property("piece_index", make_getter(&hash_failed_alert::piece_index, by_value())) ; class_, noncopyable>( "peer_ban_alert", no_init); class_, noncopyable>( "peer_error_alert", no_init) .def_readonly("error", &peer_error_alert::error) .def_readonly("op", &peer_error_alert::op) ; class_, noncopyable>( "invalid_request_alert", no_init) .def_readonly("request", &invalid_request_alert::request) ; class_("peer_request") .add_property("piece", make_getter(&peer_request::piece, by_value())) .def_readonly("start", &peer_request::start) .def_readonly("length", &peer_request::length) .def(self == self) ; class_, noncopyable>( "torrent_error_alert", no_init) .def_readonly("error", &torrent_error_alert::error) ; class_, noncopyable>( "torrent_finished_alert", no_init); class_, noncopyable>( "piece_finished_alert", no_init) .add_property("piece_index", make_getter(&piece_finished_alert::piece_index, by_value())) ; class_, noncopyable>( "block_finished_alert", no_init) .add_property("block_index", make_getter(&block_finished_alert::block_index, by_value())) .add_property("piece_index", make_getter(&block_finished_alert::piece_index, by_value())) ; class_, noncopyable>( "block_downloading_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def_readonly("peer_speedmsg", &block_downloading_alert::peer_speedmsg) #endif .add_property("block_index", make_getter(&block_downloading_alert::block_index, by_value())) .add_property("piece_index", make_getter(&block_downloading_alert::piece_index, by_value())) ; class_, noncopyable>( "storage_moved_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def_readonly("path", &storage_moved_alert::path) #endif .def("storage_path", &storage_moved_alert::storage_path) .def("old_path", &storage_moved_alert::old_path) ; class_, noncopyable>( "storage_moved_failed_alert", no_init) .def_readonly("error", &storage_moved_failed_alert::error) .def("file_path", &storage_moved_failed_alert::file_path) .def_readonly("op", &storage_moved_failed_alert::op) #if TORRENT_ABI_VERSION == 1 .def_readonly("operation", &storage_moved_failed_alert::operation) #endif ; class_, noncopyable>( "torrent_deleted_alert", no_init) #if TORRENT_ABI_VERSION < 3 .def_readonly("info_hash", &torrent_deleted_alert::info_hash) #endif .def_readonly("info_hashes", &torrent_deleted_alert::info_hashes) ; class_, noncopyable>( "torrent_paused_alert", no_init); class_, noncopyable>( "torrent_checked_alert", no_init); class_, noncopyable>( "url_seed_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def_readonly("url", &url_seed_alert::url) .def_readonly("msg", &url_seed_alert::msg) #endif .def_readonly("error", &url_seed_alert::error) .def("server_url", &url_seed_alert::server_url) .def("error_message", &url_seed_alert::error_message) ; class_, noncopyable>( "file_error_alert", no_init) .def_readonly("error", &file_error_alert::error) .def("filename", &file_error_alert::filename) #if TORRENT_ABI_VERSION == 1 .def_readonly("file", &file_error_alert::file) .def_readonly("msg", &file_error_alert::msg) #endif ; class_, noncopyable>( "metadata_failed_alert", no_init) .def_readonly("error", &metadata_failed_alert::error) ; class_, noncopyable>( "metadata_received_alert", no_init); class_, noncopyable>( "listen_failed_alert", no_init) #if TORRENT_ABI_VERSION == 1 .add_property("endpoint", make_getter(&listen_failed_alert::endpoint, by_value())) #endif .add_property("address", make_getter(&listen_failed_alert::address, by_value())) .def_readonly("port", &listen_failed_alert::port) .def("listen_interface", &listen_failed_alert::listen_interface) .def_readonly("error", &listen_failed_alert::error) .def_readonly("op", &listen_failed_alert::op) #if TORRENT_ABI_VERSION == 1 .def_readonly("operation", &listen_failed_alert::operation) .def_readonly("sock_type", &listen_failed_alert::sock_type) #endif .def_readonly("socket_type", &listen_failed_alert::socket_type) ; class_, noncopyable>( "listen_succeeded_alert", no_init) #if TORRENT_ABI_VERSION == 1 .add_property("endpoint", make_getter(&listen_succeeded_alert::endpoint, by_value())) #endif .add_property("address", make_getter(&listen_succeeded_alert::address, by_value())) .def_readonly("port", &listen_succeeded_alert::port) #if TORRENT_ABI_VERSION == 1 .def_readonly("sock_type", &listen_succeeded_alert::sock_type) #endif .def_readonly("socket_type", &listen_succeeded_alert::socket_type) ; #if TORRENT_ABI_VERSION == 1 enum_("listen_succeded_alert_socket_type_t") .value("tcp", listen_succeeded_alert::socket_type_t::tcp) .value("tcp_ssl", listen_succeeded_alert::socket_type_t::tcp_ssl) .value("udp", listen_succeeded_alert::socket_type_t::udp) .value("i2p", listen_succeeded_alert::socket_type_t::i2p) .value("socks5", listen_succeeded_alert::socket_type_t::socks5) .value("utp_ssl", listen_succeeded_alert::socket_type_t::utp_ssl) ; enum_("listen_failed_alert_socket_type_t") .value("tcp", listen_failed_alert::socket_type_t::tcp) .value("tcp_ssl", listen_failed_alert::socket_type_t::tcp_ssl) .value("udp", listen_failed_alert::socket_type_t::udp) .value("i2p", listen_failed_alert::socket_type_t::i2p) .value("socks5", listen_failed_alert::socket_type_t::socks5) .value("utp_ssl", listen_failed_alert::socket_type_t::utp_ssl) ; #endif enum_("socket_type_t") .value("tcp", socket_type_t::tcp) .value("socks5", socket_type_t::socks5) .value("http", socket_type_t::http) .value("utp", socket_type_t::utp) #if TORRENT_ABI_VERSION <= 2 .value("udp", socket_type_t::udp) #endif .value("i2p", socket_type_t::i2p) .value("tcp_ssl", socket_type_t::tcp_ssl) .value("socks5_ssl", socket_type_t::socks5_ssl) .value("http_ssl", socket_type_t::http_ssl) .value("utp_ssl", socket_type_t::utp_ssl) ; class_, noncopyable>( "portmap_error_alert", no_init) .add_property("mapping", make_getter(&portmap_error_alert::mapping, by_value())) .def_readonly("error", &portmap_error_alert::error) .def_readonly("map_transport", &portmap_error_alert::map_transport) #if TORRENT_ABI_VERSION == 1 .def_readonly("map_type", &portmap_error_alert::map_type) .def_readonly("type", &portmap_error_alert::map_type) .def_readonly("msg", &portmap_error_alert::msg) #endif ; class_, noncopyable>("portmap_alert", no_init) .add_property("mapping", make_getter(&portmap_alert::mapping, by_value())) .def_readonly("external_port", &portmap_alert::external_port) .def_readonly("map_protocol", &portmap_alert::map_protocol) .def_readonly("map_transport", &portmap_alert::map_transport) #if TORRENT_ABI_VERSION == 1 .def_readonly("type", &portmap_alert::map_type) .def_readonly("map_type", &portmap_alert::map_type) #endif ; #ifndef TORRENT_DISABLE_LOGGING class_, noncopyable>("portmap_log_alert", no_init) .def_readonly("map_transport", &portmap_log_alert::map_transport) #if TORRENT_ABI_VERSION == 1 .def_readonly("type", &portmap_log_alert::map_type) .def_readonly("msg", &portmap_log_alert::msg) .def_readonly("map_type", &portmap_log_alert::map_type) #endif ; #endif // TORRENT_DISABLE_LOGGING class_, noncopyable>( "fastresume_rejected_alert", no_init) .def_readonly("error", &fastresume_rejected_alert::error) .def("file_path", &fastresume_rejected_alert::file_path) .def_readonly("op", &fastresume_rejected_alert::op) #if TORRENT_ABI_VERSION == 1 .def_readonly("operation", &fastresume_rejected_alert::operation) .def_readonly("msg", &fastresume_rejected_alert::msg) #endif ; class_, noncopyable>( "peer_blocked_alert", no_init) #if TORRENT_ABI_VERSION == 1 .add_property("ip", make_getter(&peer_blocked_alert::ip, by_value())) #endif .add_property("reason", &peer_blocked_alert::reason) ; enum_("reason_t") .value("ip_filter", peer_blocked_alert::reason_t::ip_filter) .value("port_filter", peer_blocked_alert::reason_t::port_filter) .value("i2p_mixed", peer_blocked_alert::reason_t::i2p_mixed) .value("privileged_ports", peer_blocked_alert::reason_t::privileged_ports) .value("utp_disabled", peer_blocked_alert::reason_t::utp_disabled) .value("tcp_disabled", peer_blocked_alert::reason_t::tcp_disabled) .value("invalid_local_interface", peer_blocked_alert::reason_t::invalid_local_interface) ; class_, noncopyable>( "scrape_reply_alert", no_init) .def_readonly("incomplete", &scrape_reply_alert::incomplete) .def_readonly("complete", &scrape_reply_alert::complete) ; class_, noncopyable>( "scrape_failed_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def_readonly("msg", &scrape_failed_alert::msg) #endif .def("error_message", &scrape_failed_alert::error_message) .def_readonly("error", &scrape_failed_alert::error) ; class_, noncopyable>( "udp_error_alert", no_init) .add_property("endpoint", make_getter(&udp_error_alert::endpoint, by_value())) .def_readonly("error", &udp_error_alert::error) ; class_, noncopyable>( "external_ip_alert", no_init) .add_property("external_address", make_getter(&external_ip_alert::external_address, by_value())) ; class_, noncopyable>( "save_resume_data_alert", no_init) .def_readonly("params", &save_resume_data_alert::params) #if TORRENT_ABI_VERSION == 1 .add_property("resume_data", make_function(get_resume_data_entry, by_value())) #endif ; class_, noncopyable>( "file_completed_alert", no_init) .add_property("index", make_getter(&file_completed_alert::index, by_value())) ; class_, noncopyable>( "file_renamed_alert", no_init) .add_property("index", make_getter(&file_renamed_alert::index, by_value())) #if TORRENT_ABI_VERSION == 1 .def_readonly("name", &file_renamed_alert::name) #endif .def("new_name", &file_renamed_alert::new_name) .def("old_name", &file_renamed_alert::old_name) ; class_, noncopyable>( "file_rename_failed_alert", no_init) .add_property("index", make_getter(&file_rename_failed_alert::index, by_value())) .def_readonly("error", &file_rename_failed_alert::error) ; class_, noncopyable>( "torrent_resumed_alert", no_init ); class_, noncopyable>( "state_changed_alert", no_init) .def_readonly("state", &state_changed_alert::state) .def_readonly("prev_state", &state_changed_alert::prev_state) ; class_, noncopyable>( "state_update_alert", no_init) .add_property("status", &get_status_from_update_alert) ; class_, noncopyable>( "i2p_alert", no_init) .add_property("error", &i2p_alert::error) ; class_, noncopyable>( "dht_reply_alert", no_init) .def_readonly("num_peers", &dht_reply_alert::num_peers) ; class_, noncopyable>( "dht_announce_alert", no_init) .add_property("ip", make_getter(&dht_announce_alert::ip, by_value())) .def_readonly("port", &dht_announce_alert::port) .def_readonly("info_hash", &dht_announce_alert::info_hash) ; class_, noncopyable>( "dht_get_peers_alert", no_init ) .def_readonly("info_hash", &dht_get_peers_alert::info_hash) ; class_, noncopyable>( "peer_unsnubbed_alert", no_init ); class_, noncopyable>( "peer_snubbed_alert", no_init ); class_, noncopyable>( "peer_connect_alert", no_init ); class_, noncopyable>( "peer_disconnected_alert", no_init) .def_readonly("socket_type", &peer_disconnected_alert::socket_type) .def_readonly("op", &peer_disconnected_alert::op) .def_readonly("error", &peer_disconnected_alert::error) .def_readonly("reason", &peer_disconnected_alert::reason) #if TORRENT_ABI_VERSION == 1 .def_readonly("msg", &peer_disconnected_alert::msg) #endif ; class_, noncopyable>( "request_dropped_alert", no_init) .add_property("block_index", make_getter(&request_dropped_alert::block_index, by_value())) .add_property("piece_index", make_getter(&request_dropped_alert::piece_index, by_value())) ; class_, noncopyable>( "block_timeout_alert", no_init) .add_property("block_index", make_getter(&block_timeout_alert::block_index, by_value())) .add_property("piece_index", make_getter(&block_timeout_alert::piece_index, by_value())) ; class_, noncopyable>( "unwanted_block_alert", no_init) .add_property("block_index", make_getter(&unwanted_block_alert::block_index, by_value())) .add_property("piece_index", make_getter(&unwanted_block_alert::piece_index, by_value())) ; class_, noncopyable>( "torrent_delete_failed_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def_readonly("msg", &torrent_delete_failed_alert::msg) #endif .def_readonly("error", &torrent_delete_failed_alert::error) #if TORRENT_ABI_VERSION < 3 .def_readonly("info_hash", &torrent_delete_failed_alert::info_hash) #endif .def_readonly("info_hashes", &torrent_delete_failed_alert::info_hashes) ; class_, noncopyable>( "save_resume_data_failed_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def_readonly("msg", &save_resume_data_failed_alert::msg) #endif .def_readonly("error", &save_resume_data_failed_alert::error) ; class_, noncopyable>( "performance_alert", no_init) .def_readonly("warning_code", &performance_alert::warning_code) ; enum_("performance_warning_t") .value("outstanding_disk_buffer_limit_reached", performance_alert::outstanding_disk_buffer_limit_reached) .value("outstanding_request_limit_reached", performance_alert::outstanding_request_limit_reached) .value("upload_limit_too_low", performance_alert::upload_limit_too_low) .value("download_limit_too_low", performance_alert::download_limit_too_low) .value("send_buffer_watermark_too_low", performance_alert::send_buffer_watermark_too_low) .value("too_many_optimistic_unchoke_slots", performance_alert::too_many_optimistic_unchoke_slots) #if TORRENT_ABI_VERSION == 1 .value("bittyrant_with_no_uplimit", performance_alert::bittyrant_with_no_uplimit) #endif .value("too_high_disk_queue_limit", performance_alert::too_high_disk_queue_limit) .value("too_few_outgoing_ports", performance_alert::too_few_outgoing_ports) .value("too_few_file_descriptors", performance_alert::too_few_file_descriptors) ; #if TORRENT_ABI_VERSION <= 2 class_, noncopyable>( "stats_alert", no_init) .add_property("transferred", &stats_alert_transferred) .def_readonly("interval", &stats_alert::interval) ; enum_("stats_channel") .value("upload_payload", stats_alert::upload_payload) .value("upload_protocol", stats_alert::upload_protocol) .value("upload_ip_protocol", stats_alert::upload_ip_protocol) #if TORRENT_ABI_VERSION == 1 .value("upload_dht_protocol", stats_alert::upload_dht_protocol) .value("upload_tracker_protocol", stats_alert::upload_tracker_protocol) #endif .value("download_payload", stats_alert::download_payload) .value("download_protocol", stats_alert::download_protocol) .value("download_ip_protocol", stats_alert::download_ip_protocol) #if TORRENT_ABI_VERSION == 1 .value("download_dht_protocol", stats_alert::download_dht_protocol) .value("download_tracker_protocol", stats_alert::download_tracker_protocol) #endif ; #endif // TORRENT_ABI_VERSION class_, noncopyable>( "cache_flushed_alert", no_init) ; #if TORRENT_ABI_VERSION == 1 class_, noncopyable>( "anonymous_mode_alert", no_init) .def_readonly("kind", &anonymous_mode_alert::kind) .def_readonly("str", &anonymous_mode_alert::str) ; enum_("kind") .value("tracker_no_anonymous", anonymous_mode_alert::tracker_not_anonymous) ; #endif // TORRENT_ABI_VERSION class_, noncopyable>( "incoming_connection_alert", no_init) .def_readonly("socket_type", &incoming_connection_alert::socket_type) #if TORRENT_ABI_VERSION == 1 .add_property("ip", make_getter(&incoming_connection_alert::ip, by_value())) #endif .add_property("endpoint", make_getter(&incoming_connection_alert::endpoint, by_value())) ; class_, noncopyable>( "torrent_need_cert_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def_readonly("error", &torrent_need_cert_alert::error) #endif ; class_, noncopyable>( "add_torrent_alert", no_init) .def_readonly("error", &add_torrent_alert::error) .add_property("params", &add_torrent_alert::params) ; class_, noncopyable>( "dht_outgoing_get_peers_alert", no_init) .def_readonly("info_hash", &dht_outgoing_get_peers_alert::info_hash) .def_readonly("obfuscated_info_hash", &dht_outgoing_get_peers_alert::obfuscated_info_hash) #if TORRENT_ABI_VERSION == 1 .add_property("ip", make_getter(&dht_outgoing_get_peers_alert::ip, by_value())) #endif .add_property("endpoint", make_getter(&dht_outgoing_get_peers_alert::endpoint, by_value())) ; class_, noncopyable>( "log_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def("msg", depr(&log_alert::msg)) #endif .def("log_message", &log_alert::log_message) ; class_, noncopyable>( "torrent_log_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def("msg", depr(&torrent_log_alert::msg)) #endif .def("log_message", &torrent_log_alert::log_message) ; class_, noncopyable>( "peer_log_alert", no_init) #if TORRENT_ABI_VERSION == 1 .def("msg", depr(&peer_log_alert::msg)) #endif .def("log_message", &peer_log_alert::log_message) ; class_, noncopyable>( "picker_log_alert", no_init) .add_property("picker_flags", &picker_log_alert::picker_flags) .def("blocks", &picker_log_alert::blocks) ; class_, noncopyable>( "lsd_error_alert", no_init) .def_readonly("error", &lsd_error_alert::error) ; class_, noncopyable>( "dht_stats_alert", no_init) .add_property("active_requests", &dht_stats_active_requests) .add_property("routing_table", &dht_stats_routing_table) ; class_, noncopyable>("dht_log_alert", no_init) .add_property("module", make_getter(&dht_log_alert::module, by_value())) .def("log_message", &dht_log_alert::log_message) ; class_, noncopyable>( "dht_pkt_alert", no_init) .add_property("pkt_buf", &get_pkt_buf) ; class_, noncopyable>( "dht_immutable_item_alert", no_init) .add_property("target", make_getter(&dht_immutable_item_alert::target, by_value())) .add_property("item", &dht_immutable_item) ; class_, noncopyable>( "dht_mutable_item_alert", no_init) .add_property("key", make_getter(&dht_mutable_item_alert::key, by_value())) .add_property("signature", make_getter(&dht_mutable_item_alert::signature, by_value())) .def_readonly("seq", &dht_mutable_item_alert::seq) .def_readonly("salt", &dht_mutable_item_alert::salt) .add_property("item", &dht_mutable_item) .def_readonly("authoritative", &dht_mutable_item_alert::authoritative) ; class_, noncopyable>( "dht_put_alert", no_init) .add_property("target", make_getter(&dht_put_alert::target, by_value())) .add_property("public_key", make_getter(&dht_put_alert::public_key, by_value())) .add_property("signature", make_getter(&dht_put_alert::signature, by_value())) .def_readonly("salt", &dht_put_alert::salt) .def_readonly("seq", &dht_put_alert::seq) .def_readonly("num_success", &dht_put_alert::num_success) ; class_, noncopyable>( "session_stats_alert", no_init) .add_property("values", &session_stats_values) ; class_, noncopyable>( "session_stats_header_alert", no_init) ; std::vector (dht_get_peers_reply_alert::*peers)() const = &dht_get_peers_reply_alert::peers; class_, noncopyable>( "dht_get_peers_reply_alert", no_init) .def_readonly("info_hash", &dht_get_peers_reply_alert::info_hash) .def("num_peers", &dht_get_peers_reply_alert::num_peers) .def("peers", peers) ; class_, noncopyable>( "block_uploaded_alert", no_init) .add_property("block_index", &block_uploaded_alert::block_index) .add_property("piece_index", make_getter(&block_uploaded_alert::piece_index, by_value())) ; class_, noncopyable>( "alerts_dropped_alert", no_init) .add_property("dropped_alerts", &get_dropped_alerts) ; class_, noncopyable>( "socks5_alert", no_init) .def_readonly("error", &socks5_alert::error) .def_readonly("op", &socks5_alert::op) .add_property("ip", make_getter(&socks5_alert::ip, by_value())) ; class_, noncopyable>( "file_prio_alert", no_init) ; class_, noncopyable>( "dht_live_nodes_alert", no_init) .add_property("node_id", &dht_live_nodes_alert::node_id) .add_property("num_nodes", &dht_live_nodes_alert::num_nodes) .add_property("nodes", &dht_live_nodes_nodes) ; std::vector (dht_sample_infohashes_alert::*samples)() const = &dht_sample_infohashes_alert::samples; class_, noncopyable>( "dht_sample_infohashes_alert", no_init) .add_property("endpoint", make_getter(&dht_sample_infohashes_alert::endpoint, by_value())) .add_property("interval", make_getter(&dht_sample_infohashes_alert::interval, by_value())) .add_property("num_infohashes", &dht_sample_infohashes_alert::num_infohashes) .add_property("num_samples", &dht_sample_infohashes_alert::num_samples) .add_property("samples", samples) .add_property("num_nodes", &dht_sample_infohashes_alert::num_nodes) .add_property("nodes", &dht_sample_infohashes_nodes) ; class_, noncopyable>( "dht_bootstrap_alert", no_init) ; } #ifdef _MSC_VER #pragma warning(pop) #endif libtorrent-rasterbar-2.0.5/bindings/python/src/module.cpp0000664000175000017500000000266014152763504022574 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifdef __GNUC__ #define BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY 1 #endif #include #include "libtorrent/config.hpp" void bind_utility(); void bind_fingerprint(); void bind_sha1_hash(); void bind_sha256_hash(); void bind_info_hash(); void bind_session(); void bind_entry(); void bind_torrent_info(); void bind_unicode_string_conversion(); void bind_torrent_handle(); void bind_torrent_status(); void bind_session_settings(); void bind_version(); void bind_alert(); void bind_datetime(); void bind_peer_info(); void bind_ip_filter(); void bind_magnet_uri(); void bind_converters(); void bind_create_torrent(); void bind_error_code(); BOOST_PYTHON_MODULE(libtorrent) { Py_Initialize(); PyEval_InitThreads(); bind_converters(); bind_unicode_string_conversion(); bind_error_code(); bind_utility(); bind_fingerprint(); bind_sha1_hash(); bind_sha256_hash(); bind_info_hash(); bind_entry(); bind_torrent_handle(); bind_session(); bind_torrent_info(); bind_torrent_status(); bind_session_settings(); bind_version(); bind_alert(); bind_datetime(); bind_peer_info(); bind_ip_filter(); bind_magnet_uri(); bind_create_torrent(); } libtorrent-rasterbar-2.0.5/bindings/python/src/boost_python.hpp0000664000175000017500000000206214152763504024037 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_PYTHON_HPP #define BOOST_PYTHON_HPP #include #include #include #include // in boost 1.60, placeholders moved into a namespace, just like std #if BOOST_VERSION >= 106000 using namespace boost::placeholders; #endif #include #include #include #include // something in here creates a define for this, presumably to make older // versions of msvc appear to support snprintf #ifdef snprintf #undef snprintf #endif #ifdef vsnprintf #undef vsnprintf #endif inline void python_deprecated(char const* msg) { if (PyErr_WarnEx(PyExc_DeprecationWarning, msg, 1) == -1) boost::python::throw_error_already_set(); } #endif libtorrent-rasterbar-2.0.5/bindings/python/src/bytes.hpp0000664000175000017500000000112114152763504022431 0ustar arvidarvid// Copyright Arvid Norberg 2006-2013. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BYTES_HPP #define BYTES_HPP #include struct bytes { bytes(char const* s, std::size_t len): arr(s, len) {} bytes(std::string const& s): arr(s) {} bytes(std::string&& s): arr(std::move(s)) {} bytes(bytes const&) = default; bytes(bytes&&) noexcept = default; bytes& operator=(bytes&&) & noexcept = default; bytes() {} std::string arr; }; #endif libtorrent-rasterbar-2.0.5/bindings/python/src/sha256_hash.cpp0000664000175000017500000000201614152763504023315 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include #include "bytes.hpp" namespace { using namespace lt; long get_hash(sha256_hash const& s) { return std::hash{}(s); } bytes sha256_hash_bytes(const sha256_hash& bn) { return bytes(bn.to_string()); } } void bind_sha256_hash() { using namespace boost::python; using namespace lt; class_("sha256_hash") .def(self == self) .def(self != self) .def(self < self) .def(self_ns::str(self)) .def(init()) .def("clear", &sha256_hash::clear) .def("is_all_zeros", &sha256_hash::is_all_zeros) .def("to_string", sha256_hash_bytes) .def("__hash__", get_hash) .def("to_bytes", sha256_hash_bytes) ; } libtorrent-rasterbar-2.0.5/bindings/python/src/entry.cpp0000664000175000017500000001202414152763504022443 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include #include "bytes.hpp" using namespace boost::python; using namespace lt; struct entry_to_python { static object convert(entry::list_type const& l) { list result; for (entry::list_type::const_iterator i(l.begin()), e(l.end()); i != e; ++i) { result.append(*i); } return std::move(result); } static object convert(entry::dictionary_type const& d) { dict result; for (entry::dictionary_type::const_iterator i(d.begin()), e(d.end()); i != e; ++i) result[bytes(i->first)] = i->second; return std::move(result); } static object convert0(entry const& e) { switch (e.type()) { case entry::int_t: return object(e.integer()); case entry::string_t: return object(bytes(e.string())); case entry::list_t: return convert(e.list()); case entry::dictionary_t: return convert(e.dict()); case entry::preformatted_t: { std::vector const& pre = e.preformatted(); list l; for (std::vector::const_iterator i = pre.begin() , end(pre.end()); i != end; ++i) l.append(int(*i)); return tuple(l); } default: return object(); } } static PyObject* convert(std::shared_ptr const& e) { if (!e) return incref(Py_None); return convert(*e); } static PyObject* convert(entry const& e) { return incref(convert0(e).ptr()); } }; struct entry_from_python { entry_from_python() { converter::registry::push_back( &convertible, &construct, type_id() ); } static void* convertible(PyObject* e) { return e; } static entry construct0(object e) { if (extract(e).check()) { dict d = extract(e); list items(d.items()); std::size_t length = extract(items.attr("__len__")()); entry result(entry::dictionary_t); for (std::size_t i = 0; i < length; ++i) { if (extract(items[i][0]).check()) { result.dict().insert( std::make_pair( extract(items[i][0])().arr, construct0(items[i][1]) ) ); } else { result.dict().insert( std::make_pair( extract(items[i][0])(), construct0(items[i][1]) ) ); } } return result; } else if (extract(e).check()) { list l = extract(e); std::size_t length = extract(l.attr("__len__")()); entry result(entry::list_t); for (std::size_t i = 0; i < length; ++i) { result.list().push_back(construct0(l[i])); } return result; } else if (extract(e).check()) { return entry(extract(e)().arr); } else if (extract(e).check()) { return entry(extract(e)()); } else if (extract(e).check()) { return entry(extract(e)()); } else if (extract(e).check()) { tuple t = extract(e); std::size_t const length = extract(t.attr("__len__")()); std::vector preformatted(length); for (std::size_t i = 0; i < length; ++i) { preformatted[i] = char(extract(t[i])); } return entry(preformatted); } else { // TODO: Throw a TypeError here in the future python_deprecated("constructing a bencode entry from anything but " "int, dict, list, string, bytes and int-tuple is deprecated"); } return entry(); } static void construct(PyObject* e, converter::rvalue_from_python_stage1_data* data) { void* storage = ((converter::rvalue_from_python_storage*)data)->storage.bytes; new (storage) entry(construct0(object(borrowed(e)))); data->convertible = storage; } }; void bind_entry() { to_python_converter, entry_to_python>(); to_python_converter(); entry_from_python(); } libtorrent-rasterbar-2.0.5/bindings/python/src/torrent_status.cpp0000664000175000017500000002005014152763504024400 0ustar arvidarvid// Copyright Daniel Wallin 2006. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include "boost_python.hpp" #include "gil.hpp" #include #include #include using namespace boost::python; using namespace lt; using by_value = return_value_policy; std::shared_ptr get_torrent_file(torrent_status const& st) { return st.torrent_file.lock(); } void bind_torrent_status() { scope status = class_("torrent_status") .def(self == self) .def_readonly("handle", &torrent_status::handle) .add_property("torrent_file", &get_torrent_file) .def_readonly("state", &torrent_status::state) #if TORRENT_ABI_VERSION == 1 .def_readonly("paused", &torrent_status::paused) .def_readonly("stop_when_ready", &torrent_status::stop_when_ready) .def_readonly("auto_managed", &torrent_status::auto_managed) .def_readonly("sequential_download", &torrent_status::sequential_download) #endif .def_readonly("is_seeding", &torrent_status::is_seeding) .def_readonly("is_finished", &torrent_status::is_finished) .def_readonly("has_metadata", &torrent_status::has_metadata) .def_readonly("progress", &torrent_status::progress) .def_readonly("progress_ppm", &torrent_status::progress_ppm) .add_property("next_announce", make_getter(&torrent_status::next_announce, by_value())) #if TORRENT_ABI_VERSION == 1 .add_property("announce_interval", make_getter(&torrent_status::announce_interval, by_value())) #endif .def_readonly("current_tracker", &torrent_status::current_tracker) .def_readonly("total_download", &torrent_status::total_download) .def_readonly("total_upload", &torrent_status::total_upload) .def_readonly("total_payload_download", &torrent_status::total_payload_download) .def_readonly("total_payload_upload", &torrent_status::total_payload_upload) .def_readonly("total_failed_bytes", &torrent_status::total_failed_bytes) .def_readonly("total_redundant_bytes", &torrent_status::total_redundant_bytes) .def_readonly("download_rate", &torrent_status::download_rate) .def_readonly("upload_rate", &torrent_status::upload_rate) .def_readonly("download_payload_rate", &torrent_status::download_payload_rate) .def_readonly("upload_payload_rate", &torrent_status::upload_payload_rate) .def_readonly("num_seeds", &torrent_status::num_seeds) .def_readonly("num_peers", &torrent_status::num_peers) .def_readonly("num_complete", &torrent_status::num_complete) .def_readonly("num_incomplete", &torrent_status::num_incomplete) .def_readonly("list_seeds", &torrent_status::list_seeds) .def_readonly("list_peers", &torrent_status::list_peers) .def_readonly("connect_candidates", &torrent_status::connect_candidates) .add_property("pieces", make_getter(&torrent_status::pieces, by_value())) .add_property("verified_pieces", make_getter(&torrent_status::verified_pieces, by_value())) .def_readonly("num_pieces", &torrent_status::num_pieces) .def_readonly("total_done", &torrent_status::total_done) .def_readonly("total", &torrent_status::total) .def_readonly("total_wanted_done", &torrent_status::total_wanted_done) .def_readonly("total_wanted", &torrent_status::total_wanted) .def_readonly("distributed_full_copies", &torrent_status::distributed_full_copies) .def_readonly("distributed_fraction", &torrent_status::distributed_fraction) .def_readonly("distributed_copies", &torrent_status::distributed_copies) .def_readonly("block_size", &torrent_status::block_size) .def_readonly("num_uploads", &torrent_status::num_uploads) .def_readonly("num_connections", &torrent_status::num_connections) .def_readonly("uploads_limit", &torrent_status::uploads_limit) .def_readonly("connections_limit", &torrent_status::connections_limit) .def_readonly("storage_mode", &torrent_status::storage_mode) .def_readonly("up_bandwidth_queue", &torrent_status::up_bandwidth_queue) .def_readonly("down_bandwidth_queue", &torrent_status::down_bandwidth_queue) .def_readonly("all_time_upload", &torrent_status::all_time_upload) .def_readonly("all_time_download", &torrent_status::all_time_download) .def_readonly("seed_rank", &torrent_status::seed_rank) .def_readonly("has_incoming", &torrent_status::has_incoming) #if TORRENT_ABI_VERSION == 1 .def_readonly("seed_mode", &torrent_status::seed_mode) .def_readonly("upload_mode", &torrent_status::upload_mode) .def_readonly("share_mode", &torrent_status::share_mode) .def_readonly("super_seeding", &torrent_status::super_seeding) .def_readonly("active_time", &torrent_status::active_time) .def_readonly("finished_time", &torrent_status::finished_time) .def_readonly("seeding_time", &torrent_status::seeding_time) .def_readonly("last_scrape", &torrent_status::last_scrape) .def_readonly("error", &torrent_status::error) .def_readonly("priority", &torrent_status::priority) .def_readonly("time_since_upload", &torrent_status::time_since_upload) .def_readonly("time_since_download", &torrent_status::time_since_download) #endif .def_readonly("errc", &torrent_status::errc) .add_property("error_file", make_getter(&torrent_status::error_file, by_value())) .def_readonly("name", &torrent_status::name) .def_readonly("save_path", &torrent_status::save_path) .def_readonly("added_time", &torrent_status::added_time) .def_readonly("completed_time", &torrent_status::completed_time) .def_readonly("last_seen_complete", &torrent_status::last_seen_complete) .add_property("queue_position", make_getter(&torrent_status::queue_position, by_value())) .def_readonly("need_save_resume", &torrent_status::need_save_resume) #if TORRENT_ABI_VERSION == 1 .def_readonly("ip_filter_applies", &torrent_status::ip_filter_applies) #endif .def_readonly("moving_storage", &torrent_status::moving_storage) #if TORRENT_ABI_VERSION == 1 .def_readonly("is_loaded", &torrent_status::is_loaded) #endif .def_readonly("announcing_to_trackers", &torrent_status::announcing_to_trackers) .def_readonly("announcing_to_lsd", &torrent_status::announcing_to_lsd) .def_readonly("announcing_to_dht", &torrent_status::announcing_to_dht) #if TORRENT_ABI_VERSION < 3 .def_readonly("info_hash", &torrent_status::info_hash) #endif .def_readonly("info_hashes", &torrent_status::info_hashes) .add_property("last_upload", make_getter(&torrent_status::last_upload, by_value())) .add_property("last_download", make_getter(&torrent_status::last_download, by_value())) .add_property("active_duration", make_getter(&torrent_status::active_duration, by_value())) .add_property("finished_duration", make_getter(&torrent_status::finished_duration, by_value())) .add_property("seeding_duration", make_getter(&torrent_status::seeding_duration, by_value())) .add_property("flags", make_getter(&torrent_status::flags, by_value())) ; enum_("states") #if TORRENT_ABI_VERSION == 1 .value("queued_for_checking", torrent_status::queued_for_checking) #endif .value("checking_files", torrent_status::checking_files) .value("downloading_metadata", torrent_status::downloading_metadata) .value("downloading", torrent_status::downloading) .value("finished", torrent_status::finished) .value("seeding", torrent_status::seeding) #if TORRENT_ABI_VERSION == 1 .value("allocating", torrent_status::allocating) #endif .value("checking_resume_data", torrent_status::checking_resume_data) .export_values() ; } libtorrent-rasterbar-2.0.5/bindings/CMakeLists.txt0000664000175000017500000000006714152763504021232 0ustar arvidarvidif (python-bindings) add_subdirectory(python) endif() libtorrent-rasterbar-2.0.5/COPYING0000664000175000017500000000276414152763504015736 0ustar arvidarvidCopyright (c) 2003-2020, Arvid Norberg All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Rasterbar Software nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. libtorrent-rasterbar-2.0.5/tools/0000755000175000017500000000000014152763504016030 5ustar arvidarvidlibtorrent-rasterbar-2.0.5/tools/parse_session_stats.py0000775000175000017500000005766514152763504022525 0ustar arvidarvid#!/usr/bin/env python3 # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 from __future__ import print_function # Copyright (c) 2016, Arvid Norberg # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the distribution. # * Neither the name of the author nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # this script can parse and generate reports from the alert log from a # libtorrent session import os import sys import math from multiprocessing.pool import ThreadPool thread_pool = ThreadPool(8) output_dir = 'session_stats_report' stat = open(sys.argv[1]) line = stat.readline() print('looking for stats header') while 'session stats header:' not in line: line = stat.readline() print('found') keys = line.split('session stats header:')[1].strip().split(', ') try: os.mkdir(output_dir) except Exception: pass data_out = open(os.path.join(output_dir, 'counters.dat'), 'w+') idx = 0 for line in stat: if 'session stats (' not in line: continue data_out.write(("%d\t" % idx) + line.split(' values): ')[1].strip().replace(', ', '\t') + '\n') idx += 1 data_out.close() line_graph = 0 histogram = 1 stacked = 2 diff = 3 graph_colors = [] pattern = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 0, 1], [0, 1, 1], [1, 1, 0]] def process_color(c, op): for i in range(3): if op == 0: c[i] = min(255, c[i] + 0xb0) if op == 2: c[i] = max(0, c[i] - 0x50) return c for i in range(0, len(pattern) * 3): op = i / len(pattern) c = list(pattern[i % len(pattern)]) for j in range(3): c[j] *= 0xff c = process_color(c, op) c = '#%02x%02x%02x' % (c[0], c[1], c[2]) graph_colors.append(c) line_colors = list(graph_colors) line_colors.reverse() gradient16_colors = [] for i in range(0, 16): f = i / 16. pi = 3.1415927 r = max(int(255 * (math.sin(f * pi) + 0.2)), 0) g = max(int(255 * (math.sin((f - 0.5) * pi) + 0.2)), 0) b = max(int(255 * (math.sin((f + 0.5) * pi) + 0.2)), 0) c = '#%02x%02x%02x' % (min(r, 255), min(g, 255), min(b, 255)) gradient16_colors.append(c) gradient18_colors = [] for i in range(0, 18): f = i / 18. pi = 3.1415927 r = max(int(255 * (math.sin(f * pi) + 0.2)), 0) g = max(int(255 * (math.sin((f - 0.5) * pi) + 0.2)), 0) b = max(int(255 * (math.sin((f + 0.5) * pi) + 0.2)), 0) c = '#%02x%02x%02x' % (min(r, 255), min(g, 255), min(b, 255)) gradient18_colors.append(c) gradient6_colors = [] for i in range(0, 6): f = i / 6. c = '#%02x%02x%02x' % (min(int(255 * (-2 * f + 2)), 255), min(int(255 * (2 * f)), 255), 100) gradient6_colors.append(c) def plot_fun(script): try: ret = os.system('gnuplot "%s" 2>/dev/null' % script) except Exception as e: print('please install gnuplot: sudo apt install gnuplot') raise e if ret != 0 and ret != 256: print('gnuplot failed: %d\n' % ret) raise Exception("abort") sys.stdout.write('.') sys.stdout.flush() def to_title(key): return key.replace('_', ' ').replace('.', ' - ') def gen_report(name, unit, lines, short_unit, generation, log_file, options): filename = os.path.join(output_dir, '%s_%04d.png' % (name, generation)) thumb = os.path.join(output_dir, '%s_%04d_thumb.png' % (name, generation)) # don't re-render a graph unless the logfile has changed try: dst1 = os.stat(filename) dst2 = os.stat(thumb) src = os.stat(log_file) if dst1.st_mtime > src.st_mtime and dst2.st_mtime > src.st_mtime: sys.stdout.write('.') return None except Exception: pass script = os.path.join(output_dir, '%s_%04d.gnuplot' % (name, generation)) out = open(script, 'w') print("set term png size 1200,700", file=out) print('set output "%s"' % filename, file=out) if 'allow-negative' not in options: print('set yrange [0:*]', file=out) print("set tics nomirror", file=out) print("set key box", file=out) print("set key left top", file=out) colors = graph_colors if options['type'] == line_graph: colors = line_colors try: if options['colors'] == 'gradient16': colors = gradient16_colors elif options['colors'] == 'gradient6': colors = gradient6_colors if options['colors'] == 'gradient18': colors = gradient18_colors except Exception: pass if options['type'] == histogram: binwidth = options['binwidth'] numbins = int(options['numbins']) print('binwidth=%f' % binwidth, file=out) print('set boxwidth binwidth', file=out) print('bin(x,width)=width*floor(x/width) + binwidth/2', file=out) print('set xrange [0:%f]' % (binwidth * numbins), file=out) print('set xlabel "%s"' % unit, file=out) print('set ylabel "number"', file=out) k = lines[0] try: column = keys.index(k) + 2 except Exception: print('"%s" not found' % k) return print('plot "%s" using (bin($%d,binwidth)):(1.0) smooth freq with boxes' % (log_file, column), file=out) print('', file=out) print('', file=out) print('', file=out) elif options['type'] == stacked: print('set xrange [0:*]', file=out) print('set ylabel "%s"' % unit, file=out) print('set xlabel "time (s)"', file=out) print('set format y "%%.1s%%c%s";' % short_unit, file=out) print('set style fill solid 1.0 noborder', file=out) print('plot', end=' ', file=out) first = True graph = '' plot_expression = '' color = 0 for k in lines: try: column = keys.index(k) + 2 except Exception: print('"%s" not found' % k) continue if not first: plot_expression = ', ' + plot_expression graph += '+' axis = 'x1y1' graph += '$%d' % column plot_expression = ' "%s" using 1:(%s) title "%s" axes %s with filledcurves x1 lc rgb "%s"' % ( log_file, graph, to_title(k), axis, colors[color % len(colors)]) + plot_expression first = False color += 1 print(plot_expression, file=out) elif options['type'] == diff: print('set xrange [0:*]', file=out) print('set ylabel "%s"' % unit, file=out) print('set xlabel "time (s)"', file=out) print('set format y "%%.1s%%c%s";' % short_unit, file=out) first = True graph = '' title = '' for k in lines: try: column = keys.index(k) + 2 except Exception: print('"%s" not found' % k) continue if not first: graph += '-' title += ' - ' graph += '$%d' % column title += to_title(k) first = False print('plot "%s" using 1:(%s) title "%s" with step' % (log_file, graph, title), file=out) else: print('set xrange [0:*]', file=out) print('set ylabel "%s"' % unit, file=out) print('set xlabel "time (s)"', file=out) print('set format y "%%.1s%%c%s";' % short_unit, file=out) print('plot', end=' ', file=out) first = True color = 0 for k in lines: try: column = keys.index(k) + 2 except Exception: print('"%s" not found' % k) continue if not first: print(', ', end=' ', file=out) axis = 'x1y1' print(' "%s" using 1:%d title "%s" axes %s with steps lc rgb "%s"' % (log_file, column, to_title(k), axis, colors[color % len(colors)]), end=' ', file=out) first = False color += 1 print('', file=out) print('set term png size 150,100', file=out) print('set output "%s"' % thumb, file=out) print('set key off', file=out) print('unset tics', file=out) print('set format x ""', file=out) print('set format y ""', file=out) print('set xlabel ""', file=out) print('set ylabel ""', file=out) print('set y2label ""', file=out) print('set rmargin 0', file=out) print('set lmargin 0', file=out) print('set tmargin 0', file=out) print('set bmargin 0', file=out) print("replot", file=out) out.close() return script def gen_html(reports, generations): file = open(os.path.join(output_dir, 'index.html'), 'w+') css = '''img { margin: 0} #head { display: block } #graphs { white-space:nowrap; } h1 { line-height: 1; display: inline } h2 { line-height: 1; display: inline; font-size: 1em; font-weight: normal};''' print('' % css, file=file) for i in reports: print('
libtorrent logo

libtorrent python binding

Version: 2.0.5

building

libtorrent can be built as a python module.

The best way to build the python bindings is using setup.py. This invokes b2 under the hood, so you must have all of libtorrent's build dependencies installed.

If you just want to build the shared library python extension without python packaging semantics, you can also invoke b2 directly.

prerequisites

Whether building with setup.py or directly invoking b2, you must install the build prerequisites on your system:

  1. All the build prerequisites for the main libtorrent library, including boost libraries and b2, and your building toolchain (gcc, visual studio, etc).
  2. Boost.Python, if not otherwise included in your boost installation
  3. Python 3.6+. Older versions may work, but are not tested.

environment variables

b2 is very sensitive to environment variables. At least the following are required:

  1. BOOST_ROOT
  2. BOOST_BUILD_PATH

b2 is also known to reference dozens of other environment variables when detecting toolsets. Keep this in mind if you are building in an isolation environment like tox.

building with setup.py

By default, setup.py will invoke b2 to build libtorrent:

python setup.py build

setup.py is a normal distutils-based setup script.

To install into your python environment:

python setup.py install

To build a binary wheel package:

python -m pip install wheel
python setup.py bdist_wheel

build for a different python version

setup.py will target the running interpreter. To build for different python versions, you must change how you invoke setup.py:

# build for python3.6
python3.6 setup.py build
# build for python3.7
python3.7 setup.py build

customizing the build

You can customize the build by passing options to the build_ext step of setup.py by passing arguments directly to b2 via --b2-args=:

python setup.py build_ext --b2-args="toolset=msvc-14.2 linkflags=-L../../src/.libs"

For a full list of b2 build options, see libtorrent build features.

Here, it's important to note that build_ext has no "memory" of the build config and arguments you passed to it before. This is different from the way distutils normally works. Consider:

python setup.py build_ext --b2-args="optimization=space"
# the following will build with DEFAULT optimization
python setup.py install

In order to customize the build and run other steps like installation, you should run the steps inline with build_ext:

python setup.py build_ext --b2-args="optimization=space" install

building with b2

You will need to update your user-config.jam so b2 can find your python installation.

b2 has some auto-detection capabilities. You may be able to do just this:

using python : 3.6 ;

However you may need to specify full paths. On windows, it make look like this:

using python : 3.6 : C:/Users/<UserName>/AppData/Local/Programs/Python/Python36 : C:/Users/<UserName>/AppData/Local/Programs/Python/Python36/include : C:/Users/<UserName>/AppData/Local/Programs/Python/Python36/libs ;

Or on Linux, like this:

using python : 3.6 : /usr/bin/python3.6 : /usr/include/python3.6 : /usr/lib/python3.6 ;

Note that b2's python path detection is known to only work for global python installations. It is known to be broken for virtualenvs or pyenv. If you are using pyenv to manage your python versions, you must specify full include and library paths yourself.

invoking b2

Build the bindings like so:

cd bindings/python
b2 release python=3.6 address-model=64

Note that address-model should match the python installation you are building for.

For other build features, see libtorrent build options.

static linking

A python module is a shared library. Specifying link=static when building the binding won't work, as it would try to produce a static library.

Instead, control whether the libtorrent main library or boost is linked statically with libtorrent-link=static and boost-link=static respectively.

By default both are built and linked as shared libraries.

Building and linking boost as static library is only possibly by building it from source. Specify the BOOST_ROOT environment variable to point to the root directory of the boost source distribution.

For example, to build a self-contained python module:

b2 release python=3.6 libtorrent-link=static boost-link=static

helper targets

There are some targets for placing the build artifact in a helpful location:

$ b2 release python=3.6 stage_module stage_dependencies

This will produce a libtorrent python module in the current directory (file name extension depends on operating system). The libraries the python module depends on will be copied into ./dependencies.

To install the python module, build it with the following command:

b2 release python=3.6 install_module

By default the module will be installed to the python user site. This can be changed with the python-install-scope feature. The valid values are user (default) and system. e.g.:

b2 release python=3.6 install_module python-install-scope=system

To specify a custom installation path for the python module, specify the desired path with the python-install-path feature. e.g.:

b2 release python=3.6 install_module python-install-path=/home/foobar/python-site/

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.
lt::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::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.

To get a python dictionary of the settings, call session::get_settings.

Retrieving session statistics in Python is more convenient than that in C++. The statistics are stored as an array in session_stats_alert, which will be posted after calling post_session_stats() in the session object. In order to interpret the statistics array, in C++ it is required to call session_stats_metrics() to get the indices of these metrics, while in Python it can be done using session_stats_alert.values["NAME_OF_METRIC"], where NAME_OF_METRIC is the name of a metric.

set_alert_notify

The set_alert_notify() function is not compatible with python. Since it requires locking the GIL from within the libtorrent thread, to call the callback, it can cause a deadlock with the main thread.

Instead, use the python-specific set_alert_fd() which takes a file descriptor that will have 1 byte written to it to notify the client that there are new alerts to be popped.

The file descriptor should be set to non-blocking mode. If writing to the file/sending to the socket blocks, libtorrent's internal thread will stall.

This can be used with socket.socketpair(), for example. The file descriptor is what fileno() returns on a socket.

Example

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
import sys

ses = lt.session({'listen_interfaces': '0.0.0.0:6881'})

info = lt.torrent_info(sys.argv[1])
h = ses.add_torrent({'ti': info, 'save_path': '.'})
s = h.status()
print('starting', s.name)

while (not s.is_seeding):
    s = h.status()

    print('\r%.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, s.state), end=' ')

    alerts = ses.pop_alerts()
    for a in alerts:
        if a.category() & lt.alert.category_t.error_notification:
            print(a)

    sys.stdout.flush()

    time.sleep(1)

print(h.status().name, 'complete')