pwn 0.5.779 → 0.5.781

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -3
  3. data/documentation/AI-Integration.md +4 -4
  4. data/documentation/AWS.md +10 -9
  5. data/documentation/Agent-Tool-Registry.md +20 -17
  6. data/documentation/Blockchain.md +3 -2
  7. data/documentation/Bounty.md +8 -6
  8. data/documentation/BurpSuite.md +6 -10
  9. data/documentation/CLI-Drivers.md +7 -4
  10. data/documentation/Capability-Broker-Sandbox.md +1 -1
  11. data/documentation/Configuration.md +23 -15
  12. data/documentation/Contributing.md +3 -3
  13. data/documentation/Cron.md +3 -2
  14. data/documentation/Diagrams.md +9 -3
  15. data/documentation/Drivers.md +12 -6
  16. data/documentation/Extrospection.md +25 -5
  17. data/documentation/FFI.md +15 -25
  18. data/documentation/Fuzzing.md +13 -13
  19. data/documentation/General-PWN-Usage.md +7 -4
  20. data/documentation/Harness-Evaluation.md +90 -3
  21. data/documentation/Home.md +6 -5
  22. data/documentation/How-PWN-Works.md +9 -10
  23. data/documentation/Installation.md +12 -11
  24. data/documentation/Metasploit.md +13 -19
  25. data/documentation/Mistakes.md +2 -2
  26. data/documentation/NmapIt.md +6 -3
  27. data/documentation/Operability.md +99 -0
  28. data/documentation/Persistence.md +3 -2
  29. data/documentation/Plugin-Degradation.md +4 -2
  30. data/documentation/Plugins.md +4 -11
  31. data/documentation/Policy-Benchmark.md +4 -0
  32. data/documentation/Reinforcement-Learning.md +19 -3
  33. data/documentation/Reporting.md +6 -5
  34. data/documentation/SAST.md +15 -10
  35. data/documentation/SDR-Decoder-Coverage.md +10 -4
  36. data/documentation/SDR.md +28 -40
  37. data/documentation/Session-Workflow.md +25 -12
  38. data/documentation/Sessions.md +7 -0
  39. data/documentation/Skills-Memory-Learning.md +11 -4
  40. data/documentation/Swarm.md +6 -0
  41. data/documentation/Transparent-Browser.md +1 -1
  42. data/documentation/Troubleshooting.md +6 -3
  43. data/documentation/What-is-PWN.md +4 -4
  44. data/documentation/Why-PWN.md +1 -1
  45. data/documentation/diagrams/agent-tool-registry.svg +219 -180
  46. data/documentation/diagrams/ai-integration-tool-calling.svg +35 -34
  47. data/documentation/diagrams/code-scanning-sast.svg +78 -78
  48. data/documentation/diagrams/cron-scheduling.svg +165 -145
  49. data/documentation/diagrams/dot/_THEME.md +6 -4
  50. data/documentation/diagrams/dot/agent-tool-registry.dot +6 -2
  51. data/documentation/diagrams/dot/ai-integration-tool-calling.dot +1 -1
  52. data/documentation/diagrams/dot/code-scanning-sast.dot +8 -8
  53. data/documentation/diagrams/dot/cron-scheduling.dot +2 -0
  54. data/documentation/diagrams/dot/driver-framework.dot +1 -1
  55. data/documentation/diagrams/dot/extrospection-world-awareness.dot +2 -2
  56. data/documentation/diagrams/dot/fuzzing-workflow.dot +3 -3
  57. data/documentation/diagrams/dot/history-to-drivers.dot +1 -1
  58. data/documentation/diagrams/dot/memory-skills-detailed.dot +3 -3
  59. data/documentation/diagrams/dot/mistakes-negative-feedback.dot +2 -2
  60. data/documentation/diagrams/dot/overall-pwn-architecture.dot +33 -121
  61. data/documentation/diagrams/dot/persistence-filesystem.dot +2 -2
  62. data/documentation/diagrams/dot/plugin-ecosystem.dot +2 -2
  63. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +31 -167
  64. data/documentation/diagrams/dot/pwn-repl-prototyping.dot +1 -1
  65. data/documentation/diagrams/dot/reinforcement-learning.dot +15 -7
  66. data/documentation/diagrams/dot/reporting-pipeline.dot +5 -3
  67. data/documentation/diagrams/dot/reverse-engineering-flow.dot +3 -3
  68. data/documentation/diagrams/dot/sdr-radio-flow.dot +5 -5
  69. data/documentation/diagrams/dot/sessions-cron-automation.dot +1 -1
  70. data/documentation/diagrams/dot/swarm-multi-agent.dot +3 -3
  71. data/documentation/diagrams/dot/task-summarizer.dot +2 -2
  72. data/documentation/diagrams/dot/web-application-testing.dot +4 -3
  73. data/documentation/diagrams/dot/zero-day-research-flow.dot +4 -3
  74. data/documentation/diagrams/driver-framework.svg +1 -1
  75. data/documentation/diagrams/extrospection-world-awareness.svg +178 -178
  76. data/documentation/diagrams/fuzzing-workflow.svg +58 -58
  77. data/documentation/diagrams/history-to-drivers.svg +42 -42
  78. data/documentation/diagrams/memory-skills-detailed.svg +210 -210
  79. data/documentation/diagrams/mistakes-negative-feedback.svg +116 -116
  80. data/documentation/diagrams/overall-pwn-architecture.svg +248 -404
  81. data/documentation/diagrams/persistence-filesystem.svg +143 -143
  82. data/documentation/diagrams/plugin-ecosystem.svg +100 -100
  83. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +233 -752
  84. data/documentation/diagrams/pwn-repl-prototyping.svg +27 -27
  85. data/documentation/diagrams/reinforcement-learning.svg +295 -221
  86. data/documentation/diagrams/reporting-pipeline.svg +94 -80
  87. data/documentation/diagrams/reverse-engineering-flow.svg +31 -31
  88. data/documentation/diagrams/sdr-radio-flow.svg +157 -155
  89. data/documentation/diagrams/sessions-cron-automation.svg +13 -13
  90. data/documentation/diagrams/swarm-multi-agent.svg +86 -86
  91. data/documentation/diagrams/task-summarizer.svg +57 -57
  92. data/documentation/diagrams/web-application-testing.svg +81 -75
  93. data/documentation/diagrams/zero-day-research-flow.svg +101 -92
  94. data/documentation/pwn-REPL.md +5 -3
  95. data/documentation/pwn-ai-Agent.md +18 -14
  96. data/documentation/pwn_silent_help_learn_demo.gif +0 -0
  97. data/etc/default_skills/pwn/ai/agent/learning/SKILL.md +1 -0
  98. data/lib/pwn/ai/agent/learning.rb +46 -1
  99. data/lib/pwn/ai/agent/loop.rb +6 -3
  100. data/lib/pwn/ai/agent/policy_evaluation.rb +5 -1
  101. data/lib/pwn/ai/agent/reward.rb +9 -0
  102. data/lib/pwn/version.rb +1 -1
  103. data/spec/fixtures/harness/completion_regressions.json +10 -0
  104. data/spec/fixtures/harness/completion_regressions.json.sha256 +1 -0
  105. data/spec/integration/harness_evaluation_spec.rb +13 -0
  106. data/spec/lib/pwn/ai/agent/learning_spec.rb +22 -0
  107. data/spec/lib/pwn/ai/agent/loop_spec.rb +39 -0
  108. data/spec/lib/pwn/ai/agent/policy_evaluation_spec.rb +6 -1
  109. data/spec/lib/pwn/ai/agent/reward_spec.rb +21 -0
  110. data/spec/support/harness/evaluate.rb +1 -1
  111. data/third_party/pwn_rdoc.jsonl +2 -1
  112. metadata +10 -7
@@ -4,330 +4,332 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_SDR Pages: 1 -->
7
- <svg width="1792pt" height="864pt"
8
- viewBox="0.00 0.00 1792.00 864.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
- <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(43.2 821.05)">
7
+ <svg width="1896pt" height="998pt"
8
+ viewBox="0.00 0.00 1896.00 998.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
+ <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(43.2 955.27)">
10
10
  <title>PWN_SDR</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-821.05 1748.95,-821.05 1748.95,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="614.38" y="-755.85" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::SDR &#45; Software&#45;Defined Radio &amp; RF Hacking</text>
