commit f075a645ab78fbce155c4940cf1327efb9f9b944
Author: juga0 <[email protected]>
Date: Sat Aug 1 13:35:15 2020 +0000
fix: tests: Stop converting boolean key to int
Conversion only happens when parsing a bandwidth file in the
integration tests.
Closes: #40009
---
docs/source/classes_original.puml | 4 +-
docs/source/images/classes_original.svg | 234 +++++++++++++++++++++++++++++++-
sbws/lib/v3bwfile.py | 2 +
3 files changed, 237 insertions(+), 3 deletions(-)
diff --git a/docs/source/classes_original.puml
b/docs/source/classes_original.puml
index 4318db3..1284b9f 100644
--- a/docs/source/classes_original.puml
+++ b/docs/source/classes_original.puml
@@ -30,7 +30,7 @@ class Relay {
int @p average_bandwidth
int @p burst_bandwidth
int @p consensus_bandwidth
- int @p consensus_bandwidth_is_unmeasured
+ bool @p consensus_bandwidth_is_unmeasured
obj _from_ns(attr)
obj _from_desc(attr)
bool can_exit_to_port(int port)
@@ -217,4 +217,4 @@ class State {
get()
}
-@enduml
\ No newline at end of file
+@enduml
diff --git a/docs/source/images/classes_original.svg
b/docs/source/images/classes_original.svg
index d894dd6..473659e 100644
--- a/docs/source/images/classes_original.svg
+++ b/docs/source/images/classes_original.svg
@@ -1 +1,233 @@
-<?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
+<?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="1575px" preserveAspectRatio="none" style="width:1546px;height:1575px;"
version="1.1" viewBox="0 0 1546 1575" width="1546px"
zoomAndPan="magnify"><defs><filter height="300%" id="fuwj1fyyylsf1"
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(#fuwj1fyyylsf1)" height="227.2656" id="RelayList" style="stroke:
#A80036; stroke-width: 1.5;" width="258" x="1025" y="877.5"/><ellipse
cx="1122.75" cy="893.5" fill="#ADD1B2" rx="11" ry="11" style="stroke:
#A80036; stroke-width: 1.0;"/><path d="M1125.7188,899.1406 Q1125.1406,899.4375
1124.5,899.5781 Q1123.8594,899.7344 1123.1563,899.7344 Q1120.6563,899.7344
1119.3281,898.0938 Q1118.0156,896.4375 1118.0156,893.3125 Q1118.0156,890.1875
1119.3281,888.5313 Q1120.6563,886.875 1123.1563,886.875 Q1123.8594,886.875
1124.5,887.0313 Q1125.1563,887.1875 1125.7188,887.4844 L1125.7188,890.2031
Q1125.0938,889.625 1124.5,889.3594 Q1123.9063,889.0781 1123.2813,889.0781
Q1121.9375,889.0781 1121.25,890.1563 Q1120.5625,891.2188 1120.5625,893.3125
Q1120.5625,895.4063 1121.25,896.4844 Q1121.9375,897.5469 1123.2813,897.5469
Q1123.9063,897.5469 1124.5,897.2813 Q1125.0938,897 1125.7188,896.4219
L1125.7188,899.1406 Z "/><text fill="#000000" font-family="sans-serif"
font-size="12" lengthAdjust="spacingAndGlyphs" textLength="54" x="1143.25"
y="897.6543">RelayList</text><line style="stroke: #A80036; stroke-width: 1.5;"
x1="1026" x2="1282" y1="909.5" y2="909.5"/><text fill="#000000"
font-family="sans-serif" font-
size="11" lengthAdjust="spacingAndGlyphs" textLength="153" x="1031"
y="923.7104">stem.Controller _controller</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="105" x="1031" y="936.5151">Lock _refresh_lock</text><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="93" x="1031" y="949.3198">int
_last_refresh</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="1031"
y="962.1245">list @p relays</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="1031"
y="974.9292">list @p bad_exits</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="71" x="1031" y="987.7339">list @p exits</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="98" x="
1031" y="1000.5386">list @p non_exits</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="105" x="1031" y="1013.3433">list @p authorities</text><line
style="stroke: #A80036; stroke-width: 1.5;" x1="1026" x2="1282" y1="1019.9375"
y2="1019.9375"/><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="118" x="1031" y="1034.1479">bool
_need_refresh()</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="1031"
y="1046.9526">_init_relays()</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="56" x="1031" y="1059.7573">_refresh()</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="165" x="1031" y="1072.562">list _relays_with_flag(int
flag)</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="183" x="1031" 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="1031" y="1098.1714">list exits_not_bad_can_exit_to_port(int
port)</text><!--class Relay--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)"
height="265.6797" id="Relay" style="stroke: #A80036; stroke-width: 1.5;"
width="283" x="980.5" y="1190"/><ellipse cx="1101.25" cy="1206" fill="#ADD1B2"
rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path
d="M1104.2188,1211.6406 Q1103.6406,1211.9375 1103,1212.0781
Q1102.3594,1212.2344 1101.6563,1212.2344 Q1099.1563,1212.2344
1097.8281,1210.5938 Q1096.5156,1208.9375 1096.5156,1205.8125
Q1096.5156,1202.6875 1097.8281,1201.0313 Q1099.1563,1199.375 1101.6563,1199.375
Q1102.3594,1199.375 1103,1199.5313 Q1103.6563,1199.6875 1104.2188,1199.9844
L1104.2188,1202.7031 Q1103.5938,1202.125 1103,1201.8594 Q1102.4063,1201
.5781 1101.7813,1201.5781 Q1100.4375,1201.5781 1099.75,1202.6563
Q1099.0625,1203.7188 1099.0625,1205.8125 Q1099.0625,1207.9063 1099.75,1208.9844
Q1100.4375,1210.0469 1101.7813,1210.0469 Q1102.4063,1210.0469 1103,1209.7813
Q1103.5938,1209.5 1104.2188,1208.9219 L1104.2188,1211.6406 Z "/><text
fill="#000000" font-family="sans-serif" font-size="12"
lengthAdjust="spacingAndGlyphs" textLength="33" x="1121.75"
y="1210.1543">Relay</text><line style="stroke: #A80036; stroke-width: 1.5;"
x1="981.5" x2="1262.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="12
61.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><t
ext 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="271" x="986.5" y="1389.8667">bool
@p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036;
stroke-width: 1.5;" x1="981.5" x2="1262.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" textLength="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(#fuwj1fyyylsf1)" height="112.0234" id="RelayPrioritizer"
style="stroke: #A80036; stroke-width: 1.5;" width="158" x="998"
y="117"/><ellipse cx="1028.75" cy="133" fill="#ADD1B2" rx="11" ry="11"
style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1031.7188,138.6406
Q1031.1406,138.9375 1030.5,139.0781 Q1029.8594,139.2344 1029.1563,139.2344
Q1026.6563,139.2344 1025.3281,137.5938 Q1024.0156,135.9375 1024.0156,132.8125
Q1024.0156,129.6875 1025.3281,128.0313 Q1026.6563,126.375
1029.1563,126.375 Q1029.8594,126.375 1030.5,126.5313 Q1031.1563,126.6875
1031.7188,126.9844 L1031.7188,129.7031 Q1031.0938,129.125 1030.5,128.8594
Q1029.9063,128.5781 1029.2813,128.5781 Q1027.9375,128.5781 1027.25,129.6563
Q1026.5625,130.7188 1026.5625,132.8125 Q1026.5625,134.9063 1027.25,135.9844
Q1027.9375,137.0469 1029.2813,137.0469 Q1029.9063,137.0469 1030.5,136.7813
Q1031.0938,136.5 1031.7188,135.9219 L1031.7188,138.6406 Z "/><text
fill="#000000" font-family="sans-serif" font-size="12"
lengthAdjust="spacingAndGlyphs" textLength="91" x="1046.25"
y="137.1543">RelayPrioritizer</text><line style="stroke: #A80036; stroke-width:
1.5;" x1="999" x2="1155" y1="149" y2="149"/><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="102" x="1004" y="163.2104">int fresh_seconds</text><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="143" x="1004"
y="176.0151">ResultDump result_dump</text>
<text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="105" x="1004"
y="188.8198">RelayList relay_list</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="146" x="1004" y="201.6245">bool measure_authorities</text><line
style="stroke: #A80036; stroke-width: 1.5;" x1="999" x2="1155" y1="208.2188"
y2="208.2188"/><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="139" x="1004"
y="222.4292">generator best_priority()</text><!--class ResultDump--><rect
fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="176.0469" id="ResultDump"
style="stroke: #A80036; stroke-width: 1.5;" width="199" x="901.5"
y="507"/><ellipse cx="959.25" cy="523" fill="#ADD1B2" rx="11" ry="11"
style="stroke: #A80036; stroke-width: 1.0;"/><path d="M962.2188,528.6406
Q961.6406,528.9375 961,529.0781 Q960.3594,529.2344 959.6563,529.2344
Q957.1563,529.2344 955.8281,
527.5938 Q954.5156,525.9375 954.5156,522.8125 Q954.5156,519.6875
955.8281,518.0313 Q957.1563,516.375 959.6563,516.375 Q960.3594,516.375
961,516.5313 Q961.6563,516.6875 962.2188,516.9844 L962.2188,519.7031
Q961.5938,519.125 961,518.8594 Q960.4063,518.5781 959.7813,518.5781
Q958.4375,518.5781 957.75,519.6563 Q957.0625,520.7188 957.0625,522.8125
Q957.0625,524.9063 957.75,525.9844 Q958.4375,527.0469 959.7813,527.0469
Q960.4063,527.0469 961,526.7813 Q961.5938,526.5 962.2188,525.9219
L962.2188,528.6406 Z "/><text fill="#000000" font-family="sans-serif"
font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="979.75"
y="527.1543">ResultDump</text><line style="stroke: #A80036; stroke-width: 1.5;"
x1="902.5" x2="1099.5" y1="539" y2="539"/><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="49" x="907.5" y="553.2104">dict data</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLen
gth="81" x="907.5" y="566.0151">int fresh_days</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="60" x="907.5" y="578.8198">str datadir</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="82" x="907.5" y="591.6245">Lock data_lock</text><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="81" x="907.5" y="604.4292">Thread
thread</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="76" x="907.5" y="617.2339">Queue
queue</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="902.5"
x2="1099.5" y1="623.8281" y2="623.8281"/><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="149" x="907.5" y="638.0386">store_result(Result result)</text><text
fill="#000000" font-family="sans-serif" font-size="11" lengthAdj
ust="spacingAndGlyphs" textLength="157" x="907.5"
y="650.8433">handle_result(Result result)</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="38" x="907.5" y="663.6479">enter()</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="187" x="907.5" y="676.4526">list results_for_relay(Relay
relay)</text><!--class Result--><rect fill="#FEFECE"
filter="url(#fuwj1fyyylsf1)" height="278.4844" id="Result" style="stroke:
#A80036; stroke-width: 1.5;" width="273" x="566.5" y="852"/><ellipse
cx="679.25" cy="868" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036;
stroke-width: 1.0;"/><path d="M682.2188,873.6406 Q681.6406,873.9375
681,874.0781 Q680.3594,874.2344 679.6563,874.2344 Q677.1563,874.2344
675.8281,872.5938 Q674.5156,870.9375 674.5156,867.8125 Q674.5156,864.6875
675.8281,863.0313 Q677.1563,861.375 679.6563,861.375 Q680.3594,861.375
681,861.5313 Q681.6563,861.6875 682.2
188,861.9844 L682.2188,864.7031 Q681.5938,864.125 681,863.8594
Q680.4063,863.5781 679.7813,863.5781 Q678.4375,863.5781 677.75,864.6563
Q677.0625,865.7188 677.0625,867.8125 Q677.0625,869.9063 677.75,870.9844
Q678.4375,872.0469 679.7813,872.0469 Q680.4063,872.0469 681,871.7813
Q681.5938,871.5 682.2188,870.9219 L682.2188,873.6406 Z "/><text fill="#000000"
font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs"
textLength="39" x="699.75" y="872.1543">Result</text><line style="stroke:
#A80036; stroke-width: 1.5;" x1="567.5" x2="838.5" y1="884" y2="884"/><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="107" x="572.5"
y="898.2104">Result.Relay _relay</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="64" x="572.5" y="911.0151">list @p circ</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="89" x="572.
5" y="923.8198">str @p dest_url</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="89" x="572.5" y="936.6245">str @p scanner</text><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="66" x="572.5" y="949.4292">int @p
time</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="67" x="572.5" y="962.2339">str @p
type</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="83" x="572.5" y="975.0386">int @p
version</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="97" x="572.5" y="987.8433">str @p
nickname</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="102" x="572.5" y="1000.6479">str @p
fingerprint</text><text fill="#000000" font-family="sans-s
erif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="572.5"
y="1013.4526">str @p address</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="164" x="572.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="572.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="572.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="572.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="572.5"
y="1077.4761">int @p consensus_bandwidth</text><text fill="#000000"
font-family="sans-
serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="261"
x="572.5" y="1090.2808">int @p consensus_bandwidth_is_unmeasured</text><line
style="stroke: #A80036; stroke-width: 1.5;" x1="567.5" x2="838.5" y1="1096.875"
y2="1096.875"/><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="69" x="572.5" y="1111.0854">dict
to_dict()</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="131" x="572.5" y="1123.8901">Result
from_dict(dict d)</text><!--class ResultError--><rect fill="#FEFECE"
filter="url(#fuwj1fyyylsf1)" height="60.8047" id="ResultError" 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.5781 Q684.1094,1314.7344 683.4063,1314.7344 Q680.9063,1314.7344
679.5781,1313.0938 Q
678.2656,1311.4375 678.2656,1308.3125 Q678.2656,1305.1875 679.5781,1303.5313
Q680.9063,1301.875 683.4063,1301.875 Q684.1094,1301.875 684.75,1302.0313
Q685.4063,1302.1875 685.9688,1302.4844 L685.9688,1305.2031 Q685.3438,1304.625
684.75,1304.3594 Q684.1563,1304.0781 683.5313,1304.0781 Q682.1875,1304.0781
681.5,1305.1563 Q680.8125,1306.2188 680.8125,1308.3125 Q680.8125,1310.4063
681.5,1311.4844 Q682.1875,1312.5469 683.5313,1312.5469 Q684.1563,1312.5469
684.75,1312.2813 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(#fuwj1fyyylsf1)" height="73.6094" id="ResultSuccess" style="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.0781 Q821.6094,1308.2344 820.9063,1308.2344 Q818.4063,1308.2344
817.0781,1306.5938 Q815.7656,1304.9375 815.7656,1301.8125 Q815.7656,1298.6875
817.0781,1297.0313 Q818.4063,1295.375 820.9063,1295.375 Q821.6094,1295.375
822.25,1295.5313 Q822.9063,1295.6875 823.4688,1295.9844 L823.4688,1298.7031
Q822.8438,1298.125 822.25,1297.8594 Q821.6563,1297.5781 821.0313,1297.5781
Q819.6875,1297.5781 819,1298.6563 Q818.3125,1299.7188 818.3125,1301.8125
Q818.3125,1303.9063 819,1304.9844 Q819.6875,1306.0469 821.0313,1306.0469
Q821.6563,1306.0469 822.25,1305.7813 Q822.8438,1305.5 823.4688,1304.9219
L823.4688,1307.6406 Z "/><text fi
ll="#000000" font-family="sans-serif" font-size="12"
lengthAdjust="spacingAndGlyphs" textLength="91" x="834.5"
y="1306.1543">ResultSuccess</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(#fuwj1fyyylsf1)" height="124.8281" id="Destination" 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.5781 Q137.8594,1282.7344 137.1563,1282.7344 Q134.6563,1282.7344
133.3281,1281.0938 Q132.0156,1279.4375 132.0156,1276.3125 Q132.0156,1273.1875
133.3281,1271.5313 Q134.6563,1269.875 137.1563,1269.875 Q137.8594,1269.875
138.5,1270.0313 Q139.1563,1270.1875 139.7188,1270.4844 L139.7188,1273.2031
Q139.0938,1272.625 138.5,1272.3594 Q137.9063,1272.0781 137.2813,1272.0781
Q135.9375,1272.0781 135.25,1273.1563 Q134.5625,1274.2188 134.5625,1276.3125
Q134.5625,1278.4063 135.25,1279.4844 Q135.9375,1280.5469 137.2813,1280.5469
Q137.9063,1280.5469 138.5,1280.2813 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
port</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(#fuwj1fyyylsf1)" height="163.24
22" id="Result.Relay" 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: #A80036; stroke-width: 1.0;"/><path
d="M468.7188,1263.1406 Q468.1406,1263.4375 467.5,1263.5781 Q466.8594,1263.7344
466.1563,1263.7344 Q463.6563,1263.7344 462.3281,1262.0938 Q461.0156,1260.4375
461.0156,1257.3125 Q461.0156,1254.1875 462.3281,1252.5313 Q463.6563,1250.875
466.1563,1250.875 Q466.8594,1250.875 467.5,1251.0313 Q468.1563,1251.1875
468.7188,1251.4844 L468.7188,1254.2031 Q468.0938,1253.625 467.5,1253.3594
Q466.9063,1253.0781 466.2813,1253.0781 Q464.9375,1253.0781 464.25,1254.1563
Q463.5625,1255.2188 463.5625,1257.3125 Q463.5625,1259.4063 464.25,1260.4844
Q464.9375,1261.5469 466.2813,1261.5469 Q466.9063,1261.5469 467.5,1261.2813
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.2
5" 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" font-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" t
extLength="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(#fuwj1fyyylsf1)"
height="48" id="ResultErrorCircuit" style="stroke: #A80036; stroke-width: 1.5;"
width="141" x="558.5" y="1516"/><ellipse cx="573.5" cy="1532" fill="#ADD1B2"
rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path
d="M576.4688,1537.6406 Q575.890
6,1537.9375 575.25,1538.0781 Q574.6094,1538.2344 573.9063,1538.2344
Q571.4063,1538.2344 570.0781,1536.5938 Q568.7656,1534.9375 568.7656,1531.8125
Q568.7656,1528.6875 570.0781,1527.0313 Q571.4063,1525.375 573.9063,1525.375
Q574.6094,1525.375 575.25,1525.5313 Q575.9063,1525.6875 576.4688,1525.9844
L576.4688,1528.7031 Q575.8438,1528.125 575.25,1527.8594 Q574.6563,1527.5781
574.0313,1527.5781 Q572.6875,1527.5781 572,1528.6563 Q571.3125,1529.7188
571.3125,1531.8125 Q571.3125,1533.9063 572,1534.9844 Q572.6875,1536.0469
574.0313,1536.0469 Q574.6563,1536.0469 575.25,1535.7813 Q575.8438,1535.5
576.4688,1534.9219 L576.4688,1537.6406 Z "/><text fill="#000000"
font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs"
textLength="109" x="587.5" y="1536.1543">ResultErrorCircuit</text><line
style="stroke: #A80036; stroke-width: 1.5;" x1="559.5" x2="698.5" y1="1548"
y2="1548"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="559.5"
x2="698.5" y1="1556" y2="1556"/><!--class Result
ErrorStream--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="48"
id="ResultErrorStream" style="stroke: #A80036; stroke-width: 1.5;" width="147"
x="734.5" y="1516"/><ellipse cx="749.5" cy="1532" fill="#ADD1B2" rx="11"
ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path
d="M752.4688,1537.6406 Q751.8906,1537.9375 751.25,1538.0781 Q750.6094,1538.2344
749.9063,1538.2344 Q747.4063,1538.2344 746.0781,1536.5938 Q744.7656,1534.9375
744.7656,1531.8125 Q744.7656,1528.6875 746.0781,1527.0313 Q747.4063,1525.375
749.9063,1525.375 Q750.6094,1525.375 751.25,1525.5313 Q751.9063,1525.6875
752.4688,1525.9844 L752.4688,1528.7031 Q751.8438,1528.125 751.25,1527.8594
Q750.6563,1527.5781 750.0313,1527.5781 Q748.6875,1527.5781 748,1528.6563
Q747.3125,1529.7188 747.3125,1531.8125 Q747.3125,1533.9063 748,1534.9844
Q748.6875,1536.0469 750.0313,1536.0469 Q750.6563,1536.0469 751.25,1535.7813
Q751.8438,1535.5 752.4688,1534.9219 L752.4688,1537.6406 Z "/><text
fill="#000000" font-family="sans-seri
f" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="115" x="763.5"
y="1536.1543">ResultErrorStream</text><line style="stroke: #A80036;
stroke-width: 1.5;" x1="735.5" x2="880.5" y1="1548" y2="1548"/><line
style="stroke: #A80036; stroke-width: 1.5;" x1="735.5" x2="880.5" y1="1556"
y2="1556"/><!--class DestinationList--><rect fill="#FEFECE"
filter="url(#fuwj1fyyylsf1)" height="86.4141" id="DestinationList"
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.0781 Q127.3594,970.2344 126.6563,970.2344
Q124.1563,970.2344 122.8281,968.5938 Q121.5156,966.9375 121.5156,963.8125
Q121.5156,960.6875 122.8281,959.0313 Q124.1563,957.375 126.6563,957.375
Q127.3594,957.375 128,957.5313 Q128.6563,957.6875 129.2188,957.9844
L129.2188,960.7031 Q128.5938,960.125 128,959.8594 Q127.4063,959.5781
126.7813,959.5781 Q1
25.4375,959.5781 124.75,960.6563 Q124.0625,961.7188 124.0625,963.8125
Q124.0625,965.9063 124.75,966.9844 Q125.4375,968.0469 126.7813,968.0469
Q127.4063,968.0469 128,967.7813 Q128.5938,967.5 129.2188,966.9219
L129.2188,969.6406 Z "/><text fill="#000000" font-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="7
2.5" y="1027.8198">DestinationList @sm from_config(...)</text><!--class
V3BWHeader--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)"
height="291.2891" id="V3BWHeader" style="stroke: #A80036; stroke-width: 1.5;"
width="322" x="183" y="449.5"/><ellipse cx="299.25" cy="465.5" fill="#ADD1B2"
rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path
d="M302.2188,471.1406 Q301.6406,471.4375 301,471.5781 Q300.3594,471.7344
299.6563,471.7344 Q297.1563,471.7344 295.8281,470.0938 Q294.5156,468.4375
294.5156,465.3125 Q294.5156,462.1875 295.8281,460.5313 Q297.1563,458.875
299.6563,458.875 Q300.3594,458.875 301,459.0313 Q301.6563,459.1875
302.2188,459.4844 L302.2188,462.2031 Q301.5938,461.625 301,461.3594
Q300.4063,461.0781 299.7813,461.0781 Q298.4375,461.0781 297.75,462.1563
Q297.0625,463.2188 297.0625,465.3125 Q297.0625,467.4063 297.75,468.4844
Q298.4375,469.5469 299.7813,469.5469 Q300.4063,469.5469 301,469.2813
Q301.5938,469 302.2188,468.4219 L302.2188,471.1406 Z "/><text fill="#00
0000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs"
textLength="81" x="319.75" y="469.6543">V3BWHeader</text><line style="stroke:
#A80036; stroke-width: 1.5;" x1="184" x2="504" y1="481.5" y2="481.5"/><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="79" x="189" y="495.7104">int
timestamp</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="62" x="189" y="508.5151">str
version</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="86" x="189" y="521.3198">str
file_created</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="116" x="189" y="534.1245">str
latest_bandwidth</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="189"
y="546.9292">int num_lines</text><text fill="
#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="70" x="189" y="559.7339">str
software</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="118" x="189" y="572.5386">str
software_version</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="123" x="189"
y="585.3433">str generator_started</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="149" x="189" y="598.1479">int number_eligible_relays</text><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="208" x="189" y="610.9526">int
minimum_number_eligible_relays</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="171" x="189" y="623.7573">int number_consensus_relays</text><text
fill="#000000" font-family="sans-ser
if" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="148" x="189"
y="636.562">int percent_eligible_relays</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="207" x="189" y="649.3667">int
minimum_percent_eligible_relays</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="99" x="189" y="662.1714">int @p num_lines</text><line
style="stroke: #A80036; stroke-width: 1.5;" x1="184" x2="504" y1="668.7656"
y2="668.7656"/><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="254" x="189"
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="189"
y="695.7808">add_stats(**kwargs)</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="310" x="189
" 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="189" y="721.3901">str @sm
generator_started_from_file(dict results)</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="299" x="189" y="734.1948">int @sm
latest_bandwidth_from_results(dict results)</text><!--class V3BWLine--><rect
fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="393.7266" id="V3BWLine"
style="stroke: #A80036; stroke-width: 1.5;" width="326" x="540"
y="398"/><ellipse cx="668.75" cy="414" fill="#ADD1B2" rx="11" ry="11"
style="stroke: #A80036; stroke-width: 1.0;"/><path d="M671.7188,419.6406
Q671.1406,419.9375 670.5,420.0781 Q669.8594,420.2344 669.1563,420.2344
Q666.6563,420.2344 665.3281,418.5938 Q664.0156,416.9375 664.0156,413.8125
Q664.0156,410.6875 665.3281,409.0313 Q666.6563,407.375 669.1563,407.375
Q669.8594,407.375 6
70.5,407.5313 Q671.1563,407.6875 671.7188,407.9844 L671.7188,410.7031
Q671.0938,410.125 670.5,409.8594 Q669.9063,409.5781 669.2813,409.5781
Q667.9375,409.5781 667.25,410.6563 Q666.5625,411.7188 666.5625,413.8125
Q666.5625,415.9063 667.25,416.9844 Q667.9375,418.0469 669.2813,418.0469
Q669.9063,418.0469 670.5,417.7813 Q671.0938,417.5 671.7188,416.9219
L671.7188,419.6406 Z "/><text fill="#000000" font-family="sans-serif"
font-size="12" lengthAdjust="spacingAndGlyphs" textLength="60" x="689.25"
y="418.1543">V3BWLine</text><line style="stroke: #A80036; stroke-width: 1.5;"
x1="541" x2="865" y1="430" y2="430"/><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="34" x="546" y="444.2104">int bw</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="64" x="546" y="457.0151">str node_id</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" te
xtLength="141" x="546" y="469.8198">str master_key_ed25519</text><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="42" x="546" y="482.6245">str
nick</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="31" x="546" y="495.4292">int
rtt</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="45" x="546" y="508.2339">str
time</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="65" x="546" y="521.0386">int
success</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="94" x="546" y="533.8433">int
error_stream</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="73" x="546" y="546.6479">int
error_circ</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="80" x="546"
y="559.4526">int error_misc</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="546"
y="572.2573">int bw_median</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="546"
y="585.062">int bw_mean</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="546"
y="597.8667">int desc_bw_avg</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="92" x="546" y="610.6714">int desc_bw_bur</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="121" x="546" y="623.4761">int desc_bw_obs_last</text><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="132" x="546" y="636.2808">in
t desc_bw_obs_mean</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="126" x="546"
y="649.0854">consensus_bandwidth</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="220" x="546"
y="661.8901">consensus_bandwidth_is_unmeasured</text><line style="stroke:
#A80036; stroke-width: 1.5;" x1="541" x2="865" y1="668.4844"
y2="668.4844"/><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="254" x="546" 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="546" 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="546" y="708.3042">int @sm
desc_bw_obs_last_from_results(list results)</t
ext><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="314" x="546" 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"
textLength="233" x="546" 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="546" 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="546" 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="546" 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="546" y="785.1323">list @sm
results_recent_than(list results)</text><!--class V3BWFile--><rect
fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="329.7031" id="V3BWFile"
style="stroke: #A80036; stroke-width: 1.5;" width="370" x="159" y="8"/><ellipse
cx="311.75" cy="24" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036;
stroke-width: 1.0;"/><path d="M314.7188,29.6406 Q314.1406,29.9375 313.5,30.0781
Q312.8594,30.2344 312.1563,30.2344 Q309.6563,30.2344 308.3281,28.5938
Q307.0156,26.9375 307.0156,23.8125 Q307.0156,20.6875 308.3281,19.0313
Q309.6563,17.375 312.1563,17.375 Q312.8594,17.375 313.5,17.5313
Q314.1563,17.6875 314.7188,17.9844 L314.7188,20.7031 Q314.0938,20.125
313.5,19.8594 Q312.9063,19.5781 312.2813,19.5781 Q310.9375,19.5781
310.25,20.6563 Q309.5625,21.7188 309.5625,23.8125 Q309.5625,25.9063
310.25,26.9844 Q310.9375,28.0469 312.2813,28.0469 Q312.9063,28.0469
313.5,27.7813 Q314.0938,27.5 314.7188,26.9219 L314.7188,29.6406 Z "/><text fi
ll="#000000" font-family="sans-serif" font-size="12"
lengthAdjust="spacingAndGlyphs" textLength="56" x="332.25"
y="28.1543">V3BWFile</text><line style="stroke: #A80036; stroke-width: 1.5;"
x1="160" x2="528" y1="40" y2="40"/><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="116" x="165" y="54.2104">V3BWHeader header</text><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="70" x="165" y="67.0151">list
bw_lines</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="79" x="165" y="79.8198">@p
info_stats</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="119" x="165" y="92.6245">bool @p
is_min_perc</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="87" x="165" y="105.4292">int @p
max_bw</text><text fill="#00
0000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="95" x="165" y="118.2339">int @p mean_bw</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="105" x="165" y="131.0386">int @p median_bw</text><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="84" x="165" y="143.8433">int @p
min_bw</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="66" x="165" y="156.6479">int @p
num</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="88" x="165" y="169.4526">int @p
sum_bw</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="160"
x2="528" y1="176.0469" y2="176.0469"/><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="252" x="165" y="190.2573">V3BWFile @cm from_results(dict r
esults, ...)</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="147" x="165"
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="165" 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="165"
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="165" 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="165" y="254.2808">(dict, bool) @sm
measured_progress_stats(bw_lines)</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLengt
h="358" x="165" 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="165"
y="279.8901">(list, list, list) to_plt()</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="195" x="165" y="292.6948">list update_progress(bw_lines,
...)</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="245" x="165"
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="165" y="318.3042">tuple
to_plt(...)</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="92" x="165" y="331.1089">write(str
output)</text><!--class CircuitBuilder--><rect fill="#FEFECE"
filter="url(#fuwj1fyyylsf1)" he
ight="124.8281" id="CircuitBuilder" style="stroke: #A80036; stroke-width:
1.5;" width="126" x="1273" y="532.5"/><ellipse cx="1293.4" cy="548.5"
fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width:
1.0;"/><path d="M1296.3688,554.1406 Q1295.7906,554.4375 1295.15,554.5781
Q1294.5094,554.7344 1293.8063,554.7344 Q1291.3063,554.7344 1289.9781,553.0938
Q1288.6656,551.4375 1288.6656,548.3125 Q1288.6656,545.1875 1289.9781,543.5313
Q1291.3063,541.875 1293.8063,541.875 Q1294.5094,541.875 1295.15,542.0313
Q1295.8063,542.1875 1296.3688,542.4844 L1296.3688,545.2031 Q1295.7438,544.625
1295.15,544.3594 Q1294.5563,544.0781 1293.9313,544.0781 Q1292.5875,544.0781
1291.9,545.1563 Q1291.2125,546.2188 1291.2125,548.3125 Q1291.2125,550.4063
1291.9,551.4844 Q1292.5875,552.5469 1293.9313,552.5469 Q1294.5563,552.5469
1295.15,552.2813 Q1295.7438,552 1296.3688,551.4219 L1296.3688,554.1406 Z
"/><text fill="#000000" font-family="sans-serif" font-size="12"
lengthAdjust="spacingAndGlyphs" textLengt
h="82" x="1308.6" y="552.6543">CircuitBuilder</text><line style="stroke:
#A80036; stroke-width: 1.5;" x1="1274" x2="1398" y1="564.5" y2="564.5"/><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="93" x="1279" y="578.7104">set
built_circuits</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1279"
y="591.5151">RelayList relay_list</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="56" x="1279" y="604.3198">list relays</text><text fill="#000000"
font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs"
textLength="114" x="1279" y="617.1245">Controller controller</text><line
style="stroke: #A80036; stroke-width: 1.5;" x1="1274" x2="1398" y1="623.7188"
y2="623.7188"/><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="93" x="1279" y="637.9292
">int build_circuit()</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1279"
y="650.7339">void close_circuit()</text><!--class GapsCircuitBuilder--><rect
fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="48" id="GapsCircuitBuilder"
style="stroke: #A80036; stroke-width: 1.5;" width="146" x="1389"
y="967"/><ellipse cx="1404" cy="983" fill="#ADD1B2" rx="11" ry="11"
style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1406.9688,988.6406
Q1406.3906,988.9375 1405.75,989.0781 Q1405.1094,989.2344 1404.4063,989.2344
Q1401.9063,989.2344 1400.5781,987.5938 Q1399.2656,985.9375 1399.2656,982.8125
Q1399.2656,979.6875 1400.5781,978.0313 Q1401.9063,976.375 1404.4063,976.375
Q1405.1094,976.375 1405.75,976.5313 Q1406.4063,976.6875 1406.9688,976.9844
L1406.9688,979.7031 Q1406.3438,979.125 1405.75,978.8594 Q1405.1563,978.5781
1404.5313,978.5781 Q1403.1875,978.5781 1402.5,979.6563 Q1401.8125,980.7188
1401.8125,982.8125 Q1401.8125,
984.9063 1402.5,985.9844 Q1403.1875,987.0469 1404.5313,987.0469
Q1405.1563,987.0469 1405.75,986.7813 Q1406.3438,986.5 1406.9688,985.9219
L1406.9688,988.6406 Z "/><text fill="#000000" font-family="sans-serif"
font-size="12" lengthAdjust="spacingAndGlyphs" textLength="114" x="1418"
y="987.1543">GapsCircuitBuilder</text><line style="stroke: #A80036;
stroke-width: 1.5;" x1="1390" x2="1534" y1="999" y2="999"/><line style="stroke:
#A80036; stroke-width: 1.5;" x1="1390" x2="1534" y1="1007" y2="1007"/><!--class
State--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="60.8047"
id="State" style="stroke: #A80036; stroke-width: 1.5;" width="66" x="1191"
y="142.5"/><ellipse cx="1206" cy="158.5" fill="#ADD1B2" rx="11" ry="11"
style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1208.9688,164.1406
Q1208.3906,164.4375 1207.75,164.5781 Q1207.1094,164.7344 1206.4063,164.7344
Q1203.9063,164.7344 1202.5781,163.0938 Q1201.2656,161.4375 1201.2656,158.3125
Q1201.2656,155.1875 1202.5781,153.5313
Q1203.9063,151.875 1206.4063,151.875 Q1207.1094,151.875 1207.75,152.0313
Q1208.4063,152.1875 1208.9688,152.4844 L1208.9688,155.2031 Q1208.3438,154.625
1207.75,154.3594 Q1207.1563,154.0781 1206.5313,154.0781 Q1205.1875,154.0781
1204.5,155.1563 Q1203.8125,156.2188 1203.8125,158.3125 Q1203.8125,160.4063
1204.5,161.4844 Q1205.1875,162.5469 1206.5313,162.5469 Q1207.1563,162.5469
1207.75,162.2813 Q1208.3438,162 1208.9688,161.4219 L1208.9688,164.1406 Z
"/><text fill="#000000" font-family="sans-serif" font-size="12"
lengthAdjust="spacingAndGlyphs" textLength="34" x="1220"
y="162.6543">State</text><line style="stroke: #A80036; stroke-width: 1.5;"
x1="1192" x2="1256" y1="174.5" y2="174.5"/><line style="stroke: #A80036;
stroke-width: 1.5;" x1="1192" x2="1256" y1="182.5" y2="182.5"/><text
fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="26" x="1197"
y="196.7104">get()</text><!--link RelayList to Relay--><path
d="M1141.7803,1117.7792 C1139.5047,
1141.3892 1137.1208,1166.1221 1134.8275,1189.9151 " fill="none"
id="RelayList-Relay" style="stroke: #A80036; stroke-width: 1.0;"/><polygon
fill="#A80036"
points="1143.0322,1104.7911,1138.4749,1110.3796,1141.8807,1116.7357,1146.438,1111.1472,1143.0322,1104.7911"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link RelayPrioritizer to
RelayList--><path d="M1091.8035,242.0991 C1100.7542,286.445 1111.631,345.3745
1118,398 C1138.0909,564.0059 1147.1731,757.5829 1151.1325,877.2294 "
fill="none" id="RelayPrioritizer-RelayList" style="stroke: #A80036;
stroke-width: 1.0;"/><polygon fill="#A80036"
points="1089.1551,229.1209,1086.4355,235.7995,1091.5545,240.8786,1094.274,234.2,1089.1551,229.1209"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link RelayPrioritizer to
ResultDump--><path d="M1064.568,242.0302 C1051.5551,314.2861 1031.0806,427.9735
1016.8997,506.7147 " fill="none" id="RelayPrioritizer-ResultDump"
style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036"
points="1066
.9078,229.0383,1061.9076,234.2343,1064.7808,240.8483,1069.7809,235.6523,1066.9078,229.0383"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to
ResultError--><path d="M710.6906,1150.5792 C713.2952,1204.6264
715.9437,1259.5825 717.5294,1292.4845 " fill="none" id="Result-ResultError"
style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none"
points="703.6868,1150.6686,709.7159,1130.3548,717.6706,1149.9947,703.6868,1150.6686"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to
ResultSuccess--><path d="M780.7396,1148.3754 C806.0146,1199.5418
831.8309,1251.8039 848.5484,1285.6468 " fill="none" id="Result-ResultSuccess"
style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none"
points="774.4197,1151.3866,771.8379,1130.3548,786.9718,1145.1862,774.4197,1151.3866"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to
Destination--><path d="M566.1487,1068.0931 C504.0233,1103.9749
430.0487,1147.9462 365,1190 C330.9212,1212.0319 294.3122,1237.5008
262.5366,1260.2178 " fill="none" id="Result-Destination" style="stroke:
#A80036; stroke-width: 1.0;"/><!--link Result to Relay--><path
d="M839.6165,1099.2498 C884.6328,1134.9191 934.7779,1174.6522
980.1737,1210.6221 " fill="none" id="Result-Relay" style="stroke: #A80036;
stroke-width: 1.0;"/><!--link Result to Result.Relay--><path
d="M614.3565,1141.9212 C594.2523,1176.1499 573.6418,1211.2406
555.9819,1241.3077 " fill="none" id="Result-Result.Relay" style="stroke:
#A80036; stroke-width: 1.0;"/><polygon fill="#A80036"
points="621.15,1130.3548,614.6622,1133.5026,615.0726,1140.702,621.5604,1137.5542,621.15,1130.3548"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultError to
ResultErrorCircuit--><path d="M698.5156,1372.3901 C679.927,1417.2093
653.3054,1481.3969 639.0015,1515.8853 " fill="none"
id="ResultError-ResultErrorCircuit" style="stroke: #A80036; stroke-width:
1.0;"/><polygon fill="none"
points="692.168,1369.4229,706.2961,1353.6306,705.0999,1374.7864,692.168,1369.4229"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultError to
ResultErrorStream--><path d="M739.2568,1372.3901 C757.6388,1417.2093
783.9646,1481.3969 798.1096,1515.8853 " fill="none"
id="ResultError-ResultErrorStream" style="stroke: #A80036; stroke-width:
1.0;"/><polygon fill="none"
points="732.6756,1374.791,731.5628,1353.6306,745.6285,1369.4784,732.6756,1374.791"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultDump to
Result--><path d="M946.3484,694.784 C927.5344,726.6984 905.5067,761.6122
883,792 C868.2356,811.9343 851.8253,832.1859 835.0927,851.7601 " fill="none"
id="ResultDump-Result" style="stroke: #A80036; stroke-width: 1.0;"/><polygon
fill="#A80036"
points="953.1293,683.1758,946.649,686.3391,947.0766,693.5375,953.5568,690.3742,953.1293,683.1758"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultDump to
Relay--><path d="M988.2056,683.1519 C975.6842,790.8524 964.1023,977.5467
1007,1130 C1012.6786,1150.181 1021.0422,1170.3958 1030.7131,1189.7404 " fi
ll="none" id="ResultDump-Relay" style="stroke: #A80036; stroke-width:
1.0;"/><!--link DestinationList to Destination--><path d="M177,1047.2321
C177,1106.3398 177,1199.0983 177,1260.4715 " fill="none"
id="DestinationList-Destination" style="stroke: #A80036; stroke-width:
1.0;"/><polygon fill="#A80036"
points="177,1034.0628,173,1040.0628,177,1046.0628,181,1040.0628,177,1034.0628"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWHeader to
Result--><path d="M475.4186,740.5549 C491.1082,757.9 506.9075,775.3516 522,792
C539.5654,811.3761 558.107,831.7977 576.3573,851.8801 " fill="none"
id="V3BWHeader-Result" style="stroke: #A80036; stroke-width: 1.0;"/><!--link
V3BWLine to Result--><path d="M703,792.1299 C703,812.298 703,832.4782
703,851.8333 " fill="none" id="V3BWLine-Result" style="stroke: #A80036;
stroke-width: 1.0;"/><!--link V3BWFile to V3BWHeader--><path d="M344,351.6517
C344,384.1873 344,417.7741 344,449.2179 " fill="none" id="V3BWFile-V3BWHeader"
style="stroke: #A80036; s
troke-width: 1.0;"/><polygon fill="#A80036"
points="344,338.2718,340,344.2718,344,350.2718,348,344.2718,344,338.2718"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWFile to
V3BWLine--><path d="M493.1122,348.2795 C508.499,366.3665 524.1926,384.8142
539.723,403.0699 " fill="none" id="V3BWFile-V3BWLine" style="stroke: #A80036;
stroke-width: 1.0;"/><polygon fill="#A80036"
points="484.5985,338.2718,485.4396,345.4337,492.3741,347.4118,491.533,340.25,484.5985,338.2718"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWFile to
Result--><path d="M193.7462,338.0148 C182.1681,357.2413 172.2006,377.383
165,398 C107.2614,563.3184 64.9348,648.2959 165,792 C171.0821,800.7345
409.0849,886.5905 566.4632,942.6413 " fill="none" id="V3BWFile-Result"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link CircuitBuilder to
RelayList--><path d="M1301.5908,669.8683 C1274.675,728.4323 1236.8065,810.8276
1206.1672,877.4933 " fill="none" id="CircuitBuilder-RelayList" style="stroke:
#A80036;
stroke-width: 1.0;"/><polygon fill="#A80036"
points="1307.1616,657.7474,1301.0215,661.5287,1302.1503,668.6509,1308.2905,664.8696,1307.1616,657.7474"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link CircuitBuilder to
Relay--><path d="M1344.9855,657.8754 C1356.9509,761.1798 1369.3716,971.196
1301,1130 C1291.5123,1152.0367 1278.3878,1173.1519 1263.5173,1192.7967 "
fill="none" id="CircuitBuilder-Relay" style="stroke: #A80036; stroke-width:
1.0;"/><!--link CircuitBuilder to GapsCircuitBuilder--><path
d="M1362.0812,676.9694 C1391.1312,768.2694 1436.3637,910.4289
1454.2986,966.7956 " fill="none" id="CircuitBuilder-GapsCircuitBuilder"
style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none"
points="1355.3587,678.9283,1355.9651,657.7474,1368.6997,674.6834,1355.3587,678.9283"
style="stroke: #A80036; stroke-width: 1.0;"/><!--
+@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
+ bool @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()
+}
+
+@enduml
+
+PlantUML version 1.2018.13(Mon Nov 26 17:11:51 GMT 2018)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.8+10-post-Debian-1deb10u1
+Operating System: Linux
+OS Version: 4.19.0-10-amd64
+Default Encoding: UTF-8
+Language: en
+Country: US
+--></g></svg>
\ No newline at end of file
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index 0c1f9b6..8f63eb2 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -260,6 +260,8 @@ BWLINE_INT_KEYS = (
+ BWLINE_KEYS_V1_2
+ BWLINE_KEYS_V1_4
)
+# This is boolean, not int.
+BWLINE_INT_KEYS.remove('consensus_bandwidth_is_unmeasured')
def round_sig_dig(n, digits=PROP276_ROUND_DIG):
_______________________________________________
tor-commits mailing list
[email protected]
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits