From af35cab46e3eb0e29526b9c96b3df94ba8f73dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabr=C3=ADcio=20Bracht?= Date: Sat, 26 Sep 2026 18:38:08 -0300 Subject: [PATCH] revise ComNet paper and experiments for resubmission --- .../comnet/experiments/analysis/aggregate.py | 5 +- .../comnet/experiments/analysis/buildcheck.py | 72 +++ .../experiments/analysis/capped_ppub.py | 158 ++++++ .../experiments/analysis/e1_fairness.py | 114 +++++ .../figures/fig01_spike_iso_vs_loss.py | 13 +- .../figures/fig03_spike_iso_vs_topics.py | 16 +- .../figures/fig04_wcorr_vs_spike_iso.py | 17 +- .../figures/fig08_connection_latency.py | 15 +- .../figures/fig09_throughput_vs_loss.py | 171 ++++--- .../figures/fig14_strategy_comparison.py | 23 +- .../analysis/figures/fig_hol_excess.py | 85 ++++ .../analysis/figures/fig_hol_tail_vs_loss.py | 67 +++ .../analysis/figures/fig_hol_taillatency.py | 78 +++ .../analysis/figures/fig_transport_limits.py | 217 ++++++++ .../experiments/analysis/figures/style.py | 29 +- .../analysis/hol_excess_decomposition.py | 210 ++++++++ .../experiments/analysis/offload_ablation.py | 124 +++++ .../analysis/paced_offered_load.py | 135 +++++ .../analysis/single_segment_accept.py | 464 ++++++++++++++++++ .../analysis/single_segment_fold.py | 319 ++++++++++++ .../analysis/stream_limit_sweep.py | 72 +++ .../experiments/analysis/transport_limits.py | 169 +++++++ .../experiments/analysis/verify_reruns.py | 87 ++++ .../experiments/monitor/client_monitor.sh | 68 ++- .../experiments/monitor/resource_monitor.sh | 35 +- .../experiments/monitor/router_monitor.sh | 34 ++ .../experiments/netem/apply_bottleneck.sh | 11 + .../experiments/netem/broker_backlog.sh | 16 + .../comnet/experiments/netem/broker_netem.sh | 11 + .../comnet/experiments/netem/broker_tbf.sh | 13 + .../comnet/experiments/netem/netem_probe.bt | 11 + .../comnet/experiments/netem/router_clear.sh | 8 + .../experiments/netem/router_ingress_count.sh | 5 + .../comnet/experiments/netem/router_loss.sh | 10 + .../comnet/experiments/netem/router_setup.sh | 47 ++ .../comnet/experiments/netem/tbf_probe.bt | 4 + .../comnet/experiments/netem/tcp_cwr_probe.bt | 10 + .../parallel/02c_topic_rate_sweep_v5.sh | 144 ++++++ .../comnet/experiments/parallel/03_watched.sh | 40 ++ .../parallel/03b_tls_throughput_v5.sh | 52 ++ .../parallel/03c_offload_ablation.sh | 79 +++ .../parallel/03d_offload_lowload.sh | 79 +++ .../comnet/experiments/parallel/03e_infra.sh | 226 +++++++++ .../comnet/experiments/parallel/03e_plan.py | 146 ++++++ .../parallel/03e_single_segment.sh | 424 ++++++++++++++++ .../comnet/experiments/parallel/03f_binary.sh | 45 ++ .../parallel/04_transport_limits_v5.sh | 147 ++++++ .../parallel/04b_stream_limit_sweep.sh | 68 +++ .../experiments/parallel/E1_fairness_v5.sh | 155 ++++++ .../experiments/parallel/common_parallel.sh | 75 ++- .../comnet/experiments/parallel/group1.env | 12 +- .../comnet/experiments/parallel/group2.env | 12 +- .../comnet/experiments/parallel/group3.env | 14 +- .../experiments/parallel/run_03e_pilot.sh | 28 ++ .../experiments/parallel/run_03e_sweep.sh | 23 + .../parallel/run_reruns_resilient.sh | 34 ++ .../experiments/parallel/run_tls_resilient.sh | 24 + .../experiments/run/02c_hol_topic_scaling.sh | 2 +- publications/comnet/experiments/run/common.sh | 21 +- .../comnet/experiments/setup/pin_kernel.sh | 32 ++ publications/comnet/submission/Figure_1.pdf | Bin 17977 -> 0 bytes publications/comnet/submission/Figure_2.pdf | Bin 17468 -> 0 bytes publications/comnet/submission/Figure_3.pdf | Bin 17103 -> 17063 bytes publications/comnet/submission/Figure_4.pdf | Bin 18455 -> 28560 bytes publications/comnet/submission/Figure_5.pdf | Bin 22009 -> 17148 bytes publications/comnet/submission/Figure_6.pdf | Bin 17849 -> 21533 bytes publications/comnet/submission/Figure_7.pdf | Bin 19079 -> 22149 bytes publications/comnet/submission/Figure_8.pdf | Bin 24160 -> 18408 bytes publications/comnet/submission/biography.docx | Bin 13776 -> 11656 bytes publications/comnet/submission/main.bbl | 76 ++- publications/comnet/submission/main.pdf | Bin 460260 -> 493347 bytes publications/comnet/submission/main.tex | 366 ++++++++------ publications/comnet/submission/references.bib | 77 ++- 73 files changed, 4971 insertions(+), 373 deletions(-) create mode 100644 publications/comnet/experiments/analysis/buildcheck.py create mode 100644 publications/comnet/experiments/analysis/capped_ppub.py create mode 100644 publications/comnet/experiments/analysis/e1_fairness.py create mode 100644 publications/comnet/experiments/analysis/figures/fig_hol_excess.py create mode 100644 publications/comnet/experiments/analysis/figures/fig_hol_tail_vs_loss.py create mode 100644 publications/comnet/experiments/analysis/figures/fig_hol_taillatency.py create mode 100644 publications/comnet/experiments/analysis/figures/fig_transport_limits.py create mode 100644 publications/comnet/experiments/analysis/hol_excess_decomposition.py create mode 100644 publications/comnet/experiments/analysis/offload_ablation.py create mode 100644 publications/comnet/experiments/analysis/paced_offered_load.py create mode 100644 publications/comnet/experiments/analysis/single_segment_accept.py create mode 100644 publications/comnet/experiments/analysis/single_segment_fold.py create mode 100644 publications/comnet/experiments/analysis/stream_limit_sweep.py create mode 100644 publications/comnet/experiments/analysis/transport_limits.py create mode 100644 publications/comnet/experiments/analysis/verify_reruns.py create mode 100755 publications/comnet/experiments/monitor/router_monitor.sh create mode 100755 publications/comnet/experiments/netem/apply_bottleneck.sh create mode 100755 publications/comnet/experiments/netem/broker_backlog.sh create mode 100755 publications/comnet/experiments/netem/broker_netem.sh create mode 100755 publications/comnet/experiments/netem/broker_tbf.sh create mode 100644 publications/comnet/experiments/netem/netem_probe.bt create mode 100755 publications/comnet/experiments/netem/router_clear.sh create mode 100755 publications/comnet/experiments/netem/router_ingress_count.sh create mode 100755 publications/comnet/experiments/netem/router_loss.sh create mode 100755 publications/comnet/experiments/netem/router_setup.sh create mode 100644 publications/comnet/experiments/netem/tbf_probe.bt create mode 100644 publications/comnet/experiments/netem/tcp_cwr_probe.bt create mode 100644 publications/comnet/experiments/parallel/02c_topic_rate_sweep_v5.sh create mode 100644 publications/comnet/experiments/parallel/03_watched.sh create mode 100644 publications/comnet/experiments/parallel/03b_tls_throughput_v5.sh create mode 100644 publications/comnet/experiments/parallel/03c_offload_ablation.sh create mode 100644 publications/comnet/experiments/parallel/03d_offload_lowload.sh create mode 100755 publications/comnet/experiments/parallel/03e_infra.sh create mode 100644 publications/comnet/experiments/parallel/03e_plan.py create mode 100755 publications/comnet/experiments/parallel/03e_single_segment.sh create mode 100755 publications/comnet/experiments/parallel/03f_binary.sh create mode 100644 publications/comnet/experiments/parallel/04_transport_limits_v5.sh create mode 100644 publications/comnet/experiments/parallel/04b_stream_limit_sweep.sh create mode 100755 publications/comnet/experiments/parallel/E1_fairness_v5.sh create mode 100755 publications/comnet/experiments/parallel/run_03e_pilot.sh create mode 100755 publications/comnet/experiments/parallel/run_03e_sweep.sh create mode 100644 publications/comnet/experiments/parallel/run_reruns_resilient.sh create mode 100644 publications/comnet/experiments/parallel/run_tls_resilient.sh create mode 100644 publications/comnet/experiments/setup/pin_kernel.sh delete mode 100644 publications/comnet/submission/Figure_1.pdf delete mode 100644 publications/comnet/submission/Figure_2.pdf diff --git a/publications/comnet/experiments/analysis/aggregate.py b/publications/comnet/experiments/analysis/aggregate.py index dcbd3c24..4e3a4951 100755 --- a/publications/comnet/experiments/analysis/aggregate.py +++ b/publications/comnet/experiments/analysis/aggregate.py @@ -6,6 +6,8 @@ import sys from pathlib import Path +from scipy import stats + def load_results(results_dir: Path) -> dict[str, list]: experiments: dict[str, list] = {} @@ -49,7 +51,8 @@ def stdev(values: list[float]) -> float: def ci95(values: list[float]) -> float: if len(values) < 2: return 0.0 - return 1.96 * stdev(values) / math.sqrt(len(values)) + n = len(values) + return float(stats.t.ppf(0.975, n - 1)) * stdev(values) / math.sqrt(n) def extract_metric(data: dict) -> dict[str, float]: diff --git a/publications/comnet/experiments/analysis/buildcheck.py b/publications/comnet/experiments/analysis/buildcheck.py new file mode 100644 index 00000000..d0064464 --- /dev/null +++ b/publications/comnet/experiments/analysis/buildcheck.py @@ -0,0 +1,72 @@ +import csv +import json +import statistics +import sys +from pathlib import Path + +CONFIGS = ["tcp", "tls", "quic-main"] +BUILDS = ["bcfleet", "bclater"] +FANOUT = 8 + + +def collect(base): + cells = {} + excluded = [] + for directory in sorted(base.glob("03h_buildcheck_g*")): + accepted = {row["label"]: row for row in csv.DictReader(open(directory / "acceptance.csv"))} + for row in csv.DictReader(open(directory / "manifest.csv")): + gate = accepted.get(row["label"]) + if gate is None or gate["pass"] != "True": + excluded.append((row["label"], gate["failures"] if gate else "not evaluated")) + continue + sub = json.load(open(directory / f"{row['label']}.json")) + pub = json.load(open(directory / f"{row['label']}_pub.json")) + cells.setdefault((row["phase"], row["config"]), []).append({ + "group": directory.name[-2:], + "unique": sub["results"]["throughput_avg"] / FANOUT, + "offered": pub["results"]["offered_rate"], + "sha": row["binary_sha"], + }) + return cells, excluded + + +def group_means(samples, field): + per_group = {} + for sample in samples: + per_group.setdefault(sample["group"], []).append(sample[field]) + return {group: statistics.mean(values) for group, values in per_group.items()} + + +def within_group_ratio(numerator, denominator): + left, right = group_means(numerator, "unique"), group_means(denominator, "unique") + return [left[g] / right[g] for g in sorted(set(left) & set(right))] + + +def main(results_dir): + cells, excluded = collect(Path(results_dir)) + print(f"excluded runs: {len(excluded)}") + for label, reason in excluded: + print(f" {label}: {reason}") + print("\n=== 10% loss, router arm, unpaced. unique msg/s pooled mean (per-group means); offered msg/s") + for config in CONFIGS: + for build in BUILDS: + samples = cells.get((build, config), []) + if not samples: + continue + groups = " ".join(f"{g}:{v:.0f}" for g, v in sorted(group_means(samples, "unique").items())) + shas = {s["sha"][:8] for s in samples} + print(f" {config:10s} {build:8s} n={len(samples)} unique {statistics.mean(s['unique'] for s in samples):7.1f} ({groups}) " + f"offered {statistics.mean(s['offered'] for s in samples):9.0f} sha {','.join(sorted(shas))}") + ratios = within_group_ratio(cells.get(("bclater", config), []), cells.get(("bcfleet", config), [])) + if ratios: + print(f" {config:10s} later/fleet {statistics.mean(ratios):.3f} (range {min(ratios):.3f}-{max(ratios):.3f}, {len(ratios)} groups)") + for build in BUILDS: + for other in ("tls", "tcp"): + ratios = within_group_ratio(cells.get((build, "quic-main"), []), cells.get((build, other), [])) + if ratios: + print(f" QUIC/{other} {build:8s} {statistics.mean(ratios):.3f} (range {min(ratios):.3f}-{max(ratios):.3f}, {len(ratios)} groups)") + + +if __name__ == "__main__": + default = Path(__file__).resolve().parent.parent / "results-v5" + main(sys.argv[1] if len(sys.argv) > 1 else default) diff --git a/publications/comnet/experiments/analysis/capped_ppub.py b/publications/comnet/experiments/analysis/capped_ppub.py new file mode 100644 index 00000000..7fc0ed34 --- /dev/null +++ b/publications/comnet/experiments/analysis/capped_ppub.py @@ -0,0 +1,158 @@ +import csv +import json +import statistics +import sys +from pathlib import Path + +CONFIGS = ["quic-ppub", "quic-main-ppub", "quic-ctl"] +LABELS = { + "quic-ppub": "per-publish delivery (client per-publish)", + "quic-main-ppub": "per-topic delivery (client per-publish)", + "quic-ctl": "control-only delivery (client control-only)", +} +RATES = [1250, 2500, 5000, 10000, 20000, 0] +CAP_PROBE_RATES = {10000, 20000} +FANOUT = 8 +PACING_TOLERANCE = 0.02 +SUB_SATURATION_PREFIX = "P3: sub busy" +METRICS = ["offered", "delivered", "ratio", "cpu", "cpu_us_per_delivered", "cpu_us_per_offered", "pkts_per_delivered"] + + +def load_json(path): + try: + return json.load(open(path)) + except (OSError, json.JSONDecodeError): + return None + + +def active_cpu(path): + try: + values = [float(row["cpu_percent"]) for row in csv.DictReader(open(path)) if row.get("cpu_percent")] + except (OSError, ValueError): + return None + if not values: + return None + return statistics.mean(value for value in values if value >= 0.5 * max(values)) + + +def acceptance(directory): + path = directory / "acceptance.csv" + if not path.exists(): + raise SystemExit(f"{path} missing: run single_segment_accept.py {directory} first") + return {row["label"]: row for row in csv.DictReader(open(path))} + + +def collect(base): + cells = {} + excluded = [] + for directory in sorted(base.glob("03f_capped_g*")): + accepted = acceptance(directory) + rows = {row["label"]: row for row in csv.DictReader(open(directory / "manifest.csv"))}.values() + for row in rows: + label = row["label"] + gate = accepted.get(label) + if gate is None: + excluded.append((label, "not evaluated by acceptance")) + continue + reasons = [reason for reason in gate["failures"].split("; ") if reason] + if any(not reason.startswith(SUB_SATURATION_PREFIX) for reason in reasons): + excluded.append((label, gate["failures"])) + continue + saturated = bool(reasons) + pub = load_json(directory / f"{label}_pub.json") + sub = load_json(directory / f"{label}.json") + if not pub or not sub: + excluded.append((label, "missing results")) + continue + target = int(row["rate"]) + configured = int(pub.get("config", {}).get("rate", 0) or 0) + offered = pub["results"].get("offered_rate") or 0.0 + if configured != target: + excluded.append((label, f"bench rate {configured} != planned {target}")) + continue + if target and abs(offered / target - 1) > PACING_TOLERANCE: + excluded.append((label, f"paced at {offered:.0f}/s, target {target}/s")) + continue + delivered = sub["results"]["throughput_avg"] + received = sub["results"].get("received") or 0 + cpu = None if saturated else active_cpu(directory / f"{label}_broker_resources.csv") + skbs = float(gate["skbs"]) if gate.get("skbs") else None + cells.setdefault((row["config"], target, int(row["loss"])), []).append({ + "group": directory.name[-2:], + "saturated": saturated, + "offered": offered, + "delivered": delivered, + "ratio": delivered / (FANOUT * offered) if offered else None, + "cpu": cpu, + "cpu_us_per_delivered": cpu / 100 / delivered * 1e6 if cpu and delivered else None, + "cpu_us_per_offered": cpu / 100 / offered * 1e6 if cpu and offered else None, + "pkts_per_delivered": skbs / received if skbs and received else None, + }) + return cells, excluded + + +def summary(samples, field): + values = [s[field] for s in samples if s[field] is not None] + if not values: + return "-" + per_group = {} + for sample in samples: + if sample[field] is not None: + per_group.setdefault(sample["group"], []).append(sample[field]) + groups = " ".join(f"{g}:{statistics.mean(v):.3g}" for g, v in sorted(per_group.items())) + return f"{statistics.mean(values):.3g} ({groups})" + + +def paired_differences(cells, loss, field, left, right): + out = [] + for rate in RATES: + a, b = cells.get((left, rate, loss)), cells.get((right, rate, loss)) + if not a or not b: + continue + diffs = [] + for group in sorted({s["group"] for s in a} & {s["group"] for s in b}): + va = [s[field] for s in a if s["group"] == group and s[field] is not None] + vb = [s[field] for s in b if s["group"] == group and s[field] is not None] + if va and vb: + diffs.append(statistics.mean(va) / statistics.mean(vb)) + if diffs: + out.append((rate, statistics.mean(diffs), min(diffs), max(diffs), len(diffs))) + return out + + +def main(results_dir): + cells, excluded = collect(Path(results_dir)) + print(f"excluded runs: {len(excluded)}") + for label, reason in excluded: + print(f" {label}: {reason}") + for loss in (0, 1): + print(f"\n=== loss {loss}% (router arm), 8 subscribers. Values: pooled mean (per-group means g1..g3)") + for config in CONFIGS: + print(f" {LABELS[config]}") + for rate in RATES: + samples = cells.get((config, rate, loss)) + if not samples: + continue + name = f"rate {rate}" if rate else "uncapped" + tags = [] + if rate in CAP_PROBE_RATES and config == "quic-ppub": + tags.append("cap probe") + saturated = sum(s["saturated"] for s in samples) + if saturated: + tags.append(f"{saturated} sub-saturated (cpu omitted)") + print(f" {name:11s} n={len(samples):2d} {'[' + ', '.join(tags) + ']' if tags else ''}") + for field in METRICS: + print(f" {field:22s} {summary(samples, field)}") + for field in ("cpu_us_per_delivered", "pkts_per_delivered"): + for other in ("quic-main-ppub", "quic-ctl"): + rows = paired_differences(cells, loss, field, "quic-ppub", other) + if rows: + print(f" within-group ratio {field}: per-publish / {other}") + for rate, mean, low, high, n in rows: + name = f"rate {rate}" if rate else "uncapped" + print(f" {name:11s} {mean:5.2f} (range {low:.2f}-{high:.2f}, {n} groups)") + + +if __name__ == "__main__": + default = Path(__file__).resolve().parent.parent / "results-v5" + main(sys.argv[1] if len(sys.argv) > 1 else default) diff --git a/publications/comnet/experiments/analysis/e1_fairness.py b/publications/comnet/experiments/analysis/e1_fairness.py new file mode 100644 index 00000000..9281d0d5 --- /dev/null +++ b/publications/comnet/experiments/analysis/e1_fairness.py @@ -0,0 +1,114 @@ +import csv +import glob +import json +import statistics +import sys +from pathlib import Path + + +def broker_tx_mbit(broker_csv: Path): + rows = [r for r in csv.DictReader(open(broker_csv)) if r["net_tx_bytes"].isdigit()] + if len(rows) < 4: + return None + rows = rows[1:-1] + dt = float(rows[-1]["timestamp"]) - float(rows[0]["timestamp"]) + db = int(rows[-1]["net_tx_bytes"]) - int(rows[0]["net_tx_bytes"]) + return db * 8 / 1e6 / dt if dt > 0 else None + + +def iperf_mbit(iperf_json: Path): + end = json.load(open(iperf_json)).get("end", {}) + if "sum_received" not in end: + return None + return end["sum_received"]["bits_per_second"] / 1e6 + + +def arm_fairness(results_dir: Path, arm: str, loss: int): + prefix = f"{arm}_rate*_loss{loss}pct" + shares, iperfs, jains = [], [], [] + for bc in sorted(glob.glob(str(results_dir / f"{prefix}_run*_broker_resources.csv"))): + run = Path(bc).name.replace("_broker_resources.csv", "") + ic = results_dir / f"{run}_iperf.json" + mc = results_dir / f"{run}_messages.csv" + tx = broker_tx_mbit(Path(bc)) + ip = iperf_mbit(ic) if ic.exists() else None + if tx and ip and tx > ip: + shares.append(100 * (tx - ip) / tx) + iperfs.append(ip) + if mc.exists(): + gp = per_connection_goodput(mc) + if len(gp) > 1: + jains.append(jain_index(list(gp.values()))) + med = lambda v: round(statistics.median(v), 1) if v else None + return {"n": len(shares), "mqtt_wire_share_pct": med(shares), + "iperf_mbit": med(iperfs), "jain": (round(statistics.median(jains), 3) if jains else None)} + + +def analyze_dir(results_dir: Path): + arms = ["tcp-1conn", "tcp-Nconn", "quic-control", "quic-pertopic"] + print(f"E1 fairness (MQTT share of a bottleneck shared with one greedy TCP flow)") + print(f"{'arm':>14} {'loss':>5} | {'MQTT share%':>11} {'iperf Mbit':>11} {'intra-Jain':>11} {'n':>3}") + for arm in arms: + for loss in [0, 1]: + r = arm_fairness(results_dir, arm, loss) + if r["n"]: + print(f"{arm:>14} {loss:>4}% | {str(r['mqtt_wire_share_pct']):>11} " + f"{str(r['iperf_mbit']):>11} {str(r['jain']):>11} {r['n']:>3}") + + +def per_connection_goodput(messages_csv: Path, trim: float = 0.1): + receive_ns = {} + for row in csv.DictReader(open(messages_csv)): + conn = int(row["conn_idx"]) + receive_ns.setdefault(conn, []).append(int(row["receive_ns"])) + + all_ns = [ns for series in receive_ns.values() for ns in series] + if not all_ns: + return {} + lo, hi = min(all_ns), max(all_ns) + span = hi - lo + start = lo + int(span * trim) + end = hi - int(span * trim) + window_s = max((end - start) / 1e9, 1e-9) + + goodput = {} + for conn, series in receive_ns.items(): + in_window = sum(1 for ns in series if start <= ns <= end) + goodput[conn] = in_window / window_s + return goodput + + +def jain_index(values): + if not values: + return 0.0 + n = len(values) + total = sum(values) + total_sq = sum(v * v for v in values) + if total_sq == 0: + return 0.0 + return (total * total) / (n * total_sq) + + +def main(messages_csv: Path): + goodput = per_connection_goodput(messages_csv) + if not goodput: + print(f"no data in {messages_csv}") + return + flows = [goodput[c] for c in sorted(goodput)] + print(f"file: {messages_csv}") + print(f"connections: {len(flows)}") + for conn in sorted(goodput): + print(f" conn {conn}: {goodput[conn]:.1f} msg/s") + print(f"aggregate: {sum(flows):.1f} msg/s") + print(f"Jain fairness index: {jain_index(flows):.4f} (1.0 = perfectly fair)") + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print(f"usage: {sys.argv[0]} ") + sys.exit(1) + target = Path(sys.argv[1]) + if target.is_dir(): + analyze_dir(target) + else: + main(target) diff --git a/publications/comnet/experiments/analysis/figures/fig01_spike_iso_vs_loss.py b/publications/comnet/experiments/analysis/figures/fig01_spike_iso_vs_loss.py index 442f954a..a7ce54b4 100644 --- a/publications/comnet/experiments/analysis/figures/fig01_spike_iso_vs_loss.py +++ b/publications/comnet/experiments/analysis/figures/fig01_spike_iso_vs_loss.py @@ -16,8 +16,8 @@ save_figure, ) -LOSS_RATES = [0, 1, 2, 5] -LOSS_LABELS = ["0%", "1%", "2%", "5%"] +LOSS_RATES = [1, 2, 5] +LOSS_LABELS = ["1%", "2%", "5%"] RUNS = range(1, 16) @@ -64,13 +64,6 @@ def main(results_dir: Path, output_dir: Path): fig, ax = plt.subplots(figsize=(7, 4.5)) - x_offsets = { - "tcp": -0.15, - "quic-control": -0.05, - "quic-pertopic": 0.05, - "quic-perpub": 0.15, - } - group_positions = np.arange(len(LOSS_RATES)) for transport in TRANSPORT_ORDER: @@ -82,7 +75,7 @@ def main(results_dir: Path, output_dir: Path): mean, ci_half = compute_ci(data[transport][loss]) means.append(mean) ci_halves.append(ci_half) - positions.append(group_positions[loss_idx] + x_offsets[transport]) + positions.append(group_positions[loss_idx]) ax.errorbar( positions, diff --git a/publications/comnet/experiments/analysis/figures/fig03_spike_iso_vs_topics.py b/publications/comnet/experiments/analysis/figures/fig03_spike_iso_vs_topics.py index edc7f271..2efe8372 100644 --- a/publications/comnet/experiments/analysis/figures/fig03_spike_iso_vs_topics.py +++ b/publications/comnet/experiments/analysis/figures/fig03_spike_iso_vs_topics.py @@ -30,9 +30,13 @@ def load_topic_scaling_data(results_dir: Path): for run in RUNS: filepath = exp02_dir / f"{transport}_loss1pct_run{run}.json" if filepath.exists(): + try: + with open(filepath) as f: + result = json.load(f) + except json.JSONDecodeError: + print(f" warning: skipping invalid JSON: {filepath.name}") + continue sources.setdefault(transport, {}).setdefault(8, []) - with open(filepath) as f: - result = json.load(f) sources[transport][8].append( result["results"]["windowed_correlation"] ) @@ -46,11 +50,15 @@ def load_topic_scaling_data(results_dir: Path): / f"{transport}_{topic_count}topics_run{run}.json" ) if filepath.exists(): + try: + with open(filepath) as f: + result = json.load(f) + except json.JSONDecodeError: + print(f" warning: skipping invalid JSON: {filepath.name}") + continue sources.setdefault(transport, {}).setdefault( topic_count, [] ) - with open(filepath) as f: - result = json.load(f) sources[transport][topic_count].append( result["results"]["windowed_correlation"] ) diff --git a/publications/comnet/experiments/analysis/figures/fig04_wcorr_vs_spike_iso.py b/publications/comnet/experiments/analysis/figures/fig04_wcorr_vs_spike_iso.py index 35d84cf8..0a5c40bc 100644 --- a/publications/comnet/experiments/analysis/figures/fig04_wcorr_vs_spike_iso.py +++ b/publications/comnet/experiments/analysis/figures/fig04_wcorr_vs_spike_iso.py @@ -16,8 +16,8 @@ save_figure, ) -LOSS_RATES = [0, 1, 2, 5] -LOSS_LABELS = ["0%", "1%", "2%", "5%"] +LOSS_RATES = [1, 2, 5] +LOSS_LABELS = ["1%", "2%", "5%"] RUNS = range(1, 16) @@ -64,13 +64,6 @@ def main(results_dir: Path, output_dir: Path): fig, ax = plt.subplots(figsize=(7, 4.5)) - x_offsets = { - "tcp": -0.15, - "quic-control": -0.05, - "quic-pertopic": 0.05, - "quic-perpub": 0.15, - } - group_positions = np.arange(len(LOSS_RATES)) for transport in TRANSPORT_ORDER: @@ -82,7 +75,7 @@ def main(results_dir: Path, output_dir: Path): mean, ci_half = compute_ci(data[transport][loss]) means.append(mean) ci_halves.append(ci_half) - positions.append(group_positions[loss_idx] + x_offsets[transport]) + positions.append(group_positions[loss_idx]) ax.errorbar( positions, @@ -105,9 +98,9 @@ def main(results_dir: Path, output_dir: Path): ax.set_ylabel("Spike Isolation Ratio") ax.set_xticks(group_positions) ax.set_xticklabels(LOSS_LABELS) - ax.set_ylim(-0.05, 1.15) + ax.set_ylim(0.5, 1.05) ax.axhline(y=1.0, color="gray", linewidth=0.5, linestyle="--", zorder=1) - ax.legend(loc="center right", framealpha=0.9) + ax.legend(loc="lower right", framealpha=0.9) fig.tight_layout() save_figure(fig, output_dir, "fig04_wcorr_vs_spike_iso") diff --git a/publications/comnet/experiments/analysis/figures/fig08_connection_latency.py b/publications/comnet/experiments/analysis/figures/fig08_connection_latency.py index 51f60727..e03349a4 100644 --- a/publications/comnet/experiments/analysis/figures/fig08_connection_latency.py +++ b/publications/comnet/experiments/analysis/figures/fig08_connection_latency.py @@ -3,6 +3,7 @@ from pathlib import Path import matplotlib.pyplot as plt +from matplotlib.ticker import FixedLocator, FuncFormatter, NullLocator import numpy as np from scipy import stats @@ -18,6 +19,8 @@ DELAYS_MS = [0, 25, 50, 100, 200] DELAY_LABELS = ["0ms", "25ms", "50ms", "100ms", "200ms"] RUNS = range(1, 16) +US_PER_MS = 1000 +Y_TICKS_MS = [0.5, 1, 2, 5, 10, 20, 50, 100, 200, 500] def load_connection_latency(results_dir: Path): @@ -38,8 +41,8 @@ def load_connection_latency(results_dir: Path): continue with open(filepath) as f: result = json.load(f) - p50_values.append(result["results"]["p50_connect_us"]) - p95_values.append(result["results"]["p95_connect_us"]) + p50_values.append(result["results"]["p50_connect_us"] / US_PER_MS) + p95_values.append(result["results"]["p95_connect_us"] / US_PER_MS) if p50_values: data[transport][delay] = {"p50": p50_values, "p95": p95_values} return data @@ -96,9 +99,13 @@ def main(results_dir: Path, output_dir: Path): linewidth=0.5, ) - ax.set_xlabel("One-Way Delay (RTT = 2x)") - ax.set_ylabel("Connect Latency (us)") + ax.set_xlabel("Emulated Path Delay (ms)") + ax.set_ylabel("Connect Latency (ms)") ax.set_yscale("log") + ax.yaxis.set_major_locator(FixedLocator(Y_TICKS_MS)) + ax.yaxis.set_minor_locator(NullLocator()) + ax.yaxis.set_major_formatter(FuncFormatter(lambda value, _: f"{value:g}")) + ax.set_ylim(Y_TICKS_MS[0], 800) ax.set_title("Connection Setup Latency vs. Network Delay") ax.set_xticks(group_positions) ax.set_xticklabels(DELAY_LABELS) diff --git a/publications/comnet/experiments/analysis/figures/fig09_throughput_vs_loss.py b/publications/comnet/experiments/analysis/figures/fig09_throughput_vs_loss.py index add938e8..66ab3553 100644 --- a/publications/comnet/experiments/analysis/figures/fig09_throughput_vs_loss.py +++ b/publications/comnet/experiments/analysis/figures/fig09_throughput_vs_loss.py @@ -1,8 +1,10 @@ +import csv import json import sys from pathlib import Path import matplotlib.pyplot as plt +from matplotlib.ticker import FixedLocator, FuncFormatter, NullLocator import numpy as np from scipy import stats @@ -18,96 +20,111 @@ LOSS_RATES = [0, 1, 2, 5, 10] LOSS_LABELS = ["0%", "1%", "2%", "5%", "10%"] -QOS_LEVELS = [0, 1] RUNS = range(1, 16) - - -def load_throughput_data(results_dir: Path): +Y_TICKS = [500, 1000, 2000, 5000, 10000, 20000, 50000] +GROUPS = (1, 2, 3) +PER_PACKET_MODE = "router" +PER_PACKET_PHASE = "main" +PER_PACKET_CONFIGS = { + "tcp": "tcp", + "tls": "tls", + "quic-control-only": "quic-main", + "quic-per-topic": "quic-main-ptopic", + "quic-per-publish": "quic-main-ppub", +} + + +def load_per_buffer(results_dir: Path): exp_dir = results_dir / "03_throughput_under_loss" - if not exp_dir.exists(): - print(f" WARNING: {exp_dir} not found, skipping fig09") - return None - data = {} for strategy in THROUGHPUT_ORDER: - data[strategy] = {} - for qos in QOS_LEVELS: - data[strategy][qos] = {} - for loss in LOSS_RATES: - values = [] - for run in RUNS: - filepath = exp_dir / f"{strategy}_qos{qos}_loss{loss}pct_run{run}.json" - if not filepath.exists(): - continue - with open(filepath) as f: - result = json.load(f) - values.append(result["results"]["throughput_avg"]) - if values: - data[strategy][qos][loss] = values + for loss in LOSS_RATES: + values = [] + for run in RUNS: + filepath = exp_dir / f"{strategy}_qos0_loss{loss}pct_run{run}.json" + if not filepath.exists(): + continue + result = json.load(open(filepath)) + subscribers = result["config"].get("subscribers") or 1 + values.append(result["results"]["throughput_avg"] / subscribers) + if values: + data[(strategy, loss)] = values + return data + + +def load_per_packet(results_dir: Path): + strategy_of = {config: strategy for strategy, config in PER_PACKET_CONFIGS.items()} + data = {} + for group in GROUPS: + exp_dir = results_dir / f"03e_single_segment_g{group}" + accepted = {row["label"] for row in csv.DictReader(open(exp_dir / "acceptance.csv")) if row["pass"] == "True"} + for row in csv.DictReader(open(exp_dir / "manifest.csv")): + if row["phase"] != PER_PACKET_PHASE or row["mode"] != PER_PACKET_MODE or row["broker_probe"] == "1": + continue + strategy = strategy_of.get(row["config"]) + if strategy is None or row["label"] not in accepted: + continue + result = json.load(open(exp_dir / f"{row['label']}.json")) + subscribers = result["config"].get("subscribers") or 1 + data.setdefault((strategy, int(row["loss"])), []).append(result["results"]["throughput_avg"] / subscribers) return data def compute_ci(values, confidence=0.95): - n = len(values) - if n < 2: - return np.mean(values), 0.0 - m = np.mean(values) - sem = stats.sem(values) - t_crit = stats.t.ppf((1 + confidence) / 2, df=n - 1) - return m, t_crit * sem + mean = np.mean(values) + if len(values) < 2: + return mean, 0.0 + return mean, stats.t.ppf((1 + confidence) / 2, df=len(values) - 1) * stats.sem(values) + + +def series(data, strategy): + points = [(loss, *compute_ci(data[(strategy, loss)])) for loss in LOSS_RATES if (strategy, loss) in data] + return [np.array(column) for column in zip(*points)] if points else None def main(results_dir: Path, output_dir: Path): apply_style() - data = load_throughput_data(results_dir) - if data is None: - return - - fig, axes = plt.subplots(2, 1, figsize=(7, 8), sharex=True) - - for qos_idx, qos in enumerate(QOS_LEVELS): - ax = axes[qos_idx] - for strategy in THROUGHPUT_ORDER: - x_vals = [] - y_means = [] - y_lo = [] - y_hi = [] - for loss in LOSS_RATES: - if loss in data[strategy][qos]: - m, ci_half = compute_ci(data[strategy][qos][loss]) - x_vals.append(loss) - y_means.append(m) - y_lo.append(m - ci_half) - y_hi.append(m + ci_half) - - if not x_vals: - continue + per_buffer = load_per_buffer(results_dir) + per_packet = load_per_packet(results_dir) - ax.plot( - x_vals, - y_means, - marker=THROUGHPUT_MARKERS[strategy], - color=THROUGHPUT_COLORS[strategy], - label=THROUGHPUT_LABELS[strategy], - linewidth=1.5, - markersize=5, - ) - ax.fill_between( - x_vals, - y_lo, - y_hi, - alpha=0.15, - color=THROUGHPUT_COLORS[strategy], - ) - - ax.set_ylabel("Throughput (msgs/sec)") - ax.set_title(f"QoS {qos}") - ax.legend(loc="best", framealpha=0.9) - - axes[1].set_xlabel("Packet Loss Rate (%)") - axes[1].set_xticks(LOSS_RATES) - axes[1].set_xticklabels(LOSS_LABELS) - fig.suptitle("Throughput vs. Packet Loss Rate", fontsize=12, y=0.98) + fig, ax = plt.subplots(figsize=(7, 4)) + for strategy in THROUGHPUT_ORDER: + color = THROUGHPUT_COLORS[strategy] + reference = series(per_buffer, strategy) + if reference is not None: + x, mean, _ = reference + ax.plot(x, mean, linestyle="--", color=color, alpha=0.35, linewidth=1.0) + current = series(per_packet, strategy) + if current is None: + continue + x, mean, half = current + ax.errorbar( + x, + mean, + yerr=half, + marker=THROUGHPUT_MARKERS[strategy], + color=color, + label=THROUGHPUT_LABELS[strategy], + linewidth=1.5, + markersize=5, + capsize=3, + ) + for loss in x: + values = per_packet[(strategy, int(loss))] + print(f"{strategy} {int(loss)}%: n={len(values)} mean={np.mean(values):.0f}") + + ax.plot([], [], linestyle="--", color="grey", alpha=0.5, label="Per-buffer loss on broker egress") + ax.set_yscale("log") + ax.yaxis.set_major_locator(FixedLocator(Y_TICKS)) + ax.yaxis.set_minor_locator(NullLocator()) + ax.yaxis.set_major_formatter(FuncFormatter(lambda value, _: f"{value / 1000:g}K")) + ax.set_ylim(Y_TICKS[0], 80000) + ax.set_ylabel("Delivered throughput (unique msg/s)") + ax.set_xlabel("Packet Loss Rate (%)") + ax.set_xticks(LOSS_RATES) + ax.set_xticklabels(LOSS_LABELS) + ax.legend(loc="best", framealpha=0.9) + ax.set_title("Delivered Throughput vs. Packet Loss Rate (QoS 0)") fig.tight_layout() save_figure(fig, output_dir, "fig09_throughput_vs_loss") diff --git a/publications/comnet/experiments/analysis/figures/fig14_strategy_comparison.py b/publications/comnet/experiments/analysis/figures/fig14_strategy_comparison.py index 03802fab..65c4a80d 100644 --- a/publications/comnet/experiments/analysis/figures/fig14_strategy_comparison.py +++ b/publications/comnet/experiments/analysis/figures/fig14_strategy_comparison.py @@ -42,11 +42,17 @@ def load_data(results_dir: Path): for topics in TOPIC_COUNTS: tp_values = [] for run in RUNS: - tp_path = exp_dir / f"{strategy}_{topics}topics_throughput_run{run}.json" + tp_path = exp_dir / f"{strategy}_{topics}topics_throughput_run{run}_pub.json" if tp_path.exists(): - with open(tp_path) as f: - d = json.load(f) - tp_values.append(d["results"]["throughput_avg"]) + try: + with open(tp_path) as f: + d = json.load(f) + except json.JSONDecodeError: + print(f" warning: skipping invalid JSON: {tp_path.name}") + continue + elapsed = d["results"].get("elapsed_secs", 0) + if elapsed: + tp_values.append(d["results"]["published"] / elapsed) if tp_values: data[strategy]["throughput"][topics] = tp_values @@ -85,10 +91,13 @@ def main(results_dir: Path, output_dir: Path): ) ax_tp.set_xlabel("Topic Count") - ax_tp.set_ylabel("Throughput (K msgs/sec)") - ax_tp.set_title("Throughput vs. Topic Count") + ax_tp.set_ylabel("Publish rate (K msg/s)") + ax_tp.set_title("Single-Connection Publish Rate vs. Topic Count") ax_tp.set_xticks(TOPIC_COUNTS) - ax_tp.legend(loc="best", fontsize=8) + ax_tp.set_yticks([0, 10, 20, 30, 40, 50]) + ax_tp.set_ylim(0, 57) + ax_tp.grid(True, which="major", axis="y", linewidth=0.4, alpha=0.4) + ax_tp.legend(loc="center", bbox_to_anchor=(0.5, 0.36), fontsize=8) fig.tight_layout() save_figure(fig, output_dir, "fig14_strategy_comparison") diff --git a/publications/comnet/experiments/analysis/figures/fig_hol_excess.py b/publications/comnet/experiments/analysis/figures/fig_hol_excess.py new file mode 100644 index 00000000..8a0e6be7 --- /dev/null +++ b/publications/comnet/experiments/analysis/figures/fig_hol_excess.py @@ -0,0 +1,85 @@ +import json +import sys +from pathlib import Path + +import matplotlib.pyplot as plt + +sys.path.insert(0, str(Path(__file__).parent)) +from style import ( + TRANSPORT_COLORS, + TRANSPORT_LABELS, + TRANSPORT_MARKERS, + TRANSPORT_ORDER, + apply_style, + save_figure, +) + +TOPICS = [2, 4, 8, 16, 32] +RATES = [125, 250, 500, 1000, 2000] + + +def main(decomp_path: Path, output_dir: Path): + apply_style() + with open(decomp_path) as f: + d = json.load(f)["1"] + + fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(5, 6.4)) + + for tr in TRANSPORT_ORDER: + cells = d["topics"].get(tr, {}) + xs, ys, es = [], [], [] + for t in TOPICS: + c = cells.get(str(t)) + if c: + xs.append(t) + ys.append(c["excess"][0]) + es.append(c["excess"][1]) + ax1.errorbar( + range(len(xs)), ys, yerr=es, + fmt=TRANSPORT_MARKERS[tr] + "-", color=TRANSPORT_COLORS[tr], + label=TRANSPORT_LABELS[tr], markersize=7, capsize=3, linewidth=1.5, + markeredgecolor="white", markeredgewidth=0.7, zorder=3, + ) + ax1.set_xlabel("Topics (streams)") + ax1.set_ylabel("Excess co-occurrence (real coupling)") + ax1.set_xticks(range(len(TOPICS))) + ax1.set_xticklabels([str(t) for t in TOPICS]) + ax1.set_ylim(0, 1.0) + ax1.text(0.03, 0.06, "more isolated", transform=ax1.transAxes, fontsize=8, style="italic", color="0.4") + ax1.legend(loc="lower right", framealpha=0.9, fontsize=8) + ax1.set_title("(a) Isolation vs. topic count (rate 500)", fontsize=9) + + for tr in TRANSPORT_ORDER: + cells = d["rate"].get(tr, {}) + xs, ys, es = [], [], [] + for r in RATES: + c = cells.get(str(r)) + if c: + xs.append(r) + ys.append(c["null"][0]) + es.append(c["null"][1]) + ax2.errorbar( + range(len(xs)), ys, yerr=es, + fmt=TRANSPORT_MARKERS[tr] + "-", color=TRANSPORT_COLORS[tr], + label=TRANSPORT_LABELS[tr], markersize=7, capsize=3, linewidth=1.5, + markeredgecolor="white", markeredgewidth=0.7, zorder=3, + ) + ax2.set_xlabel("Offered rate (msg/s, 8 topics)") + ax2.set_ylabel("Null co-occurrence (density artifact)") + ax2.set_xticks(range(len(RATES))) + ax2.set_xticklabels([str(r) for r in RATES]) + ax2.set_ylim(0, 0.6) + ax2.set_title("(b) Density confound vs. rate", fontsize=9) + + fig.tight_layout() + save_figure(fig, output_dir, "fig_hol_excess") + + +if __name__ == "__main__": + script_dir = Path(__file__).resolve().parent + default_decomp = script_dir.parent.parent / "results-v5" / "02c_topic_rate_sweep" / "decomposition.json" + default_output = script_dir / "output" + decomp = Path(sys.argv[1]) if len(sys.argv) > 1 else default_decomp + output_dir = Path(sys.argv[2]) if len(sys.argv) > 2 else default_output + output_dir.mkdir(parents=True, exist_ok=True) + main(decomp, output_dir) diff --git a/publications/comnet/experiments/analysis/figures/fig_hol_tail_vs_loss.py b/publications/comnet/experiments/analysis/figures/fig_hol_tail_vs_loss.py new file mode 100644 index 00000000..16b317af --- /dev/null +++ b/publications/comnet/experiments/analysis/figures/fig_hol_tail_vs_loss.py @@ -0,0 +1,67 @@ +import glob +import json +import sys +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np + +sys.path.insert(0, str(Path(__file__).parent)) +from style import ( + TRANSPORT_COLORS, + TRANSPORT_LABELS, + TRANSPORT_MARKERS, + TRANSPORT_ORDER, + apply_style, + save_figure, +) + +LOSSES = [0, 1, 2, 5] +BASE = Path(__file__).resolve().parent.parent.parent / "results-v5" / "02_hol_blocking" + + +def run_avgp99(transport, loss): + vals = [] + for f in glob.glob(str(BASE / f"{transport}_loss{loss}pct_run*.json")): + tp = json.load(open(f))["results"].get("topics", []) + p = [x.get("p99_us", 0) / 1000 for x in tp if x.get("p99_us")] + if p: + vals.append(sum(p) / len(p)) + return vals + + +def main(output_dir: Path): + apply_style() + fig, ax = plt.subplots(figsize=(7, 4.3)) + x = range(len(LOSSES)) + for tr in TRANSPORT_ORDER: + med, lo, hi = [], [], [] + for loss in LOSSES: + v = run_avgp99(tr, loss) + if v: + med.append(float(np.median(v))) + lo.append(float(np.percentile(v, 10))) + hi.append(float(np.percentile(v, 90))) + else: + med.append(np.nan) + lo.append(np.nan) + hi.append(np.nan) + ax.plot(x, med, TRANSPORT_MARKERS[tr] + "-", color=TRANSPORT_COLORS[tr], + label=TRANSPORT_LABELS[tr], markersize=7, linewidth=1.6, + markeredgecolor="white", markeredgewidth=0.7, zorder=3) + ax.fill_between(x, lo, hi, color=TRANSPORT_COLORS[tr], alpha=0.13, zorder=1) + + ax.set_xlabel("Packet loss rate") + ax.set_ylabel("Mean per-topic p99 latency (ms)") + ax.set_xticks(list(x)) + ax.set_xticklabels([f"{l}%" for l in LOSSES]) + ax.set_ylim(bottom=0) + ax.legend(loc="upper left", framealpha=0.9) + fig.tight_layout() + save_figure(fig, output_dir, "fig_hol_tail_vs_loss") + + +if __name__ == "__main__": + out = Path(sys.argv[1]) if len(sys.argv) > 1 else Path(__file__).resolve().parent / "output" + out.mkdir(parents=True, exist_ok=True) + main(out) diff --git a/publications/comnet/experiments/analysis/figures/fig_hol_taillatency.py b/publications/comnet/experiments/analysis/figures/fig_hol_taillatency.py new file mode 100644 index 00000000..00338c1e --- /dev/null +++ b/publications/comnet/experiments/analysis/figures/fig_hol_taillatency.py @@ -0,0 +1,78 @@ +import glob +import json +import statistics +import sys +from pathlib import Path + +import matplotlib.pyplot as plt + +sys.path.insert(0, str(Path(__file__).parent)) +from style import ( + TRANSPORT_COLORS, + TRANSPORT_LABELS, + TRANSPORT_MARKERS, + TRANSPORT_ORDER, + apply_style, + save_figure, +) + +TOPICS = [2, 4, 8, 16, 32] +LOSS = 5 +RESULTS = Path(__file__).resolve().parent.parent.parent / "results-v5" + + +def cell_files(transport, topics): + if topics == 8: + return glob.glob(str(RESULTS / "02_hol_blocking" / f"{transport}_loss{LOSS}pct_run*.json")) + return glob.glob(str(RESULTS / "02c_topic_rate_sweep" / f"{transport}_t{topics}_r500_loss{LOSS}pct_run*.json")) + + +def worst_best(transport, topics): + worst, best = [], [] + for f in cell_files(transport, topics): + tp = json.load(open(f))["results"].get("topics", []) + p99 = [x.get("p99_us", 0) / 1000 for x in tp if x.get("p99_us")] + if p99: + worst.append(max(p99)) + best.append(min(p99)) + if not worst: + return None + return statistics.median(worst), statistics.median(best) + + +def main(output_dir: Path): + apply_style() + fig, ax = plt.subplots(figsize=(7, 4.3)) + x = range(len(TOPICS)) + for tr in TRANSPORT_ORDER: + w, b = [], [] + for t in TOPICS: + r = worst_best(tr, t) + w.append(r[0] if r else None) + b.append(r[1] if r else None) + ax.plot( + x, w, TRANSPORT_MARKERS[tr] + "-", color=TRANSPORT_COLORS[tr], + label=TRANSPORT_LABELS[tr], markersize=7, linewidth=1.6, + markeredgecolor="white", markeredgewidth=0.7, zorder=3, + ) + if tr == "quic-pertopic": + ax.plot(x, b, TRANSPORT_MARKERS[tr] + "--", color=TRANSPORT_COLORS[tr], + markersize=6, linewidth=1.2, alpha=0.7, zorder=3) + ax.fill_between(x, b, w, color=TRANSPORT_COLORS[tr], alpha=0.12, zorder=1) + + ax.set_xlabel("Topics") + ax.set_ylabel("Per-topic p99 latency (ms)") + ax.set_xticks(list(x)) + ax.set_xticklabels([str(t) for t in TOPICS]) + ax.set_ylim(bottom=0) + ax.legend(loc="center left", framealpha=0.9) + ax.text(0.98, 0.05, "solid: worst topic | dashed: best (per-topic)", + transform=ax.transAxes, fontsize=7.5, style="italic", color="0.4", ha="right") + fig.tight_layout() + save_figure(fig, output_dir, "fig_hol_taillatency") + + +if __name__ == "__main__": + out = Path(sys.argv[1]) if len(sys.argv) > 1 else Path(__file__).resolve().parent / "output" + out.mkdir(parents=True, exist_ok=True) + main(out) diff --git a/publications/comnet/experiments/analysis/figures/fig_transport_limits.py b/publications/comnet/experiments/analysis/figures/fig_transport_limits.py new file mode 100644 index 00000000..d435759e --- /dev/null +++ b/publications/comnet/experiments/analysis/figures/fig_transport_limits.py @@ -0,0 +1,217 @@ +import csv +import glob +import json +import statistics +import sys +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +from scipy import stats as st + +sys.path.insert(0, str(Path(__file__).parent)) +from style import STRATEGY_COLORS, STRATEGY_LABELS, STRATEGY_MARKERS, apply_style, save_figure + +TOPIC_COUNTS = [1, 2, 4, 8, 16] +STREAM_LIMITS = [25, 100, 250, 1000] +STREAM_WINDOWS = [131_072, 262_144, 1_048_576] +BYTES_PER_MESSAGE = 312.8 + + +def publish_rates(base, label): + rates = [] + for path in glob.glob(str(base / f"{label}_run*_pub.json")): + try: + results = json.load(open(path))["results"] + except (json.JSONDecodeError, KeyError, OSError): + continue + if results.get("elapsed_secs") and results.get("published"): + rates.append(results["published"] / results["elapsed_secs"]) + return rates + + +def mean_ci(values): + if not values: + return None, None + mean = statistics.mean(values) + if len(values) < 2: + return mean, 0.0 + return mean, st.t.ppf(0.975, len(values) - 1) * st.sem(values) + + +def median_rtt(base, label): + samples = [] + for path in glob.glob(str(base / f"{label}_run*_broker_quic_*.csv")): + rows = list(csv.DictReader(open(path))) + if rows: + samples.append(statistics.median([int(r["rtt_us"]) for r in rows if r.get("rtt_us")])) + return statistics.median(samples) / 1e6 if samples else None + + +def series(base, labels): + means, errs = [], [] + for label in labels: + mean, err = mean_ci(publish_rates(base, label)) + means.append(np.nan if mean is None else mean / 1000.0) + errs.append(0.0 if err is None else err / 1000.0) + return means, errs + + +def topic_sweep(base, output_dir): + fig, ax = plt.subplots(1, 1, figsize=(4.5, 3.2)) + for strategy in ["control-only", "per-topic", "per-publish"]: + labels = [f"{strategy}_t{t}_sdef_wdef_d25_l2_tput" for t in TOPIC_COUNTS] + means, errs = series(base, labels) + ax.errorbar( + TOPIC_COUNTS, means, yerr=errs, + marker=STRATEGY_MARKERS[strategy], color=STRATEGY_COLORS[strategy], + label=STRATEGY_LABELS[strategy], linewidth=2, markersize=8, capsize=3, + ) + ax.set_xscale("log", base=2) + ax.set_xticks(TOPIC_COUNTS) + ax.set_xticklabels([str(t) for t in TOPIC_COUNTS]) + ax.set_xlabel("Topics on the connection") + ax.set_ylabel("Publish rate (K msg/s)") + ax.set_ylim(0, 62) + ax.set_yticks([0, 10, 20, 30, 40, 50, 60]) + ax.grid(True, axis="y", linewidth=0.4, alpha=0.4) + ax.legend(loc="center", bbox_to_anchor=(0.5, 0.30), fontsize=8) + fig.tight_layout() + save_figure(fig, output_dir, "fig_topic_sweep") + + +def limit_sweep(base, output_dir): + fig, (ax_credit, ax_window) = plt.subplots(2, 1, figsize=(4.5, 5.6)) + + labels = [f"per-publish_t8_s{limit}_wdef_d25_l2_tput" for limit in STREAM_LIMITS] + means, errs = series(base, labels) + rtt = median_rtt(base, labels[1]) or 0.0252 + model = [limit / rtt / 1000.0 for limit in STREAM_LIMITS] + ax_credit.plot(STREAM_LIMITS, model, linestyle="--", color="0.45", linewidth=1.5, + label="credit $\\div$ RTT") + ax_credit.errorbar(STREAM_LIMITS, means, yerr=errs, marker=STRATEGY_MARKERS["per-publish"], + color=STRATEGY_COLORS["per-publish"], linewidth=2, markersize=8, capsize=3, + label=STRATEGY_LABELS["per-publish"]) + for strategy in ["control-only", "per-topic"]: + flat, flat_errs = series(base, [f"{strategy}_t8_s{limit}_wdef_d25_l2_tput" for limit in [100, 1000]]) + ax_credit.errorbar([100, 1000], flat, yerr=flat_errs, marker=STRATEGY_MARKERS[strategy], + color=STRATEGY_COLORS[strategy], linewidth=2, markersize=8, capsize=3, + label=STRATEGY_LABELS[strategy]) + ax_credit.set_xscale("log") + ax_credit.set_yscale("log") + ax_credit.set_xticks(STREAM_LIMITS) + ax_credit.set_xticklabels([str(limit) for limit in STREAM_LIMITS]) + ax_credit.set_yticks([1, 3, 10, 30, 60]) + ax_credit.set_yticklabels(["1", "3", "10", "30", "60"]) + ax_credit.set_xlabel("(a) Concurrent stream limit") + ax_credit.set_ylabel("Publish rate (K msg/s)") + ax_credit.grid(True, axis="y", linewidth=0.4, alpha=0.4) + ax_credit.legend(loc="lower right", fontsize=7) + + window_series = [ + ("control-only", 8, STRATEGY_COLORS["control-only"], STRATEGY_MARKERS["control-only"], "-", "Control-only"), + ("per-topic", 1, STRATEGY_COLORS["per-topic"], STRATEGY_MARKERS["per-topic"], "--", "Per-topic, 1 topic"), + ("per-topic", 8, STRATEGY_COLORS["per-topic"], "o", "-", "Per-topic, 8 topics"), + ] + x_kb = [w / 1024 for w in STREAM_WINDOWS] + model_w = [w / rtt / BYTES_PER_MESSAGE / 1000.0 for w in STREAM_WINDOWS] + ax_window.plot(x_kb, model_w, linestyle=":", color="0.45", linewidth=1.5, + label="window $\\div$ RTT") + for strategy, topics, color, marker, linestyle, label in window_series: + labels = [f"{strategy}_t{topics}_sdef_w{w}_d25_l2_tput" for w in STREAM_WINDOWS] + means, errs = series(base, labels) + ax_window.errorbar(x_kb, means, yerr=errs, marker=marker, color=color, linestyle=linestyle, + linewidth=2, markersize=8, capsize=3, label=label) + ax_window.set_xscale("log", base=2) + ax_window.set_xticks(x_kb) + ax_window.set_xticklabels(["128", "256", "1024"]) + ax_window.set_ylim(0, 92) + ax_window.set_yticks([0, 20, 40, 60, 80]) + ax_window.set_xlabel("(b) Per-stream receive window (KB)") + ax_window.set_ylabel("Publish rate (K msg/s)") + ax_window.grid(True, axis="y", linewidth=0.4, alpha=0.4) + ax_window.legend(loc="upper left", fontsize=7) + + fig.tight_layout() + save_figure(fig, output_dir, "fig_transport_limits") + + +import re + +RATE_CEILING = 54_000.0 +DEFAULT_WINDOW = 262_144 +DEFAULT_STREAM_LIMIT = 100 + +CELL_PATTERN = re.compile( + r"(?P[a-z-]+)_t(?P\d+)_s(?Pdef|\d+)" + r"_w(?Pdef|\d+)_d(?P\d+)_l(?P\d+)_tput" +) + + +def predicted_rate(strategy, topics, stream_limit, window, rtt): + if strategy == "per-publish": + return min(stream_limit / rtt, RATE_CEILING) + streams = 1 if strategy == "control-only" else topics + return min(streams * window / rtt / BYTES_PER_MESSAGE, RATE_CEILING) + + +def model_collapse(base, output_dir): + points = {} + for pub in glob.glob(str(base / "*_tput_run1_pub.json")): + label = Path(pub).name.replace("_run1_pub.json", "") + match = CELL_PATTERN.match(label) + if not match: + continue + cell = match.groupdict() + rates = publish_rates(base, label) + rtt = median_rtt(base, label) + if not rates or not rtt: + continue + window = DEFAULT_WINDOW if cell["window"] == "def" else int(cell["window"]) + limit = DEFAULT_STREAM_LIMIT if cell["streams"] == "def" else int(cell["streams"]) + predicted = predicted_rate(cell["strategy"], int(cell["topics"]), limit, window, rtt) + points.setdefault(cell["strategy"], []).append((predicted / 1000.0, statistics.mean(rates) / 1000.0)) + + fig, ax = plt.subplots(1, 1, figsize=(4.5, 3.6)) + diagonal = np.array([0.7, 80.0]) + ax.fill_between(diagonal, diagonal * 0.9, diagonal * 1.1, color="0.85", zorder=0, + label="$\\pm$10%") + ax.plot(diagonal, diagonal, color="0.35", linewidth=1.2, zorder=1) + for strategy in ["control-only", "per-topic", "per-publish"]: + if strategy not in points: + continue + xs, ys = zip(*points[strategy]) + ax.scatter(xs, ys, s=46, marker=STRATEGY_MARKERS[strategy], color=STRATEGY_COLORS[strategy], + edgecolor="white", linewidth=0.6, zorder=3, label=STRATEGY_LABELS[strategy]) + ax.set_xscale("log") + ax.set_yscale("log") + ax.set_xlim(0.7, 80) + ax.set_ylim(0.7, 80) + ticks = [1, 3, 10, 30, 60] + ax.set_xticks(ticks); ax.set_xticklabels([str(t) for t in ticks]) + ax.set_yticks(ticks); ax.set_yticklabels([str(t) for t in ticks]) + ax.set_xlabel("Rate predicted by the binding limit (K msg/s)") + ax.set_ylabel("Measured rate (K msg/s)") + ax.grid(True, linewidth=0.4, alpha=0.4) + ax.legend(loc="upper left", fontsize=8) + fig.tight_layout() + save_figure(fig, output_dir, "fig_model_collapse") + + +def main(results_dir, output_dir): + apply_style() + base = Path(results_dir) / "04_transport_limits" + if not base.exists(): + print(f" WARNING: {base} not found") + return + topic_sweep(base, output_dir) + limit_sweep(base, output_dir) + model_collapse(base, output_dir) + + +if __name__ == "__main__": + script_dir = Path(__file__).resolve().parent + results = Path(sys.argv[1]) if len(sys.argv) > 1 else script_dir.parent.parent / "results-v5" + output = Path(sys.argv[2]) if len(sys.argv) > 2 else script_dir / "output" + output.mkdir(parents=True, exist_ok=True) + main(results, output) diff --git a/publications/comnet/experiments/analysis/figures/style.py b/publications/comnet/experiments/analysis/figures/style.py index 64a04bef..963d7c7d 100644 --- a/publications/comnet/experiments/analysis/figures/style.py +++ b/publications/comnet/experiments/analysis/figures/style.py @@ -4,10 +4,10 @@ import matplotlib.pyplot as plt TRANSPORT_COLORS = { - "tcp": "#1f77b4", - "quic-control": "#ff7f0e", - "quic-pertopic": "#2ca02c", - "quic-perpub": "#d62728", + "tcp": "#0072B2", + "quic-control": "#E69F00", + "quic-pertopic": "#009E73", + "quic-perpub": "#D55E00", } TRANSPORT_LABELS = { @@ -27,37 +27,40 @@ TRANSPORT_ORDER = ["tcp", "quic-control", "quic-pertopic", "quic-perpub"] CONN_TRANSPORT_ORDER = ["tcp", "tls", "quic"] -CONN_TRANSPORT_COLORS = {"tcp": "#1f77b4", "tls": "#9467bd", "quic": "#2ca02c"} -CONN_TRANSPORT_LABELS = {"tcp": "TCP", "tls": "TLS 1.3", "quic": "QUIC"} +CONN_TRANSPORT_COLORS = {"tcp": "#0072B2", "tls": "#762A83", "quic": "#009E73"} +CONN_TRANSPORT_LABELS = {"tcp": "TCP", "tls": "TCP+TLS 1.3", "quic": "QUIC"} CONN_TRANSPORT_MARKERS = {"tcp": "o", "tls": "P", "quic": "^"} -THROUGHPUT_ORDER = ["tcp", "quic-control-only", "quic-per-topic", "quic-per-publish"] +THROUGHPUT_ORDER = ["tcp", "tls", "quic-control-only", "quic-per-topic", "quic-per-publish"] THROUGHPUT_COLORS = { - "tcp": "#1f77b4", - "quic-control-only": "#ff7f0e", - "quic-per-topic": "#2ca02c", - "quic-per-publish": "#d62728", + "tcp": "#0072B2", + "tls": "#762A83", + "quic-control-only": "#E69F00", + "quic-per-topic": "#009E73", + "quic-per-publish": "#D55E00", } THROUGHPUT_LABELS = { "tcp": "TCP", + "tls": "TCP+TLS 1.3", "quic-control-only": "QUIC control", "quic-per-topic": "QUIC per-topic", "quic-per-publish": "QUIC per-publish", } THROUGHPUT_MARKERS = { "tcp": "o", + "tls": "v", "quic-control-only": "s", "quic-per-topic": "^", "quic-per-publish": "D", } DATAGRAM_ORDER = ["quic-stream", "quic-datagram"] -DATAGRAM_COLORS = {"quic-stream": "#2ca02c", "quic-datagram": "#e377c2"} +DATAGRAM_COLORS = {"quic-stream": "#009E73", "quic-datagram": "#CC79A7"} DATAGRAM_LABELS = {"quic-stream": "QUIC Stream", "quic-datagram": "QUIC Datagram"} DATAGRAM_MARKERS = {"quic-stream": "^", "quic-datagram": "X"} STRATEGY_ORDER = ["control-only", "per-publish", "per-topic"] -STRATEGY_COLORS = {"control-only": "#ff7f0e", "per-publish": "#d62728", "per-topic": "#2ca02c"} +STRATEGY_COLORS = {"control-only": "#E69F00", "per-publish": "#D55E00", "per-topic": "#009E73"} STRATEGY_LABELS = {"control-only": "Control-only", "per-publish": "Per-publish", "per-topic": "Per-topic"} STRATEGY_MARKERS = {"control-only": "s", "per-publish": "D", "per-topic": "^"} diff --git a/publications/comnet/experiments/analysis/hol_excess_decomposition.py b/publications/comnet/experiments/analysis/hol_excess_decomposition.py new file mode 100644 index 00000000..d4670979 --- /dev/null +++ b/publications/comnet/experiments/analysis/hol_excess_decomposition.py @@ -0,0 +1,210 @@ +import csv +import glob +import math +import random +from pathlib import Path +from typing import NamedTuple + +import numpy as np +from scipy import stats + + +class Decomp(NamedTuple): + n: int + obs: tuple[float, float] + null: tuple[float, float] + excess: tuple[float, float] + +SW = 50 +TH = 2.0 +COW = 10_000_000 +N_SHIFTS = 100 +NETEM_ONE_WAY_DELAY_US = 25_000 + +D02 = Path("results-v5/02_hol_blocking") +DSW = Path("results-v5/02c_topic_rate_sweep") + + +def load_topics(path, nt): + cols = [[] for _ in range(nt)] + with open(path) as f: + for row in csv.DictReader(f): + ti = int(row["topic_idx"]) + if 0 <= ti < nt: + cols[ti].append((int(row["receive_ns"]), float(row["latency_us"]))) + out = [] + for d in cols: + d.sort(key=lambda x: x[0]) + recv = np.array([r for r, _ in d], dtype=np.int64) + lat = np.array([l for _, l in d], dtype=np.float64) + out.append((recv, lat)) + return out + + +def spikes_of(topic_arrays): + per_topic = [] + for recv, lat in topic_arrays: + L = len(lat) + if L <= SW: + per_topic.append(np.empty(0, dtype=np.int64)) + continue + W = np.lib.stride_tricks.sliding_window_view(lat, SW) + med = np.partition(W, SW // 2, axis=1)[:, SW // 2] + idx = np.arange(SW, L) + m = med[idx - SW] + mask = (m > 0) & (lat[idx] > TH * m) + per_topic.append(recv[idx][mask]) + return per_topic + + +def co_ratio(times, topics): + n = len(times) + if n == 0: + return 0.0 + co = 0 + j0 = 0 + for i in range(n): + ti = times[i] + while times[j0] < ti - COW: + j0 += 1 + j = j0 + found = False + while j < n and times[j] <= ti + COW: + if j != i and topics[j] != topics[i]: + found = True + break + j += 1 + if found: + co += 1 + return co / n + + +def flatten(per_topic): + times = [] + topics = [] + for ti, arr in enumerate(per_topic): + for v in arr: + times.append(v) + topics.append(ti) + order = np.argsort(times, kind="stable") + return np.array(times)[order], np.array(topics)[order] + + +def observed(per_topic): + t, tp = flatten(per_topic) + return co_ratio(t, tp) + + +def null_ratio(per_topic, rng): + allt = [v for arr in per_topic for v in arr] + if not allt: + return 0.0 + lo, hi = min(allt), max(allt) + span = max(hi - lo, 1) + vals = [] + for _ in range(N_SHIFTS): + pt = [((arr - lo + rng.randrange(span)) % span).astype(np.int64) for arr in per_topic] + t, tp = flatten(pt) + vals.append(co_ratio(t, tp)) + return sum(vals) / len(vals) + + +def ci(vals): + n = len(vals) + if n < 2: + return (vals[0] if vals else 0.0), 0.0 + m = sum(vals) / n + sd = math.sqrt(sum((x - m) ** 2 for x in vals) / (n - 1)) + return m, float(stats.t.ppf(0.975, n - 1)) * sd / math.sqrt(n) + + +def cell_files(key, topics, rate, loss): + if topics == 8 and rate == 500: + return sorted(glob.glob(str(D02 / f"{key}_loss{loss}pct_run*_messages.csv"))) + return sorted(glob.glob(str(DSW / f"{key}_t{topics}_r{rate}_loss{loss}pct_run*_messages.csv"))) + + +def emulation_applied(topic_arrays): + latencies = np.concatenate([lat for _, lat in topic_arrays if len(lat)]) + return len(latencies) > 0 and float(np.median(latencies)) >= NETEM_ONE_WAY_DELAY_US + + +def decompose(key, topics, rate, loss): + files = cell_files(key, topics, rate, loss) + if not files: + return None + rng = random.Random(42) + obs, nul, exc = [], [], [] + kept = 0 + for fp in files: + pt = load_topics(fp, topics) + if not emulation_applied(pt): + print(f" excluded (median latency below the emulated delay, netem not applied): {fp}") + continue + kept += 1 + sp = spikes_of(pt) + o = observed(sp) + nv = null_ratio(sp, rng) + obs.append(o) + nul.append(nv) + exc.append(o - nv) + if kept == 0: + return None + return Decomp(n=kept, obs=ci(obs), null=ci(nul), excess=ci(exc)) + + +def main(): + import json + + transports = ["tcp", "quic-control", "quic-pertopic", "quic-perpub"] + dump: dict = {} + for loss in (1, 5): + dump[loss] = {"topics": {}, "rate": {}} + for key in transports: + dump[loss]["topics"][key] = {} + for t in (2, 4, 8, 16, 32): + r = decompose(key, t, 500, loss) + if r: + dump[loss]["topics"][key][t] = r._asdict() + dump[loss]["rate"][key] = {} + for rate in (125, 250, 500, 1000, 2000): + r = decompose(key, 8, rate, loss) + if r: + dump[loss]["rate"][key][rate] = r._asdict() + out = DSW / "decomposition.json" + with open(out, "w") as f: + json.dump(dump, f, indent=1) + print(f"wrote {out}") + + for loss in (1, 5): + print(f"\n########## LOSS {loss}% ##########") + print("=== AXIS 1: topics @ rate 500 [obs / null / excess (mean±95%CI over runs)] ===") + for key in transports: + print(f" {key}") + for t in (2, 4, 8, 16, 32): + r = decompose(key, t, 500, loss) + if not r: + print(f" t={t:2d}: (missing)") + continue + print( + f" t={t:2d} n={r.n:2d}: obs={r.obs[0]:.3f}±{r.obs[1]:.3f}" + f" null={r.null[0]:.3f}±{r.null[1]:.3f}" + f" excess={r.excess[0]:+.3f}±{r.excess[1]:.3f}" + ) + print("=== AXIS 2: rate @ 8 topics ===") + for key in transports: + print(f" {key}") + for rate in (125, 250, 500, 1000, 2000): + r = decompose(key, 8, rate, loss) + if not r: + print(f" r={rate:4d}: (missing)") + continue + print( + f" r={rate:4d} n={r.n:2d}: obs={r.obs[0]:.3f}±{r.obs[1]:.3f}" + f" null={r.null[0]:.3f}±{r.null[1]:.3f}" + f" excess={r.excess[0]:+.3f}±{r.excess[1]:.3f}" + ) + + +if __name__ == "__main__": + main() diff --git a/publications/comnet/experiments/analysis/offload_ablation.py b/publications/comnet/experiments/analysis/offload_ablation.py new file mode 100644 index 00000000..97cbc5c0 --- /dev/null +++ b/publications/comnet/experiments/analysis/offload_ablation.py @@ -0,0 +1,124 @@ +import csv +import glob +import json +import re +import statistics +import sys +from pathlib import Path + +ARMS = {"tls": "TCP+TLS 1.3", "quic-control": "QUIC control-only"} +LOSSES = [0, 1, 2, 5, 10] +OFFLOAD = ["on", "off"] + + +def rates(base, arm, offload, loss): + out = [] + for g in (1, 2, 3): + pat = base / f"03c_offload_ablation_g{g}" / f"{arm}_offload-{offload}_loss{loss}pct_run*.json" + for f in glob.glob(str(pat)): + if f.endswith("_pub.json"): + continue + try: + r = json.load(open(f))["results"] + except (json.JSONDecodeError, KeyError, OSError): + continue + if r.get("throughput_avg"): + out.append(r["throughput_avg"]) + return out + + +def broker_cpu(base, arm, offload, loss): + vals = [] + for g in (1, 2, 3): + pat = base / f"03c_offload_ablation_g{g}" / f"{arm}_offload-{offload}_loss{loss}pct_run*_broker_resources.csv" + for f in glob.glob(str(pat)): + rows = list(csv.DictReader(open(f))) + v = [float(r["cpu_percent"]) for r in rows if r.get("cpu_percent")] + if v: + vals.append(statistics.median(v)) + return statistics.median(vals) if vals else None + + +def qdisc_bpp(base, arm, offload, loss): + ratios = [] + for g in (1, 2, 3): + d = base / f"03c_offload_ablation_g{g}" + for after in glob.glob(str(d / f"{arm}_offload-{offload}_loss{loss}pct_run*_qdisc_after.txt")): + before = after.replace("_after.txt", "_before.txt") + try: + b = _sent(open(before).read()) + a = _sent(open(after).read()) + except OSError: + continue + if a and b and a[1] > b[1]: + dbytes, dpkts = a[0] - b[0], a[1] - b[1] + if dpkts > 0: + ratios.append(dbytes / dpkts) + return statistics.median(ratios) if ratios else None + + +def _sent(text): + m = re.search(r"Sent (\d+) bytes (\d+) pkt", text) + return (int(m.group(1)), int(m.group(2))) if m else None + + +def main(results_dir): + base = Path(results_dir) + print("Delivered throughput (K msg/s aggregate), n runs pooled over 3 groups\n") + header = f"{'arm':20s} {'offload':>7s} " + " ".join(f"{'loss' + str(l):>13s}" for l in LOSSES) + print(header) + table = {} + for arm in ARMS: + for off in OFFLOAD: + cells = [] + for loss in LOSSES: + r = rates(base, arm, off, loss) + table[(arm, off, loss)] = r + cells.append(f"{statistics.mean(r) / 1000:7.1f}(n={len(r)})" if r else f"{'-':>13s}") + print(f"{ARMS[arm]:20s} {off:>7s} " + " ".join(f"{c:>13s}" for c in cells)) + + print("\nFold-degradation ratio rate(0%) / rate(10%)") + folds = {} + for arm in ARMS: + for off in OFFLOAD: + r0, r10 = table[(arm, off, 0)], table[(arm, off, 10)] + if r0 and r10: + fold = statistics.mean(r0) / statistics.mean(r10) + folds[(arm, off)] = fold + print(f" {ARMS[arm]:20s} offload {off:3s}: {fold:6.1f}x") + + print("\nDiscriminator G = fold(TCP+TLS) / fold(QUIC-control)") + for off in OFFLOAD: + if ("tls", off) in folds and ("quic-control", off) in folds: + g = folds[("tls", off)] / folds[("quic-control", off)] + print(f" offload {off:3s}: G = {g:5.2f}") + if all(("tls", o) in folds and ("quic-control", o) in folds for o in OFFLOAD): + g_on = folds[("tls", "on")] / folds[("quic-control", "on")] + g_off = folds[("tls", "off")] / folds[("quic-control", "off")] + print(f"\n G(on)={g_on:.2f} G(off)={g_off:.2f}") + print(" G(off)~=G(on) and >~2 => QUIC advantage is a real transport property (artifact refuted)") + print(" G(off)->1 => advantage was a segmentation-offload artifact (confirmed)") + + print("\nOffload sanity: median bytes-per-packet through the broker netem qdisc (want OFF ~= MTU 1500)") + for arm in ARMS: + for off in OFFLOAD: + row = [] + for loss in LOSSES: + bpp = qdisc_bpp(base, arm, off, loss) + row.append(f"{bpp:6.0f}" if bpp else f"{'-':>6s}") + print(f" {ARMS[arm]:20s} {off:>3s}: " + " ".join(row)) + + print("\nBroker CPU (median % of 400); flag > 320 (80% of 4 cores) => CPU-bound, fold suspect") + for arm in ARMS: + for off in OFFLOAD: + row = [] + for loss in LOSSES: + c = broker_cpu(base, arm, off, loss) + mark = "*" if c and c > 320 else " " + row.append(f"{c:5.0f}{mark}" if c else f"{'-':>6s}") + print(f" {ARMS[arm]:20s} {off:>3s}: " + " ".join(row)) + + +if __name__ == "__main__": + default = Path(__file__).resolve().parent.parent / "results-v5" + main(sys.argv[1] if len(sys.argv) > 1 else default) diff --git a/publications/comnet/experiments/analysis/paced_offered_load.py b/publications/comnet/experiments/analysis/paced_offered_load.py new file mode 100644 index 00000000..638aadd2 --- /dev/null +++ b/publications/comnet/experiments/analysis/paced_offered_load.py @@ -0,0 +1,135 @@ +import csv +import json +import statistics +import sys +from pathlib import Path + +CONFIGS = ["tcp", "tls", "quic-main"] +RATES = [2500, 20000, 0] +LOSSES = [1, 10] +FANOUT = 8 +PACING_TOLERANCE = 0.02 +SUB_SATURATION_PREFIX = "P3: sub busy" + + +def load_json(path): + try: + return json.load(open(path)) + except (OSError, json.JSONDecodeError): + return None + + +def active_cpu(path): + try: + values = [float(row["cpu_percent"]) for row in csv.DictReader(open(path)) if row.get("cpu_percent")] + except (OSError, ValueError): + return None + if not values: + return None + return statistics.mean(value for value in values if value >= 0.5 * max(values)) + + +def acceptance(directory): + path = directory / "acceptance.csv" + if not path.exists(): + raise SystemExit(f"{path} missing: run single_segment_accept.py {directory} first") + return {row["label"]: row for row in csv.DictReader(open(path))} + + +def collect(base): + cells = {} + excluded = [] + for directory in sorted(base.glob("03g_paced_g*")): + accepted = acceptance(directory) + for row in {row["label"]: row for row in csv.DictReader(open(directory / "manifest.csv"))}.values(): + label = row["label"] + gate = accepted.get(label) + if gate is None: + excluded.append((label, "not evaluated by acceptance")) + continue + reasons = [reason for reason in gate["failures"].split("; ") if reason] + if any(not reason.startswith(SUB_SATURATION_PREFIX) for reason in reasons): + excluded.append((label, gate["failures"])) + continue + pub = load_json(directory / f"{label}_pub.json") + sub = load_json(directory / f"{label}.json") + if not pub or not sub: + excluded.append((label, "missing results")) + continue + target = int(row["rate"]) + configured = int(pub.get("config", {}).get("rate", 0) or 0) + offered = pub["results"].get("offered_rate") or 0.0 + if configured != target: + excluded.append((label, f"bench rate {configured} != planned {target}")) + continue + if target and abs(offered / target - 1) > PACING_TOLERANCE: + excluded.append((label, f"paced at {offered:.0f}/s, target {target}/s")) + continue + cells.setdefault((row["config"], int(row["loss"]), target), []).append({ + "group": directory.name[-2:], + "saturated": bool(reasons), + "offered": offered, + "unique": sub["results"]["throughput_avg"] / FANOUT, + "cpu": active_cpu(directory / f"{label}_broker_resources.csv"), + }) + return cells, excluded + + +def group_means(samples, field): + per_group = {} + for sample in samples: + if sample[field] is not None: + per_group.setdefault(sample["group"], []).append(sample[field]) + return {group: statistics.mean(values) for group, values in per_group.items()} + + +def describe(samples, field): + means = group_means(samples, field) + if not means: + return "-" + pooled = statistics.mean(s[field] for s in samples if s[field] is not None) + groups = " ".join(f"{g}:{v:.4g}" for g, v in sorted(means.items())) + return f"{pooled:.4g} ({groups})" + + +def ratio_by_group(cells, numerator, denominator): + left, right = group_means(cells.get(numerator, []), "unique"), group_means(cells.get(denominator, []), "unique") + shared = sorted(set(left) & set(right)) + return [(group, left[group] / right[group]) for group in shared] + + +def main(results_dir): + cells, excluded = collect(Path(results_dir)) + print(f"excluded runs: {len(excluded)}") + for label, reason in excluded: + print(f" {label}: {reason}") + for loss in LOSSES: + print(f"\n=== loss {loss}% (router arm). Values: pooled mean (per-group means)") + for config in CONFIGS: + print(f" {config}") + for rate in RATES: + samples = cells.get((config, loss, rate)) + if not samples: + continue + name = f"paced {rate}" if rate else "unpaced" + saturated = sum(s["saturated"] for s in samples) + tag = f" [{saturated} sub-saturated]" if saturated else "" + print(f" {name:12s} n={len(samples)}{tag}") + for field in ("offered", "unique", "cpu"): + print(f" {field:8s} {describe(samples, field)}") + paced = ratio_by_group(cells, (config, loss, 20000), (config, loss, 0)) + if paced: + values = [v for _, v in paced] + print(f" paced 20000 / unpaced delivered: {statistics.mean(values):.3f} (range {min(values):.3f}-{max(values):.3f}, {len(values)} groups)") + for rate in RATES: + for other in ("tls", "tcp"): + rows = ratio_by_group(cells, ("quic-main", loss, rate), (other, loss, rate)) + if rows: + values = [v for _, v in rows] + name = f"paced {rate}" if rate else "unpaced" + print(f" QUIC/{other} {name:12s} {statistics.mean(values):.3f} (range {min(values):.3f}-{max(values):.3f}, {len(values)} groups)") + + +if __name__ == "__main__": + default = Path(__file__).resolve().parent.parent / "results-v5" + main(sys.argv[1] if len(sys.argv) > 1 else default) diff --git a/publications/comnet/experiments/analysis/single_segment_accept.py b/publications/comnet/experiments/analysis/single_segment_accept.py new file mode 100644 index 00000000..2d916016 --- /dev/null +++ b/publications/comnet/experiments/analysis/single_segment_accept.py @@ -0,0 +1,464 @@ +import csv +import glob +import json +import math +import re +import statistics +import sys +from pathlib import Path + +WIRE_FRAME_MAX = 1474 +ACCOUNTING_TOLERANCE = 0.001 +Z_999 = 3.29 +NETEM_LIMIT = 100_000 +BACKLOG_CEILING = NETEM_LIMIT // 10 +ROUTER_CORE_P95_MAX = 60.0 +CLIENT_BUSY_P95_MAX = 95.0 +CLEAN_RETRANS_MAX = 0.0005 +CLEAN_RTO_MAX = 0.00001 +MAIN_CAMPAIGN_PREFIX = {"tcp": "tcp", "tls": "tls", "quic-main": "quic-control-only"} +MAIN_CAMPAIGN_GROUP = {"tcp": 2, "tls": 1, "quic-main": 2} +LIMITED_MODES = ("single", "legacy", "tbf") +LEGACY_REFERENCE_03C = {"tls": 0.0895, "quic-main": 0.0768} + + +def sections(path): + out = {} + current = None + try: + text = Path(path).read_text() + except OSError: + return out + for line in text.splitlines(): + match = re.match(r"^=== (.+) ===$", line) + if match: + current = match.group(1) + out[current] = [] + elif current: + out[current].append(line) + return out + + +def qdisc_counters(lines, handle): + for index, line in enumerate(lines): + if re.match(rf"^qdisc \S+ {re.escape(handle)} ", line): + block = " ".join(lines[index + 1:index + 4]) + sent = re.search(r"Sent (\d+) bytes (\d+) pkt \(dropped (\d+)", block) + backlog = re.search(r"backlog \S+ (\d+)p", block) + if sent: + return { + "bytes": int(sent.group(1)), "pkts": int(sent.group(2)), "dropped": int(sent.group(3)), + "backlog": int(backlog.group(1)) if backlog else 0, + } + return None + + +def table_value(lines, table, field): + rows = [line.split() for line in lines if line.startswith(f"{table}:")] + for header, values in zip(rows[0::2], rows[1::2]): + if field in header: + return int(values[header.index(field)]) + return None + + +def table_delta(before, after, section, table, field): + start = table_value(before.get(section, []), table, field) + end = table_value(after.get(section, []), table, field) + if start is None or end is None: + return None + return end - start + + +def dev_counters(lines, iface="ens4"): + for line in lines: + name, _, rest = line.partition(":") + if name.strip() == iface: + fields = rest.split() + return {"rx_pkts": int(fields[1]), "rx_drop": int(fields[3]), "tx_pkts": int(fields[9]), "tx_drop": int(fields[11])} + return None + + +def softnet_column(lines, column): + total = 0 + for line in lines: + fields = line.split() + if len(fields) > column: + total += int(fields[column], 16) + return total + + +def ethtool_drops(lines): + matched = [int(value) for name, _, value in (line.partition(":") for line in lines) + if re.search(r"drop|discard|err", name, re.I) and value.strip().isdigit()] + return sum(matched) if matched else None + + +def single_number(lines): + for line in lines: + if line.strip().isdigit(): + return int(line.strip()) + return None + + +def probe(path): + try: + text = Path(path).read_text() + except OSError: + return None + enq = re.search(r"^@enq: (\d+)", text, re.M) + if not enq: + return None + values = {"enq": int(enq.group(1))} + for key in ("gso", "maxlen"): + match = re.search(rf"^@{key}: (\d+)", text, re.M) + values[key] = int(match.group(1)) if match else 0 + return values + + +def csv_rows(path): + try: + return list(csv.DictReader(open(path))) + except OSError: + return [] + + +def p95(values): + ordered = sorted(values) + return ordered[min(len(ordered) - 1, int(math.ceil(0.95 * len(ordered))) - 1)] + + +def active_cpu(rows): + values = [] + for row in rows: + try: + values.append(float(row["cpu_percent"])) + except (KeyError, TypeError, ValueError): + continue + if not values: + return None + return statistics.mean(value for value in values if value >= 0.5 * max(values)) + + +def throughput(path): + try: + results = json.load(open(path))["results"] + return results.get("throughput_avg", results.get("measured_rate")) + except (json.JSONDecodeError, KeyError, OSError, TypeError): + return None + + +def binomial_bound(loss, skbs): + return Z_999 * math.sqrt(loss * (1 - loss) / skbs) if skbs and loss > 0 else 0.0 + + +def monitor_integrity(base, failures): + for name in ("broker", "pub", "sub"): + rows = csv_rows(f"{base}_{name}_resources.csv") + stamps = [row["timestamp"] for row in rows] + if not rows: + failures.append(f"P5: {name} monitor empty") + elif abs(len(stamps) - len(set(stamps))) > 1: + failures.append(f"P5: {name} monitor has {len(stamps)} rows for {len(set(stamps))} timestamps") + router = csv_rows(f"{base}_router_resources.csv") + if not router: + failures.append("P5: router monitor empty") + else: + cores = len({row["cpu"] for row in router}) + stamps = len({row["timestamp"] for row in router}) + if abs(len(router) - cores * stamps) > cores: + failures.append(f"P5: router monitor has {len(router)} rows for {stamps}x{cores}") + + +def headroom(base, result, failures): + router = csv_rows(f"{base}_router_resources.csv") + if router: + per_core = {} + for row in router: + per_core.setdefault(row["cpu"], []).append(float(row["sys_pct"]) + float(row["softirq_pct"])) + worst = max(p95(values) for values in per_core.values()) + result["router_core_p95"] = worst + if worst >= ROUTER_CORE_P95_MAX: + failures.append(f"P3: router core sys+softirq p95 {worst:.1f}%") + for name in ("pub", "sub"): + busy = [float(row["cpu_busy"]) for row in csv_rows(f"{base}_{name}_resources.csv") if row.get("cpu_busy")] + if busy: + busy_p95 = p95(busy) + result[f"{name}_busy_p95"] = busy_p95 + if busy_p95 >= CLIENT_BUSY_P95_MAX: + failures.append(f"P3: {name} busy p95 {busy_p95:.1f}%") + broker_rows = csv_rows(f"{base}_broker_resources.csv") + load = active_cpu(broker_rows) + if load is not None: + result["broker_cpu_mean"] = round(load, 1) + for column in ("host_softirq", "host_steal"): + values = [float(row[column]) for row in broker_rows if row.get(column)] + if values: + result[f"broker_{column}_p95"] = p95(values) + + +def router_gates(base, loss, entry, result, failures): + guarded = entry.get("router_guard") == "1" + before = sections(f"{base}_router_before.txt") + after = sections(f"{base}_router_after.txt") + rb = qdisc_counters(before.get("tc", []), "10:") + ra = qdisc_counters(after.get("tc", []), "10:") + if not (rb and ra): + failures.append("router netem counters missing") + return + sent, dropped = ra["pkts"] - rb["pkts"], ra["dropped"] - rb["dropped"] + skbs = sent + dropped + fraction = dropped / skbs if skbs else 0.0 + bound = binomial_bound(loss, skbs) + result.update(skbs=skbs, drop_fraction=round(fraction, 6), bound=round(bound, 6), + bytes_per_pkt=round((ra["bytes"] - rb["bytes"]) / sent, 1) if sent else None) + if not skbs: + failures.append("a: no broker traffic crossed the router netem") + if loss > 0 and abs(fraction - loss) > bound: + failures.append(f"a: drop fraction {fraction:.5f} outside {loss}±{bound:.5f}") + if loss == 0 and dropped: + failures.append(f"a: {dropped} router drops at 0% loss") + if sent and (ra["bytes"] - rb["bytes"]) / sent > WIRE_FRAME_MAX: + failures.append("d: bytes per packet above one wire frame") + + probed = probe(f"{base}_router_probe.txt") + if entry.get("router_probe") == "1" and probed is None: + failures.append("b/c: router probe output missing") + if probed: + expected = skbs + (ra["backlog"] - rb["backlog"]) + result.update(probe_enq=probed["enq"], probe_gso=probed["gso"], probe_maxlen=probed["maxlen"]) + if expected and abs(probed["enq"] - expected) / expected > ACCOUNTING_TOLERANCE: + failures.append(f"b: probe enq {probed['enq']} vs counters {expected}") + if probed["gso"] or probed["maxlen"] > WIRE_FRAME_MAX: + failures.append(f"c: gso skbs {probed['gso']}, max len {probed['maxlen']}") + + ingress_before, ingress_after = single_number(before.get("ingress", [])), single_number(after.get("ingress", [])) + if ingress_before is None or ingress_after is None: + failures.append("g: router ingress counter missing") + elif skbs: + ingress = ingress_after - ingress_before + result["ingress_over_skbs"] = round(ingress / skbs, 5) + if not guarded and abs(ingress - skbs) / skbs > ACCOUNTING_TOLERANCE: + failures.append(f"g: router ingress {ingress} vs netem skbs {skbs}") + + dev_b, dev_a = dev_counters(before.get("dev", [])), dev_counters(after.get("dev", [])) + if not (dev_b and dev_a): + failures.append("f: router interface counters missing") + elif dev_a["rx_drop"] - dev_b["rx_drop"] or dev_a["tx_drop"] - dev_b["tx_drop"]: + failures.append("f: router interface drops") + if not before.get("softnet") or not after.get("softnet"): + failures.append("f: router softnet counters missing") + else: + dropped_softnet = softnet_column(after["softnet"], 1) - softnet_column(before["softnet"], 1) + result["router_softnet_squeezed"] = softnet_column(after["softnet"], 2) - softnet_column(before["softnet"], 2) + if dropped_softnet: + failures.append(f"f: router softnet drops {dropped_softnet}") + nic_before, nic_after = ethtool_drops(before.get("ethtool", [])), ethtool_drops(after.get("ethtool", [])) + if nic_before is None or nic_after is None: + failures.append("f: router NIC drop counters missing") + elif nic_after - nic_before: + failures.append(f"f: router NIC drop/error counters +{nic_after - nic_before}") + for section, table, field in (("snmp", "Ip", "InDiscards"), ("snmp", "Ip", "OutDiscards"), + ("netstat", "IpExt", "InNoRoutes"), ("snmp", "Ip", "OutNoRoutes")): + change = table_delta(before, after, section, table, field) + if change is None: + failures.append(f"f: router {table} {field} missing") + elif change: + failures.append(f"f: router {table} {field} +{change}") + + +def broker_gates(base, loss, entry, result, failures): + before = sections(f"{base}_broker_before.txt") + after = sections(f"{base}_broker_after.txt") + bb = qdisc_counters(before.get("tc", []), "10:") + ba = qdisc_counters(after.get("tc", []), "10:") + if not (bb and ba): + if entry["mode"] != "router": + failures.append("e: broker netem counters missing") + else: + sent, dropped = ba["pkts"] - bb["pkts"], ba["dropped"] - bb["dropped"] + result["broker_netem_dropped"] = dropped + if entry["mode"] == "single" and dropped: + failures.append(f"e: broker delay qdisc dropped {dropped}") + if entry["mode"] in ("legacy", "tbf") and sent + dropped: + result["broker_drop_fraction"] = round(dropped / (sent + dropped), 6) + if entry["mode"] in LIMITED_MODES: + backlog = [int(row["backlog_pkts"]) for row in csv_rows(f"{base}_broker_backlog.csv") if row.get("backlog_pkts")] + if not backlog: + failures.append("e: broker backlog samples missing") + else: + result["broker_backlog_max"] = max(backlog) + if max(backlog) >= BACKLOG_CEILING: + failures.append(f"e: broker netem backlog reached {max(backlog)} packets") + + retrans = table_delta(before, after, "snmp", "Tcp", "RetransSegs") + segments = table_delta(before, after, "snmp", "Tcp", "OutSegs") + if entry["config"] in ("tcp", "tls"): + if retrans is None or not segments: + failures.append("P4: broker TCP counters missing") + else: + ratio = retrans / segments + lost = table_delta(before, after, "netstat", "TcpExt", "TCPLostRetransmit") + timeouts = table_delta(before, after, "netstat", "TcpExt", "TCPTimeouts") + result["tcp_retrans_ratio"] = round(ratio, 6) + result["tcp_timeouts"] = timeouts + result["tcp_lost_retransmit"] = lost + if lost is None or timeouts is None: + failures.append("P4: broker TcpExt counters missing") + if loss == 0 and ratio > CLEAN_RETRANS_MAX: + failures.append(f"P4: TCP retransmits {ratio:.5f} of segments on a clean path") + if loss == 0 and lost is not None and lost / segments > CLEAN_RTO_MAX: + failures.append(f"P4: {lost} lost retransmissions on a clean path") + if loss == 0 and timeouts is not None and timeouts / segments > CLEAN_RTO_MAX: + failures.append(f"P4: {timeouts} retransmission timeouts on a clean path") + + if entry["phase"] == "accuracy" and entry["mode"] == "legacy": + probed = probe(f"{base}_broker_probe.txt") + fraction = result.get("broker_drop_fraction") + clustered = fraction is not None and bb and ba and \ + loss - fraction > binomial_bound(loss, (ba["pkts"] - bb["pkts"]) + (ba["dropped"] - bb["dropped"])) + result["positive_control_gso"] = probed["gso"] if probed else None + result["positive_control_reference_03c"] = LEGACY_REFERENCE_03C.get(entry["config"]) + if probed and bb and ba: + counted = (ba["pkts"] - bb["pkts"]) + (ba["dropped"] - bb["dropped"]) + (ba["backlog"] - bb["backlog"]) + result["positive_control_skbs_over_counted"] = round(probed["enq"] / counted, 4) if counted else None + result["positive_control_detected"] = bool(probed and probed["gso"] > 0 and clustered) + + +def evaluate(directory, entry): + label = entry["label"] + base = directory / label + loss = float(entry["loss"]) / 100.0 + result = {"label": label, "phase": entry["phase"], "mode": entry["mode"], "config": entry["config"], "loss": entry["loss"]} + failures = [] + + value = throughput(directory / f"{label}.json") + result["throughput"] = value + if not value: + failures.append("throughput missing or zero") + for key in ("ilb_health", "ilb_health_after"): + health = entry.get(key, "") + if not health or any(state != "HEALTHY" for state in health.split()): + failures.append(f"{key} '{health}'") + base_delay = 25_000 if entry.get("workload") == "hol" else 10_000 + if int(entry.get("delay_us", 0)) + int(entry.get("router_hop_us", 0)) != base_delay: + failures.append(f"delay {entry.get('delay_us')}us + hop {entry.get('router_hop_us')}us != {base_delay}us") + if entry["phase"] == "calib-direct" and entry.get("router_hop_us") != "0": + failures.append("calib-direct run compensated for a router hop that is not in the path") + expected_path = "off" if entry["phase"] == "calib-direct" else "on" + if entry.get("path_state") != expected_path: + failures.append(f"router path {entry.get('path_state')} (expected {expected_path})") + + if entry["phase"] != "calib-direct": + router_gates(base, loss if entry["mode"] in ("single", "router") else 0.0, entry, result, failures) + broker_gates(base, loss, entry, result, failures) + headroom(base, result, failures) + monitor_integrity(base, failures) + + result["pass"] = not failures + result["failures"] = "; ".join(failures) + return result + + +def manifest_entries(directory): + return list({row["label"]: row for row in csv.DictReader(open(directory / "manifest.csv"))}.values()) + + +def main_campaign_cpu(main_dir, prefix): + loads = [active_cpu(csv_rows(path)) for path in glob.glob(str(main_dir / f"{prefix}_qos0_loss0pct_run*_broker_resources.csv"))] + loads = [load for load in loads if load is not None] + return statistics.mean(loads) if loads else None + + +def calibration_report(directory, results, group): + main_dir = directory.parent / "03_throughput_under_loss" + failures = 0 + if not any(result["phase"] in ("calib", "calib-direct") for result in results): + return failures + print(" P1 calibration at 0% loss (X = max(5%, 2*CV of the main-campaign cell))") + for config, prefix in MAIN_CAMPAIGN_PREFIX.items(): + main_values = [v for v in (throughput(p) for p in glob.glob(str(main_dir / f"{prefix}_qos0_loss0pct_run*.json"))) if v] + arms = {} + loads = {} + for result in results: + if result["config"] == config and result["loss"] == "0" and result["phase"] in ("calib", "calib-direct") and result["throughput"]: + arms.setdefault((result["phase"], result["mode"]), []).append(result["throughput"]) + if "broker_cpu_mean" in result: + loads.setdefault((result["phase"], result["mode"]), []).append(result["broker_cpu_mean"]) + if not main_values: + print(f" {config:10s} FAIL: no main-campaign 0% data") + failures += 1 + continue + if not arms: + print(f" {config:10s} FAIL: no calibration runs") + failures += 1 + continue + main_mean = statistics.mean(main_values) + tolerance = max(0.05, 2 * statistics.stdev(main_values) / main_mean) + legacy = arms.get(("calib", "legacy-calib")) + via_router = arms.get(("calib", "single")) + direct = arms.get(("calib-direct", "single")) + matched = MAIN_CAMPAIGN_GROUP[config] == group + if legacy: + drift = statistics.mean(legacy) / main_mean - 1 + passed = abs(drift) <= tolerance + if matched and not passed: + failures += 1 + print(f" {config:10s} (i) legacy vs main campaign g{MAIN_CAMPAIGN_GROUP[config]}: {drift:+.1%} " + f"(tol {tolerance:.1%}) {'PASS' if passed else 'FAIL'}{'' if matched else ' [cross-group, not gated]'}") + main_load = main_campaign_cpu(main_dir, prefix) + legacy_load = loads.get(("calib", "legacy-calib")) + if not (main_load and legacy_load): + print(f" {config:10s} (i) broker CPU comparison missing data {'FAIL' if matched else '[cross-group, not gated]'}") + failures += 1 if matched else 0 + else: + cpu_drift = statistics.mean(legacy_load) / main_load - 1 + cpu_passed = abs(cpu_drift) <= 0.05 + if matched and not cpu_passed: + failures += 1 + print(f" {config:10s} (i) broker CPU vs main campaign: {cpu_drift:+.1%} (tol 5.0%) " + f"{'PASS' if cpu_passed else 'FAIL'}{'' if matched else ' [cross-group, not gated]'}") + if not (via_router and direct): + print(f" {config:10s} (ii)/(iii) FAIL: missing {'router' if not via_router else 'direct'} calibration arm") + failures += 1 + else: + gap = statistics.mean(via_router) / statistics.mean(direct) - 1 + passed = abs(gap) <= tolerance + failures += 0 if passed else 1 + print(f" {config:10s} (ii) direct vs (iii) router: {gap:+.1%} (tol {tolerance:.1%}) {'PASS' if passed else 'FAIL'}") + if legacy and via_router: + print(f" {config:10s} tail-drop fix effect (iii)/(i): {statistics.mean(via_router) / statistics.mean(legacy) - 1:+.1%}") + return failures + + +def main(directory): + directory = Path(directory) + if not (directory / "manifest.csv").exists(): + print(f"missing {directory / 'manifest.csv'}") + return 1 + match = re.search(r"_g(\d+)$", directory.name) + if not match: + print(f"cannot read group from {directory.name}") + return 1 + group = int(match.group(1)) + results = [evaluate(directory, entry) for entry in manifest_entries(directory)] + fields = sorted({key for result in results for key in result}, key=lambda k: (k != "label", k)) + out = directory / "acceptance.csv" + with open(out, "w", newline="") as handle: + writer = csv.DictWriter(handle, fieldnames=fields, lineterminator="\n") + writer.writeheader() + writer.writerows(results) + failed = [r for r in results if not r["pass"]] + print(f"{directory.name}: {len(results)} runs, {len(failed)} failing gates -> {out}") + for result in failed: + print(f" FAIL {result['label']}: {result['failures']}") + for control in (r for r in results if "positive_control_detected" in r): + print(f" positive control {control['label']}: detected={control['positive_control_detected']} " + f"gso={control['positive_control_gso']} drop_fraction={control.get('broker_drop_fraction')} " + f"(03c reference {control.get('positive_control_reference_03c')}) " + f"probe skbs / counter segments={control.get('positive_control_skbs_over_counted')}") + return len(failed) + calibration_report(directory, results, group) + + +if __name__ == "__main__": + targets = sys.argv[1:] or sorted(glob.glob(str(Path(__file__).resolve().parent.parent / "results-v5" / "03e_single_segment_g*"))) + sys.exit(1 if sum(main(target) for target in targets) else 0) diff --git a/publications/comnet/experiments/analysis/single_segment_fold.py b/publications/comnet/experiments/analysis/single_segment_fold.py new file mode 100644 index 00000000..27d75d70 --- /dev/null +++ b/publications/comnet/experiments/analysis/single_segment_fold.py @@ -0,0 +1,319 @@ +import csv +import glob +import json +import math +import random +import statistics +import sys +from pathlib import Path + +LOSSES = [0, 1, 2, 5, 10] +QUIC_CONFIGS = ["quic-main", "quic-main-ppub", "quic-main-ptopic", "quic-ctl", "quic-ppub"] +BOOTSTRAP = 5000 +MAIN_CAMPAIGN_FILES = { + "tcp": "tcp", "tls": "tls", "quic-main": "quic-control-only", + "quic-main-ppub": "quic-per-publish", "quic-main-ptopic": "quic-per-topic", +} +TCP_MSS = 1408 +PAYLOAD_BYTES = 256 +RTT_S = 0.0101 +SOFTIRQ = {} +CPU_BOUND = 380.0 + + +def throughput(path): + try: + return json.load(open(path))["results"]["throughput_avg"] + except (json.JSONDecodeError, KeyError, OSError, TypeError): + return None + + +def broker_cpu(path): + try: + values = [float(row["cpu_percent"]) for row in csv.DictReader(open(path)) if row.get("cpu_percent")] + except (OSError, ValueError, KeyError): + return None + if not values: + return None + active = [value for value in values if value >= 0.5 * max(values)] + return statistics.mean(active) + + +def broker_softirq(path): + try: + rows = [row for row in csv.DictReader(open(path)) if row.get("cpu_percent") and row.get("host_softirq")] + peak = max(float(row["cpu_percent"]) for row in rows) if rows else 0 + values = [float(row["host_softirq"]) for row in rows if float(row["cpu_percent"]) >= 0.5 * peak] + except (OSError, ValueError, KeyError): + return None + return statistics.mean(values) if values else None + + +def failing_labels(directory): + path = directory / "acceptance.csv" + if not path.exists(): + raise SystemExit(f"{path} missing: run single_segment_accept.py first") + return {row["label"] for row in csv.DictReader(open(path)) if row["pass"] != "True"} + + +def per_buffer_drop_fractions(directories): + fractions = {} + for directory in directories: + for row in csv.DictReader(open(directory / "acceptance.csv")): + if row["phase"] == "main" and row["mode"] == "legacy" and row["pass"] == "True" and row.get("broker_drop_fraction"): + fractions.setdefault((row["config"], int(row["loss"])), []).append(float(row["broker_drop_fraction"])) + return {key: statistics.mean(values) for key, values in fractions.items()} + + +def clustering_prediction(directories, low=1, high=10): + fractions = per_buffer_drop_fractions(directories) + keys = [("tls", low), ("tls", high), ("quic-main", low), ("quic-main", high)] + if any(key not in fractions or fractions[key] <= 0 for key in keys): + return None + tls_span = fractions[("tls", high)] / fractions[("tls", low)] + quic_span = fractions[("quic-main", high)] / fractions[("quic-main", low)] + return 1 / math.sqrt(tls_span / quic_span) + + +def load_rerun(directories): + cells = {} + cpu = {} + excluded = [] + for directory in directories: + manifest = directory / "manifest.csv" + if not manifest.exists(): + continue + failing = failing_labels(directory) + entries = {row["label"]: row for row in csv.DictReader(open(manifest))}.values() + for entry in entries: + if entry["phase"] not in ("main", "crosscheck") or entry.get("broker_probe") == "1": + continue + value = throughput(directory / f"{entry['label']}.json") + if entry["label"] in failing or not value or value <= 0: + excluded.append(entry["label"]) + continue + key = (entry["mode"], entry["config"], int(entry["loss"])) + cells.setdefault(key, []).append((directory.name, value)) + load = broker_cpu(directory / f"{entry['label']}_broker_resources.csv") + if load is not None: + cpu.setdefault(key, []).append(load) + softirq = broker_softirq(directory / f"{entry['label']}_broker_resources.csv") + if softirq is not None: + SOFTIRQ.setdefault(key, []).append(softirq) + return cells, cpu, excluded + + +def load_main_campaign(base): + cells = {} + cpu = {} + for config, prefix in MAIN_CAMPAIGN_FILES.items(): + for loss in LOSSES: + key = ("main-campaign", config, loss) + for path in glob.glob(str(base / f"{prefix}_qos0_loss{loss}pct_run*.json")): + value = throughput(path) + if value and value > 0: + cells.setdefault(key, []).append(("main", value)) + load = broker_cpu(path.replace(".json", "_broker_resources.csv")) + if load is not None: + cpu.setdefault(key, []).append(load) + return cells, cpu + + +def resample(samples, rng): + by_group = {} + for group, value in samples: + by_group.setdefault(group, []).append(value) + drawn = [rng.choice(values) for values in by_group.values() for _ in values] + return statistics.mean(drawn) + + +def interval(statistic, rng): + draws = sorted(statistic(rng) for _ in range(BOOTSTRAP)) + return draws[int(0.025 * BOOTSTRAP)], draws[int(0.975 * BOOTSTRAP) - 1] + + +def mean_of(samples): + return statistics.mean(value for _, value in samples) + + +def fold_ratio(cells, mode, reference, quic, low, high): + needed = [(mode, reference, low), (mode, reference, high), (mode, quic, low), (mode, quic, high)] + if not all(key in cells for key in needed): + return None + + def compute(draw): + ref_low, ref_high, quic_low, quic_high = (draw(cells[key]) for key in needed) + return (ref_low / ref_high) / (quic_low / quic_high) + + rng = random.Random(f"{mode}-{reference}-{quic}-{low}-{high}") + return compute(mean_of), interval(lambda r: compute(lambda s: resample(s, r)), rng) + + +def same_loss_ratio(cells, mode, reference, quic, loss): + if (mode, reference, loss) not in cells or (mode, quic, loss) not in cells: + return None + rng = random.Random(f"R-{mode}-{reference}-{quic}-{loss}") + point = mean_of(cells[(mode, quic, loss)]) / mean_of(cells[(mode, reference, loss)]) + ci = interval(lambda r: resample(cells[(mode, quic, loss)], r) / resample(cells[(mode, reference, loss)], r), rng) + return point, ci + + +def loss_slope(cells, mode, config): + points = [(math.log(loss / 100), math.log(mean_of(cells[(mode, config, loss)]))) + for loss in (1, 2, 5, 10) if (mode, config, loss) in cells] + if len(points) < 3: + return None + mean_x = statistics.mean(x for x, _ in points) + mean_y = statistics.mean(y for _, y in points) + return -sum((x - mean_x) * (y - mean_y) for x, y in points) / sum((x - mean_x) ** 2 for x, _ in points) + + +def verdict(ci, main_value): + low, high = ci + if high < 1: + return "reversed" + if low <= 1: + return "not supported: headline gap was an artifact" + if low <= main_value <= high: + return "robust: gap and magnitude hold" + return "direction robust, magnitude was a netem artifact" + + +def cross_ratio(cells, numerator, denominator): + if numerator not in cells or denominator not in cells: + return None + rng = random.Random(f"X-{numerator}-{denominator}") + point = mean_of(cells[numerator]) / mean_of(cells[denominator]) + return point, interval(lambda r: resample(cells[numerator], r) / resample(cells[denominator], r), rng) + + +def g_shift(cells, arm): + keys = [(mode, config, loss) for mode in (arm, "main-campaign") for config in ("tls", "quic-main") for loss in (1, 10)] + if not all(key in cells for key in keys): + return None + + def compute(draw): + def g(mode): + return (draw(cells[(mode, "tls", 1)]) / draw(cells[(mode, "tls", 10)])) / \ + (draw(cells[(mode, "quic-main", 1)]) / draw(cells[(mode, "quic-main", 10)])) + return g(arm) / g("main-campaign") + + rng = random.Random(f"g-shift-{arm}") + return compute(mean_of), interval(lambda r: compute(lambda samples: resample(samples, r)), rng) + + +def cpu_label(cpu, key): + if key not in cpu: + return "-" + load = statistics.mean(cpu[key]) + return f"{load:.0f}{'*' if load >= CPU_BOUND else ''}" + + +def fmt(result): + if not result: + return "n/a" + point, (low, high) = result + return f"{point:6.2f} [{low:5.2f}, {high:5.2f}]" + + +def main(results_dir): + base = Path(results_dir) + directories = sorted(base.glob("03e_single_segment_g*")) + cells, cpu, excluded = load_rerun(directories) + main_cells, main_cpu = load_main_campaign(base / "03_throughput_under_loss") + cells.update(main_cells) + cpu.update(main_cpu) + print(f"groups: {[d.name for d in directories]}; runs excluded (failed gates or no throughput): {len(excluded)}") + for label in excluded: + print(f" excluded {label}") + print("main-campaign QUIC cells ran with the broker's default per-topic delivery") + + print("\nDelivered throughput, K msg/s (n) / broker CPU % of 400 (* = CPU-bound, >= 380)") + modes = ["main-campaign", "legacy", "single", "router", "tbf"] + for mode in modes: + for config in ["tcp", "tls"] + QUIC_CONFIGS: + row = [f"{mean_of(cells[(mode, config, loss)]) / 1000:7.2f}({len(cells[(mode, config, loss)]):2d})" + if (mode, config, loss) in cells else f"{'-':>11s}" for loss in LOSSES] + if any(cell.strip() != "-" for cell in row): + print(f" {mode:14s} {config:16s} " + " ".join(row)) + loads = [cpu_label(cpu, (mode, config, loss)) for loss in LOSSES] + print(f" {'':14s} {'broker cpu':16s} " + " ".join(f"{load:>11s}" for load in loads)) + if any((mode, config, loss) in SOFTIRQ for loss in LOSSES): + irq = [f"{statistics.mean(SOFTIRQ[(mode, config, loss)]):.1f}" if (mode, config, loss) in SOFTIRQ else "-" for loss in LOSSES] + print(f" {'':14s} {'host softirq %':16s} " + " ".join(f"{value:>11s}" for value in irq)) + + print("\nLoss-bound fold ratio G' = [X_ref(1)/X_ref(10)] / [X_quic(1)/X_quic(10)], 95% CI blocked by group") + main_g = fold_ratio(cells, "main-campaign", "tls", "quic-main", 1, 10) + for mode in modes: + for reference in ("tls", "tcp"): + for quic in QUIC_CONFIGS: + result = fold_ratio(cells, mode, reference, quic, 1, 10) + if result: + loads = ", ".join(cpu_label(cpu, (mode, cfg, loss)) for cfg in (reference, quic) for loss in (1, 10)) + print(f" {mode:14s} {reference:4s} vs {quic:16s} G'={fmt(result)} cpu[{loads}]") + + print("\nHeadline fold G0 = [X(0)/X(10)] ratio (0% level is broker-CPU bound, reported only)") + for mode in modes: + result = fold_ratio(cells, mode, "tls", "quic-main", 0, 10) + if result: + loads = ", ".join(cpu_label(cpu, (mode, cfg, loss)) for cfg in ("tls", "quic-main") for loss in (0, 10)) + print(f" {mode:14s} tls vs quic-main G0={fmt(result)} cpu[{loads}]") + + print("\nSame-loss ratio R(p) = X_quic(p) / X_ref(p), broker CPU of quic/ref cells") + for mode in modes: + for reference in ("tls", "tcp"): + row = [fmt(same_loss_ratio(cells, mode, reference, "quic-main", loss)) for loss in (1, 2, 5, 10)] + if any(cell != "n/a" for cell in row): + print(f" {mode:14s} quic-main/{reference:4s} " + " | ".join(row)) + loads = [f"{cpu_label(cpu, (mode, 'quic-main', loss))}/{cpu_label(cpu, (mode, reference, loss))}" for loss in (1, 2, 5, 10)] + print(f" {'':14s} {'cpu':14s} " + " | ".join(f"{load:>20s}" for load in loads)) + + print("\nRerun over main campaign, per cell X_single(p) / X_main(p)") + for config in ("tcp", "tls", "quic-main"): + row = [fmt(cross_ratio(cells, ("single", config, loss), ("main-campaign", config, loss))) for loss in (1, 2, 5, 10)] + if any(cell != "n/a" for cell in row): + print(f" {config:10s} " + " | ".join(row)) + + print("\nLoss exponent b in X ~ p^-b (Mathis predicts 0.5) and G' implied by the slopes, 10^(b_ref - b_quic)") + for mode in modes: + slopes = {config: loss_slope(cells, mode, config) for config in ["tcp", "tls"] + QUIC_CONFIGS} + for config, slope in slopes.items(): + if slope is not None: + print(f" {mode:14s} {config:16s} b={slope:5.2f}") + for reference in ("tls", "tcp"): + for quic in QUIC_CONFIGS: + if slopes.get(reference) is not None and slopes.get(quic) is not None: + print(f" {mode:14s} slope-implied G' {reference} vs {quic}: {10 ** (slopes[reference] - slopes[quic]):.2f}") + + print(f"\nMathis constant C = X_bytes * RTT * sqrt(p) / MSS per subscriber connection (Reno ~1.22), " + f"lower bound using {PAYLOAD_BYTES} B payload, MSS {TCP_MSS}, RTT {RTT_S * 1000:.0f} ms") + for mode in modes: + for config in ("tcp", "tls"): + row = [] + for loss in (1, 2, 5, 10): + if (mode, config, loss) in cells: + per_connection = mean_of(cells[(mode, config, loss)]) / 8 + row.append(f"{per_connection * PAYLOAD_BYTES * RTT_S * math.sqrt(loss / 100) / TCP_MSS:5.2f}") + else: + row.append(f"{'-':>5s}") + if any(cell.strip() != "-" for cell in row): + print(f" {mode:14s} {config:4s} " + " ".join(row)) + + for arm in ("router", "single"): + result = fold_ratio(cells, arm, "tls", "quic-main", 1, 10) + if result and main_g: + print(f"\n{arm} arm vs main campaign, G' tls vs quic-main: {verdict(result[1], main_g[0])}; rerun G'={fmt(result)}") + rerun = fold_ratio(cells, "single", "tls", "quic-main", 1, 10) + if rerun and main_g: + print(f"\nDECISION (pre-registered, G' single-segment tls vs quic-main): {verdict(rerun[1], main_g[0])}") + print(f" main-campaign G'={main_g[0]:.2f}; rerun G'={fmt(rerun)}") + prediction = clustering_prediction(sorted(Path(results_dir).glob("03e_single_segment_g*"))) + if prediction: + print(f" clustering-only prediction (X ~ 1/sqrt(p_eff), measured per-buffer drop fractions) for rerun G' / main-campaign G': {prediction:.2f}") + for arm in ("single", "router", "tbf"): + print(f" {arm:6s} G' / main-campaign G' = {fmt(g_shift(cells, arm))}") + + +if __name__ == "__main__": + default = Path(__file__).resolve().parent.parent / "results-v5" + main(sys.argv[1] if len(sys.argv) > 1 else default) diff --git a/publications/comnet/experiments/analysis/stream_limit_sweep.py b/publications/comnet/experiments/analysis/stream_limit_sweep.py new file mode 100644 index 00000000..eef9b48d --- /dev/null +++ b/publications/comnet/experiments/analysis/stream_limit_sweep.py @@ -0,0 +1,72 @@ +import glob +import json +import statistics +import sys +from pathlib import Path + +STRATEGIES = ["control-only", "per-topic", "per-publish"] +LIMITS = [100, 250, 1000] +RTT_S = 0.025 + + +def load(pattern, field): + values = [] + for path in glob.glob(pattern): + try: + results = json.load(open(path))["results"] + except (json.JSONDecodeError, KeyError, OSError): + continue + value = results.get(field) + if value: + values.append(value) + return values + + +def summarise(values, scale=1.0): + if not values: + return None + mean = statistics.mean(values) / scale + spread = (statistics.stdev(values) / statistics.mean(values) * 100) if len(values) > 1 else 0.0 + return mean, spread, len(values) + + +def main(results_dir): + base = Path(results_dir) / "04b_stream_limit_sweep" + if not base.exists(): + print(f"missing {base}") + return + + print("Single-connection publish rate (K msg/s), 8 topics, 25 ms, 2% loss") + print(f"{'strategy':14s} " + " ".join(f"{'limit ' + str(l):>18s}" for l in LIMITS)) + for strategy in STRATEGIES: + cells = [] + for limit in LIMITS: + rates = load(str(base / f"{strategy}_limit{limit}_throughput_run*_pub.json"), "offered_rate") + stat = summarise(rates, 1000.0) + cells.append(f"{stat[0]:8.2f}K ±{stat[1]:4.1f}% n={stat[2]}" if stat else f"{'-':>18s}") + print(f"{strategy:14s} " + " ".join(f"{c:>18s}" for c in cells)) + + print() + print("per-publish only: concurrent streams in flight (rate x 25 ms) against the cap") + cells = [] + for limit in LIMITS: + rates = load(str(base / f"per-publish_limit{limit}_throughput_run*_pub.json"), "offered_rate") + stat = summarise(rates) + cells.append(f"{stat[0] * RTT_S:5.0f}/{limit}" if stat else f"{'-':>10s}") + print(" " + " ".join(f"{c:>10s}" for c in cells)) + print(" (only per-publish opens one stream per message, so this ratio is meaningful only there)") + + print() + print("Experiment 2 cell: delivered rate at 2000 msg/s offered, 8 topics, 5% loss") + for strategy in STRATEGIES: + cells = [] + for limit in LIMITS: + rates = load(str(base / f"{strategy}_limit{limit}_hol_r2000_loss5pct_run*.json"), "measured_rate") + stat = summarise(rates) + cells.append(f"{stat[0]:8.1f} ±{stat[1]:4.1f}% n={stat[2]}" if stat else f"{'-':>18s}") + print(f" {strategy:14s} " + " ".join(f"{c:>18s}" for c in cells)) + + +if __name__ == "__main__": + default = Path(__file__).resolve().parent.parent / "results-v5" + main(sys.argv[1] if len(sys.argv) > 1 else default) diff --git a/publications/comnet/experiments/analysis/transport_limits.py b/publications/comnet/experiments/analysis/transport_limits.py new file mode 100644 index 00000000..9186c015 --- /dev/null +++ b/publications/comnet/experiments/analysis/transport_limits.py @@ -0,0 +1,169 @@ +import csv +import glob +import json +import statistics +import sys +from pathlib import Path + +from scipy import stats as st + +STRATEGIES = ["control-only", "per-topic", "per-publish"] +DEFAULT_STREAM_WINDOW = 262_144 +DEFAULT_MAX_STREAMS = 100 + + +def cell_paths(base, label): + return sorted(p for p in glob.glob(str(base / f"{label}_run*_pub.json"))) + + +def publish_rates(base, label): + rates = [] + for path in cell_paths(base, label): + try: + results = json.load(open(path))["results"] + except (json.JSONDecodeError, KeyError, OSError): + continue + elapsed = results.get("elapsed_secs") + published = results.get("published") + if elapsed and published: + rates.append(published / elapsed) + return rates + + +def hol_rates(base, label): + rates = [] + for path in sorted(glob.glob(str(base / f"{label}_run*.json"))): + if path.endswith("_pub.json"): + continue + try: + results = json.load(open(path))["results"] + except (json.JSONDecodeError, KeyError, OSError): + continue + if results.get("measured_rate"): + rates.append(results["measured_rate"]) + return rates + + +def summarise(values): + if not values: + return None + mean = statistics.mean(values) + if len(values) < 2: + return mean, 0.0, 1 + half = st.t.ppf(0.975, len(values) - 1) * st.sem(values) + return mean, half, len(values) + + +def fmt(stat, scale=1000.0): + if stat is None: + return f"{'-':>20s}" + return f"{stat[0] / scale:8.2f} ±{stat[1] / scale:5.2f} n={stat[2]}" + + +def broker_stats(base, label): + rtts, blocked_stream, blocked_conn, blocked_streams_uni = [], [], [], [] + for path in sorted(glob.glob(str(base / f"{label}_run*_broker_quic_*.csv"))): + rows = list(csv.DictReader(open(path))) + if not rows: + continue + last = rows[-1] + rtt_values = [int(r["rtt_us"]) for r in rows if r.get("rtt_us")] + if rtt_values: + rtts.append(statistics.median(rtt_values)) + blocked_stream.append(int(last.get("stream_data_blocked", 0))) + blocked_conn.append(int(last.get("data_blocked", 0))) + blocked_streams_uni.append(int(last.get("streams_blocked_uni", 0))) + if not rtts: + return None + return { + "rtt_ms": statistics.median(rtts) / 1000.0, + "stream_data_blocked": max(blocked_stream), + "data_blocked": max(blocked_conn), + "streams_blocked_uni": max(blocked_streams_uni), + } + + +def in_flight(base, label): + rates = publish_rates(base, label) + info = broker_stats(base, label) + if not rates or not info: + return None + return statistics.mean(rates) * info["rtt_ms"] / 1000.0 + + +def part_a(base): + print("PART A publish rate (K msg/s) by topic count, default transport config, 25 ms, 2% loss") + topics = [1, 2, 4, 8, 16] + print(f"{'strategy':14s}" + "".join(f"{'t=' + str(t):>21s}" for t in topics)) + for strategy in STRATEGIES: + cells = [fmt(summarise(publish_rates(base, f"{strategy}_t{t}_sdef_wdef_d25_l2_tput"))) for t in topics] + print(f"{strategy:14s}" + "".join(f"{c:>21s}" for c in cells)) + + +def part_b(base): + print("\nPART B stream credit, 8 topics, 25 ms, 2% loss") + print(f"{'cell':34s} {'K msg/s':>20s} {'rtt ms':>7s} {'streams in flight':>12s} {'of cap':>10s}") + for limit in [25, 100, 250, 1000]: + label = f"per-publish_t8_s{limit}_wdef_d25_l2_tput" + stat = summarise(publish_rates(base, label)) + info = broker_stats(base, label) + flight = in_flight(base, label) + rtt = f"{info['rtt_ms']:7.1f}" if info else f"{'-':>7s}" + pct = 100.0 * flight / limit if flight else float("nan") + print(f"{'per-publish limit ' + str(limit):34s} {fmt(stat):>20s} {rtt} {flight:12.1f} {pct:9.1f}%") + for strategy in ["control-only", "per-topic"]: + for limit in [100, 1000]: + label = f"{strategy}_t8_s{limit}_wdef_d25_l2_tput" + print(f"{strategy + ' limit ' + str(limit):34s} {fmt(summarise(publish_rates(base, label))):>20s}") + + print("\nPART B delay sweep (a credit ceiling scales with 1/RTT)") + for strategy in ["per-publish", "control-only"]: + for delay in [10, 25, 50]: + label = f"{strategy}_t8_s100_wdef_d{delay}_l2_tput" + info = broker_stats(base, label) + rtt = f"{info['rtt_ms']:7.1f}" if info else f"{'-':>7s}" + print(f"{strategy + ' delay ' + str(delay) + 'ms':34s} {fmt(summarise(publish_rates(base, label))):>20s} {rtt}") + + print("\nPART B Experiment 2 cell: delivered rate at 2000 msg/s offered, 8 topics, 5% loss") + for limit in [100, 1000]: + label = f"per-publish_t8_s{limit}_wdef_d25_l5_hol_r2000" + print(f"{'per-publish limit ' + str(limit):34s} {fmt(summarise(hol_rates(base, label)), 1.0):>20s} msg/s") + + +def part_c(base): + print("\nPART C per-stream receive window, 25 ms, 2% loss") + print(f"{'cell':34s} {'K msg/s':>20s} {'rtt ms':>7s} {'implied B/msg':>15s}") + print(" (implied B/msg is constant only where the per-stream window is the binding limit)") + for window in [131_072, 262_144, 1_048_576]: + for strategy, topics in [("control-only", 8), ("per-topic", 1), ("per-topic", 8)]: + label = f"{strategy}_t{topics}_sdef_w{window}_d25_l2_tput" + stat = summarise(publish_rates(base, label)) + info = broker_stats(base, label) + streams = topics if strategy == "per-topic" else 1 + flight = in_flight(base, label) + rtt = f"{info['rtt_ms']:7.1f}" if info else f"{'-':>7s}" + implied = window * streams / flight if flight else float("nan") + name = f"{strategy} t{topics} w{window // 1024}K" + print(f"{name:34s} {fmt(stat):>20s} {rtt} {implied:15.1f}") + + print("\nPART C 0% loss (separates congestion response from a fixed ceiling)") + for strategy, window in [("control-only", 262_144), ("per-topic", 262_144), ("control-only", 1_048_576)]: + label = f"{strategy}_t8_sdef_w{window}_d25_l0_tput" + info = broker_stats(base, label) + rtt = f"{info['rtt_ms']:7.1f}" if info else f"{'-':>7s}" + print(f"{strategy + ' w' + str(window // 1024) + 'K loss 0%':34s} {fmt(summarise(publish_rates(base, label))):>20s} {rtt}") + + +def main(results_dir): + base = Path(results_dir) / "04_transport_limits" + if not base.exists(): + print(f"missing {base}") + return + part_a(base) + part_b(base) + part_c(base) + + +if __name__ == "__main__": + default = Path(__file__).resolve().parent.parent / "results-v5" + main(sys.argv[1] if len(sys.argv) > 1 else default) diff --git a/publications/comnet/experiments/analysis/verify_reruns.py b/publications/comnet/experiments/analysis/verify_reruns.py new file mode 100644 index 00000000..c132861e --- /dev/null +++ b/publications/comnet/experiments/analysis/verify_reruns.py @@ -0,0 +1,87 @@ +import json +import statistics +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent / "results-v5" +D3 = ROOT / "03_throughput_under_loss" +D4 = ROOT / "04_stream_strategies" +LOSSES = [0, 1, 2, 5, 10] +TOPICS = [1, 4, 8, 16] +RUNS = range(1, 16) +ARMS3 = ["tcp", "tls", "quic-control-only", "quic-per-topic", "quic-per-publish"] +STRATS4 = ["control-only", "per-topic", "per-publish"] + + +def load(path: Path): + try: + if path.stat().st_size < 50: + return None + return json.load(open(path)) + except (OSError, ValueError): + return None + + +def median_or_none(values): + return round(statistics.median(values), 2) if values else None + + +def exp3(qos: int): + print(f"=== Exp3 QoS{qos}: unique delivered (throughput_avg/subs) | fan-out recv/pub | ingest pub/s ===") + print(f" loss: {LOSSES}") + for arm in ARMS3: + uniq, fan, ing = [], [], [] + for loss in LOSSES: + u, f, i = [], [], [] + for run in RUNS: + sub = load(D3 / f"{arm}_qos{qos}_loss{loss}pct_run{run}.json") + pub = load(D3 / f"{arm}_qos{qos}_loss{loss}pct_run{run}_pub.json") + if sub: + subs = sub["config"].get("subscribers") or 1 + u.append(sub["results"]["throughput_avg"] / subs) + if sub and pub and pub["results"].get("published"): + f.append(sub["results"]["received"] / pub["results"]["published"]) + if pub and pub["results"].get("elapsed_secs"): + i.append(pub["results"]["published"] / pub["results"]["elapsed_secs"]) + uniq.append(median_or_none(u)) + fan.append(median_or_none(f)) + ing.append(median_or_none(i)) + n = sum(1 for run in RUNS if load(D3 / f"{arm}_qos{qos}_loss0pct_run{run}.json")) + print(f" {arm:18s} n={n:2d} uniq={uniq}") + print(f" {'':18s} fanout={fan}") + print(f" {'':18s} ingest={ing}") + + +def exp4(): + print("=== Exp4: publisher send rate (published/elapsed) | subscriber delivered (throughput_avg) ===") + print(f" topics: {TOPICS}") + for strat in STRATS4: + send, deliv = [], [] + for topics in TOPICS: + s, d = [], [] + for run in RUNS: + pub = load(D4 / f"{strat}_{topics}topics_throughput_run{run}_pub.json") + sub = load(D4 / f"{strat}_{topics}topics_throughput_run{run}.json") + if pub and pub["results"].get("elapsed_secs"): + s.append(pub["results"]["published"] / pub["results"]["elapsed_secs"]) + if sub: + d.append(sub["results"]["throughput_avg"]) + send.append(median_or_none(s)) + deliv.append(median_or_none(d)) + print(f" {strat:12s} send={send}") + print(f" {'':12s} deliv={deliv}") + + +def main(): + which = sys.argv[1] if len(sys.argv) > 1 else "all" + if which in ("all", "exp3"): + exp3(1) + print() + if which in ("all", "exp4"): + exp4() + if which == "exp3qos0": + exp3(0) + + +if __name__ == "__main__": + main() diff --git a/publications/comnet/experiments/monitor/client_monitor.sh b/publications/comnet/experiments/monitor/client_monitor.sh index 00164953..9e575b0c 100755 --- a/publications/comnet/experiments/monitor/client_monitor.sh +++ b/publications/comnet/experiments/monitor/client_monitor.sh @@ -3,60 +3,50 @@ set -euo pipefail INTERVAL="${1:-1}" +exec 9>/tmp/client_monitor.lock +if ! flock -w 5 9; then + echo "client_monitor already running" >&2 + exit 1 +fi + IFACE=$(ip route show default 2>/dev/null | awk '{print $5; exit}') : "${IFACE:=eth0}" read_cpu() { - awk '/^cpu / {print $2, $4, $5}' /proc/stat + awk '/^cpu / {print $2, $3, $4, $5, $6, $7, $8, $9}' /proc/stat } read_net_counters() { awk -v iface="${IFACE}:" '$1 == iface {print $2, $3, $10, $11}' /proc/net/dev } -echo "timestamp,cpu_user,cpu_sys,cpu_idle,net_rx_bytes,net_tx_bytes,net_rx_packets,net_tx_packets" +echo "timestamp,cpu_user,cpu_sys,cpu_idle,net_rx_bytes,net_tx_bytes,net_rx_packets,net_tx_packets,cpu_nice,cpu_iowait,cpu_irq,cpu_softirq,cpu_steal,cpu_busy" -prev_cpu=$(read_cpu) -prev_user=$(echo "$prev_cpu" | awk '{print $1}') -prev_sys=$(echo "$prev_cpu" | awk '{print $2}') -prev_idle=$(echo "$prev_cpu" | awk '{print $3}') +read -r p_user p_nice p_sys p_idle p_iowait p_irq p_softirq p_steal <<< "$(read_cpu)" -sleep "$INTERVAL" +sleep "$INTERVAL" 9>&- while true; do ts=$(date +%s) - - cur_cpu=$(read_cpu) - cur_user=$(echo "$cur_cpu" | awk '{print $1}') - cur_sys=$(echo "$cur_cpu" | awk '{print $2}') - cur_idle=$(echo "$cur_cpu" | awk '{print $3}') - - d_user=$((cur_user - prev_user)) - d_sys=$((cur_sys - prev_sys)) - d_idle=$((cur_idle - prev_idle)) - d_total=$((d_user + d_sys + d_idle)) - - if [ "$d_total" -gt 0 ]; then - cpu_user=$(awk "BEGIN {printf \"%.1f\", 100*${d_user}/${d_total}}") - cpu_sys=$(awk "BEGIN {printf \"%.1f\", 100*${d_sys}/${d_total}}") - cpu_idle=$(awk "BEGIN {printf \"%.1f\", 100*${d_idle}/${d_total}}") - else - cpu_user="0.0" - cpu_sys="0.0" - cpu_idle="100.0" - fi - - prev_user=$cur_user - prev_sys=$cur_sys - prev_idle=$cur_idle - - net=$(read_net_counters) - rx_bytes=$(echo "$net" | awk '{print $1}') - rx_packets=$(echo "$net" | awk '{print $2}') - tx_bytes=$(echo "$net" | awk '{print $3}') - tx_packets=$(echo "$net" | awk '{print $4}') + read -r c_user c_nice c_sys c_idle c_iowait c_irq c_softirq c_steal <<< "$(read_cpu)" + read -r rx_bytes rx_packets tx_bytes tx_packets <<< "$(read_net_counters)" : "${rx_bytes:=0}" "${rx_packets:=0}" "${tx_bytes:=0}" "${tx_packets:=0}" - echo "${ts},${cpu_user},${cpu_sys},${cpu_idle},${rx_bytes},${tx_bytes},${rx_packets},${tx_packets}" - sleep "$INTERVAL" + awk -v ts="$ts" \ + -v du=$((c_user - p_user)) -v dn=$((c_nice - p_nice)) -v ds=$((c_sys - p_sys)) \ + -v di=$((c_idle - p_idle)) -v dw=$((c_iowait - p_iowait)) -v dq=$((c_irq - p_irq)) \ + -v dsq=$((c_softirq - p_softirq)) -v dst=$((c_steal - p_steal)) \ + -v rxb="$rx_bytes" -v txb="$tx_bytes" -v rxp="$rx_packets" -v txp="$tx_packets" \ + 'BEGIN { + total = du + dn + ds + di + dw + dq + dsq + dst + if (total <= 0) { total = 1; di = 1 } + printf "%s,%.1f,%.1f,%.1f,%s,%s,%s,%s,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f\n", ts, + 100*du/total, 100*ds/total, 100*di/total, rxb, txb, rxp, txp, + 100*dn/total, 100*dw/total, 100*dq/total, 100*dsq/total, 100*dst/total, + 100*(total - di - dw)/total + }' + + p_user=$c_user; p_nice=$c_nice; p_sys=$c_sys; p_idle=$c_idle + p_iowait=$c_iowait; p_irq=$c_irq; p_softirq=$c_softirq; p_steal=$c_steal + sleep "$INTERVAL" 9>&- done diff --git a/publications/comnet/experiments/monitor/resource_monitor.sh b/publications/comnet/experiments/monitor/resource_monitor.sh index 5cf926c9..9e5ab021 100755 --- a/publications/comnet/experiments/monitor/resource_monitor.sh +++ b/publications/comnet/experiments/monitor/resource_monitor.sh @@ -4,6 +4,12 @@ set -euo pipefail PID="${1:?usage: $0 }" INTERVAL="${2:-1}" +exec 9>/tmp/resource_monitor.lock +if ! flock -w 5 9; then + echo "resource_monitor already running" >&2 + exit 1 +fi + IFACE=$(ip route show default 2>/dev/null | awk '{print $5; exit}') : "${IFACE:=eth0}" @@ -18,13 +24,18 @@ read_cpu_jiffies() { "/proc/${PID}/stat" 2>/dev/null || echo 0 } -echo "timestamp,rss_kb,cpu_percent,threads,net_rx_bytes,net_tx_bytes,net_rx_packets,net_tx_packets" +read_host_cpu() { + awk '/^cpu / {print $2, $3, $4, $5, $6, $7, $8, $9}' /proc/stat +} + +echo "timestamp,rss_kb,cpu_percent,threads,net_rx_bytes,net_tx_bytes,net_rx_packets,net_tx_packets,host_user,host_nice,host_sys,host_idle,host_iowait,host_irq,host_softirq,host_steal,host_busy" prev_jiffies=$(read_cpu_jiffies) prev_time=$(date +%s.%N) +read -r p_user p_nice p_sys p_idle p_iowait p_irq p_softirq p_steal <<< "$(read_host_cpu)" while kill -0 "$PID" 2>/dev/null; do - sleep "$INTERVAL" + sleep "$INTERVAL" 9>&- kill -0 "$PID" 2>/dev/null || break now=$(date +%s.%N) ts="${now%.*}" @@ -35,11 +46,19 @@ while kill -0 "$PID" 2>/dev/null; do prev_time=$now rss=$(awk '/^VmRSS:/ {print $2}' "/proc/${PID}/status" 2>/dev/null || echo 0) threads=$(awk '/^Threads:/ {print $2}' "/proc/${PID}/status" 2>/dev/null || echo 0) - net=$(read_net_counters) - rx_bytes=$(echo "$net" | awk '{print $1}') - rx_packets=$(echo "$net" | awk '{print $2}') - tx_bytes=$(echo "$net" | awk '{print $3}') - tx_packets=$(echo "$net" | awk '{print $4}') + read -r rx_bytes rx_packets tx_bytes tx_packets <<< "$(read_net_counters)" : "${rx_bytes:=0}" "${rx_packets:=0}" "${tx_bytes:=0}" "${tx_packets:=0}" - echo "${ts},${rss},${cpu},${threads},${rx_bytes},${tx_bytes},${rx_packets},${tx_packets}" + read -r c_user c_nice c_sys c_idle c_iowait c_irq c_softirq c_steal <<< "$(read_host_cpu)" + host=$(awk -v du=$((c_user - p_user)) -v dn=$((c_nice - p_nice)) -v ds=$((c_sys - p_sys)) \ + -v di=$((c_idle - p_idle)) -v dw=$((c_iowait - p_iowait)) -v dq=$((c_irq - p_irq)) \ + -v dsq=$((c_softirq - p_softirq)) -v dst=$((c_steal - p_steal)) \ + 'BEGIN { + total = du + dn + ds + di + dw + dq + dsq + dst + if (total <= 0) { total = 1; di = 1 } + printf "%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f", 100*du/total, 100*dn/total, 100*ds/total, + 100*di/total, 100*dw/total, 100*dq/total, 100*dsq/total, 100*dst/total, 100*(total - di - dw)/total + }') + p_user=$c_user; p_nice=$c_nice; p_sys=$c_sys; p_idle=$c_idle + p_iowait=$c_iowait; p_irq=$c_irq; p_softirq=$c_softirq; p_steal=$c_steal + echo "${ts},${rss},${cpu},${threads},${rx_bytes},${tx_bytes},${rx_packets},${tx_packets},${host}" done diff --git a/publications/comnet/experiments/monitor/router_monitor.sh b/publications/comnet/experiments/monitor/router_monitor.sh new file mode 100755 index 00000000..83c974fc --- /dev/null +++ b/publications/comnet/experiments/monitor/router_monitor.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +set -euo pipefail + +INTERVAL="${1:-1}" + +exec 9>/tmp/router_monitor.lock +if ! flock -w 5 9; then + echo "router_monitor already running" >&2 + exit 1 +fi + +snapshot() { + awk '/^cpu[0-9]+ / { + busy = $2 + $3 + $4 + $7 + $8 + $9 + print $1, busy, busy + $5 + $6, $4, $8 + }' /proc/stat +} + +echo "timestamp,cpu,busy_pct,sys_pct,softirq_pct" + +prev=$(snapshot) +sleep "$INTERVAL" 9>&- + +while true; do + ts=$(date +%s) + cur=$(snapshot) + paste -d' ' <(echo "$prev") <(echo "$cur") | awk -v ts="$ts" '{ + total = $8 - $3 + if (total <= 0) total = 1 + printf "%s,%s,%.1f,%.1f,%.1f\n", ts, $1, 100*($7 - $2)/total, 100*($9 - $4)/total, 100*($10 - $5)/total + }' + prev=$cur + sleep "$INTERVAL" 9>&- +done diff --git a/publications/comnet/experiments/netem/apply_bottleneck.sh b/publications/comnet/experiments/netem/apply_bottleneck.sh new file mode 100755 index 00000000..99662f32 --- /dev/null +++ b/publications/comnet/experiments/netem/apply_bottleneck.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +DELAY_MS="${1:?usage: $0 [limit_pkts] [loss_pct]}" +RATE_MBIT="${2:?usage: $0 [limit_pkts] [loss_pct]}" +LIMIT_PKTS="${3:-1000}" +LOSS_PCT="${4:-0}" + +DEV=$(ip route show default | awk '{print $5}' | head -1) +tc qdisc replace dev "$DEV" root netem delay "${DELAY_MS}ms" loss "${LOSS_PCT}%" rate "${RATE_MBIT}mbit" limit "${LIMIT_PKTS}" +echo "netem-bottleneck: dev=${DEV} delay=${DELAY_MS}ms rate=${RATE_MBIT}mbit limit=${LIMIT_PKTS}pkts loss=${LOSS_PCT}%" diff --git a/publications/comnet/experiments/netem/broker_backlog.sh b/publications/comnet/experiments/netem/broker_backlog.sh new file mode 100755 index 00000000..dad0fc4d --- /dev/null +++ b/publications/comnet/experiments/netem/broker_backlog.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +set -euo pipefail + +INTERVAL="${1:-1}" + +DEV=$(ip route show default | awk '{print $5}' | head -1) +echo "timestamp,backlog_bytes,backlog_pkts,dropped" +while true; do + tc -s -j qdisc show dev "$DEV" | python3 -c ' +import json, sys, time +for qdisc in json.load(sys.stdin): + if qdisc.get("kind") == "netem" and qdisc.get("handle") == "10:": + print(f"{int(time.time())},{qdisc.get("backlog", 0)},{qdisc.get("qlen", 0)},{qdisc.get("drops", 0)}") +' + sleep "$INTERVAL" +done diff --git a/publications/comnet/experiments/netem/broker_netem.sh b/publications/comnet/experiments/netem/broker_netem.sh new file mode 100755 index 00000000..6d9a3ec4 --- /dev/null +++ b/publications/comnet/experiments/netem/broker_netem.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +DELAY_US="${1:?usage: $0 [limit]}" +LOSS_PCT="${2:-0}" +LIMIT="${3:-}" + +DEV=$(ip route show default | awk '{print $5}' | head -1) +tc qdisc del dev "$DEV" root 2>/dev/null || true +tc qdisc add dev "$DEV" root handle 10: netem delay "${DELAY_US}us" loss "${LOSS_PCT}%" ${LIMIT:+limit "$LIMIT"} +echo "broker netem: dev=${DEV} delay=${DELAY_US}us loss=${LOSS_PCT}% limit=${LIMIT:-default}" diff --git a/publications/comnet/experiments/netem/broker_tbf.sh b/publications/comnet/experiments/netem/broker_tbf.sh new file mode 100755 index 00000000..fba6ca58 --- /dev/null +++ b/publications/comnet/experiments/netem/broker_tbf.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +DELAY_US="${1:?usage: $0 }" +LOSS_PCT="${2:-0}" + +DEV=$(ip route show default | awk '{print $5}' | head -1) +MTU=$(cat "/sys/class/net/${DEV}/mtu") +BURST=$((MTU + 14)) +tc qdisc del dev "$DEV" root 2>/dev/null || true +tc qdisc add dev "$DEV" root handle 1: tbf rate 100gbit burst "$BURST" latency 100ms +tc qdisc add dev "$DEV" parent 1:1 handle 10: netem delay "${DELAY_US}us" loss "${LOSS_PCT}%" limit 100000 +echo "broker tbf+netem: dev=${DEV} burst=${BURST} delay=${DELAY_US}us loss=${LOSS_PCT}%" diff --git a/publications/comnet/experiments/netem/netem_probe.bt b/publications/comnet/experiments/netem/netem_probe.bt new file mode 100644 index 00000000..d369a8dd --- /dev/null +++ b/publications/comnet/experiments/netem/netem_probe.bt @@ -0,0 +1,11 @@ +kprobe:netem_enqueue +{ + $skb = (struct sk_buff *)arg0; + $shinfo = (struct skb_shared_info *)($skb->head + $skb->end); + @enq = count(); + @maxlen = max($skb->len); + if ($shinfo->gso_size > 0 || $shinfo->gso_segs > 1) { + @gso = count(); + @gso_segs = hist($shinfo->gso_segs); + } +} diff --git a/publications/comnet/experiments/netem/router_clear.sh b/publications/comnet/experiments/netem/router_clear.sh new file mode 100755 index 00000000..e4cbb4cf --- /dev/null +++ b/publications/comnet/experiments/netem/router_clear.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +DEV=$(ip route show default | awk '{print $5}' | head -1) +tc qdisc del dev "$DEV" root 2>/dev/null || true +tc qdisc del dev "$DEV" clsact 2>/dev/null || true +rm -f /tmp/router_netem_parent +echo "router: cleared dev=${DEV}" diff --git a/publications/comnet/experiments/netem/router_ingress_count.sh b/publications/comnet/experiments/netem/router_ingress_count.sh new file mode 100755 index 00000000..10bfaa2b --- /dev/null +++ b/publications/comnet/experiments/netem/router_ingress_count.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +DEV=$(ip route show default | awk '{print $5}' | head -1) +tc -s filter show dev "$DEV" ingress | awk '/Sent [0-9]+ bytes [0-9]+ pkt/ { for (i = 1; i <= NF; i++) if ($i == "pkt") total += $(i - 1) } END { print total + 0 }' diff --git a/publications/comnet/experiments/netem/router_loss.sh b/publications/comnet/experiments/netem/router_loss.sh new file mode 100755 index 00000000..fc6b08b3 --- /dev/null +++ b/publications/comnet/experiments/netem/router_loss.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -euo pipefail + +LOSS_PCT="${1:?usage: $0 [delay_us]}" +DELAY_US="${2:-0}" + +DEV=$(ip route show default | awk '{print $5}' | head -1) +PARENT=$(cat /tmp/router_netem_parent) +tc qdisc change dev "$DEV" parent "$PARENT" handle 10: netem delay "${DELAY_US}us" loss "${LOSS_PCT}%" limit 100000 +echo "router netem: dev=${DEV} parent=${PARENT} delay=${DELAY_US}us loss=${LOSS_PCT}%" diff --git a/publications/comnet/experiments/netem/router_setup.sh b/publications/comnet/experiments/netem/router_setup.sh new file mode 100755 index 00000000..84701d22 --- /dev/null +++ b/publications/comnet/experiments/netem/router_setup.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +set -euo pipefail + +BROKER_IP="${1:?usage: $0 [guard 0|1]}" +PUB_IP="${2:?usage: $0 [guard 0|1]}" +SUB_IP="${3:?usage: $0 [guard 0|1]}" +GUARD="${4:-0}" + +DEV=$(ip route show default | awk '{print $5}' | head -1) +MTU=$(cat "/sys/class/net/${DEV}/mtu") +BURST=$((MTU + 14)) + +sysctl -qw net.ipv4.ip_forward=1 +sysctl -qw net.ipv4.conf.all.send_redirects=0 +sysctl -qw "net.ipv4.conf.${DEV}.send_redirects=0" +for feature in gro rx-gro-hw lro rx-gro-list rx-udp-gro-forwarding; do + ethtool -K "$DEV" "$feature" off 2>/dev/null || true +done + +ethtool -k "$DEV" | grep -E '^(generic-receive-offload|rx-gro-hw|large-receive-offload|rx-gro-list|rx-udp-gro-forwarding):' +still_on=$(ethtool -k "$DEV" | grep -E '^(generic-receive-offload|rx-gro-hw|large-receive-offload|rx-gro-list):' | grep -c ': on' || true) + +if [ "$still_on" -gt 0 ] && [ "$GUARD" != "1" ]; then + echo "ERROR: receive coalescing still on for ${DEV}; rerun with guard=1" >&2 + exit 3 +fi + +tc qdisc del dev "$DEV" root 2>/dev/null || true +tc qdisc del dev "$DEV" clsact 2>/dev/null || true + +tc qdisc add dev "$DEV" clsact +tc filter add dev "$DEV" ingress protocol ip prio 1 u32 \ + match ip src "${BROKER_IP}/32" match ip dst "${PUB_IP}/32" action pass +tc filter add dev "$DEV" ingress protocol ip prio 2 u32 \ + match ip src "${BROKER_IP}/32" match ip dst "${SUB_IP}/32" action pass + +tc qdisc add dev "$DEV" root handle 1: prio bands 3 priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 +if [ "$GUARD" = "1" ]; then + tc qdisc add dev "$DEV" parent 1:1 handle 5: tbf rate 100gbit burst "$BURST" latency 50ms + tc qdisc add dev "$DEV" parent 5:1 handle 10: netem loss 0% limit 100000 + echo "5:1" > /tmp/router_netem_parent +else + tc qdisc add dev "$DEV" parent 1:1 handle 10: netem loss 0% limit 100000 + echo "1:1" > /tmp/router_netem_parent +fi +tc filter add dev "$DEV" parent 1: protocol ip prio 1 u32 match ip src "${BROKER_IP}/32" flowid 1:1 +echo "router: dev=${DEV} broker=${BROKER_IP} pub=${PUB_IP} sub=${SUB_IP} guard=${GUARD} coalescing_on=${still_on}" diff --git a/publications/comnet/experiments/netem/tbf_probe.bt b/publications/comnet/experiments/netem/tbf_probe.bt new file mode 100644 index 00000000..f64196c4 --- /dev/null +++ b/publications/comnet/experiments/netem/tbf_probe.bt @@ -0,0 +1,4 @@ +kretprobe:tbf_enqueue +{ + @ret[retval] = count(); +} diff --git a/publications/comnet/experiments/netem/tcp_cwr_probe.bt b/publications/comnet/experiments/netem/tcp_cwr_probe.bt new file mode 100644 index 00000000..4a86df6c --- /dev/null +++ b/publications/comnet/experiments/netem/tcp_cwr_probe.bt @@ -0,0 +1,10 @@ +kprobe:tcp_enter_cwr +{ + @cwr = count(); +} + +kretprobe:ip_queue_xmit +/retval != 0/ +{ + @xmit_err[retval] = count(); +} diff --git a/publications/comnet/experiments/parallel/02c_topic_rate_sweep_v5.sh b/publications/comnet/experiments/parallel/02c_topic_rate_sweep_v5.sh new file mode 100644 index 00000000..d8c8d01f --- /dev/null +++ b/publications/comnet/experiments/parallel/02c_topic_rate_sweep_v5.sh @@ -0,0 +1,144 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +EXPERIMENT="02c_topic_rate_sweep" +LOSSES=(1 5) +DELAY=25 +RUNS_PER_DATAPOINT=10 + +RESULTS_DIR="${ROOT_DIR}/results-v5" +OUTPUT_DIR="${RESULTS_DIR}/${EXPERIMENT}" +mkdir -p "$OUTPUT_DIR" + +BROKER_TLS="--tls-cert /opt/mqtt-certs/server.pem --tls-key /opt/mqtt-certs/server.key" +BROKER_QUIC="--quic-host 0.0.0.0:14567" +CA="--ca-cert /opt/mqtt-certs/ca.pem" + +declare -A TRANSPORT_URLS +TRANSPORT_URLS[tcp]="mqtt://${BROKER_IP}:1883" +TRANSPORT_URLS[quic-control]="quic://${BROKER_IP}:14567" +TRANSPORT_URLS[quic-pertopic]="quic://${BROKER_IP}:14567" +TRANSPORT_URLS[quic-perpub]="quic://${BROKER_IP}:14567" + +declare -A TRANSPORT_FLAGS +TRANSPORT_FLAGS[tcp]="" +TRANSPORT_FLAGS[quic-control]="--quic-stream-strategy control-only ${CA}" +TRANSPORT_FLAGS[quic-pertopic]="--quic-stream-strategy per-topic ${CA}" +TRANSPORT_FLAGS[quic-perpub]="--quic-stream-strategy per-publish ${CA}" + +declare -A BROKER_DELIVERY +BROKER_DELIVERY[tcp]="" +BROKER_DELIVERY[quic-control]="--quic-delivery-strategy control-only" +BROKER_DELIVERY[quic-pertopic]="--quic-delivery-strategy per-topic" +BROKER_DELIVERY[quic-perpub]="--quic-delivery-strategy per-publish" + +: "${V3_TRANSPORTS:=tcp quic-control quic-pertopic quic-perpub}" +read -ra TRANSPORTS <<< "$V3_TRANSPORTS" + +CELLS=( + "2 500" "4 500" "16 500" "32 500" + "8 125" "8 250" "8 1000" "8 2000" +) + +start_monitors() { + BROKER_MONITOR_PID=$(ssh_broker "nohup bash /opt/mqtt-lib/experiments/monitor/resource_monitor.sh ${BROKER_PID} \ + > /tmp/monitor.csv 2>&1 & echo \$!") || BROKER_MONITOR_PID="" + PUB_MONITOR_PID=$(ssh_pub "nohup bash /opt/mqtt-lib/experiments/monitor/client_monitor.sh \ + > /tmp/client_monitor.csv 2>&1 & echo \$!") || PUB_MONITOR_PID="" +} + +stop_monitors() { + local output_dir="$1" + local run_label="$2" + ssh_broker "kill ${BROKER_MONITOR_PID}" 2>/dev/null || true + ssh_pub "kill ${PUB_MONITOR_PID}" 2>/dev/null || true + scp -i "$SSH_KEY_PATH" $SSH_OPTS "${SSH_USER}@${BROKER_SSH_IP}:/tmp/monitor.csv" \ + "${output_dir}/${run_label}_broker_resources.csv" 2>/dev/null || true + scp -i "$SSH_KEY_PATH" $SSH_OPTS "${SSH_USER}@${PUB_IP}:/tmp/client_monitor.csv" \ + "${output_dir}/${run_label}_pub_resources.csv" 2>/dev/null || true + BROKER_MONITOR_PID="" + PUB_MONITOR_PID="" +} + +collect_traces() { + local run_label="$1" + local remote_dir="$2" + for csv in messages.csv quinn_stats.csv; do + scp -i "$SSH_KEY_PATH" "${SSH_USER}@${PUB_IP}:${remote_dir}/${csv}" \ + "${OUTPUT_DIR}/${run_label}_${csv}" 2>/dev/null || true + done + ssh_pub "rm -rf ${remote_dir}" 2>/dev/null || true +} + +run_hol_colocated() { + local label="$1" + shift + local bench_args="$*" + echo " running (co-located): ${label}" + ssh_pub "ulimit -n 65536; mqttv5 bench ${bench_args}" \ + > "${OUTPUT_DIR}/${label}.json" 2>/dev/null || true + warn_if_empty "${OUTPUT_DIR}/${label}.json" + echo " saved: ${OUTPUT_DIR}/${label}.json" +} + +for tname in "${TRANSPORTS[@]}"; do + url="${TRANSPORT_URLS[$tname]}" + flags="${TRANSPORT_FLAGS[$tname]}" + delivery="${BROKER_DELIVERY[$tname]}" + + stop_broker 2>/dev/null || true + if ! start_broker "${BROKER_TLS} ${BROKER_QUIC} ${delivery}"; then + echo "WARN: broker start failed for ${tname}, skipping transport" >&2 + continue + fi + + for cell in "${CELLS[@]}"; do + read -r topics rate <<< "$cell" + for loss in "${LOSSES[@]}"; do + label="${tname}_t${topics}_r${rate}_loss${loss}pct" + + done_runs=0 + for run in $(seq 1 "$RUNS_PER_DATAPOINT"); do + f="${OUTPUT_DIR}/${label}_run${run}.json" + if [ -s "$f" ] && [ "$(wc -c < "$f")" -gt 500 ]; then + done_runs=$((done_runs + 1)) + fi + done + if [ "$done_runs" = "$RUNS_PER_DATAPOINT" ]; then + echo "[${EXPERIMENT}] ${label} complete (${done_runs}/${RUNS_PER_DATAPOINT}), skipping" + continue + fi + + apply_netem "$DELAY" "$loss" + echo "[${EXPERIMENT}] ${label} (${done_runs}/${RUNS_PER_DATAPOINT} done)" + + bench_args="--url ${url} ${flags} --mode hol-blocking --topics ${topics} --duration 60 --warmup 5 --payload-size 256 --rate ${rate} --trace-dir /tmp/hol-traces" + + for run in $(seq 1 "$RUNS_PER_DATAPOINT"); do + run_label="${label}_run${run}" + existing="${OUTPUT_DIR}/${run_label}.json" + if [ -s "$existing" ] && [ "$(wc -c < "$existing")" -gt 500 ]; then + echo " skip (exists): ${run_label}" + continue + fi + if [ "$BROKER_FRESH" = "1" ]; then + BROKER_FRESH=0 + elif ! restart_broker; then + echo "WARN: broker restart failed, skipping ${run_label}" >&2 + continue + fi + start_monitors + run_hol_colocated "$run_label" "$bench_args" + stop_monitors "$OUTPUT_DIR" "$run_label" + collect_traces "$run_label" "/tmp/hol-traces" + sleep 5 + done + + clear_netem + done + done +done + +stop_broker +echo "experiment ${EXPERIMENT} complete (group ${GROUP})" diff --git a/publications/comnet/experiments/parallel/03_watched.sh b/publications/comnet/experiments/parallel/03_watched.sh new file mode 100644 index 00000000..00456ac3 --- /dev/null +++ b/publications/comnet/experiments/parallel/03_watched.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +EXPERIMENT="03_throughput_under_loss" +LOSSES=(0 5) +DELAY=10 +QOS_LEVELS=(0 1) +STRATEGIES=("per-topic") +RUNS_PER_DATAPOINT=2 + +RESULTS_DIR="${ROOT_DIR}/results-watched" +mkdir -p "$RESULTS_DIR" + +BENCH_COMMON="--mode throughput --duration 30 --warmup 5 --payload-size 256 --publishers 16 --subscribers 8 --inflight 64" + +start_broker "--tls-cert /opt/mqtt-certs/server.pem --tls-key /opt/mqtt-certs/server.key --quic-host 0.0.0.0:14567" + +for qos in "${QOS_LEVELS[@]}"; do + for loss in "${LOSSES[@]}"; do + apply_netem "$DELAY" "$loss" + + label="tcp_qos${qos}_loss${loss}pct" + echo "[${EXPERIMENT}] ${label}" + run_monitored_split "$EXPERIMENT" "$label" \ + "--url mqtt://${BROKER_IP}:1883 ${BENCH_COMMON} --qos ${qos}" + + for strategy in "${STRATEGIES[@]}"; do + label="quic-${strategy}_qos${qos}_loss${loss}pct" + echo "[${EXPERIMENT}] ${label}" + run_monitored_split "$EXPERIMENT" "$label" \ + "--url quic://${BROKER_IP}:14567 --ca-cert /opt/mqtt-certs/ca.pem --quic-stream-strategy ${strategy} ${BENCH_COMMON} --qos ${qos}" + done + + clear_netem + done +done + +stop_broker +echo "watched slice complete (group ${GROUP})" diff --git a/publications/comnet/experiments/parallel/03b_tls_throughput_v5.sh b/publications/comnet/experiments/parallel/03b_tls_throughput_v5.sh new file mode 100644 index 00000000..489ba634 --- /dev/null +++ b/publications/comnet/experiments/parallel/03b_tls_throughput_v5.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +EXPERIMENT="03_throughput_under_loss" +LOSSES=(${LOSSES_OVERRIDE:-0 1 2 5 10}) +DELAY=10 +QOS_LEVELS=(${QOS_OVERRIDE:-0 1}) +RUNS_PER_DATAPOINT=15 + +RESULTS_DIR="${ROOT_DIR}/results-v5" +OUTPUT_DIR="${RESULTS_DIR}/${EXPERIMENT}" +mkdir -p "$OUTPUT_DIR" + +run_tls_cell() { + local label="$1" + shift + local bench_args="$*" + for run in $(seq 1 "$RUNS_PER_DATAPOINT"); do + local run_label="${label}_run${run}" + local f="${OUTPUT_DIR}/${run_label}.json" + if [ -f "$f" ] && [ "$(wc -c < "$f")" -gt 300 ]; then + continue + fi + if [ "$BROKER_FRESH" = "1" ]; then + BROKER_FRESH=0 + elif ! restart_broker; then + echo "WARN: broker restart failed, skipping ${run_label}" >&2 + continue + fi + start_monitors + run_bench_split "$EXPERIMENT" "$run_label" "$bench_args" + stop_monitors "$OUTPUT_DIR" "$run_label" + sleep 5 + done +} + +start_broker "--tls-cert /opt/mqtt-certs/server.pem --tls-key /opt/mqtt-certs/server.key --quic-host 0.0.0.0:14567" + +for qos in "${QOS_LEVELS[@]}"; do + for loss in "${LOSSES[@]}"; do + apply_netem "$DELAY" "$loss" + label="tls_qos${qos}_loss${loss}pct" + echo "[${EXPERIMENT}] ${label}" + run_tls_cell "$label" \ + "--url mqtts://${BROKER_IP}:8883 --ca-cert /opt/mqtt-certs/ca.pem --mode throughput --duration 60 --warmup 5 --payload-size 256 --qos ${qos} --publishers 16 --subscribers 8 --inflight 64" + clear_netem + done +done + +stop_broker +echo "experiment ${EXPERIMENT} TLS arm complete (group ${GROUP})" diff --git a/publications/comnet/experiments/parallel/03c_offload_ablation.sh b/publications/comnet/experiments/parallel/03c_offload_ablation.sh new file mode 100644 index 00000000..6e583eba --- /dev/null +++ b/publications/comnet/experiments/parallel/03c_offload_ablation.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +EXPERIMENT="03c_offload_ablation_g${GROUP}" +LOSSES=(${LOSSES_OVERRIDE:-0 1 2 5 10}) +DELAY=10 +RUNS_PER_DATAPOINT="${RUNS_OVERRIDE:-5}" + +RESULTS_DIR="${ROOT_DIR}/results-v5" +OUTPUT_DIR="${RESULTS_DIR}/${EXPERIMENT}" +mkdir -p "$OUTPUT_DIR" + +DEV_CMD='DEV=$(ip route show default | awk "{print \$5}" | head -1)' + +set_offload() { + local mode="$1" + if [ "$mode" = "off" ]; then + ssh_broker "${DEV_CMD}; for f in gso tso gro lro tx-udp-segmentation rx-gro-list; do sudo ethtool -K \$DEV \$f off 2>/dev/null || true; done; echo '--- ethtool -k after off ---'; ethtool -k \$DEV | grep -E 'tcp-segmentation|generic-segmentation|generic-receive|large-receive|udp-segmentation'" + else + ssh_broker "${DEV_CMD}; for f in gso tso gro; do sudo ethtool -K \$DEV \$f on 2>/dev/null || true; done; echo '--- ethtool -k after on ---'; ethtool -k \$DEV | grep -E 'tcp-segmentation|generic-segmentation|generic-receive|large-receive|udp-segmentation'" + fi +} + +qdisc_snapshot() { ssh_broker "${DEV_CMD}; tc -s qdisc show dev \$DEV"; } + +run_ablation_cell() { + local label="$1" + shift + local bench_args="$*" + for run in $(seq 1 "$RUNS_PER_DATAPOINT"); do + local rl="${label}_run${run}" + local f="${OUTPUT_DIR}/${rl}.json" + if [ -s "$f" ] && [ "$(wc -c < "$f")" -gt 300 ]; then + continue + fi + if [ "$BROKER_FRESH" = "1" ]; then + BROKER_FRESH=0 + elif ! restart_broker; then + echo "WARN: broker restart failed, skipping ${rl}" >&2 + continue + fi + start_monitors + qdisc_snapshot > "${OUTPUT_DIR}/${rl}_qdisc_before.txt" 2>/dev/null || true + run_bench_split "$EXPERIMENT" "$rl" "$bench_args" + qdisc_snapshot > "${OUTPUT_DIR}/${rl}_qdisc_after.txt" 2>/dev/null || true + stop_monitors "$OUTPUT_DIR" "$rl" + sleep 5 + done +} + +BENCH_COMMON="--mode throughput --duration 60 --warmup 5 --payload-size 256 --qos 0 --publishers 16 --subscribers 8 --inflight 64" + +for offload in ${OFFLOAD_OVERRIDE:-on off}; do + broker_flags="--tls-cert /opt/mqtt-certs/server.pem --tls-key /opt/mqtt-certs/server.key --quic-host 0.0.0.0:14567" + if [ "$offload" = "off" ]; then + broker_flags="${broker_flags} --quic-disable-offload" + fi + stop_broker 2>/dev/null || true + echo "[${EXPERIMENT}] setting NIC offload ${offload} on broker" + set_offload "$offload" | tee "${OUTPUT_DIR}/ethtool_${offload}.txt" + if ! start_broker "$broker_flags"; then + echo "ERROR: broker failed to start (offload ${offload})" >&2 + continue + fi + for loss in "${LOSSES[@]}"; do + apply_netem "$DELAY" "$loss" + echo "[${EXPERIMENT}] tls offload=${offload} loss=${loss}%" + run_ablation_cell "tls_offload-${offload}_loss${loss}pct" \ + "--url mqtts://${BROKER_IP}:8883 --ca-cert /opt/mqtt-certs/ca.pem ${BENCH_COMMON}" + echo "[${EXPERIMENT}] quic-control offload=${offload} loss=${loss}%" + run_ablation_cell "quic-control_offload-${offload}_loss${loss}pct" \ + "--url quic://${BROKER_IP}:14567 --ca-cert /opt/mqtt-certs/ca.pem --quic-stream-strategy control-only ${BENCH_COMMON}" + clear_netem + done +done + +stop_broker +echo "experiment ${EXPERIMENT} complete (group ${GROUP})" diff --git a/publications/comnet/experiments/parallel/03d_offload_lowload.sh b/publications/comnet/experiments/parallel/03d_offload_lowload.sh new file mode 100644 index 00000000..e09df480 --- /dev/null +++ b/publications/comnet/experiments/parallel/03d_offload_lowload.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +EXPERIMENT="03d_offload_lowload_g${GROUP}" +LOSSES=(${LOSSES_OVERRIDE:-0 1 2 5 10}) +DELAY=10 +RUNS_PER_DATAPOINT="${RUNS_OVERRIDE:-5}" + +RESULTS_DIR="${ROOT_DIR}/results-v5" +OUTPUT_DIR="${RESULTS_DIR}/${EXPERIMENT}" +mkdir -p "$OUTPUT_DIR" + +DEV_CMD='DEV=$(ip route show default | awk "{print \$5}" | head -1)' + +set_offload() { + local mode="$1" + if [ "$mode" = "off" ]; then + ssh_broker "${DEV_CMD}; for f in gso tso gro lro tx-udp-segmentation rx-gro-list; do sudo ethtool -K \$DEV \$f off 2>/dev/null || true; done; echo '--- ethtool -k after off ---'; ethtool -k \$DEV | grep -E 'tcp-segmentation|generic-segmentation|generic-receive|large-receive|udp-segmentation'" + else + ssh_broker "${DEV_CMD}; for f in gso tso gro; do sudo ethtool -K \$DEV \$f on 2>/dev/null || true; done; echo '--- ethtool -k after on ---'; ethtool -k \$DEV | grep -E 'tcp-segmentation|generic-segmentation|generic-receive|large-receive|udp-segmentation'" + fi +} + +qdisc_snapshot() { ssh_broker "${DEV_CMD}; tc -s qdisc show dev \$DEV"; } + +run_ablation_cell() { + local label="$1" + shift + local bench_args="$*" + for run in $(seq 1 "$RUNS_PER_DATAPOINT"); do + local rl="${label}_run${run}" + local f="${OUTPUT_DIR}/${rl}.json" + if [ -s "$f" ] && [ "$(wc -c < "$f")" -gt 300 ]; then + continue + fi + if [ "$BROKER_FRESH" = "1" ]; then + BROKER_FRESH=0 + elif ! restart_broker; then + echo "WARN: broker restart failed, skipping ${rl}" >&2 + continue + fi + start_monitors + qdisc_snapshot > "${OUTPUT_DIR}/${rl}_qdisc_before.txt" 2>/dev/null || true + run_bench_split "$EXPERIMENT" "$rl" "$bench_args" + qdisc_snapshot > "${OUTPUT_DIR}/${rl}_qdisc_after.txt" 2>/dev/null || true + stop_monitors "$OUTPUT_DIR" "$rl" + sleep 5 + done +} + +BENCH_COMMON="--mode throughput --duration 60 --warmup 5 --payload-size 256 --qos 0 --publishers 1 --subscribers 1 --inflight 64" + +for offload in ${OFFLOAD_OVERRIDE:-on off}; do + broker_flags="--tls-cert /opt/mqtt-certs/server.pem --tls-key /opt/mqtt-certs/server.key --quic-host 0.0.0.0:14567" + if [ "$offload" = "off" ]; then + broker_flags="${broker_flags} --quic-disable-offload" + fi + stop_broker 2>/dev/null || true + echo "[${EXPERIMENT}] setting NIC offload ${offload} on broker" + set_offload "$offload" | tee "${OUTPUT_DIR}/ethtool_${offload}.txt" + if ! start_broker "$broker_flags"; then + echo "ERROR: broker failed to start (offload ${offload})" >&2 + continue + fi + for loss in "${LOSSES[@]}"; do + apply_netem "$DELAY" "$loss" + echo "[${EXPERIMENT}] tls offload=${offload} loss=${loss}%" + run_ablation_cell "tls_offload-${offload}_loss${loss}pct" \ + "--url mqtts://${BROKER_IP}:8883 --ca-cert /opt/mqtt-certs/ca.pem ${BENCH_COMMON}" + echo "[${EXPERIMENT}] quic-control offload=${offload} loss=${loss}%" + run_ablation_cell "quic-control_offload-${offload}_loss${loss}pct" \ + "--url quic://${BROKER_IP}:14567 --ca-cert /opt/mqtt-certs/ca.pem --quic-stream-strategy control-only ${BENCH_COMMON}" + clear_netem + done +done + +stop_broker +echo "experiment ${EXPERIMENT} complete (group ${GROUP})" diff --git a/publications/comnet/experiments/parallel/03e_infra.sh b/publications/comnet/experiments/parallel/03e_infra.sh new file mode 100755 index 00000000..ccab3cce --- /dev/null +++ b/publications/comnet/experiments/parallel/03e_infra.sh @@ -0,0 +1,226 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +ACTION="${1:?usage: GROUP=G $0 up|tools|guest|health|smoke|hop|route-off|route-on|down|down-shared}" + +ZONE="us-west1-b" +NETWORK="default" +ROUTER="exp3-router-${GROUP}" +BROKER_VM="mqoq-broker-${GROUP}" +BROKER_TAG="exp3-brk-${GROUP}" +IG="exp3-ig-${GROUP}" +BACKEND="exp3-bs-${GROUP}" +RULE="exp3-fr-${GROUP}" +HEALTH="exp3-hc" +FIREWALL="exp3-allow-hc" +BPFTRACE_URL="https://github.com/bpftrace/bpftrace/releases/download/v0.27.0/bpftrace-x86_64" +: "${PUB_INTERNAL_IP:?Set PUB_INTERNAL_IP in group${GROUP}.env}" +: "${SUB_INTERNAL_IP:?Set SUB_INTERNAL_IP in group${GROUP}.env}" + +exists() { gc "$@" --format='value(name)' >/dev/null 2>&1; } + +pbr_name() { echo "exp3-g${GROUP}-${1//./-}"; } + +router_internal_ip() { + gc compute instances describe "$ROUTER" --zone="$ZONE" --format='value(networkInterfaces[0].networkIP)' +} + +clear_broker_qdisc() { + ssh_broker "sudo bash ${REMOTE_EXPERIMENTS_DIR}/netem/clear.sh" +} + +up() { + local image + image=$(gc compute disks describe "$(gc compute instances describe "$BROKER_VM" --zone="$ZONE" \ + --format='value(disks[0].source.basename())')" --zone="$ZONE" --format='value(sourceImage)') + echo "router image: ${image}" + + exists compute instances describe "$ROUTER" --zone="$ZONE" || \ + gc compute instances create "$ROUTER" --zone="$ZONE" --machine-type=n2-standard-4 --can-ip-forward \ + --no-address --image="$image" --subnet="$NETWORK" --tags=exp3-router + exists compute firewall-rules describe "$FIREWALL" || \ + gc compute firewall-rules create "$FIREWALL" --network="$NETWORK" --allow=tcp:22 \ + --source-ranges=35.191.0.0/16,130.211.0.0/22 --target-tags=exp3-router + exists compute health-checks describe "$HEALTH" --region="$GCP_REGION" || \ + gc compute health-checks create tcp "$HEALTH" --region="$GCP_REGION" --port=22 + exists compute instance-groups unmanaged describe "$IG" --zone="$ZONE" || \ + gc compute instance-groups unmanaged create "$IG" --zone="$ZONE" + gc compute instance-groups unmanaged list-instances "$IG" --zone="$ZONE" \ + --format='value(instance.basename())' | grep -qx "$ROUTER" || \ + gc compute instance-groups unmanaged add-instances "$IG" --zone="$ZONE" --instances="$ROUTER" + exists compute backend-services describe "$BACKEND" --region="$GCP_REGION" || \ + gc compute backend-services create "$BACKEND" --region="$GCP_REGION" --load-balancing-scheme=INTERNAL \ + --protocol=UNSPECIFIED --health-checks="$HEALTH" --health-checks-region="$GCP_REGION" + gc compute backend-services describe "$BACKEND" --region="$GCP_REGION" \ + --format='value(backends[].group)' | grep -q "instanceGroups/${IG}" || \ + gc compute backend-services add-backend "$BACKEND" --region="$GCP_REGION" \ + --instance-group="$IG" --instance-group-zone="$ZONE" + exists compute forwarding-rules describe "$RULE" --region="$GCP_REGION" || \ + gc compute forwarding-rules create "$RULE" --region="$GCP_REGION" --load-balancing-scheme=INTERNAL \ + --network="$NETWORK" --subnet="$NETWORK" --ip-protocol=L3_DEFAULT --ports=ALL --backend-service="$BACKEND" + + local ilb dst + ilb=$(gc compute forwarding-rules describe "$RULE" --region="$GCP_REGION" --format='value(IPAddress)') + echo "ilb next hop: ${ilb}" + for dst in "$PUB_INTERNAL_IP" "$SUB_INTERNAL_IP"; do + exists network-connectivity policy-based-routes describe "$(pbr_name "$dst")" || \ + gc network-connectivity policy-based-routes create "$(pbr_name "$dst")" \ + --network="projects/${GCP_PROJECT}/global/networks/${NETWORK}" \ + --source-range="${BROKER_IP}/32" --destination-range="${dst}/32" \ + --ip-protocol=ALL --protocol-version=IPV4 --next-hop-ilb-ip="$ilb" \ + --tags="$BROKER_TAG" --priority=100 + done + echo "router internal ip: $(router_internal_ip) (set ROUTER_IP in group${GROUP}.env, then run tools, guest, route-on)" +} + +extract_bpftrace() { + echo "test -x /opt/bpftrace/AppRun || { cd /tmp && chmod 755 bpftrace.appimage && rm -rf squashfs-root && ./bpftrace.appimage --appimage-extract >/dev/null && sudo rm -rf /opt/bpftrace && sudo mv /tmp/squashfs-root /opt/bpftrace; }" +} + +tools() { + local install='sudo tee /usr/local/bin/bpftrace >/dev/null <<< $'"'"'#!/bin/sh\nexec /opt/bpftrace/AppRun "$@"'"'"' && sudo chmod 755 /usr/local/bin/bpftrace && sudo modprobe sch_netem && sudo modprobe sch_tbf' + ssh_broker "test -s /tmp/bpftrace.appimage || curl -fsSL -o /tmp/bpftrace.appimage ${BPFTRACE_URL}" + ssh_broker "$(extract_bpftrace) && ${install}" + if ! ssh_router "test -x /opt/bpftrace/AppRun"; then + ssh -A -i "$SSH_KEY_PATH" $SSH_OPTS "${SSH_USER}@${BROKER_SSH_IP}" \ + "scp -q -o StrictHostKeyChecking=no /tmp/bpftrace.appimage ${SSH_USER}@${ROUTER_IP}:/tmp/bpftrace.appimage" + ssh_router "$(extract_bpftrace)" + fi + ssh_router "$install" + ssh_broker "sudo bpftrace --version; uname -r" + ssh_router "sudo bpftrace --version; uname -r" +} + +guest() { + COPYFILE_DISABLE=1 tar --no-xattrs -C "$ROOT_DIR" -czf - netem monitor | \ + ssh_router "sudo mkdir -p ${REMOTE_EXPERIMENTS_DIR} && sudo chown \$(id -u):\$(id -g) ${REMOTE_EXPERIMENTS_DIR} && tar -xzmf - -C ${REMOTE_EXPERIMENTS_DIR}" + ssh_router "sudo bash ${REMOTE_EXPERIMENTS_DIR}/netem/router_setup.sh ${BROKER_IP} ${PUB_INTERNAL_IP} ${SUB_INTERNAL_IP} ${ROUTER_GUARD:-0}" +} + +health() { + local state + state=$(ilb_health) + echo "ilb backend health: ${state}" + [ "$state" = "HEALTHY" ] +} + +ping_loss() { + ssh_broker "ping -q -c ${2:-500} -i 0.01 $1" | sed -n 's/.* \([0-9.]*\)% packet loss.*/\1/p' +} + +smoke() { + local path dst loss + health + clear_broker_qdisc + ssh_router "sudo bash ${REMOTE_EXPERIMENTS_DIR}/netem/router_loss.sh 0" + path=$(router_path_state) + echo "router path: ${path}" + [ "$path" = "on" ] || { echo "SMOKE FAIL: broker traffic is not crossing the router" >&2; return 1; } + for dst in "$SUB_INTERNAL_IP" "$PUB_INTERNAL_IP"; do + loss=$(ping_loss "$dst") || loss="" + echo "broker -> ${dst} through router: ${loss:-no reply}% loss" + [ "$loss" = "0" ] || { echo "SMOKE FAIL: packets lost or not delivered to ${dst}" >&2; return 1; } + done + echo "SMOKE PASS (ICMP; loaded TCP/UDP accounting is gated per run by the calib phase)" +} + +wait_for_path() { + local want="$1" attempt state + for attempt in $(seq 1 30); do + state=$(router_path_state) + if [ "$state" = "$want" ]; then + echo "router path ${want} (attempt ${attempt})" + return 0 + fi + sleep 10 + done + echo "router path did not become ${want} (last: ${state})" >&2 + return 1 +} + +route_off() { + gc compute instances remove-tags "$BROKER_VM" --zone="$ZONE" --tags="$BROKER_TAG" + wait_for_path off +} + +route_on() { + gc compute instances add-tags "$BROKER_VM" --zone="$ZONE" --tags="$BROKER_TAG" + wait_for_path on +} + +median_rtt_ms() { + ssh_broker "ping -c 1000 -i 0.005 $1" | sed -n 's/.*time=\([0-9.]*\) ms/\1/p' | sort -n | \ + awk '{a[NR] = $1} END { if (NR == 0) exit 1; print a[int((NR + 1) / 2)] }' +} + +hop() { + local with without + clear_broker_qdisc + ssh_router "sudo bash ${REMOTE_EXPERIMENTS_DIR}/netem/router_loss.sh 0" + wait_for_path on + with=$(median_rtt_ms "$SUB_INTERNAL_IP") + trap 'route_on' EXIT + route_off + without=$(median_rtt_ms "$SUB_INTERNAL_IP") + trap - EXIT + route_on + if ! awk -v w="$with" -v o="$without" 'BEGIN { exit !(w > o && o > 0) }'; then + echo "HOP FAIL: via router ${with} ms is not above direct ${without} ms" >&2 + return 1 + fi + awk -v w="$with" -v o="$without" -v g="$GROUP" \ + 'BEGIN { printf "group %s median rtt via router %.3f ms, direct %.3f ms, ROUTER_HOP_US=%d\n", g, w, o, (w - o) * 1000 + 0.5 }' +} + +down() { + local dst leftover="" + clear_broker_qdisc || true + gc compute instances remove-tags "$BROKER_VM" --zone="$ZONE" --tags="$BROKER_TAG" || true + for dst in "$PUB_INTERNAL_IP" "$SUB_INTERNAL_IP"; do + gc network-connectivity policy-based-routes delete "$(pbr_name "$dst")" || true + done + gc compute forwarding-rules delete "$RULE" --region="$GCP_REGION" || true + gc compute backend-services delete "$BACKEND" --region="$GCP_REGION" || true + gc compute instance-groups unmanaged delete "$IG" --zone="$ZONE" || true + gc compute instances delete "$ROUTER" --zone="$ZONE" || true + for dst in "$PUB_INTERNAL_IP" "$SUB_INTERNAL_IP"; do + exists network-connectivity policy-based-routes describe "$(pbr_name "$dst")" && leftover+=" $(pbr_name "$dst")" + done + exists compute forwarding-rules describe "$RULE" --region="$GCP_REGION" && leftover+=" ${RULE}" + exists compute backend-services describe "$BACKEND" --region="$GCP_REGION" && leftover+=" ${BACKEND}" + exists compute instance-groups unmanaged describe "$IG" --zone="$ZONE" && leftover+=" ${IG}" + exists compute instances describe "$ROUTER" --zone="$ZONE" && leftover+=" ${ROUTER}" + if [ -n "$leftover" ]; then + echo "TEARDOWN INCOMPLETE:${leftover}" >&2 + return 1 + fi + echo "group ${GROUP} torn down; shared ${HEALTH} and ${FIREWALL} remain until: GROUP=${GROUP} $0 down-shared" +} + +down_shared() { + gc compute health-checks delete "$HEALTH" --region="$GCP_REGION" || true + gc compute firewall-rules delete "$FIREWALL" || true + local leftover="" + exists compute health-checks describe "$HEALTH" --region="$GCP_REGION" && leftover+=" ${HEALTH}" + exists compute firewall-rules describe "$FIREWALL" && leftover+=" ${FIREWALL}" + if [ -n "$leftover" ]; then + echo "TEARDOWN INCOMPLETE:${leftover}" >&2 + return 1 + fi + echo "shared resources removed" +} + +case "$ACTION" in + up) up ;; + tools) tools ;; + guest) guest ;; + health) health ;; + smoke) smoke ;; + hop) hop ;; + route-off) route_off ;; + route-on) route_on ;; + down) down ;; + down-shared) down_shared ;; + *) echo "unknown action ${ACTION}" >&2; exit 1 ;; +esac diff --git a/publications/comnet/experiments/parallel/03e_plan.py b/publications/comnet/experiments/parallel/03e_plan.py new file mode 100644 index 00000000..f06b16e0 --- /dev/null +++ b/publications/comnet/experiments/parallel/03e_plan.py @@ -0,0 +1,146 @@ +import argparse +import csv +import random +import sys +from pathlib import Path + +LOSSES = [0, 1, 2, 5, 10] +SWEEP_CONFIGS = ["tcp", "tls", "quic-main", "quic-main-ppub", "quic-main-ptopic", "quic-ctl", "quic-ppub"] +LEGACY_CONFIGS = ["tcp", "tls", "quic-main"] +HOL_CONFIGS = ["tcp", "quic-ctl", "quic-ptopic", "quic-ppub"] +FIELDS = ["order", "phase", "mode", "config", "loss", "run", "workload", "router_probe", "broker_probe", "rate"] +CAPPED_CONFIGS = ["quic-ppub", "quic-main-ppub", "quic-ctl"] +CAPPED_RATES = [1250, 2500, 5000, 10000, 20000] +PACED_RATES = [2500, 20000, 0] + + +def row(phase, mode, config, loss, run, workload="tput", router_probe=0, broker_probe=0, rate=0): + return { + "phase": phase, "mode": mode, "config": config, "loss": loss, "run": run, "workload": workload, + "router_probe": router_probe, "broker_probe": broker_probe, "rate": rate, + } + + +def calibration(phase): + mode_runs = {"calib": ["legacy-calib", "single"], "calib-direct": ["single"]}[phase] + return [row(phase, mode, config, 0, run) for run in (1, 2, 3) for mode in mode_runs for config in LEGACY_CONFIGS] + + +def accuracy(rng): + rows = [row("accuracy", "single", config, loss, 1, router_probe=1) + for loss in (1, 5, 10) for config in SWEEP_CONFIGS] + rows += [row("accuracy", "legacy", config, 10, 1, broker_probe=1) for config in LEGACY_CONFIGS] + rng.shuffle(rows) + return rows + + +def main_sweep(rng): + rows = [] + for run in range(1, 6): + losses = LOSSES[:] + rng.shuffle(losses) + for loss in losses: + block = [row("main", mode, config, loss, run, router_probe=int(run == 1)) + for mode in ("single", "router") for config in SWEEP_CONFIGS] + if run <= 3 and loss > 0: + block += [row("main", "legacy", config, loss, run) for config in LEGACY_CONFIGS] + rng.shuffle(block) + rows += block + return rows + + +def router_check(rng): + rows = [row("routercheck", "router", config, loss, 1, router_probe=1) + for loss in (0, 1) for config in LEGACY_CONFIGS] + rng.shuffle(rows) + return rows + + +def capped(rng): + rows = [] + for run in (1, 2, 3): + block = [row("capped", "router", config, loss, run, rate=rate) + for config in CAPPED_CONFIGS for loss in (0, 1) for rate in CAPPED_RATES] + block += [row("capped", "router", config, loss, run, rate=0) for config in CAPPED_CONFIGS for loss in (0, 1)] + rng.shuffle(block) + rows += block + return rows + + +def paced(rng): + rows = [] + for run in (1, 2): + block = [row("paced", "router", config, loss, run, rate=rate) + for config in LEGACY_CONFIGS for loss in (1, 10) for rate in PACED_RATES] + rng.shuffle(block) + rows += block + return rows + + +def buildcheck(phase, block, rng): + rows = [row(phase, "router", config, 10, block, rate=0) for config in LEGACY_CONFIGS] + rng.shuffle(rows) + return rows + + +def crosscheck(rng): + rows = [] + for run in (1, 2, 3): + block = [row("crosscheck", "tbf", config, loss, run, broker_probe=int(run == 3)) + for loss in (0, 1, 5, 10) for config in LEGACY_CONFIGS] + rng.shuffle(block) + rows += block + return rows + + +def hol(rng): + rows = [] + for run in range(1, 6): + block = [row("hol", "single", config, loss, run, workload="hol") for loss in (0, 5) for config in HOL_CONFIGS] + rng.shuffle(block) + rows += block + return rows + + +def build(phase, group, block): + rng = random.Random(f"03e-{phase}-g{group}-b{block}") + builders = { + "calib": lambda: calibration("calib"), + "calib-direct": lambda: calibration("calib-direct"), + "accuracy": lambda: accuracy(rng), + "main": lambda: main_sweep(rng), + "crosscheck": lambda: crosscheck(rng), + "routercheck": lambda: router_check(rng), + "capped": lambda: capped(rng), + "paced": lambda: paced(rng), + "hol": lambda: hol(rng), + "bcfleet": lambda: buildcheck("bcfleet", block, rng), + "bclater": lambda: buildcheck("bclater", block, rng), + } + rows = builders[phase]() + for index, entry in enumerate(rows, start=1): + entry["order"] = index + return rows + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--group", type=int, required=True) + parser.add_argument("--phase", required=True, + choices=["calib", "calib-direct", "accuracy", "routercheck", "main", "crosscheck", "hol", "capped", "paced", "bcfleet", "bclater"]) + parser.add_argument("--block", type=int, default=1) + parser.add_argument("--out", type=Path, required=True) + args = parser.parse_args() + if args.out.exists(): + print(f"plan exists, keeping it: {args.out}", file=sys.stderr) + return + args.out.parent.mkdir(parents=True, exist_ok=True) + with open(args.out, "w", newline="") as handle: + writer = csv.DictWriter(handle, fieldnames=FIELDS, lineterminator="\n") + writer.writeheader() + writer.writerows(build(args.phase, args.group, args.block)) + print(f"wrote {args.out}") + + +if __name__ == "__main__": + main() diff --git a/publications/comnet/experiments/parallel/03e_single_segment.sh b/publications/comnet/experiments/parallel/03e_single_segment.sh new file mode 100755 index 00000000..ecc57095 --- /dev/null +++ b/publications/comnet/experiments/parallel/03e_single_segment.sh @@ -0,0 +1,424 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +: "${PHASE:?Set PHASE=calib|calib-direct|accuracy|routercheck|main|crosscheck|hol|capped|paced|bcfleet|bclater}" +: "${ROUTER_IP:?Set ROUTER_IP in group${GROUP}.env}" +: "${ROUTER_HOP_US:?Set ROUTER_HOP_US (measured router one-way delay, microseconds) in group${GROUP}.env}" +: "${PUB_INTERNAL_IP:?Set PUB_INTERNAL_IP in group${GROUP}.env}" +: "${SUB_INTERNAL_IP:?Set SUB_INTERNAL_IP in group${GROUP}.env}" +ROUTER_GUARD="${ROUTER_GUARD:-0}" +if [ "$ROUTER_HOP_US" -lt 0 ] || [ "$ROUTER_HOP_US" -ge 10000 ]; then + echo "ROUTER_HOP_US=${ROUTER_HOP_US} is outside [0, 10000)" >&2 + exit 1 +fi + +if [ "$PHASE" = "capped" ]; then + EXPERIMENT="03f_capped_g${GROUP}" +elif [ "$PHASE" = "paced" ]; then + EXPERIMENT="03g_paced_g${GROUP}" +elif [ "$PHASE" = "bcfleet" ] || [ "$PHASE" = "bclater" ]; then + EXPERIMENT="03h_buildcheck_g${GROUP}" +else + EXPERIMENT="03e_single_segment_g${GROUP}" +fi +RESULTS_DIR="${ROOT_DIR}/results-v5" +OUTPUT_DIR="${RESULTS_DIR}/${EXPERIMENT}" +PLAN="${OUTPUT_DIR}/plan_${PHASE}${BLOCK:+_b${BLOCK}}.csv" +MANIFEST="${OUTPUT_DIR}/manifest.csv" +REMOTE_DIR="$REMOTE_EXPERIMENTS_DIR" +mkdir -p "$OUTPUT_DIR" + +if [ "$PHASE" = "calib-direct" ]; then + EXPECTED_PATH="off" + HOP_US=0 +else + EXPECTED_PATH="on" + HOP_US="$ROUTER_HOP_US" +fi + +CA="--ca-cert /opt/mqtt-certs/ca.pem" +BROKER_BASE="--tls-cert /opt/mqtt-certs/server.pem --tls-key /opt/mqtt-certs/server.key --quic-host 0.0.0.0:14567" +TPUT_ARGS="--mode throughput --duration 60 --warmup 5 --payload-size 256 --qos 0 --publishers 16 --subscribers 8 --inflight 64" +HOL_ARGS="--mode hol-blocking --topics 8 --duration 60 --warmup 5 --payload-size 256 --rate 500 --trace-dir /tmp/hol-traces" +QUIC_URL="--url quic://${BROKER_IP}:14567 ${CA}" + +declare -A CLIENT_ARGS=( + [tcp]="--url mqtt://${BROKER_IP}:1883" + [tls]="--url mqtts://${BROKER_IP}:8883 ${CA}" + [quic-main]="${QUIC_URL} --quic-stream-strategy control-only" + [quic-main-ppub]="${QUIC_URL} --quic-stream-strategy per-publish" + [quic-main-ptopic]="${QUIC_URL} --quic-stream-strategy per-topic" + [quic-ctl]="${QUIC_URL} --quic-stream-strategy control-only" + [quic-ptopic]="${QUIC_URL} --quic-stream-strategy per-topic" + [quic-ppub]="${QUIC_URL} --quic-stream-strategy per-publish" +) +declare -A BROKER_EXTRA=( + [tcp]="" + [tls]="" + [quic-main]="" + [quic-main-ppub]="" + [quic-main-ptopic]="" + [quic-ctl]="--quic-delivery-strategy control-only" + [quic-ptopic]="--quic-delivery-strategy per-topic" + [quic-ppub]="--quic-delivery-strategy per-publish" +) +declare -A BASE_DELAY_US=([tput]=10000 [hol]=25000) +RERUN_SHA="7c65659d5e768d8a38f251bfbdb96c0ee9bdcaa79e2fd5eda36ac4f644377a07" +FOLLOWUP_SHA="f7f2afe469b3328b0b4929dfc14031c47d889b655c9c04f9956bc86912f734d7" +rated_phase() { + case "$1" in + capped|paced|bcfleet|bclater) return 0 ;; + *) return 1 ;; + esac +} +if [ "$PHASE" = "bcfleet" ]; then + EXPECTED_SHA="$RERUN_SHA" +else + EXPECTED_SHA="$FOLLOWUP_SHA" +fi +if rated_phase "$PHASE"; then + MANIFEST_HEADER="label,order,phase,mode,config,loss,run,workload,router_probe,broker_probe,rate,delay_us,router_hop_us,router_guard,path_state,ilb_health,ilb_health_after,started,finished,binary_sha,broker_flags,bench_args" +else + EXPECTED_SHA="$RERUN_SHA" + MANIFEST_HEADER="label,order,phase,mode,config,loss,run,workload,router_probe,broker_probe,delay_us,router_hop_us,router_guard,path_state,ilb_health,ilb_health_after,started,finished,broker_flags,bench_args" +fi +SKIPPED=0 + +scp_router() { + scp -q -i "$SSH_KEY_PATH" -o StrictHostKeyChecking=no -o ProxyJump="${SSH_USER}@${BROKER_SSH_IP}" \ + "${SSH_USER}@${ROUTER_IP}:$1" "$2" +} + +scp_broker() { + scp -q -i "$SSH_KEY_PATH" -o StrictHostKeyChecking=no "${SSH_USER}@${BROKER_SSH_IP}:$1" "$2" +} + +deploy_scripts() { + local host + for host in ssh_broker ssh_pub ssh_sub ssh_router; do + COPYFILE_DISABLE=1 tar --no-xattrs -C "$ROOT_DIR" -czf - netem monitor | \ + "$host" "sudo mkdir -p ${REMOTE_DIR} && sudo chown \$(id -u):\$(id -g) ${REMOTE_DIR} && tar -xzmf - -C ${REMOTE_DIR}" + done +} + +stop_leftover_probes() { + ssh_broker "sudo pkill -INT -x bpftrace; for _ in \$(seq 1 20); do pgrep -x bpftrace >/dev/null || break; sleep 0.5; done; ! pgrep -x bpftrace" || return 1 + ssh_router "sudo pkill -INT -x bpftrace; for _ in \$(seq 1 20); do pgrep -x bpftrace >/dev/null || break; sleep 0.5; done; ! pgrep -x bpftrace" || return 1 +} + +reset_impairment() { + ssh_broker "sudo bash ${REMOTE_DIR}/netem/clear.sh" >/dev/null || return 1 + ssh_router "sudo bash ${REMOTE_DIR}/netem/router_loss.sh 0" >/dev/null || return 1 +} + +ilb_healthy() { + local state + state=$(ilb_health) + echo "$state" + [ "$state" = "HEALTHY" ] +} + +preflight_step() { + local report="$1" name="$2" + shift 2 + echo "=== ${name} ===" >> "$report" + if ! "$@" >> "$report" 2>&1; then + echo "PREFLIGHT FAILED at '${name}', see ${report}" >&2 + tail -n 20 "$report" >&2 + exit 1 + fi +} + +host_report() { + "$1" "uname -r; sha256sum ${REMOTE_DIR}/netem/* ${REMOTE_DIR}/monitor/*; ethtool -k ens4; mqttv5 --version; sha256sum \$(readlink -f \$(command -v mqttv5))" +} + +binary_check() { + local host sha + for host in ssh_broker ssh_pub ssh_sub; do + sha=$("$host" "sha256sum \$(readlink -f \$(command -v mqttv5)) | cut -d' ' -f1" < /dev/null) || return 1 + echo "${host} ${sha}" + if [ "$sha" != "$EXPECTED_SHA" ]; then + echo "binary mismatch on ${host}: ${sha} (expected ${EXPECTED_SHA})" >&2 + return 1 + fi + done +} + +manifest_check() { + if [ -f "$MANIFEST" ] && [ "$(head -1 "$MANIFEST")" != "$MANIFEST_HEADER" ]; then + echo "manifest header mismatch in ${MANIFEST}" >&2 + return 1 + fi +} + +preflight() { + local report path + report="${OUTPUT_DIR}/preflight_${PHASE}_$(date +%Y%m%dT%H%M%S).txt" + preflight_step "$report" "local git" git -C "$ROOT_DIR" log -1 --format=%H + preflight_step "$report" "local changes" git -C "$ROOT_DIR" status --short -- netem monitor parallel analysis + preflight_step "$report" "manifest header" manifest_check + preflight_step "$report" "binary" binary_check + preflight_step "$report" "leftover probes" stop_leftover_probes + preflight_step "$report" "broker" host_report ssh_broker + preflight_step "$report" "pub" host_report ssh_pub + preflight_step "$report" "sub" host_report ssh_sub + preflight_step "$report" "router" ssh_router "uname -r; sha256sum ${REMOTE_DIR}/netem/* ${REMOTE_DIR}/monitor/*; ethtool -k ens4; command -v bpftrace; cat /sys/class/net/ens4/device/features" + preflight_step "$report" "router setup" ssh_router "sudo bash ${REMOTE_DIR}/netem/router_setup.sh ${BROKER_IP} ${PUB_INTERNAL_IP} ${SUB_INTERNAL_IP} ${ROUTER_GUARD}" + preflight_step "$report" "impairment reset" reset_impairment + preflight_step "$report" "ilb health" ilb_healthy + path=$(router_path_state) + echo "=== router path: ${path} (expected ${EXPECTED_PATH}) ===" >> "$report" + if [ "$path" != "$EXPECTED_PATH" ]; then + echo "PREFLIGHT FAILED: router path is ${path}, phase ${PHASE} needs ${EXPECTED_PATH} (03e_infra.sh route-on/route-off)" >&2 + exit 1 + fi + echo "preflight ok: ${report}" +} + +set_impairment() { + local mode="$1" loss="$2" delay_us="$3" + case "$mode" in + single) + ssh_broker "sudo bash ${REMOTE_DIR}/netem/broker_netem.sh ${delay_us} 0 100000" + ssh_router "sudo bash ${REMOTE_DIR}/netem/router_loss.sh ${loss}" + ;; + legacy) + ssh_broker "sudo bash ${REMOTE_DIR}/netem/broker_netem.sh ${delay_us} ${loss} 100000" + ssh_router "sudo bash ${REMOTE_DIR}/netem/router_loss.sh 0" + ;; + legacy-calib) + ssh_broker "sudo bash ${REMOTE_DIR}/netem/broker_netem.sh ${delay_us} ${loss}" + ssh_router "sudo bash ${REMOTE_DIR}/netem/router_loss.sh 0" + ;; + router) + ssh_broker "sudo bash ${REMOTE_DIR}/netem/clear.sh" + ssh_router "sudo bash ${REMOTE_DIR}/netem/router_loss.sh ${loss} ${delay_us}" + ;; + tbf) + ssh_broker "sudo bash ${REMOTE_DIR}/netem/broker_tbf.sh ${delay_us} ${loss}" + ssh_router "sudo bash ${REMOTE_DIR}/netem/router_loss.sh 0" + ;; + *) + echo "unknown mode ${mode}" >&2 + return 1 + ;; + esac +} + +snapshot() { + local label="$1" when="$2" + ssh_broker "echo '=== tc ==='; tc -s -d qdisc show dev ens4; echo '=== snmp ==='; cat /proc/net/snmp; \ + echo '=== netstat ==='; cat /proc/net/netstat; echo '=== dev ==='; cat /proc/net/dev" \ + > "${OUTPUT_DIR}/${label}_broker_${when}.txt" 2>&1 || true + ssh_router "echo '=== tc ==='; tc -s -d qdisc show dev ens4; echo '=== ingress ==='; sudo bash ${REMOTE_DIR}/netem/router_ingress_count.sh; \ + echo '=== dev ==='; cat /proc/net/dev; echo '=== softnet ==='; cat /proc/net/softnet_stat; \ + echo '=== snmp ==='; cat /proc/net/snmp; echo '=== netstat ==='; cat /proc/net/netstat; echo '=== ethtool ==='; ethtool -S ens4" \ + > "${OUTPUT_DIR}/${label}_router_${when}.txt" 2>&1 || true +} + +ROUTER_PROBE_PID="" +BROKER_PROBE_PID="" +ROUTER_MONITOR_PID="" +BACKLOG_PID="" + +start_probe() { + local host="$1" script="$2" + "$host" "sudo nohup bpftrace ${REMOTE_DIR}/netem/${script} > /tmp/probe.txt 2>&1 & echo \$!" +} + +stop_probe() { + local host="$1" pid="$2" + "$host" "sudo kill -INT ${pid}; for _ in \$(seq 1 20); do sudo kill -0 ${pid} 2>/dev/null || break; sleep 0.5; done" || true +} + +start_side_monitors() { + ssh_router "pkill -f '[r]outer_monitor.sh'" 2>/dev/null || true + ssh_broker "pkill -f '[b]roker_backlog.sh'" 2>/dev/null || true + ROUTER_MONITOR_PID=$(ssh_router "nohup bash ${REMOTE_DIR}/monitor/router_monitor.sh > /tmp/router_monitor.csv 2>&1 & echo \$!") || ROUTER_MONITOR_PID="" + BACKLOG_PID=$(ssh_broker "nohup bash ${REMOTE_DIR}/netem/broker_backlog.sh > /tmp/broker_backlog.csv 2>&1 & echo \$!") || BACKLOG_PID="" +} + +stop_side_monitors() { + local label="$1" + if [ -n "$ROUTER_MONITOR_PID" ]; then + ssh_router "kill ${ROUTER_MONITOR_PID}" 2>/dev/null || true + fi + if [ -n "$BACKLOG_PID" ]; then + ssh_broker "kill ${BACKLOG_PID}" 2>/dev/null || true + fi + if [ -n "$label" ]; then + scp_router /tmp/router_monitor.csv "${OUTPUT_DIR}/${label}_router_resources.csv" || true + scp_broker /tmp/broker_backlog.csv "${OUTPUT_DIR}/${label}_broker_backlog.csv" || true + fi + ROUTER_MONITOR_PID="" + BACKLOG_PID="" +} + +stop_run_probes() { + local label="$1" + if [ -n "$ROUTER_PROBE_PID" ]; then + stop_probe ssh_router "$ROUTER_PROBE_PID" + [ -n "$label" ] && { scp_router /tmp/probe.txt "${OUTPUT_DIR}/${label}_router_probe.txt" || echo "WARN: router probe copy failed ${label}" >&2; } + ROUTER_PROBE_PID="" + fi + if [ -n "$BROKER_PROBE_PID" ]; then + stop_probe ssh_broker "$BROKER_PROBE_PID" + [ -n "$label" ] && { scp_broker /tmp/probe.txt "${OUTPUT_DIR}/${label}_broker_probe.txt" || echo "WARN: broker probe copy failed ${label}" >&2; } + BROKER_PROBE_PID="" + fi +} + +cleanup() { + trap - EXIT INT TERM + stop_run_probes "" + stop_side_monitors "" + stop_stale_monitors + stop_broker || true + ssh_broker "sudo bash ${REMOTE_DIR}/netem/clear.sh" >/dev/null 2>&1 || true + ssh_router "sudo bash ${REMOTE_DIR}/netem/router_loss.sh 0" >/dev/null 2>&1 || true +} + +run_hol() { + local label="$1" bench_args="$2" + ssh_pub "rm -rf /tmp/hol-traces; ulimit -n 65536; mqttv5 bench ${bench_args}" \ + > "${OUTPUT_DIR}/${label}.json" 2>/dev/null || true + warn_if_empty "${OUTPUT_DIR}/${label}.json" + local csv + for csv in messages.csv quinn_stats.csv; do + scp -q -i "$SSH_KEY_PATH" "${SSH_USER}@${PUB_IP}:/tmp/hol-traces/${csv}" \ + "${OUTPUT_DIR}/${label}_${csv}" 2>/dev/null || true + done +} + +json_complete() { + local f="${OUTPUT_DIR}/$1.json" + [ -f "$f" ] && [ "$(wc -c < "$f")" -gt 300 ] && python3 - "$f" <<'PY' +import json +import sys +results = json.load(open(sys.argv[1])).get("results", {}) +sys.exit(0 if (results.get("throughput_avg") or results.get("measured_rate") or 0) > 0 else 1) +PY +} + +run_recorded() { + [ -f "$MANIFEST" ] && grep -q "^$1," "$MANIFEST" && json_complete "$1" +} + +run_line() { + local order="$1" phase="$2" mode="$3" config="$4" loss="$5" run="$6" workload="$7" router_probe="$8" broker_probe="$9" rate="${10:-0}" + local label="${phase}_${mode}_${config}_loss${loss}pct_run${run}" + if rated_phase "$phase"; then + label="${phase}_${mode}_${config}_r${rate}_loss${loss}pct_run${run}" + fi + if run_recorded "$label"; then + echo " skip (complete): ${label}" + return 0 + fi + local delay_us=$((BASE_DELAY_US[$workload] - HOP_US)) + local broker_flags="${BROKER_BASE} ${BROKER_EXTRA[$config]}" + local bench_args + if [ "$workload" = "hol" ]; then + bench_args="${CLIENT_ARGS[$config]} ${HOL_ARGS}" + else + bench_args="${CLIENT_ARGS[$config]} ${TPUT_ARGS}" + fi + if [ "$rate" -gt 0 ]; then + bench_args="${bench_args} --rate ${rate}" + fi + echo "[${EXPERIMENT}] #${order} ${label} delay=${delay_us}us" + + rm -f "${OUTPUT_DIR}/${label}.json" "${OUTPUT_DIR}/${label}_pub.json" + stop_broker + reset_impairment + local path health health_after + path=$(router_path_state) + health=$(ilb_health) + if [ "$path" != "$EXPECTED_PATH" ] || [ "$health" != "HEALTHY" ]; then + echo "WARN: router path ${path} (expected ${EXPECTED_PATH}), ilb '${health}'; skipping ${label}" >&2 + SKIPPED=$((SKIPPED + 1)) + return 0 + fi + set_impairment "$mode" "$loss" "$delay_us" + if ! start_broker "$broker_flags"; then + echo "WARN: broker start failed, skipping ${label}" >&2 + SKIPPED=$((SKIPPED + 1)) + return 0 + fi + local started + started=$(date +%s) + + snapshot "$label" before + if [ "$router_probe" = "1" ]; then + ROUTER_PROBE_PID=$(start_probe ssh_router netem_probe.bt) || { ROUTER_PROBE_PID=""; echo "WARN: router probe start failed ${label}" >&2; } + fi + if [ "$broker_probe" = "1" ]; then + local broker_script="netem_probe.bt" + [ "$mode" = "tbf" ] && broker_script="tbf_probe.bt" + [ "$mode" = "router" ] || [ "$mode" = "single" ] || [ "$mode" = "legacy-calib" ] && broker_script="tcp_cwr_probe.bt" + BROKER_PROBE_PID=$(start_probe ssh_broker "$broker_script") || { BROKER_PROBE_PID=""; echo "WARN: broker probe start failed ${label}" >&2; } + fi + if [ -n "$ROUTER_PROBE_PID$BROKER_PROBE_PID" ]; then + sleep 3 + fi + start_monitors + start_side_monitors + + if [ "$workload" = "hol" ]; then + run_hol "$label" "$bench_args" + else + run_bench_split "$EXPERIMENT" "$label" "$bench_args" + fi + + stop_side_monitors "$label" + stop_monitors "$OUTPUT_DIR" "$label" + stop_run_probes "$label" + snapshot "$label" after + health_after=$(ilb_health) + + if ! json_complete "$label"; then + echo "WARN: no usable result for ${label}; not recorded, will retry on resume" >&2 + SKIPPED=$((SKIPPED + 1)) + sleep 5 + return 0 + fi + [ -f "$MANIFEST" ] || echo "$MANIFEST_HEADER" > "$MANIFEST" + if rated_phase "$phase"; then + echo "${label},${order},${phase},${mode},${config},${loss},${run},${workload},${router_probe},${broker_probe},${rate},${delay_us},${HOP_US},${ROUTER_GUARD},${path},\"${health}\",\"${health_after}\",${started},$(date +%s),${EXPECTED_SHA},\"${broker_flags}\",\"${bench_args}\"" >> "$MANIFEST" + else + echo "${label},${order},${phase},${mode},${config},${loss},${run},${workload},${router_probe},${broker_probe},${delay_us},${HOP_US},${ROUTER_GUARD},${path},\"${health}\",\"${health_after}\",${started},$(date +%s),\"${broker_flags}\",\"${bench_args}\"" >> "$MANIFEST" + fi + sleep 5 +} + +trap cleanup EXIT +trap 'cleanup; exit 130' INT +trap 'cleanup; exit 143' TERM + +case "$PHASE" in + main|crosscheck|hol) + if ! python3 "${ROOT_DIR}/analysis/single_segment_accept.py" "$OUTPUT_DIR"; then + if [ -z "${ACCEPT_OVERRIDE:-}" ]; then + echo "pilot acceptance has not passed for ${EXPERIMENT}; refusing PHASE=${PHASE} (set ACCEPT_OVERRIDE= to proceed)" >&2 + exit 1 + fi + echo "$(date -u +%FT%TZ) PHASE=${PHASE} proceeding despite failed pilot acceptance: ${ACCEPT_OVERRIDE}" | tee -a "${OUTPUT_DIR}/acceptance_overrides.log" >&2 + fi + ;; +esac + +python3 "${SCRIPT_DIR}/03e_plan.py" --group "$GROUP" --phase "$PHASE" ${BLOCK:+--block "$BLOCK"} --out "$PLAN" +deploy_scripts +preflight + +while IFS=, read -r order phase mode config loss run workload router_probe broker_probe rate; do + [ "$order" = "order" ] && continue + run_line "$order" "$phase" "$mode" "$config" "$loss" "$run" "$workload" "$router_probe" "$broker_probe" "${rate%$'\r'}" < /dev/null +done < "$PLAN" + +if [ "$SKIPPED" -gt 0 ]; then + echo "experiment ${EXPERIMENT} phase ${PHASE} INCOMPLETE: ${SKIPPED} runs skipped or unusable; rerun to retry them" >&2 + exit 2 +fi +echo "experiment ${EXPERIMENT} phase ${PHASE} complete" diff --git a/publications/comnet/experiments/parallel/03f_binary.sh b/publications/comnet/experiments/parallel/03f_binary.sh new file mode 100755 index 00000000..f216cf07 --- /dev/null +++ b/publications/comnet/experiments/parallel/03f_binary.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +ACTION="${1:?usage: GROUP=G $0 install | use | status}" + +on_hosts() { + local host + for host in ssh_broker ssh_pub ssh_sub; do + printf '%-10s ' "$host" + "$host" "$@" < /dev/null + done +} + +case "$ACTION" in + install) + BINARY="${2:?local binary path}" + NAME="${3:?installed name}" + EXPECTED=$(shasum -a 256 "$BINARY" | cut -d' ' -f1) + for host in ssh_broker ssh_pub ssh_sub; do + "$host" "cat > /tmp/${NAME} && sudo install -m 755 /tmp/${NAME} /opt/mqtt-bin/${NAME} && rm -f /tmp/${NAME}" < "$BINARY" + done + on_hosts "sha256sum /opt/mqtt-bin/${NAME} | cut -d' ' -f1" | grep -c "$EXPECTED" | \ + awk -v want=3 '{ if ($1 != want) { print "checksum mismatch on " want - $1 " host(s)"; exit 1 } else { print "installed on 3 hosts" } }' + ;; + use) + NAME="${2:?installed name}" + EXPECTED="${3:?expected sha256}" + for host in ssh_broker ssh_pub ssh_sub; do + if ! "$host" "test -x /opt/mqtt-bin/${NAME} && sha256sum /opt/mqtt-bin/${NAME} | grep -q ^${EXPECTED}" < /dev/null; then + echo "${host}: /opt/mqtt-bin/${NAME} missing or wrong sha; nothing switched" >&2 + exit 1 + fi + done + on_hosts "sudo ln -sfn /opt/mqtt-bin/${NAME} /usr/local/bin/mqttv5 && sha256sum \$(readlink -f /usr/local/bin/mqttv5) | cut -d' ' -f1" | tee /dev/stderr | \ + grep -c "$EXPECTED" | awk '{ if ($1 != 3) { print "switch incomplete: " $1 " of 3 hosts on the expected binary"; exit 1 } else { print "all 3 hosts on the expected binary" } }' + ;; + status) + on_hosts "readlink /usr/local/bin/mqttv5; ls /opt/mqtt-bin" + ;; + *) + echo "unknown action ${ACTION}" >&2 + exit 1 + ;; +esac diff --git a/publications/comnet/experiments/parallel/04_transport_limits_v5.sh b/publications/comnet/experiments/parallel/04_transport_limits_v5.sh new file mode 100644 index 00000000..30b571ae --- /dev/null +++ b/publications/comnet/experiments/parallel/04_transport_limits_v5.sh @@ -0,0 +1,147 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +EXPERIMENT="04_transport_limits" +: "${PART:?Set PART=A|B|C}" +RUNS_PER_DATAPOINT="${RUNS_PER_DATAPOINT:-10}" +COLLECT_QUIC_STATS=1 + +RESULTS_DIR="${ROOT_DIR}/results-v5" +OUTPUT_DIR="${RESULTS_DIR}/${EXPERIMENT}" +mkdir -p "$OUTPUT_DIR" + +CA="--ca-cert /opt/mqtt-certs/ca.pem" +BROKER_BASE="--tls-cert /opt/mqtt-certs/server.pem --tls-key /opt/mqtt-certs/server.key --quic-host 0.0.0.0:14567" + +case "$PART" in + A) + CELLS=() + for strategy in control-only per-topic per-publish; do + for topics in 1 2 4 8 16; do + CELLS+=("${strategy} ${topics} def def 25 2 tput 0") + done + done + ;; + B) + CELLS=( + "per-publish 8 25 def 25 2 tput 0" + "per-publish 8 100 def 25 2 tput 0" + "per-publish 8 250 def 25 2 tput 0" + "per-publish 8 1000 def 25 2 tput 0" + "control-only 8 100 def 25 2 tput 0" + "control-only 8 1000 def 25 2 tput 0" + "per-topic 8 100 def 25 2 tput 0" + "per-topic 8 1000 def 25 2 tput 0" + "per-publish 8 100 def 10 2 tput 0" + "per-publish 8 100 def 50 2 tput 0" + "control-only 8 100 def 10 2 tput 0" + "control-only 8 100 def 50 2 tput 0" + "per-publish 8 100 def 25 5 hol 2000" + "per-publish 8 1000 def 25 5 hol 2000" + ) + ;; + C) + CELLS=() + for window in 131072 262144 1048576; do + CELLS+=("control-only 8 def ${window} 25 2 tput 0") + CELLS+=("per-topic 1 def ${window} 25 2 tput 0") + CELLS+=("per-topic 8 def ${window} 25 2 tput 0") + done + CELLS+=("control-only 8 def 262144 25 0 tput 0") + CELLS+=("per-topic 8 def 262144 25 0 tput 0") + CELLS+=("control-only 8 def 1048576 25 0 tput 0") + ;; + *) + echo "unknown PART ${PART}" >&2 + exit 1 + ;; +esac + +collect_broker_quic_stats() { + local run_label="$1" + local index=0 + local remote + for remote in $(ssh_broker "ls /tmp/quic-stats/*.csv 2>/dev/null" || true); do + index=$((index + 1)) + scp -q -i "$SSH_KEY_PATH" "${SSH_USER}@${BROKER_SSH_IP}:${remote}" \ + "${OUTPUT_DIR}/${run_label}_broker_quic_${index}.csv" || true + done +} + +run_hol_colocated() { + local run_label="$1" + shift + ssh_pub "ulimit -n 65536; mqttv5 bench $*" > "${OUTPUT_DIR}/${run_label}.json" 2>/dev/null || true + warn_if_empty "${OUTPUT_DIR}/${run_label}.json" +} + +for cell in "${CELLS[@]}"; do + read -r strategy topics streams window delay loss mode rate <<< "$cell" + label="${strategy}_t${topics}_s${streams}_w${window}_d${delay}_l${loss}_${mode}" + if [ "$mode" = "hol" ]; then + label="${label}_r${rate}" + fi + + broker_flags="${BROKER_BASE} --quic-delivery-strategy ${strategy}" + client_flags="" + if [ "$streams" != "def" ]; then + broker_flags="${broker_flags} --quic-max-streams ${streams}" + client_flags="--quic-max-streams ${streams}" + fi + if [ "$window" != "def" ]; then + broker_flags="${broker_flags} --quic-stream-window ${window}" + fi + + if [ "$mode" = "hol" ]; then + bench_args="--url quic://${BROKER_IP}:14567 ${CA} --quic-stream-strategy ${strategy} ${client_flags} --mode hol-blocking --topics ${topics} --duration 60 --warmup 5 --payload-size 256 --rate ${rate}" + else + bench_args="--url quic://${BROKER_IP}:14567 ${CA} --quic-stream-strategy ${strategy} ${client_flags} --mode throughput --duration 60 --warmup 5 --payload-size 256 --publishers 1 --topics ${topics} --subscribers 1 --inflight 64" + fi + + pending=0 + for run in $(seq 1 "$RUNS_PER_DATAPOINT"); do + if [ ! -s "${OUTPUT_DIR}/${label}_run${run}.json" ]; then + pending=$((pending + 1)) + fi + done + if [ "$pending" = "0" ]; then + echo "[${EXPERIMENT}:${PART}] ${label} complete, skipping" + continue + fi + + clear_netem 2>/dev/null || true + stop_broker 2>/dev/null || true + if ! start_broker "$broker_flags"; then + echo "WARN: broker start failed for ${label}, skipping" >&2 + continue + fi + apply_netem "$delay" "$loss" + echo "[${EXPERIMENT}:${PART}] ${label} (${pending} runs pending)" + + for run in $(seq 1 "$RUNS_PER_DATAPOINT"); do + run_label="${label}_run${run}" + if [ -s "${OUTPUT_DIR}/${run_label}.json" ]; then + continue + fi + if [ "$BROKER_FRESH" = "1" ]; then + BROKER_FRESH=0 + elif ! restart_broker; then + echo "WARN: broker restart failed, skipping ${run_label}" >&2 + continue + fi + start_monitors + if [ "$mode" = "hol" ]; then + run_hol_colocated "$run_label" "$bench_args" + else + run_bench_split "$EXPERIMENT" "$run_label" "$bench_args" + fi + stop_monitors "$OUTPUT_DIR" "$run_label" + collect_broker_quic_stats "$run_label" + sleep 5 + done + clear_netem +done + +stop_broker +echo "experiment ${EXPERIMENT} part ${PART} complete (group ${GROUP})" diff --git a/publications/comnet/experiments/parallel/04b_stream_limit_sweep.sh b/publications/comnet/experiments/parallel/04b_stream_limit_sweep.sh new file mode 100644 index 00000000..a8b08add --- /dev/null +++ b/publications/comnet/experiments/parallel/04b_stream_limit_sweep.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +EXPERIMENT="04b_stream_limit_sweep" +STRATEGIES=("control-only" "per-topic" "per-publish") +STREAM_LIMITS=(100 250 1000) +TOPICS=8 +DELAY=25 +LOSS=2 +RUNS_PER_DATAPOINT="${RUNS_PER_DATAPOINT:-5}" + +RESULTS_DIR="${ROOT_DIR}/results-v5" +OUTPUT_DIR="${RESULTS_DIR}/${EXPERIMENT}" +mkdir -p "$OUTPUT_DIR" + +BROKER_TLS="--tls-cert /opt/mqtt-certs/server.pem --tls-key /opt/mqtt-certs/server.key" +CA="--ca-cert /opt/mqtt-certs/ca.pem" + +run_hol_colocated() { + local label="$1" + shift + echo " running (co-located): ${label}" + ssh_pub "ulimit -n 65536; mqttv5 bench $*" \ + > "${OUTPUT_DIR}/${label}.json" 2>/dev/null || true + warn_if_empty "${OUTPUT_DIR}/${label}.json" +} + +for limit in "${STREAM_LIMITS[@]}"; do + for strategy in "${STRATEGIES[@]}"; do + clear_netem 2>/dev/null || true + stop_broker 2>/dev/null || true + if ! start_broker "${BROKER_TLS} --quic-host 0.0.0.0:14567 --quic-delivery-strategy ${strategy} --quic-max-streams ${limit}"; then + echo "WARN: broker start failed for ${strategy} limit ${limit}, skipping" >&2 + continue + fi + + apply_netem "$DELAY" "$LOSS" + label="${strategy}_limit${limit}_throughput" + echo "[${EXPERIMENT}] ${label}" + run_monitored_split "$EXPERIMENT" "$label" \ + "--url quic://${BROKER_IP}:14567 ${CA} --quic-stream-strategy ${strategy} --quic-max-streams ${limit} --mode throughput --duration 60 --warmup 5 --payload-size 256 --publishers 1 --topics ${TOPICS} --subscribers 1 --inflight 64" + + apply_netem "$DELAY" 5 + hol_label="${strategy}_limit${limit}_hol_r2000_loss5pct" + echo "[${EXPERIMENT}] ${hol_label}" + for run in $(seq 1 "$RUNS_PER_DATAPOINT"); do + run_label="${hol_label}_run${run}" + if [ -s "${OUTPUT_DIR}/${run_label}.json" ]; then + echo " skip (exists): ${run_label}" + continue + fi + if [ "$BROKER_FRESH" = "1" ]; then + BROKER_FRESH=0 + elif ! restart_broker; then + echo "WARN: broker restart failed, skipping ${run_label}" >&2 + continue + fi + run_hol_colocated "$run_label" \ + "--url quic://${BROKER_IP}:14567 ${CA} --quic-stream-strategy ${strategy} --quic-max-streams ${limit} --mode hol-blocking --topics ${TOPICS} --duration 60 --warmup 5 --payload-size 256 --rate 2000" + sleep 5 + done + clear_netem + done +done + +stop_broker +echo "experiment ${EXPERIMENT} complete (group ${GROUP})" diff --git a/publications/comnet/experiments/parallel/E1_fairness_v5.sh b/publications/comnet/experiments/parallel/E1_fairness_v5.sh new file mode 100755 index 00000000..75c96d73 --- /dev/null +++ b/publications/comnet/experiments/parallel/E1_fairness_v5.sh @@ -0,0 +1,155 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "${BASH_SOURCE[0]}")/common_parallel.sh" + +: "${PUB_INTERNAL_IP:?Set PUB_INTERNAL_IP (bottlenecked subnet address of the sub/pub host) in group${GROUP}.env}" + +EXPERIMENT="E1_fairness" +DELAY=25 +RATE_MBIT="${RATE_MBIT:-50}" +QUEUE_PKTS="${QUEUE_PKTS:-1000}" +read -ra LOSSES <<< "${LOSSES_OVERRIDE:-0 1}" +NTOPICS="${NTOPICS:-8}" +OFFERED_RATE="${OFFERED_RATE:-40000}" +DURATION="${DURATION:-60}" +WARMUP="${WARMUP:-5}" +RUNS_PER_DATAPOINT="${RUNS_OVERRIDE:-10}" + +RESULTS_DIR="${ROOT_DIR}/results-v5" +mkdir -p "$RESULTS_DIR" + +BROKER_TLS="--tls-cert /opt/mqtt-certs/server.pem --tls-key /opt/mqtt-certs/server.key" +BROKER_QUIC="--quic-host 0.0.0.0:14567" +CA="--ca-cert /opt/mqtt-certs/ca.pem" + +declare -A ARM_URL ARM_FLAGS ARM_DELIVERY ARM_PUBCONN +ARM_URL[tcp-1conn]="mqtt://${BROKER_IP}:1883" +ARM_FLAGS[tcp-1conn]="" +ARM_DELIVERY[tcp-1conn]="" +ARM_PUBCONN[tcp-1conn]=1 + +ARM_URL[tcp-Nconn]="mqtt://${BROKER_IP}:1883" +ARM_FLAGS[tcp-Nconn]="" +ARM_DELIVERY[tcp-Nconn]="" +ARM_PUBCONN[tcp-Nconn]="$NTOPICS" + +ARM_URL[quic-control]="quic://${BROKER_IP}:14567" +ARM_FLAGS[quic-control]="--quic-stream-strategy control-only ${CA}" +ARM_DELIVERY[quic-control]="--quic-delivery-strategy control-only" +ARM_PUBCONN[quic-control]=1 + +ARM_URL[quic-pertopic]="quic://${BROKER_IP}:14567" +ARM_FLAGS[quic-pertopic]="--quic-stream-strategy per-topic ${CA}" +ARM_DELIVERY[quic-pertopic]="--quic-delivery-strategy per-topic" +ARM_PUBCONN[quic-pertopic]=1 + +: "${E1_ARMS:=tcp-1conn tcp-Nconn quic-control quic-pertopic}" +read -ra ARMS <<< "$E1_ARMS" + +apply_bottleneck() { + local delay_ms="$1" + local loss_pct="$2" + CUR_NETEM_DELAY="$delay_ms" + CUR_NETEM_LOSS="$loss_pct" + ssh_broker "sudo bash /opt/mqtt-lib/experiments/netem/apply_bottleneck.sh ${delay_ms} ${RATE_MBIT} ${QUEUE_PKTS} ${loss_pct}" +} + +restore_netem() { + if [ -n "$CUR_NETEM_DELAY" ]; then + if ! ssh_broker "sudo bash /opt/mqtt-lib/experiments/netem/apply_bottleneck.sh ${CUR_NETEM_DELAY} ${RATE_MBIT} ${QUEUE_PKTS} ${CUR_NETEM_LOSS}" 2>/dev/null; then + echo "WARN: failed to restore bottleneck (rate=${RATE_MBIT}mbit delay=${CUR_NETEM_DELAY}ms loss=${CUR_NETEM_LOSS}%)" >&2 + return 1 + fi + fi + return 0 +} + +start_competing_flow() { + local duration="$1" + ssh_pub "pkill -x iperf3 2>/dev/null; sleep 1; iperf3 -s -D" >/dev/null 2>&1 || true + sleep 1 + ssh_broker "pkill -x iperf3 2>/dev/null; nohup iperf3 -c ${PUB_INTERNAL_IP} -t ${duration} -J > /tmp/iperf_client.json 2>&1 & echo client-started" >/dev/null 2>&1 || true +} + +wait_competing_flow() { + ssh_broker "for _ in \$(seq 1 30); do pgrep -x iperf3 >/dev/null 2>&1 || break; sleep 1; done" 2>/dev/null || true +} + +collect_competing_flow() { + local output_dir="$1" + local run_label="$2" + scp -i "$SSH_KEY_PATH" $SSH_OPTS "${SSH_USER}@${BROKER_SSH_IP}:/tmp/iperf_client.json" \ + "${output_dir}/${run_label}_iperf.json" 2>/dev/null || true +} + +collect_traces() { + local output_dir="$1" + local run_label="$2" + for csv in messages.csv quinn_stats.csv; do + scp -i "$SSH_KEY_PATH" $SSH_OPTS "${SSH_USER}@${PUB_IP}:/tmp/e1-traces/${csv}" \ + "${output_dir}/${run_label}_${csv}" 2>/dev/null || true + done + ssh_pub "rm -rf /tmp/e1-traces" 2>/dev/null || true +} + +run_arm() { + local label="$1" + local bench_args="$2" + local output_dir="${RESULTS_DIR}/${EXPERIMENT}" + mkdir -p "$output_dir" + ssh_pub "ulimit -n 65536; mqttv5 bench ${bench_args}" \ + > "${output_dir}/${label}.json" 2>/dev/null || true + warn_if_empty "${output_dir}/${label}.json" + echo " saved: ${output_dir}/${label}.json" +} + +for arm in "${ARMS[@]}"; do + url="${ARM_URL[$arm]}" + flags="${ARM_FLAGS[$arm]}" + delivery="${ARM_DELIVERY[$arm]}" + pubconn="${ARM_PUBCONN[$arm]}" + + stop_broker 2>/dev/null || true + if ! start_broker "${BROKER_TLS} ${BROKER_QUIC} ${delivery}"; then + echo "WARN: broker start failed for ${arm}, skipping arm" >&2 + continue + fi + + for loss in "${LOSSES[@]}"; do + apply_bottleneck "$DELAY" "$loss" + label="${arm}_rate${RATE_MBIT}mbit_loss${loss}pct" + echo "[${EXPERIMENT}] ${label}" + + bench_args="--url ${url} ${flags} --mode hol-blocking --topics ${NTOPICS} \ + --pub-connections ${pubconn} --sub-connections ${pubconn} \ + --duration ${DURATION} --warmup ${WARMUP} --payload-size 256 --qos 0 --rate ${OFFERED_RATE} \ + --trace-dir /tmp/e1-traces" + + for run in $(seq 1 "$RUNS_PER_DATAPOINT"); do + run_label="${label}_run${run}" + if [ -f "${RESULTS_DIR}/${EXPERIMENT}/${run_label}_messages.csv" ]; then + echo " skip (already complete): ${run_label}" + continue + fi + if [ "$BROKER_FRESH" = "1" ]; then + BROKER_FRESH=0 + elif ! restart_broker; then + echo "WARN: broker restart failed, skipping ${run_label}" >&2 + continue + fi + start_monitors + start_competing_flow $((DURATION + WARMUP + 5)) + run_arm "$run_label" "$bench_args" + wait_competing_flow + stop_monitors "${RESULTS_DIR}/${EXPERIMENT}" "$run_label" + collect_competing_flow "${RESULTS_DIR}/${EXPERIMENT}" "$run_label" + collect_traces "${RESULTS_DIR}/${EXPERIMENT}" "$run_label" + sleep 5 + done + + clear_netem + done +done + +stop_broker +echo "experiment ${EXPERIMENT} v5 complete (group ${GROUP})" diff --git a/publications/comnet/experiments/parallel/common_parallel.sh b/publications/comnet/experiments/parallel/common_parallel.sh index 2f9ee14a..c232a07f 100755 --- a/publications/comnet/experiments/parallel/common_parallel.sh +++ b/publications/comnet/experiments/parallel/common_parallel.sh @@ -5,7 +5,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" : "${GROUP:?Set GROUP=1|2|3 before sourcing common_parallel.sh}" + +_cfg_keys="BROKER_IP BROKER_SSH_IP PUB_IP PUB_INTERNAL_IP SUB_IP SUB_INTERNAL_IP SUB_PROXY ROUTER_IP ROUTER_HOP_US SSH_USER SSH_KEY_PATH RUNS_PER_DATAPOINT" +for _k in $_cfg_keys; do + if [ -n "${!_k+set}" ]; then + eval "_preset_${_k}=\${${_k}}" + fi +done source "${SCRIPT_DIR}/group${GROUP}.env" +for _k in $_cfg_keys; do + _p="_preset_${_k}" + if [ -n "${!_p+set}" ]; then + eval "${_k}=\${${_p}}" + unset "${_p}" + fi +done +unset _cfg_keys _k _p : "${BROKER_IP:?Set BROKER_IP in group${GROUP}.env}" : "${BROKER_SSH_IP:=${BROKER_IP}}" @@ -18,7 +33,7 @@ SSH_USER="${SSH_USER:-bench}" RESULTS_DIR="${ROOT_DIR}/results_v2" mkdir -p "$RESULTS_DIR" -SSH_OPTS="-o StrictHostKeyChecking=no -o ServerAliveInterval=30 -o ServerAliveCountMax=10" +SSH_OPTS="-o StrictHostKeyChecking=no -o ServerAliveInterval=30 -o ServerAliveCountMax=10 -o ConnectTimeout=20 -o ConnectionAttempts=6" SUB_SSH_OPTS="$SSH_OPTS" if [ -n "${SUB_PROXY:-}" ]; then SUB_SSH_OPTS="$SSH_OPTS -o ProxyJump=${SSH_USER}@${SUB_PROXY}" @@ -26,6 +41,41 @@ fi ssh_broker() { ssh -i "$SSH_KEY_PATH" $SSH_OPTS "${SSH_USER}@${BROKER_SSH_IP}" "$@"; } ssh_pub() { ssh -i "$SSH_KEY_PATH" $SSH_OPTS "${SSH_USER}@${PUB_IP}" "$@"; } ssh_sub() { ssh -i "$SSH_KEY_PATH" $SUB_SSH_OPTS "${SSH_USER}@${SUB_IP}" "$@"; } +REMOTE_EXPERIMENTS_DIR="/opt/mqtt-lib/experiments" +GCP_PROJECT="${GCP_PROJECT:-$(gcloud config get-value project 2>/dev/null)}" +GCP_ACCOUNT="${GCP_ACCOUNT:-$(gcloud config get-value account 2>/dev/null)}" +GCP_REGION="us-west1" + +gc() { gcloud "$@" --project="$GCP_PROJECT" --account="$GCP_ACCOUNT" --quiet; } + +ilb_health() { + gc compute backend-services get-health "exp3-bs-${GROUP}" --region="$GCP_REGION" \ + --format='value(status.healthStatus[].healthState)' 2>/dev/null | tr -s '[:space:];' ' ' | sed 's/ *$//' || echo "unknown" +} + +router_ingress_packets() { + ssh_router "sudo bash ${REMOTE_EXPERIMENTS_DIR}/netem/router_ingress_count.sh" +} + +router_path_state() { + local before after moved + before=$(router_ingress_packets) || { echo "unknown"; return 0; } + ssh_broker "ping -q -c 200 -i 0.005 ${SUB_INTERNAL_IP}; ping -q -c 200 -i 0.005 ${PUB_INTERNAL_IP}" >/dev/null 2>&1 || true + after=$(router_ingress_packets) || { echo "unknown"; return 0; } + moved=$((after - before)) + if [ "$moved" -ge 380 ]; then + echo "on" + elif [ "$moved" -lt 20 ]; then + echo "off" + else + echo "partial:${moved}" + fi +} + +ssh_router() { + : "${ROUTER_IP:?Set ROUTER_IP in group${GROUP}.env}" + ssh -i "$SSH_KEY_PATH" $SSH_OPTS -o ProxyJump="${SSH_USER}@${BROKER_SSH_IP}" "${SSH_USER}@${ROUTER_IP}" "$@" +} scp_from_sub() { local remote_path="$1" @@ -48,7 +98,12 @@ start_broker() { local attempt for attempt in 1 2 3; do echo "starting broker on ${BROKER_IP} (group ${GROUP}) [attempt ${attempt}]..." - BROKER_PID=$(ssh_broker "ulimit -n 65536; nohup mqttv5 broker --allow-anonymous --host 0.0.0.0:1883 --storage-backend memory --max-clients 50000 \ + local quic_stats_env="" + if [ "${COLLECT_QUIC_STATS:-0}" = "1" ]; then + ssh_broker "rm -rf /tmp/quic-stats; mkdir -p /tmp/quic-stats" 2>/dev/null || true + quic_stats_env="MQTT5_QUIC_STATS_DIR=/tmp/quic-stats " + fi + BROKER_PID=$(ssh_broker "ulimit -n 65536; ${quic_stats_env}nohup mqttv5 broker --allow-anonymous --host 0.0.0.0:1883 --storage-backend memory --max-clients 50000 \ ${extra_flags} > /tmp/broker.log 2>&1 & echo \$!") || BROKER_PID="" sleep 2 if [ -n "${BROKER_PID}" ] && ssh_broker "kill -0 ${BROKER_PID}" 2>/dev/null; then @@ -116,7 +171,14 @@ BROKER_MONITOR_PID="" PUB_MONITOR_PID="" SUB_MONITOR_PID="" +stop_stale_monitors() { + ssh_broker "pkill -f '[r]esource_monitor.sh'" 2>/dev/null || true + ssh_pub "pkill -f '[c]lient_monitor.sh'" 2>/dev/null || true + ssh_sub "pkill -f '[c]lient_monitor.sh'" 2>/dev/null || true +} + start_monitors() { + stop_stale_monitors BROKER_MONITOR_PID=$(ssh_broker "nohup bash /opt/mqtt-lib/experiments/monitor/resource_monitor.sh ${BROKER_PID} \ > /tmp/monitor.csv 2>&1 & echo \$!") || BROKER_MONITOR_PID="" PUB_MONITOR_PID=$(ssh_pub "nohup bash /opt/mqtt-lib/experiments/monitor/client_monitor.sh \ @@ -191,8 +253,11 @@ run_bench_split() { pub_args="${pub_args} --subscribers 0" fi - ssh_sub "rm -f /tmp/sub_bench.json; ulimit -n 65536; nohup mqttv5 bench ${sub_args} \ - > /tmp/sub_bench.json 2>/dev/null &" + if ! ssh_sub "rm -f /tmp/sub_bench.json; ulimit -n 65536; nohup mqttv5 bench ${sub_args} \ + > /tmp/sub_bench.json 2>/dev/null &"; then + echo "WARN: subscriber launch failed for ${label}" >&2 + return 0 + fi sleep 2 ssh_pub "ulimit -n 65536; mqttv5 bench ${pub_args}" \ @@ -201,7 +266,7 @@ run_bench_split() { local waited=0 while [ "$waited" -lt 60 ]; do local size - size=$(ssh_sub "stat -c%s /tmp/sub_bench.json 2>/dev/null || echo 0") + size=$(ssh_sub "stat -c%s /tmp/sub_bench.json 2>/dev/null || echo 0") || size=0 if [ "$size" -gt 0 ]; then break fi diff --git a/publications/comnet/experiments/parallel/group1.env b/publications/comnet/experiments/parallel/group1.env index abd2da1d..066b2740 100644 --- a/publications/comnet/experiments/parallel/group1.env +++ b/publications/comnet/experiments/parallel/group1.env @@ -1,5 +1,9 @@ -BROKER_IP="" -BROKER_SSH_IP="" -PUB_IP="" -SUB_IP="" +BROKER_IP="10.138.0.21" +BROKER_SSH_IP="35.197.5.208" +PUB_IP="136.86.210.25" +SUB_IP="136.67.121.123" SSH_USER="bench" +PUB_INTERNAL_IP="10.138.0.22" +SUB_INTERNAL_IP="10.138.0.23" +ROUTER_IP="10.138.0.31" +ROUTER_HOP_US="73" diff --git a/publications/comnet/experiments/parallel/group2.env b/publications/comnet/experiments/parallel/group2.env index abd2da1d..a213a81f 100644 --- a/publications/comnet/experiments/parallel/group2.env +++ b/publications/comnet/experiments/parallel/group2.env @@ -1,5 +1,9 @@ -BROKER_IP="" -BROKER_SSH_IP="" -PUB_IP="" -SUB_IP="" +BROKER_IP="10.138.0.24" +BROKER_SSH_IP="35.247.119.228" +PUB_IP="35.203.174.192" +SUB_IP="136.86.245.212" SSH_USER="bench" +PUB_INTERNAL_IP="10.138.0.25" +SUB_INTERNAL_IP="10.138.0.26" +ROUTER_IP="10.138.0.33" +ROUTER_HOP_US="57" diff --git a/publications/comnet/experiments/parallel/group3.env b/publications/comnet/experiments/parallel/group3.env index 930f838d..f4912b3f 100644 --- a/publications/comnet/experiments/parallel/group3.env +++ b/publications/comnet/experiments/parallel/group3.env @@ -1,6 +1,10 @@ -BROKER_IP="" -BROKER_SSH_IP="" -PUB_IP="" -SUB_IP="" -SUB_PROXY="" +BROKER_IP="10.138.0.27" +BROKER_SSH_IP="136.109.157.44" +PUB_IP="136.86.198.226" +SUB_IP="10.138.0.30" +SUB_PROXY="136.86.198.226" SSH_USER="bench" +PUB_INTERNAL_IP="10.138.0.28" +SUB_INTERNAL_IP="10.138.0.30" +ROUTER_IP="10.138.0.35" +ROUTER_HOP_US="58" diff --git a/publications/comnet/experiments/parallel/run_03e_pilot.sh b/publications/comnet/experiments/parallel/run_03e_pilot.sh new file mode 100755 index 00000000..34616f49 --- /dev/null +++ b/publications/comnet/experiments/parallel/run_03e_pilot.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +: "${GROUP:?Set GROUP=1|2|3}" +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +run_phase() { + local attempt + for attempt in 1 2 3; do + if PHASE="$1" bash "${HERE}/03e_single_segment.sh"; then + return 0 + fi + echo "phase $1 attempt ${attempt} failed; resuming in 60 s" >&2 + sleep 60 + done + return 1 +} + +run_phase calib +bash "${HERE}/03e_infra.sh" route-off +if run_phase calib-direct; then + bash "${HERE}/03e_infra.sh" route-on +else + bash "${HERE}/03e_infra.sh" route-on + exit 1 +fi +run_phase accuracy +python3 "${HERE}/../analysis/single_segment_accept.py" "${HERE}/../results-v5/03e_single_segment_g${GROUP}" diff --git a/publications/comnet/experiments/parallel/run_03e_sweep.sh b/publications/comnet/experiments/parallel/run_03e_sweep.sh new file mode 100755 index 00000000..fedcf042 --- /dev/null +++ b/publications/comnet/experiments/parallel/run_03e_sweep.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -euo pipefail + +: "${GROUP:?Set GROUP=1|2|3}" +: "${ACCEPT_OVERRIDE:?Set ACCEPT_OVERRIDE=}" +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +export ACCEPT_OVERRIDE + +run_phase() { + local attempt + for attempt in 1 2 3 4 5; do + if PHASE="$1" bash "${HERE}/03e_single_segment.sh"; then + return 0 + fi + echo "phase $1 attempt ${attempt} failed; resuming in 120 s" >&2 + sleep 120 + done + return 1 +} + +run_phase main +run_phase crosscheck +run_phase hol diff --git a/publications/comnet/experiments/parallel/run_reruns_resilient.sh b/publications/comnet/experiments/parallel/run_reruns_resilient.sh new file mode 100644 index 00000000..6b17ee89 --- /dev/null +++ b/publications/comnet/experiments/parallel/run_reruns_resilient.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "${DIR}/group1.env" +KEY="$HOME/.ssh/id_ed25519" +OPTS="-i $KEY -o StrictHostKeyChecking=no -o BatchMode=yes -o ConnectTimeout=10" + +cleanup() { + ssh $OPTS "bench@${BROKER_SSH_IP}" "pkill -f '[m]qttv5 broker'; sudo tc qdisc del dev ens4 root" 2>/dev/null || true +} + +run_resilient() { + local label="$1" + shift + for attempt in $(seq 1 40); do + echo "===== ${label} attempt ${attempt} ($(date '+%H:%M:%S')) =====" + cleanup + sleep 3 + if "$@"; then + echo "===== ${label} COMPLETE on attempt ${attempt} =====" + cleanup + return 0 + fi + echo "----- ${label} attempt ${attempt} aborted (transient), retrying -----" + sleep 15 + done + echo "===== ${label} GAVE UP after 40 attempts =====" + cleanup + return 1 +} + +run_resilient "exp3-qos1" env QOS_OVERRIDE=1 GROUP=1 bash "${DIR}/03_throughput_under_loss_v5.sh" || exit 1 +run_resilient "exp3-qos1-tls" env QOS_OVERRIDE=1 GROUP=1 bash "${DIR}/03b_tls_throughput_v5.sh" || exit 1 +run_resilient "exp4" env GROUP=1 bash "${DIR}/04_stream_strategies_v5.sh" || exit 1 +echo "===== ALL RE-RUNS COMPLETE ($(date '+%H:%M:%S')) =====" diff --git a/publications/comnet/experiments/parallel/run_tls_resilient.sh b/publications/comnet/experiments/parallel/run_tls_resilient.sh new file mode 100644 index 00000000..3850df74 --- /dev/null +++ b/publications/comnet/experiments/parallel/run_tls_resilient.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +source "$(dirname "${BASH_SOURCE[0]}")/group1.env" +KEY="$HOME/.ssh/id_ed25519" +OPTS="-i $KEY -o StrictHostKeyChecking=no -o BatchMode=yes -o ConnectTimeout=10" + +cleanup() { + ssh $OPTS "bench@${BROKER_SSH_IP}" "pkill -f '[m]qttv5 broker'; sudo tc qdisc del dev ens4 root" 2>/dev/null || true +} + +for attempt in $(seq 1 40); do + echo "===== TLS sweep attempt ${attempt} ($(date '+%H:%M:%S')) =====" + cleanup + sleep 3 + if GROUP=1 bash "$(dirname "${BASH_SOURCE[0]}")/03b_tls_throughput_v5.sh"; then + echo "===== TLS sweep COMPLETE on attempt ${attempt} =====" + cleanup + exit 0 + fi + echo "----- attempt ${attempt} aborted (transient), retrying -----" + sleep 15 +done +echo "===== TLS sweep gave up after 40 attempts =====" +cleanup +exit 1 diff --git a/publications/comnet/experiments/run/02c_hol_topic_scaling.sh b/publications/comnet/experiments/run/02c_hol_topic_scaling.sh index ee2e0497..83ece940 100755 --- a/publications/comnet/experiments/run/02c_hol_topic_scaling.sh +++ b/publications/comnet/experiments/run/02c_hol_topic_scaling.sh @@ -54,7 +54,7 @@ for tname in "${TRANSPORTS[@]}"; do label="${tname}_${topics}topics" echo "[${EXPERIMENT}] ${label}" - bench_args="--url ${url} ${flags} --mode hol-blocking --topics ${topics} --duration 30 --warmup 5 --payload-size 512 --rate 5000 --trace-dir /tmp/hol-traces" + bench_args="--url ${url} ${flags} --mode hol-blocking --topics ${topics} --duration 60 --warmup 5 --payload-size 256 --rate 500 --trace-dir /tmp/hol-traces" output_dir="${RESULTS_DIR}/${EXPERIMENT}" mkdir -p "$output_dir" diff --git a/publications/comnet/experiments/run/common.sh b/publications/comnet/experiments/run/common.sh index 7a6ecc53..7fd7938f 100755 --- a/publications/comnet/experiments/run/common.sh +++ b/publications/comnet/experiments/run/common.sh @@ -3,7 +3,24 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" + +# config.env is sourced for defaults, but a value already present in the +# environment wins, so `RUNS_PER_DATAPOINT=1 bash run/foo.sh` behaves as written. +_cfg_keys="GCP_PROJECT_ID BROKER_IP BROKER_SSH_IP CLIENT_IP REPO_URL REPO_BRANCH SSH_USER SSH_KEY_PATH RUNS_PER_DATAPOINT" +for _k in $_cfg_keys; do + if [ -n "${!_k+set}" ]; then + eval "_preset_${_k}=\${${_k}}" + fi +done source "${ROOT_DIR}/setup/config.env" +for _k in $_cfg_keys; do + _p="_preset_${_k}" + if [ -n "${!_p+set}" ]; then + eval "${_k}=\${${_p}}" + unset "${_p}" + fi +done +unset _cfg_keys _k _p : "${BROKER_IP:?Set BROKER_IP in config.env}" : "${BROKER_SSH_IP:=${BROKER_IP}}" @@ -63,11 +80,11 @@ restart_broker() { apply_netem() { local delay_ms="$1" local loss_pct="${2:-0}" - ssh_client "sudo bash /opt/mqtt-lib/experiments/netem/apply.sh ${delay_ms} ${loss_pct}" + ssh_broker "sudo bash /opt/mqtt-lib/experiments/netem/apply.sh ${delay_ms} ${loss_pct}" } clear_netem() { - ssh_client "sudo bash /opt/mqtt-lib/experiments/netem/clear.sh" + ssh_broker "sudo bash /opt/mqtt-lib/experiments/netem/clear.sh" } MONITOR_PID="" diff --git a/publications/comnet/experiments/setup/pin_kernel.sh b/publications/comnet/experiments/setup/pin_kernel.sh new file mode 100644 index 00000000..a7b597e1 --- /dev/null +++ b/publications/comnet/experiments/setup/pin_kernel.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +set -euo pipefail + +KERNEL="${1:?usage: $0 }" + +sudo systemctl disable --now unattended-upgrades.service apt-daily.timer apt-daily-upgrade.timer +while sudo fuser /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock >/dev/null 2>&1; do + sleep 5 +done + +if [ ! -e "/boot/vmlinuz-${KERNEL}" ]; then + sudo apt-get update -qq + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq "linux-image-${KERNEL}" "linux-modules-${KERNEL}" +fi +sudo apt-mark hold linux-gcp linux-image-gcp linux-headers-gcp >/dev/null + +submenu=$(sudo grep -o "gnulinux-advanced-[^']*" /boot/grub/grub.cfg | head -1) +entry=$(sudo grep -o "gnulinux-${KERNEL}-advanced-[^']*" /boot/grub/grub.cfg | head -1) +if [ -z "$submenu" ] || [ -z "$entry" ]; then + sudo update-grub >/dev/null 2>&1 + submenu=$(sudo grep -o "gnulinux-advanced-[^']*" /boot/grub/grub.cfg | head -1) + entry=$(sudo grep -o "gnulinux-${KERNEL}-advanced-[^']*" /boot/grub/grub.cfg | head -1) +fi +if [ -z "$submenu" ] || [ -z "$entry" ]; then + echo "no grub entry for ${KERNEL}" >&2 + exit 1 +fi + +echo "GRUB_DEFAULT=\"${submenu}>${entry}\"" | sudo tee /etc/default/grub.d/99-pin-kernel.cfg >/dev/null +sudo update-grub >/dev/null 2>&1 +grep -h "^GRUB_DEFAULT" /etc/default/grub.d/99-pin-kernel.cfg +echo "pinned ${KERNEL}; running $(uname -r)" diff --git a/publications/comnet/submission/Figure_1.pdf b/publications/comnet/submission/Figure_1.pdf deleted file mode 100644 index 8b73ee5cb8c1d7267ec99694b4f3fbb693ef1bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17977 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 diff --git a/publications/comnet/submission/Figure_2.pdf b/publications/comnet/submission/Figure_2.pdf deleted file mode 100644 index 97864fef151205441daf57c2eac56a19686e3296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17468 zcmb_^2{=_<^fyA>44I>F%@pqB-s@(_EJVi0P^N1huWOD_=431>nPo~LM23u+=L{vJ zga#6oO7fj^tG8bH|KFbP`>tm{XPW4}yTg zq3+gB5LsC$%+TKh4}~dP5v^R@?V&JTD|@^b6bV$&hsw)C@NTwXMd{xfsJXilp(s)X zn8|T#C%g?2iv518>PJ*JAX*XeP^s?)x>iIYp5O*WgSQZvfrFK;qnkYx^W!PO-Npb< zgqi`vs;B{^;QfeDn1(Arg3^zx@{g+q)Z#aC5PvcN(hX8izys8MCm*Jd_j30p*Z};1 z^aJB-<82+Sl-&J*5#hj}6b>Va#-O1n1V$2rMq`j@U=)}#z#q_w7ZmrMN<}v}ci;{I zw)kBp;Nzb{Jcf6(Cpth8KL%EFbOG3g!qi*n7^yi#?Ss#owWba2y7~D{aw#}Itc-dUC`$}wVPf3DjTMop5 zAs|2}^JNFw!i>e{Mu6{!`BBx4RaYrPa^eYcTsv~=ieqqE?$ycEWN zw!Za4pPy?A$29IX_xXzY%__%W$Nu}_VS%!1#f~?bx;sJ&!aO87%@v)GwfITarP(5B zWeTrl%n!?UEmY?`Hia4H=p7biS{t1*+PM4CCh%LSa4xHaLCr_4wRLuZG9=UF*`~2f z4e@tnbVFPrx-C*VH_ow)si%sY(XdQQ^-a!u2iE&X^o}esHbgTCYtD{X4!7jc&?B5u zAr5IN%43rc&p~J3da|#wXfPbARAQKRl2o_~>$Cp~n?%vNHpf_=!=4aP>Wa!*eNxBR z*N*r4CNg^C<7(=$lAcWRZ`f5v7}?hsjD5VYYvaemu3SE$!g=9cJEZoLNiU|*TvaD9dWN>V2Mk)nxs5?HT^+jD-_o?^u4{gYm*Zq(p-gYqOV5O*0@#l9`^X$VWX^ZMrGhZt= zmR@CVt}Sf_ZOp3%-asFi+1mH@!|bcBDfHsqM2d`PSv~EFxQoSNC|a`y*0J=wa@IqR z5|@)=d^Js9v}!`xRv$HKo`8;>ZRZieP((u;?y zHp{4}G5P*<`_YA+JjzNLTtIP$^Wcxiq8F7}9=`AqQ5 zg4x$*^7})@)yY0)nHma@exomRbKArF=vZ7sMt1|x(GtCvDva(;0k)&dr<=4B7&hZP z4_CR*8@{7Hp_R;k&wMsX3zv9YpV%fWwqHissIBxkhA8alu9P)l-Wlp~?B3Zh%OO$g z^6QJyma}L089AJ-;xq`9Is&}ZjLvr?!{f&I`sUQGh|ECe z)ct+eRNaHfs~qO0nswX}`dQ1=7Ksb$7m(gZYVxIzSSHGrxDA%`55#}vt+mRNTc?=W zgA$=j&-@(X8lJXCt$*N5(|SuUt-yl4&eOnIN|6iYc}8>RD6iAjFljPhH`c*;aw_co zdQNp%Tqg8tWh_*T-&K@_o-Wibgje($D?xW$v*^oL+XO{(m1hoBk+90xphI#o%JLIQ z*^Il{uV2ybN`v>3Q|xszzlaOdL0mr&iaVhlYScVVcuMimTTc6^QHl}Ui&!&73KA<2_iYw-Pb*;<>tzn z((R78tjV5;yqBijFeLWWbJz$wQM|v&24CWq5G=NALZ@5oHdw^}*6+;=9_(Vw*Ezy7 z-{pwtkKy}crgZOFSqHt0u*UX2fma02Q#bB!)R&INJHaa+Hh8;4tWB<^@ zpDr5BtQFYJd!V_vW{)VB5W8Wvi2*~Xfu5)OKBT`PG2kH!3t#xyti)&pZaFJSlT$@l zeWb8(;#F>fs&HOLCIl1dGb-x1`VN|EM*04HfewQh3$ZVF(awB&moF+ZFxRFDFXYuqhD!z}F?qH+k&`|nlC zMeH*6)gD=+oM931vzDfnS(-b?O?Z0H%FX7oIw$j#M53#YC7(?cXX&FNN=<2jjZXfT z;*QR5abvgf_wPNXUoUVW%42Q{&DoS%$vxiB8eYe^^!c>y#?+EDmt5V^#nZ~V)IBMN znJ*J$t1lmsKA?(nGUH$-_we%|3^^^LpCoi}pOd_P*1Y6if${aKyc)yLqIcfNBx5n- zNA4^SM?OuzCfhg``lP`oGIq*dv}Ch$Zf1z^aMQD*@kq(;n@;WbO?LY+;Z@kO85oY_ z=Hf4;%BQvFDr!(A8&>jFG@tHij$c;!Sjm60N}(#eqDi=WkLp&|;JoQE<;HpKu>4%J z=SJmqcQ1vZ?z&6ra_)NYAq$Q|Q!j4n=+m^&G;0<`mHPQfGe;OUk!3&NIiQVY=W7tEJa?ueVVvePaO^y(&_WfQg&(kPu)LNVWFaU3N8d$|+#JRjR&ly406L0dkN8-h8F+2n3rl=E3?V`+&);%V2$(x$cE%=%Oa&>wmPrz)C+Ui)HuQN1bbA*R1@GxhG;H8>xp-xpVYyV9y8Yp6CWw9dYU~}6a2Clnhj2ztyFb-yx{Ps_3fLTfd%C)AGM>@*E>=rkt~$(Kd^IIwgVBL= zmI&i!emG|O^~$c9BtkeJf$w^iGX zj^mRj=&rw+Qo%X-EM4$uctg8CvxQdg(>^^(``ksLB0bARTef%(-025jsawwr>MC*V z_2UW@+{2CZd)(4|eCx|X--pfH?d!pPXUW#ZT3bOV{R0600M#V42qH)%8V&!6v`H`% zEHr~!{47KM4tIY*O(X^j;LHEOnR0qsZYl_x$pzL%g?xoif(!meqwVj%O+MzVI&^^I zLBy>#6?S=-Z2O$ncaF+~{VfB94VD>&4)2vR9vt>lQ{&q^>F!*1>K*5yjU4<}4L_OQ zE9>|(2~vqHC&;ViTT|}PU(?hP3SvKE^7Lg=b!TZ4T?fGl`_V4Og0rwn)jjgd278Zk z=Wz$6x&2fk>j!O*RXVFIE0`rJPK!8=*!86A>VI^8c=c@5!DP22XEA5NxD)0)*pEWt ziO+lM=u{=oEuT*}Eph1MEJ|v80gcO8Uoto&!%85OwA^!x|7?+M!pxs7h|jl6*^&(qHX&umgG$({c6r|^*=RNn^QvAF*hDXLn^2(AmK zVtOD<4VhQF3=xYkR}-Fx+)#tmnnMv#f!)1uvSG_hmJo3l2kTJFD{0r1^PbWrcjE?D^DK_L*^11^jFVS#Mu`rIhm(&9U03YB-ft&+w7n}LG2(<&p`J!J z9c#wH_cg~12{AG^6c!RE>z|#hOCDRYt~!1w(wKVx(X#&C)m-`eSLvjeH;*G?jwOWJ zw~k))#n@Li2lBYDar6Z0*Pd5OD^bt6)xz3!@CJl8B@pTMR%0@dll3j*d)M3J8gF54 z*+;o{kO1h)Zj%5CF8vo0(A98jgVWV*uzgV=bG|#1Y(1#Fur;34&q|dP6(uNXiot7M zHot0iPwDWnM&fzSZ?*N2uVp)rQN`PJKPE7qk-ApL9@}0X#7MSGp>8uQSWaZTp5mzI zToi3YXUHm3mlqISt8tvgIdv@j;-NQwA$~k&*~i19#uU+PGM3^V(!P(`4!>53UN+#h zQK8!NV{(H0niI?O^NG5SuE+p~rip^+gEAItTFk+QGV5~SG-Yxsu- z&iNTOah|85hKr3Ryd7pic2-%jchtbY`F;vK!$_@GydD*#FrT8?b#~!sNts1-onpub z4K3EvmT1a(omqYO@gyaV^zc;vn>BZjbnc^NvD>(l>&(sGj_>OJvba|-jfL29y<^f! zgHP<{*&O)jYmRkRW^+^bEkZ^7 zRmJ0)nMEhh3#ZLa1dhz-Wul29(Wsz^K2>X-2MTB;Epr-?9wl_L=AEF9&>rEB3he@e z$Ja&MQ;%gGcYbKzrq5P7KB>WWv9P$wUdWJ0n|?*G8xa`O;#{_D=X(dU_u6TF20O<0 zABI0McSuW%UTM#LVb{bg4$$K{C1wDfL>69 zVR8oX_B&r6MXpRe`yh|;N5>AO(yrq)YA=}_F47+^d+>ak?rhfKGphGJCF1ox)sGlD z&+1Fc;xcG5#N3X(-(ZZRuwC9khTvJvHW{MO@c)(}T3^denUC&?S4^#f(AUVd`r=po z4O`VVN7;v@SKfTSVjdd(;uEuSOpf_G37h@mE8~R*D_qYu4BF58DIobq`08}`4CqRn zSLm_YWA|u;S$=)=)b)n*EAn=U>3pa}JqO>e4SO2zRO;I2dDcFO z7YUi&j|^OU_SY3uUFHgd#73)86;!p{YPk+kUMR>Jv83*&9C>e>Z2SDc!rrf-7MPz}l$z$pqt zmPe%I1~+f3YMGT90e<}GV7w4jh0ErP`;y}x)|>-JM|(KVN1Lau8}|9-I{RV8xI zUHg^Q4&pA}aET(1V;CSNC*|VQLp#LB7wRvnM~v>WYUB|wjUp!b+^l=zFut*AKjI_v zInH)i^~oVaR5@YaspgDvVRP%aj<(BoXA@PejSw>am-~Yl`m3^Tbey| z4^)LSYFGbc9tEBUZeK?TssElKIsKo8;A<0^X+yn;>QHO%*6sY18<8RBg|4w)l4S{F zt$B{20azjYu&r=uWEq9bskI`XrV9W&g=(TLxJ{yN2-kW~#if1CbdR#dQoXNvIw zEkCy;8cn|zccB)vd45zRlp&qJ=at{_l}FX~XFDIGgVkKB4Ze(s$H@m~Mbeai;mtdg zWR&_;qeM}yNS~>rM6I&F-61bQ`HhU2Hv0o10ZRsOrOB$rgJ{jO*Ilvik{XrkIgC6Nv1u*3~{0 zsn>=r-CbK>;*FoGU#*XAE0QP?i=15&Jm|?%Y7M`4+zuc7C9=Ght7jzW*%`h|lIe$E zmofM9wG25Qj zQ!4NGdQ}#cEjQg*8*i#s_eP7R-%s54_A>>%*!J-b;@kleBc=Yry2|O{+$a%ruQwsV z&=7|1jzD3Pyos;(>0dw{)hgRsS0764>t30SCgdRBz0A!XZ(A4js^P3*cREMRo8_zw z%QBVFF25%)kR!QTRGSwJx7f_T+#j>*gKTrzA8M;$@VL>XdzDiH=Kc8A+lS;9nTcPf z`_l`hJG~5L!o)7-;Ho02{Mc)ZkDsrIT8F-7e9>qc!7AnhJBd}~n9Gq=d)e*|Gmp*?c7?QPH{k4p3C%zE^z_bQ!t4_nvNl;Ro!t{G;@2`%nr%O6?xujMhzXnTVR zQk3is?idzbW(@dtb~Nxz+&E+AqZ2!9gs2@*J5uT|ya~`jqarzI=2`l^urB`_#rLlG zZY`mDosFg0CnDPP(wGezEtzjI+pWgw>1y1k=I5GXT>T2Y$vVegNPDs86oK9-CUjH1 zw>{+GIJ|#6u%sq-K!P*x`YD+<9C@B!g<6+kl+rrQf#&pQy&5g8s>kEPXxoNmYP6S3 z$t#!~LXzZ^MxDj=&!BdX73bi33JFExOS(-rT7~21(4B?y97D+#wcV>~ZbRHUxU-du zFD&mL$vG=h{{V*VWBAPfj5{ef=3`~6zf9?|(VMNF78&`nB?K|IDY_BE-3&pcUbhY} zJiB+t=(SDv!WZBAm*3W?y*``j?Vx)*I2I^r%zy8uXnng9*&4`XEorY)2 zi8H2>ZIT%e+B=5(4jhnwem!omjaHai84Xo|bp>3re;qU^AmB?leZhBj8mD+eIaArm z6A^VF#7RbQSulxvAVqOTqBZd@)kXS6OV4mV9Mzx>fmX+!J7OBbcwTWAnaRb4^YJpC zixTOH-KDt-(*cujvhkPoRRrzSmd`l9nsUKMUwYR~qj>j5k6K(n9G>@NAMxbY^0~Ut zpBY!K<=E{ol{k<4G;2rd&!&Xjk67P>tL9&2!<`G%XX#85=LVa?f8(hOh1t z;(bE-#N@#~M86{X<$ic*HQRz%wESD1Yd8BT2b0fT$@r4qG!U-;(7ZHNRFj!4X{x-G zo;<&J1Uhn!GkO+=;f|ars@Z_l3m4fG4#<-6`=iURyY{r#`PLaQH{YT_-J#BuZ5^y( zix{9fbUbzJC)`G5fxaHmt;`5lN)Lwn#yG^76iP&%P!WVK`hw&7zPgy>^Onx;W zR{jH|axt)UDF;(X!%}Eq0W)3~OWA?u9lQ$!?r$bPLGfZ6oQCpkFxBy$zxviWSx^13ybA9l?w z?p^0vTHJ*n-)QWZ`4mLnOQxl}gD`f$@MzS3?`bGZwJvbRgwTT{F}m;yDLps_Zg3Pa zhYT$v)LL5OEZL75F{IKm@8VBwzC=w%-Nk_3Vep;6Ip!}$SJhQyZiCX)Z9p;s??TUM%gc()Jm{M=O67zkLUi$#U3!*r)@%>$X&Qtp zp4TazGZcTrIVt&o_?b2l~otN09WmB5j#KY5kf0gEGm zxB35hK&l=8(-GlUhn^*5>W!)fZY>GIttXy}9N29$m9>(v!o<`}U!>w9Z23wU?@b=$@hZKCy?GLn$i3Gi9;Y5zAkmm+ z2A?UmzD4{}t0vx{Iy~AK|IulHaTKp*zJn-s!gt8OaCFhSJ+AG*pC;1v0;;c+_H0Q<-fFi-4^gkcPr}hy;c6B6c?xAS(T+M# z@wPmuvQx~6QBx&4$jrDg0}$3DgnTgIXLK2WeESqwI}XrpgvKey@*%(e5cajIM8 zZ~sa*qr^#guRh51iroYzPgdtX%Ci_?}hK^e6&b?-Y$D&aP z_DYq$b|rj~EJK|>LCH?zil1Q5bB_ZQE&8|kn6ysJdZ)x%Ybu;tc;n>IMBB-Y9h_Zz zb;v3uN6k`2>%Ll#UA(Vn!{~}|-mSpCBalqN z+(X5Yl<1y8)beM?_eHiIfMWI%1*S8JKV9m_^2MMcO((xn+R zKEyAHu?f!vq=nB(em0L$=a)z|mprURxKS@jf2mU9m893}=-FN}s#l#fD<@gxuY_vS zu}q0IR+lk8e_i3Yke|a@-C^-uz^ol@dgJ2mqj*H{I4vP51_NJGN9chvySJO zbb4G0cB&s}W)t;Hc^|DY5t+EVG>)}EGvcD>_(KOKm)NT`1+-*!tJU+_yk@LfdXV8y zD9Dla0bU0A+xK>uw^*=UA(;_Uc)Kr7^+zx(c>_e>fPjv*6%uVCC2Cck_dA~@gOZbWa9YM z%&s28&vVmGR$uleH)wrOg2+zL*&sc1H)`WOFJ2G*Vtn?&=B`=?(H#zpq;>#f2<%@V zQ&qs6DUl8K$9e7%tGVJPjFIvS6*7EMZ#X z=L&k2hlnVD?eVCzJ;JjarhJwCNq%uU57Tg5EB!;Wnu7`{umi6$^G!AkRd#Xhg>vlp@5X)WyH=6M>@OiSW;}4@BLA1#cLXkJ z|E|4w*QfQHuJ6V&mfn%CHL2{{VFGsmf+(rK0D^MB-Us+&%ImmrNqESI*rl~&dc>jW zvy z#KHQUJ+%l#pV5U%^uXJJ zD_-qApY!E3dN$K3*!WMFKA{L`C|1w8>o97v)<-ksZ50uz z6YYx(<0-#ghBu+LAC&Lu=doocT{8_Z{Z5rx5Qy z_m{&sRAL%wUzMFfF1Ajyt$4g0T%Nb7y~m*circ@+ne^Kg$J-NsJgzF(O zbv>ttO#=itJ9Lk$r+hpad^&s=CHAn|feEI9Jq`mG930~Sx*q!(kS|>5xWr?lu9ET%YWIVw^13OI1 z4rmsdm`YuENGq%IEh#eY`Ca-u^t=dK$@(zfqiW?*62TUwhsg`gy{T4u3?} z^qw5XN7MzA^u$P0pu2n3t=JU0}N*EWYf&d-EZO}^F8d!O)m%Ujfb5GN=op2q*8vQ0(uTMK(P8;mn& z4^wESo=@kLpfO8Y_*H5vXAQ-e@k$SRHszCwn@q#`yKh^)ORpi`ZZ;?y^R*U6N~g1U z$?x+yXq!P^&{#?<@G9v<32i>FjgjM&epG*qVQA^P2PQb$@Xp2c0j{+@Rw@?PDs=3m zEQ=3x!Md;#1MTFJ4D0m9T$2GS<$)8LYPM3|rpuNhXFi5;hH%$zo_CmQ>19mrTQR@< zKFP*+FHA5~?SfM>(>IHwkeW1@@JEbJeU|91KdAw%umkHQ+t!zvTgXBHY-v*V(%EnOQ_v1WvxS zB6L6j@{9po{9Z&F9VUC;$C)E^`qkTm1D}>kYZePcIl8R(wXt3sZs5z7jk=dxr*GPH zH~WSjMa4*+MNnz2qRgp_@>uFcph46=Eow8}J8#Pw&4!cn zx5l4p9y!~oZt(3-=^%bL=ih@jND&z@B`YudkDQ6R>WO2ARPat#C%g^t1V=j%krTX# z$_`cpz}Uc!S^dZZU!Fl=U?Ua0mkq(ugXm6x0-GEd=m0bDwkDEdL%=}*>FZdz0udHU zfAsym1Eud_6%ts$tCB!TVWCI_90NrlfbZFWm!6E-4+VKKv)2t;0}eky8-MFechpGpsgJcC<1}mIr;!) zUI3Ngc{SeA-hl`Ozq3<@g4?qO6oiY%px_&BT_{Ws3InACgsnhfMo=73%?b*$hQe%s zP!R+Kh6gTy5qE&X9DyA0)ENqM0R#dx2B-nX_W*8y3It$4fDS0k8~ET42oixAJK7Q* zfOr!ScmE!5LYkMKFPwi({BJWy67&BwO~53$SlN34lKPtoQ}iMU5QhX_Vu2%o(v(1= z0REM&JdS>s3>*S8`I!Zz0|XE`+9j^NUZRJPe2#P>SA%BnI`RP}f zK{0Un|BnRuzwHMFh*k=Ygi2xHP-&Dj6obM*Z~!cm#=)UTED#?AT)~6}=mejG^-=#^ zv0(lGEkS-hM*+GCCa{m62@SMGz=4jjz!!;F6dKSmG@xN%9uNv}+=j*Bpwd_*KmZyd z1*{t^u(mK5DWDNj3U~li29^s3&`n1tOs6!?@ds^at8AlDJej605Jgiivbokn8yKY2`C4| z4)jf`1B6szf&PHK8Wbnk1`Mx~1{M<2RJ@>1;-~%8z@3J96}N;FeVxh zF-a`{5C;%R(jbsMDewjXb^&BSmVVAWsX5RTjX*$v1hDX(wST($o*@wkFd&U1wImS* zF#S^xe$LmAD@j;C=^%9=1&AF3NED$_Ve` zh`$339=OQ?{r&QalmTl(+6{p{7?2FfJRO4~K|~2`!MadjC6ID@P~gy?l+%YI!LupS z1`Vhjkb?mGG_VjzWkyh7UnAwLprr43fO^)z^nWk20l4{|1FXr9F~0A3fLBK9iDV~$ zwMyy&G#yZ2?npNdp#Axt`)+ptnUiiEfob}la|Sd3%s~Ki0DN6Rdg=xR_C`|99SY3M z_Z(oK04b639-t}vp8ILqNCQGZQ%5puKSm{h298wG3kYxgkpt}+X~>^868L12REG%K zJ|GAAZU=u1>P%WV4;6il=@#P0wxWp2$#eGL;q%wKsJAn{fk#n z%6}C8v|J!8(FV6Apc0@#+JG#62u>T=c7IHmHVTUPt{lI5CAIh|qVJ~sXC&<}*rn!9 za0T$z4_qY;l>k;R@CTr&pV6iyQ~n+Zs$ zPL!xyLg zZ^9KedbrsOr-`4>6)H2^KP~N`i(MyDx__!wH784^LNrhci?k-kO@30W9Oj@^Ro~$= zUXqmlpV>s>gL04dVJuL9q-nKGnI0z!Z-!I;PA^zZ3TI!Gag-c^VbFr;0_D?zEK!0dk zJshw&|0t6Je5LL6cF-$O5w_Jsz(M@}@3w$z58^EF_YZHtsmCAd2!TKYPTcl-m_OGg z0{6!{LLiZU$QgkI6lQyW7&z{?HA5s=IlABpr2q0^;23}h_95WN!rdL*KuLf_!_5vj e{Qzd``#FOb(TYGMZCMBmut*_7LaN8rApZxsI)~8! diff --git a/publications/comnet/submission/Figure_3.pdf b/publications/comnet/submission/Figure_3.pdf index cc7d8f4c5939b479d15a3705adbc8d8f734d7f60..510797890213db6465d47541a198461696135ef8 100644 GIT binary patch delta 5838 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 delta 6181 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 iLj%G9nXz2V_ZUop3Py?q)2RRq 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 Q^iDzytcHe}?MCeX0j-tJWdHyG delta 9574 zcmd6NcRZHw+kZDDWMpSwHlcejTS&4(_TD3*+sf)jMmAltGBTo)mC8(IWRFM@sf-ez z%t{E)earXz`IP7PeSUvDe>~Ug<#t~0`#8_{vCiW-UN3$|Le@(ml{^qS1O|si185BP z1Re>BLCzD0Ewn+N8v4g;6|-@rMOOl8mNv!5Vvd&=9lv(HOQ26+wBuUNb&>Oqn~R_F zor`Ji2L%?d4W($VoJdQc;!|Qi`0lT^*PfTRKCJYXa#(-24jHpdT|7}CJ4bANSM&HY z>GNISob~&~vA*{WYdPJvOFa5te|$efoLAww|1C^@npnL3-STzFJ4?Cftn+f;3+BUl zv#TQb3EwHBmo;5<11e>G&s@GWle>IdTQ)$?Ag2BG);P4OwTd5M9za-^xSDNqsNg7*#gru`^@@f}?zhS&uJ3bgG}1Cef|t|PSI$3`)ca2T_#A4)jqjrr zNw;)gvO@}USC)+bkOL|Gg@Q84gXJvfps_OJv zHJv)*ScmPT>O>1&E1Z~(y&6_}c~GlMP;sO6vVJc7K7Cm3ImGWmcWbwWUM;ho@p zBf;)1tbNbX$Zc%qqXtLjdHOT4^|Rs?6?2e>^s`%!H~mm^lXYWkte)NHiyDu1x+Y|6 zG>xARK89u6xNdl+Y4iosM5C0eYkv-6k-}QV6MkLiik+dYLZV&n_np72i9=f-eAia;m8)+L(*$sF55xu| zUCeG#lnvr26NHZUU*!3Y%aagw-+Dlih5fNgy!!MI-`P8voL*{8oVYT5h_P!nrMfu5 zui`nfCyM#j)we6+1P4CO`W{O4DW?Ipb*I?}XAW83x=3H28Z~`Qm(IC`)+Z_3mqD~7 z+s1`H=bC3^xxVSmQgpe}C-HnEdVE#?({*v5pB<*r23NA%E>T&gct+`zo*OXadVSM- zsgHQ+#`^|s$pLx4S0X&|jf}`ylDx5CQ@YpE<#x0;_jNb4yuHzwB(^p&LF~!aW;LrCV?3MStRjx^^FXB`mmcL$9 z2>CJdr6K7_@WPXzmFK?zueYGS2HP z8jI18_q@-uYwdiCcCFP`iSX`o07c$2H8HPG=g^cy3-L?YT8XkuHM_93P#!|Wiy+K6`$AvK z65(F1mmaCWgd1vCn~0)0F3$2!m-P!5j}rsujLbXLK`OQF_f;Il1H$xOrk^NonZ{+@ z%(~*bshn{-W~DKJwGrYb;`%CZBG1oXxx{QrQUXyoRV`aYUDi6jYIDCma1s|W)G}mK z9hnDdm~NiMs0lW++pX|v)S?gKUiG1N;x?#&AApu{q)0lPQHq-qhJeLG48=oa{ z1cLhc_1{lDqbQ1;aPYEy-63_pCqRBx!n<$bJ-=>2rv{JJca2s_(`P2?$iB-5-!6Y$ zikP)^c#25lIMok!eCWv4x`wZZ1*fS}Y2J%thZ?jj!eaW|d@4j!y6+1ddUQmCm5zAR zx|Y6+fE^HJl0{r}?G1~u5_^%^8*p9K*@}&aOww{WkInBwb(cy+(h{N`86|Y~l5ujA zs?{-hT|xe;^&b~&tdA+^7Kk4vywta%C*GNtpMW$}d`o1zX4wCwLqw+F!E)O6(bra% z!(Tm1>tA$>oY87XpK0knccZ6&wXP&zKJ3@KljrO8Qn+8)2bLs!#g zCY!OvRM-(|07wQ&a=0EJYy`eBPrvv}r*rGlVs7k$M&cJ&F=J0wSB2AJo2g&*Hw&kY zlUI|S2q}b=H-|nuymKs>?#e4QQwXS-xSeeFe3Rhs{J@0%ZBf=ja*fHsxb_HQZ%60- zA5GQaD_RUtm}lDbngw9|-R5zjU5R?6)@{3o?Ii+T!CZNNh| z!KmY7xR;{=ayLw+XqYKae|ctrbht+kyLU}zd(lUW@H}1bOx78secZ#e5XZxvmQZj? zPrb@)t~=tS^x7L0LYoR(o<<;^IH_uKTjEvWmjmf{hT})W)To_*JZDHRy#Di7{t@xtnXWHAy|Mu9t6-x&091ityrm^fTI zgWK^FOYzm$e5`kyCfeDHhu76&IKp7Xt=VuzR^DRPE5B0ZBFdDFW7^oTp2%G|(l>w^Jqy|rP5wN7`Ewm*R)dgbMgs%oJ*?<1Y~1*%z3c6AzsdX|6Ki(u$=LI;ECPwGn{&!+EoO2A?Rf)> z7vG8Mn6`0Vgx}ioQIoj*3+)C&t;|>6D9dOxDRA2{9Xm^3oAGiq`RHFRL}uV_f7Ho) z&Fe7KxERkGrOu+yIkT??=is+BYSGPwmBpMYX&TptGgFB5vm1iTpMTy~K=r3SPUmYJ z=Y6THVwhMxl}If8=}$OSQ~ZTifFD-3TrvFqqttwmN2cra(9^yu*Lt-AXv0?9Gx&O| z6I`gIulQAR1Z}*58|9~^V??*Ix3+!Umby)C&4HW2EK^Ql)zZ;|}54Q@xLfhx%o}nojbIWx%EwTiA(pGt;#&H1DTm zj^Y(zXg%ZsjaGF>6eQB88_r7^cg3RNrB2^FxpHht#+;xM=Pmzl7wCo@BiTEH#E*Y8 zzCDsn;XQ(0JCIkoZrsoEF>Z<@dyOJv0U~+W*Qe&BpV^Fzi>l6?{*^a&!8@)mXP@aA z@DjchWF5buCwph*pqrHf@#K{d+rMP*~P%+q{+|-k8frA@P%lA)vK^S~Py*uA8`N`>fB+UEt+c;(%BX}&{h`l6fVrB~| z9ju`Q=6GE5R>DK+*-PqG0wPoR%hU{J7hSr z!9sB~qZY5D{~)7&1okbOy%T`XJb2|LlO0Tz60e=qE}uP)bofHdJ^A5PM+6^S<2lHa zq{~=yc?ov#)WLaDlQ!&M=oH_HL_*lCmKVNWBJkOhUfqPDoYt*v2@~QzBP_|Z%3>cLli(?a_ zOc*KEW8GATo)le9QVj0;gSgEL;=lfH{} zbFHc%?If1FtxrF`Y_IIbxftZc*EQYS*K_sk8LNx<klVjDz7i`3p`4AV0ZE~r0Qm63-aK;%14(_a^rbjJF z@nPdI#?h(nV>9W4=lG%~^PBCj8TGWdeQo_viqegL@;oty-^8>xj&FrY?h=#yEmMKA zziv+!+%wWU$2Ta*cWwy>26R{@jyOFm3;NWf;&(}6DE>|H^tXtil^}aQT5MRH;YDSu zs*!2p8LQ3!y{0fx5q0VHUW?_b%;?)fMX(ze$5I;^lF}5VR=woBSPeAk&Q51_o?}Bw zzhmZpjvpFZ6?b3jmUC#1%KIo6AW~6CYDqnE4(s=-G&|8fEpLqE`P4nSMo}b{f2LJ3 zb-wVvZv6PU+)Hekjuy9JfbCtqYNtnP#cm?j+kx_58)T)^%A9^y`;@4$Z?=@vCCf@5 z8`QRJUm#K!!j@Hd80K-r_BpfcSe_=1V0T7}*f0`jx4QJ~>uMxvUY?6o!+^?V3zqRlEYTTE8geERJZ z%P_G3HK~MW%;IAaqM08?f`&d8<)MAVVvr$Gy=rzk&y~;!8s|x@+QX=~_2+&%d;2)n_YvJ*L5yc>C^CXOVM0G}#%#UGSjT=JS;cPX5)Hqc^Pe z8JviWU%w6hU~WfQ25OWgnEr4K$WXojeeMzSaUua*cU%Ei!p~Ypn?ZG4aD>WaOsb;D zMo2Ft>KvHsQ?cytr_7b7=N#hodQ?j?on{TMQFq-$=8pbg<@2ct(i|%jtoG!hbdvr> zb;Wb%Kj@#3!{<`xN_c2}-DFIla9G%lB51_T0GhF~P$JQ=U4NkUH9b@W=*GQc>y$)( zMz1#BofCY#^T_@*`wQICU+WnbVKFm5m{np6ES9D1xuup~-!@p{n%p#Ki@2nO5Ev3@ zID4f3taOA@x9t(9(IvXEPfyl7TfFmA+nYH2D#KWOtfi*ZjAb~&tFH?Ni=Z0KM@rrO zE?1b_pl!XezTVe}@6oB2?A*+~XRc>?NnBP@SR1y=c^t8%;FOXrfK1VI@$cMpruI#z zs+%gZ^Giu2-9{jz z8?TFcmfxwUzEa>x4RSQ4t%~L?%U<4we0L330`<6Az-%@a@F_zwIL*!mIx^0J862$D zwnsf7;H_h<)zeIJ5KxGdr5ed11_2qlSgJ3uLLuNV7YhXv2Uf8O5z+d}iNbK|hS!om zo}LL)Iz2H|`oikt&g+Lcb1F2(6pzC0)wz$jZB7lj@y^q2&g+&tUQXPiRjYHUgwXSV^TF2aivmWc=H5q%k7azYzf*j}0qDFi8LW0& zpbeGvRN7MF2FA3UN@FNnZT6-_0c6!@)Bv67qmtIjZ+b_E_Z05-+CiNR<>2$PX;K8nSDuQ0 zUC51zEt`Pl%S$n)AJ{rzJmBma>EF+zFqM-q&`KjprGf@jp`C%m8_x3~142Un1nYSJ z4-7b8-$}Qm)Er8rpS8IdDS$sTphKY1apsMhpk<6u zraWMh_$eYu_TsE`c1l-Sq0&U)*kAdMY5Jbo66K8oCsG*2sw>%05O9Ep4P0l>1IKvTz)Ch@qCDyP91@@#>z5#e zrF0}c4X`rwT@Kv2@C8;8$3zwWr4?!4k<3H5aYxHg!+(8HQd-2R(^Dw>3HSJr9xtJk zeq8n`&q{qW9jpD-ew@XlSCESC74N7;jAg-%Shw1j4sSCGsBUr}K-HAL7qJy-MbBNi zcGo_xkLEzb8HogK3F6FHrX55=I+{`Ty>DH6m{n0|rDs#b(h%g)hgrl!<6A-DZQClE z;hr6dr_#^9fIpLMQ-2XZA}4u|&a)`vgp48XhI?&gTW-n2S`*!)Pd{+hK#m)!8}&!8 zrzR(ko(+{uZCCbr>OL!e-QvM9*&<$$NjjpUB=cp0hs->&_4YgBPX3dMyz&Rve?YGC zOfgZ2L zk7FIo23WzmW3C`hfEC1Wj(|ymY@iTV73e9%3eIu`f!e~X)&AUO5D+2C3eNDXfs$e@ z)p7hx5U@*}6|4lVg2EE4)mj275RmIQD_AJl12##rf>(sPz*#BMbrl|ffV0x9lyJmu z<04AynA5hv=r;Q$e8R%N2>XWQCfv_^yW@XNmRfw)QTvI_?Z_4}LH2Ro#*pOE#EK=U zTFw)$VP_hnx?QHzeV_WH^*e(zV*Mh%h%x8h9iU;S9nsCo>+C+aK0V=PyKxkJtoiLE zt=tHmJ;LkkW?j<7#GJ4VW8(8I$~qVEPFhEB;e;@#COQK~%hQ9FjEAcg#1bG790;dp zfgr&ufLt}Y6L{ft4GpyD%Fu5$^Otr zo5@Wt5`G-8>a<&hkaav7ucL`OSqluL&XtOTX*zMY~!a*pJ>LdvZ;TbX=EKr zRq{WwAlo*3tYh^;EzQj3=XODFuN+H2#gDXfRWlQ<;9uAKs-PUIu}w5{mBEPFmI<~c zuf>6dkM?!-4Ep2cKa?!Jo9mvYBRKo+q>ng5yttEdLSq}ctq08lg*e;K>Z+%HH@$2f zNqG=!D|3oxgsJ3+OMhZQB=bb>t*gwwL?fkQ#*=(Gh~9}2rf z^#HdpRiz}&PtyUdPD-V5lQ_E|y%SmBqPTN_?{Y~0{uD%$rwa(0>}z!-24f66aMDs! z=#V`yHr}Bx(3afY@shcxXC|EHqgSSRsNswkr;=+%0Z%zyIqJX`AA|J%6EWZm9#-(3 zxEcip4yFjQfOv@y6c_|Krq$5nNe~JQa(9**l4K*TQM)2rQuFK>^xoJdCkH^a96g+U zTmU?7x4CO4$})t)=t$$0AcvCMAgKl`U(FvUiWr*NROPyVqCCtofjU@D=Ne3X=Zo$5 zLFd&RS+x(5FFqFy6I1hV>I}XzDLR;G8;Jf|m~Dv#5o%S#V3)mm)6nOFRR{O}RngvP&0bP&KgA%ZF6bJ-JgoQy+AO!ACgnBs=Ts<9Vq2BJc-Yx(%(2?K? zKs`Mi0jQ5ZY31WWa3rmrJbekIPgg(E+S~OK=}$KR)X~-1#RtG(0jLUqMFLO_082u( zXmKzAdKQ4{0Z@GaY5+jb0Z>B#PZF~QpmqS%9)QE(q}`-nNI)Oz3_wY=uB11T#CZVf z4nQveP!Ez00Mv^X4o3k{60bK#t%3qA)Y#R*$Hf~!z)7a+10-Z`C?*+q z9MMaGfLE_0_zn_L|L}wgfFMVSq?87LAiIdP(gG0JU#qhK0{3gB2O#jjR{8*vJWlVL zf!t-HC0TwRxktvC!eWWdW zhIs<0Ju-59(R*B80D8|fFI$46hr6Sb4}jh?aTg)%#u>fGOUf5}M-P(7p2ffN2SD$t zKud}hDK&Pj_6E>c;@*;+F?&k<$}{wyBHmuM_KpB%PZd%&?WyuB?J#?4kTVgp$L|YZ z_L%*E-CIX8aW`o(zj*&n1=0qv8%IZhK!T$<8zwX<^=tvy2{@XZE>LA8$cyI&9q}Dv zP;C?d-;0no8i4PGM;imc_tezJ0tgr=E~CPG0u4xGNgx0EvHbUSha*v7s0?WuVF(52 zBG+=mkI3mOU$)?V92Ey&-Yx~q)J~sv)qJNuru?PVE#JZBfx+Rb?-Pi2X2v&K7YTUS zs|H-L){+44p=G0M#&Y3OQI&*NW6Sz?ML^uCQ2v$fhB#u6yYXG(NuiUB3B{0eTOU4i zeS^7_sQF8})I=-tI))~=6te_S7Hf)uBC@CcgQiFvE%-rP5IiDJ!!?LBJit`#kfC=9t7k)MAn z2t#2>bHJY%p4>5hmqQ~+eg97kjsMfrFf z;r<;4suaVmL_`Qb+!MFMPjoq~VMR-!F(Jcj7-b)#~-iNNji0usA>O-L+%%b`f7{7HgB?7t-_BzZRcT|pF@ zH0k~WGa;?vC_Mf*kc^=b`|msYzqw*)?7o~qz))}mc<&@P8iOOv(4L+?!0uE;np-`b iNP`ebDblD(nqjBH4g9GcRS1AS0<@Q?*N-Pt&2JN=Bk(4G+CQ)|(x)Z?(xOyZg;eX{b1<|{h0zSI^p1# zU)f)p7mv>kdM%YM{(Af6*@t(@fniIU`-}zR&pY!z40+st@p`D;`#W`o=0|xfdB%!t z_wmY0J$FKI(9X@A^2zQW;tMl>4?8NrD}S9~xzDdk%vAHj{Y*OF(JoY~+_Yz~q+qqb z>ah^HM(HPv`{pA8eERJ>?DgtLPUQ4o+{N0t{E^f74!CaC^Bl``$ksoC`*Trh{KoYu zOS>!!-@DwUzY%gTHjbN9`>C*Wcg}CNeCf;lOy$ym*OIC9`>yHhlP^eb#v(K8|>-&!yHKa1m`{JRN~H$=|q=7cO>YQ zm4e4_lxezAq)l;r(?%L#AS3tmO<|1<5=J}qEsx@CyEC3S zE3p4?%AM8*b*U5Srv}+PtO6rdDl?3>QRC9gnqw!ve1A`8i1C~mI2OJq*cCNr=L*Io zm!GaZTgcV*#8X8MNRs$km-e7k4VC}U&M0+9llNfL&WZ9S7dBB>FjA#SN8~JdJL{kQv+IMmU=^p-gA=ASm51)KSX6nj% zRO`!{YovPmSO2j3X{iH!4)i-w3yaSUUjX^Nbw4J&Ue?#uZL2wKMA7Nk-?7KMda2xS zxa;wKopT@Q#~EUY=PBF8`R>u<<@6580_Pj&CD^8U&W8VTyU)&?SW+Hi06`(@y$GoQa$BvuyDh?%~=}7a+iD3GcE=+pJP8p zs_1cQv#W@v$UfuyastI&jr-O^?iL?&&`8s-chZ}{;FGfJinygVH3VoySY2n_=x%>^ z$PhK=GMUl#I4Sh$`Su?YE%q-@vNd;5#=N<}L0Cx|z1+X^mWIwt2OABeOuo**#fN&^ z^qzHD`LnBnI@}7aC~h+MrOc8aq8IVq82E-IwuH^#feZ`39yPAZ=gBZx+_@cIHbP~v zP(U_B`ySVBYrSuaJUztqA8yy9=I=aW%XyGFrTwMk#704fNm%$PzkXq<0FT!k`>|}n zr>?gr3D8e7eEIrv@|LR3-74G^z9-KHBjGV zoTq!sOWmVBqjEQML&o_>AKAPx3jU^FUb4=oOEHTs;A57Yju!jEDQP5bWpztOE`ruP zeCHltlXzk7?QXG(7>bSu01jDe|Ubjequ%H#Piu6@}L zS{Y9yBO@#Cg+?}Qc0opD4fIG?#)yjVCpUHnoEc)i#DCrWD0MtdNuYIv+II4RxQPg& z?GfW5J*X*jLl(|5EWkt6>t1fU2WNOw21k#0WZ1b=0T)|5ezsP>ct}+z$|YQN>*2v! zqH4(24U?HV_NZnLE12I&RjzC&IJLH@<~_Ig6l7=zwQR0j^`iE1=P2O zRE#XfJ=VG8>aI3FAUsxT;*7ExIayn{w_jwy{Yx2NZCl_7|J!@WxSSqmm7CgCEyzk8 zsS3*E={6(dd!xi>DQ5#_Dds|7GLXUpW)yP)|JIa@fJ>^1+$5BtakZ61W?W9iP^0jT zeEJ@Y$4@(zx$>&C1b9z`?O2v_IO<+ir!x5FLjOLm4N5PwH>l6E;kJjV!F!x)<>(n~ zq${r^&C_WHVjq6Z&EXO>MfgLi?;2N`*$W>olILvr(Oggu8 zuG_itGh8&K)ROOke)0vW3dz7rj`o_jM4af?uu1RYA0nfwoMZR-=0r9SCq&-5_c9gQ z^vcs-N%&9rjqvSjm_^g1o+C{J18DDWTXcNRTrd2txaac6u-2F)e=GmY5Dk>Jag`ED z`OZ59ZT%_}|DMOlsj2ou+frR_N%HMfE}?%PLN%5#3Y_f49JYQ&$lB95&{>-~r#R_4 z)%dw9gMz0g-!Njq#BM1Cz+h&h?T}T6e)7WoE_@dN_V^(mAICa}@PXY`=bD((nzv-uz?P2Ye1lxfa{&(l;W*mJ^ zHnbC^4eKLE%dRGzX;VCAI5HCw;olH5J)>eb(G=MHa`tuZ*LjBulDYX9cgmo0uVP+l zZ=a&Zwo4Ta!M~<^BDZSJ{`}njb@!r*LhY9Ny$VZ3L^-v)4y4>)^uUD*(V@T^|Ly+a zGexgyGN$O3``$lo-)~jh{LOot<0#!F2VxxwAJQ-I(o|^FUJ9LO=YF#ZZlsI*u5^`tP7^zssFSW6Br{3gjoY?z zsL}<3;|HhgiY$g*icWC$89qKwoIGpL6S=|bu%6c)$xfYvsbLzNqNrIx!STe}mzqMz zXK#2)dGp!5os$TTh;;cA?AfP-KA!QGzjA8a$#TD;o$J-YIj0cQBT-(eLdj+bdi_C1 zv-?h8U~z2tb#R?RLD4PD@{x&(RgoBHsU!|2xpB3zWe!Wb? zC0xde|7mv5Qt1Y}GGj`ERoQiaCEr(Oj|StIKCR|0!HaJ>p5a&~UB-UdRUng1<-S6% zZp)C4d9hy71@;3V*)2d`?r18PddyyhwEaUBqDymQwhIrx*QAnO+J1KNm};XNz-1>6 zjX!N2q(xm(zV?lO+|c(`veA9Z9_IduH+-?&;YE`HD4=#;grh<{jB z&wfLo{b2n-S_;-DHl@>MTkuoK0K5g#UTH77|CQF87jxy>w6n4nzA%p;X|x}|V5SFg z;&7_JTX0Aa)fw6=1c#EZU zH)43l7vM*nV0l}6hXAAWU-j?Ay-CK-0eTj}?Xou3JBOX68%#&cf0SLTEp#}dKC|vF zQqkLBp_|H1L}fRsPiBglRQA|L&shj=&3V&&Wp-F1h4;dUOEGry!g1NQ@wSJ90YL}W zrI!_DoF5G7*2{m!BiU)Q8Ma4pOgn^rPb|dRKz;9%+|H9NiCp45Bt0w9PWFhUg8P@< ze(2VvlpYyOx3jotQ<|$6+atZP;1%+8n5&MrXHF~k+ndO zyh7MD)Z`Uydi_9Ep4Z}sJ4xIK({b*I-mmYtb)FaY)VyhWQRX%0`L?)4qcbHUe>eLE zlAAsxEGN&{xS8om97iX(mDIK`y=7ts4ycHwJIHWVxR_+gF_4x`kHU z7ri&O(#55su{q^R#;9Sp)83B0ippK+G|S>N8}pfn3A(uEsYt89v{8N3&Zf%m<@nwD znt^QI6E}AoN>rhg?s!!awuW=cy{r}cuAhf{7(#>R7I*V)J4<^_wWu42=$OB^Bhp#w z4mWPgPFun8d`Y>oOm_E7p7$|zZienr7j#7?#*<`^dKMzuU%!&b+wtVY&7R#oL}dN* zBiBF7FEHDI$ume_UY=ngNq|99@(6~R)EOAGQ&AZD1vPv9|SZR(i$AA_X zEYTcOfw#aAF;+(4du&Wu&}}Cdij#-}BtuEpL_%kjy;}wYvd&E(GDMPqn^$;%-t1Y`$`MM%M;! zYzW+(>eOQ4l;R@%!h@?$zGA3G=cu*nxcFQ3CZQY0t@RV0aRdG)S1S*$& z(1;nI7%mBbtOKev8ICTIXTM+!DarQ>k-^gXdoomx3r=wgR`4>i@$#+R`5_~>w^U^x z`=#0^bxT(3{IbQLRS*!jOgS{HieMvwtPtzth**~R3U(n5_=r0PTq)kcfTI{*YyiLQ z0Dyoj=M&7j=NP!Eucv2{(`lsLj>1j6xH6aXUR)w}ksP)X>!OB5t(G^BR~KTm$=Ji7 z^=M&eo7@cKh(<6BPy#T>3WI=r-2QUE5#T&kD8-O;Y`g??U0w9*OoQ!H_```^2-k;BuLSkY+%Y`1!OR30zw-lbC z!KL_-x~tyl^05X58IhjdwTIJQpDdkFtrl1JirHBk|Jd_=cIdruf@Mq8>7=l@&kBNh zSKGNo;IDR{&2M>Z{o{SFxAXiasLtfO4t(1yURP{@`On*_fhTig=56Us3+r!tDz?C> z@+$?&k5!sjCK3p1Z6$-OY;Z{_=evjDVn0;u#Lipkd|q*9%q(qvrQ6vh$ZVbj%K74D zZNwB*w)4%GrT9R++6gc8OEeYz1oV?TKD!3hepD?~YgMSv=a;J0x^!ET`N?SwH4*wQ zPonQKH)fTtnh(OicC7Q6`j)4Zw54b%PwlJpbDdr>%A_h}ON>ja#hIIKpskC> zDH&Ne)4N<**FUf?88zQoYzvb-kTc4N&?zudri5D%x@AsPi49hL1~@gnzqTiTxT9ep zN^nl*wT&8+1T{i>xca`|jZWJY)Pfo5eDcNxA?@ljU)PxbSm=@7)6d>#WIBr{AwOiL z%r(R91H#6W+v)2ts@`w@ic>DcXx?zrpJj#dYPga}T@6RIY~pz_E_e!Y+Dd!FjXJZo5MEGtLJI z(-+SG&cYp?CTut37`*BgJ=Mn=1&FCA>qtXh-VO$ z3NY*8eUc~-bD0VA^Z{fH9O@@Y><7@U0Ghd$IoTaRdoVWz&|UzDApvL~0PPE){Q$H- zb2la}fDQ!EL2z_1b4vgn3ZTOPNBH*baI~$LTZm^c0Fs#sECD96a)>|*LjStB^w z62MY^V^#nT^Lu0s;8;Y=6*d5Fg~J)Z;po3X7XY_H;tJrFN#IQRxD^sAfLkGP2XMdT zpxwQ~nD7dZ2Y_GU@dWV8Jn)q;0QeO$F95$H$Opi$aQOmw`idey0KY=!58zkGXaIgi z5i4r=6|Mk)u)-DK97Of^rMiazgcWVeNRXF@ClgxXWoCgZ)t~vk%>GYSELUBoH|Wc0 zvs~AhZ-D?|#fl(+uwq3pKvb}-`|;Ot5Th%2^)0K^p=e&-c&g`Sma#1-M8 z0C7cl7_fZEn6Xk=PRr#i|1(EeEB@0H3_yUH@`73ipgb);C{{}X215B-^6VIO906+5 zQrtvgW~(!RQKzty46RLs&{`5)>dcg8q98P@rAtTe!T{ik6}vzHTrp!8764cLzY7O| zE7Eu20r0o>KXUd@gRCP1nCHT7w~IH`m6`HZp)MiIhyg8#c`S5vXc53ZK#jz-VEG40 z9YFwCZ;t==Hyj=g0m{;Jzcfw$Xn^+^^QO(S%~Jb_gJfNNGB~+-4cM!1WaMSiXZTk8 zbE9{Go6}7z&hnXFY_s6TH>QC>6ijywx!80ktuMkT&uJTK{ot9Vu=Xh~9|Q#^}3g(8bh6xLRqWe5Go z|Nm>btJUHt%VJSD^GAbN^NGPuf_Xck6KC^im@OSR*HDz~(C$I?*9shv^9nG{_jEw%iJm} z+-xqgnpVdg)Ezf%kPoU(TOq#rm2>(J;sbobp8pdu{GWs(s}pbp0uD#PFpr?xUvK~a zmw$5(|2qoke;vb&LN|^;BoK%ekA`D$e2AdvZvp=N+3HEw9HQAmqU&x;@ZN?jgoGgd z9U5#z5)`|G&P%}(us95e#j0U&5TCXv8<7mjYok3WWD@iIupYo4fG-a~GM>aN9jh<` z$SfJFFw%cnOQJ9j;i`FLkPOvnD+n`B<6nQl;3#-J^g|m(r?A?_Uw;G1WD4`V|BX>V zRvBA`;aCl16^5s*QAHuLO5NY{h-At#Fa1yXL?U_3Vj{?@>3=UKQPyBgL9AN&*E|d! zhgpjeSl!~Ec}#xhgC|l}lVI><%4(}I%c`6u2O zBA(7_nX5n|bINLr%xXt}&m&=3J#-aDVE$WrHO7qRYK)9!-4U1%{SRx%1XfFBJ^xxr zCWFkz^fyKUSuJ}NMj)**hC*hw`&IK+g^A^V5QAN#7-R-?wOc_9VGS{ep;*Tjb+9|r3Bcs14s7u{Ya47<=CD|VH?AT;aTLvw#=zF0+a5+=4) zY6Z7UaBC&dW5Kjr*UDJ}30d(c?w4IUhtQZX!w|kFNe_0=lTCfLw|3X36Qg5<(jUb3 z-j|oISv;du%yy`^?zCnEZ#qKAaNIu^j0|8CTg7a`=bWhJ3j4;;2LhaYQVN{e44&aP z=h|?Ij(a3@qqgoWsmQS|@r@%n9m{kMVMcooMP)>0|Ji$^Z+x6Pqugm~c&YuVeav$TVsTSVzS50l*J%L`zwEGS z9e2inqeo9L=a?y1a-P;^ZC6RVIMUM>4pUw-0XS7_0oF}PZ`O+iuYJ{B@nSdHdvynT zZ;dH$XFr;2lcImF*OIjfaI`H_>71wAi=sy_q1vjvY}1VIz{0vZ70o(?iHh^Q%N4go z;VtpG_O=v-%VGY6@RTpYRm@|1FLZWGf6ctzCvD*r@%{98)x^cc(eDdaKYh*~pTE$V z{g-Tci{=4OlhY+1&UE}NlBthtD5{8f)U;Gxl9$A8ct7iT9;KUmH9>V7#_XF&f&fg0 zHg=4dc9tNp`{3n~V*#p4b+ zm(TuWHwIoa{7dO^p)=X4YRH}I1Y`DjR{a29h?2z3*Kc^!AAi(-Fgfx1SbKs^`H)!7 zP%FRhL4Vr5R^khO5u*`5{}~ZfrmdZ)#n_}wUV7CThgs9w{#mbgqN-{u_7l1M1CBOM zN+0?8p6m1o4EsKVS@9Qf^#*haV15is3aU;C(AcMz!U4J7Ejt*F$oV`^E|*c*Z1Ra3 zojZv1KKB&rMJbJdE2D>84K1?j5Tj~OS@T)bH8T4L+X@*GZw-E2$Pq37m~!pft^I0B z_JbvdH<49MmDVIUf-_==$$ScF)T8Z*%#mG%hfT7lolGv_hwIfB@lB`!=1}l-QL#Qd zN&D!|s2nRl)6!ry_u$fY6zGCY(1t~ppDxLPSV{2gj*(Z{LaNW;-lerKuI)F1Ffh%+ zL*hqK(_3)NY?Ub=3zScL>dQyGDQx#9E6t-?BPzzIZzZ%b*~#zk-rtxQsT;X=buv$8 zNyX!$VXbC_&!W_G7g-g!Z_tk)R4$M6<@SXJ+Ier>Z6ZXf3U6<<6_`%Q3EGJ=$tX<7 zKE?NQu&?v;3r>ob5Y8}HVf*yGBB5L|wOWRLYpb=Hb!MT3%sKhE@uwXFF|W+n14cbh zF73~HE0$4KJz|<-qoWl>jqee$cX&V0to={W>n)qVMhamG9i&};Ck1Xqb(tMM9D>U> z?&~?IoDM#emsfdaFR%7cR$i^+-&N{%uP!+S*4JTj|6b$KYO4`ByJ~RarAV?9hS#R? zEH?PbE`e;7%yXY_&CuBA)BHN99%nrO47e#lL)N;(peZs}#`R8&m2wH})^4gkrShF~ z^Q}`a`b5JN9 z!GtJ6E7C(H{XDdyJXES8@7qMAX3fmBSk0bBXQj;oFL+&^q0eclv%_}lcy?@iR?u_NMbEgI5F1mS%yLhhpH4&}J!PDCElO$cQ# z)2wZED$#C>RB!bLh9F^YBUhE;fl!1ISL&@j%Hy&2H9OpWEL5U=Nts*uE58}Ox5f)8 zdrC4*HnTg=I9q#kR^ODqi?k&xE?pV z@}t}`4$0+*wT0y;Wu*0&eV6-@@$}_F+|!rOqvgX9N<(jiEh9u)3}la3=tOtgX*G$Q z^LKw+o2YwIJ>sCx>%j``S^-D?o#soiUnccpiLop1*b{Ttoc$|Zd3>H7h*vRf6C^!z zPD7N0cCi~1_c#caxNmBfJ6W(zwp^ewuexgNNc8-&m*qtfsp}{A#7NkA;1juHRCbp$ zH;W~h=zBXYl9iB0uL^{6a7L8fQJRcUqWOn((N(mH-<38r2_`iQXk;_@A?OVEt_<&V zf5d{*LALgOalx#P&&x%ZWd@uqby_ZaFouq2WyY${@Me;Z=I!JcSQ5=JQ`X>j2;jHe z-}3rsgG@wwRFUPk_J0m7eD%-&>Fid(A`E1p8{VZQKTY0jr&RuzMA{z7V|rZt2kQB5 zJXje=WT?l)o*1HJ*e(mF))&4Z$@vk*AjW82!~O(?$vGRIbPGD zWYfW%Ic7PKd||Ijj!~eKEHmNG?Y>X_37iQwdGR^9Ht!5iD8JrsVP?okSkexPv2d;4 zH*Pi<9LRa4MZW(?=4C18FSoyRIRhOYb~o;lDPp#^#)*iN39=>M{_dnn@6y(Q!q z!p!bm&ynHnXQywdW~rkupsr6|F8nBN-O=hC8E{lebk0QgRnPVhp%ya3laaEYy0mTG zYf1x>YDPd3h&VFqkb|Vmp8g?kwXWq2q>dz}Ei@V*e z`RYRjG{@8g9j*v9%X6we<4IKU-6B8AT^_8K-;h;n*X&S}xusKEh_~@=yCc(B_4x_P zqIX4uzr14;f;+laaeykP04V{3#^*|7l|?VxXu0WgHN~mpIkc3f^9Q~CPtm%yh5kOn zwdDglqben+tUB9WQD=#oCgv+}ZWzt}vGAp8hW%r{D$nBl&!3~+qjP%>1h8om)O`v? zE)Mrz+qYD{RP^folCX8Mn9-FVxACpDg#zgANeFg_Q?wJhLiYLEH8c798#FGKj;Xb(& zPo``fp65)J7$@4$#8p_N$eS>dwD_#jq90}Nt_A^zy{uwYjbLM4~^<8NgBt|ZGu3VjQi zdB2pV`cGx8aGMzQZ)RB2rXW;&__u7eVYZIiESsI`Qky$;ppZKVKb_or|Kg&3QpDFA z*BG_)#qb$n6DPqS@^+bmZ%-YHsVxrUVv2vya`@6eg~{6)9GH~+jeZhQAuRb zeVYUf3(5eL~Ffg!F2yzw$VW5*R5~PTo0e2vf;4`szU<(3S_e4Ah2DT!RbuJRxFpw&Osws?Jbl9}ENlBv`3B4|>WV>zdVsU|^su5`3r3!5VZg_(2g_cN#MQ1BaDRpgQptn5&GelP8^off_1E zu#0>U%u+>xMidjUSPcnYqPzrq)sc1S)H5*9M*~$y)<(g=Hcb@hv2zN{K_fTgFhuZ> zupIlWoj@ms+h`>eu4${HsGt5NFzegk=t_i-`Bn2hUyyvHier}NjlL^)8Fgb{rxkKj zOM1#mcVk|uOL-3RoMX$p_8k;q*Qd-jnolD0)9=QN5wElBqtQzyW$zzWsV5!4p_j4@^RW?V3XDletSeDoaZ~Q9Sdv6!{B(9!geAOIc2q{Gpy2uNc2 zh0y5$+9xP11p4$3rvoI&*a$!y17tjaHV4Qg0Br?OFaX*XK-&RmdjP!~Ksx~FJpdK5 z^Z?MFaI_bI#b5z69awBz5d=Tzfb_X+Di6-t}fVbu>&+PXoKPFRtzM!fXY_IC0PMD%rD6nfFiGkfmq{kza)DAw-y=>odHMqrE>tF|Hjws_5e82FUbSItz&os zxOEIK0Jn<4h62(7{2B=SSH|$`IBQA7uS59)YZn5t_5<+iPyqmb9f|?q*P)mIehmr^ zr3b$b1(gTDuOBEFAgmuK*dv6_3}n-NSO8%iaZMHC@9PJt)^OqIV0wrboe6#al|v}i zgmv^#fUu7Ks}~6C3_^oFyyyU7{lJjt8VjgD)>?zG&SSM(h!7L$)r^J##B~Ny0CD}m zYn?^JgVHo94lEJWqa6^Y5COCo^f$F8B&?R#01y78?ErIW{NNBx92$$WG-V#je{4Vt zb0ZF@=9jFEIfw-Cr8S!mk0oRA&@Uxe4QRYEc8PKjiD2?Bv>%DEin{s$OaQ(nU`g23 z`uwRQK|KG^;VB#K2w3Q7f7lW5SWwbN2?eF&w;c?gfW?CQZ4_+q)D2z)(rU4Pv&Rw$ ztKIaw4szYV0vxnOvhfh?AI2CwnY=+qz(5!2_n;U8mIPJ!Hy{iF%HIYZk@9EyFa#KF_g^8Poc7$T1HCvyyuydhT@B89vG1gggdUlMU6X%c0%#r{Kj6(4%Y*flng^j|V$ z0@OxpyZ@u3Yz#=IQa6yH5LPe#>hoV;3W>TQ3luhGLrpPM9B~6MmAE=neh)~cU^m)P zHrDq-$+B_cXj;z zt6R%I7Kh)+8b_x7*@Rd;X5(GL<5$PbzX4YTES|I>{ZOl7|0jd25D))AdI%gG+s#9S w(v7wc3St2e;Oe+BXZk?H2RioJO939r@(5u?hR}WBSQ3dug)1nS*qFlq4}^_Me*gdg diff --git a/publications/comnet/submission/Figure_7.pdf b/publications/comnet/submission/Figure_7.pdf index dec899e8348f2e33ab7c09bbed416f73fd29bde7..9857b250875a7d5ceb137c335afbb44139eacec9 100644 GIT binary patch delta 9008 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 delta 6500 zcma)Ac|4Te+czRiiOgilc9T7sxo7U#B>NIVq?EJ_Mr0ofp;3rbmTsYhvXn$*EQylp z5hD?0E8z(xDOs`=zZrR-C;Gkb=RNbsoO7M)T;J<^o$FlZ{+!4HMARijkr)CEQHUA@ z0v^N>02~Bq5FiLof-wmBHGsA@lIG>??RXRkTPverZ-g4d!cU5{?!i>y$E;ASQCQD2 za;L@a`loj{I(v&YTs)5Rz0!6_mw71!0(#=kH05hZfr$3YK&kiesn&>E(-gdLZd?r~bK76d(Gm5Bk0Svx9DCuQv7>Vt= zjiPF#{cOV=L#XEVJI!m@4}>m!vsf@#cvwA)9B(dKh`nLfy65gfRx3+cuzpy03l*@Y zCsalC_w(fKKA#)h`QRfX>)>;)M{l~!&urR%ToXEummXtGU6r3OnUef@XsQVc^0U-y zsp0eV`(VuLlRkR?;YfP*r#tiOLO&h)>EJm1iP6oNRUR!_@Lu>-`Ng~Nz8KBtkm#L6 zlQ{A7DF;er*0yUz4f`nW6i$nE`cTPa^v$e!=?N*+$RetjJrUZpm2vZ2MVnfya{DDl22E6H&0Hm>br zh3VgGZeMR`8G$Q>svV{d^@N^W7%E)lyrOUW^1IE3(3ERGh{=6OcrM`IR3O%Sz7 zZJ7T|8v~*SV^!{n4f;%e$>KhbP&^Dz?yO3wM2bz7olatuKUI<~un=fO+FK4q>2H3? zqKl>_`|KXS9_Smj0o&)zdpG+Mn5g*ZsI=YsCsF!q0acXEc4Ph8&ryy_4ttujpKW-> zb=A!Fvu?Cz0czy&8!&ZKqq+MLETL%kTuqU0@>*h_uOM+v%$Ru2iHP_;)N!HJ`>&lz z^bTd}UjBKwgK^J%b?WH7)u}?rV>?WPCys9@<9oxC8=2|hbc`v8{ntcUgc>XuPCS0W zbH4BRs_een?U4r)i@>?-MFPnih(o@-#E9Jd_AW_Hk-}FD9!VAwI~SC+?eQyj9-2+q z=YU{|>6)SW44soF#^-07<|pAdbM01EYfKoYR1FL}m3ojnu^us93Or)`q><0UsU3{! zpGBXgN3O}q#V|b&mT2<2*Frnvd?9`VlXWFyCH%%l{x#=2lcXIz-Wi-%f}VD+&P~FH zZLF2qD_}JsSgI@SOgq$~rfAzxM@KtK-L&kT@a>gKG*8-1Zhzn}BlfM-&zynZ7v>_Wm%<5r4oaW&ZW`BguGwkJPZ6J!^l-Y{_3ua>Hc? zwfFAJ)=8hLIzr|NH{$yIwrkYx??SQXTNp-MYN59)XoXLEUNqkHnYvrkl%gRLy_ZX# z3)RXye|5oPHYNI9w$MW^=h@sH$wLPDVa#kHezMD+$GN>(sv}(of4CGJucHVTB_37} zB{R%=#6zQ*6MB4BLI;yW8e2`W$5mbzQqy(T<~$GC<2e@fnkR6K*f?f_jftK4=mhJi zWQ!6K=AZtsP8ce4QsS=?Vy!wg6%&=O5y->#vc--^7n5>iCY Ag=yxi{0Pe9|l{; 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 diff --git a/publications/comnet/submission/Figure_8.pdf b/publications/comnet/submission/Figure_8.pdf index 0d03f190a273140499938836731cb963c361a9dd..5094ebb297cd692be24878c049893106b9396249 100644 GIT binary patch delta 6200 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 delta 11603 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 IE~|q72S5ka#{d8T diff --git a/publications/comnet/submission/biography.docx b/publications/comnet/submission/biography.docx index f810bdcbbd25c32843249017944745ee27d4cbf6..2728c0820e328f7a1dd7a593a0f6d70b696180b3 100644 GIT binary patch literal 11656 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 Ix?ipT0kK3@xc~qF literal 13776 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�F@2_Ve7zdVWG|LzD-%3S&fa3@P^mM<)*gjw)w z(5NS&#J%2fp(lSNy`CJgiLV38GKVVkb%-Mwp0$aM#1+A+k%@-=6Oeg2$XMRB#9cNg z*w&~nLJH`n8zk=5Np>p9{WUKldS8K8RyA|5sBS`Hbm3^XAM6lC^qLw6_U9-8(HX6g zv!*~8_C!`#hu5x#y}D^oG4ukHx|nOLbKR7_C;uB!Ud@yUC7g`v6}`ak5GI0G_{SbM z!v!-RF6I6)X!Vl#Mt!I4>jkVGRVJZ}e6vXCl3HLW;u0{%W|J=O0rsz2US_tWh$wVn zF>+BW8c-*gu5;ht{}d|Fv_mUdZzLOfWGnESQdmLV0e&Ubu8@vsysR{x^kmlXIvxe&yja}xu(E$05gVpG0K~`6`Ob7eU zl`OFA(3^H9c@Mo`IDIpwdDC%44t@9aG5du#iM(H2OEan!drL1!e)Vkg^^tI2oH?lV zEU9b97xL+*yQlm4aWFf7Yx9-S`N;5f#P9)~L4bQ?U#fgLNZxwE7&Wr!t<6`UuV5Jp zcD^rnAx8OBds7|qEh2rkAwynf73$~ax*U+<7VQt$YanFLrr*v8EImpQ`ssAv?;%@i zP1Zs(FFnMPJjRMp&jq^0$T>06G&c^0eZ$4}oZE9~pJ@D}ijOPZ6SEmhfya!)LbtnH z9|dP?uYmrfuEal1dnX#14i4^QmOK!a{e{9K{cheqBM|IIs`76TE3Q2`Ula?_j3P2vcsb#ignRL;Q-_(s?A&|}NorZq@v^j*tlfFjE{nPO&-zyJx z#6jlMFkXdgSI5U{LUq^9iX!nTb1UCIb=TTFjY8x!Stb+m^q(9&=>FA^9a!BxMQQ5b zm2X^GV;42{IULhgC)Pm+xy6G~>jqT7+U0N$T-#w@=h{0m*UsgphSR117W6+}Y}tND z6ZYLEI7ASv``4c)yOv4$ZM zej)N{X;N+{VB*^;yHXQqk&8g;Mxq*ZC~Xhmk_>82XPx=%S$sLtB*qp%E)xFt ztz63dd2r6hFyYQS+R(zF)42Eob%eR)utW7g@|P#A8FgL#7YcTVUAIayt6N>9ZxqL; z&bY$Vo&H$fzPF`-Jst)s6pGHXoW}c!X5<+CbAn>=ie{(TvA+cq<20kNI6}r{)boM+ z;h3H@Cg!HZoI(W^9Wg{g(Qr&rK#PclC3xaPjP(V*g)aPEg1MAHM6(jn30IA$A!I5S zhIWtTYN}Gg^jVhuvu%30H#-khORw&+a2DgJN|GePv=KoZ0^pe`Kwf7502eWl-F&68 zg#lEm>0LS5kn&Tydknc3aN5sA;%Do(X3TK?Hl(8M0b4L2mQCFu8m)3DYA=`_^{f9HU5KpM7%>Q0`N@JGt19U;+5~<`&Ewtctm!^6WZw=cQ|5}? zW9R@nuLx}pG6eSW`vC5zZ_71gu#L(@5&8`qPFZ*aI9j5aePr%{ofOiav~?e1fmc4F z7QISHUp~GFSF=9bIUMt20t2t55Fr@tei{%bEaHcA5?~REzGhk|DOOZgKkT^>yS!%D zx6B3@8AMrZ%;d51+u~GD&$zFSRJp`Uh@pHb!ivI?W`+rDNTOCfrC3P$iGFXCdGz8)_u4-t-#PUishwq`>2~m^ zhOYIl8D9Ll&rys+50I4_x};eDa&l7q?0a%s&W5S(4u(~l()BjhhtqL#jKf4~$qy@I zq*03zQhZVB5WXV--;G}~Bs24J(I>OA=8y614`AsNP_KwndcmP>X!2EB zok>!q6oIN*_UjHTvXL>8vCx$!dEI0uoWOIm*;22m^N|DxN2!iHq@5B%p&AAQW6W+h zOZvc)j_PA*;fkFYM6+mi>C!jxE~Kry81c51gHq*wrAil_h|0q5uIi(zlDb>@sKj;Y zL0;h^1@~GPN0fGV3=lKt zwo1>sjkTv5%Zv-ZKI0-nGa+U#Q`1^?%FQ{obpKFmf`t_-lT%U*7j42Z2$-1Fm!!DL zVT@I{T=Bigh!<28{=={j9VTs?U9ueAFm*Y53b~Jr38+Os4l)JeK^I<<7Z50m6g*e%N>YBGImIC#^(u zDLdOK)fMj?c^Tr)rvZO=EQBuJ4)Ltb(Au=N07?yY<fsLucv;Q~i@~iUydh2ZGArR=Ay z`;5(K8cwPq8T&|6a3U8Y<~}b7g^(woCgH!MdIKTMSLiq&x%O|Yg`(&+W8C(Iq`vbA zA&ALYS}xLidBoRg6m{b8Df7lvNsKYnj>Du!cOb7T@nE>L>vX#8e65O!F|lW?6nKqm z&%Vt*|FfzclTBM6We-GNB*+mmJ4jcyn5DKcCy8Eh8i#G>r5pbE8#G$Dv5=SVs$IgN zb_>*5*4Shb<5t!n)MIW}k%LXi5)HrA#w7k@;ky>87`nWcj?EJ*k{j$vbD zSiNgGm)<2-wU_690GVW6R?b1>tQ$=0r8E%3k4G1&^LaHF7YK;QQ*b&`FOW<^jdYt( zRv9fA_Z&}Da-^FbdmTbku6?b2LPa&c%K~~8INaCRaIh#1>eP^@HZV0QaUNOXg*i1e%8 zU?yzguXvbQ5q_~K?zm+DtmpKz0QiL!%O%F4ryrYezvoRQ2Xxj9osOQ^acWeULimpG zk1}I4p>K1cPtVpHu-dO?=CXK0BbE)%JrvgGoCJ3GTycM7Xqh7;Q7VErShiR2u-CgM zC#ec3b&s!eBb~SBf5#>85?Wh8yN<7#_Ft~Wcw%RS8(;2O8!y-DS76;$n0&+n<;7BT zo5~vbA(PMhyU7e#;^NOR-oBxYvt#jhPHgafky&@xI@r(G7NZ+SE0=Nb3)8XIS^0J| zeM$j6{Qgx6*Z(Ie`c*yVc% zEDoNz9T(KZTpmGD8^N9hq2%NFkn2x26a>jLsYh*o;1UIi9}p6wWz;tzDF*F#H3+XW zPbwWaUNoykxcx$2iui`R@u9b2SBQuUAAT_{L(oxPqOZAa+nt@i`RaC#YHnM4ie5F) zhZq9XI@KR8e5n8W2g6I|QC)^6=1}5#7m+~k38Z|XsuUB#l|%ZlejJ)+dd?$F zcOoA9;^-mqQn*V|&A5OuGWh(Qbi!Yqs{=q-QC^YCAfPCPH=a(Fu1!7 z2@XMmySqzpcXyZIawj?eS?gc-<-Xjv-CZ?%dV1=itNN>NGwrC4em(Nu{i;7kciVXb zQwR&nRRO7%pM9C& zos}Hy|8`!&vnaBIWA^{qDaiqjlgQ?E5!g83Sxk&bS((|uc-_uFXCn9&6D6=;TQQEX z5v~13^Ai0NfA}apc4us21}vLlSIxo@*_~)snHgQJj+JIaJTQCkEsdH_K!~HEuE($n z?7r#W_9-(?aJd?r18&$>_<3F_h`g)nGb*PGNIo%jRMyWqT)qC3?d-a*ukmd8k{EQg zn>RSq;O(4>JXVAqRXdWX|dtCR+E-O@``SmfZQqe9>bwG7#hEe%K(!=VM~w z(Yu1gj(92RVK14Hd*w!gBo=aZmhu+nSHzNajT_BHKJ}Em=w+rjG~DugH^1XsjCN=L zy}CsqK`n^^;Z@#e*a0{%nq}P`K5yN^)tpl*>ag!s{U^!6NyzJchiX9DDi>q5yI5^$ zi!#N%_8tjt%&*c1rGjhz*`x(O`??f;S5G zG+R0tf}|!f60KcE3AovL_Rr=m91QGb-bbd6+!zN2&?mNtYi&fk(cK>OnB*9;g{gCt z)Es@Mb!6O2@-lUSjpM-T3OD+-5yS zESXToaD=Y#sIuX&ZPhg{zm@K^j0uAEr0ETA6Mlxl+4{G6;#MR@cc~3{FU!j^q$#m< z@urA?AgpvM*!+2L)HZ3g0Q%63Us~$%(GB~hm4%%NZ%&tRsuO{&d`ZLT!$m@OL2+LG z1j3mS$%d0XSyexU23{=vjD}Q~#P8@-UY#^uyqO}!{tWO{Z|<9TjK|92XxXK3 zcb)EGdZ88fRUhr{sQ>JsPV}qe-JJemms>(aaGoU#uf8b^e>9>iMkzUb>g!2oi7>o* zn9_s79az^ZwEzK+w;g`gcD&dvcCx$|y!|3s>J*&sJREhH`^qvm$};|?;Hyw8yl{Hu z4)X$D{%KV_IlcO0h8Ug@t(gY(>`m!rEuFx*b0&BTAV#(3-gQKg$^eR-w#Mfl12xB< z;{~Tpqi!RVto-oT;s(=n$&aBmBUn3TEITSoGI;|Cswexv=fO>E@ub4SX9kT4JmRzV~JjAQx ztbk{V0SW2gwt6G~iiWmWw8@`T3*|ua$*reE_Mbf zYFXeM&OmqtT-c=T;cFqWH9?X_@I{u6sSU^_X#k29!Jf zMv?|+kp^c`1!ti!f1uD*LPb6}2_hT@XGy)Ot#Xie{g~aWx?{Upd{sN3+U1Mhn#Qq* z73(`X1*5SlNQXQ;!6+FA&F`vf->L2A@#i=b=m&Ir-rX5{<{@|$7MHY5xZr-D5fN$W zcz$#eQZSl3-v^7@R$7Z70uJoL4u+WPPff+pB+Cu->aRRJ;3LEk?bMMVk>jac!}g+Y znu%Bfj{QcrQ8OLG<#&8fyVkb+9mngn=ypPOB6E9;-1Yb+uk|N;w=8gYky8PACs7x` zvbTM6i3RQrHJGbo;iKpuAeEMQ-!w8+Grmx^BDN zwu-tL6GDHMBO}7Evr1{De|0JhKTPB<56Ug2INBGD?n>Ib$l7Cn6j@5NxE?89q{wn>&{!X}z?A7W#)=`wN?*1YM0J#&Uj z#*#{#%vB#(6*#ow%dbuKVjl8bfqUP)*FOSCAZsLAGZWT+N@b7!_F3oNAv$|?b9fDF z;O1#d4oDPV!rk{ShZp6l(Ma&w<=`QoNwW;tW{%w296RJ-;Psph-<4-w?8`vHwRi|n zmXpFkZLO?_@{SiMPN(hipAvQqr9XIo?Fc%<0AW2CNsk0vXu}Re;8D)l_Vwu@6GhOfElol&E#|Pcu=PJKL5Ejb< zn&`Zkz*2|Ln3<2E^UqIV0;;jlRgt>D&ko@nE=uuL?Y=O_Pm-^|Mc9iDG+O`MzCYt1 z?ALWa6S5q<8qI!t({r$2|JK&NL`>@Qdhq*s=nfauukpuR)V#)K7r|9!rz+RBM4gl( zVSQ{!!96BJiD_NTxxyd?dG;K6EbPnm(YNs-CVV>1(_Eb)1a=o)3X$ygfbUXn!%!Eh zigJX*RXI-4XOrrlzfLpkAHGl1aQ?KEZpBqD(vKWJ=|nlT1ioi~ZFD&IbFhz?eFt1Y z=_LV*Fd)H?0e_Km_Ww=g_k+s4|8GA1|3&44pFhA@C)fr3zjJ}1c4Lt8xBuj#{{Kt0 z|NTPHgg+SX`76N&xd(zlk^f>uh9JTqFw?{i+7bpc--;6ge{o#s&2@E0C_^u=Yz68N zpLgy}d_{_Ec9G~{M*o~N>3f6>fwtmb`>z#wi1`V90nJ71)vCEui=MJ{{&4E&HS2!8 zBtlb;&og?HXOWcq0J+ASNdO=vyQJ0}L?< z06@~w;7|N@U4ztO0N9O65dandC@U7Mxc(=$2C2q@^ZccR8sFmq?Z|%t9gsr~IMF}x zGsr3z+zck#q(KPz;EVXHeg@^`gA@I8KZE!Sz&*k8XE1k@QUJz?{&6?ah2WE5yaoyY z;wT3E7p^gA24F#Pv-5C*R7;>~fdzuYi3Eey9)2I05xKUJBJ1zS2L#gC_u{QWsBBD0 zC`r7b$G-dZu!}+dJgfvZYq+^V;)d?3gcrA$);Ld;O+|%;7`*KDr?22tc5o}!7i*}e z`Z+!O8I?#qw&;BpW!PBkKl8p)zq%7|<*Og`0~Z(PyND!-4Xao)Uc%mJ04ghcN&B1< zKiO}N-#-`FMM8S`J-?nY@mz?wPT#%8ZTQx|+@F2@YPmFBTKP?jvx-P}+C8~pvI55( zE!w$7=X1lC4%es^Cfn0AP6QRxh~aZ6cLfmlmL? zcNjItyLQui4xjigaW61e&u=k6-6o~b-9aLqFoG>@h*@<(C0~{md4T?t2^44ZdY%xc zkac=Q0O>pB*Kh7G(>JOXgW0`mr5`Bs+TpveEuwiQx(laE7)y_m4@4mwA6q}o_(F5? z)51^+FLlEbG@C)*R@Y&fNT~as=9V)PKNH3AZz?-2v+aJ-a#PvsCP~FM7f-i}Bu?u$ zpk8wuE#&pn`_Xd9Zw1^jYlU6FivY!Fnh~aYj2!u( zN%;)!DYUA*Cx6*k5d!P^{qZc=18iXN=sN*w|4tU9M{MbDKme>`Tq>ePbPA2Jva>XBsJDvWythO@Qr zzmc@~7_0vT(gu|>SUhAy7E{y~0$=t%UR!``=BCjyeMb#l_k=a~a?WvYT#2F#vGx&! zuL*#r0E(LnULp2!(ppJXSV(C#`F}_I*l-l=vDnUswsN>T8f?t^bM4e4bDOO(j(wtS z7kWUzvTFJg5h=Lvvtsh0DzScRwXzLHe1LL4E_F4AL?`5uI_l+ z;xsgFS7P~+nO8wCKF^+?u2-{(iL;fa?C7`00LL= z_`@S5qBTf(&4eCcLdShTSPi_Y6F^)YZ$u3F0Suj4b0ncNCUi^I@IOeCON#EE`|wqh zaI}xz9W{Sh;$g%pU<1gnO3t z4ovZ(GVg_&`hyZT=-OKrBX;kTY<^~6FMZ1xwXn+XtWD+}T4nOZhB?Q5^)VXn0VoBT z0#~P-J5>0c{vbyDexm1e zLp|xqJKWKDh?cqt2m(-SW$qPmqO$-xO%P%I(IF z;WwYN&Hv2&gAk>1=-7X}SgYDP!o}{$$#c7I57AtS0X4G@OSjqM_pw9>)6#)>!Ly5x z-K^ng&oaJt}IO7}R8MU+qd z2%6j600DYJEuuZh`FJfmFj(QfT$}72q+idSa%n_`7AOvCLO_+L0wI(m>e9Z%=d=K$4ufT(xxm^dfvbxNgeO9QY3QLK_<#1${8 zTP{zER^%K_kfgaMQ0gq0>d zMrZmtGEG2zpmN!UTxH7@2_j8i~I0-x`Rp^(DS8p@0Tx?J?$(p-oiQ z*5}ygM43W>jlIG?N;2@-s58I@RkQpO(sE)I#Nmf}s)s3DhoVH@XsE1X(AOTY(s~|)JR5Stb*h>0Q zCXW+8)uP_^@~rmRVdT;UnGM@TgzTP_Lc^_h%(*>#b-pv;hBG%pC7frNSjebX-GTVT z4KGDH+a<)X;!$<18kCe2Uk4d|4Ch6`#aD%lt@EQQRljU?8~$_@VC}KL4vls-f(R-b ze<1rp-ovxI7zu=D{d|8>3Cq6XfAw{^ev|nL=8pghOb(NUbpC*og^Fy3PBN3FcV3}S zL&4gR*w2;|9Xy#+R0J{4!zHRUq*c`cz>XDSz-%&u4ZMj?6+IhTR^Xmfv7&%b|F!Agz=e0RZ6 z0PzV-+nU4kRmH@P0p=YRpd7XtSds5L&*p`!DpVX~7A${&^r!+NFrNPu?&Rw&eLYH^ zf)L+!_`nWS{in4zE%>8l?x=- zW)0|(c2N#E(zn^q+Ct=Jk4{OX=(MmwCCrBB+8Ajq(uXQ(oUn>4Nzih zL2~$N5Y%Fm91(!nM&1_@iH3wwr~27Y#97E%rI3!pCp%g3kP4!=2hY#Q=opEIzu^o zsq=HwymtnzZPvfcUQgN=u!@7P(IIcRaKmI%r005tbbuE0l;PsqQ_qbjzZyP4Z7=xf z9$pVL8}Bx8g@&WwKAZm3!EZ`e*-S>~#*WK7hgHUd^zwzx7sP>V+?8riGAY%-@A#Df z_;~PsC)BJK!PE5HtN$8O#**uvxtp=d#@(iWW?jmlCebJ8?HRe^c%*{u$_NpNT9Hc- z{ZW4`aFDBO5B7695&#eXZW@h9@xzZ;-6t*}^y9fM9xl<$VFbB!gN+tuvpKcrl0;r5 zRVMarmCf(9j z8Evx<@3X>(kG`x1=ZLvtD|JDR;w6m8_Cp154a_0CbfBc*wr7;}>FXNa2SM?zyWW=r zp-{~cRueeHSgmoph16wOr^qOk$!z+KW(}&z>4~9pKLs6Lpd*E{#`r~Z`^$6t>xqQ& zpk}lD{-Fa{4E)kRR==3wB$YD7#+wj?gPY|*t#oPL1~6r3Q!yxF$PpTuY#&&EO_qz}<7K2lzYnEC*^g)oAvBo%W3`u5LOIKK3X?bMM?!T!N`wqmcxW=BN2ytM1H7Ud-E5N54nvpBJ_&dWuO0xtLBd)-VCN<7dRaBmGP9dRUhk#p_ zDJ3I{>@n1-H!oj_ys)q-cwo0qaY{%S%qaA8t7Ck|dJO@tnu;;$G>=lxMDJ4p!!-mn z=H5fdc7A^phb9P zB-UV1uttJb&^4i#dIRn#Edf%Ry2Xyf{S}QfMUa`RWCl|}?wE5nbnxyM2G3Dv{N=!E zCW9V;GohG}thGfp?K9PC8%&fR&_fUDRp(Fyf!F4aAFgsULxhlBmWrOG2%RfL)u?XZ zdL`q%qx~Bi+rkn0V%pcP_nd|1{@1(yN|xkG>t4~~G8uiREY7wka{_GOdglZ2TRM;m zS-;<*tR_z7$Ip6U;SrJmF~30hO;o z%SG6VWEikkwPxiddc8*%KvRqinI~arXtqw*L93z__nG%F@m13A%7Y7u$;%ZcJ1rmA zC$IV;Yt|o-N-9VL~rI0i=GJzt+G`ToFPwru5 z4w=c3Xh3;k&&hEN19>gpWDGSeyr^+ zLWC-LJWSd{SI9YY0+S~*`Zgd5+Qps*T<}~<>8O&1gvc>7?~eDQ)nl-SC0y5o$qnIy zY~*TcbA>Aq>>4pAt;F!hh&j%8<Tx zmrz>=UZ4=M4zD@gM9{fNYkKj*)-UTU0%V*LqY}J-S&e3+0h94&C4X^59en*H{uR1v z@+6HT7}ofb(WhaUAYnr4dY|?b6uma}75dD=o@Xb&#ZU|zg(uM=q8x+Gnw4uGEKHa0 z#o{qr{^mF$`QE|Xt)O3n5sm3m_ANx)^k>2c@gd`|MUYkB%`Jo6C(|$%cLPU^Z3sI1 zK$CH`>Ya|!N8ms^;6{)Si?Vb~A0Ce>$l`gJ%25*h^pEE$$2EptSRXDqJR3zesnWQ*BQ zC_dh_|ICGjyR9)^zfV(J6YD z*5~|ILf~#pJlXfg9O$x!GgU?nS!Q7bBT<4y_(a=PWTIo4#3n)W0gVucWG|d=DcWKy zOYO-yPTW1e>q|;J^8GFmDFfC@R3-|6#EIiDdu~FRU!FK*p3+=IrVN?cu;)2uS@#yq|Z2eG$gC;>a2uU|^L7zubX_x?l*efD+Sy+taq zX9_{&biwml4B&l>;K5Z#Zf-aOQfw17EnlN3Q?0w6ZEw++JgHeb?u#E&&ZX&fQhX(z zDeRL3?IkMgxNDLPlyc9}Q}CPx{`$!OZsEuc6mV-62h!z8mI! ze+VVD4NLv__im&`ZF6qJeer)a{2qKQ`~raW-58pN^%pFXOKI()dqt6JEdMhlyDz)H_M$%FsgDoU1SpAO%WPs9Pl zG}DhZ*Jj@mwTzo$?1y~I!c<55dBuc_@Q}j0KBIG_`mrGz{R4p6yF2++lLNEf?H4c) zGRy6b6wY+VC;ZnNhA}bzi3nh7H2t7ro-=28Ww@xqpK~L(vA(93$bNbh&YXO0W+=Ak z!s~@klt;Ve%Q;ocw@%U2bj!?#%8)P5>tR*-~AFEbx3DImpJO&<`(^*Mwqk@7esZ zk@EZ&sW&>RIc~ZFOU!>fgkLB?*T4vNAfD|NEW6aiX2)llN(A<}!STVx=+6M7%RlDv%{mtxVOAsuR;2; z4i%}NgXkIkix7mt4@Cq$FojdxL4N1+Q6=Or}+Q;u? zKIPV%55hk2UYLbl31XUBSnIM;RYax39d>!&(w&5P<|G%A)a@r;skjG$PYiy@>Zv1x zsA3}ps&=2P!P3L)K`K`_hyRi zlKbEO%{Z=}{aO%5$dpW_yy&n&+C>Zj-VMzz*}I038gsu)$}97RAykS|EO2NSXR(u^vSETY z8eW7S@EO<*J%a}nv%gVFZkhWsP(u|AT2!!Y%w!a(i(@#LhS%;CqUL^Qo8 z1iYi!7b4*q>_oc$T)45G`NS3Em5QIMgNob+8f;X)5P)ue*~|~A+EWa$eh8a+o&FG^ zYN+;6M?HDJzKLD`22L+oILszWKfcTzV2!KkYDfZ|_Dxe^DlsZWX00k8G}+c&GAoxu z=|-y`^Z5zucSN=2vOsB6spKd1(Vr8ey!*2?tTd#7Y+#iNk#@$kSwJ30zE1KX^Hc$} zUBbN7MN%{n9?G0#@-foFZ}=g?%UnDXf374}>G;;-tK$F?&1F` z{6TS;I^Z}vb)a7)rZ*9{FW1m=9AabLyczb$3CnC_)#2;QtwXz(I8NXa=h!v{(rP3L zZjl|fNZZ5P^oF(E<5h{oJ-o2oyH0h|^%%g5@>&Pen)+=DS4%`$unWd;gGdG8Gz&Q# z>zi+faK`y1TPC5JiR&nls0b#()|vUC@GYTyQ~dacwkZIWiNbsC&MW72SoZo&CEWq) z6HrbA9{87%!2o4=K;%Jk@bLTtWZ*c#%5bnNoEN-{*b{;htX2>fg1`fx`>!t?Ovmv4 zmy`k1F}(jJWx#X{?|(@dPH+q+WlAA9xIpqd04_)tQSKz8c>)-&f8Y!o2niXW|F@B? z6s&ES)6;cXZNTz7sN9q{KRrt8+1tFsrLilt;>Q>~z9l;n&o48hsWFpxzrKGCkVohJ z(6=Y2+ngd5dxzl}?(*!247-1NvUcIX>@MPa)AoLB=8-C_zv^D|jwJ$WKLqwqkhGt6 zc2AhmTprm;cO(A$;*~^`Bxh_&LWmC%d^;rAmJJhqGN5DATG=>#0^VIb)v{=0Bp!E$1gf}S zzLF3@Ly-kxjbm^gG&sdGGV%?YXQ^b>&q zW#xS0U@gkY{ar{`7A-W#2(jOFbThx)O>4KM{ijM0f*Qg}fu=4ZHOY)2CbUDwU8)Ue za|g*?Wfu^HhDcprtEOw$h^ru!*9}ZY3Yw#eqrA0rAwqAmXAE(r>?8YK+pV&Xh9o)p zNn4_GKRSIgU-56|>LJ6NDR}XenRK;;Bu#ryxU+(|P!!0RcSW_IyT%>BWeoE|+29AJ zXPWnp2fO>~_w%Q_hW9P2cLlQDx!dxqg}BzYA{y|pzr9*@>$`61*RXQ}VxPEBmB(7~ z1slE!-Dl3>OycbLF!ylqavW|b1d$%#TfP*EVtr$<&c=S-C- z5|$ZA&^E8;EI@TDBf#cVo0(RJCGZhnMov;Kh(mKeal(iO>d`RsR+LTL>@p#B8^S`} z$%~;OQAW@#I9_Qm@bdf*aJLp0;rmvI#}^k9ss}9-wt%SWw6-5VVds8ZGEkC6;$O7K z_f#@bW%p~z#C;mD-X4&==ewouLDjQUP~^9zz{WTCZ`2iSRG@7{S!@^wQG z*y8*8HX}Vtn!VoscxkoJ+1@VL`b~yUY|3Eji%Qdbwe;THXt!9#AuysAH#~!Nogs#r zWc*qThAQR+NZX#`(P2qf#;Rts9xod?h1-W4qrCy3K%B-+p6gN%Arkx&kIK?EVk2wA zic+pIK(q2^E~+Ca0$4polxtLxgAZ|w@WbQ96nffV=@JjZgiP5iVlWu#arLxdhP8T7NI*j`-%nHjDQ3Wo^Yp2u3_bqPP|5* zGeixcg9vXVtJS6e59utz6oEp@;?;!2e8<5Is1Tl-Rl{+u8h<{D38eFAD!3+&>s8)) zyc0cvc*#yfiAz?_NKktL90_W#qll+^d2Pk~aT+KV2^%wxFjWAd`$V?ex|!At*61r*03$$R-9yGeQN&3s;m}_K1_u zInN6J@f{+JknL-ts@*CRY;g`RfPy3Ala&TW6~K*@!d0{jR{68U^&7$}H{?NcC)HES z5JY-U@{QG&$OPy+I{7$%Q!!YG)bv~DWsOwOq?X;PZ8#c7sP{XjwtIgT~CpZhBRhnT&^Xn z%Rbo5(E?M@Y?PuBSa8o_h-C28)$7G5Jsk%3TDp+D%Ee^o)LWhE*iz ziE%7r*5i`uK~3MK6omZCF1Q&+pXOk7K|Le2zlprO8oJ!P1_+G_JX5w-$r=K1@Cr&=L==hq^X%h6*Ojk*P8ve;8C$66LY4gEv%DDc_S)~{n)mjI-A&A z=I2#NZR1Y+$SYk0!Rf0;40WQ7!vqatBsF|jY2z}oT}Rv#F+Uvd`BX5@6A7@kl=xK8 z>_=h}9g7%g;drQ|Wt-ITlY`T1cKWa?fZ1PIEuOU)9;zGT!{ApvHBVCLJ*c`Gr|H?2 z^EP#@KGH3KJ~BT+a0t6I!LJ&&Q34Yocz!JssU$c^;U2s^JaB{wVI#XXb;vdB*;CFc?w^0bBrkelk&~`@-yUe;iNaQQJZoNa$i?Y- z&ZZ++F*XUtQEME4(PAM&i`uE~8hzMQ3$}f!MlnCx+Iuu7ho#A6kAxnffh+>;FM>^a{A1=JsY$Kvb`qx0U?;e;jOFn}jFYKR_m zM05@OX@le-5huCJJ6o_`H^7r89j^+3AU-sZP3e8!DozJ;wr}B5_C*v!p=LD)>c}`4 zGjzcr=Zn=Oo)0l6sR~pKFgv^8G=Kj*qDD)bprMDw$IbWB>D1D=9-j=KNQqU+ifk|R z>dGj6iZzI84c9<2JaVr>B0}NpN-}u!IxX%hw*YSGAxwJ6X$7etx)M%Q1BKWmT^VlQ@2Gqe}!d3NhfOupiw(Msde~oxP7$| zTU=#BTD9HD+NOa^DSv`R@f=^1e`^dsn(UMD* zR%=ys;7Vwr_(!Vo_A$wKu%Ytf1!zWaP0eOU&^fG3^yAf`rz1PJvOH^Kli;L?h>3f9 zDXawh+kS;d?Fwa8ojM z=<#H}0G(cIaCV$p?S<_{I)!*O#NY(ltdO7RAGp{`<|?ABTsg*0!a!^?ewLqW-tE+RX3UhnT4<rB_JO>1i)7av-u(2+Y1tpC+R}Z&6QaW4wgtLep{fxmR5FWVE*R)zz z9gaWBc=1JR_oeiLpv|#UG1Rt(6~-Dvo4qg(Z=GgrzCEBGLs`F>B|hOpHuRk1Fuqk_ zhIzPt75KdgwjFk|7Dablm1yE~ubFpOb6kxv_GD|LZhe9>JeYiCZ7ceCkxltq& zc#l3mQ(h%t>_M)MJO)~Qul%T0CCk^VUR7>SXS=90v>gn-r%i}uoOr|$iTYJ!RZzty zXvq)^-8Ads!#iRsg%Xi@P+!@2O&zHzgW_PB19WKO4R&g9-XBghU;F>G#_=p@o*7%* z0LP`^DK33Z$40gte1FlGUL&7M+b%}QbgQj`^M_a1vY$e54>C=Kv`mx!}u ztnFsDFGD4FYU& z*x={!EBmv3fHU6mP|DL-xg_ti2K>NulyCHJJ_*6Y z_m_H<2l?LtT0w=K{}BR!zh^h>r#V=0`>d`NB`i%ujBuP4?`xv zgkKgAzy<(OOoA!OPnk&okoOe0<3A!%cN#1Wi_Ja+@y~$!od*FN|7p1}|3f6=&HtB3 zY*_%4i~lj3VS@R@MQ~@u2(V=ibi4$$C`jNQ-1t|E z404Wdla!u#*eGo|DKv0t7=)3Ys$y)C5JkggCCh|p?a(Bnrp`>9 z+YT9jGL6u5W+Ridi4-*x8G@$n!AeK=f4>a`R9kd8Y;cyv6A!_=b5U~lkuEK8o>F|$NbRK5i zpZ>jUj7er<^VHs#J&G|TF?MGCoqW3RD#?zZ0l8FKcneGRN*MTomC<_nzxU_g-~AVD zRel5yqW_?+KcB!O=C5cDB=`)D-j~3T>)PK4teD#dZN7jz{s(f^fBVb3!h)e-P~JPZ zecT1&6eI_Lzy?jaLZpB$01)7DNezJj0DVD#z=Y!F;bZ+Tp6tDVf~kd$pn0>r+8zwOk8ZZr89dmYMeUv~yOzX`qXy@_mC0*=-i zg@5CJ7?gsNE-h?e&9N}Yj&|lBODs=`15dXhhm>w4^}pF3AP|U|tzTc1tl10r={2s5 zIk=oK_>#HTxs;aX4t~z|M0kSAaD31ffH7&XUhr52)~{CXZBepJUl*R`o?Lenc7NNl ziX-9VkW&WmsD6B4`Y?z@#JEbFdI=Ac1Mn?;`esk$E7^MP`B0F(2xJ-GYc#ocZWY?> z!O>g1q7{t^I&kuHmd}ccJgw#3HfKAP1nv`jMJ~o5Qq3k1Q&^OcY z9Hj^YN}n%f@cZ#z92D|1Yo7gBf$I9DvHG;Ix+urJleJAiRMDF+ikpBvz&ZeJumUSZ zGM>(qot6}IEr!ONoij>v0O!HpEa-H;wbNxa8U~q{+?ff3kho)qjS|Ljs%)9jrD=oJ zzNsQiuyE7{*M94C?oV}?0J9L*uv7GEWS~g{^xGHLgJ1`*o5v0jgnMNv6cjE-sxJA9 z)JN7EB21pco^j=^aTe-aPuP2H^N_JunM4!MXo;f42whjsk!+G3SuY5+i?(LstwpP1E;jBdSu-6tj=a^IohqcH{Jrn($C-*zg!!*SZCO^oHVI@-Q_N#yppR zhpbT;#_R(-9bw~@o$qnaofBXhYYX4&(E#z`*n)`j6Ny2<`f~9x<{Re&t2mY6&{Rue zAux~?^Do)1irfQ$2@PH>03*1hOgRcT0_9|w&f|%vRs0asT zQZloEL6-lsM3|5=xeVYy>Z+}iR3jS*52C z8Oo9W5&IdL{T?Xd zHdjBmM{1YTxl*>$54lX8?FjnV;02xrjHx0C=hK#R>#wKmVw^M6lXJXM#rxyV1#4Lj zBi~O`4k(Oeh!OpUe+YJFyr#tiDmhLP@x+~RDCcIHQcwyK5)$Ba@RK=QXV6T2xQ58L zzQLp94}8TU<2y_oSg2KjDX4GeRo0EfvNSbO0nwPJzgRtl_gTst2MZfIJpWLDN-O&G z!glzj_jbQl^kUBq`hJvvT!gZSv(1(KT3yIC!8D3xUnXL;dxW4U;@aI7%(yAvqyjzK zryvltZa&@w3{ooy7AQ?|4#-a@{Elu z#nOhPBjwFzzom)t=VlbB<<2Soq9GL5@?R&5onaJ&S-xtgcun`vO~iFEHq6@?RXRbt zE0vdXI{CU$L~D<^y19E0zwbWOcHKfjm(yuM)cQ$Ij-NH}EfE~~2|6^c1|?qmo%^Gc zG%!h*ecFWP1v*(gbRHBf)tz*{KbhZQFg50r;^2c93gLP%I>`kXHJkdl>1Qi$H5DRv zDy4Q%3#gGT%~aF3D7+4T#aGSpxgX_Pz(_ak4h7m~6)116D?rV3ebl1Pvd6b%p_t+k+<=Tjfya&10F|tFwOX8RV(I^LgayDSadE@q-8H z%;vXGE1%ddDORKGfP+NJ#?ixdRQDA;y$N|*eYrd4Zv5(TJ;*!}kDE1PN9WkVTupj> zBO?Q(Qb3f!0n$5vHo{@wz>S6I?GGax{Z}2?Xtd$Pg0hbl1G!s5RJAAO? z@t&|CCCl|W9vFq*X{GiFhL|wC$?|T6eDn;brd-bYB&>SjMEPv=Yv$0Hh;e^hACc8G-TGFI3$30}ootPh+q*X{<4My=jd@ z{KP;a!i-P3E)RQ?e1e3M(SM+iF%=HFw(6JaFUDSTMhy$`C{MAfZ7P~1S|Z`dN_TYo zT{_mYh8bwLcRw=Zj>ut5mgSC5dv;)-52XD<7*%g}89KN4B)IaKiOQ#zVWGNT+5k|u zJBl9-oLPO=WqTU!<<>bORBgw0a9R!o1h4}Ae=$nSU$(fr@(B1R7FG3G%H`oem_(6>8sJ~Qejbb zfUK=KIw5u@+$eWrTK~N2cS30>E4VjQNihPN*7^*xzF2bB!+5e(&ohUt0%$XK2xO++x`ggK-5mIR#R+R2|sRem#f*u0~ly zS%Ma`gms=70(cjLWioPiTSmlF{%YDR`D;}%QL$fGLgt_-Zt#X_a16h)W@ElQRTrYq z4}@+7iyhrqs7Q=*awK{VUYtuEip`V?>O8>*=^Qiw_5FRKQ249}m|& zZJMR!*L>DbGL&^ayci!bhR-=J{Sp{frMHMNqH>TqnXQsM<7pEEiH3qEfH`d|T%N+F zVCXRtC+LdURL3AxcP%Wa8paO^23L-5{s5Fj}v}F0|3; za0>Z1ufFmRNG|hii;@G`gTKS?B5~dn4H%`w6HswQ7^%d?7KL z`y^Q!U&>E?{MBWWKgt&|J>J(m1~&io-a49wGl1r5fm5lYFtsv(uYbW(9acR0En3mv zoE3oWa(UhjF?6YnLh6a-0_8sJzGMGc{ zUfp;~c#@M&fv{luT81!^|JH18UFyJR0z_g5Vv(3gCr`_TeX(@K!Nuw1`u;1UIgTkWho+?=BMwL!84H zqbNHaQ=bM6`Z8ZCQR+VPhnb;TnGb42K7aK4?ptepQIbnlDnPC=CW-)&fq6f#B^tMI zz_e~sL^~Y4BwNKA&Uc!MAPtcIeo*S-6t_dhyhOrOc;dJGN6C)+V8yg2MNtQtzHZZy3 z`DKnF8hXqj1H&PIL4063kGVt=pMY#n&xh>-T)0nPblmq0gb%t3fj)43+v&g~_e9Y@ zTqvF%HV_A<$XOCje&rCje4Y|#YeXk`o6x9$6{E#Af9;*K0PK>;qX88XXHFSci>n0` z&(p^AHv%yMFX=eidn3s1PxUz)&q>VUIE5*^gKqqK}$tkAj ziEo(zH`%we4y&xk&gB?)&cSBjE5_hd=6yN+h4Hb@@nrzAq#-PG0B~{eolwdINavKp zicr|zrzwnoV668rf|%5??qMvp0Hx=(`J6pKbfKud+{42m#LogF0^ONcF_qEo68M|q zi2t29xkksJ7b%I0pL&kRb{SKuo6)doLMp~h^iIZW5+rMmP!*+V=n?CBjbZUI0|o&< zN$_RzzL@{W`(nM@0+_Zk@VW3sF>j4^uDlC zgVCjbWp9FxH*_T~xNh}2d4yy!4)Z6eBU~d6tfh-6%+{~SYV$e5I)HFAvqd=*qo8kj zuJz?y%3hjlyAb+vx&j1|2vFAxP++?N{)s8i!OK?A1bD$Ht4S;QhU)!Chw~H64tH2^ z_zN1jz~9)Tp~t&lUcor9i?e@1BJ1+1)U9xT9_G3NmVBa7O>k;#fMKjN{-PSCxr`>{Z`v{*?UT$RL6QQfJ38`7%JdW{CmzhGEl1HihxNC zd>rLx`nvbYoZiQ?WHU$3?cSQ?a$&}(oPsCqDPZ63rXEiI4&Q*#vSO$g1v@r!<`jQ_ zFKa1m^jJ%QgJO1t%JUD=HINRsE>i~*e2G5CC^y@MggTGy`X-nO#Bj_-1P_PviKF}A zbB0NtmtJX#SdFBGi^PYdo|kzO*+H%^VVB(V3Vm)DJ4YWg6l6|qSPy#H8bN7S++jnT z6GN%Ur&Px`st>}lvLfx`iYsPZsdkxvZV&9%3O?v67AY$*U_N}s9g^d6yuJ)!aWdr= zzOk|-`widhw@ZpNJc;WZC8)$!a2yqSq4Rj)-{Lx+4-)VtiYzlwIF!rQ?zmY*NuaeK zYVnK6@+HI`OfM~1Z?|20?SdCyz%k>@mCi9C1E=-0qf#I2J?4_a;+%M7gmhhhd8Br9 zW4|KezJ*eUiOaGM1`W-^leSnUfPIh1@k_dHiA^C1AgjuPC?rSGv!nQ)XAB6#Nkg(B zrcx?m^Ds!Xse1#e7xd=E6)rfj*QzqGMuf7qJ{A#mDMcA-x8uN;i%^Mdn$W+;DpHB- z!q;=s?TVjhQ)uIgTa{Vv^n@RrDR16v5#Udl^M22NV=u_->c zLpM*ku$$EBuBaRDt}M^g4O=Mg`PV!&RdENhy?HmdhdDGVnrUUc(_xx3AqF%#XTto4 z)1erRJAF8=mdaeRHHo?KtaggrIg9NziVF;^z- zv2x<+oU@Dlbr?7*Da6jXw%{&nI^0kX#|Z~k%a`TmFjH#B`CLSQvAdhMOM7rFxOTx@ z$YnoD4EFI|Kb|u#zs<|ayGNc&QQ+tC+}~*6!ZPZ0{w+VqT^BD|5-(SL?Daqph#7DJ z#$`ceS+c36C|R}*y1xhz-rh|n7rdq=$X_l1uSi{5>f%4x20R^avMIBY1EE9RWb1p? zSNoIHY(+yYSuGuZIc~jKQRmv(&AHS@&?SF_;vi{1l)N9LYgD37Il=8#l7gWx5(~L}>+A1-L|H1O zkgQ+I9V~poay==^y20tdOW4VN!^fN*E-j|)9Uy6n!2^#`>Ut$JfL+7=YdRp<_5;t! zrLt!k_R2o3hkcnS#@&3MD zvO4d7FF0&YpXT69C?1~#cQ9YbKbKz#ovZDJ-ASCsS0BJ#I5r?a@QEuFSYMg$l5rV1%7T|d0tsvDzx_#SRBCze= zNq`E6mn-@%z8Ti^cf=a>xcZu7=;gCI_5ELU(Qof^m2l(o*syb7#*DGv$x`$7T5a}7yz$=?ILcqDg0E`3 zn+Vml3OTYxC6TGWGzx6~(5?=mn;ezI z&9XUxZ*k+>={FErdlhpytG{#PVl)2JRI#~~jMUj*zQ5xR3Nf&=8k@cfe9tlsdMJz- z8!DN(0a3ClX1kPmjVdF>d9i{1x3Y^838gV&R2H_!5!1mXFC5Y>c#3(xNc zSP|@`9ICp)!Opp{xWupqkTX?uSqztgeYt$*)<`P$VL;x5Fy!ntSD40gxtSZ}7Z$wU z2?&SVx%d8pC45Mj=6Ot!PWE6EU^L*B#A|=OMMcb^VcO|i#aXPco{v0l4yn9!T3ej&&uair;Lz_O}g3GAGs*j=)HC_5$~5|R+jtp&1V|ND7cCK4b}j=qSw;~|l6 z``$~b)zeC?{`ThG{hKep)pfb5^13M8>i%)1%Q|;eu`0dFU2RtPyVb|+n@`RD+FZKh z)B4Ujn|-*vw9Ns_Ci}jBIiJ&x=F&cOZO@&Lr?siG7w-K2$NPJ3K7DGX?Z=LT~>OXLDMRrcJ%9B;GjzHN?N+;_)+ajCoXTdcr{B`K zKvkvk!pRP9PyM>eWSbse)5CUdl^2!l;`IpU8P>qHO;OBzGHh**(!D($FZ5FT zJK`ioClWeFo2BcFL;-f3j{G~EN?e9mAaKrvJYVFcmF*M;(Uy*;M{=pA6*8_S&etw` zXpw6yaSc>|hiAdib`9iwLQ+|non#5xtiPwjHqVs#v?zTh?# zfSW)h@X44;Yx2ryrZPx4;R0M+&kGxq{R^Mew&$LIM_td{Jg_>pCPD``s(X6A+`Zxx znzbpzLXT^MN9m4ORhE(?s_F@`M&(se1nCK9k>#yZ?{6e~IB#FlcZ5Mg%aLpSnp%LA z{a%#7v29+svoxPukH`F~ykhyXz)uR)sFsbbVLe^g?9e~a{F*@{n09*AP5!xOv+>~r@h1*C!;j_h+YFcT5FkcsW?PU{5EYT@$4tHBB?1GvU zan6;XS_eslHDdZJi2+9o(X-EAaUD3OB96hG>}1gK#F7xppOB?!(^b&D;l#}Il&?IT z3VlmEo}2>Y!hwkQB}q$T0BU-!>0FmM`^#^=OHChHNGsr1UyWD#)mYDSrsh(3zSb7j z)#GV{#(?KO(6CSTIS9wayt#mt^Le48VdtTJ0j@MchNWvR*@UcVyawb zm?}?Nar*Wu2Zr;m&b5`j*SXW5p%0WX7{uc#e@)-cHAy|jk`x5p4$Q);MzxHKLRY+(aoj#gwT<8xzV-$`Y;aToWwN*V5r@)!CwjiC^DpH*o)*DXS3^ z%eO2iA_W^@Gd*r5*MjbcqROquj|$(=Vhbpg{$>qn>7Nse4eg7Gcjl@ZRujgaWq@Ez z{6Q24O%`0sl66u?WTFOTvtKNK29WHY&;I8{lTx`>c1+AN@5gsAXmG&z(YzU-wa!F& zlXyqM&WpB!E6dy|cYD$_e<@$4yNr9|D>j&YnX2Bwd0r4Jq&iQ+Mp)UM*o{pL2Gr5l z{eEx-(LR_M2(IwCbMo>np3C3QdtgwUo_YXKInz-%bk_svb)Wsh#-VqA(ev@Fbg&Z{ z0PAc_Q!%&@W6RhLb_p8we=Jxs&fDD8va@}2xei{YfqfBM6iOaV$5KVpQ3ulzB+t~~ zqh1uVw}w1)xV(738CI|=yNh0dn^1>}&en;c%}yU!=j`->-9B~t2Ks;++Uc5q1|+TnLn1mGOw+KP6W73*I`@^}K)uKzntBMnH$I549A3Sa zlc0mmmh+IG@KvJ!yWz$uAAQy}Vw-fk)&)F5q~U~GUFL-my;xfUnrb0V3F_nOcn+aB zU@JI6uoW6}^Qob6jxblx5_Ze;%I8HXJDGgh5+oQwVr9vcmZeaCT8gTDJ#uAmji?G5 zapL}zL6<{e;{KqR$CoUNKXClKH)~mCnn6P6p*Ze5rb3!-^YJ`v|%9JSyxa^mzXT7akHf1ggV} z)_xA%SlGp)&MPH}f{C+^Z8(7&1D<`nz2q*H0i|qH!xet)$=@78UhWQ|AWr3JhtJV5BPeZ!t*|&2OFdYp(RnNz>=UQA{S3VOHA?L2Ya$}F*)ZjOz zRt~FRM|f8%H^;yb^o%nJv1Z5Bj-TeE6rUGnrZBmG4u}>qZ3^Mi_bN(|Mj+xE^nCt+ z=e?aldEwdkBr)PaV#t_?4Yv)t{;Z`Uz8p>^JtUa_h(QPFm|k{)aBvQEK)kvg4D5bY z)(y%gHESCF>05Z{VCf8xN9Di=8P^FqqLHrA>cPvf6LM^on*d@pdsfOjQPHf86yo}# z_!}sH-bfEO!!&AuM8N{+dLeseD$@57ts*uVKeXFu4ptM8*cf1U7jRb*4sT#nD-Xl1 z=07h_t7+3e|Mq6}kv68t?I^Oxc!17XBYb!!;Ekbc)DVwxrwdURT@TNV`~7&0y-HEY3_H|Wcg5TQh3Kd?}pJ4GLg6&R7_@6Klyyb~+2H9((qpEwKE+ z7%3KCAohXKVaAU0KBm6y`(Mz?UY?{z=+_qezuWnPN zgcaa+PjJvHp254pZ{zOQ?zod~Uha{9e}kj2aQ?J+x!3*{ibwF@mT0mLW*#>QRR^xc z=l~AhlWA#75=|s`u@!%+p!T?J2uj2SN%c$?6g#jCcHqKhJCjGfaFmxI!y6Am&JM~w zNzLew&|9|RyQH2z>#q`@9b(Wpi>wL^(w$RJsuNd<`3uLPtO+|ku`IP!d7=D&l+`)> zux+GpzV^=>1}j9F6=}2vYJ!JMjWjq(J@`UClVPvV46&3pL_DH}4dqX`2)&Y7G;g#< zAiADJ8Fc9)w_q6$8vX{Ky5}mv#3;t#`DVjyPJS!-)deaKS?0*U4O^^romi|NsfUEB z^x zg8ZW)(K%IW?%2Wb?sy?B)NC(v05|v+wad!@>V!bz+Zn$kd?YLfOkyI^5~qTM8I=x0 zSXagPuq<17m9p7nb?Vv%Uk;WQF@cR{Fc>HgCVXzJioszg zyNMuUi%_rT57WzRhW@aB#QK^w|BkE|H$=Hpi!oY`$tzgoMdij>V8#c;6onK?*1O=A zRGd{&q~seDQdyutxg+o!JUrxAv;t|NNB+HabYWE7oG^QOwj-@+3fMj%H5QG-ukg$b zNk|d_#U|kbdjpqIBiljOBiG1qQKQ@??)drpepqdZx-{`CF(c}KacY!LOfu*TI1p0Y zlAVVDgv5$qn`BDxL9s1KX@Z_P)dXipIB|wn>-{+KE6QG+-#qNwoL~A~OCA(Ue)IzI zq##f{L|hQ1D~uhlciG+@+Y1;gpT$8OXgXh1CUck_RPDiA|gm97cwOM%0nb;iiibIc+0KvEf0?FgndE z)K0jHnM}L%oW(FzBt6YH3ptv=qvvy)iWxoH6fweK93ei6RJRCf?KldBXD2KcGE>9^ zHZvwL#py=T1|j7c&HwG1ECjD^R41et}mnZ|LFld+J6gyxTA z*?@Jk6~F$^PRk@CEq*HSlyTqLlt>_PmVB6S%10r=Kw@CP3xs0FQ2YF0q~J(Q8A8xq zluS(d0*_)sbef>n{u}kmwc(Vl6j%a>h2(zWSnj*A+-E`WQn?QrBImZRTgd?%aCgD} zE+zF6Yvm^+H)&;3L%O%6{eGXwINSvl8ze!VIgc`CxaJGoVN*fNT2Bx@b)2S zYFQl3J(cXsw~MDGO<%4VjQ`iLrgM=Sg$xF1p+xhd(i&B__n9d#47Q9xx~!cFCEA< z>nh2A`-O>(2wNqA)CkYl9I|53SjQJ?$wA*`No*GyuZQctxy0l- zoEJSvD1ZDxn zRZi_Pb&?}t4d(q^2`$D<=RJeS2D6U>3P;5Av|t@VKTDl6_dJliXGn_xKl7*RJvVcP?u(ZSxZvbM=6|S7$+Xl zBr`asUbwi$BP;JV!0s4_M2?jNEt^;GBkXWv=Z$iw*iw0V9&%e0YF_b8SMrp&QI4O`%aU2!a}aOoD~aKg!iQB;YGK+C`E&t|?t0kc54-n;Y&C zPre`%78_>PLh$D8WK;@pU_)XuEa~h~wpOwOg_jE=UQE!!rJuj>q-{VGYpx{iiY zKw+0LcLC;;alt5N;n+Mc7)|fP0|xGzqjj9HMfoO}y`S(b@?cYBhz)-cqR@r@5%ZrJoD}Hoe!sLl z-O!f99@Ouna<_Qhq|A0ZF#^mDN(e(hkdfffc*}0bZBs!uHAN=LTp<#Rw{r&3KNz_j z(2E&5-GG+aaeS4`ATsdx!BCceTPNcEQdS?3i%EmWA#dhJOr+^sA!2(GaTVavfSkUH z(-xE%yv_C+6gZG}+yYE z-tQ3M?qjg2jKL;0IdV=7{y|W{kvt7ha0w?n?&JIpNh`k4Y6tN*9?4qlO3c7dvh== zlc+unz$9l$0fe3KlDh!LRxJk9QM8f;$CEvsigj$%dAgj^nWlirt4-2cZrFNAk6|#2 zuYqB+c+MzL@VeJ##!pXwY-Ug!;3IYjJ?wboL%2Pd(6AtpN4a4GtYAw!TW0MxOc__ZSi+=C8pLawtgNJk0;FZ)Ok;%(Q@%)Qnj7|aupQ*~sZMX7s&FE) zooIt5IAYR3bU>jWo$8x4*hVhs9j%()1F(2#H;eoQDzy%9BEl(uczsZyanMpK#nmg& zc?pOpZ3%8+>S&}HvF_j(IM{5sw|2Q3Jpy_?H;pytGDd;&uCB_PKx1;q5LkG`kIonU zu#a8Lh4gz{IN+>$ytMwmf8tx--_M}IDOvD#-shvp~s?&8Z z$Q>(R$(f$>6c#?2sjFOtl))INp5|9?xcS(&VqEwThw;TQi*A&1=jgo1><11}M9+n8 z03y16J|)0(JteRza&7eFlIaw&ohYAb&?boe_U-=hZMY(TNw`bINy4BZBNqQ*fl@aJ zF)0@+jWxy6zLqZ6Me!N9&L}sCS7k9T`wMOj*0kl0Km_z4`0C$tupR5X^)O~8As$-O z<;xsI=+t^LrKdbX6M#jsD&cjCiLO(bcVNP>uLi7Ijzabncb;M5k95uFzvX7o+|=yt z+_X&9bEyG;lA?B_ImODtyh0No$FFCvL*UgQ0btnHxlwb)Sk=x4wy`G(Yzx3sA}qS- zTw$7_4G3faPm6-W->}@@8@fsJN&Z_$NH8kmEj1`=Q!%8Duq}>xmPtY6+mw7OL~^`w zvQm+kcnLaWDJ{`#irfYaa>O|pm59)}oDq|0#&W-Zf5+8*_ee@Uq^Eb6klG(-z^Sry z6%s3{eVX3vFcF6rnPaj+FwO8EN?lAGjL8*=52A~Z-2|oJZfZ_k1?MUCA9XPf)fG4X zBQ!BAAb|%-+R^NWQ@6aTE~5)UHW_rmVf|u}dS!AK5W9%OGY}(2u}M#=DN+cZ>V&y- zky3bn;EN+un;G}q3f)^@5-($9JP`!M*LUt`9uJCb2#s}FF;Y+>1D`& z3)@oM6E7Y3YLEs~`48g+*&bhrWN&=i>=$i%%yBFNq#0txm`FLRudsu_Z8VjJ|JY)~ zRWD4fBoU=KJF{d-Y10?96`b%iV%+SfkBlnyhFWl3%K&0dbznK%dn@J)5d6DlTs^23Y49Mpt=%8PLj@K!*M0S{VK? z;8&8D6SJJ-B?JEVK5B;5lH|fUPk<;^C}m|ghiDxFX%V$9>P(XG|B51XOCKoQ%N)gv z`|fwS*Cp}tBvF4fFbUQQw6+_^{_hqk2A{Bs=wl@mLpVowEJ0&VFfp8a7c< zY@LV*tc3Ljkb{OKAO|fPI)KUd*Il^dkY4W{vb;cZR*CGFYc2@uJq`D*`11{Sw|1#< zWKuC^vY)@_(IJZoDLse19(@#lNw)9W-Djfbd0i&gCNYh0;;_2ZJ9R?SARw>%0V0ZF_k0@i(>FK^JZ!oPgCU4Lqz|4KlyLY5UcOH$Tq(XTNx3R}P%4f>qqN zIsX^FcQ2^&38;V#(!pbb^@r&n?;L2KA6_tJwFOaiho?>=sr~f3m0L@X<3^Ic_pi{Uu@q31&3y6UKDlSR2i_h7_Dn7IVEe$5SS7*~DT`E> z>)&s@l1#FsF$M*QnZaZ-7#XkpA}ifIZ_>@*-+g*`_u-2!^G%`3EOVQOr;W}_<%(>R z`&7BoY##QTUy{$?s`gTiP4~RLx6UU28qalg#I{L)eymQX_(nC>&rLn>&8L2A%H+&9 zfBgC3fyw>1T4+E2?+<_5{`T-c?^0nYTt7d&)6hsadgHaSX})nzD+kxz@!cQq6!2#a z4Tzd_D?BEI4?i5U&42greulsGOTy55dBuJ74w8*AE|N{E%3{Tn$yEt2e>j4azBJF5 za}D2rm8D7k-Qug(QvT)M`ZRes;Am)!D5V$t>4k8vy5R)v6e#d>9+9q-wmCNAz+)b_ z_wYb{Xu7>Tbm)hg$H6LWby5#^+%054e`bbt--q7D- zG0jw}9kWPsFeQC!jV;u+wk3sokz3=T=Ekn?c9-+H?nWLNSiyTFQ*MGFb<%um_Vu0# zk2u@wVltDQ`wNI1S=7Kzw&c;4UZvhMkK?()MYK5yZeO8@U|F{ECJ`juu6F01IqY!Ry~P79~fGGk70Jqlb( z(vdr!4JO_lxY^5qPP(1Eu|z=8*OHk z&I@L8QhK~(EFV+)WM7RHlV+6@29dbyn{Ef{#ywd`93je_mbU3a!C28YHgA)!4IU^Ulih(u3R98-*W6}DNl(>H zD?{?6tE&*Cq37LK{7#=7hvyH2Vq);~w|Gl)1>Pi>D;bfsj!X@&lW%Y#1W~(@Yt;hJ zd-7MFrHum*p*1sWgY=?@n{I$e(~OZhthfU!QqK6odWs2urGL*25bdw2 zb^E&8$=IeF>ocT619v5hftF7BdcL4VbaFqAaiItH4sPsP!t>#a^P3Vf1T>7Ng;PwG z&o;&vs?cIIa2L2V8AP(v86$nQM~%H>8gM>rC;AIv*6B-5hG8$0v#rO>P&B)BK zk6M_4ed_|0x7zcQr}i>`@NLT9LM$m)LUx%dGR@qvdjnTM*&VfroAcHr?8DIaV6QsD z$|@#2(28RV`QPTCyZ0r`wR>eMt~g%#Lu&5S$Sis&Sfr0PqKUCim8nQ>e%fbA^*HqH zh0+J_lW$uM?`tp8rT4+0J+2_!X})a@=<=Saz&>cekvoe?hw3PQGq5Ydk3Pae+)BKR zF{<>j=yX}q+jWUy6D7yAs$&|cY<;TXr;{5edda@ojZNPvrv0?l4wVnG$9qU35;jY` z)5|nsmPiT%hFc=k=rl!yhlFX@kZeC;W6I17)XIJIC-z~JMLnWTg)AjtSY{u zF{vPn)XMx>rVK2UE^?I?;!wUvF+ak`nq=aXGJ0f>@^R|Epk?*k2}wM*hpAP?4>l-? zJu#`n9kQ2ECY+oic5p%YItMtrl1c6%qhgl9ytjh}RX$y1cyv+75JYth zMM(H3sr8WsE)rPr*itHuLI{pkpnnBSN?Yg~xv-p8w%&p86hEd7M zKb6cfUipH5=|YxKx`16V34>Vz_CdQzXwdYKM}A$-LEatGm+E<|K>@%Rgnbc*)jar7Fl9-0|Usu%J`A5#13h0E!rC5Nz=t@E6N!b9j)u@ z4UeK>=WJ8SQTr#%Gd%CJo6#lB2_a0p>m5CpBavCHfC?pRxkDLX7Tt zBrWIV`OxA_uS|>mXNYHOAELdo-p%acYDAHzkcm0cQEa0aak>k4G1P%i%o0w~POY-#GW%z>gQe;E^TOTi zByz}qLf4S-Snv&s_3Qt(SsFarzS)NI#T#lS>tkq!$Y7->Alya$+b0XxY z3(jJrsE{RVwXMb==f_L%gn{+Q7#UFs?l$Q9((R=fG+_mIu%nj@1LSu$Lc zx;dGdu`Zyl!kL-E8Q!E_aOx)E5v?I?IL$0#_`c&=X%j{~2(XhCKojo!~{!7|et=9^UNPCWZ~UE@+arGu*# z1jP6V^)?ZJBci)wGH+y!AU)Wa;0%L%&r1k-BM5O|>NIo>3I&5IBmPW@5y2|s^db}# zgj3iuMt0H}*|8H0lghU4ou!vC((tsfN2n-D~&RLg``wf zPz?g!2rMNSQ!-Ob1R*6#J`AFc0pN?BJ8LE7$BLh3&kbZ-GC|TgGp5D*zO8ybTASw{Y{tH@tuDlVIlzhF}F zY@!A75{9{!TgHh!S3oL~h2S$oh-QKitw4xGM2wJ$u(St;`3!jBJ>e2KMlIHZA5mdO2p7GaOGa*H_S z?h0lfShHoJieSfaV8zIs7ja0>iz&IGPT+r$qUCvH#W?C84d|$*^8hsb`gzN95w@OG1 zzhJpVz*RvS@9l2ckjLcXbQ;_vZ8!Y{N?XqRT}YuFiFyeM(e0MG*}rl> zz!G+P4Z$LJGC9>LZm9w6=+lsDgoT}BpFu;EWYNM$ewBoC#wT5W&Rgh3+R0n69QI3T zDzos;C}&k`FbTmPY&MRMm>Jw+4>zZoiGfN_&JA~St#rG(mR7}=7FHY9=~BRI_KP!-OgoM z=jXb^)eLzqbU2WIgH$c{z!z?&FYP$oy(yhcyunUhFYwEMgD}7(AHKl8I&yMhx~za{ zmb3k8bIp$|{NjQOvWeAmT4n$4O+^kHWW9QovHq`KRpOq|u0D9r7zIJGDFHS;8$)cg@znCfU+2p5jC;N1+nmdfpv?_237I}7m}1RU%~6+ z5KI77h}*2N{ZQYDicVYpLblB(`XY#UP4uc;9yiWHBV@oOM?O2k*q%+kY<)}=_k z6BoFnPacMU;49l(UkW)lq_VOim}?qvwbPbq!f$QL2`Ea}YRW)6-ps(A)t1yocrmo+ zvIBGw9K~yJIM8JOctv5rV{S}dDr@x{WC(ub?7=j>wOOJ~!R4W^pO_%;!GW6Z{P^jP zZ$T;-ibwX!WI30}mUH-&Cpk`42N2;(pc$BIfQPGp0Jg=pK?Fg35k8yn{s5>gK)bmj zv!8J~UX%!HTY#I6g8)5DnRQtEwK*E^m6O1NSu|IJ*aH2Wi`7_V;*yO+&1Ib%Kob7BB#xxTn2l>8#WtR*55l; zn@;h621+(p`7%g~^&x#Vm!tRP_W3@7| zoDS3ggKfQD3$o5r#kz}b_l8h)=~Wg`;e9jgF2g|PittffY5T~ux4L1akYd?%p$pM< z&5kW*)qoNCd#24_eT%)qsw_al;+Kns(vaD76g!cF;U=3!$g|NIV!`As6LhZ$A0t

HHl(%S}Ud0btPm%omaDI%H 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¨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 delta 306834 zcmV(|K+(UWjvnNT9FQXdH8YoiGzTevtyD>G;~*5i=T~qU2@ZByjF)SxW)^9rR^y)1 zInda3&^R`VNvr((c^I5+(yAl%5COq&`IZMo4Wj7ljGnF6aXCzrH zXofPL$4M$sS)m2~rkhm@KRb}$>75SC)qZk5%4T|*)+ zDgH$=Y&V2aT&uPJ>!&j2{64|T5{~Oe*Mq-!cDedZ2)Qpyzv~H4@eAPs*WvE|;rmT! zPNE_%Ql5t1SQZx|0GSiUuzG?RR$#r0l8hX@Sd?D^b^fzTQA`2bUk%SRb>ozgG5y3c)W^!5tOJDHY?cCIA!e zsF$Oz-oxgof)ke?#U&}lcZ7|Fd4VG*U2pXAybHi6uxa%p70CofclKh`U_33AKXOXF zs4_V&4b2I8LG8sDwC$>i3i-vaZ9fbj!JhsP_5;FxYfbG)>Sra{~_ivv;rQ zTfN+!$PBY(0~R&x)(~1agZm*=ZA&F=Q3zW^x60hqE_%0Met&& zW?VezfMQsUWB2M$T@Yd_&`meGe5tyir>gw;b^BaQ;`*)0{THr(2D-tFmJ;~%b(+@O za`qQ>1#Xuyk^&Q#F~kBC1T{7>Hj`0UD1WV7OOxA1lD_L#@ZuOSq6wp3cqrzumd6jx zde^em4j*J4&?LGWu^>nbq}x5ee)Cm@0zgV0#au*Gp$e6im5(p8vX!kKR@v&i7g<{3 z6Z{L$zVFKKtJ@b}erw%I6{%Lvu5RyFPNgO*R)x;fGIOij-RfQP%^z!>C3SbMPk(Ly zu-<5wC2!YCC8rN-oiz2HyZ)y>9xuGFPt8Ny4BUOcHaa-GEFe|~ZgS?XxN4xV{4Dy^K;xS4DP-%6{@@IJmpn(8}PK~+h+Z4Vb0SiK_x zUJ>ovwaSyn(`4Y6-&WPCNUI`KxPM4tQ&*NNo2t_CIyDX_TEj+Dthv!TE!A|@32i2|m4RVtQSqSH{jNDS@K1kYKL3mxY=)+W?Yd;U*05bT z16MG;7uo#H?Tg=EDCo{s$_q@M7bytMYP)~&?tQk}!MlILa8s45CmOk5*?&r>d5-hC z)!P?8Eu^qYt6bCmT$Wb0T;)!~Hs$cXf>X;2pcj7fT&H;HTe!(k4~83mYK9C;WzQW!A281JZyZh=l+5T9rw&-k9Y1 zX$^u0(yyyzH(V5wm)Hx->VF)Ltx9b!hfAtLuee(@(`$+EmeH>d>#|5LO?YhT-R5w= z>Ds1wN}ZWGHG^xs?cc$qMF;ZaK+^OUhz4+ z<<@Or_Rz`a4#!5U;~*Vk1D)7F z2OreQ*KgLjViIif^hk4rhWS~#SXrtSmU%T@%#XN1^YSUhjJh~ zhWUY{TQH1=zHhdt_Ry!?@$1@EbP({oYhc^9mln$jol_Gg<9~pMGadL{C*8xkh*b-E z_Q8YF>vG~if6H_ZUpmo7yUn5RPy?UWPLp`R43ela+4xOMcir#&*;k9R&m5>|#e1ds zRkAsr@49w)#09}$8}ZjR!5^EP`(A|G1`lo*9^8^`61i>Aj~2wh2H-XCkwMd%z3U5!Tr1iOhAY0{Ca2kojn)s^MVGplzEQHL8Xk^v;N zN%?s^?;>gUpvs^ndnOTjgq}eL%#Ti{^=vAY1Iw5eg=JeQM43{h7M$LMsQvG!le^$3 z;@yCYO$|Vg$;2C8vhMj8j7`584kUnEAyUo`p1Ssqh=0X{izTWc(V>S1J=X{Wo2$me zl>i*Q?!-z-w!!krh*XdVIeJMzZpz4m9P@Wz{p8&5i9%s4iQ)Ei4#p6ra_0qaRFbaQ zaaT|F1#D7*!d!sO;m^`R)-BrvBp~G%zYIYzLH0x~f~E6&pKrY=QiF~b_YM--^jow} zDg!}cHGfBH5P}j{slOHLN6jF}+++a)luDCmb$;2x?IxkNk1@bQ5JT(1z+L9c?OYV&s3C)@n5r1ulWi6``on;q*wii=tK+DQ}O6G6c zTv4*HJ!?vUqO*C#J6O_v!Gw}SQ&Wcquf?Ik0I`q5S!h+M{s^s37in4Pf16eZAf}qn z^MRL~n~sjnR&M27nOc+cSiv1&@NR_9YzE3i7hiDC;a<)rh&i2(h_h_3CR@He@lZex zEq}<)xtLyMMMI8hJjOqrUKfQHO1ruzwZv)bC$Mtb%zODpeQ47N%7@16adTbecR>7Pp zG-qP#!N2!g-sSUg4HlP;5%k}owR+~~U2~5?at%>X$~^!L*ucVbz1y`ok3h5XbAK8% z!Lj$GUe9azCJG4{+4_Ng$nfv^6~l;rI35`9o^FEaUASJ8LG&rUmo0rr$MgqLQ3^z8 zty4=40r)~I_@wrsCxg1>@CGJbl!Ln8N(4EX~oEHPL@##s<)=i4%gWFu<%rLk=5 z2Lf44FxyZ5!X(B8315gC1c0uPsDI{XoCt8o05+pj%adDyYw*bHz=00j_QIjb*Kr?! ziY>zpAYS?=Fz;FVnvUZHZa$n_j97Y(sEWvxz)LWA9WC=L=adIPoiD<{BFIZFNOH9h z0Hso;1Oa;f5I>uKZBW!{V?80Ql+!z(NbA_j0J!{|tWNypkM>>6NtSUM&wtYb_)1&F z=>(NZmItw(0om0M-GK~RBWOM%5T%f?Sbw{182oL5fpIem4d7b|6}R2tESO+>*zeChm=O=&iV5&% z*M9cM9g%)bIS_a;?CVkeVcxbqU5Gw#iGH()I6PI_0df((4d=a2o=kEwN5CmdFXobW zq6DgRDAtPq`G7Jy?fUt<7eU>W$-$>o)0LH(q)R81Dx0SkyzOMd`+t;4K>7RInv5iq z%E9+$INuFhVc4DIclHN3*PFS6^^8z}XvE%i?Ze}Vfj>TpSh8P{$N)M5e?v--*#0}} z6Tmb)4EO@3mK?8U2Zs6hElcDZfO0~p>QphqTfP!2kIfRCJ2n}5#w-x`E zcz_JpsSMB|&oeJ#feaY4+}rB!C1pl|8nRjPC_vNAG|^(_c|*H!6gK1yvqXR<03W`{ z2q7)$Cz#B}C(Ht!Ggjp;&3%689&l>C5B^wEY+bu=gNHu!FMq=|#At!v(ZG4W($4dh zR>IdZE{9PjP`LB;n9}L2rWCz|b6VBEG&e0l_iLh|Ac-$71^SlVy)WnM6U-)FA zSuoyA@|-5*IRSQ1PCI!s4?;Y}R)PQamNjG=G5=QMTA5?tl;vb>$;xIf4ok?2i+;*T zhEN_}vCD!Z#3+19>G8Y=sEh{Muw1F+yEkv;iIopbcMLEo zW`mbQi+tqHzB!x+@l7D^v_~FA(X*bVgH;HKRC4IA@lQdZY|3!rpgidK;9w3UY1)OO z3zio80_w(QKIY230l*=gZI+}a`%^R&_m_nnW+0fpAb+?tEtVgRcIwo2{1}j>z~a#d z&xJd4Y3cK8`*s*Y!UQCPvyuc*3FTr0{Mbsk%;;6j1{!}a8HDv)AC*)7UjPmSK4Kiv zFpU~l6;q-#fW%6B*AwmxB&1ODJA-V(d3YaR8kmHmV@%Nt$vzjSykHU6P&7jF0YeAL za?fnNE`I?>7Q!(49$38)7Dahv2|6Gm=?6LUo^uU&KYbtFeZ@I4hxxVOI=Vx>8^%<_ z40P%O;xi>|@?hS69tNpgTA6(M$zq8>JOwI)mMW&>-``wFrcVPi>n~+4A>EL51vC&x zF)sQ3_V&$}Mm`Tl|BBvfSEgAmXR~AW4?cOsDSu56)X4>91kin^<+3VLtefL@Ob9z8 zpaTf!&uczLa*bi^Wo!e`IaNNhFp+Qrk{?IBgLL8D6XmP1RZHi1C1${WkH-Io-_y;B zL&uG;pIYAfA_d@Simxx*(-0L`JoO7*qnBf{d}7G6$nFx=+t~#VDtDpSA7^-TD|6WV zUw^gdndJ5rndU2;)jCy`aCV+LfRN|lFI4)&y6~YxkP;abSs1+k@b@4*p`aQE4ng9B zlDi&nGz$@X&I5w2e7;7p${;cozCV)B&Ova|WYQDgbbzrU%VLr-ILn2C^R6Xeo0k#z zg$A46J8rOU!U^VE?)WUzp$&xe5QR*LR)1=0JSM3$lj>@=$(zqw*_MF2rynY>uM0TN zLAd`PSQqR}35amIV|{()yiAMyKeFS(rkR;7{E;n}hBEh)@$YZ0m`_!esV+rNIG3yn zQF{RU^${F-h{{zl-XIlGa14z&siE?vsULV4DajrpFll#S&fw<(?NcKq0v8;xDt~hj zH`&X%mrK9yz`l5lkE*G&RKPh?(pwwUpaQQzzSs|j|z>DDaRs)!^|e8GR6<)tG$LZvwU#oD%^xuj|X&R zPnRL58e^-c0WY+I-{h3uyvE=YDQ-+akrS@DB#@*; zQNED!=N@Z+b;UaP(q^wlqsLE00SY<*1%Lvd_WhZQoX@4{>V6(~}13uRLvuk!}deNn0lcgS?;+mfu?wZ^-&>q7# z{Z)BLv`sw6rF?y%Ch2;{ZGPDSUIoAKi>!rCmi~&s`$-$Yb%4fA_)^CnUxCSkq+Y|`y0Ns`=YXRrv{(sJ{4|xtCvK3c&tdCJH zSYb?1@O`t2OAo`mP&nSp zd%$Ux3-y6`889uVtDFzgFl)N!PsP=9C1?;P!S0u5qXD_Ni`8=zeHf3S0E^(J^Dy?V z6y=Uhl`V?r@P8d|44>lSxhxdV@%$Y>EQ;r-S0r(NmFpR7vnm&*bVi3#I?LIFYo&Df z2Ib#C$VsJi*zxgFIvgt1C^$G=yv_M+D!??p)?iv~mtDG2Avk`a+K#@>9%;ijzG4{9 zAL9H3--4Y{odwf#E@f&4(Hq$cEUW^vX-v2%z7}p7qkq5$=#_z(BXwN{P+=t*U(B7joxBicb zIDekcbv^hW?_GSkK`@_cQvSVJlm~=uXMoE}J2ApnN{#ceda_tl!@}F3pKjDo=w9mQ z&BX)2bbsNYLtKj*;2!60=YL!h()3a4Jt~*`D}Tpl(q)djh{(g_r!J$ypRaoMgBOnl ztNiZgap~1sEOWVNNymTFrla^_&NTosdHAaWZ^e4~?Lv`AT;@b+4EZ2=5G@_=tf1cog}VDv~`IPe3~ z%29UT{)-|#lrEXUGSPKpe)(E!Om)pYy;c}Zi9)??LLJjzt~?;go8>d#k;rbjWLxTv zBN5ewFAfNQr=iEx4i`|!**G2FajhlkuYW(6Qj;u8WvV&shtMp|J?!5#Q6onm@A5u^2^U= zxw|ABV}a%1t>gkmlA>~{hmHy*)5QgK*jWLH+F$B@9=#A2<_mglmF(JKd-gYk<$tpL z67T$?@=F*pDZh*h+3(LD@?Ju>DtBp_i3{1ad;vz_Q^NhvJcn$4NBhoW+--N>HO$p{ z^&|cfbD5Uah+wGj@fF6xm~J)616M$vy=x6VmjAdH^q6w(-1qC+k=s{T=@6C!8FiS) zq2*K#@VW5I`AW+%=l+J*TcZcGjDP7q5oECuRvF-OUk=8fb2|IHTP)+M>G$TvSMmDb zdMgmg$@urY__Wq{;Ld3r?LZd<=5S41G1kO|IwG7F{;I{qHF24Vq)S7riFfzDkR2k0 zpAK(XIJ1|MI5}A80MP>{Dn}Kt|_;)-6Hm4WR zAp<&35_>xFkBlX&?$JOJ^dda@K8y;<3rOw;+=%Fd{Py7 zC-;2mC-cJw+>UV{`@`vZJvXIJHHro3P#*su5gNjzQvPQJV4ATedG!IU66Mn2{8Ta) z1CF!bZLBNMh8RUP{u?Y1_P2BAyM23tnOU$`ClDe5z~6L3^GC~kUmD(aRfV<5n>9ms z$yLH6HNDZR<}CVuc-?D^lhN7}v$GoHA_6x#mtmCw6PLeh2P=QAJ=>DoHnQ*j3cYMC zRcC}HZX}qu*lTCAn~N`#+H=bB14p7~SkWy*$&UByPdB=8AtjBS@m3`xvIzp+jYeNU zbi170&dS+$Po7>s`P&Osnwb+#RhilK`S&@t@QFW*0#zq|hD zlaf)o^b2^ZGQ)Erl>-FjY@v*>vL-~Y=gt-F&ANl$tt#ZG>nW+F&{9E1rD&|9_g^5o zU3)m*cZA<^x7oLzhJM&>3ATIBlmk5rBxT{L@Xvr5zV&~uUEXzr7>)n@`pNH4BwUs= zIkS~0jhWSDEnH(}%gvLw@5`HLIFh zl)5@41+e(r3u$3iMWv+0SKcmMDNV8Y{cy1KeB9;Rh1A*<&wqUNzeMd@qD4q&J?H4p zJ&-m5z5ajh2@G#WqyymH9DCHozm9NGZ0526zB-bPKi#`5PrFCJITlxq6t&Y+7MsRB zhQ&^bvbMzHd>IV6p(9QSvCSJ%%4zwWp1~Oox%H+sz{eN z@E&)MH*RLZl2uyIt~Y2H?m(d{FbVtnc?Gn);xGq0wA`)#I*0ik@F8fWe%o)5XV~)n zJ+x>y-nQXAh$cwPTp3t5@Z_#*SM=c5(w2W}aWhwC@#)ZIJsme*5+d1B=&}atK?~Q8 z@WNiYd+0&pdu6d{f168PbOYV?2m1XummoXq^P&o*2Qj%Xqy`QcZHuakp4)Q zSGEY*9M^|_zxFTwK@$YfRW~dVJy-NMo_>J!Tl#&|ErU|~Vk_e@kyAr+MXOtYgpH?F zf$UmCG%@$&pEPViQXH5kH|eq-Ba(k1;H)r}8@GN(qqDRt4I;4eLIuE~Ls3nV>;)cF zC&-f_j{$i-5YS(*Ns92bc6*=)e*I8~-@|%pKu-M4rW=O#7AEDJC~qTKP!mxo9V~ek zh3~i6Yj^9V&0oSani|$;w*;&fH7tlvbC^zXM$SOxxFEOqPQL|v?4{Kcc|d=P5Ptmw z=)~d;-N4+%)}A20U=x-+xu&UvGtAp4oW?3%aJ(`=K^zEt*KSwC9WUl9g0;)Jtctt7 z!^Ql;i>(Lak1XWkHO>>7CcK69yiGFer&~{Oaz;4EdZhD<#8V6IFIe+U=O@Z)Mz=kX zvg)_X^^rsYp52fp#0K1WM2>$hxQ}+rx(*i@uGamWB>*{0Qqu14z=vV}$!3CV4O%8B zV-UcmI2_R;8vD2vQaf<^<+xipSt2AEs_HA4M0DC`I z70i*ADE~F;TZJt4+MeDID*+l`!{xJ=f1P`+S zAK4zT>?WH9)4f{tC?;gK%0hw%VijG##x)K@gEN$=|A&?%c&Y$n2K|ECeG59i1QpOz zSY^tpSfMaAMN8{+GhA4WWld(+l(zW$TsOtHXi31FD7XT|zI*-ckMz_lq(2Vbb_nvG zFF|6A(Gc8J%pf$muU~&)%w$P_kKH{H&kQ%z}ih^WlaNLqo?L(kyh@-f6srkpA)+Aal-(}!QSxuxySs|q!869#4 zSb1C#;HKMlzn0n@*qf2)-GF7-(BouoM=#G!S>*0fxAn^(1b=_OxTGkh7Sh(ND6tRl z>PyxijaO^8b7@&$#peJ9&0~w*n(hMwcE;Dhm4aOLEn*>4*N$Ew54v z@I?u)+ha>=?$C8-*F|Prd0jw6C%_$`_kY+8-a6LkUNwIG6T{9g1Z)@_g1R^k9lyK> zlyzAw_Fx!5RCs^Ivv&p0hwgU-9f9o~LAJ-uO?N+BSRuNug=$nFa>A41_ z?X{DiQNt)ezy;1L*mrPVX>#KV$xaklXIi+4?w#2!7qIZqd9fZrY*aR%>L*d6CeS z6$a#70BPCiV&lcS z!yE6%p^WuIM-PcMyaEw|2cy`;8)$mUwtq{#1nUHgJid)XG|}vD`XQ;{38n@JM3JVI z%@gBemX3cMn|9j|n=gwpG)Eb)@x^W(eLd{%-*anmPC;&eJ0DI=Y?dxzrh?9SiE04c zIT8w#STNr^l&aqd;N=c}c^5!V0y_`k{XFjzD~lR^pxfXj`Ws@dXJJQ>C3u-+;LgFQ-{~e_9`ZnQH9_MY4c~hg zj@aWxsth~Nctx>LTqvauni;N+16fD7Z0W}XP~p+-O~2|da>P1Og@u0~ErR#Tz-7u~ z*eibmt-4Jfv$JW22fo?rxFqbW+#vh=5e>W%5!~*vMNp;^mCG%{KE&7TvQ~wy{z5Pc z|4?pdx8a_^qezB8V}k|SW8e)8ct)1qphX}j2&@csg%q#*iIT!s*6l^6Y9s2XbHEPb z8@LG;NGV+;1um`q3nKzIBVXQgvd-HEk#K);`CAqV$9j^k+oiWi-r&RS$DaEO4%u{} zgPyBvNf-cQM*Ew|<;OD{({2 zj&Zan7A=ybB&;%7joZHqNW~2S)Gr+q>bZJO|A8@Zk|%OvtZdwDf)0+`RRDII<2rx! ze8R%z&Tpks@WU{ai+`h3_AkIs=&uO+!@L3;{QT;IejStyWz}2Qj>p(6DB80F}RNfIRm<^Ds*9bo9bF5H;Qy<6^lz@;*?<9p~MhlSB!Dddd zmZ;`$)_-nu8uxl8o6{V>Pd2fp0seTOm$d-daWS3iAo`^iN@br?P!Zyy^BRp-mgJR% z5Dw#D9Z*xhkpaJ>jeEa^u447$ zcb0;}V8;U*_xw`gj2cfS>#E_aE2SFaM_K`f-cZ0SNSYPJ+C=Se+Hhxl!wP z7no8v@YCc@N971#jn~a%H^m&Rq-NB+dSFXT3#sI&wclX{RDNi2*QZ!_f%yOnmJ6^W zw+3L3L(^$twHXa8FY|vD!d_vTG0)!7@VQ4W3-&z#j{1oAbkF;#RV{S*@)Eb&FvPBP z;dl0GgWooSf5)UFbXc}){62s!{c?<|(61$Il7|D>Z0P*b4q6I9=qGvS7~7)&1T-@_ zDXp7XD|GnQf**v?7q%R5+#CUG-EnA2Cen`FUugN=Zb$kPCo+F+4dPOw&!x;g(1``u z0@5&o-hFetNjqAH2M_%`zmDIEwFKU3;4t{2Fl)=rliz31?z@?946>pdkc^Kr1jqlv z%Zpl6*3PW)UmM|FU<2@l{?D(Mo7uSE*n>u=85H-TR*f*QdZ8CO9)hQLAj$%F8LW9| z7Fzjz4s=Ib-mHJBUGWSzId|&?*ws(rqj)59@;;36Dq%rnED{~??3Ks(?F>8|=bVne z?>s@P&pkDbaJ6>T%vh9NxBwO`@FB1ZUZZ?2Ki3_SPw8w zcD97~0uXp8N<3<{9s!k5T7jjG{VyQeD`f@CJK~W*%M5?z1ce^05@ijZTLM}woOMl= zjgf&E7w9hnBi8F2$h3w2BlV}8gTC%Yqye_H;V0mEWS%V6Dw#RgD7K!&$9MD;krl8kwsa zZWdaNkD^&qlqbq%^2S)XEC};OLOlvou1azL76N|_5Ip%v@+9zD;&`t1Rx>9L;zx&G zJCMiCDzMYa@kzU9KmYX8^JmvrMBvL`p8oLtn}1M1kGu4!8|mw*=fy8i-#mN${nO{% zT%cX7)6bMUVZek|#vLMi5$Qh18;vRj+JFNjzlb@)diKE2ZTRu9To%BxRmiML3hSy% z%;JA$p_Qlq+x40V-)+M$e`Xv=N+yR=lbDP$Dx4UI%zIrK?A#7d+d>HH}U{ z2Ntcgbuv#0keS{H%uR0w3}!L*pG;Q7V`P7N6V4;sD~%Gh!{ryD5;Ur1?mWW}k)W`}qcq~q-u^EN{uqtJp z+2N){X@oJO8H}}r;?f|I1E<_00Z7z6WU8B5KtS?Uw%UNvKppuRTOFExxvieQF;Pg2`Z;6G z!sUN*q02yN4slbV1dWypT?FPr7lDbjXeBa{lMS?}tsaS71LJ^$HqA{xLTAB zW;G(f_qnh!Xe4S3OOg^gPLMGCNX&mCq9ZY5axzH{6rXZyB4mun10p6RSe5!KMXW-d zT$;~_SZH-3V)BxRW&NHLv4s1pj5>jA&1LKa7TE^x%i4@Yj6u18F(@(>RJ*be@khV{ zAhnfa`NG5Qb*0BD4N-QLcA1Ew<5pYS*d%2MlnYvdj$|!?lfn>QzvP1;T<3s^4_+Lwsa5N1GU&br4F zho6ELm<497eSkP@7Fv1Yyla2_xAq)ydD}C@A=Zn8_9fyZ2sy+L@+&3|_iPtcU5i>i zG;!E0w906^IY(RG_6%)^^de$?Iots~BfvO(Rk(wj(w~oZsMSfZvkbvbgTapCye^;9 zHKlso!<1+uev_y19QBT5s6!j>LUl2^b(T87FRqb>>P!3B`PlD!APX=W&;~@2Ojm{#U z1j<971kGcg3>rg|I7ojAU?Mho_!AM&!yl!ra8Btg{84aK*T!VwPX@}up9Iarp9GB* zra>YfPPxdEkO+Jz{*exJN@cz(0J5MU6^g;b0Z?f6JpM`0EC5Qt7^uVnLM#*UNHKpSu`Xa1O*aP(nBbK$*W3X?rVq^ zA|wxpGH4bN<B;MQMJgNqho$tYHkP2j}0<{s39KYyqsicdu zh5Y8hsxW_V{XsQ8~M}wA>$5PRA78hwlE<;f~AgSo*+cOu`JVOF_@_uV4UviRBvdN+YId2R!?G za?ma!1&+RJIJXg#luOKaTlGsi7=^cCT)gJ`7WaRYBI<{^3Qw?7#O^~+XQ&Z$;Dfv$ z`~hA7jE~|@(NSQKErhP%j(TlXM&d%$y8vrYECDy4^o=cAf^EBxbRRHBAQma| zg=p|W*Dmk4)BG#5oG`~ajCA?zE73Q{4B>?=m`p6YLAmfsgEH$XnSn8OPWMWr@saewc#5A{0pgQ zf4lpw54lACxEen4C-o5asFQjY&mV(+7?I#Ep47AcGoKwde|Je-Ee6c84hhs*_6Z&_ zm34k@pA#}ep0<{bGVI#rforDVd;UD!@<4yjDQ&Fg+?X4FsikCAdbHlPtC)Uz20?J4 zO~qv3forYmVzXO?)P1~#n|+TpMDQjY{3CHv)oF76V%=hT+b4gr^`73MQ@H@mPvu@+ zM5=6r4LJss`K9aPN6ZD2Rq+Si1_98Vfr79{34jKFv)1E5<>e!#8n^MAN&9y+{xpAk zic$+)Hp|#5PX?nj3|xAPOWZJiqm%O(PSOl447%(G&bIRfhHSa#wBwM|cj*7qa^f|< z@!p>#-E?#}(4kG3)HO^BC)+|t?~k!~#3;?8bW;SK6}Ab}6$KP?gR+t-^(fV&<1#A# z95a?gi4~qGrzlmWXgDipCFs%r%|U-V9=X|;E2=#0wgbIeKUNErqJniWqD7vnfk-^+ zfl5t?zo-XHt-;6QIb8acf+t+@IQlLVl`F*fHAvye}8A>Dqw~$f9%(%=4eUD8NNXT=hEK&%l1a?kS()i)!M8{0M(N#m6+T z2xX{c!ij)>h1V=VO{(I;rFC|g-NgA+AMd)5IWU$xOu$kl*^`|oZRth>M{L4AK?D%SJ^BtD~ZfW{?mvwuvHchy_QlmEGpODhXC6GegMucTvSvSK&83> z-W*=hv+a(4a}|mABku%z^LZTj1Qlv1<>51A{WA0hy!7tyMa_-%85)0ULw5S!mnv~) zLNr36=WbkXbSu^VG>a zMF-k=BaRo7q&0xBNkccB6CVLcy4`!P=?h09;Ly~Y+(E4h(2cLM@amH}qz&S~VxKos_$qO*$ z8I+Xd#EFeNw2PrSPM*I|jyW>Qzn2o_M{%_R4ScFN?hUmHzV#&umcW3!o=bilsW#5} zDg~vSEGAvnDPivVE-TCFuz;73yyH6>TpoyfNAG0CIxi1aX@7s9arEN4zwtz8Y1a-H z!jNU{de}*IJZiApcbucnskZ13r+Qf^{L=|jjTO_vG`Jj_xEu!pg{*t4&*av5TAOBE zPQ~}*y8L5urL5+)r7K3TrFv*~oo*yHknx(KN^H3~tu%yQ^7 zdWXB?ejRFSWjTL$u>yg`>T6VD!-LnpiemKN5tJ3?QR5|Xs`XSYV_M$1%3ZE5#t{N2 zUR;@2BsWwkBA&V2ki*U3eOA0;%$;B5>ZI_*Mbs>QX|N+NLzkH-`Jkzc$>1Eolubxk z2G{e70ij?U-bkUZ=*@p)lkVotE@VS(W>WEDClu} zm}rh@J;%~I%JY4w_z6fAE0i~6d{BdgK7UL?9G{0$co#(YjMY|B2_0NuViQ(MQqiE| zou1S$!RJ%;NYH2w@g^;^Mg`eubY?5gttZdmvh>Ggvm`~Bv8?bF78N`#g~T-rgSzpp zQgy|AR)&8odfKG~UM%+#vf988CA_7i(bROF&xr+o_c5%-_PahvgU=kD=G8`b3M;T( zs1`c0QY>3Qc6Xr;Rih`9i)R%~&`W-2(bwSgX=SLFKAo>Y1)2qou&;}7EB2uEMC+C;R>W{#qQSp~lU!{(vJtdd+yr75itb8bL;T>`qowtb0#Jfbura$zz zXfb~|F7Uwb5A-|mIwBGV0=E1cmqMPw4@0y=chPId8t#>iPRh39^nPAR0jW{f*|wbG zTI|YOhxt1)v~i?rV3M8-%+)_Q&TdH z-9J;0BC3MYh&nj#FIlbtp@px;%h@icWhZ|c_jpxcn&wm$@Mi|>IDAv^H(nE4)Wmql zfmGx2n7D}re6Z&>>Vs*Ff~R+b`=5P;K<$!ymx-~0@{*q=yX2cB1H=2;oWG0=c?S2C zXNHA7ujqw0zdXGtzOEEbGy7A<8TcG8zyAr1*LSaDr1c63dlljk7B3(-BRR4TGE?7JnEg`o!{ODpKT zZ|M<)?{{?uXfF9dZdeAk-l@Abw?4_29n`5DFc+^yUABpxW|J@7v`a)?NQ5#xtWr z>9)qIb(o}vJ0-4&UdC{|0eyV%9%Aqw=FWRTaQS>abRT-!ES_RxjDwIKt!k+D4@(nE zFz`QXq4?k7cu%*@lt=#$zXZXnlhN7}0Wg=5jsg<|HZeIdlTlbGf2};(lG{d-@BI~g z8!(~?p$=Tyjg7D+ADWfNlGP4BX#4<@=x(fenIP5E^Yxo2Pyj($c1(n2qOuNTW#yfP zPG%3YWcJ<7*LOEBzO{*;6>*tmes*_1GkF>NBAexD68qB5?$)!9(Knx}&AB=?yNCJ0 zc^7>+9qVd~&o=s@e>xn(j_OoDGZ8!%OejmJ-5npteL*M)H=Ddju3!AfW{C{b4 z#@IM5bJ?BEf3ECKhv_KV-nX0Tp&jpOJaV)tMtIR-JhiDZk8M%Ft`g(_;;xX1vXpm~ zX71XqWSEYkU5OB;K6;0uS*?DXOy# zm1J>NUfVhkk}sua78=tjorrQhe7_ncNJWi6rdbKhm0H}%_s9=iN zCN3{vf9GXs(-b!Y!@ycNz&tg5do{ZORIDxX00?>?rOXh# zv@>5lNmdi~D^Ft&R9#r0Zt_?4q0eIL;7wVPf5o{^uknTq(^147`ibo2ECM%&_h6IIJ&O}7Gg1>fIQ}eyV~721 z(PT9b=VLtw5zQj|a=`3kKkwthI}bJv9JC^Onp5ksuGZ+7dFRM;E287JI>iV`qr1nN ze@EHH61z}!(#U?6kD7J8J2n4IoUh4rBEEp*5aASf1lXG}KH;j)CqQwqL_l-0M9@Cb zJHWGm9~n~Z*8BkLr(m0JxmE8#ve^T5WxwFDUe%5GnXuemUqcRQD}&Zz?`CF%qt9b! zEaS+GAs+2hb9&sLPwc(kpEn!vg2lH5f7r3wia!jF?v8`U&X0-rCY0Bu++@?{z;lA&Ge9I5Z&3=XRe#1@b5&I#kp!PsEe+ovm zY4;n59rnAIaF{6^BmW%XW%V2m3?HgpyKUOG!EIpYy57J+<+wX+DtN!E`9U%L+uRpX z%P`tCt%{VURrbn-BlL8HuJ^E7H6gvVk7 zkr4z)hW~d&qdElr^xch2HUqYVH?LqhGpD{4Z{Sq7+^+Zsj>9IXJ+N`!HS31Pt?;y~ z4TCkpn^0Y82JUhp=P*7#2p;DS$a&;OU9ILOiypCMqIW-k{r1g=@3{+9e+M6$5sr#^ z5OX_?7;`%U;pp<{vE~NK&8{XK7KH7k{DD%AODm@W@@<%ht7ccP`Gp;)|1+@}k>-MX zOth`rwtB$5)H+LkckB94?@)u{{N-7gvO00Uu-Y|RI&}PnmXFQDV=Y?1W*)b0I$SJi zZ0=a?+j$)KL%d|aUPnwU`niM>nL6ne-;E|Gf z;!Uy{9?MHFF5qvMX;G5AfU{uZ(uiN{VhiV;CJ7reqbq(dW(l9)9g#Qoa|Z+gJXib8 zga`#R6*=@Jz*LR>@>ruX2QfUitlxnm2c%~aEmZIsiad)0wO7TKe>%JUNuuPI$Li_Q z7}|cvhvkrn9^&dmwHMmBj>nL@&U);?)N7Ik>PjLoO2X@pBneN-RY({azCCYF%>lGO zknvv(Y<8i`9O2A}J)bkd4(M!1Cyqd1hED zGI%c!U!PY3sd&%^e|Y=!G&kTD;1eGt&}gU&$r7e}JoYD^E^f-ixsNbUQ&5pY-UDGs zQn?OPygtg2VS^n2d^(8b0u0H29N3Hj0jG?^6dQVn5dmX#$2_9@V}8fBx?#@bf87q? zLUwEi*bLyhaENU~IJf-L{XPG}fq<{D=f)D{8r;M7CATY{e|&mA)Kf~qI|xTqbCK(~ zL8AFmyvh4#VZV^#&?^*&r``ZKHUKgjUq}Ox9=*u`KyO;0u?7T5z0$c%t5*-Pj#JGw zI5nXT7-{xTEpOOn>ZW2N$GAITpBcMqkg7Fn5oo>Nf8Yo7y9!a%n_Gr;eiGx?>~8zF zse%|;Di49Xf6K&sU7rt|W>uYP74iw6#u9~I|NKrZKFa+XXCb#ASw1cE9zL*@AE+Jy zR_orn!cjHt6=Uik$^|sVT&b$Iy?oguR9{Bb7l3>9H5`7Z$gO9n@(Ii&ytWmZS9u3= z?ZvQGeNnYLMA=l)W-`0NL3n3X6xF}b-|e1Hi*#iTf9IdA8erj&BGpb>o!fgl34hyA zqgV+p@JV$GyD9%7w|uRPI+7-ro7k6Q!h)Af8pvZX#jgE;1IUZ+nfg{hp!{oo3?#1@ zyJ`SwPHnxp=Vx`cOy_I`^C#rrr6mNsLeqO9%eIsF<^H@|SBhwEqAzm^oVWz9QQekN z^>75cf3IP|-5lIf0_@rYDglG6@Ffm`!xX5hs;^M86BFTyI(S#LQC{7F69^P`6u2fG zlj7izbX0w1R2)3hHoG{*-QC@#IJCICySo*K#kIJ*7k7%=;_lE=+}+(j?&tmW{n)d~ zj%0F8_MDu|WD;$@Sg0-9+5ou)$pNOK2$74*;LgKh=2RC^meWL|JE zwd`czBcylZNd^r26R~x~+HX`pGHA;2eQBksmu|gz6%_8hSL$eZm5jdolMB&35ZS#r zxL%YVl?0s_-*dFg5A{~Z&=qTqGLl2x$5c;-hW=6M_uLTCtG$9o`akhzi3peiaz;3@ z=x?T!&&-8ss|C2FyC@XJ=;k7}MfgfhlCup=2ymz0%|>Ar!K15Jy1e$%qzN%P5&~R> zrXH)*3LsE&{jp-HRig)C!Wz4g_JtDHlPYR&Tvg6wBd?-Q0+iP}I|Iig@8J+PE<4&3 z_|_Z7D>lg#RBMN%1T_UvOM)Xyw)ddJPF(qSDYl&U7f>Iw~UCw?P& z7`uB~NZtfS9FdB}ieDJJZ@}q6flbI|h{>B`iUm8gGzAr}K9^l3c?PH`3oJ$4Ke=fi zu%J$GjPx-6CIIq@@)%ucwdh)d^+X?vqECuC_%E-j#J}nnh!IJ2%NJ6#YVSYY_|mxwut=)4`)TICk3rf4oPvTu?D3Q@Dpx;QJQ+$fTw!stKNaKHk4oW_>rJca#oyb!6Z2X8k&_pu}ZGzo>4OhS`7nGa&|- zgA`{lVVN(mgm_vfFP`biMsy3}EM^yRkPH)a`Z;(A1O;N*D3E^1sR-h+>N+gsmQ-6} z|J5%GjLh4^hHQ+cM~8anN3!3P|B>G5s55c;MSrpW&~+H@OpQrMGm#6kjflvokOtE# zE%4}s75al_5u#{bn9vZ#Gdd?=Ch2{l>Cj$7)`G=k)Np<>29c`&R~ObHn@tGN-Ta zkypSYq$(fdBo?_GlQq$j*SdblhA}0=Rmm@-<#Wts2Hx$!sq9vThX zXsXnE?tV)jr3sRZjS6M;v@rai%`efDMdPAa=Y77wp0q zrN+F}*(5gfZe7BuCSI6DkzQ?_?1kl*q&^mwxf0JF*4|<(mN-8J+`trWK2+-avc4yo z!^^P0yxgbqsVt_wq35_|cXkWKr;j*ylZ9(}{I#$~I)(ieXNd~we(RR!{^*Ih3cne} z+T?KGF<{<6dSkJrxYMb0hSazr6;oN@=#g>J&A~SmDCABJD7Dx5&?vZV21|=#PpvZ4 z^;{Hv6TO>q+PP(1ZQiMG@&`nukH5dfYdbR|Z8u7;J9?HEPQ;I0F_K5G%{-GAu z(l|aKtKMUodm2u`?Y^Bo*vf=HA|IS(s>!lr)sq}L8;!h5O)p*s+o5q1yu0}WnlW(YzYSLazV?FChKX?Rz4vjshL# zCdP~$>$+$n8j9vmfdv_WbU}|l(Ot*mL^DGpxeI{;CG<>8S%SO_IQfW zF^wy}4T9Bu36~7>%RN)6(;PzD7~iPr+83DLxsAyu)rS`K-*4PPPju)hWV^ino>qzo zaBqGCKt5o7zfsH`rvZnM0ik-8io3tQ`F~k3M^vafK zJgtQ^nh;^7=;VwMm&#i)!R-TP>l?m;zE<>@x&}HU)8vcBe`|epNDKG>#Sru+A`WR# z3t;K(GvN`3YxE~`keV9D$^qfKhL4-7(B@@-d$~0o#|GWawT4XD$kek zml}|%Ww~f}z~k%|Y9q2uxoOlO)KlKHp$r)Q$r?VcR!vxMCofSz2m&->w=7GPa{?}? zauVa08~rU!-fRa3uVDpIarU3p`R^-#;cC>Jce(*mA5$9HTBd`a<^1do4JAVb2GS< zX+sb&w_x2wWJLY##g$-Wu{oq;G^mU3==f{jtFdTxarBXR?IKB(%D=?Hg0E-{Uuqi7Wa!to1O(HHrnjVYe>*=c{(o7DX(y>aK7`-9nt% zLj6(M^a}UDa*6Pu9W5tN(};l;I}8a!O--d(&OZv|7gn0zdxxtVsN=@X;VeLdA-s`S zGZr4!T5$N{&0@bak{lDHE;hA*MzWK$u{(+`PKgkVN6FWJxbIMX(vu=oL1T2%M|^FZ zK=>q-knFLqO%A^a$a)epx$5wE)}7(VYdWz9;f69)`{33dYvo+Q58ZWzWWaJPz~J zp11CZ>B`@j$O#C_qghGY}dPYoFMFP)n^tVL$Otj=A{-M}c zSowE7Eo*lr#%JVZVTK8uNh$SoHQHvcE<^WRnT(e!s?6aORXWv={#m}ZrX5j6*!~O2 z+LLC>z0H>UD_Y$tPSA+SA_^Axee&V5p;#)WXu^S=ooYy&>@%K zVQk;Q!d%tXQcJ{JBI(NI#4RG{v_lg|FXZ;qi4|AEMI+JcDaN%dz=Y>CRg@ikH0 zD?kJL^4}upF<0P829+hN_-B`Y)jxIO)7ERFUt{$8(9TNd1nbQwvR_`INz<@BRXlo( z)pT0LR@vjaaQ@wg!v1!m08n*ENE?T%$+umKR0|#Ui%v4vg@At~o9Hc_+iEdKoKlxG z1hjTwX8J2DlfSCM_H5|seHk(BC#eIya%EH(piIw!0^x*bN6xBt@uA+?vQc<0o_yTW z6Nac387`#9k}yBSP}cV0qYw&Dn8cON7x+DG4~n~b3$U2R zx8gWf?#1OD@32hP`v*cNKs(hBWA5!v#z+I*Hu4ABI{x+mHe??zWC<)Y@X(DOiTpgm z2|gtB<6gJY(}kbkpCgbl)^bB!xn{?wS_pi@^7bG7$p4<<`{qKsBHJ$Cpw~J?rO~X* z6hK!xa@)U^&%Q3A(p`Lcc49LQSx;E@O(%FyT>q}nt}CP9PI|btm7Sz z(Jef_&NP-!r{RZ6Sf|q>aHNfifrJ?~d!4YPfIGqu+gu;$-u3u+`c@+ECS9i5646NcQ*J`mC!C+H29k%An;yxZ%6lzs zV1+7oTP{@EX3DEU`x&%Fr*53gyMI)gybXMDWc<4-j%(p;l+Y@T>_ zH_v#D8~L6}^?rH1#=;|~&X(lw3w}e{=n93!Vn*`Zsh)ySj|@(ID6L+3k$iO8p4&9< zsL(CM&L7iN4)AZ(E8oO+@9C#@Y>JjLtSh?W==-MW?Z+2M{QBHX(B`1XKa+23=NB+P z&pi%OPb~g=*nt)K>r}z!H(u$X5$sb3s7c-{_-6GzKRGkv1w-()M}Tu9QZevfG>qeQ zO;x4D-`6?=L(`LkxN&uhM9#$Ar#~SE@cY%}cj-E4#=$8)Ra!tiOp^u!%(zW`t3y<*k+iJ^e z`wWk_gj?gbh71l-!qM&Kw*Rr&$~9SU`~IaQ2{f{_05R>5%G&+Zll{s%G#k-|nEL%hM7)&Z{Tm_}LEcOLOP= zOD6Jw;Ufnkj)8~0pw7aRP$bIQ0$&Z@v}EWh2Mjl=veW5iv0qPba|D%zuY> z0r_vNTDlFZl~4N1MF)CpRkL;7V4FHr()_e@`O_EHCdU@4=EVHtbQNwm`(_?FzYTvg zmw`8ro=(r3=N(14U?v?K&WYY*P*jVXnY4!OJfj@Oewm&H7+$CdT?@-a*@Pd)Fzl=1 zLM)vfWy1B_T*YQbiR-3pPG~BOIYiuekw<4Lx(G^F%X*4HFDt6_Krw(i#TX_+xfj;x z@gSR8I-L%USQb(nQeIPAY467!Y(+{l^P>u&gYFbwu{{{n74EcOX{1UkiFT|1shlzrbaOnBHTvagpIIe_{mp z)7wklFdK>DvSWuifNHe~)CGscFIycX=@8f8VfHh#fmHEMo?RK9ut#fJ7+x0F?3!iz z;0L&u4NkT9TO%KGTNzaa!D+WbP?qS)tBWx@E6UO_YXkW#OGkxPMLHG(k%F1(dW&o? zH5LK)*V(QzDtswQxn$Oq`QU0IE3KAs?I-bHT}&Ow_fU+o%WRsKAbz7l*0Cz#2GY}w zw0|(rxJK`UBPqheD;Ur}eh*^=PIge)v1It4+II%Vr$JadHR=M#-3U9&iwxG?!m$;< zoZ1~y{W{>Ds^C6=o=C*|7L+Z?(g)XTZS%&4;V0s2yhFPwIEA(ks4LHaOGP9P74+EO79Hz# zitrnhL?$5cj^n}YH3WL2_(QXp1$I*s;=%g1?{pOj-OhlPvbjd<4 zG$Vv{Iph?9ycoD$s3bRm$OyqZhyR*zCjv%L@>J%A{+qH!oQ%NzcEh@MvL9O~9^Ski zA$t^!F#@3U0gXlo3Th9v&Uos6LkK&HY5zAflrJ)RPF`;l)xLrL=Z;Bo9)Qgl;mdI1Rulm4Q{X7Vgmeb!vQk?SUI{4h`F1d1|vcJU$_6!l z95f@+x#zFyFuE(2uZ+cMs~Obn==BQq*lx--B>vkF7?C<$8Abxm76oRNT{`XiH>^%8 zHNDvKDp;mB+#uJK_R301J2}msk-1*7U;s15fC~ER7|i0^-t>^vqwV?X0UpAmZgoL{ z!HoQ-AToKe1No)HK2Kw_u6#BGC`A@RAIENM&WDrTx={Cc4lk*7mpoH_O1XgCn|jPC zOlVZO&_9$ZtutP-cP18^=(6MIt;=_?_wK39h_pD5V%LE?3)h}scF5f_R>+Aw=E*vx#47{wcDG3$Ag&B7gMp zVn4mwmvi=CvsjJmHlXm5Kv5R=dQkyOaRU#DKK8@K_1S3Uph}hc(D0GSQRC1tuKyUa z5d{#5M`RxSoa7Mw!$?z6EWQ0y$@2%Z-^>_&)FOg&Z8dNMyN=SJ%=}>Sw_qNPe>({w zGUx{#+wIj3(t|jt96&}O#RkX;jOm_KAubE)d zBpXWj4ZOxj4lR~}qP0{YF2Z#|aDInDGva@RoQK8R=9m>F5PXQ*Apu=8Ywa8Zb5Dx> z=Wu|n+q;*qHEc7<_XE6Bjv3^2arNHq2GSN$Kv|4Lks7#3F+`$p!~8ceNh7|o(>)d3 zfT}vU{Mw~A;XUlDl$$qIe(+`Sbu(CHtaMZAlqhi{XuMTz&^q1o4>x?8#?UwLf=7H8 zc-hetvH!2SPfH>vvl90YT~dz2iM@ihMqT|K@SyQ=4uL1+!smf2cM&!UbtL&EIw)E& zPHrW+!`B)!+e*p04(FPkgxX3kn$P%9EI{=3;`n(EPiZO4+UA$?Oxs`WBv}WE!jOoTdS&7|1U6Z1=kf*os<&@doh&T&r;#t!oFG0lFR8=S}gK?Lg8bQ zs6D*&23MfrmqEUx{drRf++Cwjt6pgCV{nkMP+Qa~fN9>?kk zu*5S6&w|BFP$tpX0r-;dSko~%xSHoidnVnmlIc^8#F05vf;Q5dr~m$y;!d2-xQPc1 zuh0tIxCI5i+W50)ls&;t9b8@`$Z4Fr+L4yg3NeTtvt6)>Fe~^VU!7n;gcTK&J|+tU z+s=qGMJ|F%`e$k#Gxk-Kf<8Zn~lN?}>LxhIw4EU5@^dI=EjBiHLVkOrw$C$jRr?pNl^GE;=|$y9X-yJh3@L`b=O zCp%mi^#%q;SaT$)xFOzOwI4sccN1bdA+Q@62N?sHz`bWICLl^$KAU+CHIZMN=o76? zCRr7%lT8n#K~xrz5|p3Y^%rivg4#`lzNhIY4{y%;k0?|E<2V2ldLw@P*N|)m=sbvc z(LB$jJX(xly0{ae@!oMO!74W6{ly7L*PIOL_0SjS)}M<|t%a0a-;0;4NJZYRip{*E znw;&BT>IDpSwL%g>=<8NzkCskPPQ6)Mxr$jNM~s->*858kpv)(f+>y$dQ=(X{G5sz zqNXS>smTd4aCe-gX^;-+5QdrQ;ZHp=qqkvIa6v;D0A97wrm7bDz_}btK8WqQZJ!ZwlWs4$7CQ%5nry6YED9fq&(mC6d@oum zql^ssfad9YV?YtjewbePSIvmaOb7e`HTvjjxA|}D4H6C`VQfa@csJ=%T&-~L3bfGhiy#;BnIiQ|A!Shff#h@q){ygRN;)K^Y z4HZA*x|=Q{g8WwyB1omVKSb}bA}dreE_nT2RimoLp(R#4=~3*fHg2#0rjRheP>OSq zd??^Y+>tkmP-AtooZSE)Ia*rsQ>>j(6S=^A>~z!BXhUwFkX4X3IeI?>2k(ZK_MJe7 z>n~6WQuRG;Wo=96euw{vv$y0KhwDl=>ebXK{H>&LFbCt-%h~Pss2M6{I+(vQ$xh3L zc^4g1y{+Cw$6*YVX`LdGc0Y@ zB}yni)LpB%=(WY(kxd9BK%SvMDz0Gu!|^nP`-hz>BADWQyhwykEtK%JCTJRo5V-o) zbe0dbk|+AqKeOSigX}55>54O&=?EX62{e9-c4^#_QsTQZQ(Q zlQUD3F_t?C*P5AJ5Gx^77VA>isM`0BJJj4=YX(52o2EXd%?t!hN!gpJN0Z{Q)ppZyUZ}lCDA%ReRFFLY)zkZw zsy5h*&=rVd6)Uj$?v~O)3om$FLj`Zo`|c7Us9cWtBv1?z;hVAdu?&kQ4`YrR!6*z* zy_?xc8Ys=OZpf6Pa4&M?=3U%L>d?tmO=)9|{2qH2R%0EAz%ZFYNo)$tM&Agbw$*l(lb~nFjkC_bq z6fQbs^ytl7y1B%!hFCxuV&v^yAzc%W#NuM(KRaVsvz@D3}I%MoG(nRp3kw!i0orD^iH4a_LVasLo^2Ol#M$} zuLsQbz7ym&!Uq~1J+-qU#?if|3B@ECjp){|$TT%rPZPz*`z1u{RX z2U}ddIlCmjry_exOD`_zKPj;_3tNu;@L+CW-@~qh{maBxNO4L0}ORbMz$DW&P}M@^Lfsvh#BDaC32! za;iAtQvW4*^)pKB8rV1y-CS{C1v{(kb`Jlse^-|suC7zi-Yk55 zo(HkM^6Ci%XYxmM5yF^y!o_x)|8r#-c2H6X?9g5TI=X5>_ftjU875<1KGqp(U!cL{ z&mZ#nsV_P2F#34(cbm4HUT5GN#>r>^J65B*Xdc5 znT3J1YeINb8otzC!k>v+#cU;QA&{uAHGIxrZu6flA2O%)m@?wW(`8f+Ghj}J_$LYx zOmUi?l_(KH12w!Y!39`yAgLKB?1i69eIDT*o6p$oxqK5+C2brAzx4wSP4OSX>#p_8 zm`hRF0TO<#Wyz_R_);+|vFs2&##M23uVO9?1y&k!dMb1gm8J%`+!kFWx*?DO3M9%z z(OE{nsVEvqRUl5N5`j69H~Jl6(`y}%MNeKd(YS3wX%w+?3&mLU5O*W_JS231GO{%c zvQ_EZ1W?EeU4w#D3+|EzZ^w6B%tmF5Ohk)qKS)kDFi!xf5)BnRTeMsE>i|(Zi9M4* zHUdq3X5uQT)R+rM&ii$e2|drj6tpu}n7v(w@KaTNgHbw}dGZfsTXRt^gCX>9o6x08VI{~07iyD(IjZ(YXp>S7AF3i)I zG9i<5NA%84{*cJ#8a3hzbC6CcX#4~rY>^iZpEW+;Z~9VOwF)Cf1GKJ+_0{zgI<4s7 zi1_qvEsn4A5+fy4*pZZ2(wZ<+ghE~jOMRrk;xDUGiA>PtpM-y?GNJ4a`WhSMvD%SJF&zRH;>&0CBrpfG5P>ke9LTl43kf?6m zu*Vtx*$}0hYw@=o#x@kd~Bc0T6znc@u9{y|*4wof?iRyH7wA z%IthmC#F`^jyCV?otsTsKp~qJN;t5#ZLMo}Px?PH=#y>>)R)?WLO3GZmA?9RiWeM( zL)W(cMgDU3bglN9)ki`*wn2H|S}PrPawW4%0D*K)h74XChc5-XPP42}h4CnA?A_nT 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

QWe)(z<2@B7Mmu|#cNc(ztIKD=`}8CH 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�rRqSbGSX2LtK7@*{s+Am> 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≶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�$ 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 T@a(y;7!W9o&&sN-tAhVO*TBvJ diff --git a/publications/comnet/submission/main.tex b/publications/comnet/submission/main.tex index 28c39b4d..f6a8e660 100644 --- a/publications/comnet/submission/main.tex +++ b/publications/comnet/submission/main.tex @@ -35,15 +35,15 @@ \cortext[1]{Corresponding author} \begin{abstract} -MQTT, the dominant IoT messaging protocol, operates over TCP, where head-of-line (HOL) blocking couples logically independent topic flows: a single packet loss delays delivery across all topics sharing a connection. We define three configurable stream mapping strategies---control-only, per-topic, and per-publish---for running MQTT over QUIC, each offering a different point in the isolation--overhead tradeoff space. We implement these strategies in \texttt{mqtt5}, an open-source MQTT library, and evaluate across five experiments on GCP infrastructure under controlled network impairment. Using inter-topic latency spread and spike isolation ratio to quantify HOL blocking, we find that per-topic QUIC provides meaningful topic-level isolation under loss: spread amplifies 200$\times$ at 5\% packet loss versus 1.2$\times$ for TCP, and 27\% of latency spikes affect individual topics independently versus less than 2\% for TCP. TCP outperforms QUIC in throughput at 0\% loss, but under loss ($\geq$1\%) QUIC outperforms TCP by up to 2.8$\times$ while providing encryption by default. We additionally evaluate QUIC datagram transport, finding no statistically significant performance difference from stream transport at representative IoT RTTs. These results provide concrete strategy selection guidelines for deploying MQTT over QUIC in IoT environments. +MQTT, the dominant IoT messaging protocol, is conventionally carried over TCP, where head-of-line (HOL) blocking couples logically independent topic flows: a single packet loss delays delivery across all topics sharing a connection. Three stream mapping strategies, namely control-only, per-topic, and per-publish, each offer a different point in the isolation--overhead tradeoff space for MQTT over QUIC. We implement them in \texttt{mqtt5}, an open-source MQTT library whose broker-autonomous per-topic delivery-stream mapping is absent from existing brokers, and evaluate them across four experiments on GCP infrastructure under controlled network impairment. Using a density-corrected spike-isolation metric and per-topic tail latency to quantify HOL blocking, we find that the transport, not stream mapping, sets the level of HOL blocking at heavy (5\%) loss: all three strategies keep the median per-topic tail below TCP at 5\% loss (control-only 132\,ms versus TCP's coupled 351\,ms). Multistream adds spike-timing isolation, but as a bounded tradeoff rather than a free benefit: per-topic's isolation holds only at small topic counts, reaching single-stream coupling from about four topics, while per-publish stays isolated, at a tail latency that depends on loss and rate. On a single connection the strategies differ ninefold in publish rate, but we show that gap is set by two QUIC transport constants, the concurrent stream limit and the per-stream receive window, rather than by the mappings themselves. At our 8-topic, 500\,msg/s reference point, control-only, adding the least packet overhead, has the lowest median and 90th-percentile tail among the QUIC strategies at 5\% loss; at 2\% it is indistinguishable from per-topic and at 1\% it is the highest of the three, and at 125\,msg/s under 5\% loss per-publish is lowest, so which strategy has the lowest tail depends on both loss and rate. Under loss, QUIC delivers 1.26$\times$ the throughput of an encryption-matched TCP+TLS~1.3 baseline at 1\% loss, rising to 1.78$\times$ at 10\%, once the emulated loss removes single packets; applying the same loss per kernel buffer on the sending host inflates that advantage to 2--3$\times$. These results provide concrete strategy selection guidelines for deploying MQTT over QUIC in IoT environments. \end{abstract} \begin{highlights} \item Three stream mapping strategies for MQTT over QUIC evaluated -\item Per-topic QUIC amplifies inter-topic spread 200$\times$ under 5\% loss -\item QUIC outperforms TCP in throughput under loss by up to 2.8$\times$ -\item Frame packing policy interacts asymmetrically with stream lifetime -\item QUIC datagrams show no significant advantage over stream transport +\item The transport, not stream mapping, sets the HOL blocking level at 5\% loss +\item Control-only mapping has the lowest QUIC latency tail at 5\% loss and 500\,msg/s +\item QUIC delivers 1.3--1.8$\times$ TCP+TLS~1.3 throughput under 1--10\% per-packet loss +\item Per-buffer loss emulation inflated QUIC throughput gains to 2--3$\times$ \end{highlights} \begin{keywords} @@ -59,20 +59,20 @@ \section{Introduction} MQTT is the dominant messaging protocol for Internet of Things (IoT) deployments, widely adopted for device-to-cloud communication across industrial, smart city, and consumer IoT platforms~\cite{mishra2020mqtt-survey}. MQTT's publish-subscribe model, lightweight framing, and multiple quality-of-service levels make it well-suited for constrained devices and unreliable networks~\cite{mqtt-v5-spec}. -However, MQTT operates over TCP, which introduces a fundamental limitation: \emph{head-of-line (HOL) blocking}. When an IoT device publishes to multiple topics over a single TCP connection---as is common for devices reporting temperature, humidity, GPS, and status simultaneously---a packet loss on any one topic's data blocks delivery of \emph{all} topics until retransmission completes. This creates artificial coupling between logically independent data flows, increasing tail latency and reducing the responsiveness of multi-topic workloads. +MQTT requires a reliable, ordered transport, and is most commonly carried over TCP. This standard transport, however, introduces a fundamental limitation: \emph{head-of-line (HOL) blocking}~\cite{scharf2006hol}. When an IoT device publishes to multiple topics over a single TCP connection, as is common for devices reporting temperature, humidity, GPS, and status simultaneously, a packet loss on any one topic's data blocks delivery of \emph{all} topics until retransmission completes. This creates artificial coupling between logically independent data flows, increasing tail latency and reducing the responsiveness of multi-topic workloads. -QUIC~\cite{rfc9000}, the transport protocol underlying HTTP/3, addresses HOL blocking through \emph{stream multiplexing}: multiple independent streams share a single connection, each with its own flow control and loss recovery. A lost packet on one stream does not block data on other streams. This property has been extensively studied for web traffic~\cite{langley2017quic, kakhki2017quic, marx2020hol, yu2021quic}, but its application to IoT messaging protocols remains largely unexplored. +QUIC~\cite{rfc9000}, the transport protocol underlying HTTP/3, addresses HOL blocking through \emph{stream multiplexing}: multiple independent streams share a single connection, each with its own flow control and in-order delivery, while loss detection and congestion control remain per-connection~\cite{rfc9002}. A lost packet blocks in-order delivery only on the streams whose data it carried, although the connection-wide congestion response can slow all of them. This property has been extensively studied for web traffic~\cite{langley2017quic, kakhki2017quic, marx2020hol, yu2021quic}, but its application to IoT messaging protocols remains largely unexplored. -Running MQTT over QUIC is not simply a matter of replacing the TCP socket. The question of \emph{how} to map MQTT's control and data packets onto QUIC streams admits multiple answers, each with different performance characteristics. A single-stream approach (equivalent to TCP) gains QUIC's security and connection management benefits but not HOL blocking elimination. A per-topic approach maps each MQTT topic to a dedicated QUIC stream, providing topic-level isolation. A per-message approach creates a new stream for each PUBLISH, maximizing isolation at the cost of stream management overhead. +Running MQTT over QUIC is not simply a matter of replacing the TCP socket. The question of \emph{how} to map MQTT's control and data packets onto QUIC streams admits multiple answers, each with different performance characteristics. A control-only approach keeps all data on one stream, as TCP does, gaining QUIC's security and connection management benefits but not HOL blocking elimination. A per-topic approach maps each MQTT topic to a dedicated QUIC stream, intended to provide topic-level isolation. A per-publish approach creates a new stream for each PUBLISH, maximizing isolation at the cost of stream management overhead. We use these three names throughout. -In this paper, we define three configurable stream mapping strategies for MQTT over QUIC, implement them in \texttt{mqtt5}, an open-source MQTT library, and evaluate them across five experiments on GCP infrastructure under controlled network impairment. +In this paper, we implement and evaluate three stream mapping strategies for MQTT over QUIC in \texttt{mqtt5}\footnote{\url{https://github.com/LabOverWire/mqtt-lib}}, an open-source MQTT library, across four experiments on GCP infrastructure under controlled network impairment. Our contributions are: \begin{enumerate} -\item Three stream mapping strategies (control-only, per-topic, per-publish) for MQTT over QUIC with a lightweight flow header protocol for stream demultiplexing. -\item The first empirical evaluation of MQTT stream mapping strategies under controlled network impairment, quantifying HOL blocking and throughput. -\item An evaluation of QUIC datagram transport for MQTT as an alternative to stream-based delivery. -\item An open-source implementation with integrated benchmarking tools. +\item The first implementation of \emph{broker-autonomous} per-topic and per-publish delivery-stream mapping for MQTT over QUIC. The operating modes are defined by EMQ's \emph{MQTT-next} specification~\cite{yang2024mqttnext}; we implement the broker side that specification describes but that no production broker realizes, in that the broker opens its own QUIC streams and maps each subscriber's deliveries per topic rather than only mirroring deliveries back onto client-initiated streams. +\item The first vendor-independent, controlled, statistically-treated evaluation of MQTT-over-QUIC operating modes, namely control-only, per-topic, and per-publish, under emulated network impairment, quantifying head-of-line blocking and throughput. +\item An argument for why QUIC stream multiplexing, rather than $N$ parallel TCP connections, is the concurrency mechanism available to an MQTT client: the v5.0 session-takeover rule evicts an existing connection when a second presents the same client identifier~\cite{mqtt-v5-spec}, so one identity cannot hold the parallel connections that would otherwise supply per-topic concurrency. +\item An open-source implementation and a reproducible benchmarking harness. \end{enumerate} The remainder of this paper is organized as follows. Section~\ref{sec:background} covers MQTT, QUIC, and related work. Section~\ref{sec:architecture} describes the stream mapping architecture. Section~\ref{sec:implementation} details the implementation. Section~\ref{sec:evaluation} presents experimental results. Section~\ref{sec:discussion} discusses strategy selection guidelines and future directions. Section~\ref{sec:conclusion} concludes. @@ -92,40 +92,39 @@ \subsection{QUIC Transport Protocol} \textbf{Integrated security.} QUIC integrates TLS~1.3 into the transport handshake, achieving a 1-RTT connection establishment that includes both transport and cryptographic setup~\cite{rfc9001}. This compares favorably to TCP's 1-RTT handshake plus TLS's additional 1--2 RTTs. -\textbf{Unreliable datagrams.} The DATAGRAM extension (RFC~9221)~\cite{rfc9221} allows sending unreliable data within a QUIC connection, benefiting from the connection's encryption and congestion control without reliability or ordering guarantees. - \textbf{Loss detection.} QUIC uses per-packet sequence numbers (unlike TCP's per-byte) and acknowledgment-based loss detection with probe timeout (PTO) for tail loss~\cite{rfc9002}. This enables more precise loss recovery than TCP's retransmission timeout mechanism. \subsection{Related Work} \begin{table} \centering -\caption{Feature comparison of MQTT-over-QUIC approaches.} +\caption{MQTT-over-QUIC stream mapping across implementations. The operating modes originate in EMQ's \emph{MQTT-next} specification~\cite{yang2024mqttnext}; implementations differ chiefly in \emph{where} topic-to-stream mapping occurs. The \texttt{mqtt5} column is verified against its source; the EMQX and NanoMQ columns against their published documentation and source. For EMQX and NanoMQ, multistream is a client-initiated capability rather than default behavior: EMQX runs single-stream unless the application opens data streams through its client API, and NanoMQ's multistream exists only in its outbound bridge and is disabled by default. The ``Published evaluation'' row records where each implementation's performance numbers come from: EMQX's are published by its own vendor, Kumar's are peer-reviewed, and \texttt{mqtt5}'s are the present manuscript, whose implementation and evaluation share an author; the open implementation and reproducible harness are intended to offset that. The EMQX and NanoMQ columns describe the sources and documentation cited here at the time of writing and may change across releases.} \label{tab:feature-comparison} -\begin{tabular}{lccc} +\resizebox{\columnwidth}{!}{% +\begin{tabular}{lcccc} \toprule -Feature & \texttt{mqtt5} & EMQX~\cite{emqx} & Kumar~\cite{kumar2019mqtt-quic} \\ + & EMQX~\cite{emqx} & NanoMQ~\cite{nanomq-quic} & Kumar~\cite{kumar2019mqtt-quic} & \texttt{mqtt5} \\ \midrule -Stream strategies & 3 & 1 & 1 \\ -Per-topic isolation & \checkmark & --- & --- \\ -Per-publish isolation & \checkmark & --- & --- \\ -Datagram transport & \checkmark & --- & --- \\ -MQTT v5.0 full & \checkmark & \checkmark & --- \\ -Open-source & \checkmark & \checkmark & \checkmark \\ -Empirical evaluation & \checkmark & partial & \checkmark \\ +MQTT over QUIC & \checkmark & \checkmark & \checkmark & \checkmark \\ +Multistream (client-initiated) & \checkmark & \checkmark & --- & \checkmark \\ +Client topic$\rightarrow$stream mapping & --- & \checkmark\,(bridge) & --- & \checkmark \\ +Broker-initiated delivery streams & --- & --- & --- & \checkmark \\ +Broker topic$\rightarrow$stream mapping & --- & --- & --- & \checkmark \\ +Published evaluation & vendor & --- & peer-reviewed & this work \\ \bottomrule -\end{tabular} +\end{tabular}% +} \end{table} -Prior work on MQTT over QUIC falls into three categories. +Prior work on MQTT over QUIC falls into two strands, which we take in turn. -\textbf{Implementations and evaluations.} Kumar and Dezfouli~\cite{kumar2019mqtt-quic} implemented MQTT over QUIC using a single bidirectional stream, demonstrating reduced connection overhead (up to 56\% fewer handshake packets) and lower delivery latency (up to 55\%) compared to MQTT over TCP across wired and wireless testbeds. Fern{\'a}ndez et al.~\cite{fernandez2020iot-quic} evaluated MQTT over QUIC under emulated wireless conditions (WiFi, LTE, satellite), finding that QUIC maintains stable throughput under packet loss while TCP degrades significantly. Neither study explored stream multiplexing for topic-level HOL blocking isolation. +\textbf{Implementations and evaluations.} Kumar and Dezfouli~\cite{kumar2019mqtt-quic} implemented MQTT over QUIC using a single bidirectional stream, demonstrating reduced connection overhead (up to 56\% fewer packets exchanged with the broker) and lower delivery latency (up to 55\%) compared to MQTT over TCP across wired and wireless testbeds. Fern{\'a}ndez et al.~\cite{fernandez2020iot-quic} evaluated MQTT over QUIC under emulated wireless conditions (WiFi, LTE, satellite), finding that QUIC maintains stable throughput under packet loss while TCP degrades. Neither study explored stream multiplexing for topic-level HOL blocking isolation. -\textbf{Industrial implementations.} EMQX~\cite{emqx} is the only production MQTT broker to support QUIC transport, but uses a single-stream approach without configurable stream mapping. Table~\ref{tab:feature-comparison} compares the feature sets. +\textbf{The multistream operating modes, and where mapping happens.} Mapping MQTT traffic onto multiple QUIC streams is established industrial practice, and its taxonomy predates this work. EMQ's \emph{MQTT-next} specification~\cite{yang2024mqttnext} defines three operating modes, namely Single Stream, Simple multistreams, and Advanced multistreams, and names ``mitigate HOLB'' as the multistream benefit; it also defines the flow header and, for the advanced mode, broker-initiated streams. The single/per-flow/per-frame stream-mapping taxonomy is older still: the 2017 RTP-over-QUIC draft~\cite{rtpfolks2017} mapped media onto QUIC streams at exactly these three granularities. We therefore do not claim to originate these strategies or the flow header. Existing implementations, however, realize only the \emph{client-driven} portion of the design. EMQX~\cite{emqx} accepts multiple client-initiated streams but opens none of its own, so any delivery-side isolation is driven entirely by the client rather than the broker; in a default session its own client uses only the control stream. NanoMQ~\cite{nanomq-quic} pairs configured topics to streams via a per-topic stream identifier in its bridge configuration, but only within its outbound bridge \emph{client}, and only as a default-off, work-in-progress feature. Table~\ref{tab:feature-comparison} summarizes where each implementation performs mapping. The HOL blocking problem in multiplexed protocols has been studied extensively in the context of HTTP/2~\cite{rfc7540} and HTTP/3~\cite{rfc9114}. Langley et al.~\cite{langley2017quic} demonstrated QUIC's benefits at Internet scale, reporting reduced search latency and video rebuffering across Google's infrastructure. Subsequent empirical work found nuanced results: Kakhki et al.~\cite{kakhki2017quic} showed that QUIC's practical effect on web page loading is modest despite reducing transport-layer HOL blocking, and Marx et al.~\cite{marx2020hol} demonstrated that implementation-level decisions (prioritization, frame scheduling) further affect the degree of isolation achieved. Yu and Benson~\cite{yu2021quic} corroborated these nuanced findings through production-scale measurements. Our work applies stream multiplexing to the messaging domain, where the ``resource'' granularity is the MQTT topic rather than the HTTP request, and independent topic flows may benefit more directly from stream isolation. -To our knowledge, no prior work has (1)~defined multiple stream mapping strategies for MQTT over QUIC, (2)~evaluated the HOL blocking implications of each strategy under controlled network impairment, or (3)~quantified the throughput tradeoffs across strategies. +To our knowledge, no MQTT-over-QUIC \emph{broker} autonomously maps topics to server-initiated delivery streams, which is the mechanism we implement and evaluate, and no peer-reviewed study independently evaluates and compares these operating modes under controlled network impairment. This paper addresses that gap. %% --- Architecture --- @@ -140,6 +139,7 @@ \subsection{Stream Mapping Strategies} \begin{figure} \centering +\resizebox{\columnwidth}{!}{% \begin{tikzpicture}[ stream/.style={draw, rounded corners=2pt, minimum width=1.6cm, minimum height=0.5cm, font=\footnotesize}, connbox/.style={draw, dashed, rounded corners=4pt, inner sep=6pt}, @@ -159,249 +159,289 @@ \subsection{Stream Mapping Strategies} \node[label] at (0.8, 2.0) {(b) Per-topic}; \node[connbox, minimum width=2.2cm, minimum height=2.8cm] at (0.8, 0.2) {}; \node[stream, fill=blue!15] at (0.8, 1.2) {Stream 0}; -\node[stream, fill=green!15] at (0.8, 0.5) {Stream 1}; -\node[stream, fill=orange!15] at (0.8, -0.2) {Stream 2}; +\node[stream, fill=green!15] at (0.8, 0.2) {Stream 1}; +\node[stream, fill=orange!15] at (0.8, -0.8) {Stream 2}; \node[font=\tiny] at (0.8, 1.55) {\textit{control}}; -\node[font=\tiny] at (0.8, 0.85) {\textit{topic/a}}; -\node[font=\tiny] at (0.8, 0.15) {\textit{topic/b}}; +\node[font=\tiny] at (0.8, 0.55) {\textit{topic/a}}; +\node[font=\tiny] at (0.8, -0.45) {\textit{topic/b}}; \end{scope} \begin{scope}[shift={(6.4,0)}] \node[label] at (0.8, 2.0) {(c) Per-publish}; \node[connbox, minimum width=2.2cm, minimum height=2.8cm] at (0.8, 0.2) {}; \node[stream, fill=blue!15] at (0.8, 1.2) {Stream 0}; -\node[stream, fill=yellow!20] at (0.8, 0.5) {Stream $n$}; -\node[stream, fill=yellow!20] at (0.8, -0.2) {Stream $n$+1}; +\node[stream, fill=yellow!20] at (0.8, 0.2) {Stream $n$}; +\node[stream, fill=yellow!20] at (0.8, -0.8) {Stream $n$+1}; \node[font=\tiny] at (0.8, 1.55) {\textit{control}}; -\node[font=\tiny] at (0.8, 0.85) {\textit{msg 1}}; -\node[font=\tiny] at (0.8, 0.15) {\textit{msg 2}}; +\node[font=\tiny] at (0.8, 0.55) {\textit{msg 1}}; +\node[font=\tiny] at (0.8, -0.45) {\textit{msg 2}}; \end{scope} -\end{tikzpicture} -\caption{The three stream mapping strategies. (a)~Control-only multiplexes everything on stream~0. (b)~Per-topic assigns a dedicated stream per topic, providing topic-level isolation. (c)~Per-publish creates a new stream for each PUBLISH, providing message-level isolation.} +\end{tikzpicture}% +} +\caption{The three stream mapping strategies. (a)~Control-only multiplexes everything on stream~0. (b)~Per-topic assigns a dedicated stream per topic, intended to provide topic-level isolation. (c)~Per-publish creates a new stream for each PUBLISH, providing message-level isolation.} \label{fig:strategies} \end{figure} -\textbf{Control-only} (Fig.~\ref{fig:strategies}a) uses a single bidirectional QUIC stream for all MQTT traffic. This is functionally equivalent to running MQTT over a single TCP connection and provides no HOL blocking mitigation. It serves as the QUIC baseline, isolating the effect of QUIC's transport mechanisms (encryption, congestion control) from stream multiplexing. +\textbf{Control-only} (Fig.~\ref{fig:strategies}a) uses a single bidirectional QUIC stream for all MQTT traffic. This is structurally equivalent to running MQTT over a single TCP connection and provides no stream-level HOL blocking mitigation, though it still keeps a far lower tail than TCP at 5\% loss (Section~\ref{sec:exp2}). It serves as the QUIC baseline, isolating the effect of the QUIC transport as a whole from stream multiplexing. -\textbf{Per-topic} (Fig.~\ref{fig:strategies}b) assigns each MQTT topic to a dedicated QUIC stream. Control packets (CONNECT, SUBSCRIBE, PINGREQ, etc.) use stream~0, while PUBLISH packets are routed to topic-specific streams. A hash map maintains the topic-to-stream mapping, creating streams lazily on first publish. This provides topic-level HOL blocking isolation: a retransmission delay on one topic's stream does not block delivery on other topics' streams. +\textbf{Per-topic} (Fig.~\ref{fig:strategies}b) assigns each MQTT topic to a dedicated QUIC stream. Control packets (CONNECT, SUBSCRIBE, PINGREQ, etc.) use stream~0, while PUBLISH packets are routed to topic-specific streams. A hash map maintains the topic-to-stream mapping, creating streams lazily on first publish. This provides topic-level HOL blocking isolation: a retransmission delay on one topic's stream does not block delivery on other topics' streams, though the isolation narrows as the topic count grows, for the reason Section~\ref{sec:evaluation} measures. -\textbf{Per-publish} (Fig.~\ref{fig:strategies}c) creates a new unidirectional QUIC stream for each PUBLISH packet. This provides the finest-grained isolation---every message is independent---but at the highest overhead cost, as each message requires opening a new QUIC stream. +\textbf{Per-publish} (Fig.~\ref{fig:strategies}c) creates a new unidirectional QUIC stream for each PUBLISH packet. This provides the finest-grained isolation, because every message is independent, but at the highest overhead cost, as each message requires opening a new QUIC stream. \subsection{Flow Header Protocol} -When using per-topic or per-publish strategies, the receiver must determine how to demultiplex incoming data on non-control streams. We introduce a lightweight \emph{flow header} prepended to the MQTT payload on data streams. +Under per-topic and per-publish, the receiver must know how to demultiplex the data arriving on each non-control stream. For this purpose the MQTT-next specification~\cite{yang2024mqttnext} defines a \emph{flow header}, placed at the start of a data stream ahead of the MQTT packets it carries, and our implementation supports it. \begin{figure} \centering \begin{tikzpicture}[font=\footnotesize] -\draw (0,0) rectangle (7, 0.8); +\draw (0,0) rectangle (7.8, 0.8); + +\draw (1.0,0) -- (1.0,0.8); +\draw (2.3,0) -- (2.3,0.8); +\draw (3.5,0) -- (3.5,0.8); +\draw (4.5,0) -- (4.5,0.8); -\draw (1.2,0) -- (1.2,0.8); -\draw (2.4,0) -- (2.4,0.8); -\draw (7.0,0) -- (7.0,0.8); +\node at (0.5, 0.4) {Type}; +\node at (1.65, 0.4) {Flow ID}; +\node at (2.9, 0.4) {Expire}; +\node at (4.0, 0.4) {Flags}; +\node at (6.15, 0.4) {MQTT Packet Data}; -\node at (0.6, 0.4) {Type}; -\node at (1.8, 0.4) {Flags}; -\node at (4.7, 0.4) {MQTT Packet Data}; +\node[font=\tiny, text=gray] at (0.5, -0.25) {varint}; +\node[font=\tiny, text=gray] at (1.65, -0.25) {varint}; +\node[font=\tiny, text=gray] at (2.9, -0.25) {varint}; +\node[font=\tiny, text=gray] at (4.0, -0.25) {1 byte}; +\node[font=\tiny, text=gray] at (6.15, -0.25) {variable}; -\node[font=\tiny, text=gray] at (0.6, -0.25) {1 byte}; -\node[font=\tiny, text=gray] at (1.8, -0.25) {1 byte}; -\node[font=\tiny, text=gray] at (4.7, -0.25) {variable}; +\draw[decorate, decoration={brace, amplitude=4pt}] (0, 0.95) -- (4.5, 0.95) + node[midway, above=4pt, font=\tiny] {flow header, $\geq$4 bytes}; -\draw[decorate, decoration={brace, amplitude=4pt, mirror}] (0, -0.6) -- (7, -0.6) +\draw[decorate, decoration={brace, amplitude=4pt, mirror}] (0, -0.6) -- (7.8, -0.6) node[midway, below=5pt, font=\tiny] {QUIC stream payload}; \end{tikzpicture} -\caption{Flow header format. The 2-byte header identifies the packet type and flags, enabling the receiver to parse data streams without full MQTT framing on stream~0.} +\caption{Data flow header format, as defined by the MQTT-next specification~\cite{yang2024mqttnext}: variable-length integer \texttt{Type}, \texttt{Flow ID} and \texttt{Expire} fields and a one-byte \texttt{Flags} field, four bytes at minimum. On the client's publish path the header is optional and we leave it disabled throughout; on the broker's delivery path it is always written, so every server-opened stream under per-topic and per-publish carries one.} \label{fig:flow-header} \end{figure} -The flow header (Fig.~\ref{fig:flow-header}) consists of two bytes: a type field identifying the MQTT packet type (PUBLISH for data streams) and a flags byte encoding QoS level, retain, and duplicate delivery (DUP) indicators. The receiver reads this header to determine how to parse the remainder of the stream. This is more efficient than transmitting the full MQTT fixed header on every stream, since the stream itself provides the framing boundary. - -\subsection{Datagram Transport} - -As an alternative to stream-based transport, \texttt{mqtt5} supports QUIC datagrams (RFC~9221) for QoS~0 messages. Datagrams bypass QUIC's stream layer entirely: messages are sent as unreliable frames within the QUIC connection, benefiting from QUIC's encryption and connection management but without reliability or ordering guarantees. - -Datagram transport is designed for latency-sensitive telemetry where occasional message loss is acceptable. Since QUIC datagrams are subject to the connection's congestion window but not to per-stream flow control, lost messages are skipped rather than retransmitted. However, as both transports share the same per-connection congestion controller, the practical latency difference is small (see Section~\ref{sec:evaluation}). +The header (Fig.~\ref{fig:flow-header}) is optional. It carries a \texttt{Type} field distinguishing client from server data, a \texttt{Flow ID} that names the flow for recovery on a later stream, and an \texttt{Expire} interval, each a variable-length integer, followed by a one-byte \texttt{Flags} field whose bits are the specification's session-persistence controls (persistent subscriptions, topic aliases and QoS state, error tolerance, and clean-start semantics) rather than per-message MQTT flags. The receiver detects the header from the first byte and parses plain MQTT framing when it is absent. The two directions differ in our implementation. On the client's publish path the header is optional and we leave it disabled throughout, so client-side data streams carry plain MQTT. On the broker's delivery path it is unconditional: every stream the broker opens for delivery is prefixed with one. Control-only opens none, per-topic one per topic, and per-publish one per message, so the header is itself part of the per-message overhead that Section~\ref{sec:evaluation} measures on that path. \subsection{Broker Integration} -The client and broker configure their stream strategies independently. On the client side, the application selects a strategy (control-only, per-topic, or per-publish) before connecting; this governs how outbound PUBLISH packets are dispatched onto QUIC streams. On the broker side, a server-wide delivery strategy governs how the broker sends messages to subscribers. In a typical deployment, both sides are configured to the same strategy, but the architecture does not enforce this---a per-topic client can connect to a control-only broker, or vice versa. +The client and broker configure their stream strategies independently. On the client side, the application selects a strategy (control-only, per-topic, or per-publish) before connecting; this governs how outbound PUBLISH packets are dispatched onto QUIC streams. On the broker side, a server-wide delivery strategy governs how the broker sends messages to subscribers. In a typical deployment, both sides are configured to the same strategy, but the architecture does not enforce this, so a per-topic client can connect to a control-only broker, or vice versa. -For outbound delivery, the broker's stream manager maintains a per-connection topic-to-stream mapping. When configured for per-topic delivery, streams are created lazily on first use and reused for subsequent messages on the same topic, with LRU eviction to bound stream count. For per-publish delivery, the broker opens a new unidirectional stream for each message. On the receive side, the broker's QUIC acceptor classifies incoming streams by ID: stream~0 carries the full MQTT packet parser, while non-zero streams use the flow header parser to extract PUBLISH packets and route them into the topic distribution engine. +For outbound delivery, the broker's stream manager maintains a per-connection topic-to-stream mapping. When configured for per-topic delivery, streams are created lazily on first use and reused for subsequent messages on the same topic, with LRU eviction to bound stream count. For per-publish delivery, the broker opens a new unidirectional stream for each message. On the receive side, the broker's QUIC acceptor classifies streams by kind and arrival order rather than by numeric identifier: the first bidirectional stream accepted becomes the control stream and carries the full MQTT packet parser, while later data streams are probed for a flow header and otherwise parsed as plain MQTT, their PUBLISH packets routed into the topic distribution engine. %% --- Implementation --- \section{Implementation} \label{sec:implementation} -\texttt{mqtt5}\footnote{\url{https://github.com/LabOverWire/mqtt-lib}} is an open-source MQTT library written in Rust. The library provides both a client and broker, supporting TCP, TLS~1.3, WebSocket, and QUIC transports. The QUIC implementation uses Quinn~\cite{quinn}, a Rust QUIC library built on the \texttt{tokio} async runtime. +\texttt{mqtt5} is an open-source MQTT library written in Rust. The library provides both a client and broker, supporting TCP, TLS~1.3, WebSocket, and QUIC transports. The QUIC implementation uses Quinn~\cite{quinn}, a Rust QUIC library built on the \texttt{tokio} async runtime. \subsection{Transport Abstraction} -The library defines a \texttt{Transport} trait abstracting read/write operations over any underlying connection. For TCP and TLS, this wraps a single byte stream. For QUIC, the transport layer manages multiple streams through a \texttt{StreamDispatcher} that implements the configured strategy. +The library defines a \texttt{Transport} trait abstracting read/write operations over any underlying connection. For TCP and TLS, this wraps a single byte stream. For QUIC, the transport layer manages multiple streams through a \texttt{QuicStreamManager} that implements the configured strategy. -The stream dispatcher maintains a \texttt{HashMap} for per-topic mapping, creating streams lazily on first use and reusing them for subsequent messages on the same topic. For per-publish, the dispatcher opens a new unidirectional stream for each PUBLISH and closes it after sending. Stream~0 (the initial bidirectional stream) is always reserved for control packets. Quinn's default behavior packs STREAM frames from multiple streams into single QUIC packets for efficiency. To isolate the effect of this frame packing on inter-stream coupling, we extended Quinn with a configurable frame packing policy: the default \emph{Greedy} policy preserves the original batching behavior, while a new \emph{StreamIsolated} policy restricts each packet to a single stream's data, preventing cross-stream coupling at the packet level. +The stream manager maintains a per-topic map from topic name to its send stream, creating streams lazily on first use and reusing them for subsequent messages on the same topic. For per-publish, it opens a new unidirectional stream for each PUBLISH and closes it after sending. The initial bidirectional stream carries control packets, and under control-only it carries the PUBLISH traffic as well. \subsection{Connection Lifecycle} QUIC connections follow the same MQTT session lifecycle as TCP connections. The CONNECT packet is always sent on stream~0. After CONNACK, subsequent PUBLISH packets are dispatched according to the client's configured stream strategy. -On the broker side, the QUIC acceptor spawns a dedicated task per connection. Incoming streams are classified by their stream ID: stream~0 receives the full MQTT packet parser, while non-zero streams use the flow header parser to extract PUBLISH packets and route them into the broker's topic distribution engine. - -\subsection{Datagram Path} - -When datagram mode is enabled, QoS~0 PUBLISH packets are sent as QUIC DATAGRAM frames. The MQTT packet is serialized with the flow header prepended and submitted via Quinn's \texttt{send\_datagram} API. The maximum datagram size is bounded by the connection's \texttt{max\_datagram\_size} parameter, which is negotiated during the QUIC handshake. Messages exceeding this limit fall back to stream transport. - -On the receive path, datagrams are delivered via a separate channel from stream data. The broker's QUIC handler polls both the stream accept loop and the datagram receive loop concurrently, feeding both into the same message processing pipeline. +On the broker side, the QUIC acceptor spawns a dedicated task per connection, classifying streams as described in Section~\ref{sec:architecture}. \subsection{Benchmarking Infrastructure} +\label{sec:bench-infra} The library includes an integrated benchmarking tool (\texttt{mqttv5 bench}) that measures latency and throughput. Latency mode embeds microsecond timestamps in payloads and computes p50/p95/p99 percentiles. Throughput mode counts messages per second over a configurable duration with warmup. Both modes support configurable publisher/subscriber counts, QoS levels, payload sizes, and transport parameters. -Network impairment is applied externally via \texttt{tc-netem}, and broker/client resource usage (RSS, CPU, network I/O) is sampled at 1\,Hz during each run using procfs monitors. +The evaluation uses two builds of \texttt{mqtt5}. The \emph{pacing build} is release 0.41 of the library, whose benchmarking tool can pace publishers at a fixed aggregate rate instead of letting them send as fast as they can. The \emph{evaluation build} lacks this option; its binary checksum is recorded with the data~\cite{bracht2026zenodo}. The two builds' absolute rates differ, by amounts Section~\ref{sec:exp3} reports, so every conclusion rests on comparisons within one build; where the two builds' results appear together, the text reports the difference, and a side-by-side comparison at 10\% loss measures it directly. The pacing build produces three sets of Experiment~3 runs: the offered-load check (paced publishers and the unpaced runs they are compared against), the broker delivery-strategy runs at fixed publish rates with their unpaced counterparts, and a side-by-side comparison of both builds at 10\% loss. The evaluation build produces every other result. + +Network impairment is applied externally via \texttt{tc-netem}, and broker/client resource usage (RSS, CPU, network I/O) is sampled at 1\,Hz during each run using procfs monitors. To observe the loss-bearing path directly, the 5\% loss condition of Experiment~2's three QUIC arms also has an instrumented arm of five runs each, with the broker sampling its own QUIC connection statistics at 10\,Hz on each connection it holds, giving congestion window, losses and congestion events; the subscriber-facing connection is identified per run as the one carrying more packets. The instrumented arm uses the Experiment~2 configuration and matches the uninstrumented arm's tail ordering and level (median per-topic p99 133.7, 161.5 and 209.1\,ms for control-only, per-topic and per-publish, against 131.9, 164.3 and 194.7\,ms); tail figures come from the uninstrumented arm and connection statistics from the instrumented one. For Experiment~3's primary arms the impairment is instead applied on a forwarding VM placed between the broker and its clients by a policy-based route, with receive coalescing disabled so that each loss removes exactly one packet (Section~\ref{sec:loss-method}). %% --- Evaluation --- \section{Evaluation} \label{sec:evaluation} -We evaluate \texttt{mqtt5} across five experiments measuring connection establishment, head-of-line blocking, throughput, stream strategy behavior, and datagram transport. All experiments use QoS~0 unless otherwise noted. +We conduct four experiments, measuring \texttt{mqtt5}'s connection establishment, head-of-line blocking, throughput, and stream strategy behavior. All four use QoS~0, so that the comparison measures the transports' own loss recovery and nothing layered above it. QoS~1 and~2 add MQTT-level acknowledgements that travel the same impaired path, and the Receive Maximum in-flight window~\cite{mqtt-v5-spec} caps unacknowledged messages, so every transport-level delay to an acknowledgement would also throttle the publisher at the MQTT layer and mix application-level flow control into the transport comparison. On a live connection MQTT~v5.0 leaves retransmission to the transport, resending unacknowledged messages only after a reconnect. + +Experiments~2 and~4 set the broker's delivery strategy to match the client's. Experiment~3's main comparison holds the broker at per-topic delivery across the QUIC arms, isolating the client's publish-side mapping, and a second set of arms varies only the broker: control-only against per-topic delivery with a control-only client, and per-publish against per-topic delivery with a per-publish client. Because client and broker strategies co-vary in Experiment~2, the broker-side packet and loss counts reported there compare matched client-and-broker strategies and cannot isolate the broker's mapping. \subsection{Experimental Setup} \begin{table} \centering -\caption{Experimental parameters across all five experiments.} +\caption{Common parameters for the four experiments.} \label{tab:params} -\begin{tabular}{ll} +\small +\begin{tabular}{@{}>{\raggedright\arraybackslash}p{0.33\columnwidth}>{\raggedright\arraybackslash}p{0.60\columnwidth}@{}} \toprule Parameter & Value \\ \midrule Hardware & GCP n2-standard-4 (4 vCPU, 16 GB RAM) \\ -Topology & Co-located pub/sub (Exp 2), separate VMs (others) \\ +Topology & Co-located pub/sub (Exp 2), separate VMs (others); forwarding VM (Exp 3) \\ Region & us-west1-b (same zone, $<$1ms baseline RTT) \\ -OS & Debian 12, kernel 6.1 \\ -Network emulation & \texttt{tc-netem} on broker (symmetric) \\ -QUIC implementation & Quinn 0.11 (Rust) \\ +OS & Ubuntu 24.04 LTS (kernel 6.17.0-1008-gcp pinned for Exp 3's per-packet and paced runs) \\ +One-way delay & 0--200\,ms swept (Exp 1), 25\,ms (Exp 2, 4; also swept 10--50 in Exp 4), 10\,ms (Exp 3) \\ +Network emulation & \texttt{tc-netem}, Bernoulli loss: per buffer on broker egress (Exp 2, 4; Exp 1 delay only); per packet on a forwarding VM (Exp 3; Section~\ref{sec:loss-method}) \\ +QUIC library & Quinn 0.11 (Rust) \\ TLS & rustls 0.23 (TLS 1.3 only) \\ -Congestion control & QUIC: NewReno / TCP: CUBIC \\ -Payload size & 256 bytes (all experiments) \\ -Publish rate & 500 msg/s fixed (Exp 2), max throughput (others) \\ -Measurement & 60s duration, 5s warmup (30s/0s warmup for Exp 1) \\ -Runs per config & 15 (all experiments) \\ -Frame packing & Greedy (default); StreamIsolated (Exp 2 ablation) \\ +Congestion control & CUBIC (both QUIC and TCP) \\ +Implementation & \texttt{mqtt5} evaluation build; pacing build for Exp 3 paced checks (Section~\ref{sec:bench-infra}) \\ +Frame packing & Greedy (the default) in every arm \\ +Concurrent stream limit & 100 (the QUIC library default) except where Exp 4 sweeps it \\ +Per-stream receive window & 256\,KB except where Exp 4 sweeps it; connection window 1\,MB \\ +Flow headers & Off on the client publish path; always present on broker-opened delivery streams \\ +Payload size & 256 bytes (Exp 2--4; Exp 1 establishes connections only) \\ +Publish rate & 500 msg/s base, swept 125--2000 (Exp 2); max throughput (others), paced 1.25K--20K in Exp 3 paced checks \\ +Measurement & 60\,s (Exp 2), 70\,s subscriber (Exp 3), 60\,s publisher (Exp 4), 30\,s (Exp 1); 5\,s warmup (0\,s for Exp 1) \\ +Runs per config & 15 (9--15 Exp 2 sweep; 5 Exp 2 instrumented arm; 10 Exp 4; 5--15 Exp 3 robustness and paced runs; exclusions noted where reported) \\ +HOL spike window & 10\,ms (Exp 2 spike isolation) \\ +Broker subscriber queue & 10{,}000 messages per subscriber; QoS~0 messages are dropped when full \\ \bottomrule \end{tabular} \end{table} -Table~\ref{tab:params} summarizes the common parameters. Network impairment is applied symmetrically on the broker interface using \texttt{tc-netem}. Each experiment varies one or two factors while holding others constant. Experiment~2 uses co-located publisher and subscriber on a single client VM to eliminate network variability between pub/sub; all other experiments use separate VMs. +Table~\ref{tab:params} summarizes the common parameters. Two details behind it matter for reproduction. Experiment 3's delivered throughput, and the single-connection delivered rates quoted in Experiment 4, are the mean of the per-second delivered rate over the central 80\% of the window, the first and last 10\% of samples being dropped as ramp-up and drain; Experiment 4's publish rates and Experiment 2's rates are instead a message count divided by the full window. The per-packet Experiment~3 runs are randomized across loss levels, loss-application arms and transports. Network impairment is applied with \texttt{tc-netem} on the broker's egress interface in Experiments~1, 2 and~4 (Experiment~1 applies delay only), and on a forwarding VM in Experiment~3. Experiment~3's robustness arms and the per-packet variant of Experiment~2 keep the delay on the broker and apply the loss on the forwarding VM (Section~\ref{sec:loss-method}). Each experiment varies one or two factors while holding others constant. Experiment~2 uses co-located publisher and subscriber on a single client VM to eliminate network variability between pub/sub; all other experiments use separate VMs. + +\textbf{Statistical reporting.} Unless a caption states otherwise, each plotted data point aggregates 15 independent runs. The line plots show the mean with its 95\% confidence interval, computed as the Student~$t$ interval $\bar{x}\pm t_{0.975,\,n-1}\,s/\sqrt{n}$ and rendered as capped error bars or a shaded band. The connection-latency bars of Fig.~\ref{fig:conn-latency} are different in kind: the bar is the p50 and the whisker reaches the p95 of the within-run latency distribution, not a confidence interval of the mean. Because the delay is fixed and the Bernoulli loss rate is held constant, run-to-run variation in the throughput and strategy cells is low, so these intervals are frequently narrower than the plotted marker and can be hard to see. They are drawn at every point and never omitted; their half-width stays below 4\% of the mean at the large majority of points on the throughput and strategy plots, and is visibly wider only on the density-corrected excess of Fig.~\ref{fig:hol-excess}, where the underlying values are small and most cells aggregate fewer runs (9--10; 15 for the 8-topic, 500\,msg/s cells) than the 15-run default. An interval that is not discernible is present but smaller than the plotting symbol, which reflects measurement stability rather than missing data. + +\subsection{Emulating Packet Loss} +\label{sec:loss-method} + +\texttt{tc-netem} makes one loss decision per buffer it is handed and drops the whole buffer. With segmentation offload the kernel hands the qdisc buffers that carry several packets, and QUIC's datagram batching does the same for UDP, so loss applied on a sending host clusters into fewer, larger events whose size depends on the transport and the load. The qdisc statistics hide this, since they count the packets inside each buffer while counting a dropped buffer once; the clustering shows up only as a drop fraction below the configured rate. Applying loss this way on the broker's egress, as Experiments~2 and~4 do, dropped 7.7\% of QUIC's packets and 9.0\% of TCP+TLS's at 10\% configured loss in Experiment~3's fan-out configuration (three runs per transport). + +For Experiment~3 we therefore apply both the delay and the loss on a separate forwarding VM, through which a policy-based route sends the broker's traffic to its clients. Receive coalescing is disabled on that VM, so each buffer its netem sees is one wire packet; a kernel probe on its enqueue path found no multi-packet buffer and a largest frame of 1474 bytes. The measured drop fraction matched the configured rate within its 99.9\% binomial interval in all but 2 of 972 lossy runs. With a 99.9\% interval about one run in a thousand falls outside by chance, so two is consistent with correct emulation; we excluded both (4.93\% and 4.94\% at 5\%). The forwarding hop adds 28--58\,$\mu$s one way, which we subtract from the emulated delay, and at 0\% loss routing through it changes no transport's throughput by more than 2\% relative to the direct path. Loss remains Bernoulli, each packet being dropped independently with the configured probability, and applies only to broker-to-client traffic. Experiments~2 and~4 keep the broker-egress method; Section~\ref{sec:exp2} also reports Experiment~2's reference cell under per-packet loss. \subsection{Experiment 1: Connection Establishment Latency} -We measure cold-start connection latency across TCP, TLS~1.3, and QUIC at five one-way delays (0, 25, 50, 100, 200\,ms) using 100 sequential connections per run. +We measure cold-start connection latency across TCP, TLS~1.3, and QUIC at five one-way delays (0, 25, 50, 100, 200\,ms) over 30\,s of back-to-back cold connections per run. The 0\,ms condition is the only one in which the client opens connections faster than the network paces them, so its results are shaped by client-side socket resources (ephemeral ports, \texttt{TIME\_WAIT} state, accept backlog), none of which we tuned; we read that condition as a property of the test host as much as of the transport. \begin{figure} \centering -\includegraphics[width=\columnwidth]{Figure_4} -\caption{Connection latency (p50 bars, p95 whiskers) across network delays. QUIC's integrated TLS handshake achieves comparable latency to raw TCP despite cryptographic overhead, and outperforms the separate TCP+TLS~1.3 handshake at all RTTs.} +\includegraphics[width=\columnwidth]{Figure_3} +\caption{Connection latency (p50 bars, p95 whiskers) across network delays. QUIC's integrated TLS handshake achieves comparable latency to raw TCP despite cryptographic overhead, and outperforms the separate TCP+TLS~1.3 handshake at every emulated delay of 25\,ms or more. At 0\,ms, where the handshake is bound by local processing rather than the network, all three complete in under two milliseconds, QUIC and TLS are indistinguishable, and raw TCP is fastest.} \label{fig:conn-latency} \end{figure} -Fig.~\ref{fig:conn-latency} shows that QUIC 1-RTT connection establishment matches TCP's cold-connect latency at all tested delays. TLS~1.3 over TCP consistently adds one additional round trip. At 200\,ms delay, QUIC connects in 402\,ms (p50) versus TCP's 400\,ms and TLS's 842\,ms. The integrated handshake eliminates the sequential TCP+TLS penalty without sacrificing security. We did not test QUIC 0-RTT resumption, which could further reduce connection latency for returning clients. +Fig.~\ref{fig:conn-latency} shows that QUIC 1-RTT connection establishment matches TCP's cold-connect latency at every emulated delay of 25\,ms or more. At 0\,ms the comparison is dominated by local processing rather than the network: QUIC (1.55\,ms) and TLS (1.59\,ms) are indistinguishable and both sit about 2.4--2.5$\times$ above raw TCP's mean of 0.64\,ms, which runs no cryptographic handshake; raw TCP's runs split between 0.26--0.30\,ms and 1.0--1.2\,ms, so that mean describes no single run. That cell is also the only one in which connections failed, and the transports fare oppositely there: TCP lost 26.3\% of its attempts and TLS~1.3 4.4\%, while QUIC completed every one. At 25\,ms and above no arm failed a connection. TLS~1.3 over TCP consistently adds one additional round trip. At 200\,ms delay, QUIC connects in 402\,ms (p50) versus TCP's 400\,ms and TLS's 602\,ms. The p95 whiskers are tight beyond the 0\,ms case, with p95 within 2\% of p50 at every delay of 25\,ms or more (within 0.6\% for TCP and TLS~1.3); only at 0\,ms, where the handshake is bound by local processing rather than the network, is the distribution appreciably wider. The integrated handshake eliminates the sequential TCP+TLS penalty without sacrificing security. We did not test QUIC 0-RTT resumption, which could further reduce connection latency for returning clients. \subsection{Experiment 2: Head-of-Line Blocking} +\label{sec:exp2} -This experiment is the core motivation for MQTT-over-QUIC multistream transport. We publish to 8 topics simultaneously at a fixed rate of 500\,msg/s and measure whether latency fluctuations on one topic propagate to others. The fixed rate is chosen to remain well below connection capacity at all loss rates (the minimum sustained capacity under 5\% loss at 25\,ms RTT exceeds 500\,msg/s), ensuring that any observed latency variation reflects transport-layer behavior rather than queue buildup from rate saturation. +This experiment is the core motivation for MQTT-over-QUIC multistream transport. Head-of-line blocking couples logically independent topics: when packets share one ordered connection, a single loss delays every topic queued behind it~\cite{scharf2006hol}. We publish across many topics at once and measure whether this cross-topic propagation occurs. In each QUIC arm the broker's delivery strategy matches the client's, so the arms exercise the broker-autonomous delivery mapping as well as the client's publish mapping. Around a reference point of 8 topics and an aggregate 500\,msg/s, we vary two factors independently: holding the rate at 500\,msg/s we sweep the topic count from 2 to 32 topics, and holding the count at 8 topics we sweep the offered rate from 125 to 2000\,msg/s; the two sweeps meet at this reference point, which we also use for the tail-latency comparison. At 500\,msg/s the connection is unsaturated, so latency variation reflects head-of-line blocking rather than queue buildup, while the highest swept rates deliberately drive a lossy connection into saturation. We emulate Bernoulli packet loss at 0\%, 1\%, 2\% and 5\%. The tail-latency comparison spans all four, with 0\% as an unimpaired baseline; the density-corrected timing analysis uses the 1\% setting alone, since it needs spikes to be sparse (as explained below) and at 0\% loss no retransmissions occur, so head-of-line blocking is absent by construction. -We quantify HOL blocking using two complementary metrics. \emph{Inter-topic spread} measures the maximum difference between per-topic mean latencies within 100\,ms time windows: high spread means topics experience different latencies (isolation), while low spread means topics are coupled. \emph{Spike isolation ratio} measures the fraction of latency spikes that co-occur across all topics: a ratio of 1.0 means every spike affects all topics simultaneously (full HOL blocking), while lower values indicate independent spikes. +We measure HOL blocking directly, through the \emph{timing} of latency spikes: does a spike on one topic co-occur on the others (coupling) or stay confined to it (isolation)? A latency spike is a message whose latency exceeds twice the median of the preceding 50 messages on its topic, and the \emph{spike isolation ratio} is the fraction of spikes that co-occur with a spike on at least one other topic within a 10\,ms window: 1.0 means every spike propagates across topics (full HOL blocking), lower values mean spikes stay confined. Because a raw co-occurrence count is inflated by spike \emph{density} (when spikes are frequent, some coincide by chance), we report the density-corrected \emph{excess}: the observed ratio minus a null obtained by independently circularly shifting each topic's spike train (averaged over 100 shifts), which preserves each topic's spike density and autocorrelation while removing genuine cross-topic alignment. The excess is meaningful only while the density null stays well below 1: because the observed ratio cannot exceed 1, the excess is bounded by one minus the null, and once chance coincidences become common that bound squeezes coupled and isolated strategies together. We ran the sweep at 1\% and 5\% loss only. \begin{figure} \centering -\includegraphics[width=\columnwidth]{Figure_1} -\caption{Inter-topic latency spread across packet loss rates (25\,ms RTT, 8 topics, 15 runs per configuration). Per-topic QUIC spread amplifies 200$\times$ from baseline to 5\% loss, consistent with independent per-stream loss recovery. TCP spread increases only 1.2$\times$, indicating that all topics remain tightly coupled under loss.} -\label{fig:spread} +\includegraphics[width=\columnwidth]{Figure_4} +\caption{Density-corrected head-of-line isolation (means over 9--15 runs per cell, 15 for the 8-topic, 500\,msg/s cells, 95\% confidence intervals). (a)~Excess spike co-occurrence (observed ratio minus a density null; lower is more isolated) versus topic count at 500\,msg/s and 1\% loss. TCP and control-only stay coupled at every topic count; per-publish is the most isolated; per-topic isolates only at small topic counts and reaches single-stream coupling from 4 topics on. (b)~The density null grows with offered rate, so the raw ratio cannot be compared across rates or loss levels.} +\label{fig:hol-excess} \end{figure} -Fig.~\ref{fig:spread} shows inter-topic spread at 25\,ms RTT across four loss rates with 15 runs per configuration. At 0\% loss, all transports show low spread: TCP at 6.7\,ms, QUIC per-topic at 0.09\,ms, per-publish at 0.11\,ms, and control-only at 0.09\,ms. Under 5\% loss, per-topic QUIC spread amplifies to 17.8\,ms (200$\times$ baseline), while TCP increases to only 8.4\,ms (1.2$\times$). Per-publish shows 107$\times$ amplification and control-only shows 71$\times$. +Fig.~\ref{fig:hol-excess}(a) confirms both the blocking and its isolation. The single-stream transports couple the topics: on TCP and QUIC control-only a loss's spike co-occurs across topics (excess 0.83--0.93 across the topic sweep). Splitting topics onto separate streams decouples them, and at 2 topics per-publish and per-topic isolate (excess 0.33 and 0.59). The isolation is real but bounded: it erodes as topics are added, and from 4 topics on per-topic's excess reaches single-stream coupling (0.82 against TCP's 0.83 at 4 topics, 0.84 against 0.84 at 8), and at 16--32 topics it is at control-only's level, above TCP's, leaving only per-publish still isolating (0.55 at 8 topics). This comparison is confined to 1\% loss, where the density null stays at or below 0.14 across the whole topic sweep (Fig.~\ref{fig:hol-excess}(b) shows it growing broadly with offered rate instead), so excess is well determined. At 5\% loss the null is two to six times larger at 4--16 topics (up to ten times at 32), reaching 0.44--0.50 at 8 topics and 0.53--0.65 at 16, and 0.59--0.73 for the QUIC arms at 1000\,msg/s, which leaves too little room below the 1.0 ceiling for excess to be separable from density. At 5\% loss and 2000\,msg/s the failure runs the other way, because the transports are overloaded. TCP's single connection to the subscriber carries only about 880\,msg/s whether 1000 or 2000\,msg/s is offered, within the loss-limited range of Mathis et al.~\cite{mathis1997macroscopic} for this path (about 810--1140\,msg/s for a model constant between 0.87 and 1.22, a 25\,ms round trip, 1408-byte segments and about 270 bytes per message), so the rate is a property of one connection rather than of TCP in aggregate. The excess piles up in the broker's queue for that subscriber, which holds 10{,}000 messages and drops QoS~0 messages once full: roughly half of the offered messages are discarded there, and every delivered message waits about as long as the full queue takes to drain, roughly 12\,s. A spike is defined relative to recent latency, so a retransmission stall of tens of milliseconds no longer registers against that baseline, and the detector finds no spikes at all, in every TCP run and in nine of ten per-publish runs. The observed ratio and the null are then both zero because there is nothing to count, not because the topics are isolated. TCP at 1000\,msg/s is already capped at the same rate but its queue does not fill within a run; it finds no spikes in five of its ten runs and a single, unpaired spike in a sixth. Control-only and per-topic are queueing too at 2000\,msg/s and lose all spikes in one and two runs respectively, so their excess is too erratic to estimate (confidence intervals of $\pm$0.27--0.28). -The high spread for multi-stream QUIC strategies under loss is consistent with QUIC's independent per-stream loss recovery~\cite{rfc9000}: when a packet carrying data for one topic is lost, only that topic's stream should experience retransmission delay, while other streams continue unaffected. TCP's single byte stream provides no such isolation, which is consistent with the low spread amplification observed. In absolute terms, TCP's coupled degradation is also more severe: at 5\% loss, TCP p95 latency reaches 180\,ms and p99 reaches 355\,ms across all topics uniformly, while QUIC per-topic achieves 99\,ms p95 and 183\,ms p99 with the impact confined to individually affected streams. +How that isolation shapes tail latency (Fig.~\ref{fig:hol-tail}) is governed by two effects. First, the transport, not stream mapping, sets the level: even single-stream control-only, which shares TCP's single ordered-stream structure, holds a median 132\,ms at 5\% loss against TCP's 351\,ms. We did not isolate which transport difference is responsible. Second, the strategies carry the same message load but differ in how many packets they put on the \emph{delivery} path, and under this loss method the tail ordering tracks that packet count. Control-only adds no per-stream framing and has both the lowest median (132\,ms) and the lowest 90th-percentile tail (162\,ms); per-topic follows at a 164\,ms median, and per-publish, which opens a stream for every message, is worst at 195\,ms (under per-packet loss it ties per-topic; see below). Both gaps are significant over the 15 runs per arm (Mann--Whitney $U$, two-sided: control-only versus per-topic $p=0.006$, versus per-publish $p=0.0003$). The broker-side statistics from the instrumented runs (Section~\ref{sec:bench-infra}; medians over five runs per arm) show a chain consistent with that ordering: on the subscriber-facing connection the broker sends about 10.8K packets per run under control-only, 11.8K under per-topic and 20.9K under per-publish. The emulated loss rate is identical for all three arms, so the extra packets become proportionally more losses (540, 598 and 1076) and disproportionately more congestion events (347, 407 and 853). The congestion window responds only at the extreme: per-publish's median is measurably depressed (6.9K versus control-only's 7.7K bytes, $p=0.008$) while per-topic's is indistinguishable from control-only's ($p=0.69$). Under this loss method, per-publish's longer tail thus coincides with a smaller window as well as more recovery events, whereas per-topic's coincides with the extra recovery events alone. Experiment~4 shows per-publish's one-stream-per-message pattern separately cutting a single connection's publish rate roughly ninefold, through the peer's stream limit rather than through packet count, a single-connection limit that does not reach the broker's aggregate throughput when the broker delivers per-topic, although a ceiling consistent with it appears in broker-side per-publish delivery per subscriber (Experiment~3). Individual runs can spike well above their arm's median. One control-only run at 5\% loss reached 342\,ms, 2.6 times the arm's median of 132\,ms; its second-worst run reached 168\,ms, and among the fifteen runs per arm the worst multistream runs reached 174\,ms (per-topic) and 254\,ms (per-publish). The five instrumented and fifteen per-packet runs of this cell produced no control-only run above 159\,ms (the instrumented per-publish runs reached 292\,ms, 1.4 times their median). Smaller but still large outliers, 1.6--1.8 times the cell median, appear in all three QUIC strategies elsewhere in the 5\%-loss sweeps at rates up to 500\,msg/s, so we treat the 342\,ms run as an outlier rather than as a property of control-only; fifteen runs per arm cannot estimate how often such outliers occur. Below 5\% loss the ordering is different. At 0\% the three sit within 0.4\,ms of one another. At 1\% control-only is in fact the highest of the three (58.3\,ms against per-topic's 55.8 and per-publish's 54.0; $p=0.007$ and $p=0.003$), so finer stream granularity does help at light loss. At 2\% control-only and per-topic are indistinguishable (68.1 versus 68.4\,ms, $p=0.15$) while per-publish has separated upward (82.6\,ms; $p<0.001$ against control-only, $p=0.002$ against per-topic). At 500\,msg/s, control-only's tail advantage is therefore specific to the heaviest loss we emulate; the rate sweep also shows it at 1\% loss and 1000\,msg/s (61 against 70 and 82\,ms). \begin{figure} \centering -\includegraphics[width=\columnwidth]{Figure_2} -\caption{Spike isolation ratio across packet loss rates. A ratio of 1.0 means all latency spikes co-occur across topics (full HOL blocking). TCP remains near 1.0 at all loss rates, while per-topic (0.73) and per-publish (0.53) QUIC show progressively more independent spike behavior at 1\% loss.} -\label{fig:spike-iso} +\includegraphics[width=\columnwidth]{Figure_5} +\caption{Mean per-topic p99 latency versus packet loss at 8 topics (line is the median over runs; shaded band spans the 10th--90th percentile of runs). At 5\% loss all QUIC strategies stay below TCP, and at 2\% control-only and per-topic do. At 1\% per-topic and per-publish are below TCP and control-only is indistinguishable from it; in the 1\% rate and topic sweeps TCP's tail is far higher at 1000--2000\,msg/s and at 32 topics, and nominally (never significantly) lower in a few cells. At 5\% loss control-only has the lowest median and 90th-percentile tail and per-publish the highest (under per-packet loss per-publish ties per-topic; Section~\ref{sec:exp2}); at 2\% control-only and per-topic are indistinguishable and only per-publish has separated upward; at 1\% control-only is the highest of the three. A single control-only run at 5\% loss reached 342\,ms (outside the band); Section~\ref{sec:exp2} discusses such outliers.} +\label{fig:hol-tail} \end{figure} -Fig.~\ref{fig:spike-iso} provides a complementary view through spike isolation ratio. TCP maintains a ratio near 1.0 at all loss rates (0.98 at 1\% loss), confirming that virtually all latency spikes propagate to every topic. Per-topic QUIC drops to 0.73 and per-publish to 0.53 at 1\% loss, indicating that 27--47\% of spikes affect individual topics independently. Control-only QUIC remains at 0.98, consistent with its single-stream architecture that provides no inter-topic isolation. +Under this loss method, coarser mapping (control-only) minimizes packet overhead and has the lowest median and 90th-percentile tail at 5\% loss. Finer mapping decorrelates spike timing but adds framing packets, and per-publish's per-message streams roughly double the packet count and, under this method, raise its median. At 2000\,msg/s under 5\% loss it also delivers less than the other QUIC arms, 1.64K against 1.94K\,msg/s. That shortfall is mostly the concurrent stream limit rather than the framing: the same cell in Experiment~4's setup gives 1.61K at the 100-stream default and 1.90K once the limit is raised to 1000 (three runs each). Both the isolation and the tail therefore turn on one variable, stream granularity. Because the overhead term scales with rate, the ordering crosses over: at 125\,msg/s under 5\% loss per-publish's extra packets are few in absolute number and it has the lowest tail of the three (96\,ms, $p=0.0002$ against control-only), whereas by 1000\,msg/s it is nominally the worst (361 against 302 and 313\,ms, not significant; the rate sweep uses broker-egress loss only). The spike isolation itself erodes with topic count because, at a fixed rate, a single packet increasingly coalesces several topics' data, so one loss recouples them. QUIC loss detection is per-connection rather than per-stream~\cite{rfc9002}, so we could not separate per-stream recovery timing from packet count and coalescing. -QUIC's congestion control operates per-connection~\cite{rfc9002, rfc9308}, sharing a single congestion window across all streams. We hypothesize that this shared congestion response limits the degree of isolation: a loss event reduces the congestion window for all concurrent streams, even though stream-level loss recovery is independent. This is consistent with per-topic isolation being partial (0.73) rather than complete ($\approx$0). +Experiment~2 applies its loss with the broker-egress method of Section~\ref{sec:loss-method}, so we also ran its 8-topic, 500\,msg/s reference cell at 0\% and 5\% loss with per-packet loss on the forwarding VM (15 runs per arm; at 0\% two TCP runs were excluded for retransmissions on a clean path, leaving 13). At 0\% every arm stays within 0.3\,ms of its level in the broker-egress runs (27.3--27.7\,ms). At 5\% the ends of the ordering hold: control-only remains the lowest (108\,ms; $p=0.0004$ against either multistream arm), and TCP stays far above every QUIC arm (458\,ms, with runs spread from 200 to 1297\,ms). Only one arm moved significantly at 5\%: per-publish fell from 195 to 143\,ms ($p<0.001$) and no longer trails per-topic (141\,ms, $p=0.65$), although it still sends about 1.5 times per-topic's packets on the loss-bearing link. Its penalty against control-only shrinks from 63 to 35\,ms but remains. TCP (351 against 458\,ms, $p=0.28$), control-only (132 against 108, $p=0.06$) and per-topic (164 against 141, $p=0.09$) stay within run-to-run variation between the two loss methods. Control-only also has the lowest worst run and 90th percentile (146 and 138\,ms, against 189 and 169\,ms for per-topic and 168 and 155\,ms for per-publish). This variant changes more than the loss granularity (the loss moved to the forwarding VM and the broker's delay queue ran at 100{,}000 packets rather than 1{,}000, which also changes TCP's packetization; Section~\ref{sec:exp3}), so we cannot attribute the per-publish change to clustering alone. The 1\% and 2\% loss levels and the topic and rate sweeps use broker-egress loss only. -\textbf{Ablation: frame packing policy.} To determine whether the partial correlation observed at 0\% loss reflects QUIC's congestion control architecture or an implementation-level artifact, we conducted a control experiment varying Quinn's frame packing behavior. By default, Quinn packs STREAM frames from multiple streams into single QUIC packets---a hardcoded optimization we term \emph{Greedy} packing. When a single packet is lost, all streams whose data it carried experience retransmission delay simultaneously, potentially creating artificial inter-stream coupling. We extended Quinn with a \emph{StreamIsolated} policy that restricts each packet to a single stream's data, eliminating this cross-stream coupling at the packet level. We tested both policies using the same parameters as the main experiment (500\,msg/s, 8 topics, 25\,ms RTT, 15 runs per configuration). - -At 0\% loss, the baseline correlation persists under StreamIsolated packing: per-topic windowed correlation is 0.64 versus 0.55 with Greedy. Without packet loss, no retransmissions occur, so packet-level frame co-location cannot be the cause. QUIC specifies a single congestion controller per connection~\cite{rfc9002}, and all streams share a single UDP socket. We hypothesize that this shared per-connection state---pacer, congestion window, and socket---creates correlated jitter across streams regardless of how frames are packed into packets. Under loss, however, StreamIsolated per-topic packing shows 26\% higher inter-topic spread (22.5\,ms versus 17.8\,ms at 5\% loss) and 6\% lower spike isolation ratio (0.85 versus 0.91 at 5\% loss), demonstrating genuine per-stream isolation improvement when retransmission events cannot cross stream boundaries within a single packet (Fig.~\ref{fig:frame-packing}). +\subsection{Experiment 3: Throughput Under Loss} +\label{sec:exp3} -The effect is asymmetric across strategies. For per-publish, StreamIsolated packing is counterproductive: p50 latency at 5\% loss rises from 29\,ms to 111\,ms. We hypothesize that isolated packing creates more QUIC packets for ephemeral streams (each publish opens and closes a new stream), increasing the volume subject to loss and retransmission, which may overwhelm connection capacity under high loss. This interaction between frame packing policy and stream lifetime---beneficial for persistent streams, harmful for ephemeral ones---has implications for adaptive transport configuration (Section~\ref{sec:discussion}). +We measure sustained delivered throughput at QoS~0 using 16 publishers and 8 subscribers at 10\,ms one-way delay across loss rates from 0\% to 10\%, driving each transport to saturation. Every subscriber receives every message, so the broker performs an eight-way fan-out; we report throughput as \emph{unique} messages delivered per second (deliveries divided by eight). The publishers are unpaced, so under loss the delivered rate is whatever the impaired transport can carry, and the offered load differs by transport: under loss the TCP+TLS publishers offer 315--332K\,msg/s, TCP's 264--273K and QUIC control-only's 228--243K. The publishers' transmitted bytes confirm these rates (271--304\,B per message under loss). TCP's publisher hosts run only about 45\% busy, so for TCP the broker, at its CPU ceiling, sets the offered rate by how fast it reads its publishers; it takes TCP+TLS publishers faster still, whose hosts run 66--71\% busy, a difference we did not isolate. QUIC control-only's publisher hosts run 80--83\% busy, so a contribution from the load generator to QUIC's offered rate cannot be excluded. Delay and loss are applied per packet on the forwarding VM (Section~\ref{sec:loss-method}). For TCP, TCP+TLS and the QUIC arms of Fig.~\ref{fig:throughput-loss} the broker process runs near its host's four-core ceiling in every condition (340--390\% of 400\%), and under loss the subscriber hosts retain headroom (median 91--99\% CPU idle), so on impaired links the delivery path rather than the receiver sets the rate. On the clean link the subscribers run 21--42\% idle and raw TCP saturates its subscriber host in 11 of 15 runs, which we exclude, so TCP's 0\% level rests on 4 runs (the excluded runs delivered slightly more; all 15 average 59.6K, so the retained level slightly understates raw TCP); we read the 0\% levels as a joint receiver-and-broker bound. Every cell runs in parallel on three identical groups of broker, publisher, subscriber and forwarding VMs, and ranges quoted ``in every group'' are over the per-group means. Because the brokers, and for QUIC possibly the generator, bound the offered load, the delivered rates are lower bounds on broker capacity. All Experiment~3 results use the evaluation build except the paced checks at the end of this section, which use the pacing build (Section~\ref{sec:bench-infra}). \begin{figure} \centering -\includegraphics[width=\columnwidth]{Figure_8} -\caption{Effect of frame packing policy on HOL blocking metrics. \emph{Greedy} packing (default) batches multiple streams per packet; \emph{StreamIsolated} restricts each packet to one stream. For per-topic (left), StreamIsolated improves spread and reduces correlation under loss. For per-publish (right), StreamIsolated increases overhead, degrading performance at high loss rates.} -\label{fig:frame-packing} +\includegraphics[width=\columnwidth]{Figure_6} +\caption{Unique delivered throughput (log scale) vs.\ packet loss at QoS~0 under per-packet loss (solid), with the eight-way subscriber fan-out normalized out; faded dashed lines show the same experiment under per-buffer loss on the broker's egress (Section~\ref{sec:loss-method}). The QUIC arms (client-side publish strategies; broker delivery per-topic) stay within 1.5\% of one another under loss. 95\% confidence intervals over 15 runs (14 for per-topic at 5\%, 4 for TCP at 0\%) are drawn at every point and are frequently narrower than the markers.} +\label{fig:throughput-loss} \end{figure} -\begin{figure} -\centering -\includegraphics[width=\columnwidth]{Figure_3} -\caption{Latency percentiles at 1\% loss, 25\,ms RTT. TCP exhibits higher tail latency than all QUIC strategies, with the gap widening at higher percentiles. Multi-stream QUIC strategies (per-topic, per-publish) achieve the lowest p95 and p99 values.} -\label{fig:lat-percentiles} -\end{figure} +Fig.~\ref{fig:throughput-loss} shows that all the transports lose throughput as loss rises, differing in magnitude rather than shape. Within QUIC, the client-side publish strategies stay within 1.5\% of one another at every impaired loss rate and within 10\% on the clean link. Changing only the broker's delivery from per-topic to control-only, with a control-only client, changes delivered throughput by 6\% on the clean link and by at most 1.5\% under loss. -Fig.~\ref{fig:lat-percentiles} shows latency percentiles at 1\% loss. TCP exhibits the highest tail latency across all percentiles, with the gap between TCP and QUIC widening from p50 to p99. Multi-stream QUIC strategies (per-topic, per-publish) achieve the lowest p95 and p99 values, consistent with independent per-stream loss recovery reducing tail latency when retransmission delays are confined to individual streams rather than stalling the entire connection. +Raw TCP's unique delivered throughput falls from 58.0K to 0.82K\,msg/s between 0\% and 10\% loss ($\approx$71-fold), the encryption-matched TCP+TLS~1.3 baseline from 49.1K to 0.77K ($\approx$64-fold), and QUIC control-only from 54.3K to 1.37K ($\approx$40-fold). That clean-to-lossy ratio mixes a clean-link level bounded jointly by broker and receiver CPU with the response to loss, so we compare the transports at equal loss instead: QUIC delivers 1.26$\times$ TCP+TLS's rate at 1\% loss, 1.37$\times$ at 2\%, 1.52$\times$ at 5\% and 1.78$\times$ at 10\% (1.19--1.66$\times$ against raw TCP). Over the loss-bound range from 1\% to 10\% its throughput falls 1.41$\times$ less steeply than TCP+TLS's (95\% CI 1.40--1.43). Both transports run CUBIC and we did not instrument their loss recovery, so we do not attribute the difference to a specific mechanism. -\subsection{Experiment 3: Throughput Under Loss} +The comparison is at equal loss but not at equal offered load, since the unpaced publishers offer different loads and every broker runs at its CPU ceiling. To test whether that shapes the lossy rates, we also ran the 1\% and 10\% loss conditions with the 16 publishers paced to a fixed aggregate rate of 2.5K or 20K\,msg/s and compared them with unpaced runs. Pacing needs the pacing build (Section~\ref{sec:bench-infra}), so both the paced and the unpaced runs of this check use it, and neither is compared with Fig.~\ref{fig:throughput-loss}, which uses the evaluation build. Each transport, rate and loss level has 5--6 runs; two runs whose monitoring failed (one lost its broker CPU samples, one its router loss counters) are excluded. Paced at 20K\,msg/s the brokers use 27--73\% CPU out of 400\%, yet every transport delivers within 3\% of its unpaced rate in the same build (TCP 1.00 and 0.99 of unpaced at 1\% and 10\% loss, TCP+TLS 0.99 and 0.99, QUIC control-only 1.02 and 1.03). At 2.5K\,msg/s the 1\% cells deliver everything offered, and at 10\% loss even that load exceeds what the loss allows and each transport delivers within 2.5\% of its unpaced rate. With the pacing build, at 1\% and 10\% loss, offered load above the loss-bound rate therefore does not change delivery. -We measure sustained throughput using 4 publishers and 4 subscribers at 10\,ms one-way delay across loss rates from 0\% to 10\%. +With a matched offered load of 20K\,msg/s, QUIC delivers 1.28$\times$ the rate of TCP+TLS at 1\% loss (1.25$\times$ unpaced with the pacing build, 1.26$\times$ with the evaluation build). At 10\% loss the ratio depends on the build: 2.05$\times$ paced and 1.97$\times$ unpaced in the offered-load check, against 1.78$\times$ with the evaluation build. A separate side-by-side comparison of both builds at 10\% loss (6 runs per build and transport) gives 1.81$\times$ with the evaluation build against 2.02$\times$ with the pacing build: the pacing build's QUIC delivers 9\% more (1.51K against 1.39K\,msg/s, 8--9\% in every group), its TCP+TLS 1--3\% less and its TCP the same. The pacing build's unpaced publishers also offer less load (148K against 245K\,msg/s for QUIC), and only the pacing build can be paced, so we cannot say whether the gain lies in QUIC's send path or in lighter overload; we report the evaluation build's ratios and treat their magnitude at 10\% loss as build-dependent; the builds were not compared at 2\% or 5\%. -\begin{figure} +Under loss the delivery path itself narrows, and shedding is where the excess goes: the broker drops what it cannot deliver once a subscriber's queue is full (Table~\ref{tab:params}), at 10\% loss delivering 0.23\% of the offered messages over TCP+TLS, 0.30\% over TCP and 0.56\% over QUIC. + +Per-buffer loss on the broker's egress, the method of Experiments~2 and~4, gives a different picture. With it, QUIC delivers 2.06--3.06$\times$ TCP+TLS's rate at equal loss and appears to degrade 2.6$\times$ more gently from 0\% to 10\% (Table~\ref{tab:loss-method}, from the 0\% and 10\% rows). With per-packet loss on the forwarding VM, QUIC delivers 42--49\% of its per-buffer rate and TCP and TCP+TLS 67--86\%. Clustered loss therefore flattered QUIC far more than TCP. The loss-bound comparison survives at a smaller magnitude (1.41 against 1.48), and it does not depend on where per-packet loss is applied: keeping the delay on the broker and applying the loss on the forwarding VM gives 1.36 (1.34--1.38; 15 runs per cell), and applying the loss on the broker behind a token-bucket filter that splits every buffer into packets gives 1.39 (1.36--1.41; 6 runs per cell). A model in which clustering acts only by lowering the effective loss rate, with throughput scaling as $1/\sqrt{p}$~\cite{mathis1997macroscopic} and the measured per-buffer drop fractions taken as the effective rates, predicted that correcting it would raise the ratio by a factor of 1.04. It instead fell by a factor of 0.91 (0.89--0.94) with the delay kept on the broker (to 1.36), by 0.95 (0.93--0.98) with the forwarding-VM arm and by 0.93 (0.91--0.96) with the token-bucket arm. The clustering therefore acted through more than the loss rate, and we do not identify the mechanism. A single-connection ablation (one publisher and one subscriber at 10\,ms one-way delay, with loss per buffer on the broker's egress; data in the deposit~\cite{bracht2026zenodo}) pointed the same way (disabling QUIC's datagram batching roughly halved its delivered rate under loss), and on that unimpaired single connection TCP+TLS delivered 111.9K\,msg/s against QUIC's 58.1K. + +Where the delay is applied also matters on the clean link. With the delay on the broker, the broker-egress netem queue of Experiments~2 and~4 (1000 packets) tail-dropped about 0.15\% of packets even at 0\% loss, and TCP packed several messages into each packet (about 1.1\,KB per packet). Enlarging that queue so that it never drops, with nothing else changed, gives one segment per message (about 400\,B) and TCP+TLS falls to 25.0K\,msg/s; with the delay on the forwarding VM instead, TCP packs messages normally (about 1.2\,KB per packet) and TCP+TLS delivers 49.1K. The broker's TCP stack disables Nagle's algorithm and writes each message separately; we did not isolate why a large delay queue on the sending host removes the packing. We report the forwarding-VM arm, which avoids both effects; under loss the two delay placements agree within 3\% for every configuration except broker per-publish delivery, which with the delay on the broker delivers a further 34\% less at 1--2\% loss and 18\% less at 5\%, and the same at 10\%. + +\begin{table}[!t] \centering -\includegraphics[width=\columnwidth]{Figure_5} -\caption{Throughput vs.\ packet loss for QoS~0 (top) and QoS~1 (bottom). TCP outperforms all QUIC strategies at baseline (0\% loss), but under loss ($\geq$1\%) all QUIC strategies outperform TCP.} -\label{fig:throughput-loss} -\end{figure} +\caption{Unique delivered throughput (K\,msg/s, 15 runs) under per-buffer loss on the broker's egress and under per-packet loss on the forwarding VM, and QUIC control-only's ratio to TCP+TLS at equal loss. $G'$ is the ratio of the two transports' 1\%-to-10\% degradation, with 95\% intervals.} +\label{tab:loss-method} +\small +\setlength{\tabcolsep}{3.5pt} +\begin{tabular}{@{}lrrrrrr@{}} +\toprule +& \multicolumn{2}{c}{TCP+TLS} & \multicolumn{2}{c}{QUIC control-only} & \multicolumn{2}{c}{QUIC/TLS} \\ +\cmidrule(lr){2-3}\cmidrule(lr){4-5}\cmidrule(lr){6-7} +Loss & buffer & packet & buffer & packet & buffer & packet \\ +\midrule +0\% & 45.2 & 49.1 & 53.7 & 54.3 & 1.19 & 1.11 \\ +1\% & 5.89 & 4.02 & 12.16 & 5.05 & 2.06 & 1.26 \\ +2\% & 3.76 & 2.62 & 8.26 & 3.59 & 2.20 & 1.37 \\ +5\% & 1.92 & 1.42 & 4.75 & 2.16 & 2.48 & 1.52 \\ +10\% & 0.91 & 0.77 & 2.80 & 1.37 & 3.06 & 1.78 \\ +\midrule +\multicolumn{5}{@{}l}{$G'$ (1\%$\rightarrow$10\%), 95\% interval} & 1.48 & 1.41 \\ +\multicolumn{5}{@{}l}{} & {\scriptsize[1.45,1.51]} & {\scriptsize[1.40,1.43]} \\ +\bottomrule +\end{tabular} +\end{table} -Fig.~\ref{fig:throughput-loss} reveals that at 0\% loss, TCP outperforms all QUIC strategies in raw throughput. With QoS~0, TCP achieves 311K\,msg/s versus QUIC control-only at 132K\,msg/s, per-topic at 82K\,msg/s, and per-publish at 77K\,msg/s. The throughput gap at baseline is consistent with QUIC's additional per-packet processing overhead, though we did not isolate individual contributing factors (see Section~\ref{sec:discussion} for further analysis). +Encryption carries a predictable throughput cost on the clean link: TCP+TLS runs 15--18\% below raw TCP at 0\% loss (49.1K against 58.0K unique msg/s over the 4 unsaturated TCP runs, or 59.6K over all 15), a CPU-bound overhead that shrinks to about 6\% under loss (4.02K versus 4.26K at 1\%, 0.77K versus 0.82K at 10\%). QUIC, encrypted throughout, sits above TCP+TLS at 0\% loss (54.3K) and 6--9\% below raw TCP, so encryption does not explain the loss-response gap. -Under loss ($\geq$1\%), the ordering reverses: all QUIC strategies outperform TCP, achieving 1.9$\times$ TCP's throughput at 1\% loss and 2.8$\times$ at 10\% loss. Per-publish QUIC matches control-only throughput under loss, suggesting that stream creation overhead becomes negligible relative to loss recovery delays. +Broker-side per-publish delivery is the exception to the strategies' near-equality. With a per-publish client and the broker also delivering one stream per message, delivered throughput stays nearly flat at 1.3--2.0K unique msg/s (10--16K deliveries/s) across loss levels. That is far below per-topic delivery on the clean and lightly lossy link (1.74K against 49.6K at 0\%, 1.93K against 5.03K at 1\%), and the gap closes as loss becomes the binding limit (86\% of per-topic at 5\%, 94\% at 10\%). Under loss both arms receive about 135K\,msg/s from unpaced per-publish publishers, each running at its own stream-credit ceiling (Experiment~4), but per-publish delivery stays near 1.3--2.0K\,msg/s at every loss level, so at 1--2\% loss it delivers only 38--57\% of per-topic's rate; on the clean link its slow delivery coincides with the publishers running at that ceiling, while with per-topic delivery they offer about 50K. Pacing the publishers separates delivery cost from overload. For this we used the pacing build. Its unpaced per-topic and control-only deliveries on the clean link run 10--12\% below the evaluation build's, so we compare delivery strategies only among pacing-build runs. At 0\% loss, per-publish delivery keeps up with the eight-way fan-out up to 40K deliveries/s, then stalls near 72K deliveries/s (about 9K\,msg/s per subscriber), consistent with a per-subscriber stream-credit ceiling at this round trip; we did not vary the stream limit or the round trip for delivery. Below that ceiling it costs 1.17$\times$ the broker CPU per delivered message of per-topic delivery at 10K deliveries/s, 1.33$\times$ at 20K and 1.41$\times$ at 40K. It sends about one datagram per message (1.06--1.08 broker packets per delivered message over 10--40K deliveries/s, against 0.89 falling to 0.54 for per-topic delivery over the same range). Under 1\% loss its packets per delivered message fall to 0.35--0.93 as messages share datagrams, yet it still costs 1.15--1.33$\times$ per-topic's CPU per delivered message, so the per-datagram cost does not fully explain the premium. When paced at 1\% loss, every strategy saturates near 5K\,msg/s per subscriber (per-publish 4.6K, per-topic and control-only 5.1K), so there loss rather than credit sets most of the ceiling. Unpaced, per-topic delivery reaches 93\% of its paced ceiling, while per-publish delivery reaches only 17\% of its own (about 0.8K\,msg/s per subscriber, the same as on the clean link in the pacing build, where unpaced per-publish delivery runs about 55\% below the evaluation build's 1.74K), so its unpaced collapse comes from overload, not loss. We did not test whether batching per-publish frames removes the premium. -QoS~1 throughput drops to approximately 1.3K\,msg/s across all transports at 0\% loss, as the per-message acknowledgment round-trip dominates. Under loss, QUIC maintains higher QoS~1 throughput than TCP (880 versus 409\,msg/s at 10\% loss). -\subsection{Experiment 4: Stream Strategy Comparison} +\subsection{Experiment 4: What Limits a Single Connection} -We compare the three stream mapping strategies (control-only, per-publish, per-topic) while varying topic count (1, 4, 8, 16) at 25\,ms one-way delay and 2\% packet loss to understand how strategy selection interacts with workload structure under representative IoT conditions. +Experiment~3 measures the broker at saturation, where many client connections share it and, under loss, the delivery path sets the rate. A single MQTT client cannot spread its own load that way: the protocol ties each connection to a client identifier, and a second connection presenting an identifier already in use causes the broker to disconnect the first (Section~\ref{sec:parallel}). Short of provisioning further identities, everything one client publishes therefore travels over a single QUIC connection, and that connection's limits bound what the client can send. Two of those limits are transport parameters an implementation chooses, the number of streams the peer lets it open at once and the flow-control window of each stream; above them we also find a rate ceiling that we did not instrument. The three strategies differ sharply in what one connection can push, and this experiment asks why. We vary the number of topics (1, 2, 4, 8, 16) on a \emph{single} connection, and then vary the two QUIC transport limits the strategies interact with: the number of streams a peer may keep open at once, and the per-stream receive window. The broker's delivery strategy matches the client's in each arm. Unless stated, cells use Experiment~2's delay and broker-egress loss method, with 25\,ms one-way delay and 2\% loss, one of Experiment~2's loss levels; publisher and subscriber run on separate VMs and the publishers are unpaced. Loss is not this experiment's variable. Because \texttt{tc-netem} shapes the broker's egress, the publisher's data travels an unimpaired path, and the delay and loss apply to the acknowledgements and flow-control credit returning to it (and to the subscriber's deliveries); since the delay applies in one direction only, the publisher's round trip equals the 25\,ms one-way delay. Cells run at 0\% loss check that the loss on that returning path does not shape the limits: control-only at the default 256\,KB window, where the window binds, sends 32.97K\,msg/s at 0\% against 32.90--33.23K in the equivalent 2\% cells, and removing the loss does not raise the per-connection ceiling (below). No per-publish cell was run at 0\% loss, so the effect of loss on its credit-bound rate is untested; QUIC's credit frames carry cumulative limits~\cite{rfc9000}, so a lost update delays credit but does not forfeit it. + +Varying topic count alone shows the gap between the strategies on a single connection. Control-only sustains about 33K\,msg/s at every topic count and per-publish about 3.8K, roughly ninefold below it. Per-topic is the only strategy that moves with topic count, and it moves once: it matches control-only on one topic (33.1 against 32.7K), where it opens the same single data stream, reaches 56.0K at two topics, and then stays flat to sixteen (53.9K). Adding streams beyond the second buys nothing, which already rules out an explanation in terms of write concurrency scaling with stream count. \begin{figure} \centering \includegraphics[width=\columnwidth]{Figure_7} -\caption{Strategy comparison across topic counts. (a)~Latency is stable across all strategies and topic counts. (b)~Throughput scales linearly with topic count for all strategies.} -\label{fig:strategy-comparison} +\caption{The two transport limits behind those rates, 8 topics unless noted. (a)~Per-publish opens one stream per message, so its rate follows the concurrent stream limit divided by the round trip (dashed) across a fortyfold range, while control-only and per-topic, which open one and eight streams, do not respond to it. (b)~Control-only and per-topic on a single topic both open one data stream and coincide while the per-stream receive window binds, following window divided by round trip (dotted, using the 313\,B per-message stream cost measured from these runs); at 1\,MB the window no longer binds and they separate, only control-only reaching the rate ceiling near 54K\,msg/s. Per-topic on eight topics is already at that ceiling and is insensitive to the window. 95\% confidence intervals over 10 runs per point.} +\label{fig:transport-limits} \end{figure} -Fig.~\ref{fig:strategy-comparison} shows that latency is stable at approximately 35\,ms across all strategies and topic counts, indicating that stream management overhead does not materially affect per-message latency in this workload. Throughput scales linearly with topic count for all strategies. At 16 topics, all three strategies converge to approximately 50K\,msg/s with no measurable throughput difference between them, indicating that stream management overhead is negligible at this workload scale. +Fig.~\ref{fig:transport-limits} identifies the limits. Per-publish is bounded by stream credit. Sweeping the limit over 25, 100, 250 and 1000 streams moves its rate to 0.93, 3.75, 9.19 and 30.87K\,msg/s, and the streams it keeps in flight, the rate multiplied by the round trip, stay at 93\%, 94\%, 93\% and 78\% of the limit. Holding the limit at 100 and sweeping the delay over 10, 25 and 50\,ms leaves that count at 93.2, 94.4 and 95.4 streams: the rate falls as $1/\mathrm{RTT}$, which is what a credit ceiling does and what a per-message processing cost would not. Control-only and per-topic, needing one and eight streams, barely respond to the stream limit itself: raising it from 100 to 1000 moves control-only by 0.8\% (33.13 to 32.85K) and per-topic by 7.3\% (50.96 to 54.67K, $p=0.09$). -\subsection{Experiment 5: Datagram vs.\ Stream Transport} +Control-only is bounded by the per-stream receive window. Halving it to 128\,KB halves the rate to 16.79K and raising it to 1\,MB lifts it to 54.30K. Per-topic on one topic, which also opens a single data stream, tracks it to within 0.2\% wherever the window binds (16.76 against 16.79K at 128\,KB, 32.92 against 32.90K at 256\,KB). At 1\,MB the window no longer binds either arm and they separate, per-topic on one topic reaching 49.12K against control-only's 54.30K ($p=1\times10^{-6}$); the two are single-stream but not identical, since control-only carries its data on the bidirectional control stream while per-topic opens a unidirectional one, and that difference surfaces only once both are pressed against the ceiling below. Across the six cells of the window and round-trip sweeps in which the window binds, spanning a factor of two in window and a factor of two in round trip, and including one configuration measured on two VM groups, the implied per-message cost on the stream is constant at 312.8$\pm$3.0\,B (a 1.0\% spread), consistent with a 256\,B payload plus MQTT and QUIC stream framing. That constancy is the evidence; the absolute value is derived from the same measurements and is not an independent prediction. Per-topic on eight topics has eight such windows and is therefore insensitive to the setting (55.7, 55.7 and 53.8K). -QUIC datagrams (RFC~9221) bypass the stream abstraction entirely, sending messages as unreliable datagrams within the QUIC connection. We compare datagram transport against stream-based transport at 50\,ms delay across four loss rates. +Above those two limits sits a third, a rate ceiling on one connection near 54K\,msg/s: the cells it bounds deliver 51.0--56.0K at 25\,ms. Removing the loss does not raise it (control-only at a 1\,MB window sends 52.1K at 0\% against 54.3K at 2\%, and per-topic's 53.6K at 0\% lies within the 51.0--55.7K of its equivalent 2\% cells). It is also roughly independent of the round trip, reaching 57.8K at 10\,ms, so it is neither a window nor a credit effect. We did not instrument the client further, and attribute it only to per-connection processing. \begin{figure} \centering -\includegraphics[width=\columnwidth]{Figure_6} -\caption{Datagram vs.\ stream transport at 50\,ms RTT. (a)~Latency distributions overlap at all loss rates, with high run-to-run variance under loss. (b)~Throughput is comparable since both transports share the same QUIC connection and congestion controller.} -\label{fig:datagram} +\includegraphics[width=\columnwidth]{Figure_8} +\caption{Every publish-rate cell of Experiment~4 against the rate its binding limit predicts: stream credit divided by the round trip for per-publish, and the stream count times the per-stream window divided by the round trip for the others, each capped at the 54K\,msg/s per-connection ceiling. The 39 cells span a sixtyfold range of measured rate and sit on the diagonal with a median absolute error of 2.3\%. The two constants in the model, the 313\,B per-message stream cost and the ceiling, are measured from these runs rather than fitted per cell.} +\label{fig:model-collapse} \end{figure} -Fig.~\ref{fig:datagram} shows that at 50\,ms RTT, datagram and stream transport are statistically indistinguishable at all loss rates. At 0\% loss, both achieve 12.9K\,msg/s throughput and 50.3\,ms p50 latency. Under loss, both transports degrade similarly: at 5\% loss, stream p50 is 1,188$\pm$1,070\,ms and datagram p50 is 854$\pm$308\,ms---the stream distribution's high variance (90\% coefficient of variation) means these values overlap within error bars. At 10\% loss, both exhibit multi-second latencies (stream 12.9$\pm$2.7\,s, datagram 12.0$\pm$1.3\,s). Throughput is comparable at all conditions ($\approx$1,000\,msg/s at 5\% loss), as both share the same QUIC connection and congestion controller. The theoretical advantage of datagrams---skipping retransmission of lost messages---is not observed in our measurements, possibly because both transports share the same per-connection congestion controller~\cite{rfc9002}. +The strategies therefore do not differ in what they can carry; they differ in which limit they meet first. Per-publish meets the stream limit, control-only the per-stream window, and per-topic, which escapes the window with its second stream, meets the per-connection ceiling. Lift each in turn and they move toward that ceiling: control-only reaches 54.3K at a 1\,MB window and per-topic already sits at 53.8K, while per-publish, at 30.9K with a limit of 1000, is still climbing and would need a larger limit still to reach it. The ninefold gap between per-publish and control-only at our defaults, and per-topic's $\approx$1.6$\times$ advantage over control-only, are both consequences of two constants we chose, not properties of the mappings. Fig.~\ref{fig:model-collapse} states the position compactly: across all 39 publish-rate cells, spanning stream limits from 25 to 1000, windows from 128\,KB to 1\,MB, delays from 10 to 50\,ms and both loss settings, the measured rate is within a median 2.3\% of whichever limit binds, and the strategy identity adds little once that limit is known. The largest departures are per-publish at a 1000-stream limit, 22\% below the credit line as it approaches the ceiling; per-topic on one topic at a 1\,MB window, 9\% below the ceiling, the single-stream separation discussed above; per-publish at a 250-stream limit, 7\% below its credit line, as per-publish sits 5--7\% below it at every limit up to 250; and control-only at 10\,ms, 7\% above a ceiling that is itself slightly round-trip dependent. + +Two caveats bound this. The limits are ours: \texttt{mqtt5} advertises a 100-stream limit, which is the default of the QUIC library it builds on~\cite{quinn}, and a 256\,KB per-stream window, and an implementation choosing differently would order the strategies differently. And the finding is about one connection. At broker capacity the shared delivery path sets the rate, which is why Experiment~3's client-side strategies differ by at most 1.5\% under loss and 10\% on the clean link; we report the publish rate here because a single subscriber connection receives only about 3.4K\,msg/s under control-only and per-topic and 2.1K under per-publish, its host staying 97\% CPU idle, so the delivered rate in this one-to-one setup measures the impaired delivery path rather than the send-side strategy. %% --- Discussion --- @@ -412,49 +452,61 @@ \subsection{Strategy Selection Guidelines} Our results suggest the following guidelines for practitioners selecting a stream mapping strategy: -\textbf{Use control-only} when throughput is the primary concern and topics are not independent. This strategy adds QUIC's security benefits (integrated TLS~1.3) and connection management (migration, 0-RTT potential) with minimal overhead compared to TCP. It provides no inter-topic isolation (spike isolation ratio 0.98, comparable to TCP's 0.98), making it appropriate for single-topic workloads or scenarios where HOL blocking is acceptable. +\textbf{Use control-only as the default.} Adding no per-stream packet overhead, it has the lowest median and 90th-percentile tail latency at 5\% loss, 8 topics and 500\,msg/s (132 and 162\,ms; 108 and 138\,ms under per-packet loss). At 1\% loss and 500\,msg/s both multistream arms beat it, and at 125\,msg/s under 5\% loss per-publish does (96 versus 116\,ms); at 1\% loss and 1000\,msg/s control-only is again lowest (61 against 70 and 82\,ms), so which strategy has the lowest tail depends on both loss and rate. As the client publish strategy it matches the other QUIC arms' delivered throughput within 1.5\% under loss and 10\% on the clean link; as the broker's delivery strategy with a control-only client it is within 1.5\% under loss and 6\% lower on the clean link (Experiment~3). It inherits TLS~1.3 in a one-round-trip handshake that matches raw TCP and saves a round trip over TCP+TLS at delays of 25\,ms and above (Experiment~1). Its one throughput concession is on a single connection, where per-topic sends about 1.6--1.7$\times$ faster once a second topic is in play; Experiment~4 shows that gap is the per-stream receive window, and raising it removes the gap. Like the other strategies, it has occasional outlier runs (Experiment~2). + +\textbf{Consider per-topic when one client must publish at high rate across several topics and the per-stream window cannot be raised.} With the default 256\,KB per-stream window, per-topic reaches the per-connection ceiling once a second topic is in play (about 56K against control-only's 33K\,msg/s; Experiment~4), because each topic gets its own window; raising control-only's window closes that gap. Under broker-egress loss at 500\,msg/s its tail sits between the other two, below control-only at 1\% loss (55.8 against 58.3\,ms) and above it at 5\% (164 against 132\,ms); under per-packet 5\% loss it ties per-publish (141 against 143\,ms), both above control-only (108\,ms). In the 1\%-loss topic sweep it isolates spike timing only at two topics and reaches single-stream coupling from four topics on (Fig.~\ref{fig:hol-excess}). + +\textbf{Use per-publish for low-rate or light-loss channels where per-message isolation matters.} It isolates spikes best at every rate we tested under 1\% loss. It has the lowest tail at 1\% loss up to 500\,msg/s (54.0\,ms at the reference point), and at 125\,msg/s under 5\% loss (96\,ms). On a single connection its publish rate tracks the concurrent stream limit divided by the round trip, roughly ninefold below control-only at our 100-stream limit and 256\,KB window. That rate rises nearly in proportion as the limit is raised, but only toward the per-connection ceiling of about 54K\,msg/s (30.9K at a 1000-stream limit; Experiment~4). As the broker's delivery strategy it is capped per subscriber near 9K\,msg/s on the clean link at a 10\,ms round trip (under 1\% loss all strategies saturate near 5K), costs 1.2--1.4$\times$ the broker CPU per delivered message of per-topic delivery at 10--40K deliveries/s, and under unpaced overload delivers a small fraction of what per-topic delivery achieves on a clean link (Experiment~3). Size the stream limit to the per-subscriber message rate. -\textbf{Use per-topic} when topic independence matters and the number of topics is bounded. At 1\% loss---representative of typical wireless IoT conditions---per-topic mapping already provides measurable isolation: inter-topic spread amplifies 42$\times$ from baseline, and 27\% of latency spikes affect individual topics independently (spike isolation ratio 0.73 versus TCP's 0.98). At higher loss (5\%), spread amplification reaches 200$\times$. Per-topic throughput is 62\% of control-only at baseline. The overhead scales with the number of active topics, not the message rate, making it efficient for workloads with moderate topic counts (tens to hundreds). StreamIsolated frame packing further improves isolation (+26\% spread, $-$6\% spike ratio at 5\% loss) with modest latency cost, making it recommended for loss-prone deployments. This is the recommended default for multi-topic IoT deployments on lossy networks. +\subsection{Loss Resilience and the Cost of Encryption} -\textbf{Use per-publish} only when message-level isolation is required and throughput is secondary. Per-publish shows the strongest spike isolation (ratio 0.53 at 1\% loss, meaning 47\% of spikes are topic-independent), but the per-message stream creation overhead makes this strategy unsuitable for high-throughput workloads. StreamIsolated frame packing should be avoided for this strategy, as our measurements show significant latency degradation under loss (p50 rises from 29\,ms to 111\,ms at 5\% loss). It may be appropriate for low-rate command-and-control channels where every message must be independently deliverable. +Because our QUIC arms are encrypted, we compare them against an encryption-matched TCP+TLS~1.3 baseline, so the difference reflects the transport rather than the cipher. Under per-packet loss QUIC delivers 1.26$\times$ TCP+TLS's rate at 1\% loss, growing to 1.78$\times$ at 10\%, and over that range its throughput falls 1.41$\times$ less steeply. Both transports run CUBIC and we did not instrument their loss recovery, so the mechanism remains open. With the pacing build, pacing all three transports to a matched offered load far below the broker's CPU ceiling left their rates at 1\% and 10\% loss within 3\% of unpaced, so in the pacing build the gap is not an artifact of unequal load. The evaluation build, whose ratios we report, has no rate pacing and could not be checked this way, and at 10\% loss the gap depends on the build (2.02$\times$ against 1.81$\times$ when both are run side by side). The advantage is real but smaller than the 2.06--3.06$\times$ that per-buffer loss emulation produced with the evaluation build. Under per-buffer loss QUIC also appears to degrade 2.6$\times$ more gently from 0\% to 10\% loss, but that ratio rests on the method and on a clean-link level bounded jointly by broker and receiver CPU; with per-packet loss the same 0-to-10\% ratio is 1.61 with the delay on the forwarding VM, but 0.82 with the delay on the broker and the loss on the forwarding VM and 0.86 behind the broker's token-bucket filter, which is why we compare at equal loss. On the clean link the ordering depends on configuration: at fan-out saturation QUIC delivers 54.3K\,msg/s against TCP+TLS's 49.1K, whereas on a single unimpaired connection at 10\,ms TCP+TLS reaches about 112K while QUIC stays near 58K, at the per-connection ceiling of Experiment~4. The benefit is therefore conditional on the loss a deployment sees and on how its traffic is spread across connections. Encryption is a predictable cost: TCP+TLS runs 15--18\% below raw TCP on the clean link and about 6\% below under loss. -\textbf{Use datagrams} for latency-sensitive telemetry with QoS~0 where occasional message loss is acceptable. At 50\,ms RTT, datagrams show no statistically significant latency or throughput advantage over streams. Datagrams remain a valid design choice for applications that explicitly tolerate message loss, but our results do not demonstrate a measurable performance benefit at representative IoT RTTs. They are unsuitable for QoS~1 or QoS~2 workloads that require acknowledgment semantics. +\subsection{The Cost of Parallel Connections} +\label{sec:parallel} -\subsection{Throughput--Isolation Tradeoff} +A TCP client can obtain per-topic concurrency simply by opening several connections, and doing so carries a bandwidth consequence: each connection is a separate congestion controller, so $N$ of them converge to roughly $N$ times a single flow's share of a congested link~\cite{rfc9308, chiu1989aimd}. For a generic TCP application this is a real alternative to stream multiplexing. -At baseline (0\% loss), unencrypted TCP achieves 2.4--4.0$\times$ the throughput of QUIC strategies (Experiment~3). This comparison is inherently asymmetric: QUIC mandates encryption, while our TCP baseline operates without TLS. A fairer throughput comparison would use TCP with TLS~1.3, which would narrow the gap by adding comparable per-packet encryption overhead to TCP. However, the absolute throughput difference at 0\% loss is less important than the practical picture: in real IoT deployments, packet loss is the norm rather than the exception, and QUIC already outperforms even unencrypted TCP at just 1\% loss (1.9$\times$), reaching 2.8$\times$ at 10\% loss. The implication is that QUIC provides a net advantage in realistic conditions: it delivers higher throughput under loss, provides stream-level isolation for independent topic flows, and includes encryption by default---eliminating the need for a separate TLS layer. +MQTT forbids it. The protocol ties each connection to a client identifier, and a second connection presenting an identifier already in use causes the broker to disconnect the first (normative statement \mbox{[MQTT-3.1.4-3]}~\cite{mqtt-v5-spec}). An MQTT device therefore cannot open the $N$ connections that would claim the larger share; it would have to provision $N$ distinct identities, which is a fleet-management and, on managed platforms, a billing cost rather than a socket call. Managed IoT platforms enforce this rule in practice; Azure IoT Hub, for one, permits a single active connection per device and drops the existing one when a second presents the same identity~\cite{azureiot}. Stream multiplexing is therefore the concurrency mechanism actually available to an MQTT client: it supplies per-topic streams inside the single identity the protocol expects. -\subsection{HOL Blocking Isolation: Partial but Meaningful} +\subsection{HOL Blocking: Transport and Stream Mapping} -Our HOL blocking results show that QUIC stream multiplexing provides \emph{partial} rather than \emph{complete} isolation between topics. The spike isolation ratio for per-topic QUIC drops to 0.73 at 1\% loss rather than approaching 0 (full independence). QUIC's congestion control operates per-connection~\cite{rfc9002}: a loss event reduces the congestion window for all concurrent streams, even though stream-level loss recovery is independent. We hypothesize that this shared congestion response is responsible for the partial isolation. The inter-topic spread metric is consistent with this interpretation---topics experience different retransmission delays (high spread) but partially correlated congestion responses (spike co-occurrence). +At 5\% loss, and at 2\% for control-only and per-topic, our HOL blocking results locate the benefit in the transport rather than in stream mapping. TCP's single ordered byte stream couples every topic (351\,ms median p99 at 5\%; 458\,ms in the per-packet variant, whose broker-side delay queue also changes TCP's packetization; Section~\ref{sec:exp3}). QUIC control-only couples topics just as strongly at 1\% loss (Fig.~\ref{fig:hol-excess}), yet it and every other QUIC strategy keep the median tail below 200\,ms at the 8-topic, 500\,msg/s reference point; we did not isolate which transport difference is responsible. At 1\% loss control-only is indistinguishable from TCP (58.3 against 61.5\,ms, $p=0.12$), while finer stream mapping lowers the tail significantly (per-topic 55.8, per-publish 54.0\,ms; $p=0.007$ and $p=0.003$ against control-only). Stream granularity is a tradeoff knob within QUIC. Finer streams shrink the set of messages one loss can block, which decorrelates spike timing: per-publish isolates most, while in the 1\%-loss sweeps per-topic isolates only at two topics and at 2000\,msg/s. But finer streams also add framing packets. Under per-buffer 5\% loss, per-publish sent about twice control-only's packets on the delivery path, had 2.5 times its congestion events and a smaller congestion window, and had the highest tail (195 against 132\,ms). Per-topic added only about 9\% more packets, yet its median sat midway between the two (164\,ms). Under per-packet loss per-publish no longer trails per-topic (143 against 141\,ms) although it still sends about 1.5 times per-topic's packets, and both sit about 30\% above control-only. Packet count therefore does not fully explain the ordering under either method; QUIC loss detection is per-connection rather than per-stream~\cite{rfc9002}, and we could not separate per-stream recovery effects from packet count. -We tested whether Quinn's default frame packing---batching STREAM frames from multiple streams into single QUIC packets---contributes to this baseline correlation by running the same experiment with StreamIsolated packing, which restricts each packet to a single stream's data. The correlation persists (0.64 versus 0.55 at 0\% loss), confirming that it is not caused by frame co-location. Without packet loss, no retransmissions occur, so frame co-location has no effect; all streams still share a single congestion controller, pacer, and UDP socket~\cite{rfc9002}, which we hypothesize creates correlated jitter independent of frame packing. Under loss, however, StreamIsolated measurably improves per-topic isolation at 5\% loss, with 26\% higher inter-topic spread and a 6\% lower spike isolation ratio---both consistent with reduced cross-stream coupling at the packet level. However, for per-publish, isolated packing is counterproductive: p50 latency rises from 29\,ms to 111\,ms at 5\% loss with StreamIsolated versus Greedy, possibly because the increased packet count from ephemeral streams amplifies retransmission overhead. +\subsection{Threats to Validity} +\label{sec:threats} + +Our results come from one implementation, evaluated by its author, on one QUIC library (Quinn 0.11) whose default 100-stream limit, together with our 256\,KB per-stream window, decides the single-connection ordering (Experiment~4). Loss is random and independent from packet to packet (Bernoulli), without bursts, and applies only to broker-to-client traffic, so the publish path is never lossy and bursty loss is untested. Experiment~2 applies loss per kernel buffer on the broker's egress, a method Experiment~3 shows inflates QUIC's throughput advantage; Experiment~4's publish rates are measured on an unimpaired publish path, with the loss on the returning acknowledgements and credit; its 0\%-loss cells show little effect on the window-bound and ceiling cells, and no per-publish cell was run at 0\%. The two 5\%-loss per-publish delivery cells that Experiment~2 cites carry per-buffer loss on their delivery path. Only Experiment~2's reference cell at 0\% and 5\% was also run with per-packet loss; there QUIC's tail advantage over TCP did not shrink but the per-publish tail penalty over per-topic disappeared, so its other cells may carry similar distortions. All VMs share one GCP zone with emulated delay and CUBIC, and all runs use 256-byte QoS~0 payloads, so the acknowledgement traffic of QoS~1 and~2 is untested. Brokers are CPU-bound at saturation, QUIC control-only's publisher hosts run 80--83\% busy under loss, and TCP's clean-link level in Experiment~3 rests on the 4 runs whose subscriber did not saturate. At 10\% loss QUIC's advantage over TCP+TLS depends on the implementation build (1.81$\times$ with the evaluation build against 2.02$\times$ with the pacing build, side by side), and we did not identify the change responsible. The pacing build produces the offered-load check (1\% and 10\% loss only), the broker per-publish CPU premium, per-subscriber ceiling and paced ceilings, their unpaced comparisons and the side-by-side 10\% comparison; its unpaced clean-link per-topic and control-only deliveries run 10--12\% below the evaluation build's, and its unpaced per-publish delivery 55--59\% below (0\% and 1\% loss). Experiment~2 co-locates publisher and subscriber, and the broker's delivery mapping is varied independently of the client's only in Experiment~3's fan-out configuration. Fifteen runs per arm cannot estimate the rate of rare tail outliers. \subsection{Future Work} -Several directions emerge from this work. First, evaluating 0-RTT connection resumption would quantify the benefit for mobile clients that reconnect frequently. Second, testing connection migration could demonstrate QUIC's advantage for devices that change network interfaces. Third, exploring adaptive strategy selection---where the broker dynamically switches strategies based on observed network conditions---could automate the throughput--isolation tradeoff. Additionally, exploring adaptive frame packing that automatically selects Greedy packing for per-publish and StreamIsolated for per-topic based on the negotiated stream strategy could optimize the transport layer without manual configuration. Finally, extending the evaluation to constrained devices (e.g., ESP32, Raspberry Pi) would assess whether QUIC's computational overhead is viable for resource-limited IoT endpoints. +This work opens several directions. Per-publish delivery could pack the frames of several streams into shared datagrams, which would show whether its broker CPU premium is inherent to one stream per message or a consequence of sending one datagram per message. Evaluating the strategies at QoS~1 and~2, where acknowledgements share the impaired path, and under bursty loss would extend the comparison to conditions common in IoT deployments, and long-running measurements could estimate how often tail outliers occur and whether they depend on the stream mapping. Because the tail ordering of the strategies reverses with both loss and rate, a client or broker could select stream granularity adaptively from the loss and rate it observes. Finally, constrained devices, 0-RTT resumption and connection migration would test QUIC's other advertised benefits for IoT. %% --- Conclusion --- \section{Conclusion} \label{sec:conclusion} -We presented three configurable stream mapping strategies for running MQTT over QUIC. Through five experiments on controlled infrastructure, we demonstrated that per-topic QUIC stream mapping provides measurable HOL blocking isolation: inter-topic latency spread amplifies 200$\times$ under 5\% packet loss, consistent with independent stream loss recovery allowing topics to experience different retransmission delays rather than stalling together as TCP does (1.2$\times$ spread amplification). Spike isolation ratio corroborates this---at 1\% loss, 27\% of per-topic QUIC latency spikes affect individual topics independently, versus less than 2\% for TCP. The isolation is partial rather than complete, which we attribute to QUIC's per-connection congestion control that shares a single congestion window across all streams. +We implemented and evaluated three stream mapping strategies for running MQTT over QUIC, including broker-autonomous per-topic delivery-stream mapping absent from existing brokers. At 5\% loss the transport, not stream mapping, sets the level of HOL blocking: control-only and per-topic keep the median per-topic tail below TCP at 2\% and 5\% loss, and per-publish does so at 5\% (at 2\% its 82.6\,ms is not distinguishable from TCP's 89.0\,ms, $p=0.06$), and at 5\% control-only holds 132\,ms against TCP's 351\,ms, and 108 against 458\,ms in the per-packet variant. Within QUIC, control-only adds the least packet overhead and has the lowest typical and 90th-percentile tail at 5\% loss and 500\,msg/s; at 1\% loss and 500\,msg/s both multistream arms come out ahead, and at 125\,msg/s under 5\% loss per-publish does. -Our evaluation reveals a nuanced throughput tradeoff: at baseline (0\% loss), TCP achieves 2.4--4.0$\times$ the throughput of QUIC strategies depending on workload, but under loss ($\geq$1\%) QUIC outperforms TCP by up to 2.8$\times$. Per-topic mapping achieves 62\% of single-stream QUIC throughput at baseline. QUIC datagrams show no statistically significant performance difference from streams at representative IoT RTTs. +Under loss QUIC delivers more than an encryption-matched TCP+TLS~1.3 baseline, 1.26$\times$ at 1\% loss rising to 1.78$\times$ at 10\%, once the emulated loss removes single packets; the evaluation build that produced these ratios could not be paced, and at 10\% loss the ratio depends on the implementation build, rising to 1.97--2.05$\times$ with the pacing build (Sections~\ref{sec:exp3} and~\ref{sec:threats}). Loss applied per kernel buffer on the sending host inflated that advantage to 2--3$\times$; we show how to detect this from the qdisc's own counters and how to avoid it with a forwarding hop. Broker-side per-publish delivery has a per-subscriber ceiling on the clean link consistent with stream credit, costs more broker CPU per delivered message than per-topic delivery, and under unpaced load at light loss delivers a fraction of per-topic delivery's rate (38\% at 1\% loss), a gap that closes as loss becomes the binding limit. On a single connection the strategies differ ninefold, but that difference is set by two QUIC transport constants, the concurrent stream limit and the per-stream receive window, rather than by the mappings. -These results provide practitioners with concrete guidance for deploying MQTT over QUIC in IoT systems: use per-topic mapping for multi-topic workloads on lossy networks where independent stream recovery provides meaningful isolation and QUIC's throughput advantage under loss is beneficial, and use TCP when baseline throughput on reliable networks is the dominant concern. The implementation is available as open-source software. +For practitioners: use control-only as the default for the lowest typical tail latency at heavy loss and moderate-to-high rate (5\% loss, 500\,msg/s); consider per-topic when a single client must publish beyond control-only's window-bound rate (about 33K\,msg/s here) across several topics and the per-stream window cannot be raised; use per-publish for low-rate or light-loss channels that need per-message isolation, sizing the stream limit to the per-subscriber message rate. Whether QUIC's throughput gain matters depends on the loss a deployment sees: on a clean link both transports are bound jointly by broker and receiver CPU, and the gap between them depends on configuration. The implementation is available as open-source software. -\section*{Declaration of Generative AI and AI-Assisted Technologies in the Manuscript Preparation Process} +\section*{Funding} -During the preparation of this work the author used Claude (Anthropic) in order to assist with manuscript drafting, data analysis scripting, and editing. After using this tool, the author reviewed and edited the content as needed and takes full responsibility for the content of the published article. +This research did not receive any specific grant from funding agencies in the public, commercial, or not-for-profit sectors. \section*{Data Availability} -The experimental data used in this study is archived at Zenodo~\cite{bracht2026zenodo}. Analysis scripts and experiment infrastructure are available in the project repository at \url{https://github.com/LabOverWire/mqtt-lib}. +All experimental data reported in this study, together with the scripts that produced and analyzed them, are archived at Zenodo~\cite{bracht2026zenodo}. The implementation, analysis scripts, figure generators and experiment infrastructure are also available in the project repository at \url{https://github.com/LabOverWire/mqtt-lib}. \printcredits +\section*{Declaration of generative AI and AI-assisted technologies in the manuscript preparation process} + +During the preparation of this work the author used Claude (Anthropic) in order to assist with experiment design and scripting, data analysis, and manuscript drafting and editing. After using this tool, the author reviewed and edited the content as needed and takes full responsibility for the content of the published article. + \bibliographystyle{cas-model2-names} \bibliography{references} diff --git a/publications/comnet/submission/references.bib b/publications/comnet/submission/references.bib index 42e035e1..17c0e9c8 100644 --- a/publications/comnet/submission/references.bib +++ b/publications/comnet/submission/references.bib @@ -38,20 +38,25 @@ @misc{rfc9308 publisher = {IETF} } -@misc{rfc9221, - title = {An Unreliable Datagram Extension to {QUIC}}, - author = {Pauly, Tommy and Kinnear, Eric and Schinazi, David}, - year = {2022}, - howpublished = {RFC 9221}, - publisher = {IETF} -} - @article{kumar2019mqtt-quic, title = {Implementation and Analysis of {QUIC} for {MQTT}}, author = {Kumar, Puneet and Dezfouli, Behnam}, journal = {Computer Networks}, + volume = {150}, + pages = {28--45}, year = {2019}, - publisher = {Elsevier} + publisher = {Elsevier}, + doi = {10.1016/j.comnet.2018.12.012} +} + +@inproceedings{scharf2006hol, + title = {Head-of-line Blocking in {TCP} and {SCTP}: Analysis and Measurements}, + author = {Scharf, Michael and Kiesel, Sebastian}, + booktitle = {Proceedings of the IEEE Global Telecommunications Conference (GLOBECOM 2006)}, + year = {2006}, + address = {San Francisco, CA, USA}, + publisher = {IEEE}, + doi = {10.1109/GLOCOM.2006.333} } @inproceedings{fernandez2020iot-quic, @@ -127,7 +132,7 @@ @misc{bracht2026zenodo title = {Experiment Data for ``{Evaluating Stream Mapping Strategies for MQTT over QUIC}''}, author = {Bracht, Fabricio}, year = {2026}, - doi = {10.5281/zenodo.19098820}, + doi = {10.5281/zenodo.19098819}, publisher = {Zenodo} } @@ -138,3 +143,55 @@ @misc{rfc7540 howpublished = {RFC 7540}, publisher = {IETF} } + +@misc{yang2024mqttnext, + title = {{Spec MQTT-next}: A Mapping of {MQTT} to the {QUIC} Transport Protocol}, + author = {Yang, William}, + year = {2024}, + howpublished = {OASIS MQTT Technical Committee, document 71729}, + url = {https://groups.oasis-open.org/higherlogic/ws/public/download/71729/oasis_mqtt_over_quic.pdf} +} + +@misc{nanomq-quic, + title = {{NanoMQ}: {MQTT} over {QUIC} Bridge}, + author = {{EMQ Technologies}}, + year = {2024}, + url = {https://nanomq.io/docs/en/latest/bridges/quic-bridge.html} +} + +@misc{rtpfolks2017, + title = {{RTP} over {QUIC}}, + author = {Ott, J{\"o}rg and Even, Roni and Perkins, Colin and Singh, Varun}, + year = {2017}, + howpublished = {Internet-Draft draft-rtpfolks-quic-rtp-over-quic-01, IETF}, + url = {https://datatracker.ietf.org/doc/html/draft-rtpfolks-quic-rtp-over-quic} +} + +@article{chiu1989aimd, + title = {Analysis of the Increase and Decrease Algorithms for Congestion Avoidance in Computer Networks}, + author = {Chiu, Dah-Ming and Jain, Raj}, + journal = {Computer Networks and ISDN Systems}, + volume = {17}, + number = {1}, + pages = {1--14}, + year = {1989}, + doi = {10.1016/0169-7552(89)90019-6} +} + +@misc{azureiot, + title = {Communicate with your {IoT} Hub using the {MQTT} protocol}, + author = {{Microsoft}}, + year = {2024}, + howpublished = {Microsoft Azure IoT Hub documentation}, + url = {https://learn.microsoft.com/en-us/azure/iot-hub/iot-hub-mqtt-support} +} + +@article{mathis1997macroscopic, + title = {The Macroscopic Behavior of the {TCP} Congestion Avoidance Algorithm}, + author = {Mathis, Matthew and Semke, Jeffrey and Mahdavi, Jamshid and Ott, Teunis}, + journal = {ACM SIGCOMM Computer Communication Review}, + volume = {27}, + number = {3}, + pages = {67--82}, + year = {1997} +}

h?*Br!5wsW7t0wW$veXj1(_Iz2^WW&s7>>U5lf){Be{xyNyDua zd+OuC$s2>5ox#I3#gYkKF7wHVX$N~&4|6QW|0c(5t8fyx;>&ct zh7zc-DJoWFhikbH`f07TDgy+5)l*LiQ6-5=Ln&-qGwe>8FXy+oF{btF`$5W)QRxTx z=w>r=@pd>c_h!-3lnOXpA0;S%BorpE7i*?c84kJn=3FOIcKm*-s>V|xq!vK`DOoGg z(_Exh8lQhy?^26GrLI^XfRIB4-(%J)=Kvnbhy0EdPS6aZ*ws$*tHoIZ$eRz+KROn8@+&N{z0V;E=Ri7^y$06nO6U+#e*buD+k@vT0xtQ2=f&{(j1Sb*r+z9s zQ{88JK{oB&=Fz-UfR2=Zd8KYt@2blncPhS2S&(!ukHZcZ0@mpfo{inh=ZB~sIGrMg zQ0=k6_sehTW)HV;4Y1VoLIaOfHOVr3tlj+U-Otzll_Q+pDpZzd{Er-86vNY>&X|>Q zg#~K@5{qE|xc29Kp8Ryi$X7!udyfatWC7uOAUMF2si;22f+AET+&{NN{jK58yi!p# zsVn(NsQ~&Gwwm&fAy3lJ)*||U3c{G^m(lkD69P0dm!5Y5cbCsR0xBdnF(5D?QVK6Z zLT`8=TQDFnATu#GE;BVWGBzQ=OK|5 zTfxXmWM_^2@_pS?ePb27r+da4TS*Kj(ivWgrw+*?S(A&euK#m$b^ZM}&zmoQ*j<$0 zuHNl*^DF+oZdCIt{(fk5^9}yK-YNWcyR$m9);kk4e%~_EG zF1|oB?@;ZV-Oj1jh3-RRZ5w^I(NpUxx4LhR;d_qTl-e-1TbdDY*WK^UVkah`U`oMu ze;Tyfrc7n-ubY22Z<~uR3|VQKZ!u~x(5Br7{5xc&b5Jok&>;!)rVTMgSB<5>!nWNH zyYHIc(T(lNcs+IlszHAZA=@n)t6DRXvwIGIec1iJBbPi=XwQWcn0!z!>HEC)6TUnT33&i z;V08~M4KA~Y76m3osw}T9Yvs4>X8^U%D37D=d>Ix!%t@Lh&F$>7|fyd&ZU^L_2Ebj zJ{pCYCXCk3RKqR!=@f3axj~^x9&$AnyqT1bRiWSzqeh#-p?hsjl$LNR346mx#*t!gz zgsKY1t14NwHmZMEk6hrgiqWx!FO_kXFgRXSv7v?Pb-kboysF}LtDKFwp1~Ziss!6= z9c-)(<9Jmi+SVHDbH$jzt18K~I(SzzCh)onlpkDB^;F_`l@HWzrX(Jw%LE*+}^xD(>mqkI_0+3Db|g% zt$wm~_iOfYd}dAEma;z#$a9trp z#O>GtjjT}Mx&q=CoHR|4TR+T3ms^vuAIG&&=U;#PyuW$(rn&#={dM#5$v>Lgcdswry?lD63Exdb znuLG4^)U2BL*_LGGyg}J@CtJi;cGqX`CSJB5DjT}e&I)Wh|wpF114DDhh3VUj^-!f z>;wmzor*5GvP?X5NCpGKlpuMa6Q~wZe@NKGohMIxzj9TCu5p-xW%6Q&;1HA^b^<{mDe716-R0yswh;0j})=-c|X_aor1e z#`UD@8P|h;XIvLu&$u4+JL9_Oy5f4$Z^bp&^@F))tHKo0SPF2=z+PHf7Wic+9kzdi zF{Ya3gj+0m(=6vx)3n%>t*K`$T8cUF2q>>NJR zbo%^646dIMQ6y0jG5Nk?f@|VzYHt+9wBu-Wx23C`l+DJht3CQwd2eH`ul(suV6BaF zwMPX0SRwnl&o5{-OmMLIJlp%)khp)Bo7Iu8w<5eOsn84f%*&DryMUj?%b%T!;(bYl zP=%zTcwbT>RPk^s#%DpZ+t@JI;#sO_Rjv7MzoS*aRPih}HA_GGI-czfutPknVA}dl zueNu3IHEu3(rIF}+4awequnVu9dVv$F8-;SukNPeS+_B}sFZ?_8n`oN#eDJEd<*7@&@h8eDj&N2K$zq!;J--J$A6viNO`C z2>Yh1SDc2&A$;FqN=S4Wr#MxgwuQIyol3-(HJyRi97vQ7tNFS^tj9>zDx}YMj1uWS zPy)&O{^L7##-M%Ev&IdvI3D~H#xOOI#d`efTHm_cyO;~9Fyux~`lld#obS)?GVz3O z-g+Zp2Ps7QX(jc>gn8=aqT%1IvteSPxeENIoy5dxiR6_A5TvYd^;av2hU*X4SdilP z6Jkbb!8`~z#DPQ3`(`q$fG+fXS{|x+H#;smRUNTDc(+DkUY(1dYfhap7R`|_Nf+nEbvOrw|1~ECvPu*__%i(=*_MEI} zKN4NSY#Qu4=4wH;9rTUgxXl%7a=Ab~R}A%msz55i!6y$(#j9}CI{EV$UVcBvO~0MG zR05KpIK#w1&Yid#o1zBqD#v+0L!D>Ju#0in>u}VWZwjNur@`h`MsAJ5qX)ob0rMLZW8OvvO0P8Kg_Uy#J{b2=>li;@iMFVL)ZRHO!B1IEOOFs z#sdWndwrxF^lWWI`Gy7|_0OO?<9WSOUGrs<)a#7V@WKa)U-_-rg=VI28znu1RMzT= zgcdhRX$GM_pjKPc1NEn5uHwj>yq^hkq8fZ#;p7~c*Ben26R*_O?8{Bur2jSrqV;7Q zkejR8=jv?>|Ecb2Kf+lwzdz_A<5%pQTmll3__!u)4DABhb@mbVh|ci%Fg7fu)dlYM zvW&%dOl6tA#pd#Jl&C@yEU&Qdf$%qFIk40i^Gjur#O2NWzJFc;c{pruZ(rtZc5Qxm zP?f1dNHgUyjb&6DyUrn-sW=eUa0g4(eBLU^EnpXoO;Z~rXYQt@2`6HmSgJu2bO9FY z-SW6kaEN))h*u3fsLiORLK?rF%Fh4!xouz578iD5k*i%jw3FKN9P8k57wHr9m8nTm z;`*q42I9)O;IO=+>5(?M;6(|6&X%7M$GcrrqSTra13z!530BB{Bl%XrW3A3? za|?2ctht8s=*E7s)NpsY<8$o@{qyKSBo(4p;UMQ-RXElcbKCn-;;e`#nuD*w`IyId zN{Qf6b`(6y-hoHi1L(1Q;3Tb0(U<*|`O#m^pxuW7 zVAgBsxOOs^s9l!A7zfbiXZ*f<;y-e9K&Z@X&pZjh-niG9lR_5GLc&}oQ^IMQz`m`V>7zKTKDiDc<#20UUhesU`@KEXDYU0e%q zl<5?5o<^5v!j2d4l4azi3Lbi~%F^}xGVczo0`i(;xEIcCJ$ztupB{ zRN6N8wnNIX32qfn_g7N!z$5t7wKlHjgD_LF`tbtmhiJT1pgT1DSyTwFo=sVy0(h{( zf-t&$bzUFB78 zw{O3xoD<6m?BFQ=o8cyvsOSVUFIz${RnQhm%PUbd*0_i2o{}y~a!i;xkG<~rWQGRL zh{a<&P5Po(ebv5}>M13-Y%Om_Q1%Pj}*v%*|a@DAROhGPss$+7T?T8_&QrZuxoD!+q0+0R9yD7h45<2rnEs^m@xZ7 z^d~e^+BLKQxPvr2wM=gv?^cw#dFm+QT6An1{O;0QU0iz*t>Fck+!#W{=zf6K#_<2J zP$(M#gZrpVdhHt%&wsm*)ZEc&FCOZ15?Gmd^utP$$K5l@`4L{cDduvy%jl^H5O&o5 zeDqR7iZcqCPWiRp?+mgATp4p|6yTE6!4aUE>9a&iW&01Cr)MJiUP%y#bj|OmoURW; zdrlk0*am5n6K=_j8mcl?U>oaA4)f?zp(cL@nvI@vsAB7T{JzO>_DWZh0EeteRgXzj zc_<7z)!@c6CRWovnKQPaqrahs!{+TOaGfrOMEG%)F~j2HPs-ecJ{D zqs1`~s@W^wavjT#3Xw7?<#2wFRRS6=sz3YjmcfpiYReF%1*dcxX-e^hDBeQ!)?|18 zwi3V%noR*<0=SdEypRJ0m1P_HS>V=>F$w$9^ZatVz2?7qf7nq9Oj20}p(W8E;-SBp zwl9E}Z7e?|rQfyN67>0b(F8hxTuD;}58OhTm60Q}3!To?%))7IVVP|u;?wKJQKB(b zbnJIgmNaWAJAe>Z=bJOENUSBX`R3l_iWsovwTrG=m7ld2qEdnVif&2Vg+!er8G^~V zm{4hQZvY!?3d7vraAX}MSZWJaep)((zjh&~Y?_FBzZGbagmg*lQk5vR)!Fg3lo$); z_tm*w)JXY|honEqdl2{wo>c5;_J#5Dy}cqpb-Z#o29ZPW*UaWlu8i(TH=qj5D_$0% zl^d})Kq=qZ=U8Ld&Yq3Hd@Fsp#Dlzl{(u0|+D-iLy98$3#`u@B9GqYg6$i6#gUQKj zz_)Go4<;zvA8-lowdB5J%+@?0fEfV6!SgTG_CH;i2zr$VKS+N8VE%3}0l5PJz>%!n zgViW}!}qVB(G-}rJpPsv0D4gbKP3u-09Xj{k|RS9fWkUX7NuVVPW&nR7Y?o!l9AA{ zG?rW97EpJdj-W2a>$BcTMBvc3HVlf}!qjG1AubAYL%SxEAVJI=p4bYc8I0lgW+F3L z%)J&^suFTqZ$(QBG{(+C-cXGZ{R#Y|kJ$Tm|Mm46=HyCZ{{J+S=ii4RS@?#k@#YQ_ ze5D`}FwyvbsL=mu)9xGildcX#D*%+L1cBAKQ^ElNohpO*r}KvZd7w%aF#j|O5=15d zB&P}irl&@RcmXM@f%(n1O07WmYT!fv@}hfaKw$mDg$^3lgurgiMT5`=fFQNOZYWhx zpszaMz&CGb01%oU*iED+0;H=Cjtk}#7YBeo8-Rn<cT{F$88SKQTlw05oh2E(fz~+km)C!Ionwgd|AJ3<48W{SUjgg*o_~ zcSnds00`OwZ2pH`Th9{Qrs;p!wS}y}p3|-nAP|u?_;PwX%Rq-AOi@&okZ*fK?M>Lg0O^S z1A{nVa(CdQj;sTr6bg8)TG=?noRJL0`KU>@Es`mkVGi7gQDeAg)e75C5;?8SfyJfp zMy)rozWRKoR01cGc*_w%l6=E+)#D;J__wD1*4xcp=*#QyuJvn^FX2k(@U*V@k)Xd2 z9vAcNy*sJzD+^EDl1l{ojgvYsrI)K3s2|w&@(i@c^(U(74oa7*>mr0vTpGTW1+|!d zRq6G`MW5^4@AqeSiBCwk`z4HN$A!v$MD1cx)19Qum<3rC_WSvz>HXPR ztEjm<*G?gDKy>>IZHldwrdxHne35s3mal*r9zbfXa-PpkA zP6~)x;&gwrpJCmmgY1~0=;)wk9GlW0mEL?da92%zjPFL}s*rVQWUqietQiw(Nh$@+ z*Td)*d^iVbD;WfiI4cP0gjI-1-lJ4)Lh*FXd3d^^pF%B3laKVJ#aFH#W*s!enb|_TTgK3p8Xk)Pf zm3LiRL>B){4@=-{K6S>Ci~0TGg^;RmH6gXQxh81ZeZ?s;oQR4T9?$ndM(8CO;=+Yb zZjcV0@@T08UTE7$>MOC6mO`3QwT$z7F#rh;{gfT?|nq# z#C>(mW$^MnU{AnAlR0ufNp#7=w8lMD-o@v%z6LvmPd(w!2v)dmw4s z!c}arsyUADMA$t9*ccn>_?yV5 z6ZTpBn&zmR$Sow59o6XX91Ysmt_oP*Z>w?R}Sa2qU!ec+ubw2B=x;gSeeC- zVif^P&_d~kv7n1)gpSja`oSv5AnWI#zLN{(??Gtg_#^;1amyjC{gsZ5aidfxt(XZi zf^`>-aUVN2;ukq!)0SD2fZWziUHfb91osoa_k{!#WmE-^Hg5ikHyrG~xh1Q^bAklB z8IEkT%b^Z>bjtwV+2A+gicKP4LmY4N}(9wr{Vprmh-c*`^Ur36m!w)?d!hER?kf&+C zmvQhNg8tq9IMVJ1oR3GF zUw<|?4MueYQuAVEjE07-xDL26nY!BdeWA)5zhua4kW{|F!Zlx_yU#5$`DPGhGXDBw zM?z+xm;C^llbW8#-T_}*TbZSwC4p0Jz&KF_O_+b?d`2A(^> zTJe{7U{iz~)DV}eDRUz$63_9nTL2*+45%uzXsDiTisT-$0F7Z|q`D08oIf$wU>B!} zM9umE5o3Ivp_rLriMI;}FpOZw%NK%I985etiZ}W@`zkk|5gKPG2nRh03EFuo_(CT6 zK1F7MuSmsyferh(Q+{2eE&mXsU{(q4W>vc-2aK~vw% zSIe~?!5lca&&Aelu+gbO_I$0VOp$xJx(s!0IRJkrfg?1Kv@=T>&r4r?`Cnkj}Gz` zkV6**Lm;ExdM0OZzL9Eq;>Eq)KXk48QNQPk^XGEc=#UjEgMM8njjPX21wdJ9$#Ak8 za=7%WWp7NP2d_6S zQexH$Oy&J291heEyAbZ^(}L6c2Ua%`;9Wk_E1Q5hqL|v1b88Q`)W(RV*kwcFy8iz8pP!}Se-`)N?SD%(=8zEbE95DPtqcM{AEf#FKR8!I zr}p(0R@(9*rt4BaJ11$QX#JTUXO%MbJ$7-ruk-Bq@ce1(K#9`SkgRK9#w97=B!EiM zrrTrrgf{O`u3t__6F;iQ8_B{$Y3iaq4M~iy?5`*5*CDF~`Ffeb^z!`YeDQMs=aIe5 zGs#~7y*0=Q1c3p;%Jc8kh#3r(^0Kmmkx$0|vHmYZAAwoU%-+J)l9VHPw}hO5U2SBK zP3dNDZ;o?`y@i8=gI!&u&bhq~?uZmBalo}6{=eEqDct0JaItgzM+@ds&&GwIb@9FCd!U2-kKcRlj_0O)7`pAA z#?%TINAl;Ru$hGvOX%fEDJD+6@=(Jmi+sO!c3zdD;Y~c>{h>q|Bi7 zQRx-21lCGxnS?&-fTv?WXuc5$cmxq%1*326KkZ1Uc@lSiGktR1XHlDLWKxmTEv0 zO9I4Bi6%&GnG`X5GrU`h%M*vgy6Xn4%=w0&YU+kL`dnw>CRR=3OKG6Ux~GanCsy8z zE~LrZZ?&J{{x*of8DDWop#;l^E{m@c#ZZtN%jKzAl$Kb#)`)OjNCr0@K{?h8HM)Dx z&>99m((mk&J|h3QU4^lf@V3S+jWQ)vZEi!v(j+#%X`^H6xhdQ|KmuVg?x_F>7>FI< z+atG;GOg~TUhnlz$tU8nw0|3TaqcIG{=n2i&=Z<&4zFk~6Z$4}m3a7_$p6duG=zUi z75!|ZM3s}J)?Nz47&LADRxxP=COyh+t#;@Qrvw9UO27@Fj@2bG+PRg)Y6KQN-2#_r zt=q(D!4WB?KaQ6~uv(-#dh914{9h5N;~S8GIWe*{YMcUt5~rFGq2% zrzFMv1vBJueC}ReD!+CE*>XF#l2J<=gJ&;F#9B3a#;*@eUQSA;xP9(`pjpQ+28Hpi zD0Y!yS8e*VN*1$6Gec975`T1jf2Sr)hrZdr8q*zgKO6hMTgQ0}&r2Wk-IqMCZ$I96 z{3+zw=ez31RpXmpG%~?q70D;#$JzWd7IasWX7;@^M1w5&d&t`*$;SZhjJEIho0i6z z*wL5K(QD12Mcx`j7-&yLpkAf#@$4xC8r_UN4&K^!0eS6L?7P_qQ$8PmF5I{f#%lor z2JE6$iFD^blk0;X(>TF{-%j2P75({h7@SLdD+|cD(mb~t*3PJ0JZjl+V2H{#M3Rk} zi{#|Z^&cy?ZY)7MD)53WDM(+_rp@Pf@6qs44mUnDMsSK+5pVx=0GR{`2xA{_jFJZ} z8`52Xhs*7Q$Mg5Ajv-P)sZxqku={=er@D!5P{C3bEHELaKl3^8KUNLHI1->zpS35C zMsh4Lm@pKn4s|LDn8%7%E$h;!25=N%qZ^Y?_e|epI_ve%7QPSM8ar`)RHl^vRorxS ze=vLR2)^I7{9D}^3>3e$X7LrwBwWDkt{N4Gd}=r9Uiqk0#*IsM!i{Fd7gl;yl=*u) z{@Z)kT|5tWLaH75uz$Pz&(Sh9aEs)x&CU7C{j9BTL<`aMQMA->aE6l4-Dv*UQ2X4) zpQ0B>E}?zY{c^5l>Fr}4oS)P{!tA)3Z-lf06U~goP%(^t6cW34b?6iKn0bgdlcqd^xQcNDcdF~;4`H{vyKu21lkez_x!D%_)Rfb0 zc8ZeW(PWcDQp1QyyLT4{zH#r&(@H0&f%!Ba?3wb1u53xs!atmy1PEeT6h``Qvl4Ga zg_8c<5ujE1#sK4(@*+MT#%raFSln4m?A^8de)(WhNq|gDA{>K^%q{*#JkDAp+MPyy zr>1bAmRo@TZR$Xe>7d=0{A1@-qkEi=^25Qmjwko{5DEBD5~klGS3YE;vuo<)U}4|lO^1Gc!!w@$7NO2@H#r)O!GX6~{oR(zGXFUj1s>4UVvRwP|QQe<6SLSoIV z$lS#=22Osa3(d+r#2d&otIhB{&>+Ub;;g{Vr=vM~^q!8gQDYp5DSaiIYFDmIZ{9x9 z!7ct_V-#gTpdSsXevBp7&Ks_Ucqe(I!Wj(|snYHV*1A8O3i@dv{~f_V2{_h!ZlvO6 z6^DWct>H@saFi$u?t_@!8|y2-;~#GQ%X#p;4upyu51hB`yG>I1vK#PQwfBtmIYdzXA4CRfr<0TZnV&hqOu@8B!1 zUW%GfxG+5|P0et{oRdJe*tOT>1e-Wfmgb|Lnb0_VGLP^Rja_8_xnwacR>4~gRP7$w z5zyl}`ad*E?D7eL|X4)}B=9Cl?XK|+;pX;&XL+9J^Hv&z1^lw@gO}&{3 zsfOY+0zLKSbsAMLS?ex%WUt<;QL=&Rall%on8k$O5S94xlnCd&KN2bo4i-OTM)>N{ zeeIrnyFSb4E^li>oPV9=XDD^(F@}}7f>_J-bVB|deF|q|IQ_Z2pXRs!gNR2sap5Iq zM{%T9qX{R0Dk$G33>0t5op#{p>ncRx*59X1J83so==pUE1f5SfPEiIQ07YNNSq~H+ z*D++Aa3nxvCuEk~^o_t;{9;ZA6cB8OGY?uLo~RmRGz^nFgWF$ecG^ZX=lV)z!f*H1 z6_BAm;mld54Pam10d4zx|7Nyln!3HERYiX1T7jYYOV(l}bmG1e=0(GVF|TxJeV!@= z8&g!TfUx8c?$ixz`q(4+(9{1UOaqi%$Pyv?abFY2w|rRN@GDMDb7jrqvV(Wei0d{O zO;M6G-IDH;6P~{W42d2#gRIX@Jq%BJ+XfuZ6^b+)<*Rfeg=)P=JcTq$X=y2>*W1;F zCr5du8?P|lL_9aCj90{aR$o|l(ah9%P&v~lIYZeO)xfj`NZFT)9T_j0csgKBjAnrh z(s!Bet^m4>pl(1#r@}6Ko18!5;>XC2b3iQu@(NxQc#}cy!7IhLWLJ2~pUfaG=Uoq` zl@d&MwnvuZ-43S3aj&z0_4#*K6D0W2rI+JW@8mXAGPHjtLAEwt0i zxm{@E+t(*QiFu06X9oWi3>uG2@9JGoJTbLk6Fx|{JgeGlZmmJ9~F<7*I4ET}%R zD)FHHLljl!E9)((&n6~+{rTse5cC>ZjFy&hXOjZ{K08L< z*(@B=9WL`sNWO5AVGPn%+VD;-F(^=5ds@anaZZvM0Llv(p1scqZjOacSHW z8e2o<+f^OuMs%PBwA5#2d}}H5s=6iQ$O<>=SQD(g-+1Q*{HIv zWdDA3B79y(K4D-GK4ntYWZ(hixFdg|heXoFfdkiD%=h>ffa2b(U3E$%6ZU6;_PoaY z6L^T)ztt-RVk*G)ueu6l=f;M6Xv$)mNNxt0MH+-^fCs8UB3)2<{4X;|Wb zGpn}yJf>p}-j+!*;}fxHZaXaC!>eNH9Y@w+d_yRk!vbxK`iFmUNxpJQtnVb)g?sHDYAj7cQ6o#b0%k(Sbd`_ z*oVKZ^`D&w$Z;BS$!U(yHE@xpqSLo~D!-{Ez{BHY{fd8!0hy-2%cfzD=Fui{S}0MUaO0oG zlk?r`xDM|b_=rtsSp41>+W9Gt#V)>q3O>DtC?`+b>p zgigMz=Qbh}JJ6etg#qv<{51q1PGI%ujK*+pe^6vK<23tv&kaEz&e5%P9BokQ#8Gjt zD}e?r@3-g$QOl;ca%J>pREzM8nV@}!FQYZ}z@KY%P2gmKCgJd1f#9(I74Ma~V0fm! z->QpV4n2_{v5;h`QS!ZS4Wf3E5BypOM5xfGD|ED!H;V_5cjUhzW-^=fiEr zJa$Hvy*As< z9g~X{zWyH8-^0Vuk81f&*QIVb?Qu)ZsY{10Sof7q7}dJ{<~pDP-EP*FyN(j~OnlqE z^E1lY^WQ$6n`vYCwUyjA9UW)AhY9C=gH;%n1*Z~-+L{##dPsUT47!cj4F)v!pbAI= z2q1}c#&5Bo%`>irp@oR*)J!28OP62@RTV4sVOWc|CtVH_^Ce+LwRqB3^P%FF!%J;0 zf3;xBW=02QsKNJM2J4@j2BI8YRt=Z#^nY&4w0B-sIF@zk*8N*myrU`&N-;IN6v|h% z;-NSR&RHe8?0?#ZEwK)4ou{Z=yUCP4@c~QBEpx<>=wZgqtpza_(ZOH|L2`sT{F zE>6@O++8OhGpTpXy&1W_l`iQi*k%E|hN_E^rcDWZ9xul-jqO2m660 zMPM(Y|`kA&(P*3WN@_>7ox(oX@>C;A-@ve>|v~K^U z4@f;Nr_O(KSYVasz)rB(^==7;ejF=GFDcw74}(4oB}^}+d7c%p;<~LYPS*ikcmtWy zmwFG!ujP>O5b`uP2-aLpy>94F_6J<$5xBQABzEV4#a)ATNy|&i`Ya|Ys|q*SeOGgh z`+vpdcpSh)L3{tnm>H!*W3={q14IF!{7^7}`>!ha?=T2#@OA780my;!)BNa=U*KSN zwp1OV486SaW1Na}ufDz^YQ5}zu13Ujmb(|v}Y=VLG3;>8N0o-J;!1xQOB@yiX50DO% z3_kQPkS>}6KJ*We9+CpF?HVp@Y(-j z>UxC`m>`Ez2q}PwJrDFo(!LG$KPa7Zv{ zjsO5~Chyk&qf^bz`cH0>7AP>9wm+2k^d8mm!2bLrU99HQ0<|>x%c$LIlKLH?4qyH^ zSFE88J<`Rim)A%}4EWEsqurm|$rJE=BpNz>I_R(8pU=j_HS_$6vd(HWs_@dvnt}IsBd9>d!8CGN$wQ?xs|;B;a9{dup5WQye^;LU|_s+Bm=8adU&2 zn`VYiyWutQdXikBf8%T1o82xx2^)#x{B>X6bXj*ipwa@iG3D~xZ@BYssA{@4 z_3IJ`neo^Y&yhTj-oFNh6QU9Ug)Z`u2s_kOvzbfb&Mth#O;Q|8>7VrZ^-faTa%`!WF^ zSj8ly=p(#J?0Ihr^uZQ<-y$OR<(&qGzH!5d z*tR}x%#TM{yh3drG|ggqHncp~&Havmn(4f55u8^ce?vi#A5~q3@~J;XIrd-P+$rm3 zt3VK)%E-{`f$Y`<4Wgi&*S(Bj6`T0JENb>2BZ>KB9=R9EqWW(Xc0@8eVvD7B> zqaxh?s3M^Yaf{4#x*ZSaP9xQg9?cbgBT&iqGB0;>SEB3tiShC2#rCfCu$@p`Tc!uW z`#Q$J^oK7T)%}pYD!^_K+8e(90I{9#dj~;+&W?S_h1Evx+-!U1+?|vPqJ27Ja>T*V zWqq=}z%QyBibU=HudhugXy_aB+yV%@#aqj7a(~(b(uT^14*yu`1wiH%pmQ-up)4deIc!DeO{f2!xYhSlG__MQg62rkm$KUtrf?Q{#?+q*VWLUX&a z1EDt-W9e+de4w&UHySI(Z3C4Eq(?gTP&cT&qbE5SEDy2ZqL~z@OQW-2!VQ|Lf>|KG zszC_K@r<{fSI7Wp*?c==TkOe%s{qm8T@cTZRubH2=1|9+{n$83hoKR?z8(fmQ(q)a|y1y69ollV!<@h{-)yB`n{PYzO% z+vsP$e@mGGm2SKz-ID}MJ8L*rMR7w64P5`r<_G5$L=8m~%=22|*GDvA`7LMPX}==9 zWL`vsVBdh66t`I4UK6!e&&JL!Ct$}+!Tzb(i|*Xd0@9Wg{R7k)B-6Unm85*{yrWHs z+J`YNC!iBcx?q`0rtz|q8%MLWIaC7HL`56_T6Ix%v`N^=Rq|%+*Xm!>lp~Pp^=s$) zHMWSRKe)y?{1MishhCx8U+|4=A&0tB|N6%-Imya}REvGzfiW6ob>FudJnuwtZ%|Uha-b`s;O8*BF{s5Kwsk8>N<3!Nql}e1H~X?hzs*08vai~J z?GJgD@ z`;TxnNG8pJYpcbB&TmbDe(3pszBamAi*wfbEPaBEI7>1tk+d>|#0|d$FzAc95^!kY zy-|3+7OXQ7Oz_+TKUXK&2P8{wLUqiZa0SNLUqN$)BGl7w`HvzeX4{u9w%Dp2Udpkf zWzNe!m?e!Sxk&X(Kx+W=Y9tt@n$O^5u8s!WNl*1%ANBKktmxD^l~E}rEo3oUZt5au zja0AFIR^9`q1gDUFp9`gVOq$P;ZTPaNVdir*t4M4**F<)dH5k49xLMf8!bux8hvHL z+v8a}>R#pEXcI~8wM_nE0#N36gc zc9G1LG^GV3q+^8-*?Nq=_b=hWA?$ggyghQK(K^Z&eu|o$D*l7H^8G}vG_1|5v?(LP z1bf#4vsVXBoKKd(NMDgc!7Z1|`t=gz%A&bzi!d(N8L51u`^@t@ubH5c3jn}uBjVTd z9)YWaE%G+$`nio-k`%u;m829h^XMjxw60f@(U(jT+d5Z;FGk2SNrPLaLWq{Jj}aq4 zQzm#v@L#&1)WfW=J_x$x0$h<|BXtkHwviz`Zn7Lo7HvZV@!@?-y)HPPJ7%VscnF;v z-(kEhOI;u8CpnLH9NIMVgGuR0W>92=U2r2=~4O=CE!?R{nj# zE-O*y<6C{*jd+({W6!^xFFOv{5qk15LX^i&`-NWwZNit|pe8v@8Ef=VA=S5Av{NSK z<~M6slckaYJkkI880ioPnrGr2+@9~2!TEVZ3$Zg!D`AFKgxGex{R#e2F{;Q*W;q~q z%=+ESt0Rm1?`3@L%ph{|CdH=+o%idd23K`@j7_J5uvX*feC(vpi@)AGrNZJ_VF&}? ziX?J2u+Jlfp!}?mEafcvko623$=IJ}F0mP{W0pwOfU~=jM`&~+b>i*|F^|2riExjG;qb}6y6$2MxTMaEXo9< zAD~m*r*H~LGVh!+Ip@617Yo6t7wo;_Vh9xX78rr?% zu^n*qiHQv{=cvi}u^Ul&w>FPOw7>Orn1_Br`Igf~gxZR?Fg{J0D0WH58LOxTnAINj z^`|_We6-$dM%u=eJ7PhD(3*p|Pq%4<>OJ>#0)=SS@yT+@yAl2!OjDGLUNs!0x1O zF&MD2q-p>&v9jAI(QhkA${Ku50BUgiO8QISj(Il|4KiS9;>S`Z^0#Y}_NAA;n?4fX zPMQ2PW6cWWjme;;iF*nXD0Xxi8&{^_a-o<}$}7@v%#r2N_2o@ZGeqtUDnu0DAoB~K zW9x8P9>V>>XR<{t=k(2Kg{UFAE&fB`m;e1XW@b==-mx_)$w zwGsCIERIzqo+~N)a2Xb=j!7stK|My>pp^!#0Ps1u-cWCh%Qs^~*HF7o83sC%p(rz( zYufkoEe(^MkCMyc^I?l;>NQDG0KgM8|t!UCJ&u?FkRA|(QO}# zJ3n(JDvay7VT$hZyFVd?*glRoWUu5`s@7r&O?!E1wCyVfiVKzn6caG9td`!4Eb{1z ze?5kl8RHt6Bp$G+28AAjsaK~NGi+?Q9HJP3goCfHuFB)DYs|yar*Bs}{{uFI11-y$ z(>_=Ku#b*Y`vL-TuJ#2_^=JNbh&PqhHa&Q$ZJYix)TD~~-}2f)Bq__x&fB45^8mh? zPkjrW0LvGh9g}K7*(#t3wjH&T6G8tDtdUA97p0b2WrDWxk0=9%wP4IY)hrXR~$jRe?q;^ntNAO;a zm8%UEinNimLFce+&$^6CYt#0cylNmkk$&}0{oGFqb*|F9QwrnXP6lFrX-iT1fQk7~ zeN8*p%fwp?U0g(fSE2On4#MMNJ<#niZk%fi?1(fmR#JV9an|CvjKa2?fssAtTv2{6 zyWt1F@!J|xMF(Q@K~Bg7GFIAS{Sx11#o>RDixBz+du5_UApFV9E2c}QQx&>y55BwK z8O5lWnBZFUJYfky$%)R`Q#Uyoal{7Hu-&lFK{Cxz>CC$TH{4=j1i8J-3lFDDTX>K0 zSOKKh?~$;M1)n=jzG^vbLsAQcADBTwht{MLQbMvBRrNbQJ078A+%&)*VE)Q zG#uZO^cxy=OBm2KHG32i3sfzyoM=C7m~@?Ga>O<2xM;CTDmK@^O#NZ6U>jA)`{P=D zUq1r+fwD~;2u)WLAF$8rIFRZU6}jrA#&e%sH(4z4Etz`T$nreWc}#JGok~weCvSBA zwT_icZqi=@Qp8_O&l52lV&VdRr>DOnCjCGV?vS8^EI(M|cWFrKZ&LfFJcfII17bsM z?wr9<>>(x63N&Y9+@w332b!=lNlg(?6{L-CHf+94KvLeCMl&SgZz&J+WLvzIXD9Gf zuSl%IhQnBoNuq%ll1V~+2g@2__BNu>aY=Jk3fMAa@+?xN9%%zsEhg=3`F#$n6}w{bjNO$FRlet2ZUhN99S;h|@rpIDN{ z3)G4T9Jb%XXc<}+>Evx7Xspcn?0_+rD7Aitb+fwyU3>1$&}Ps>&T{3lU&PWC328q% zW!h3Mru3TTe6*+KDEUy{L-~({0xya74IoJGs!}+&xEBi~`gO3Dr`H%N<4;MX1#! zf#L3w5$eQlqWHCd?7Mi-|RSjev*@0)_tWDk8}JTE;BT4ruVl0hSvDYi-CZPyriet#B z$s<2i%bjKH}VZECCiZ%CFTo2k8TwQ=i)o&v4ng zL(|R5ZIPh$QSJ%av3tkF9keW_rH}@AoHdO7uHO1vQclQlU@e8dp4RN#Ry?L_Xwl;& z%QSO2genW{%Zt<99g&lukuVMo10$uJ{DtFoM=;ZT|32o*LUFld(6QEzL|fE92>38u zrIZIb&&Fqkl2r3VI8buSTz!bg1PZ#tK4^5@8%ugl$gq4xzwsq8T+icWeH{|b+)0V{ z*At+#V9O1{I&#*segQ!J!toJiYg^%R)h7&z8C9+j6wWj8XVw^r{#r}A1`I$&AUKs? zGvY0U+K;_Et@$09XhQG36sBdMHc0iq0B}H$zkdu+43ZGRE_j4E`k=YJmsu@8c;#)s z5!L;1*Tq#Mf$=@zD~8wjJL9sO)7K8|dXj7oRqZL5SCcSqCjO5q-IB4fF1KW8CP7~{ zSvp&lu4!REF~cR52>9`MhdKo?QuJGYE-d+S>WmrxroflNlYdVb#Y!0E;gi9U@6kGH zIo*60b+50|A^ygt^%yJBjaOw%&He(d+A!`Ilw(3YmHCPl;LKypW0i)5t1NYvx+1AR zbO9N&M+atlnev=p>4E!YMQ1()DKc7r3w#|1S~_j_d>vNCnTdhrJ8PkkBO1+ zElv!<#}pfhbjlQAATV`(%T1*#P3~>c?6#w)k#=AZ?+!*!K9`iSEXg_)(>x2&61?Yk z<9#3&_$ikR#>amU7=vOnAJy z6^J)L?8zL&S$taxjZqC?lG|v1P7*L;E>*=)XH|_XeANgOfltn*G{t#nyDq-91EOCqj%pcR$ z%RJz|@E02R*8nHL9+>zqK&7i235g*at8C1f=l}l!Jt$g4k3G32p`kx3F0hoSDACNz zMF1GOIqoE2#M}%_~2>7>2uBa-q&D#DMFNA&aw;hrMiO05y$rG5#`nIcp_5(R4nFwjxO)oCttw3FZWd z3X@r$^_5G)H4_(9KM2^3T}o6ZQ%f&`a~- zzhoJ=Ux@ic9}rJ_t_oCM`4|b>vcT^*-Q)}w)Ob2)yc8$@{7{qTaCLIGWQlE*b=BnE ze_2+l61)yR%K)x_=5sPdB!6`)An`RF43^CQhbrZZSYQmYbDLe;@2~!C3dB-NJ_{Bg z!YQM)d6VBx(b)^-&nZw>9{JcLHpwnzipTfkzbq|o7Y0Ha=*gkIA$hZZ+H$If=6nv2 z7-D~a*qm>NFhNF5X#dPNTrFPK9eplVj6Hm|{Gg;2a@wqa_w7L<3=+!b+eoquaV2<; zqqY+i|N7z8KVQwSIW`pG+3a7v`=z|wLKhyWZkoFfG;j~ZU{nY=ZFl$Ms~?vBO)g#b z192#ST=k9Oe}4P&1sOQ~s|V#y$saGl`s4I>boKT77yNsu?nK#BeY}f1TpsuR`Ak3tvt(;+%}STeMMgsX2o{X1o0wAF$c?Gdpv80?NNK?Ap5|s zqSRco9@DH+kNowUFMuG6l*1c)=>ifUnE>*gi7sy5-xN3Bym)>8;`6Un?Qg2QcFx?~ zzq?Vs&Q0ZRye)E5mpAvjo446lADaHsoV&yO&7C$ndvktjn?1IF%k2B+bV>)BbNjw) z2OfNP+>~|p#Dm}ebbrs_jr)j=iBVk%V2kq7t*@6 z=Wg4+V#pW2Ul1nqCSU*C<>8iF0f&HpJzGFwa%)Ro!12(3;#0QFPPB7Hw(rgZLmK`W zaL;u{$XUkc!=^Nu^tZ>up#|9SkiN&NY}an!5I=O=@Ze#`jos76WyjO7vcaw{b6d*> z%b@~2c>E&l>VG;qcp?PlHLie1pC8);w;KK#TEK0`ZQ9CqXb-qJ1WaB$G<#`vJDAd) zKXUIaQ**9=Dhr5e#ebfFxM!e$eDeYpz{@DT$-SE{L%9iGq^m9~m|p7X{9p66&8dpq z89BT+8>O-{tqd8s)Gpg!`g3>cWv7T)07`VGeHK{+o(NRJ)HDwA6R>mJ3m&8==4uby zkMeWb8vF3_I&`uVo8~mShKs>z#I`BYB8Ed!k|h{x(i!694VQIL~b{ zBSdO6)0NjBFHbAnV(TjR#xRn+iOOUT zxQV5vO=JiQ2Vfl}0ayx50L{l^5a|W*l1q zX;yVA`iK==#h-G1La;ot=VQyccMn5f{`lF(RN26glx*Pz#PU0q0Xv@YumQRMkrs@9 z^V2V^;0YqG(z37H;{^l`eym0jjWQp1SJcTzhDU~kp3Z(LY@w|JT6KoiBuv@2yN*^1 z6Hax_K%$r$sp=I2jIGkg=nPhnbY))oYNkgb9aY)gsR24DgE_#~ghkN=csFc=07hp~ zkk60Dp=FADAUfse_*Fq<;MVrd2E?X+5bwWn(xtrwCD;$gHGIKHt4pzkf{+DU1U3~7 zFwpnYvqcE4AT?;Z-y2lLuW;C8Z$vTw2`%=P-fMF^RakHF%v8>=B|DGiB|IBgu-3C> zX|zYHU~Y_ztrE(Coe2~&@Yw%chVeui0Salt_n4&PyGju)DpQI0VF(i2*BhIEb?@^( zw-NXnv$PGj{Nj&9=3+)dA5_xH$(BAZl$0&RoEX?Hn##ZD_ zG|Xi_AAWn{8401+BTMlB$bZndJoM1^N8G;WB^7Cv%?m4MRu%{)`txja91%ud{0lFw+ab|BbwiWeTK&=4z#(-BMquvc;hj#@8}ono?ErUFx| zTp1sP=2Y2{pwzymFX{@dkX#lj2Uf-$%7 zSfS zSD!c`;1(c1HO1%u^@xhXFPzZ=(ZiC;svJe%I?~`Y_^O&dv5d1egtG>j@aJ&WpT=2% zHSA11Lwd?buv31?R2B7zqjR^+yX-wt4hx=3A8ZTq9Xz>bDx=vqy0A9(P&lfc4(M^JO*JVYvxSOI%;zX#?HkAl|WH~CVO?>NeeZUs*bzdnQ% z-oeo*P#5hmG^70j5OUSA!OB?!qis<=A&8A~G{)|1cFTi_;KnIC@aIV*vN%QoFE1WW zotQu?Voue$QBF*M!EVpqlY%u~u^9qIdkoy$bEN5(dr`I+GRZ|O1Q}sK5!~_WurshQ zX;1Nhm6>5y_}n-p)IRrKLGAejo6@+{f`Tzt#UQ4hH>D%*+4zYi1!HV*VB^f=pwNq8 zLxXD08T$G%s#Z5eQrBP)7B0wHk*MSn&)sLm7B0J=yB&jn-Vw>}+1*0-cw%=0Sq-95 ze?~=k*oC);{dl;DYNkoxV9I6|v&fdNbZ)I|X7E2jR$R+cw4gbj0IlZXc#-D$nZs4k zT;TEORpC3Y*1+)NnmeLBsMp%f+!3uXP}X-dmkGfq@fL|0N^k~t3@=ejV*?18830Ys zfoE;eGRE+KCEE_i1CO^zhiq#e&hm^%W1>nw!`0TgGo#qS(CNPEdk(I;rLW+eXE0jC zs07g*g11b5mKQLFW?O#MWB2~CO+vY;nQAQQN>$qxzShR)4lMU&K@E~e=`vU}K|lla zM-oa`3K$jyBuh>)jMJf)#ArAmGy((lOa9%*;2Cs(rsRMj7&f7ZOcU!Gt!k~ofD%J> z>O&Nn1Ye8MbVn|0WOU!{p3&VL9n1m@d3;&~&0%htV`M7I2Fo@gaDFi8!=}K<$a^dF zTk70PYDWTs=QL=6p3mY=t!+%3yfcz>GWT383Cey zM{ER-9os+yy@2E4LVIXWjl?dJbww_j?T{_=B7|;dK~Kx3G?;@z)YA}3k+ozmY=bO~ z9`mB{!C<1>Pe$ckh{{`u%HKaqNIiV#yfHz}{&V9|u5>#z@;~WxNIbn%7$y^~@B^k^ zbWu$L)7al0_eA_2*JL>gPz1vo#=AX#sIybw?#Z}8CPgB=@)iA|V7tPBGyZ!W?nPpDdMc@&ue2MHN$Fz;Zi?;hyj;~^ms1^G{x?jVl=#VQub z*yCX9vepNC0Q9JA)eb}pD8uH0GF(+fri$Wj?&u>1`;JZcf(0%sp2+YlMT+QuKyeQ< z3)CpBV>{x%Uo!wnR~IvuoNp(fj-&)uX%P~8Vj`8%L^42z;MjCK6o*FXQN&><#_m&* z0wWXQSCjCg`M9TF{pS>9;+pC?BBg8bUUx)uMl=zP zgG4=nW{j^H15|oJlQEc+eJkgG3)ZI!>BEs-O=Q=S?ZVf@^d-m`&>CF`%$7DDBJiTh zF7m{~<%te!kV&jbv2i-#ynX`&jt$b`08b3S(#7l~zG)KuM=FS#XTHw{<1b~R=kH=7 zGe#moR=KT&l-YGEQv(j{pfLnAdIf2G61E@&li8RG`by&LVl=3@2OpzH@vJ=9zr0uS!lZr|M1sQ-EBdU*iUJb!qU zcwwo->$?LWZ^>C-qX@8nPcd{!_@jXQ4CTO(o;pz%SfZy($bRfNBNaqCi!L!xt}(={ zMf%o+e6-ja?OMR8#yE*M&`oe}Yz2GM440TPw4S#f1{(Rj99Z=Q@lfHo`gX^E@u@v~#rQJe6`yT+ zA&8}=v;@GqFsqO#&oYu8!zHqd+qNfv#%m@Rl>F4|yYrbs`d}yodxb~HX{Uk+N&;~w z@vXt!xdR)Ys{I=BA(Q_gInD_}k;?RsE?Bo%q(Qizgg#8?>3IW#@x44@NSA5r+p zE0X9jKzH4L0D8D(VZOU%;8=qY3jGDeT42^czZX^+9z_wYkj13fj2$88vTrCU3XR_*C?P-S zwfjp?J`nY|XoD7kU8ZkneEIY1Z@;{q0kN7bsQ0UX?MsWxf^-x`d>Nz&1T@H9QgZ{4 zpN?<1QHai#2%kd3so4#Z6kIS5%T%wSaskVP^_pe97Ku{LQ8gy_J_MvkQxxB7D2s!? zf|AxBs#4T3)IX_Lx8+a&19K1+7t%3>gS-wXlP77Tw$uqyedU449)q%Rt$T# zX_Q8PFGuag{)1s*uU1OV9yzr$1lx$Ja1Y$8ieCz_O!Ui$)*P#{$g5z=JzUt>He-NE zk0o$sEP;zPJaxcn+qcc(uIIFyMXO}A<$KxW!^GGF%85EmXL^-0iYl*zHOD5etX6ZP zf-r^YV?k~Y43)|!92qVT!&bb@2d?{nmI@6VjnN*Q8PBQBd79Kq%#%#Iuz6*% zSkL8ku3$m!H=@f(>&VtDJUs zs9PA!$h9E_k07Gjmtr#=WFGUSkG8BIGtzN8-SmsoaLJmCx7z2bn&!b1_pv~AArTNl ze&1d8w^R2Z%BEUm6V(`sQJBQCWn4m(lR{ z$X>8uF&s(vtFVD8t+H2+s1Pjy#i~A3kt*KjHT0Cu%UDJ>|K2NXIkw!ekz%N7JJB{c z9s-%8)re3+m!>adiRRh&h!_YtudP6_6shsUUbe7Y%Q+9VpbTtV_hY6 zk%^TRdX=cX{DlM^$vE84#dcF!Fbt&5>GGjyWWHs=uz--jsyD>ui= z+1!}=s+4*j3r(YKFu3TVCq;MI=_I1^0XMCY<#GJTrlI8+i-oytn~u7FZG};c)w!ud zl{&{=wMsCYB>Df)%u4OZceruDN0MnJyAumz-jAlKSiw|w^^R|4V17PLbwxyt%B`*! zoQ5J?rz*nU>_eF15S>s=cyXe7FEy{T>nJhlh8^BK0Y-CtRv(P1k2CDp)A~h~5^PHw zQesY0Vqb#;e?hws^J4seqJM4Rq`=by3i)l>n5k{F6ks3VO9uAEiiEr8OLCS1tqx!0 zNkQSg4D1L=wbpat^SzAMz6_rMRw@gcbe<>z}Ves(j4c?YXy$5KRjNCp~y9dPf^%1sTf{l+=(R$XUp@m`T^CRT++amLu7 z>}#T1GVV1G2}_%Qh!&WGIS+l6=r?|)nabPA1%R#{)?}YHj*|8q$(O=E_T`NuU*7n! zGO)a5!1EYJ!+OCnu%Od`xf=uKX?%tY5mSvlO9{-&p(3stZxhua-2FNB)Rl|2EEtqw&Cbn^5hz#6<)>}uZ6|+>S`gWju&G|SnD)kt5Mq2Q${2xa{@cr zDAI>kZr+mPT9a@^BXLr^r9(k9zJa$+`=GSPD#CfF5zCs2kZ@?EXfFgSDuCyyC<~SlWAscXVX$W0`=e%Cv@B zXQ6;v?u=t2nlRYu&is3P7(`WbvJ5#BoXM_^;AdP0p9^*+ zqPl2*GnN|fzWAj?a*>VX6|KkJXxU(;;?V9w`Ka7z4Yg8Is7Dg3-w#3hn=%o!MN(kWk3N)dlW2>4VsU{ZX3d+(Ni zCk1Z^+q3d7fXI4Qxm#f_BwWK7Vm-f0V~k)D_KCUP^EfF7_~qN>c$vDFe=;Ih^j*Dj zv)zTTqpMf`Z@~hdmS7>5tWOfllhb)K|6L{i(f8nT<1f!LEl=)}=r8KkUKze`?I%sN9LIVKk z;9zaHri-eYb5m;w7FAw_%NS!ex6YO>T_QY|TViK+#~vV6%@_0ZA6%U@-sH;7zQ1zG z4c7KoUdNxh|NhO;fKkG z8{-U*Z6g8R80md%#<$nw+mkzgv6GC@l{tz@kZ?WZ{1N0#)6ZPEx?sfbXj8K-W=i_y z=u^1xLjO!;;^W2tX)?WE{wh9~7VLa=|Ki^-)ci7A?zO$y?q9t9wYb^A5T1yt>zikq zxW6%AjyQ*p^*3)`{Iv9swc@1+(7{p{{&mj(1ncz^9D$H$v>!Uoqs);4nNb$7SwAAhHt$=;M;ZAy zUGJpt=3Df?;Zox^mr>&a69F)jq4yI6Ha0glmr<$)D1WV7TX);GvVPC6&`Zyz){!Uz zAb3fi9LH(h*3HH4?pZtS10~TGcO_C0sieuTKXU^`Qj(LjeMp2G!NFiI-wZ$pqlZy2 z`tHfIyC<_3Dvd{ppGHwQy1O5#IQ7FM8pSs7!&Hy%mZP`c)%$F{&zhoq7*9=TyxV4% zXB#YQ?|&xSZo3^>lRp%B&7JqvSf}2OJ8xd!-EnjEK9{!Fzg%CAf4}?TNgyQ6UW9g( z0y#QDasoe1pgkC=5fEg7E}i&cWJY%zpi6x-o~l%P>#DA~l$A>^*dTyH9C(}hVJ4mP zYMgk@c$#=CZrJSCO;KaxZmd085={ccX$4Pmb$?N9axPW-Mn?6Q zFZTm2?~fv1TQ!P<(6?6e`+phhz~kvdlghMMBDPa$nXilYV{N>ACw-fWn86k1R#tM& z{eR}=0x1r>kK3{GnxZPFLvn;2QL25L3OhDgvly$$TjjtO1M}R$i!NXN@7+&O^=`Qh zp5wwitAVyMpSX4%;Y(&OY}gSH$9^58z5%)Dz3?|}EI-o|st%c2rM^lAkKu07E5G4i z<{Oq^)hh9d8U_B$f|J0HLg9Y{>#N|&1b=qkkCR8pho=$~^`HJc^(mBN)qjeJ#}@|Q zOt@5)3)oE)yWPyWIS1(nWnFSj)(9oq{S7Ft_CPQ~FPC;&H0WAREAJ|%tUOBmC=nKJ zvjtA@$5_DxV|a7@EeH%Kd`p53QOHz^FHs)bm#XAJ^L?>i@(>ZghC8;qaqLyg{eL1~ z_NJ?4LZlt%skwJi?O~oX8)YLuHo~-0EJLWkN}%W~g-ggm$Ei$;jGbA-4ZvM)5S@ai zc4b&`gz%tczRk;}jKf8C#|wEuIG`^K{Wy-8zG5?m#jo>CUZMpGJjX1s2E?ohE|}#r z75Su2kwENIej5K4Xsi9eKBh=2hJS&&|Nir$*pjVvUm(TZnkMZ$W&1va=vi|j3s3pM)>P-6>HX%zpr19viLdh^|r(Oa6q`nKnE zq#1YlE9Z*5=x8n^Q29*jPi)Cy9JtAKk;@XcWbvUD6a-B#`I|CdbMJirTYq2-w4RY% z4aOo84x<#9BPYM=TtxLs2Dz*E#ITp$ef@(unNma zv1f^=QIyPMaugXqu>)$qz#zwguZ`(H_AS5j!x)TjevT^vfEXpxQm@ENfA%2bv~(Xata(hK9^sT5@^;Q)4^fX3Zh-+!cgq)sER&_ z^&u*QAM$BNdTLfqx1ICDcqLm-V({8E(!|8o)2W1|k)8oKc)2_f=0g#AMWwa|H%1_7rU~ z&P8j0?S1{n7?pN_J4tO!3r1xsr+&RhPeg=a0+ESL4^o+fiDPAFSo8rlUhF^ACfvxI z#_!v;@X2YvJ+Sf6Bhzg-AU{NiY7ioZaqNeIaP0+pxqlrytF2Q`lqS&Jr;JhdwKzUt zUPGpCJ*~?1m<>F6Il(wRH@O7Cfz8bz#ukq{HoARRS22!lV;EUK3{z)wm^t9na@k=G zjBh@InaB__nZWIOvF1JuY|6z)?#tu>h}n^X_a9{pYphPiEW*f5wai6Z*bq%uVBK0i z#sea)@qfcKJTf;CnH!4bVWIe%2{&_2A__VBN0aj{caVExiyX$M>^ii5SmmW4N&e}_ zW5>!7hRU}_c(?%U$+8Xs{@wvXgy60JCey`21rDwvnFnz?vFQ%`;3Fcu3gJfRP3M4q z&N-4$r@l?hfM3SM#II~l*%f0V&zK)OeB!nhTYna08b6aQh$@cEW3(_FOERAEP%!X0 z$3z*%s%)aq$sYtkkrq#a`vJl+9bg2j+~N&kOXO8nx=0ec=Xpn$i#lI^D;XbBC>Y>o z?qzolYC@SHmVK~S=ipcvSU-w~Y}GLXK^<#$(NpK0A#9=~4A7ddrKRKFVhltGfy4)h z;eU__+bkGT)YY0|(8(F9Oltht`Qp0x#GXxcYy?&YW*1tV*;P>+Z44he4<7+(N1H=B^{YW`LW9<{<;!B<*Y8m?&y{Ng@&1spJNrt-u_{=-8Vdp;X+aJpiS0D z4A71KwM75ecrcYNiQwq714c%vp9I24RDXSIa7Gr4kDL&IpdJ(;CxZ>$oEb1~G~;C| z3L=KmyyBIn9GvTc&kY&r;v^2}T1=oi?LJl+V`GT-B%ku%swf-hAyjJ6TOG=MxQtDb zwl!Vx#N}mVZIhS`fO#_1pmj{rLj=WVicjkLQj4^)NX7nT%Tmenfx}w)F#I)3i zp9M%sw8x?j5q2_C3PMcWlY5vPv;jh+kTd!(fI)l4n~#R$0vU9I!Kw)19mU87>@&Tt z&gr#mRJeVK!73J&vPPG6p9B^1d3*0y1@yC%CtF>H^y$p0TdF$N)hyY%B95_ ziiwOA`$vN@adr@P5#{AMlYgSp5PqXWULI}4fAX?gN&@Qb*Q6VrK&1)1sXw>rXCS+z zs6d0B=>GWMeSZIE4A;cvure{_3ZqZSYz??BV-E)M94u9d_FXnXv{EoPYlH;h1j%8- z9N*0Hi7yj>ha{JrOArWw^0;3#d*`i??rwQq3(rs6Uo<8Ija4zQK7SQTPn!#ps{e8V z(Q2n0b-_z<%7O+*eZp2vv#p=bW)DTP+RuG3TC<Vr| z9D4#fQr-%7byaKyB7ajj0TFpI-yhB}Bp^vy3Rn!?D<89I3g}S|Wxg1P;8Es0`=Y4W z-#*)op>+Y~X2qiY^n|tKRQ@HNl#w{^vvu+5paYS21K~v=hy&DjT|KmBEwtV(d0}{N zdK@bP(YT1zSCRPh517wo;gs30OA$&V5pKb7rbEEMALZT&nQqPen zo;c$Zl_2GZq9ogn5jxEw0Ag^O&FDCZeeDjjPrLwjPF^5U4hLZc{YXsoKm3E4RCq|T z8~;ZAE9wKA{hk1J1hFS_+FAhXb`%*@gjn2TzF23p$p?9&tRnmZ8)G&w)Xf|gKYA@P z>dxpduBTaz=6{XPImE1klq*A9NH3!v5~dP`K;T3m_5meCbrLb)f7?Brw4CQ50<>cqHY3wQ z4z^4Hnb*ZbIdoDjtq{$`E&;$` z!6pNr$Ks6b9gt*fdgL%Cu34sO1*4rxrs?V<2h28UkC2d~@sLaiT4ERbi;DRiw_V6Q z%rJ0{?tf6&bYU9RfRhy?+_3B54DW8jyNmT>6~_o`DT7NXARWi22`$MG+9WC-;y4wO zYv3dmROrYEelZt8$PC*`DG0YYgrtEM@IFFX?B%Fri#auc$JE^BRb+-kUVca+XjI~i zbxTy&tn~7&lDx^?RUhOPaJ7K2`_V|uu%ffuynhF=&)G1552}ydF&@g}ncMxyP>!Hy zEZ(Z$`v|bBeL95Igd-bAei93QewMF+;tAi9xbY`^d*T%(c*LU^?~QA}TUDF7ZElAH z;uSyH_(UXYM8nyf-f{xi_|9(044rw$Kk^U?161;hz3|cpD(n)_VqnbnX?PZW9iDh<*kQR!nk zCXlx;H+m>H;TLSA2EMq&$>plpPuN;L_er8KLHR>gl+yafmx4-@6qX+asdsS{eShIY zXo*bMuVbYs`OrG6r9lj41kUczGxW}mQU#Q{s3KcGR1WHqGu_neHDMEtY@$Wm$PpZ4 z)=C^TpR!;+sw$RQxyZYI91lAv*xWbHm6wvO({YP4tXI?SCxFQhqlX^FQ69v;GNLR$ zBW!XL+U|sS_9-{H@M!e<_W94;bbrgNrP~3UntN3|;ZB7B7d3hs0Yv|svgouX#9In# zKsku13RE5GZ=Wc+p=MYG{)33f@w&YU8%3V>cr{K{ zJ6rC;AG}HH8e!K1l6M7)w&XV6P%Le7zL(qjgLJqoaOuV!Z(jpmOMkq(ryL|OP-Kb@ zZk-}tw)TkMYY1IkxFz>|;MeJ9*h-t+RDu>HPQs9)lviC}U0q43Y#d{=={a8zg1-%o z%Myc2qFe_AUzb(sK&ZQ*g3au+QtwwZ5e4QS*A7lDQprGc>U_~=z3uSs6a-{P0ZI@YM@5ua z?pZz+d;zb(5k>9}>yLD+_>a{e1+oCF#l_fq40EyeLr%U}YPZ}R1182ZGgC5DfS%{> zfu9SBTBdJMM1QL`MJ&mF8FuMrx+&^4-9%xl+9hIg4)o%ob(9JKgLpPZS*8zD@M{;+ zVc-p2xdDd-g3S$B0#w0W4Y$ZHV-vy}Y=U@+)||PsQEY4xG>#Obj$j+_6V%*Fw{ZA~ z!hIHT#@rcjJudx27B=F0ZP~V1uH6N(2(w@+k$c3{{C}R~Jm@(R7j8a^(P?|YJ+Wbi z5wGZe^diskl(ptIN5UaL0#6`YPm41+m^cz~?pXKykSo1`h=qlF(O;o`!itQ5Bz0$AR59N-z2tu2*9~_<7O-?!Yck{?5m>~HQ zo1niSI56N|lEm2rP~iRMU^)B1MSIWlPplC8bs}uSV*I`!jioW`;I0hcpa+I6`E$bg8_pBk z=n#cOZ4_eLC?wV1ZMKnIQ1_ztlD|=@Wq*?1J#v|CnJ)^={qhAjhEX;;TrhDb_(uX~ zfb39p{9`8sYAuJBOfGj9kC>We(I%ps_WYMF6FudJe;tE*cMQR*+De9_8{O#Lq(-2slIYITQr`v z$vxqPT&0G#c|JV{2sQXYZ3R)SaiG=C5?`8pL5@4KjBSjkOq_!jTcIlYcWf+G4#G|^uo z1}BnL?ahalLU2>Y9i`qBvK>`>?SO7jV1^1;4{SNmoO562OD(AJ?R5Hv18SI;uyox7 zDy#jR3+}8l>_SnfQ1ao7VOKGb8412S1(;$8@{h>pPeCp|xd_aJ;ejUX`hOm2!dCEO z`@T(~Io03IleITCwDpZi`s?8I8AAXKVPB$5&u`CW>pa_){sz{Ci)!csQC@N;ZC}qa zSXn+Rs)qB+z+qPjvBIr#lL(sX{T4iH^ObM{I<*=|R{VLVgx8^5CIEuJ6`46gT&aLa zDEvtJ=*}i<%EiUW0Y=2B^M6ob>~8Wx8(-0ff&6`1>he}`%I6r^qHnmsCKtxKjXx)0 z;6%gNT>f-kL7Pmf)U5H^#yTNHRIBbRn>jyIEC3fNS+`%WEeHP}g~=${ghFicUMdNiK66Z#I>!LqQc zotDD#LX-AHhsOQoXwXT34n7YL!A-^P>omr5nEK+RGg#3p)_=lMs&9N5@Jj4CW!P(J zymU|9g5O_B} zT~iUgEept+BZcWZ^apr|<+`ViH2$J3^>B!$ApxeiaN_H$JH82m*G~Z#{Zm#)Oni4) zPN)tR9`EvXWq)UxHCeOE7JuYBzsQ?=GB{v~W@uJs%UyOaC}9U{hjrI%c@8Ic(9TWx z_o286JHJL8ukN0_doui(CIv~eqs8XQ+uwuH61oujL$EOVKm#|U5LXl7W9!lFlh>#I zE|&WW0n`jRLf_E%4Dp`rFu}`z*aYu?$^~PX|M2)**hVgj^o{azFgE~73zyKW_w!BB zG<5lE=`NThe7iC5uGV!9NPWkX_KA8sH981WPzwBt^+7&NR#yJX*1goDA&dSW4$NxL zmjOrx6qlqi1QG=xF)=nbmr<$)D1W6^O>^Tm488kT@JP)>wD=)X$}Ms2blYT-T|1NM zxS1VArfp4S(QC;``|k^o(k4zb-NRl?05rh|-~m)ZHY6ceqszr;Jma|`8Oya+WU(gP zSNJW%_fSal62l3Y_UUG(3@hvf4fn1c2n6lY=5p@ByxHP zn>U{qi(q!owzqx0|1^mn7r%{?9@4OmXDTIzE9N3&fQ`gLutekm*HZAulhY(& zc?MEKIMF#vwIK!$DlN%k2M6Y5#5LU(a68ZG`YehChQNB^cK~kdUYQS8ktCW0xWC$B z6}xp@SB(vuPqix}A?aT}2Y+a(ny@Y+K__=XE}B*Ebh5ZRN63Uj7_Uf0Mhwqb8em>D zMI8xF|B1MuZ3W3xN$&)Ooh{nq0o>c2ZMya>SgYn71xfD?k*2P+b_JOFvu+*ME{Zd{ zwL$qbolb*vRl6s+^1ryGASMA^(gb9SNF~(PwsgDQv8hTRg=?_bB7db5*Q_HcsrAsB z(gyRNNt#?;N1WbXPA5@DZ*PJf(+Ye13{~yHoQ0iv(F7=`mDD)^F@1_=;1KUAnzCw3 zhowprI>GW@fVtQ2=aEdnkWwt5PUy;2=YcVdXDQG{^6+y20=+YRK^F2<6U~fK8fmzs z9R9_Ve0+6%JGs4Ko_`xs$`cm8=$9#4KoZCY?be4yfmc4i+%r~G7PVeYL#Zp z2o>OVfvD}?VPPaX5h|to1Mt#8M|l6Gs}Xjp>1_l(a54Xc#ZY>{0a9qbFv76+>R_Hg zFIHV=?OD)Qu75n@VDQjRGbs_80%)2CXoee+8YCY>tR&+~o^WR6UYgn! ztFez@>^*+nee1ff__%!icC1RaU#)+>FV&Cx5?+{0>VJWnX-1D&3B$wS>E%n?^!;kE zO%*Wq?e@@>Dx<$tEp%OYZE`HFw@V}ErlaU_4(nGjxP zdQKvD`yuHc4iw%$9BA|2VSOb&C=U^gQv1};TtD{J+p&*k3@AwW06aWA^s^o<7s&9* z4g2urAAi>AV)Sh^gphJ36GLRqj7&+n8!aCbvVtvSIL~wP;{UiK@Xf-s#$z>^k3N6& ziPQUns%fJ`nP>g`et9UMz33M54H0wd`(Zo-|F6fFu}Tf*3aVit>5!MI=|W)b@d;Zo z;*g%zkhshb4-ltyYo9B~lXrRwY6&l2qH=nN9~Ml-#s)lG_a98_@A})6L5ltbKeQ5=g!) zC?ttJIe0b%5_v*oqa}%yFlx|2WaZhCMK&5lp=3uu zIgvvFJb<9N0+HE0U;#NoNI{`j%oZanNW&&*1#l9WrLn-A4O+0aoFmv5sWeIx$q)*B z5`UAOwBlC{6>+5rt8n~ooSryOpm3GntkuLIM9HzAGw4?a!NP4B%4huGUde-3SzF*dapX zj`+!%35Ed>IRxm?nS*2BfDU2G8~cH8aDOOpYZ*)f$QOvyMMBguGSqmIiXEY?N^bJ9 zkocc0R&yg#0!mN`0xUzu4vb)s!7j7VaTc%o@5HxIsPeY4;EyT9W#Je@@kJR(2sUP* zl%U%Y79vUmh9;<#K!f2i2n5ARkqobZ`|QYC(-Y8Q_Sta z2)+xmIX4+p1;IIe*<_Wlp=jEIG7BpzR{3#hJ91?4L#Z;`4%GwPYXDI|uD_*%T@Xq` z&z(UHZWEi|9l^m~bJ;}~g1$~F8;dg0Ru6w`<0!i4b@^5Y$k;eTp(6A;@NOx*&Z+3c zZW(l9C`DJQPTVY{tH9{DTZ&%LDB7w6x0Fn0K)ulZS{Za=D7`LJow!kotcUMA#phnC zc)yxFcra-nl%t|z7b*XaemJo@qJS3i97KTq19r$1aCw(EcS z3BI0BPd5UVs^C3(w0tXGiUV$=0}JD2iiL(1d^KqvZf5PGgR{t!h7+)IU~HH)kEg3Y zxAW7pPN+%q;}!UMknHb3spie^s!^ru4oW2jR`i1A|5 z`~@;qJ@{=AZvmgv+xFlKfVKyx09}6%9tqmV0?q)29y|sZd$0wVdhirro$UL1V)%OSY~6qIOC{+N zU?t@@L`ao_-`h2o6Z+{PpZnrz%sZYY=QI6x__A*)o0*a&B+9@~EzqV_m6!Zh->u#?{yUMKp-(8J!ukNX3W2J3!o}6Z!kj@5Mz|V(=8B)=K+e)r_v5gsODLS!JLY04edEY3#tn2rk zLcQqq&hPq~hl|CsgJHis>Pr2a`Qn#J^Juv~Zr3kqOVq38&&{*u@k?DQu-xse6EAI2 zvTPWoB;s#ocQQKiU&$N{osD?#Ks1M8hJA7gFml1uRo_ z9-m4M!|*F|oX(ONBocpG8JVV9EvaxCZ+O~U$(hZ&R=&QRFBZFWJi%bS(G|^)fBy%R zNm__I1}iOeXK{Ic{_4HBy2o`+IuP+eT&sd)o^~6uXdW-mm+Qmg0&L&s`LyfW^+K4w z`qkU+>0vkRT2V~A=)HegJTPj`A*{)U&GZe$An-ozZ`P|E|GIcJ=$v?rVMc9%{V?Jvr8T zwO~2bdZjB@I&}P;!4c9%m)OI_-$pe{P^L2HDjl_L@-dD-fbeP*5* zVZ-`Q~Behw}8nYLlkcG6&nNX?C6_E%d2y9H-&!DDSS=(o~nfB)$921>ze`{?1i z)0V+HA<`{w@)MQgyq&HW@?t()FE@Y7ldc%vc5!gIX-eACAa6NZ4U|9zK5j)!`wO$1nr2 zFa-HCu-)=hjJM!0(jXTuFvf82$lWTt3D`JS)F_;ZjRT}lkQ;MtxlHbzifXFia$r~V2SX#)b{7JM|x&FZ|o(1>k}NJI`^Mk#}o0A z7ieQoXs+Y-r!E#UN^Tsk!JgnR=*Hk`FiEM8jJv&AvOLYv~`J_^?%_11ADZbWMA{77Wv(^lt^$hianvF+n7UD=`WYs$6amYHSa%?>gIiy>!Yi~zJ zJn6L`iHx}1k0d!I8E+`_zw0=4_t{)#cGSpyTD6#rbl2+(aEsZc3k@ z7#99S7y1)js9YVN+0O7NEOYsr&n6SXeqdwYfnmmx)2GMpU=UM4;U`XR7b4+>5I!< zb;hW`ohfgz>ccq_|agFvW)~I2oMP9Mcxs z`VkVT^_im6O6!V}cx+n+vs;*ZAy`FuBOHl|`=p;*D@eoa&;jp=fGHJaA2`&*eft%+ zN^VW%lKnZ&PZ(f>XdPCWR9AkKb`y$xvtzrX#QK)RW00Zm4u1c%yh^a#s7!PG@C_7j z8w^l+zMA|CIWS!2m!Zf86qlO41`-u9ATl&LISMaKWo~D5Xfhx%HaRdbm%)Yx6a_Ij zF*h)iL0Tt&oOcCOoL#mh?(R;Z!QI{6-Mw&kcXvW?w;;jYA-GGh0KozTclY7%e*Gui zGw;o;S+y2*_dRm=Ip03_D=0{mROyAy987=`4)(6}%nVFC0BL(u2YVL>TVq#aZ!0!> z6`+Nit+6xU-NwugM?s-x6G%2WK9Dyp^e?G0+yEYH9532!x{$b#U}@wz9BvZupWgveD$oN;B`Cle~1{ZS%d!Q>L^?QrO?af3T?CgN{t}bxQ zOaL=0Q&)fq(89_dj`6QlYF_UgnE_@%^M7J_V^?P@Pk=5H0}~T7fa$N#-z)w1R+u^1 z+j{+WS9otOfKgONM^agu_PeUo!fabpB!cTRs0{)vo06;k~nKft^GoB{tO!2i^Rgt48Kt=In+^B(e_ zo|?da694ZKss1TcX;JlcwtsI~xky-f0?m}HTum(j=Ek-zz<=(m|5c2wl|4|& z!NuyYi}HOW*qQ#rrej6y=U?S06pK&W@NB;aD5K}IJ&v|y?4+V?yo80UQGk{U@H(~`aO8-V207kjr==}uw-{?K3;@^ntJ&W>h^qxia zH(~=Ys{KaqSv3Df-0#TvH_vx}Ph;2L#`hvjexvsTP5(yh?>18h+xOo8YloTXy)Lsq z;5#MYZ~ymF{wasw4lDph^WP5doXxG=|A_d@?BM47N5H#_#UJpUt>xd4?fq$3dO2DG z|77&OXY~hs=V1K@e6QW+5BOe@?H};HT)W@!{rY75otgbT)c##$f7suDt9AHI<~`Wq z-^}mDIQ}-jCv!A*2HM*K&3`w9jrqTJo&T**Z11ccfzDPAfAp65y%SDXFlYvujSe_S~(rVh@3f41Sh$L@c?_cnR_hAi(%J^z63r+WPX-&^SYoAY}nZ=mx( z8T{K=o4Pr__t5npFT3}d{}(p5dcRnJKu@44-14G>DQ~ECeQ4)>tuVd^{q7Wp{gs~- z*_HcRp1)iN=1P3>0a56jO-V_u1CKW%Xk!Sbb+6K%3t8~wQpC{i_P{+3*k3?SF znR3dBPWKJ*PBH*y!C|O)ScwDGlw7?=cz&I6^ulAYiaEodEA*5>^<&B@LvTKF5svvA z|76l_=+a>M=H5oV>?g(X;K*j&y)33Q`OO@HDSuW_`bg6G2;6Bq=Hqqbi#_hBSP-F1 z3Ec$yM-&!#DRIkxT`2fLdB&AtKIwK)%O_oYoE4WgcwD^I;M!cWtn_kST*z&)sV(Qh zE9MZ$_Te5Spi2@n$pEM?x$my!CDPipaA!I#qLeXGGGIq8#2_mTQ+XMl4`W6*Xn@?r zl;WeUsA%^-bA$?R%IHy%5$WePAbzysZXb%5wn#q-?r1cB4`mkVmTlI{^pU;~j&zP$ zZWb0H2|NF%bcyph2_u#o~r2N9+KFg%iS{pPp-b5El-!QAu$m;q{sM# zcbBQvRBEa$T1H(8Rz^PbsE^`l0-IvXSptJqNtfC%KRZFIVKYg}@B-GHp=XSZSB@K! z9=?LG3$A7FRn2dz0AVy2E6;5GXl$=aL6W!`v~`$&_q7>zeu5jOU_qLoSGH$Hw2gVP zo?QCCj=N4LH)w?hahKD97kcx8aUS-2V5{eGY!VSKF?lt0=Ag-kr;jMyCc8Zj?DsgP ziw_*HBGh6Al9zh+EqYk|rEFQt&L91EWE3IEMD&byqn#t~J~s?F1e2GjZ$}9j!{G-| z)w7DiJHl-cjn#9q4%axViJ*RBtfXgC4STQ-aq`MNQ`csu!$+(o z=d*%GaE|+6-ySyDb9j=_kn8bkz+t@Ih1|H#ibzYQM+K4ALTi(2e?e}BmYYmHa&4SC z!m36e#K(b@i&vn&IkNU)Btv6bg!{UGXx7SWVUkOtTQvybiCcO{K23nHL{b?k9-4u~ zs^UsF%bF7WMin9IYQD6-qSpw@ea95p4SJtTF5m*E^WDV6EaKLV7r zi!&k_Vr+x)&>^tOw~-_+mZa!G^Mj2_&`;7a^?v*XM`1hDgJ6~ zTV4{LiKm%4$ar~W8mVvC?Ckk{HPrI# zlOy9`n!fU1IiQ%+-^89s`5J{S^I5mSD2PtVjKDx^#y>gci+-lxtD?vD;)NX!wHWR= zgH!_LlAhaJerR>M2-U=Ssj`lL`4oiIneDc$Y_uCmxzDH5qP^-a(K0X)NPQEkWG;XR z8)D}+77)E$nQH!$loPTM)~+avu~_OT=I+M*^@U?`gN*d)Cf&`=mxFUaS-S^`fR&0# zAA_F2m`Io*AI}ECV;~b8N3@u#`Z`e(ItFT_-15@1-DeEsFcF?&&08pcm!}AZqeig~ z_zH7jf^oYtx~3paEsDqukRIGeDBeA7=SYcgsTmMq%YfbAPH7{zm6b0%!mLT@ z@e-zx8Q~JBh7J! z2MrovsGe}DH$aLkQ0cge1ulm5yw@uuNcMwp*H*>eP2X-~cYoCC3YHLz)q4!TP-PI& z@8Ow=$>ZhGu9dHw@B71wXC{6)60;{Ke|oW$3o0JvY=4IhmwZlt>@enYSlW;u*`Sac ztlO$|9;9qdgT-dJhQrMUe9T(!L3Gn?FINrQta;k_#^v;xRmMYRerc{yi0q22YNVhJ z(;>tVxNUH_jw)C5jGy%rC8pknbAL|$VmJhPmR$*(Rd3?4dpuOYY8j-f27RwogB zm&z_;s+5}~SL;H5fWceDE7G7S1d?Oc;dPE2J6o%&;WYH{#}WkV@B04UhbXHhs$ga* z1vOEA!*fKEP7ynSCc8<7jSoRgghc5pDQ@W<+dmd%y3I#V5 z?zXeqM%Kkx)p-#0iWOPD0Px8AznWa2a4YX8lLmr1@mFq?a;6~h$5V7ux=AcAV^g^} zZ&1wl7!oxNv9Wo&dgwaPxx>Sod~M00y);-gVdoMEbO|!0+utLO_Hy#RD61)}`HW$6 zqURla&O)PqS4Wtx2r~P#Qr}oJ)N%wy(uTsP@VxHDM1g@(kSDf1O4MB43SjzDNQ^5pfA|Df@3?twMovjA!oLe zRuYe%rcS#Y{f;g>kzrj^Fq4i$^exvr#Rat-bWS#dhr+_*9{ljG zm}!Tp8j}=XL$6lE&lfuhBq-G>;{_+>I4BU*2Wn#;l=LSE5sRm_2}wujdmVvpi%so^unObbt7ex8O zD%94|H(Sfe58Qj1OE8m(?9TlABvn0s2r()4>xX*eA4oX1Zu~qX5)KuL&4HFsx52v* z$Uw}(E+KgI5mtHTP7E>kynaPa>@OCgxy3rJNH5N$(OIRavTMI>%gBZ-r?>Tw7M1vH<|LlT@1-4F|UmD&a+qInd^+j>BMM)}C$ zTsw~|W~d2v+OKQzrx!58BZ_iQ2XGcg-teqgBY{FX2;xEtq(5d12E~0wx<|UOHNguO zii8;+E@x6<$!;OELIN{>P5s#SW{|9793gO*%Q!iH?;jGqg-OY@!C+akRR(Gn$w?2cIE`U{E+@4QiM2xj(PvKT}|4QzY%!%t8@k&p8)=xu!=G0)UtH)!F zSVqN&SVD>$k>iuOr|!>buz9pV6H;BusmlwEis%QmMWy6{M;-po^<>Qc&=WV&%S!gd zOsQ5gBrZDN$pRx<+{3g_<2keW#q$39@%ZdxE*Q@psf!4eVC}41WQe?w=P5ecQ)Z96 z;e;HO3i<noxV$) zpi>#`H$B60C5nM8#MLN98j1ukJ|e`EhjwR?prE(>4gKWOdZ99Z4l49CnTjvN8Rkgk zBBydlo~@|-TcN)~zJXUG76=z~7ysJcb9YyEOzi$Rf6{M0i(rOCds?V$S?i=rNKu6c zdMw8rltVw#LGvA{11A0dLA>~mE? z%LhV=2^7BnTwYv%2AXqty%B9qVwlzNfl}4-U=mT9#;@0iWIvTTJnJE42u`C_PQtwn zGTMj-!*staWqltQ`o%4?M;rXB@b->C@4E>vVZ%)u>-O*fo$hYH@xga6zvc)HPnK~g zA%2+=X7tH$Qgll`hG=bM6+>tX&rjOOYF_8xMcvQofnB$MhKvS3Q{mXF8yWc)uD7tL zDvM33>aSk|GG^HjKMY7_W5~Sp`-`T$;&3Bd^k6+Sj*He?x3wN$GnQ!K7t5%Pk_0q8 zqB6E6FsZhiz^fsDPlp0yn)EJ<6%#Tc#B{OGc@)K5K#WPoE?JuY2wuw=id<`yG|~>< zOm|19@+5PACB9cV&IZ0TGUeKq^N3AAM)Z;y>}>@4a1=FYPm?zK)N7$-)PTZ#bF{fV#U3$Fn}Ew!+{w z9|sx@jN>rZ^RA_osQr@ZQ6qU_O~7t4IZ$srqHX*Prd?juHKY2r1sF))czBU^UfJ|o z=UeBShjCJf_XV|I!d)z$5q~7F3Qk#7Kiq^&>sLlk1bp*0mcR7najvt0_TaFhspH8b z2^p<_EmpOpR`HI&a(f6QoL*=CIHdHvG<$DX%O^x+e>5|Xs7h8t6ifw62^$V|uB>Kj_a+#v3 z(7gy1c7aq)G>|`$X4fMhUw>%eGtYH{E=!o0uM*JDNhC99;H_Tp zlHsO|2-ENx&A=rw_fGyQ&EL-O9h-^BnpU9a0>8nPpPN11B1CyFny9Y|FHyoHeuRgA z!|qh1_~PZpe2O0Ph&gGX{W{nXnO^f&cVXBQcX#%umHi$huBxc$cCe3LmrHM8duW+l z)&Q&kiSnWG4Of`|anvoB9;-8wxC><@i}4TXmG)qIVA3!XnD^la_Wga6iObN`>LEHi znj~yCgfHV~GZF1?L!&(RudMNoTt13__=Tu>B!+3}5k4|XMxN9pT+vzd60xZ+@Gsm~ zFyig|psO6HOP`+b2qR)%I;3CXRu)sENyzl#o?7H99ZRQH=ue2?m<|nHE`h!2g^0T2 z#|>R`n~8n`$voh~!F-I4CLzN^aD=)3#EZ$1RK#$1?o0af+pJq**FOc|%-3drb=PMf z`vcpEBOhb)zTg=}9R#|nm#lf#A2TIx+i%F@E8|^|u8(8NelQnFF3U;FaVrU<*k1;=xX%g4lxYr-WY=U8>l zt0v^9U<$6tvfuJ)x6gmDB2>w_>Vmkn?Rj@&b4%nG)!oe4r4?u6BM+Gq=n<-no7ldq z0?eKKFuq2Me1x^s!W?#1TYb3Yht_MqEh|}}aPa(rN~FPhiNFw1Z3!-atkStuU&qO< z43VD&@u~Q1c0Zg8kS-+88`niKEd>DbkGdcGarb4GMg3P4X720v_FqL0DcUn&W)kqU z2jH|Kwp)H=9mGT{p+BU5XO(WwmESBXGhSS*5G1*9YKWsyTbjA!bD9z+YY)=VxB$R@ z`Z#dz#A=tWhrj{PsH5e7@dDEPtUwid-bh|y^?3x=A*Ok)XmHs2`oe=Mb($|yoJ8qeFI%@SR1&D4E%!Q z%G|t0j}ccSl?VRNPJgApX*VL;BxaoooWg_B4(Wsmb$+N3d^iw)wT}$1YAGA}(DFRY z9;q$3NTh=}>R-51L2nD)N$vV{>xNu5&yD&x0tIurj|ArBgAo%Y@ii*du3J!!VKg#E z8+LqiIwMgst9Xx|1&+O_tlh_O0!xCP6I~YD$3Y8WM!vCM2A5!@D1T{ zGHY&km^w{TMEE9u8T(qs=)`5Eg@zID>yJ>KQidytz%HhnEQWSo-^a4-O>~nskco90 zoVA|lkR?W?fglPG*Qi-P!I_m0sB{lF#8=;LIrB*~!|37*U8#|$enOENmjYrG94=Hs zp)S4G+5-!qt7u;+<4u>#??;I76s8Fy36=sLFWsgaAvo)Qh4f=lyDJBOY&%UM2kQXq z87!&tDiZpvO~GD2hP!C}yy^1=wE?tRynL`S{i@{)J6)^7Y$u<(>nb!eVb>Zv%HFnz zwUm@m43>a*?_r|Rd%$*^kG)egR($KU{TZRd)s90BcKw_2Hmo}W+hJ}O)$($RJZ5IB z{3OaTXh|i1zd6vDo}3e$Fkm=_3RT$ITAKRQ_ZYfp!4v}SWx`k=CIBQRi*{u%mm8&{ zF%EsyC%8a^^ygeiaB({y+_KJD$hHzKkw>yVk}Ai&i6Mh6`Y0c|l_yWgDKP{R+Dsdx z6QN!Q53?^?r3lumNV?r;haD%O==p-01^EI`g`6~h$RG~t11@8n&Wo@0u5dRAH}F$egwv zPKTImsoyPw=Atfk*&|M!e7!Jq+*nrZyg(k9!LRJb2>4bQS};CHQZ?LbHDDv5kLhf% zPzTz7X43MLD-t3`8{!ga4V!|R2t`f#|NfwUb+B)ewmgMaxVVOR0=cgGM^h`efgO{iaumq!#Dkpup z{ZK8_MXc)*PdAR{9X?M{ww4D8Wibgcva*DK3dwU>)1N_5+5{$&!qlV4IiG}n23jMp z%pv=YKEWtDkf#vZMg&*M^`kZReU)bzhIA@xfVt zKBh0|R_gkD`b(I09*V!mYa-0^LdaBGxN0*2EgmMi&2zK7tNv$n3^tQcB}%w1>jdAo zbvSmwh0{tS&8_fegw^hItjFjPh5uu9V5S9pp&PcfFij4NFz0&|WB6N8T3wkg^3TAT;LH6K4IwcE(0lc_>`RIzq z)^w`!Hhr8HH3VS^b#-^;#%dHGdQNo)y4XXcr?)}MN;jYwAED9Jk&K*b@Jo^Wn)O#> zNVeqBTUfxhg|5EdLs0`7P6gwpL8m!1WU?r3@-Yc=h5F!(E?uLZ(nrorQ@(HuBME*? z5a(@-cDnC{jt)%G-f(>lzxsekdREBPXS~ALlvK1ZsO?m_)T;70O%dpP$GU=dJp2K( zJQ4knso2@W5Yc)q$G#+dg@n2qnH7Qr6++ZuSejh3zn)}t5%{*n`PF~sb zt^t<$bWNr%4LMbcLrUP$))i;>`ucq!j9Cq#Q*61KC?F4+<>B$w)gWQgQ*czpkV+da zHqoEdkRHI{HIcTmvRNRP#4dl8C?SGT{p>v}bZ?deR(JSW-(jJDa@^!><4e@pm<8vp z1;kc`A{D}4hm|15;mm%OV>5Tr%qzp!c2vy9s^^JFhIh55o0aDrbHVmCf$oe5_ zNS+^;sZH-A<_V~cd)dmlU#iYp^EZ}#+lw;^m*}S>OzB-&zIY207~k?dZK@s8ZYRkq zzH+q64)^>ngig(W+nE6QMZla@wz`9+8PLlKfrT-O&Wv4X zZ(h>x+k%GCg8f zE>?GGVNCQ`21u(3n(72)#<6fIhZO=P)|85lt@=y?Z@+)z;sm(DD!aJ(*~bM2<9!fy zI)N5(22!|o=Vr)I7CpoZrk^Yvu;;t9FdRR`W`?ew?}Shd4^DCNsY)HX=4mR#l~ulp z=DhOK$e~()yC)csr>jSoqZs0pXRzl+(W_0z8g#pvBzr5C|n9cS&Z^iZ-m5q$V*Ck)gg>E zz=u1XGCEZztNDoJ(M}g}Oef1c{=-F$SytN5qZTlK6G|igBEPtgNk4Tiy@K=NBuV^mfBpel&Xe=ZZ{M6pYV=85 zwEv+0$LG7F{o2BU&3v12xxaT9F)~ zLnm3KQt;V@!5-pJBw&Cyn;@+NhcS&@?Oz^u?lAU{8bGannk+2( zSC67WJ{`uu8kGlsd!>a2^Jh3NC#G3sBb~2&LrBsKNyW#oZ7g9MDdnJgz{32|VF3Zf$a%V#Du&CN+D^2VND+lsQOW-V1Ui)Jj@1TuD5C zxSr!0?oLeAkG}?X@-mJ$=-eB>P^qRxEZZl&`rHy@&GdR=b?Z7$rb58%sXw0Bm#L5 zl%R*EGa4a3aIfJhi4HcL1r_zj4j>MHMeO*>=!1h0w`m*K5<=LfY3KSyv}zUGR^}uv z5-Zm@-iC&3hh7H?Fsik|z?{jRpiH)rMxmPwd@;X`GNl%$uAisE84|1tnc<*znu6dD zC&*>}beEj}j9HVSzW>$M$1YwsueTVt)hW%qQ5xz?6d;{GXGY8J8|rE z8rnVTi{_w?An~mUN_RQi&e2>WK|nqTSnBN6kG z3n9FiL&3rQ2Z|o*f861 z8@#yoTqA8qX}?8VWjO$I`zA7fIFH0nuue!_PDL*KofYDLxU!KKtnvS1Awhws-!1Jh znVq1kz(vQSrm@Af+g4=?0<-cVs=@GJ$5%n4AM#SnL%r?S^MHL3$;6b!wh}1n%7-uQ>Nj zbQsAi=*Ns1ol*bm9mR#4PYE-Fa`NcapynC#MI?~7jPOf^{*}i(#sBI=`M~<84sAN_r zjG*$$#4qhih4Nco^xD6FPFgSMheLcn!4@R!TT`dj^`v+3*9IgZQKgIVd8%Lkuwb8% z+e`860%@)iR*1yz-tW?Ke(HO@k+NikT93HS0jHN=-a@P8IXzc8^OOtD-CiOQx#_k| zP*oNjedROA;id4BLz_RGTVB|EJJW#tt|0Hm*$EmV>A5h^BcV@!<_mFTNm~AhOsgp; zDREIt#L^^j;b0B(yNw(Hf{-zI^a< zMsQu>&i&++;>;$0H2jlzElINzcv(A>qPBv`q(HT=Fk9P8g_!(q#yss4H0FC?mu;MY z&6Q#B`TFe-n7KPl2Bg65)Sdl z=ny?NcrEWLchl&>g~iMB!VJGFIa^9|9x**Pm%fl}+PDlw#T$G=9t4u!P(@c9pcACoaawTrZNXuToYi?r1k`vU{k1 zTNF}3u8aKHil_tG7c=d&1Xr4SdqETqICV)Gy^R|B&}lWj#NHlIlw}9aY=m%C-3G|1 zU{sR^zx03HZO2S?zI~oidA=u94DVP*y5`2?RF1s5FazNSbeq!|Q>=A$@%9;=5&$B4F2#Pl1>IQ6ajd zx}*+4F6mpmGsCXwdR>z7FN)XfRvgvc^m!zNPV z5$#Ook*#1N-m>m0M=FU0Z253b;_;{Il!bYBj><6L@!IC6e|RMGU|>59Pq_1cpC7ZvVb*J((oP_cZbQk{LiiK?@kWqCuFziu+LcqQl7 zrlae}-b$Ar@(`zFJXxv~#q6BA9=C$2$D|d!@4)+Y!#*>QjyHFLcV487u9puTAMB(4 zaT0@p5l!Tq(KA$~blUKZPnHvZUa3MP>UNg6k%WN?jlVQm=m=5I&c*kx9^2FlmXg*% zq#pN4HqD^W-2kMocoSL^uuY9a{1ljG%rOaJ%nY! zdmL#X`I=0JF-|AEO)sSFB=m#DyuPL4ynx9h$@u(oKVrCF`e8_rPi!9hh3B0NruW0(gUR(|S3>nu|GhgPwnYY~ZF{F&+Q%U5i`?;N3%9Y`%|23ZKDc^< zMlJCE>W@{e$PF(1izCP);S(KH4)ldZyzJ2Lt_Av=B=!!76 z^a%*EN+?tjQo7)?ykmgv6#FQ>>iQP!VQ-A(v=kR;%N5u~T?j`b9RwSdli`#+dU}{Pu}T;YWsTMk6-{Y#0ct zjQozz1)a(&E|Z?);~>KIadyMp(XXo1qSgm#RGns9Z?DLwXj^u0Nv>PaSp-!3S_8{! zvfenc^#Ye8GjD-l&nw>SWKt{KzSHwORC;&npd;ohw5yhXXQ1US?vEOwE6xWYP7;b? z=oMc{jrmkrQ#kVqeURN(&Bjm1g*m4d4-&yYB2ATYWD#LZ$Eik>=ln~gbdFfWEMR#9 z&mz844|jP*v375VSY;#av%0v7?2}$~B`>8|0JnEPuv4|IOp!aGB~7gn@HRH8Qf?Cv zf0(O2=nO!AaQVnjKjVP@oKZfO^_-w?HC^fvD5`?BL zBB?CL1C>!`HsB!9WwTZ{0|_o>LUua%`r+}h&yNzq_(!%OJ0Or-Qg0>oNsSBfSlmLI z#Qeah?a4;n;;W|aRG$v1`<#6RKGa-dqwG|)9Ss(LBkK%d=c%80&LIrsQ*tPw{P#XB z3!UDYY4B;ed=CMX&T}%(7g`vUD>vct(c)&-)pTamll(q{b}#~^Pvd-X5+w8|LRs=4 zUrUxCSh#Tob}MMULi>F>>syq%O|19&(Cm{;;7M=@@Ii8!xJgf<`95b&Fiqnuvq+#8 zbOfh=!U8CVCT3lqU8hSo@?tAJq7A*G-BzaF^|{B2NA_aG*Pj3)SP>m~w1A@}yHS?Z zQ7y9DR=o~rnEHF|Va|Ny$y@1 z^^LmbI?8~tujCQaC#eej?3p;Z)TnmKHZ!*xy?8(en$QToy4O`-4oLf5l^W`8h;6p7)sv{zFmGHB zRxI8MOo>FyE#q4z?%j?fo!?-oI&Di0*xVh)n-m&unS_TCE7q^UVow#p#Gm?@=P(eD zV~Ja34YY(6@x~e1Cf~>EI^p5%fMy1Nbg{yPPHcO;%d&|I;L-Y!@}`GGnBC1I8+7Yj zH?%c}F|X)alFV@u>4+f^GV7nj&h8LT?zu(n>8eqZ*dY_@2@mj(kzUdm-Q;KH7oQ zag_70XRg1Pu#T*wC!*15OPu&b8B|;NVhuSiuVqt{U;j3VsX1up3 zE<`*jLO<*!mADHv3HW}m&WSF7S5y7Ss~pz;W6h}7-(~O%buAu66b(a(zZEvg<0j@q{*xN0El=;&nF7*gR#(tS36<@^=Z5m4D1 z{_y<^cd*}sP*CQ1FQ94)nf8AYoBU0a}&jPa(>;$73M7wO7M{Vp}PyA?& z+saGTJ{6))ny_8w8V!xwtiP#Mg7_fk+xSasM&zbKe|EU1r{}OhATv%@b&a1JV+pxcFMxUHbH@8m%6SRq}#IX5>)Fy~4?VmzukQVqdhG3cL>+WY#G?IsZ!}C3EOLr1kwFx@P_$5jvQ5{%S|$%KTQ0|@{Su~uGYPj0Q7cku=&(w zE5%_Hj@C1~k={=zQJRcTRI^*}_L(dGD1WA@mJtXqb6JBT#DcwZHXogYbnK0#`l3h3 ze4K3C89@%&!d<)cQ<_m)fQWD_bL9l6k9ThJ8B}^Rh}~>|TZqeZk+ED)nq*nTnb2`c z+JiEKEMvK{ED{ZZl1_;-2t%Q?B8#dLiF~LU?h48w%c)C?x_qPlk95k%?jgl{=?hejZ~0e#SEyOkym;IgEp8e4tl4!97xN#% zzq~UZ<9i@~w?C<6(^acIHQ6ljl55p>f?c!(i?lKyo(d0n;ogN9UJ?^a_#1UZf`{(z zN$aXXI}mgd(l~Qx%F{ubiPn{sY^Ap8lT!=;c0h^0N1PJ3RtjaezZR9ndt9x}q9=&C zq-oR$utzkibr{H3we^>xZ`5t1eC?JR$5*;Lcs}91dK(vce@&9rs~PnQR_i77tpM4J z&lDJ)Vb5KOCN&zAZH`#uGI|!>pMVc+o9h;+ZyHh!xkzNvNlNDNTyUQ~W%z`8)T&3= z-c--+B3SXa*Yrli7)U=%~SZ#nzGAwSUa&a0of ztkC#7v}j2Of1&@(U^W#!cepAjBS33y8-_Vy(Lm%`Eo+BKGI8VB;JC96n>Bxx8BD=L zdV0wa)a>2gz=G>~Hn>|g);2po_A6Y&XO%=Rgfth>w5e2Rf}*v7VNx*UKXd)WpjtJ@ zi#p!Xuf_XS1Czj0PbGvvGt&DOP%o!7$;H90U%f=3f9kQcNKS{#aTb~H4U9p_XYbzc zBESXRRebo+uC!ZF96%snXa;`Tn{2(J`^7L8*8jp)fFW#G{t)pHH0tq~Xg}|27|ciS zBf2Q|EpuPw2x}bIhE0{rO%hCB*e=zM*jw=$Xm^A+Ia+c>@yhOsNisQqytBOk^$p#) zeh`Nzf7LAWXy84b^YUr$cb;U{Z^z|}MSJpy%h@l*Um!4@hL+%|vi36|>yAHcV3%`b zcvHcFsk4q%dE_4}g&k(n{lMtClAgc%0&l^m{Dov9Xe6CT#o^(zuKWqLx;dv%XkIjo z*gC}13|V8KpHxG$G57KzHJvev(7_C6DH^`Je-=DD4J5J%TB?Uw#CVwc0V9$;4(bi7 zCP<9g;J#|xQ-ALz*=T4%6oWBytMI5w7)*sPiaQlama1Y@#j98~?K8Z6K7I}wN}CN%HLgG!e!daeT1Fg#HQ7Dx zf2{@dfO~YmZ-whcgddWb*I@i11`L3z^5l6%XMOOitS^+c357vJI6GhXt3yKt1x~tD zyfK-`-7nm$UVrh6k}|W`=(nPCz!B2=!@0zR>rRe;-C}eHWk~7i{}EPQfAg`z2ml_# zgH&-n(b?8m0od!}>|X&tRMoyLG`8I!e+Y?j-KbfL728sfEoN+`dO$LhG(mmrbtQ~m zY5su)rH)qM#tY@T$gaV~{;BB5`r6i4_Q~c##f#yGy@-2L?E7zksGqC1t>Dntk&#NR6>G43E~P8^Ft~g~dG& zNIh~}H*E!)Yc53N?)#AIw;`~3XIUJZ)oepeYj?ebtX?RuKNa7boU`7^u^&*#`oU3q zbvSK!jY3Ov>M%PRv@`2f5+f2(xRUq^-^Ybtg$GCgf8>3Xz?$GRFJuOuFBEE^oX^+Mtg;Tqav zGwur!*R(5&X-s$)a0Ae{_X%d+7&dkxXk_?yNq#Iferw)X+7~Oi}CA zx2R$UVs%4x9#Yb*wf-2KCD|9m-ms1{PDm&FuwlpsZQ4B}pTKCZY~DbU+gnpkQh2PB zYJ$IQ4x1Q%5%kqLKY*~#J5jwq%q*a#jS&mtfaH+IEhZPiJxs`oe{k$u(`@uUA(vUI zk4ksOx{ZnQ3M++Ce_g(oH6>+Bd<9gIB}vS{BooSfSUHE*2qE!jMg27rO$DSaC|QS{ z_LEgN^~lfB7_XPsg(3V)XbVX_jQXugfuNWO&(k9Q94=qZufFANIN2m|#ZNAgoQ+cb z6d{6~j;cMNnr6}Ru%~J-ZhhM(kHe`z%p`dH44Y0FTkeC|e`pV*@iUl;t!rzs#0i){ z?WN%Jt8-^np{XpuIgPj9{K=-hV=Q1%rbr1kIeQ8oebN29y(^;Ihh3?U4b7;Ru8QwX5iT-bwCB+L?;oqTB;mb`AR~4jr{JLFhR#~B`>gUn@<>m>U&9p zS=@r-P32xHf60h`M8+}Q!sqT%f0d5$5so$_s+czUE72lMhK#m-rFch!!$kg1M}c?; zh$b94YdfZXBd?@Y^*rRpDaijltzOXr}%FZgux3dBx_j_ zl44*JI@TwpGgr}GnR4_!o~t3;m$fQNX)H5*NhDVpe{4m$RinLaBySmx@AOVVKI$PM{&EVeLwtCc82{fW>3dxYzZF1BbV8Vf$U zm5bB8f|7@l4XPN1$cc5D#GIfM66S2O84;Crjy49&;A^Sffsvb2;O2N&% z;6m#UOo`6NuS%&V{&u)B=zLh~k{-Iv>fqN$(e?ZGz&EBJxXcM;3Lr zk!%e?`9iKGWoF|R`CLU%_jFw`WE_v0IJqqPR527-uQ>ZMqfKxciqlB@3^ixu9bNb3 z+;}%*#nP>wxjB+Vpd*Ix!+ey;l1gu(0+O?Fh6x8o2ixl`$v(~Dwlk(ZI}6ywaYPOy ze+{QW7g;v+rW{(q>!2RnlexvrM^y5kYY+PqW_)$m-0N=bz`J#AL zF!_d#Ro5N<rDe4##;&7L6BqY84J*n6bP8`fF2W%62e|JL_agXx8 zk%4BdJaVo7&R`{jE$dLQlQ`RoG%d?fNivtoXXn;;o0-xyiC_{Kb105(R z*d|G*ZBH#Osbb4_GQ#VR4r(d-x}F^638r@7#HSHiW*!}J|Fa*BN#r2sseQ2GN(gQD zZJ#9pG(z3X*J1kSA*doue;hMy$_&%wuT^lUA@Z!)Xg%Y&69?pr=(B_`MUvB-wTJY_ z+#;jJUlcEAI)E1wAVkGyaccFXAMMJ=*l2o#>_{J#+PZjWwP)}4lBc;2wjWTvOgRM!U z@}5xL$>$LA(x2A0yHsg6u&AJ20h5fgEGC5t)H#5N=Wepfs;Y++p~Mp8fTxF_)D~d* zL(t^$SqNTWD)@^QdSob}2F=TPv0tJ<&~IpTGbYAcf8}!3tky5v(2!_6wz{Z8wbyc?Og(7u0{Z5sPQ)@&7nlq^u)-koYg&_6UuUsSwV~89 z?qO25e?D<_;byM~22}=frfanG(xjM4->TiG&nhXzyZ1s(lP)WB#SeE2Z{EhU>Pk@_ zd+Ag03N8U`nPeLnrZ^baJP3))A{+bbUrFq4KB$BKz`eDuAOH7K+w$di#fB5?yv^AnKZ2m8K>n6On|l|Sh9cuXRPe`&%8+#MiJi&=Bc_=gT~c->ysuJS8I zJ4$J8B*rfkPc>4}lfb7ZX`AQ?GJyu!Yj5E&Bg)?eV|Drg0xUT9k}4Ua!gV7K_7_et z*u)^(+NJ(YM%w?E1)U?!<*Jft6Fl+l!MnvH^C6axT^l=0;f7)>u(#ky=?4_@yGO0? zf2%u%s9@|nWJVkU9g)Fnb|-qRc@Rzz#`d1o|Jv|w=tr{ShOwE0nG(XD;~qb#dJVC` zOaycSZu($Q@=6pRLX=v4pgWdA@JaCo#KRL zX2K~s+dR8~_c>G=fH#YAKf6U#j^EdHc797QNXGSxFhomSFMD(r}GdM0< z<{LuRXN}eAo~$u$A9kK#y37}d=Tj@u4J(CQAI8~6PX|^=(*t1~Q&q#xFIMB66+k2M zj>o&eeA}|FZP6>Za(zGp+J*sDft(oD2{8l)*IJW@>i96~4kd7Cz56O?j40QLgt09~+d(6P+FAviTC`}$I1fLjP`SRQ>3OdB zWN*bXjyT3dDFRorw}%Q$_k9lj7m{!$)Ck%Avv7FOBh?;*h@6B8jNyHw7?7;g@b0im zh-`A+7sV-kw#4|g1^(hfJ&)1Te}O2k72m>*WpravvFU=u#KL695a@-xcP#R$i+owm z@0N+q0hEA@p8ZxF$c~E@sObj_FI{;JQ%aQA`>2=HGLdOJ3MBEy0^{!(kx?fQZv)To z1<3;UPV#Y}tood}&2!<8LXvk!b`6*RamhtnjL>~r;@_JjWs@Srntd?Ff56`z?Im-e zQ%p8v#s1_fS6GC0<*?7&Rv#KkRmNsWRI^gn?DMO76g-~=wx^$=KazpqbIUMKc_Qd=FIxp}^{bAK#iO^20{P`L*? z4*u?9KXd4=rHVD?#N2!ef88-HM#ANfmqu>cJ;wo&)-(T_&g{%TF3Ak?qMvRV*zHQax!BhYYsf9kHl)Jn`uI{D!2 z$TB=)U>6wgyRH<%nv&KiyO!ztBpOlv-g@wqNGZbwGY7LH6u>Sz6%ZNDpGwrtud-En zG6<~3Ugw>Tw5c6}_B2}})7Uu$moPyGzxEQD7G)A1FG%m$I4b`CvE3fM=i4{ZY-+KL z3>>J37oXW)eiY0s2ln5;!jHYSm!Zf86ec(zFd%PYY6?6&3NK7$ZfA68F(5KFFfj@* zOl59obZ9alGcYnRm%xSw76dUgG&Yk#S|@*;xnp#u?Upqf+jgGVwr$(Ctx77kjY`F+ z*tYG8Z9A#Bk}vPx-Mil1-RC>!^vD<)_q^6xbKzR^zJEMqM2aeOLZ%MJX5tR^u5?WF zjNAYfRVhsgGkY^2H$cYH$kxmh zAnD*@??p>X3qvO2;OOOSWnt;c4fxk1fYOBOGm?>s?lYVTVC)5OwKV&yHh`j=@u!=e zqmjLpnajUNn>g6JSh=`b*;@b{%>RE8AY^CeY-M6(4-m05v-^Co1*kZfSedzc(f*tH z-&myVKPg<@T+RL>QMB}Ou`+S_cXxoC(I>R~?ECMG|3>m}?*AnDdvY;b7c+M&GiTb* zY$o)y03&--fU2e0|8pH;wq_=-&i^3!%lDtq!QRRQAZBl2WpDO*GymlJHwu462j{=; z#^rM|f1fK87Z>N}Tp3yZnyZ|ZiL-;Evzg2PKLW%;2%yd|3>o3ZRYH5 zX8K7D_~&N1e%}9Q_+JYu?%-@;_KzK5F3Scnc06PU}6NATA6>i0*uW*+lOKJi%QkY(G0)@Ff}v(C;q%8XDd&D4kP{N z9swBt`uo?D-sd)&I@sHK{c)E!vNHoPNQjF_Ysu04H^uzRO<35$6W~qvIYIy(8yoXq zOUejfVq{|jeEoM$MI)>KsEP4Uw3NNM1K@L^|53ZCo8y1h@BSasqWphv8lwXIJFUFK z=h~S8DE~-BmywOp=?5u3P{+sWAb<;5WrxyQ53YEVvos_GQt(A$8y@l<+j;vh7 ztvt<46|G!NECJ?5pY4DA^IXl|)XdrTbC!w@E>?fd;d8+m|BFf0(#pif{&Ql0|1=r7 zn0yKn!0{j0?DKN|y&f@p69?13){U8s9bn|_Y~%&=DVR^h2JmJASbZ{k0?a%=OJSh5 zcX0g-0XVw3eg%B0ALcKCu(JUeg#J4ECt?RM2>(GG00xmih!cOnAo>S!0T{&og*X@i z4B~$f)2Gn?AZ7rA~13es*W`H~86t?cd;Me|CT1=eL02Z&aVJKL&?C$v%A@?Elsa z(`T`cf6SjFcKm!bIsC18rq62s)(g{TX)b?y{R^47|E+&^woiAL&kxO?fKN`>KjzPJ zTrHi={x+`9dR;vn{uc1rt=r$=XSeQugP$FE{DI7$(SJ+E{7LWi5BP7gGjVfv{?z3^ zzB8Yi{7-Cd_4yt!GxIbvfmvB}FyRTdt_$vXsu9BVpgWji>1S7a_;4d+g^95R-lGTU zlgF|t#btlZ`^A}(C8{`X$zP=dDhCQ28jmX$!{K4WCEQ65iGmt}0wNiKb538+E6)vg z4MjO~!`P3L5RH|Vb0Xq3BzZ+t{-8z1FEWXu66%2NhySE~bnK)6flE+cPzkMYyhz1` z@e+8cAZhEX#0@b&+9k?p9T=7dE8X2R`%EFN4cmWo{)k%HiDJ00I3Ntq<~JWI0pnVC zZH%i`%E8?=+0Fc7*(oE~1>8eh6q!qLbVpn1(;yDD!?Uw9Evnd(TXYD9E5=y)i=r>n zy!U2W8>)X=9d$C#9#Oa8F1CY-I-Wx((U3lrU^)(^TQB?GK#r|-1-`yr(BY9Z9T~5~ zVPSs>S+FDC<}GZD1a-f1&L^K1f} z&ziDFS@v^Zx8UPGuF9S;P|)~~ox8eNTwmaV??JcA96W-rJ;KLLDSX?)QRn@dxt*J- z%VP^(G`gWjz7N0RXYgywJJP8qt(`UHEsawtA!G|#m$~XYpMbPl5v#D6nSw}Ni7bEh zTlvaD{bnY;5`ed~YUmf5UEGY!o;AsRkATU-ATm~#iXr#ooYNk3)Qz@(P!}kgzD2n< z$M%dvN2!(;Q!Vt;TGM8>o`|jEChM;Z(c+;$yA{s#UKu9h=JPw@juxiOq zTvroKU!9pMucmI`F3nAFdY9vZ1xu@hTx9AT>ufr1HD%Yj>#+9{ix;!}u z-5RON%By>3w*KmZhsP9%i0o`?k|(QE29GjLkqw;I7O1k4p$IoUGa|$wC^vucd{E5F zf%c^7I$eKH^SJ=F%pZToh9w`v2;fSf-xEDc)~u(Kn`LPg=QmFCZtg-v%*?@u%>yT_ zPH=P2PJ>ktzMA1X=}XE}amStMM4)_M!KFuy>wKKKR{@pj==4W>)dyr`HgVd`D%O?(W*l~aIEA4<`TbTZjun*9orbhiE~bNu4sxQ%KH z0aD&f40vLLA{|KHS@ryol~jaum^v&^3lUjVUPj8mQiVe5={?7!9TXRiWns~fb!Jd7 zI{ew|IwLV)V@tHIDb~<^i-mk;{0`gnD-KB#2rQ1{X>|yu8`#O4vE6^42MUb616%`_ z8ISG^BjThAXAjeMff0pnQ!XQj`pl1Nfa=hGYR=SzMBL#U=rFlaHq&a(Oh>~`WP-{H z9@ux2zOv6jK&&Cwi@pnGk<*C!{=-)?;TbN+uep#Pe?FE>CKLoNI-n)ak3~Gr)LhuQh8d z>8yMfvc9;!{=?MCK?m?#+jC+_rYMJ4(WnY`7lfjioGg6PwxbyoMEq|7%DwKf55XtJ z!4vsgEd{an;Jvwfq|)8nDSq)*r67==8pZtZMmRa;J%+!5Pd$H*V+(uIdwlXMm_#V9 z1`yT^@zaSGz^JAW1;DQY-&sd??}A7VBv|;vb9FIhQ#P%lzU!JK$c`=wBGJ zs0$?zb;Sl&?2WQTqdf5{2?Lg{6^&jN4-6Z_TA{q^dFH};MZub`66Gvzl-THT+{5wM zC20JLEj1#955G^oF52YN&hfJQ%T2ekz0u4q{7ykooyC7t-mb1=Y)*t#tbgj+W5J`6 zbslnaZYy3zUi(&`xPs*<&mT)gO4sN-cE>K`o5kseNt?Ny_=GOU>fDs6F8 zky2oNo<}_a)z>@o>YWV;zNF{-0`IwP$(KQU2oxlN>-0V2KGm|y`^V$0vA{4Q8Tn1S z>on-ywQqk;ujd+z(0%d^g3FrDmKMWBt%btuFcesK9o6y3kHI(lHpvJeW!>3=TbC$RphGfMQU|Yh^P;SNn?A)gDTv zD2&)H=3(wAn`wQ^RZ1L*x=to^z5E(gQU=ZclW%(d9#uB74H&kh~ z`O8)L(tC%L6NF>0ND|Wyh;}Z*%X&RWSV4aqFu5~$AFU!T1QJ-|TV1M1oCIAr9Osk> zD zddmXNhr-)Wm4=OLEzB*XDf@Lt9(;cr#ytEOGSS`>f=MG`#;qCt{C+AHLx{({$=|y9 zUWIr>r6{tjgRC&MsZX1SYkbmYST_?dpm_x@RhTtn1b`=Mo(G>xvyUO?A*#Fhd*M*# zuMXy!KIn%W0_}|n)>}V4eKN%1wq6~5a@Cslh{O|BRz?nS4iKRyBzEO-5-NXN6I;`q zgnmZurOc;YT&v3m^HNW{|bd&9`Ph*^5 zZ&V#etTM^v!k`H0ii_vm<#u}TyABFE?V@Bt6NX2vsbgA$@_wD`JbUQ|123(v~L)=O@r9R3Um>_5G0UcQZhZL zHg8qX6SlEutxjc#oTy9Y4rFMeTuBDmffdK^nqUwxzr*co&CCF(Euw4I{ zr&+o8IWQwsnw!&O?jG2zJXBgMF3*_|kfNbU}StGs5?=ME!3 zR(dHpEk}3_M9P1J*j~zX88A@o=JDXasTebjOVE)FAgg6&8ufK-tei|RU+IacN;#eS zRp+khRFIotu0qF9MGz1iE`lD=IBEqp7rM2~nDRLG{lS0L3L%ixnIoWNK8G(woMFsg zo|liot#^kD5ld|ugwLR#AFGj}z~Yho^OI0wPD!HNP`!Wc#Qc%t&DP7kN@U&pCLo}E zSOiRhn=xtBm(b0LMAFUDS*U|R_#qB~M(GLcHqT_JtJAI*5-2Z2Bu>kFFs~aHNQKe4 z&#NLt(Fk01nT#d+8pmc#%pfz~DiNN4(0uqhXNrHEuqyz34BD`vqC1!ur+oS(a{0?_ zo}ajtC=GwWx51(v_APIVZsHiE3{g8wc+;06p@QJK;@bk6TK{~Y=UKKT@9l#?4~O^l zlrZnGOqosk4&Qv_Ie6d|;xPCT2Ju(=smo+~sEQZo94Jz25;;4El7{;o4)loTJKTF) ztA3Z10KIflw2*Rs7?d!H&gYZBt+KLI#E)F&Lz+s3cV2i%Q?E{>;*Qi$RkduwkWf_&9F#jpIVR_Nj1nJ0@HrqYpuuFi#js0Xpb2)@uX_U*48uPF^?^Z z=G0dCdUK=^<0l1-+XErJlyIf3!bB;}5s82EoH2?JUe}UnD>NhSbQQ}~9Ndh*^x92w zb4$)UKoF25tLWj0Og=qSZr8*-V!dHb4K0sA=2%^cU&$W-9^+x!b=4<3!yG)%Bm-D0 z`3W=i-3&K#oLhHeHej2y*z56;?JLp>AmQx8iPE(ju$C87yBuV)gNp8Q(y2FRAYGUAkuE+O-Pkm?)m-lR^e0a!{El z`5(JgV0}j|lHS&H#htw%9!>0PLEo#am}lGwQO?^ClaU*|$mzA6fni=~t> zHRJChc$W<@;LBu;AB&_9sahM*&(MyA#lWtKe8*ikwOv021qzD&X(*ebRAyg^z`P2P zT*mci3Bv&b4t2V3TI8|w!K;6I(Gp4zCGubc%xO*}TSX>GL?3QMCu4>n3%kp$RtrL) zS9&Zi$kZWWW^KbL#DQZwD4*r8*?!0H#TEuh%G7`gY{;oYfq_66JFzVWO`Egh!moLr zGE|2tT1k%=@Vt~uY!>cTtk2cd=KSq3HK7~6uvk=iTvCMqdH=kbQpA5mfS++!L;=Z6 zTH|2NXk>jdg6j3?f_?r2Vl!N)pP$rE%hyV;ld^gU$JtV&R!|rpCP-E zVNQKF=4ji?D}beuV0;K-N0YOd7N{83lV;_3DaAHLl$3!Y7clSd2?gLYVsB)k zCd}ww$kF_s5$qos9AsuMhcDGe>5NQyV%Ijpg|KyCK&Y-n9#4OvgBf73yi8PXi81x~ zn&H3)YM8%f+23rra2ht_=_odfraPR9Ko4C_t|_Qpig6H+C|R!tFP~{-kv=Oebrs9R^^nmDwSkJTZBU;9ZdAmbG0M@#rXo3%AXly#L* zxZAkh5i|{>;L3mgLB8D?90=r@%F?7IApOm{v(W%RqR zqOFP+f@?$)O5Z;9rY>S+vB+3`4n^hVWsHZy;B-+L!W6R5Y$P{W>BH*`cI&jZL4WZ? zq_xKKmo;0P<9j~mWCIAIZ*v9lw=v!-wv5-f!Anz#U|oNH<5z1792YrHl!y$kDrJj~ zj(izaVYiSG6%NIulRx^ZjgdF;wvRv?nAd`QC6&rRwNRnf-i0PSp%|c;VqLGztRrqr ztm6}_Q7Lk7rZlX?FTSJeoF+SIAa3u{DWbbwaEV+~Z0wn+8)M6!Xtm%U0{9wQ2(i>Hn{o!nR{9J$9*GF`*m~#6oDT`ASzJ1Vgg!x$C z{03$7@m&0&6&xThePO5^Qx_7{^g_kT|D%a+lQ5@ z8;%qt~vx9=2Zs)Rz?LJgwR94 z30!|kqgPK0A2l{b7Jw)9Bu4hS2;G*o;@6l-jPL95X82bJzh6)d%yng0RjKjqIw~ag zqqpeJjjZdqR15>t!`I@n3u!y0mH;=gM6e#221fF^w3sIV3!hAe%ri@*VP9Rq#)m^_ zNV6wQ?Y6y!F+4j12r{+_X$uLMHC}=VIe&k*vEJ6cyzKoZic6Ec8AW)QQV99^cWj#)s4_1AH%Ws^RjG+KG*}|~J+XhEXy*_`j z@Jr6jSd+K|D*_pQy_deJo@fJWz(vKCJP6c6aaqt~iqGVO)z_a0@~#{@B6v+5sm?=< zm{(s2$x59EcnebjS<||72U{368zb3*Q7NpbN;$v?BOV+->2r%TpO4 zDw&)3rACuNQ?mb<=6W{>^&N|=Hqd|j0Tq!L&=@$C+P^X2Mi&6l%Dfse3C)svy(evm zS1!EZ@m-3Yswt%&@hw6z>!S<1HriOa-9VE@I)0FnFiB}3IGF1l9F$Qgu9VSt{+a_X z_2L}4js>Q@@kgq7NOee%NP1t=m)qLQqHyL7pI^PZ31AiiAK*;U{m&3=QwM+Bd{Rj2 ze$7|3r+h0?A8Wm5s@SC)l=*5hSL>;#G3C|j#$jJzlIhheuf@tlW7F)B42uO>n!>ApL_fQ@b0b684u>5nYLvH z34+O{lKTs6Ji22~#(ZKKJZ+>~ZITi@5J%CItr-_&cwsh$J(yTq?oD1KL>t#qv zMZL}=ANznHFUH7?&WxMgb$PbGYpqYUX>a3Ym5e>;EQ%u1%R zkSXx~D`Y zx4WQcmfpqHcO{wU*Mbt&RY}4Qyn#mllrfRkGV-1mhcIExDD-f7miZ}6DIYS&`H!sw z7Gi(nUb;XvCdo8mBCZYH2B2iN77e}Cmg*!;XHbi8Y4WJc(WcY5Jc*))E3dZHebG9{ zD&u4}aE{ zdAd@P2n2cTZ}Z!pNMN`gobiL3oW|#njWK`qb6bnswl;gPTY_AXceNmfc&qXZ$?Or1 z@afMKhMI~hq9+%zIz!6irQ8=b8{O(i2|z+JE^mWh!Xx-N&TdBjQiwR9^}FdXBH9zl zvAAW+40LpA8~{mNC2FV=afRC-Kx2dQEn{}>H4!?npZP{7VZm7g@&qe5--B&P(d&O5 zdxUSMfWR_%Py#N*Ac#vxyw?fCt{^@7ZrT%M13ly_Og%FmOK|suhe5uFB4Eb$RZ&U^ z1-|nqeV~8Bb!6H%jeXh%=vGa2Cl-qp)1^9t8Jzy3FvY`u%!i~+!LR<%(}}T^@`~hm zjlfckn|viFzrRK9g);S<69ltiqn&?FdkPnJp@FSyr3R8qq9@j5_@bvP2+uc@Zk&m} zzKa-Sh2NydE{S#>8_@2VSP<8<`(QKYA!owFba8xZTFcJdz+_($oWvz+hId>tp-b|* z17Tvv2klOHlmZ(@vT=y?J1!pzASj=78V$O@tGu;r(FVj}@nQxe#bK@SPgs9NTDyw$ z=~Cf7u4k@w?ylOyp{)!&CGxh?nFmop`P=;1eS67Dd^SffN+e;K1=*;-kE8D7DF>k^ zt~8=y0On_E^+UoWCF#~yg#k)S^XEf<>~s3+Nh2K>5v$vIR9kQV@*#{ZApKTtl^T%vZmW!d`y-ToceM5uBSKKPxt087~=*CcJhF4 zlsWX(iRN*t&u6>&B8DkH%a1OA;cTIQ5^w3JtJuoA+DtK|rCX@*AY*KX?u@dJtj|3Y zfQa2GL6tsPFY$;S!A3)TW48)6Nlh{}?;~T(weGb#`-70ngb5H8B3gfEm2&N&3{K6_ zx|1d0F!!eZwpQ%n&D7mMDon5l=4?cMyXawno*bDaH$vxNxU}xzB(9rWKGgnkcKry4 zutBq!gBRu0{BzAQTHIF#Qa#BorY2E2{u=FZu(%1!93iRLJ_l^p`bHh);@d#f1KdZ* znV>kL$?a1yLNO?uvj2b8b$LRS0>C@`C>W}TguDTPVw-i{?dT}2k?%}3wMI3;yc)>H z&7C!%zXGnG%M+kV(I)5)b?UjZ;oz|CLYZt#xnrR}3ir`5csSrcSuRk7@x(-IJC$o2_EP z@2FYB=%SiQjS^Hp!iSB?DU|wbc!tAYP=1bGqbg)$Z^dbMhK?gfZ=MEM=(EUWaY%p1 zwFR|olCZm*aiUqCIi@!NpM5rDUdpBq z%3UfI;LbA%xra)f&z0zvRm*@WqtEEZ!?zt_Cz*raSFC0CnUIh8DHYf$(el%mw|3#a z!?T?c^QwP2sjkGP9h-DvI!IouRkV(J6}sk0J+547V)bl2tp}s{G7)6<_{gM*~t_&my=---n&;zNFg)1LV|Tt^L&%W zsy%<5ZpKJ=allI&E&PCZmajrN$Wu-$pz_C#vKJ|=t`7ACEU*UxB2G4nMqEbE2g0S< z1li>jUAG;N3bot2ayFzL`MnTf>9JX%C$o2qel_V%Pm!L49F86M8s&1*p_~f1U!_up ztGUr*Qn@@LofG8i9euM&7x2cFpES|#1-gIqExN;D>c(Hapj!pHT)Pfa^!TOmBM82d zHiNC=4+eJ&nA7m%;gjVWo8}xHH_WZ%yQDCF6vS`U%TJbLv{MdL71OqQExJD0pbP9HoBvJXK}% z+M?K>&haIR=bItazykl7C^Ql~0lj~Ew@SSOW9YdD@!ZMRQUXC}jpkk{8xy&gZ5Av-=yB0-8Rc0pE(nPT`>I36 zf6TnSABRu){k|GsaBAo*M4g@3K(dp*S3^y541yh0XfHHbU0(wsJc$7boZG*zI&7 z-h=EP@PiA0gSB1PEVgH`9pHbqkb04zK>$2mqPu+fh3z*69bG*r15?v@!OGF8hfW*) zsLv>VqV2GKO(nz<_aVXzNl?o8w}xa~JY{=lmJ{wd)kSuS?;-*6YovjY0X0D|$p^DZ z{#3!07iUCB$!NVs`a(k~43S&BhWZ$$Q9>AJn~H^Q)_Ep9xNPV}Wa@uC6Ugc_>SH8~ zNo6mpA4M>{9y;P)@D>vYdf2@EEieITOyGArI?pPQCo7sLR1#aiG^K!XmmHoXGfaO3 z#|_<07s~jlG~9G;ZnU|D!~KM%i2pv)>mV>!N$%rBrI`o1s<{bn`5 zJKuK9JA57s45AJ;CG~&U&M#QH;9E9ybc-Tp-hpwBnf@I~`DrIu3xtFrp(S^{0_iGBmUUb>EM3qP`tjh zzG-Dvw2Ca&)CCov%+V@10#3c)IP79Jo~>>RoZS7#`T+7HS`#9Po3u`?mQ)q){L@-jgT=!Rd8fN`A zav2X;%Xe_>Cdhviqw2zVKDv>p+2hEjZp2o%=#i=TaUx2&xJ1%J$n8S6jHRozm?)?_ zsM0TVz^p~${zJx5xHMEPxcjnUz878Z9xkF;->*aED#Q}V{kjycLvzM-V;YF}tCTZu zy?FF(*358>g$w`wcAZsr>=Q5zkkEf>si~rp9>EmTc7jP1Da~lC z8T`ok?Q39Rva=;K0HSO1LRX z7+TGO=hJ`QuWRf%?R(@IU^sF@G(hUQg&Z#cj--#XF7a;QY`a+KWdrFJC}6&({9TkF zN)z~6zP^;g2rJQPF%b=inK<FjrOO<|L`Wz)!ro;`|+`zo`wKI zK)t^jP2mB5j7)I7E6?yu05itN9iHBYe zM1YB*1>&1lb@aG2GL4-)a{0?`0%-X?_S_R#xY$?ZdLvPwnQf0U6G}}X%+gNF_&C^D z9H<2exib*#dJ#qNY$m(d;}H#N?a;MksWxRpJf~fM;ppnQIp8mlM{A~t+Y4Lto~CG| z0SYwJQ2eku6W$+oP!D+DS+_cClO>ud$ANSe%Pw7P@waPYc^AD56|{qt_b~%tB+DxK ztIXRky>>F+tT4$+`AdX{c2vgUu2y&7l8hoS=&mgZpT;Ob<9~N?Z zeG%e+G`IDJ@kY9V{{ign{OjvL8jhs?$m%F;%D4W!oYEOaz6zaf@Te~X_P=|xe?_LF zLcznMZqZp1Z23V}t0D5nb*!R7v04K{>z1*iVqwFj#5wgHx}5&6&nm%2UoH%~z>7df1pqzQ?yCSD@4$NY0=SMOFauSm+0eO8u(INS15tgUCpLT=aV! zN&l`ymutSbfgWS)D_TB!Tl`?>t_a_&6`%{UAR!Qty1;tdq?lP|khSuK~`ZretE4IZiF^==`AuNmqpMqMGe%f8aZ&jjuC)Z+< zUwinvd@5)=f^C8GV#MtQ2jAZfiWOr-78b@9HH1<4W7h0MO1$>)g;1Wp-T!M(D7?ZfO6 z8`wrMUN?~n3kD6Hxavjr4KnzZ#>j(+u{DVRxY9*oxHGQ9ykI|{q_CZT!<6v*>r5Rl zPE3P`(WZ;k7amFC?6Yr!X#3Y>#pskx(a)t8)2%0v0hc+qw zePjd;UkX_w5bD6HO+W+F4(7kJb`#QYXDj+y)M<8$L#WWPcUTA=}j+$_8o--=vMMUo@L3n;sO6e;~;Fy0ITU3=xqu zpSC2d`aveQRwtEHm%Q?g>)r?=v0JT|5`>zf=;9V`+xALDs^7_1{HAuc+$%S%z$Hgo zqWRSmL|x2(GziyjwrKKw1Hjv_u4p`No@FBr+t@Mu{#S2CotySu43bXMDBv z;1oq1dE)}&_o&X{`h{81(9DAzC>0hGQU_rK>LE@1CwJiNH+-ox1c!RmyEv17R5IinNBjsX_lKIuSAQ&X%aD@2zY_z|_Y8;YRLmrCiU zQDG~D9PoxQg5Ot@W3-PS3n)cpUwZ}R_^2)G*o{ESEBPY3@LplE_Vqd*R1z#?ieokC zQ9;7I`c%7>%!RH}U;Dj+T91J(fn&i+q#JyHLS$XuGz$_qv+Eg>;s$A9PEFm&F+pB( zFF4*8RSh}wo5$81O!Yds{aNqPv6Ak}%2b$b8K8hwQq^2Bw1kyk1YY4A3rjIkfSVOq~$n!(@w~L=yx$-#4wA|7LSspO1~=Xu2=Qrk_EA^YEwl@)v#k%$vlTzVoBHA5K%yEb{Hbk!i)3E{ z;b}#2TQJ8u_Ks#5UQ@WQ`@Z3NqY_Bv@+HIQl1i{_FAJ@~VjyS5!t0wgH6>l_(W?G5 zPC3xz^`Wx2C7Nh#Zzat6L7odKy0p6^H|EW=!Rb}y{-)w6#tt+)EIE|#O&LDkfMxNIZ$>TNluA|V$`DE&|wDzq=eDrcMbZk=CZvd=og zccaW0-N#f)m-q}?LHkmVTIM5o%KDlDmWqK@rm)L-_oG_AhqTtzV9cTQ3=r{H%}ctBkT=VOps%^oym(iocfqJ@weR8*%MrN znw*o57?%rOB?|d}yP`PYjhjSJa-iX@@uI;POJi?okU~14w+($D3;S_SAkyt&R$Tgv zKN&d_3t}ylUHZTW#@<&g zr6UuQDPIs7gqpyupx=8l8oBZQK~ih6Y0{P4} zdV(MHcAC6@T1n7((wgOX8e0%vTvp9@k-;S!Z*S zWey)`rN(X+2pZFCS!Gg-k6xH*FTQ+kj6#;L^<%1kHBITS->ZGGwl=q5zdE^DonI(p z``#h_y#56VC(5Cp0yP(8x#Yv=%H=E|^HMVn2NBs7gsdqiyq@eLW5SzGM3ggmISYGa zGpIJigj!k2`DpuP;;^{oYZA1=5wNX;7IaK7STVUEVd`BbX11tC#Z9@?qEeeUjv<`- zX%k?7g%e)CuqBFLf|zqnMvX0DmGL!Mc$9MgNbXQTuP5-L&X{o zFv>-IPvwwk2o*KDgCE-r{B1{xHt=7G}?oCoE2&M0IhcgfJ2X<`2==E z1SXv)XHC|ZPaYU{%H|m}*46-^k^4peQMvwqfwcn{i%5-IJ|lDwF>a383?{pMBOE`B&45{yl4<*Ls&?Cw`MJP*_8ZT-J~>AqX)j%SP$16N^x zjI#7*XHKURdKg~mfgeL*iGdPFG6^ZPaD3OkHh*aOLbG=SE3&9D0q&%L3DegQU#gJa z#r5lKFhb70KnZQ8Wnt}w0k5b(l!^<2*w}Bv33N?rxrdaAwn#ap8y*nR2;O){e!8u^ zc6C*^C&{5b#OmTJWVe!U90{p7KHMFDXz<R%|mw;ei{ zIYj>GD68|`oafVMmkigUJdYk3`x*=Jq)se*^gPmu^$M@XE>{Wxly9}v3bZkQsIK%& z5(*@n@wOb zoATYdIPz*hYVme3U^vcI0_E2uiMG_2evDcm&LOCVjU|}pJ_S$cH%06KIB6u~v>Sb2 zd+%&vpNsqtz3coSFlE3o@tNwxnLOcEweaJM-~>UXbbCTTi&k z3Uy<^!jBj|L54)XKgYEvonIUh3K^Hc|BE#hfag1%3 zqpHr@iB*jnO-Y8e-y474ew8?-ka$yz0e;>5V5Kydj&4(D9vl)bWWggn zskF&)mnV-w1Q`h?d7^WQ8l5Yhm0UcCenO&wt{Ibvw6>{;o~6@&98<4~A)_(3gvwD& z0_Eyi1L1=@uw;z+1%OUY9JqF3u}jy5V~1tX*7W!dRPQitQ<1ejbT|S_I$oe+o~&V& z5S16vp4(sJuvty*wmUue@N?F>b*C{y^%h&kqwoG|+zz?UFOq;aWn+KL@uU!OffCy_ z^37L|QJ<;iwqM?VQ40qLZN+vSzYaA-wh`H_CVb-c;j+QbyT87U_qegni@9HTMuTjKg8zCIxF`V#;J1*H0sOL^YmKwuKb{QLg__dCC2o^7A2Gc;kOm}sB z-h=pwwk5_U!H94DZI9{A^jgo00w)%cW7y>%lR8=j{u6@1(-Ljd2!|&nJ@r~|kv6-M z5=Ek`KSnSmf11r|2>)(`3BrR}7ArPJ&YR;FNNmxe>9WivkA;a!0=}gxW!#~tIg~Rm zfXIJ%vaHB|G2_QW4QHsUJ-Juy`vrC?A0cPA?!)2w2>ZiKI|uqURnK~~x7Md%Bj7_f zAiIj5`EHP2F%UPOrFjLOXOQ|uJB+*)*bA1!e^NAXPhw$g%RPtb6e&>Bu|y?Uigj58 zx~wCwh|nF1BA-uW-zoA#fg8sNU*gi+N$1)QF|^WuZ9RlnE(!0KhwBkE^mu;BL>U{t z8y3AV`SXMaon-vAqGml47Sd3tn_^GrUD9P16-4z|mkplLKJRrmg&L{!?vU_V*AESnHnO?dIsB`cXtEo*X2Fca9`O(QW(quqI-K70rwTE2sLPL+EwG~Hlhjfc4kNm zn^Y@*y#&J6%vSIU-aGV*R)goMo+2ejlpD{IODwho(V>R&$F^__yVWnk2S zeI4MNmgUDDyua}WuUs(=4))Y#woPc=b4QVMb#@SeISJea%#B7#VlmQ z>ofiSzRw}QtysRLl$|SCW`YuJNcO@-wh1JEs=xQVGhiMLT0{j1&I655S~^MJHhhH? zvZGdN;XXtEKLIW|(Z*BY^DC$*#3Z>!cj_)RuFxr^?>#)9&L$YSGvLtOq|hpp;fIx| zsvSv`*m1_du$q!_aN7=}8WHYxH2rnT>ZE}55v(akE}eJk%f3A)96i!}DECxS9&uZL z>0#!$mX)=JESBmLLsk}fM;m|!Cq-W4q`j@9pG^*BGoQ=L3k0W}U0 z0)4;aWu53?-P}mz_B&0B&g%Z$P7SAjz3im-J+g8-F71T5XU;Lj@tqr`Khj@xKmDk! z%mwde#qvGS3~WfQ_I4u*LAoj5duN7c1j9Vd09eI!MPU;NDM^?o>=1 zme_MjIDlx0uB^pEH~V~K_}J{r(fXbOI`<-TLMT75(RGNA9p1Xo#%bOl|AIPy5ajEV zCE5rF(6fovj9lx`ZrJ2Y$FPn|=pg7rV2$rO2=)T4o}s7CiM+aWY)zMmWrT?0fO5~{ zYV8*~Mze99a)7B0rvr*FW01TUI?~Un2l0ALgzXFV8kr_){tLpAUF>HyY?n5=zpSj; zPwoQhe%pQ7+#4lfBv_V zLC92tqEx%iDVWt>S54F zq5|d6(LQ9Qf-K{AYkzO_8>o9u2+HN2g9F873C`rhl`Pqjz6@BDUTWJ6jU%t42gv>@ zPy&ThJ;`?4;y;017a7C{hjKFaYc6S18_o!3-u=h5=_fU~r`N+N0KIJ!Kji>4-V!MI z7@**SW}>zXoCyN1WG8QbdK_(dAFxas7e@3E>BE=80}OTH*Ywz~@gZ%vvFhhH1sqjk zTG9Eq`Ic^Fr^!l<0G_C3>eCMOk3!|qeV#J9wH`I#KB@`}%l0N28C?uIEsYGhp%O4P~7$X5h#m2}wg@XrhI&XQbZqQ$< z#dt|Pcr6mViWmNWJc)!Agw?-|Sk7KFxd}TQ71fhX@`)V`l}iVk(wB3Dxow1DTc8p+ z-*BorLKXw;!D2l!H9Xg7N*7@r=?Ry|1x2phhlz7|i{VeXi}RvQp*UkP9}EOiiC z5+ZdT-@87Ga+4-_xGGjzFDLvb@zkAP^t-^}VljYt3bpNj2OFPopuGY2*%XNo`y_Cx8b4OfLU-7G^- zJ;lSirLXk(11eA*G+&^h08tbK!y1Fg4^VVa4 zj4QUYzFT7aY{^v%8Kw}dht$-ts0Ww6E62(*v{IlT#4Td)7}sM_FW74?;w;C7*;nt) z9`jRj#t-+(_XM*a<%nNC2~!kwPo4DOt6?pFhdMQ&%go6&Xx0F`AUl)*$U2K@VugI^ zQkAopml48$>_gDcrX(*+G|@ipalLqpra6Y`5CEx@s`hJhO+jlpgA9W`Aw~X}+mjg^ za$2o&`d%>;YazwtKmLJ(w~MyPG&7F)d?pmrP)s6P|Mi#IMLD5kGC$(T-F+^C|JvYx z+gg&p1~2tW8-6i)F9kM)nX#6Kx&@RAc;23VS?vCFa_A_rX)>&xolI=~ge7d7%QFSoT$EQb>$$)Jx1VT#Spw4MpFpUWTAk0Zq`qlK{CE#7O1?)F+)Snb z5yiP?_4BzHzhF&W^S4y6qrx}f{ zKn4%6wgc0mRV~)S(3?nq(ajj*MR-RLa0#(vaF&PgK8XazaLfN2$1<qQGDrSM|5C zaePH?*_Ot+-kuXNqWSbSOIz~#?MndjZ!G2XWRdQMP*H;1iB#kbCn|KZcr1bf32f9t1S%Mo4qeD{Z^S3Dzs>fI#Eu9!0Fmadt@ z3RF1HqWRM&3e-)+>q&^Y&7|TiA<-Ev5e*191nsK}+fF&g#lDW)6jBXFY>nxBE(pv4 z1!Q&UU$kf9^R&(hfRG2xhSI78UfA`rAw<|LkoC~=s6xSVlWz@g4XmpTI4dO-G8)5| zWBsO%8Ut|}&2v?MSxbOmAw{3I_#Y$)#!cI?WMHLV0#b^<4`Q1%QZElQZ+0Uha-Nbx zW~;FEuOI^57yAi75eOs{5;x2R>DFQ)biL!NITqtfp08c+$5XHFrD<`XTJ-ZNv%eXC z9N>yghBds4shvTZn1+(@lN)4HiQS&>rUu8sWd#3e?}N90aw+9p#@lgqEzsVqt{HB# zl76&^bXz@{`YzBsM`W}(zrsa4h+Drv?PWoR>h?bb`9WQO9M6H(6A@}Io@#xVfxfqM zs~5N1A2hQDUVZdP?|g*Mc5ayud-YP{Uixx$la5vUzZXxc#-(BCZUBS~ZHpdqyMwX% zi_bT$*zH|^cSo5$4_mksp&$+G4C||mAowpyN;1cr0;77Fj8+=H0leysh8}LB6i6IE z#sRgt%*s#~VFDltl51a8$;&8J)zC;F!@HjS)UXcIW_w@UYvTi>fKzw?hpG*Rq?sFs zYGAAGs25oSF6%&PkaXi(mf)$BObN6Dafza^&_oG;%Y;VXi_uJ*DH=7kq3WfKjuTv6 zz8UP-g%CB(t^AynYG9w9PP#f>>pPMh^k zcQ>GTq;YB_&G~iAexN;o(X;oAS|_;^T*z8OgY$sLaIGFhmknm7#B=T)W0u16R>S~V z0WYV2?Tv-0J&)qNuhY986@?VuL)q$z#)~vJatKXDxl4jHCFBKvHUuK|pHO07uAR_| zi?hR>C@XvW08O{D&NFDlZ=~*N{?*CthfPsH9kjt&&P(4(2d$zs#@=__NmsUmlzmd` zXBS6VBh)f^cw1;vo@R{vv2hPInrVv)sibRvKXxnEnXcIAqR5z-_ut_n9#NJ z=PONlk4euXZHBokk4ca-r^vDe78lC_6bQDQ9=uhhs`LWZ&dN$)ezyUpl~XiF-;6ehS)lZEax5$YVe75$JDkMYM{l4MX5o?^ zt+aXf`h$6Y;=7Aj#(P>xtr%WatFL5XK(Df@^k(2eCr!O#<5{Ie-Z+4^UtvflJux%K zAPHg@M`HPV9;6Y=t-;QzW)RtbTK2!E^32`hu_g88(r7oUAZ{ElT$3wFe}|byu{Qa@#2C zVaE_jZP=vns|D<*Ep4tWJYZ-!UL53&oqeo*SQ8l8fSCAcVBtt897rL5o!XDsb3yYr z@e=0dNxndQh11jYdq0#W!h|wwpw!u0!doOPbEYw)oY`VT!CTT@Q7AnXJ%@$e8rCwS z2!|@I&Asc>+=r8Qp*&s7N`JtQh(aY45G9gNy`;16X2vgRXi=`aIyz3U)y3y+ zIh1ahtJdJZ<+_QY=Zh6EhW67wB&g~PHCHgCWWPm4a5DG9zn#E$Cd2ye5#h0lE`93N1&7q(_p41VMX69{-09JNE(xS?W-H98 z2NuBpc8Z*QX~EpI2yYpMgM8Wd;CRv6l(*QM*mKXklV^wcPX@zvf3lB{(~}aqd7>$X zk1T=0^i}kKc2SQE*71Jv#Q;EmZA31T?=Aqi-gzKd(}7{rGhx-%%O?dL3PsYs;*;>e zAl0J(qDQAWn>9-g-nb_%b>!|KT^&uwV-_=42XLB^rweoe?K5T->Gyk!_ez`b`oHC6 z^UQG(zjidTz(PNj9$+RU=)2`esL3sDQoFr@R{-6AzjPD~JxBOHIS7jcyznU|_k0>T zt+JQBT{Yfx*5=Nlbj4J-gu}fA7N&q)ZJ05u8l7!5opm=7w( zCIp6mi2XH#BS~$Df?av6%YI=tN2x!q$5u5ph;Aq;DncS)WG((GvMwik8ugJ9e5j(1 zw2}RUk#-Yxba4y@c<%QK3|FYwe){`DiR@Q-ceZQfM?C^;+?>UWC8r4&FR(ml*4x<( z?3+pnh~%o|NtQz+x0|iu7o*N^aCXo-IMEw_`J?Et