13
- <text xml:space="preserve" text-anchor="start" x="440.75" y="-744.4" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">GQRX · FlipperZero · RFIDler · FrequencyAllocation · Decoder::* (20+Base/DSP) · Base.run_iq (true&#45;air) · FFI::{Volk,Liquid,FFTW,RTLSdr,HackRF,AdalmPluto,SoapySDR}</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-955.27 1852.45,-955.27 1852.45,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="666.12" y="-890.07" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::SDR &#45; Software&#45;Defined Radio &amp; RF Hacking</text>
13
+ <text xml:space="preserve" text-anchor="start" x="469.62" y="-878.62" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">GQRX · FlipperZero · RFIDler · FrequencyAllocation · Decoder::* (21+Base/DSP) · mode&#45;specific input boundaries · FFI::{Volk,Liquid,FFTW,RTLSdr,HackRF,AdalmPluto,SoapySDR}</text>
14
14
  <g id="clust1" class="cluster">
15
15
  <title>cluster_hw</title>
16
- <path fill="#022c22" stroke="#047857" d="M223.5,-558C223.5,-558 487,-558 487,-558 493,-558 499,-564 499,-570 499,-570 499,-697 499,-697 499,-703 493,-709 487,-709 487,-709 223.5,-709 223.5,-709 217.5,-709 211.5,-703 211.5,-697 211.5,-697 211.5,-570 211.5,-570 211.5,-564 217.5,-558 223.5,-558"/>
17
- <text xml:space="preserve" text-anchor="middle" x="355.25" y="-686" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Hardware</text>
16
+ <path fill="#022c22" stroke="#047857" d="M223.5,-627C223.5,-627 834.5,-627 834.5,-627 840.5,-627 846.5,-633 846.5,-639 846.5,-639 846.5,-698 846.5,-698 846.5,-704 840.5,-710 834.5,-710 834.5,-710 223.5,-710 223.5,-710 217.5,-710 211.5,-704 211.5,-698 211.5,-698 211.5,-639 211.5,-639 211.5,-633 217.5,-627 223.5,-627"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="529" y="-687" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Hardware</text>
18
18
  </g>
19
19
  <g id="clust2" class="cluster">
20
20
  <title>cluster_ffi</title>
21
- <path fill="#0c4a6e" stroke="#0369a1" d="M553.75,-259C553.75,-259 1000.5,-259 1000.5,-259 1006.5,-259 1012.5,-265 1012.5,-271 1012.5,-271 1012.5,-466 1012.5,-466 1012.5,-472 1006.5,-478 1000.5,-478 1000.5,-478 553.75,-478 553.75,-478 547.75,-478 541.75,-472 541.75,-466 541.75,-466 541.75,-271 541.75,-271 541.75,-265 547.75,-259 553.75,-259"/>
22
- <text xml:space="preserve" text-anchor="middle" x="777.12" y="-455" font-family="sans-Serif" font-size="20.00" fill="#bae6fd">PWN::FFI native backends</text>
21
+ <path fill="#0c4a6e" stroke="#0369a1" d="M565,-369C565,-369 1017.25,-369 1017.25,-369 1023.25,-369 1029.25,-375 1029.25,-381 1029.25,-381 1029.25,-576 1029.25,-576 1029.25,-582 1023.25,-588 1017.25,-588 1017.25,-588 565,-588 565,-588 559,-588 553,-582 553,-576 553,-576 553,-381 553,-381 553,-375 559,-369 565,-369"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="791.12" y="-565" font-family="sans-Serif" font-size="20.00" fill="#bae6fd">PWN::FFI native backends</text>
23
23
  </g>
24
24
  <g id="clust3" class="cluster">
25
25
  <title>cluster_ctrl</title>
26
- <path fill="#422006" stroke="#a16207" d="M535,-543C535,-543 989.25,-543 989.25,-543 995.25,-543 1001.25,-549 1001.25,-555 1001.25,-555 1001.25,-710 1001.25,-710 1001.25,-716 995.25,-722 989.25,-722 989.25,-722 535,-722 535,-722 529,-722 523,-716 523,-710 523,-710 523,-555 523,-555 523,-549 529,-543 535,-543"/>
27
- <text xml:space="preserve" text-anchor="middle" x="762.12" y="-699" font-family="sans-Serif" font-size="20.00" fill="#fde68a">Control · Scan</text>
26
+ <path fill="#422006" stroke="#a16207" d="M546.25,-8C546.25,-8 1610.88,-8 1610.88,-8 1616.88,-8 1622.88,-14 1622.88,-20 1622.88,-20 1622.88,-99 1622.88,-99 1622.88,-105 1616.88,-111 1610.88,-111 1610.88,-111 546.25,-111 546.25,-111 540.25,-111 534.25,-105 534.25,-99 534.25,-99 534.25,-20 534.25,-20 534.25,-14 540.25,-8 546.25,-8"/>
27
+ <text xml:space="preserve" text-anchor="middle" x="1078.56" y="-88" font-family="sans-Serif" font-size="20.00" fill="#fde68a">Control · Scan</text>
28
28
  </g>
29
29
  <g id="clust4" class="cluster">
30
30
  <title>cluster_dec</title>
31
- <path fill="#2e1065" stroke="#6d28d9" d="M20,-8C20,-8 1685.75,-8 1685.75,-8 1691.75,-8 1697.75,-14 1697.75,-20 1697.75,-20 1697.75,-239 1697.75,-239 1697.75,-245 1691.75,-251 1685.75,-251 1685.75,-251 20,-251 20,-251 14,-251 8,-245 8,-239 8,-239 8,-20 8,-20 8,-14 14,-8 20,-8"/>
32
- <text xml:space="preserve" text-anchor="middle" x="852.88" y="-228" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Decode · Sense · Record</text>
31
+ <path fill="#2e1065" stroke="#6d28d9" d="M20,-119C20,-119 1789.25,-119 1789.25,-119 1795.25,-119 1801.25,-125 1801.25,-131 1801.25,-131 1801.25,-349 1801.25,-349 1801.25,-355 1795.25,-361 1789.25,-361 1789.25,-361 20,-361 20,-361 14,-361 8,-355 8,-349 8,-349 8,-131 8,-131 8,-125 14,-119 20,-119"/>
32
+ <text xml:space="preserve" text-anchor="middle" x="904.62" y="-338" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Decode · Sense · Record</text>
33
33
  </g>
34
34
  <!-- RF -->
35
35
  <g id="node1" class="node">
36
36
  <title>RF</title>
37
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M111.88,-670C111.88,-670 42.62,-670 42.62,-670 36.62,-670 30.62,-664 30.62,-658 30.62,-658 30.62,-646 30.62,-646 30.62,-640 36.62,-634 42.62,-634 42.62,-634 111.88,-634 111.88,-634 117.88,-634 123.88,-640 123.88,-646 123.88,-646 123.88,-658 123.88,-658 123.88,-664 117.88,-670 111.88,-670"/>
38
- <text xml:space="preserve" text-anchor="middle" x="77.25" y="-648.88" font-family="sans-Serif" font-size="10.00" fill="#0f172a">📡 &#160;RF Spectrum</text>
37
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M111.88,-819C111.88,-819 42.62,-819 42.62,-819 36.62,-819 30.62,-813 30.62,-807 30.62,-807 30.62,-795 30.62,-795 30.62,-789 36.62,-783 42.62,-783 42.62,-783 111.88,-783 111.88,-783 117.88,-783 123.88,-789 123.88,-795 123.88,-795 123.88,-807 123.88,-807 123.88,-813 117.88,-819 111.88,-819"/>
38
+ <text xml:space="preserve" text-anchor="middle" x="77.25" y="-797.88" font-family="sans-Serif" font-size="10.00" fill="#0f172a">📡 &#160;RF Spectrum</text>
39
39
  </g>
40
40
  <!-- SDRhw -->
41
41
  <g id="node2" class="node">
42
42
  <title>SDRhw</title>
