[tor-commits] [sbws/master] docs: Add code design documentation

juga at torproject.org juga at torproject.org
Sat Feb 23 10:57:26 UTC 2019


commit 3ad41163e7c7078e89ec40829209a1e1585441ce
Author: juga0 <juga at riseup.net>
Date:   Tue Feb 12 09:56:46 2019 +0000

    docs: Add code design documentation
---
 docs/source/classes_original.puml        | 220 +++++++++++++
 docs/source/code_design.rst              |  60 ++++
 docs/source/data/critical_sections.dia   | Bin 0 -> 3540 bytes
 docs/source/diagrams.rst                 |  16 -
 docs/source/images/classes_original.svg  |   1 +
 docs/source/images/classes_sbws.svg      | 246 ---------------
 docs/source/images/critical_sections.svg | 516 +++++++++++++++++++++++++++++++
 docs/source/images/pycallgraph.png       | Bin 0 -> 381993 bytes
 docs/source/images/threads.svg           |   1 +
 docs/source/threads.puml                 |  23 ++
 10 files changed, 821 insertions(+), 262 deletions(-)

diff --git a/docs/source/classes_original.puml b/docs/source/classes_original.puml
new file mode 100644
index 0000000..4318db3
--- /dev/null
+++ b/docs/source/classes_original.puml
@@ -0,0 +1,220 @@
+ at startuml
+
+class RelayList {
+  stem.Controller _controller
+  Lock _refresh_lock
+  int _last_refresh
+  list @p relays
+  list @p bad_exits
+  list @p exits
+  list @p non_exits
+  list @p authorities
+  bool _need_refresh()
+  _init_relays()
+  _refresh()
+  list _relays_with_flag(int flag)
+  list _relays_without_flag(int flag)
+  list exits_not_bad_can_exit_to_port(int port)
+}
+RelayList *-- Relay
+class Relay {
+  stem.RouterStatusEntryV3 _from_ns
+  stem.RelayDescriptor _from_desc
+  str @p nickname
+  str @p fingerprint
+  list @p flags
+  ExitPolicy @p exit_policy
+  str @p address
+  str @p master_key_ed25519
+  int @p observed_bandwidth
+  int @p average_bandwidth
+  int @p burst_bandwidth
+  int @p consensus_bandwidth
+  int @p consensus_bandwidth_is_unmeasured
+  obj _from_ns(attr)
+  obj _from_desc(attr)
+  bool can_exit_to_port(int port)
+  bool is_exit_not_bad_allowing_port(int port)
+}
+class RelayPrioritizer {
+  int fresh_seconds
+  ResultDump result_dump
+  RelayList relay_list
+  bool measure_authorities
+  generator best_priority()
+}
+RelayPrioritizer *-- RelayList
+RelayPrioritizer *-- ResultDump
+Result ^-- ResultError
+Result ^-- ResultSuccess
+Result -- Destination
+class Result {
+  Result.Relay _relay
+  list @p circ
+  str @p dest_url
+  str @p scanner
+  int @p time
+  str @p type
+  int @p version
+  str @p nickname
+  str @p fingerprint
+  str @p address
+  str @p master_key_ed25519
+  int @p relay_observed_bandwidth
+  int @p relay_average_bandwidth
+  int @p relay_burst_bandwidth
+  int @p consensus_bandwidth
+  int @p consensus_bandwidth_is_unmeasured
+  dict to_dict()
+  Result from_dict(dict d)
+}
+Result -- Relay
+Result *-- Result.Relay
+class Result.Relay {
+  str nickname
+  str fingerprint
+  str address
+  str master_key_ed25519
+  int observed_bandwidth
+  int average_bandwidth
+  int burst_bandwidth
+  int consensus_bandwidth
+  int consensus_bandwidth_is_unmeasured
+}
+class ResultError {
+  str @p msg
+}
+ResultError ^-- ResultErrorCircuit
+class ResultErrorCircuit {
+}
+ResultError ^-- ResultErrorStream
+class ResultSuccess {
+  list @p rtts
+  list @p downloads
+}
+ResultDump *-- Result
+ResultDump -- Relay
+class ResultDump {
+  dict data
+  int fresh_days
+  str datadir
+  Lock data_lock
+  Thread thread
+  Queue queue
+  store_result(Result result)
+  handle_result(Result result)
+  enter()
+  list results_for_relay(Relay relay)
+}
+class DestinationList {
+  list _rl
+  Destination next()
+  DestinationList @sm from_config(...)
+}
+DestinationList *-- Destination
+class Destination {
+  str @p hostname
+  int @p port
+  str @p url
+  bool @p verify
+  bool is_usable()
+  Destination @sm from_config(str conf_section,int max_dl)
+}
+V3BWHeader -- Result
+class V3BWHeader {
+  int timestamp
+  str version
+  str file_created
+  str latest_bandwidth
+  int num_lines
+  str software
+  str software_version
+  str generator_started
+  int number_eligible_relays
+  int minimum_number_eligible_relays
+  int number_consensus_relays
+  int percent_eligible_relays
+  int minimum_percent_eligible_relays
+  int @p num_lines
+
+  V3BWHeader @cm from_results(dict results)
+  add_stats(**kwargs)
+  int @sm earliest_bandwidth_from_results(dict results)
+  str @sm generator_started_from_file(dict results)
+  int @sm latest_bandwidth_from_results(dict results)
+}
+V3BWLine -- Result
+class V3BWLine {
+  int bw
+  str node_id
+  str master_key_ed25519
+  str nick
+  int rtt
+  str time
+  int success
+  int error_stream
+  int error_circ
+  int error_misc
+  int bw_median
+  int bw_mean
+  int desc_bw_avg
+  int desc_bw_bur
+  int desc_bw_obs_last
+  int desc_bw_obs_mean
+  consensus_bandwidth
+  consensus_bandwidth_is_unmeasured
+
+  int @sm bw_mean_from_results(list results)
+  int @sm bw_median_from_results(list results)
+  int @sm desc_bw_obs_last_from_results(list results)
+  int @sm desc_bw_obs_mean_from_results(list results)
+  V3BWLine @cm from_results(list results)
+  str @sm last_time_from_results(list results)
+  dict @sm result_types_from_results(list results)
+  list @sm results_away_each_other(list results)
+  list @sm results_recent_than(list results)
+}
+V3BWFile *-- V3BWHeader
+V3BWFile *-- V3BWLine
+V3BWFile -- Result
+class V3BWFile {
+  V3BWHeader header
+  list bw_lines
+  @p info_stats
+  bool @p is_min_perc
+  int @p max_bw
+  int @p mean_bw
+  int @p median_bw
+  int @p min_bw
+  int @p num
+  int @p sum_bw
+  V3BWFile @cm from_results(dict results, ...)
+  list @sm bw_kb(bw_lines)
+  list @sm bw_sbws_scale(bw_lines)
+  list @sm bw_torflow_scale(bw_lines)
+  bool @sm is_max_bw_diff_perc_reached(bw_lines)
+  (dict, bool) @sm measured_progress_stats(bw_lines)
+  int @sm read_number_consensus_relays(str consensus_path)
+  (list, list, list) to_plt()
+  list update_progress(bw_lines, ...)
+  warn_if_not_accurate_enough(bw_lines, ...)
+  tuple to_plt(...)
+  write(str output)
+}
+CircuitBuilder *-- RelayList
+CircuitBuilder -- Relay
+class CircuitBuilder {
+  set built_circuits
+  RelayList relay_list
+  list relays
+  Controller controller
+  int build_circuit()
+  void close_circuit()
+}
+CircuitBuilder ^-- GapsCircuitBuilder
+
+class State {
+  get()
+}
+
+ at enduml
\ No newline at end of file
diff --git a/docs/source/code_design.rst b/docs/source/code_design.rst
new file mode 100644
index 0000000..5722447
--- /dev/null
+++ b/docs/source/code_design.rst
@@ -0,0 +1,60 @@
+Code design
+=================
+
+.. todo::
+   - Link to refactor proposal.
+   - Change this page when refactoring is implemented.
+
+UML classes diagram
+--------------------
+
+.. image:: images/classes_original.*
+   :alt: UML classes diagram
+
+`classes_original.svg <./_images/classes_original.svg>`_
+
+Packages diagram
+-----------------
+
+.. image:: ./images/packages_sbws.*
+   :alt: packages diagram
+
+`packages_sbws.svg <./_images/packages_sbws.svg>`_
+
+scanner threads
+----------------
+
+- `TorEventListener`: the thread that runs Tor and listens for events.
+- ResultDump: the thread that get the measurement results from a queue
+  every second.
+- `multiprocessing.ThreadPool` starts 3 independent threads:
+  - workers_thread
+  - tasks_thread
+  - results_thread
+- measurement threads: they execute :func:`sbws.core.scanner.measure_relay`
+  There'll be a maximum of 3 by default.
+
+.. image:: images/threads.*
+   :alt: scanner threads
+
+Critical sections
+-----------------
+
+Data types that are read or wrote from the threads.
+
+.. image:: images/critical_sections.*
+   :alt: scanner critical sections
+   :height: 400px
+   :align: center
+
+Call graph
+--------------
+
+Initialization calls to the moment where the measurement threads start.
+
+.. image:: images/pycallgraph.png
+   :alt: call graph
+   :height: 400px
+   :align: center
+
+`callgraph.png <./_images/pycallgraph.png>`_
diff --git a/docs/source/data/critical_sections.dia b/docs/source/data/critical_sections.dia
new file mode 100644
index 0000000..8f1a01b
Binary files /dev/null and b/docs/source/data/critical_sections.dia differ
diff --git a/docs/source/diagrams.rst b/docs/source/diagrams.rst
deleted file mode 100644
index ec18ed3..0000000
--- a/docs/source/diagrams.rst
+++ /dev/null
@@ -1,16 +0,0 @@
-UML diagrams
-=============
-
-Class Diagram
---------------------
-
-.. image:: ./images/classes_sbws.*
-
-`classes_sbws.svg <./_images/classes_sbws.svg>`_
-
-Packages diagram
------------------
-
-.. image:: ./images/packages_sbws.*
-
-`packages_sbws.svg <./_images/packages_sbws.svg>`_
\ No newline at end of file
diff --git a/docs/source/images/classes_original.svg b/docs/source/images/classes_original.svg
new file mode 100644
index 0000000..d894dd6
--- /dev/null
+++ b/docs/source/images/classes_original.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1573px" preserveAspectRatio="none" style="width:1542px;height:1573px;" version="1.1" viewBox="0 0 1542 1573" width="1542px" zoomAndPan="magnify"><defs><filter height="300%" id="f17ckm9" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><!--class RelayList--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="227.2656" style="stroke: #A80036; stroke-width: 1.5;" width="258" x="1023" y="877.5"/><ellipse cx="1120.75" cy="893.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;
 "/><path d="M1123.7188,899.1406 Q1123.1406,899.4375 1122.5,899.5859 Q1121.8594,899.7344 1121.1563,899.7344 Q1118.6563,899.7344 1117.3359,898.0859 Q1116.0156,896.4375 1116.0156,893.3125 Q1116.0156,890.1875 1117.3359,888.5313 Q1118.6563,886.875 1121.1563,886.875 Q1121.8594,886.875 1122.5078,887.0313 Q1123.1563,887.1875 1123.7188,887.4844 L1123.7188,890.2031 Q1123.0938,889.625 1122.5,889.3516 Q1121.9063,889.0781 1121.2813,889.0781 Q1119.9375,889.0781 1119.25,890.1484 Q1118.5625,891.2188 1118.5625,893.3125 Q1118.5625,895.4063 1119.25,896.4766 Q1119.9375,897.5469 1121.2813,897.5469 Q1121.9063,897.5469 1122.5,897.2734 Q1123.0938,897 1123.7188,896.4219 L1123.7188,899.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="54" x="1141.25" y="897.6543">RelayList</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1024" x2="1280" y1="909.5" y2="909.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="
 spacingAndGlyphs" textLength="153" x="1029" y="923.7104">stem.Controller _controller</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1029" y="936.5151">Lock _refresh_lock</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1029" y="949.3198">int _last_refresh</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="1029" y="962.1245">list @p relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="1029" y="974.9292">list @p bad_exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="71" x="1029" y="987.7339">list @p exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="1029" y="1000.5386">list
  @p non_exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1029" y="1013.3433">list @p authorities</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1024" x2="1280" y1="1019.9375" y2="1019.9375"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="1029" y="1034.1479">bool _need_refresh()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="1029" y="1046.9526">_init_relays()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1029" y="1059.7573">_refresh()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="165" x="1029" y="1072.562">list _relays_with_flag(int flag)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAn
 dGlyphs" textLength="183" x="1029" y="1085.3667">list _relays_without_flag(int flag)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="246" x="1029" y="1098.1714">list exits_not_bad_can_exit_to_port(int port)</text><!--class Relay--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="265.6797" style="stroke: #A80036; stroke-width: 1.5;" width="273" x="980.5" y="1190"/><ellipse cx="1096.25" cy="1206" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1099.2188,1211.6406 Q1098.6406,1211.9375 1098,1212.0859 Q1097.3594,1212.2344 1096.6563,1212.2344 Q1094.1563,1212.2344 1092.8359,1210.5859 Q1091.5156,1208.9375 1091.5156,1205.8125 Q1091.5156,1202.6875 1092.8359,1201.0313 Q1094.1563,1199.375 1096.6563,1199.375 Q1097.3594,1199.375 1098.0078,1199.5313 Q1098.6563,1199.6875 1099.2188,1199.9844 L1099.2188,1202.7031 Q1098.5938,1202.125 1098,1201.8516 Q1097.4063,1201.5781 1096.7813,1201.5781 Q1095.4375
 ,1201.5781 1094.75,1202.6484 Q1094.0625,1203.7188 1094.0625,1205.8125 Q1094.0625,1207.9063 1094.75,1208.9766 Q1095.4375,1210.0469 1096.7813,1210.0469 Q1097.4063,1210.0469 1098,1209.7734 Q1098.5938,1209.5 1099.2188,1208.9219 L1099.2188,1211.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="33" x="1116.75" y="1210.1543">Relay</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="981.5" x2="1252.5" y1="1222" y2="1222"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="207" x="986.5" y="1236.2104">stem.RouterStatusEntryV3 _from_ns</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="986.5" y="1249.0151">stem.RelayDescriptor _from_desc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="986.5" y="1261.8198">str @p nickname</text><text
  fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="986.5" y="1274.6245">str @p fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="986.5" y="1287.4292">list @p flags</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="137" x="986.5" y="1300.2339">ExitPolicy @p exit_policy</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="986.5" y="1313.0386">str @p address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="164" x="986.5" y="1325.8433">str @p master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="158" x="986.5" y="1338.6479">int @p observed_bandwidth</text><text fill="#000000" font-family="sans
 -serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="151" x="986.5" y="1351.4526">int @p average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="986.5" y="1364.2573">int @p burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="986.5" y="1377.062">int @p consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="261" x="986.5" y="1389.8667">int @p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="981.5" x2="1252.5" y1="1396.4609" y2="1396.4609"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="986.5" y="1410.6714">obj _from_ns(attr)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" text
 Length="115" x="986.5" y="1423.4761">obj _from_desc(attr)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="169" x="986.5" y="1436.2808">bool can_exit_to_port(int port)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="245" x="986.5" y="1449.0854">bool is_exit_not_bad_allowing_port(int port)</text><!--class RelayPrioritizer--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="112.0234" style="stroke: #A80036; stroke-width: 1.5;" width="158" x="996" y="117"/><ellipse cx="1026.75" cy="133" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1029.7188,138.6406 Q1029.1406,138.9375 1028.5,139.0859 Q1027.8594,139.2344 1027.1563,139.2344 Q1024.6563,139.2344 1023.3359,137.5859 Q1022.0156,135.9375 1022.0156,132.8125 Q1022.0156,129.6875 1023.3359,128.0313 Q1024.6563,126.375 1027.1563,126.375 Q1027.8594,126.375 1028.5078,126.5313 Q1029.156
 3,126.6875 1029.7188,126.9844 L1029.7188,129.7031 Q1029.0938,129.125 1028.5,128.8516 Q1027.9063,128.5781 1027.2813,128.5781 Q1025.9375,128.5781 1025.25,129.6484 Q1024.5625,130.7188 1024.5625,132.8125 Q1024.5625,134.9063 1025.25,135.9766 Q1025.9375,137.0469 1027.2813,137.0469 Q1027.9063,137.0469 1028.5,136.7734 Q1029.0938,136.5 1029.7188,135.9219 L1029.7188,138.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="1044.25" y="137.1543">RelayPrioritizer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="997" x2="1153" y1="149" y2="149"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="1002" y="163.2104">int fresh_seconds</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="143" x="1002" y="176.0151">ResultDump result_dump</text><text fill="#000000" font-family="sans-serif" font-size="11" l
 engthAdjust="spacingAndGlyphs" textLength="105" x="1002" y="188.8198">RelayList relay_list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="146" x="1002" y="201.6245">bool measure_authorities</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="997" x2="1153" y1="208.2188" y2="208.2188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="139" x="1002" y="222.4292">generator best_priority()</text><!--class ResultDump--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="176.0469" style="stroke: #A80036; stroke-width: 1.5;" width="199" x="899.5" y="507"/><ellipse cx="957.25" cy="523" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M960.2188,528.6406 Q959.6406,528.9375 959,529.0859 Q958.3594,529.2344 957.6563,529.2344 Q955.1563,529.2344 953.8359,527.5859 Q952.5156,525.9375 952.5156,522.8125 Q952.5156,519.6875 953.8359,518.0313 Q
 955.1563,516.375 957.6563,516.375 Q958.3594,516.375 959.0078,516.5313 Q959.6563,516.6875 960.2188,516.9844 L960.2188,519.7031 Q959.5938,519.125 959,518.8516 Q958.4063,518.5781 957.7813,518.5781 Q956.4375,518.5781 955.75,519.6484 Q955.0625,520.7188 955.0625,522.8125 Q955.0625,524.9063 955.75,525.9766 Q956.4375,527.0469 957.7813,527.0469 Q958.4063,527.0469 959,526.7734 Q959.5938,526.5 960.2188,525.9219 L960.2188,528.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="977.75" y="527.1543">ResultDump</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="900.5" x2="1097.5" y1="539" y2="539"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="49" x="905.5" y="553.2104">dict data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="905.5" y="566.0151">int fresh_days</text><text fill="#000000" font-
 family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="60" x="905.5" y="578.8198">str datadir</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="905.5" y="591.6245">Lock data_lock</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="905.5" y="604.4292">Thread thread</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="905.5" y="617.2339">Queue queue</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="900.5" x2="1097.5" y1="623.8281" y2="623.8281"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="905.5" y="638.0386">store_result(Result result)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="157" x="905.5" y="650.8433">handle_result(Re
 sult result)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="38" x="905.5" y="663.6479">enter()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="187" x="905.5" y="676.4526">list results_for_relay(Relay relay)</text><!--class Result--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="278.4844" style="stroke: #A80036; stroke-width: 1.5;" width="273" x="564.5" y="852"/><ellipse cx="677.25" cy="868" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M680.2188,873.6406 Q679.6406,873.9375 679,874.0859 Q678.3594,874.2344 677.6563,874.2344 Q675.1563,874.2344 673.8359,872.5859 Q672.5156,870.9375 672.5156,867.8125 Q672.5156,864.6875 673.8359,863.0313 Q675.1563,861.375 677.6563,861.375 Q678.3594,861.375 679.0078,861.5313 Q679.6563,861.6875 680.2188,861.9844 L680.2188,864.7031 Q679.5938,864.125 679,863.8516 Q678.4063,863.5781 677.7813,8
 63.5781 Q676.4375,863.5781 675.75,864.6484 Q675.0625,865.7188 675.0625,867.8125 Q675.0625,869.9063 675.75,870.9766 Q676.4375,872.0469 677.7813,872.0469 Q678.4063,872.0469 679,871.7734 Q679.5938,871.5 680.2188,870.9219 L680.2188,873.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="39" x="697.75" y="872.1543">Result</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="565.5" x2="836.5" y1="884" y2="884"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="570.5" y="898.2104">Result.Relay _relay</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="570.5" y="911.0151">list @p circ</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="570.5" y="923.8198">str @p dest_url</text><text fill="#000000" font-family="sans-serif" font-siz
 e="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="570.5" y="936.6245">str @p scanner</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="570.5" y="949.4292">int @p time</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="570.5" y="962.2339">str @p type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="570.5" y="975.0386">int @p version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="570.5" y="987.8433">str @p nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="570.5" y="1000.6479">str @p fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="570.5" y="1013.4526"
 >str @p address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="164" x="570.5" y="1026.2573">str @p master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="570.5" y="1039.062">int @p relay_observed_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="185" x="570.5" y="1051.8667">int @p relay_average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="169" x="570.5" y="1064.6714">int @p relay_burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="570.5" y="1077.4761">int @p consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="261" x="570.5" y="1090.280
 8">int @p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="565.5" x2="836.5" y1="1096.875" y2="1096.875"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="69" x="570.5" y="1111.0854">dict to_dict()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="570.5" y="1123.8901">Result from_dict(dict d)</text><!--class ResultError--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="102" x="668" y="1292.5"/><ellipse cx="683" cy="1308.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M685.9688,1314.1406 Q685.3906,1314.4375 684.75,1314.5859 Q684.1094,1314.7344 683.4063,1314.7344 Q680.9063,1314.7344 679.5859,1313.0859 Q678.2656,1311.4375 678.2656,1308.3125 Q678.2656,1305.1875 679.5859,1303.5313 Q680.9063,1301.875 683.4063,1301.875 Q
 684.1094,1301.875 684.7578,1302.0313 Q685.4063,1302.1875 685.9688,1302.4844 L685.9688,1305.2031 Q685.3438,1304.625 684.75,1304.3516 Q684.1563,1304.0781 683.5313,1304.0781 Q682.1875,1304.0781 681.5,1305.1484 Q680.8125,1306.2188 680.8125,1308.3125 Q680.8125,1310.4063 681.5,1311.4766 Q682.1875,1312.5469 683.5313,1312.5469 Q684.1563,1312.5469 684.75,1312.2734 Q685.3438,1312 685.9688,1311.4219 L685.9688,1314.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="70" x="697" y="1312.6543">ResultError</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="669" x2="769" y1="1324.5" y2="1324.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="674" y="1338.7104">str @p msg</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="669" x2="769" y1="1345.3047" y2="1345.3047"/><!--class ResultSuccess--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="73.6094" styl
 e="stroke: #A80036; stroke-width: 1.5;" width="123" x="805.5" y="1286"/><ellipse cx="820.5" cy="1302" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M823.4688,1307.6406 Q822.8906,1307.9375 822.25,1308.0859 Q821.6094,1308.2344 820.9063,1308.2344 Q818.4063,1308.2344 817.0859,1306.5859 Q815.7656,1304.9375 815.7656,1301.8125 Q815.7656,1298.6875 817.0859,1297.0313 Q818.4063,1295.375 820.9063,1295.375 Q821.6094,1295.375 822.2578,1295.5313 Q822.9063,1295.6875 823.4688,1295.9844 L823.4688,1298.7031 Q822.8438,1298.125 822.25,1297.8516 Q821.6563,1297.5781 821.0313,1297.5781 Q819.6875,1297.5781 819,1298.6484 Q818.3125,1299.7188 818.3125,1301.8125 Q818.3125,1303.9063 819,1304.9766 Q819.6875,1306.0469 821.0313,1306.0469 Q821.6563,1306.0469 822.25,1305.7734 Q822.8438,1305.5 823.4688,1304.9219 L823.4688,1307.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="834.5" y="1306.1543">ResultSucce
 ss</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="806.5" x2="927.5" y1="1318" y2="1318"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="811.5" y="1332.2104">list @p rtts</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="811.5" y="1345.0151">list @p downloads</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="806.5" x2="927.5" y1="1351.6094" y2="1351.6094"/><!--class Destination--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="124.8281" style="stroke: #A80036; stroke-width: 1.5;" width="342" x="6" y="1260.5"/><ellipse cx="136.75" cy="1276.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M139.7188,1282.1406 Q139.1406,1282.4375 138.5,1282.5859 Q137.8594,1282.7344 137.1563,1282.7344 Q134.6563,1282.7344 133.3359,1281.0859 Q132.0156,1279.4375 132.0156,1276.3125 Q132.0156,1273.1875 133.3359,12
 71.5313 Q134.6563,1269.875 137.1563,1269.875 Q137.8594,1269.875 138.5078,1270.0313 Q139.1563,1270.1875 139.7188,1270.4844 L139.7188,1273.2031 Q139.0938,1272.625 138.5,1272.3516 Q137.9063,1272.0781 137.2813,1272.0781 Q135.9375,1272.0781 135.25,1273.1484 Q134.5625,1274.2188 134.5625,1276.3125 Q134.5625,1278.4063 135.25,1279.4766 Q135.9375,1280.5469 137.2813,1280.5469 Q137.9063,1280.5469 138.5,1280.2734 Q139.0938,1280 139.7188,1279.4219 L139.7188,1282.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="72" x="157.25" y="1280.6543">Destination</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="347" y1="1292.5" y2="1292.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="12" y="1306.7104">str @p hostname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="12" y="1319.5151">int @p p
 ort</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="58" x="12" y="1332.3198">str @p url</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="12" y="1345.1245">bool @p verify</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="347" y1="1351.7188" y2="1351.7188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="12" y="1365.9292">bool is_usable()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="330" x="12" y="1378.7339">Destination @sm from_config(str conf_section,int max_dl)</text><!--class Result.Relay--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="163.2422" style="stroke: #A80036; stroke-width: 1.5;" width="250" x="383" y="1241.5"/><ellipse cx="465.75" cy="1257.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A8
 0036; stroke-width: 1.0;"/><path d="M468.7188,1263.1406 Q468.1406,1263.4375 467.5,1263.5859 Q466.8594,1263.7344 466.1563,1263.7344 Q463.6563,1263.7344 462.3359,1262.0859 Q461.0156,1260.4375 461.0156,1257.3125 Q461.0156,1254.1875 462.3359,1252.5313 Q463.6563,1250.875 466.1563,1250.875 Q466.8594,1250.875 467.5078,1251.0313 Q468.1563,1251.1875 468.7188,1251.4844 L468.7188,1254.2031 Q468.0938,1253.625 467.5,1253.3516 Q466.9063,1253.0781 466.2813,1253.0781 Q464.9375,1253.0781 464.25,1254.1484 Q463.5625,1255.2188 463.5625,1257.3125 Q463.5625,1259.4063 464.25,1260.4766 Q464.9375,1261.5469 466.2813,1261.5469 Q466.9063,1261.5469 467.5,1261.2734 Q468.0938,1261 468.7188,1260.4219 L468.7188,1263.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="76" x="486.25" y="1261.6543">Result.Relay</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="384" x2="632" y1="1273.5" y2="1273.5"/><text fill="#000000" font-family="sans-serif" fo
 nt-size="11" lengthAdjust="spacingAndGlyphs" textLength="74" x="389" y="1287.7104">str nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="389" y="1300.5151">str fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="389" y="1313.3198">str address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="141" x="389" y="1326.1245">str master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="389" y="1338.9292">int observed_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="128" x="389" y="1351.7339">int average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x
 ="389" y="1364.5386">int burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="144" x="389" y="1377.3433">int consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="238" x="389" y="1390.1479">int consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="384" x2="632" y1="1396.7422" y2="1396.7422"/><!--class ResultErrorCircuit--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="141" x="559.5" y="1516"/><ellipse cx="574.5" cy="1532" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M577.4688,1537.6406 Q576.8906,1537.9375 576.25,1538.0859 Q575.6094,1538.2344 574.9063,1538.2344 Q572.4063,1538.2344 571.0859,1536.5859 Q569.7656,1534.9375 569.7656,1531.8125 Q569.7656,1528.6875 571.0859,1527.0313 Q572.4063,1525.375 574
 .9063,1525.375 Q575.6094,1525.375 576.2578,1525.5313 Q576.9063,1525.6875 577.4688,1525.9844 L577.4688,1528.7031 Q576.8438,1528.125 576.25,1527.8516 Q575.6563,1527.5781 575.0313,1527.5781 Q573.6875,1527.5781 573,1528.6484 Q572.3125,1529.7188 572.3125,1531.8125 Q572.3125,1533.9063 573,1534.9766 Q573.6875,1536.0469 575.0313,1536.0469 Q575.6563,1536.0469 576.25,1535.7734 Q576.8438,1535.5 577.4688,1534.9219 L577.4688,1537.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="109" x="588.5" y="1536.1543">ResultErrorCircuit</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="560.5" x2="699.5" y1="1548" y2="1548"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="560.5" x2="699.5" y1="1556" y2="1556"/><!--class ResultErrorStream--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="147" x="735.5" y="1516"/><ellipse cx="750.5" cy="1532" fill="#ADD1B2" rx="11" ry="11
 " style="stroke: #A80036; stroke-width: 1.0;"/><path d="M753.4688,1537.6406 Q752.8906,1537.9375 752.25,1538.0859 Q751.6094,1538.2344 750.9063,1538.2344 Q748.4063,1538.2344 747.0859,1536.5859 Q745.7656,1534.9375 745.7656,1531.8125 Q745.7656,1528.6875 747.0859,1527.0313 Q748.4063,1525.375 750.9063,1525.375 Q751.6094,1525.375 752.2578,1525.5313 Q752.9063,1525.6875 753.4688,1525.9844 L753.4688,1528.7031 Q752.8438,1528.125 752.25,1527.8516 Q751.6563,1527.5781 751.0313,1527.5781 Q749.6875,1527.5781 749,1528.6484 Q748.3125,1529.7188 748.3125,1531.8125 Q748.3125,1533.9063 749,1534.9766 Q749.6875,1536.0469 751.0313,1536.0469 Q751.6563,1536.0469 752.25,1535.7734 Q752.8438,1535.5 753.4688,1534.9219 L753.4688,1537.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="115" x="764.5" y="1536.1543">ResultErrorStream</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="736.5" x2="881.5" y1="1548" y2="1548"/><line style="stroke: #A8
 0036; stroke-width: 1.5;" x1="736.5" x2="881.5" y1="1556" y2="1556"/><!--class DestinationList--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="86.4141" style="stroke: #A80036; stroke-width: 1.5;" width="221" x="66.5" y="948"/><ellipse cx="126.25" cy="964" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M129.2188,969.6406 Q128.6406,969.9375 128,970.0859 Q127.3594,970.2344 126.6563,970.2344 Q124.1563,970.2344 122.8359,968.5859 Q121.5156,966.9375 121.5156,963.8125 Q121.5156,960.6875 122.8359,959.0313 Q124.1563,957.375 126.6563,957.375 Q127.3594,957.375 128.0078,957.5313 Q128.6563,957.6875 129.2188,957.9844 L129.2188,960.7031 Q128.5938,960.125 128,959.8516 Q127.4063,959.5781 126.7813,959.5781 Q125.4375,959.5781 124.75,960.6484 Q124.0625,961.7188 124.0625,963.8125 Q124.0625,965.9063 124.75,966.9766 Q125.4375,968.0469 126.7813,968.0469 Q127.4063,968.0469 128,967.7734 Q128.5938,967.5 129.2188,966.9219 L129.2188,969.6406 Z "/><text fill="#000000" f
 ont-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="93" x="146.75" y="968.1543">DestinationList</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="67.5" x2="286.5" y1="980" y2="980"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="72.5" y="994.2104">list _rl</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="67.5" x2="286.5" y1="1000.8047" y2="1000.8047"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="72.5" y="1015.0151">Destination next()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="209" x="72.5" y="1027.8198">DestinationList @sm from_config(...)</text><!--class V3BWHeader--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="291.2891" style="stroke: #A80036; stroke-width: 1.5;" width="322" x="181" y="449.5"/><ellipse cx="297.25" cy="465.5" 
 fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M300.2188,471.1406 Q299.6406,471.4375 299,471.5859 Q298.3594,471.7344 297.6563,471.7344 Q295.1563,471.7344 293.8359,470.0859 Q292.5156,468.4375 292.5156,465.3125 Q292.5156,462.1875 293.8359,460.5313 Q295.1563,458.875 297.6563,458.875 Q298.3594,458.875 299.0078,459.0313 Q299.6563,459.1875 300.2188,459.4844 L300.2188,462.2031 Q299.5938,461.625 299,461.3516 Q298.4063,461.0781 297.7813,461.0781 Q296.4375,461.0781 295.75,462.1484 Q295.0625,463.2188 295.0625,465.3125 Q295.0625,467.4063 295.75,468.4766 Q296.4375,469.5469 297.7813,469.5469 Q298.4063,469.5469 299,469.2734 Q299.5938,469 300.2188,468.4219 L300.2188,471.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="81" x="317.75" y="469.6543">V3BWHeader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="182" x2="502" y1="481.5" y2="481.5"/><text fill="#000000" font-family="sans-serif"
  font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="187" y="495.7104">int timestamp</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="187" y="508.5151">str version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="187" y="521.3198">str file_created</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="116" x="187" y="534.1245">str latest_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="187" y="546.9292">int num_lines</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="187" y="559.7339">str software</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="187" y="572.5386">str
  software_version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="123" x="187" y="585.3433">str generator_started</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="187" y="598.1479">int number_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="208" x="187" y="610.9526">int minimum_number_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="171" x="187" y="623.7573">int number_consensus_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="148" x="187" y="636.562">int percent_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="207" x="187" y="649.3667">int minimum_percen
 t_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="99" x="187" y="662.1714">int @p num_lines</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="182" x2="502" y1="668.7656" y2="668.7656"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="187" y="682.9761">V3BWHeader @cm from_results(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="117" x="187" y="695.7808">add_stats(**kwargs)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="310" x="187" y="708.5854">int @sm earliest_bandwidth_from_results(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="285" x="187" y="721.3901">str @sm generator_started_from_file(dict results)</text><text fil
 l="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="299" x="187" y="734.1948">int @sm latest_bandwidth_from_results(dict results)</text><!--class V3BWLine--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="393.7266" style="stroke: #A80036; stroke-width: 1.5;" width="326" x="538" y="398"/><ellipse cx="666.75" cy="414" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M669.7188,419.6406 Q669.1406,419.9375 668.5,420.0859 Q667.8594,420.2344 667.1563,420.2344 Q664.6563,420.2344 663.3359,418.5859 Q662.0156,416.9375 662.0156,413.8125 Q662.0156,410.6875 663.3359,409.0313 Q664.6563,407.375 667.1563,407.375 Q667.8594,407.375 668.5078,407.5313 Q669.1563,407.6875 669.7188,407.9844 L669.7188,410.7031 Q669.0938,410.125 668.5,409.8516 Q667.9063,409.5781 667.2813,409.5781 Q665.9375,409.5781 665.25,410.6484 Q664.5625,411.7188 664.5625,413.8125 Q664.5625,415.9063 665.25,416.9766 Q665.9375,418.0469 667.2813,418.0469 Q667
 .9063,418.0469 668.5,417.7734 Q669.0938,417.5 669.7188,416.9219 L669.7188,419.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="60" x="687.25" y="418.1543">V3BWLine</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="539" x2="863" y1="430" y2="430"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="544" y="444.2104">int bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="544" y="457.0151">str node_id</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="141" x="544" y="469.8198">str master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="544" y="482.6245">str nick</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spa
 cingAndGlyphs" textLength="31" x="544" y="495.4292">int rtt</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="45" x="544" y="508.2339">str time</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="65" x="544" y="521.0386">int success</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="94" x="544" y="533.8433">int error_stream</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="544" y="546.6479">int error_circ</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="80" x="544" y="559.4526">int error_misc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="544" y="572.2573">int bw_median</text><text fill="#000000" font-family=
 "sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="544" y="585.062">int bw_mean</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="544" y="597.8667">int desc_bw_avg</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="92" x="544" y="610.6714">int desc_bw_bur</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="121" x="544" y="623.4761">int desc_bw_obs_last</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="132" x="544" y="636.2808">int desc_bw_obs_mean</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="126" x="544" y="649.0854">consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="2
 20" x="544" y="661.8901">consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="539" x2="863" y1="668.4844" y2="668.4844"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="544" y="682.6948">int @sm bw_mean_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="264" x="544" y="695.4995">int @sm bw_median_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="303" x="544" y="708.3042">int @sm desc_bw_obs_last_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="314" x="544" y="721.1089">int @sm desc_bw_obs_mean_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" te
 xtLength="233" x="544" y="733.9136">V3BWLine @cm from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="544" y="746.7183">str @sm last_time_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="276" x="544" y="759.5229">dict @sm result_types_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="268" x="544" y="772.3276">list @sm results_away_each_other(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="237" x="544" y="785.1323">list @sm results_recent_than(list results)</text><!--class V3BWFile--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="329.7031" style="stroke: #A80036; stroke-width: 1.5;" width="370" x="157" y="8"/><ellipse cx="309.75" cy="24" 
 fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M312.7188,29.6406 Q312.1406,29.9375 311.5,30.0859 Q310.8594,30.2344 310.1563,30.2344 Q307.6563,30.2344 306.3359,28.5859 Q305.0156,26.9375 305.0156,23.8125 Q305.0156,20.6875 306.3359,19.0313 Q307.6563,17.375 310.1563,17.375 Q310.8594,17.375 311.5078,17.5313 Q312.1563,17.6875 312.7188,17.9844 L312.7188,20.7031 Q312.0938,20.125 311.5,19.8516 Q310.9063,19.5781 310.2813,19.5781 Q308.9375,19.5781 308.25,20.6484 Q307.5625,21.7188 307.5625,23.8125 Q307.5625,25.9063 308.25,26.9766 Q308.9375,28.0469 310.2813,28.0469 Q310.9063,28.0469 311.5,27.7734 Q312.0938,27.5 312.7188,26.9219 L312.7188,29.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="56" x="330.25" y="28.1543">V3BWFile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="158" x2="526" y1="40" y2="40"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacin
 gAndGlyphs" textLength="116" x="163" y="54.2104">V3BWHeader header</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="163" y="67.0151">list bw_lines</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="163" y="79.8198">@p info_stats</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="119" x="163" y="92.6245">bool @p is_min_perc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="87" x="163" y="105.4292">int @p max_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="95" x="163" y="118.2339">int @p mean_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="163" y="131.0386">int @p median_bw</text><text fill="#00
 0000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="84" x="163" y="143.8433">int @p min_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="163" y="156.6479">int @p num</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="88" x="163" y="169.4526">int @p sum_bw</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="158" x2="526" y1="176.0469" y2="176.0469"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="252" x="163" y="190.2573">V3BWFile @cm from_results(dict results, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="147" x="163" y="203.062">list @sm bw_kb(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="200" x="163" y="215.
 8667">list @sm bw_sbws_scale(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="209" x="163" y="228.6714">list @sm bw_torflow_scale(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="288" x="163" y="241.4761">bool @sm is_max_bw_diff_perc_reached(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="306" x="163" y="254.2808">(dict, bool) @sm measured_progress_stats(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="358" x="163" y="267.0854">int @sm read_number_consensus_relays(str consensus_path)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="163" y="279.8901">(list, list, list) to_plt()</text><text fill="#000000" font-family="sans-serif" fo
 nt-size="11" lengthAdjust="spacingAndGlyphs" textLength="195" x="163" y="292.6948">list update_progress(bw_lines, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="245" x="163" y="305.4995">warn_if_not_accurate_enough(bw_lines, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="163" y="318.3042">tuple to_plt(...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="92" x="163" y="331.1089">write(str output)</text><!--class CircuitBuilder--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="124.8281" style="stroke: #A80036; stroke-width: 1.5;" width="126" x="1271" y="532.5"/><ellipse cx="1291.4" cy="548.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1294.3688,554.1406 Q1293.7906,554.4375 1293.15,554.5859 Q1292.5094,554.7344 1291.8063,554.7344 Q1289.
 3063,554.7344 1287.9859,553.0859 Q1286.6656,551.4375 1286.6656,548.3125 Q1286.6656,545.1875 1287.9859,543.5313 Q1289.3063,541.875 1291.8063,541.875 Q1292.5094,541.875 1293.1578,542.0313 Q1293.8063,542.1875 1294.3688,542.4844 L1294.3688,545.2031 Q1293.7438,544.625 1293.15,544.3516 Q1292.5563,544.0781 1291.9313,544.0781 Q1290.5875,544.0781 1289.9,545.1484 Q1289.2125,546.2188 1289.2125,548.3125 Q1289.2125,550.4063 1289.9,551.4766 Q1290.5875,552.5469 1291.9313,552.5469 Q1292.5563,552.5469 1293.15,552.2734 Q1293.7438,552 1294.3688,551.4219 L1294.3688,554.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="82" x="1306.6" y="552.6543">CircuitBuilder</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1272" x2="1396" y1="564.5" y2="564.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1277" y="578.7104">set built_circuits</text><text fill="#000000" font-fa
 mily="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1277" y="591.5151">RelayList relay_list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1277" y="604.3198">list relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="114" x="1277" y="617.1245">Controller controller</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1272" x2="1396" y1="623.7188" y2="623.7188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1277" y="637.9292">int build_circuit()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1277" y="650.7339">void close_circuit()</text><!--class GapsCircuitBuilder--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="146"
  x="1387" y="967"/><ellipse cx="1402" cy="983" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1404.9688,988.6406 Q1404.3906,988.9375 1403.75,989.0859 Q1403.1094,989.2344 1402.4063,989.2344 Q1399.9063,989.2344 1398.5859,987.5859 Q1397.2656,985.9375 1397.2656,982.8125 Q1397.2656,979.6875 1398.5859,978.0313 Q1399.9063,976.375 1402.4063,976.375 Q1403.1094,976.375 1403.7578,976.5313 Q1404.4063,976.6875 1404.9688,976.9844 L1404.9688,979.7031 Q1404.3438,979.125 1403.75,978.8516 Q1403.1563,978.5781 1402.5313,978.5781 Q1401.1875,978.5781 1400.5,979.6484 Q1399.8125,980.7188 1399.8125,982.8125 Q1399.8125,984.9063 1400.5,985.9766 Q1401.1875,987.0469 1402.5313,987.0469 Q1403.1563,987.0469 1403.75,986.7734 Q1404.3438,986.5 1404.9688,985.9219 L1404.9688,988.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="114" x="1416" y="987.1543">GapsCircuitBuilder</text><line style="stroke: #A80036; stroke-w
 idth: 1.5;" x1="1388" x2="1532" y1="999" y2="999"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1388" x2="1532" y1="1007" y2="1007"/><!--class State--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="66" x="1189" y="142.5"/><ellipse cx="1204" cy="158.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1206.9688,164.1406 Q1206.3906,164.4375 1205.75,164.5859 Q1205.1094,164.7344 1204.4063,164.7344 Q1201.9063,164.7344 1200.5859,163.0859 Q1199.2656,161.4375 1199.2656,158.3125 Q1199.2656,155.1875 1200.5859,153.5313 Q1201.9063,151.875 1204.4063,151.875 Q1205.1094,151.875 1205.7578,152.0313 Q1206.4063,152.1875 1206.9688,152.4844 L1206.9688,155.2031 Q1206.3438,154.625 1205.75,154.3516 Q1205.1563,154.0781 1204.5313,154.0781 Q1203.1875,154.0781 1202.5,155.1484 Q1201.8125,156.2188 1201.8125,158.3125 Q1201.8125,160.4063 1202.5,161.4766 Q1203.1875,162.5469 1204.5313,162.5469 Q1205.1563,162
 .5469 1205.75,162.2734 Q1206.3438,162 1206.9688,161.4219 L1206.9688,164.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="34" x="1218" y="162.6543">State</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1190" x2="1254" y1="174.5" y2="174.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1190" x2="1254" y1="182.5" y2="182.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="26" x="1195" y="196.7104">get()</text><path d="M1138.67,1117.655 C1136.16,1141.31 1133.53,1166.111 1131,1189.954 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1140.05,1104.644,1135.4394,1110.1886,1138.7842,1116.5771,1143.3948,1111.0325,1140.05,1104.644" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1089.72,242.34 C1098.68,286.54 1109.61,345.43 1116,398 C1136.18,564.101 1145.24,757.865 1149.18,877.246 " fill="none" style="st
 roke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1087.06,229.41,1084.3489,236.0921,1089.4743,241.1646,1092.1853,234.4826,1087.06,229.41" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1062.64,242.29 C1049.6,314.37 1029,428.19 1014.79,506.73 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1064.99,229.34,1059.9863,234.5326,1062.855,241.1485,1067.8587,235.9559,1064.99,229.34" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M709.634,1150.29 C712.587,1204.42 715.592,1259.514 717.376,1292.219 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="702.629,1150.389,708.529,1130.038,716.608,1149.627,702.629,1150.389" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M779.546,1148.146 C805.413,1199.569 831.859,1252.142 848.795,1285.809 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="773.171,1151.05,770.437,1130.038,785.678,1144.759,773.171,11
 51.05" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M564.219,1069.298 C502.644,1104.936 429.46,1148.471 365,1190 C330.636,1212.139 293.652,1237.711 261.654,1260.417 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M837.502,1100.283 C883.339,1136.644 934.451,1177.19 980.304,1213.563 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M613.472,1141.659 C593.355,1176.056 572.714,1211.349 555.086,1241.491 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="620.269,1130.038,613.7871,1133.1979,614.2108,1140.3965,620.6927,1137.2366,620.269,1130.038" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M698.878,1372.61 C680.34,1417.393 653.638,1481.8967 639.546,1515.9402 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="692.508,1369.697,706.625,1353.895,705.443,1375.051,692.508,1369.697" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M739.348,1372.61 C758.095,1417
 .393 785.096,1481.8967 799.347,1515.9402 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="732.78,1375.047,731.514,1353.895,745.694,1369.641,732.78,1375.047" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M944.599,694.845 C925.726,726.719 903.6,761.637 881,792 C866.16,811.937 849.661,832.189 832.845,851.753 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="951.4,683.254,944.9137,686.4049,945.3276,693.6042,951.8138,690.4532,951.4,683.254" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M986.523,683.449 C974.243,790.808 962.827,977.411 1005,1130 C1010.58,1150.179 1018.82,1170.427 1028.35,1189.81 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M177,1047.245 C177,1106.165 177,1199.251 177,1260.472 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="177,1034.13,173,1040.13,177,1046.13,181,1040.13,177,1034.13" style="stroke: #A80036; stroke
 -width: 1.0;"/><path d="M473.178,740.55 C488.947,757.895 504.83,775.351 520,792 C537.644,811.365 556.273,831.779 574.602,851.847 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M701,792.134 C701,812.297 701,832.472 701,851.814 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M342,351.6 C342,384.21 342,417.88 342,449.38 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="342,338.19,338,344.19,342,350.19,346,344.19,342,338.19" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M490.906,348.21 C506.387,366.32 522.181,384.8 537.808,403.08 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="482.341,338.19,483.2029,345.3494,490.1431,347.3074,489.2812,340.148,482.341,338.19" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M191.752,338.22 C180.173,357.38 170.203,377.45 163,398 C105.082,563.26 62.8173,648.378 163,792 C169.086,800.724 407.087,886.138 564.464,941.895 " 
 fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1299.98,669.643 C1273,728.048 1234.84,810.657 1204.03,877.359 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1305.56,657.562,1299.4124,661.3313,1300.5273,668.4557,1306.6749,664.6864,1305.56,657.562" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1342.81,657.587 C1354.75,760.354 1367.33,971.181 1298,1130 C1287.05,1155.085 1271.35,1178.92 1253.72,1200.721 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1359.82,676.751 C1389,767.97 1434.72,910.962 1452.54,966.679 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1353.11,678.744,1353.69,657.562,1366.45,674.48,1353.11,678.744" style="stroke: #A80036; stroke-width: 1.0;"/></g></svg>
\ No newline at end of file
diff --git a/docs/source/images/classes_sbws.svg b/docs/source/images/classes_sbws.svg
deleted file mode 100644
index e9258e8..0000000
--- a/docs/source/images/classes_sbws.svg
+++ /dev/null
@@ -1,246 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
- "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.38.0 (20140413.2041)
- -->
-<!-- Title: classes_sbws Pages: 1 -->
-<svg width="1965pt" height="619pt"
- viewBox="0.00 0.00 1965.00 619.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 615)">
-<title>classes_sbws</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-615 1961,-615 1961,4 -4,4"/>
-<!-- 0 -->
-<g id="node1" class="node"><title>0</title>
-<polygon fill="none" stroke="black" points="0,-436.5 0,-610.5 173,-610.5 173,-436.5 0,-436.5"/>
-<text text-anchor="middle" x="86.5" y="-595.3" font-family="Times,serif" font-size="14.00">CircuitBuilder</text>
-<polyline fill="none" stroke="black" points="0,-587.5 173,-587.5 "/>
-<text text-anchor="start" x="8" y="-572.3" font-family="Times,serif" font-size="14.00">built_circuits : set</text>
-<text text-anchor="start" x="8" y="-557.3" font-family="Times,serif" font-size="14.00">circuit_timeout</text>
-<text text-anchor="start" x="8" y="-542.3" font-family="Times,serif" font-size="14.00">close_circuits_on_exit : bool</text>
-<text text-anchor="start" x="8" y="-527.3" font-family="Times,serif" font-size="14.00">controller</text>
-<text text-anchor="start" x="8" y="-512.3" font-family="Times,serif" font-size="14.00">relay_list</text>
-<text text-anchor="start" x="8" y="-497.3" font-family="Times,serif" font-size="14.00">relays</text>
-<text text-anchor="start" x="8" y="-482.3" font-family="Times,serif" font-size="14.00">rng : SystemRandom</text>
-<polyline fill="none" stroke="black" points="0,-474.5 173,-474.5 "/>
-<text text-anchor="start" x="8" y="-459.3" font-family="Times,serif" font-size="14.00">build_circuit()</text>
-<text text-anchor="start" x="8" y="-444.3" font-family="Times,serif" font-size="14.00">close_circuit()</text>
-</g>
-<!-- 1 -->
-<g id="node2" class="node"><title>1</title>
-<polygon fill="none" stroke="black" points="165.5,-135.5 165.5,-264.5 259.5,-264.5 259.5,-135.5 165.5,-135.5"/>
-<text text-anchor="middle" x="212.5" y="-249.3" font-family="Times,serif" font-size="14.00">Destination</text>
-<polyline fill="none" stroke="black" points="165.5,-241.5 259.5,-241.5 "/>
-<text text-anchor="start" x="173.5" y="-226.3" font-family="Times,serif" font-size="14.00">hostname</text>
-<text text-anchor="start" x="173.5" y="-211.3" font-family="Times,serif" font-size="14.00">port</text>
-<text text-anchor="start" x="173.5" y="-196.3" font-family="Times,serif" font-size="14.00">url</text>
-<text text-anchor="start" x="173.5" y="-181.3" font-family="Times,serif" font-size="14.00">verify</text>
-<polyline fill="none" stroke="black" points="165.5,-173.5 259.5,-173.5 "/>
-<text text-anchor="start" x="173.5" y="-158.3" font-family="Times,serif" font-size="14.00">from_config()</text>
-<text text-anchor="start" x="173.5" y="-143.3" font-family="Times,serif" font-size="14.00">is_usable()</text>
-</g>
-<!-- 2 -->
-<g id="node3" class="node"><title>2</title>
-<polygon fill="none" stroke="black" points="277.5,-157.5 277.5,-242.5 377.5,-242.5 377.5,-157.5 277.5,-157.5"/>
-<text text-anchor="middle" x="327.5" y="-227.3" font-family="Times,serif" font-size="14.00">DestinationList</text>
-<polyline fill="none" stroke="black" points="277.5,-219.5 377.5,-219.5 "/>
-<polyline fill="none" stroke="black" points="277.5,-195.5 377.5,-195.5 "/>
-<text text-anchor="start" x="285.5" y="-180.3" font-family="Times,serif" font-size="14.00">from_config()</text>
-<text text-anchor="start" x="285.5" y="-165.3" font-family="Times,serif" font-size="14.00">next()</text>
-</g>
-<!-- 3 -->
-<g id="node4" class="node"><title>3</title>
-<polygon fill="none" stroke="black" points="395.5,-165 395.5,-235 491.5,-235 491.5,-165 395.5,-165"/>
-<text text-anchor="middle" x="443.5" y="-219.8" font-family="Times,serif" font-size="14.00">DirectoryLock</text>
-<polyline fill="none" stroke="black" points="395.5,-212 491.5,-212 "/>
-<polyline fill="none" stroke="black" points="395.5,-188 491.5,-188 "/>
-<text text-anchor="middle" x="443.5" y="-172.8" font-family="Times,serif" font-size="14.00"> </text>
-</g>
-<!-- 14 -->
-<g id="node15" class="node"><title>14</title>
-<polygon fill="none" stroke="black" points="463,-488.5 463,-558.5 522,-558.5 522,-488.5 463,-488.5"/>
-<text text-anchor="middle" x="492.5" y="-543.3" font-family="Times,serif" font-size="14.00">_FLock</text>
-<polyline fill="none" stroke="black" points="463,-535.5 522,-535.5 "/>
-<polyline fill="none" stroke="black" points="463,-511.5 522,-511.5 "/>
-<text text-anchor="middle" x="492.5" y="-496.3" font-family="Times,serif" font-size="14.00"> </text>
-</g>
-<!-- 3->14 -->
-<g id="edge1" class="edge"><title>3->14</title>
-<path fill="none" stroke="black" d="M448.697,-235.102C457.628,-293.7 475.879,-413.445 485.769,-478.338"/>
-<polygon fill="none" stroke="black" points="482.315,-478.906 487.282,-488.264 489.235,-477.851 482.315,-478.906"/>
-</g>
-<!-- 4 -->
-<g id="node5" class="node"><title>4</title>
-<polygon fill="none" stroke="black" points="510,-165 510,-235 575,-235 575,-165 510,-165"/>
-<text text-anchor="middle" x="542.5" y="-219.8" font-family="Times,serif" font-size="14.00">FileLock</text>
-<polyline fill="none" stroke="black" points="510,-212 575,-212 "/>
-<polyline fill="none" stroke="black" points="510,-188 575,-188 "/>
-<text text-anchor="middle" x="542.5" y="-172.8" font-family="Times,serif" font-size="14.00"> </text>
-</g>
-<!-- 4->14 -->
-<g id="edge2" class="edge"><title>4->14</title>
-<path fill="none" stroke="black" d="M537.196,-235.102C528.083,-293.7 509.46,-413.445 499.368,-478.338"/>
-<polygon fill="none" stroke="black" points="495.903,-477.845 497.824,-488.264 502.82,-478.921 495.903,-477.845"/>
-</g>
-<!-- 5 -->
-<g id="node6" class="node"><title>5</title>
-<polygon fill="none" stroke="black" points="25.5,-165 25.5,-235 147.5,-235 147.5,-165 25.5,-165"/>
-<text text-anchor="middle" x="86.5" y="-219.8" font-family="Times,serif" font-size="14.00">GapsCircuitBuilder</text>
-<polyline fill="none" stroke="black" points="25.5,-212 147.5,-212 "/>
-<polyline fill="none" stroke="black" points="25.5,-188 147.5,-188 "/>
-<text text-anchor="start" x="33.5" y="-172.8" font-family="Times,serif" font-size="14.00">build_circuit()</text>
-</g>
-<!-- 5->0 -->
-<g id="edge3" class="edge"><title>5->0</title>
-<path fill="none" stroke="black" d="M86.5,-235.102C86.5,-280.201 86.5,-361.52 86.5,-426.176"/>
-<polygon fill="none" stroke="black" points="83.0001,-426.402 86.5,-436.402 90.0001,-426.402 83.0001,-426.402"/>
-</g>
-<!-- 6 -->
-<g id="node7" class="node"><title>6</title>
-<polygon fill="none" stroke="black" points="593.5,-165.5 593.5,-234.5 727.5,-234.5 727.5,-165.5 593.5,-165.5"/>
-<text text-anchor="middle" x="660.5" y="-219.3" font-family="Times,serif" font-size="14.00" fill="red">PathLengthException</text>
-<polyline fill="none" stroke="black" points="593.5,-211.5 727.5,-211.5 "/>
-<text text-anchor="start" x="601.5" y="-196.3" font-family="Times,serif" font-size="14.00" fill="red">errors : NoneType</text>
-<polyline fill="none" stroke="black" points="593.5,-188.5 727.5,-188.5 "/>
-<text text-anchor="middle" x="660.5" y="-173.3" font-family="Times,serif" font-size="14.00" fill="red"> </text>
-</g>
-<!-- 7 -->
-<g id="node8" class="node"><title>7</title>
-<polygon fill="none" stroke="black" points="746,-105.5 746,-294.5 879,-294.5 879,-105.5 746,-105.5"/>
-<text text-anchor="middle" x="812.5" y="-279.3" font-family="Times,serif" font-size="14.00">Relay</text>
-<polyline fill="none" stroke="black" points="746,-271.5 879,-271.5 "/>
-<text text-anchor="start" x="754" y="-256.3" font-family="Times,serif" font-size="14.00">address</text>
-<text text-anchor="start" x="754" y="-241.3" font-family="Times,serif" font-size="14.00">average_bandwidth</text>
-<text text-anchor="start" x="754" y="-226.3" font-family="Times,serif" font-size="14.00">bandwidth</text>
-<text text-anchor="start" x="754" y="-211.3" font-family="Times,serif" font-size="14.00">exit_policy</text>
-<text text-anchor="start" x="754" y="-196.3" font-family="Times,serif" font-size="14.00">fingerprint</text>
-<text text-anchor="start" x="754" y="-181.3" font-family="Times,serif" font-size="14.00">flags</text>
-<text text-anchor="start" x="754" y="-166.3" font-family="Times,serif" font-size="14.00">master_key_ed25519</text>
-<text text-anchor="start" x="754" y="-151.3" font-family="Times,serif" font-size="14.00">nickname</text>
-<text text-anchor="start" x="754" y="-136.3" font-family="Times,serif" font-size="14.00">observed_bandwidth</text>
-<polyline fill="none" stroke="black" points="746,-128.5 879,-128.5 "/>
-<text text-anchor="start" x="754" y="-113.3" font-family="Times,serif" font-size="14.00">can_exit_to()</text>
-</g>
-<!-- 8 -->
-<g id="node9" class="node"><title>8</title>
-<polygon fill="none" stroke="black" points="897.5,-105.5 897.5,-294.5 1073.5,-294.5 1073.5,-105.5 897.5,-105.5"/>
-<text text-anchor="middle" x="985.5" y="-279.3" font-family="Times,serif" font-size="14.00">RelayList</text>
-<polyline fill="none" stroke="black" points="897.5,-271.5 1073.5,-271.5 "/>
-<text text-anchor="start" x="905.5" y="-256.3" font-family="Times,serif" font-size="14.00">REFRESH_INTERVAL : int</text>
-<text text-anchor="start" x="905.5" y="-241.3" font-family="Times,serif" font-size="14.00">authorities</text>
-<text text-anchor="start" x="905.5" y="-226.3" font-family="Times,serif" font-size="14.00">bad_exits</text>
-<text text-anchor="start" x="905.5" y="-211.3" font-family="Times,serif" font-size="14.00">exits</text>
-<text text-anchor="start" x="905.5" y="-196.3" font-family="Times,serif" font-size="14.00">fast</text>
-<text text-anchor="start" x="905.5" y="-181.3" font-family="Times,serif" font-size="14.00">guards</text>
-<text text-anchor="start" x="905.5" y="-166.3" font-family="Times,serif" font-size="14.00">non_exits</text>
-<text text-anchor="start" x="905.5" y="-151.3" font-family="Times,serif" font-size="14.00">relays</text>
-<text text-anchor="start" x="905.5" y="-136.3" font-family="Times,serif" font-size="14.00">rng : SystemRandom</text>
-<polyline fill="none" stroke="black" points="897.5,-128.5 1073.5,-128.5 "/>
-<text text-anchor="start" x="905.5" y="-113.3" font-family="Times,serif" font-size="14.00">random_relay()</text>
-</g>
-<!-- 9 -->
-<g id="node10" class="node"><title>9</title>
-<polygon fill="none" stroke="black" points="1091.5,-128 1091.5,-272 1217.5,-272 1217.5,-128 1091.5,-128"/>
-<text text-anchor="middle" x="1154.5" y="-256.8" font-family="Times,serif" font-size="14.00">RelayPrioritizer</text>
-<polyline fill="none" stroke="black" points="1091.5,-249 1217.5,-249 "/>
-<text text-anchor="start" x="1099.5" y="-233.8" font-family="Times,serif" font-size="14.00">fraction_to_return</text>
-<text text-anchor="start" x="1099.5" y="-218.8" font-family="Times,serif" font-size="14.00">fresh_seconds</text>
-<text text-anchor="start" x="1099.5" y="-203.8" font-family="Times,serif" font-size="14.00">measure_authorities</text>
-<text text-anchor="start" x="1099.5" y="-188.8" font-family="Times,serif" font-size="14.00">min_to_return</text>
-<text text-anchor="start" x="1099.5" y="-173.8" font-family="Times,serif" font-size="14.00">relay_list</text>
-<text text-anchor="start" x="1099.5" y="-158.8" font-family="Times,serif" font-size="14.00">result_dump</text>
-<polyline fill="none" stroke="black" points="1091.5,-151 1217.5,-151 "/>
-<text text-anchor="start" x="1099.5" y="-135.8" font-family="Times,serif" font-size="14.00">best_priority()</text>
-</g>
-<!-- 10 -->
-<g id="node11" class="node"><title>10</title>
-<polygon fill="none" stroke="black" points="1235.5,-165 1235.5,-235 1289.5,-235 1289.5,-165 1235.5,-165"/>
-<text text-anchor="middle" x="1262.5" y="-219.8" font-family="Times,serif" font-size="14.00">State</text>
-<polyline fill="none" stroke="black" points="1235.5,-212 1289.5,-212 "/>
-<polyline fill="none" stroke="black" points="1235.5,-188 1289.5,-188 "/>
-<text text-anchor="start" x="1243.5" y="-172.8" font-family="Times,serif" font-size="14.00">get()</text>
-</g>
-<!-- 11 -->
-<g id="node12" class="node"><title>11</title>
-<polygon fill="none" stroke="black" points="1307.5,-0.5 1307.5,-399.5 1505.5,-399.5 1505.5,-0.5 1307.5,-0.5"/>
-<text text-anchor="middle" x="1406.5" y="-384.3" font-family="Times,serif" font-size="14.00">V3BWFile</text>
-<polyline fill="none" stroke="black" points="1307.5,-376.5 1505.5,-376.5 "/>
-<text text-anchor="start" x="1315.5" y="-361.3" font-family="Times,serif" font-size="14.00">bw_lines</text>
-<text text-anchor="start" x="1315.5" y="-346.3" font-family="Times,serif" font-size="14.00">header</text>
-<text text-anchor="start" x="1315.5" y="-331.3" font-family="Times,serif" font-size="14.00">info_stats</text>
-<text text-anchor="start" x="1315.5" y="-316.3" font-family="Times,serif" font-size="14.00">is_min_perc</text>
-<text text-anchor="start" x="1315.5" y="-301.3" font-family="Times,serif" font-size="14.00">max_bw</text>
-<text text-anchor="start" x="1315.5" y="-286.3" font-family="Times,serif" font-size="14.00">mean_bw</text>
-<text text-anchor="start" x="1315.5" y="-271.3" font-family="Times,serif" font-size="14.00">median_bw</text>
-<text text-anchor="start" x="1315.5" y="-256.3" font-family="Times,serif" font-size="14.00">min_bw</text>
-<text text-anchor="start" x="1315.5" y="-241.3" font-family="Times,serif" font-size="14.00">num</text>
-<text text-anchor="start" x="1315.5" y="-226.3" font-family="Times,serif" font-size="14.00">sum_bw</text>
-<polyline fill="none" stroke="black" points="1307.5,-218.5 1505.5,-218.5 "/>
-<text text-anchor="start" x="1315.5" y="-203.3" font-family="Times,serif" font-size="14.00">bw_kb()</text>
-<text text-anchor="start" x="1315.5" y="-188.3" font-family="Times,serif" font-size="14.00">bw_line_for_node_id()</text>
-<text text-anchor="start" x="1315.5" y="-173.3" font-family="Times,serif" font-size="14.00">bw_sbws_scale()</text>
-<text text-anchor="start" x="1315.5" y="-158.3" font-family="Times,serif" font-size="14.00">bw_torflow_scale()</text>
-<text text-anchor="start" x="1315.5" y="-143.3" font-family="Times,serif" font-size="14.00">from_results()</text>
-<text text-anchor="start" x="1315.5" y="-128.3" font-family="Times,serif" font-size="14.00">from_v100_fpath()</text>
-<text text-anchor="start" x="1315.5" y="-113.3" font-family="Times,serif" font-size="14.00">from_v110_fpath()</text>
-<text text-anchor="start" x="1315.5" y="-98.3" font-family="Times,serif" font-size="14.00">is_max_bw_diff_perc_reached()</text>
-<text text-anchor="start" x="1315.5" y="-83.3" font-family="Times,serif" font-size="14.00">measured_progress_stats()</text>
-<text text-anchor="start" x="1315.5" y="-68.3" font-family="Times,serif" font-size="14.00">read_number_consensus_relays()</text>
-<text text-anchor="start" x="1315.5" y="-53.3" font-family="Times,serif" font-size="14.00">to_plt()</text>
-<text text-anchor="start" x="1315.5" y="-38.3" font-family="Times,serif" font-size="14.00">update_progress()</text>
-<text text-anchor="start" x="1315.5" y="-23.3" font-family="Times,serif" font-size="14.00">warn_if_not_accurate_enough()</text>
-<text text-anchor="start" x="1315.5" y="-8.3" font-family="Times,serif" font-size="14.00">write()</text>
-</g>
-<!-- 12 -->
-<g id="node13" class="node"><title>12</title>
-<polygon fill="none" stroke="black" points="1523.5,-23 1523.5,-377 1727.5,-377 1727.5,-23 1523.5,-23"/>
-<text text-anchor="middle" x="1625.5" y="-361.8" font-family="Times,serif" font-size="14.00">V3BWHeader</text>
-<polyline fill="none" stroke="black" points="1523.5,-354 1727.5,-354 "/>
-<text text-anchor="start" x="1531.5" y="-338.8" font-family="Times,serif" font-size="14.00">file_created</text>
-<text text-anchor="start" x="1531.5" y="-323.8" font-family="Times,serif" font-size="14.00">keyvalue_tuple_ls</text>
-<text text-anchor="start" x="1531.5" y="-308.8" font-family="Times,serif" font-size="14.00">keyvalue_unordered_tuple_ls</text>
-<text text-anchor="start" x="1531.5" y="-293.8" font-family="Times,serif" font-size="14.00">keyvalue_v110str_ls</text>
-<text text-anchor="start" x="1531.5" y="-278.8" font-family="Times,serif" font-size="14.00">keyvalue_v200_ls</text>
-<text text-anchor="start" x="1531.5" y="-263.8" font-family="Times,serif" font-size="14.00">latest_bandwidth</text>
-<text text-anchor="start" x="1531.5" y="-248.8" font-family="Times,serif" font-size="14.00">num_lines</text>
-<text text-anchor="start" x="1531.5" y="-233.8" font-family="Times,serif" font-size="14.00">software</text>
-<text text-anchor="start" x="1531.5" y="-218.8" font-family="Times,serif" font-size="14.00">software_version</text>
-<text text-anchor="start" x="1531.5" y="-203.8" font-family="Times,serif" font-size="14.00">strv110</text>
-<text text-anchor="start" x="1531.5" y="-188.8" font-family="Times,serif" font-size="14.00">strv200</text>
-<text text-anchor="start" x="1531.5" y="-173.8" font-family="Times,serif" font-size="14.00">timestamp</text>
-<text text-anchor="start" x="1531.5" y="-158.8" font-family="Times,serif" font-size="14.00">version</text>
-<polyline fill="none" stroke="black" points="1523.5,-151 1727.5,-151 "/>
-<text text-anchor="start" x="1531.5" y="-135.8" font-family="Times,serif" font-size="14.00">add_stats()</text>
-<text text-anchor="start" x="1531.5" y="-120.8" font-family="Times,serif" font-size="14.00">earliest_bandwidth_from_results()</text>
-<text text-anchor="start" x="1531.5" y="-105.8" font-family="Times,serif" font-size="14.00">from_lines_v100()</text>
-<text text-anchor="start" x="1531.5" y="-90.8" font-family="Times,serif" font-size="14.00">from_lines_v110()</text>
-<text text-anchor="start" x="1531.5" y="-75.8" font-family="Times,serif" font-size="14.00">from_results()</text>
-<text text-anchor="start" x="1531.5" y="-60.8" font-family="Times,serif" font-size="14.00">from_text_v110()</text>
-<text text-anchor="start" x="1531.5" y="-45.8" font-family="Times,serif" font-size="14.00">generator_started_from_file()</text>
-<text text-anchor="start" x="1531.5" y="-30.8" font-family="Times,serif" font-size="14.00">latest_bandwidth_from_results()</text>
-</g>
-<!-- 13 -->
-<g id="node14" class="node"><title>13</title>
-<polygon fill="none" stroke="black" points="1746,-53 1746,-347 1957,-347 1957,-53 1746,-53"/>
-<text text-anchor="middle" x="1851.5" y="-331.8" font-family="Times,serif" font-size="14.00">V3BWLine</text>
-<polyline fill="none" stroke="black" points="1746,-324 1957,-324 "/>
-<text text-anchor="start" x="1754" y="-308.8" font-family="Times,serif" font-size="14.00">bw</text>
-<text text-anchor="start" x="1754" y="-293.8" font-family="Times,serif" font-size="14.00">bw_keyvalue_tuple_ls</text>
-<text text-anchor="start" x="1754" y="-278.8" font-family="Times,serif" font-size="14.00">bw_keyvalue_v110str_ls</text>
-<text text-anchor="start" x="1754" y="-263.8" font-family="Times,serif" font-size="14.00">bw_strv110</text>
-<text text-anchor="start" x="1754" y="-248.8" font-family="Times,serif" font-size="14.00">node_id</text>
-<polyline fill="none" stroke="black" points="1746,-241 1957,-241 "/>
-<text text-anchor="start" x="1754" y="-225.8" font-family="Times,serif" font-size="14.00">bw_mean_from_results()</text>
-<text text-anchor="start" x="1754" y="-210.8" font-family="Times,serif" font-size="14.00">bw_median_from_results()</text>
-<text text-anchor="start" x="1754" y="-195.8" font-family="Times,serif" font-size="14.00">desc_bw_obs_last_from_results()</text>
-<text text-anchor="start" x="1754" y="-180.8" font-family="Times,serif" font-size="14.00">desc_bw_obs_mean_from_results()</text>
-<text text-anchor="start" x="1754" y="-165.8" font-family="Times,serif" font-size="14.00">from_bw_line_v110()</text>
-<text text-anchor="start" x="1754" y="-150.8" font-family="Times,serif" font-size="14.00">from_data()</text>
-<text text-anchor="start" x="1754" y="-135.8" font-family="Times,serif" font-size="14.00">from_results()</text>
-<text text-anchor="start" x="1754" y="-120.8" font-family="Times,serif" font-size="14.00">last_time_from_results()</text>
-<text text-anchor="start" x="1754" y="-105.8" font-family="Times,serif" font-size="14.00">result_types_from_results()</text>
-<text text-anchor="start" x="1754" y="-90.8" font-family="Times,serif" font-size="14.00">results_away_each_other()</text>
-<text text-anchor="start" x="1754" y="-75.8" font-family="Times,serif" font-size="14.00">results_recent_than()</text>
-<text text-anchor="start" x="1754" y="-60.8" font-family="Times,serif" font-size="14.00">rtt_from_results()</text>
-</g>
-</g>
-</svg>
diff --git a/docs/source/images/critical_sections.svg b/docs/source/images/critical_sections.svg
new file mode 100644
index 0000000..32881ce
--- /dev/null
+++ b/docs/source/images/critical_sections.svg
@@ -0,0 +1,516 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="463pt" height="653pt" viewBox="0 0 463 653" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 0.65625 2.296875 L 0.65625 -9.171875 L 7.15625 -9.171875 L 7.15625 2.296875 Z M 1.390625 1.578125 L 6.4375 1.578125 L 6.4375 -8.4375 L 1.390625 -8.4375 Z M 1.390625 1.578125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 7.328125 -5.640625 C 7.078125 -5.835938 6.820312 -5.976562 6.5625 -6.0625 C 6.3125 -6.15625 6.03125 -6.203125 5.71875 -6.203125 C 4.988281 -6.203125 4.429688 -5.972656 4.046875 -5.515625 C 3.660156 -5.054688 3.46875 -4.394531 3.46875 -3.53125 L 3.46875 0 L 2.296875 0 L 2.296875 -7.109375 L 3.46875 -7.109375 L 3.46875 -5.71875 C 3.664062 -6.21875 3.96875 -6.601562 4.375 -6.875 C 4.78125 -7.144531 5.257812 -7.28125 5.8125 -7.28125 C 6.09375 -7.28125 6.359375 -7.242188 6.609375 -7.171875 C 6.859375 -7.097656 7.097656 -6.988281 7.328125 -6.84375 Z M 7.328125 -5.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 7.0625 -3.84375 L 7.0625 -3.28125 L 2 -3.28125 L 2 -3.234375 C 2 -2.460938 2.203125 -1.863281 2.609375 -1.4375 C 3.015625 -1.019531 3.582031 -0.8125 4.3125 -0.8125 C 4.6875 -0.8125 5.078125 -0.867188 5.484375 -0.984375 C 5.890625 -1.097656 6.320312 -1.28125 6.78125 -1.53125 L 6.78125 -0.359375 C 6.34375 -0.179688 5.914062 -0.046875 5.5 0.046875 C 5.082031 0.140625 4.679688 0.1875 4.296875 0.1875 C 3.191406 0.1875 2.328125 -0.140625 1.703125 -0.796875 C 1.085938 -1.460938 0.78125 -2.378906 0.78125 -3.546875 C 0.78125 -4.679688 1.082031 -5.585938 1.6875 -6.265625 C 2.300781 -6.941406 3.113281 -7.28125 4.125 -7.28125 C 5.03125 -7.28125 5.742188 -6.972656 6.265625 -6.359375 C 6.796875 -5.742188 7.0625 -4.90625 7.0625 -3.84375 Z M 5.890625 -4.1875 C 5.867188 -4.875 5.703125 -5.394531 5.390625 -5.75 C 5.085938 -6.113281 4.648438 -6.296875 4.078125 -6.296875 C 3.515625 -6.296875 3.050781 -6.109375 2.6875 -5.734375 C 2.320312 -5.359375 2.109375 -4.84375 2.046
 875 -4.1875 Z M 5.890625 -4.1875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 6.75 -9.875 L 6.75 -8.90625 L 5.421875 -8.90625 C 5.003906 -8.90625 4.710938 -8.816406 4.546875 -8.640625 C 4.378906 -8.472656 4.296875 -8.171875 4.296875 -7.734375 L 4.296875 -7.109375 L 6.75 -7.109375 L 6.75 -6.203125 L 4.296875 -6.203125 L 4.296875 0 L 3.140625 0 L 3.140625 -6.203125 L 1.234375 -6.203125 L 1.234375 -7.109375 L 3.140625 -7.109375 L 3.140625 -7.609375 C 3.140625 -8.378906 3.316406 -8.945312 3.671875 -9.3125 C 4.023438 -9.6875 4.582031 -9.875 5.34375 -9.875 Z M 6.75 -9.875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 6.171875 -6.859375 L 6.171875 -5.71875 C 5.835938 -5.914062 5.5 -6.0625 5.15625 -6.15625 C 4.820312 -6.25 4.476562 -6.296875 4.125 -6.296875 C 3.601562 -6.296875 3.210938 -6.210938 2.953125 -6.046875 C 2.691406 -5.878906 2.5625 -5.617188 2.5625 -5.265625 C 2.5625 -4.941406 2.65625 -4.703125 2.84375 -4.546875 C 3.039062 -4.390625 3.523438 -4.238281 4.296875 -4.09375 L 4.78125 -4 C 5.351562 -3.894531 5.785156 -3.675781 6.078125 -3.34375 C 6.378906 -3.007812 6.53125 -2.582031 6.53125 -2.0625 C 6.53125 -1.351562 6.28125 -0.800781 5.78125 -0.40625 C 5.289062 -0.0078125 4.597656 0.1875 3.703125 0.1875 C 3.359375 0.1875 2.992188 0.148438 2.609375 0.078125 C 2.222656 0.00390625 1.804688 -0.109375 1.359375 -0.265625 L 1.359375 -1.46875 C 1.785156 -1.238281 2.195312 -1.066406 2.59375 -0.953125 C 3 -0.847656 3.378906 -0.796875 3.734375 -0.796875 C 4.242188 -0.796875 4.640625 -0.898438 4.921875 -1.109375 C 5.210938 -1.316406 5.359375 -1.609375 5.359375 -1.984375 
 C 5.359375 -2.523438 4.835938 -2.898438 3.796875 -3.109375 L 3.75 -3.125 L 3.3125 -3.21875 C 2.632812 -3.34375 2.140625 -3.5625 1.828125 -3.875 C 1.523438 -4.1875 1.375 -4.609375 1.375 -5.140625 C 1.375 -5.828125 1.601562 -6.351562 2.0625 -6.71875 C 2.53125 -7.09375 3.191406 -7.28125 4.046875 -7.28125 C 4.421875 -7.28125 4.785156 -7.242188 5.140625 -7.171875 C 5.492188 -7.109375 5.835938 -7.003906 6.171875 -6.859375 Z M 6.171875 -6.859375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 6.671875 -4.40625 L 6.671875 0 L 5.5 0 L 5.5 -4.40625 C 5.5 -5.039062 5.382812 -5.507812 5.15625 -5.8125 C 4.9375 -6.113281 4.585938 -6.265625 4.109375 -6.265625 C 3.554688 -6.265625 3.132812 -6.070312 2.84375 -5.6875 C 2.550781 -5.300781 2.40625 -4.742188 2.40625 -4.015625 L 2.40625 0 L 1.234375 0 L 1.234375 -9.875 L 2.40625 -9.875 L 2.40625 -6.046875 C 2.613281 -6.453125 2.894531 -6.757812 3.25 -6.96875 C 3.601562 -7.175781 4.023438 -7.28125 4.515625 -7.28125 C 5.234375 -7.28125 5.769531 -7.039062 6.125 -6.5625 C 6.488281 -6.09375 6.671875 -5.375 6.671875 -4.40625 Z M 6.671875 -4.40625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 5.828125 -3.546875 C 5.828125 -4.453125 5.679688 -5.132812 5.390625 -5.59375 C 5.109375 -6.0625 4.6875 -6.296875 4.125 -6.296875 C 3.550781 -6.296875 3.117188 -6.0625 2.828125 -5.59375 C 2.535156 -5.132812 2.390625 -4.453125 2.390625 -3.546875 C 2.390625 -2.648438 2.535156 -1.96875 2.828125 -1.5 C 3.117188 -1.039062 3.550781 -0.8125 4.125 -0.8125 C 4.6875 -0.8125 5.109375 -1.039062 5.390625 -1.5 C 5.679688 -1.957031 5.828125 -2.640625 5.828125 -3.546875 Z M 2.390625 -6.203125 C 2.578125 -6.546875 2.832031 -6.8125 3.15625 -7 C 3.488281 -7.1875 3.867188 -7.28125 4.296875 -7.28125 C 5.160156 -7.28125 5.835938 -6.953125 6.328125 -6.296875 C 6.816406 -5.640625 7.0625 -4.734375 7.0625 -3.578125 C 7.0625 -2.398438 6.8125 -1.476562 6.3125 -0.8125 C 5.820312 -0.144531 5.148438 0.1875 4.296875 0.1875 C 3.867188 0.1875 3.492188 0.09375 3.171875 -0.09375 C 2.847656 -0.28125 2.585938 -0.546875 2.390625 -0.890625 L 2.390625 0 L 1.21875 0 L 1.21875 -9.875 L 2.390625
  -9.875 Z M 2.390625 -6.203125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-7">
+<path style="stroke:none;" d="M 3.890625 -9.125 L 3.890625 -7.109375 L 6.546875 -7.109375 L 6.546875 -6.203125 L 3.890625 -6.203125 L 3.890625 -2.34375 C 3.890625 -1.820312 3.988281 -1.457031 4.1875 -1.25 C 4.394531 -1.039062 4.742188 -0.9375 5.234375 -0.9375 L 6.546875 -0.9375 L 6.546875 0 L 5.125 0 C 4.25 0 3.628906 -0.171875 3.265625 -0.515625 C 2.910156 -0.867188 2.734375 -1.476562 2.734375 -2.34375 L 2.734375 -6.203125 L 0.828125 -6.203125 L 0.828125 -7.109375 L 2.734375 -7.109375 L 2.734375 -9.125 Z M 3.890625 -9.125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-8">
+<path style="stroke:none;" d="M 7.828125 2.5625 L 7.828125 3.0625 L 0 3.0625 L 0 2.5625 Z M 7.828125 2.5625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-9">
+<path style="stroke:none;" d="M 2.375 -0.890625 L 2.375 2.703125 L 1.203125 2.703125 L 1.203125 -7.109375 L 2.375 -7.109375 L 2.375 -6.203125 C 2.570312 -6.554688 2.832031 -6.820312 3.15625 -7 C 3.476562 -7.1875 3.851562 -7.28125 4.28125 -7.28125 C 5.132812 -7.28125 5.804688 -6.945312 6.296875 -6.28125 C 6.785156 -5.613281 7.03125 -4.691406 7.03125 -3.515625 C 7.03125 -2.367188 6.785156 -1.460938 6.296875 -0.796875 C 5.804688 -0.140625 5.132812 0.1875 4.28125 0.1875 C 3.84375 0.1875 3.460938 0.09375 3.140625 -0.09375 C 2.816406 -0.28125 2.5625 -0.546875 2.375 -0.890625 Z M 5.8125 -3.546875 C 5.8125 -4.453125 5.664062 -5.132812 5.375 -5.59375 C 5.09375 -6.0625 4.671875 -6.296875 4.109375 -6.296875 C 3.535156 -6.296875 3.101562 -6.0625 2.8125 -5.59375 C 2.519531 -5.132812 2.375 -4.453125 2.375 -3.546875 C 2.375 -2.648438 2.519531 -1.96875 2.8125 -1.5 C 3.101562 -1.039062 3.535156 -0.8125 4.109375 -0.8125 C 4.671875 -0.8125 5.09375 -1.039062 5.375 -1.5 C 5.664062 -1.957031 5.8125 -2.64
 0625 5.8125 -3.546875 Z M 5.8125 -3.546875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-10">
+<path style="stroke:none;" d="M 1.625 -7.109375 L 4.609375 -7.109375 L 4.609375 -0.90625 L 6.9375 -0.90625 L 6.9375 0 L 1.125 0 L 1.125 -0.90625 L 3.453125 -0.90625 L 3.453125 -6.203125 L 1.625 -6.203125 Z M 3.453125 -9.875 L 4.609375 -9.875 L 4.609375 -8.390625 L 3.453125 -8.390625 Z M 3.453125 -9.875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-11">
+<path style="stroke:none;" d="M 3.90625 -6.296875 C 3.3125 -6.296875 2.863281 -6.0625 2.5625 -5.59375 C 2.257812 -5.132812 2.109375 -4.453125 2.109375 -3.546875 C 2.109375 -2.648438 2.257812 -1.96875 2.5625 -1.5 C 2.863281 -1.039062 3.3125 -0.8125 3.90625 -0.8125 C 4.507812 -0.8125 4.960938 -1.039062 5.265625 -1.5 C 5.566406 -1.96875 5.71875 -2.648438 5.71875 -3.546875 C 5.71875 -4.453125 5.566406 -5.132812 5.265625 -5.59375 C 4.960938 -6.0625 4.507812 -6.296875 3.90625 -6.296875 Z M 3.90625 -7.28125 C 4.894531 -7.28125 5.648438 -6.957031 6.171875 -6.3125 C 6.691406 -5.675781 6.953125 -4.753906 6.953125 -3.546875 C 6.953125 -2.335938 6.691406 -1.410156 6.171875 -0.765625 C 5.648438 -0.128906 4.894531 0.1875 3.90625 0.1875 C 2.925781 0.1875 2.175781 -0.128906 1.65625 -0.765625 C 1.132812 -1.410156 0.875 -2.335938 0.875 -3.546875 C 0.875 -4.753906 1.132812 -5.675781 1.65625 -6.3125 C 2.175781 -6.957031 2.925781 -7.28125 3.90625 -7.28125 Z M 3.90625 -7.28125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-12">
+<path style="stroke:none;" d="M 5.453125 -2.28125 C 5.253906 -1.789062 5.003906 -1.140625 4.703125 -0.328125 C 4.285156 0.785156 4.003906 1.46875 3.859375 1.71875 C 3.660156 2.039062 3.414062 2.285156 3.125 2.453125 C 2.832031 2.617188 2.492188 2.703125 2.109375 2.703125 L 1.171875 2.703125 L 1.171875 1.734375 L 1.859375 1.734375 C 2.203125 1.734375 2.46875 1.628906 2.65625 1.421875 C 2.851562 1.222656 3.101562 0.710938 3.40625 -0.109375 L 0.65625 -7.109375 L 1.890625 -7.109375 L 4 -1.546875 L 6.078125 -7.109375 L 7.3125 -7.109375 Z M 5.453125 -2.28125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-13">
+<path style="stroke:none;" d="M 4.296875 -6.390625 C 4.429688 -6.691406 4.609375 -6.914062 4.828125 -7.0625 C 5.054688 -7.207031 5.328125 -7.28125 5.640625 -7.28125 C 6.210938 -7.28125 6.613281 -7.054688 6.84375 -6.609375 C 7.082031 -6.171875 7.203125 -5.34375 7.203125 -4.125 L 7.203125 0 L 6.140625 0 L 6.140625 -4.0625 C 6.140625 -5.070312 6.082031 -5.695312 5.96875 -5.9375 C 5.851562 -6.175781 5.648438 -6.296875 5.359375 -6.296875 C 5.015625 -6.296875 4.78125 -6.164062 4.65625 -5.90625 C 4.53125 -5.644531 4.46875 -5.03125 4.46875 -4.0625 L 4.46875 0 L 3.40625 0 L 3.40625 -4.0625 C 3.40625 -5.082031 3.34375 -5.707031 3.21875 -5.9375 C 3.101562 -6.175781 2.890625 -6.296875 2.578125 -6.296875 C 2.265625 -6.296875 2.046875 -6.164062 1.921875 -5.90625 C 1.804688 -5.644531 1.75 -5.03125 1.75 -4.0625 L 1.75 0 L 0.6875 0 L 0.6875 -7.109375 L 1.75 -7.109375 L 1.75 -6.5 C 1.894531 -6.75 2.070312 -6.941406 2.28125 -7.078125 C 2.488281 -7.210938 2.722656 -7.28125 2.984375 -7.28125 C 3.304688 
 -7.28125 3.570312 -7.207031 3.78125 -7.0625 C 4 -6.914062 4.171875 -6.691406 4.296875 -6.390625 Z M 4.296875 -6.390625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-14">
+<path style="stroke:none;" d="M 4.453125 -3.578125 L 4.0625 -3.578125 C 3.382812 -3.578125 2.875 -3.457031 2.53125 -3.21875 C 2.1875 -2.976562 2.015625 -2.617188 2.015625 -2.140625 C 2.015625 -1.710938 2.140625 -1.378906 2.390625 -1.140625 C 2.648438 -0.910156 3.007812 -0.796875 3.46875 -0.796875 C 4.113281 -0.796875 4.617188 -1.019531 4.984375 -1.46875 C 5.359375 -1.914062 5.546875 -2.53125 5.546875 -3.3125 L 5.546875 -3.578125 Z M 6.71875 -4.0625 L 6.71875 0 L 5.546875 0 L 5.546875 -1.046875 C 5.296875 -0.628906 4.976562 -0.316406 4.59375 -0.109375 C 4.21875 0.0859375 3.757812 0.1875 3.21875 0.1875 C 2.5 0.1875 1.921875 -0.015625 1.484375 -0.421875 C 1.054688 -0.835938 0.84375 -1.382812 0.84375 -2.0625 C 0.84375 -2.851562 1.109375 -3.453125 1.640625 -3.859375 C 2.171875 -4.273438 2.953125 -4.484375 3.984375 -4.484375 L 5.546875 -4.484375 L 5.546875 -4.671875 C 5.546875 -5.234375 5.398438 -5.644531 5.109375 -5.90625 C 4.828125 -6.164062 4.378906 -6.296875 3.765625 -6.296875 C 3.359
 375 -6.296875 2.953125 -6.238281 2.546875 -6.125 C 2.140625 -6.007812 1.742188 -5.84375 1.359375 -5.625 L 1.359375 -6.78125 C 1.796875 -6.945312 2.210938 -7.070312 2.609375 -7.15625 C 3.003906 -7.238281 3.390625 -7.28125 3.765625 -7.28125 C 4.347656 -7.28125 4.847656 -7.191406 5.265625 -7.015625 C 5.679688 -6.847656 6.019531 -6.585938 6.28125 -6.234375 C 6.4375 -6.023438 6.546875 -5.765625 6.609375 -5.453125 C 6.679688 -5.140625 6.71875 -4.675781 6.71875 -4.0625 Z M 6.71875 -4.0625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-15">
+<path style="stroke:none;" d="M 1.234375 -2.6875 L 1.234375 -7.09375 L 2.40625 -7.09375 L 2.40625 -2.6875 C 2.40625 -2.050781 2.515625 -1.582031 2.734375 -1.28125 C 2.960938 -0.976562 3.316406 -0.828125 3.796875 -0.828125 C 4.347656 -0.828125 4.769531 -1.019531 5.0625 -1.40625 C 5.351562 -1.800781 5.5 -2.359375 5.5 -3.078125 L 5.5 -7.09375 L 6.671875 -7.09375 L 6.671875 0 L 5.5 0 L 5.5 -1.0625 C 5.289062 -0.65625 5.003906 -0.34375 4.640625 -0.125 C 4.285156 0.0820312 3.867188 0.1875 3.390625 0.1875 C 2.660156 0.1875 2.117188 -0.0507812 1.765625 -0.53125 C 1.410156 -1.007812 1.234375 -1.726562 1.234375 -2.6875 Z M 1.234375 -2.6875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-16">
+<path style="stroke:none;" d="M 4.0625 -2.578125 C 4.0625 -2.054688 4.15625 -1.660156 4.34375 -1.390625 C 4.539062 -1.117188 4.828125 -0.984375 5.203125 -0.984375 L 6.5625 -0.984375 L 6.5625 0 L 5.078125 0 C 4.378906 0 3.835938 -0.222656 3.453125 -0.671875 C 3.078125 -1.117188 2.890625 -1.753906 2.890625 -2.578125 L 2.890625 -9.03125 L 1.015625 -9.03125 L 1.015625 -9.953125 L 4.0625 -9.953125 Z M 4.0625 -2.578125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-17">
+<path style="stroke:none;" d="M 4.828125 -4.46875 C 5.148438 -4.382812 5.425781 -4.222656 5.65625 -3.984375 C 5.894531 -3.753906 6.1875 -3.289062 6.53125 -2.59375 L 7.828125 0 L 6.453125 0 L 5.3125 -2.390625 C 4.988281 -3.078125 4.695312 -3.515625 4.4375 -3.703125 C 4.175781 -3.898438 3.835938 -4 3.421875 -4 L 2.203125 -4 L 2.203125 0 L 0.90625 0 L 0.90625 -9.484375 L 3.546875 -9.484375 C 4.585938 -9.484375 5.382812 -9.242188 5.9375 -8.765625 C 6.488281 -8.296875 6.765625 -7.617188 6.765625 -6.734375 C 6.765625 -6.109375 6.59375 -5.597656 6.25 -5.203125 C 5.914062 -4.804688 5.441406 -4.5625 4.828125 -4.46875 Z M 2.203125 -8.421875 L 2.203125 -5.0625 L 3.59375 -5.0625 C 4.207031 -5.0625 4.664062 -5.195312 4.96875 -5.46875 C 5.269531 -5.75 5.421875 -6.171875 5.421875 -6.734375 C 5.421875 -7.273438 5.257812 -7.691406 4.9375 -7.984375 C 4.625 -8.273438 4.160156 -8.421875 3.546875 -8.421875 Z M 2.203125 -8.421875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-18">
+<path style="stroke:none;" d="M 2.765625 -1.046875 C 3.847656 -1.046875 4.601562 -1.3125 5.03125 -1.84375 C 5.457031 -2.375 5.671875 -3.335938 5.671875 -4.734375 C 5.671875 -6.128906 5.457031 -7.09375 5.03125 -7.625 C 4.601562 -8.15625 3.847656 -8.421875 2.765625 -8.421875 L 2.15625 -8.421875 L 2.15625 -1.046875 Z M 2.796875 -9.484375 C 4.242188 -9.484375 5.304688 -9.097656 5.984375 -8.328125 C 6.671875 -7.554688 7.015625 -6.359375 7.015625 -4.734375 C 7.015625 -3.109375 6.671875 -1.910156 5.984375 -1.140625 C 5.304688 -0.378906 4.242188 0 2.796875 0 L 0.875 0 L 0.875 -9.484375 Z M 2.796875 -9.484375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-19">
+<path style="stroke:none;" d="M 3.109375 -1.9375 L 4.703125 -1.9375 L 4.703125 0 L 3.109375 0 Z M 3.109375 -1.9375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-20">
+<path style="stroke:none;" d="M 6.671875 -4.40625 L 6.671875 0 L 5.5 0 L 5.5 -4.40625 C 5.5 -5.039062 5.382812 -5.507812 5.15625 -5.8125 C 4.9375 -6.113281 4.585938 -6.265625 4.109375 -6.265625 C 3.554688 -6.265625 3.132812 -6.070312 2.84375 -5.6875 C 2.550781 -5.300781 2.40625 -4.742188 2.40625 -4.015625 L 2.40625 0 L 1.234375 0 L 1.234375 -7.109375 L 2.40625 -7.109375 L 2.40625 -6.046875 C 2.613281 -6.453125 2.894531 -6.757812 3.25 -6.96875 C 3.601562 -7.175781 4.023438 -7.28125 4.515625 -7.28125 C 5.234375 -7.28125 5.769531 -7.039062 6.125 -6.5625 C 6.488281 -6.09375 6.671875 -5.375 6.671875 -4.40625 Z M 6.671875 -4.40625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-21">
+<path style="stroke:none;" d="M 7.09375 -7.109375 L 4.546875 -3.703125 L 7.34375 0 L 6 0 L 3.90625 -2.84375 L 1.828125 0 L 0.484375 0 L 3.28125 -3.703125 L 0.734375 -7.109375 L 2.03125 -7.109375 L 3.90625 -4.53125 L 5.78125 -7.109375 Z M 7.09375 -7.109375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-22">
+<path style="stroke:none;" d="M 0 -7.109375 L 1.15625 -7.109375 L 2.390625 -1.359375 L 3.40625 -5.03125 L 4.40625 -5.03125 L 5.4375 -1.359375 L 6.671875 -7.109375 L 7.828125 -7.109375 L 6.15625 0 L 5.046875 0 L 3.90625 -3.890625 L 2.78125 0 L 1.65625 0 Z M 0 -7.109375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-23">
+<path style="stroke:none;" d="M 5.453125 -6.203125 L 5.453125 -9.875 L 6.609375 -9.875 L 6.609375 0 L 5.453125 0 L 5.453125 -0.890625 C 5.253906 -0.546875 4.992188 -0.28125 4.671875 -0.09375 C 4.347656 0.09375 3.972656 0.1875 3.546875 0.1875 C 2.691406 0.1875 2.015625 -0.144531 1.515625 -0.8125 C 1.023438 -1.476562 0.78125 -2.398438 0.78125 -3.578125 C 0.78125 -4.734375 1.023438 -5.640625 1.515625 -6.296875 C 2.015625 -6.953125 2.691406 -7.28125 3.546875 -7.28125 C 3.972656 -7.28125 4.347656 -7.1875 4.671875 -7 C 5.003906 -6.820312 5.265625 -6.554688 5.453125 -6.203125 Z M 2.015625 -3.546875 C 2.015625 -2.640625 2.15625 -1.957031 2.4375 -1.5 C 2.726562 -1.039062 3.15625 -0.8125 3.71875 -0.8125 C 4.28125 -0.8125 4.707031 -1.039062 5 -1.5 C 5.300781 -1.96875 5.453125 -2.648438 5.453125 -3.546875 C 5.453125 -4.453125 5.300781 -5.132812 5 -5.59375 C 4.707031 -6.0625 4.28125 -6.296875 3.71875 -6.296875 C 3.15625 -6.296875 2.726562 -6.0625 2.4375 -5.59375 C 2.15625 -5.132812 2.015625 -4.4
 53125 2.015625 -3.546875 Z M 2.015625 -3.546875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-0">
+<path style="stroke:none;" d="M 0.640625 2.296875 L 0.640625 -9.171875 L 7.140625 -9.171875 L 7.140625 2.296875 Z M 1.375 1.578125 L 6.421875 1.578125 L 6.421875 -8.4375 L 1.375 -8.4375 Z M 1.375 1.578125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-1">
+<path style="stroke:none;" d="M 0.546875 -7.109375 L 1.71875 -7.109375 L 3.171875 -1.5625 L 4.625 -7.109375 L 6 -7.109375 L 7.46875 -1.5625 L 8.921875 -7.109375 L 10.09375 -7.109375 L 8.234375 0 L 6.84375 0 L 5.3125 -5.828125 L 3.78125 0 L 2.40625 0 Z M 0.546875 -7.109375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-2">
+<path style="stroke:none;" d="M 5.34375 -6.015625 C 5.207031 -6.085938 5.0625 -6.140625 4.90625 -6.171875 C 4.757812 -6.210938 4.59375 -6.234375 4.40625 -6.234375 C 3.75 -6.234375 3.242188 -6.019531 2.890625 -5.59375 C 2.535156 -5.164062 2.359375 -4.550781 2.359375 -3.75 L 2.359375 0 L 1.1875 0 L 1.1875 -7.109375 L 2.359375 -7.109375 L 2.359375 -6 C 2.597656 -6.4375 2.914062 -6.757812 3.3125 -6.96875 C 3.707031 -7.175781 4.1875 -7.28125 4.75 -7.28125 C 4.832031 -7.28125 4.921875 -7.273438 5.015625 -7.265625 C 5.109375 -7.253906 5.21875 -7.238281 5.34375 -7.21875 Z M 5.34375 -6.015625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-3">
+<path style="stroke:none;" d="M 1.21875 -7.109375 L 2.390625 -7.109375 L 2.390625 0 L 1.21875 0 Z M 1.21875 -9.875 L 2.390625 -9.875 L 2.390625 -8.390625 L 1.21875 -8.390625 Z M 1.21875 -9.875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-4">
+<path style="stroke:none;" d="M 2.375 -9.125 L 2.375 -7.109375 L 4.78125 -7.109375 L 4.78125 -6.203125 L 2.375 -6.203125 L 2.375 -2.34375 C 2.375 -1.757812 2.453125 -1.382812 2.609375 -1.21875 C 2.773438 -1.0625 3.101562 -0.984375 3.59375 -0.984375 L 4.78125 -0.984375 L 4.78125 0 L 3.59375 0 C 2.6875 0 2.0625 -0.164062 1.71875 -0.5 C 1.375 -0.84375 1.203125 -1.457031 1.203125 -2.34375 L 1.203125 -6.203125 L 0.34375 -6.203125 L 0.34375 -7.109375 L 1.203125 -7.109375 L 1.203125 -9.125 Z M 2.375 -9.125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-5">
+<path style="stroke:none;" d="M 7.3125 -3.84375 L 7.3125 -3.28125 L 1.9375 -3.28125 C 1.988281 -2.46875 2.226562 -1.851562 2.65625 -1.4375 C 3.09375 -1.019531 3.695312 -0.8125 4.46875 -0.8125 C 4.914062 -0.8125 5.347656 -0.863281 5.765625 -0.96875 C 6.191406 -1.082031 6.613281 -1.25 7.03125 -1.46875 L 7.03125 -0.359375 C 6.613281 -0.179688 6.179688 -0.046875 5.734375 0.046875 C 5.296875 0.140625 4.851562 0.1875 4.40625 0.1875 C 3.269531 0.1875 2.367188 -0.140625 1.703125 -0.796875 C 1.046875 -1.460938 0.71875 -2.359375 0.71875 -3.484375 C 0.71875 -4.648438 1.03125 -5.570312 1.65625 -6.25 C 2.289062 -6.9375 3.140625 -7.28125 4.203125 -7.28125 C 5.160156 -7.28125 5.914062 -6.972656 6.46875 -6.359375 C 7.03125 -5.742188 7.3125 -4.90625 7.3125 -3.84375 Z M 6.140625 -4.1875 C 6.128906 -4.820312 5.945312 -5.332031 5.59375 -5.71875 C 5.25 -6.101562 4.789062 -6.296875 4.21875 -6.296875 C 3.5625 -6.296875 3.035156 -6.109375 2.640625 -5.734375 C 2.253906 -5.367188 2.03125 -4.851562 1.96875 -4
 .1875 Z M 6.140625 -4.1875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-6">
+<path style="stroke:none;" d=""/>
+</symbol>
+<symbol overflow="visible" id="glyph1-7">
+<path style="stroke:none;" d="M 4.03125 -9.859375 C 3.46875 -8.890625 3.046875 -7.925781 2.765625 -6.96875 C 2.492188 -6.019531 2.359375 -5.054688 2.359375 -4.078125 C 2.359375 -3.097656 2.492188 -2.128906 2.765625 -1.171875 C 3.046875 -0.210938 3.46875 0.75 4.03125 1.71875 L 3.015625 1.71875 C 2.378906 0.71875 1.90625 -0.257812 1.59375 -1.21875 C 1.28125 -2.175781 1.125 -3.128906 1.125 -4.078125 C 1.125 -5.023438 1.28125 -5.972656 1.59375 -6.921875 C 1.90625 -7.878906 2.378906 -8.859375 3.015625 -9.859375 Z M 4.03125 -9.859375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-8">
+<path style="stroke:none;" d="M 1.21875 -9.875 L 2.390625 -9.875 L 2.390625 0 L 1.21875 0 Z M 1.21875 -9.875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-9">
+<path style="stroke:none;" d="M 3.984375 -6.296875 C 3.359375 -6.296875 2.863281 -6.050781 2.5 -5.5625 C 2.132812 -5.070312 1.953125 -4.398438 1.953125 -3.546875 C 1.953125 -2.691406 2.128906 -2.019531 2.484375 -1.53125 C 2.847656 -1.050781 3.347656 -0.8125 3.984375 -0.8125 C 4.597656 -0.8125 5.085938 -1.054688 5.453125 -1.546875 C 5.816406 -2.035156 6 -2.703125 6 -3.546875 C 6 -4.390625 5.816406 -5.054688 5.453125 -5.546875 C 5.085938 -6.046875 4.597656 -6.296875 3.984375 -6.296875 Z M 3.984375 -7.28125 C 4.992188 -7.28125 5.789062 -6.945312 6.375 -6.28125 C 6.957031 -5.625 7.25 -4.710938 7.25 -3.546875 C 7.25 -2.378906 6.957031 -1.460938 6.375 -0.796875 C 5.789062 -0.140625 4.992188 0.1875 3.984375 0.1875 C 2.960938 0.1875 2.160156 -0.140625 1.578125 -0.796875 C 1.003906 -1.460938 0.71875 -2.378906 0.71875 -3.546875 C 0.71875 -4.710938 1.003906 -5.625 1.578125 -6.28125 C 2.160156 -6.945312 2.960938 -7.28125 3.984375 -7.28125 Z M 3.984375 -7.28125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-10">
+<path style="stroke:none;" d="M 6.34375 -6.84375 L 6.34375 -5.75 C 6.007812 -5.925781 5.675781 -6.0625 5.34375 -6.15625 C 5.007812 -6.25 4.675781 -6.296875 4.34375 -6.296875 C 3.582031 -6.296875 2.992188 -6.050781 2.578125 -5.5625 C 2.160156 -5.082031 1.953125 -4.410156 1.953125 -3.546875 C 1.953125 -2.679688 2.160156 -2.007812 2.578125 -1.53125 C 2.992188 -1.050781 3.582031 -0.8125 4.34375 -0.8125 C 4.675781 -0.8125 5.007812 -0.851562 5.34375 -0.9375 C 5.675781 -1.03125 6.007812 -1.171875 6.34375 -1.359375 L 6.34375 -0.265625 C 6.019531 -0.117188 5.679688 -0.0078125 5.328125 0.0625 C 4.984375 0.144531 4.613281 0.1875 4.21875 0.1875 C 3.144531 0.1875 2.289062 -0.144531 1.65625 -0.8125 C 1.03125 -1.488281 0.71875 -2.398438 0.71875 -3.546875 C 0.71875 -4.703125 1.035156 -5.613281 1.671875 -6.28125 C 2.304688 -6.945312 3.179688 -7.28125 4.296875 -7.28125 C 4.648438 -7.28125 5 -7.242188 5.34375 -7.171875 C 5.6875 -7.097656 6.019531 -6.988281 6.34375 -6.84375 Z M 6.34375 -6.84375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-11">
+<path style="stroke:none;" d="M 1.1875 -9.875 L 2.359375 -9.875 L 2.359375 -4.046875 L 5.84375 -7.109375 L 7.328125 -7.109375 L 3.5625 -3.78125 L 7.484375 0 L 5.96875 0 L 2.359375 -3.46875 L 2.359375 0 L 1.1875 0 Z M 1.1875 -9.875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-12">
+<path style="stroke:none;" d="M 1.046875 -9.859375 L 2.0625 -9.859375 C 2.695312 -8.859375 3.171875 -7.878906 3.484375 -6.921875 C 3.796875 -5.972656 3.953125 -5.023438 3.953125 -4.078125 C 3.953125 -3.128906 3.796875 -2.175781 3.484375 -1.21875 C 3.171875 -0.257812 2.695312 0.71875 2.0625 1.71875 L 1.046875 1.71875 C 1.609375 0.75 2.023438 -0.210938 2.296875 -1.171875 C 2.578125 -2.128906 2.71875 -3.097656 2.71875 -4.078125 C 2.71875 -5.054688 2.578125 -6.019531 2.296875 -6.96875 C 2.023438 -7.925781 1.609375 -8.890625 1.046875 -9.859375 Z M 1.046875 -9.859375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-13">
+<path style="stroke:none;" d="M 4.453125 -3.578125 C 3.515625 -3.578125 2.863281 -3.46875 2.5 -3.25 C 2.132812 -3.03125 1.953125 -2.660156 1.953125 -2.140625 C 1.953125 -1.734375 2.085938 -1.40625 2.359375 -1.15625 C 2.628906 -0.914062 3 -0.796875 3.46875 -0.796875 C 4.113281 -0.796875 4.632812 -1.023438 5.03125 -1.484375 C 5.425781 -1.941406 5.625 -2.550781 5.625 -3.3125 L 5.625 -3.578125 Z M 6.78125 -4.0625 L 6.78125 0 L 5.625 0 L 5.625 -1.078125 C 5.351562 -0.648438 5.019531 -0.332031 4.625 -0.125 C 4.226562 0.0820312 3.738281 0.1875 3.15625 0.1875 C 2.425781 0.1875 1.847656 -0.015625 1.421875 -0.421875 C 0.992188 -0.835938 0.78125 -1.382812 0.78125 -2.0625 C 0.78125 -2.863281 1.046875 -3.46875 1.578125 -3.875 C 2.117188 -4.28125 2.921875 -4.484375 3.984375 -4.484375 L 5.625 -4.484375 L 5.625 -4.609375 C 5.625 -5.140625 5.445312 -5.550781 5.09375 -5.84375 C 4.738281 -6.144531 4.238281 -6.296875 3.59375 -6.296875 C 3.1875 -6.296875 2.789062 -6.242188 2.40625 -6.140625 C 2.019531 -
 6.046875 1.648438 -5.898438 1.296875 -5.703125 L 1.296875 -6.78125 C 1.722656 -6.945312 2.140625 -7.070312 2.546875 -7.15625 C 2.953125 -7.238281 3.34375 -7.28125 3.71875 -7.28125 C 4.75 -7.28125 5.515625 -7.015625 6.015625 -6.484375 C 6.523438 -5.953125 6.78125 -5.144531 6.78125 -4.0625 Z M 6.78125 -4.0625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-14">
+<path style="stroke:none;" d="M 5.90625 -6.03125 L 5.90625 -9.875 L 7.078125 -9.875 L 7.078125 0 L 5.90625 0 L 5.90625 -1.0625 C 5.65625 -0.644531 5.34375 -0.332031 4.96875 -0.125 C 4.59375 0.0820312 4.144531 0.1875 3.625 0.1875 C 2.769531 0.1875 2.070312 -0.15625 1.53125 -0.84375 C 0.988281 -1.53125 0.71875 -2.429688 0.71875 -3.546875 C 0.71875 -4.660156 0.988281 -5.5625 1.53125 -6.25 C 2.070312 -6.9375 2.769531 -7.28125 3.625 -7.28125 C 4.144531 -7.28125 4.59375 -7.175781 4.96875 -6.96875 C 5.34375 -6.769531 5.65625 -6.457031 5.90625 -6.03125 Z M 1.921875 -3.546875 C 1.921875 -2.691406 2.097656 -2.019531 2.453125 -1.53125 C 2.804688 -1.039062 3.289062 -0.796875 3.90625 -0.796875 C 4.53125 -0.796875 5.019531 -1.039062 5.375 -1.53125 C 5.726562 -2.019531 5.90625 -2.691406 5.90625 -3.546875 C 5.90625 -4.410156 5.726562 -5.082031 5.375 -5.5625 C 5.019531 -6.050781 4.53125 -6.296875 3.90625 -6.296875 C 3.289062 -6.296875 2.804688 -6.050781 2.453125 -5.5625 C 2.097656 -5.082031 1.921875
  -4.410156 1.921875 -3.546875 Z M 1.921875 -3.546875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-0">
+<path style="stroke:none;" d="M 0.796875 2.828125 L 0.796875 -11.28125 L 8.796875 -11.28125 L 8.796875 2.828125 Z M 1.703125 1.9375 L 7.90625 1.9375 L 7.90625 -10.390625 L 1.703125 -10.390625 Z M 1.703125 1.9375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-1">
+<path style="stroke:none;" d="M 5.75 -6.5 C 6.375 -6.5 6.820312 -6.613281 7.09375 -6.84375 C 7.375 -7.082031 7.515625 -7.46875 7.515625 -8 C 7.515625 -8.53125 7.375 -8.910156 7.09375 -9.140625 C 6.820312 -9.367188 6.375 -9.484375 5.75 -9.484375 L 4.484375 -9.484375 L 4.484375 -6.5 Z M 4.484375 -4.421875 L 4.484375 0 L 1.46875 0 L 1.46875 -11.671875 L 6.0625 -11.671875 C 7.601562 -11.671875 8.726562 -11.410156 9.4375 -10.890625 C 10.15625 -10.378906 10.515625 -9.566406 10.515625 -8.453125 C 10.515625 -7.679688 10.328125 -7.046875 9.953125 -6.546875 C 9.585938 -6.054688 9.03125 -5.691406 8.28125 -5.453125 C 8.6875 -5.359375 9.050781 -5.144531 9.375 -4.8125 C 9.707031 -4.488281 10.039062 -3.988281 10.375 -3.3125 L 12 0 L 8.796875 0 L 7.375 -2.90625 C 7.09375 -3.488281 6.800781 -3.882812 6.5 -4.09375 C 6.207031 -4.3125 5.816406 -4.421875 5.328125 -4.421875 Z M 4.484375 -4.421875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-2">
+<path style="stroke:none;" d="M 10.078125 -4.40625 L 10.078125 -3.609375 L 3.546875 -3.609375 C 3.609375 -2.953125 3.84375 -2.457031 4.25 -2.125 C 4.65625 -1.800781 5.222656 -1.640625 5.953125 -1.640625 C 6.546875 -1.640625 7.148438 -1.722656 7.765625 -1.890625 C 8.378906 -2.066406 9.015625 -2.332031 9.671875 -2.6875 L 9.671875 -0.53125 C 9.003906 -0.28125 8.335938 -0.09375 7.671875 0.03125 C 7.015625 0.164062 6.359375 0.234375 5.703125 0.234375 C 4.117188 0.234375 2.882812 -0.164062 2 -0.96875 C 1.125 -1.78125 0.6875 -2.914062 0.6875 -4.375 C 0.6875 -5.800781 1.117188 -6.921875 1.984375 -7.734375 C 2.847656 -8.554688 4.035156 -8.96875 5.546875 -8.96875 C 6.921875 -8.96875 8.019531 -8.550781 8.84375 -7.71875 C 9.664062 -6.894531 10.078125 -5.789062 10.078125 -4.40625 Z M 7.203125 -5.328125 C 7.203125 -5.859375 7.046875 -6.285156 6.734375 -6.609375 C 6.429688 -6.941406 6.03125 -7.109375 5.53125 -7.109375 C 4.988281 -7.109375 4.546875 -6.953125 4.203125 -6.640625 C 3.867188 -6.335938 
 3.660156 -5.898438 3.578125 -5.328125 Z M 7.203125 -5.328125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-3">
+<path style="stroke:none;" d="M 1.34375 -12.15625 L 4.140625 -12.15625 L 4.140625 0 L 1.34375 0 Z M 1.34375 -12.15625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-4">
+<path style="stroke:none;" d="M 5.265625 -3.9375 C 4.679688 -3.9375 4.242188 -3.835938 3.953125 -3.640625 C 3.660156 -3.441406 3.515625 -3.148438 3.515625 -2.765625 C 3.515625 -2.410156 3.628906 -2.132812 3.859375 -1.9375 C 4.097656 -1.738281 4.429688 -1.640625 4.859375 -1.640625 C 5.378906 -1.640625 5.816406 -1.828125 6.171875 -2.203125 C 6.535156 -2.578125 6.71875 -3.050781 6.71875 -3.625 L 6.71875 -3.9375 Z M 9.546875 -5 L 9.546875 0 L 6.71875 0 L 6.71875 -1.296875 C 6.34375 -0.765625 5.921875 -0.375 5.453125 -0.125 C 4.984375 0.113281 4.414062 0.234375 3.75 0.234375 C 2.84375 0.234375 2.101562 -0.03125 1.53125 -0.5625 C 0.96875 -1.09375 0.6875 -1.78125 0.6875 -2.625 C 0.6875 -3.65625 1.039062 -4.410156 1.75 -4.890625 C 2.457031 -5.367188 3.566406 -5.609375 5.078125 -5.609375 L 6.71875 -5.609375 L 6.71875 -5.828125 C 6.71875 -6.265625 6.539062 -6.585938 6.1875 -6.796875 C 5.84375 -7.003906 5.300781 -7.109375 4.5625 -7.109375 C 3.96875 -7.109375 3.410156 -7.046875 2.890625 -6.9218
 75 C 2.378906 -6.804688 1.898438 -6.628906 1.453125 -6.390625 L 1.453125 -8.515625 C 2.054688 -8.660156 2.660156 -8.769531 3.265625 -8.84375 C 3.867188 -8.925781 4.472656 -8.96875 5.078125 -8.96875 C 6.648438 -8.96875 7.785156 -8.65625 8.484375 -8.03125 C 9.191406 -7.40625 9.546875 -6.394531 9.546875 -5 Z M 9.546875 -5 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-5">
+<path style="stroke:none;" d="M 0.203125 -8.75 L 3 -8.75 L 5.34375 -2.8125 L 7.34375 -8.75 L 10.140625 -8.75 L 6.46875 0.828125 C 6.09375 1.804688 5.660156 2.488281 5.171875 2.875 C 4.679688 3.257812 4.03125 3.453125 3.21875 3.453125 L 1.609375 3.453125 L 1.609375 1.625 L 2.484375 1.625 C 2.953125 1.625 3.296875 1.546875 3.515625 1.390625 C 3.734375 1.242188 3.898438 0.972656 4.015625 0.578125 L 4.09375 0.34375 Z M 0.203125 -8.75 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-6">
+<path style="stroke:none;" d="M 1.46875 -11.671875 L 4.484375 -11.671875 L 4.484375 -2.28125 L 9.765625 -2.28125 L 9.765625 0 L 1.46875 0 Z M 1.46875 -11.671875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-7">
+<path style="stroke:none;" d="M 1.34375 -8.75 L 4.140625 -8.75 L 4.140625 0 L 1.34375 0 Z M 1.34375 -12.15625 L 4.140625 -12.15625 L 4.140625 -9.875 L 1.34375 -9.875 Z M 1.34375 -12.15625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-8">
+<path style="stroke:none;" d="M 8.1875 -8.484375 L 8.1875 -6.359375 C 7.582031 -6.609375 7 -6.796875 6.4375 -6.921875 C 5.882812 -7.046875 5.363281 -7.109375 4.875 -7.109375 C 4.34375 -7.109375 3.945312 -7.039062 3.6875 -6.90625 C 3.425781 -6.769531 3.296875 -6.566406 3.296875 -6.296875 C 3.296875 -6.066406 3.394531 -5.890625 3.59375 -5.765625 C 3.789062 -5.648438 4.140625 -5.566406 4.640625 -5.515625 L 5.140625 -5.4375 C 6.566406 -5.257812 7.523438 -4.960938 8.015625 -4.546875 C 8.515625 -4.128906 8.765625 -3.472656 8.765625 -2.578125 C 8.765625 -1.648438 8.421875 -0.945312 7.734375 -0.46875 C 7.046875 0 6.019531 0.234375 4.65625 0.234375 C 4.082031 0.234375 3.484375 0.1875 2.859375 0.09375 C 2.242188 0 1.613281 -0.140625 0.96875 -0.328125 L 0.96875 -2.453125 C 1.519531 -2.179688 2.085938 -1.976562 2.671875 -1.84375 C 3.265625 -1.707031 3.863281 -1.640625 4.46875 -1.640625 C 5.007812 -1.640625 5.414062 -1.710938 5.6875 -1.859375 C 5.96875 -2.015625 6.109375 -2.238281 6.109375 -2.53
 125 C 6.109375 -2.78125 6.015625 -2.96875 5.828125 -3.09375 C 5.640625 -3.21875 5.257812 -3.3125 4.6875 -3.375 L 4.203125 -3.4375 C 2.953125 -3.59375 2.078125 -3.878906 1.578125 -4.296875 C 1.078125 -4.722656 0.828125 -5.367188 0.828125 -6.234375 C 0.828125 -7.160156 1.144531 -7.847656 1.78125 -8.296875 C 2.414062 -8.742188 3.390625 -8.96875 4.703125 -8.96875 C 5.222656 -8.96875 5.765625 -8.925781 6.328125 -8.84375 C 6.898438 -8.769531 7.519531 -8.648438 8.1875 -8.484375 Z M 8.1875 -8.484375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-9">
+<path style="stroke:none;" d="M 4.40625 -11.234375 L 4.40625 -8.75 L 7.28125 -8.75 L 7.28125 -6.75 L 4.40625 -6.75 L 4.40625 -3.046875 C 4.40625 -2.640625 4.484375 -2.363281 4.640625 -2.21875 C 4.804688 -2.070312 5.128906 -2 5.609375 -2 L 7.046875 -2 L 7.046875 0 L 4.640625 0 C 3.535156 0 2.753906 -0.226562 2.296875 -0.6875 C 1.835938 -1.15625 1.609375 -1.941406 1.609375 -3.046875 L 1.609375 -6.75 L 0.21875 -6.75 L 0.21875 -8.75 L 1.609375 -8.75 L 1.609375 -11.234375 Z M 4.40625 -11.234375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-10">
+<path style="stroke:none;" d="M 4.484375 -9.390625 L 4.484375 -2.28125 L 5.5625 -2.28125 C 6.789062 -2.28125 7.726562 -2.582031 8.375 -3.1875 C 9.019531 -3.800781 9.34375 -4.6875 9.34375 -5.84375 C 9.34375 -7 9.019531 -7.878906 8.375 -8.484375 C 7.726562 -9.085938 6.789062 -9.390625 5.5625 -9.390625 Z M 1.46875 -11.671875 L 4.640625 -11.671875 C 6.410156 -11.671875 7.726562 -11.539062 8.59375 -11.28125 C 9.46875 -11.03125 10.210938 -10.601562 10.828125 -10 C 11.378906 -9.476562 11.785156 -8.875 12.046875 -8.1875 C 12.316406 -7.5 12.453125 -6.71875 12.453125 -5.84375 C 12.453125 -4.96875 12.316406 -4.179688 12.046875 -3.484375 C 11.785156 -2.796875 11.378906 -2.191406 10.828125 -1.671875 C 10.203125 -1.066406 9.453125 -0.632812 8.578125 -0.375 C 7.703125 -0.125 6.390625 0 4.640625 0 L 1.46875 0 Z M 1.46875 -11.671875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-11">
+<path style="stroke:none;" d="M 10.140625 -5.328125 L 10.140625 0 L 7.328125 0 L 7.328125 -4.078125 C 7.328125 -4.835938 7.3125 -5.359375 7.28125 -5.640625 C 7.25 -5.929688 7.191406 -6.144531 7.109375 -6.28125 C 6.992188 -6.457031 6.84375 -6.597656 6.65625 -6.703125 C 6.46875 -6.804688 6.253906 -6.859375 6.015625 -6.859375 C 5.429688 -6.859375 4.972656 -6.628906 4.640625 -6.171875 C 4.304688 -5.722656 4.140625 -5.101562 4.140625 -4.3125 L 4.140625 0 L 1.34375 0 L 1.34375 -8.75 L 4.140625 -8.75 L 4.140625 -7.46875 C 4.566406 -7.976562 5.015625 -8.351562 5.484375 -8.59375 C 5.960938 -8.84375 6.488281 -8.96875 7.0625 -8.96875 C 8.070312 -8.96875 8.835938 -8.65625 9.359375 -8.03125 C 9.878906 -7.414062 10.140625 -6.515625 10.140625 -5.328125 Z M 10.140625 -5.328125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-12">
+<path style="stroke:none;" d="M 5.515625 -6.96875 C 4.890625 -6.96875 4.414062 -6.742188 4.09375 -6.296875 C 3.769531 -5.847656 3.609375 -5.207031 3.609375 -4.375 C 3.609375 -3.53125 3.769531 -2.882812 4.09375 -2.4375 C 4.414062 -2 4.890625 -1.78125 5.515625 -1.78125 C 6.117188 -1.78125 6.582031 -2 6.90625 -2.4375 C 7.226562 -2.882812 7.390625 -3.53125 7.390625 -4.375 C 7.390625 -5.207031 7.226562 -5.847656 6.90625 -6.296875 C 6.582031 -6.742188 6.117188 -6.96875 5.515625 -6.96875 Z M 5.515625 -8.96875 C 7.015625 -8.96875 8.1875 -8.5625 9.03125 -7.75 C 9.882812 -6.9375 10.3125 -5.8125 10.3125 -4.375 C 10.3125 -2.9375 9.882812 -1.804688 9.03125 -0.984375 C 8.1875 -0.171875 7.015625 0.234375 5.515625 0.234375 C 4.003906 0.234375 2.820312 -0.171875 1.96875 -0.984375 C 1.113281 -1.804688 0.6875 -2.9375 0.6875 -4.375 C 0.6875 -5.8125 1.113281 -6.9375 1.96875 -7.75 C 2.820312 -8.5625 4.003906 -8.96875 5.515625 -8.96875 Z M 5.515625 -8.96875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-13">
+<path style="stroke:none;" d="M 1.25 -3.40625 L 1.25 -8.75 L 4.0625 -8.75 L 4.0625 -7.875 C 4.0625 -7.40625 4.054688 -6.8125 4.046875 -6.09375 C 4.046875 -5.375 4.046875 -4.894531 4.046875 -4.65625 C 4.046875 -3.957031 4.0625 -3.453125 4.09375 -3.140625 C 4.132812 -2.828125 4.203125 -2.601562 4.296875 -2.46875 C 4.410156 -2.28125 4.554688 -2.132812 4.734375 -2.03125 C 4.921875 -1.9375 5.132812 -1.890625 5.375 -1.890625 C 5.957031 -1.890625 6.414062 -2.113281 6.75 -2.5625 C 7.082031 -3.007812 7.25 -3.632812 7.25 -4.4375 L 7.25 -8.75 L 10.046875 -8.75 L 10.046875 0 L 7.25 0 L 7.25 -1.265625 C 6.832031 -0.753906 6.382812 -0.375 5.90625 -0.125 C 5.4375 0.113281 4.921875 0.234375 4.359375 0.234375 C 3.347656 0.234375 2.578125 -0.078125 2.046875 -0.703125 C 1.515625 -1.328125 1.25 -2.226562 1.25 -3.40625 Z M 1.25 -3.40625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-14">
+<path style="stroke:none;" d="M 9.453125 -7.296875 C 9.804688 -7.835938 10.226562 -8.25 10.71875 -8.53125 C 11.207031 -8.820312 11.742188 -8.96875 12.328125 -8.96875 C 13.328125 -8.96875 14.085938 -8.65625 14.609375 -8.03125 C 15.140625 -7.414062 15.40625 -6.515625 15.40625 -5.328125 L 15.40625 0 L 12.59375 0 L 12.59375 -4.5625 C 12.601562 -4.632812 12.609375 -4.707031 12.609375 -4.78125 C 12.609375 -4.851562 12.609375 -4.957031 12.609375 -5.09375 C 12.609375 -5.707031 12.515625 -6.15625 12.328125 -6.4375 C 12.148438 -6.71875 11.859375 -6.859375 11.453125 -6.859375 C 10.921875 -6.859375 10.507812 -6.640625 10.21875 -6.203125 C 9.9375 -5.765625 9.789062 -5.128906 9.78125 -4.296875 L 9.78125 0 L 6.96875 0 L 6.96875 -4.5625 C 6.96875 -5.53125 6.882812 -6.15625 6.71875 -6.4375 C 6.550781 -6.71875 6.253906 -6.859375 5.828125 -6.859375 C 5.285156 -6.859375 4.867188 -6.632812 4.578125 -6.1875 C 4.285156 -5.75 4.140625 -5.125 4.140625 -4.3125 L 4.140625 0 L 1.328125 0 L 1.328125 -8.75 L 4.1
 40625 -8.75 L 4.140625 -7.46875 C 4.484375 -7.96875 4.878906 -8.34375 5.328125 -8.59375 C 5.773438 -8.84375 6.265625 -8.96875 6.796875 -8.96875 C 7.398438 -8.96875 7.929688 -8.820312 8.390625 -8.53125 C 8.859375 -8.238281 9.210938 -7.828125 9.453125 -7.296875 Z M 9.453125 -7.296875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-15">
+<path style="stroke:none;" d="M 4.140625 -1.265625 L 4.140625 3.328125 L 1.34375 3.328125 L 1.34375 -8.75 L 4.140625 -8.75 L 4.140625 -7.46875 C 4.523438 -7.976562 4.953125 -8.351562 5.421875 -8.59375 C 5.890625 -8.84375 6.429688 -8.96875 7.046875 -8.96875 C 8.117188 -8.96875 9 -8.535156 9.6875 -7.671875 C 10.382812 -6.816406 10.734375 -5.71875 10.734375 -4.375 C 10.734375 -3.019531 10.382812 -1.910156 9.6875 -1.046875 C 9 -0.191406 8.117188 0.234375 7.046875 0.234375 C 6.429688 0.234375 5.890625 0.113281 5.421875 -0.125 C 4.953125 -0.375 4.523438 -0.753906 4.140625 -1.265625 Z M 6 -6.9375 C 5.40625 -6.9375 4.945312 -6.710938 4.625 -6.265625 C 4.300781 -5.828125 4.140625 -5.195312 4.140625 -4.375 C 4.140625 -3.539062 4.300781 -2.90625 4.625 -2.46875 C 4.945312 -2.03125 5.40625 -1.8125 6 -1.8125 C 6.601562 -1.8125 7.0625 -2.03125 7.375 -2.46875 C 7.6875 -2.90625 7.84375 -3.539062 7.84375 -4.375 C 7.84375 -5.207031 7.6875 -5.84375 7.375 -6.28125 C 7.0625 -6.71875 6.601562 -6.9375 6 -6
 .9375 Z M 6 -6.9375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-16">
+<path style="stroke:none;" d="M 1.640625 -3.03125 L 4.453125 -3.03125 L 4.453125 0 L 1.640625 0 Z M 1.640625 -3.03125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-17">
+<path style="stroke:none;" d="M 5.453125 -6.9375 C 4.859375 -6.9375 4.40625 -6.71875 4.09375 -6.28125 C 3.78125 -5.84375 3.625 -5.207031 3.625 -4.375 C 3.625 -3.539062 3.78125 -2.90625 4.09375 -2.46875 C 4.40625 -2.03125 4.859375 -1.8125 5.453125 -1.8125 C 6.054688 -1.8125 6.515625 -2.03125 6.828125 -2.46875 C 7.140625 -2.90625 7.296875 -3.539062 7.296875 -4.375 C 7.296875 -5.207031 7.140625 -5.84375 6.828125 -6.28125 C 6.515625 -6.71875 6.054688 -6.9375 5.453125 -6.9375 Z M 7.296875 -1.265625 C 6.910156 -0.753906 6.484375 -0.375 6.015625 -0.125 C 5.554688 0.113281 5.023438 0.234375 4.421875 0.234375 C 3.335938 0.234375 2.445312 -0.191406 1.75 -1.046875 C 1.0625 -1.910156 0.71875 -3.019531 0.71875 -4.375 C 0.71875 -5.71875 1.0625 -6.816406 1.75 -7.671875 C 2.445312 -8.523438 3.335938 -8.953125 4.421875 -8.953125 C 5.023438 -8.953125 5.554688 -8.832031 6.015625 -8.59375 C 6.484375 -8.351562 6.910156 -7.972656 7.296875 -7.453125 L 7.296875 -8.75 L 10.109375 -8.75 L 10.109375 3.328125 
 L 7.296875 3.328125 Z M 7.296875 -1.265625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-18">
+<path style="stroke:none;" d="M 7.296875 -7.46875 L 7.296875 -12.15625 L 10.109375 -12.15625 L 10.109375 0 L 7.296875 0 L 7.296875 -1.265625 C 6.910156 -0.753906 6.484375 -0.375 6.015625 -0.125 C 5.554688 0.113281 5.023438 0.234375 4.421875 0.234375 C 3.335938 0.234375 2.445312 -0.191406 1.75 -1.046875 C 1.0625 -1.910156 0.71875 -3.019531 0.71875 -4.375 C 0.71875 -5.71875 1.0625 -6.816406 1.75 -7.671875 C 2.445312 -8.535156 3.335938 -8.96875 4.421875 -8.96875 C 5.023438 -8.96875 5.554688 -8.84375 6.015625 -8.59375 C 6.484375 -8.351562 6.910156 -7.976562 7.296875 -7.46875 Z M 5.453125 -1.8125 C 6.054688 -1.8125 6.515625 -2.03125 6.828125 -2.46875 C 7.140625 -2.90625 7.296875 -3.539062 7.296875 -4.375 C 7.296875 -5.207031 7.140625 -5.84375 6.828125 -6.28125 C 6.515625 -6.71875 6.054688 -6.9375 5.453125 -6.9375 C 4.859375 -6.9375 4.40625 -6.71875 4.09375 -6.28125 C 3.78125 -5.84375 3.625 -5.207031 3.625 -4.375 C 3.625 -3.539062 3.78125 -2.90625 4.09375 -2.46875 C 4.40625 -2.03125 4.859
 375 -1.8125 5.453125 -1.8125 Z M 5.453125 -1.8125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-19">
+<path style="stroke:none;" d="M 7.84375 -6.375 C 7.601562 -6.488281 7.359375 -6.570312 7.109375 -6.625 C 6.867188 -6.675781 6.628906 -6.703125 6.390625 -6.703125 C 5.671875 -6.703125 5.113281 -6.472656 4.71875 -6.015625 C 4.332031 -5.554688 4.140625 -4.894531 4.140625 -4.03125 L 4.140625 0 L 1.34375 0 L 1.34375 -8.75 L 4.140625 -8.75 L 4.140625 -7.3125 C 4.503906 -7.882812 4.914062 -8.300781 5.375 -8.5625 C 5.84375 -8.832031 6.40625 -8.96875 7.0625 -8.96875 C 7.15625 -8.96875 7.253906 -8.960938 7.359375 -8.953125 C 7.472656 -8.941406 7.632812 -8.925781 7.84375 -8.90625 Z M 7.84375 -6.375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph2-20">
+<path style="stroke:none;" d=""/>
+</symbol>
+<symbol overflow="visible" id="glyph2-21">
+<path style="stroke:none;" d="M 7.703125 -12.15625 L 10.515625 -12.15625 L 10.515625 -9.875 L 7.703125 -9.875 Z M 7.125 -12.15625 L 7.125 -10.328125 L 5.578125 -10.328125 C 5.179688 -10.328125 4.90625 -10.253906 4.75 -10.109375 C 4.601562 -9.960938 4.53125 -9.710938 4.53125 -9.359375 L 4.53125 -8.75 L 10.515625 -8.75 L 10.515625 0 L 7.703125 0 L 7.703125 -6.75 L 4.53125 -6.75 L 4.53125 0 L 1.71875 0 L 1.71875 -6.75 L 0.34375 -6.75 L 0.34375 -8.75 L 1.71875 -8.75 L 1.71875 -9.359375 C 1.71875 -10.316406 1.984375 -11.019531 2.515625 -11.46875 C 3.046875 -11.925781 3.867188 -12.15625 4.984375 -12.15625 Z M 7.125 -12.15625 "/>
+</symbol>
+</g>
+</defs>
+<g id="surface9983">
+<rect x="0" y="0" width="463" height="653" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -3.2999 9.249942 L -0.304978 9.249942 L 0.295022 9.849942 L 0.295022 10.949942 L -3.2999 10.949942 Z M -3.2999 9.249942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.05;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -0.304978 9.249942 L -0.304978 9.849942 L 0.295022 9.849942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph0-1" x="54" y="36.806749"/>
+  <use xlink:href="#glyph0-2" x="61.826606" y="36.806749"/>
+  <use xlink:href="#glyph0-3" x="69.653212" y="36.806749"/>
+  <use xlink:href="#glyph0-1" x="77.479818" y="36.806749"/>
+  <use xlink:href="#glyph0-2" x="85.306424" y="36.806749"/>
+  <use xlink:href="#glyph0-4" x="93.13303" y="36.806749"/>
+  <use xlink:href="#glyph0-5" x="100.959635" y="36.806749"/>
+</g>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.295022 10.099942 L 3.778811 10.099942 L 3.778811 9.98002 L 6.775881 9.98002 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.150881 9.98002 L 6.650881 10.23002 L 6.775881 9.98002 L 6.650881 9.73002 Z M 7.150881 9.98002 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -5.5499 11.549942 L -0.244822 11.549942 L 0.355178 12.149942 L 0.355178 13.249942 L -5.5499 13.249942 Z M -5.5499 11.549942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.05;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -0.244822 11.549942 L -0.244822 12.149942 L 0.355178 12.149942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph0-6" x="9" y="82.806749"/>
+  <use xlink:href="#glyph0-2" x="16.826606" y="82.806749"/>
+  <use xlink:href="#glyph0-4" x="24.653212" y="82.806749"/>
+  <use xlink:href="#glyph0-7" x="32.479818" y="82.806749"/>
+  <use xlink:href="#glyph0-8" x="40.306424" y="82.806749"/>
+  <use xlink:href="#glyph0-9" x="48.13303" y="82.806749"/>
+  <use xlink:href="#glyph0-1" x="55.959635" y="82.806749"/>
+  <use xlink:href="#glyph0-10" x="63.786241" y="82.806749"/>
+  <use xlink:href="#glyph0-11" x="71.612847" y="82.806749"/>
+  <use xlink:href="#glyph0-1" x="79.439453" y="82.806749"/>
+  <use xlink:href="#glyph0-10" x="87.266059" y="82.806749"/>
+  <use xlink:href="#glyph0-7" x="95.092665" y="82.806749"/>
+  <use xlink:href="#glyph0-12" x="102.919271" y="82.806749"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph1-1" x="147" y="12.904405"/>
+  <use xlink:href="#glyph1-2" x="157.632324" y="12.904405"/>
+  <use xlink:href="#glyph1-3" x="162.977105" y="12.904405"/>
+  <use xlink:href="#glyph1-4" x="166.58903" y="12.904405"/>
+  <use xlink:href="#glyph1-5" x="171.686144" y="12.904405"/>
+  <use xlink:href="#glyph1-6" x="179.684191" y="12.904405"/>
+  <use xlink:href="#glyph1-7" x="183.816406" y="12.904405"/>
+  <use xlink:href="#glyph1-8" x="188.888292" y="12.904405"/>
+  <use xlink:href="#glyph1-9" x="192.500217" y="12.904405"/>
+  <use xlink:href="#glyph1-10" x="200.453776" y="12.904405"/>
+  <use xlink:href="#glyph1-11" x="207.601128" y="12.904405"/>
+  <use xlink:href="#glyph1-12" x="215.12934" y="12.904405"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph1-2" x="155" y="85.904405"/>
+  <use xlink:href="#glyph1-5" x="160.059136" y="85.904405"/>
+  <use xlink:href="#glyph1-13" x="168.057183" y="85.904405"/>
+  <use xlink:href="#glyph1-14" x="176.023492" y="85.904405"/>
+</g>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.355178 12.399942 L 3.808889 12.399942 L 3.808889 11.48002 L 6.775881 11.48002 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.150881 11.48002 L 6.650881 11.73002 L 6.775881 11.48002 L 6.650881 11.23002 Z M 7.150881 11.48002 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.355178 13.249942 L 3.852639 13.249942 L 3.852639 13.749942 L 6.863381 13.749942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.238381 13.749942 L 6.738381 13.999942 L 6.863381 13.749942 L 6.738381 13.499942 Z M 7.238381 13.749942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 9.656545 16.508536 L 9.656545 16.849942 L 9.635256 16.849942 L 9.635256 17.749942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 9.656545 15.249942 L 9.896389 15.949942 L 9.656545 16.649942 L 9.416506 15.949942 Z M 9.656545 15.249942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.150295 17.749942 L 11.120217 17.749942 L 11.120217 19.149942 L 8.150295 19.149942 Z M 8.150295 17.749942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph2-1" x="281.015625" y="200.906304"/>
+  <use xlink:href="#glyph2-2" x="293.336046" y="200.906304"/>
+  <use xlink:href="#glyph2-3" x="304.187554" y="200.906304"/>
+  <use xlink:href="#glyph2-4" x="309.672038" y="200.906304"/>
+  <use xlink:href="#glyph2-5" x="319.976942" y="200.906304"/>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.150295 19.149942 L 11.120217 19.149942 L 11.120217 19.549942 L 8.150295 19.549942 Z M 8.150295 19.149942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.150295 19.549942 L 11.120217 19.549942 L 11.120217 19.949942 L 8.150295 19.949942 Z M 8.150295 19.549942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.350295 13.049942 L 11.962795 13.049942 L 11.962795 14.449942 L 7.350295 14.449942 Z M 7.350295 13.049942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph2-1" x="265.015625" y="106.906304"/>
+  <use xlink:href="#glyph2-2" x="277.336046" y="106.906304"/>
+  <use xlink:href="#glyph2-3" x="288.187554" y="106.906304"/>
+  <use xlink:href="#glyph2-4" x="293.672038" y="106.906304"/>
+  <use xlink:href="#glyph2-5" x="303.976942" y="106.906304"/>
+  <use xlink:href="#glyph2-6" x="314.40663" y="106.906304"/>
+  <use xlink:href="#glyph2-7" x="324.601942" y="106.906304"/>
+  <use xlink:href="#glyph2-8" x="330.086426" y="106.906304"/>
+  <use xlink:href="#glyph2-9" x="339.609809" y="106.906304"/>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.350295 14.449942 L 11.962795 14.449942 L 11.962795 14.849942 L 7.350295 14.849942 Z M 7.350295 14.449942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.350295 14.849942 L 11.962795 14.849942 L 11.962795 15.249942 L 7.350295 15.249942 Z M 7.350295 14.849942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -5.499705 21.099942 L -0.194822 21.099942 L 0.405178 21.699942 L 0.405178 22.799942 L -5.499705 22.799942 Z M -5.499705 21.099942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.05;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -0.194822 21.099942 L -0.194822 21.699942 L 0.405178 21.699942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph0-13" x="10.003906" y="273.806749"/>
+  <use xlink:href="#glyph0-2" x="17.830512" y="273.806749"/>
+  <use xlink:href="#glyph0-14" x="25.657118" y="273.806749"/>
+  <use xlink:href="#glyph0-4" x="33.483724" y="273.806749"/>
+  <use xlink:href="#glyph0-15" x="41.31033" y="273.806749"/>
+  <use xlink:href="#glyph0-1" x="49.136936" y="273.806749"/>
+  <use xlink:href="#glyph0-2" x="56.963542" y="273.806749"/>
+  <use xlink:href="#glyph0-8" x="64.790148" y="273.806749"/>
+  <use xlink:href="#glyph0-1" x="72.616753" y="273.806749"/>
+  <use xlink:href="#glyph0-2" x="80.443359" y="273.806749"/>
+  <use xlink:href="#glyph0-16" x="88.269965" y="273.806749"/>
+  <use xlink:href="#glyph0-14" x="96.096571" y="273.806749"/>
+  <use xlink:href="#glyph0-12" x="103.923177" y="273.806749"/>
+</g>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.405178 21.949942 L 4.252444 21.949942 L 4.252444 18.849942 L 7.612991 18.849942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.987991 18.849942 L 7.487991 19.099942 L 7.612991 18.849942 L 7.487991 18.599942 Z M 7.987991 18.849942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.262795 9.28002 L 11.875295 9.28002 L 11.875295 10.68002 L 7.262795 10.68002 Z M 7.262795 9.28002 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph2-1" x="263.265625" y="31.507867"/>
+  <use xlink:href="#glyph2-2" x="275.586046" y="31.507867"/>
+  <use xlink:href="#glyph2-3" x="286.437554" y="31.507867"/>
+  <use xlink:href="#glyph2-4" x="291.922038" y="31.507867"/>
+  <use xlink:href="#glyph2-5" x="302.226942" y="31.507867"/>
+  <use xlink:href="#glyph2-6" x="312.65663" y="31.507867"/>
+  <use xlink:href="#glyph2-7" x="322.851942" y="31.507867"/>
+  <use xlink:href="#glyph2-8" x="328.336426" y="31.507867"/>
+  <use xlink:href="#glyph2-9" x="337.859809" y="31.507867"/>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.262795 10.68002 L 11.875295 10.68002 L 11.875295 11.08002 L 7.262795 11.08002 Z M 7.262795 10.68002 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.262795 11.08002 L 11.875295 11.08002 L 11.875295 11.48002 L 7.262795 11.48002 Z M 7.262795 11.08002 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.012795 22.149942 L 15.382717 22.149942 L 15.382717 23.549942 L 8.012795 23.549942 Z M 8.012795 22.149942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph2-10" x="278.28125" y="288.906304"/>
+  <use xlink:href="#glyph2-2" x="291.5625" y="288.906304"/>
+  <use xlink:href="#glyph2-8" x="302.414008" y="288.906304"/>
+  <use xlink:href="#glyph2-9" x="311.937391" y="288.906304"/>
+  <use xlink:href="#glyph2-7" x="319.585775" y="288.906304"/>
+  <use xlink:href="#glyph2-11" x="325.070258" y="288.906304"/>
+  <use xlink:href="#glyph2-4" x="336.460775" y="288.906304"/>
+  <use xlink:href="#glyph2-9" x="347.257758" y="288.906304"/>
+  <use xlink:href="#glyph2-7" x="354.906141" y="288.906304"/>
+  <use xlink:href="#glyph2-12" x="360.390625" y="288.906304"/>
+  <use xlink:href="#glyph2-11" x="371.382921" y="288.906304"/>
+  <use xlink:href="#glyph2-6" x="382.773438" y="288.906304"/>
+  <use xlink:href="#glyph2-7" x="392.96875" y="288.906304"/>
+  <use xlink:href="#glyph2-8" x="398.453234" y="288.906304"/>
+  <use xlink:href="#glyph2-9" x="407.976617" y="288.906304"/>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.012795 23.549942 L 15.382717 23.549942 L 15.382717 23.949942 L 8.012795 23.949942 Z M 8.012795 23.549942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.012795 23.949942 L 15.382717 23.949942 L 15.382717 24.349942 L 8.012795 24.349942 Z M 8.012795 23.949942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.405178 22.799942 L 4.209084 22.799942 L 4.209084 22.849942 L 7.526077 22.849942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.901077 22.849942 L 7.401077 23.099942 L 7.526077 22.849942 L 7.401077 22.599942 Z M 7.901077 22.849942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.405178 21.099942 L 0.405178 18.174942 L 7.350295 18.174942 L 7.350295 15.736856 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.350295 15.361856 L 7.600295 15.861856 L 7.350295 15.736856 L 7.100295 15.861856 Z M 7.350295 15.361856 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.062795 26.149942 L 11.422756 26.149942 L 11.422756 27.549942 L 8.062795 27.549942 Z M 8.062795 26.149942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph2-1" x="279.261719" y="368.906304"/>
+  <use xlink:href="#glyph2-2" x="291.58214" y="368.906304"/>
+  <use xlink:href="#glyph2-8" x="302.433648" y="368.906304"/>
+  <use xlink:href="#glyph2-13" x="311.957031" y="368.906304"/>
+  <use xlink:href="#glyph2-3" x="323.347548" y="368.906304"/>
+  <use xlink:href="#glyph2-9" x="328.832031" y="368.906304"/>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.062795 27.549942 L 11.422756 27.549942 L 11.422756 27.949942 L 8.062795 27.949942 Z M 8.062795 27.549942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.062795 27.949942 L 11.422756 27.949942 L 11.422756 28.349942 L 8.062795 28.349942 Z M 8.062795 27.949942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -2.547361 22.799942 L -2.547361 28.349942 L 7.576077 28.349942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.951077 28.349942 L 7.451077 28.599942 L 7.576077 28.349942 L 7.451077 28.099942 Z M 7.951077 28.349942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.112795 30.099942 L 17.215334 30.099942 L 17.215334 31.499942 L 8.112795 31.499942 Z M 8.112795 30.099942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph2-1" x="280.28125" y="447.906304"/>
+  <use xlink:href="#glyph2-2" x="292.601671" y="447.906304"/>
+  <use xlink:href="#glyph2-8" x="303.453179" y="447.906304"/>
+  <use xlink:href="#glyph2-13" x="312.976562" y="447.906304"/>
+  <use xlink:href="#glyph2-3" x="324.367079" y="447.906304"/>
+  <use xlink:href="#glyph2-9" x="329.851562" y="447.906304"/>
+  <use xlink:href="#glyph2-10" x="337.499946" y="447.906304"/>
+  <use xlink:href="#glyph2-13" x="350.781196" y="447.906304"/>
+  <use xlink:href="#glyph2-14" x="362.171712" y="447.906304"/>
+  <use xlink:href="#glyph2-15" x="378.843533" y="447.906304"/>
+  <use xlink:href="#glyph2-16" x="390.296712" y="447.906304"/>
+  <use xlink:href="#glyph2-17" x="396.374729" y="447.906304"/>
+  <use xlink:href="#glyph2-13" x="407.827908" y="447.906304"/>
+  <use xlink:href="#glyph2-2" x="419.218424" y="447.906304"/>
+  <use xlink:href="#glyph2-13" x="430.069933" y="447.906304"/>
+  <use xlink:href="#glyph2-2" x="441.460449" y="447.906304"/>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.112795 31.499942 L 17.215334 31.499942 L 17.215334 31.899942 L 8.112795 31.899942 Z M 8.112795 31.499942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.112795 31.899942 L 17.215334 31.899942 L 17.215334 32.299942 L 8.112795 32.299942 Z M 8.112795 31.899942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -5.499705 22.799942 L -5.499705 30.799942 L 7.626077 30.799942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.001077 30.799942 L 7.501077 31.049942 L 7.626077 30.799942 L 7.501077 30.549942 Z M 8.001077 30.799942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -5.137205 32.200137 L 0.937795 32.200137 L 1.537795 32.800137 L 1.537795 33.900137 L -5.137205 33.900137 Z M -5.137205 32.200137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.05;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.937795 32.200137 L 0.937795 32.800137 L 1.537795 32.800137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph0-17" x="17.253906" y="495.806749"/>
+  <use xlink:href="#glyph0-2" x="25.080512" y="495.806749"/>
+  <use xlink:href="#glyph0-4" x="32.907118" y="495.806749"/>
+  <use xlink:href="#glyph0-15" x="40.733724" y="495.806749"/>
+  <use xlink:href="#glyph0-16" x="48.56033" y="495.806749"/>
+  <use xlink:href="#glyph0-7" x="56.386936" y="495.806749"/>
+  <use xlink:href="#glyph0-18" x="64.213542" y="495.806749"/>
+  <use xlink:href="#glyph0-15" x="72.040148" y="495.806749"/>
+  <use xlink:href="#glyph0-13" x="79.866753" y="495.806749"/>
+  <use xlink:href="#glyph0-9" x="87.693359" y="495.806749"/>
+  <use xlink:href="#glyph0-19" x="95.519965" y="495.806749"/>
+  <use xlink:href="#glyph0-20" x="103.346571" y="495.806749"/>
+  <use xlink:href="#glyph0-2" x="111.173177" y="495.806749"/>
+  <use xlink:href="#glyph0-21" x="118.999783" y="495.806749"/>
+  <use xlink:href="#glyph0-7" x="126.826389" y="495.806749"/>
+</g>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 1.537795 33.050137 L 4.825295 33.050137 L 4.825295 32.299942 L 7.626077 32.299942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.001077 32.299942 L 7.501077 32.549942 L 7.626077 32.299942 L 7.501077 32.049942 Z M 8.001077 32.299942 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 9.062795 35.100137 L 17.402834 35.100137 L 17.402834 36.500137 L 9.062795 36.500137 Z M 9.062795 35.100137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph2-1" x="299.273438" y="547.910211"/>
+  <use xlink:href="#glyph2-2" x="311.593859" y="547.910211"/>
+  <use xlink:href="#glyph2-8" x="322.445367" y="547.910211"/>
+  <use xlink:href="#glyph2-13" x="331.96875" y="547.910211"/>
+  <use xlink:href="#glyph2-3" x="343.359266" y="547.910211"/>
+  <use xlink:href="#glyph2-9" x="348.84375" y="547.910211"/>
+  <use xlink:href="#glyph2-10" x="356.492133" y="547.910211"/>
+  <use xlink:href="#glyph2-13" x="369.773383" y="547.910211"/>
+  <use xlink:href="#glyph2-14" x="381.1639" y="547.910211"/>
+  <use xlink:href="#glyph2-15" x="397.83572" y="547.910211"/>
+  <use xlink:href="#glyph2-16" x="409.2889" y="547.910211"/>
+  <use xlink:href="#glyph2-18" x="415.366916" y="547.910211"/>
+  <use xlink:href="#glyph2-4" x="426.820095" y="547.910211"/>
+  <use xlink:href="#glyph2-9" x="437.617079" y="547.910211"/>
+  <use xlink:href="#glyph2-4" x="445.265462" y="547.910211"/>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 9.062795 36.500137 L 17.402834 36.500137 L 17.402834 36.900137 L 9.062795 36.900137 Z M 9.062795 36.500137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 9.062795 36.900137 L 17.402834 36.900137 L 17.402834 37.300137 L 9.062795 37.300137 Z M 9.062795 36.900137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -5.037205 34.93002 L 4.117873 34.93002 L 4.717873 35.53002 L 4.717873 36.63002 L -5.037205 36.63002 Z M -5.037205 34.93002 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.05;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 4.117873 34.93002 L 4.117873 35.53002 L 4.717873 35.53002 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph0-17" x="19.253906" y="550.408312"/>
+  <use xlink:href="#glyph0-2" x="27.080512" y="550.408312"/>
+  <use xlink:href="#glyph0-4" x="34.907118" y="550.408312"/>
+  <use xlink:href="#glyph0-15" x="42.733724" y="550.408312"/>
+  <use xlink:href="#glyph0-16" x="50.56033" y="550.408312"/>
+  <use xlink:href="#glyph0-7" x="58.386936" y="550.408312"/>
+  <use xlink:href="#glyph0-18" x="66.213542" y="550.408312"/>
+  <use xlink:href="#glyph0-15" x="74.040148" y="550.408312"/>
+  <use xlink:href="#glyph0-13" x="81.866753" y="550.408312"/>
+  <use xlink:href="#glyph0-9" x="89.693359" y="550.408312"/>
+  <use xlink:href="#glyph0-19" x="97.519965" y="550.408312"/>
+  <use xlink:href="#glyph0-4" x="105.346571" y="550.408312"/>
+  <use xlink:href="#glyph0-7" x="113.173177" y="550.408312"/>
+  <use xlink:href="#glyph0-11" x="120.999783" y="550.408312"/>
+  <use xlink:href="#glyph0-1" x="128.826389" y="550.408312"/>
+  <use xlink:href="#glyph0-2" x="136.652995" y="550.408312"/>
+  <use xlink:href="#glyph0-8" x="144.479601" y="550.408312"/>
+  <use xlink:href="#glyph0-1" x="152.306207" y="550.408312"/>
+  <use xlink:href="#glyph0-2" x="160.132812" y="550.408312"/>
+  <use xlink:href="#glyph0-4" x="167.959418" y="550.408312"/>
+  <use xlink:href="#glyph0-15" x="175.786024" y="550.408312"/>
+  <use xlink:href="#glyph0-16" x="183.61263" y="550.408312"/>
+  <use xlink:href="#glyph0-7" x="191.439236" y="550.408312"/>
+</g>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 4.717873 35.78002 L 6.890334 35.78002 L 6.890334 35.800137 L 8.576077 35.800137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 8.951077 35.800137 L 8.451077 36.050137 L 8.576077 35.800137 L 8.451077 35.550137 Z M 8.951077 35.800137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph1-1" x="173.253906" y="424.908312"/>
+  <use xlink:href="#glyph1-2" x="183.88623" y="424.908312"/>
+  <use xlink:href="#glyph1-3" x="189.231011" y="424.908312"/>
+  <use xlink:href="#glyph1-4" x="192.842936" y="424.908312"/>
+  <use xlink:href="#glyph1-5" x="197.94005" y="424.908312"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph1-1" x="222.253906" y="521.908312"/>
+  <use xlink:href="#glyph1-2" x="232.88623" y="521.908312"/>
+  <use xlink:href="#glyph1-3" x="238.231011" y="521.908312"/>
+  <use xlink:href="#glyph1-4" x="241.842936" y="521.908312"/>
+  <use xlink:href="#glyph1-5" x="246.94005" y="521.908312"/>
+  <use xlink:href="#glyph1-6" x="254.938097" y="521.908312"/>
+  <use xlink:href="#glyph1-7" x="259.070312" y="521.908312"/>
+  <use xlink:href="#glyph1-8" x="264.142198" y="521.908312"/>
+  <use xlink:href="#glyph1-9" x="267.754123" y="521.908312"/>
+  <use xlink:href="#glyph1-10" x="275.707682" y="521.908312"/>
+  <use xlink:href="#glyph1-11" x="282.855035" y="521.908312"/>
+  <use xlink:href="#glyph1-12" x="290.383247" y="521.908312"/>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 9.512795 39.050137 L 14.815334 39.050137 L 14.815334 40.450137 L 9.512795 40.450137 Z M 9.512795 39.050137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph2-19" x="308.25" y="626.910211"/>
+  <use xlink:href="#glyph2-2" x="316.140625" y="626.910211"/>
+  <use xlink:href="#glyph2-8" x="326.992133" y="626.910211"/>
+  <use xlink:href="#glyph2-13" x="336.515516" y="626.910211"/>
+  <use xlink:href="#glyph2-3" x="347.906033" y="626.910211"/>
+  <use xlink:href="#glyph2-9" x="353.390516" y="626.910211"/>
+  <use xlink:href="#glyph2-8" x="361.0389" y="626.910211"/>
+  <use xlink:href="#glyph2-20" x="370.562283" y="626.910211"/>
+  <use xlink:href="#glyph2-21" x="376.132487" y="626.910211"/>
+  <use xlink:href="#glyph2-3" x="387.991753" y="626.910211"/>
+  <use xlink:href="#glyph2-2" x="393.476237" y="626.910211"/>
+</g>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 9.512795 40.450137 L 14.815334 40.450137 L 14.815334 40.850137 L 9.512795 40.850137 Z M 9.512795 40.450137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 9.512795 40.850137 L 14.815334 40.850137 L 14.815334 41.250137 L 9.512795 41.250137 Z M 9.512795 40.850137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.787205 39.100137 L 4.367873 39.100137 L 4.967873 39.700137 L 4.967873 40.800137 L -4.787205 40.800137 Z M -4.787205 39.100137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill:none;stroke-width:0.05;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 4.367873 39.100137 L 4.367873 39.700137 L 4.967873 39.700137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph0-22" x="24.253906" y="633.806749"/>
+  <use xlink:href="#glyph0-1" x="32.080512" y="633.806749"/>
+  <use xlink:href="#glyph0-10" x="39.907118" y="633.806749"/>
+  <use xlink:href="#glyph0-7" x="47.733724" y="633.806749"/>
+  <use xlink:href="#glyph0-2" x="55.56033" y="633.806749"/>
+  <use xlink:href="#glyph0-8" x="63.386936" y="633.806749"/>
+  <use xlink:href="#glyph0-1" x="71.213542" y="633.806749"/>
+  <use xlink:href="#glyph0-2" x="79.040148" y="633.806749"/>
+  <use xlink:href="#glyph0-4" x="86.866753" y="633.806749"/>
+  <use xlink:href="#glyph0-15" x="94.693359" y="633.806749"/>
+  <use xlink:href="#glyph0-16" x="102.519965" y="633.806749"/>
+  <use xlink:href="#glyph0-7" x="110.346571" y="633.806749"/>
+  <use xlink:href="#glyph0-8" x="118.173177" y="633.806749"/>
+  <use xlink:href="#glyph0-7" x="125.999783" y="633.806749"/>
+  <use xlink:href="#glyph0-11" x="133.826389" y="633.806749"/>
+  <use xlink:href="#glyph0-8" x="141.652995" y="633.806749"/>
+  <use xlink:href="#glyph0-23" x="149.479601" y="633.806749"/>
+  <use xlink:href="#glyph0-14" x="157.306207" y="633.806749"/>
+  <use xlink:href="#glyph0-7" x="165.132812" y="633.806749"/>
+  <use xlink:href="#glyph0-14" x="172.959418" y="633.806749"/>
+  <use xlink:href="#glyph0-23" x="180.786024" y="633.806749"/>
+  <use xlink:href="#glyph0-10" x="188.61263" y="633.806749"/>
+  <use xlink:href="#glyph0-1" x="196.439236" y="633.806749"/>
+</g>
+<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 4.967873 39.950137 L 7.190334 39.950137 L 7.190334 40.000137 L 8.926077 40.000137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 9.301077 40.000137 L 8.801077 40.250137 L 8.926077 40.000137 L 8.801077 39.750137 Z M 9.301077 40.000137 " transform="matrix(20,0,0,20,112.998,-173.1004)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+  <use xlink:href="#glyph1-1" x="219.253906" y="611.408312"/>
+  <use xlink:href="#glyph1-2" x="229.88623" y="611.408312"/>
+  <use xlink:href="#glyph1-3" x="235.231011" y="611.408312"/>
+  <use xlink:href="#glyph1-4" x="238.842936" y="611.408312"/>
+  <use xlink:href="#glyph1-5" x="243.94005" y="611.408312"/>
+  <use xlink:href="#glyph1-6" x="251.938097" y="611.408312"/>
+  <use xlink:href="#glyph1-7" x="256.070312" y="611.408312"/>
+  <use xlink:href="#glyph1-8" x="261.142198" y="611.408312"/>
+  <use xlink:href="#glyph1-9" x="264.754123" y="611.408312"/>
+  <use xlink:href="#glyph1-10" x="272.707682" y="611.408312"/>
+  <use xlink:href="#glyph1-11" x="279.855035" y="611.408312"/>
+  <use xlink:href="#glyph1-12" x="287.383247" y="611.408312"/>
+</g>
+</g>
+</svg>
diff --git a/docs/source/images/pycallgraph.png b/docs/source/images/pycallgraph.png
new file mode 100644
index 0000000..def4475
Binary files /dev/null and b/docs/source/images/pycallgraph.png differ
diff --git a/docs/source/images/threads.svg b/docs/source/images/threads.svg
new file mode 100644
index 0000000..5e68dcb
--- /dev/null
+++ b/docs/source/images/threads.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="266px" preserveAspectRatio="none" style="width:874px;height:266px;" version="1.1" viewBox="0 0 874 266" width="874px" zoomAndPan="magnify"><defs><filter height="300%" id="ft70fwu" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><ellipse cx="438.5" cy="20" fill="#000000" filter="url(#ft70fwu)" rx="10" ry="10" style="stroke: none; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#ft70fwu)" height="33.9688" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="93" x="392" y="5
 0"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="73" x="402" y="71.1387">MainThread</text><rect fill="#000000" filter="url(#ft70fwu)" height="6" rx="2.5" ry="2.5" style="stroke: #000000; stroke-width: 1.0;" width="857" x="10" y="103.9688"/><rect fill="#FEFECE" filter="url(#ft70fwu)" height="33.9688" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="125" x="24" y="165.9688"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="105" x="34" y="187.1074">TorEventListener</text><rect fill="#FEFECE" filter="url(#ft70fwu)" height="33.9688" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="95" x="177" y="165.9688"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="187" y="187.1074">ResultDump</text><rect fill="#FEFECE" filter="url(#ft70fwu)" height="33.9688" rx="12.5" ry="12.5" 
 style="stroke: #A80036; stroke-width: 1.5;" width="117" x="300" y="165.9688"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="97" x="310" y="187.1074">workers_thread</text><rect fill="#FEFECE" filter="url(#ft70fwu)" height="33.9688" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="102" x="445" y="165.9688"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="82" x="455" y="187.1074">tasks_thread</text><rect fill="#FEFECE" filter="url(#ft70fwu)" height="33.9688" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="103" x="575" y="165.9688"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="83" x="585" y="187.1074">resutls_tread</text><rect fill="#FEFECE" filter="url(#ft70fwu)" height="33.9688" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="111" x="730" y="177
 .9688"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="740" y="199.1074">measure_relay</text><polygon fill="#FEFECE" filter="url(#ft70fwu)" points="748.5,129.9688,822.5,129.9688,834.5,141.9688,822.5,153.9688,748.5,153.9688,736.5,141.9688,748.5,129.9688" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="74" x="748.5" y="145.7769">threads < 3?</text><rect fill="#000000" filter="url(#ft70fwu)" height="6" rx="2.5" ry="2.5" style="stroke: #000000; stroke-width: 1.0;" width="857" x="10" y="253.9375"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="438.5" x2="438.5" y1="30" y2="50"/><polygon fill="#A80036" points="434.5,40,438.5,50,442.5,40,438.5,44" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="785.5" x2="785.5" y1="153.9688" y2="177.9688"/><polygon fill="#A80036" p
 oints="781.5,167.9688,785.5,177.9688,789.5,167.9688,785.5,171.9688" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="785.5" x2="785.5" y1="211.9375" y2="221.9375"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="785.5" x2="853" y1="221.9375" y2="221.9375"/><polygon fill="#A80036" points="849,192.9531,853,182.9531,857,192.9531,853,188.9531" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="853" x2="853" y1="141.9688" y2="221.9375"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="853" x2="834.5" y1="141.9688" y2="141.9688"/><polygon fill="#A80036" points="844.5,137.9688,834.5,141.9688,844.5,145.9688,840.5,141.9688" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="736.5" x2="718" y1="141.9688" y2="141.9688"/><polygon fill="#A80036" points="714,178.9531,718,188.9531,722,178.9531,718,182.9531" style="stroke: #A80036; stroke-width
 : 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="718" x2="718" y1="141.9688" y2="233.9375"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="718" x2="785.5" y1="233.9375" y2="233.9375"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="785.5" x2="785.5" y1="233.9375" y2="253.9375"/><polygon fill="#A80036" points="781.5,243.9375,785.5,253.9375,789.5,243.9375,785.5,247.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="86.5" x2="86.5" y1="109.9688" y2="165.9688"/><polygon fill="#A80036" points="82.5,155.9688,86.5,165.9688,90.5,155.9688,86.5,159.9688" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="86.5" x2="86.5" y1="199.9375" y2="253.9375"/><polygon fill="#A80036" points="82.5,243.9375,86.5,253.9375,90.5,243.9375,86.5,247.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="224.5" x2="224.5" y1="109.9688" y
 2="165.9688"/><polygon fill="#A80036" points="220.5,155.9688,224.5,165.9688,228.5,155.9688,224.5,159.9688" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="224.5" x2="224.5" y1="199.9375" y2="253.9375"/><polygon fill="#A80036" points="220.5,243.9375,224.5,253.9375,228.5,243.9375,224.5,247.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="358.5" x2="358.5" y1="109.9688" y2="165.9688"/><polygon fill="#A80036" points="354.5,155.9688,358.5,165.9688,362.5,155.9688,358.5,159.9688" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="358.5" x2="358.5" y1="199.9375" y2="253.9375"/><polygon fill="#A80036" points="354.5,243.9375,358.5,253.9375,362.5,243.9375,358.5,247.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="496" x2="496" y1="109.9688" y2="165.9688"/><polygon fill="#A80036" points=
 "492,155.9688,496,165.9688,500,155.9688,496,159.9688" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="496" x2="496" y1="199.9375" y2="253.9375"/><polygon fill="#A80036" points="492,243.9375,496,253.9375,500,243.9375,496,247.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="626.5" x2="626.5" y1="109.9688" y2="165.9688"/><polygon fill="#A80036" points="622.5,155.9688,626.5,165.9688,630.5,155.9688,626.5,159.9688" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="626.5" x2="626.5" y1="199.9375" y2="253.9375"/><polygon fill="#A80036" points="622.5,243.9375,626.5,253.9375,630.5,243.9375,626.5,247.9375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="785.5" x2="785.5" y1="109.9688" y2="129.9688"/><polygon fill="#A80036" points="781.5,119.9688,785.5,129.9688,789.5,119.9688,785.5,123.9688"
  style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="438.5" x2="438.5" y1="83.9688" y2="103.9688"/><polygon fill="#A80036" points="434.5,93.9688,438.5,103.9688,442.5,93.9688,438.5,97.9688" style="stroke: #A80036; stroke-width: 1.0;"/></g></svg>
\ No newline at end of file
diff --git a/docs/source/threads.puml b/docs/source/threads.puml
new file mode 100644
index 0000000..fcacba9
--- /dev/null
+++ b/docs/source/threads.puml
@@ -0,0 +1,23 @@
+ at startuml
+
+start
+
+:MainThread;
+  fork
+    :TorEventListener;
+  fork again
+    :ResultDump;
+  fork again
+    :workers_thread;
+  fork again
+    :tasks_thread;
+  fork again
+    :resutls_tread;
+  fork again
+  while (threads < 3?)
+      :measure_relay;
+  endwhile
+  end fork
+
+
+ at enduml
\ No newline at end of file





More information about the tor-commits mailing list