43
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M357.75,-670C357.75,-670 231.5,-670 231.5,-670 225.5,-670 219.5,-664 219.5,-658 219.5,-658 219.5,-646 219.5,-646 219.5,-640 225.5,-634 231.5,-634 231.5,-634 357.75,-634 357.75,-634 363.75,-634 369.75,-640 369.75,-646 369.75,-646 369.75,-658 369.75,-658 369.75,-664 363.75,-670 357.75,-670"/>
44
- <text xml:space="preserve" text-anchor="middle" x="294.62" y="-654.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">RTL&#45;SDR / HackRF / Airspy</text>
45
- <text xml:space="preserve" text-anchor="middle" x="294.62" y="-642.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ADALM&#45;Pluto / any Soapy dev</text>
43
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M357.75,-671C357.75,-671 231.5,-671 231.5,-671 225.5,-671 219.5,-665 219.5,-659 219.5,-659 219.5,-647 219.5,-647 219.5,-641 225.5,-635 231.5,-635 231.5,-635 357.75,-635 357.75,-635 363.75,-635 369.75,-641 369.75,-647 369.75,-647 369.75,-659 369.75,-659 369.75,-665 363.75,-671 357.75,-671"/>
44
+ <text xml:space="preserve" text-anchor="middle" x="294.62" y="-655.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">RTL&#45;SDR / HackRF / Airspy</text>
45
+ <text xml:space="preserve" text-anchor="middle" x="294.62" y="-643.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ADALM&#45;Pluto / any Soapy dev</text>
46
46
  </g>
47
47
  <!-- RF&#45;&gt;SDRhw -->
48
48
  <g id="edge1" class="edge">
49
49
  <title>RF&#45;&gt;SDRhw</title>
50
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M124.45,-652C149.22,-652 180.5,-652 209.42,-652"/>
51
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="209.15,-654.8 217.15,-652 209.15,-649.2 209.15,-654.8"/>
50
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M105.09,-782.55C143.89,-755.89 215.68,-706.56 258.6,-677.07"/>
51
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="260.15,-679.4 265.16,-672.56 256.98,-674.78 260.15,-679.4"/>
52
52
  </g>
53
53
  <!-- Flipper -->
54
54
  <g id="node3" class="node">
55
55
  <title>Flipper</title>
56
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M328.88,-602C328.88,-602 260.38,-602 260.38,-602 254.38,-602 248.38,-596 248.38,-590 248.38,-590 248.38,-578 248.38,-578 248.38,-572 254.38,-566 260.38,-566 260.38,-566 328.88,-566 328.88,-566 334.88,-566 340.88,-572 340.88,-578 340.88,-578 340.88,-590 340.88,-590 340.88,-596 334.88,-602 328.88,-602"/>
57
- <text xml:space="preserve" text-anchor="middle" x="294.62" y="-580.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SDR::FlipperZero</text>
56
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M490.25,-671C490.25,-671 421.75,-671 421.75,-671 415.75,-671 409.75,-665 409.75,-659 409.75,-659 409.75,-647 409.75,-647 409.75,-641 415.75,-635 421.75,-635 421.75,-635 490.25,-635 490.25,-635 496.25,-635 502.25,-641 502.25,-647 502.25,-647 502.25,-659 502.25,-659 502.25,-665 496.25,-671 490.25,-671"/>
57
+ <text xml:space="preserve" text-anchor="middle" x="456" y="-649.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SDR::FlipperZero</text>
58
58
  </g>
59
59
  <!-- RF&#45;&gt;Flipper -->
60
60
  <g id="edge2" class="edge">
61
61
  <title>RF&#45;&gt;Flipper</title>
62
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M124.45,-637.41C157.92,-626.84 203.31,-612.51 238.65,-601.36"/>
63
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="239.21,-604.12 245.99,-599.04 237.52,-598.78 239.21,-604.12"/>
62
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M124.27,-809.41C184.93,-818.01 292.95,-824.56 369.75,-780 408.09,-757.75 432.68,-710.52 445.15,-680.34"/>
63
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="447.7,-681.5 448.05,-673.03 442.5,-679.43 447.7,-681.5"/>
64
64
  </g>
65
65
  <!-- RFID -->
66
66
  <g id="node4" class="node">
67
67
  <title>RFID</title>
68
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M479,-670C479,-670 421.75,-670 421.75,-670 415.75,-670 409.75,-664 409.75,-658 409.75,-658 409.75,-646 409.75,-646 409.75,-640 415.75,-634 421.75,-634 421.75,-634 479,-634 479,-634 485,-634 491,-640 491,-646 491,-646 491,-658 491,-658 491,-664 485,-670 479,-670"/>
69
- <text xml:space="preserve" text-anchor="middle" x="450.38" y="-654.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SDR::RFIDler</text>
70
- <text xml:space="preserve" text-anchor="middle" x="450.38" y="-642.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SonMicroRFID</text>
68
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M826.5,-671C826.5,-671 769.25,-671 769.25,-671 763.25,-671 757.25,-665 757.25,-659 757.25,-659 757.25,-647 757.25,-647 757.25,-641 763.25,-635 769.25,-635 769.25,-635 826.5,-635 826.5,-635 832.5,-635 838.5,-641 838.5,-647 838.5,-647 838.5,-659 838.5,-659 838.5,-665 832.5,-671 826.5,-671"/>
69
+ <text xml:space="preserve" text-anchor="middle" x="797.88" y="-655.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SDR::RFIDler</text>
70
+ <text xml:space="preserve" text-anchor="middle" x="797.88" y="-643.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SonMicroRFID</text>
71
71
  </g>
72
72
  <!-- RF&#45;&gt;RFID -->
73
73
  <g id="edge3" class="edge">
74
74
  <title>RF&#45;&gt;RFID</title>
75
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M109.53,-670.6C128.71,-680.91 154.18,-692.69 178.5,-698 261.54,-716.14 287.65,-720.01 369.75,-698 386.35,-693.55 403.07,-684.71 416.87,-675.95"/>
76
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="418.28,-678.38 423.42,-671.64 415.2,-673.7 418.28,-678.38"/>
75
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M110.02,-819.43C129.17,-829.46 154.44,-840.85 178.5,-846 319.2,-876.13 364.37,-887.14 502.25,-846 613.49,-812.81 721.77,-722.71 770.3,-678.36"/>
76
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="772.15,-680.46 776.13,-672.98 768.35,-676.35 772.15,-680.46"/>
77
77
  </g>
78
78
  <!-- Front -->
79
79
  <g id="node8" class="node">
80
80
  <title>Front</title>
81
- <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M675.25,-381C675.25,-381 561.75,-381 561.75,-381 555.75,-381 549.75,-375 549.75,-369 549.75,-369 549.75,-337 549.75,-337 549.75,-331 555.75,-325 561.75,-325 561.75,-325 675.25,-325 675.25,-325 681.25,-325 687.25,-331 687.25,-337 687.25,-337 687.25,-369 687.25,-369 687.25,-375 681.25,-381 675.25,-381"/>
82
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-367.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">FFI::{RTLSdr,HackRF,</text>
83
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-355.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">AdalmPluto,SoapySDR}</text>
84
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-343.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">open · configure · start_rx</text>
85
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-331.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">read_sync raw I/Q · stop_rx</text>
81
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M686.5,-491C686.5,-491 573,-491 573,-491 567,-491 561,-485 561,-479 561,-479 561,-447 561,-447 561,-441 567,-435 573,-435 573,-435 686.5,-435 686.5,-435 692.5,-435 698.5,-441 698.5,-447 698.5,-447 698.5,-479 698.5,-479 698.5,-485 692.5,-491 686.5,-491"/>
82
+ <text xml:space="preserve" text-anchor="middle" x="629.75" y="-477.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">FFI::{RTLSdr,HackRF,</text>
83
+ <text xml:space="preserve" text-anchor="middle" x="629.75" y="-465.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">AdalmPluto,SoapySDR}</text>
84
+ <text xml:space="preserve" text-anchor="middle" x="629.75" y="-453.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">open · configure · start_rx</text>
85
+ <text xml:space="preserve" text-anchor="middle" x="629.75" y="-441.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">read_sync raw I/Q · stop_rx</text>
86
86
  </g>
87
87
  <!-- SDRhw&#45;&gt;Front -->
88
88
  <g id="edge4" class="edge">
89
89
  <title>SDRhw&#45;&gt;Front</title>
90
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M363.77,-633.47C365.82,-632.38 367.82,-631.22 369.75,-630 376.48,-625.74 520.24,-463.24 585.62,-389.15"/>
91
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="587.58,-391.17 590.77,-383.32 583.38,-387.46 587.58,-391.17"/>
92
- <text xml:space="preserve" text-anchor="middle" x="450.38" y="-583.15" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">libusb / libiio</text>
90
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M361.86,-634.4C364.55,-633.31 367.19,-632.18 369.75,-631 391.44,-621 508.5,-543.47 577.6,-497.31"/>
91
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="579.05,-499.71 584.14,-492.93 575.93,-495.05 579.05,-499.71"/>
92
+ <text xml:space="preserve" text-anchor="middle" x="456" y="-606.37" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">libusb / libiio</text>
93
93
  </g>
94
94
  <!-- GQRX -->
95
95
  <g id="node9" class="node">
96
96
  <title>GQRX</title>
97
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M694,-607C694,-607 543,-607 543,-607 537,-607 531,-601 531,-595 531,-595 531,-563 531,-563 531,-557 537,-551 543,-551 543,-551 694,-551 694,-551 700,-551 706,-557 706,-563 706,-563 706,-595 706,-595 706,-601 700,-607 694,-607"/>
98
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-593.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SDR::GQRX</text>
99
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-581.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">remote control</text>
100
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-569.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">spectrum + FFT geometry</text>
101
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-557.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(RAW panorama · plan&#45;param refine)</text>
97
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M705.25,-72C705.25,-72 554.25,-72 554.25,-72 548.25,-72 542.25,-66 542.25,-60 542.25,-60 542.25,-28 542.25,-28 542.25,-22 548.25,-16 554.25,-16 554.25,-16 705.25,-16 705.25,-16 711.25,-16 717.25,-22 717.25,-28 717.25,-28 717.25,-60 717.25,-60 717.25,-66 711.25,-72 705.25,-72"/>
98
+ <text xml:space="preserve" text-anchor="middle" x="629.75" y="-58.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SDR::GQRX</text>
99
+ <text xml:space="preserve" text-anchor="middle" x="629.75" y="-46.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">remote control</text>
100
+ <text xml:space="preserve" text-anchor="middle" x="629.75" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">spectrum + FFT geometry</text>
101
+ <text xml:space="preserve" text-anchor="middle" x="629.75" y="-22.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(RAW panorama · plan&#45;param refine)</text>
102
102
  </g>
103
103
  <!-- SDRhw&#45;&gt;GQRX -->
104
104
  <g id="edge5" class="edge">
105
105
  <title>SDRhw&#45;&gt;GQRX</title>
106
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M370.28,-635.07C415.11,-624.9 472.63,-611.86 520.9,-600.91"/>
107
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="521.32,-603.68 528.5,-599.18 520.08,-598.22 521.32,-603.68"/>
106
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M365.33,-634.52C366.86,-633.41 368.34,-632.24 369.75,-631 372.58,-628.51 555.95,-210.2 612.4,-81.34"/>
107
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="614.8,-82.83 615.45,-74.37 609.67,-80.58 614.8,-82.83"/>
108
108
  </g>
109
- <!-- Freq -->
110
- <g id="node10" class="node">
111
- <title>Freq</title>
112
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M672.62,-683C672.62,-683 564.38,-683 564.38,-683 558.38,-683 552.38,-677 552.38,-671 552.38,-671 552.38,-651 552.38,-651 552.38,-645 558.38,-639 564.38,-639 564.38,-639 672.62,-639 672.62,-639 678.62,-639 684.62,-645 684.62,-651 684.62,-651 684.62,-671 684.62,-671 684.62,-677 678.62,-683 672.62,-683"/>
113
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-669.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SDR::FrequencyAllocation</text>
114
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-657.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">band lookup</text>
115
- <text xml:space="preserve" text-anchor="middle" x="618.5" y="-645.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan_bw · precision</text>
109
+ <!-- Obs -->
110
+ <g id="node15" class="node">
111
+ <title>Obs</title>
112
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1781.25,-270C1781.25,-270 1727.75,-270 1727.75,-270 1721.75,-270 1715.75,-264 1715.75,-258 1715.75,-258 1715.75,-246 1715.75,-246 1715.75,-240 1721.75,-234 1727.75,-234 1727.75,-234 1781.25,-234 1781.25,-234 1787.25,-234 1793.25,-240 1793.25,-246 1793.25,-246 1793.25,-258 1793.25,-258 1793.25,-264 1787.25,-270 1781.25,-270"/>
113
+ <text xml:space="preserve" text-anchor="middle" x="1754.5" y="-254.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extro_observe</text>
114
+ <text xml:space="preserve" text-anchor="middle" x="1754.5" y="-242.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">category: :rf</text>
116
115
  </g>
117
- <!-- Flipper&#45;&gt;Freq -->
116
+ <!-- Flipper&#45;&gt;Obs -->
118
117
  <g id="edge19" class="edge">
119
- <title>Flipper&#45;&gt;Freq</title>
120
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M341.25,-585.8C383.55,-588.8 447.53,-596.79 499,-618 511.09,-622.98 511.19,-629.4 523,-635 529.24,-637.95 535.87,-640.63 542.62,-643.03"/>
121
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="541.52,-645.61 550,-645.51 543.31,-640.31 541.52,-645.61"/>
118
+ <title>Flipper&#45;&gt;Obs</title>
119
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M502.7,-644.17C567.77,-632.39 690.97,-613 796.88,-613 796.88,-613 796.88,-613 1555.75,-613 1707.18,-613 1743.41,-365.64 1751.4,-280.43"/>
120
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1754.18,-280.82 1752.09,-272.61 1748.6,-280.33 1754.18,-280.82"/>
121
+ <text xml:space="preserve" text-anchor="middle" x="1103.62" y="-614.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">operator observation</text>
122
122
  </g>
123
- <!-- Scan -->
124
- <g id="node11" class="node">
125
- <title>Scan</title>
126
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M981.25,-683C981.25,-683 885,-683 885,-683 879,-683 873,-677 873,-671 873,-671 873,-651 873,-651 873,-645 879,-639 885,-639 885,-639 981.25,-639 981.25,-639 987.25,-639 993.25,-645 993.25,-651 993.25,-651 993.25,-671 993.25,-671 993.25,-677 987.25,-683 981.25,-683"/>
127
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-669.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">bin/pwn_gqrx_scanner</text>
128
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-657.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">&#45;&#45;fft&#45;scan · iterative</text>
129
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-645.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">&#45;&#45;min&#45;snr&#45;db · &#45;&#45;no&#45;refine</text>
130
- </g>
131
- <!-- RFID&#45;&gt;Scan -->
123
+ <!-- RFID&#45;&gt;Obs -->
132
124
  <g id="edge20" class="edge">
133
- <title>RFID&#45;&gt;Scan</title>
134
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M467.15,-670.63C480.4,-684.73 500.71,-703 523,-711 647.98,-755.85 691.96,-739.03 821.75,-711 843.23,-706.36 865.56,-697.18 884.46,-687.94"/>
135
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="885.52,-690.54 891.41,-684.45 883.01,-685.54 885.52,-690.54"/>
125
+ <title>RFID&#45;&gt;Obs</title>
126
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M839.13,-664.38C851.66,-667.58 865.58,-670.78 878.5,-673 977.11,-689.9 1002.58,-694 1102.62,-694 1102.62,-694 1102.62,-694 1555.75,-694 1614.6,-694 1639.37,-684.26 1675.75,-638 1719.94,-581.82 1743.81,-359.87 1751.08,-280.45"/>
127
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1753.86,-280.82 1751.78,-272.6 1748.28,-280.32 1753.86,-280.82"/>
128
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-695.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">operator observation</text>
136
129
  </g>
137
130
  <!-- Volk -->
138
131
  <g id="node5" class="node">
139
132
  <title>Volk</title>
140
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M992.5,-439C992.5,-439 873.75,-439 873.75,-439 867.75,-439 861.75,-433 861.75,-427 861.75,-427 861.75,-415 861.75,-415 861.75,-409 867.75,-403 873.75,-403 873.75,-403 992.5,-403 992.5,-403 998.5,-403 1004.5,-409 1004.5,-415 1004.5,-415 1004.5,-427 1004.5,-427 1004.5,-433 998.5,-439 992.5,-439"/>
141
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-423.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">FFI::Volk</text>
142
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-411.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SIMD s16→f32 · accumulate</text>
133
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M1009.25,-413C1009.25,-413 890.5,-413 890.5,-413 884.5,-413 878.5,-407 878.5,-401 878.5,-401 878.5,-389 878.5,-389 878.5,-383 884.5,-377 890.5,-377 890.5,-377 1009.25,-377 1009.25,-377 1015.25,-377 1021.25,-383 1021.25,-389 1021.25,-389 1021.25,-401 1021.25,-401 1021.25,-407 1015.25,-413 1009.25,-413"/>
134
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-397.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">FFI::Volk</text>
135
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-385.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SIMD s16→f32 · accumulate</text>
143
136
  </g>
144
137
  <!-- DSP -->
145
138
  <g id="node13" class="node">
146
139
  <title>DSP</title>
147
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1227.5,-135C1227.5,-135 1097.5,-135 1097.5,-135 1091.5,-135 1085.5,-129 1085.5,-123 1085.5,-123 1085.5,-103 1085.5,-103 1085.5,-97 1091.5,-91 1097.5,-91 1097.5,-91 1227.5,-91 1227.5,-91 1233.5,-91 1239.5,-97 1239.5,-103 1239.5,-103 1239.5,-123 1239.5,-123 1239.5,-129 1233.5,-135 1227.5,-135"/>
148
- <text xml:space="preserve" text-anchor="middle" x="1162.5" y="-121.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Decoder::DSP</text>
149
- <text xml:space="preserve" text-anchor="middle" x="1162.5" y="-109.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">pure&#45;Ruby + FFI accel</text>
150
- <text xml:space="preserve" text-anchor="middle" x="1162.5" y="-97.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(unpack · resample · FSK · FM)</text>
140
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1328,-322C1328,-322 1198,-322 1198,-322 1192,-322 1186,-316 1186,-310 1186,-310 1186,-290 1186,-290 1186,-284 1192,-278 1198,-278 1198,-278 1328,-278 1328,-278 1334,-278 1340,-284 1340,-290 1340,-290 1340,-310 1340,-310 1340,-316 1334,-322 1328,-322"/>
141
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-308.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Decoder::DSP</text>
142
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-296.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">pure&#45;Ruby + FFI accel</text>
143
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-284.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(unpack · resample · FSK · FM)</text>
151
144
  </g>
152
145
  <!-- Volk&#45;&gt;DSP -->
153
146
  <g id="edge10" class="edge">
154
147
  <title>Volk&#45;&gt;DSP</title>
155
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M992.63,-402.4C1000,-398.21 1006.9,-393.13 1012.5,-387 1086.54,-305.93 1015.06,-235.21 1085.5,-151 1088.48,-147.44 1091.87,-144.18 1095.54,-141.2"/>
156
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1096.98,-143.61 1101.8,-136.63 1093.68,-139.09 1096.98,-143.61"/>
148
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1017.6,-376.36C1021.54,-375.23 1025.45,-374.1 1029.25,-373 1081.27,-357.9 1094.31,-354.21 1146,-338 1158.53,-334.07 1171.79,-329.82 1184.69,-325.63"/>
149
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1185.4,-328.34 1192.14,-323.2 1183.66,-323.02 1185.4,-328.34"/>
157
150
  </g>
158
151
  <!-- Liquid -->
159
152
  <g id="node6" class="node">
160
153
  <title>Liquid</title>
161
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M986.88,-371C986.88,-371 879.38,-371 879.38,-371 873.38,-371 867.38,-365 867.38,-359 867.38,-359 867.38,-347 867.38,-347 867.38,-341 873.38,-335 879.38,-335 879.38,-335 986.88,-335 986.88,-335 992.88,-335 998.88,-341 998.88,-347 998.88,-347 998.88,-359 998.88,-359 998.88,-365 992.88,-371 986.88,-371"/>
162
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-355.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">FFI::Liquid</text>
163
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-343.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">freqdem · msresamp · FIR</text>
154
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M1003.62,-549C1003.62,-549 896.12,-549 896.12,-549 890.12,-549 884.12,-543 884.12,-537 884.12,-537 884.12,-525 884.12,-525 884.12,-519 890.12,-513 896.12,-513 896.12,-513 1003.62,-513 1003.62,-513 1009.62,-513 1015.62,-519 1015.62,-525 1015.62,-525 1015.62,-537 1015.62,-537 1015.62,-543 1009.62,-549 1003.62,-549"/>
155
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-533.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">FFI::Liquid</text>
156
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-521.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">freqdem · msresamp · FIR</text>
164
157
  </g>
165
158
  <!-- Liquid&#45;&gt;DSP -->
166
159
  <g id="edge11" class="edge">
167
160
  <title>Liquid&#45;&gt;DSP</title>
168
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M990.91,-334.55C998.79,-330.3 1006.3,-325.17 1012.5,-319 1070.22,-261.58 1029.61,-210.2 1085.5,-151 1088.89,-147.4 1092.7,-144.1 1096.76,-141.07"/>
169
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1098.16,-143.51 1103.19,-136.69 1095,-138.88 1098.16,-143.51"/>
161
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1016.15,-525.98C1056.71,-520.12 1108.15,-507.43 1146,-480 1198.54,-441.94 1233.35,-372.12 1250.19,-331.53"/>
162
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1252.76,-332.66 1253.16,-324.19 1247.57,-330.56 1252.76,-332.66"/>
170
163
  </g>
171
164
  <!-- FFTW -->
172
165
  <g id="node7" class="node">
173
166
  <title>FFTW</title>
174
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M971.88,-303C971.88,-303 894.38,-303 894.38,-303 888.38,-303 882.38,-297 882.38,-291 882.38,-291 882.38,-279 882.38,-279 882.38,-273 888.38,-267 894.38,-267 894.38,-267 971.88,-267 971.88,-267 977.88,-267 983.88,-273 983.88,-279 983.88,-279 983.88,-291 983.88,-291 983.88,-297 977.88,-303 971.88,-303"/>
175
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-287.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">FFI::FFTW</text>
176
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-275.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">rfft · cfft · power&#45;dB</text>
167
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M988.62,-481C988.62,-481 911.12,-481 911.12,-481 905.12,-481 899.12,-475 899.12,-469 899.12,-469 899.12,-457 899.12,-457 899.12,-451 905.12,-445 911.12,-445 911.12,-445 988.62,-445 988.62,-445 994.62,-445 1000.62,-451 1000.62,-457 1000.62,-457 1000.62,-469 1000.62,-469 1000.62,-475 994.62,-481 988.62,-481"/>
168
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-465.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">FFI::FFTW</text>
169
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-453.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">rfft · cfft · power&#45;dB</text>
177
170
  </g>
178
171
  <!-- FFTW&#45;&gt;DSP -->
179
172
  <g id="edge12" class="edge">
180
173
  <title>FFTW&#45;&gt;DSP</title>
181
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M984.23,-273.83C994.2,-270.15 1004.16,-265.32 1012.5,-259 1058.68,-224.01 1041.94,-189.2 1085.5,-151 1089.76,-147.26 1094.46,-143.79 1099.36,-140.59"/>
182
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1100.72,-143.04 1106.09,-136.48 1097.8,-138.26 1100.72,-143.04"/>
174
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1001.16,-456.32C1042.18,-449.28 1100.56,-435.54 1146,-410 1182.62,-389.42 1216.48,-354.73 1238.05,-329.8"/>
175
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1240.01,-331.81 1243.06,-323.91 1235.75,-328.19 1240.01,-331.81"/>
183
176
  </g>
184
177
  <!-- Front&#45;&gt;Volk -->
185
178
  <g id="edge7" class="edge">
186
179
  <title>Front&#45;&gt;Volk</title>
187
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" stroke-dasharray="5,2" d="M687.94,-371.07C706.71,-375.82 727.1,-380.78 746,-385 780.5,-392.69 818.81,-400.27 851.66,-406.47"/>
188
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="850.91,-409.18 859.29,-407.9 851.94,-403.67 850.91,-409.18"/>
180
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" stroke-dasharray="5,2" d="M699.41,-450.09C741.88,-441.92 797.47,-430.87 846.5,-420 853.66,-418.41 861.09,-416.71 868.52,-414.97"/>
181
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="868.87,-417.76 876.01,-413.2 867.58,-412.31 868.87,-417.76"/>
189
182
  </g>
190
183
  <!-- Front&#45;&gt;Liquid -->
191
184
  <g id="edge8" class="edge">
192
185
  <title>Front&#45;&gt;Liquid</title>
193
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" stroke-dasharray="5,2" d="M688.11,-353C738.09,-353 805.76,-353 857.16,-353"/>
194
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="856.92,-355.8 864.92,-353 856.92,-350.2 856.92,-355.8"/>
186
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" stroke-dasharray="5,2" d="M699.17,-481.13C717.94,-485.88 738.33,-490.83 757.25,-495 795.47,-503.42 838.26,-511.57 873.69,-517.99"/>
187
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="873.18,-520.74 881.55,-519.4 874.17,-515.23 873.18,-520.74"/>
195
188
  </g>
196
189
  <!-- Front&#45;&gt;FFTW -->
197
190
  <g id="edge9" class="edge">
198
191
  <title>Front&#45;&gt;FFTW</title>
199
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" stroke-dasharray="5,2" d="M687.89,-338.7C727.1,-330.44 777.22,-319.78 821.75,-310 838.19,-306.39 855.99,-302.4 872.4,-298.68"/>
200
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="872.78,-301.46 879.96,-296.96 871.54,-296 872.78,-301.46"/>
192
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" stroke-dasharray="5,2" d="M699.39,-463C755.79,-463 834.9,-463 888.82,-463"/>
193
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="888.61,-465.8 896.61,-463 888.61,-460.2 888.61,-465.8"/>
201
194
  </g>
202
195
  <!-- Base -->
203
196
  <g id="node12" class="node">
204
197
  <title>Base</title>
205
- <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M984.25,-181C984.25,-181 882,-181 882,-181 876,-181 870,-175 870,-169 870,-169 870,-125 870,-125 870,-119 876,-113 882,-113 882,-113 984.25,-113 984.25,-113 990.25,-113 996.25,-119 996.25,-125 996.25,-125 996.25,-169 996.25,-169 996.25,-175 990.25,-181 984.25,-181"/>
206
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-167.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Decoder::Base</text>
207
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-155.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">run_iq (TRUE&#45;AIR I/Q)</text>
208
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-143.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">run_native (48 kHz UDP)</text>
209
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-131.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">run_detector (energy)</text>
210
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-119.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">resolve_iq_source :auto</text>
198
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1007.75,-295C1007.75,-295 892,-295 892,-295 886,-295 880,-289 880,-283 880,-283 880,-239 880,-239 880,-233 886,-227 892,-227 892,-227 1007.75,-227 1007.75,-227 1013.75,-227 1019.75,-233 1019.75,-239 1019.75,-239 1019.75,-283 1019.75,-283 1019.75,-289 1013.75,-295 1007.75,-295"/>
199
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-281.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Decoder::Base</text>
200
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-269.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">run_iq (supported IQ modes)</text>
201
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-257.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">run_native (48 kHz UDP)</text>
202
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-245.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">run_detector (energy)</text>
203
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-233.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">resolve_iq_source :auto</text>
211
204
  </g>
212
205
  <!-- Front&#45;&gt;Base -->
213
206
  <g id="edge6" class="edge">
214
207
  <title>Front&#45;&gt;Base</title>
215
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M687.9,-329.92C694.13,-327.16 700.25,-324.18 706,-321 773.4,-283.73 842.34,-227.55 886.09,-189.18"/>
216
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="887.81,-191.39 891.96,-183.99 884.11,-187.19 887.81,-191.39"/>
217
- <text xml:space="preserve" text-anchor="middle" x="783.88" y="-305.11" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">raw I/Q</text>
218
- <text xml:space="preserve" text-anchor="middle" x="783.88" y="-294.61" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">cu8/cs8/cs16</text>
208
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M699.07,-439.78C705.32,-437.05 711.47,-434.11 717.25,-431 785.13,-394.47 855.46,-340.09 900.55,-302.73"/>
209
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="902.27,-304.94 906.62,-297.66 898.69,-300.64 902.27,-304.94"/>
210
+ <text xml:space="preserve" text-anchor="middle" x="797.88" y="-419.82" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">raw I/Q</text>
211
+ <text xml:space="preserve" text-anchor="middle" x="797.88" y="-409.32" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">cu8/cs8/cs16</text>
219
212
  </g>
220
213
  <!-- Xrf -->
221
214
  <g id="node16" class="node">
222
215
  <title>Xrf</title>
223
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M126.5,-55C126.5,-55 28,-55 28,-55 22,-55 16,-49 16,-43 16,-43 16,-31 16,-31 16,-25 22,-19 28,-19 28,-19 126.5,-19 126.5,-19 132.5,-19 138.5,-25 138.5,-31 138.5,-31 138.5,-43 138.5,-43 138.5,-49 132.5,-55 126.5,-55"/>
224
- <text xml:space="preserve" text-anchor="middle" x="77.25" y="-39.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extro_snapshot :rf</text>
225
- <text xml:space="preserve" text-anchor="middle" x="77.25" y="-27.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">probe_rf → hw inventory</text>
216
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M126.5,-242C126.5,-242 28,-242 28,-242 22,-242 16,-236 16,-230 16,-230 16,-218 16,-218 16,-212 22,-206 28,-206 28,-206 126.5,-206 126.5,-206 132.5,-206 138.5,-212 138.5,-218 138.5,-218 138.5,-230 138.5,-230 138.5,-236 132.5,-242 126.5,-242"/>
217
+ <text xml:space="preserve" text-anchor="middle" x="77.25" y="-226.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extro_snapshot :rf</text>
218
+ <text xml:space="preserve" text-anchor="middle" x="77.25" y="-214.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">probe_rf → hw inventory</text>
226
219
  </g>
227
220
  <!-- Front&#45;&gt;Xrf -->
228
221
  <g id="edge23" class="edge">
229
222
  <title>Front&#45;&gt;Xrf</title>
230
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M605.88,-381.91C588.86,-419.86 553.15,-484.82 499,-512 463.55,-529.79 446.19,-527.66 409.75,-512 212.47,-427.22 113.67,-153.42 86.31,-64.89"/>
231
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="89.03,-64.23 84.03,-57.39 83.67,-65.85 89.03,-64.23"/>
223
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M608.72,-491.68C542.86,-582.6 328.72,-851.28 178.5,-728 103.89,-666.77 83.79,-349.02 79.35,-252.1"/>
224
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="82.16,-252.24 79.01,-244.37 76.56,-252.49 82.16,-252.24"/>
232
225
  </g>
233
226
  <!-- GQRX&#45;&gt;Base -->
234
227
  <g id="edge13" class="edge">
235
228
  <title>GQRX&#45;&gt;Base</title>
236
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M706.48,-558.54C748.07,-544.15 794.61,-520.4 821.75,-482 881.89,-396.91 822.79,-347.64 861.75,-251 870.44,-229.43 884.11,-207.78 897.1,-189.86"/>
237
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="899.31,-191.58 901.82,-183.49 894.81,-188.25 899.31,-191.58"/>
238
- <text xml:space="preserve" text-anchor="middle" x="783.88" y="-543.53" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">48 kHz UDP audio</text>
229
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M667.06,-72.54C712.87,-108.02 794.84,-169.79 875.25,-220.87"/>
230
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="873.6,-223.15 881.86,-225.05 876.59,-218.41 873.6,-223.15"/>
231
+ <text xml:space="preserve" text-anchor="middle" x="797.88" y="-202.39" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">48 kHz UDP audio</text>
239
232
  </g>
240
233
  <!-- Tune -->
241
234
  <g id="node17" class="node">
242
235
  <title>Tune</title>
243
- <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1221.5,-211.38C1221.5,-211.38 1103.5,-211.38 1103.5,-211.38 1097.5,-211.38 1091.5,-205.38 1091.5,-199.38 1091.5,-199.38 1091.5,-178.62 1091.5,-178.62 1091.5,-172.62 1097.5,-166.62 1103.5,-166.62 1103.5,-166.62 1221.5,-166.62 1221.5,-166.62 1227.5,-166.62 1233.5,-172.62 1233.5,-178.62 1233.5,-178.62 1233.5,-199.38 1233.5,-199.38 1233.5,-205.38 1227.5,-211.38 1221.5,-211.38"/>
244
- <text xml:space="preserve" text-anchor="middle" x="1162.5" y="-197.88" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extro_rf_tune &#160;📡</text>
245
- <text xml:space="preserve" text-anchor="middle" x="1162.5" y="-185.12" font-family="sans-Serif" font-size="10.00" fill="#0f172a">tune · demod · strength</text>
246
- <text xml:space="preserve" text-anchor="middle" x="1162.5" y="-173.12" font-family="sans-Serif" font-size="10.00" fill="#0f172a">RDS.sample → now_playing</text>
236
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1322,-171.38C1322,-171.38 1204,-171.38 1204,-171.38 1198,-171.38 1192,-165.38 1192,-159.38 1192,-159.38 1192,-138.62 1192,-138.62 1192,-132.62 1198,-126.62 1204,-126.62 1204,-126.62 1322,-126.62 1322,-126.62 1328,-126.62 1334,-132.62 1334,-138.62 1334,-138.62 1334,-159.38 1334,-159.38 1334,-165.38 1328,-171.38 1322,-171.38"/>
237
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-157.88" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extro_rf_tune &#160;📡</text>
238
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-145.12" font-family="sans-Serif" font-size="10.00" fill="#0f172a">tune · demod · strength</text>
239
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-133.12" font-family="sans-Serif" font-size="10.00" fill="#0f172a">RDS.sample → now_playing</text>
247
240
  </g>
248
241
  <!-- GQRX&#45;&gt;Tune -->
249
242
  <g id="edge14" class="edge">
250
243
  <title>GQRX&#45;&gt;Tune</title>
251
- <path fill="none" stroke="#f59e0b" stroke-width="2" d="M706.48,-567.15C807.32,-551.93 965.68,-523.02 1012.5,-486 1099.37,-417.31 1139.74,-284.62 1154.5,-222.55"/>
252
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="2" points="1157.15,-223.54 1156.21,-215.11 1151.69,-222.28 1157.15,-223.54"/>
253
- <text xml:space="preserve" text-anchor="middle" x="933.12" y="-539.52" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">remote :7356</text>
244
+ <path fill="none" stroke="#f59e0b" stroke-width="2" d="M717.75,-62.45C730.96,-65.08 744.45,-67.68 757.25,-70 906.09,-96.93 1080.62,-123.04 1180.56,-137.47"/>
245
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="2" points="1179.87,-140.2 1188.19,-138.57 1180.67,-134.65 1179.87,-140.2"/>
246
+ <text xml:space="preserve" text-anchor="middle" x="949.88" y="-116.11" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">remote :7356</text>
247
+ </g>
248
+ <!-- Freq -->
249
+ <g id="node10" class="node">
250
+ <title>Freq</title>
251
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1317.12,-72C1317.12,-72 1208.88,-72 1208.88,-72 1202.88,-72 1196.88,-66 1196.88,-60 1196.88,-60 1196.88,-40 1196.88,-40 1196.88,-34 1202.88,-28 1208.88,-28 1208.88,-28 1317.12,-28 1317.12,-28 1323.12,-28 1329.12,-34 1329.12,-40 1329.12,-40 1329.12,-60 1329.12,-60 1329.12,-66 1323.12,-72 1317.12,-72"/>
252
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-58.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SDR::FrequencyAllocation</text>
253
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-46.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">band lookup</text>
254
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan_bw · precision</text>
255
+ </g>
256
+ <!-- Scan -->
257
+ <g id="node11" class="node">
258
+ <title>Scan</title>
259
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1602.88,-72C1602.88,-72 1506.62,-72 1506.62,-72 1500.62,-72 1494.62,-66 1494.62,-60 1494.62,-60 1494.62,-40 1494.62,-40 1494.62,-34 1500.62,-28 1506.62,-28 1506.62,-28 1602.88,-28 1602.88,-28 1608.88,-28 1614.88,-34 1614.88,-40 1614.88,-40 1614.88,-60 1614.88,-60 1614.88,-66 1608.88,-72 1602.88,-72"/>
260
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-58.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">bin/pwn_gqrx_scanner</text>
261
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-46.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">&#45;&#45;fft&#45;scan · iterative</text>
262
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">&#45;&#45;min&#45;snr&#45;db · &#45;&#45;no&#45;refine</text>
254
263
  </g>
255
264
  <!-- Freq&#45;&gt;Scan -->
256
265
  <g id="edge21" class="edge">
257
266
  <title>Freq&#45;&gt;Scan</title>
258
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M685.04,-661C737.12,-661 809.78,-661 862.82,-661"/>
259
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="862.52,-663.8 870.52,-661 862.52,-658.2 862.52,-663.8"/>
260
- <text xml:space="preserve" text-anchor="middle" x="783.88" y="-662.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">plan_bw/step</text>
267
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1329.75,-50C1375.89,-50 1437.48,-50 1484.4,-50"/>
268
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1484.21,-52.8 1492.21,-50 1484.21,-47.2 1484.21,-52.8"/>
269
+ <text xml:space="preserve" text-anchor="middle" x="1407.38" y="-51.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">plan_bw/step</text>
261
270
  </g>
262
271
  <!-- Dec -->
263
272
  <g id="node14" class="node">
264
273
  <title>Dec</title>
265
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1519.25,-127C1519.25,-127 1383.25,-127 1383.25,-127 1377.25,-127 1371.25,-121 1371.25,-115 1371.25,-115 1371.25,-59 1371.25,-59 1371.25,-53 1377.25,-47 1383.25,-47 1383.25,-47 1519.25,-47 1519.25,-47 1525.25,-47 1531.25,-53 1531.25,-59 1531.25,-59 1531.25,-115 1531.25,-115 1531.25,-121 1525.25,-127 1519.25,-127"/>
266
- <text xml:space="preserve" text-anchor="middle" x="1451.25" y="-113.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SDR::Decoder::*</text>
267
- <text xml:space="preserve" text-anchor="middle" x="1451.25" y="-101.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ADSB · APT · BT · DECT · GPS</text>
268
- <text xml:space="preserve" text-anchor="middle" x="1451.25" y="-89.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">GSM · Iridium · LoRa · LTE</text>
269
- <text xml:space="preserve" text-anchor="middle" x="1451.25" y="-77.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Morse · P25 · POCSAG/FLEX</text>
270
- <text xml:space="preserve" text-anchor="middle" x="1451.25" y="-65.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">RDS · RFID · rtl_433 · RTTY</text>
271
- <text xml:space="preserve" text-anchor="middle" x="1451.25" y="-53.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">WiFi · ZigBee</text>
274
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1622.75,-292C1622.75,-292 1486.75,-292 1486.75,-292 1480.75,-292 1474.75,-286 1474.75,-280 1474.75,-280 1474.75,-224 1474.75,-224 1474.75,-218 1480.75,-212 1486.75,-212 1486.75,-212 1622.75,-212 1622.75,-212 1628.75,-212 1634.75,-218 1634.75,-224 1634.75,-224 1634.75,-280 1634.75,-280 1634.75,-286 1628.75,-292 1622.75,-292"/>
275
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-278.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SDR::Decoder::*</text>
276
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-266.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ADSB · APT · BT · DECT · GPS</text>
277
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-254.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">GSM · Iridium · LoRa · LTE</text>
278
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-242.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Morse · P25 · POCSAG/FLEX</text>
279
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-230.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">RDS · RFID · rtl_433 · RTTY</text>
280
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-218.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">WiFi · ZigBee · Tempest</text>
272
281
  </g>
273
282
  <!-- Freq&#45;&gt;Dec -->
274
283
  <g id="edge18" class="edge">
275
284
  <title>Freq&#45;&gt;Dec</title>
276
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M685.03,-654.69C766.74,-644.41 908.34,-618.5 1012.5,-556 1061.04,-526.87 1308.52,-248.27 1408.39,-134.76"/>
277
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1410.27,-136.86 1413.45,-129.01 1406.06,-133.17 1410.27,-136.86"/>
278
- </g>
279
- <!-- Obs -->
280
- <g id="node15" class="node">
281
- <title>Obs</title>
282
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1677.75,-209C1677.75,-209 1624.25,-209 1624.25,-209 1618.25,-209 1612.25,-203 1612.25,-197 1612.25,-197 1612.25,-185 1612.25,-185 1612.25,-179 1618.25,-173 1624.25,-173 1624.25,-173 1677.75,-173 1677.75,-173 1683.75,-173 1689.75,-179 1689.75,-185 1689.75,-185 1689.75,-197 1689.75,-197 1689.75,-203 1683.75,-209 1677.75,-209"/>
283
- <text xml:space="preserve" text-anchor="middle" x="1651" y="-193.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extro_observe</text>
284
- <text xml:space="preserve" text-anchor="middle" x="1651" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">category: :rf</text>
285
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1296.39,-72.58C1342.47,-104.7 1427.95,-164.3 1487.71,-205.96"/>
286
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1485.82,-208.05 1493.98,-210.33 1489.02,-203.46 1485.82,-208.05"/>
285
287
  </g>
286
288
  <!-- Scan&#45;&gt;Obs -->
287
289
  <g id="edge22" class="edge">
288
290
  <title>Scan&#45;&gt;Obs</title>
289
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M993.79,-668.02C1075.64,-674.71 1224.68,-676.12 1331.25,-615 1498.64,-518.99 1605.56,-296.09 1638.85,-218.34"/>
290
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1641.42,-219.46 1641.96,-211 1636.26,-217.28 1641.42,-219.46"/>
291
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1586.34,-72.46C1601.23,-83.69 1619.23,-97.69 1634.75,-111 1653.84,-127.37 1658.96,-131.27 1675.75,-150 1697.66,-174.44 1720.12,-204.56 1735.23,-225.71"/>
292
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1732.79,-227.11 1739.7,-232.02 1737.36,-223.88 1732.79,-227.11"/>
291
293
  </g>
292
294
  <!-- Base&#45;&gt;DSP -->
293
295
  <g id="edge15" class="edge">
294
296
  <title>Base&#45;&gt;DSP</title>
295
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M997.16,-137.57C1021.28,-133.97 1049.23,-129.79 1075.16,-125.91"/>
296
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1075.54,-128.68 1083.04,-124.73 1074.72,-123.15 1075.54,-128.68"/>
297
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1020.62,-270.65C1034.1,-272.47 1048.11,-274.32 1061.25,-276 1098.8,-280.8 1140.35,-285.81 1175.86,-290.01"/>
298
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1175.48,-292.78 1183.75,-290.94 1176.13,-287.22 1175.48,-292.78"/>
297
299
  </g>
298
300
  <!-- Base&#45;&gt;Dec -->
299
301
  <g id="edge17" class="edge">
300
302
  <title>Base&#45;&gt;Dec</title>
301
- <path fill="none" stroke="#a78bfa" stroke-width="2" d="M982.98,-112.2C1011.42,-94.1 1048.81,-73.85 1085.5,-64.5 1176.91,-41.21 1285.18,-52.56 1359.89,-66.17"/>
302
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="1359.31,-68.91 1367.69,-67.64 1360.34,-63.41 1359.31,-68.91"/>
303
- <text xml:space="preserve" text-anchor="middle" x="1162.5" y="-66.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">feed_iq / feed</text>
303
+ <path fill="none" stroke="#a78bfa" stroke-width="2" d="M1020.56,-257.45C1067.33,-255.24 1130.35,-252.62 1186,-251.5 1254.43,-250.12 1271.56,-251.42 1340,-251.5 1380.62,-251.55 1425.58,-251.65 1463.75,-251.74"/>
304
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="1463.29,-254.54 1471.29,-251.76 1463.3,-248.94 1463.29,-254.54"/>
305
+ <text xml:space="preserve" text-anchor="middle" x="1263" y="-253.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">feed_iq / feed</text>
304
306
  </g>
305
307
  <!-- DSP&#45;&gt;Dec -->
306
308
  <g id="edge16" class="edge">
307
309
  <title>DSP&#45;&gt;Dec</title>
308
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1239.97,-106.07C1277.21,-102.69 1322.22,-98.61 1361.02,-95.09"/>
309
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1361.07,-97.9 1368.78,-94.39 1360.56,-92.32 1361.07,-97.9"/>
310
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1340.51,-287.33C1378.61,-281.01 1424.9,-273.34 1464.6,-266.77"/>
311
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1464.91,-269.56 1472.34,-265.49 1463.99,-264.03 1464.91,-269.56"/>
310
312
  </g>
311
313
  <!-- Dec&#45;&gt;Obs -->
312
314
  <g id="edge24" class="edge">
313
315
  <title>Dec&#45;&gt;Obs</title>
314
- <path fill="none" stroke="#c4b5fd" stroke-width="1.3" stroke-dasharray="5,2" d="M1529.27,-127.51C1555.31,-141.2 1583.48,-156.02 1606.06,-167.89"/>
315
- <polygon fill="#c4b5fd" stroke="#c4b5fd" stroke-width="1.3" points="1604.61,-170.29 1612.99,-171.54 1607.21,-165.33 1604.61,-170.29"/>
316
+ <path fill="none" stroke="#c4b5fd" stroke-width="1.3" stroke-dasharray="5,2" d="M1635.33,-252C1659.14,-252 1684.5,-252 1705.6,-252"/>
317
+ <polygon fill="#c4b5fd" stroke="#c4b5fd" stroke-width="1.3" points="1705.32,-254.8 1713.32,-252 1705.32,-249.2 1705.32,-254.8"/>
316
318
  </g>
317
319
  <!-- Tune&#45;&gt;Dec -->
318
320
  <g id="edge26" class="edge">
319
321
  <title>Tune&#45;&gt;Dec</title>
320
- <path fill="none" stroke="#c4b5fd" stroke-width="1.3" stroke-dasharray="5,2" d="M1228.93,-165.73C1268.2,-151.76 1318.67,-133.8 1361.5,-118.57"/>
321
- <polygon fill="#c4b5fd" stroke="#c4b5fd" stroke-width="1.3" points="1362.35,-121.24 1368.95,-115.92 1360.47,-115.96 1362.35,-121.24"/>
322
- <text xml:space="preserve" text-anchor="middle" x="1305.38" y="-149.09" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">RDS.sample</text>
322
+ <path fill="none" stroke="#c4b5fd" stroke-width="1.3" stroke-dasharray="5,2" d="M1329.75,-172.37C1369.81,-186.61 1421.52,-204.99 1465.16,-220.51"/>
323
+ <polygon fill="#c4b5fd" stroke="#c4b5fd" stroke-width="1.3" points="1464.01,-223.07 1472.48,-223.11 1465.88,-217.79 1464.01,-223.07"/>
324
+ <text xml:space="preserve" text-anchor="middle" x="1407.38" y="-208.62" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">RDS.sample</text>
323
325
  </g>
324
326
  <!-- Tune&#45;&gt;Obs -->
325
327
  <g id="edge25" class="edge">
326
328
  <title>Tune&#45;&gt;Obs</title>
327
- <path fill="none" stroke="#a78bfa" stroke-width="2" d="M1234.24,-189.29C1334.22,-189.7 1514.3,-190.44 1600.88,-190.8"/>
328
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="1600.68,-193.6 1608.69,-190.83 1600.7,-188 1600.68,-193.6"/>
329
- <text xml:space="preserve" text-anchor="middle" x="1451.25" y="-202.96" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">category::rf</text>
330
- <text xml:space="preserve" text-anchor="middle" x="1451.25" y="-192.46" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">ttl 300s</text>
329
+ <path fill="none" stroke="#a78bfa" stroke-width="2" d="M1334.7,-143.64C1410.84,-140.22 1534.54,-141.5 1634.75,-175 1668.08,-186.14 1701.23,-208.87 1724,-226.75"/>
330
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="1722.15,-228.86 1730.14,-231.69 1725.66,-224.49 1722.15,-228.86"/>
331
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-187.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">category::rf</text>
332
+ <text xml:space="preserve" text-anchor="middle" x="1554.75" y="-176.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">ttl 300s</text>
331
333
  </g>
332
334
  </g>
333
335
  </svg>