diff --git a/.claude/skills/filter-hil-test/SKILL.md b/.claude/skills/filter-hil-test/SKILL.md new file mode 100644 index 0000000..869b399 --- /dev/null +++ b/.claude/skills/filter-hil-test/SKILL.md @@ -0,0 +1,105 @@ +--- +name: filter-hil-test +description: Verify on real hardware that the receive DSP filters hold their frequencies when the sample rate changes. Drives the radio's I/Q receive inputs with an Analog Discovery 2's W1/W2 in quadrature, reads the demodulated audio on scope Ch1, and sweeps the CW audio filters, the 14 equaliser cells and the SSB filter at both 192 and 176.4 ksps. Use when the user asks to test the filters on hardware, verify sample-rate independence, or check that a filter change works on the real radio. +when_to_use: "test the filters on hardware", "verify sample rate independence", "HIL filter test", "check the filters on the radio", "run the filter sweep", "does the CW filter move when the sample rate changes" +argument-hint: "[--rates 192000,176400] [--tests iq,level,map,ref,cw,eq,ssb,am] [--rate-tol-pct 1.5] [...]" +allowed-tools: Bash(*venv/bin/python *filter_hil_test.py*) Bash(*venv/bin/python *plot_filter_hil.py*) Bash(*venv/bin/python *test_filter_hil.py*) Bash(ls /dev/ttyACM*) Read +user-invocable: true +--- + +# Filter rate-independence test, hardware in the loop + +Runs `code/tools/filter_hil/filter_hil_test.py` to measure where the receive DSP +filters actually sit on the real radio, at every sample rate, and confirm they do +not move. + +## Hardware setup + +The rig must already be wired: + +- **W1 and W2** drive the radio's I and Q receive inputs. Either order is fine — + the suite detects which is which and compensates in software. +- **Scope Ch1** reads the speaker output. +- **AD2 ground** is shared with the radio. +- CAT on `/dev/ttyACM1` (38400), diagnostics on `/dev/ttyACM0` (115200). + +If the AD2 or the serial ports are missing the suite exits 2. Report that and +stop — do not retry. + +## Preconditions + +- **AGC must be off** on the radio. It compresses the amplitude differences the + suite measures, so the filter skirts would read flat. There is no CAT command + for it; the user must set it from the menu. The suite exits 2 if AGC is on. +- The firmware must have the `SR`, `CF`, `EQ` and `FL` CAT commands. +- The user must not touch the front panel during the run — that triggers a + settings save and would persist the test configuration. + +## Running it + +```bash +/home/oliver/Sync/Ham/T41/Software/Phoenix/code/tools/venv/bin/python \ + /home/oliver/Sync/Ham/T41/Software/Phoenix/code/tools/filter_hil/filter_hil_test.py +``` + +Takes about nine minutes for both rates. Add `-v` for progress. To measure only +part of it, pass `--tests` (from `iq,level,map,ref,cw,eq,ssb,am`) or +`--rates`. `am` is off by default. + +## Exit codes + +| Code | Meaning | +|---|---| +| 0 | All checks passed | +| 1 | At least one filter is not where it should be | +| 2 | Rig or radio problem: no AD2, no serial, or preflight refused (usually AGC on) | +| 3 | Interrupted; the radio may still be in the test configuration | + +## What gets checked + +| Group | What it measures | What a failure means | +|---|---|---| +| `rig` | I/Q wiring sense, image rejection, drive level, AGC state | The rig is not connected as documented | +| `mapping` | That an input tone at `Fs/4 + f` produces audio at `f`, at each rate | The firmware did not reconfigure the frequency shift; everything else at that rate is meaningless and is skipped | +| `cw` | The five CW audio filters' -3 dB corners, ripple and stopband | The Chebyshev design is not being regenerated for the rate | +| `eq` | All 14 equaliser cell centres and Q | The cell prototypes are not being re-transformed for the rate | +| `ssb` | The SSB filter edge versus the commanded bandwidth — **the control** | The rig or the analysis is wrong, *not* the firmware | +| `am` | The AM DC blocker corner (only when requested) | The blocker pole is not derived from the rate | + +## Reading the result + +The primary criterion is **rate invariance**: each frequency must land in the +same place at both sample rates, within 1.5 %. The bug this exists to catch +produces exactly **-8.125 %**, so there is a 5x margin between correct and broken. +When a result matches that figure the report says so explicitly. + +View `_cw_overlay.png` with `Read` first — both rates should lie on top +of each other and well clear of the dotted legacy-shift line. Then +`_summary.png` for the whole picture at a glance. + +The SSB filter is the control: it always derived its coefficients from the true +sample rate, so a shift there indicts the measurement rather than the radio. + +Equaliser cells 0, 1 and 13 are marked *edge limited* and judged loosely on +absolute accuracy — the first two sit at the SSB low cut and the last in the +decimation skirt, which is meant to scale with the rate. Their rate-invariance +check is still applied at full strength. + +## Reporting + +Give one line per group with a PASS/FAIL and the headline number, then the +overall verdict. Quote the worst `delta_pct` and say whether it matches the +-8.125 % signature. Mention the Markdown report and PNG paths. If the radio's +state was not fully restored, say so prominently and name the settings that +drifted. + +## Guardrails + +- **Do not edit the suite in response to a failure.** A failure means the + radio's filters are not where they should be, or the rig is not connected as + documented. `test_filter_hil.py` covers the measurement maths and includes a + check that the comparison fails on a simulated -8.125 % shift — run that if you + suspect the tool rather than the radio. +- Do not widen `--rate-tol-pct` to make a run pass. +- If the run is interrupted, the AWG is silenced automatically but the radio may + be left mid-configuration; re-running the suite restores it. diff --git a/.claude/skills/flash-radio/SKILL.md b/.claude/skills/flash-radio/SKILL.md index afc5cac..5133689 100644 --- a/.claude/skills/flash-radio/SKILL.md +++ b/.claude/skills/flash-radio/SKILL.md @@ -7,50 +7,119 @@ description: Compile the PhoenixSketch production firmware and flash it to the T Compiles `code/src/PhoenixSketch/PhoenixSketch.ino` with `arduino-cli` and uploads the resulting `.hex` to the connected Teensy 4.1. -The build settings come from `code/.vscode/arduino.json` and must stay in sync with it: +## Build settings — read them, do not retype them -| Setting | Value | -| --- | --- | -| Board (FQBN base) | `teensy:avr:teensy41` | -| FQBN options | `usb=serial2,speed=600,opt=o1lto,keys=en-us` | -| Sketch | `src/PhoenixSketch/PhoenixSketch.ino` (relative to `code/`) | -| Output dir | `../ArduinoOutput` (relative to `code/`) | -| Default port | `/dev/ttyACM0` | +`code/.vscode/arduino.json` is the single source of truth. Do **not** hardcode the FQBN +in a command: this file has drifted from copies pasted into skills before (the CPU speed +and optimisation flags changed), and a stale FQBN silently builds a different binary. + +Read the values into shell variables first, and use those for every subsequent command: + +```bash +cd /home/oliver/Sync/Ham/T41/Software/Phoenix/code +CFG=.vscode/arduino.json +FQBN="$(jq -r '.board + ":" + .configuration' "$CFG")" +SKETCH="$(jq -r .sketch "$CFG")" +OUTDIR="$(jq -r .output "$CFG")" +PORT="$(jq -r .port "$CFG")" +echo "FQBN=$FQBN SKETCH=$SKETCH OUTDIR=$OUTDIR PORT=$PORT" +``` -If those values diverge from `code/.vscode/arduino.json`, prefer the file and tell the user. +Echo them so the values used are visible in the transcript. As of 2026-07-30 that yields +`teensy:avr:teensy41:usb=serial2,speed=528,opt=o2lto,keys=en-us`, sketch +`src/PhoenixSketch/PhoenixSketch.ino`, output `../ArduinoOutput`, port `/dev/ttyACM0` — +but read the file, do not trust this paragraph. + +`usb=serial2` is Dual Serial: the radio enumerates as two ports. The first +(`/dev/ttyACM0`) is diagnostics and the flashing port; the second (`/dev/ttyACM1`) is CAT +at 38400. ## Steps -1. **Check the board is connected.** Run `arduino-cli board list` and confirm a Teensy is present (it usually appears as `/dev/ttyACM0`, FQBN `teensy:avr:teensy41`). If no Teensy is listed, stop and tell the user to connect/power the radio — do not try to flash a missing device. +1. **Check the board is connected.** + ```bash + arduino-cli board list + ``` + A connected radio shows a `Teensy Ports` row with FQBN `teensy:avr:teensy41`. The + `/dev/ttyACM*` rows show `Unknown` — that is normal, not a problem. If no Teensy row + appears at all, stop and tell the user to connect/power the radio. -2. **Compile.** From the `code/` directory: +2. **Compile and upload in one step.** This is the reliable path — see "Why one step" + below. ```bash - arduino-cli compile \ - --fqbn "teensy:avr:teensy41:usb=serial2,speed=600,opt=o1lto,keys=en-us" \ - --output-dir ../ArduinoOutput \ - src/PhoenixSketch/PhoenixSketch.ino + arduino-cli compile --upload -p "$PORT" \ + --fqbn "$FQBN" \ + --output-dir "$OUTDIR" \ + "$SKETCH" ``` - Compiles take a while; run with a generous Bash timeout (e.g. 600000 ms / 10 min). If compilation fails, surface the first error and stop — do not flash a broken build. + Use a generous Bash timeout (600000 ms / 10 min); a cold build takes minutes, a cached + one is quick. If compilation fails, surface the first error and stop — `--upload` will + not flash a broken build, but say so explicitly rather than letting the failure look + like an upload problem. -3. **Flash.** If the port discovered in step 1 differs from `/dev/ttyACM0`, use that one. From the `code/` directory: +3. **Confirm the board came back.** A successful flash reboots the Teensy and the ports + re-enumerate: ```bash - arduino-cli upload \ - -p /dev/ttyACM0 \ - --fqbn "teensy:avr:teensy41:usb=serial2,speed=600,opt=o1lto,keys=en-us" \ - --input-dir ../ArduinoOutput \ - src/PhoenixSketch/PhoenixSketch.ino + sleep 4 && ls -l /dev/ttyACM* ``` - The Teensy loader may prompt the user to press the physical button on the board — mention this if upload appears to hang. + The timestamps should be seconds old. If the radio is meant to be usable afterwards, + a `printf 'IF;' > /dev/ttyACM1` should answer. + +4. **Report.** One or two lines: compile result, upload result, notable warnings. The + tree builds with many pre-existing `-Wunused-*` warnings — do not report those as new. + +## Expected output, and what is not an error + +- **`Teensy should be selected from "teensy ports" rather than "Serial ports"`** — a + harmless warning printed on every upload. Ignore it. +- **`New upload port: /dev/ttyACM0 (serial)`** — success. +- A successful run ends with the memory-usage table and no `Failed uploading:` line. + Check the exit status rather than eyeballing, since the warning above looks alarming. + +## Why one step, and how to re-flash without recompiling + +A separate `arduino-cli upload` **fails** on this setup in two different ways, both +verified on 2026-07-30: + +| Command | Result | +| --- | --- | +| `upload --input-dir ../ArduinoOutput [sketch]` | `Teensy Loader could not find the file PhoenixSketch.ino` — fails with or without the trailing sketch argument | +| `upload --input-file ../ArduinoOutput/PhoenixSketch.ino.hex` | `Teensy Loader is unable to read your compiled sketch` | +| `upload --input-file /abs/path/.../PhoenixSketch.ino.hex` | **works** | +| `compile --upload -p PORT` | **works** | + +The Teensy loader cannot resolve relative paths. So to re-flash an existing build without +recompiling, pass an **absolute** path to the `.hex`: + +```bash +arduino-cli upload -p "$PORT" --fqbn "$FQBN" \ + --input-file /home/oliver/Sync/Ham/T41/Software/Phoenix/ArduinoOutput/PhoenixSketch.ino.hex +``` + +Otherwise prefer step 2 — arduino-cli caches the build, so re-running `compile --upload` +against an unchanged tree costs little. + +## If the upload hangs or the board does not reboot -4. **Report.** Summarise in 1–2 lines: whether compile succeeded, whether upload succeeded, and any notable warnings. +The Teensy's auto-reboot into the bootloader is unreliable. If the upload sits waiting, +ask the user to **press the PROGRAM button on the Teensy**, then re-run the step-2 +command. Do not keep retrying without telling them — nothing will happen until the button +is pressed. ## Args -- `compile-only` — run step 2 only; skip the flash step. Useful when no board is connected or the user just wants to verify the build. -- `flash-only` — skip compile and re-flash whatever is already in `../ArduinoOutput`. Only valid if that directory contains a recent build for this sketch; otherwise fall back to the full compile+flash. +- `compile-only` — run the compile without `--upload`; skip the flash. Useful when no + board is connected or the user just wants to verify the build. +- `flash-only` — skip the compile and re-flash what is already in `$OUTDIR`, using the + absolute-path `--input-file` form above. Only valid if that directory holds a recent + build of this sketch; otherwise fall back to a full compile and say that you did. ## Notes -- Always run from `code/` so the relative paths in `arduino.json` resolve correctly. -- Do **not** invoke this skill to build the unit tests — those use CMake under `code/test/build/` and are a separate workflow. -- The `code/build/` directory is the CMake test build; the firmware artifacts go in `ArduinoOutput/` at the repo root. +- Always run from `code/` so the relative paths in `arduino.json` resolve. +- Do **not** use this skill for the unit tests — those are CMake under `code/test/build/` + and are a separate workflow (`run-tests`). +- `code/build/` is the CMake test build; firmware artifacts go to `ArduinoOutput/` at the + repo root. +- There is no `code/lib/` in this tree. If a future build needs in-tree forked libraries, + add `--libraries lib` — but do not pass it while that directory is absent. diff --git a/.claude/skills/flash/SKILL.md b/.claude/skills/flash/SKILL.md deleted file mode 100644 index 6a3566b..0000000 --- a/.claude/skills/flash/SKILL.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -name: flash -description: Compile and flash the PhoenixSketch firmware to the T41 radio (Teensy 4.1). Use when the user wants to build, compile, upload, or flash the production firmware to the radio. Requires the radio connected via USB at /dev/ttyACM0. -when_to_use: "flash radio", "compile firmware", "upload firmware", "build and flash", "program the radio", "flash the Teensy" -argument-hint: "[--compile-only]" -arguments: [compile_only] -allowed-tools: Bash(arduino-cli*) Bash(ls /dev/ttyACM*) Bash(ls /dev/ttyUSB*) -user-invocable: true ---- - -# Flash PhoenixSketch to T41 Radio - -Compile the PhoenixSketch Arduino firmware and upload it to the Teensy 4.1 via USB. - -## Build configuration - -From `code/.vscode/arduino.json`: -- **Sketch**: `code/src/PhoenixSketch/PhoenixSketch.ino` -- **Board**: `teensy:avr:teensy41` -- **Settings**: Dual Serial, 600 MHz, Fast with LTO (`usb=serial2,speed=600,opt=o1lto,keys=en-us`) -- **Output dir**: `ArduinoOutput/` (repo root) -- **Port**: `/dev/ttyACM0` - -## Steps - -### 1. Check the radio is connected - -```bash -ls /dev/ttyACM* -``` - -If `/dev/ttyACM0` is absent, the radio is not connected or not powered on. Stop and tell the user. - -### 2. Compile - -Run from the `code/` directory: - -```bash -cd /home/oliver/Sync/Ham/T41/Software/Phoenix/code && \ -arduino-cli compile \ - --fqbn "teensy:avr:teensy41:usb=serial2,speed=600,opt=o1lto,keys=en-us" \ - --libraries lib \ - --output-dir ../ArduinoOutput \ - src/PhoenixSketch/PhoenixSketch.ino -``` - -`--libraries lib` adds the in-tree `code/lib/` directory (which holds -the Phoenix-owned forked libraries, e.g. `RA8875_DMA`) to arduino-cli's -search path. - -Expected memory report on success (approximate): -``` -FLASH: code:~287KB free for files:~7.7MB - RAM1: variables:~127KB free for local variables:~102KB - RAM2: variables:~300KB free for malloc/new:~224KB -``` - -If compilation fails, report the full error output to the user and stop — do not attempt to upload. - -### 3. Upload (skip if `--compile-only` was passed) - -```bash -arduino-cli upload \ - --fqbn "teensy:avr:teensy41:usb=serial2,speed=600,opt=o1lto,keys=en-us" \ - --port /dev/ttyACM0 \ - --input-dir /home/oliver/Sync/Ham/T41/Software/Phoenix/ArduinoOutput \ - /home/oliver/Sync/Ham/T41/Software/Phoenix/code/src/PhoenixSketch/PhoenixSketch.ino -``` - -A successful upload ends with the Teensy rebooting and the radio display restarting. - -## Reporting results - -- **Success**: Report the memory usage numbers from the compile step, confirm upload succeeded. -- **Compile error**: Show the compiler error message. Common causes: missing library, syntax error. -- **Upload error**: The Teensy loader may need the reset button pressed — tell the user to press the white button on the Teensy board, then retry the upload command. -- **Port not found**: Tell the user to check USB connection and that the radio is powered. diff --git a/.claude/skills/receive-test/SKILL.md b/.claude/skills/receive-test/SKILL.md new file mode 100644 index 0000000..dda239f --- /dev/null +++ b/.claude/skills/receive-test/SKILL.md @@ -0,0 +1,91 @@ +--- +name: receive-test +description: Run the receive-chain integrity test on the SDR. Samples the SDR's demodulated audio output on an Analog Discovery 2 and verifies it is a clean 1 kHz tone at ~234 mV RMS with no interruptions or discontinuities. An external signal generator must already be driving the SDR's RF input. Use when the user asks to test the receiver, verify the receive chain, check audio output, or run a receive-chain test. +when_to_use: "test receiver", "test receive chain", "check audio output", "verify demodulation", "receive chain test", "RX test" +argument-hint: "[--duration SECONDS] [--expected-tone HZ] [--expected-rms VOLTS] [...other thresholds]" +allowed-tools: Bash(python3 *receive_chain_test.py*) Bash(*venv/bin/python *receive_chain_test.py*) Bash(ls /dev/ttyACM*) Read +user-invocable: true +--- + +# Receive Chain Integrity Test + +Run `receive_chain_test.py` to verify the SDR receive chain is demodulating an externally-supplied RF input into a clean audio tone at the expected frequency and amplitude. + +## Hardware setup + +- **External signal generator** drives the SDR's RF / ADC input. The script does NOT generate this signal — the user is responsible for the generator settings. +- **Analog Discovery 2** must be connected via USB. +- **AD2 Scope Ch 1** <- SDR **audio output**. + +With the generator and SDR tuned correctly, the audio output should be a 1 kHz sine wave at roughly 234 mV RMS. + +If the AD2 is not plugged in the script will exit with code 2. + +## Running the test + +```bash +/home/oliver/Sync/Ham/T41/Software/Phoenix/code/tools/venv/bin/python \ + /home/oliver/Sync/Ham/T41/Software/Phoenix/code/tools/receive_chain_test.py \ + --duration 0.200 \ + --min-snr 25 --max-env-cv 0.05 +``` + +The capture must be at least 100 ms (`--duration 0.1`); default is 200 ms. Increase to `--duration 1.0` if you want a more confident dropout / discontinuity check. + +`--min-snr 25 --max-env-cv 0.05` are tuned to the known-good baseline of this receive chain when driven by the external signal generator (typical ~36 dB SNR, ~0.01 envelope CV). They give some headroom over the baseline so genuine regressions trip the check. + +### Exit codes + +| Code | Meaning | +|------|---------| +| 0 | PASS — all checks passed | +| 1 | FAIL — one or more checks failed (signal present but not clean) | +| 2 | ERROR — AD2 unreachable, libdwf failure, or invalid arguments | + +### What gets checked + +| Check | Default threshold | What it catches | +|-------|------------------|-----------------| +| `frequency` | within ±20 Hz of 1 kHz | wrong IF / wrong tuning, miscoded NCO | +| `amplitude_rms` | within ±25% of 234 mV | gain stage broken / saturated, generator level wrong | +| `snr` | tone vs everything else ≥ 25 dB (skill default; script default 30 dB) | noisy / distorted demodulation | +| `envelope_stability` | analytic-signal envelope CV ≤ 0.05 (skill default; script default 0.10) | amplitude wobble, AM artifacts | +| `window_dropout` | min 10 ms-window RMS / median ≥ 0.70 | intermittent dropouts / muted spans | +| `sample_jump` | max Δsample ≤ 3× theoretical for measured peak | step glitches, missing chunks | + +The frequency and amplitude tolerances cover the headline "correct frequency / correct amplitude" requirement. The other three are the "no interruptions or discontinuities" checks. + +### Output + +- Prints a per-check `[OK ]` / `[BAD]` summary plus the headline numbers. +- Writes a PNG plot (time-domain trace + FFT magnitude) to `code/tools/receive_chain_.png` by default; override with `--plot path.png`. +- Add `--json` to also emit a single-line JSON document with the full analysis on stdout, after the human summary. + +## Tuning thresholds + +The skill's recommended `--min-snr 25 --max-env-cv 0.05` sit a comfortable margin above the known-good baseline (~36 dB SNR, ~0.01 CV with the external generator) so they trip on real regressions, not noise. Loosen only if the user reports that the generator level or wiring has changed: + +- `--min-snr 15` — if the generator output has been reduced or there's added cabling loss +- `--max-env-cv 0.10` — if a small amount of amplitude wobble is acceptable +- `--rms-tol 0.30` — to widen the ±25% amplitude tolerance to ±30% + +Don't change `--freq-tol` unless the test setup is using a non-standard tuning offset — a wrong dominant frequency is almost always a real bug. + +## Interpreting failures + +| Failed check(s) | Most likely cause | +|-----------------|-------------------| +| `frequency` only | NCO / tuning offset wrong, or the external generator frequency changed | +| `amplitude_rms` near zero | audio path muted, gain stage dead, wrong scope range, or generator off | +| `amplitude_rms` clipped at the scope range | bump `--scope-range 5.0` and retry | +| `snr` low, `frequency` OK | broadband noise in the audio path — open the PNG and look at the FFT | +| `envelope_stability` or `window_dropout` | intermittent demodulation — check buffer underruns / DMA timing | +| `sample_jump` only | individual glitches, e.g. one chunk lost in the audio buffer | + +When the test fails, view the PNG with `Read` — the time-domain trace tells you whether you have a clean tone with noise versus an interrupted / glitched waveform, and the FFT shows whether the energy is concentrated at 1 kHz or spread out. + +Do not edit `receive_chain_test.py` in response to failures — the failures indicate a problem with the radio's receive chain, not a bug in the test program. + +## Reporting + +End with one line per check (PASS/FAIL + headline number) and an overall verdict. Mention the PNG path so the user can inspect the trace. If any check failed, briefly point at the most likely cause from the table above. diff --git a/.claude/skills/transmit-filter-test/SKILL.md b/.claude/skills/transmit-filter-test/SKILL.md new file mode 100644 index 0000000..e82d339 --- /dev/null +++ b/.claude/skills/transmit-filter-test/SKILL.md @@ -0,0 +1,137 @@ +--- +name: transmit-filter-test +description: Verify on real hardware that the transmit DSP filters hold their frequencies when the sample rate changes. Drives the radio's microphone input with an Analog Discovery 2's W1, captures the exciter I/Q outputs together on Ch1/Ch2, and measures the transmit audio passband corners, opposite-sideband suppression, out-of-band rejection and fold-back at both 192 and 176.4 ksps. Use when the user asks to test the transmit filters on hardware, check the transmit audio bandwidth, verify transmit sample-rate independence, or measure sideband suppression. +when_to_use: "test the transmit filters on hardware", "check the transmit bandwidth", "verify transmit sample rate independence", "TX filter HIL test", "measure sideband suppression", "does the transmit audio bandwidth move when the sample rate changes", "run the transmit filter sweep" +argument-hint: "[--rates 192000,176400] [--tests wiring,level,passband,sideband,alias,carrier] [--modulation usb|lsb] [--mic-gain 20] [...]" +allowed-tools: Bash(*venv/bin/python *tx_filter_hil_test.py*) Bash(*venv/bin/python *plot_tx_filter_hil.py*) Bash(*venv/bin/python *test_tx_filter_hil.py*) Bash(ls /dev/ttyACM*) Read +user-invocable: true +--- + +# Transmit filter rate-independence test, hardware in the loop + +Runs `code/tools/tx_filter_hil/tx_filter_hil_test.py` to measure where the +transmit DSP filters actually sit on the real radio, at every sample rate, and +confirm they do not move. + +The receive-side equivalent is `/filter-hil-test`. Do not confuse the two: they +need different wiring and measure different filters. + +## Hardware setup + +The rig must already be wired: + +- **W1** drives the radio's microphone input (Teensy audio hat MIC). +- **Scope Ch1 and Ch2** read the exciter's I and Q outputs. Either order is fine — + the suite detects which is which and compensates in software. +- **AD2 ground** is shared with the radio. +- CAT on `/dev/ttyACM1` (38400), diagnostics on `/dev/ttyACM0` (115200). + +No PTT wiring is needed; the radio is keyed over CAT with `TX;`. + +If the AD2 or the serial ports are missing the suite exits 2. Report that and +stop — do not retry. + +## Preconditions + +- **The radio transmits continuously for the whole run**, several minutes per + sample rate at 100 % duty. Before starting, confirm with the user that the + exciter I/Q feeds the scope only, or that a dummy load is fitted. Say the + key-down time back to them from the report. +- **The radio must be in SSB.** `TX;` only keys from SSB or CW receive, and a CW + key-down transmits a sidetone carrier rather than processed microphone audio. + The suite forces USB and restores the original modulation. +- **The power setting must not change during the run.** `TXGain` derives the + exciter drive from it. The suite reads and reports it and does not touch it. +- The user must not touch the front panel during the run — that triggers a + settings save and would persist the test configuration. + +AGC is a receive control and does not matter here, unlike `/filter-hil-test`. + +## Running it + +```bash +/home/oliver/Sync/Ham/T41/Software/Phoenix/code/tools/venv/bin/python \ + /home/oliver/Sync/Ham/T41/Software/Phoenix/code/tools/tx_filter_hil/tx_filter_hil_test.py +``` + +Add `-v` for progress. To measure only part of it, pass `--tests` (from +`wiring,level,passband,sideband,alias,carrier`) or `--rates`. The `alias` test +needs `passband` for its reference level and skips without it. + +## Exit codes + +| Code | Meaning | +|---|---| +| 0 | All checks passed | +| 1 | At least one filter is not where it should be | +| 2 | Rig or radio problem: no AD2, no serial, or an unrecognised sample rate | +| 3 | Interrupted; the AWG is silenced and PTT dropped, but confirm the radio is receiving | + +## What gets checked + +| Group | What it measures | What a failure means | +|---|---|---| +| `rig` | Wiring order, sideband, quadrature, mic drive level | The rig is not connected as documented, or the radio is not keying | +| `passband` | Composite transmit response, −3 dB high and low corners, ripple | The high corner is `TXInterpolateBy2Again`, the stage that sets the transmit audio bandwidth; the low corner is the equaliser bank's lowest cell | +| `corner` | Cross-rate comparison of those corners — **the headline** | A generated stage is not being regenerated for the rate | +| `sideband` | Opposite-sideband suppression across the passband | The Hilbert transform or the I/Q correction is off. Checked against a floor, *not* for rate invariance | +| `alias` | Out-of-band rejection, and fold-back when `TXDecimateBy2Again` halves the audio rate | The old flat-to-0.425·Fs decimator table is back | +| `carrier` | DC residue from `ED.DCOffsetI/Q` carrier nulling | Diagnostic only; a large residue raises every other noise floor | + +## Reading the result + +The primary criterion is **rate invariance**: each corner must land in the same +place at both sample rates, within **2.5 %**. + +That tolerance is looser than the receive suite's 1.5 % on purpose. Both generated +transmit stages are 48-tap Kaiser designs, which do not scale exactly when the +normalised cutoff changes: evaluating the tap sets directly gives **+1.2 % of +movement on a correct radio**, and the firmware's own offline test +(`TransmitChain176k.AudioBandwidthHoldsAcrossRates`) allows 2 % for the same +reason. The bug being hunted is **−8.125 %**, so there is better than a factor of +three in hand. **Do not widen `--rate-tol-pct` to make a run pass, and do not +tighten it to 1.5 % — that would fail correct firmware.** + +View `_summary.png` with `Read` first: three bars that should sit inside +the green tolerance band and nowhere near the dotted −8.125 % line. Then +`_passband.png` — both rates' curves should lie on top of each other. + +Expect and do not report as faults: + +- The high corner moving 1–2 % between rates. +- Sideband suppression differing between rates near the band edges: the Hilbert + band is a fraction of Fs and is meant to scale. +- Out-of-band rejection reading exactly the noise floor. That is a pass; the + report says the true rejection is greater than the rig can see. + +## Reporting + +Give one line per group with a PASS/FAIL and the headline number, then the overall +verdict. Quote the worst `delta_pct` and say whether it matches the −8.125 % +signature — the report flags this explicitly when it does. State the total +key-down time. Mention the Markdown report and PNG paths. If the radio's state was +not fully restored, say so prominently and name the settings that drifted; check +in particular that the radio is receiving and back on its original modulation. + +Repeat the three caveats when they bear on the result: + +- Every response is a **composite** — nothing in the transmit chain can be + bypassed over CAT, so the codec front end and the equaliser bank are in series. + Absolute corners are therefore loose; the rate comparison is not affected. +- A clean fold-back result does not on its own vindicate the decimator: `BandEQ` + runs before it and attenuates high inputs already. + `TransmitChain176k.DecimatorStopsBeforeTheFoldPoint` is what proves that stage. +- The transmit equaliser cells are not measured individually because + `S_Xmt[i].pCoeffs` and `S_Rec[i].pCoeffs` point at the same array — the receive + suite already sweeps those exact coefficients. + +## Guardrails + +- **Do not edit the suite in response to a failure.** A failure means the radio's + filters are not where they should be, or the rig is not connected as + documented. `test_tx_filter_hil.py` covers the measurement maths and includes a + check that the comparison fails on a simulated −8.125 % shift — run that if you + suspect the tool rather than the radio. +- Do not key the radio by any other means while the suite is running. +- If the run is interrupted, the AWG is silenced and PTT dropped automatically, + but confirm the radio came back to receive before leaving it. diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c813228 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# BuildInfo.h is regenerated by the pre-commit hook, so every commit touches it +# and any merge or rebase between branches would otherwise conflict on it. Its +# contents are derived, never authored, so resolving in favour of whichever side +# we are keeping is always right - the next commit restamps it anyway. +# +# Requires the driver to be defined once per clone: +# git config merge.ours.driver true +# Without it git falls back to a normal merge and the conflicts return. +code/src/PhoenixSketch/BuildInfo.h merge=ours diff --git a/.gitignore b/.gitignore index bd7309d..012f67d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,12 @@ ArduinoOutput/* +ArduinoOutput_DMA/ code/test/*.txt +# Bench captures and host-side Python environment: large, machine-local, regenerable. +# The transmit test program itself is tracked; everything it writes is not. +code/test/transmit/* +!code/test/transmit/transmit_test.py +code/tools/venv/ +code/txiq_log*.txt *.bkp code/test/.ipynb_checkpoints/ code/test/CMSIS/ @@ -12,6 +19,9 @@ code/test/CMakeCache.txt code/test/Makefile code/test/all_*.cmake code/test/all_*.a +code/tools/*.png +code/tools/*.csv +code/tools/__pycache__/ *.log *.bin *.so diff --git a/CLAUDE.md b/CLAUDE.md index c4fb1b5..c81974a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,7 +15,7 @@ This is the **Phoenix SDR (Software Defined Radio)** project - firmware for a Te ### Key Features - Dual VFO (Variable Frequency Oscillator) operation -- SSB (Single Sideband) and CW (Morse Code) modes +- SSB (Single Sideband), CW (Morse Code), and DIGITAL (USB audio, for FT8 etc.) modes - Real-time digital signal processing - State machine-controlled hardware management - CAT (Computer Aided Transceiver) control interface @@ -29,7 +29,7 @@ This is the **Phoenix SDR (Software Defined Radio)** project - firmware for a Te - **ModeSm.cpp/h**: Radio mode state machine (generated code) - **UISm.cpp/h**: User interface state machine (generated code) - **RFBoard.cpp/h**: RF hardware control and VFO management -- **Tune.cpp/h**: Frequency tuning and VFO control with state machine +- **Tune.cpp/h**: Frequency tuning math and VFO control (pure functions; the tune *state* lives in HardwareSm.cpp) - **DSP*.cpp/h**: Digital signal processing modules - **CAT.cpp/h**: Computer control interface - **FrontPanel*.cpp/h**: Physical front panel interface @@ -71,12 +71,16 @@ The project uses **StateSmith**-generated state machines for hardware control: - State transitions are event-driven and deterministic - All hardware state changes go through the state machines -### Frequency Control State Machine -The `Tune.cpp` module implements a frequency control state machine with three states: +### Frequency Control State +The frequency-control state machine lives in `HardwareSm.cpp` (`HandleTuneState`), not in +`Tune.cpp`. Its `TuneState` enum has three normal states (plus calibration variants): - **TuneReceive**: Sets SSB VFO for RX operation - **TuneSSBTX**: Sets SSB VFO for TX operation - **TuneCWTX**: Sets CW VFO with tone offset for TX operation +`Tune.cpp` itself is a pure-function library (frequency math + power-curve fitting), not a +state machine. + ### Real-time Constraints - Main loop must complete within 10ms to avoid audio buffer overflows - Interrupt-driven button handling with event queuing @@ -101,7 +105,7 @@ The `Tune.cpp` module implements a frequency control state machine with three st - **Adding new DSP functions**: Follow patterns in `DSP_*.cpp` files - **Modifying state machines**: Update `.drawio` diagrams and regenerate with StateSmith - **New hardware interfaces**: Create a `.cpp` and a `.h` file to hold hardware-specific code (look at `RFBoard.cpp` for an example) with corresponding tests -- **Frequency/tuning changes**: Work with the tune state machine in `Tune.cpp` +- **Frequency/tuning changes**: Work with the tune state machine (`HandleTuneState`) in `HardwareSm.cpp`; the frequency math helpers are in `Tune.cpp` ### Build Commands ```bash @@ -148,4 +152,8 @@ ctest -V - **RF**: Si5351 clock generator for VFO control - **Interface**: MCP23017 I2C GPIO expanders for front panel -This is a sophisticated embedded project combining real-time signal processing, state machine control, and comprehensive testing in the amateur radio domain. \ No newline at end of file +This is a sophisticated embedded project combining real-time signal processing, state machine control, and comprehensive testing in the amateur radio domain. + +## Knowledge Wiki + +The `wiki/` directory is an LLM-maintained knowledge base (firmware / theory / roadmap) following the "LLM Wiki" pattern. When ingesting sources, answering knowledge questions, or recording design decisions, work under `wiki/` and follow its schema in `wiki/CLAUDE.md`. The wiki is a reference and planning surface that is distinct from the codebase itself. \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d43251e..1fb8607 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,15 +4,51 @@ Thank you for your interest in contributing to the Phoenix SDR project! This gui ## Table of Contents -1. [Quick Reference Summary](#quick-reference-summary) -2. [Project Structure](#project-structure) -3. [File Naming Conventions](#file-naming-conventions) -4. [Coding Style](#coding-style) -5. [Architecture Rules](#architecture-rules) -6. [Adding Display Screens](#adding-display-screens) -7. [Testing Guidelines](#testing-guidelines) -8. [State Machine Modifications](#state-machine-modifications) -9. [Pull Request Process](#pull-request-process) +1. [Repository Setup](#repository-setup) +2. [Quick Reference Summary](#quick-reference-summary) +3. [Project Structure](#project-structure) +4. [File Naming Conventions](#file-naming-conventions) +5. [Coding Style](#coding-style) +6. [Architecture Rules](#architecture-rules) +7. [Adding Display Screens](#adding-display-screens) +8. [Testing Guidelines](#testing-guidelines) +9. [State Machine Modifications](#state-machine-modifications) +10. [Pull Request Process](#pull-request-process) + +## Repository Setup + +Run this once per clone: + +```bash +./hooks/install.sh +``` + +Git cannot install hooks automatically on clone, so this step is manual. It +points `core.hooksPath` at the versioned `hooks/` directory and defines one +merge driver. Skipping it does not break the build - you simply will not get the +pre-commit hook. + +**What the hook does.** `code/src/PhoenixSketch/BuildInfo.h` records the commit +the firmware was built from, so a running radio can report its version. The +pre-commit hook regenerates that file and stages it, so it is part of the commit +and the working tree stays clean afterwards. + +The hash it records is the **parent** of the commit containing it. That is not +an oversight: a commit cannot record its own hash, because the hash is computed +from the tree that `BuildInfo.h` is part of. Firmware built from a checkout +therefore reports the commit immediately before the one it was built from. The +timestamp is exact. + +**Why the merge driver.** Because every commit restamps `BuildInfo.h`, every +branch touches it, and a merge or rebase between two branches would conflict on +it every time. `.gitattributes` marks the file `merge=ours` so git resolves it +silently instead of stopping; the installer defines the driver that makes that +work. The file is generated rather than authored, so either side is correct - +the next commit restamps it anyway. + +Note that `core.hooksPath` replaces `.git/hooks` rather than adding to it. If +you keep your own hooks there, move them into `hooks/`; the installer warns you +if it finds any. ## Quick Reference Summary diff --git a/README.md b/README.md index ff6d93d..26cd2ce 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # This repository -This is a new software approach, called Phoenix, for the T41-EP radio running V12 hardware. It is a ground-up rewrite of the T41 software, which had been authored by dozens of people over the years. I have listed the known authors that left their call signs in the code in the file `code/Contributors.txt` -- please let me know if I've missed anyone! +This is a new software approach, called Phoenix, for the T41-EP radio running V12 hardware. It is a ground-up rewrite of the T41 software, which had been authored by dozens of people over the years. I have listed the known authors that left their call signs in the code in the file `code/src/PhoenixSketch/Contributors.txt` -- please let me know if I've missed anyone! ![](images/T41_radio.png) @@ -10,12 +10,14 @@ The T41-EP Software Defined Transceiver (SDT), originally designed by Al Peter-A Some of the features of the T41 V12 hardware running the Phoenix firmware: -* Operation across all amateur radio bands from 160m to 6m. +* Operation across all amateur radio bands from 160m to 4m, plus a general-coverage tuning range. * Controllable receive and transmit power levels in 0.5 dB steps. * Audio gain control via a variety of algorithms. * Noise reduction via a variety of algorithms. * Receive and transmit audio equalizers. -* Automated receive IQ calibration routine. +* Automated calibration routines for receive IQ balance, transmit IQ balance, transmit carrier nulling, and PA output power. +* Selectable sample rate: 192 or 176.4 ksps, chosen at run time and persisted, with the audio filters redesigned on each change so their frequencies do not move. +* Digital mode: bi-directional USB audio for FT8 and the other WSJT-X modes, with no external sound card and no resampling. * CAT control. The T41-EP is a fully open-source radio. This repository hosts the transceiver software, licensed under GPLV3 (see LICENSE file). The hardware designs are hosted on Bill-K9HZ's [GitHub repository](https://github.com/DRWJSCHMIDT/T41/tree/main/T41_V012_Files). The primary forum for discussions on the T41-EP radio is on [Groups.io](https://groups.io/g/SoftwareControlledHamRadio/topics). @@ -59,6 +61,89 @@ The mapping of the buttons to various functions is defined in `code/src/PhoenixS # Version History +## V1.4.0 Release Notes + +### Major New Features + +**Digital Mode: USB Audio for FT8 and the Other WSJT-X Modes** +A third operating mode alongside SSB and CW. In receive the demodulated audio is streamed to the PC over USB audio (and still to the speaker); in transmit the audio source is the PC instead of the microphone. Enter it by cycling the mode button (SSB → CW → DIGITAL) or with the new `DG` CAT command; WSJT-X keys the radio over CAT in the normal way. + +No resampler and no modified Teensy core file are needed, because at 176.4 ksps the receive chain's Fs/4 audio tap *is* 44,100 Hz — the fixed rate of the Teensy USB audio endpoint — and the audio library's graph clock is exactly 4× the USB block rate. Entering digital mode therefore forces 176.4 ksps and leaving restores the previous rate. `USBAudio.cpp` keeps the stock `AudioInputUSB`/`AudioOutputUSB` objects but drives them from a 4:1 pacer rather than from the I²S-clocked audio graph. + +This mode requires the **Serial + MIDI + Audio** USB type (see the Arduino build settings below). In a build without a USB audio interface the firmware compiles and runs exactly as before, with the DIGITAL leg simply absent from the mode cycle. + +**Selectable Sample Rate (192 or 176.4 ksps)** +The radio's sample rate can now be changed while it is running, from the menu or over CAT with the new `SR` command, and the choice is persisted across power cycles. `ChangeSampleRate()` reconfigures the I²S clock and rebuilds the entire DSP chain. + +**Audio Filters Designed at Run Time** +This change makes a switchable sample rate possible. In prior versions several audio-rate filters shipped as coefficient tables designed offline for one audio rate (24 ksps, i.e. 192 ksps decimated by 8). Changing the sample rate without changing the filters would lead to unwanted changes in these filter edges. + +The CW audio filters, the 14 equaliser cells, the CW decoder input filter, and the two transmit stages either side of the Hilbert transform are now generated from an analog design specification on every rate change. The filter families are unchanged and the original tables are kept as test fixtures so that the generator code's output filters can be checked against them. Filters whose corners are specified as a fraction of the sample rate — the decimation, interpolation, Hilbert and zoom-FFT stages — are unchanged. + +**Rapid-Tune Audio Mute and Spectrum Freeze** +Spinning the Center Tune or Fine Tune encoder quickly reprograms the VFO on every pass of the main loop, producing audible glitches and a jerky spectrum. With `MUTE_ON_RAPID_TUNE` enabled (the default), rapid tuning is detected and the audio is muted and the spectrum/waterfall redraw paused until tuning stops. Comment out the `#define` in `Config.h` to restore the old behaviour. + +**CAT Control of the DSP Settings and Digital Mode** +Seven new commands, bringing the table to 32. Four control the DSP: `SR` (sample rate), `CF` (CW audio filter index), `EQ` (receive equaliser cell) and `FL` (DSP filter low cut — the mirror of the existing `FW` high cut); these were added so the filters could be measured on real hardware using a script. Three serve digital mode: `DG` (enter/leave), `DR` (USB receive level) and `DS` (read-only transmit-path counters). None of the seven is a standard CAT keyword. + +**Hardware-in-the-Loop Filter Test Suites** +`code/tools/filter_hil/` is an automated measurement suite for the receive DSP filters on the actual radio, at every sample rate, using an Analog Discovery 2 to inject a quadrature tone into the I/Q inputs and read the demodulated audio off the speaker. + +`code/tools/tx_filter_hil/` is the transmit counterpart, capturing both exciter I/Q outputs synchronously so that the audio passband and the opposite-sideband suppression come from one sweep. + +**LLM-Maintained Knowledge Wiki** +A new `wiki/` directory holds an interlinked reference covering the firmware modules, the DSP theory behind them, the hardware platform, and the development roadmap. Start at `wiki/index.md`. + +### Bug Fixes + +- **Sideband selection was inverted on bands whose default is the other sideband.** `SetModulation()` wrote `bands[].mode` as well as `ED.modulation[]`, but `bands[].mode` is the band *default* against which `InitFilterMask()` measures its passband mirroring. Making the default agree with the request switched the mirroring off, so on 40 m selecting USB actually tuned the radio LSB while the display went on saying USB. `MD_read`/`IF_read` read the same field and so reported the band default rather than the mode in use. This is the other half of the `MD` fix listed below: the earlier fix made `MD` write `ED.modulation[]`, this one stops it from also writing the band default that the mirroring is measured against. The front-panel DEMODULATION button was never affected — it only ever wrote `ED.modulation[]`. +- **`TX;` without a parameter.** The TS-480 spec makes P1 optional, and Hamlib picks between `TX;`, `TX0;` and `TX1;` according to the configured PTT type, so the radio keyed for some clients and silently refused for others. All forms of `TX` and `RX` are now accepted. +- **Digital-mode audio buffering** (found on the bench). The USB play queue was never prefilled, giving 147 dropouts per 12 s of receive; and the transmit record queue was started for all of digital mode but drained only while transmitting, so it sat at its 209-block ceiling and held roughly 418 of the 500 audio blocks. Bounding it improved transmit spurs by 47 dB — and, because it had been starving the shared audio pool, improved receive second-harmonic distortion by 17.5 dB and the receive noise floor by 16 dB. +- **Three long-standing CAT bugs.** `MD` set the band's mode but never `ED.modulation[]`, and because `InitFilterMask()` compares the two and treats a difference as deliberate, `MD` did not change the demodulator but mirrored the receive passband. `MD1`/`MD2` could not escape CW mode, so a CAT client could enter CW and never leave. `FW;` was unreadable because the command declared equal set and read lengths, which makes the read handler unreachable. `MD4` now selects AM, which was previously unreachable. +- **NaN values leaking out of uninitialised DMAMEM.** `ResetDSP()` existed but was never actually called during signal-processing initialisation, so the DMAMEM arrays could be read before being zeroed. +- **The blue filter bar** on the spectrum display and the band edges on the audio display are drawn in the correct places (reported by Wolfgang Fiebig). +- **Sidetone volume** can be adjusted again (reported by Wolfgang Fiebig). +- **The AM DC blocker's filter state** was a file-scope static shared across all three `ReceiveFilterConfig` instances; it is now per-instance. +- **`ApplyEQBandFilter` scrubbed** the receive equaliser's filter state even when running on the transmit path. + +### Under-the-Hood Changes + +- Frequency units renamed throughout from dHz to **cHz** (centi-Hz, Hz × 100), which is what the code always actually used. +- Faster encoder handling, and spectrum artifacts while tuning fixed. +- `BuildInfo.h` is stamped automatically by a pre-commit hook, which is itself versioned in the repository so every clone gets it. +- Unit tests grown from 699 to 779, including a suite that checks each generated filter against the reference table it replaced and that every corner holds across a rate change, and a suite covering the digital-mode state transitions and CAT commands. +- Two new persisted settings, `digitalDriveLevel` and `digitalRxLevel`, with menu entries under Microphone options ("USB drive", "USB RX level"). + +## V1.3 Release Notes + +### New Features + +**General Coverage Receive Band** +A receive-only "GEN" band covering 200 kHz to 80.8 MHz *(contributed by Michael, dj2mg)*. The band table gained a `BandType` (`HAM_BAND` / `MISC_BAND`), and `IsTxAllowed()` now guards all four transmit entry transitions in the mode state machine, so the radio cannot be keyed outside an amateur band. Low-pass filter selection is handled appropriately for non-ham bands. + +**Faster Spectrum and Waterfall** +More efficient waterfall operation *(contributed by tmr4)*, and the spectrum trace is drawn in `NCHUNKS` column groups, one group per pass of the main loop. Reducing `NCHUNKS` from 8 to 6 raised the spectrum refresh rate from roughly 11.7 to 15.6 fps. The audio spectrum and the waterfall are each updated every second spectrum frame, phase-offset from one another, to keep the per-loop cost inside the budget. + +**Serial Time Sync** +Send `T` followed by a 10-digit Unix UTC timestamp and a newline to the debug serial port (115200) to set both the Teensy's coin-cell-backed hardware RTC and the TimeLib clock. WSJT-X requires the clock to be within ±1 second of UTC. + +**Filter Band Edge Control** +The Filter button on the front panel now toggles which band edge the Filter encoder adjusts, in addition to the existing behaviour using the Filter encoder's own button. The blue band indicator is drawn in the right place, and adjusting a band edge now catches and prevents invalid conditions. + +### Bug Fixes + +- **Noise reduction dropped audio after a cold power cycle**, caused by uninitialised DMAMEM. +- **The BIT screen misreported dual VFO presence.** + +### Under-the-Hood Changes + +- A GitHub Actions workflow compiles the firmware on every pull request. +- GPL headers added to all source files. +- `BUFFER_SIZE` renamed to `USB_BUFFER_SIZE` to avoid a namespace conflict with other libraries. +- Rotary encoder tuning tweaks *(contributed by Tom Metty, AJ8X)*. +- ArduinoJson documented as a build dependency *(contributed by AnttiVL)*. +- `Contributors.txt` moved to `code/src/PhoenixSketch/`. + ## V1.2 Release Notes ### New Features @@ -127,6 +212,9 @@ The comprehensive unit tests, mocking functions, and their build files are locat * **Unit tests**: `code/test` +The same directory also builds the **desktop radio simulator** (`RadioSimulator_main.cpp` → the +`radio_simulator` target), which runs the firmware on a PC with an SDL-emulated display. + Useful sketches for testing the boards as you build them are here: * **Board tests**: `code/src/BoardTest` @@ -135,6 +223,17 @@ The sketch for the ATTiny85 in the main board power control block is here: * **ATTiny85 power control**: `code/src/ATTiny85_On_Off` +Host-side Python tooling for measuring the radio on the bench — mostly hardware-in-the-loop test +suites driven over CAT with an Analog Discovery 2 — is here, each subdirectory with its own README: + +* **Bench tools**: `code/tools` (including `filter_hil/` and `tx_filter_hil/`, which measure the + receive and transmit DSP filters on the real radio at both sample rates) + +An LLM-maintained knowledge base covering the firmware, the DSP theory behind it, the hardware +platform, and the development roadmap is here: + +* **Knowledge wiki**: `wiki/` — start at `wiki/index.md` + ## Useful Diagrams (.drawio files) These diagrams can be edited with draw.io. Some are used to generate state machine code with StateSmith: @@ -150,13 +249,13 @@ These diagrams can be edited with draw.io. Some are used to generate state machi Phoenix SDR is built around a state machine-driven architecture that ensures deterministic hardware control. Events like button presses, CAT commands, or encoder turns are placed in an interrupt buffer and handled at a predictable point in the code, preventing state corruption. The code implements hardware abstraction for testability and modularity. 1. **Separation of Concerns**: Hardware control, signal processing, and display are isolated into separate modules with clear interfaces. Hardware interfaces (RFBoard, LPFBoard, BPFBoard) provide clean APIs, allowing mocking for unit tests. -2. **State Machine Control**: All hardware state changes flow through state machines (ModeSm, UISm, TuneSm) ensuring deterministic, predictable behavior. +2. **State Machine Control**: All hardware state changes flow through state machines (ModeSm, UISm, HardwareSm) ensuring deterministic, predictable behavior. 3. **Separated Display**: Display code is separated from the rest of code and reads the global state but never modifies it. As a demonstration of the display code separation, it can be disabled by commenting out a single line in `loop()` and the radio can operate without the display. 4. **Testing and Debugging**: An extensive set of unit tests ensure that changes to the code don't cause unexpected subtle bugs. The test framework enables you to use software debuggers to exercise the radio code, greatly speeding up the process of finding and fixing most bugs. ## State machines -The behavior of the radio is controlled by a set of state machines. Hardware interrupts, like button presses, are handled by the main loop and used to dispatch events to the Mode and UI state machines, as well as update the shared global configuration settings. The Mode State Machine drives two further state machines: one controls the hardware state, and the other controls the frequencies of the VFOs. The architecture of the state machines is shown in the diagram below. +The behavior of the radio is controlled by a set of state machines. Hardware interrupts, like button presses, are handled by the main loop and used to dispatch events to the Mode and UI state machines, as well as update the shared global configuration settings. The Mode State Machine drives the hardware state machine (`HardwareSm.cpp`), which is hand-written rather than generated; it both configures the hardware and owns the VFO frequency state (`HandleTuneState`). It in turn drives the four generated calibration state machines. The architecture of the state machines is shown in the diagram below. ![](images/state_machine_architecture.png) @@ -188,7 +287,9 @@ We don't want button presses to change the hardware state at random, unspecified ## Remote control -The radio will provide two serial interfaces over USB. The first, at a baud rate of 115200, prints debug messages. The second, at a baud rate of 38400, implements CAT control with a partial implementation of the Kenwood TS-480 CAT Interface. +Built with the **Dual Serial** USB type, the radio provides two serial interfaces over USB. The first, at a baud rate of 115200, prints debug messages. The second, at a baud rate of 38400, implements CAT control with a partial implementation of the Kenwood TS-480 CAT Interface. + +Built with **Serial + MIDI + Audio** — the USB type digital mode needs — Teensyduino offers only one CDC port, so CAT moves to that first (and only) port and the debug output is compiled out to keep it from corrupting the CAT stream. Point your CAT client at the first port in that configuration. # Build environment @@ -213,16 +314,17 @@ The libraries to install using this process are: Configure the Arduino IDE to compile with the following settings: -* Dual Serial +* USB type: **Serial + MIDI + Audio** if you want digital mode (FT8 etc.), otherwise **Dual Serial**. See the note under Remote control above — the choice determines which port carries CAT. * 600 MHz * Fast with LTO -You should see the following memory usage when compilation is complete: +You should see memory usage in the region of the figures below when compilation is complete. They +are indicative rather than exact — they move with every release, and with your `Config.h` options: ``` Memory Usage on Teensy 4.1: - FLASH: code:287164, data:75372, headers:9172 free for files:7754756 - RAM1: variables:127136, code:283976, padding:10936 free for local variables:102240 - RAM2: variables:300480 free for malloc/new:223808 + FLASH: code:302828, data:78444, headers:8868 free for files:7736324 + RAM1: variables:139744, code:299672, padding:28008 free for local variables:56864 + RAM2: variables:302528 free for malloc/new:221760 ``` ## StateSmith @@ -257,16 +359,16 @@ This will compile and run the unit test programs. You should see an output that ```bash ... -654/657 Test #654: PowerCalibrationTest.FitPowerCurve_RealWorldData .............................. Passed 0.00 sec - Start 655: PowerCalibrationWalkthroughTest.CompleteCalibrationAllBands -655/657 Test #655: PowerCalibrationWalkthroughTest.CompleteCalibrationAllBands ................... Passed 1.64 sec - Start 656: PowerCalibrationWalkthroughTest.RemeasuringDataPoints_StateRemainsCorrect -656/657 Test #656: PowerCalibrationWalkthroughTest.RemeasuringDataPoints_StateRemainsCorrect ..... Passed 0.44 sec - Start 657: PowerCalibrationWalkthroughTest.StateTransitions_ResetBehavior -657/657 Test #657: PowerCalibrationWalkthroughTest.StateTransitions_ResetBehavior ................ Passed 0.49 sec +776/779 Test #776: PowerCalibrationTest.FitPowerCurve_RealWorldData .............................. Passed 0.01 sec + Start 777: PowerCalibrationWalkthroughTest.CompleteCalibrationAllBands +777/779 Test #777: PowerCalibrationWalkthroughTest.CompleteCalibrationAllBands ................... Passed 1.75 sec + Start 778: PowerCalibrationWalkthroughTest.RemeasuringDataPoints_StateRemainsCorrect +778/779 Test #778: PowerCalibrationWalkthroughTest.RemeasuringDataPoints_StateRemainsCorrect ..... Passed 0.54 sec + Start 779: PowerCalibrationWalkthroughTest.StateTransitions_ResetBehavior +779/779 Test #779: PowerCalibrationWalkthroughTest.StateTransitions_ResetBehavior ................ Passed 0.60 sec -100% tests passed, 0 tests failed out of 657 +100% tests passed, 0 tests failed out of 779 -Total Test time (real) = 50.16 sec +Total Test time (real) = 91.50 sec ``` diff --git a/code/docs/DrawDisplay_Timing_Baseline.md b/code/docs/DrawDisplay_Timing_Baseline.md deleted file mode 100644 index 64d3bf3..0000000 --- a/code/docs/DrawDisplay_Timing_Baseline.md +++ /dev/null @@ -1,314 +0,0 @@ -# DrawDisplay Timing Baseline - -Baseline timing profile of `loop()` over 1 second, with `DrawSpectrumPane()` -bracketed by `Flag(3)`. Use this as the reference for evaluating future -changes to `DrawDisplay()` and its subfunctions. - -## Capture conditions - -| Field | Value | -|---|---| -| Branch | `display_timing` | -| Commit | `f479960` (+ TEMP `Flag()` instrumentation in `DrawSpectrumPane`) | -| Date | 2026-05-23 | -| Radio UI state | HOME | -| Sample rate | 250 kHz (4 µs resolution) | -| Capture duration | 1.000 s | -| Acquisition mode | record (USB streaming) | -| Trigger | `Flag(1)` (DrawDisplay entry) | -| Debounce | 8 µs (2 samples) | -| Lost samples | 0 | -| Corrupt samples | 574 (DWF advisory; no observed effect on segment counts) | - -The capture was made with the firmware compiled at `opt=o1lto` and the radio -running in its default boot state. - -### Instrumentation in effect - -| Flag | Meaning | Source | -|---|---|---| -| `0` | Loop idle (between iterations) | `Loop.cpp` `loop()` tail | -| `1` | Inside `DrawDisplay()` — everything except `DrawSpectrumPane` | `Loop.cpp` (entry), `MainBoard_DisplayHome.cpp` `DrawSpectrumPane()` exit (TEMP) | -| `2` | `PerformSignalProcessing()` | `Loop.cpp` | -| `3` | Inside `DrawSpectrumPane()` (includes `DrawFrequencyBarValue`, `DrawBandWidthIndicatorBar`, `ShowSpectrum`, `ShowBandwidth`) | `MainBoard_DisplayHome.cpp` (TEMP) | -| `4` | Event processing | `Loop.cpp` (set, but segment swallowed by debounce — see Caveats) | - -## Headline numbers - -**Iteration rate**: ~95 Hz → ~10.5 ms per `loop()` iteration. - -**Time budget per second (% of CPU):** - -| Stage | Total time | % of CPU | -|---|---|---| -| `PerformSignalProcessing` (Flag 2) | 464 ms | 46.4 % | -| `DrawSpectrumPane` (Flag 3) | 510 ms | 51.0 % | -| Rest of `DrawDisplay` (Flag 1) | 26 ms | 2.6 % | - -`DrawSpectrumPane` is the largest single consumer in `loop()` — it accounts -for over half of CPU time and is the dominant bottleneck for iteration rate. - -### Overall timeline - -![Flag timeline (one row per flag)](DrawDisplay_baseline_timeline.png) - -Each row is one flag. Flag 2 (orange) and Flag 3 (green) alternate -throughout the second, with the wider green bars marking the ~13 ms -"heavy redraw" path and the wider orange bars marking the ~10 ms -double-block processing path. Flag 1 (blue, sparse) appears only at -the boundaries — the 3 visible tall ticks around 200 / 460 / 720 ms -are the ~780 µs `DrawHome`-cold-path outliers. - -## Per-stage statistics (n = 1-second capture) - -All times in **microseconds**. Resolution = 4 µs (one sample period). - -### Flag 3 — DrawSpectrumPane - -| Stat | Value (µs) | -|---|---| -| Count | 95 invocations | -| Min | 8 | -| Median | 5 064 | -| Mean | 5 371 | -| p95 | 13 093 | -| p99 | 13 180 | -| Max | 13 248 | -| Stddev | 3 887 | - -![DrawSpectrumPane distribution and scatter](DrawDisplay_baseline_flag3.png) - -**Distribution shape**: **multi-modal** — at least four distinct duration -lanes are visible in the histogram: - -| Lane | Approx duration | Count | Likely path | -|---|---|---|---| -| 1 | ~8 µs (1 bin) | 22 | Early return at `MainBoard_DisplayHome.cpp:735` (`!PaneSpectrum.stale`) | -| 2 | ~5 ms | 32 | Typical waterfall + spectrum redraw (median path) | -| 3 | ~7–8 ms | 9 | Spectrum + bandwidth indicator | -| 4 | ~9–10 ms | 8 | Heavier redraw including additional sub-panes | -| 5 | ~13 ms | 8 | Slowest path — full redraw with all overlays | - -The scatter plot shows the slow-lane events are **uniformly distributed** -through the 1-second window, not clustered at startup or thermal-drifting, -indicating discrete code-path branches inside `DrawSpectrumPane` rather -than a transient. Optimization should target the ~13 ms lane first: it -accounts for ~104 ms (≈ 20% of total `DrawSpectrumPane` time) from only -8 invocations. - -### Flag 2 — PerformSignalProcessing - -| Stat | Value (µs) | -|---|---| -| Count | 94 invocations | -| Min | 292 | -| Median | 4 812 | -| Mean | 4 934 | -| p95 | 10 416 | -| p99 | 10 421 | -| Max | 10 440 | -| Stddev | 2 700 | - -![SignalProcessing distribution and scatter](DrawDisplay_baseline_flag2.png) - -Three-lane structure: - -| Lane | Approx duration | Count | Likely path | -|---|---|---|---| -| 1 | ~2.7 ms | 39 | One audio block ready — typical | -| 2 | ~5–5.5 ms | 39 | Slightly heavier processing path | -| 3 | ~10.4 ms | 15 | Two audio blocks back-to-back (catch-up iteration) | - -The lone outlier near 0.3 ms is the fast no-block-ready early return. The -scatter shows the ~10.4 ms double-block iterations are scattered through -the second rather than periodic, consistent with audio FIFO catch-up -triggered by occasional draw-side stalls. - -### Flag 1 — Rest of DrawDisplay (excludes DrawSpectrumPane) - -| Stat | Value (µs) | -|---|---| -| Count | 187 segments (~2 per iteration: pre- and post-spectrum) | -| Min | 8 | -| Median | 28 | -| Mean | 139 | -| p95 | 248 | -| p99 | 779 | -| Max | 888 | -| Stddev | 159 | - -![Flag 1 distribution and scatter](DrawDisplay_baseline_flag1.png) - -Bimodal: ~94 short segments at ~28 µs (the pre-spectrum portion when -`DrawHome` does nothing but call into the pane loop) and ~88 segments -around 220–260 µs (post-spectrum: the remaining 11 panes plus -`MorseCharacterDisplay`). Three outliers around ~780 µs (visible in the -scatter at t ≈ 200, 460, 720 ms) are evenly spaced ~250 ms apart, suggesting -a periodic refresh event (e.g. the `timer_ms > 1000` 1-Hz tick that marks -`PaneStateOfHealth` and `PaneTime` stale at `MainBoard_DisplayHome.cpp:1622`). - -## Transition graph (sanity check) - -Observed flag-to-flag transitions in the 1-second capture: - -``` -1 -> 2 : 93 (end of DrawDisplay -> start of next iter's signal processing) -1 -> 3 : 94 (entering DrawSpectrumPane from DrawDisplay) -2 -> 1 : 93 (entering DrawDisplay from signal processing) -2 -> 3 : 1 (single transient at start of capture) -3 -> 1 : 93 (returning from DrawSpectrumPane) -3 -> 2 : 1 (single transient at start of capture) -``` - -The 2 → 3 and 3 → 2 transitions are start-of-capture artifacts (the trigger -fired mid-iteration). All steady-state transitions match the expected -pattern: each iteration goes Flag 2 → Flag 1 (pre-spectrum) → Flag 3 → -Flag 1 (post-spectrum) → Flag 2 (next iter). - -## Caveats - -- **Resolution**: 4 µs (sample period at 250 kHz). Sub-4-µs intervals are - not resolvable. Each `Flag()` call itself adds ~1 µs of wall time - (four sequential `digitalWrite()`s). -- **Flag 4 / Flag 0 invisible**: event processing (Flag 4) and the - loop-idle gap (Flag 0) are shorter than the 8 µs debounce and get merged - into the trailing Flag 1 segment. The Flag 1 "post-spectrum" segments - therefore include a few µs of loop-boundary overhead. -- **Sample-rate ceiling**: at 500 kHz and above, the AD2's 4 KiB on-device - ring buffer overflows in `flag_timing.py`'s record-mode polling loop and - reports `lost_samples > 0`. 250 kHz is the practical ceiling for 1-second - multi-iteration captures with the current script. -- **Mode dependency**: this baseline reflects the HOME UI state with the - radio in default boot conditions. Other UI states (MENU, BIT, - CALIBRATE_*) take entirely different paths through `DrawDisplay()` and - must be characterized separately. - -## Phase 1 results — spectrum back-buffer on L2 - -First optimization pass against this baseline. `ShowSpectrum()` in -`code/src/PhoenixSketch/MainBoard_DisplayHome.cpp` now draws the yellow -spectrum trace onto LAYER2 (no per-bin black-erase line, `pixelold` reused -only as the per-bin y record for the waterfall colour stamp), and a single -`BTE_move(..., 2, 1)` publishes the spectrum rect to LAYER1 at the end of -each 8-chunk sweep. The yellow spectrum-pane border is restamped on L2 -each sweep (DrawBandWidthIndicatorBar's opening fillRect overlaps the -border's left + bottom edges). Trace `y` is clipped to -`SPECTRUM_TOP_Y + 20` so it cannot accumulate into the top 20-row band -where the bandwidth/scale text lives. Audio spectrum and waterfall colour -stay on LAYER1, indexed identically to the baseline. See GitHub issue -[KI3P/Phoenix#20](https://github.com/KI3P/Phoenix/issues/20). - -### Capture conditions (deltas from baseline) - -| Field | Value | -|---|---| -| Date | 2026-05-23 | -| Commit | baseline + Phase 1 diff in `MainBoard_DisplayHome.cpp` | -| Runs | 3 consecutive 1-second captures (numbers below are the middle run) | -| Corrupt samples | 0 | -| All other fields | as baseline (250 kHz, 1 s, debounce 8 µs, trigger Flag 1) | - -### Headline numbers - -| Stage | Baseline | Phase 1 | Δ | -|---|---:|---:|---:| -| `PerformSignalProcessing` (Flag 2) | 464 ms (46.4%) | 524 ms (52.4%) | +60 ms | -| `DrawSpectrumPane` (Flag 3) | 510 ms (51.0%) | **450 ms (45.0%)** | **−60 ms** | -| Rest of `DrawDisplay` (Flag 1) | 26 ms (2.6%) | 26 ms (2.6%) | — | - -`DrawSpectrumPane` is no longer the dominant CPU consumer. Signal processing -picked up the freed budget — its share rose because more loop iterations -now fit per second. - -### Flag 3 stats (Phase 1) - -| Stat | Baseline (µs) | Phase 1 (µs) | Δ | -|---|---:|---:|---:| -| Count | 95 | 93 | — | -| Min | 8 | 8 | — | -| Median | 5 064 | **2 096** | **−59%** | -| Mean | 5 371 | **4 835** | **−10%** | -| p95 | 13 093 | 15 826 | +21% | -| p99 | 13 180 | 15 920 | +21% | -| Max | 13 248 | 15 964 | +21% | -| Stddev | 3 887 | ~5 300 | +36% | - -![DrawSpectrumPane Phase 1 distribution and scatter](DrawDisplay_phase1_flag3.png) - -**Distribution shape**: the four mid-weight lanes from baseline (5 / 7–8 / -9–10 / 13 ms) collapse into a dominant ~2 ms lane (typical chunk, no -sweep-end work) plus a heavier ~16 ms lane (sweep-end chunk that runs -`DrawBandWidthIndicatorBar`, the border restamp `drawRect`, spectrum -`BTE_move`, and waterfall `BTE_move` on the same iteration). The -early-return lane (~8 µs) survives unchanged. - -The slow lane gained ~2.7 ms because the spectrum `BTE_move`, -once-per-sweep filter-bar restamp, and border restamp are concentrated on -the 8th chunk instead of spread across all 8. The median-path saving (~3 -ms per typical chunk × ~80 typical chunks = ~−240 ms) outweighs the -slow-lane cost (~+2.7 ms × ~12 sweep-end chunks = ~+30 ms) but the gap is -smaller than a single-run measurement might suggest because per-bin -`drawLine` time depends on trace shape, which varies sweep-to-sweep with -spectrum content. Re-runs of the same configuration cluster tightly -(±10 ms across 3 runs at the same radio state) but a single 1-second -measurement should not be treated as authoritative — always take the -median of 3+ runs when comparing. - -### Per-loop-iteration timeline (Phase 1) - -![Phase 1 flag timeline (one row per flag)](DrawDisplay_phase1_timeline.png) - -Compared with the baseline timeline, green (`DrawSpectrumPane`) bars are -visibly narrower in the typical case, with the wider bars concentrated at -the sweep boundary. - -### Known visual tradeoff - -During the ~13–16 ms sweep window the user sees `OR(L1_previous_trace, -L2_in_progress_trace)`. For static or slowly-changing spectra the OR is -invisible (yellow on yellow). On fast-changing displays a brief -column-by-column "smearing" may be visible. If that matters, bracket the -draw with `tft.layerEffect(LAYER1)` / `tft.layerEffect(OR)` around the BTE -— additive, single-screen scope, no change to other UI paths. - -### Raw capture - -`code/docs/DrawDisplay_phase1_capture.json` (regenerate plots with the same -`plot_flag_timing.py` invocation as for the baseline, swapping the input -file and prefix). - -## How to reproduce - -The raw capture is preserved at -`code/docs/DrawDisplay_baseline_capture.json`. To reproduce from scratch: - -1. Verify the two `// TEMP timing instrumentation` lines bracket - `DrawSpectrumPane()` in `code/src/PhoenixSketch/MainBoard_DisplayHome.cpp`. -2. Compile + flash with `arduino-cli` (see `timing-measurement` skill). -3. With the radio on the HOME screen, run: - - ```bash - /home/oliver/Sync/Ham/T41/Software/Phoenix/code/tools/venv/bin/python \ - /home/oliver/Sync/Ham/T41/Software/Phoenix/code/tools/flag_timing.py \ - --sample-rate 250e3 --duration 1 \ - --debounce-us 8 \ - --trigger flag --trigger-flag 1 \ - --quiet > profile.json - ``` - -4. `jq '.summary.flag_segment_stats' profile.json` and compare to the - tables above. Flag 3 mean/p95 are the headline numbers for tracking - regressions to `DrawSpectrumPane`. - -5. Regenerate the plots from the saved JSON: - - ```bash - /home/oliver/Sync/Ham/T41/Software/Phoenix/code/tools/venv/bin/python \ - /home/oliver/Sync/Ham/T41/Software/Phoenix/code/tools/plot_flag_timing.py \ - profile.json \ - --prefix DrawDisplay_baseline \ - --flag-labels "1=DrawDisplay-other,2=SignalProcessing,3=DrawSpectrumPane" - ``` - - Outputs one `_flag.png` per flag (with histogram + iteration - scatter) and one `_timeline.png` (stacked-row timeline). diff --git a/code/docs/DrawDisplay_baseline_capture.json b/code/docs/DrawDisplay_baseline_capture.json deleted file mode 100644 index 9e08a74..0000000 --- a/code/docs/DrawDisplay_baseline_capture.json +++ /dev/null @@ -1 +0,0 @@ -{"metadata":{"sample_rate_hz":250000.0,"sample_period_s":4e-06,"buffer_size":250000,"duration_s":1.0,"trigger":"flag=1","trigger_position_frac":0.1,"debounce_us":8.0,"debounce_samples":2,"acquisition_mode":"record","lost_samples":0,"corrupt_samples":574,"lost_fraction":0.0,"device_buffer_size":4096,"pin_mapping":{"28":{"bit":3,"dio":1},"29":{"bit":2,"dio":2},"30":{"bit":1,"dio":3},"31":{"bit":0,"dio":4}}},"transitions":[{"index":2,"time_s":8e-06,"from_flag":1,"to_flag":3},{"index":4,"time_s":1.6e-05,"from_flag":3,"to_flag":1},{"index":56,"time_s":0.000224,"from_flag":1,"to_flag":2},{"index":2666,"time_s":0.010664,"from_flag":2,"to_flag":1},{"index":2668,"time_s":0.010672,"from_flag":1,"to_flag":3},{"index":4979,"time_s":0.019916,"from_flag":3,"to_flag":1},{"index":5039,"time_s":0.020156,"from_flag":1,"to_flag":2},{"index":5700,"time_s":0.022799999999999997,"from_flag":2,"to_flag":1},{"index":5702,"time_s":0.022808,"from_flag":1,"to_flag":3},{"index":8130,"time_s":0.03252,"from_flag":3,"to_flag":1},{"index":8193,"time_s":0.032771999999999996,"from_flag":1,"to_flag":2},{"index":8853,"time_s":0.035412,"from_flag":2,"to_flag":1},{"index":8855,"time_s":0.03542,"from_flag":1,"to_flag":3},{"index":10133,"time_s":0.040532,"from_flag":3,"to_flag":1},{"index":10194,"time_s":0.040776,"from_flag":1,"to_flag":2},{"index":10856,"time_s":0.043424,"from_flag":2,"to_flag":1},{"index":10858,"time_s":0.043432,"from_flag":1,"to_flag":3},{"index":12089,"time_s":0.048355999999999996,"from_flag":3,"to_flag":1},{"index":12149,"time_s":0.048596,"from_flag":1,"to_flag":2},{"index":13333,"time_s":0.053332,"from_flag":2,"to_flag":1},{"index":13335,"time_s":0.05334,"from_flag":1,"to_flag":3},{"index":14614,"time_s":0.058455999999999994,"from_flag":3,"to_flag":1},{"index":14675,"time_s":0.058699999999999995,"from_flag":1,"to_flag":2},{"index":15999,"time_s":0.063996,"from_flag":2,"to_flag":1},{"index":16002,"time_s":0.064008,"from_flag":1,"to_flag":3},{"index":17252,"time_s":0.069008,"from_flag":3,"to_flag":1},{"index":17307,"time_s":0.069228,"from_flag":1,"to_flag":2},{"index":18666,"time_s":0.074664,"from_flag":2,"to_flag":1},{"index":18668,"time_s":0.074672,"from_flag":1,"to_flag":3},{"index":19955,"time_s":0.07982,"from_flag":3,"to_flag":1},{"index":20017,"time_s":0.080068,"from_flag":1,"to_flag":2},{"index":21333,"time_s":0.08533199999999999,"from_flag":2,"to_flag":1},{"index":21335,"time_s":0.08534,"from_flag":1,"to_flag":3},{"index":24614,"time_s":0.098456,"from_flag":3,"to_flag":1},{"index":24676,"time_s":0.098704,"from_flag":1,"to_flag":2},{"index":25336,"time_s":0.10134399999999999,"from_flag":2,"to_flag":1},{"index":25338,"time_s":0.101352,"from_flag":1,"to_flag":3},{"index":27112,"time_s":0.10844799999999999,"from_flag":3,"to_flag":1},{"index":27173,"time_s":0.108692,"from_flag":1,"to_flag":2},{"index":27834,"time_s":0.11133599999999999,"from_flag":2,"to_flag":1},{"index":27836,"time_s":0.111344,"from_flag":1,"to_flag":3},{"index":27838,"time_s":0.11135199999999999,"from_flag":3,"to_flag":1},{"index":27896,"time_s":0.11158399999999999,"from_flag":1,"to_flag":2},{"index":29333,"time_s":0.11733199999999999,"from_flag":2,"to_flag":1},{"index":29335,"time_s":0.11734,"from_flag":1,"to_flag":3},{"index":29337,"time_s":0.117348,"from_flag":3,"to_flag":1},{"index":29396,"time_s":0.117584,"from_flag":1,"to_flag":2},{"index":31999,"time_s":0.127996,"from_flag":2,"to_flag":1},{"index":32002,"time_s":0.12800799999999998,"from_flag":1,"to_flag":3},{"index":32004,"time_s":0.128016,"from_flag":3,"to_flag":1},{"index":32062,"time_s":0.128248,"from_flag":1,"to_flag":2},{"index":34666,"time_s":0.13866399999999998,"from_flag":2,"to_flag":1},{"index":34668,"time_s":0.138672,"from_flag":1,"to_flag":3},{"index":36978,"time_s":0.147912,"from_flag":3,"to_flag":1},{"index":37037,"time_s":0.148148,"from_flag":1,"to_flag":2},{"index":37698,"time_s":0.15079199999999998,"from_flag":2,"to_flag":1},{"index":37700,"time_s":0.1508,"from_flag":1,"to_flag":3},{"index":40080,"time_s":0.16032,"from_flag":3,"to_flag":1},{"index":40142,"time_s":0.160568,"from_flag":1,"to_flag":2},{"index":40803,"time_s":0.163212,"from_flag":2,"to_flag":1},{"index":40805,"time_s":0.16322,"from_flag":1,"to_flag":3},{"index":42060,"time_s":0.16824,"from_flag":3,"to_flag":1},{"index":42121,"time_s":0.168484,"from_flag":1,"to_flag":2},{"index":42782,"time_s":0.171128,"from_flag":2,"to_flag":1},{"index":42784,"time_s":0.17113599999999998,"from_flag":1,"to_flag":3},{"index":43987,"time_s":0.175948,"from_flag":3,"to_flag":1},{"index":44053,"time_s":0.17621199999999998,"from_flag":1,"to_flag":2},{"index":45333,"time_s":0.181332,"from_flag":2,"to_flag":1},{"index":45335,"time_s":0.18134,"from_flag":1,"to_flag":3},{"index":46617,"time_s":0.186468,"from_flag":3,"to_flag":1},{"index":46678,"time_s":0.186712,"from_flag":1,"to_flag":2},{"index":47999,"time_s":0.191996,"from_flag":2,"to_flag":1},{"index":48001,"time_s":0.19200399999999998,"from_flag":1,"to_flag":3},{"index":49241,"time_s":0.196964,"from_flag":3,"to_flag":1},{"index":49303,"time_s":0.197212,"from_flag":1,"to_flag":2},{"index":50666,"time_s":0.20266399999999998,"from_flag":2,"to_flag":1},{"index":50668,"time_s":0.202672,"from_flag":1,"to_flag":3},{"index":51961,"time_s":0.207844,"from_flag":3,"to_flag":1},{"index":52155,"time_s":0.20862,"from_flag":1,"to_flag":2},{"index":53333,"time_s":0.213332,"from_flag":2,"to_flag":1},{"index":53335,"time_s":0.21334,"from_flag":1,"to_flag":3},{"index":56588,"time_s":0.226352,"from_flag":3,"to_flag":1},{"index":56649,"time_s":0.226596,"from_flag":1,"to_flag":2},{"index":57310,"time_s":0.22924,"from_flag":2,"to_flag":1},{"index":57312,"time_s":0.22924799999999998,"from_flag":1,"to_flag":3},{"index":59146,"time_s":0.236584,"from_flag":3,"to_flag":1},{"index":59208,"time_s":0.236832,"from_flag":1,"to_flag":2},{"index":59868,"time_s":0.239472,"from_flag":2,"to_flag":1},{"index":59870,"time_s":0.23948,"from_flag":1,"to_flag":3},{"index":59872,"time_s":0.23948799999999998,"from_flag":3,"to_flag":1},{"index":59931,"time_s":0.239724,"from_flag":1,"to_flag":2},{"index":61333,"time_s":0.245332,"from_flag":2,"to_flag":1},{"index":61335,"time_s":0.24534,"from_flag":1,"to_flag":3},{"index":61337,"time_s":0.24534799999999998,"from_flag":3,"to_flag":1},{"index":61395,"time_s":0.24558,"from_flag":1,"to_flag":2},{"index":63999,"time_s":0.255996,"from_flag":2,"to_flag":1},{"index":64001,"time_s":0.256004,"from_flag":1,"to_flag":3},{"index":64003,"time_s":0.25601199999999996,"from_flag":3,"to_flag":1},{"index":64062,"time_s":0.256248,"from_flag":1,"to_flag":2},{"index":66666,"time_s":0.266664,"from_flag":2,"to_flag":1},{"index":66668,"time_s":0.26667199999999996,"from_flag":1,"to_flag":3},{"index":68984,"time_s":0.275936,"from_flag":3,"to_flag":1},{"index":69037,"time_s":0.276148,"from_flag":1,"to_flag":2},{"index":69699,"time_s":0.278796,"from_flag":2,"to_flag":1},{"index":69701,"time_s":0.278804,"from_flag":1,"to_flag":3},{"index":72082,"time_s":0.288328,"from_flag":3,"to_flag":1},{"index":72144,"time_s":0.288576,"from_flag":1,"to_flag":2},{"index":72804,"time_s":0.291216,"from_flag":2,"to_flag":1},{"index":72806,"time_s":0.291224,"from_flag":1,"to_flag":3},{"index":74041,"time_s":0.296164,"from_flag":3,"to_flag":1},{"index":74102,"time_s":0.296408,"from_flag":1,"to_flag":2},{"index":74763,"time_s":0.299052,"from_flag":2,"to_flag":1},{"index":74765,"time_s":0.29906,"from_flag":1,"to_flag":3},{"index":75986,"time_s":0.303944,"from_flag":3,"to_flag":1},{"index":76052,"time_s":0.304208,"from_flag":1,"to_flag":2},{"index":77332,"time_s":0.309328,"from_flag":2,"to_flag":1},{"index":77335,"time_s":0.30934,"from_flag":1,"to_flag":3},{"index":78605,"time_s":0.31442,"from_flag":3,"to_flag":1},{"index":78667,"time_s":0.314668,"from_flag":1,"to_flag":2},{"index":79999,"time_s":0.319996,"from_flag":2,"to_flag":1},{"index":80001,"time_s":0.320004,"from_flag":1,"to_flag":3},{"index":81255,"time_s":0.32502,"from_flag":3,"to_flag":1},{"index":81316,"time_s":0.325264,"from_flag":1,"to_flag":2},{"index":82666,"time_s":0.33066399999999996,"from_flag":2,"to_flag":1},{"index":82668,"time_s":0.33067199999999997,"from_flag":1,"to_flag":3},{"index":83957,"time_s":0.33582799999999996,"from_flag":3,"to_flag":1},{"index":84019,"time_s":0.336076,"from_flag":1,"to_flag":2},{"index":85332,"time_s":0.34132799999999996,"from_flag":2,"to_flag":1},{"index":85335,"time_s":0.34134,"from_flag":1,"to_flag":3},{"index":88621,"time_s":0.35448399999999997,"from_flag":3,"to_flag":1},{"index":88682,"time_s":0.354728,"from_flag":1,"to_flag":2},{"index":89342,"time_s":0.35736799999999996,"from_flag":2,"to_flag":1},{"index":89344,"time_s":0.35737599999999997,"from_flag":1,"to_flag":3},{"index":91129,"time_s":0.364516,"from_flag":3,"to_flag":1},{"index":91190,"time_s":0.36476,"from_flag":1,"to_flag":2},{"index":91851,"time_s":0.367404,"from_flag":2,"to_flag":1},{"index":91853,"time_s":0.36741199999999996,"from_flag":1,"to_flag":3},{"index":91855,"time_s":0.36741999999999997,"from_flag":3,"to_flag":1},{"index":91914,"time_s":0.367656,"from_flag":1,"to_flag":2},{"index":93332,"time_s":0.373328,"from_flag":2,"to_flag":1},{"index":93335,"time_s":0.37334,"from_flag":1,"to_flag":3},{"index":93337,"time_s":0.37334799999999996,"from_flag":3,"to_flag":1},{"index":93395,"time_s":0.37357999999999997,"from_flag":1,"to_flag":2},{"index":95999,"time_s":0.383996,"from_flag":2,"to_flag":1},{"index":96001,"time_s":0.38400399999999996,"from_flag":1,"to_flag":3},{"index":96003,"time_s":0.38401199999999996,"from_flag":3,"to_flag":1},{"index":96062,"time_s":0.384248,"from_flag":1,"to_flag":2},{"index":98666,"time_s":0.39466399999999996,"from_flag":2,"to_flag":1},{"index":98668,"time_s":0.39467199999999997,"from_flag":1,"to_flag":3},{"index":101006,"time_s":0.404024,"from_flag":3,"to_flag":1},{"index":101064,"time_s":0.404256,"from_flag":1,"to_flag":2},{"index":101725,"time_s":0.4069,"from_flag":2,"to_flag":1},{"index":101727,"time_s":0.406908,"from_flag":1,"to_flag":3},{"index":104147,"time_s":0.41658799999999996,"from_flag":3,"to_flag":1},{"index":104209,"time_s":0.416836,"from_flag":1,"to_flag":2},{"index":104870,"time_s":0.41947999999999996,"from_flag":2,"to_flag":1},{"index":104872,"time_s":0.41948799999999997,"from_flag":1,"to_flag":3},{"index":106120,"time_s":0.42447999999999997,"from_flag":3,"to_flag":1},{"index":106182,"time_s":0.424728,"from_flag":1,"to_flag":2},{"index":106843,"time_s":0.427372,"from_flag":2,"to_flag":1},{"index":106845,"time_s":0.42738,"from_flag":1,"to_flag":3},{"index":108116,"time_s":0.43246399999999996,"from_flag":3,"to_flag":1},{"index":108177,"time_s":0.432708,"from_flag":1,"to_flag":2},{"index":109332,"time_s":0.437328,"from_flag":2,"to_flag":1},{"index":109335,"time_s":0.43734,"from_flag":1,"to_flag":3},{"index":110581,"time_s":0.442324,"from_flag":3,"to_flag":1},{"index":110639,"time_s":0.442556,"from_flag":1,"to_flag":2},{"index":111999,"time_s":0.447996,"from_flag":2,"to_flag":1},{"index":112001,"time_s":0.44800399999999996,"from_flag":1,"to_flag":3},{"index":113266,"time_s":0.45306399999999997,"from_flag":3,"to_flag":1},{"index":113325,"time_s":0.4533,"from_flag":1,"to_flag":2},{"index":114666,"time_s":0.45866399999999996,"from_flag":2,"to_flag":1},{"index":114668,"time_s":0.45867199999999997,"from_flag":1,"to_flag":3},{"index":115972,"time_s":0.46388799999999997,"from_flag":3,"to_flag":1},{"index":116166,"time_s":0.46466399999999997,"from_flag":1,"to_flag":2},{"index":117332,"time_s":0.46932799999999997,"from_flag":2,"to_flag":1},{"index":117334,"time_s":0.469336,"from_flag":1,"to_flag":3},{"index":120628,"time_s":0.482512,"from_flag":3,"to_flag":1},{"index":120684,"time_s":0.482736,"from_flag":1,"to_flag":2},{"index":121344,"time_s":0.485376,"from_flag":2,"to_flag":1},{"index":121346,"time_s":0.485384,"from_flag":1,"to_flag":3},{"index":123181,"time_s":0.492724,"from_flag":3,"to_flag":1},{"index":123242,"time_s":0.49296799999999996,"from_flag":1,"to_flag":2},{"index":123903,"time_s":0.495612,"from_flag":2,"to_flag":1},{"index":123906,"time_s":0.49562399999999995,"from_flag":1,"to_flag":3},{"index":123908,"time_s":0.49563199999999996,"from_flag":3,"to_flag":1},{"index":123967,"time_s":0.495868,"from_flag":1,"to_flag":2},{"index":125332,"time_s":0.501328,"from_flag":2,"to_flag":1},{"index":125334,"time_s":0.501336,"from_flag":1,"to_flag":3},{"index":125336,"time_s":0.501344,"from_flag":3,"to_flag":1},{"index":125395,"time_s":0.50158,"from_flag":1,"to_flag":2},{"index":127999,"time_s":0.511996,"from_flag":2,"to_flag":1},{"index":128001,"time_s":0.512004,"from_flag":1,"to_flag":3},{"index":128003,"time_s":0.512012,"from_flag":3,"to_flag":1},{"index":128062,"time_s":0.5122479999999999,"from_flag":1,"to_flag":2},{"index":130665,"time_s":0.52266,"from_flag":2,"to_flag":1},{"index":130668,"time_s":0.522672,"from_flag":1,"to_flag":3},{"index":132967,"time_s":0.531868,"from_flag":3,"to_flag":1},{"index":133026,"time_s":0.532104,"from_flag":1,"to_flag":2},{"index":133687,"time_s":0.534748,"from_flag":2,"to_flag":1},{"index":133690,"time_s":0.53476,"from_flag":1,"to_flag":3},{"index":136104,"time_s":0.544416,"from_flag":3,"to_flag":1},{"index":136166,"time_s":0.5446639999999999,"from_flag":1,"to_flag":2},{"index":136821,"time_s":0.547284,"from_flag":2,"to_flag":1},{"index":136823,"time_s":0.547292,"from_flag":1,"to_flag":3},{"index":138086,"time_s":0.552344,"from_flag":3,"to_flag":1},{"index":138141,"time_s":0.5525639999999999,"from_flag":1,"to_flag":2},{"index":138802,"time_s":0.5552079999999999,"from_flag":2,"to_flag":1},{"index":138804,"time_s":0.5552159999999999,"from_flag":1,"to_flag":3},{"index":140070,"time_s":0.56028,"from_flag":3,"to_flag":1},{"index":140131,"time_s":0.560524,"from_flag":1,"to_flag":2},{"index":141332,"time_s":0.5653279999999999,"from_flag":2,"to_flag":1},{"index":141334,"time_s":0.565336,"from_flag":1,"to_flag":3},{"index":142067,"time_s":0.568268,"from_flag":3,"to_flag":2},{"index":142140,"time_s":0.56856,"from_flag":2,"to_flag":3},{"index":142564,"time_s":0.570256,"from_flag":3,"to_flag":1},{"index":142625,"time_s":0.5705,"from_flag":1,"to_flag":2},{"index":143999,"time_s":0.575996,"from_flag":2,"to_flag":1},{"index":144001,"time_s":0.576004,"from_flag":1,"to_flag":3},{"index":145283,"time_s":0.581132,"from_flag":3,"to_flag":1},{"index":145344,"time_s":0.581376,"from_flag":1,"to_flag":2},{"index":146666,"time_s":0.586664,"from_flag":2,"to_flag":1},{"index":146668,"time_s":0.586672,"from_flag":1,"to_flag":3},{"index":147968,"time_s":0.591872,"from_flag":3,"to_flag":1},{"index":148029,"time_s":0.592116,"from_flag":1,"to_flag":2},{"index":149332,"time_s":0.597328,"from_flag":2,"to_flag":1},{"index":149334,"time_s":0.597336,"from_flag":1,"to_flag":3},{"index":152573,"time_s":0.610292,"from_flag":3,"to_flag":1},{"index":152635,"time_s":0.61054,"from_flag":1,"to_flag":2},{"index":153295,"time_s":0.61318,"from_flag":2,"to_flag":1},{"index":153297,"time_s":0.613188,"from_flag":1,"to_flag":3},{"index":155117,"time_s":0.620468,"from_flag":3,"to_flag":1},{"index":155172,"time_s":0.620688,"from_flag":1,"to_flag":2},{"index":155832,"time_s":0.623328,"from_flag":2,"to_flag":1},{"index":155835,"time_s":0.62334,"from_flag":1,"to_flag":3},{"index":155837,"time_s":0.623348,"from_flag":3,"to_flag":1},{"index":155895,"time_s":0.62358,"from_flag":1,"to_flag":2},{"index":157332,"time_s":0.629328,"from_flag":2,"to_flag":1},{"index":157334,"time_s":0.629336,"from_flag":1,"to_flag":3},{"index":157336,"time_s":0.629344,"from_flag":3,"to_flag":1},{"index":157395,"time_s":0.6295799999999999,"from_flag":1,"to_flag":2},{"index":159999,"time_s":0.639996,"from_flag":2,"to_flag":1},{"index":160001,"time_s":0.640004,"from_flag":1,"to_flag":3},{"index":160003,"time_s":0.640012,"from_flag":3,"to_flag":1},{"index":160062,"time_s":0.6402479999999999,"from_flag":1,"to_flag":2},{"index":162665,"time_s":0.65066,"from_flag":2,"to_flag":1},{"index":162667,"time_s":0.650668,"from_flag":1,"to_flag":3},{"index":164956,"time_s":0.659824,"from_flag":3,"to_flag":1},{"index":165015,"time_s":0.66006,"from_flag":1,"to_flag":2},{"index":165676,"time_s":0.662704,"from_flag":2,"to_flag":1},{"index":165678,"time_s":0.662712,"from_flag":1,"to_flag":3},{"index":168108,"time_s":0.6724319999999999,"from_flag":3,"to_flag":1},{"index":168167,"time_s":0.6726679999999999,"from_flag":1,"to_flag":2},{"index":168821,"time_s":0.675284,"from_flag":2,"to_flag":1},{"index":168823,"time_s":0.675292,"from_flag":1,"to_flag":3},{"index":170087,"time_s":0.680348,"from_flag":3,"to_flag":1},{"index":170148,"time_s":0.680592,"from_flag":1,"to_flag":2},{"index":170809,"time_s":0.683236,"from_flag":2,"to_flag":1},{"index":170811,"time_s":0.683244,"from_flag":1,"to_flag":3},{"index":172067,"time_s":0.688268,"from_flag":3,"to_flag":1},{"index":172127,"time_s":0.688508,"from_flag":1,"to_flag":2},{"index":173332,"time_s":0.6933279999999999,"from_flag":2,"to_flag":1},{"index":173334,"time_s":0.693336,"from_flag":1,"to_flag":3},{"index":174585,"time_s":0.69834,"from_flag":3,"to_flag":1},{"index":174646,"time_s":0.698584,"from_flag":1,"to_flag":2},{"index":175999,"time_s":0.703996,"from_flag":2,"to_flag":1},{"index":176001,"time_s":0.704004,"from_flag":1,"to_flag":3},{"index":177283,"time_s":0.709132,"from_flag":3,"to_flag":1},{"index":177344,"time_s":0.709376,"from_flag":1,"to_flag":2},{"index":178665,"time_s":0.71466,"from_flag":2,"to_flag":1},{"index":178667,"time_s":0.714668,"from_flag":1,"to_flag":3},{"index":179956,"time_s":0.719824,"from_flag":3,"to_flag":1},{"index":180148,"time_s":0.720592,"from_flag":1,"to_flag":2},{"index":181332,"time_s":0.725328,"from_flag":2,"to_flag":1},{"index":181334,"time_s":0.725336,"from_flag":1,"to_flag":3},{"index":184607,"time_s":0.738428,"from_flag":3,"to_flag":1},{"index":184668,"time_s":0.738672,"from_flag":1,"to_flag":2},{"index":185323,"time_s":0.741292,"from_flag":2,"to_flag":1},{"index":185325,"time_s":0.7413,"from_flag":1,"to_flag":3},{"index":187141,"time_s":0.748564,"from_flag":3,"to_flag":1},{"index":187202,"time_s":0.7488079999999999,"from_flag":1,"to_flag":2},{"index":187863,"time_s":0.751452,"from_flag":2,"to_flag":1},{"index":187865,"time_s":0.75146,"from_flag":1,"to_flag":3},{"index":187867,"time_s":0.7514679999999999,"from_flag":3,"to_flag":1},{"index":187926,"time_s":0.7517039999999999,"from_flag":1,"to_flag":2},{"index":189332,"time_s":0.757328,"from_flag":2,"to_flag":1},{"index":189334,"time_s":0.757336,"from_flag":1,"to_flag":3},{"index":189336,"time_s":0.757344,"from_flag":3,"to_flag":1},{"index":189395,"time_s":0.7575799999999999,"from_flag":1,"to_flag":2},{"index":191998,"time_s":0.767992,"from_flag":2,"to_flag":1},{"index":192001,"time_s":0.768004,"from_flag":1,"to_flag":3},{"index":192003,"time_s":0.7680119999999999,"from_flag":3,"to_flag":1},{"index":192061,"time_s":0.7682439999999999,"from_flag":1,"to_flag":2},{"index":194665,"time_s":0.77866,"from_flag":2,"to_flag":1},{"index":194667,"time_s":0.7786679999999999,"from_flag":1,"to_flag":3},{"index":196945,"time_s":0.7877799999999999,"from_flag":3,"to_flag":1},{"index":197005,"time_s":0.7880199999999999,"from_flag":1,"to_flag":2},{"index":197666,"time_s":0.7906639999999999,"from_flag":2,"to_flag":1},{"index":197668,"time_s":0.7906719999999999,"from_flag":1,"to_flag":3},{"index":200082,"time_s":0.8003279999999999,"from_flag":3,"to_flag":1},{"index":200143,"time_s":0.800572,"from_flag":1,"to_flag":2},{"index":200803,"time_s":0.8032119999999999,"from_flag":2,"to_flag":1},{"index":200805,"time_s":0.8032199999999999,"from_flag":1,"to_flag":3},{"index":202060,"time_s":0.80824,"from_flag":3,"to_flag":1},{"index":202122,"time_s":0.808488,"from_flag":1,"to_flag":2},{"index":202783,"time_s":0.811132,"from_flag":2,"to_flag":1},{"index":202785,"time_s":0.81114,"from_flag":1,"to_flag":3},{"index":204045,"time_s":0.81618,"from_flag":3,"to_flag":1},{"index":204107,"time_s":0.8164279999999999,"from_flag":1,"to_flag":2},{"index":205332,"time_s":0.821328,"from_flag":2,"to_flag":1},{"index":205334,"time_s":0.821336,"from_flag":1,"to_flag":3},{"index":206583,"time_s":0.826332,"from_flag":3,"to_flag":1},{"index":206644,"time_s":0.826576,"from_flag":1,"to_flag":2},{"index":207998,"time_s":0.831992,"from_flag":2,"to_flag":1},{"index":208001,"time_s":0.832004,"from_flag":1,"to_flag":3},{"index":209256,"time_s":0.837024,"from_flag":3,"to_flag":1},{"index":209317,"time_s":0.837268,"from_flag":1,"to_flag":2},{"index":210665,"time_s":0.84266,"from_flag":2,"to_flag":1},{"index":210667,"time_s":0.842668,"from_flag":1,"to_flag":3},{"index":211971,"time_s":0.847884,"from_flag":3,"to_flag":1},{"index":212033,"time_s":0.848132,"from_flag":1,"to_flag":2},{"index":213332,"time_s":0.853328,"from_flag":2,"to_flag":1},{"index":213334,"time_s":0.853336,"from_flag":1,"to_flag":3},{"index":216608,"time_s":0.866432,"from_flag":3,"to_flag":1},{"index":216670,"time_s":0.86668,"from_flag":1,"to_flag":2},{"index":217325,"time_s":0.8693,"from_flag":2,"to_flag":1},{"index":217332,"time_s":0.869328,"from_flag":1,"to_flag":3},{"index":219168,"time_s":0.876672,"from_flag":3,"to_flag":1},{"index":219229,"time_s":0.8769159999999999,"from_flag":1,"to_flag":2},{"index":219890,"time_s":0.87956,"from_flag":2,"to_flag":1},{"index":219892,"time_s":0.8795679999999999,"from_flag":1,"to_flag":3},{"index":219894,"time_s":0.8795759999999999,"from_flag":3,"to_flag":1},{"index":219947,"time_s":0.879788,"from_flag":1,"to_flag":2},{"index":221332,"time_s":0.885328,"from_flag":2,"to_flag":1},{"index":221334,"time_s":0.885336,"from_flag":1,"to_flag":3},{"index":221336,"time_s":0.8853439999999999,"from_flag":3,"to_flag":1},{"index":221395,"time_s":0.8855799999999999,"from_flag":1,"to_flag":2},{"index":223998,"time_s":0.895992,"from_flag":2,"to_flag":1},{"index":224000,"time_s":0.8959999999999999,"from_flag":1,"to_flag":3},{"index":224002,"time_s":0.8960079999999999,"from_flag":3,"to_flag":1},{"index":224060,"time_s":0.8962399999999999,"from_flag":1,"to_flag":2},{"index":226665,"time_s":0.9066599999999999,"from_flag":2,"to_flag":1},{"index":226667,"time_s":0.9066679999999999,"from_flag":1,"to_flag":3},{"index":228917,"time_s":0.9156679999999999,"from_flag":3,"to_flag":1},{"index":228976,"time_s":0.9159039999999999,"from_flag":1,"to_flag":2},{"index":229637,"time_s":0.9185479999999999,"from_flag":2,"to_flag":1},{"index":229639,"time_s":0.9185559999999999,"from_flag":1,"to_flag":3},{"index":232050,"time_s":0.9281999999999999,"from_flag":3,"to_flag":1},{"index":232112,"time_s":0.9284479999999999,"from_flag":1,"to_flag":2},{"index":232773,"time_s":0.9310919999999999,"from_flag":2,"to_flag":1},{"index":232775,"time_s":0.9310999999999999,"from_flag":1,"to_flag":3},{"index":234050,"time_s":0.9361999999999999,"from_flag":3,"to_flag":1},{"index":234112,"time_s":0.936448,"from_flag":1,"to_flag":2},{"index":234772,"time_s":0.9390879999999999,"from_flag":2,"to_flag":1},{"index":234774,"time_s":0.9390959999999999,"from_flag":1,"to_flag":3},{"index":236032,"time_s":0.944128,"from_flag":3,"to_flag":1},{"index":236093,"time_s":0.944372,"from_flag":1,"to_flag":2},{"index":237332,"time_s":0.949328,"from_flag":2,"to_flag":1},{"index":237334,"time_s":0.949336,"from_flag":1,"to_flag":3},{"index":238565,"time_s":0.95426,"from_flag":3,"to_flag":1},{"index":238627,"time_s":0.9545079999999999,"from_flag":1,"to_flag":2},{"index":239998,"time_s":0.959992,"from_flag":2,"to_flag":1},{"index":240000,"time_s":0.96,"from_flag":1,"to_flag":3},{"index":241243,"time_s":0.9649719999999999,"from_flag":3,"to_flag":1},{"index":241304,"time_s":0.965216,"from_flag":1,"to_flag":2},{"index":242665,"time_s":0.97066,"from_flag":2,"to_flag":1},{"index":242667,"time_s":0.970668,"from_flag":1,"to_flag":3},{"index":243988,"time_s":0.9759519999999999,"from_flag":3,"to_flag":1},{"index":244187,"time_s":0.976748,"from_flag":1,"to_flag":2},{"index":245331,"time_s":0.981324,"from_flag":2,"to_flag":1},{"index":245334,"time_s":0.981336,"from_flag":1,"to_flag":3},{"index":248646,"time_s":0.9945839999999999,"from_flag":3,"to_flag":1},{"index":248868,"time_s":0.9954719999999999,"from_flag":1,"to_flag":2},{"index":249529,"time_s":0.998116,"from_flag":2,"to_flag":1},{"index":249531,"time_s":0.9981239999999999,"from_flag":1,"to_flag":3}],"segments":[{"flag":1,"start_index":0,"end_index":2,"start_time_s":0.0,"end_time_s":8e-06,"duration_s":8e-06},{"flag":3,"start_index":2,"end_index":4,"start_time_s":8e-06,"end_time_s":1.6e-05,"duration_s":8e-06},{"flag":1,"start_index":4,"end_index":56,"start_time_s":1.6e-05,"end_time_s":0.000224,"duration_s":0.000208},{"flag":2,"start_index":56,"end_index":2666,"start_time_s":0.000224,"end_time_s":0.010664,"duration_s":0.01044},{"flag":1,"start_index":2666,"end_index":2668,"start_time_s":0.010664,"end_time_s":0.010672,"duration_s":8e-06},{"flag":3,"start_index":2668,"end_index":4979,"start_time_s":0.010672,"end_time_s":0.019916,"duration_s":0.009243999999999999},{"flag":1,"start_index":4979,"end_index":5039,"start_time_s":0.019916,"end_time_s":0.020156,"duration_s":0.00023999999999999998},{"flag":2,"start_index":5039,"end_index":5700,"start_time_s":0.020156,"end_time_s":0.022799999999999997,"duration_s":0.002644},{"flag":1,"start_index":5700,"end_index":5702,"start_time_s":0.022799999999999997,"end_time_s":0.022808,"duration_s":8e-06},{"flag":3,"start_index":5702,"end_index":8130,"start_time_s":0.022808,"end_time_s":0.03252,"duration_s":0.009712},{"flag":1,"start_index":8130,"end_index":8193,"start_time_s":0.03252,"end_time_s":0.032771999999999996,"duration_s":0.000252},{"flag":2,"start_index":8193,"end_index":8853,"start_time_s":0.032771999999999996,"end_time_s":0.035412,"duration_s":0.00264},{"flag":1,"start_index":8853,"end_index":8855,"start_time_s":0.035412,"end_time_s":0.03542,"duration_s":8e-06},{"flag":3,"start_index":8855,"end_index":10133,"start_time_s":0.03542,"end_time_s":0.040532,"duration_s":0.005111999999999999},{"flag":1,"start_index":10133,"end_index":10194,"start_time_s":0.040532,"end_time_s":0.040776,"duration_s":0.000244},{"flag":2,"start_index":10194,"end_index":10856,"start_time_s":0.040776,"end_time_s":0.043424,"duration_s":0.0026479999999999997},{"flag":1,"start_index":10856,"end_index":10858,"start_time_s":0.043424,"end_time_s":0.043432,"duration_s":8e-06},{"flag":3,"start_index":10858,"end_index":12089,"start_time_s":0.043432,"end_time_s":0.048355999999999996,"duration_s":0.0049239999999999996},{"flag":1,"start_index":12089,"end_index":12149,"start_time_s":0.048355999999999996,"end_time_s":0.048596,"duration_s":0.00023999999999999998},{"flag":2,"start_index":12149,"end_index":13333,"start_time_s":0.048596,"end_time_s":0.053332,"duration_s":0.004736},{"flag":1,"start_index":13333,"end_index":13335,"start_time_s":0.053332,"end_time_s":0.05334,"duration_s":8e-06},{"flag":3,"start_index":13335,"end_index":14614,"start_time_s":0.05334,"end_time_s":0.058455999999999994,"duration_s":0.005116},{"flag":1,"start_index":14614,"end_index":14675,"start_time_s":0.058455999999999994,"end_time_s":0.058699999999999995,"duration_s":0.000244},{"flag":2,"start_index":14675,"end_index":15999,"start_time_s":0.058699999999999995,"end_time_s":0.063996,"duration_s":0.0052959999999999995},{"flag":1,"start_index":15999,"end_index":16002,"start_time_s":0.063996,"end_time_s":0.064008,"duration_s":1.2e-05},{"flag":3,"start_index":16002,"end_index":17252,"start_time_s":0.064008,"end_time_s":0.069008,"duration_s":0.005},{"flag":1,"start_index":17252,"end_index":17307,"start_time_s":0.069008,"end_time_s":0.069228,"duration_s":0.00021999999999999998},{"flag":2,"start_index":17307,"end_index":18666,"start_time_s":0.069228,"end_time_s":0.074664,"duration_s":0.005436},{"flag":1,"start_index":18666,"end_index":18668,"start_time_s":0.074664,"end_time_s":0.074672,"duration_s":8e-06},{"flag":3,"start_index":18668,"end_index":19955,"start_time_s":0.074672,"end_time_s":0.07982,"duration_s":0.005148},{"flag":1,"start_index":19955,"end_index":20017,"start_time_s":0.07982,"end_time_s":0.080068,"duration_s":0.000248},{"flag":2,"start_index":20017,"end_index":21333,"start_time_s":0.080068,"end_time_s":0.08533199999999999,"duration_s":0.005264},{"flag":1,"start_index":21333,"end_index":21335,"start_time_s":0.08533199999999999,"end_time_s":0.08534,"duration_s":8e-06},{"flag":3,"start_index":21335,"end_index":24614,"start_time_s":0.08534,"end_time_s":0.098456,"duration_s":0.013116},{"flag":1,"start_index":24614,"end_index":24676,"start_time_s":0.098456,"end_time_s":0.098704,"duration_s":0.000248},{"flag":2,"start_index":24676,"end_index":25336,"start_time_s":0.098704,"end_time_s":0.10134399999999999,"duration_s":0.00264},{"flag":1,"start_index":25336,"end_index":25338,"start_time_s":0.10134399999999999,"end_time_s":0.101352,"duration_s":8e-06},{"flag":3,"start_index":25338,"end_index":27112,"start_time_s":0.101352,"end_time_s":0.10844799999999999,"duration_s":0.007096},{"flag":1,"start_index":27112,"end_index":27173,"start_time_s":0.10844799999999999,"end_time_s":0.108692,"duration_s":0.000244},{"flag":2,"start_index":27173,"end_index":27834,"start_time_s":0.108692,"end_time_s":0.11133599999999999,"duration_s":0.002644},{"flag":1,"start_index":27834,"end_index":27836,"start_time_s":0.11133599999999999,"end_time_s":0.111344,"duration_s":8e-06},{"flag":3,"start_index":27836,"end_index":27838,"start_time_s":0.111344,"end_time_s":0.11135199999999999,"duration_s":8e-06},{"flag":1,"start_index":27838,"end_index":27896,"start_time_s":0.11135199999999999,"end_time_s":0.11158399999999999,"duration_s":0.000232},{"flag":2,"start_index":27896,"end_index":29333,"start_time_s":0.11158399999999999,"end_time_s":0.11733199999999999,"duration_s":0.005748},{"flag":1,"start_index":29333,"end_index":29335,"start_time_s":0.11733199999999999,"end_time_s":0.11734,"duration_s":8e-06},{"flag":3,"start_index":29335,"end_index":29337,"start_time_s":0.11734,"end_time_s":0.117348,"duration_s":8e-06},{"flag":1,"start_index":29337,"end_index":29396,"start_time_s":0.117348,"end_time_s":0.117584,"duration_s":0.000236},{"flag":2,"start_index":29396,"end_index":31999,"start_time_s":0.117584,"end_time_s":0.127996,"duration_s":0.010412},{"flag":1,"start_index":31999,"end_index":32002,"start_time_s":0.127996,"end_time_s":0.12800799999999998,"duration_s":1.2e-05},{"flag":3,"start_index":32002,"end_index":32004,"start_time_s":0.12800799999999998,"end_time_s":0.128016,"duration_s":8e-06},{"flag":1,"start_index":32004,"end_index":32062,"start_time_s":0.128016,"end_time_s":0.128248,"duration_s":0.000232},{"flag":2,"start_index":32062,"end_index":34666,"start_time_s":0.128248,"end_time_s":0.13866399999999998,"duration_s":0.010416},{"flag":1,"start_index":34666,"end_index":34668,"start_time_s":0.13866399999999998,"end_time_s":0.138672,"duration_s":8e-06},{"flag":3,"start_index":34668,"end_index":36978,"start_time_s":0.138672,"end_time_s":0.147912,"duration_s":0.00924},{"flag":1,"start_index":36978,"end_index":37037,"start_time_s":0.147912,"end_time_s":0.148148,"duration_s":0.000236},{"flag":2,"start_index":37037,"end_index":37698,"start_time_s":0.148148,"end_time_s":0.15079199999999998,"duration_s":0.002644},{"flag":1,"start_index":37698,"end_index":37700,"start_time_s":0.15079199999999998,"end_time_s":0.1508,"duration_s":8e-06},{"flag":3,"start_index":37700,"end_index":40080,"start_time_s":0.1508,"end_time_s":0.16032,"duration_s":0.009519999999999999},{"flag":1,"start_index":40080,"end_index":40142,"start_time_s":0.16032,"end_time_s":0.160568,"duration_s":0.000248},{"flag":2,"start_index":40142,"end_index":40803,"start_time_s":0.160568,"end_time_s":0.163212,"duration_s":0.002644},{"flag":1,"start_index":40803,"end_index":40805,"start_time_s":0.163212,"end_time_s":0.16322,"duration_s":8e-06},{"flag":3,"start_index":40805,"end_index":42060,"start_time_s":0.16322,"end_time_s":0.16824,"duration_s":0.00502},{"flag":1,"start_index":42060,"end_index":42121,"start_time_s":0.16824,"end_time_s":0.168484,"duration_s":0.000244},{"flag":2,"start_index":42121,"end_index":42782,"start_time_s":0.168484,"end_time_s":0.171128,"duration_s":0.002644},{"flag":1,"start_index":42782,"end_index":42784,"start_time_s":0.171128,"end_time_s":0.17113599999999998,"duration_s":8e-06},{"flag":3,"start_index":42784,"end_index":43987,"start_time_s":0.17113599999999998,"end_time_s":0.175948,"duration_s":0.0048119999999999994},{"flag":1,"start_index":43987,"end_index":44053,"start_time_s":0.175948,"end_time_s":0.17621199999999998,"duration_s":0.00026399999999999997},{"flag":2,"start_index":44053,"end_index":45333,"start_time_s":0.17621199999999998,"end_time_s":0.181332,"duration_s":0.0051199999999999996},{"flag":1,"start_index":45333,"end_index":45335,"start_time_s":0.181332,"end_time_s":0.18134,"duration_s":8e-06},{"flag":3,"start_index":45335,"end_index":46617,"start_time_s":0.18134,"end_time_s":0.186468,"duration_s":0.005128},{"flag":1,"start_index":46617,"end_index":46678,"start_time_s":0.186468,"end_time_s":0.186712,"duration_s":0.000244},{"flag":2,"start_index":46678,"end_index":47999,"start_time_s":0.186712,"end_time_s":0.191996,"duration_s":0.005284},{"flag":1,"start_index":47999,"end_index":48001,"start_time_s":0.191996,"end_time_s":0.19200399999999998,"duration_s":8e-06},{"flag":3,"start_index":48001,"end_index":49241,"start_time_s":0.19200399999999998,"end_time_s":0.196964,"duration_s":0.00496},{"flag":1,"start_index":49241,"end_index":49303,"start_time_s":0.196964,"end_time_s":0.197212,"duration_s":0.000248},{"flag":2,"start_index":49303,"end_index":50666,"start_time_s":0.197212,"end_time_s":0.20266399999999998,"duration_s":0.005451999999999999},{"flag":1,"start_index":50666,"end_index":50668,"start_time_s":0.20266399999999998,"end_time_s":0.202672,"duration_s":8e-06},{"flag":3,"start_index":50668,"end_index":51961,"start_time_s":0.202672,"end_time_s":0.207844,"duration_s":0.0051719999999999995},{"flag":1,"start_index":51961,"end_index":52155,"start_time_s":0.207844,"end_time_s":0.20862,"duration_s":0.000776},{"flag":2,"start_index":52155,"end_index":53333,"start_time_s":0.20862,"end_time_s":0.213332,"duration_s":0.004712},{"flag":1,"start_index":53333,"end_index":53335,"start_time_s":0.213332,"end_time_s":0.21334,"duration_s":8e-06},{"flag":3,"start_index":53335,"end_index":56588,"start_time_s":0.21334,"end_time_s":0.226352,"duration_s":0.013012},{"flag":1,"start_index":56588,"end_index":56649,"start_time_s":0.226352,"end_time_s":0.226596,"duration_s":0.000244},{"flag":2,"start_index":56649,"end_index":57310,"start_time_s":0.226596,"end_time_s":0.22924,"duration_s":0.002644},{"flag":1,"start_index":57310,"end_index":57312,"start_time_s":0.22924,"end_time_s":0.22924799999999998,"duration_s":8e-06},{"flag":3,"start_index":57312,"end_index":59146,"start_time_s":0.22924799999999998,"end_time_s":0.236584,"duration_s":0.007336},{"flag":1,"start_index":59146,"end_index":59208,"start_time_s":0.236584,"end_time_s":0.236832,"duration_s":0.000248},{"flag":2,"start_index":59208,"end_index":59868,"start_time_s":0.236832,"end_time_s":0.239472,"duration_s":0.00264},{"flag":1,"start_index":59868,"end_index":59870,"start_time_s":0.239472,"end_time_s":0.23948,"duration_s":8e-06},{"flag":3,"start_index":59870,"end_index":59872,"start_time_s":0.23948,"end_time_s":0.23948799999999998,"duration_s":8e-06},{"flag":1,"start_index":59872,"end_index":59931,"start_time_s":0.23948799999999998,"end_time_s":0.239724,"duration_s":0.000236},{"flag":2,"start_index":59931,"end_index":61333,"start_time_s":0.239724,"end_time_s":0.245332,"duration_s":0.005608},{"flag":1,"start_index":61333,"end_index":61335,"start_time_s":0.245332,"end_time_s":0.24534,"duration_s":8e-06},{"flag":3,"start_index":61335,"end_index":61337,"start_time_s":0.24534,"end_time_s":0.24534799999999998,"duration_s":8e-06},{"flag":1,"start_index":61337,"end_index":61395,"start_time_s":0.24534799999999998,"end_time_s":0.24558,"duration_s":0.000232},{"flag":2,"start_index":61395,"end_index":63999,"start_time_s":0.24558,"end_time_s":0.255996,"duration_s":0.010416},{"flag":1,"start_index":63999,"end_index":64001,"start_time_s":0.255996,"end_time_s":0.256004,"duration_s":8e-06},{"flag":3,"start_index":64001,"end_index":64003,"start_time_s":0.256004,"end_time_s":0.25601199999999996,"duration_s":8e-06},{"flag":1,"start_index":64003,"end_index":64062,"start_time_s":0.25601199999999996,"end_time_s":0.256248,"duration_s":0.000236},{"flag":2,"start_index":64062,"end_index":66666,"start_time_s":0.256248,"end_time_s":0.266664,"duration_s":0.010416},{"flag":1,"start_index":66666,"end_index":66668,"start_time_s":0.266664,"end_time_s":0.26667199999999996,"duration_s":8e-06},{"flag":3,"start_index":66668,"end_index":68984,"start_time_s":0.26667199999999996,"end_time_s":0.275936,"duration_s":0.009264},{"flag":1,"start_index":68984,"end_index":69037,"start_time_s":0.275936,"end_time_s":0.276148,"duration_s":0.000212},{"flag":2,"start_index":69037,"end_index":69699,"start_time_s":0.276148,"end_time_s":0.278796,"duration_s":0.0026479999999999997},{"flag":1,"start_index":69699,"end_index":69701,"start_time_s":0.278796,"end_time_s":0.278804,"duration_s":8e-06},{"flag":3,"start_index":69701,"end_index":72082,"start_time_s":0.278804,"end_time_s":0.288328,"duration_s":0.009524},{"flag":1,"start_index":72082,"end_index":72144,"start_time_s":0.288328,"end_time_s":0.288576,"duration_s":0.000248},{"flag":2,"start_index":72144,"end_index":72804,"start_time_s":0.288576,"end_time_s":0.291216,"duration_s":0.00264},{"flag":1,"start_index":72804,"end_index":72806,"start_time_s":0.291216,"end_time_s":0.291224,"duration_s":8e-06},{"flag":3,"start_index":72806,"end_index":74041,"start_time_s":0.291224,"end_time_s":0.296164,"duration_s":0.00494},{"flag":1,"start_index":74041,"end_index":74102,"start_time_s":0.296164,"end_time_s":0.296408,"duration_s":0.000244},{"flag":2,"start_index":74102,"end_index":74763,"start_time_s":0.296408,"end_time_s":0.299052,"duration_s":0.002644},{"flag":1,"start_index":74763,"end_index":74765,"start_time_s":0.299052,"end_time_s":0.29906,"duration_s":8e-06},{"flag":3,"start_index":74765,"end_index":75986,"start_time_s":0.29906,"end_time_s":0.303944,"duration_s":0.0048839999999999995},{"flag":1,"start_index":75986,"end_index":76052,"start_time_s":0.303944,"end_time_s":0.304208,"duration_s":0.00026399999999999997},{"flag":2,"start_index":76052,"end_index":77332,"start_time_s":0.304208,"end_time_s":0.309328,"duration_s":0.0051199999999999996},{"flag":1,"start_index":77332,"end_index":77335,"start_time_s":0.309328,"end_time_s":0.30934,"duration_s":1.2e-05},{"flag":3,"start_index":77335,"end_index":78605,"start_time_s":0.30934,"end_time_s":0.31442,"duration_s":0.0050799999999999994},{"flag":1,"start_index":78605,"end_index":78667,"start_time_s":0.31442,"end_time_s":0.314668,"duration_s":0.000248},{"flag":2,"start_index":78667,"end_index":79999,"start_time_s":0.314668,"end_time_s":0.319996,"duration_s":0.005327999999999999},{"flag":1,"start_index":79999,"end_index":80001,"start_time_s":0.319996,"end_time_s":0.320004,"duration_s":8e-06},{"flag":3,"start_index":80001,"end_index":81255,"start_time_s":0.320004,"end_time_s":0.32502,"duration_s":0.005016},{"flag":1,"start_index":81255,"end_index":81316,"start_time_s":0.32502,"end_time_s":0.325264,"duration_s":0.000244},{"flag":2,"start_index":81316,"end_index":82666,"start_time_s":0.325264,"end_time_s":0.33066399999999996,"duration_s":0.005399999999999999},{"flag":1,"start_index":82666,"end_index":82668,"start_time_s":0.33066399999999996,"end_time_s":0.33067199999999997,"duration_s":8e-06},{"flag":3,"start_index":82668,"end_index":83957,"start_time_s":0.33067199999999997,"end_time_s":0.33582799999999996,"duration_s":0.005156},{"flag":1,"start_index":83957,"end_index":84019,"start_time_s":0.33582799999999996,"end_time_s":0.336076,"duration_s":0.000248},{"flag":2,"start_index":84019,"end_index":85332,"start_time_s":0.336076,"end_time_s":0.34132799999999996,"duration_s":0.005252},{"flag":1,"start_index":85332,"end_index":85335,"start_time_s":0.34132799999999996,"end_time_s":0.34134,"duration_s":1.2e-05},{"flag":3,"start_index":85335,"end_index":88621,"start_time_s":0.34134,"end_time_s":0.35448399999999997,"duration_s":0.013144},{"flag":1,"start_index":88621,"end_index":88682,"start_time_s":0.35448399999999997,"end_time_s":0.354728,"duration_s":0.000244},{"flag":2,"start_index":88682,"end_index":89342,"start_time_s":0.354728,"end_time_s":0.35736799999999996,"duration_s":0.00264},{"flag":1,"start_index":89342,"end_index":89344,"start_time_s":0.35736799999999996,"end_time_s":0.35737599999999997,"duration_s":8e-06},{"flag":3,"start_index":89344,"end_index":91129,"start_time_s":0.35737599999999997,"end_time_s":0.364516,"duration_s":0.00714},{"flag":1,"start_index":91129,"end_index":91190,"start_time_s":0.364516,"end_time_s":0.36476,"duration_s":0.000244},{"flag":2,"start_index":91190,"end_index":91851,"start_time_s":0.36476,"end_time_s":0.367404,"duration_s":0.002644},{"flag":1,"start_index":91851,"end_index":91853,"start_time_s":0.367404,"end_time_s":0.36741199999999996,"duration_s":8e-06},{"flag":3,"start_index":91853,"end_index":91855,"start_time_s":0.36741199999999996,"end_time_s":0.36741999999999997,"duration_s":8e-06},{"flag":1,"start_index":91855,"end_index":91914,"start_time_s":0.36741999999999997,"end_time_s":0.367656,"duration_s":0.000236},{"flag":2,"start_index":91914,"end_index":93332,"start_time_s":0.367656,"end_time_s":0.373328,"duration_s":0.005672},{"flag":1,"start_index":93332,"end_index":93335,"start_time_s":0.373328,"end_time_s":0.37334,"duration_s":1.2e-05},{"flag":3,"start_index":93335,"end_index":93337,"start_time_s":0.37334,"end_time_s":0.37334799999999996,"duration_s":8e-06},{"flag":1,"start_index":93337,"end_index":93395,"start_time_s":0.37334799999999996,"end_time_s":0.37357999999999997,"duration_s":0.000232},{"flag":2,"start_index":93395,"end_index":95999,"start_time_s":0.37357999999999997,"end_time_s":0.383996,"duration_s":0.010416},{"flag":1,"start_index":95999,"end_index":96001,"start_time_s":0.383996,"end_time_s":0.38400399999999996,"duration_s":8e-06},{"flag":3,"start_index":96001,"end_index":96003,"start_time_s":0.38400399999999996,"end_time_s":0.38401199999999996,"duration_s":8e-06},{"flag":1,"start_index":96003,"end_index":96062,"start_time_s":0.38401199999999996,"end_time_s":0.384248,"duration_s":0.000236},{"flag":2,"start_index":96062,"end_index":98666,"start_time_s":0.384248,"end_time_s":0.39466399999999996,"duration_s":0.010416},{"flag":1,"start_index":98666,"end_index":98668,"start_time_s":0.39466399999999996,"end_time_s":0.39467199999999997,"duration_s":8e-06},{"flag":3,"start_index":98668,"end_index":101006,"start_time_s":0.39467199999999997,"end_time_s":0.404024,"duration_s":0.009352},{"flag":1,"start_index":101006,"end_index":101064,"start_time_s":0.404024,"end_time_s":0.404256,"duration_s":0.000232},{"flag":2,"start_index":101064,"end_index":101725,"start_time_s":0.404256,"end_time_s":0.4069,"duration_s":0.002644},{"flag":1,"start_index":101725,"end_index":101727,"start_time_s":0.4069,"end_time_s":0.406908,"duration_s":8e-06},{"flag":3,"start_index":101727,"end_index":104147,"start_time_s":0.406908,"end_time_s":0.41658799999999996,"duration_s":0.00968},{"flag":1,"start_index":104147,"end_index":104209,"start_time_s":0.41658799999999996,"end_time_s":0.416836,"duration_s":0.000248},{"flag":2,"start_index":104209,"end_index":104870,"start_time_s":0.416836,"end_time_s":0.41947999999999996,"duration_s":0.002644},{"flag":1,"start_index":104870,"end_index":104872,"start_time_s":0.41947999999999996,"end_time_s":0.41948799999999997,"duration_s":8e-06},{"flag":3,"start_index":104872,"end_index":106120,"start_time_s":0.41948799999999997,"end_time_s":0.42447999999999997,"duration_s":0.004992},{"flag":1,"start_index":106120,"end_index":106182,"start_time_s":0.42447999999999997,"end_time_s":0.424728,"duration_s":0.000248},{"flag":2,"start_index":106182,"end_index":106843,"start_time_s":0.424728,"end_time_s":0.427372,"duration_s":0.002644},{"flag":1,"start_index":106843,"end_index":106845,"start_time_s":0.427372,"end_time_s":0.42738,"duration_s":8e-06},{"flag":3,"start_index":106845,"end_index":108116,"start_time_s":0.42738,"end_time_s":0.43246399999999996,"duration_s":0.005084},{"flag":1,"start_index":108116,"end_index":108177,"start_time_s":0.43246399999999996,"end_time_s":0.432708,"duration_s":0.000244},{"flag":2,"start_index":108177,"end_index":109332,"start_time_s":0.432708,"end_time_s":0.437328,"duration_s":0.00462},{"flag":1,"start_index":109332,"end_index":109335,"start_time_s":0.437328,"end_time_s":0.43734,"duration_s":1.2e-05},{"flag":3,"start_index":109335,"end_index":110581,"start_time_s":0.43734,"end_time_s":0.442324,"duration_s":0.004984},{"flag":1,"start_index":110581,"end_index":110639,"start_time_s":0.442324,"end_time_s":0.442556,"duration_s":0.000232},{"flag":2,"start_index":110639,"end_index":111999,"start_time_s":0.442556,"end_time_s":0.447996,"duration_s":0.0054399999999999995},{"flag":1,"start_index":111999,"end_index":112001,"start_time_s":0.447996,"end_time_s":0.44800399999999996,"duration_s":8e-06},{"flag":3,"start_index":112001,"end_index":113266,"start_time_s":0.44800399999999996,"end_time_s":0.45306399999999997,"duration_s":0.005059999999999999},{"flag":1,"start_index":113266,"end_index":113325,"start_time_s":0.45306399999999997,"end_time_s":0.4533,"duration_s":0.000236},{"flag":2,"start_index":113325,"end_index":114666,"start_time_s":0.4533,"end_time_s":0.45866399999999996,"duration_s":0.005364},{"flag":1,"start_index":114666,"end_index":114668,"start_time_s":0.45866399999999996,"end_time_s":0.45867199999999997,"duration_s":8e-06},{"flag":3,"start_index":114668,"end_index":115972,"start_time_s":0.45867199999999997,"end_time_s":0.46388799999999997,"duration_s":0.005216},{"flag":1,"start_index":115972,"end_index":116166,"start_time_s":0.46388799999999997,"end_time_s":0.46466399999999997,"duration_s":0.000776},{"flag":2,"start_index":116166,"end_index":117332,"start_time_s":0.46466399999999997,"end_time_s":0.46932799999999997,"duration_s":0.004664},{"flag":1,"start_index":117332,"end_index":117334,"start_time_s":0.46932799999999997,"end_time_s":0.469336,"duration_s":8e-06},{"flag":3,"start_index":117334,"end_index":120628,"start_time_s":0.469336,"end_time_s":0.482512,"duration_s":0.013176},{"flag":1,"start_index":120628,"end_index":120684,"start_time_s":0.482512,"end_time_s":0.482736,"duration_s":0.000224},{"flag":2,"start_index":120684,"end_index":121344,"start_time_s":0.482736,"end_time_s":0.485376,"duration_s":0.00264},{"flag":1,"start_index":121344,"end_index":121346,"start_time_s":0.485376,"end_time_s":0.485384,"duration_s":8e-06},{"flag":3,"start_index":121346,"end_index":123181,"start_time_s":0.485384,"end_time_s":0.492724,"duration_s":0.007339999999999999},{"flag":1,"start_index":123181,"end_index":123242,"start_time_s":0.492724,"end_time_s":0.49296799999999996,"duration_s":0.000244},{"flag":2,"start_index":123242,"end_index":123903,"start_time_s":0.49296799999999996,"end_time_s":0.495612,"duration_s":0.002644},{"flag":1,"start_index":123903,"end_index":123906,"start_time_s":0.495612,"end_time_s":0.49562399999999995,"duration_s":1.2e-05},{"flag":3,"start_index":123906,"end_index":123908,"start_time_s":0.49562399999999995,"end_time_s":0.49563199999999996,"duration_s":8e-06},{"flag":1,"start_index":123908,"end_index":123967,"start_time_s":0.49563199999999996,"end_time_s":0.495868,"duration_s":0.000236},{"flag":2,"start_index":123967,"end_index":125332,"start_time_s":0.495868,"end_time_s":0.501328,"duration_s":0.00546},{"flag":1,"start_index":125332,"end_index":125334,"start_time_s":0.501328,"end_time_s":0.501336,"duration_s":8e-06},{"flag":3,"start_index":125334,"end_index":125336,"start_time_s":0.501336,"end_time_s":0.501344,"duration_s":8e-06},{"flag":1,"start_index":125336,"end_index":125395,"start_time_s":0.501344,"end_time_s":0.50158,"duration_s":0.000236},{"flag":2,"start_index":125395,"end_index":127999,"start_time_s":0.50158,"end_time_s":0.511996,"duration_s":0.010416},{"flag":1,"start_index":127999,"end_index":128001,"start_time_s":0.511996,"end_time_s":0.512004,"duration_s":8e-06},{"flag":3,"start_index":128001,"end_index":128003,"start_time_s":0.512004,"end_time_s":0.512012,"duration_s":8e-06},{"flag":1,"start_index":128003,"end_index":128062,"start_time_s":0.512012,"end_time_s":0.5122479999999999,"duration_s":0.000236},{"flag":2,"start_index":128062,"end_index":130665,"start_time_s":0.5122479999999999,"end_time_s":0.52266,"duration_s":0.010412},{"flag":1,"start_index":130665,"end_index":130668,"start_time_s":0.52266,"end_time_s":0.522672,"duration_s":1.2e-05},{"flag":3,"start_index":130668,"end_index":132967,"start_time_s":0.522672,"end_time_s":0.531868,"duration_s":0.009196},{"flag":1,"start_index":132967,"end_index":133026,"start_time_s":0.531868,"end_time_s":0.532104,"duration_s":0.000236},{"flag":2,"start_index":133026,"end_index":133687,"start_time_s":0.532104,"end_time_s":0.534748,"duration_s":0.002644},{"flag":1,"start_index":133687,"end_index":133690,"start_time_s":0.534748,"end_time_s":0.53476,"duration_s":1.2e-05},{"flag":3,"start_index":133690,"end_index":136104,"start_time_s":0.53476,"end_time_s":0.544416,"duration_s":0.009656},{"flag":1,"start_index":136104,"end_index":136166,"start_time_s":0.544416,"end_time_s":0.5446639999999999,"duration_s":0.000248},{"flag":2,"start_index":136166,"end_index":136821,"start_time_s":0.5446639999999999,"end_time_s":0.547284,"duration_s":0.00262},{"flag":1,"start_index":136821,"end_index":136823,"start_time_s":0.547284,"end_time_s":0.547292,"duration_s":8e-06},{"flag":3,"start_index":136823,"end_index":138086,"start_time_s":0.547292,"end_time_s":0.552344,"duration_s":0.005052},{"flag":1,"start_index":138086,"end_index":138141,"start_time_s":0.552344,"end_time_s":0.5525639999999999,"duration_s":0.00021999999999999998},{"flag":2,"start_index":138141,"end_index":138802,"start_time_s":0.5525639999999999,"end_time_s":0.5552079999999999,"duration_s":0.002644},{"flag":1,"start_index":138802,"end_index":138804,"start_time_s":0.5552079999999999,"end_time_s":0.5552159999999999,"duration_s":8e-06},{"flag":3,"start_index":138804,"end_index":140070,"start_time_s":0.5552159999999999,"end_time_s":0.56028,"duration_s":0.005064},{"flag":1,"start_index":140070,"end_index":140131,"start_time_s":0.56028,"end_time_s":0.560524,"duration_s":0.000244},{"flag":2,"start_index":140131,"end_index":141332,"start_time_s":0.560524,"end_time_s":0.5653279999999999,"duration_s":0.004804},{"flag":1,"start_index":141332,"end_index":141334,"start_time_s":0.5653279999999999,"end_time_s":0.565336,"duration_s":8e-06},{"flag":3,"start_index":141334,"end_index":142067,"start_time_s":0.565336,"end_time_s":0.568268,"duration_s":0.0029319999999999997},{"flag":2,"start_index":142067,"end_index":142140,"start_time_s":0.568268,"end_time_s":0.56856,"duration_s":0.000292},{"flag":3,"start_index":142140,"end_index":142564,"start_time_s":0.56856,"end_time_s":0.570256,"duration_s":0.001696},{"flag":1,"start_index":142564,"end_index":142625,"start_time_s":0.570256,"end_time_s":0.5705,"duration_s":0.000244},{"flag":2,"start_index":142625,"end_index":143999,"start_time_s":0.5705,"end_time_s":0.575996,"duration_s":0.005496},{"flag":1,"start_index":143999,"end_index":144001,"start_time_s":0.575996,"end_time_s":0.576004,"duration_s":8e-06},{"flag":3,"start_index":144001,"end_index":145283,"start_time_s":0.576004,"end_time_s":0.581132,"duration_s":0.005128},{"flag":1,"start_index":145283,"end_index":145344,"start_time_s":0.581132,"end_time_s":0.581376,"duration_s":0.000244},{"flag":2,"start_index":145344,"end_index":146666,"start_time_s":0.581376,"end_time_s":0.586664,"duration_s":0.005288},{"flag":1,"start_index":146666,"end_index":146668,"start_time_s":0.586664,"end_time_s":0.586672,"duration_s":8e-06},{"flag":3,"start_index":146668,"end_index":147968,"start_time_s":0.586672,"end_time_s":0.591872,"duration_s":0.0052},{"flag":1,"start_index":147968,"end_index":148029,"start_time_s":0.591872,"end_time_s":0.592116,"duration_s":0.000244},{"flag":2,"start_index":148029,"end_index":149332,"start_time_s":0.592116,"end_time_s":0.597328,"duration_s":0.005212},{"flag":1,"start_index":149332,"end_index":149334,"start_time_s":0.597328,"end_time_s":0.597336,"duration_s":8e-06},{"flag":3,"start_index":149334,"end_index":152573,"start_time_s":0.597336,"end_time_s":0.610292,"duration_s":0.012955999999999999},{"flag":1,"start_index":152573,"end_index":152635,"start_time_s":0.610292,"end_time_s":0.61054,"duration_s":0.000248},{"flag":2,"start_index":152635,"end_index":153295,"start_time_s":0.61054,"end_time_s":0.61318,"duration_s":0.00264},{"flag":1,"start_index":153295,"end_index":153297,"start_time_s":0.61318,"end_time_s":0.613188,"duration_s":8e-06},{"flag":3,"start_index":153297,"end_index":155117,"start_time_s":0.613188,"end_time_s":0.620468,"duration_s":0.00728},{"flag":1,"start_index":155117,"end_index":155172,"start_time_s":0.620468,"end_time_s":0.620688,"duration_s":0.00021999999999999998},{"flag":2,"start_index":155172,"end_index":155832,"start_time_s":0.620688,"end_time_s":0.623328,"duration_s":0.00264},{"flag":1,"start_index":155832,"end_index":155835,"start_time_s":0.623328,"end_time_s":0.62334,"duration_s":1.2e-05},{"flag":3,"start_index":155835,"end_index":155837,"start_time_s":0.62334,"end_time_s":0.623348,"duration_s":8e-06},{"flag":1,"start_index":155837,"end_index":155895,"start_time_s":0.623348,"end_time_s":0.62358,"duration_s":0.000232},{"flag":2,"start_index":155895,"end_index":157332,"start_time_s":0.62358,"end_time_s":0.629328,"duration_s":0.005748},{"flag":1,"start_index":157332,"end_index":157334,"start_time_s":0.629328,"end_time_s":0.629336,"duration_s":8e-06},{"flag":3,"start_index":157334,"end_index":157336,"start_time_s":0.629336,"end_time_s":0.629344,"duration_s":8e-06},{"flag":1,"start_index":157336,"end_index":157395,"start_time_s":0.629344,"end_time_s":0.6295799999999999,"duration_s":0.000236},{"flag":2,"start_index":157395,"end_index":159999,"start_time_s":0.6295799999999999,"end_time_s":0.639996,"duration_s":0.010416},{"flag":1,"start_index":159999,"end_index":160001,"start_time_s":0.639996,"end_time_s":0.640004,"duration_s":8e-06},{"flag":3,"start_index":160001,"end_index":160003,"start_time_s":0.640004,"end_time_s":0.640012,"duration_s":8e-06},{"flag":1,"start_index":160003,"end_index":160062,"start_time_s":0.640012,"end_time_s":0.6402479999999999,"duration_s":0.000236},{"flag":2,"start_index":160062,"end_index":162665,"start_time_s":0.6402479999999999,"end_time_s":0.65066,"duration_s":0.010412},{"flag":1,"start_index":162665,"end_index":162667,"start_time_s":0.65066,"end_time_s":0.650668,"duration_s":8e-06},{"flag":3,"start_index":162667,"end_index":164956,"start_time_s":0.650668,"end_time_s":0.659824,"duration_s":0.009156},{"flag":1,"start_index":164956,"end_index":165015,"start_time_s":0.659824,"end_time_s":0.66006,"duration_s":0.000236},{"flag":2,"start_index":165015,"end_index":165676,"start_time_s":0.66006,"end_time_s":0.662704,"duration_s":0.002644},{"flag":1,"start_index":165676,"end_index":165678,"start_time_s":0.662704,"end_time_s":0.662712,"duration_s":8e-06},{"flag":3,"start_index":165678,"end_index":168108,"start_time_s":0.662712,"end_time_s":0.6724319999999999,"duration_s":0.00972},{"flag":1,"start_index":168108,"end_index":168167,"start_time_s":0.6724319999999999,"end_time_s":0.6726679999999999,"duration_s":0.000236},{"flag":2,"start_index":168167,"end_index":168821,"start_time_s":0.6726679999999999,"end_time_s":0.675284,"duration_s":0.002616},{"flag":1,"start_index":168821,"end_index":168823,"start_time_s":0.675284,"end_time_s":0.675292,"duration_s":8e-06},{"flag":3,"start_index":168823,"end_index":170087,"start_time_s":0.675292,"end_time_s":0.680348,"duration_s":0.005056},{"flag":1,"start_index":170087,"end_index":170148,"start_time_s":0.680348,"end_time_s":0.680592,"duration_s":0.000244},{"flag":2,"start_index":170148,"end_index":170809,"start_time_s":0.680592,"end_time_s":0.683236,"duration_s":0.002644},{"flag":1,"start_index":170809,"end_index":170811,"start_time_s":0.683236,"end_time_s":0.683244,"duration_s":8e-06},{"flag":3,"start_index":170811,"end_index":172067,"start_time_s":0.683244,"end_time_s":0.688268,"duration_s":0.005024},{"flag":1,"start_index":172067,"end_index":172127,"start_time_s":0.688268,"end_time_s":0.688508,"duration_s":0.00023999999999999998},{"flag":2,"start_index":172127,"end_index":173332,"start_time_s":0.688508,"end_time_s":0.6933279999999999,"duration_s":0.00482},{"flag":1,"start_index":173332,"end_index":173334,"start_time_s":0.6933279999999999,"end_time_s":0.693336,"duration_s":8e-06},{"flag":3,"start_index":173334,"end_index":174585,"start_time_s":0.693336,"end_time_s":0.69834,"duration_s":0.005004},{"flag":1,"start_index":174585,"end_index":174646,"start_time_s":0.69834,"end_time_s":0.698584,"duration_s":0.000244},{"flag":2,"start_index":174646,"end_index":175999,"start_time_s":0.698584,"end_time_s":0.703996,"duration_s":0.005412},{"flag":1,"start_index":175999,"end_index":176001,"start_time_s":0.703996,"end_time_s":0.704004,"duration_s":8e-06},{"flag":3,"start_index":176001,"end_index":177283,"start_time_s":0.704004,"end_time_s":0.709132,"duration_s":0.005128},{"flag":1,"start_index":177283,"end_index":177344,"start_time_s":0.709132,"end_time_s":0.709376,"duration_s":0.000244},{"flag":2,"start_index":177344,"end_index":178665,"start_time_s":0.709376,"end_time_s":0.71466,"duration_s":0.005284},{"flag":1,"start_index":178665,"end_index":178667,"start_time_s":0.71466,"end_time_s":0.714668,"duration_s":8e-06},{"flag":3,"start_index":178667,"end_index":179956,"start_time_s":0.714668,"end_time_s":0.719824,"duration_s":0.005156},{"flag":1,"start_index":179956,"end_index":180148,"start_time_s":0.719824,"end_time_s":0.720592,"duration_s":0.000768},{"flag":2,"start_index":180148,"end_index":181332,"start_time_s":0.720592,"end_time_s":0.725328,"duration_s":0.004736},{"flag":1,"start_index":181332,"end_index":181334,"start_time_s":0.725328,"end_time_s":0.725336,"duration_s":8e-06},{"flag":3,"start_index":181334,"end_index":184607,"start_time_s":0.725336,"end_time_s":0.738428,"duration_s":0.013092},{"flag":1,"start_index":184607,"end_index":184668,"start_time_s":0.738428,"end_time_s":0.738672,"duration_s":0.000244},{"flag":2,"start_index":184668,"end_index":185323,"start_time_s":0.738672,"end_time_s":0.741292,"duration_s":0.00262},{"flag":1,"start_index":185323,"end_index":185325,"start_time_s":0.741292,"end_time_s":0.7413,"duration_s":8e-06},{"flag":3,"start_index":185325,"end_index":187141,"start_time_s":0.7413,"end_time_s":0.748564,"duration_s":0.007264},{"flag":1,"start_index":187141,"end_index":187202,"start_time_s":0.748564,"end_time_s":0.7488079999999999,"duration_s":0.000244},{"flag":2,"start_index":187202,"end_index":187863,"start_time_s":0.7488079999999999,"end_time_s":0.751452,"duration_s":0.002644},{"flag":1,"start_index":187863,"end_index":187865,"start_time_s":0.751452,"end_time_s":0.75146,"duration_s":8e-06},{"flag":3,"start_index":187865,"end_index":187867,"start_time_s":0.75146,"end_time_s":0.7514679999999999,"duration_s":8e-06},{"flag":1,"start_index":187867,"end_index":187926,"start_time_s":0.7514679999999999,"end_time_s":0.7517039999999999,"duration_s":0.000236},{"flag":2,"start_index":187926,"end_index":189332,"start_time_s":0.7517039999999999,"end_time_s":0.757328,"duration_s":0.005624},{"flag":1,"start_index":189332,"end_index":189334,"start_time_s":0.757328,"end_time_s":0.757336,"duration_s":8e-06},{"flag":3,"start_index":189334,"end_index":189336,"start_time_s":0.757336,"end_time_s":0.757344,"duration_s":8e-06},{"flag":1,"start_index":189336,"end_index":189395,"start_time_s":0.757344,"end_time_s":0.7575799999999999,"duration_s":0.000236},{"flag":2,"start_index":189395,"end_index":191998,"start_time_s":0.7575799999999999,"end_time_s":0.767992,"duration_s":0.010412},{"flag":1,"start_index":191998,"end_index":192001,"start_time_s":0.767992,"end_time_s":0.768004,"duration_s":1.2e-05},{"flag":3,"start_index":192001,"end_index":192003,"start_time_s":0.768004,"end_time_s":0.7680119999999999,"duration_s":8e-06},{"flag":1,"start_index":192003,"end_index":192061,"start_time_s":0.7680119999999999,"end_time_s":0.7682439999999999,"duration_s":0.000232},{"flag":2,"start_index":192061,"end_index":194665,"start_time_s":0.7682439999999999,"end_time_s":0.77866,"duration_s":0.010416},{"flag":1,"start_index":194665,"end_index":194667,"start_time_s":0.77866,"end_time_s":0.7786679999999999,"duration_s":8e-06},{"flag":3,"start_index":194667,"end_index":196945,"start_time_s":0.7786679999999999,"end_time_s":0.7877799999999999,"duration_s":0.009112},{"flag":1,"start_index":196945,"end_index":197005,"start_time_s":0.7877799999999999,"end_time_s":0.7880199999999999,"duration_s":0.00023999999999999998},{"flag":2,"start_index":197005,"end_index":197666,"start_time_s":0.7880199999999999,"end_time_s":0.7906639999999999,"duration_s":0.002644},{"flag":1,"start_index":197666,"end_index":197668,"start_time_s":0.7906639999999999,"end_time_s":0.7906719999999999,"duration_s":8e-06},{"flag":3,"start_index":197668,"end_index":200082,"start_time_s":0.7906719999999999,"end_time_s":0.8003279999999999,"duration_s":0.009656},{"flag":1,"start_index":200082,"end_index":200143,"start_time_s":0.8003279999999999,"end_time_s":0.800572,"duration_s":0.000244},{"flag":2,"start_index":200143,"end_index":200803,"start_time_s":0.800572,"end_time_s":0.8032119999999999,"duration_s":0.00264},{"flag":1,"start_index":200803,"end_index":200805,"start_time_s":0.8032119999999999,"end_time_s":0.8032199999999999,"duration_s":8e-06},{"flag":3,"start_index":200805,"end_index":202060,"start_time_s":0.8032199999999999,"end_time_s":0.80824,"duration_s":0.00502},{"flag":1,"start_index":202060,"end_index":202122,"start_time_s":0.80824,"end_time_s":0.808488,"duration_s":0.000248},{"flag":2,"start_index":202122,"end_index":202783,"start_time_s":0.808488,"end_time_s":0.811132,"duration_s":0.002644},{"flag":1,"start_index":202783,"end_index":202785,"start_time_s":0.811132,"end_time_s":0.81114,"duration_s":8e-06},{"flag":3,"start_index":202785,"end_index":204045,"start_time_s":0.81114,"end_time_s":0.81618,"duration_s":0.005039999999999999},{"flag":1,"start_index":204045,"end_index":204107,"start_time_s":0.81618,"end_time_s":0.8164279999999999,"duration_s":0.000248},{"flag":2,"start_index":204107,"end_index":205332,"start_time_s":0.8164279999999999,"end_time_s":0.821328,"duration_s":0.0049},{"flag":1,"start_index":205332,"end_index":205334,"start_time_s":0.821328,"end_time_s":0.821336,"duration_s":8e-06},{"flag":3,"start_index":205334,"end_index":206583,"start_time_s":0.821336,"end_time_s":0.826332,"duration_s":0.004996},{"flag":1,"start_index":206583,"end_index":206644,"start_time_s":0.826332,"end_time_s":0.826576,"duration_s":0.000244},{"flag":2,"start_index":206644,"end_index":207998,"start_time_s":0.826576,"end_time_s":0.831992,"duration_s":0.005416},{"flag":1,"start_index":207998,"end_index":208001,"start_time_s":0.831992,"end_time_s":0.832004,"duration_s":1.2e-05},{"flag":3,"start_index":208001,"end_index":209256,"start_time_s":0.832004,"end_time_s":0.837024,"duration_s":0.00502},{"flag":1,"start_index":209256,"end_index":209317,"start_time_s":0.837024,"end_time_s":0.837268,"duration_s":0.000244},{"flag":2,"start_index":209317,"end_index":210665,"start_time_s":0.837268,"end_time_s":0.84266,"duration_s":0.005392},{"flag":1,"start_index":210665,"end_index":210667,"start_time_s":0.84266,"end_time_s":0.842668,"duration_s":8e-06},{"flag":3,"start_index":210667,"end_index":211971,"start_time_s":0.842668,"end_time_s":0.847884,"duration_s":0.005216},{"flag":1,"start_index":211971,"end_index":212033,"start_time_s":0.847884,"end_time_s":0.848132,"duration_s":0.000248},{"flag":2,"start_index":212033,"end_index":213332,"start_time_s":0.848132,"end_time_s":0.853328,"duration_s":0.005196},{"flag":1,"start_index":213332,"end_index":213334,"start_time_s":0.853328,"end_time_s":0.853336,"duration_s":8e-06},{"flag":3,"start_index":213334,"end_index":216608,"start_time_s":0.853336,"end_time_s":0.866432,"duration_s":0.013096},{"flag":1,"start_index":216608,"end_index":216670,"start_time_s":0.866432,"end_time_s":0.86668,"duration_s":0.000248},{"flag":2,"start_index":216670,"end_index":217325,"start_time_s":0.86668,"end_time_s":0.8693,"duration_s":0.00262},{"flag":1,"start_index":217325,"end_index":217332,"start_time_s":0.8693,"end_time_s":0.869328,"duration_s":2.8e-05},{"flag":3,"start_index":217332,"end_index":219168,"start_time_s":0.869328,"end_time_s":0.876672,"duration_s":0.007344},{"flag":1,"start_index":219168,"end_index":219229,"start_time_s":0.876672,"end_time_s":0.8769159999999999,"duration_s":0.000244},{"flag":2,"start_index":219229,"end_index":219890,"start_time_s":0.8769159999999999,"end_time_s":0.87956,"duration_s":0.002644},{"flag":1,"start_index":219890,"end_index":219892,"start_time_s":0.87956,"end_time_s":0.8795679999999999,"duration_s":8e-06},{"flag":3,"start_index":219892,"end_index":219894,"start_time_s":0.8795679999999999,"end_time_s":0.8795759999999999,"duration_s":8e-06},{"flag":1,"start_index":219894,"end_index":219947,"start_time_s":0.8795759999999999,"end_time_s":0.879788,"duration_s":0.000212},{"flag":2,"start_index":219947,"end_index":221332,"start_time_s":0.879788,"end_time_s":0.885328,"duration_s":0.00554},{"flag":1,"start_index":221332,"end_index":221334,"start_time_s":0.885328,"end_time_s":0.885336,"duration_s":8e-06},{"flag":3,"start_index":221334,"end_index":221336,"start_time_s":0.885336,"end_time_s":0.8853439999999999,"duration_s":8e-06},{"flag":1,"start_index":221336,"end_index":221395,"start_time_s":0.8853439999999999,"end_time_s":0.8855799999999999,"duration_s":0.000236},{"flag":2,"start_index":221395,"end_index":223998,"start_time_s":0.8855799999999999,"end_time_s":0.895992,"duration_s":0.010412},{"flag":1,"start_index":223998,"end_index":224000,"start_time_s":0.895992,"end_time_s":0.8959999999999999,"duration_s":8e-06},{"flag":3,"start_index":224000,"end_index":224002,"start_time_s":0.8959999999999999,"end_time_s":0.8960079999999999,"duration_s":8e-06},{"flag":1,"start_index":224002,"end_index":224060,"start_time_s":0.8960079999999999,"end_time_s":0.8962399999999999,"duration_s":0.000232},{"flag":2,"start_index":224060,"end_index":226665,"start_time_s":0.8962399999999999,"end_time_s":0.9066599999999999,"duration_s":0.010419999999999999},{"flag":1,"start_index":226665,"end_index":226667,"start_time_s":0.9066599999999999,"end_time_s":0.9066679999999999,"duration_s":8e-06},{"flag":3,"start_index":226667,"end_index":228917,"start_time_s":0.9066679999999999,"end_time_s":0.9156679999999999,"duration_s":0.009},{"flag":1,"start_index":228917,"end_index":228976,"start_time_s":0.9156679999999999,"end_time_s":0.9159039999999999,"duration_s":0.000236},{"flag":2,"start_index":228976,"end_index":229637,"start_time_s":0.9159039999999999,"end_time_s":0.9185479999999999,"duration_s":0.002644},{"flag":1,"start_index":229637,"end_index":229639,"start_time_s":0.9185479999999999,"end_time_s":0.9185559999999999,"duration_s":8e-06},{"flag":3,"start_index":229639,"end_index":232050,"start_time_s":0.9185559999999999,"end_time_s":0.9281999999999999,"duration_s":0.009644},{"flag":1,"start_index":232050,"end_index":232112,"start_time_s":0.9281999999999999,"end_time_s":0.9284479999999999,"duration_s":0.000248},{"flag":2,"start_index":232112,"end_index":232773,"start_time_s":0.9284479999999999,"end_time_s":0.9310919999999999,"duration_s":0.002644},{"flag":1,"start_index":232773,"end_index":232775,"start_time_s":0.9310919999999999,"end_time_s":0.9310999999999999,"duration_s":8e-06},{"flag":3,"start_index":232775,"end_index":234050,"start_time_s":0.9310999999999999,"end_time_s":0.9361999999999999,"duration_s":0.0050999999999999995},{"flag":1,"start_index":234050,"end_index":234112,"start_time_s":0.9361999999999999,"end_time_s":0.936448,"duration_s":0.000248},{"flag":2,"start_index":234112,"end_index":234772,"start_time_s":0.936448,"end_time_s":0.9390879999999999,"duration_s":0.00264},{"flag":1,"start_index":234772,"end_index":234774,"start_time_s":0.9390879999999999,"end_time_s":0.9390959999999999,"duration_s":8e-06},{"flag":3,"start_index":234774,"end_index":236032,"start_time_s":0.9390959999999999,"end_time_s":0.944128,"duration_s":0.005032},{"flag":1,"start_index":236032,"end_index":236093,"start_time_s":0.944128,"end_time_s":0.944372,"duration_s":0.000244},{"flag":2,"start_index":236093,"end_index":237332,"start_time_s":0.944372,"end_time_s":0.949328,"duration_s":0.0049559999999999995},{"flag":1,"start_index":237332,"end_index":237334,"start_time_s":0.949328,"end_time_s":0.949336,"duration_s":8e-06},{"flag":3,"start_index":237334,"end_index":238565,"start_time_s":0.949336,"end_time_s":0.95426,"duration_s":0.0049239999999999996},{"flag":1,"start_index":238565,"end_index":238627,"start_time_s":0.95426,"end_time_s":0.9545079999999999,"duration_s":0.000248},{"flag":2,"start_index":238627,"end_index":239998,"start_time_s":0.9545079999999999,"end_time_s":0.959992,"duration_s":0.005484},{"flag":1,"start_index":239998,"end_index":240000,"start_time_s":0.959992,"end_time_s":0.96,"duration_s":8e-06},{"flag":3,"start_index":240000,"end_index":241243,"start_time_s":0.96,"end_time_s":0.9649719999999999,"duration_s":0.004972},{"flag":1,"start_index":241243,"end_index":241304,"start_time_s":0.9649719999999999,"end_time_s":0.965216,"duration_s":0.000244},{"flag":2,"start_index":241304,"end_index":242665,"start_time_s":0.965216,"end_time_s":0.97066,"duration_s":0.005444},{"flag":1,"start_index":242665,"end_index":242667,"start_time_s":0.97066,"end_time_s":0.970668,"duration_s":8e-06},{"flag":3,"start_index":242667,"end_index":243988,"start_time_s":0.970668,"end_time_s":0.9759519999999999,"duration_s":0.005284},{"flag":1,"start_index":243988,"end_index":244187,"start_time_s":0.9759519999999999,"end_time_s":0.976748,"duration_s":0.0007959999999999999},{"flag":2,"start_index":244187,"end_index":245331,"start_time_s":0.976748,"end_time_s":0.981324,"duration_s":0.004576},{"flag":1,"start_index":245331,"end_index":245334,"start_time_s":0.981324,"end_time_s":0.981336,"duration_s":1.2e-05},{"flag":3,"start_index":245334,"end_index":248646,"start_time_s":0.981336,"end_time_s":0.9945839999999999,"duration_s":0.013248},{"flag":1,"start_index":248646,"end_index":248868,"start_time_s":0.9945839999999999,"end_time_s":0.9954719999999999,"duration_s":0.000888},{"flag":2,"start_index":248868,"end_index":249529,"start_time_s":0.9954719999999999,"end_time_s":0.998116,"duration_s":0.002644},{"flag":1,"start_index":249529,"end_index":249531,"start_time_s":0.998116,"end_time_s":0.9981239999999999,"duration_s":8e-06},{"flag":3,"start_index":249531,"end_index":250000,"start_time_s":0.9981239999999999,"end_time_s":1.0,"duration_s":0.0018759999999999998}],"summary":{"flag_segment_stats":{"1":{"count":187,"min_s":8e-06,"max_s":0.000888,"mean_s":0.00013880213903743317,"median_s":2.8e-05,"p95_s":0.000248,"p99_s":0.0007787999999999997,"stddev_s":0.00015856771490227215,"total_s":0.025956},"2":{"count":94,"min_s":0.000292,"max_s":0.01044,"mean_s":0.004934340425531914,"median_s":0.004812,"p95_s":0.010416,"p99_s":0.010421399999999999,"stddev_s":0.002700001475780493,"total_s":0.46382799999999996},"3":{"count":95,"min_s":8e-06,"max_s":0.013248,"mean_s":0.005370694736842104,"median_s":0.005064,"p95_s":0.0130932,"p99_s":0.01318032,"stddev_s":0.0038866158871417723,"total_s":0.5102159999999999}},"transition_counts":{"1->2":93,"1->3":94,"2->1":93,"2->3":1,"3->1":93,"3->2":1}}} diff --git a/code/docs/DrawDisplay_baseline_flag1.png b/code/docs/DrawDisplay_baseline_flag1.png deleted file mode 100644 index 2d88688..0000000 Binary files a/code/docs/DrawDisplay_baseline_flag1.png and /dev/null differ diff --git a/code/docs/DrawDisplay_baseline_flag2.png b/code/docs/DrawDisplay_baseline_flag2.png deleted file mode 100644 index e00cdf1..0000000 Binary files a/code/docs/DrawDisplay_baseline_flag2.png and /dev/null differ diff --git a/code/docs/DrawDisplay_baseline_flag3.png b/code/docs/DrawDisplay_baseline_flag3.png deleted file mode 100644 index 1421de3..0000000 Binary files a/code/docs/DrawDisplay_baseline_flag3.png and /dev/null differ diff --git a/code/docs/DrawDisplay_baseline_timeline.png b/code/docs/DrawDisplay_baseline_timeline.png deleted file mode 100644 index 6d7fdb2..0000000 Binary files a/code/docs/DrawDisplay_baseline_timeline.png and /dev/null differ diff --git a/code/docs/DrawDisplay_phase1_capture.json b/code/docs/DrawDisplay_phase1_capture.json deleted file mode 100644 index baf6987..0000000 --- a/code/docs/DrawDisplay_phase1_capture.json +++ /dev/null @@ -1 +0,0 @@ -{"metadata":{"sample_rate_hz":250000.0,"sample_period_s":4e-06,"buffer_size":250000,"duration_s":1.0,"trigger":"flag=1","trigger_position_frac":0.1,"debounce_us":8.0,"debounce_samples":2,"acquisition_mode":"record","lost_samples":0,"corrupt_samples":0,"lost_fraction":0.0,"device_buffer_size":4096,"pin_mapping":{"28":{"bit":3,"dio":1},"29":{"bit":2,"dio":2},"30":{"bit":1,"dio":3},"31":{"bit":0,"dio":4}}},"transitions":[{"index":2,"time_s":8e-06,"from_flag":1,"to_flag":3},{"index":519,"time_s":0.0020759999999999997,"from_flag":3,"to_flag":1},{"index":580,"time_s":0.00232,"from_flag":1,"to_flag":2},{"index":2666,"time_s":0.010664,"from_flag":2,"to_flag":1},{"index":2669,"time_s":0.010676,"from_flag":1,"to_flag":3},{"index":3211,"time_s":0.012844,"from_flag":3,"to_flag":1},{"index":3272,"time_s":0.013087999999999999,"from_flag":1,"to_flag":2},{"index":5333,"time_s":0.021332,"from_flag":2,"to_flag":1},{"index":5335,"time_s":0.021339999999999998,"from_flag":1,"to_flag":3},{"index":9291,"time_s":0.037163999999999996,"from_flag":3,"to_flag":1},{"index":9353,"time_s":0.037412,"from_flag":1,"to_flag":2},{"index":10286,"time_s":0.041144,"from_flag":2,"to_flag":1},{"index":10289,"time_s":0.041156,"from_flag":1,"to_flag":3},{"index":10291,"time_s":0.041164,"from_flag":3,"to_flag":1},{"index":10349,"time_s":0.041395999999999995,"from_flag":1,"to_flag":2},{"index":11283,"time_s":0.045132,"from_flag":2,"to_flag":1},{"index":11285,"time_s":0.04514,"from_flag":1,"to_flag":3},{"index":11287,"time_s":0.045148,"from_flag":3,"to_flag":1},{"index":11340,"time_s":0.04536,"from_flag":1,"to_flag":2},{"index":13333,"time_s":0.053332,"from_flag":2,"to_flag":1},{"index":13335,"time_s":0.05334,"from_flag":1,"to_flag":3},{"index":17065,"time_s":0.06826,"from_flag":3,"to_flag":1},{"index":17126,"time_s":0.068504,"from_flag":1,"to_flag":2},{"index":18066,"time_s":0.072264,"from_flag":2,"to_flag":1},{"index":18068,"time_s":0.072272,"from_flag":1,"to_flag":3},{"index":19732,"time_s":0.078928,"from_flag":3,"to_flag":1},{"index":19794,"time_s":0.079176,"from_flag":1,"to_flag":2},{"index":20733,"time_s":0.08293199999999999,"from_flag":2,"to_flag":1},{"index":20735,"time_s":0.08294,"from_flag":1,"to_flag":3},{"index":21254,"time_s":0.085016,"from_flag":3,"to_flag":1},{"index":21315,"time_s":0.08526,"from_flag":1,"to_flag":2},{"index":22255,"time_s":0.08902,"from_flag":2,"to_flag":1},{"index":22257,"time_s":0.089028,"from_flag":1,"to_flag":3},{"index":22782,"time_s":0.091128,"from_flag":3,"to_flag":1},{"index":22844,"time_s":0.091376,"from_flag":1,"to_flag":2},{"index":24000,"time_s":0.096,"from_flag":2,"to_flag":1},{"index":24002,"time_s":0.096008,"from_flag":1,"to_flag":3},{"index":24532,"time_s":0.09812799999999999,"from_flag":3,"to_flag":1},{"index":24587,"time_s":0.09834799999999999,"from_flag":1,"to_flag":2},{"index":26666,"time_s":0.106664,"from_flag":2,"to_flag":1},{"index":26668,"time_s":0.10667199999999999,"from_flag":1,"to_flag":3},{"index":27182,"time_s":0.10872799999999999,"from_flag":3,"to_flag":1},{"index":27243,"time_s":0.108972,"from_flag":1,"to_flag":2},{"index":29333,"time_s":0.11733199999999999,"from_flag":2,"to_flag":1},{"index":29335,"time_s":0.11734,"from_flag":1,"to_flag":3},{"index":29858,"time_s":0.119432,"from_flag":3,"to_flag":1},{"index":29919,"time_s":0.11967599999999999,"from_flag":1,"to_flag":2},{"index":32000,"time_s":0.128,"from_flag":2,"to_flag":1},{"index":32002,"time_s":0.12800799999999998,"from_flag":1,"to_flag":3},{"index":35959,"time_s":0.143836,"from_flag":3,"to_flag":1},{"index":36020,"time_s":0.14407999999999999,"from_flag":1,"to_flag":2},{"index":36955,"time_s":0.14782,"from_flag":2,"to_flag":1},{"index":36957,"time_s":0.147828,"from_flag":1,"to_flag":3},{"index":36959,"time_s":0.147836,"from_flag":3,"to_flag":1},{"index":37149,"time_s":0.148596,"from_flag":1,"to_flag":2},{"index":38088,"time_s":0.152352,"from_flag":2,"to_flag":1},{"index":38091,"time_s":0.152364,"from_flag":1,"to_flag":3},{"index":38093,"time_s":0.15237199999999998,"from_flag":3,"to_flag":1},{"index":38151,"time_s":0.152604,"from_flag":1,"to_flag":2},{"index":39999,"time_s":0.159996,"from_flag":2,"to_flag":1},{"index":40002,"time_s":0.16000799999999998,"from_flag":1,"to_flag":3},{"index":43846,"time_s":0.17538399999999998,"from_flag":3,"to_flag":1},{"index":43907,"time_s":0.17562799999999998,"from_flag":1,"to_flag":2},{"index":44847,"time_s":0.179388,"from_flag":2,"to_flag":1},{"index":44849,"time_s":0.179396,"from_flag":1,"to_flag":3},{"index":46512,"time_s":0.186048,"from_flag":3,"to_flag":1},{"index":46573,"time_s":0.18629199999999999,"from_flag":1,"to_flag":2},{"index":47513,"time_s":0.190052,"from_flag":2,"to_flag":1},{"index":47516,"time_s":0.19006399999999998,"from_flag":1,"to_flag":3},{"index":48044,"time_s":0.19217599999999999,"from_flag":3,"to_flag":1},{"index":48105,"time_s":0.19241999999999998,"from_flag":1,"to_flag":2},{"index":49026,"time_s":0.196104,"from_flag":2,"to_flag":1},{"index":49028,"time_s":0.19611199999999998,"from_flag":1,"to_flag":3},{"index":49544,"time_s":0.198176,"from_flag":3,"to_flag":1},{"index":49605,"time_s":0.19841999999999999,"from_flag":1,"to_flag":2},{"index":50666,"time_s":0.20266399999999998,"from_flag":2,"to_flag":1},{"index":50668,"time_s":0.202672,"from_flag":1,"to_flag":3},{"index":51194,"time_s":0.20477599999999999,"from_flag":3,"to_flag":1},{"index":51255,"time_s":0.20501999999999998,"from_flag":1,"to_flag":2},{"index":53333,"time_s":0.213332,"from_flag":2,"to_flag":1},{"index":53335,"time_s":0.21334,"from_flag":1,"to_flag":3},{"index":53850,"time_s":0.21539999999999998,"from_flag":3,"to_flag":1},{"index":53911,"time_s":0.215644,"from_flag":1,"to_flag":2},{"index":55999,"time_s":0.223996,"from_flag":2,"to_flag":1},{"index":56002,"time_s":0.22400799999999998,"from_flag":1,"to_flag":3},{"index":56517,"time_s":0.226068,"from_flag":3,"to_flag":1},{"index":56579,"time_s":0.226316,"from_flag":1,"to_flag":2},{"index":58666,"time_s":0.23466399999999998,"from_flag":2,"to_flag":1},{"index":58668,"time_s":0.234672,"from_flag":1,"to_flag":3},{"index":62647,"time_s":0.250588,"from_flag":3,"to_flag":1},{"index":62870,"time_s":0.25148,"from_flag":1,"to_flag":2},{"index":63805,"time_s":0.25522,"from_flag":2,"to_flag":1},{"index":63807,"time_s":0.255228,"from_flag":1,"to_flag":3},{"index":63809,"time_s":0.25523599999999996,"from_flag":3,"to_flag":1},{"index":63868,"time_s":0.255472,"from_flag":1,"to_flag":2},{"index":64802,"time_s":0.259208,"from_flag":2,"to_flag":1},{"index":64804,"time_s":0.259216,"from_flag":1,"to_flag":3},{"index":64806,"time_s":0.259224,"from_flag":3,"to_flag":1},{"index":64865,"time_s":0.25945999999999997,"from_flag":1,"to_flag":2},{"index":66666,"time_s":0.266664,"from_flag":2,"to_flag":1},{"index":66668,"time_s":0.26667199999999996,"from_flag":1,"to_flag":3},{"index":70046,"time_s":0.280184,"from_flag":3,"to_flag":1},{"index":70105,"time_s":0.28042,"from_flag":1,"to_flag":2},{"index":71045,"time_s":0.28418,"from_flag":2,"to_flag":1},{"index":71047,"time_s":0.284188,"from_flag":1,"to_flag":3},{"index":72724,"time_s":0.290896,"from_flag":3,"to_flag":1},{"index":72786,"time_s":0.291144,"from_flag":1,"to_flag":2},{"index":73726,"time_s":0.294904,"from_flag":2,"to_flag":1},{"index":73728,"time_s":0.294912,"from_flag":1,"to_flag":3},{"index":74252,"time_s":0.297008,"from_flag":3,"to_flag":1},{"index":74313,"time_s":0.29725199999999996,"from_flag":1,"to_flag":2},{"index":75253,"time_s":0.301012,"from_flag":2,"to_flag":1},{"index":75255,"time_s":0.30102,"from_flag":1,"to_flag":3},{"index":75771,"time_s":0.30308399999999996,"from_flag":3,"to_flag":1},{"index":75834,"time_s":0.303336,"from_flag":1,"to_flag":2},{"index":77333,"time_s":0.309332,"from_flag":2,"to_flag":1},{"index":77335,"time_s":0.30934,"from_flag":1,"to_flag":3},{"index":77857,"time_s":0.311428,"from_flag":3,"to_flag":1},{"index":77918,"time_s":0.311672,"from_flag":1,"to_flag":2},{"index":79999,"time_s":0.319996,"from_flag":2,"to_flag":1},{"index":80001,"time_s":0.320004,"from_flag":1,"to_flag":3},{"index":80528,"time_s":0.322112,"from_flag":3,"to_flag":1},{"index":80583,"time_s":0.322332,"from_flag":1,"to_flag":2},{"index":82666,"time_s":0.33066399999999996,"from_flag":2,"to_flag":1},{"index":82668,"time_s":0.33067199999999997,"from_flag":1,"to_flag":3},{"index":83176,"time_s":0.332704,"from_flag":3,"to_flag":1},{"index":83237,"time_s":0.33294799999999997,"from_flag":1,"to_flag":2},{"index":85333,"time_s":0.34133199999999997,"from_flag":2,"to_flag":1},{"index":85335,"time_s":0.34134,"from_flag":1,"to_flag":3},{"index":89306,"time_s":0.357224,"from_flag":3,"to_flag":1},{"index":89362,"time_s":0.357448,"from_flag":1,"to_flag":2},{"index":90296,"time_s":0.361184,"from_flag":2,"to_flag":1},{"index":90298,"time_s":0.36119199999999996,"from_flag":1,"to_flag":3},{"index":90300,"time_s":0.36119999999999997,"from_flag":3,"to_flag":1},{"index":90359,"time_s":0.361436,"from_flag":1,"to_flag":2},{"index":91293,"time_s":0.365172,"from_flag":2,"to_flag":1},{"index":91295,"time_s":0.36518,"from_flag":1,"to_flag":3},{"index":91297,"time_s":0.36518799999999996,"from_flag":3,"to_flag":1},{"index":91357,"time_s":0.365428,"from_flag":1,"to_flag":2},{"index":93332,"time_s":0.373328,"from_flag":2,"to_flag":1},{"index":93335,"time_s":0.37334,"from_flag":1,"to_flag":3},{"index":96974,"time_s":0.38789599999999996,"from_flag":3,"to_flag":1},{"index":97034,"time_s":0.388136,"from_flag":1,"to_flag":2},{"index":97968,"time_s":0.391872,"from_flag":2,"to_flag":1},{"index":97970,"time_s":0.39188,"from_flag":1,"to_flag":3},{"index":99639,"time_s":0.39855599999999997,"from_flag":3,"to_flag":1},{"index":99833,"time_s":0.39933199999999996,"from_flag":1,"to_flag":2},{"index":100768,"time_s":0.403072,"from_flag":2,"to_flag":1},{"index":100770,"time_s":0.40308,"from_flag":1,"to_flag":3},{"index":101298,"time_s":0.405192,"from_flag":3,"to_flag":1},{"index":101360,"time_s":0.40543999999999997,"from_flag":1,"to_flag":2},{"index":102294,"time_s":0.409176,"from_flag":2,"to_flag":1},{"index":102296,"time_s":0.409184,"from_flag":1,"to_flag":3},{"index":102806,"time_s":0.411224,"from_flag":3,"to_flag":1},{"index":102867,"time_s":0.411468,"from_flag":1,"to_flag":2},{"index":103999,"time_s":0.415996,"from_flag":2,"to_flag":1},{"index":104001,"time_s":0.416004,"from_flag":1,"to_flag":3},{"index":104522,"time_s":0.41808799999999996,"from_flag":3,"to_flag":1},{"index":104584,"time_s":0.418336,"from_flag":1,"to_flag":2},{"index":106666,"time_s":0.426664,"from_flag":2,"to_flag":1},{"index":106668,"time_s":0.426672,"from_flag":1,"to_flag":3},{"index":107198,"time_s":0.428792,"from_flag":3,"to_flag":1},{"index":107259,"time_s":0.429036,"from_flag":1,"to_flag":2},{"index":109332,"time_s":0.437328,"from_flag":2,"to_flag":1},{"index":109335,"time_s":0.43734,"from_flag":1,"to_flag":3},{"index":109854,"time_s":0.439416,"from_flag":3,"to_flag":1},{"index":109915,"time_s":0.43966,"from_flag":1,"to_flag":2},{"index":111999,"time_s":0.447996,"from_flag":2,"to_flag":1},{"index":112001,"time_s":0.44800399999999996,"from_flag":1,"to_flag":3},{"index":115941,"time_s":0.46376399999999995,"from_flag":3,"to_flag":1},{"index":116003,"time_s":0.464012,"from_flag":1,"to_flag":2},{"index":116937,"time_s":0.467748,"from_flag":2,"to_flag":1},{"index":116940,"time_s":0.46775999999999995,"from_flag":1,"to_flag":3},{"index":116942,"time_s":0.46776799999999996,"from_flag":3,"to_flag":1},{"index":117001,"time_s":0.468004,"from_flag":1,"to_flag":2},{"index":117935,"time_s":0.47174,"from_flag":2,"to_flag":1},{"index":117937,"time_s":0.471748,"from_flag":1,"to_flag":3},{"index":117939,"time_s":0.47175599999999995,"from_flag":3,"to_flag":1},{"index":118001,"time_s":0.472004,"from_flag":1,"to_flag":2},{"index":119999,"time_s":0.479996,"from_flag":2,"to_flag":1},{"index":120001,"time_s":0.480004,"from_flag":1,"to_flag":3},{"index":123840,"time_s":0.49535999999999997,"from_flag":3,"to_flag":1},{"index":123897,"time_s":0.495588,"from_flag":1,"to_flag":2},{"index":124837,"time_s":0.49934799999999996,"from_flag":2,"to_flag":1},{"index":124840,"time_s":0.49935999999999997,"from_flag":1,"to_flag":3},{"index":126526,"time_s":0.506104,"from_flag":3,"to_flag":1},{"index":126588,"time_s":0.506352,"from_flag":1,"to_flag":2},{"index":127527,"time_s":0.510108,"from_flag":2,"to_flag":1},{"index":127529,"time_s":0.510116,"from_flag":1,"to_flag":3},{"index":128057,"time_s":0.512228,"from_flag":3,"to_flag":1},{"index":128112,"time_s":0.512448,"from_flag":1,"to_flag":2},{"index":129051,"time_s":0.516204,"from_flag":2,"to_flag":1},{"index":129053,"time_s":0.516212,"from_flag":1,"to_flag":3},{"index":129589,"time_s":0.5183559999999999,"from_flag":3,"to_flag":1},{"index":129650,"time_s":0.5186,"from_flag":1,"to_flag":2},{"index":130666,"time_s":0.522664,"from_flag":2,"to_flag":1},{"index":130668,"time_s":0.522672,"from_flag":1,"to_flag":3},{"index":131198,"time_s":0.5247919999999999,"from_flag":3,"to_flag":1},{"index":131259,"time_s":0.525036,"from_flag":1,"to_flag":2},{"index":133332,"time_s":0.533328,"from_flag":2,"to_flag":1},{"index":133334,"time_s":0.5333359999999999,"from_flag":1,"to_flag":3},{"index":133846,"time_s":0.535384,"from_flag":3,"to_flag":1},{"index":133906,"time_s":0.535624,"from_flag":1,"to_flag":2},{"index":135999,"time_s":0.5439959999999999,"from_flag":2,"to_flag":1},{"index":136001,"time_s":0.5440039999999999,"from_flag":1,"to_flag":3},{"index":136523,"time_s":0.546092,"from_flag":3,"to_flag":1},{"index":136578,"time_s":0.546312,"from_flag":1,"to_flag":2},{"index":138666,"time_s":0.5546639999999999,"from_flag":2,"to_flag":1},{"index":138668,"time_s":0.5546719999999999,"from_flag":1,"to_flag":3},{"index":142609,"time_s":0.5704359999999999,"from_flag":3,"to_flag":1},{"index":142670,"time_s":0.57068,"from_flag":1,"to_flag":2},{"index":143605,"time_s":0.5744199999999999,"from_flag":2,"to_flag":1},{"index":143607,"time_s":0.5744279999999999,"from_flag":1,"to_flag":3},{"index":143609,"time_s":0.574436,"from_flag":3,"to_flag":1},{"index":143669,"time_s":0.574676,"from_flag":1,"to_flag":2},{"index":144604,"time_s":0.5784159999999999,"from_flag":2,"to_flag":1},{"index":144606,"time_s":0.5784239999999999,"from_flag":1,"to_flag":3},{"index":144608,"time_s":0.578432,"from_flag":3,"to_flag":1},{"index":144667,"time_s":0.578668,"from_flag":1,"to_flag":2},{"index":146666,"time_s":0.586664,"from_flag":2,"to_flag":1},{"index":146668,"time_s":0.586672,"from_flag":1,"to_flag":3},{"index":150514,"time_s":0.6020559999999999,"from_flag":3,"to_flag":1},{"index":150574,"time_s":0.6022959999999999,"from_flag":1,"to_flag":2},{"index":151516,"time_s":0.6060639999999999,"from_flag":2,"to_flag":1},{"index":151518,"time_s":0.6060719999999999,"from_flag":1,"to_flag":3},{"index":153178,"time_s":0.6127119999999999,"from_flag":3,"to_flag":1},{"index":153239,"time_s":0.612956,"from_flag":1,"to_flag":2},{"index":154180,"time_s":0.6167199999999999,"from_flag":2,"to_flag":1},{"index":154182,"time_s":0.6167279999999999,"from_flag":1,"to_flag":3},{"index":154717,"time_s":0.618868,"from_flag":3,"to_flag":1},{"index":154779,"time_s":0.619116,"from_flag":1,"to_flag":2},{"index":155718,"time_s":0.622872,"from_flag":2,"to_flag":1},{"index":155720,"time_s":0.62288,"from_flag":1,"to_flag":3},{"index":156233,"time_s":0.6249319999999999,"from_flag":3,"to_flag":1},{"index":156295,"time_s":0.62518,"from_flag":1,"to_flag":2},{"index":157332,"time_s":0.629328,"from_flag":2,"to_flag":1},{"index":157334,"time_s":0.629336,"from_flag":1,"to_flag":3},{"index":157860,"time_s":0.63144,"from_flag":3,"to_flag":1},{"index":157921,"time_s":0.631684,"from_flag":1,"to_flag":2},{"index":159999,"time_s":0.639996,"from_flag":2,"to_flag":1},{"index":160001,"time_s":0.640004,"from_flag":1,"to_flag":3},{"index":160532,"time_s":0.6421279999999999,"from_flag":3,"to_flag":1},{"index":160593,"time_s":0.6423719999999999,"from_flag":1,"to_flag":2},{"index":162665,"time_s":0.65066,"from_flag":2,"to_flag":1},{"index":162668,"time_s":0.6506719999999999,"from_flag":1,"to_flag":3},{"index":163180,"time_s":0.65272,"from_flag":3,"to_flag":1},{"index":163373,"time_s":0.653492,"from_flag":1,"to_flag":2},{"index":165332,"time_s":0.6613279999999999,"from_flag":2,"to_flag":1},{"index":165334,"time_s":0.6613359999999999,"from_flag":1,"to_flag":3},{"index":169280,"time_s":0.6771199999999999,"from_flag":3,"to_flag":1},{"index":169342,"time_s":0.677368,"from_flag":1,"to_flag":2},{"index":170276,"time_s":0.6811039999999999,"from_flag":2,"to_flag":1},{"index":170279,"time_s":0.6811159999999999,"from_flag":1,"to_flag":3},{"index":170281,"time_s":0.681124,"from_flag":3,"to_flag":1},{"index":170340,"time_s":0.68136,"from_flag":1,"to_flag":2},{"index":171274,"time_s":0.6850959999999999,"from_flag":2,"to_flag":1},{"index":171276,"time_s":0.6851039999999999,"from_flag":1,"to_flag":3},{"index":171278,"time_s":0.6851119999999999,"from_flag":3,"to_flag":1},{"index":171333,"time_s":0.6853319999999999,"from_flag":1,"to_flag":2},{"index":173332,"time_s":0.6933279999999999,"from_flag":2,"to_flag":1},{"index":173334,"time_s":0.693336,"from_flag":1,"to_flag":3},{"index":177189,"time_s":0.7087559999999999,"from_flag":3,"to_flag":1},{"index":177250,"time_s":0.709,"from_flag":1,"to_flag":2},{"index":178190,"time_s":0.71276,"from_flag":2,"to_flag":1},{"index":178193,"time_s":0.712772,"from_flag":1,"to_flag":3},{"index":179853,"time_s":0.7194119999999999,"from_flag":3,"to_flag":1},{"index":179908,"time_s":0.7196319999999999,"from_flag":1,"to_flag":2},{"index":180848,"time_s":0.7233919999999999,"from_flag":2,"to_flag":1},{"index":180850,"time_s":0.7233999999999999,"from_flag":1,"to_flag":3},{"index":181365,"time_s":0.72546,"from_flag":3,"to_flag":1},{"index":181426,"time_s":0.725704,"from_flag":1,"to_flag":2},{"index":182365,"time_s":0.72946,"from_flag":2,"to_flag":1},{"index":182367,"time_s":0.729468,"from_flag":1,"to_flag":3},{"index":182881,"time_s":0.731524,"from_flag":3,"to_flag":1},{"index":182943,"time_s":0.731772,"from_flag":1,"to_flag":2},{"index":183999,"time_s":0.735996,"from_flag":2,"to_flag":1},{"index":184001,"time_s":0.736004,"from_flag":1,"to_flag":3},{"index":184529,"time_s":0.738116,"from_flag":3,"to_flag":1},{"index":184590,"time_s":0.73836,"from_flag":1,"to_flag":2},{"index":186665,"time_s":0.74666,"from_flag":2,"to_flag":1},{"index":186667,"time_s":0.746668,"from_flag":1,"to_flag":3},{"index":187191,"time_s":0.748764,"from_flag":3,"to_flag":1},{"index":187252,"time_s":0.749008,"from_flag":1,"to_flag":2},{"index":189332,"time_s":0.757328,"from_flag":2,"to_flag":1},{"index":189334,"time_s":0.757336,"from_flag":1,"to_flag":3},{"index":189851,"time_s":0.759404,"from_flag":3,"to_flag":1},{"index":189913,"time_s":0.759652,"from_flag":1,"to_flag":2},{"index":191999,"time_s":0.767996,"from_flag":2,"to_flag":1},{"index":192001,"time_s":0.768004,"from_flag":1,"to_flag":3},{"index":195964,"time_s":0.783856,"from_flag":3,"to_flag":1},{"index":196026,"time_s":0.7841039999999999,"from_flag":1,"to_flag":2},{"index":196959,"time_s":0.787836,"from_flag":2,"to_flag":1},{"index":196961,"time_s":0.787844,"from_flag":1,"to_flag":3},{"index":196963,"time_s":0.787852,"from_flag":3,"to_flag":1},{"index":197017,"time_s":0.788068,"from_flag":1,"to_flag":2},{"index":197952,"time_s":0.791808,"from_flag":2,"to_flag":1},{"index":197954,"time_s":0.791816,"from_flag":1,"to_flag":3},{"index":197956,"time_s":0.791824,"from_flag":3,"to_flag":1},{"index":198016,"time_s":0.792064,"from_flag":1,"to_flag":2},{"index":199999,"time_s":0.7999959999999999,"from_flag":2,"to_flag":1},{"index":200001,"time_s":0.8000039999999999,"from_flag":1,"to_flag":3},{"index":203524,"time_s":0.8140959999999999,"from_flag":3,"to_flag":1},{"index":203586,"time_s":0.814344,"from_flag":1,"to_flag":2},{"index":204524,"time_s":0.8180959999999999,"from_flag":2,"to_flag":1},{"index":204526,"time_s":0.8181039999999999,"from_flag":1,"to_flag":3},{"index":206189,"time_s":0.8247559999999999,"from_flag":3,"to_flag":1},{"index":206251,"time_s":0.825004,"from_flag":1,"to_flag":2},{"index":207189,"time_s":0.8287559999999999,"from_flag":2,"to_flag":1},{"index":207192,"time_s":0.828768,"from_flag":1,"to_flag":3},{"index":207714,"time_s":0.8308559999999999,"from_flag":3,"to_flag":1},{"index":207776,"time_s":0.831104,"from_flag":1,"to_flag":2},{"index":208715,"time_s":0.8348599999999999,"from_flag":2,"to_flag":1},{"index":208717,"time_s":0.8348679999999999,"from_flag":1,"to_flag":3},{"index":209224,"time_s":0.836896,"from_flag":3,"to_flag":1},{"index":209285,"time_s":0.83714,"from_flag":1,"to_flag":2},{"index":210665,"time_s":0.84266,"from_flag":2,"to_flag":1},{"index":210667,"time_s":0.842668,"from_flag":1,"to_flag":3},{"index":211197,"time_s":0.844788,"from_flag":3,"to_flag":1},{"index":211258,"time_s":0.845032,"from_flag":1,"to_flag":2},{"index":213332,"time_s":0.853328,"from_flag":2,"to_flag":1},{"index":213334,"time_s":0.853336,"from_flag":1,"to_flag":3},{"index":213853,"time_s":0.855412,"from_flag":3,"to_flag":1},{"index":213915,"time_s":0.85566,"from_flag":1,"to_flag":2},{"index":215998,"time_s":0.863992,"from_flag":2,"to_flag":1},{"index":216001,"time_s":0.864004,"from_flag":1,"to_flag":3},{"index":216510,"time_s":0.8660399999999999,"from_flag":3,"to_flag":1},{"index":216571,"time_s":0.8662839999999999,"from_flag":1,"to_flag":2},{"index":218665,"time_s":0.87466,"from_flag":2,"to_flag":1},{"index":218667,"time_s":0.874668,"from_flag":1,"to_flag":3},{"index":222658,"time_s":0.890632,"from_flag":3,"to_flag":1},{"index":222718,"time_s":0.890872,"from_flag":1,"to_flag":2},{"index":223652,"time_s":0.894608,"from_flag":2,"to_flag":1},{"index":223654,"time_s":0.894616,"from_flag":1,"to_flag":3},{"index":223656,"time_s":0.894624,"from_flag":3,"to_flag":1},{"index":223720,"time_s":0.89488,"from_flag":1,"to_flag":2},{"index":224654,"time_s":0.898616,"from_flag":2,"to_flag":1},{"index":224656,"time_s":0.898624,"from_flag":1,"to_flag":3},{"index":224658,"time_s":0.898632,"from_flag":3,"to_flag":1},{"index":224723,"time_s":0.8988919999999999,"from_flag":1,"to_flag":2},{"index":226665,"time_s":0.9066599999999999,"from_flag":2,"to_flag":1},{"index":226667,"time_s":0.9066679999999999,"from_flag":1,"to_flag":3},{"index":230253,"time_s":0.9210119999999999,"from_flag":3,"to_flag":1},{"index":230450,"time_s":0.9218,"from_flag":1,"to_flag":2},{"index":231390,"time_s":0.9255599999999999,"from_flag":2,"to_flag":1},{"index":231392,"time_s":0.925568,"from_flag":1,"to_flag":3},{"index":233053,"time_s":0.9322119999999999,"from_flag":3,"to_flag":1},{"index":233115,"time_s":0.93246,"from_flag":1,"to_flag":2},{"index":234054,"time_s":0.9362159999999999,"from_flag":2,"to_flag":1},{"index":234056,"time_s":0.936224,"from_flag":1,"to_flag":3},{"index":234579,"time_s":0.9383159999999999,"from_flag":3,"to_flag":1},{"index":234640,"time_s":0.93856,"from_flag":1,"to_flag":2},{"index":235580,"time_s":0.9423199999999999,"from_flag":2,"to_flag":1},{"index":235582,"time_s":0.9423279999999999,"from_flag":1,"to_flag":3},{"index":236105,"time_s":0.9444199999999999,"from_flag":3,"to_flag":1},{"index":236167,"time_s":0.944668,"from_flag":1,"to_flag":2},{"index":237332,"time_s":0.949328,"from_flag":2,"to_flag":1},{"index":237334,"time_s":0.949336,"from_flag":1,"to_flag":3},{"index":237872,"time_s":0.951488,"from_flag":3,"to_flag":1},{"index":237934,"time_s":0.9517359999999999,"from_flag":1,"to_flag":2},{"index":239998,"time_s":0.959992,"from_flag":2,"to_flag":1},{"index":240001,"time_s":0.960004,"from_flag":1,"to_flag":3},{"index":240530,"time_s":0.96212,"from_flag":3,"to_flag":1},{"index":240592,"time_s":0.962368,"from_flag":1,"to_flag":2},{"index":242665,"time_s":0.97066,"from_flag":2,"to_flag":1},{"index":242667,"time_s":0.970668,"from_flag":1,"to_flag":3},{"index":243186,"time_s":0.9727439999999999,"from_flag":3,"to_flag":1},{"index":243247,"time_s":0.972988,"from_flag":1,"to_flag":2},{"index":245332,"time_s":0.981328,"from_flag":2,"to_flag":1},{"index":245334,"time_s":0.981336,"from_flag":1,"to_flag":3},{"index":249277,"time_s":0.997108,"from_flag":3,"to_flag":1},{"index":249339,"time_s":0.9973559999999999,"from_flag":1,"to_flag":2}],"segments":[{"flag":1,"start_index":0,"end_index":2,"start_time_s":0.0,"end_time_s":8e-06,"duration_s":8e-06},{"flag":3,"start_index":2,"end_index":519,"start_time_s":8e-06,"end_time_s":0.0020759999999999997,"duration_s":0.002068},{"flag":1,"start_index":519,"end_index":580,"start_time_s":0.0020759999999999997,"end_time_s":0.00232,"duration_s":0.000244},{"flag":2,"start_index":580,"end_index":2666,"start_time_s":0.00232,"end_time_s":0.010664,"duration_s":0.008343999999999999},{"flag":1,"start_index":2666,"end_index":2669,"start_time_s":0.010664,"end_time_s":0.010676,"duration_s":1.2e-05},{"flag":3,"start_index":2669,"end_index":3211,"start_time_s":0.010676,"end_time_s":0.012844,"duration_s":0.002168},{"flag":1,"start_index":3211,"end_index":3272,"start_time_s":0.012844,"end_time_s":0.013087999999999999,"duration_s":0.000244},{"flag":2,"start_index":3272,"end_index":5333,"start_time_s":0.013087999999999999,"end_time_s":0.021332,"duration_s":0.008244},{"flag":1,"start_index":5333,"end_index":5335,"start_time_s":0.021332,"end_time_s":0.021339999999999998,"duration_s":8e-06},{"flag":3,"start_index":5335,"end_index":9291,"start_time_s":0.021339999999999998,"end_time_s":0.037163999999999996,"duration_s":0.015823999999999998},{"flag":1,"start_index":9291,"end_index":9353,"start_time_s":0.037163999999999996,"end_time_s":0.037412,"duration_s":0.000248},{"flag":2,"start_index":9353,"end_index":10286,"start_time_s":0.037412,"end_time_s":0.041144,"duration_s":0.0037319999999999996},{"flag":1,"start_index":10286,"end_index":10289,"start_time_s":0.041144,"end_time_s":0.041156,"duration_s":1.2e-05},{"flag":3,"start_index":10289,"end_index":10291,"start_time_s":0.041156,"end_time_s":0.041164,"duration_s":8e-06},{"flag":1,"start_index":10291,"end_index":10349,"start_time_s":0.041164,"end_time_s":0.041395999999999995,"duration_s":0.000232},{"flag":2,"start_index":10349,"end_index":11283,"start_time_s":0.041395999999999995,"end_time_s":0.045132,"duration_s":0.0037359999999999997},{"flag":1,"start_index":11283,"end_index":11285,"start_time_s":0.045132,"end_time_s":0.04514,"duration_s":8e-06},{"flag":3,"start_index":11285,"end_index":11287,"start_time_s":0.04514,"end_time_s":0.045148,"duration_s":8e-06},{"flag":1,"start_index":11287,"end_index":11340,"start_time_s":0.045148,"end_time_s":0.04536,"duration_s":0.000212},{"flag":2,"start_index":11340,"end_index":13333,"start_time_s":0.04536,"end_time_s":0.053332,"duration_s":0.007972},{"flag":1,"start_index":13333,"end_index":13335,"start_time_s":0.053332,"end_time_s":0.05334,"duration_s":8e-06},{"flag":3,"start_index":13335,"end_index":17065,"start_time_s":0.05334,"end_time_s":0.06826,"duration_s":0.01492},{"flag":1,"start_index":17065,"end_index":17126,"start_time_s":0.06826,"end_time_s":0.068504,"duration_s":0.000244},{"flag":2,"start_index":17126,"end_index":18066,"start_time_s":0.068504,"end_time_s":0.072264,"duration_s":0.00376},{"flag":1,"start_index":18066,"end_index":18068,"start_time_s":0.072264,"end_time_s":0.072272,"duration_s":8e-06},{"flag":3,"start_index":18068,"end_index":19732,"start_time_s":0.072272,"end_time_s":0.078928,"duration_s":0.006656},{"flag":1,"start_index":19732,"end_index":19794,"start_time_s":0.078928,"end_time_s":0.079176,"duration_s":0.000248},{"flag":2,"start_index":19794,"end_index":20733,"start_time_s":0.079176,"end_time_s":0.08293199999999999,"duration_s":0.003756},{"flag":1,"start_index":20733,"end_index":20735,"start_time_s":0.08293199999999999,"end_time_s":0.08294,"duration_s":8e-06},{"flag":3,"start_index":20735,"end_index":21254,"start_time_s":0.08294,"end_time_s":0.085016,"duration_s":0.0020759999999999997},{"flag":1,"start_index":21254,"end_index":21315,"start_time_s":0.085016,"end_time_s":0.08526,"duration_s":0.000244},{"flag":2,"start_index":21315,"end_index":22255,"start_time_s":0.08526,"end_time_s":0.08902,"duration_s":0.00376},{"flag":1,"start_index":22255,"end_index":22257,"start_time_s":0.08902,"end_time_s":0.089028,"duration_s":8e-06},{"flag":3,"start_index":22257,"end_index":22782,"start_time_s":0.089028,"end_time_s":0.091128,"duration_s":0.0021},{"flag":1,"start_index":22782,"end_index":22844,"start_time_s":0.091128,"end_time_s":0.091376,"duration_s":0.000248},{"flag":2,"start_index":22844,"end_index":24000,"start_time_s":0.091376,"end_time_s":0.096,"duration_s":0.004624},{"flag":1,"start_index":24000,"end_index":24002,"start_time_s":0.096,"end_time_s":0.096008,"duration_s":8e-06},{"flag":3,"start_index":24002,"end_index":24532,"start_time_s":0.096008,"end_time_s":0.09812799999999999,"duration_s":0.00212},{"flag":1,"start_index":24532,"end_index":24587,"start_time_s":0.09812799999999999,"end_time_s":0.09834799999999999,"duration_s":0.00021999999999999998},{"flag":2,"start_index":24587,"end_index":26666,"start_time_s":0.09834799999999999,"end_time_s":0.106664,"duration_s":0.008316},{"flag":1,"start_index":26666,"end_index":26668,"start_time_s":0.106664,"end_time_s":0.10667199999999999,"duration_s":8e-06},{"flag":3,"start_index":26668,"end_index":27182,"start_time_s":0.10667199999999999,"end_time_s":0.10872799999999999,"duration_s":0.002056},{"flag":1,"start_index":27182,"end_index":27243,"start_time_s":0.10872799999999999,"end_time_s":0.108972,"duration_s":0.000244},{"flag":2,"start_index":27243,"end_index":29333,"start_time_s":0.108972,"end_time_s":0.11733199999999999,"duration_s":0.00836},{"flag":1,"start_index":29333,"end_index":29335,"start_time_s":0.11733199999999999,"end_time_s":0.11734,"duration_s":8e-06},{"flag":3,"start_index":29335,"end_index":29858,"start_time_s":0.11734,"end_time_s":0.119432,"duration_s":0.002092},{"flag":1,"start_index":29858,"end_index":29919,"start_time_s":0.119432,"end_time_s":0.11967599999999999,"duration_s":0.000244},{"flag":2,"start_index":29919,"end_index":32000,"start_time_s":0.11967599999999999,"end_time_s":0.128,"duration_s":0.008324},{"flag":1,"start_index":32000,"end_index":32002,"start_time_s":0.128,"end_time_s":0.12800799999999998,"duration_s":8e-06},{"flag":3,"start_index":32002,"end_index":35959,"start_time_s":0.12800799999999998,"end_time_s":0.143836,"duration_s":0.015828},{"flag":1,"start_index":35959,"end_index":36020,"start_time_s":0.143836,"end_time_s":0.14407999999999999,"duration_s":0.000244},{"flag":2,"start_index":36020,"end_index":36955,"start_time_s":0.14407999999999999,"end_time_s":0.14782,"duration_s":0.00374},{"flag":1,"start_index":36955,"end_index":36957,"start_time_s":0.14782,"end_time_s":0.147828,"duration_s":8e-06},{"flag":3,"start_index":36957,"end_index":36959,"start_time_s":0.147828,"end_time_s":0.147836,"duration_s":8e-06},{"flag":1,"start_index":36959,"end_index":37149,"start_time_s":0.147836,"end_time_s":0.148596,"duration_s":0.0007599999999999999},{"flag":2,"start_index":37149,"end_index":38088,"start_time_s":0.148596,"end_time_s":0.152352,"duration_s":0.003756},{"flag":1,"start_index":38088,"end_index":38091,"start_time_s":0.152352,"end_time_s":0.152364,"duration_s":1.2e-05},{"flag":3,"start_index":38091,"end_index":38093,"start_time_s":0.152364,"end_time_s":0.15237199999999998,"duration_s":8e-06},{"flag":1,"start_index":38093,"end_index":38151,"start_time_s":0.15237199999999998,"end_time_s":0.152604,"duration_s":0.000232},{"flag":2,"start_index":38151,"end_index":39999,"start_time_s":0.152604,"end_time_s":0.159996,"duration_s":0.007391999999999999},{"flag":1,"start_index":39999,"end_index":40002,"start_time_s":0.159996,"end_time_s":0.16000799999999998,"duration_s":1.2e-05},{"flag":3,"start_index":40002,"end_index":43846,"start_time_s":0.16000799999999998,"end_time_s":0.17538399999999998,"duration_s":0.015375999999999999},{"flag":1,"start_index":43846,"end_index":43907,"start_time_s":0.17538399999999998,"end_time_s":0.17562799999999998,"duration_s":0.000244},{"flag":2,"start_index":43907,"end_index":44847,"start_time_s":0.17562799999999998,"end_time_s":0.179388,"duration_s":0.00376},{"flag":1,"start_index":44847,"end_index":44849,"start_time_s":0.179388,"end_time_s":0.179396,"duration_s":8e-06},{"flag":3,"start_index":44849,"end_index":46512,"start_time_s":0.179396,"end_time_s":0.186048,"duration_s":0.006652},{"flag":1,"start_index":46512,"end_index":46573,"start_time_s":0.186048,"end_time_s":0.18629199999999999,"duration_s":0.000244},{"flag":2,"start_index":46573,"end_index":47513,"start_time_s":0.18629199999999999,"end_time_s":0.190052,"duration_s":0.00376},{"flag":1,"start_index":47513,"end_index":47516,"start_time_s":0.190052,"end_time_s":0.19006399999999998,"duration_s":1.2e-05},{"flag":3,"start_index":47516,"end_index":48044,"start_time_s":0.19006399999999998,"end_time_s":0.19217599999999999,"duration_s":0.0021119999999999997},{"flag":1,"start_index":48044,"end_index":48105,"start_time_s":0.19217599999999999,"end_time_s":0.19241999999999998,"duration_s":0.000244},{"flag":2,"start_index":48105,"end_index":49026,"start_time_s":0.19241999999999998,"end_time_s":0.196104,"duration_s":0.0036839999999999998},{"flag":1,"start_index":49026,"end_index":49028,"start_time_s":0.196104,"end_time_s":0.19611199999999998,"duration_s":8e-06},{"flag":3,"start_index":49028,"end_index":49544,"start_time_s":0.19611199999999998,"end_time_s":0.198176,"duration_s":0.002064},{"flag":1,"start_index":49544,"end_index":49605,"start_time_s":0.198176,"end_time_s":0.19841999999999999,"duration_s":0.000244},{"flag":2,"start_index":49605,"end_index":50666,"start_time_s":0.19841999999999999,"end_time_s":0.20266399999999998,"duration_s":0.0042439999999999995},{"flag":1,"start_index":50666,"end_index":50668,"start_time_s":0.20266399999999998,"end_time_s":0.202672,"duration_s":8e-06},{"flag":3,"start_index":50668,"end_index":51194,"start_time_s":0.202672,"end_time_s":0.20477599999999999,"duration_s":0.002104},{"flag":1,"start_index":51194,"end_index":51255,"start_time_s":0.20477599999999999,"end_time_s":0.20501999999999998,"duration_s":0.000244},{"flag":2,"start_index":51255,"end_index":53333,"start_time_s":0.20501999999999998,"end_time_s":0.213332,"duration_s":0.008312},{"flag":1,"start_index":53333,"end_index":53335,"start_time_s":0.213332,"end_time_s":0.21334,"duration_s":8e-06},{"flag":3,"start_index":53335,"end_index":53850,"start_time_s":0.21334,"end_time_s":0.21539999999999998,"duration_s":0.0020599999999999998},{"flag":1,"start_index":53850,"end_index":53911,"start_time_s":0.21539999999999998,"end_time_s":0.215644,"duration_s":0.000244},{"flag":2,"start_index":53911,"end_index":55999,"start_time_s":0.215644,"end_time_s":0.223996,"duration_s":0.008352},{"flag":1,"start_index":55999,"end_index":56002,"start_time_s":0.223996,"end_time_s":0.22400799999999998,"duration_s":1.2e-05},{"flag":3,"start_index":56002,"end_index":56517,"start_time_s":0.22400799999999998,"end_time_s":0.226068,"duration_s":0.0020599999999999998},{"flag":1,"start_index":56517,"end_index":56579,"start_time_s":0.226068,"end_time_s":0.226316,"duration_s":0.000248},{"flag":2,"start_index":56579,"end_index":58666,"start_time_s":0.226316,"end_time_s":0.23466399999999998,"duration_s":0.008348},{"flag":1,"start_index":58666,"end_index":58668,"start_time_s":0.23466399999999998,"end_time_s":0.234672,"duration_s":8e-06},{"flag":3,"start_index":58668,"end_index":62647,"start_time_s":0.234672,"end_time_s":0.250588,"duration_s":0.015916},{"flag":1,"start_index":62647,"end_index":62870,"start_time_s":0.250588,"end_time_s":0.25148,"duration_s":0.000892},{"flag":2,"start_index":62870,"end_index":63805,"start_time_s":0.25148,"end_time_s":0.25522,"duration_s":0.00374},{"flag":1,"start_index":63805,"end_index":63807,"start_time_s":0.25522,"end_time_s":0.255228,"duration_s":8e-06},{"flag":3,"start_index":63807,"end_index":63809,"start_time_s":0.255228,"end_time_s":0.25523599999999996,"duration_s":8e-06},{"flag":1,"start_index":63809,"end_index":63868,"start_time_s":0.25523599999999996,"end_time_s":0.255472,"duration_s":0.000236},{"flag":2,"start_index":63868,"end_index":64802,"start_time_s":0.255472,"end_time_s":0.259208,"duration_s":0.0037359999999999997},{"flag":1,"start_index":64802,"end_index":64804,"start_time_s":0.259208,"end_time_s":0.259216,"duration_s":8e-06},{"flag":3,"start_index":64804,"end_index":64806,"start_time_s":0.259216,"end_time_s":0.259224,"duration_s":8e-06},{"flag":1,"start_index":64806,"end_index":64865,"start_time_s":0.259224,"end_time_s":0.25945999999999997,"duration_s":0.000236},{"flag":2,"start_index":64865,"end_index":66666,"start_time_s":0.25945999999999997,"end_time_s":0.266664,"duration_s":0.0072039999999999995},{"flag":1,"start_index":66666,"end_index":66668,"start_time_s":0.266664,"end_time_s":0.26667199999999996,"duration_s":8e-06},{"flag":3,"start_index":66668,"end_index":70046,"start_time_s":0.26667199999999996,"end_time_s":0.280184,"duration_s":0.013512},{"flag":1,"start_index":70046,"end_index":70105,"start_time_s":0.280184,"end_time_s":0.28042,"duration_s":0.000236},{"flag":2,"start_index":70105,"end_index":71045,"start_time_s":0.28042,"end_time_s":0.28418,"duration_s":0.00376},{"flag":1,"start_index":71045,"end_index":71047,"start_time_s":0.28418,"end_time_s":0.284188,"duration_s":8e-06},{"flag":3,"start_index":71047,"end_index":72724,"start_time_s":0.284188,"end_time_s":0.290896,"duration_s":0.0067079999999999996},{"flag":1,"start_index":72724,"end_index":72786,"start_time_s":0.290896,"end_time_s":0.291144,"duration_s":0.000248},{"flag":2,"start_index":72786,"end_index":73726,"start_time_s":0.291144,"end_time_s":0.294904,"duration_s":0.00376},{"flag":1,"start_index":73726,"end_index":73728,"start_time_s":0.294904,"end_time_s":0.294912,"duration_s":8e-06},{"flag":3,"start_index":73728,"end_index":74252,"start_time_s":0.294912,"end_time_s":0.297008,"duration_s":0.0020959999999999998},{"flag":1,"start_index":74252,"end_index":74313,"start_time_s":0.297008,"end_time_s":0.29725199999999996,"duration_s":0.000244},{"flag":2,"start_index":74313,"end_index":75253,"start_time_s":0.29725199999999996,"end_time_s":0.301012,"duration_s":0.00376},{"flag":1,"start_index":75253,"end_index":75255,"start_time_s":0.301012,"end_time_s":0.30102,"duration_s":8e-06},{"flag":3,"start_index":75255,"end_index":75771,"start_time_s":0.30102,"end_time_s":0.30308399999999996,"duration_s":0.002064},{"flag":1,"start_index":75771,"end_index":75834,"start_time_s":0.30308399999999996,"end_time_s":0.303336,"duration_s":0.000252},{"flag":2,"start_index":75834,"end_index":77333,"start_time_s":0.303336,"end_time_s":0.309332,"duration_s":0.005996},{"flag":1,"start_index":77333,"end_index":77335,"start_time_s":0.309332,"end_time_s":0.30934,"duration_s":8e-06},{"flag":3,"start_index":77335,"end_index":77857,"start_time_s":0.30934,"end_time_s":0.311428,"duration_s":0.002088},{"flag":1,"start_index":77857,"end_index":77918,"start_time_s":0.311428,"end_time_s":0.311672,"duration_s":0.000244},{"flag":2,"start_index":77918,"end_index":79999,"start_time_s":0.311672,"end_time_s":0.319996,"duration_s":0.008324},{"flag":1,"start_index":79999,"end_index":80001,"start_time_s":0.319996,"end_time_s":0.320004,"duration_s":8e-06},{"flag":3,"start_index":80001,"end_index":80528,"start_time_s":0.320004,"end_time_s":0.322112,"duration_s":0.002108},{"flag":1,"start_index":80528,"end_index":80583,"start_time_s":0.322112,"end_time_s":0.322332,"duration_s":0.00021999999999999998},{"flag":2,"start_index":80583,"end_index":82666,"start_time_s":0.322332,"end_time_s":0.33066399999999996,"duration_s":0.008331999999999999},{"flag":1,"start_index":82666,"end_index":82668,"start_time_s":0.33066399999999996,"end_time_s":0.33067199999999997,"duration_s":8e-06},{"flag":3,"start_index":82668,"end_index":83176,"start_time_s":0.33067199999999997,"end_time_s":0.332704,"duration_s":0.002032},{"flag":1,"start_index":83176,"end_index":83237,"start_time_s":0.332704,"end_time_s":0.33294799999999997,"duration_s":0.000244},{"flag":2,"start_index":83237,"end_index":85333,"start_time_s":0.33294799999999997,"end_time_s":0.34133199999999997,"duration_s":0.008383999999999999},{"flag":1,"start_index":85333,"end_index":85335,"start_time_s":0.34133199999999997,"end_time_s":0.34134,"duration_s":8e-06},{"flag":3,"start_index":85335,"end_index":89306,"start_time_s":0.34134,"end_time_s":0.357224,"duration_s":0.015884},{"flag":1,"start_index":89306,"end_index":89362,"start_time_s":0.357224,"end_time_s":0.357448,"duration_s":0.000224},{"flag":2,"start_index":89362,"end_index":90296,"start_time_s":0.357448,"end_time_s":0.361184,"duration_s":0.0037359999999999997},{"flag":1,"start_index":90296,"end_index":90298,"start_time_s":0.361184,"end_time_s":0.36119199999999996,"duration_s":8e-06},{"flag":3,"start_index":90298,"end_index":90300,"start_time_s":0.36119199999999996,"end_time_s":0.36119999999999997,"duration_s":8e-06},{"flag":1,"start_index":90300,"end_index":90359,"start_time_s":0.36119999999999997,"end_time_s":0.361436,"duration_s":0.000236},{"flag":2,"start_index":90359,"end_index":91293,"start_time_s":0.361436,"end_time_s":0.365172,"duration_s":0.0037359999999999997},{"flag":1,"start_index":91293,"end_index":91295,"start_time_s":0.365172,"end_time_s":0.36518,"duration_s":8e-06},{"flag":3,"start_index":91295,"end_index":91297,"start_time_s":0.36518,"end_time_s":0.36518799999999996,"duration_s":8e-06},{"flag":1,"start_index":91297,"end_index":91357,"start_time_s":0.36518799999999996,"end_time_s":0.365428,"duration_s":0.00023999999999999998},{"flag":2,"start_index":91357,"end_index":93332,"start_time_s":0.365428,"end_time_s":0.373328,"duration_s":0.007899999999999999},{"flag":1,"start_index":93332,"end_index":93335,"start_time_s":0.373328,"end_time_s":0.37334,"duration_s":1.2e-05},{"flag":3,"start_index":93335,"end_index":96974,"start_time_s":0.37334,"end_time_s":0.38789599999999996,"duration_s":0.014556},{"flag":1,"start_index":96974,"end_index":97034,"start_time_s":0.38789599999999996,"end_time_s":0.388136,"duration_s":0.00023999999999999998},{"flag":2,"start_index":97034,"end_index":97968,"start_time_s":0.388136,"end_time_s":0.391872,"duration_s":0.0037359999999999997},{"flag":1,"start_index":97968,"end_index":97970,"start_time_s":0.391872,"end_time_s":0.39188,"duration_s":8e-06},{"flag":3,"start_index":97970,"end_index":99639,"start_time_s":0.39188,"end_time_s":0.39855599999999997,"duration_s":0.006676},{"flag":1,"start_index":99639,"end_index":99833,"start_time_s":0.39855599999999997,"end_time_s":0.39933199999999996,"duration_s":0.000776},{"flag":2,"start_index":99833,"end_index":100768,"start_time_s":0.39933199999999996,"end_time_s":0.403072,"duration_s":0.00374},{"flag":1,"start_index":100768,"end_index":100770,"start_time_s":0.403072,"end_time_s":0.40308,"duration_s":8e-06},{"flag":3,"start_index":100770,"end_index":101298,"start_time_s":0.40308,"end_time_s":0.405192,"duration_s":0.0021119999999999997},{"flag":1,"start_index":101298,"end_index":101360,"start_time_s":0.405192,"end_time_s":0.40543999999999997,"duration_s":0.000248},{"flag":2,"start_index":101360,"end_index":102294,"start_time_s":0.40543999999999997,"end_time_s":0.409176,"duration_s":0.0037359999999999997},{"flag":1,"start_index":102294,"end_index":102296,"start_time_s":0.409176,"end_time_s":0.409184,"duration_s":8e-06},{"flag":3,"start_index":102296,"end_index":102806,"start_time_s":0.409184,"end_time_s":0.411224,"duration_s":0.0020399999999999997},{"flag":1,"start_index":102806,"end_index":102867,"start_time_s":0.411224,"end_time_s":0.411468,"duration_s":0.000244},{"flag":2,"start_index":102867,"end_index":103999,"start_time_s":0.411468,"end_time_s":0.415996,"duration_s":0.004528},{"flag":1,"start_index":103999,"end_index":104001,"start_time_s":0.415996,"end_time_s":0.416004,"duration_s":8e-06},{"flag":3,"start_index":104001,"end_index":104522,"start_time_s":0.416004,"end_time_s":0.41808799999999996,"duration_s":0.002084},{"flag":1,"start_index":104522,"end_index":104584,"start_time_s":0.41808799999999996,"end_time_s":0.418336,"duration_s":0.000248},{"flag":2,"start_index":104584,"end_index":106666,"start_time_s":0.418336,"end_time_s":0.426664,"duration_s":0.008328},{"flag":1,"start_index":106666,"end_index":106668,"start_time_s":0.426664,"end_time_s":0.426672,"duration_s":8e-06},{"flag":3,"start_index":106668,"end_index":107198,"start_time_s":0.426672,"end_time_s":0.428792,"duration_s":0.00212},{"flag":1,"start_index":107198,"end_index":107259,"start_time_s":0.428792,"end_time_s":0.429036,"duration_s":0.000244},{"flag":2,"start_index":107259,"end_index":109332,"start_time_s":0.429036,"end_time_s":0.437328,"duration_s":0.008291999999999999},{"flag":1,"start_index":109332,"end_index":109335,"start_time_s":0.437328,"end_time_s":0.43734,"duration_s":1.2e-05},{"flag":3,"start_index":109335,"end_index":109854,"start_time_s":0.43734,"end_time_s":0.439416,"duration_s":0.0020759999999999997},{"flag":1,"start_index":109854,"end_index":109915,"start_time_s":0.439416,"end_time_s":0.43966,"duration_s":0.000244},{"flag":2,"start_index":109915,"end_index":111999,"start_time_s":0.43966,"end_time_s":0.447996,"duration_s":0.008336},{"flag":1,"start_index":111999,"end_index":112001,"start_time_s":0.447996,"end_time_s":0.44800399999999996,"duration_s":8e-06},{"flag":3,"start_index":112001,"end_index":115941,"start_time_s":0.44800399999999996,"end_time_s":0.46376399999999995,"duration_s":0.01576},{"flag":1,"start_index":115941,"end_index":116003,"start_time_s":0.46376399999999995,"end_time_s":0.464012,"duration_s":0.000248},{"flag":2,"start_index":116003,"end_index":116937,"start_time_s":0.464012,"end_time_s":0.467748,"duration_s":0.0037359999999999997},{"flag":1,"start_index":116937,"end_index":116940,"start_time_s":0.467748,"end_time_s":0.46775999999999995,"duration_s":1.2e-05},{"flag":3,"start_index":116940,"end_index":116942,"start_time_s":0.46775999999999995,"end_time_s":0.46776799999999996,"duration_s":8e-06},{"flag":1,"start_index":116942,"end_index":117001,"start_time_s":0.46776799999999996,"end_time_s":0.468004,"duration_s":0.000236},{"flag":2,"start_index":117001,"end_index":117935,"start_time_s":0.468004,"end_time_s":0.47174,"duration_s":0.0037359999999999997},{"flag":1,"start_index":117935,"end_index":117937,"start_time_s":0.47174,"end_time_s":0.471748,"duration_s":8e-06},{"flag":3,"start_index":117937,"end_index":117939,"start_time_s":0.471748,"end_time_s":0.47175599999999995,"duration_s":8e-06},{"flag":1,"start_index":117939,"end_index":118001,"start_time_s":0.47175599999999995,"end_time_s":0.472004,"duration_s":0.000248},{"flag":2,"start_index":118001,"end_index":119999,"start_time_s":0.472004,"end_time_s":0.479996,"duration_s":0.007991999999999999},{"flag":1,"start_index":119999,"end_index":120001,"start_time_s":0.479996,"end_time_s":0.480004,"duration_s":8e-06},{"flag":3,"start_index":120001,"end_index":123840,"start_time_s":0.480004,"end_time_s":0.49535999999999997,"duration_s":0.015356},{"flag":1,"start_index":123840,"end_index":123897,"start_time_s":0.49535999999999997,"end_time_s":0.495588,"duration_s":0.00022799999999999999},{"flag":2,"start_index":123897,"end_index":124837,"start_time_s":0.495588,"end_time_s":0.49934799999999996,"duration_s":0.00376},{"flag":1,"start_index":124837,"end_index":124840,"start_time_s":0.49934799999999996,"end_time_s":0.49935999999999997,"duration_s":1.2e-05},{"flag":3,"start_index":124840,"end_index":126526,"start_time_s":0.49935999999999997,"end_time_s":0.506104,"duration_s":0.006744},{"flag":1,"start_index":126526,"end_index":126588,"start_time_s":0.506104,"end_time_s":0.506352,"duration_s":0.000248},{"flag":2,"start_index":126588,"end_index":127527,"start_time_s":0.506352,"end_time_s":0.510108,"duration_s":0.003756},{"flag":1,"start_index":127527,"end_index":127529,"start_time_s":0.510108,"end_time_s":0.510116,"duration_s":8e-06},{"flag":3,"start_index":127529,"end_index":128057,"start_time_s":0.510116,"end_time_s":0.512228,"duration_s":0.0021119999999999997},{"flag":1,"start_index":128057,"end_index":128112,"start_time_s":0.512228,"end_time_s":0.512448,"duration_s":0.00021999999999999998},{"flag":2,"start_index":128112,"end_index":129051,"start_time_s":0.512448,"end_time_s":0.516204,"duration_s":0.003756},{"flag":1,"start_index":129051,"end_index":129053,"start_time_s":0.516204,"end_time_s":0.516212,"duration_s":8e-06},{"flag":3,"start_index":129053,"end_index":129589,"start_time_s":0.516212,"end_time_s":0.5183559999999999,"duration_s":0.002144},{"flag":1,"start_index":129589,"end_index":129650,"start_time_s":0.5183559999999999,"end_time_s":0.5186,"duration_s":0.000244},{"flag":2,"start_index":129650,"end_index":130666,"start_time_s":0.5186,"end_time_s":0.522664,"duration_s":0.004064},{"flag":1,"start_index":130666,"end_index":130668,"start_time_s":0.522664,"end_time_s":0.522672,"duration_s":8e-06},{"flag":3,"start_index":130668,"end_index":131198,"start_time_s":0.522672,"end_time_s":0.5247919999999999,"duration_s":0.00212},{"flag":1,"start_index":131198,"end_index":131259,"start_time_s":0.5247919999999999,"end_time_s":0.525036,"duration_s":0.000244},{"flag":2,"start_index":131259,"end_index":133332,"start_time_s":0.525036,"end_time_s":0.533328,"duration_s":0.008291999999999999},{"flag":1,"start_index":133332,"end_index":133334,"start_time_s":0.533328,"end_time_s":0.5333359999999999,"duration_s":8e-06},{"flag":3,"start_index":133334,"end_index":133846,"start_time_s":0.5333359999999999,"end_time_s":0.535384,"duration_s":0.002048},{"flag":1,"start_index":133846,"end_index":133906,"start_time_s":0.535384,"end_time_s":0.535624,"duration_s":0.00023999999999999998},{"flag":2,"start_index":133906,"end_index":135999,"start_time_s":0.535624,"end_time_s":0.5439959999999999,"duration_s":0.008372},{"flag":1,"start_index":135999,"end_index":136001,"start_time_s":0.5439959999999999,"end_time_s":0.5440039999999999,"duration_s":8e-06},{"flag":3,"start_index":136001,"end_index":136523,"start_time_s":0.5440039999999999,"end_time_s":0.546092,"duration_s":0.002088},{"flag":1,"start_index":136523,"end_index":136578,"start_time_s":0.546092,"end_time_s":0.546312,"duration_s":0.00021999999999999998},{"flag":2,"start_index":136578,"end_index":138666,"start_time_s":0.546312,"end_time_s":0.5546639999999999,"duration_s":0.008352},{"flag":1,"start_index":138666,"end_index":138668,"start_time_s":0.5546639999999999,"end_time_s":0.5546719999999999,"duration_s":8e-06},{"flag":3,"start_index":138668,"end_index":142609,"start_time_s":0.5546719999999999,"end_time_s":0.5704359999999999,"duration_s":0.015764},{"flag":1,"start_index":142609,"end_index":142670,"start_time_s":0.5704359999999999,"end_time_s":0.57068,"duration_s":0.000244},{"flag":2,"start_index":142670,"end_index":143605,"start_time_s":0.57068,"end_time_s":0.5744199999999999,"duration_s":0.00374},{"flag":1,"start_index":143605,"end_index":143607,"start_time_s":0.5744199999999999,"end_time_s":0.5744279999999999,"duration_s":8e-06},{"flag":3,"start_index":143607,"end_index":143609,"start_time_s":0.5744279999999999,"end_time_s":0.574436,"duration_s":8e-06},{"flag":1,"start_index":143609,"end_index":143669,"start_time_s":0.574436,"end_time_s":0.574676,"duration_s":0.00023999999999999998},{"flag":2,"start_index":143669,"end_index":144604,"start_time_s":0.574676,"end_time_s":0.5784159999999999,"duration_s":0.00374},{"flag":1,"start_index":144604,"end_index":144606,"start_time_s":0.5784159999999999,"end_time_s":0.5784239999999999,"duration_s":8e-06},{"flag":3,"start_index":144606,"end_index":144608,"start_time_s":0.5784239999999999,"end_time_s":0.578432,"duration_s":8e-06},{"flag":1,"start_index":144608,"end_index":144667,"start_time_s":0.578432,"end_time_s":0.578668,"duration_s":0.000236},{"flag":2,"start_index":144667,"end_index":146666,"start_time_s":0.578668,"end_time_s":0.586664,"duration_s":0.007996},{"flag":1,"start_index":146666,"end_index":146668,"start_time_s":0.586664,"end_time_s":0.586672,"duration_s":8e-06},{"flag":3,"start_index":146668,"end_index":150514,"start_time_s":0.586672,"end_time_s":0.6020559999999999,"duration_s":0.015384},{"flag":1,"start_index":150514,"end_index":150574,"start_time_s":0.6020559999999999,"end_time_s":0.6022959999999999,"duration_s":0.00023999999999999998},{"flag":2,"start_index":150574,"end_index":151516,"start_time_s":0.6022959999999999,"end_time_s":0.6060639999999999,"duration_s":0.0037679999999999996},{"flag":1,"start_index":151516,"end_index":151518,"start_time_s":0.6060639999999999,"end_time_s":0.6060719999999999,"duration_s":8e-06},{"flag":3,"start_index":151518,"end_index":153178,"start_time_s":0.6060719999999999,"end_time_s":0.6127119999999999,"duration_s":0.00664},{"flag":1,"start_index":153178,"end_index":153239,"start_time_s":0.6127119999999999,"end_time_s":0.612956,"duration_s":0.000244},{"flag":2,"start_index":153239,"end_index":154180,"start_time_s":0.612956,"end_time_s":0.6167199999999999,"duration_s":0.003764},{"flag":1,"start_index":154180,"end_index":154182,"start_time_s":0.6167199999999999,"end_time_s":0.6167279999999999,"duration_s":8e-06},{"flag":3,"start_index":154182,"end_index":154717,"start_time_s":0.6167279999999999,"end_time_s":0.618868,"duration_s":0.00214},{"flag":1,"start_index":154717,"end_index":154779,"start_time_s":0.618868,"end_time_s":0.619116,"duration_s":0.000248},{"flag":2,"start_index":154779,"end_index":155718,"start_time_s":0.619116,"end_time_s":0.622872,"duration_s":0.003756},{"flag":1,"start_index":155718,"end_index":155720,"start_time_s":0.622872,"end_time_s":0.62288,"duration_s":8e-06},{"flag":3,"start_index":155720,"end_index":156233,"start_time_s":0.62288,"end_time_s":0.6249319999999999,"duration_s":0.002052},{"flag":1,"start_index":156233,"end_index":156295,"start_time_s":0.6249319999999999,"end_time_s":0.62518,"duration_s":0.000248},{"flag":2,"start_index":156295,"end_index":157332,"start_time_s":0.62518,"end_time_s":0.629328,"duration_s":0.004148},{"flag":1,"start_index":157332,"end_index":157334,"start_time_s":0.629328,"end_time_s":0.629336,"duration_s":8e-06},{"flag":3,"start_index":157334,"end_index":157860,"start_time_s":0.629336,"end_time_s":0.63144,"duration_s":0.002104},{"flag":1,"start_index":157860,"end_index":157921,"start_time_s":0.63144,"end_time_s":0.631684,"duration_s":0.000244},{"flag":2,"start_index":157921,"end_index":159999,"start_time_s":0.631684,"end_time_s":0.639996,"duration_s":0.008312},{"flag":1,"start_index":159999,"end_index":160001,"start_time_s":0.639996,"end_time_s":0.640004,"duration_s":8e-06},{"flag":3,"start_index":160001,"end_index":160532,"start_time_s":0.640004,"end_time_s":0.6421279999999999,"duration_s":0.002124},{"flag":1,"start_index":160532,"end_index":160593,"start_time_s":0.6421279999999999,"end_time_s":0.6423719999999999,"duration_s":0.000244},{"flag":2,"start_index":160593,"end_index":162665,"start_time_s":0.6423719999999999,"end_time_s":0.65066,"duration_s":0.008288},{"flag":1,"start_index":162665,"end_index":162668,"start_time_s":0.65066,"end_time_s":0.6506719999999999,"duration_s":1.2e-05},{"flag":3,"start_index":162668,"end_index":163180,"start_time_s":0.6506719999999999,"end_time_s":0.65272,"duration_s":0.002048},{"flag":1,"start_index":163180,"end_index":163373,"start_time_s":0.65272,"end_time_s":0.653492,"duration_s":0.000772},{"flag":2,"start_index":163373,"end_index":165332,"start_time_s":0.653492,"end_time_s":0.6613279999999999,"duration_s":0.007836},{"flag":1,"start_index":165332,"end_index":165334,"start_time_s":0.6613279999999999,"end_time_s":0.6613359999999999,"duration_s":8e-06},{"flag":3,"start_index":165334,"end_index":169280,"start_time_s":0.6613359999999999,"end_time_s":0.6771199999999999,"duration_s":0.015784},{"flag":1,"start_index":169280,"end_index":169342,"start_time_s":0.6771199999999999,"end_time_s":0.677368,"duration_s":0.000248},{"flag":2,"start_index":169342,"end_index":170276,"start_time_s":0.677368,"end_time_s":0.6811039999999999,"duration_s":0.0037359999999999997},{"flag":1,"start_index":170276,"end_index":170279,"start_time_s":0.6811039999999999,"end_time_s":0.6811159999999999,"duration_s":1.2e-05},{"flag":3,"start_index":170279,"end_index":170281,"start_time_s":0.6811159999999999,"end_time_s":0.681124,"duration_s":8e-06},{"flag":1,"start_index":170281,"end_index":170340,"start_time_s":0.681124,"end_time_s":0.68136,"duration_s":0.000236},{"flag":2,"start_index":170340,"end_index":171274,"start_time_s":0.68136,"end_time_s":0.6850959999999999,"duration_s":0.0037359999999999997},{"flag":1,"start_index":171274,"end_index":171276,"start_time_s":0.6850959999999999,"end_time_s":0.6851039999999999,"duration_s":8e-06},{"flag":3,"start_index":171276,"end_index":171278,"start_time_s":0.6851039999999999,"end_time_s":0.6851119999999999,"duration_s":8e-06},{"flag":1,"start_index":171278,"end_index":171333,"start_time_s":0.6851119999999999,"end_time_s":0.6853319999999999,"duration_s":0.00021999999999999998},{"flag":2,"start_index":171333,"end_index":173332,"start_time_s":0.6853319999999999,"end_time_s":0.6933279999999999,"duration_s":0.007996},{"flag":1,"start_index":173332,"end_index":173334,"start_time_s":0.6933279999999999,"end_time_s":0.693336,"duration_s":8e-06},{"flag":3,"start_index":173334,"end_index":177189,"start_time_s":0.693336,"end_time_s":0.7087559999999999,"duration_s":0.01542},{"flag":1,"start_index":177189,"end_index":177250,"start_time_s":0.7087559999999999,"end_time_s":0.709,"duration_s":0.000244},{"flag":2,"start_index":177250,"end_index":178190,"start_time_s":0.709,"end_time_s":0.71276,"duration_s":0.00376},{"flag":1,"start_index":178190,"end_index":178193,"start_time_s":0.71276,"end_time_s":0.712772,"duration_s":1.2e-05},{"flag":3,"start_index":178193,"end_index":179853,"start_time_s":0.712772,"end_time_s":0.7194119999999999,"duration_s":0.00664},{"flag":1,"start_index":179853,"end_index":179908,"start_time_s":0.7194119999999999,"end_time_s":0.7196319999999999,"duration_s":0.00021999999999999998},{"flag":2,"start_index":179908,"end_index":180848,"start_time_s":0.7196319999999999,"end_time_s":0.7233919999999999,"duration_s":0.00376},{"flag":1,"start_index":180848,"end_index":180850,"start_time_s":0.7233919999999999,"end_time_s":0.7233999999999999,"duration_s":8e-06},{"flag":3,"start_index":180850,"end_index":181365,"start_time_s":0.7233999999999999,"end_time_s":0.72546,"duration_s":0.0020599999999999998},{"flag":1,"start_index":181365,"end_index":181426,"start_time_s":0.72546,"end_time_s":0.725704,"duration_s":0.000244},{"flag":2,"start_index":181426,"end_index":182365,"start_time_s":0.725704,"end_time_s":0.72946,"duration_s":0.003756},{"flag":1,"start_index":182365,"end_index":182367,"start_time_s":0.72946,"end_time_s":0.729468,"duration_s":8e-06},{"flag":3,"start_index":182367,"end_index":182881,"start_time_s":0.729468,"end_time_s":0.731524,"duration_s":0.002056},{"flag":1,"start_index":182881,"end_index":182943,"start_time_s":0.731524,"end_time_s":0.731772,"duration_s":0.000248},{"flag":2,"start_index":182943,"end_index":183999,"start_time_s":0.731772,"end_time_s":0.735996,"duration_s":0.0042239999999999995},{"flag":1,"start_index":183999,"end_index":184001,"start_time_s":0.735996,"end_time_s":0.736004,"duration_s":8e-06},{"flag":3,"start_index":184001,"end_index":184529,"start_time_s":0.736004,"end_time_s":0.738116,"duration_s":0.0021119999999999997},{"flag":1,"start_index":184529,"end_index":184590,"start_time_s":0.738116,"end_time_s":0.73836,"duration_s":0.000244},{"flag":2,"start_index":184590,"end_index":186665,"start_time_s":0.73836,"end_time_s":0.74666,"duration_s":0.0083},{"flag":1,"start_index":186665,"end_index":186667,"start_time_s":0.74666,"end_time_s":0.746668,"duration_s":8e-06},{"flag":3,"start_index":186667,"end_index":187191,"start_time_s":0.746668,"end_time_s":0.748764,"duration_s":0.0020959999999999998},{"flag":1,"start_index":187191,"end_index":187252,"start_time_s":0.748764,"end_time_s":0.749008,"duration_s":0.000244},{"flag":2,"start_index":187252,"end_index":189332,"start_time_s":0.749008,"end_time_s":0.757328,"duration_s":0.00832},{"flag":1,"start_index":189332,"end_index":189334,"start_time_s":0.757328,"end_time_s":0.757336,"duration_s":8e-06},{"flag":3,"start_index":189334,"end_index":189851,"start_time_s":0.757336,"end_time_s":0.759404,"duration_s":0.002068},{"flag":1,"start_index":189851,"end_index":189913,"start_time_s":0.759404,"end_time_s":0.759652,"duration_s":0.000248},{"flag":2,"start_index":189913,"end_index":191999,"start_time_s":0.759652,"end_time_s":0.767996,"duration_s":0.008343999999999999},{"flag":1,"start_index":191999,"end_index":192001,"start_time_s":0.767996,"end_time_s":0.768004,"duration_s":8e-06},{"flag":3,"start_index":192001,"end_index":195964,"start_time_s":0.768004,"end_time_s":0.783856,"duration_s":0.015851999999999998},{"flag":1,"start_index":195964,"end_index":196026,"start_time_s":0.783856,"end_time_s":0.7841039999999999,"duration_s":0.000248},{"flag":2,"start_index":196026,"end_index":196959,"start_time_s":0.7841039999999999,"end_time_s":0.787836,"duration_s":0.0037319999999999996},{"flag":1,"start_index":196959,"end_index":196961,"start_time_s":0.787836,"end_time_s":0.787844,"duration_s":8e-06},{"flag":3,"start_index":196961,"end_index":196963,"start_time_s":0.787844,"end_time_s":0.787852,"duration_s":8e-06},{"flag":1,"start_index":196963,"end_index":197017,"start_time_s":0.787852,"end_time_s":0.788068,"duration_s":0.000216},{"flag":2,"start_index":197017,"end_index":197952,"start_time_s":0.788068,"end_time_s":0.791808,"duration_s":0.00374},{"flag":1,"start_index":197952,"end_index":197954,"start_time_s":0.791808,"end_time_s":0.791816,"duration_s":8e-06},{"flag":3,"start_index":197954,"end_index":197956,"start_time_s":0.791816,"end_time_s":0.791824,"duration_s":8e-06},{"flag":1,"start_index":197956,"end_index":198016,"start_time_s":0.791824,"end_time_s":0.792064,"duration_s":0.00023999999999999998},{"flag":2,"start_index":198016,"end_index":199999,"start_time_s":0.792064,"end_time_s":0.7999959999999999,"duration_s":0.007932},{"flag":1,"start_index":199999,"end_index":200001,"start_time_s":0.7999959999999999,"end_time_s":0.8000039999999999,"duration_s":8e-06},{"flag":3,"start_index":200001,"end_index":203524,"start_time_s":0.8000039999999999,"end_time_s":0.8140959999999999,"duration_s":0.014091999999999999},{"flag":1,"start_index":203524,"end_index":203586,"start_time_s":0.8140959999999999,"end_time_s":0.814344,"duration_s":0.000248},{"flag":2,"start_index":203586,"end_index":204524,"start_time_s":0.814344,"end_time_s":0.8180959999999999,"duration_s":0.0037519999999999997},{"flag":1,"start_index":204524,"end_index":204526,"start_time_s":0.8180959999999999,"end_time_s":0.8181039999999999,"duration_s":8e-06},{"flag":3,"start_index":204526,"end_index":206189,"start_time_s":0.8181039999999999,"end_time_s":0.8247559999999999,"duration_s":0.006652},{"flag":1,"start_index":206189,"end_index":206251,"start_time_s":0.8247559999999999,"end_time_s":0.825004,"duration_s":0.000248},{"flag":2,"start_index":206251,"end_index":207189,"start_time_s":0.825004,"end_time_s":0.8287559999999999,"duration_s":0.0037519999999999997},{"flag":1,"start_index":207189,"end_index":207192,"start_time_s":0.8287559999999999,"end_time_s":0.828768,"duration_s":1.2e-05},{"flag":3,"start_index":207192,"end_index":207714,"start_time_s":0.828768,"end_time_s":0.8308559999999999,"duration_s":0.002088},{"flag":1,"start_index":207714,"end_index":207776,"start_time_s":0.8308559999999999,"end_time_s":0.831104,"duration_s":0.000248},{"flag":2,"start_index":207776,"end_index":208715,"start_time_s":0.831104,"end_time_s":0.8348599999999999,"duration_s":0.003756},{"flag":1,"start_index":208715,"end_index":208717,"start_time_s":0.8348599999999999,"end_time_s":0.8348679999999999,"duration_s":8e-06},{"flag":3,"start_index":208717,"end_index":209224,"start_time_s":0.8348679999999999,"end_time_s":0.836896,"duration_s":0.002028},{"flag":1,"start_index":209224,"end_index":209285,"start_time_s":0.836896,"end_time_s":0.83714,"duration_s":0.000244},{"flag":2,"start_index":209285,"end_index":210665,"start_time_s":0.83714,"end_time_s":0.84266,"duration_s":0.00552},{"flag":1,"start_index":210665,"end_index":210667,"start_time_s":0.84266,"end_time_s":0.842668,"duration_s":8e-06},{"flag":3,"start_index":210667,"end_index":211197,"start_time_s":0.842668,"end_time_s":0.844788,"duration_s":0.00212},{"flag":1,"start_index":211197,"end_index":211258,"start_time_s":0.844788,"end_time_s":0.845032,"duration_s":0.000244},{"flag":2,"start_index":211258,"end_index":213332,"start_time_s":0.845032,"end_time_s":0.853328,"duration_s":0.008296},{"flag":1,"start_index":213332,"end_index":213334,"start_time_s":0.853328,"end_time_s":0.853336,"duration_s":8e-06},{"flag":3,"start_index":213334,"end_index":213853,"start_time_s":0.853336,"end_time_s":0.855412,"duration_s":0.0020759999999999997},{"flag":1,"start_index":213853,"end_index":213915,"start_time_s":0.855412,"end_time_s":0.85566,"duration_s":0.000248},{"flag":2,"start_index":213915,"end_index":215998,"start_time_s":0.85566,"end_time_s":0.863992,"duration_s":0.008331999999999999},{"flag":1,"start_index":215998,"end_index":216001,"start_time_s":0.863992,"end_time_s":0.864004,"duration_s":1.2e-05},{"flag":3,"start_index":216001,"end_index":216510,"start_time_s":0.864004,"end_time_s":0.8660399999999999,"duration_s":0.002036},{"flag":1,"start_index":216510,"end_index":216571,"start_time_s":0.8660399999999999,"end_time_s":0.8662839999999999,"duration_s":0.000244},{"flag":2,"start_index":216571,"end_index":218665,"start_time_s":0.8662839999999999,"end_time_s":0.87466,"duration_s":0.008376},{"flag":1,"start_index":218665,"end_index":218667,"start_time_s":0.87466,"end_time_s":0.874668,"duration_s":8e-06},{"flag":3,"start_index":218667,"end_index":222658,"start_time_s":0.874668,"end_time_s":0.890632,"duration_s":0.015964},{"flag":1,"start_index":222658,"end_index":222718,"start_time_s":0.890632,"end_time_s":0.890872,"duration_s":0.00023999999999999998},{"flag":2,"start_index":222718,"end_index":223652,"start_time_s":0.890872,"end_time_s":0.894608,"duration_s":0.0037359999999999997},{"flag":1,"start_index":223652,"end_index":223654,"start_time_s":0.894608,"end_time_s":0.894616,"duration_s":8e-06},{"flag":3,"start_index":223654,"end_index":223656,"start_time_s":0.894616,"end_time_s":0.894624,"duration_s":8e-06},{"flag":1,"start_index":223656,"end_index":223720,"start_time_s":0.894624,"end_time_s":0.89488,"duration_s":0.000256},{"flag":2,"start_index":223720,"end_index":224654,"start_time_s":0.89488,"end_time_s":0.898616,"duration_s":0.0037359999999999997},{"flag":1,"start_index":224654,"end_index":224656,"start_time_s":0.898616,"end_time_s":0.898624,"duration_s":8e-06},{"flag":3,"start_index":224656,"end_index":224658,"start_time_s":0.898624,"end_time_s":0.898632,"duration_s":8e-06},{"flag":1,"start_index":224658,"end_index":224723,"start_time_s":0.898632,"end_time_s":0.8988919999999999,"duration_s":0.00026},{"flag":2,"start_index":224723,"end_index":226665,"start_time_s":0.8988919999999999,"end_time_s":0.9066599999999999,"duration_s":0.007768},{"flag":1,"start_index":226665,"end_index":226667,"start_time_s":0.9066599999999999,"end_time_s":0.9066679999999999,"duration_s":8e-06},{"flag":3,"start_index":226667,"end_index":230253,"start_time_s":0.9066679999999999,"end_time_s":0.9210119999999999,"duration_s":0.014343999999999999},{"flag":1,"start_index":230253,"end_index":230450,"start_time_s":0.9210119999999999,"end_time_s":0.9218,"duration_s":0.000788},{"flag":2,"start_index":230450,"end_index":231390,"start_time_s":0.9218,"end_time_s":0.9255599999999999,"duration_s":0.00376},{"flag":1,"start_index":231390,"end_index":231392,"start_time_s":0.9255599999999999,"end_time_s":0.925568,"duration_s":8e-06},{"flag":3,"start_index":231392,"end_index":233053,"start_time_s":0.925568,"end_time_s":0.9322119999999999,"duration_s":0.006644},{"flag":1,"start_index":233053,"end_index":233115,"start_time_s":0.9322119999999999,"end_time_s":0.93246,"duration_s":0.000248},{"flag":2,"start_index":233115,"end_index":234054,"start_time_s":0.93246,"end_time_s":0.9362159999999999,"duration_s":0.003756},{"flag":1,"start_index":234054,"end_index":234056,"start_time_s":0.9362159999999999,"end_time_s":0.936224,"duration_s":8e-06},{"flag":3,"start_index":234056,"end_index":234579,"start_time_s":0.936224,"end_time_s":0.9383159999999999,"duration_s":0.002092},{"flag":1,"start_index":234579,"end_index":234640,"start_time_s":0.9383159999999999,"end_time_s":0.93856,"duration_s":0.000244},{"flag":2,"start_index":234640,"end_index":235580,"start_time_s":0.93856,"end_time_s":0.9423199999999999,"duration_s":0.00376},{"flag":1,"start_index":235580,"end_index":235582,"start_time_s":0.9423199999999999,"end_time_s":0.9423279999999999,"duration_s":8e-06},{"flag":3,"start_index":235582,"end_index":236105,"start_time_s":0.9423279999999999,"end_time_s":0.9444199999999999,"duration_s":0.002092},{"flag":1,"start_index":236105,"end_index":236167,"start_time_s":0.9444199999999999,"end_time_s":0.944668,"duration_s":0.000248},{"flag":2,"start_index":236167,"end_index":237332,"start_time_s":0.944668,"end_time_s":0.949328,"duration_s":0.00466},{"flag":1,"start_index":237332,"end_index":237334,"start_time_s":0.949328,"end_time_s":0.949336,"duration_s":8e-06},{"flag":3,"start_index":237334,"end_index":237872,"start_time_s":0.949336,"end_time_s":0.951488,"duration_s":0.002152},{"flag":1,"start_index":237872,"end_index":237934,"start_time_s":0.951488,"end_time_s":0.9517359999999999,"duration_s":0.000248},{"flag":2,"start_index":237934,"end_index":239998,"start_time_s":0.9517359999999999,"end_time_s":0.959992,"duration_s":0.008256},{"flag":1,"start_index":239998,"end_index":240001,"start_time_s":0.959992,"end_time_s":0.960004,"duration_s":1.2e-05},{"flag":3,"start_index":240001,"end_index":240530,"start_time_s":0.960004,"end_time_s":0.96212,"duration_s":0.002116},{"flag":1,"start_index":240530,"end_index":240592,"start_time_s":0.96212,"end_time_s":0.962368,"duration_s":0.000248},{"flag":2,"start_index":240592,"end_index":242665,"start_time_s":0.962368,"end_time_s":0.97066,"duration_s":0.008291999999999999},{"flag":1,"start_index":242665,"end_index":242667,"start_time_s":0.97066,"end_time_s":0.970668,"duration_s":8e-06},{"flag":3,"start_index":242667,"end_index":243186,"start_time_s":0.970668,"end_time_s":0.9727439999999999,"duration_s":0.0020759999999999997},{"flag":1,"start_index":243186,"end_index":243247,"start_time_s":0.9727439999999999,"end_time_s":0.972988,"duration_s":0.000244},{"flag":2,"start_index":243247,"end_index":245332,"start_time_s":0.972988,"end_time_s":0.981328,"duration_s":0.00834},{"flag":1,"start_index":245332,"end_index":245334,"start_time_s":0.981328,"end_time_s":0.981336,"duration_s":8e-06},{"flag":3,"start_index":245334,"end_index":249277,"start_time_s":0.981336,"end_time_s":0.997108,"duration_s":0.015771999999999998},{"flag":1,"start_index":249277,"end_index":249339,"start_time_s":0.997108,"end_time_s":0.9973559999999999,"duration_s":0.000248},{"flag":2,"start_index":249339,"end_index":250000,"start_time_s":0.9973559999999999,"end_time_s":1.0,"duration_s":0.002644}],"summary":{"flag_segment_stats":{"1":{"count":186,"min_s":8e-06,"max_s":0.000892,"mean_s":0.00014008602150537632,"median_s":0.000112,"p95_s":0.000248,"p99_s":0.0007778,"stddev_s":0.00015884093997834385,"total_s":0.026055999999999996},"2":{"count":93,"min_s":0.002644,"max_s":0.008383999999999999,"mean_s":0.005637978494623655,"median_s":0.004064,"p95_s":0.008352,"p99_s":0.00837664,"stddev_s":0.0021534076719673997,"total_s":0.5243319999999999},"3":{"count":93,"min_s":8e-06,"max_s":0.015964,"mean_s":0.004834537634408602,"median_s":0.0020959999999999998,"p95_s":0.0158256,"p99_s":0.01591984,"stddev_s":0.0055909193284070634,"total_s":0.449612}},"transition_counts":{"1->2":93,"1->3":93,"2->1":92,"3->1":93}}} diff --git a/code/docs/DrawDisplay_phase1_flag1.png b/code/docs/DrawDisplay_phase1_flag1.png deleted file mode 100644 index 5fe66b8..0000000 Binary files a/code/docs/DrawDisplay_phase1_flag1.png and /dev/null differ diff --git a/code/docs/DrawDisplay_phase1_flag2.png b/code/docs/DrawDisplay_phase1_flag2.png deleted file mode 100644 index 5840c15..0000000 Binary files a/code/docs/DrawDisplay_phase1_flag2.png and /dev/null differ diff --git a/code/docs/DrawDisplay_phase1_flag3.png b/code/docs/DrawDisplay_phase1_flag3.png deleted file mode 100644 index 25e736c..0000000 Binary files a/code/docs/DrawDisplay_phase1_flag3.png and /dev/null differ diff --git a/code/docs/DrawDisplay_phase1_timeline.png b/code/docs/DrawDisplay_phase1_timeline.png deleted file mode 100644 index 81f820a..0000000 Binary files a/code/docs/DrawDisplay_phase1_timeline.png and /dev/null differ diff --git a/code/src/BoardTest/TestDualClock/CLAUDE.md b/code/src/BoardTest/TestDualClock/CLAUDE.md index 06af87d..bbc8852 100644 --- a/code/src/BoardTest/TestDualClock/CLAUDE.md +++ b/code/src/BoardTest/TestDualClock/CLAUDE.md @@ -40,13 +40,13 @@ This validates the hardware configuration needed for full-duplex-capable VFO ope ## Key Functions -### `SetSSBRXVFOFrequency(int64_t frequency_dHz)` +### `SetSSBRXVFOFrequency(int64_t frequency_cHz)` Sets CLK0/CLK1 as quadrature outputs using PLLA. Uses phase offset method for frequencies above 3.2 MHz, and timed delay technique for lower frequencies. -### `SetSSBTXVFOFrequency(int64_t frequency_dHz)` +### `SetSSBTXVFOFrequency(int64_t frequency_cHz)` Sets CLK4/CLK5 as quadrature outputs using PLLB. Same quadrature generation techniques as RX. -### `SetCWTXVFOFrequency(int64_t frequency_dHz)` +### `SetCWTXVFOFrequency(int64_t frequency_cHz)` Sets CLK6 for CW transmission using standard Si5351 frequency setting. ### `EvenDivisor(int64_t freq2_Hz)` diff --git a/code/src/BoardTest/TestDualClock/TestDualClock.ino b/code/src/BoardTest/TestDualClock/TestDualClock.ino index 79ae241..f3edb23 100644 --- a/code/src/BoardTest/TestDualClock/TestDualClock.ino +++ b/code/src/BoardTest/TestDualClock/TestDualClock.ino @@ -41,9 +41,9 @@ Si5351 si5351; #define Si_5351_crystal 25000000L static int32_t txmultiple, oldtxMultiple; static int32_t rxmultiple, oldrxMultiple; -static int64_t SSBTXVFOFreq_dHz; -static int64_t SSBRXVFOFreq_dHz; -static int64_t CWTXVFOFreq_dHz; +static int64_t SSBTXVFOFreq_cHz; +static int64_t SSBRXVFOFreq_cHz; +static int64_t CWTXVFOFreq_cHz; void scanner(TwoWire *I2C) { byte error, address; @@ -160,15 +160,15 @@ int32_t EvenDivisor(int64_t freq2_Hz) { /** * Set the CLK0 and CLK1 outputs as quadrature outputs at the specified frequency. * - * @param frequency_dHz The desired clock frequency in (Hz * 100) + * @param frequency_cHz The desired clock frequency in (Hz * 100) */ -void SetSSBRXVFOFrequency(int64_t frequency_dHz){ +void SetSSBRXVFOFrequency(int64_t frequency_cHz){ // No need to change if it's already at this setting - if (frequency_dHz == SSBRXVFOFreq_dHz) return; + if (frequency_cHz == SSBRXVFOFreq_cHz) return; Serial.print("Setting RX to: "); - Serial.println(frequency_dHz/100); - SSBRXVFOFreq_dHz = frequency_dHz; - int64_t Clk1SetFreq = frequency_dHz; + Serial.println(frequency_cHz/100); + SSBRXVFOFreq_cHz = frequency_cHz; + int64_t Clk1SetFreq = frequency_cHz; rxmultiple = EvenDivisor(Clk1SetFreq / SI5351_FREQ_MULT); uint64_t pll_freq = Clk1SetFreq * rxmultiple; uint64_t freq = pll_freq / rxmultiple; @@ -214,15 +214,15 @@ void SetSSBRXVFOFrequency(int64_t frequency_dHz){ /** * Set the CLK4 and CLK5 outputs as quadrature outputs at the specified frequency. * - * @param frequency_dHz The desired clock frequency in (Hz * 100) + * @param frequency_cHz The desired clock frequency in (Hz * 100) */ -void SetSSBTXVFOFrequency(int64_t frequency_dHz){ +void SetSSBTXVFOFrequency(int64_t frequency_cHz){ // No need to change if it's already at this setting - if (frequency_dHz == SSBTXVFOFreq_dHz) return; + if (frequency_cHz == SSBTXVFOFreq_cHz) return; Serial.print("Setting TX to: "); - Serial.println(frequency_dHz/100); - SSBTXVFOFreq_dHz = frequency_dHz; - int64_t Clk5SetFreq = frequency_dHz; + Serial.println(frequency_cHz/100); + SSBTXVFOFreq_cHz = frequency_cHz; + int64_t Clk5SetFreq = frequency_cHz; txmultiple = EvenDivisor(Clk5SetFreq / SI5351_FREQ_MULT); uint64_t pll_freq = Clk5SetFreq * txmultiple; uint64_t freq = pll_freq / txmultiple; @@ -280,19 +280,19 @@ void SetSSBTXVFOFrequency(int64_t frequency_dHz){ * (e.g., centerFreq + 700Hz for a 700Hz tone). The tune state machine handles * this offset calculation. * - * @param frequency_dHz Desired CW VFO frequency in deca-Hertz (Hz × 100) + * @param frequency_cHz Desired CW VFO frequency in deca-Hertz (Hz × 100) * * @see GetCWVFOFrequency() to read current frequency * @see EnableCWVFOOutput() to enable CLK6 output * @see Tune.cpp for CW frequency offset handling */ -void SetCWTXVFOFrequency(int64_t frequency_dHz){ +void SetCWTXVFOFrequency(int64_t frequency_cHz){ // No need to change if it's already at this setting - if (frequency_dHz == CWTXVFOFreq_dHz) return; + if (frequency_cHz == CWTXVFOFreq_cHz) return; Serial.print("Setting CW to: "); - Serial.println(frequency_dHz/100); - CWTXVFOFreq_dHz = frequency_dHz; - si5351.set_freq(CWTXVFOFreq_dHz, SI5351_CLK6); + Serial.println(frequency_cHz/100); + CWTXVFOFreq_cHz = frequency_cHz; + si5351.set_freq(CWTXVFOFreq_cHz, SI5351_CLK6); } /** diff --git a/code/src/PhoenixSketch/BuildInfo.h b/code/src/PhoenixSketch/BuildInfo.h index be98509..a568a3d 100644 --- a/code/src/PhoenixSketch/BuildInfo.h +++ b/code/src/PhoenixSketch/BuildInfo.h @@ -2,14 +2,19 @@ * @file BuildInfo.h * @brief Build information automatically updated by git hooks * - * This file is automatically generated by the post-commit git hook. - * Do not edit manually - your changes will be overwritten. + * This file is automatically generated by the pre-commit git hook and is + * committed along with the change. Do not edit manually - your edits will be + * overwritten. + * + * GIT_COMMIT_HASH names the PARENT of the commit that contains this file. A + * commit cannot record its own hash, because the hash is derived from the tree + * that this file is part of. */ #ifndef BUILDINFO_H #define BUILDINFO_H -#define GIT_COMMIT_HASH "7ec824e" -#define BUILD_TIMESTAMP "2026-07-16 18:35:59" +#define GIT_COMMIT_HASH "ab69673" +#define BUILD_TIMESTAMP "2026-08-05 17:54:26" #endif // BUILDINFO_H diff --git a/code/src/PhoenixSketch/CAT.cpp b/code/src/PhoenixSketch/CAT.cpp index 6ef715c..08a38d8 100644 --- a/code/src/PhoenixSketch/CAT.cpp +++ b/code/src/PhoenixSketch/CAT.cpp @@ -20,8 +20,11 @@ If not, see . // Kenwood TS-480 CAT Interface (partial) // -// Note that this uses SerialUSB1 for the CAT interface at 38400 baud -// Configure the IDE to set Tools->USB Type to Dual Serial. +// Note that this uses CATSerial for the CAT interface at 38400 baud. +// CATSerial is SerialUSB1 normally, or the primary Serial in builds with +// a USB audio interface, which have only one CDC port (see SDT.h). +// Configure the IDE's Tools->USB Type to Dual Serial, or to Serial + MIDI + +// Audio if you want digital (USB audio) mode. // Uncomment to see CAT messages on the Serial Output //#define DEBUG_CAT @@ -78,6 +81,19 @@ char *VX_write( char* cmd ); char *VX_read( char* cmd ); char *ED_read( char* cmd ); char *PR_read( char* cmd); +char *SR_write( char* cmd ); +char *SR_read( char* cmd ); +char *DG_write( char* cmd ); +char *DG_read( char* cmd ); +char *DR_write( char* cmd ); +char *DR_read( char* cmd ); +char *DS_read( char* cmd ); +char *CF_write( char* cmd ); +char *CF_read( char* cmd ); +char *EQ_write( char* cmd ); +char *EQ_read( char* cmd ); +char *FL_write( char* cmd ); +char *FL_read( char* cmd ); typedef struct { char name[3]; //two chars plus zero terminator @@ -90,7 +106,15 @@ typedef struct { // The command_parser will compare the CAT command received against the entires in // this array. If it matches, then it will call the corresponding write_function // or the read_function, depending on the length of the command string. -#define NUM_SUPPORTED_COMMANDS 25 +// Note on set_len / read_len: command_parser() tests the write form FIRST, so a +// command whose two lengths are equal can never reach its read function. Keep +// them distinct for anything that needs to be readable. +// +// Note on optional parameters: a command whose parameter the spec allows to be +// omitted is expressed by putting the *write* function in BOTH slots, with +// set_len covering the parameterised form and read_len the bare one. TX and RX +// below are the only such commands. Do not "fix" them by writing a read handler. +#define NUM_SUPPORTED_COMMANDS 32 valid_command valid_commands[ NUM_SUPPORTED_COMMANDS ] = { { "AG", 3+4,4, AG_write, AG_read }, //audio gain @@ -102,7 +126,7 @@ valid_command valid_commands[ NUM_SUPPORTED_COMMANDS ] = { "FB", 3+11,3, FB_write, FB_read }, //VFO B { "FR", 3+1, 3, FR_write, FR_read }, // selects or reads the VFO of the receiver { "FT", 3+1, 3, FT_write, FT_read }, // selects or reads the VFO of the transmitter - { "FW", 3+4,3+4,FW_write, FW_read }, // DSP filter bandwidth + { "FW", 3+4,3, FW_write, FW_read }, // DSP filter bandwidth (high cut) { "ID", 0, 3, unsupported_cmd, ID_read }, // RADIO ID#, read-only { "IF", 0, 3, unsupported_cmd, IF_read }, //radio status, read-only { "KS", 3+1,3, KS_write, KS_read }, // keyer speed @@ -113,11 +137,26 @@ valid_command valid_commands[ NUM_SUPPORTED_COMMANDS ] = { "PC", 3+3,3, PC_write, PC_read }, // output power { "PD", 0, 3, unsupported_cmd, PD_read }, // read the PSD -- NOT a Kenwood keyword { "PS", 3+1,3, PS_write, PS_read }, // Rig power on/off - { "RX", 3, 0, RX_write, unsupported_cmd }, // Receiver function 0=main 1=sub - { "TX", 3, 0, TX_write, unsupported_cmd }, // set transceiver to transmit. + // RX; unkeys; RX0;/RX1; (main/sub receiver) are accepted too and behave + // identically - Phoenix has one receiver. Both forms are writes. + { "RX", 3+1,3, RX_write, RX_write }, // Receiver function 0=main 1=sub + // TX; keys, and so do TX0; (normal/MIC), TX1; (DTS via ANI input) and + // TX2; (TX Tune): ts_480_pc.pdf p.21 makes P1 optional and defaults it + // to 0. Both forms are writes - a bare TX; is a set, not a read - and + // TX_write ignores P1, so every form keys identically. Hamlib picks + // between them by PTT type (TX; / TX0; / TX1;), so a client that only + // sends one of them must not be turned away. + { "TX", 3+1,3, TX_write, TX_write }, // set transceiver to transmit. { "VX", 3+1, 3, VX_write, VX_read }, // VOX write/read { "ED", 0, 3, unsupported_cmd, ED_read }, // print out the state of the EEPROM data -- NOT a Kenwood keyword - { "PR", 0, 3, unsupported_cmd, PR_read } // print out the state of the hardware register -- NOT a Kenwood keyword + { "PR", 0, 3, unsupported_cmd, PR_read }, // print out the state of the hardware register -- NOT a Kenwood keyword + { "SR", 3+1,3, SR_write, SR_read }, // sample rate 0=176.4k 1=192k -- NOT a Kenwood keyword + { "CF", 3+1,3, CF_write, CF_read }, // receive CW audio filter index -- NOT a Kenwood keyword + { "EQ", 3+5,3+2, EQ_write, EQ_read }, // receive equalizer cell -- NOT a Kenwood keyword + { "FL", 3+4,3, FL_write, FL_read }, // DSP filter low cut -- NOT a Kenwood keyword + { "DG", 3+1,3, DG_write, DG_read }, // digital (USB audio) mode 0=off 1=on -- NOT a Kenwood keyword + { "DR", 3+3,3, DR_write, DR_read }, // digital receive level 000-100 -- NOT a Kenwood keyword + { "DS", 0, 3, unsupported_cmd, DS_read } // digital TX path stats, read-only -- NOT a Kenwood keyword }; /** @@ -412,7 +451,7 @@ char *IF_read( char* cmd ){ ){ mode = 3; }else{ - switch( bands[ ED.currentBand[ED.activeVFO] ].mode ){ + switch( ED.modulation[ED.activeVFO] ){ // current modulation, not the band default case LSB: mode = 1; // LSB break; @@ -429,7 +468,9 @@ char *IF_read( char* cmd ){ } } uint8_t rxtx; - if ((modeSM.state_id == ModeSm_StateId_CW_RECEIVE) | (modeSM.state_id == ModeSm_StateId_SSB_RECEIVE)){ + if ((modeSM.state_id == ModeSm_StateId_CW_RECEIVE) | + (modeSM.state_id == ModeSm_StateId_DIGITAL_RECEIVE) | + (modeSM.state_id == ModeSm_StateId_SSB_RECEIVE)){ rxtx = 0; } else { rxtx = 1; @@ -477,37 +518,71 @@ char *KS_write( char* cmd ){ } /** - * CAT command MD - Set operating mode (LSB, USB, CW, AM) - * @param cmd CAT command string with mode number: 1=LSB, 2=USB, 3=CW, 5=AM + * Select the demodulator. + * + * Writes ED.modulation[] and nothing else. bands[].mode is the band's *default* + * modulation and must stay put: InitFilterMask() mirrors the band's stored + * passband whenever the current modulation differs from that default, and that + * mirroring is the only thing that produces the opposite sideband. + * + * Writing bands[].mode here used to look like "keeping the two copies in step", + * but it is what selected the wrong sideband. Setting the default equal to the + * newly requested modulation removes the disagreement, so the mirroring stops and + * the band-default passband comes back. On 40 m (default LSB) `MD2;` - select USB + * - therefore switched the radio to LSB, while the display, which reads + * ED.modulation[], went on saying USB. This now matches the front panel's + * DEMODULATION button, which has always written ED.modulation[] alone. + * + * Also leaves CW receive if that is where we are: the mode state machine has no + * other CAT-reachable path back to SSB. + * + * Digital mode is deliberately NOT left here. WSJT-X and similar clients send + * `MD2;` to force USB on startup and before every transmission, so treating a + * modulation change as a request to leave digital mode would make the mode + * impossible to hold. Use `DG0;` or the front panel MODE button to leave it. + * + * @param mode The modulation to select + */ +static void SetModulation(ModulationType mode){ + if (modeSM.state_id == ModeSm_StateId_CW_RECEIVE){ + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_SSB_MODE); + } + ED.modulation[ED.activeVFO] = mode; + SetInterrupt(iMODE); +} + +/** + * CAT command MD - Set operating mode + * @param cmd CAT command string with mode number: 1=LSB, 2=USB, 3=CW, 4=AM, 5=SAM * @return Empty string */ char *MD_write( char* cmd ){ int p1 = atoi( &cmd[2] ); switch( p1 ){ case 1: // LSB - bands[ ED.currentBand[ED.activeVFO] ].mode = LSB; - SetInterrupt(iMODE); + SetModulation(LSB); break; case 2: // USB - bands[ ED.currentBand[ED.activeVFO] ].mode = USB; - SetInterrupt(iMODE); + SetModulation(USB); break; case 3: // CW - // Change to CW mode if in SSB receive mode, otherwise ignore: - if (modeSM.state_id == ModeSm_StateId_SSB_RECEIVE){ + // Change to CW mode if in a non-CW receive mode, otherwise ignore: + if ((modeSM.state_id == ModeSm_StateId_SSB_RECEIVE) || + (modeSM.state_id == ModeSm_StateId_DIGITAL_RECEIVE)){ if( ED.currentBand[ED.activeVFO] < BAND_30M ){ - bands[ ED.currentBand[ED.activeVFO] ].mode = LSB; + SetModulation(LSB); }else{ - bands[ ED.currentBand[ED.activeVFO] ].mode = USB; + SetModulation(USB); } ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_CW_MODE); - SetInterrupt(iMODE); } break; - case 5: // AM - bands[ ED.currentBand[ED.activeVFO] ].mode = SAM; // default to SAM rather than AM - SetInterrupt(iMODE); + case 4: // AM + SetModulation(AM); + break; + case 5: // SAM + SetModulation(SAM); break; default: break; @@ -528,10 +603,13 @@ char *MD_read( char* cmd ){ ( modeSM.state_id == ModeSm_StateId_CW_TRANSMIT_KEYER_WAIT ) | ( modeSM.state_id == ModeSm_StateId_CW_TRANSMIT_MARK ) | ( modeSM.state_id == ModeSm_StateId_CW_TRANSMIT_SPACE ) ){ sprintf( obuf, "MD3;" ); return obuf; } - if( bands[ ED.currentBand[ED.activeVFO] ].mode == LSB ){ sprintf( obuf, "MD1;" ); return obuf; } - if( bands[ ED.currentBand[ED.activeVFO] ].mode == USB ){ sprintf( obuf, "MD2;" ); return obuf; } - if( bands[ ED.currentBand[ED.activeVFO] ].mode == AM ){ sprintf( obuf, "MD5;" ); return obuf; } - if( bands[ ED.currentBand[ED.activeVFO] ].mode == SAM ){ sprintf( obuf, "MD5;" ); return obuf; } + // ED.modulation[] is the current modulation; bands[].mode is only the band + // default, and reporting that told CAT clients the wrong sideband whenever + // the operator had selected the non-default one. + if( ED.modulation[ED.activeVFO] == LSB ){ sprintf( obuf, "MD1;" ); return obuf; } + if( ED.modulation[ED.activeVFO] == USB ){ sprintf( obuf, "MD2;" ); return obuf; } + if( ED.modulation[ED.activeVFO] == AM ){ sprintf( obuf, "MD4;" ); return obuf; } + if( ED.modulation[ED.activeVFO] == SAM ){ sprintf( obuf, "MD5;" ); return obuf; } sprintf( obuf, "?;"); return obuf; //Huh? How'd we get here? } @@ -689,6 +767,7 @@ char *PS_read( char* cmd ){ */ char *RX_write( char* cmd ){ switch (modeSM.state_id){ + case (ModeSm_StateId_DIGITAL_TRANSMIT): case (ModeSm_StateId_SSB_TRANSMIT):{ ModeSm_dispatch_event(&modeSM, ModeSm_EventId_PTT_RELEASED); break; @@ -710,6 +789,7 @@ char *RX_write( char* cmd ){ */ char *TX_write( char* cmd ){ switch (modeSM.state_id){ + case (ModeSm_StateId_DIGITAL_RECEIVE): case (ModeSm_StateId_SSB_RECEIVE):{ ModeSm_dispatch_event(&modeSM, ModeSm_EventId_PTT_PRESSED); break; @@ -758,19 +838,313 @@ char *PR_read( char* cmd ){ return obuf; } +/** Sample rates reachable over CAT, in the order the SR parameter selects them. + * These are the two rates the front panel menu offers. */ +static const uint8_t SR_CAT_RATES[2] = { SAMPLE_RATE_176K, SAMPLE_RATE_192K }; +#define SR_CAT_RATE_COUNT 2 + +/** + * CAT command SR - set the sample rate (non-standard Kenwood command) + * + * `SR0;` selects 176.4 ksps, `SR1;` selects 192 ksps. Rejected while transmitting, + * because ChangeSampleRate() reconfigures the I2S clock and rebuilds the whole + * DSP chain. + * + * @param cmd CAT command string + * @return Empty string on success, "?;" if the rate is out of range or the radio is not receiving + */ +char *SR_write( char* cmd ){ + int p1 = cmd[2] - '0'; + if( p1 < 0 || p1 >= SR_CAT_RATE_COUNT ){ + sprintf( obuf, "?;"); + return obuf; + } + // Only while receiving, and never in digital mode: that mode pins the radio + // at 176.4 ksps so the USB audio endpoint's 44.1 kHz needs no resampling. + if( modeSM.state_id != ModeSm_StateId_SSB_RECEIVE && + modeSM.state_id != ModeSm_StateId_CW_RECEIVE ){ + sprintf( obuf, "?;"); + return obuf; + } + ChangeSampleRate( SR_CAT_RATES[ p1 ] ); + return empty_string_p; +} + +/** + * CAT command SR - read the sample rate (non-standard Kenwood command) + * @param cmd CAT command string + * @return Response "SRn;" where n indexes SR_CAT_RATES, or "?;" if the radio is at some other rate + */ +char *SR_read( char* cmd ){ + for( int i = 0; i < SR_CAT_RATE_COUNT; i++ ){ + if( SampleRate == SR_CAT_RATES[ i ] ){ + sprintf( obuf, "SR%d;", i); + return obuf; + } + } + sprintf( obuf, "?;"); + return obuf; +} + +/** + * CAT command DG - enter or leave digital (USB audio) mode (non-standard Kenwood command) + * + * `DG1;` enters digital mode, `DG0;` returns to SSB. Entering forces the radio to + * 176.4 ksps and starts the USB audio link; leaving restores the previous rate. + * + * Only accepted from a receive state, because the mode change reconfigures the + * I2S clock and rebuilds the DSP chain. Rejected outright in builds without a + * USB audio interface, where digital mode has no transport. + * + * @param cmd CAT command string + * @return Empty string on success, "?;" if the parameter is out of range, the + * radio is not receiving, or USB audio is not compiled in + */ +char *DG_write( char* cmd ){ + int p1 = cmd[2] - '0'; + if( p1 < 0 || p1 > 1 ){ + sprintf( obuf, "?;"); + return obuf; + } +#ifndef AUDIO_INTERFACE + sprintf( obuf, "?;"); + return obuf; +#else + if( p1 == 1 ){ + if( modeSM.state_id != ModeSm_StateId_SSB_RECEIVE && + modeSM.state_id != ModeSm_StateId_CW_RECEIVE && + modeSM.state_id != ModeSm_StateId_DIGITAL_RECEIVE ){ + sprintf( obuf, "?;"); + return obuf; + } + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + } else { + if( modeSM.state_id != ModeSm_StateId_DIGITAL_RECEIVE ){ + // Already out of digital mode, or transmitting - nothing to do + if( modeSM.state_id == ModeSm_StateId_DIGITAL_TRANSMIT ){ + sprintf( obuf, "?;"); + return obuf; + } + return empty_string_p; + } + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_SSB_MODE); + } + UpdateRFHardwareState(); + return empty_string_p; +#endif +} + +/** + * CAT command DG - read whether digital (USB audio) mode is active + * @param cmd CAT command string + * @return Response "DG1;" in digital mode, "DG0;" otherwise + */ +char *DG_read( char* cmd ){ + if( modeSM.state_id == ModeSm_StateId_DIGITAL_RECEIVE || + modeSM.state_id == ModeSm_StateId_DIGITAL_TRANSMIT ){ + sprintf( obuf, "DG1;"); + } else { + sprintf( obuf, "DG0;"); + } + return obuf; +} + +/** + * CAT command DR - set the digital-mode receive level (non-standard Kenwood command) + * + * `DR000;` to `DR100;` scale the audio sent to the host over USB. The receive + * chain does not regulate this level for us - with AGC off the AGC stage applies + * a fixed gain of 20 - so a strong signal will otherwise reach full scale and + * clip. The default of 25 is -12 dB. + * + * @param cmd CAT command string + * @return Empty string on success, "?;" if the level is out of range + */ +char *DR_write( char* cmd ){ + int32_t level = atoi( &cmd[2] ); + if( level < 0 || level > 100 ){ + sprintf( obuf, "?;"); + return obuf; + } + ED.digitalRxLevel = level; + return empty_string_p; +} + +/** + * CAT command DR - read the digital-mode receive level (non-standard Kenwood command) + * @param cmd CAT command string + * @return Response "DRnnn;" with the level from 000 to 100 + */ +char *DR_read( char* cmd ){ + sprintf( obuf, "DR%03ld;", (long)ED.digitalRxLevel); + return obuf; +} + +/** + * CAT command DS - read the digital transmit path health counters (non-standard) + * + * Returns "DS,,,,;". The counters + * reset when digital mode is entered. Both an underrun and a trim splice + * discontinuous audio into the transmit stream, which lands on the air as + * sidebands at the 128-sample block rate. + * + * @param cmd CAT command string + * @return Response with the five counters + */ +char *DS_read( char* cmd ){ + uint32_t calls=0, under=0, trim=0; + uint8_t dmin=0, dmax=0; + USBAudioGetTxStats(&calls, &under, &trim, &dmin, &dmax); + sprintf( obuf, "DS%lu,%lu,%lu,%u,%u;", (unsigned long)calls, (unsigned long)under, + (unsigned long)trim, (unsigned)dmin, (unsigned)dmax); + return obuf; +} + +/** + * CAT command CF - select the receive CW audio filter (non-standard Kenwood command) + * + * `CF0;` through `CF4;` select the five CW bandwidths (840, 1080, 1320, 1800 and + * 2000 Hz); `CF5;` bypasses the filter. + * + * @param cmd CAT command string + * @return Empty string on success, "?;" if the index is out of range + */ +char *CF_write( char* cmd ){ + int p1 = cmd[2] - '0'; + if( p1 < 0 || p1 > 5 ){ + sprintf( obuf, "?;"); + return obuf; + } + ED.CWFilterIndex = p1; + return empty_string_p; +} + +/** + * CAT command CF - read the receive CW audio filter index (non-standard Kenwood command) + * @param cmd CAT command string + * @return Response "CFn;" + */ +char *CF_read( char* cmd ){ + sprintf( obuf, "CF%ld;", (long)ED.CWFilterIndex); + return obuf; +} + +/** + * CAT command EQ - set one receive equalizer cell (non-standard Kenwood command) + * + * `EQbbvvv;` where bb is the cell index 00..13 and vvv is the level 000..100. + * + * @param cmd CAT command string + * @return Empty string on success, "?;" if the cell index or level is out of range + */ +char *EQ_write( char* cmd ){ + char idxbuf[3] = { cmd[2], cmd[3], '\0' }; + int band = atoi( idxbuf ); + int value = atoi( &cmd[4] ); + if( band < 0 || band >= EQUALIZER_CELL_COUNT || value < 0 || value > 100 ){ + sprintf( obuf, "?;"); + return obuf; + } + ED.equalizerRec[ band ] = value; + return empty_string_p; +} + +/** + * CAT command EQ - read one receive equalizer cell (non-standard Kenwood command) + * @param cmd CAT command string + * @return Response "EQbbvvv;", or "?;" if the cell index is out of range + */ +char *EQ_read( char* cmd ){ + char idxbuf[3] = { cmd[2], cmd[3], '\0' }; + int band = atoi( idxbuf ); + if( band < 0 || band >= EQUALIZER_CELL_COUNT ){ + sprintf( obuf, "?;"); + return obuf; + } + sprintf( obuf, "EQ%02d%03ld;", band, (long)ED.equalizerRec[ band ]); + return obuf; +} + +/** + * CAT command FL - set the DSP filter low cut (non-standard Kenwood command) + * + * The mirror of FW, which moves the other edge: on USB/AM/SAM this moves + * FLoCut_Hz, on LSB it moves FHiCut_Hz. The value is always the magnitude of the + * edge frequency, as it is for FW. + * + * @param cmd CAT command string + * @return Empty string + */ +char *FL_write( char* cmd ){ + int32_t g = atoi( &cmd[2] ); + switch (bands[ED.currentBand[ED.activeVFO]].mode) { + case LSB:{ + // On LSB the passband is negative, so the low cut is the high edge. + if (g < -bands[ED.currentBand[ED.activeVFO]].FLoCut_Hz) + bands[ED.currentBand[ED.activeVFO]].FHiCut_Hz = -g; + break; + } + case AM: + case SAM: + case USB:{ + if (g < bands[ED.currentBand[ED.activeVFO]].FHiCut_Hz) + bands[ED.currentBand[ED.activeVFO]].FLoCut_Hz = g; + break; + } + case IQ: + case DCF77: + break; + } + UpdateFIRFilterMask(&RXfilters); + return empty_string_p; +} + +/** + * CAT command FL - read the DSP filter low cut (non-standard Kenwood command) + * @param cmd CAT command string + * @return Response "FLnnnn;" + */ +char *FL_read( char* cmd ){ + int32_t flow = 0; + switch (bands[ED.currentBand[ED.activeVFO]].mode) { + case LSB:{ + flow = -bands[ED.currentBand[ED.activeVFO]].FHiCut_Hz; + break; + } + case AM: + case SAM: + case USB:{ + flow = bands[ED.currentBand[ED.activeVFO]].FLoCut_Hz; + break; + } + case IQ: + case DCF77: + break; + } + sprintf( obuf, "FL%04ld;", (long)flow); + return obuf; +} + /** - * Poll SerialUSB1 for incoming CAT commands and process them + * Poll the CAT serial port for incoming CAT commands and process them * * Reads characters from the CAT serial port, buffers them until a semicolon * terminator is received, then parses and executes the command via command_parser(). - * Sends response back over SerialUSB1. Handles buffer overflow by clearing the buffer. + * Sends response back over the same port. Handles buffer overflow by clearing the buffer. + * + * A newline terminator instead means the buffered bytes are not CAT traffic, since + * no Kenwood command contains one. In a build with a USB audio interface this port + * is also the only CDC port, so that is how a PJRC time-sync packet arrives; it is + * handed to ApplyTimeSyncDigits(). Any other newline-terminated run of bytes is + * dropped. Both cases exist to keep foreign bytes from being prepended to the next + * real command, which would turn it into "?;". */ void CheckForCATSerialEvents(void){ int i; char c; - while( ( i = SerialUSB1.available() ) > 0 ){ - c = ( char )SerialUSB1.read(); + while( ( i = CATSerial.available() ) > 0 ){ + c = ( char )CATSerial.read(); i--; catCommand[ catCommandIndex ] = c; #ifdef DEBUG_CAT @@ -795,21 +1169,33 @@ void CheckForCATSerialEvents(void){ #endif // DEBUG_CAT int i = 0; while( parser_output[i] != '\0' ){ - if( SerialUSB1.availableForWrite() > 0 ){ - SerialUSB1.print( parser_output[i] ); + if( CATSerial.availableForWrite() > 0 ){ + CATSerial.print( parser_output[i] ); #ifdef DEBUG_CAT Serial.print( parser_output[i] ); #endif i++; }else{ - SerialUSB1.flush(); + CATSerial.flush(); } } - SerialUSB1.flush(); + CATSerial.flush(); #ifdef DEBUG_CAT Serial.println(); #endif // DEBUG_CAT } + }else if( c == '\n' || c == '\r' ){ + // Not CAT: no Kenwood command contains a newline. On a single-port + // build (USB audio, where CATSerial is Serial) this is how a PJRC + // time-sync packet arrives - 'T' + 10 digits + '\n' - because this + // reader drains the port before CheckForSerialTimeSync() could see + // it. Hand the digits over; anything else newline-terminated is + // discarded rather than left to corrupt the next real command. + if( catCommand[0] == 'T' && catCommandIndex > 0 ){ + ApplyTimeSyncDigits( &catCommand[1], (uint8_t)(catCommandIndex - 1) ); + } + catCommandIndex = 0; + memset( catCommand, 0, sizeof( catCommand )); }else{ catCommandIndex++; if( catCommandIndex >= 128 ){ @@ -848,8 +1234,13 @@ char *command_parser( char* command ){ char* (*read_function)(char*); read_function = valid_commands[i].read_function; - if( command[ write_params_len - 1 ] == ';' ) return ( *write_function )( command ); - if( command[ read_params_len - 1 ] == ';' ) return ( *read_function )( command ); + // A zero length means the command has no form of that kind (a + // read-only command has set_len 0, a write-only one read_len 0). + // Skip the test rather than indexing command[-1], which reads off + // the front of catCommand and makes dispatch depend on whatever + // static happens to precede it. + if( write_params_len > 0 && command[ write_params_len - 1 ] == ';' ) return ( *write_function )( command ); + if( read_params_len > 0 && command[ read_params_len - 1 ] == ';' ) return ( *read_function )( command ); // Wrong length for read OR write. No semicolon in the right places sprintf( obuf, "?;"); return obuf; diff --git a/code/src/PhoenixSketch/CAT.h b/code/src/PhoenixSketch/CAT.h index 026d722..bf88997 100644 --- a/code/src/PhoenixSketch/CAT.h +++ b/code/src/PhoenixSketch/CAT.h @@ -22,8 +22,8 @@ If not, see . /** * @brief Poll and process CAT (Computer Aided Transceiver) serial commands - * @note Called from main loop to handle Kenwood TS-2000 protocol commands - * @note Reads from SerialUSB1, buffers until semicolon terminator, parses and executes + * @note Called from main loop to handle Kenwood TS-480 protocol commands + * @note Reads from CATSerial, buffers until semicolon terminator, parses and executes * @note Supports frequency control, mode changes, power settings, and debugging commands * @note Requires Tools->USB Type set to Dual Serial in Arduino IDE */ diff --git a/code/src/PhoenixSketch/Config.h b/code/src/PhoenixSketch/Config.h index 6ec474d..ac8124b 100644 --- a/code/src/PhoenixSketch/Config.h +++ b/code/src/PhoenixSketch/Config.h @@ -43,6 +43,15 @@ If not, see . #define ENCODER_FACTOR 0.25F // use 0.25f with cheap encoders that have 4 detents per step, // for other encoders or libs we use 1.0f +// When the Center Tune or Fine Tune encoders are spun rapidly, the VFO is +// reprogrammed every loop, which produces audible glitches and a jerky spectrum +// sweep. Enabling MUTE_ON_RAPID_TUNE hides those artifacts: while rapid tuning is +// detected the output audio is muted and the spectrum/waterfall redraw is paused, +// both resuming automatically once tuning stops. Comment out to disable. +#define MUTE_ON_RAPID_TUNE +#define RAPID_TUNE_ENGAGE_MS 60 // gap (ms) below this between tune events = "spinning" +#define RAPID_TUNE_RELEASE_MS 180 // no tune event for this long (ms) = "done spinning" + // Direct coupled transmit //#define DIRECT_COUPLED_TX diff --git a/code/src/PhoenixSketch/DSP.cpp b/code/src/PhoenixSketch/DSP.cpp index 897508b..7dd0914 100644 --- a/code/src/PhoenixSketch/DSP.cpp +++ b/code/src/PhoenixSketch/DSP.cpp @@ -44,11 +44,13 @@ void PerformSignalProcessing(void){ case (ModeSm_StateId_CALIBRATE_FREQUENCY): case (ModeSm_StateId_CALIBRATE_RX_IQ): case (ModeSm_StateId_SSB_RECEIVE): + case (ModeSm_StateId_DIGITAL_RECEIVE): case (ModeSm_StateId_CW_RECEIVE):{ ReceiveProcessing(nullptr); break; } case (ModeSm_StateId_CALIBRATE_OFFSET_MARK): + case (ModeSm_StateId_DIGITAL_TRANSMIT): case (ModeSm_StateId_SSB_TRANSMIT):{ TransmitProcessing(nullptr); if (HasDualVFOs()) @@ -71,6 +73,7 @@ void PerformSignalProcessing(void){ case (ModeSm_StateId_CALIBRATE_POWER_MARK): case (ModeSm_StateId_CALIBRATE_OFFSET_MARK): case (ModeSm_StateId_CALIBRATE_TX_IQ_MARK): + case (ModeSm_StateId_DIGITAL_TRANSMIT): case (ModeSm_StateId_SSB_TRANSMIT): case (ModeSm_StateId_CW_TRANSMIT_MARK): case (ModeSm_StateId_CW_TRANSMIT_DIT_MARK): @@ -625,7 +628,6 @@ float32_t GetSAMCarrierOffset(void){ * * @param data Pointer to the DataBlock to act upon */ -static float32_t wold = 0; void Demodulate(DataBlock *data, ReceiveFilterConfig *RXfilters){ // Demodulation: our time domain output is a combination of the real part (left channel) // AND the imaginary part (right channel) of the second half of the FFT_buffer @@ -651,9 +653,10 @@ void Demodulate(DataBlock *data, ReceiveFilterConfig *RXfilters){ if (isnan(audiotmp)){ audiotmp = 0.0; } - w = audiotmp + wold * 0.99f; // Response to below 200Hz - data->I[i] = w - wold; - wold = w; + // One pole DC blocker, cornered at RXfilters->amDCBlockCorner_Hz. + w = audiotmp + RXfilters->amDCBlockState * RXfilters->amDCBlockPole; + data->I[i] = w - RXfilters->amDCBlockState; + RXfilters->amDCBlockState = w; } arm_biquad_cascade_df1_f32(&RXfilters->biquadAudioLowPass, data->I, data->Q, data->N); arm_copy_f32(data->Q, data->I, data->N); @@ -700,6 +703,13 @@ void InterpolateReceiveData(DataBlock *data, ReceiveFilterConfig *RXfilters){ arm_fir_interpolate_f32(&RXfilters->FIR_int1, data->I, data->Q, READ_BUFFER_SIZE / RXfilters->DF); data->N = data->N * RXfilters->DF2; data->sampleRate_Hz = data->sampleRate_Hz * RXfilters->DF2; + // Sample rate is now Fs/4, which at the 176.4 ksps that DIGITAL mode forces + // is exactly 44,100 Hz - the native rate of the USB audio endpoint - and the + // block is exactly 512 samples. Tap the audio for the host here, before + // AdjustVolume(), so the level sent to the PC is independent of the + // front-panel volume knob. + if (modeSM.state_id == ModeSm_StateId_DIGITAL_RECEIVE) + USBAudioWriteRx(data->Q, data->N); arm_fir_interpolate_f32(&RXfilters->FIR_int2, data->Q, data->I, READ_BUFFER_SIZE / RXfilters->DF1); data->N = data->N * RXfilters->DF1; data->sampleRate_Hz = data->sampleRate_Hz * RXfilters->DF1; @@ -719,7 +729,15 @@ float32_t VolumeToAmplification(int32_t volume) { * Adjust the volume */ void AdjustVolume(DataBlock *data, ReceiveFilterConfig *RXfilters){ - arm_scale_f32(data->I, RXfilters->DF * VolumeToAmplification(ED.audioVolume), data->I, data->N); + float32_t gain = RXfilters->DF * VolumeToAmplification(ED.audioVolume); +#ifdef MUTE_ON_RAPID_TUNE + // Mute the output while a tune encoder is being spun fast, so the rapid VFO + // reprogramming is not heard as audio glitches. Resumes automatically when + // tuning stops (see IsRapidTuning() in Loop.cpp). + if (IsRapidTuning()) + gain = 0.0f; +#endif + arm_scale_f32(data->I, gain, data->I, data->N); } /** @@ -742,6 +760,10 @@ void PlayBuffer(DataBlock *data){ * 2) Configure the AGC * 3) Configure the noise reduction * 4) Set all arrays in DMAMEM to zero before using them + * + * InitializeFilters() and InitializeTransmitFilters() regenerate the + * sample-rate-dependent coefficient tables as their first step, so calling this + * after a rate change is all that is needed to retune the whole chain. */ void InitializeSignalProcessing(void){ InitializeFilters(ED.spectrum_zoom,&RXfilters); @@ -889,7 +911,9 @@ DataBlock * ReceiveProcessing(const char *fname){ // x + shift Hz after this step. float32_t sideToneShift_Hz = 0; if (modeSM.state_id == ModeSm_StateId_CW_RECEIVE ) { - if (bands[ED.currentBand[ED.activeVFO]].mode == 1) { + // Which way the sidetone offset goes follows the CURRENT modulation, not + // the band default (LSB is ModulationType 1; spelling it out here). + if (ED.modulation[ED.activeVFO] == LSB) { sideToneShift_Hz = CWToneOffsetsHz[ED.CWToneIndex]; } else { sideToneShift_Hz = -CWToneOffsetsHz[ED.CWToneIndex]; @@ -1106,6 +1130,59 @@ void TXGain(DataBlock *data){ arm_scale_f32(data->I, amp_factor, data->I, data->N); } +/** + * Read a block of transmit audio from the USB audio link for digital mode. + * + * The microphone queues are still what paces this: they fill from the I2S DMA at + * exactly the rate the transmit DAC drains, so gating on them keeps + * TransmitProcessing() locked to the I2S clock. The samples themselves are + * discarded - the audio comes from the host instead. Letting the host's USB + * clock pace the DSP loop is what starved the transmit output queue in earlier + * attempts at this feature. + * + * Produces 512 samples at Fs/4, which is 44,100 Hz at the 176.4 ksps that + * digital mode forces, so the chain is entered one stage down - after + * TXDecimateBy4() rather than before it. + * + * @param data Block to fill; I and Q both receive the (mono) transmit audio + * @return ESUCCESS if a block was produced, EFAIL if the I2S clock has not ticked + */ +errno_t ReadUSBTransmitBuffer(DataBlock *data){ + if ((uint32_t)Q_in_L_Ex.available() <= N_BLOCKS_EX || (uint32_t)Q_in_R_Ex.available() <= N_BLOCKS_EX) + return EFAIL; + + // Drain the microphone blocks we are using purely as a clock. No conversion, + // the samples are not wanted. + for (unsigned i = 0; i < N_BLOCKS_EX; i++) { + Q_in_L_Ex.readBuffer(); + Q_in_R_Ex.readBuffer(); + Q_in_L_Ex.freeBuffer(); + Q_in_R_Ex.freeBuffer(); + } + + data->N = USB_AUDIO_BLOCK_SAMPLES; + data->sampleRate_Hz = SR[SampleRate].rate / 4; + + if (!USBAudioReadTx(data->I, USB_AUDIO_BLOCK_SAMPLES)) { + // Host underrun. Emit silence rather than failing, so the transmit output + // queue keeps being fed and never starves. + memset(data->I, 0, USB_AUDIO_BLOCK_SAMPLES * sizeof(float32_t)); + } else { + // Software drive control, the digital-mode analogue of microphone gain + arm_scale_f32(data->I, ED.digitalDriveLevel / 100.0f, data->I, data->N); + } + + float32_t buffer_rms = 0; + for (size_t k = 0; k < USB_AUDIO_BLOCK_SAMPLES; k++) + buffer_rms += data->I[k] * data->I[k]; + buffer_rms = sqrt(buffer_rms / USB_AUDIO_BLOCK_SAMPLES); + L_in_RMS = 0.9 * L_in_RMS + 0.1 * buffer_rms; + R_in_RMS = L_in_RMS; + + arm_copy_f32(data->I, data->Q, USB_AUDIO_BLOCK_SAMPLES); + return ESUCCESS; +} + /** * Read a block of samples from the microphone and perform transmit signal processing */ @@ -1114,13 +1191,20 @@ DataBlock * TransmitProcessing(const char *fname){ data.I = float_buffer_L; data.Q = float_buffer_R; - // Read data from microphone input buffer - if (ReadMicrophoneBuffer(&data)){ - // There is no data available, skip the rest - return NULL; + if (modeSM.state_id == ModeSm_StateId_DIGITAL_TRANSMIT){ + // Audio comes from the host over USB, already at Fs/4, so the + // decimate-by-4 stage below is skipped. + if (ReadUSBTransmitBuffer(&data)) + return NULL; + } else { + // Read data from microphone input buffer + if (ReadMicrophoneBuffer(&data)){ + // There is no data available, skip the rest + return NULL; + } + //Flag(2); + TXDecimateBy4(&data,&TXfilters);// 2048 in, 512 out } - //Flag(2); - TXDecimateBy4(&data,&TXfilters);// 2048 in, 512 out TXDecimateBy2(&data,&TXfilters);// 512 in, 256 out BandEQ(&data, &RXfilters, TX); TXGain(&data); // apply the DSP gain factor diff --git a/code/src/PhoenixSketch/DSP_FFT.cpp b/code/src/PhoenixSketch/DSP_FFT.cpp index e513951..7fbc89a 100644 --- a/code/src/PhoenixSketch/DSP_FFT.cpp +++ b/code/src/PhoenixSketch/DSP_FFT.cpp @@ -335,10 +335,16 @@ void UpdateFIRFilterMask(ReceiveFilterConfig *RXfilters){ * @param RXfilters Struct holding the filter variables and objects */ void InitializeFilters(uint32_t spectrum_zoom, ReceiveFilterConfig *RXfilters) { + // **************************************************************************************** + // * Regenerate the coefficient tables that are specified in Hz + // **************************************************************************************** + // Must come first: the ARM instances below are bound to these arrays. + InitializeReceiveAudioFilterCoeffs((float32_t)SR[SampleRate].rate / RXfilters->DF); + // **************************************************************************************** // * Zoom FFT: Initiate decimation and interpolation FIR RXfilters AND IIR RXfilters // **************************************************************************************** - + ZoomFFTPrep(spectrum_zoom, RXfilters); for (unsigned i = 0; i < 4 * RXfilters->IIR_biquad_Zoom_FFT_N_stages; i++) { RXfilters->biquadZoomI.pState[i] = 0.0; // set state variables to zero @@ -355,10 +361,17 @@ void InitializeFilters(uint32_t spectrum_zoom, ReceiveFilterConfig *RXfilters) { int32_t LP_F_help = bands[ED.currentBand[ED.activeVFO]].FHiCut_Hz; if (LP_F_help < -bands[ED.currentBand[ED.activeVFO]].FLoCut_Hz) LP_F_help = -bands[ED.currentBand[ED.activeVFO]].FLoCut_Hz; - SetIIRCoeffs(RXfilters->biquad_lowpass1_coeffs, - (float32_t)LP_F_help, 1.3, + SetIIRCoeffs(RXfilters->biquad_lowpass1_coeffs, + (float32_t)LP_F_help, 1.3, (float32_t)SR[SampleRate].rate / RXfilters->DF, Lowpass); + // AM DC blocker. Placing the pole at exp(-2*pi*fc/Fs) holds the corner at + // amDCBlockCorner_Hz whatever the sample rate; the fixed 0.99 this replaces + // moved with it. Drop the history along with the old pole. + RXfilters->amDCBlockPole = expf(-TWO_PI * RXfilters->amDCBlockCorner_Hz + / ((float32_t)SR[SampleRate].rate / RXfilters->DF)); + RXfilters->amDCBlockState = 0.0; + // **************************************************************************************** // * Decimate: RXfilters involved with decimate by 2 and decimate by 4 // **************************************************************************************** @@ -380,7 +393,7 @@ void InitializeFilters(uint32_t spectrum_zoom, ReceiveFilterConfig *RXfilters) { CLEAR_VAR(last_sample_buffer_R); // Equalizer RXfilters - for (size_t i = 0; i<14; i++){ + for (size_t i = 0; ieqNumStages*2; j++) { RXfilters->S_Rec[i].pState[j] = 0; RXfilters->S_Xmt[i].pState[j] = 0; @@ -390,6 +403,22 @@ void InitializeFilters(uint32_t spectrum_zoom, ReceiveFilterConfig *RXfilters) { RXfilters->S_Xmt[i].pCoeffs = *EQ_Coeffs[i]; } + // ********************************************* + // * CW audio filters and the CW decoder input filter + // ********************************************* + // These read coefficient tables that InitializeReceiveAudioFilterCoeffs() + // has just regenerated for the current sample rate, so their history has to + // go with the old coefficients - the delay line of a biquad cascade is only + // meaningful for the filter that produced it. + CLEAR_VAR(RXfilters->CW_AudioFilter1_state); + CLEAR_VAR(RXfilters->CW_AudioFilter2_state); + CLEAR_VAR(RXfilters->CW_AudioFilter3_state); + CLEAR_VAR(RXfilters->CW_AudioFilter4_state); + CLEAR_VAR(RXfilters->CW_AudioFilter5_state); + // Re-initialising also clears the FIR delay line. + arm_fir_init_f32(&RXfilters->FIR_CW_Decode, 64, CW_Filter_Coeffs2, + RXfilters->FIR_CW_Decode_state, READ_BUFFER_SIZE/RXfilters->DF); + // Interpolation RXfilters CalcFIRCoeffs(RXfilters->FIR_int1_coeffs, 48, (float32_t)(RXfilters->n_desired_BW_Hz), RXfilters->n_att_dB, Lowpass, 0.0, SR[SampleRate].rate / RXfilters->DF1); @@ -410,6 +439,13 @@ void InitializeFilters(uint32_t spectrum_zoom, ReceiveFilterConfig *RXfilters) { * @param TXfilters Struct holding the filter variables and objects */ void InitializeTransmitFilters(TransmitFilterConfig *TXfilters) { + // **************************************************************************************** + // * Regenerate the coefficient tables that are specified in Hz + // **************************************************************************************** + // Must come first: the ARM instances below are bound to these arrays. The + // transmit chain decimates by the same DF1 * DF2 the receive chain does. + InitializeTransmitFilterCoeffs((float32_t)SR[SampleRate].rate / RXfilters.DF); + // **************************************************************************************** // * Decimate by 4: 192K to 48K SPS // **************************************************************************************** @@ -784,21 +820,21 @@ void ApplyEQBandFilter(DataBlock *data, ReceiveFilterConfig *RXfilters, uint8_t if (TXRX == RX) scale = (float)ED.equalizerRec[bf] / 100.0; else scale = (float)ED.equalizerXmt[bf] / 100.0; + arm_biquad_cascade_df2T_instance_f32 *band = (TXRX == RX) ? &RXfilters->S_Rec[bf] + : &RXfilters->S_Xmt[bf]; + // Fix the weird bug where the pState array gets a nan in it upon entering loop - // after a power cycle + // after a power cycle. Scrub whichever instance is about to run - the + // transmit one needs it as much as the receive one. for (size_t i = 0; i < 2*RXfilters->eqNumStages; i++){ - if (isnan(RXfilters->S_Rec[bf].pState[i])){ - memset(RXfilters->S_Rec[bf].pState,0,sizeof(float32_t)*2*RXfilters->eqNumStages); + if (isnan(band->pState[i])){ + memset(band->pState,0,sizeof(float32_t)*2*RXfilters->eqNumStages); break; } } // Filter I with this band's biquad - if (TXRX == RX){ - arm_biquad_cascade_df2T_f32(&RXfilters->S_Rec[bf], data->I, RXfilters->eqFiltBuffer, data->N); - }else{ - arm_biquad_cascade_df2T_f32(&RXfilters->S_Xmt[bf], data->I, RXfilters->eqFiltBuffer, data->N); - } + arm_biquad_cascade_df2T_f32(band, data->I, RXfilters->eqFiltBuffer, data->N); // Scale the amplitude by the overall level scaler arm_scale_f32(RXfilters->eqFiltBuffer, (float32_t)sign*scale, RXfilters->eqFiltBuffer, data->N); // Add to the accumulator buffer diff --git a/code/src/PhoenixSketch/DSP_FFT.h b/code/src/PhoenixSketch/DSP_FFT.h index 05300be..17d9ebe 100644 --- a/code/src/PhoenixSketch/DSP_FFT.h +++ b/code/src/PhoenixSketch/DSP_FFT.h @@ -152,6 +152,51 @@ void CalcFIRCoeffs(float *coeffs_I, int numCoeffs, float32_t fc_Hz, float32_t As void SetIIRCoeffs(float32_t *coefficient_set, float32_t f0, float32_t Q, float32_t sample_rate, FilterType filter_type); +/** + * @brief Design a Chebyshev type I lowpass as a cascade of ARM biquads + * @param coeffs Output buffer, order/2 sections of 5 coefficients + * @param order Filter order, must be even + * @param ripple_dB Peak-to-peak passband ripple + * @param fRippleEdge_Hz Frequency at which the passband ripple ends + * @param Fs_Hz Sample rate the filter will run at + * @note Poles are placed in closed form and prewarped, so the response lands on + * the same frequencies at any sample rate. Normalised to unity at DC. + */ +void CalcChebyshevILowpassCoeffs(float32_t *coeffs, uint32_t order, float32_t ripple_dB, + float32_t fRippleEdge_Hz, float32_t Fs_Hz); + +/** + * @brief Design a stagger-tuned bandpass cascade as ARM biquads + * @param coeffs Output buffer, nSections sections of 5 coefficients + * @param proto Prototype sections, resonances given as fractions of fc + * @param nSections Number of sections in the cascade + * @param fc_Hz Centre frequency the cascade should peak at + * @param gain Per-section gain used to normalise the cascade peak + * @param Fs_Hz Sample rate the filter will run at + * @note Emits b0 negative and b2 positive to match the sign convention that + * ApplyEQBandFilter() depends on. + */ +void CalcBandpassCascadeCoeffs(float32_t *coeffs, const BandpassProtoSection *proto, + uint32_t nSections, float32_t fc_Hz, float32_t gain, + float32_t Fs_Hz); + +/** + * @brief Regenerate the receive audio filter tables for the current sample rate + * @param audioFs_Hz Sample rate of the decimated audio stream + * @note Called from InitializeFilters(). Covers the CW audio filters, the CW + * decoder input filter and the equaliser cells - the stages whose corners + * are specified in Hz rather than as a fraction of Fs. + */ +void InitializeReceiveAudioFilterCoeffs(float32_t audioFs_Hz); + +/** + * @brief Regenerate the transmit filter tables for the current sample rate + * @param audioFs_Hz Sample rate of the decimated audio stream + * @note Called from InitializeTransmitFilters(). Covers the two stages either + * side of the Hilbert transform. + */ +void InitializeTransmitFilterCoeffs(float32_t audioFs_Hz); + // Filter Management /** diff --git a/code/src/PhoenixSketch/DSP_FIR.cpp b/code/src/PhoenixSketch/DSP_FIR.cpp index f7de343..f8c32a9 100644 --- a/code/src/PhoenixSketch/DSP_FIR.cpp +++ b/code/src/PhoenixSketch/DSP_FIR.cpp @@ -26,150 +26,33 @@ If not, see . static char *dspfirfilename = nullptr; -// 12 pole Chebyshev 24KSPS 840HZ Fc CW LPF -// b0 b1 b2 -float32_t CW_AudioFilterCoeffs1[30] = { -0.001045672652953040, 0.002091345305906081, 0.001045672652953040, 1.882585857812263620, -0.886768548424075709, //0 -0.002423227458078301, 0.004846454916156603, 0.002423227458078301, 1.884529132690991200, -0.894222042523304395, //1 -0.004829291756048423, 0.009658583512096846, 0.004829291756048423, 1.889384468765871410, -0.908701635790065021, //2 -0.007653393822000297, 0.015306787644000595, 0.007653393822000297, 1.898775913252934710, -0.929389488540935838, //3 -0.010174875101599359, 0.020349750203198718, 0.010174875101599359, 1.914432845416308200, -0.955132345822705675, //4 -0.011739876965796040, 0.023479753931592080, 0.011739876965796040, 1.937529526031872560, -0.984489033895056709, //5 -}; -// 12 pole Chebyshev 24KSPS 1.08KHZ Fc CW LPF -// b0 b1 b2 -a1 -a2 -float32_t CW_AudioFilterCoeffs2[30] = { -0.001708601686569496, 0.003417203373138993, 0.001708601686569496, 1.849644394115178780, -0.856478800861456779, //0 -0.003960135567320385, 0.007920271134640770, 0.003960135567320385, 1.850063728088927160, -0.865904270358208716, //1 -0.007896110863694851, 0.015792221727389703, 0.007896110863694851, 1.852618721585121530, -0.884203165039901040, //2 -0.012527469693062619, 0.025054939386125238, 0.012527469693062619, 1.860233461308907320, -0.910343340081157804, //3 -0.016688500558372531, 0.033377001116745061, 0.016688500558372531, 1.876160539268528550, -0.942914541502018699, //4 -0.019316527156182765, 0.038633054312365529, 0.019316527156182765, 1.902936487120827410, -0.980202595745558458 //5 -}; - -// 12 pole Chebyshev 24KSPS 1.32KHZ Fc CW LPF -// b0 b1 b2 -a1 -a2 -float32_t CW_AudioFilterCoeffs3[30] = { - 0.002526205346474786, 0.005052410692949571, 0.002526205346474786, 1.816854531214501690, -0.826959352600400766, //0 - 0.005854757343402014, 0.011709514686804028, 0.005854757343402014, 1.814915209210166580, -0.838334238583774649, //1 - 0.011674800234072332, 0.023349600468144664, 0.011674800234072332, 1.813684163704128990, -0.860383364640418424, //2 - 0.018533877701340070, 0.037067755402680140, 0.018533877701340070, 1.817698744288731130, -0.891834255094091533, //3 - 0.024728610789430342, 0.049457221578860684, 0.024728610789430342, 1.832107309882979650, -0.931021753040700895, //4 - 0.028704640967983489, 0.057409281935966977, 0.028704640967983489, 1.861191141633472320, -0.976009705505406111 //5 -}; - -// 12 pole Chebyshev 24KSPS 1.80KHZ Fc CW LPF -// b0 b1 b2 -a1 -a2 -float32_t CW_AudioFilterCoeffs4[30] = { -0.004619667602890411, 0.009239335205780823, 0.004619667602890411, 1.751482350458491770, -0.769961020870053470, //0 -0.010697965393132404, 0.021395930786264807, 0.010697965393132404, 1.742463879042789540, -0.785255740615319220, //1 -0.021310846818856619, 0.042621693637713239, 0.021310846818856619, 1.729488942947587930, -0.814732330223014500, //2 -0.033824238912754968, 0.067648477825509937, 0.033824238912754968, 1.721199473469051890, -0.856496429120071845, //3 -0.045209476618282299, 0.090418953236564598, 0.045209476618282299, 1.727486625620660020, -0.908324532093789383, //4 -0.052728229128958234, 0.105456458257916469, 0.052728229128958234, 1.757051114234371440, -0.967964030750204318 //5 -}; - -// 12 pole Chebyshev 24KSPS 2.0KHZ Fc CW LPF -// b0 b1 b2 -a1 -a2 -float32_t CW_AudioFilterCoeffs5[30] = { -0.005895699392492981, 0.011791398784985962, 0.005895699392492981, 1.718777480550920830, -0.742360278120892780, //0 -0.013642906943512292, 0.027285813887024585, 0.013642906943512292, 1.705095001540683390, -0.759666629314732500, //1 -0.027147671747232219, 0.054295343494464438, 0.027147671747232219, 1.684291091887056610, -0.792881778875985654, //2 -0.043053647931610858, 0.086107295863221717, 0.043053647931610858, 1.667486185665950420, -0.839700777392394016, //3 -0.057557746560508744, 0.115115493121017487, 0.057557746560508744, 1.667342067521431660, -0.897573053763466633, //4 -0.067256465545230904, 0.134512931090461807, 0.067256465545230904, 1.695113706470476880, -0.964139568651400491, //5 -}; - -// High pass 4.79KHz Butterworth 1 pole -float32_t HP_DC_Filter_Coeffs2[5] = { - 0.927176191943378969, -0.927176191943378969, 0.000000000000000000, 0.854352383886757938, 0.000000000000000000, -}; - -float32_t HP_DC_Filter_Coeffs[15] = { //2KHz - 0.939110434187240273, -1.878220868374480550, 0.939110434187240273, 1.876175647911858760, -0.880266088837102556, - 0.954420583383374654, -1.908841166766749310, 0.954420583383374654, 1.906762603441262800, -0.910919730092235702, - 0.982153973603849595, -1.964307947207699190, 0.982153973603849595, 1.962168985344285850, -0.966446909071112525 -}; - -// == CW FIR 64 taps 24ksps Fc = 1560 Parks-McCellan Sinc window (Constant group delay) -float32_t CW_Filter_Coeffs2[64] = { - 14.11649337493100380E-6, - 26.00645116880263790E-6, - 36.68870031589199950E-6, - 13.68412619593411960E-6, --78.97178111806820770E-6, --270.5543007271240870E-6, --560.2226272240251320E-6, --895.0536349136069700E-6, --0.001157191426061149, --0.001175458847337361, --766.0401423335821390E-6, - 198.2564157371532760E-6, - 0.001706652959686771, - 0.003541671954793736, - 0.005255696919539346, - 0.006219189024066382, - 0.005752477145569307, - 0.003326972676367999, --0.001205019703557342, --0.007414366866133686, --0.014201761944376253, --0.019862184667500584, --0.022329078747153890, --0.019572975891131203, --0.010081421213164831, - 0.006688661092777364, - 0.030004344392895913, - 0.057792920156185819, - 0.086867005627322011, - 0.113416964025259234, - 0.133680156710101528, - 0.144647031609622528, - 0.144647031609622528, - 0.133680156710101528, - 0.113416964025259234, - 0.086867005627322011, - 0.057792920156185819, - 0.030004344392895913, - 0.006688661092777364, --0.010081421213164831, --0.019572975891131203, --0.022329078747153890, --0.019862184667500584, --0.014201761944376253, --0.007414366866133686, --0.001205019703557342, - 0.003326972676367999, - 0.005752477145569307, - 0.006219189024066382, - 0.005255696919539346, - 0.003541671954793736, - 0.001706652959686771, - 198.2564157371532760E-6, --766.0401423335821390E-6, --0.001175458847337361, --0.001157191426061149, --895.0536349136069700E-6, --560.2226272240251320E-6, --270.5543007271240870E-6, --78.97178111806820770E-6, - 13.68412619593411960E-6, - 36.68870031589199950E-6, - 26.00645116880263790E-6, - 14.11649337493100380E-6 -}; - -//-------------------------- CW Filter IIR coefficients fc= 720, BW= 480 Butterworth ------------------- -float32_t CW_Filter_Coeffs[40] = { - -0.052435730923943512, 0.000000000000000000, 0.052435730923943512, 1.873536650623021550, -0.903491018266337598, - -0.051776963065707407, 0.000000000000000000, 0.051776963065707407, 1.854421028977223380, -0.892140154407832897, - -0.053279899528479190, 0.000000000000000000, 0.053279899528479190, 1.901909218086668130, -0.926406121830538831, - -0.051720218776406826, 0.000000000000000000, 0.051720218776406826, 1.852473692114126940, -0.899287118048469503, - -0.054005568085281293, 0.000000000000000000, 0.054005568085281293, 1.933191203570882030, -0.954501171264401371, - -0.052478365750058854, 0.000000000000000000, 0.052478365750058854, 1.872162227117124540, -0.927509206002122499, - -0.054571370864953707, 0.000000000000000000, 0.054571370864953707, 1.964566474379490390, -0.984561106211203962, - -0.053941343239090896, 0.000000000000000000, 0.053941343239090896, 1.911926697739624980, -0.973194327505971346 -}; +// ============================================================================ +// Filter tables generated at run time +// +// These used to be coefficient tables designed offline for one audio sample +// rate (24 ksps: 192 ksps at the ADC, decimated by 8). Running the radio at +// any other rate scaled every corner and centre frequency by the ratio of the +// rates, so at 176.4 ksps a filter labelled 2.0 kHz actually cut at 1.84 kHz. +// +// They are now regenerated from an analog design spec on every sample rate +// change, which puts each response back on its labelled frequency at any rate. +// See InitializeReceiveAudioFilterCoeffs() and InitializeTransmitFilterCoeffs() +// at the bottom of this file. +// +// The original tables are kept verbatim in code/test/reference_filters.cpp so +// the test suite can measure the generated filters against them. +// ============================================================================ + +// CW audio lowpass filters: 12 pole Chebyshev type I, 0.02 dB ripple. +// 6 biquad sections of {b0, b1, b2, -a1, -a2}. +float32_t CW_AudioFilterCoeffs1[30] = {0}; /** CW audio lowpass, 840 Hz nominal */ +float32_t CW_AudioFilterCoeffs2[30] = {0}; /** CW audio lowpass, 1080 Hz nominal */ +float32_t CW_AudioFilterCoeffs3[30] = {0}; /** CW audio lowpass, 1320 Hz nominal */ +float32_t CW_AudioFilterCoeffs4[30] = {0}; /** CW audio lowpass, 1800 Hz nominal */ +float32_t CW_AudioFilterCoeffs5[30] = {0}; /** CW audio lowpass, 2000 Hz nominal */ + +/** CW decoder input lowpass, 64 tap Kaiser windowed sinc */ +float32_t CW_Filter_Coeffs2[64] = {0}; //=================== Excite Coefficients ============ //48 Tap Kaiser 192KHz 8HKZ Fc RXfilters Dec and Interpolation @@ -273,204 +156,30 @@ float32_t coeffs48K_8K_LPF_FIR[48] = { -140.7585461814297220E-6, 42.07251256297374200E-6 }; -//=== 2x interpolate LP FIT+R 12K sps 48 taps 4K cutoff -float32_t coeffs12K_8K_LPF_FIR[48] = { - 292.7121266034897080E-6, --488.3180342813371910E-6, - 645.8040165558306850E-6, --638.1198881550581060E-6, - 309.3480302449689250E-6, - 476.3212758864665380E-6, --0.001765071979170106, - 0.003440388897049947, --0.005171865011484901, - 0.006413537425933360, --0.006472731205884527, - 0.004654709846338252, --466.7626569695900680E-6, --0.006156455313021720, - 0.014659150255493822, --0.023755580034778335, - 0.031441372818989677, --0.035120434578160220, - 0.031776095760559758, --0.017990662560858503, --0.010720286031718308, - 0.063232870546293687, --0.170792976311007899, - 0.622296121514180789, - 0.622296121514180789, --0.170792976311007899, - 0.063232870546293687, --0.010720286031718308, --0.017990662560858503, - 0.031776095760559758, --0.035120434578160220, - 0.031441372818989677, --0.023755580034778335, - 0.014659150255493822, --0.006156455313021720, --466.7626569695900680E-6, - 0.004654709846338252, --0.006472731205884527, - 0.006413537425933360, --0.005171865011484901, - 0.003440388897049947, --0.001765071979170106, - 476.3212758864665380E-6, - 309.3480302449689250E-6, --638.1198881550581060E-6, - 645.8040165558306850E-6, --488.3180342813371910E-6, - 292.7121266034897080E-6, - -}; - -// Interpolate by 2 again, 12K to 24K SPS -float32_t FIR_int3_12ksps_48tap_2k7[48] = { - -2.285169471669272310E-6, --33.85457593285185850E-6, --90.05495214272963270E-6, --102.5104398169568180E-6, - 58.41569034528380660E-6, - 454.7904191315104190E-6, - 871.4162433760077420E-6, - 749.7881965886456330E-6, --468.4956850258753320E-6, --0.002616105921239791, --0.004246098300098818, --0.003078738032270572, - 0.002226282725246520, - 0.009889569653623405, - 0.014414561535852018, - 0.009226938890949424, --0.007959807904613685, --0.030336057178768423, --0.042078062750789499, --0.025361321875102511, - 0.028447546456669172, - 0.110201064956298028, - 0.193569812629121624, - 0.246261318040085941, - 0.246261318040085941, - 0.193569812629121624, - 0.110201064956298028, - 0.028447546456669172, --0.025361321875102511, --0.042078062750789499, --0.030336057178768423, --0.007959807904613685, - 0.009226938890949424, - 0.014414561535852018, - 0.009889569653623405, - 0.002226282725246520, --0.003078738032270572, --0.004246098300098818, --0.002616105921239791, --468.4956850258753320E-6, - 749.7881965886456330E-6, - 871.4162433760077420E-6, - 454.7904191315104190E-6, - 58.41569034528380660E-6, --102.5104398169568180E-6, --90.05495214272963270E-6, --33.85457593285185850E-6, --2.285169471669272310E-6, -}; - -//4 pole Butterworth IIR biQuad RXfilters for EQ Band 1 thru 14 -float32_t EQ_Band1Coeffs[20] = { // fc=198.425 BW=60.4, 4 pole Gaussian 1/3 octave - -0.010740354324803263, 0.000000000000000000, 0.010740354324803263, 1.977760288071182870, -0.980176703912204905, - -0.010717730957944621, 0.000000000000000000, 0.010717730957944621, 1.975162619174023470, -0.978112070242933007, - -0.012264037490550410, 0.000000000000000000, 0.012264037490550410, 1.982731279215446560, -0.984673419072692013, - -0.012192623012836674, 0.000000000000000000, 0.012192623012836674, 1.975260232124987250, -0.978939586475078283 -}; -float32_t EQ_Band2Coeffs[20] = { // fc=250 BW=72, 4 pole Gaussian 1/3 octave - -0.012933654120114928, 0.000000000000000000, 0.012933654120114928, 1.972230388754230070, -0.976074773963381825, - -0.012902245256420676, 0.000000000000000000, 0.012902245256420676, 1.969054007796797960, -0.973704415266133827, - -0.014776626826402213, 0.000000000000000000, 0.014776626826402213, 1.978267317735213690, -0.981387851708867331, - -0.014677312538120893, 0.000000000000000000, 0.014677312538120893, 1.969044730844959010, -0.974791905478009535 -}; -float32_t EQ_Band3Coeffs[20] = { // fc=314.98 BW=91.6, 4 pole Gaussian 1/3 octave - -0.016447315569307643, 0.000000000000000000, 0.016447315569307643, 1.963525244582037700, -0.969599143160199128, - -0.016395762539476878, 0.000000000000000000, 0.016395762539476878, 1.959197203291359160, -0.966559998362339301, - -0.018810466262295416, 0.000000000000000000, 0.018810466262295416, 1.971448267819779780, -0.976369169522296243, - -0.018647471180391263, 0.000000000000000000, 0.018647471180391263, 1.958784738577257430, -0.967908806523534615 -}; -float32_t EQ_Band4Coeffs[20] = { // fc=400 BW=117, 4 pole Gaussian 1/3 octave - -0.021107226123143540, 0.000000000000000000, 0.021107226123143540, 1.951288180543548690, -0.961023369255779913, - -0.021020814241623810, 0.000000000000000000, 0.021020814241623810, 1.945259100240296800, -0.957088989767100218, - -0.024173376764279130, 0.000000000000000000, 0.024173376764279130, 1.961858154037972480, -0.969728310529273663, - -0.023900201823886549, 0.000000000000000000, 0.023900201823886549, 1.944062548127177160, -0.958769747478319112 -}; -float32_t EQ_Band5Coeffs[20] = { // fc=500 BW=140, 4 pole Gaussian 1/3 octave - -0.025434986078352932, 0.000000000000000000, 0.025434986078352932, 1.937763026417761440, -0.952954919636953890, - -0.025313478543573947, 0.000000000000000000, 0.025313478543573947, 1.930070471504943040, -0.948402481405460684, - -0.029161895846570862, 0.000000000000000000, 0.029161895846570862, 1.950890858299041410, -0.963270463464314108, - -0.028777241258184545, 0.000000000000000000, 0.028777241258184545, 1.927932418232654040, -0.950564622747441468 -}; -float32_t EQ_Band6Coeffs[20] = { // fc=630 BW=185, 4 pole Gaussian 1/3 octave - -0.034013087998603600, 0.000000000000000000, 0.034013087998603600, 1.913595532476039860, -0.937338704287993485, - -0.033779293097819303, 0.000000000000000000, 0.033779293097819303, 1.901882114205436290, -0.930895742996760700, - -0.039105400046163162, 0.000000000000000000, 0.039105400046163162, 1.932301402855366890, -0.951404949215225448, - -0.038366657914332684, 0.000000000000000000, 0.038366657914332684, 1.897086382739862300, -0.933431909185264641 -}; - -float32_t EQ_Band7Coeffs[20] = { // fc=793 BW=215, 4 pole Gaussian 1/3 octave - -0.040044359954689926, 0.000000000000000000, 0.040044359954689926, 1.888394203397243400, -0.925981923711014732, - -0.039740115320392844, 0.000000000000000000, 0.039740115320392844, 1.873614715169800600, -0.918946600083319409, - -0.046099397613266917, 0.000000000000000000, 0.046099397613266917, 1.911355633900693180, -0.942046227315978979, - -0.045135819293132796, 0.000000000000000000, 0.045135819293132796, 1.866325392810697090, -0.922355399057854686 -}; - -float32_t EQ_Band8Coeffs[20] = { // fc=1000 BW=270, 4 pole Gaussian 1/3 octave - -0.050982851195012183, 0.000000000000000000, 0.050982851195012183, 1.846967337210932980, -0.905880344373915625, - -0.050478998559837972, 0.000000000000000000, 0.050478998559837972, 1.825700576400176360, -0.896927722306557262, - -0.058875166968515282, 0.000000000000000000, 0.058875166968515282, 1.878257463261961750, -0.926279459225752610, - -0.057280286665948199, 0.000000000000000000, 0.057280286665948199, 1.812808299361427180, -0.901187303394047512 -}; - -float32_t EQ_Band9Coeffs[20] = { //1259 326 4 pole Gaussian 1/3 octave - -0.062436305349349887, 0.000000000000000000, 0.062436305349349887, 1.792407090214479080, -0.884627616406695516, - -0.061695827132588178, 0.000000000000000000, 0.061695827132588178, 1.763182364434806800, -0.874136164738794852, - -0.072306422223616690, 0.000000000000000000, 0.072306422223616690, 1.833501777433602210, -0.909146391672414067, - -0.069961857687408896, 0.000000000000000000, 0.069961857687408896, 1.742557606724184360, -0.879666957860237075 -}; - -float32_t EQ_Band10Coeffs[20] = { // Band3 //1587 380 4 pole Gaussian 1/3 octave - -0.074363508404526421, 0.000000000000000000, 0.074363508404526421, 1.717508353369523010, -0.862211252084035151, - -0.073370934748750075, 0.000000000000000000, 0.073370934748750075, 1.678381089046226960, -0.850702809396297943, - -0.086324197408935752, 0.000000000000000000, 0.086324197408935752, 1.770356988912942690, -0.890495750927825402, - -0.0831792956517105050, .000000000000000000, 0.083179295651710505, 1.647225955992196010, -0.858053843143523842 -}; - -float32_t EQ_Band11Coeffs[20] = { // 2000 480 4 pole 4 pole Gaussian 1/3 octave - -0.095836703240171059, 0.000000000000000000, 0.095836703240171059, 1.600465210710192880, -0.822735930728153764, - -0.094139069783896759, 0.000000000000000000, 0.094139069783896759, 1.542179833257436350, -0.808162140160850195, - -0.111862031820526620, 0.000000000000000000, 0.111862031820526620, 1.675022371378555920, -0.858900156431318784, - -0.106503914399111971, 0.000000000000000000, 0.106503914399111971, 1.490054957243781340, -0.817759406379379050 -}; - -float32_t EQ_Band12Coeffs[20] = { // 2500 579 4 pole Gaussian 1/3 octave - -0.117879553771682077, 0.000000000000000000, 0.117879553771682077, 1.446475829403250920, -0.781724147199137853, - -0.115383310539578524, 0.000000000000000000, 0.115383310539578524, 1.364990025835680850, -0.765170185554548188, - -0.138197674814651450, 0.000000000000000000, 0.138197674814651450, 1.546474742602351290, -0.825007082271826175, - -0.130355600849362346, 0.000000000000000000, 0.130355600849362346, 1.285783233479567580, -0.778191775359172500 -}; - -float32_t EQ_Band13Coeffs[20] = { //3150 730 4 pole Gaussian 1/3 octave - -0.150762354328435849, 0.000000000000000000, 0.150762354328435849, 1.219119807012296160, -0.720763563050070721, - -0.146749880416786549, 0.000000000000000000, 0.146749880416786549, 1.100462092025051410, -0.701580757063202998, - -0.177820152149393451, 0.000000000000000000, 0.177820152149393451, 1.358721947950491950, -0.774654638713877741, - -0.165372194155001706, 0.000000000000000000, 0.165372194155001706, 0.976661905865581326, -0.720426429558091441 -}; - -float32_t EQ_Band14Coeffs[20] = { //4000 919 4 pole Gaussian 1/3 octave - -0.191002547843707293, 0.000000000000000000, 0.191002547843707293, 0.899547452783356571, -0.644594993669154070, - -0.185284629488361025, 0.000000000000000000, 0.185284629488361025, 0.731207869008696054, -0.625298174921578354, - -0.226011710394339427, 0.000000000000000000, 0.226011710394339427, 1.091251019040685220, -0.709544302434661267, - -0.208696039181478332, 0.000000000000000000, 0.208696039181478332, 0.546857223443984242, -0.655183243751105593 -}; +/** Transmit decimate-by-2, 24k -> 12k, 48 tap Kaiser windowed sinc */ +float32_t coeffs12K_8K_LPF_FIR[48] = {0}; + +/** Transmit interpolate-by-2, 12k -> 24k. This is the stage that sets the + * transmit audio bandwidth, so it is anchored in Hz rather than left to scale + * with the sample rate. 48 tap Kaiser windowed sinc. */ +float32_t FIR_int3_12ksps_48tap_2k7[48] = {0}; + +// Audio equaliser cells: 4 stagger-tuned bandpass biquads each, peak normalised +// to unity. Centres run 198.425 Hz to 4000 Hz, roughly 1/3 octave apart. +float32_t EQ_Band1Coeffs[20] = {0}; +float32_t EQ_Band2Coeffs[20] = {0}; +float32_t EQ_Band3Coeffs[20] = {0}; +float32_t EQ_Band4Coeffs[20] = {0}; +float32_t EQ_Band5Coeffs[20] = {0}; +float32_t EQ_Band6Coeffs[20] = {0}; +float32_t EQ_Band7Coeffs[20] = {0}; +float32_t EQ_Band8Coeffs[20] = {0}; +float32_t EQ_Band9Coeffs[20] = {0}; +float32_t EQ_Band10Coeffs[20] = {0}; +float32_t EQ_Band11Coeffs[20] = {0}; +float32_t EQ_Band12Coeffs[20] = {0}; +float32_t EQ_Band13Coeffs[20] = {0}; +float32_t EQ_Band14Coeffs[20] = {0}; // Concatenate all the EQ band filter coefficients so we can loop over them float32_t (*EQ_Coeffs[14])[20] = { &EQ_Band1Coeffs, &EQ_Band2Coeffs, &EQ_Band3Coeffs, &EQ_Band4Coeffs, &EQ_Band5Coeffs, &EQ_Band6Coeffs, &EQ_Band7Coeffs, &EQ_Band8Coeffs, @@ -996,40 +705,6 @@ float32_t* mag_coeffs[11] = }; -const float32_t nuttallWindow256[] = { - 0.0000001, 0.0000073, 0.0000292, 0.0000663, 0.0001192, 0.0001891, 0.0002771, 0.0003851, - 0.0005147, 0.0006684, 0.0008485, 0.0010580, 0.0012998, 0.0015775, 0.0018947, 0.0022554, - 0.0026639, 0.0031248, 0.0036429, 0.0042235, 0.0048719, 0.0055940, 0.0063956, 0.0072832, - 0.0082631, 0.0093423, 0.0105278, 0.0118269, 0.0132470, 0.0147960, 0.0164817, 0.0183122, - 0.0202960, 0.0224414, 0.0247569, 0.0272514, 0.0299336, 0.0328123, 0.0358966, 0.0391953, - 0.0427173, 0.0464717, 0.0504671, 0.0547124, 0.0592163, 0.0639871, 0.0690332, 0.0743626, - 0.0799832, 0.0859024, 0.0921274, 0.0986651, 0.1055218, 0.1127036, 0.1202159, 0.1280637, - 0.1362515, 0.1447831, 0.1536618, 0.1628900, 0.1724698, 0.1824023, 0.1926880, 0.2033264, - 0.2143164, 0.2256560, 0.2373424, 0.2493718, 0.2617397, 0.2744405, 0.2874677, 0.3008139, - 0.3144707, 0.3284289, 0.3426782, 0.3572073, 0.3720040, 0.3870552, 0.4023469, 0.4178639, - 0.4335904, 0.4495095, 0.4656036, 0.4818541, 0.4982416, 0.5147460, 0.5313464, 0.5480212, - 0.5647480, 0.5815041, 0.5982659, 0.6150094, 0.6317101, 0.6483431, 0.6648832, 0.6813048, - 0.6975821, 0.7136890, 0.7295995, 0.7452874, 0.7607267, 0.7758911, 0.7907549, 0.8052924, - 0.8194782, 0.8332872, 0.8466949, 0.8596772, 0.8722106, 0.8842721, 0.8958396, 0.9068915, - 0.9174074, 0.9273674, 0.9367527, 0.9455454, 0.9537289, 0.9612875, 0.9682065, 0.9744726, - 0.9800736, 0.9849988, 0.9892383, 0.9927841, 0.9956291, 0.9977678, 0.9991959, 0.9999106, - 0.9999106, 0.9991959, 0.9977678, 0.9956291, 0.9927841, 0.9892383, 0.9849988, 0.9800736, - 0.9744726, 0.9682065, 0.9612875, 0.9537289, 0.9455454, 0.9367527, 0.9273674, 0.9174074, - 0.9068915, 0.8958396, 0.8842721, 0.8722106, 0.8596772, 0.8466949, 0.8332872, 0.8194782, - 0.8052924, 0.7907549, 0.7758911, 0.7607267, 0.7452874, 0.7295995, 0.7136890, 0.6975821, - 0.6813048, 0.6648832, 0.6483431, 0.6317101, 0.6150094, 0.5982659, 0.5815041, 0.5647480, - 0.5480212, 0.5313464, 0.5147460, 0.4982416, 0.4818541, 0.4656036, 0.4495095, 0.4335904, - 0.4178639, 0.4023469, 0.3870552, 0.3720040, 0.3572073, 0.3426782, 0.3284289, 0.3144707, - 0.3008139, 0.2874677, 0.2744405, 0.2617397, 0.2493718, 0.2373424, 0.2256560, 0.2143164, - 0.2033264, 0.1926880, 0.1824023, 0.1724698, 0.1628900, 0.1536618, 0.1447831, 0.1362515, - 0.1280637, 0.1202159, 0.1127036, 0.1055218, 0.0986651, 0.0921274, 0.0859024, 0.0799832, - 0.0743626, 0.0690332, 0.0639871, 0.0592163, 0.0547124, 0.0504671, 0.0464717, 0.0427173, - 0.0391953, 0.0358966, 0.0328123, 0.0299336, 0.0272514, 0.0247569, 0.0224414, 0.0202960, - 0.0183122, 0.0164817, 0.0147960, 0.0132470, 0.0118269, 0.0105278, 0.0093423, 0.0082631, - 0.0072832, 0.0063956, 0.0055940, 0.0048719, 0.0042235, 0.0036429, 0.0031248, 0.0026639, - 0.0022554, 0.0018947, 0.0015775, 0.0012998, 0.0010580, 0.0008485, 0.0006684, 0.0005147, - 0.0003851, 0.0002771, 0.0001891, 0.0001192, 0.0000663, 0.0000292, 0.0000073, 0.0000001 -}; /** @@ -1271,6 +946,158 @@ void SetIIRCoeffs(float32_t *coefficient_set, float32_t f0, float32_t Q, float32 } } +/** + * Bilinear transform of one second-order analog section into an ARM biquad. + * + * Maps a section with resonance wn (rad/s) and quality factor Q into the five + * coefficients arm_biquad_cascade_df2T_f32 expects, {b0, b1, b2, -a1, -a2}. + * The caller supplies the analog numerator; the denominator is always + * s^2 + (wn/Q)s + wn^2. + * + * Substituting s = 2*Fs*(z-1)/(z+1) and clearing denominators gives a common + * divisor of d = K^2 + K*wn/Q + wn^2 with K = 2*Fs, which is factored out here. + * + * @param coeffs Destination, 5 floats + * @param b_s2 Analog numerator coefficient of s^2 + * @param b_s1 Analog numerator coefficient of s + * @param b_s0 Analog numerator constant term + * @param wn Section resonant frequency in rad/s + * @param Q Section quality factor + * @param Fs_Hz Sample rate the digital filter will run at + */ +static void BilinearBiquad(float32_t *coeffs, float32_t b_s2, float32_t b_s1, float32_t b_s0, + float32_t wn, float32_t Q, float32_t Fs_Hz) { + const float32_t K = 2.0f * Fs_Hz; + const float32_t K2 = K * K; + const float32_t wn2 = wn * wn; + const float32_t damping = K * wn / Q; + const float32_t d = K2 + damping + wn2; + + coeffs[0] = (b_s2 * K2 + b_s1 * K + b_s0) / d; /* b0 */ + coeffs[1] = (2.0f * b_s0 - 2.0f * b_s2 * K2) / d; /* b1 */ + coeffs[2] = (b_s2 * K2 - b_s1 * K + b_s0) / d; /* b2 */ + // The ARM biquad adds the feedback terms rather than subtracting them, so + // a1 and a2 are stored negated. + coeffs[3] = -(2.0f * (wn2 - K2)) / d; // negated a1 + coeffs[4] = -(K2 - damping + wn2) / d; // negated a2 +} + +/** + * Prewarp a frequency for the bilinear transform. + * + * The bilinear transform compresses the analog frequency axis as it wraps it + * onto the unit circle, so an analog section placed at f lands slightly below f + * once discretised. Designing at the prewarped frequency instead cancels that, + * putting the digital feature exactly on f at whatever sample rate is in use. + * This is what makes the generated filters sample-rate independent. + * + * @param f_Hz Frequency the digital filter should land on + * @param Fs_Hz Sample rate + * @return Equivalent analog frequency in rad/s + */ +static float32_t PrewarpRadians(float32_t f_Hz, float32_t Fs_Hz) { + return 2.0f * Fs_Hz * tanf(PI * f_Hz / Fs_Hz); +} + +/** + * Design a Chebyshev type I lowpass as a cascade of ARM biquads. + * + * The poles of a Chebyshev type I filter lie on an ellipse in the s-plane, at + * positions given in closed form by the ripple and the order, so no iterative + * design is needed. Each conjugate pair becomes one biquad section. + * + * The cascade is normalised to unity gain at DC. An even-order Chebyshev sits + * at -ripple at DC and rises to 0 dB across the passband; the frozen tables + * this replaces were normalised the same way, with DC at 0 dB and the ripple + * above it. + * + * Note fRippleEdge_Hz is the edge of the equiripple region, which is the + * natural parameter for this family - not the -3 dB or -6 dB corner. It sits a + * few percent below the nominal cutoff the filter is labelled with. + * + * @param coeffs Destination, order/2 sections of 5 floats + * @param order Filter order, must be even + * @param ripple_dB Peak-to-peak passband ripple + * @param fRippleEdge_Hz Frequency at which the passband ripple ends + * @param Fs_Hz Sample rate the filter will run at + */ +void CalcChebyshevILowpassCoeffs(float32_t *coeffs, uint32_t order, float32_t ripple_dB, + float32_t fRippleEdge_Hz, float32_t Fs_Hz) { + const uint32_t nSections = order / 2; + if (nSections == 0) return; + // Nothing sensible to design if the corner has run past Nyquist. + if (fRippleEdge_Hz >= Fs_Hz / 2.0f) fRippleEdge_Hz = Fs_Hz / 2.0f * 0.999f; + + // Ellipse shape: eps sets how much ripple, v0 how eccentric the pole locus. + const float32_t eps = sqrtf(powf(10.0f, ripple_dB / 10.0f) - 1.0f); + const float32_t v0 = asinhf(1.0f / eps) / (float32_t)order; + const float32_t sinhV0 = sinhf(v0); + const float32_t coshV0 = coshf(v0); + const float32_t wc = PrewarpRadians(fRippleEdge_Hz, Fs_Hz); + + for (uint32_t k = 0; k < nSections; k++) { + const float32_t theta = PI * (float32_t)(2 * k + 1) / (float32_t)(2 * order); + const float32_t sigma = -sinhV0 * arm_sin_f32(theta) * wc; // pole real part + const float32_t omega = coshV0 * arm_cos_f32(theta) * wc; // pole imaginary part + const float32_t wn = sqrtf(sigma * sigma + omega * omega); + const float32_t Q = wn / (2.0f * fabsf(sigma)); + // Lowpass numerator: wn^2, i.e. unity gain at DC for this section. + BilinearBiquad(&coeffs[k * 5], 0.0f, 0.0f, wn * wn, wn, Q, Fs_Hz); + } + + // Normalise the cascade to unity at DC. Evaluating H(z) at z = 1 reduces to + // summing the numerator over the summed denominator for each section. + float32_t dcGain = 1.0f; + for (uint32_t k = 0; k < nSections; k++) { + const float32_t *s = &coeffs[k * 5]; + dcGain *= (s[0] + s[1] + s[2]) / (1.0f - s[3] - s[4]); + } + if (dcGain > 0.0f) { + // Spread the correction evenly so no single section carries a large gain. + const float32_t perSection = powf(dcGain, -1.0f / (float32_t)nSections); + for (uint32_t k = 0; k < nSections; k++) { + coeffs[k * 5 + 0] *= perSection; + coeffs[k * 5 + 1] *= perSection; + coeffs[k * 5 + 2] *= perSection; + } + } +} + +/** + * Design a stagger-tuned bandpass cascade as ARM biquads. + * + * The prototype describes a set of second-order analog bandpass sections whose + * resonances straddle the centre frequency, each given as a fraction of that + * centre. Scaling those fractions to the wanted centre and running them through + * the bilinear transform reproduces the same response shape at any centre + * frequency and any sample rate. + * + * Sections are emitted with b0 negative and b2 positive, matching the sign + * convention of the equaliser tables this replaces. ApplyEQBandFilter() sums + * adjacent bands with alternating sign, and that reconstruction depends on it. + * + * @param coeffs Destination, nSections sections of 5 floats + * @param proto Prototype sections, normalised to the centre frequency + * @param nSections Number of sections in the cascade + * @param fc_Hz Centre frequency the cascade should peak at + * @param gain Per-section gain, used to normalise the cascade peak + * @param Fs_Hz Sample rate the filter will run at + */ +void CalcBandpassCascadeCoeffs(float32_t *coeffs, const BandpassProtoSection *proto, + uint32_t nSections, float32_t fc_Hz, float32_t gain, + float32_t Fs_Hz) { + // Keep the whole cascade below Nyquist; the outermost section sits above fc. + if (fc_Hz >= Fs_Hz / 2.0f) fc_Hz = Fs_Hz / 2.0f * 0.999f; + const float32_t wc = PrewarpRadians(fc_Hz, Fs_Hz); + + for (uint32_t k = 0; k < nSections; k++) { + const float32_t wn = proto[k].wnRatio * wc; + const float32_t Q = proto[k].Q; + // Bandpass numerator: (wn/Q)s, negated to match the table convention. + BilinearBiquad(&coeffs[k * 5], 0.0f, -gain * wn / Q, 0.0f, wn, Q, Fs_Hz); + } +} + /** * Initialize a FIR decimation filter * @@ -1292,6 +1119,13 @@ void InitializeDecimationFilter(DecimationFilter *filter, float32_t DF, float32_ filter->n_fstop = ((filter->n_samplerate_Hz / filter->M) - filter->n_desired_BW_Hz) / filter->n_samplerate_Hz; filter->n_dec_taps = (1 + (uint16_t)(filter->n_att_dB / (22.0 * (filter->n_fstop - filter->n_fpass)))); + // Free any buffers from a previous initialization so that re-initializing at + // run time (e.g. a sample-rate change) does not leak memory. The pointers are + // nullptr on first use, and free(nullptr) is a no-op. + free(filter->FIR_dec_I_state); + free(filter->FIR_dec_Q_state); + free(filter->FIR_dec_coeffs); + filter->FIR_dec_I_state = (float32_t*)malloc(sizeof(float32_t) * (filter->n_dec_taps + blockSize - 1)); filter->FIR_dec_Q_state = (float32_t*)malloc(sizeof(float32_t) * (filter->n_dec_taps + blockSize - 1)); filter->FIR_dec_coeffs = (float32_t*)malloc(sizeof(float32_t) * filter->n_dec_taps); @@ -1384,3 +1218,160 @@ void InitFilterMask(float32_t *FIR_filter_mask, ReceiveFilterConfig *RXfilters) void setdspfirfilename(char *fnm){ dspfirfilename = fnm; // "FIR_filter_samples.txt" } + +// ============================================================================ +// Run-time filter generation +// +// The design constants below were recovered from the coefficient tables the +// radio used to ship, by code/tools/extract_filter_prototypes.py. They are the +// design spec, not derived values: re-run that script against +// code/test/reference_filters.cpp if they ever need to be checked. +// ============================================================================ + +/** CW audio lowpass filters share an order and a ripple; only the corner differs. */ +#define CW_AUDIO_FILTER_COUNT 5 +#define CW_AUDIO_FILTER_ORDER 12 +#define CW_AUDIO_FILTER_RIPPLE_DB 0.02f + +/** Number of biquad sections in each equaliser cell. Matches ReceiveFilterConfig::eqNumStages. */ +#define EQ_PROTO_SECTIONS 4 + +/** Edge of the equiripple region of each CW audio filter, at the labelled + * cutoffs 840, 1080, 1320, 1800 and 2000 Hz. A Chebyshev is specified by its + * ripple edge, which sits a few percent below the nominal cutoff. */ +static const float32_t CW_AUDIO_RIPPLE_EDGE_HZ[CW_AUDIO_FILTER_COUNT] = { + 807.1f, 1038.0f, 1269.0f, 1731.5f, 1963.2f +}; + +/** Centre frequency of each equaliser cell. */ +static const float32_t EQ_BAND_FC_HZ[EQUALIZER_CELL_COUNT] = { + 198.425f, 250.000f, 314.980f, 400.000f, 500.000f, + 630.000f, 793.000f, 1000.000f, 1259.000f, 1587.000f, + 2000.000f, 2500.000f, 3150.000f, 4000.000f +}; + +/** Per-section gain that puts each equaliser cell's peak at unity. */ +static const float32_t EQ_BAND_GAIN[EQUALIZER_CELL_COUNT] = { + 1.184185753f, 1.183486381f, 1.183688167f, 1.183936689f, + 1.183431106f, 1.184571413f, 1.183589930f, 1.183974027f, + 1.183805406f, 1.183267466f, 1.184229387f, 1.184796361f, + 1.186649928f, 1.189574151f +}; + +/** Analog prototype of each equaliser cell: four bandpass sections whose + * resonances straddle the centre frequency, given as fractions of it. */ +static const BandpassProtoSection EQ_BAND_PROTO[EQUALIZER_CELL_COUNT][EQ_PROTO_SECTIONS] = { + {{0.951083615f, 2.466689083f}, {1.051379253f, 2.466689084f}, {0.851636566f, 2.863638706f}, {1.174150596f, 2.863638705f}}, + {{0.953178819f, 2.574736321f}, {1.049087493f, 2.574736321f}, {0.857535414f, 2.986184529f}, {1.166095255f, 2.986184529f}}, + {{0.952570489f, 2.542065805f}, {1.049764384f, 2.542065806f}, {0.855807346f, 2.949116270f}, {1.168457571f, 2.949116270f}}, + {{0.951830713f, 2.503540450f}, {1.050585940f, 2.503540450f}, {0.853713229f, 2.905420150f}, {1.171330056f, 2.905420150f}}, + {{0.953370464f, 2.583905422f}, {1.048927026f, 2.583905422f}, {0.858034309f, 2.996589913f}, {1.165473263f, 2.996589913f}}, + {{0.949994428f, 2.412809599f}, {1.052637753f, 2.412809599f}, {0.848532629f, 2.802580881f}, {1.178505064f, 2.802580881f}}, + {{0.952874313f, 2.557802231f}, {1.049445688f, 2.557802231f}, {0.856652873f, 2.966969526f}, {1.167322110f, 2.966969526f}}, + {{0.951691136f, 2.497903978f}, {1.050676047f, 2.497903978f}, {0.853375360f, 2.899028582f}, {1.171722464f, 2.899028582f}}, + {{0.952233947f, 2.523659752f}, {1.050168894f, 2.523659752f}, {0.854827001f, 2.928237726f}, {1.169834914f, 2.928237726f}}, + {{0.953866388f, 2.611676440f}, {1.048364858f, 2.611676440f}, {0.859456463f, 3.028110638f}, {1.163526070f, 3.028110638f}}, + {{0.950982372f, 2.460405147f}, {1.051548607f, 2.460405147f}, {0.851302026f, 2.856515705f}, {1.174676152f, 2.856515705f}}, + {{0.949340102f, 2.383020780f}, {1.053327036f, 2.383020780f}, {0.846732326f, 2.768839341f}, {1.180970143f, 2.768839341f}}, + {{0.944376056f, 2.174506313f}, {1.058900206f, 2.174506313f}, {0.832947335f, 2.533023428f}, {1.200556094f, 2.533023428f}}, + {{0.937307103f, 1.936908781f}, {1.066883605f, 1.936908781f}, {0.813799101f, 2.265312153f}, {1.228801532f, 2.265312153f}} +}; + +/** -6 dB corner of the CW decoder input filter. CalcFIRCoeffs takes its fc + * argument as the -6 dB point, so this is not the 1560 Hz the filter is + * nominally described by - that is its -3 dB point. */ +#define CW_DECODE_FIR_FC_HZ 1749.1f + +/** -6 dB corner of the transmit interpolate-by-2 filter, which is what limits + * the transmit audio bandwidth (-3 dB at 2759 Hz). */ +#define TX_AUDIO_LPF_FC_HZ 3039.6f + +/** -6 dB corner of the transmit decimate-by-2 filter feeding the Hilbert stage. + * + * This one is not a reproduction of the table it replaces. That table was flat + * to 0.425 * Fs, far past the 0.25 * Fs a decimate-by-2 stage needs, so + * everything between 6 and 9.5 kHz folded back into the transmit audio. A real + * lowpass here removes that aliasing. 3.5 kHz sits above the 2.76 kHz the + * audio bandwidth filter allows through, so it costs no wanted signal. */ +#define TX_DECIMATE3_FC_HZ 3500.0f + +/** Stopband attenuation asked of the generated FIR stages. */ +#define GENERATED_FIR_ATTENUATION_DB 90.0f + +/** + * Scale a set of FIR taps to unity gain at DC. + * + * CalcFIRCoeffs does not normalise its output, and the CW decoder compares the + * filtered magnitude against a fixed threshold, so the gain has to be pinned. + * + * @param taps Coefficient array, modified in place + * @param nTaps Number of taps + */ +static void NormalizeFIRDCGain(float32_t *taps, uint32_t nTaps) { + float32_t sum = 0.0f; + for (uint32_t i = 0; i < nTaps; i++) sum += taps[i]; + if (sum == 0.0f) return; + for (uint32_t i = 0; i < nTaps; i++) taps[i] /= sum; +} + +/** + * Regenerate the receive audio filter tables for the current sample rate. + * + * Called from the top of InitializeFilters(), so it runs at startup and again + * on every sample rate change, before the ARM instances are bound. + * + * Filters that specify their corner as a fraction of the sample rate - the + * decimation and interpolation anti-alias stages, the zoom FFT filters - are + * deliberately not regenerated. Those are already correct at any rate, because + * scaling with Fs is exactly what an anti-alias filter should do. + * + * @param audioFs_Hz Sample rate of the decimated audio stream + */ +void InitializeReceiveAudioFilterCoeffs(float32_t audioFs_Hz) { + // CW audio lowpass filters, 12 pole Chebyshev type I. + float32_t *cwAudio[CW_AUDIO_FILTER_COUNT] = { + CW_AudioFilterCoeffs1, CW_AudioFilterCoeffs2, CW_AudioFilterCoeffs3, + CW_AudioFilterCoeffs4, CW_AudioFilterCoeffs5 + }; + for (uint32_t i = 0; i < CW_AUDIO_FILTER_COUNT; i++) { + CalcChebyshevILowpassCoeffs(cwAudio[i], CW_AUDIO_FILTER_ORDER, + CW_AUDIO_FILTER_RIPPLE_DB, + CW_AUDIO_RIPPLE_EDGE_HZ[i], audioFs_Hz); + } + + // Audio equaliser cells. The receive and transmit chains share these tables + // and both run at the audio rate, so one set serves both. + for (uint32_t i = 0; i < EQUALIZER_CELL_COUNT; i++) { + CalcBandpassCascadeCoeffs(*EQ_Coeffs[i], EQ_BAND_PROTO[i], EQ_PROTO_SECTIONS, + EQ_BAND_FC_HZ[i], EQ_BAND_GAIN[i], audioFs_Hz); + } + + // CW decoder input filter. + CalcFIRCoeffs(CW_Filter_Coeffs2, 64, CW_DECODE_FIR_FC_HZ, GENERATED_FIR_ATTENUATION_DB, + Lowpass, 0.0f, audioFs_Hz); + NormalizeFIRDCGain(CW_Filter_Coeffs2, 64); +} + +/** + * Regenerate the transmit filter tables for the current sample rate. + * + * Called from the top of InitializeTransmitFilters(). Only the two stages + * either side of the Hilbert transform are generated: the rest of the transmit + * chain is anti-alias and anti-image filtering specified as a fraction of Fs, + * which needs no adjustment. + * + * A decimating FIR filters at its input rate and an interpolating one at its + * output rate. For both of these stages that rate is the audio rate, not the + * 12 ksps the Hilbert transform between them runs at. + * + * @param audioFs_Hz Sample rate of the decimated audio stream + */ +void InitializeTransmitFilterCoeffs(float32_t audioFs_Hz) { + CalcFIRCoeffs(coeffs12K_8K_LPF_FIR, 48, TX_DECIMATE3_FC_HZ, GENERATED_FIR_ATTENUATION_DB, + Lowpass, 0.0f, audioFs_Hz); + NormalizeFIRDCGain(coeffs12K_8K_LPF_FIR, 48); + + CalcFIRCoeffs(FIR_int3_12ksps_48tap_2k7, 48, TX_AUDIO_LPF_FC_HZ, GENERATED_FIR_ATTENUATION_DB, + Lowpass, 0.0f, audioFs_Hz); + NormalizeFIRDCGain(FIR_int3_12ksps_48tap_2k7, 48); +} diff --git a/code/src/PhoenixSketch/FrontPanel.cpp b/code/src/PhoenixSketch/FrontPanel.cpp index b4d7a2c..b5b3dc1 100644 --- a/code/src/PhoenixSketch/FrontPanel.cpp +++ b/code/src/PhoenixSketch/FrontPanel.cpp @@ -37,6 +37,12 @@ static volatile bool interrupted1 = false; static Adafruit_MCP23X17 mcp2; static volatile bool interrupted2 = false; +// Drains the front-panel MCP23017s on a fixed 1 ms tick, decoupled from the main +// loop's display/DSP cadence. Runs at NVIC priority 240 (see InitializeFrontPanel), +// i.e. BELOW the OpenAudio update ISR (priority 208), so encoder/button I2C work +// can never delay audio servicing. +static IntervalTimer fpServiceTimer; + static int32_t button_press_ms; static int32_t ButtonPressed = -1; @@ -223,6 +229,45 @@ static void interrupt2() { mcp2.clearInterrupts(); } +/** + * Hardware ISR for the MCP23017 #1 INT line (pin 14, open-drain active-LOW). + * Deliberately minimal: it only records that an interrupt is pending. The actual + * I2C servicing happens later in ServiceFrontPanel() at a lower priority, so we + * never perform a blocking I2C transfer inside a high-priority GPIO ISR. + */ +FASTRUN +static void fpInterrupt1ISR(void) { + interrupted1 = true; +} + +/** + * Hardware ISR for the MCP23017 #2 INT line (pin 15, open-drain active-LOW). + * See fpInterrupt1ISR() - flag only, no I2C here. + */ +FASTRUN +static void fpInterrupt2ISR(void) { + interrupted2 = true; +} + +/** + * Timer-driven front-panel service routine (1 ms tick, NVIC priority 240). + * Performs the deferred I2C drain for whichever MCP23017 has signalled. The pin + * level is checked as well as the flag: the MCP INT line stays asserted (LOW) + * until its GPIO is read, so testing the level recovers any edge the ISR could + * have missed while the line was already low. + */ +FASTRUN +static void ServiceFrontPanel(void) { + if (interrupted1 || digitalRead(INT_PIN_1) == 0) { + interrupted1 = false; + interrupt1(); + } + if (interrupted2 || digitalRead(INT_PIN_2) == 0) { + interrupted2 = false; + interrupt2(); + } +} + /** * Initialize the front panel hardware. * Configures two MCP23017 I2C GPIO expanders for: @@ -249,6 +294,11 @@ void InitializeFrontPanel(void) { if(failed) return; + // The front-panel MCP23017s are the only devices on Wire1, so raise the bus + // clock from the 100 kHz default to 400 kHz (Fast-mode). This shortens every + // encoder/button register read, letting fast encoder edges be drained quicker. + Wire1.setClock(400000); + // setup the mcp23017 devices mcp1.setupInterrupts(true, true, LOW); mcp2.setupInterrupts(true, true, LOW); @@ -279,7 +329,19 @@ void InitializeFrontPanel(void) { // Configure pins to check for button press interrupts pinMode(INT_PIN_1, INPUT_PULLUP); - pinMode(INT_PIN_2, INPUT_PULLUP); + pinMode(INT_PIN_2, INPUT_PULLUP); + + // Flag-setting ISRs on the MCP INT lines so an encoder edge is noticed + // immediately, instead of waiting for the next main-loop poll. + attachInterrupt(digitalPinToInterrupt(INT_PIN_1), fpInterrupt1ISR, FALLING); + attachInterrupt(digitalPinToInterrupt(INT_PIN_2), fpInterrupt2ISR, FALLING); + + // Drain the front panel every 1 ms at a priority below the audio update ISR. + // NOTE: all IntervalTimers share IRQ_PIT, whose priority is forced to the + // highest (lowest-numbered) requester, so timer1ms is also lowered to 240 in + // setup() (Globals.cpp) - otherwise this drain would run at 128, above audio. + fpServiceTimer.begin(ServiceFrontPanel, 1000); // microseconds -> 1 ms + fpServiceTimer.priority(240); } /** diff --git a/code/src/PhoenixSketch/Globals.cpp b/code/src/PhoenixSketch/Globals.cpp index 0e425b7..39cebf1 100644 --- a/code/src/PhoenixSketch/Globals.cpp +++ b/code/src/PhoenixSketch/Globals.cpp @@ -103,7 +103,10 @@ ReceiveFilterConfig RXTXfilters; ReceiveFilterConfig TXIQfilters; TransmitFilterConfig TXfilters; AGCConfig agc; -uint8_t SampleRate = SAMPLE_RATE_192K; +// SampleRate is a reference to the persisted ED.sampleRate so that the many +// SR[SampleRate] call sites keep working while the value lives in (and is saved +// with) the ED config struct. ED is defined above, so it is constructed first. +uint8_t& SampleRate = ED.sampleRate; const float32_t CWToneOffsetsHz[] = {400, 562.5, 656.5, 750.0, 843.75 }; @@ -504,8 +507,12 @@ time_t getTeensy3Time() { void setup(void){ Serial.begin(115200); +#ifndef AUDIO_INTERFACE + // With a USB audio interface there is only one CDC port and CATSerial is + // Serial, already opened above. See the CATSerial definition in SDT.h. SerialUSB1.begin(38400); // For CAT control Serial.println("T41 SDT Setup"); +#endif // get TIME from real time clock with 3V backup battery setSyncProvider(getTeensy3Time); @@ -556,6 +563,11 @@ void setup(void){ SetupCWKeyInterrupts(); timer1ms.begin(tick1ms, 1000); // run tick1ms every 1ms - + // Run the 1 ms state-machine tick below the audio update ISR (priority 208). + // All IntervalTimers share IRQ_PIT at the highest requested priority, so this + // also governs the front-panel service timer (FrontPanel.cpp); keeping both at + // 240 ensures neither can delay audio servicing. + timer1ms.priority(240); + Serial.println("...Setup done!"); } diff --git a/code/src/PhoenixSketch/HardwareSm.cpp b/code/src/PhoenixSketch/HardwareSm.cpp index dce3953..9fa2d13 100644 --- a/code/src/PhoenixSketch/HardwareSm.cpp +++ b/code/src/PhoenixSketch/HardwareSm.cpp @@ -35,12 +35,14 @@ If not, see . * - Handles user interaction and mode logic * - State changes triggered by button presses, PTT, keyer input * - * 2. RF Hardware States (managed by this module): + * 2. RF Hardware States (managed by this module — HardwareSm is hand-written, NOT + * generated by StateSmith): * - RFReceive: Configure hardware for receiving signals * - RFTransmit: Configure hardware for SSB transmission * - RFCWMark: CW transmission with carrier on (key down) * - RFCWSpace: CW transmission with carrier off (key up) - * - RFCalIQ: Calibration mode (not yet implemented) + * - RFCal* (e.g. RFCalReceiveIQ): calibration signal paths; these drive the four + * generated calibration sub-state-machines * * 3. Tune State Machine (frequency management): * - TuneReceive: Set VFO for RX with IF offset @@ -434,7 +436,7 @@ void HandleRFHardwareStateChange(RFHardwareState newState){ DisableRXVFOOutput(); DisableTXVFOOutput(); // Set frequencyCW_Hz to appropriate value - //SetCWVFOFrequency( GetCWTXFreq_dHz() ); + //SetCWVFOFrequency( GetCWTXFreq_cHz() ); UpdateTuneState(); // Set driveCurrentCW_mA to appropriate value // > This does not change after initialization, so do nothing @@ -542,11 +544,15 @@ void UpdateRFHardwareState(void){ case (ModeSm_StateId_CALIBRATE_FREQUENCY): case (ModeSm_StateId_CALIBRATE_TX_IQ_SPACE): case (ModeSm_StateId_CW_RECEIVE): + // See UpdateTuneState() for why the composite state appears here too + case (ModeSm_StateId_DIGITAL_STATES): + case (ModeSm_StateId_DIGITAL_RECEIVE): case (ModeSm_StateId_SSB_RECEIVE):{ rfHardwareState = RFReceive; break; } case (ModeSm_StateId_CALIBRATE_OFFSET_MARK): + case (ModeSm_StateId_DIGITAL_TRANSMIT): case (ModeSm_StateId_SSB_TRANSMIT):{ rfHardwareState = RFTransmit; break; @@ -656,7 +662,7 @@ void HandleTuneState(TuneState tuneState){ } case TuneSSBTX:{ // SSB Transmit: TXfreq = centerFreq_Hz - int64_t newFreq = GetTXRXFreq_dHz(); + int64_t newFreq = GetTXRXFreq_cHz(); // Set transmit to the TXRX frequency SetTXVFOFrequency( newFreq ); if (HasDualVFOs()){ @@ -668,7 +674,7 @@ void HandleTuneState(TuneState tuneState){ } case TuneCWTX:{ // CW Transmit: TXfreq = centerFreq_Hz - fineTuneFreq_Hz - SampleRate/4 -/+ CWToneOffset - int64_t newFreq = GetCWTXFreq_dHz(); + int64_t newFreq = GetCWTXFreq_cHz(); SetCWVFOFrequency( newFreq ); break; } @@ -684,7 +690,7 @@ void HandleTuneState(TuneState tuneState){ // away from DC in the receive spectrum SetTXVFOFrequency( (ED.centerFreq_Hz[ED.activeVFO] - SR[SampleRate].rate/4)*100 ); } else { - SetTXVFOFrequency( GetTXRXFreq_dHz() ); + SetTXVFOFrequency( GetTXRXFreq_cHz() ); } break; } @@ -718,12 +724,22 @@ void UpdateTuneState(void){ case (ModeSm_StateId_CALIBRATE_TX_IQ_SPACE): case (ModeSm_StateId_CALIBRATE_FREQUENCY): case (ModeSm_StateId_CW_RECEIVE): + // The DIGITAL_STATES composite appears here, not just its children: + // EnterDigitalMode() / ExitDigitalMode() are the composite's entry and + // exit actions and call ChangeSampleRate(), which ends in UpdateTuneState(). + // At that moment the leaf state has not been entered yet, so state_id is + // the composite. It is always on its way to or from a receive state. + case (ModeSm_StateId_DIGITAL_STATES): + case (ModeSm_StateId_DIGITAL_RECEIVE): case (ModeSm_StateId_SSB_RECEIVE):{ tuneState = TuneReceive; break; } case (ModeSm_StateId_CALIBRATE_OFFSET_MARK): + case (ModeSm_StateId_DIGITAL_TRANSMIT): case (ModeSm_StateId_SSB_TRANSMIT):{ + // Digital transmit is an SSB transmission with the audio arriving + // over USB instead of from the microphone, so the VFO setup is the same tuneState = TuneSSBTX; break; } diff --git a/code/src/PhoenixSketch/Loop.cpp b/code/src/PhoenixSketch/Loop.cpp index d058d20..1a1874d 100644 --- a/code/src/PhoenixSketch/Loop.cpp +++ b/code/src/PhoenixSketch/Loop.cpp @@ -356,6 +356,56 @@ void TimerInterrupt(void){ UISm_dispatch_event(&uiSM, UISm_EventId_DO); } +/////////////////////////////////////////////////////////////////////////////// +// Rapid-tuning detection +/////////////////////////////////////////////////////////////////////////////// +// When the Center Tune or Fine Tune encoders are spun quickly the tune events +// queue up and the VFO is reprogrammed on nearly every loop iteration, which +// produces audible glitches and a jerky spectrum sweep. We detect that condition +// here from the timing of consumed tune events; callers (the audio output stage +// and the spectrum redraw) use IsRapidTuning() to mute / pause until it ends. +#ifdef MUTE_ON_RAPID_TUNE +static uint32_t lastTuneEventMs = 0; +static bool rapidTuning = false; +static bool lastTuneWasFine = false; // true if the latest tune event was Fine Tune + +void NoteTuneActivity(bool fineTune){ + uint32_t now = millis(); + // A short gap since the previous tune event means the knob is being spun. + if ((now - lastTuneEventMs) < RAPID_TUNE_ENGAGE_MS) + rapidTuning = true; + lastTuneEventMs = now; + lastTuneWasFine = fineTune; +} + +bool IsRapidTuning(void){ + // Release the latch once tuning has been idle long enough. The subtraction is + // done in uint32_t so it wraps correctly (matching the Teensy millis() width; + // the host test mock returns a wider type, hence the explicit cast). + if (rapidTuning && (((uint32_t)millis() - lastTuneEventMs) > RAPID_TUNE_RELEASE_MS)) + rapidTuning = false; + return rapidTuning; +} + +bool IsRapidCenterTuning(void){ + // Center Tune re-centers the spectrum (it reprograms the VFO), so the whole + // trace/waterfall is frozen while it is spun fast. + return IsRapidTuning() && !lastTuneWasFine; +} + +bool IsRapidFineTuning(void){ + // Fine Tune leaves the center fixed and only slides the tuning marker, so the + // trace is frozen but the blue tuning bar keeps being redrawn at the new marker + // position (see the spectrum pane). + return IsRapidTuning() && lastTuneWasFine; +} +#else +void NoteTuneActivity(bool fineTune){ (void)fineTune; } +bool IsRapidTuning(void){ return false; } +bool IsRapidCenterTuning(void){ return false; } +bool IsRapidFineTuning(void){ return false; } +#endif + /////////////////////////////////////////////////////////////////////////////// // Code for handling button presses and state changes /////////////////////////////////////////////////////////////////////////////// @@ -398,7 +448,8 @@ void HandleButtonPress(int32_t button){ (modeSM.state_id == ModeSm_StateId_CW_TRANSMIT_KEYER_WAIT) || (modeSM.state_id == ModeSm_StateId_CW_TRANSMIT_MARK) || (modeSM.state_id == ModeSm_StateId_CW_TRANSMIT_SPACE) || - (modeSM.state_id == ModeSm_StateId_SSB_TRANSMIT) || + (modeSM.state_id == ModeSm_StateId_SSB_TRANSMIT) || + (modeSM.state_id == ModeSm_StateId_DIGITAL_TRANSMIT) || (modeSM.state_id == ModeSm_StateId_CALIBRATE_POWER_MARK) || (modeSM.state_id == ModeSm_StateId_CALIBRATE_OFFSET_MARK)) return; @@ -474,6 +525,9 @@ void HandleButtonPress(int32_t button){ } // You are in UISm_StateId_[HOME,UPDATE] states case TOGGLE_MODE:{ + // Cycle SSB -> CW -> DIGITAL -> SSB. The DIGITAL leg only + // exists in builds with a USB audio interface; without one + // the cycle is the original SSB <-> CW toggle. switch(modeSM.state_id){ case ModeSm_StateId_SSB_RECEIVE:{ ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_CW_MODE); @@ -481,6 +535,15 @@ void HandleButtonPress(int32_t button){ break; } case ModeSm_StateId_CW_RECEIVE:{ + #ifdef AUDIO_INTERFACE + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + #else + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_SSB_MODE); + #endif + UpdateRFHardwareState(); + break; + } + case ModeSm_StateId_DIGITAL_RECEIVE:{ ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_SSB_MODE); UpdateRFHardwareState(); break; @@ -1072,6 +1135,7 @@ void ConsumeInterrupt(void){ break; } // end of VOLUME_DECREASE, HOME state case (iCENTERTUNE_INCREASE):{ + NoteTuneActivity(false); ED.centerFreq_Hz[ED.activeVFO] += (int64_t)ED.freqIncrement; // Change the band if we tune out of the current band. However, // if we tune to a frequency outside the ham bands, keep the last @@ -1080,6 +1144,7 @@ void ConsumeInterrupt(void){ break; } case (iCENTERTUNE_DECREASE):{ + NoteTuneActivity(false); ED.centerFreq_Hz[ED.activeVFO] -= (int64_t)ED.freqIncrement; // check for minimum frequency supported by Si5351 quadrature signal generator if (ED.centerFreq_Hz[ED.activeVFO] < 250000) @@ -1088,10 +1153,12 @@ void ConsumeInterrupt(void){ break; } case (iFINETUNE_INCREASE):{ + NoteTuneActivity(true); AdjustFineTune(+1); break; } case (iFINETUNE_DECREASE):{ + NoteTuneActivity(true); AdjustFineTune(-1); break; } @@ -1458,9 +1525,57 @@ void ShutdownTeensy(void){ // PC-side one-liner (Python 3): // python -c "import serial,time; s=serial.Serial('COMx',115200); s.write(('T'+str(int(time.time()))+'\n').encode()); s.close()" // Replace COMx with the Teensy USB serial port (e.g. COM6). +// +// Which routine reads the packet depends on the USB type. Without a USB audio +// interface there are two CDC ports and CheckForSerialTimeSync() below has +// Serial to itself. With AUDIO_INTERFACE there is only one, CATSerial is Serial, +// and CheckForCATSerialEvents() drains everything available before this could +// run - so there the CAT reader recognises the packet by its newline terminator +// and calls ApplyTimeSyncDigits() directly. The bytes on the wire are identical +// either way; only the reader that sees them differs. #define TIME_SYNC_HEADER 'T' #define TIME_SYNC_LEN 10 // digits in a Unix timestamp until ~year 2286 +/** + * Set both clocks from the digit field of a PJRC time-sync packet. + * + * Shared by the two readers that can receive the packet so that a build with a + * USB audio interface and a build without accept exactly the same bytes. + * + * @param digits Timestamp digits alone - no 'T' header, no terminator + * @param count Number of digits available + * @return true if the timestamp was valid and the clocks were set + */ +bool ApplyTimeSyncDigits(const char* digits, uint8_t count) { + if (count != TIME_SYNC_LEN) return false; + + // atoll() would accept a leading sign or embedded spaces and quietly stop at + // the first non-digit, so vet every character before trusting the value. The + // CAT reader hands over whatever arrived newline-terminated, which is not + // necessarily a timestamp. + for (uint8_t i = 0; i < count; i++) { + if (digits[i] < '0' || digits[i] > '9') return false; + } + + char tsbuf[TIME_SYNC_LEN + 1]; + memcpy(tsbuf, digits, count); + tsbuf[count] = '\0'; + + time_t t = (time_t)atoll(tsbuf); + if (t <= 1000000000UL) return false; // sanity: after ~2001 + + Teensy3Clock.set(t); + setTime(t); +#ifndef AUDIO_INTERFACE + // Only safe on a two-port build. Where CAT shares this port the confirmation + // would land in the middle of the CAT client's response stream - the same + // reason Debug() is stubbed out in those builds (see SDT.h). + Serial.print("Time set: "); + Serial.println((int64_t)t); +#endif + return true; +} + void CheckForSerialTimeSync(void) { static char tsbuf[TIME_SYNC_LEN + 2]; static uint8_t tsidx = 0; @@ -1474,15 +1589,7 @@ void CheckForSerialTimeSync(void) { memset(tsbuf, 0, sizeof(tsbuf)); } else if (collecting) { if (c == '\n' || c == '\r') { - if (tsidx == TIME_SYNC_LEN) { - time_t t = (time_t)atoll(tsbuf); - if (t > 1000000000UL) { // sanity: after ~2001 - Teensy3Clock.set(t); - setTime(t); - Serial.print("Time set: "); - Serial.println((int64_t)t); - } - } + ApplyTimeSyncDigits(tsbuf, tsidx); collecting = false; tsidx = 0; } else if (tsidx < TIME_SYNC_LEN) { @@ -1503,9 +1610,15 @@ FASTRUN void loop(void){ // Step 1: Check for new events and handle them ProcessKey1Debounce(); ProcessPTTDebounce(); - CheckForFrontPanelInterrupts(); + // Front-panel encoders/buttons are now drained by fpServiceTimer (1 ms, below + // audio priority) instead of being polled here once per loop iteration. CheckForCATSerialEvents(); +#ifndef AUDIO_INTERFACE + // Only on a two-port build. With a USB audio interface CAT owns this port + // and has already drained it, so calling this could only steal the tail of a + // packet the CAT reader is handling; it recognises time packets itself. CheckForSerialTimeSync(); +#endif ConsumeInterrupt(); // Step 2: Perform signal processing diff --git a/code/src/PhoenixSketch/Loop.h b/code/src/PhoenixSketch/Loop.h index 24122dc..8cc4d5c 100644 --- a/code/src/PhoenixSketch/Loop.h +++ b/code/src/PhoenixSketch/Loop.h @@ -90,9 +90,21 @@ void PrependInterrupt(InterruptType i); * @note Packet format: 'T' + 10-digit Unix UTC timestamp + '\n' (or '\r') * @note On valid packet, sets the Teensy hardware RTC and TimeLib software clock * @note Non-blocking; drains the input buffer each call + * @note NOT called when CAT shares this port (AUDIO_INTERFACE); the CAT reader + * recognises the same packet there and hands it to ApplyTimeSyncDigits() */ void CheckForSerialTimeSync(void); +/** + * @brief Set both clocks from the digits of a PJRC time-sync packet + * @param digits The timestamp digits alone - no 'T' header, no terminator + * @param count Number of digits available + * @return true if the timestamp was valid and the clocks were set + * @note Shared by the two readers that can receive the packet, so a build with + * and a build without a USB audio interface accept exactly the same bytes + */ +bool ApplyTimeSyncDigits(const char* digits, uint8_t count); + /** * @brief Main program loop executed repeatedly while radio is powered on * @note FASTRUN annotation places function in RAM for maximum execution speed @@ -146,4 +158,43 @@ size_t GetInterruptFifoSize(void); */ void SetupCWKeyInterrupts(void); +/** + * @brief Record that a Center Tune or Fine Tune event was just acted upon + * @param fineTune true if the event came from the Fine Tune encoder, false for Center Tune + * @note Drives rapid-tuning detection: if the gap since the previous tune event is + * below RAPID_TUNE_ENGAGE_MS, the rapid-tuning latch is set. The encoder source + * is remembered so the spectrum can keep tracking during Fine Tune. + * @note Call once per consumed center/fine tune interrupt. No-op when + * MUTE_ON_RAPID_TUNE is disabled at compile time. + */ +void NoteTuneActivity(bool fineTune); + +/** + * @brief Query whether the operator is currently spinning a tune encoder fast + * @return true while rapid tuning is in effect; false otherwise + * @note The latch auto-clears once no tune event has arrived for + * RAPID_TUNE_RELEASE_MS. Used to mute audio during rapid tuning. + * @note Always returns false when MUTE_ON_RAPID_TUNE is disabled at compile time. + */ +bool IsRapidTuning(void); + +/** + * @brief Query whether rapid tuning is in effect AND driven by the Center Tune encoder + * @return true only while spinning Center Tune fast; false for Fine Tune or when idle + * @note Center Tune re-centers the spectrum (reprograms the VFO), so the whole trace + * and waterfall are frozen while it is spun. + * @note Always returns false when MUTE_ON_RAPID_TUNE is disabled at compile time. + */ +bool IsRapidCenterTuning(void); + +/** + * @brief Query whether rapid tuning is in effect AND driven by the Fine Tune encoder + * @return true only while spinning Fine Tune fast; false for Center Tune or when idle + * @note Fine Tune keeps the center fixed and only slides the marker, so the spectrum + * pane holds the trace frozen but keeps redrawing the blue tuning bar at the + * new marker position. + * @note Always returns false when MUTE_ON_RAPID_TUNE is disabled at compile time. + */ +bool IsRapidFineTuning(void); + #endif // LOOP_H diff --git a/code/src/PhoenixSketch/MainBoard_AudioIO.cpp b/code/src/PhoenixSketch/MainBoard_AudioIO.cpp index 9f52446..1c6aec3 100644 --- a/code/src/PhoenixSketch/MainBoard_AudioIO.cpp +++ b/code/src/PhoenixSketch/MainBoard_AudioIO.cpp @@ -302,6 +302,7 @@ void UpdateAudioIOState(void){ case (ModeSm_StateId_CALIBRATE_FREQUENCY): case (ModeSm_StateId_CALIBRATE_RX_IQ): case (ModeSm_StateId_CW_RECEIVE): + case (ModeSm_StateId_DIGITAL_RECEIVE): case (ModeSm_StateId_SSB_RECEIVE):{ // Microphone input stops Q_in_L_Ex.end(); @@ -347,6 +348,33 @@ void UpdateAudioIOState(void){ MuteMixerChannels(&modeSelectOutR); break; } + case (ModeSm_StateId_DIGITAL_TRANSMIT):{ + // As SSB_TRANSMIT, except the transmit audio arrives over USB rather + // than from the microphone. + // IQ from receive continues + Q_in_L.begin(); + Q_in_R.begin(); + // The microphone queues are kept running even though the audio is + // discarded: they are what paces TransmitProcessing() to the I2S + // block rate. Without that the host's USB clock would drive the DSP + // loop, and the transmit output queue would starve. + Q_in_L_Ex.begin(); + Q_in_R_Ex.begin(); + + // Output is samples to RF transmit + SelectMixerChannel(&modeSelectOutExL,0); + SelectMixerChannel(&modeSelectOutExR,0); + // Input is IQ samples from the receive board + SelectMixerChannel(&modeSelectInL, 0); + SelectMixerChannel(&modeSelectInR, 0); + // The microphone is not the audio source here, so keep it muted + MuteMixerChannels(&modeSelectInExL); + MuteMixerChannels(&modeSelectInExR); + // Mute speaker audio + MuteMixerChannels(&modeSelectOutL); + MuteMixerChannels(&modeSelectOutR); + break; + } case (ModeSm_StateId_CALIBRATE_OFFSET_MARK): case (ModeSm_StateId_CALIBRATE_TX_IQ_MARK):{ // IQ from receive continues @@ -486,13 +514,92 @@ void InitializeAudio(void){ MuteMixerChannels(&modeSelectOutL); // sidetone MuteMixerChannels(&modeSelectOutR); // sidetone sidetone_oscillator.amplitude(ED.sidetoneVolume / 500); - sidetone_oscillator.frequency(SIDETONE_FREQUENCY*AUDIO_SAMPLE_RATE_EXACT/SR[SampleRate].rate); // The transmit IQ cal oscillator. Only used during the TXIQ calibration state transmitIQcal_oscillator.amplitude(40.0/500); + + // Take the USB audio objects off the audio library's graph clock. They are + // paced separately (see USBAudio.cpp); leaving them in update_all() would run + // them at four times their correct rate from boot onwards. + USBAudioInit(); + + // Set the oscillator frequencies for the current sample rate + UpdateSampleRateDependentOscillators(); +} + +/** + * Set the frequencies of the synthesized oscillators that are specified relative + * to the audio sample rate. These must be recomputed whenever the sample rate + * changes so that the sidetone and TX IQ calibration tones stay at the correct + * audible frequency. + */ +void UpdateSampleRateDependentOscillators(void){ + sidetone_oscillator.frequency(SIDETONE_FREQUENCY*AUDIO_SAMPLE_RATE_EXACT/SR[SampleRate].rate); transmitIQcal_oscillator.frequency(800.0f*AUDIO_SAMPLE_RATE_EXACT/SR[SampleRate].rate); } +/** + * Change the radio's audio sample rate at run time. + * + * Reconfigures the I2S clock, rebuilds the sample-rate-dependent DSP filters and + * oscillators, and flushes the audio input queues so that stale samples captured + * at the old rate are not processed at the new rate. Safe to call from the main + * loop (e.g. from a menu selection); it briefly disables audio interrupts while + * the queues are flushed. Does nothing if the requested rate is already active. + * + * @param newRate Sample-rate selector index (e.g. SAMPLE_RATE_192K, SAMPLE_RATE_176K) + */ +void ChangeSampleRate(uint8_t newRate){ + if (newRate == SampleRate) + return; // already at this rate, nothing to do + + // Compensate the tuning for the change in the Fs/4 IF offset so the dial + // (receive) frequency stays constant across the rate change. The RX VFO is + // programmed to centerFreq_Hz and the receive DSP shifts by +Fs/4, so the + // received frequency is centerFreq_Hz - Fs/4. Shift centerFreq_Hz by the + // change in Fs/4 to hold (centerFreq_Hz - Fs/4) constant. Apply to both VFOs + // so a later VFO switch is also correct. Must be computed before SampleRate + // is updated so SR[SampleRate] still refers to the old rate. + int32_t dQuarter_Hz = (int32_t)(SR[newRate].rate / 4) - (int32_t)(SR[SampleRate].rate / 4); + for (int v = 0; v < 2; v++) + ED.centerFreq_Hz[v] += dQuarter_Hz; + + // The USB audio transport is paced against the I2S block rate, so it has to + // be stopped across the reconfiguration and restarted afterwards. Normally + // this is a no-op: DIGITAL mode pins the rate at 176.4 ksps and both the menu + // and the CAT SR command refuse to change it while that mode is active. + bool usbAudioWasRunning = USBAudioIsRunning(); + if (usbAudioWasRunning) + USBAudioEnd(); + + AudioNoInterrupts(); + SampleRate = newRate; + // Reconfigure the I2S peripheral clock to the new rate + SetI2SFreq(SR[SampleRate].rate); + // Rebuild the DSP filter chain, AGC and CW processing for the new rate. The + // decimation filters are re-allocated here; InitializeDecimationFilter frees + // the previous allocations so this does not leak on repeated changes. + InitializeSignalProcessing(); + // Keep the sidetone / cal oscillators at the correct audible frequency + UpdateSampleRateDependentOscillators(); + // Discard samples that were captured at the old rate + Q_in_L.clear(); + Q_in_R.clear(); + Q_in_L_Ex.clear(); + Q_in_R_Ex.clear(); + AudioInterrupts(); + + if (usbAudioWasRunning) + USBAudioBegin(); + + // Re-program the RX VFO (Si5351) for the compensated center frequency so the + // radio stays tuned to the same dial frequency. Done outside the audio- + // interrupt-disabled section because it performs I2C transactions. + UpdateTuneState(); + + Debug("Sample rate changed to " + String(SR[SampleRate].rate) + " Hz"); +} + /** * Set the I2S sample frequency * diff --git a/code/src/PhoenixSketch/MainBoard_AudioIO.h b/code/src/PhoenixSketch/MainBoard_AudioIO.h index 48ab44f..34a7c3d 100644 --- a/code/src/PhoenixSketch/MainBoard_AudioIO.h +++ b/code/src/PhoenixSketch/MainBoard_AudioIO.h @@ -52,6 +52,21 @@ int SetI2SFreq(int freq); */ void InitializeAudio(void); +/** + * @brief Recompute oscillator frequencies that are specified relative to the sample rate + * @note Sets the sidetone and TX IQ calibration oscillator frequencies for SR[SampleRate] + * @note Called by InitializeAudio() and whenever the sample rate changes + */ +void UpdateSampleRateDependentOscillators(void); + +/** + * @brief Change the radio's audio sample rate at run time + * @param newRate Sample-rate selector index (e.g. SAMPLE_RATE_192K, SAMPLE_RATE_176K) + * @note Reconfigures the I2S clock, rebuilds the DSP filter chain and oscillators, and flushes the audio input queues + * @note Safe to call from the main loop; briefly disables audio interrupts. No-op if the rate is unchanged. + */ +void ChangeSampleRate(uint8_t newRate); + /** * @brief Reconfigure audio routing based on current radio mode state * @note Responds to ModeSm state changes by reconfiguring mixers and queues diff --git a/code/src/PhoenixSketch/MainBoard_Display.h b/code/src/PhoenixSketch/MainBoard_Display.h index 0881ca3..750a85e 100644 --- a/code/src/PhoenixSketch/MainBoard_Display.h +++ b/code/src/PhoenixSketch/MainBoard_Display.h @@ -368,6 +368,6 @@ void ChangeFrequencyCorrectionFactorIncrement(void); // External variable declarations (shared between display modules) extern size_t primaryMenuIndex; extern size_t secondaryMenuIndex; -extern struct PrimaryMenuOption primaryMenu[8]; +extern struct PrimaryMenuOption primaryMenu[9]; #endif diff --git a/code/src/PhoenixSketch/MainBoard_DisplayHome.cpp b/code/src/PhoenixSketch/MainBoard_DisplayHome.cpp index 649d354..40a066c 100644 --- a/code/src/PhoenixSketch/MainBoard_DisplayHome.cpp +++ b/code/src/PhoenixSketch/MainBoard_DisplayHome.cpp @@ -224,7 +224,7 @@ static uint8_t activeVFO_old = 10; * Render both VFO A and VFO B frequency displays. */ void DrawVFOPanes(void) { - int64_t TxRxFreq = GetTXRXFreq_dHz()/100; + int64_t TxRxFreq = GetTXRXFreq_cHz()/100; if ((TxRxFreq == TxRxFreq_old) && (ED.activeVFO == activeVFO_old) && (!PaneVFOA.stale) && (!PaneVFOB.stale)) return; @@ -292,6 +292,12 @@ void DrawVFOPanes(void) { tft.print(freqBuffer); PaneVFOB.stale = false; } + + // The font source is sticky in the RA8875 library: setFontScale() does not clear a + // GFX font, only setFontDefault() does. These are the only panes that install one, so + // put the shared font state back before any other pane draws, otherwise those panes + // render their text in FreeSansBold and overflow their boxes. + tft.setFontDefault(); } /////////////////////////////////////////////////////////////////////////////// @@ -343,6 +349,10 @@ void DrawFreqBandModPane(void) { case ModeSm_StateId_SSB_TRANSMIT: tft.print("SSB "); break; + case ModeSm_StateId_DIGITAL_RECEIVE: + case ModeSm_StateId_DIGITAL_TRANSMIT: + tft.print("DATA"); + break; default: tft.print("CW "); break; @@ -468,11 +478,11 @@ static void EffectivePassbandEdges_Hz(int32_t *low_Hz, int32_t *high_Hz){ } /** - * Draw Tuned Bandwidth on Spectrum Plot + * Stamp the tuning bar (filter-bandwidth highlight + cyan center marker) at the + * current tuned frequency onto whichever layer is currently selected for writing. + * Does not clear or switch layers - the caller owns the surface. */ -FASTRUN void DrawBandWidthIndicatorBar(void){ - tft.fillRect(0, SPECTRUM_TOP_Y + 20, MAX_WATERFALL_WIDTH+PaneSpectrum.x0, SPECTRUM_HEIGHT - 20, RA8875_BLACK); - tft.writeTo(L2); +FASTRUN void StampTuningBar(void){ float32_t pixel_per_khz = ((1 << ED.spectrum_zoom) * SPECTRUM_RES * 1000.0 / SR[SampleRate].rate); int16_t vline = SPECTRUM_LEFT_X + FreqToBin(GetTXRXFreq(ED.activeVFO)); @@ -486,6 +496,15 @@ FASTRUN void DrawBandWidthIndicatorBar(void){ tft.drawFastVLine(vline, SPECTRUM_TOP_Y + 20, SPECTRUM_HEIGHT-25, RA8875_CYAN); } +/** + * Draw Tuned Bandwidth on Spectrum Plot + */ +FASTRUN void DrawBandWidthIndicatorBar(void){ + tft.fillRect(0, SPECTRUM_TOP_Y + 20, MAX_WATERFALL_WIDTH+PaneSpectrum.x0, SPECTRUM_HEIGHT - 20, RA8875_BLACK); + tft.writeTo(L2); + StampTuningBar(); +} + /** * Display filter bandwidth and dB scale information on the spectrum pane. */ @@ -528,70 +547,56 @@ void ShowBandwidth() { void DrawFrequencyBarValue(void) { char txt[16]; - int bignum; - int centerIdx; - int pos_help; - float disp_freq; - float freq_calc; - float grat; - int centerLine = MAX_WATERFALL_WIDTH / 2 + SPECTRUM_LEFT_X; - const static int idx2pos[2][9] = { - { -43, 21, 50, 250, 140, 250, 232, 250, 315 }, - { -43, 21, 50, 85, 200, 200, 232, 218, 315 } - }; - - grat = (float)(SR[SampleRate].rate / 8000.0) / (float)(1 << ED.spectrum_zoom); - - tft.setTextColor(RA8875_WHITE); tft.setFontDefault(); tft.setFontScale((enum RA8875tsize)0); - tft.fillRect(0, WATERFALL_TOP_Y, MAX_WATERFALL_WIDTH + PaneSpectrum.x0 + 10, tft.getFontHeight(), RA8875_BLACK); - - freq_calc = (float)GetCenterFreq_Hz(); - - if (ED.spectrum_zoom < 5) { - freq_calc = roundf(freq_calc / 1000); - } - - if (ED.spectrum_zoom != 0) - centerIdx = 0; - else - centerIdx = -2; - - ultoa((freq_calc + (centerIdx * grat)), txt, DEC); - disp_freq = freq_calc + (centerIdx * grat); - bignum = (int)disp_freq; - itoa(bignum, txt, DEC); - tft.setTextColor(RA8875_GREEN); - - if (ED.spectrum_zoom == 0) { - tft.setCursor(centerLine - 140, WATERFALL_TOP_Y); - } else { - tft.setCursor(centerLine - 20, WATERFALL_TOP_Y); + // Clear the tick + label strip. The ticks extend 5 px above WATERFALL_TOP_Y + // (up to the spectrum-pane bottom border), so the clear must start there too; + // otherwise old ticks persist when they move (e.g. on a zoom change), since + // FreqToBin-based ticks are not redrawn at the same pixels each time. + tft.fillRect(0, WATERFALL_TOP_Y - 5, MAX_WATERFALL_WIDTH + PaneSpectrum.x0 + 10, tft.getFontHeight() + 5, RA8875_BLACK); + // Restore the spectrum-pane bottom border that the clear above overlaps. + tft.drawFastHLine(PaneSpectrum.x0 - 2, WATERFALL_TOP_Y - 5, MAX_WATERFALL_WIDTH + 5, RA8875_YELLOW); + + // Position every tick/label from its frequency via FreqToBin() - the same + // mapping the spectrum trace uses - so ticks stay aligned with the trace at any + // sample rate. (The previous version used a hand-tuned fixed pixel table and a + // non-round label step, which drifted at sample rates other than 192 ksps.) + int64_t lower_Hz = GetLowerFreq_Hz(); + int64_t upper_Hz = GetUpperFreq_Hz(); + int64_t center_Hz = GetCenterFreq_Hz(); + double span_kHz = (double)(upper_Hz - lower_Hz) / 1000.0; + + // Choose a "nice" label step (1/2/5 x 10^n kHz) giving roughly 8 divisions. + double raw = span_kHz / 8.0; + double mag = pow(10.0, floor(log10(raw))); + double norm = raw / mag; + double step_kHz = (norm < 1.5 ? 1.0 : (norm < 3.0 ? 2.0 : (norm < 7.0 ? 5.0 : 10.0))) * mag; + + int charW = tft.getFontWidth(); + // First labelled frequency at or above the lower edge, snapped to the step. + double first_kHz = ceil((double)lower_Hz / 1000.0 / step_kHz) * step_kHz; + + for (double f_kHz = first_kHz; f_kHz * 1000.0 <= (double)upper_Hz; f_kHz += step_kHz) { + int64_t f_Hz = (int64_t)llround(f_kHz * 1000.0); + int16_t px = SPECTRUM_LEFT_X + FreqToBin(f_Hz); + + if (step_kHz >= 1.0) + snprintf(txt, sizeof(txt), "%ld", (long)llround(f_kHz)); + else + snprintf(txt, sizeof(txt), "%.1f", f_kHz); + + // Highlight the tick nearest the center frequency in green. + int64_t dCenter = (f_Hz > center_Hz) ? (f_Hz - center_Hz) : (center_Hz - f_Hz); + tft.setTextColor(dCenter < (int64_t)(step_kHz * 500.0) ? RA8875_GREEN : RA8875_WHITE); + + // Yellow tick mark with the label centered underneath it. + tft.drawFastVLine(px, WATERFALL_TOP_Y - 5, 7, RA8875_YELLOW); + int16_t labelX = px - (int16_t)(strlen(txt) * charW) / 2; + if (labelX < SPECTRUM_LEFT_X) labelX = SPECTRUM_LEFT_X; + tft.setCursor(labelX, WATERFALL_TOP_Y); + tft.print(txt); } - tft.print(txt); tft.setTextColor(RA8875_WHITE); - - for (int idx = -4; idx < 5; idx++) { - pos_help = idx2pos[ED.spectrum_zoom < 3 ? 0 : 1][idx + 4]; - if (idx != centerIdx) { - ultoa((freq_calc + (idx * grat)), txt, DEC); - if (ED.spectrum_zoom == 0) { - tft.setCursor(WATERFALL_LEFT_X + pos_help * xExpand + 40, WATERFALL_TOP_Y); - } else { - tft.setCursor(WATERFALL_LEFT_X + pos_help * xExpand + 40, WATERFALL_TOP_Y); - } - tft.print(txt); - if (idx < 4) { - tft.drawFastVLine((WATERFALL_LEFT_X + pos_help * xExpand + 60), WATERFALL_TOP_Y - 5, 7, RA8875_YELLOW); - } else { - tft.drawFastVLine((WATERFALL_LEFT_X + (pos_help + 9) * xExpand + 60), WATERFALL_TOP_Y - 5, 7, RA8875_YELLOW); - } - } - if (ED.spectrum_zoom > 2 || freq_calc > 1000) { - idx++; - } - } } // State tracking for S-meter display @@ -675,7 +680,7 @@ FASTRUN int16_t pixelnew(uint32_t i){ FASTRUN void ShowSpectrum(void){ // Sweep-start: prime L2 with a fresh spectrum surface + current filter bar. if (x1 == 0) { spectrumChunkIdx = 0; spectrumFrameCtr++; } // new sweep: reset chunk idx, advance frame counter - if (x1 == 0 && modeSM.state_id != ModeSm_StateId_SSB_TRANSMIT) { + if (x1 == 0 && !IsSSBTransmit()) { tft.writeTo(L2); DrawBandWidthIndicatorBar(); // its opening fillRect clears the spectrum body (y >= top+20) // Restamp the yellow frame: DrawBandWidthIndicatorBar's clear overlaps @@ -714,7 +719,7 @@ FASTRUN void ShowSpectrum(void){ // ~13 ms/frame, so it is throttled to every AUDIO_SPECTRUM_DECIMATE-th frame to free real-time // budget for the main spectrum/waterfall. The waterfall colour computation is NOT throttled. tft.writeTo(L1); - if (modeSM.state_id != ModeSm_StateId_SSB_TRANSMIT){ + if (!IsSSBTransmit()){ bool drawAudioSpectrum = (spectrumFrameCtr % AUDIO_SPECTRUM_DECIMATE) == 0; for (int16_t xb = x1_start + 1; xb <= x1; xb++){ if (drawAudioSpectrum && xb < 128) { @@ -750,7 +755,7 @@ FASTRUN void ShowSpectrum(void){ psdupdated = false; redrawSpectrum = false; - if (modeSM.state_id == ModeSm_StateId_SSB_TRANSMIT) + if (IsSSBTransmit()) return; // don't do the rest of these steps in transmit mode // if we're shifting the spectrum automatically, update the adjustment @@ -793,6 +798,57 @@ FASTRUN void ShowSpectrum(void){ } } +#ifdef MUTE_ON_RAPID_TUNE +// State for the Fine Tune "frozen trace, moving bar" fast path. +static bool fineFreezeBackdropReady = false; // L2 holds a clean (bar-less) trace +static int64_t fineFreezeLastFreq = 0; // last marker freq we stamped + +/** + * Build the clean (bar-less) frozen-trace backdrop on the L2 back-buffer from + * pixelold[] (the per-column y values from the last completed sweep). Built once per + * Fine Tune freeze episode; every later bar update just blits this backdrop back to + * L1 to erase the old bar, which is far cheaper than repainting the whole trace. + */ +FASTRUN static void BuildFrozenBackdrop(void){ + tft.writeTo(L2); + tft.fillRect(0, SPECTRUM_TOP_Y + 20, MAX_WATERFALL_WIDTH + PaneSpectrum.x0, + SPECTRUM_HEIGHT - 20, RA8875_BLACK); + tft.drawRect(PaneSpectrum.x0-2, PaneSpectrum.y0, MAX_WATERFALL_WIDTH+5, SPECTRUM_HEIGHT, RA8875_YELLOW); + for (int16_t x = 1; x < MAX_WATERFALL_WIDTH; x++) + tft.drawLine(SPECTRUM_LEFT_X + x, pixelold[x-1], SPECTRUM_LEFT_X + x, pixelold[x], RA8875_YELLOW); + tft.writeTo(L1); +} + +/** + * Redraw the tuning bar over the *frozen* spectrum trace at the current Fine Tune + * position (FASTRUN - executes from RAM). + * + * Used while the Fine Tune knob is being spun fast: the center stays fixed, so the + * trace is held still (paused) and only the blue filter bar + cyan marker move to + * track where the operator is tuning. The first call builds a clean bar-less backdrop + * on L2; each call then hardware-blits that backdrop to L1 (erasing the previous bar) + * and stamps the bar at the current frequency on top. The waterfall is left frozen. + */ +FASTRUN void RedrawFrozenSpectrumWithBar(void){ + if (IsSSBTransmit()) return; + + if (!fineFreezeBackdropReady){ + BuildFrozenBackdrop(); + fineFreezeBackdropReady = true; + } + + // Restore the clean trace under the previous bar in one hardware BTE blit (L2->L1). + tft.BTE_move(SPECTRUM_LEFT_X, SPECTRUM_TOP_Y + 20, + MAX_WATERFALL_WIDTH, SPECTRUM_HEIGHT - 20, + SPECTRUM_LEFT_X, SPECTRUM_TOP_Y + 20, 2, 1); + while (tft.readStatus()) ; + + // Stamp the bar at the new tuned frequency directly on the visible layer. + tft.writeTo(L1); + StampTuningBar(); +} +#endif + // State tracking for spectrum pane updates static uint32_t oz = 8; static int64_t ocf = 0; @@ -803,6 +859,34 @@ static ModulationType omd = IQ; * Render the RF spectrum display pane with waterfall. */ void DrawSpectrumPane(void) { +#ifdef MUTE_ON_RAPID_TUNE + // While the Center Tune knob is being spun fast, freeze the spectrum/waterfall: + // the trace and overlay would otherwise re-center and clear on nearly every loop, + // producing a jerky, half-drawn sweep. Mark the pane stale so it gets one clean + // repaint once tuning stops, and leave the last frozen trace on screen until then. + if (IsRapidCenterTuning()){ + PaneSpectrum.stale = true; + fineFreezeBackdropReady = false; // any held fine-tune backdrop is now stale + tft.writeTo(L1); + return; + } + // While the Fine Tune knob is being spun fast, the center stays put, so hold the + // trace frozen (no re-sweep) and only move the blue tuning bar/marker so the + // operator can see where they are tuning. Redraw on every frequency change (not on + // the 50 ms refresh timer) - each update is a cheap hardware blit + bar stamp, so + // the bar tracks the knob with no perceptible lag. + if (IsRapidFineTuning()){ + PaneSpectrum.stale = true; // force a clean overlay repaint once tuning stops + int64_t f = GetTXRXFreq(ED.activeVFO); + if (!fineFreezeBackdropReady || f != fineFreezeLastFreq){ + RedrawFrozenSpectrumWithBar(); + fineFreezeLastFreq = f; + } + tft.writeTo(L1); + return; + } + fineFreezeBackdropReady = false; // not fine-tuning: drop any held backdrop +#endif if ((oz != ED.spectrum_zoom) || (ocf != ED.centerFreq_Hz[ED.activeVFO]) || (oft != ED.fineTuneFreq_Hz[ED.activeVFO]) || @@ -818,6 +902,19 @@ void DrawSpectrumPane(void) { tft.writeTo(L1); return; } + + // The static spectrum overlay (frequency labels + bandwidth/tuning bar) is + // redrawn on the L2 back-buffer, and DrawBandWidthIndicatorBar()'s opening + // fillRect clears the entire L2 spectrum body. If that runs mid-sweep it wipes + // the chunks ShowSpectrum() has already drawn for the current frame, leaving + // large blank regions (and a stale/duplicated tuning bar) when tuning rapidly. + // x1 != 0 means a chunked sweep is in progress, so defer the refresh - leaving + // PaneSpectrum.stale set - until the sweep is at a frame boundary (x1 == 0). + if (x1 != 0) { + tft.writeTo(L1); + return; + } + oz = ED.spectrum_zoom; ocf = ED.centerFreq_Hz[ED.activeVFO]; oft = ED.fineTuneFreq_Hz[ED.activeVFO]; @@ -893,7 +990,7 @@ void DrawVUBar(int16_t x0, int16_t y0, float32_t RMSval){ * VU meters of transmit amplitude in SSB transmit mode. */ void DrawStateOfHealthPane(void) { - if ((modeSM.state_id == ModeSm_StateId_SSB_TRANSMIT) && PaneStateOfHealth.stale){ + if (IsSSBTransmit() && PaneStateOfHealth.stale){ // Draw some color bars to warn when the audio power is getting too large for // the transmit IQ chain. The RF board starts to clip when RMS values exceed 0.6. @@ -1081,10 +1178,12 @@ void DrawTXRXStatusPane(void) { if (oldMState != modeSM.state_id){ switch (modeSM.state_id){ case ModeSm_StateId_CW_RECEIVE: + case ModeSm_StateId_DIGITAL_RECEIVE: case ModeSm_StateId_SSB_RECEIVE: PaneTXRXStatus.stale = true; state = RX; break; + case ModeSm_StateId_DIGITAL_TRANSMIT: case ModeSm_StateId_SSB_TRANSMIT: case ModeSm_StateId_CW_TRANSMIT_KEYER_WAIT: case ModeSm_StateId_CW_TRANSMIT_DAH_MARK: @@ -1209,15 +1308,21 @@ void DrawAudioSpectContainer() { tft.setFontScale((enum RA8875tsize)0); tft.setTextColor(RA8875_WHITE); tft.drawRect(PaneAudioSpectrum.x0, PaneAudioSpectrum.y0, PaneAudioSpectrum.width, AUDIO_SPECTRUM_BOTTOM-PaneAudioSpectrum.y0, RA8875_GREEN); - for (int k = 0; k < 6; k++) { - tft.drawFastVLine(PaneAudioSpectrum.x0 + k * 43.8, AUDIO_SPECTRUM_BOTTOM, 15, RA8875_GREEN); - tft.setCursor(PaneAudioSpectrum.x0 - 4 + k * 43.8, AUDIO_SPECTRUM_BOTTOM + 16); + // The audio spectrum shows the first 128 bins of a 512-point FFT of the audio, + // which runs at Fs/8. So the 256-pixel-wide pane (bin k drawn at pixel 2k) spans + // 0 .. 128*(Fs/8)/512 = Fs/32 Hz (6 kHz at 192ksps, 5.5 kHz at 176.4ksps). + // Deriving the axis from the sample rate keeps the ticks/markers correct at any rate. + int32_t audioSpan_Hz = SR[SampleRate].rate / 32; + float pxPerKHz = 256.0f * 1000.0f / (float)audioSpan_Hz; + for (int k = 0; k * 1000 <= audioSpan_Hz; k++) { + tft.drawFastVLine(PaneAudioSpectrum.x0 + (int)(k * pxPerKHz), AUDIO_SPECTRUM_BOTTOM, 15, RA8875_GREEN); + tft.setCursor(PaneAudioSpectrum.x0 - 4 + (int)(k * pxPerKHz), AUDIO_SPECTRUM_BOTTOM + 16); tft.print(k); tft.print("k"); } tft.writeTo(L2); - int16_t fLo = map(olo, 0, 6000, 0, 256); - int16_t fHi = map(ohi, 0, 6000, 0, 256); + int16_t fLo = map(olo, 0, audioSpan_Hz, 0, 256); + int16_t fHi = map(ohi, 0, audioSpan_Hz, 0, 256); tft.drawFastVLine(PaneAudioSpectrum.x0 + 2 + abs(fLo), PaneAudioSpectrum.y0+2, AUDIO_SPECTRUM_BOTTOM-PaneAudioSpectrum.y0-3, RA8875_BLACK); tft.drawFastVLine(PaneAudioSpectrum.x0 + 2 + abs(fHi), PaneAudioSpectrum.y0+2, AUDIO_SPECTRUM_BOTTOM-PaneAudioSpectrum.y0-3, RA8875_BLACK); @@ -1228,17 +1333,17 @@ void DrawAudioSpectContainer() { // every mode - overlapping harmlessly in the AM/SAM case. int32_t low_Hz, high_Hz; EffectivePassbandEdges_Hz(&low_Hz, &high_Hz); - int16_t filterLoPositionMarker = map(low_Hz, 0, 6000, 0, 256); - int16_t filterHiPositionMarker = map(high_Hz, 0, 6000, 0, 256); + int16_t filterLoPositionMarker = map(low_Hz, 0, audioSpan_Hz, 0, 256); + int16_t filterHiPositionMarker = map(high_Hz, 0, audioSpan_Hz, 0, 256); tft.drawFastVLine(PaneAudioSpectrum.x0 + 2 + abs(filterLoPositionMarker), PaneAudioSpectrum.y0+2, AUDIO_SPECTRUM_BOTTOM-PaneAudioSpectrum.y0-3, RA8875_LIGHT_GREY); tft.drawFastVLine(PaneAudioSpectrum.x0 + 2 + abs(filterHiPositionMarker), PaneAudioSpectrum.y0+2, AUDIO_SPECTRUM_BOTTOM-PaneAudioSpectrum.y0-3, RA8875_LIGHT_GREY); if (modeSM.state_id == ModeSm_StateId_CW_RECEIVE){ int16_t fcutoffs[] = {840,1080,1320,1800,2000,0}; - int16_t fcw = map(fcutoffs[ofi], 0, 6000, 0, 256); + int16_t fcw = map(fcutoffs[ofi], 0, audioSpan_Hz, 0, 256); tft.drawFastVLine(PaneAudioSpectrum.x0 + 2 + fcw, PaneAudioSpectrum.y0+2, AUDIO_SPECTRUM_BOTTOM-PaneAudioSpectrum.y0-3, RA8875_BLACK); - int16_t cwFilterPosition = map(fcutoffs[ED.CWFilterIndex], 0, 6000, 0, 256); + int16_t cwFilterPosition = map(fcutoffs[ED.CWFilterIndex], 0, audioSpan_Hz, 0, 256); if (cwFilterPosition > 0) tft.drawFastVLine(PaneAudioSpectrum.x0 + 2 + cwFilterPosition, PaneAudioSpectrum.y0+2, AUDIO_SPECTRUM_BOTTOM-PaneAudioSpectrum.y0-3, RA8875_YELLOW); } @@ -1449,7 +1554,9 @@ void UpdateRFGainSetting(void){ case ModeSm_StateId_CW_RECEIVE: comp = ED.XAttenCW[ED.currentBand[ED.activeVFO]]; break; + case ModeSm_StateId_DIGITAL_RECEIVE: case ModeSm_StateId_SSB_RECEIVE: + // Digital transmit uses the SSB transmit path, so no CW attenuation comp = 0.0; break; default: @@ -1544,6 +1651,22 @@ void UpdateKeyTypeSetting(void){ UpdateSetting(tft.getFontWidth(), tft.getFontHeight(), column1x, (char *)"Key Type:", 9, valueText, 15, + PaneSettings.height/5 + 6*tft.getFontHeight() + 1,true,true); +} + +// State tracking for sample rate setting display +static uint8_t oldSampleRateSetting = 0xFF; + +void UpdateSampleRateSetting(void){ + if ((oldSampleRateSetting == SampleRate) && (!PaneSettings.stale)) + return; + oldSampleRateSetting = SampleRate; + tft.setFontScale((enum RA8875tsize)0); + char valueText[8]; + sprintf(valueText,"%s",SR[SampleRate].text); + UpdateSetting(tft.getFontWidth(), tft.getFontHeight(), column1x, + (char *)"Rate:", 5, + valueText, 7, PaneSettings.height/5 + 5*tft.getFontHeight() + 1,true,true); } @@ -1615,9 +1738,11 @@ void UpdateAntennaSetting(void){ } void DrawSettingsPane(void) { + // The individual settings only set the font scale, so select the built-in font here + // for all of them rather than inheriting whatever font was last installed. + tft.setFontDefault(); if (PaneSettings.stale){ tft.fillRect(PaneSettings.x0, PaneSettings.y0, PaneSettings.width, PaneSettings.height, RA8875_BLACK); - tft.setFontDefault(); tft.setFontScale((enum RA8875tsize)1); column1x = 5.5*tft.getFontWidth(); column2x = 13.5*tft.getFontWidth(); @@ -1630,6 +1755,7 @@ void DrawSettingsPane(void) { UpdateRFGainSetting(); UpdateNoiseSetting(); UpdateZoomSetting(); + UpdateSampleRateSetting(); UpdateKeyTypeSetting(); UpdateDecoderSetting(); UpdateDSPGainSetting(); @@ -1651,6 +1777,7 @@ void MorseCharacterDisplay() { if (!IsMorseCharacterBufferUpdated()) return; tft.fillRect(PaneStateOfHealth.x0, PaneStateOfHealth.y0, PaneStateOfHealth.width, PaneStateOfHealth.height+2, RA8875_BLACK); + tft.setFontDefault(); tft.setFontScale((enum RA8875tsize)1); tft.setTextColor(RA8875_WHITE); tft.setCursor(PaneStateOfHealth.x0, PaneStateOfHealth.y0); @@ -1718,7 +1845,7 @@ void DrawHome(){ timerDisplay_ms = millis(); if (redrawSpectrum == false) redrawSpectrum = true; - if (modeSM.state_id == ModeSm_StateId_SSB_TRANSMIT) + if (IsSSBTransmit()) PaneStateOfHealth.stale = true; } for (size_t i = 0; i < NUMBER_OF_PANES; i++){ diff --git a/code/src/PhoenixSketch/MainBoard_DisplayMenus.cpp b/code/src/PhoenixSketch/MainBoard_DisplayMenus.cpp index a872c80..85c9e2e 100644 --- a/code/src/PhoenixSketch/MainBoard_DisplayMenus.cpp +++ b/code/src/PhoenixSketch/MainBoard_DisplayMenus.cpp @@ -466,8 +466,27 @@ VariableParameter micg = { .limits = {.i32 = {.min = -10, .max=30, .step=1}} }; -struct SecondaryMenuOption MicOptions[1] = { +// Drive level applied in software to the USB transmit audio in digital mode - +// the digital-mode equivalent of microphone gain. +VariableParameter digdrive = { + .variable = &ED.digitalDriveLevel, + .type = TYPE_I32, + .limits = {.i32 = {.min = 0, .max=100, .step=1}} +}; + +// Level applied to the USB receive audio sent to the host. With AGC off the +// receive chain applies a fixed gain, so this is the only thing standing between +// a strong signal and a clipped USB stream. +VariableParameter digrx = { + .variable = &ED.digitalRxLevel, + .type = TYPE_I32, + .limits = {.i32 = {.min = 0, .max=100, .step=1}} +}; + +struct SecondaryMenuOption MicOptions[3] = { "Mic gain", variableOption, &micg, NULL, NULL, + "USB drive", variableOption, &digdrive, NULL, NULL, + "USB RX level", variableOption, &digrx, NULL, NULL, }; // Calibration Menu @@ -577,9 +596,29 @@ struct SecondaryMenuOption DiagnosticOptions[3] = { "Buffer print", functionOption, NULL, (void *)buffer_pretty_print_last_entry, NULL, }; +// Sample Rate Menu +/** + * Menu callback to run the radio at 192 ksps. Changes the sample rate at run time. + */ +void SelectSampleRate192(void){ + ChangeSampleRate(SAMPLE_RATE_192K); +} + +/** + * Menu callback to run the radio at 176.4 ksps. Changes the sample rate at run time. + */ +void SelectSampleRate176(void){ + ChangeSampleRate(SAMPLE_RATE_176K); +} + +struct SecondaryMenuOption SampleRateOptions[2] = { + "192 ksps", functionOption, NULL, (void *)SelectSampleRate192, NULL, + "176.4 ksps", functionOption, NULL, (void *)SelectSampleRate176, NULL, +}; + // Primary menu structure -struct PrimaryMenuOption primaryMenu[8] = { +struct PrimaryMenuOption primaryMenu[9] = { "RF Options", RFSet, sizeof(RFSet)/sizeof(RFSet[0]), "CW Options", CWOptions, sizeof(CWOptions)/sizeof(CWOptions[0]), "Microphone", MicOptions, sizeof(MicOptions)/sizeof(MicOptions[0]), @@ -588,6 +627,7 @@ struct PrimaryMenuOption primaryMenu[8] = { "EEPROM", EEPROMOptions, sizeof(EEPROMOptions)/sizeof(EEPROMOptions[0]), "Calibration", CalOptions, sizeof(CalOptions)/sizeof(CalOptions[0]), "Diagnostics", DiagnosticOptions, sizeof(DiagnosticOptions)/sizeof(DiagnosticOptions[0]), + "Sample Rate", SampleRateOptions, sizeof(SampleRateOptions)/sizeof(SampleRateOptions[0]), }; /** diff --git a/code/src/PhoenixSketch/Mode.cpp b/code/src/PhoenixSketch/Mode.cpp index c265b4d..e34758d 100644 --- a/code/src/PhoenixSketch/Mode.cpp +++ b/code/src/PhoenixSketch/Mode.cpp @@ -39,3 +39,43 @@ void ModeCWTransmitSpaceEnter(void){ bool IsTxAllowed(void) { return bands[ED.currentBand[ED.activeVFO]].band_type == HAM_BAND; } + +bool IsSSBTransmit(void) { + return (modeSM.state_id == ModeSm_StateId_SSB_TRANSMIT) || + (modeSM.state_id == ModeSm_StateId_DIGITAL_TRANSMIT); +} + +// The sample rate the radio was using before DIGITAL mode was entered, so it can +// be put back on the way out. SAMPLE_RATE_MAX+1 means "nothing saved". +#define NO_SAVED_SAMPLE_RATE (SAMPLE_RATE_MAX + 1) +static uint8_t preDigitalSampleRate = NO_SAVED_SAMPLE_RATE; + +/** + * Entry action for the DIGITAL_STATES composite. + * + * DIGITAL mode only works at 176.4 ksps: that is the rate at which the receive + * chain's Fs/4 tap is exactly 44,100 Hz and one DSP block is exactly 512 samples, + * which is what lets the USB audio endpoint run at its native 44.1 kHz with no + * resampling. Force the rate here and remember what to restore. + */ +void EnterDigitalMode(void){ + preDigitalSampleRate = SampleRate; + // ChangeSampleRate() is a no-op if we are already at 176.4 ksps + ChangeSampleRate(SAMPLE_RATE_176K); + USBAudioBegin(); +} + +/** + * Exit action for the DIGITAL_STATES composite. + * + * Runs on every way out - the mode buttons, a CAT command, or a calibration + * event dispatched at the NORMAL_STATES level - so the sample rate is always + * restored no matter how DIGITAL mode is left. + */ +void ExitDigitalMode(void){ + USBAudioEnd(); + if (preDigitalSampleRate != NO_SAVED_SAMPLE_RATE){ + ChangeSampleRate(preDigitalSampleRate); + preDigitalSampleRate = NO_SAVED_SAMPLE_RATE; + } +} diff --git a/code/src/PhoenixSketch/Mode.h b/code/src/PhoenixSketch/Mode.h index ab2c7f0..f65aa50 100644 --- a/code/src/PhoenixSketch/Mode.h +++ b/code/src/PhoenixSketch/Mode.h @@ -34,9 +34,35 @@ void UpdateHardwareState(void); void ModeCWTransmitSpaceEnter(void); /** - * @brief Checks if transmit is allowed for the current band + * @brief Checks if transmit is allowed for the current band * @note Used as guard for transitions to transmit states */ bool IsTxAllowed(void); +/** + * @brief Checks if the radio is transmitting through the SSB transmit path + * @return true in SSB_TRANSMIT or DIGITAL_TRANSMIT + * @note Digital mode transmits an SSB signal with the audio sourced from USB, so + * the two states behave identically for the display and the DSP chain + */ +bool IsSSBTransmit(void); + +// Digital (USB audio) mode + +/** + * @brief Enter digital mode: force 176.4 ksps and start the USB audio transport + * @note Called by ModeSm state machine when entering the DIGITAL_STATES composite + * @note Saves the previous sample rate for ExitDigitalMode() to restore + * @note 176.4 ksps is required: it puts the receive chain's Fs/4 tap at exactly + * 44,100 Hz, so the USB audio endpoint needs no resampling + */ +void EnterDigitalMode(void); + +/** + * @brief Leave digital mode: stop USB audio and restore the previous sample rate + * @note Called by ModeSm state machine when exiting the DIGITAL_STATES composite, + * including via a calibration event dispatched at the NORMAL_STATES level + */ +void ExitDigitalMode(void); + #endif // MODE_H diff --git a/code/src/PhoenixSketch/ModeSm.cpp b/code/src/PhoenixSketch/ModeSm.cpp index 2e31768..21e0108 100644 --- a/code/src/PhoenixSketch/ModeSm.cpp +++ b/code/src/PhoenixSketch/ModeSm.cpp @@ -113,6 +113,8 @@ static void CW_RECEIVE_do(ModeSm* sm); static void CW_RECEIVE_key_pressed(ModeSm* sm); +static void CW_RECEIVE_to_digital_mode(ModeSm* sm); + static void CW_RECEIVE_to_ssb_mode(ModeSm* sm); static void CW_TRANSMIT_DAH_MARK_enter(ModeSm* sm); @@ -157,6 +159,28 @@ static void CW_TRANSMIT_SPACE_do(ModeSm* sm); static void CW_TRANSMIT_SPACE_key_pressed(ModeSm* sm); +static void DIGITAL_STATES_enter(ModeSm* sm); + +static void DIGITAL_STATES_exit(ModeSm* sm); + +static void DIGITAL_STATES_InitialState_transition(ModeSm* sm); + +static void DIGITAL_RECEIVE_enter(ModeSm* sm); + +static void DIGITAL_RECEIVE_exit(ModeSm* sm); + +static void DIGITAL_RECEIVE_ptt_pressed(ModeSm* sm); + +static void DIGITAL_RECEIVE_to_cw_mode(ModeSm* sm); + +static void DIGITAL_RECEIVE_to_ssb_mode(ModeSm* sm); + +static void DIGITAL_TRANSMIT_enter(ModeSm* sm); + +static void DIGITAL_TRANSMIT_exit(ModeSm* sm); + +static void DIGITAL_TRANSMIT_ptt_released(ModeSm* sm); + static void SSB_RECEIVE_enter(ModeSm* sm); static void SSB_RECEIVE_exit(ModeSm* sm); @@ -165,6 +189,8 @@ static void SSB_RECEIVE_ptt_pressed(ModeSm* sm); static void SSB_RECEIVE_to_cw_mode(ModeSm* sm); +static void SSB_RECEIVE_to_digital_mode(ModeSm* sm); + static void SSB_TRANSMIT_enter(ModeSm* sm); static void SSB_TRANSMIT_exit(ModeSm* sm); @@ -336,6 +362,7 @@ void ModeSm_dispatch_event(ModeSm* sm, ModeSm_EventId event_id) case ModeSm_EventId_KEY_PRESSED: CW_RECEIVE_key_pressed(sm); break; case ModeSm_EventId_DAH_PRESSED: CW_RECEIVE_dah_pressed(sm); break; case ModeSm_EventId_DIT_PRESSED: CW_RECEIVE_dit_pressed(sm); break; + case ModeSm_EventId_TO_DIGITAL_MODE: CW_RECEIVE_to_digital_mode(sm); break; case ModeSm_EventId_CALIBRATE_FREQUENCY: NORMAL_STATES_calibrate_frequency(sm); break; // First ancestor handler for this event case ModeSm_EventId_CALIBRATE_RX_IQ: NORMAL_STATES_calibrate_rx_iq(sm); break; // First ancestor handler for this event case ModeSm_EventId_CALIBRATE_TX_IQ: NORMAL_STATES_calibrate_tx_iq(sm); break; // First ancestor handler for this event @@ -432,12 +459,56 @@ void ModeSm_dispatch_event(ModeSm* sm, ModeSm_EventId event_id) } break; + // STATE: DIGITAL_STATES + case ModeSm_StateId_DIGITAL_STATES: + switch (event_id) + { + case ModeSm_EventId_CALIBRATE_FREQUENCY: NORMAL_STATES_calibrate_frequency(sm); break; // First ancestor handler for this event + case ModeSm_EventId_CALIBRATE_RX_IQ: NORMAL_STATES_calibrate_rx_iq(sm); break; // First ancestor handler for this event + case ModeSm_EventId_CALIBRATE_TX_IQ: NORMAL_STATES_calibrate_tx_iq(sm); break; // First ancestor handler for this event + case ModeSm_EventId_CALIBRATE_POWER: NORMAL_STATES_calibrate_power(sm); break; // First ancestor handler for this event + + default: break; // to avoid "unused enumeration value in switch" warning + } + break; + + // STATE: DIGITAL_RECEIVE + case ModeSm_StateId_DIGITAL_RECEIVE: + switch (event_id) + { + case ModeSm_EventId_PTT_PRESSED: DIGITAL_RECEIVE_ptt_pressed(sm); break; + case ModeSm_EventId_TO_SSB_MODE: DIGITAL_RECEIVE_to_ssb_mode(sm); break; + case ModeSm_EventId_TO_CW_MODE: DIGITAL_RECEIVE_to_cw_mode(sm); break; + case ModeSm_EventId_CALIBRATE_FREQUENCY: NORMAL_STATES_calibrate_frequency(sm); break; // First ancestor handler for this event + case ModeSm_EventId_CALIBRATE_RX_IQ: NORMAL_STATES_calibrate_rx_iq(sm); break; // First ancestor handler for this event + case ModeSm_EventId_CALIBRATE_TX_IQ: NORMAL_STATES_calibrate_tx_iq(sm); break; // First ancestor handler for this event + case ModeSm_EventId_CALIBRATE_POWER: NORMAL_STATES_calibrate_power(sm); break; // First ancestor handler for this event + + default: break; // to avoid "unused enumeration value in switch" warning + } + break; + + // STATE: DIGITAL_TRANSMIT + case ModeSm_StateId_DIGITAL_TRANSMIT: + switch (event_id) + { + case ModeSm_EventId_PTT_RELEASED: DIGITAL_TRANSMIT_ptt_released(sm); break; + case ModeSm_EventId_CALIBRATE_FREQUENCY: NORMAL_STATES_calibrate_frequency(sm); break; // First ancestor handler for this event + case ModeSm_EventId_CALIBRATE_RX_IQ: NORMAL_STATES_calibrate_rx_iq(sm); break; // First ancestor handler for this event + case ModeSm_EventId_CALIBRATE_TX_IQ: NORMAL_STATES_calibrate_tx_iq(sm); break; // First ancestor handler for this event + case ModeSm_EventId_CALIBRATE_POWER: NORMAL_STATES_calibrate_power(sm); break; // First ancestor handler for this event + + default: break; // to avoid "unused enumeration value in switch" warning + } + break; + // STATE: SSB_RECEIVE case ModeSm_StateId_SSB_RECEIVE: switch (event_id) { - case ModeSm_EventId_TO_CW_MODE: SSB_RECEIVE_to_cw_mode(sm); break; case ModeSm_EventId_PTT_PRESSED: SSB_RECEIVE_ptt_pressed(sm); break; + case ModeSm_EventId_TO_DIGITAL_MODE: SSB_RECEIVE_to_digital_mode(sm); break; + case ModeSm_EventId_TO_CW_MODE: SSB_RECEIVE_to_cw_mode(sm); break; case ModeSm_EventId_CALIBRATE_FREQUENCY: NORMAL_STATES_calibrate_frequency(sm); break; // First ancestor handler for this event case ModeSm_EventId_CALIBRATE_RX_IQ: NORMAL_STATES_calibrate_rx_iq(sm); break; // First ancestor handler for this event case ModeSm_EventId_CALIBRATE_TX_IQ: NORMAL_STATES_calibrate_tx_iq(sm); break; // First ancestor handler for this event @@ -506,6 +577,12 @@ static void exit_up_to_state_handler(ModeSm* sm, ModeSm_StateId desired_state) case ModeSm_StateId_CW_TRANSMIT_SPACE: CW_TRANSMIT_SPACE_exit(sm); break; + case ModeSm_StateId_DIGITAL_STATES: DIGITAL_STATES_exit(sm); break; + + case ModeSm_StateId_DIGITAL_RECEIVE: DIGITAL_RECEIVE_exit(sm); break; + + case ModeSm_StateId_DIGITAL_TRANSMIT: DIGITAL_TRANSMIT_exit(sm); break; + case ModeSm_StateId_SSB_RECEIVE: SSB_RECEIVE_exit(sm); break; case ModeSm_StateId_SSB_TRANSMIT: SSB_TRANSMIT_exit(sm); break; @@ -1277,6 +1354,27 @@ static void CW_RECEIVE_key_pressed(ModeSm* sm) // No ancestor handles this event. } +static void CW_RECEIVE_to_digital_mode(ModeSm* sm) +{ + // CW_RECEIVE behavior + // uml: TO_DIGITAL_MODE TransitionTo(DIGITAL_STATES) + { + // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). + CW_RECEIVE_exit(sm); + + // Step 2: Transition action: ``. + + // Step 3: Enter/move towards transition target `DIGITAL_STATES`. + DIGITAL_STATES_enter(sm); + + // Finish transition by calling pseudo state transition function. + DIGITAL_STATES_InitialState_transition(sm); + return; // event processing immediately stops when a transition finishes. No other behaviors for this state are checked. + } // end of behavior for CW_RECEIVE + + // No ancestor handles this event. +} + static void CW_RECEIVE_to_ssb_mode(ModeSm* sm) { // CW_RECEIVE behavior @@ -1682,6 +1780,177 @@ static void CW_TRANSMIT_SPACE_key_pressed(ModeSm* sm) } +//////////////////////////////////////////////////////////////////////////////// +// event handlers for state DIGITAL_STATES +//////////////////////////////////////////////////////////////////////////////// + +static void DIGITAL_STATES_enter(ModeSm* sm) +{ + sm->state_id = ModeSm_StateId_DIGITAL_STATES; + + // DIGITAL_STATES behavior + // uml: enter / { EnterDigitalMode(); } + { + // Step 1: execute action `EnterDigitalMode();` + EnterDigitalMode(); + } // end of behavior for DIGITAL_STATES +} + +static void DIGITAL_STATES_exit(ModeSm* sm) +{ + // DIGITAL_STATES behavior + // uml: exit / { ExitDigitalMode(); } + { + // Step 1: execute action `ExitDigitalMode();` + ExitDigitalMode(); + } // end of behavior for DIGITAL_STATES + + sm->state_id = ModeSm_StateId_NORMAL_STATES; +} + +static void DIGITAL_STATES_InitialState_transition(ModeSm* sm) +{ + // DIGITAL_STATES. behavior + // uml: TransitionTo(DIGITAL_RECEIVE) + { + // Step 1: Exit states until we reach `DIGITAL_STATES` state (Least Common Ancestor for transition). Already at LCA, no exiting required. + + // Step 2: Transition action: ``. + + // Step 3: Enter/move towards transition target `DIGITAL_RECEIVE`. + DIGITAL_RECEIVE_enter(sm); + + // Step 4: complete transition. Ends event dispatch. No other behaviors are checked. + return; + } // end of behavior for DIGITAL_STATES. +} + + +//////////////////////////////////////////////////////////////////////////////// +// event handlers for state DIGITAL_RECEIVE +//////////////////////////////////////////////////////////////////////////////// + +static void DIGITAL_RECEIVE_enter(ModeSm* sm) +{ + sm->state_id = ModeSm_StateId_DIGITAL_RECEIVE; + + // DIGITAL_RECEIVE behavior + // uml: enter / { UpdateHardwareState(); } + { + // Step 1: execute action `UpdateHardwareState();` + UpdateHardwareState(); + } // end of behavior for DIGITAL_RECEIVE +} + +static void DIGITAL_RECEIVE_exit(ModeSm* sm) +{ + sm->state_id = ModeSm_StateId_DIGITAL_STATES; +} + +static void DIGITAL_RECEIVE_ptt_pressed(ModeSm* sm) +{ + // DIGITAL_RECEIVE behavior + // uml: PTT_PRESSED [IsTxAllowed()] TransitionTo(DIGITAL_TRANSMIT) + if (IsTxAllowed()) + { + // Step 1: Exit states until we reach `DIGITAL_STATES` state (Least Common Ancestor for transition). + DIGITAL_RECEIVE_exit(sm); + + // Step 2: Transition action: ``. + + // Step 3: Enter/move towards transition target `DIGITAL_TRANSMIT`. + DIGITAL_TRANSMIT_enter(sm); + + // Step 4: complete transition. Ends event dispatch. No other behaviors are checked. + return; + } // end of behavior for DIGITAL_RECEIVE + + // No ancestor handles this event. +} + +static void DIGITAL_RECEIVE_to_cw_mode(ModeSm* sm) +{ + // DIGITAL_RECEIVE behavior + // uml: TO_CW_MODE TransitionTo(CW_RECEIVE) + { + // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). + exit_up_to_state_handler(sm, ModeSm_StateId_NORMAL_STATES); + + // Step 2: Transition action: ``. + + // Step 3: Enter/move towards transition target `CW_RECEIVE`. + CW_RECEIVE_enter(sm); + + // Step 4: complete transition. Ends event dispatch. No other behaviors are checked. + return; + } // end of behavior for DIGITAL_RECEIVE + + // No ancestor handles this event. +} + +static void DIGITAL_RECEIVE_to_ssb_mode(ModeSm* sm) +{ + // DIGITAL_RECEIVE behavior + // uml: TO_SSB_MODE TransitionTo(SSB_RECEIVE) + { + // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). + exit_up_to_state_handler(sm, ModeSm_StateId_NORMAL_STATES); + + // Step 2: Transition action: ``. + + // Step 3: Enter/move towards transition target `SSB_RECEIVE`. + SSB_RECEIVE_enter(sm); + + // Step 4: complete transition. Ends event dispatch. No other behaviors are checked. + return; + } // end of behavior for DIGITAL_RECEIVE + + // No ancestor handles this event. +} + + +//////////////////////////////////////////////////////////////////////////////// +// event handlers for state DIGITAL_TRANSMIT +//////////////////////////////////////////////////////////////////////////////// + +static void DIGITAL_TRANSMIT_enter(ModeSm* sm) +{ + sm->state_id = ModeSm_StateId_DIGITAL_TRANSMIT; + + // DIGITAL_TRANSMIT behavior + // uml: enter / { UpdateHardwareState(); } + { + // Step 1: execute action `UpdateHardwareState();` + UpdateHardwareState(); + } // end of behavior for DIGITAL_TRANSMIT +} + +static void DIGITAL_TRANSMIT_exit(ModeSm* sm) +{ + sm->state_id = ModeSm_StateId_DIGITAL_STATES; +} + +static void DIGITAL_TRANSMIT_ptt_released(ModeSm* sm) +{ + // DIGITAL_TRANSMIT behavior + // uml: PTT_RELEASED TransitionTo(DIGITAL_RECEIVE) + { + // Step 1: Exit states until we reach `DIGITAL_STATES` state (Least Common Ancestor for transition). + DIGITAL_TRANSMIT_exit(sm); + + // Step 2: Transition action: ``. + + // Step 3: Enter/move towards transition target `DIGITAL_RECEIVE`. + DIGITAL_RECEIVE_enter(sm); + + // Step 4: complete transition. Ends event dispatch. No other behaviors are checked. + return; + } // end of behavior for DIGITAL_TRANSMIT + + // No ancestor handles this event. +} + + //////////////////////////////////////////////////////////////////////////////// // event handlers for state SSB_RECEIVE //////////////////////////////////////////////////////////////////////////////// @@ -1744,6 +2013,27 @@ static void SSB_RECEIVE_to_cw_mode(ModeSm* sm) // No ancestor handles this event. } +static void SSB_RECEIVE_to_digital_mode(ModeSm* sm) +{ + // SSB_RECEIVE behavior + // uml: TO_DIGITAL_MODE TransitionTo(DIGITAL_STATES) + { + // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). + SSB_RECEIVE_exit(sm); + + // Step 2: Transition action: ``. + + // Step 3: Enter/move towards transition target `DIGITAL_STATES`. + DIGITAL_STATES_enter(sm); + + // Finish transition by calling pseudo state transition function. + DIGITAL_STATES_InitialState_transition(sm); + return; // event processing immediately stops when a transition finishes. No other behaviors for this state are checked. + } // end of behavior for SSB_RECEIVE + + // No ancestor handles this event. +} + //////////////////////////////////////////////////////////////////////////////// // event handlers for state SSB_TRANSMIT @@ -1809,6 +2099,9 @@ char const * ModeSm_state_id_to_string(ModeSm_StateId id) case ModeSm_StateId_CW_TRANSMIT_KEYER_WAIT: return "CW_TRANSMIT_KEYER_WAIT"; case ModeSm_StateId_CW_TRANSMIT_MARK: return "CW_TRANSMIT_MARK"; case ModeSm_StateId_CW_TRANSMIT_SPACE: return "CW_TRANSMIT_SPACE"; + case ModeSm_StateId_DIGITAL_STATES: return "DIGITAL_STATES"; + case ModeSm_StateId_DIGITAL_RECEIVE: return "DIGITAL_RECEIVE"; + case ModeSm_StateId_DIGITAL_TRANSMIT: return "DIGITAL_TRANSMIT"; case ModeSm_StateId_SSB_RECEIVE: return "SSB_RECEIVE"; case ModeSm_StateId_SSB_TRANSMIT: return "SSB_TRANSMIT"; default: return "?"; @@ -1835,6 +2128,7 @@ char const * ModeSm_event_id_to_string(ModeSm_EventId id) case ModeSm_EventId_PTT_PRESSED: return "PTT_PRESSED"; case ModeSm_EventId_PTT_RELEASED: return "PTT_RELEASED"; case ModeSm_EventId_TO_CW_MODE: return "TO_CW_MODE"; + case ModeSm_EventId_TO_DIGITAL_MODE: return "TO_DIGITAL_MODE"; case ModeSm_EventId_TO_SSB_MODE: return "TO_SSB_MODE"; default: return "?"; } diff --git a/code/src/PhoenixSketch/ModeSm.drawio b/code/src/PhoenixSketch/ModeSm.drawio index 17fbcf7..df04fe5 100644 --- a/code/src/PhoenixSketch/ModeSm.drawio +++ b/code/src/PhoenixSketch/ModeSm.drawio @@ -1,29 +1,29 @@ - + - + - - + + - - + + - - + + - - + + - - + + - - + + @@ -31,94 +31,94 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - + - + - + @@ -127,7 +127,7 @@ - + @@ -135,12 +135,12 @@ - - + + - + @@ -148,252 +148,317 @@ - - + + - + - - - - - - - - - - - + + + - - - - - + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + diff --git a/code/src/PhoenixSketch/ModeSm.h b/code/src/PhoenixSketch/ModeSm.h index 8575186..e3845b7 100644 --- a/code/src/PhoenixSketch/ModeSm.h +++ b/code/src/PhoenixSketch/ModeSm.h @@ -32,12 +32,13 @@ typedef enum ModeSm_EventId ModeSm_EventId_PTT_PRESSED = 12, ModeSm_EventId_PTT_RELEASED = 13, ModeSm_EventId_TO_CW_MODE = 14, - ModeSm_EventId_TO_SSB_MODE = 15 + ModeSm_EventId_TO_DIGITAL_MODE = 15, + ModeSm_EventId_TO_SSB_MODE = 16 } ModeSm_EventId; enum { - ModeSm_EventIdCount = 16 + ModeSm_EventIdCount = 17 }; typedef enum ModeSm_StateId @@ -60,13 +61,16 @@ typedef enum ModeSm_StateId ModeSm_StateId_CW_TRANSMIT_KEYER_WAIT = 15, ModeSm_StateId_CW_TRANSMIT_MARK = 16, ModeSm_StateId_CW_TRANSMIT_SPACE = 17, - ModeSm_StateId_SSB_RECEIVE = 18, - ModeSm_StateId_SSB_TRANSMIT = 19 + ModeSm_StateId_DIGITAL_STATES = 18, + ModeSm_StateId_DIGITAL_RECEIVE = 19, + ModeSm_StateId_DIGITAL_TRANSMIT = 20, + ModeSm_StateId_SSB_RECEIVE = 21, + ModeSm_StateId_SSB_TRANSMIT = 22 } ModeSm_StateId; enum { - ModeSm_StateIdCount = 20 + ModeSm_StateIdCount = 23 }; diff --git a/code/src/PhoenixSketch/ModeSm.sim.html b/code/src/PhoenixSketch/ModeSm.sim.html index 5ae04dc..5c412cf 100644 --- a/code/src/PhoenixSketch/ModeSm.sim.html +++ b/code/src/PhoenixSketch/ModeSm.sim.html @@ -309,12 +309,6 @@ state NORMAL_STATES { - SSB_RECEIVE - - SSB_RECEIVE : SSB_RECEIVE - - SSB_RECEIVE : enter / #123; UpdateHardwareState()#59; #125; - CW_RECEIVE CW_RECEIVE : CW_RECEIVE @@ -387,6 +381,32 @@ %% See https://github.com/StateSmith/StateSmith/issues/404 state "." as NORMAL_STATES.(InitialState) + state DIGITAL_STATES { + + %% Initial state name as "." so that it fits in black circle shape. + %% See https://github.com/StateSmith/StateSmith/issues/404 + state "." as DIGITAL_STATES.(InitialState) + + DIGITAL_RECEIVE + + DIGITAL_RECEIVE : DIGITAL_RECEIVE + + DIGITAL_RECEIVE : enter / #123; UpdateHardwareState()#59; #125; + + DIGITAL_TRANSMIT + + DIGITAL_TRANSMIT : DIGITAL_TRANSMIT + + DIGITAL_TRANSMIT : enter / #123; UpdateHardwareState()#59; #125; + + } + + SSB_RECEIVE + + SSB_RECEIVE : SSB_RECEIVE + + SSB_RECEIVE : enter / #123; UpdateHardwareState()#59; #125; + } %% Initial state name as "." so that it fits in black circle shape. @@ -433,10 +453,6 @@ NORMAL_STATES --> CALIBRATE_POWER_SPACE : CALIBRATE_POWER -SSB_RECEIVE --> CW_RECEIVE : TO_CW_MODE - -SSB_RECEIVE --> SSB_TRANSMIT : PTT_PRESSED [IsTxAllowed()] - CW_RECEIVE --> SSB_RECEIVE : TO_SSB_MODE CW_RECEIVE --> CW_TRANSMIT_MARK : KEY_PRESSED [IsTxAllowed()] @@ -445,6 +461,8 @@ CW_RECEIVE --> CW_TRANSMIT_DIT_MARK : DIT_PRESSED [IsTxAllowed()] +CW_RECEIVE --> DIGITAL_STATES : TO_DIGITAL_MODE + SSB_TRANSMIT --> SSB_RECEIVE : PTT_RELEASED CW_TRANSMIT_MARK --> CW_TRANSMIT_SPACE : KEY_RELEASED @@ -467,6 +485,22 @@ NORMAL_STATES.(InitialState) --> SSB_RECEIVE +DIGITAL_STATES.(InitialState) --> DIGITAL_RECEIVE + +DIGITAL_RECEIVE --> DIGITAL_TRANSMIT : PTT_PRESSED [IsTxAllowed()] + +DIGITAL_RECEIVE --> SSB_RECEIVE : TO_SSB_MODE + +DIGITAL_RECEIVE --> CW_RECEIVE : TO_CW_MODE + +DIGITAL_TRANSMIT --> DIGITAL_RECEIVE : PTT_RELEASED + +SSB_RECEIVE --> SSB_TRANSMIT : PTT_PRESSED [IsTxAllowed()] + +SSB_RECEIVE --> DIGITAL_STATES : TO_DIGITAL_MODE + +SSB_RECEIVE --> CW_RECEIVE : TO_CW_MODE + ROOT.(InitialState) --> NORMAL_STATES @@ -533,11 +567,12 @@ PTT_PRESSED : 12, PTT_RELEASED : 13, TO_CW_MODE : 14, - TO_SSB_MODE : 15, + TO_DIGITAL_MODE : 15, + TO_SSB_MODE : 16, } static { Object.freeze(this.EventId); } - static EventIdCount = 16; + static EventIdCount = 17; static { Object.freeze(this.EventIdCount); } static StateId = @@ -560,12 +595,15 @@ CW_TRANSMIT_KEYER_WAIT : 15, CW_TRANSMIT_MARK : 16, CW_TRANSMIT_SPACE : 17, - SSB_RECEIVE : 18, - SSB_TRANSMIT : 19, + DIGITAL_STATES : 18, + DIGITAL_RECEIVE : 19, + DIGITAL_TRANSMIT : 20, + SSB_RECEIVE : 21, + SSB_TRANSMIT : 22, } static { Object.freeze(this.StateId); } - static StateIdCount = 20; + static StateIdCount = 23; static { Object.freeze(this.StateIdCount); } // Used internally by state machine. Feel free to inspect, but don't modify. @@ -586,12 +624,12 @@ // ROOT. is a pseudo state and cannot have an `enter` trigger. // ROOT. behavior - // uml: / { this.tracer?.edgeTransition("edge37"); } TransitionTo(NORMAL_STATES) + // uml: / { this.tracer?.edgeTransition("edge44"); } TransitionTo(NORMAL_STATES) { // Step 1: Exit states until we reach `ROOT` state (Least Common Ancestor for transition). Already at LCA, no exiting required. - // Step 2: Transition action: `this.tracer?.edgeTransition("edge37");`. - this.tracer?.edgeTransition("edge37"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge44");`. + this.tracer?.edgeTransition("edge44"); // Step 3: Enter/move towards transition target `NORMAL_STATES`. this.#NORMAL_STATES_enter(); @@ -712,6 +750,7 @@ case ModeSm.EventId.KEY_PRESSED: this.#CW_RECEIVE_key_pressed(); break; case ModeSm.EventId.DAH_PRESSED: this.#CW_RECEIVE_dah_pressed(); break; case ModeSm.EventId.DIT_PRESSED: this.#CW_RECEIVE_dit_pressed(); break; + case ModeSm.EventId.TO_DIGITAL_MODE: this.#CW_RECEIVE_to_digital_mode(); break; case ModeSm.EventId.CALIBRATE_FREQUENCY: this.#NORMAL_STATES_calibrate_frequency(); break; // First ancestor handler for this event case ModeSm.EventId.CALIBRATE_RX_IQ: this.#NORMAL_STATES_calibrate_rx_iq(); break; // First ancestor handler for this event case ModeSm.EventId.CALIBRATE_TX_IQ: this.#NORMAL_STATES_calibrate_tx_iq(); break; // First ancestor handler for this event @@ -794,12 +833,50 @@ } break; + // STATE: DIGITAL_STATES + case ModeSm.StateId.DIGITAL_STATES: + switch (eventId) + { + case ModeSm.EventId.CALIBRATE_FREQUENCY: this.#NORMAL_STATES_calibrate_frequency(); break; // First ancestor handler for this event + case ModeSm.EventId.CALIBRATE_RX_IQ: this.#NORMAL_STATES_calibrate_rx_iq(); break; // First ancestor handler for this event + case ModeSm.EventId.CALIBRATE_TX_IQ: this.#NORMAL_STATES_calibrate_tx_iq(); break; // First ancestor handler for this event + case ModeSm.EventId.CALIBRATE_POWER: this.#NORMAL_STATES_calibrate_power(); break; // First ancestor handler for this event + } + break; + + // STATE: DIGITAL_RECEIVE + case ModeSm.StateId.DIGITAL_RECEIVE: + switch (eventId) + { + case ModeSm.EventId.PTT_PRESSED: this.#DIGITAL_RECEIVE_ptt_pressed(); break; + case ModeSm.EventId.TO_SSB_MODE: this.#DIGITAL_RECEIVE_to_ssb_mode(); break; + case ModeSm.EventId.TO_CW_MODE: this.#DIGITAL_RECEIVE_to_cw_mode(); break; + case ModeSm.EventId.CALIBRATE_FREQUENCY: this.#NORMAL_STATES_calibrate_frequency(); break; // First ancestor handler for this event + case ModeSm.EventId.CALIBRATE_RX_IQ: this.#NORMAL_STATES_calibrate_rx_iq(); break; // First ancestor handler for this event + case ModeSm.EventId.CALIBRATE_TX_IQ: this.#NORMAL_STATES_calibrate_tx_iq(); break; // First ancestor handler for this event + case ModeSm.EventId.CALIBRATE_POWER: this.#NORMAL_STATES_calibrate_power(); break; // First ancestor handler for this event + } + break; + + // STATE: DIGITAL_TRANSMIT + case ModeSm.StateId.DIGITAL_TRANSMIT: + switch (eventId) + { + case ModeSm.EventId.PTT_RELEASED: this.#DIGITAL_TRANSMIT_ptt_released(); break; + case ModeSm.EventId.CALIBRATE_FREQUENCY: this.#NORMAL_STATES_calibrate_frequency(); break; // First ancestor handler for this event + case ModeSm.EventId.CALIBRATE_RX_IQ: this.#NORMAL_STATES_calibrate_rx_iq(); break; // First ancestor handler for this event + case ModeSm.EventId.CALIBRATE_TX_IQ: this.#NORMAL_STATES_calibrate_tx_iq(); break; // First ancestor handler for this event + case ModeSm.EventId.CALIBRATE_POWER: this.#NORMAL_STATES_calibrate_power(); break; // First ancestor handler for this event + } + break; + // STATE: SSB_RECEIVE case ModeSm.StateId.SSB_RECEIVE: switch (eventId) { - case ModeSm.EventId.TO_CW_MODE: this.#SSB_RECEIVE_to_cw_mode(); break; case ModeSm.EventId.PTT_PRESSED: this.#SSB_RECEIVE_ptt_pressed(); break; + case ModeSm.EventId.TO_DIGITAL_MODE: this.#SSB_RECEIVE_to_digital_mode(); break; + case ModeSm.EventId.TO_CW_MODE: this.#SSB_RECEIVE_to_cw_mode(); break; case ModeSm.EventId.CALIBRATE_FREQUENCY: this.#NORMAL_STATES_calibrate_frequency(); break; // First ancestor handler for this event case ModeSm.EventId.CALIBRATE_RX_IQ: this.#NORMAL_STATES_calibrate_rx_iq(); break; // First ancestor handler for this event case ModeSm.EventId.CALIBRATE_TX_IQ: this.#NORMAL_STATES_calibrate_tx_iq(); break; // First ancestor handler for this event @@ -864,6 +941,12 @@ case ModeSm.StateId.CW_TRANSMIT_SPACE: this.#CW_TRANSMIT_SPACE_exit(); break; + case ModeSm.StateId.DIGITAL_STATES: this.#DIGITAL_STATES_exit(); break; + + case ModeSm.StateId.DIGITAL_RECEIVE: this.#DIGITAL_RECEIVE_exit(); break; + + case ModeSm.StateId.DIGITAL_TRANSMIT: this.#DIGITAL_TRANSMIT_exit(); break; + case ModeSm.StateId.SSB_RECEIVE: this.#SSB_RECEIVE_exit(); break; case ModeSm.StateId.SSB_TRANSMIT: this.#SSB_TRANSMIT_exit(); break; @@ -1684,12 +1767,12 @@ #NORMAL_STATES_InitialState_transition() { // NORMAL_STATES. behavior - // uml: / { this.tracer?.edgeTransition("edge36"); } TransitionTo(SSB_RECEIVE) + // uml: / { this.tracer?.edgeTransition("edge35"); } TransitionTo(SSB_RECEIVE) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). Already at LCA, no exiting required. - // Step 2: Transition action: `this.tracer?.edgeTransition("edge36");`. - this.tracer?.edgeTransition("edge36"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge35");`. + this.tracer?.edgeTransition("edge35"); // Step 3: Enter/move towards transition target `SSB_RECEIVE`. this.#SSB_RECEIVE_enter(); @@ -1738,14 +1821,14 @@ #CW_RECEIVE_dah_pressed() { // CW_RECEIVE behavior - // uml: DAH_PRESSED [this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("CW_RECEIVE","DAH_PRESSED [IsTxAllowed()] TransitionTo(CW_TRANSMIT_DAH_MARK)")] / { this.tracer?.edgeTransition("edge24"); } TransitionTo(CW_TRANSMIT_DAH_MARK) + // uml: DAH_PRESSED [this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("CW_RECEIVE","DAH_PRESSED [IsTxAllowed()] TransitionTo(CW_TRANSMIT_DAH_MARK)")] / { this.tracer?.edgeTransition("edge22"); } TransitionTo(CW_TRANSMIT_DAH_MARK) if (this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("CW_RECEIVE","DAH_PRESSED [IsTxAllowed()] TransitionTo(CW_TRANSMIT_DAH_MARK)")) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_RECEIVE_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge24");`. - this.tracer?.edgeTransition("edge24"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge22");`. + this.tracer?.edgeTransition("edge22"); // Step 3: Enter/move towards transition target `CW_TRANSMIT_DAH_MARK`. this.#CW_TRANSMIT_DAH_MARK_enter(); @@ -1760,14 +1843,14 @@ #CW_RECEIVE_dit_pressed() { // CW_RECEIVE behavior - // uml: DIT_PRESSED [this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("CW_RECEIVE","DIT_PRESSED [IsTxAllowed()] TransitionTo(CW_TRANSMIT_DIT_MARK)")] / { this.tracer?.edgeTransition("edge25"); } TransitionTo(CW_TRANSMIT_DIT_MARK) + // uml: DIT_PRESSED [this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("CW_RECEIVE","DIT_PRESSED [IsTxAllowed()] TransitionTo(CW_TRANSMIT_DIT_MARK)")] / { this.tracer?.edgeTransition("edge23"); } TransitionTo(CW_TRANSMIT_DIT_MARK) if (this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("CW_RECEIVE","DIT_PRESSED [IsTxAllowed()] TransitionTo(CW_TRANSMIT_DIT_MARK)")) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_RECEIVE_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge25");`. - this.tracer?.edgeTransition("edge25"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge23");`. + this.tracer?.edgeTransition("edge23"); // Step 3: Enter/move towards transition target `CW_TRANSMIT_DIT_MARK`. this.#CW_TRANSMIT_DIT_MARK_enter(); @@ -1794,14 +1877,14 @@ #CW_RECEIVE_key_pressed() { // CW_RECEIVE behavior - // uml: KEY_PRESSED [this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("CW_RECEIVE","KEY_PRESSED [IsTxAllowed()] TransitionTo(CW_TRANSMIT_MARK)")] / { this.tracer?.edgeTransition("edge23"); } TransitionTo(CW_TRANSMIT_MARK) + // uml: KEY_PRESSED [this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("CW_RECEIVE","KEY_PRESSED [IsTxAllowed()] TransitionTo(CW_TRANSMIT_MARK)")] / { this.tracer?.edgeTransition("edge21"); } TransitionTo(CW_TRANSMIT_MARK) if (this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("CW_RECEIVE","KEY_PRESSED [IsTxAllowed()] TransitionTo(CW_TRANSMIT_MARK)")) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_RECEIVE_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge23");`. - this.tracer?.edgeTransition("edge23"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge21");`. + this.tracer?.edgeTransition("edge21"); // Step 3: Enter/move towards transition target `CW_TRANSMIT_MARK`. this.#CW_TRANSMIT_MARK_enter(); @@ -1813,16 +1896,38 @@ // No ancestor handles this event. } + #CW_RECEIVE_to_digital_mode() + { + // CW_RECEIVE behavior + // uml: TO_DIGITAL_MODE / { this.tracer?.edgeTransition("edge24"); } TransitionTo(DIGITAL_STATES) + { + // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). + this.#CW_RECEIVE_exit(); + + // Step 2: Transition action: `this.tracer?.edgeTransition("edge24");`. + this.tracer?.edgeTransition("edge24"); + + // Step 3: Enter/move towards transition target `DIGITAL_STATES`. + this.#DIGITAL_STATES_enter(); + + // Finish transition by calling pseudo state transition function. + this.#DIGITAL_STATES_InitialState_transition(); + return; // event processing immediately stops when a transition finishes. No other behaviors for this state are checked. + } // end of behavior for CW_RECEIVE + + // No ancestor handles this event. + } + #CW_RECEIVE_to_ssb_mode() { // CW_RECEIVE behavior - // uml: TO_SSB_MODE / { this.tracer?.edgeTransition("edge22"); } TransitionTo(SSB_RECEIVE) + // uml: TO_SSB_MODE / { this.tracer?.edgeTransition("edge20"); } TransitionTo(SSB_RECEIVE) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_RECEIVE_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge22");`. - this.tracer?.edgeTransition("edge22"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge20");`. + this.tracer?.edgeTransition("edge20"); // Step 3: Enter/move towards transition target `SSB_RECEIVE`. this.#SSB_RECEIVE_enter(); @@ -1887,14 +1992,14 @@ } // end of behavior for CW_TRANSMIT_DAH_MARK // CW_TRANSMIT_DAH_MARK behavior - // uml: do [this.tracer?.log("🛡️ User evaluating guard: " + "markCount_ms >= 3*ditDuration_ms") || this.evaluateGuard("CW_TRANSMIT_DAH_MARK","do [markCount_ms >= 3*ditDuration_ms] TransitionTo(CW_TRANSMIT_KEYER_SPACE)")] / { this.tracer?.edgeTransition("edge35"); } TransitionTo(CW_TRANSMIT_KEYER_SPACE) + // uml: do [this.tracer?.log("🛡️ User evaluating guard: " + "markCount_ms >= 3*ditDuration_ms") || this.evaluateGuard("CW_TRANSMIT_DAH_MARK","do [markCount_ms >= 3*ditDuration_ms] TransitionTo(CW_TRANSMIT_KEYER_SPACE)")] / { this.tracer?.edgeTransition("edge34"); } TransitionTo(CW_TRANSMIT_KEYER_SPACE) if (this.tracer?.log("🛡️ User evaluating guard: " + "markCount_ms >= 3*ditDuration_ms") || this.evaluateGuard("CW_TRANSMIT_DAH_MARK","do [markCount_ms >= 3*ditDuration_ms] TransitionTo(CW_TRANSMIT_KEYER_SPACE)")) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_TRANSMIT_DAH_MARK_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge35");`. - this.tracer?.edgeTransition("edge35"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge34");`. + this.tracer?.edgeTransition("edge34"); // Step 3: Enter/move towards transition target `CW_TRANSMIT_KEYER_SPACE`. this.#CW_TRANSMIT_KEYER_SPACE_enter(); @@ -1959,14 +2064,14 @@ } // end of behavior for CW_TRANSMIT_DIT_MARK // CW_TRANSMIT_DIT_MARK behavior - // uml: do [this.tracer?.log("🛡️ User evaluating guard: " + "markCount_ms >= ditDuration_ms") || this.evaluateGuard("CW_TRANSMIT_DIT_MARK","do [markCount_ms >= ditDuration_ms] TransitionTo(CW_TRANSMIT_KEYER_SPACE)")] / { this.tracer?.edgeTransition("edge30"); } TransitionTo(CW_TRANSMIT_KEYER_SPACE) + // uml: do [this.tracer?.log("🛡️ User evaluating guard: " + "markCount_ms >= ditDuration_ms") || this.evaluateGuard("CW_TRANSMIT_DIT_MARK","do [markCount_ms >= ditDuration_ms] TransitionTo(CW_TRANSMIT_KEYER_SPACE)")] / { this.tracer?.edgeTransition("edge29"); } TransitionTo(CW_TRANSMIT_KEYER_SPACE) if (this.tracer?.log("🛡️ User evaluating guard: " + "markCount_ms >= ditDuration_ms") || this.evaluateGuard("CW_TRANSMIT_DIT_MARK","do [markCount_ms >= ditDuration_ms] TransitionTo(CW_TRANSMIT_KEYER_SPACE)")) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_TRANSMIT_DIT_MARK_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge30");`. - this.tracer?.edgeTransition("edge30"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge29");`. + this.tracer?.edgeTransition("edge29"); // Step 3: Enter/move towards transition target `CW_TRANSMIT_KEYER_SPACE`. this.#CW_TRANSMIT_KEYER_SPACE_enter(); @@ -2031,14 +2136,14 @@ } // end of behavior for CW_TRANSMIT_KEYER_SPACE // CW_TRANSMIT_KEYER_SPACE behavior - // uml: do [this.tracer?.log("🛡️ User evaluating guard: " + "spaceCount_ms >= ditDuration_ms") || this.evaluateGuard("CW_TRANSMIT_KEYER_SPACE","do [spaceCount_ms >= ditDuration_ms] TransitionTo(CW_TRANSMIT_KEYER_WAIT)")] / { this.tracer?.edgeTransition("edge31"); } TransitionTo(CW_TRANSMIT_KEYER_WAIT) + // uml: do [this.tracer?.log("🛡️ User evaluating guard: " + "spaceCount_ms >= ditDuration_ms") || this.evaluateGuard("CW_TRANSMIT_KEYER_SPACE","do [spaceCount_ms >= ditDuration_ms] TransitionTo(CW_TRANSMIT_KEYER_WAIT)")] / { this.tracer?.edgeTransition("edge30"); } TransitionTo(CW_TRANSMIT_KEYER_WAIT) if (this.tracer?.log("🛡️ User evaluating guard: " + "spaceCount_ms >= ditDuration_ms") || this.evaluateGuard("CW_TRANSMIT_KEYER_SPACE","do [spaceCount_ms >= ditDuration_ms] TransitionTo(CW_TRANSMIT_KEYER_WAIT)")) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_TRANSMIT_KEYER_SPACE_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge31");`. - this.tracer?.edgeTransition("edge31"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge30");`. + this.tracer?.edgeTransition("edge30"); // Step 3: Enter/move towards transition target `CW_TRANSMIT_KEYER_WAIT`. this.#CW_TRANSMIT_KEYER_WAIT_enter(); @@ -2089,13 +2194,13 @@ #CW_TRANSMIT_KEYER_WAIT_dah_pressed() { // CW_TRANSMIT_KEYER_WAIT behavior - // uml: DAH_PRESSED / { this.tracer?.edgeTransition("edge34"); } TransitionTo(CW_TRANSMIT_DAH_MARK) + // uml: DAH_PRESSED / { this.tracer?.edgeTransition("edge33"); } TransitionTo(CW_TRANSMIT_DAH_MARK) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_TRANSMIT_KEYER_WAIT_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge34");`. - this.tracer?.edgeTransition("edge34"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge33");`. + this.tracer?.edgeTransition("edge33"); // Step 3: Enter/move towards transition target `CW_TRANSMIT_DAH_MARK`. this.#CW_TRANSMIT_DAH_MARK_enter(); @@ -2110,13 +2215,13 @@ #CW_TRANSMIT_KEYER_WAIT_dit_pressed() { // CW_TRANSMIT_KEYER_WAIT behavior - // uml: DIT_PRESSED / { this.tracer?.edgeTransition("edge33"); } TransitionTo(CW_TRANSMIT_DIT_MARK) + // uml: DIT_PRESSED / { this.tracer?.edgeTransition("edge32"); } TransitionTo(CW_TRANSMIT_DIT_MARK) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_TRANSMIT_KEYER_WAIT_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge33");`. - this.tracer?.edgeTransition("edge33"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge32");`. + this.tracer?.edgeTransition("edge32"); // Step 3: Enter/move towards transition target `CW_TRANSMIT_DIT_MARK`. this.#CW_TRANSMIT_DIT_MARK_enter(); @@ -2138,14 +2243,14 @@ } // end of behavior for CW_TRANSMIT_KEYER_WAIT // CW_TRANSMIT_KEYER_WAIT behavior - // uml: do [this.tracer?.log("🛡️ User evaluating guard: " + "spaceCount_ms >= waitDuration_ms") || this.evaluateGuard("CW_TRANSMIT_KEYER_WAIT","do [spaceCount_ms >= waitDuration_ms] TransitionTo(CW_RECEIVE)")] / { this.tracer?.edgeTransition("edge32"); } TransitionTo(CW_RECEIVE) + // uml: do [this.tracer?.log("🛡️ User evaluating guard: " + "spaceCount_ms >= waitDuration_ms") || this.evaluateGuard("CW_TRANSMIT_KEYER_WAIT","do [spaceCount_ms >= waitDuration_ms] TransitionTo(CW_RECEIVE)")] / { this.tracer?.edgeTransition("edge31"); } TransitionTo(CW_RECEIVE) if (this.tracer?.log("🛡️ User evaluating guard: " + "spaceCount_ms >= waitDuration_ms") || this.evaluateGuard("CW_TRANSMIT_KEYER_WAIT","do [spaceCount_ms >= waitDuration_ms] TransitionTo(CW_RECEIVE)")) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_TRANSMIT_KEYER_WAIT_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge32");`. - this.tracer?.edgeTransition("edge32"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge31");`. + this.tracer?.edgeTransition("edge31"); // Step 3: Enter/move towards transition target `CW_RECEIVE`. this.#CW_RECEIVE_enter(); @@ -2196,13 +2301,13 @@ #CW_TRANSMIT_MARK_key_released() { // CW_TRANSMIT_MARK behavior - // uml: KEY_RELEASED / { this.tracer?.edgeTransition("edge27"); } TransitionTo(CW_TRANSMIT_SPACE) + // uml: KEY_RELEASED / { this.tracer?.edgeTransition("edge26"); } TransitionTo(CW_TRANSMIT_SPACE) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_TRANSMIT_MARK_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge27");`. - this.tracer?.edgeTransition("edge27"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge26");`. + this.tracer?.edgeTransition("edge26"); // Step 3: Enter/move towards transition target `CW_TRANSMIT_SPACE`. this.#CW_TRANSMIT_SPACE_enter(); @@ -2267,14 +2372,14 @@ } // end of behavior for CW_TRANSMIT_SPACE // CW_TRANSMIT_SPACE behavior - // uml: do [this.tracer?.log("🛡️ User evaluating guard: " + "spaceCount_ms >= waitDuration_ms") || this.evaluateGuard("CW_TRANSMIT_SPACE","do [spaceCount_ms >= waitDuration_ms] TransitionTo(CW_RECEIVE)")] / { this.tracer?.edgeTransition("edge29"); } TransitionTo(CW_RECEIVE) + // uml: do [this.tracer?.log("🛡️ User evaluating guard: " + "spaceCount_ms >= waitDuration_ms") || this.evaluateGuard("CW_TRANSMIT_SPACE","do [spaceCount_ms >= waitDuration_ms] TransitionTo(CW_RECEIVE)")] / { this.tracer?.edgeTransition("edge28"); } TransitionTo(CW_RECEIVE) if (this.tracer?.log("🛡️ User evaluating guard: " + "spaceCount_ms >= waitDuration_ms") || this.evaluateGuard("CW_TRANSMIT_SPACE","do [spaceCount_ms >= waitDuration_ms] TransitionTo(CW_RECEIVE)")) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_TRANSMIT_SPACE_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge29");`. - this.tracer?.edgeTransition("edge29"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge28");`. + this.tracer?.edgeTransition("edge28"); // Step 3: Enter/move towards transition target `CW_RECEIVE`. this.#CW_RECEIVE_enter(); @@ -2289,13 +2394,13 @@ #CW_TRANSMIT_SPACE_key_pressed() { // CW_TRANSMIT_SPACE behavior - // uml: KEY_PRESSED / { this.tracer?.edgeTransition("edge28"); } TransitionTo(CW_TRANSMIT_MARK) + // uml: KEY_PRESSED / { this.tracer?.edgeTransition("edge27"); } TransitionTo(CW_TRANSMIT_MARK) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#CW_TRANSMIT_SPACE_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge28");`. - this.tracer?.edgeTransition("edge28"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge27");`. + this.tracer?.edgeTransition("edge27"); // Step 3: Enter/move towards transition target `CW_TRANSMIT_MARK`. this.#CW_TRANSMIT_MARK_enter(); @@ -2308,6 +2413,224 @@ } + //////////////////////////////////////////////////////////////////////////////// + // event handlers for state DIGITAL_STATES + //////////////////////////////////////////////////////////////////////////////// + + #DIGITAL_STATES_enter() + { + this.stateId = ModeSm.StateId.DIGITAL_STATES; + + // DIGITAL_STATES behavior + // uml: enter / { this.tracer?.enterState('DIGITAL_STATES'); } + { + // Step 1: execute action `this.tracer?.enterState('DIGITAL_STATES');` + this.tracer?.enterState('DIGITAL_STATES'); + } // end of behavior for DIGITAL_STATES + + // DIGITAL_STATES behavior + // uml: enter / { this.tracer?.log("⚡ FSM would execute action: " + "EnterDigitalMode();"); } + { + // Step 1: execute action `this.tracer?.log("⚡ FSM would execute action: " + "EnterDigitalMode();");` + this.tracer?.log("⚡ FSM would execute action: " + "EnterDigitalMode();"); + } // end of behavior for DIGITAL_STATES + } + + #DIGITAL_STATES_exit() + { + // DIGITAL_STATES behavior + // uml: exit / { this.tracer?.log("⚡ FSM would execute action: " + "ExitDigitalMode();"); } + { + // Step 1: execute action `this.tracer?.log("⚡ FSM would execute action: " + "ExitDigitalMode();");` + this.tracer?.log("⚡ FSM would execute action: " + "ExitDigitalMode();"); + } // end of behavior for DIGITAL_STATES + + // DIGITAL_STATES behavior + // uml: exit / { this.tracer?.exitState('DIGITAL_STATES'); } + { + // Step 1: execute action `this.tracer?.exitState('DIGITAL_STATES');` + this.tracer?.exitState('DIGITAL_STATES'); + } // end of behavior for DIGITAL_STATES + + this.stateId = ModeSm.StateId.NORMAL_STATES; + } + + #DIGITAL_STATES_InitialState_transition() + { + // DIGITAL_STATES. behavior + // uml: / { this.tracer?.edgeTransition("edge36"); } TransitionTo(DIGITAL_RECEIVE) + { + // Step 1: Exit states until we reach `DIGITAL_STATES` state (Least Common Ancestor for transition). Already at LCA, no exiting required. + + // Step 2: Transition action: `this.tracer?.edgeTransition("edge36");`. + this.tracer?.edgeTransition("edge36"); + + // Step 3: Enter/move towards transition target `DIGITAL_RECEIVE`. + this.#DIGITAL_RECEIVE_enter(); + + // Step 4: complete transition. Ends event dispatch. No other behaviors are checked. + return; + } // end of behavior for DIGITAL_STATES. + } + + + //////////////////////////////////////////////////////////////////////////////// + // event handlers for state DIGITAL_RECEIVE + //////////////////////////////////////////////////////////////////////////////// + + #DIGITAL_RECEIVE_enter() + { + this.stateId = ModeSm.StateId.DIGITAL_RECEIVE; + + // DIGITAL_RECEIVE behavior + // uml: enter / { this.tracer?.enterState('DIGITAL_RECEIVE'); } + { + // Step 1: execute action `this.tracer?.enterState('DIGITAL_RECEIVE');` + this.tracer?.enterState('DIGITAL_RECEIVE'); + } // end of behavior for DIGITAL_RECEIVE + + // DIGITAL_RECEIVE behavior + // uml: enter / { this.tracer?.log("⚡ FSM would execute action: " + "UpdateHardwareState();"); } + { + // Step 1: execute action `this.tracer?.log("⚡ FSM would execute action: " + "UpdateHardwareState();");` + this.tracer?.log("⚡ FSM would execute action: " + "UpdateHardwareState();"); + } // end of behavior for DIGITAL_RECEIVE + } + + #DIGITAL_RECEIVE_exit() + { + // DIGITAL_RECEIVE behavior + // uml: exit / { this.tracer?.exitState('DIGITAL_RECEIVE'); } + { + // Step 1: execute action `this.tracer?.exitState('DIGITAL_RECEIVE');` + this.tracer?.exitState('DIGITAL_RECEIVE'); + } // end of behavior for DIGITAL_RECEIVE + + this.stateId = ModeSm.StateId.DIGITAL_STATES; + } + + #DIGITAL_RECEIVE_ptt_pressed() + { + // DIGITAL_RECEIVE behavior + // uml: PTT_PRESSED [this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("DIGITAL_RECEIVE","PTT_PRESSED [IsTxAllowed()] TransitionTo(DIGITAL_TRANSMIT)")] / { this.tracer?.edgeTransition("edge37"); } TransitionTo(DIGITAL_TRANSMIT) + if (this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("DIGITAL_RECEIVE","PTT_PRESSED [IsTxAllowed()] TransitionTo(DIGITAL_TRANSMIT)")) + { + // Step 1: Exit states until we reach `DIGITAL_STATES` state (Least Common Ancestor for transition). + this.#DIGITAL_RECEIVE_exit(); + + // Step 2: Transition action: `this.tracer?.edgeTransition("edge37");`. + this.tracer?.edgeTransition("edge37"); + + // Step 3: Enter/move towards transition target `DIGITAL_TRANSMIT`. + this.#DIGITAL_TRANSMIT_enter(); + + // Step 4: complete transition. Ends event dispatch. No other behaviors are checked. + return; + } // end of behavior for DIGITAL_RECEIVE + + // No ancestor handles this event. + } + + #DIGITAL_RECEIVE_to_cw_mode() + { + // DIGITAL_RECEIVE behavior + // uml: TO_CW_MODE / { this.tracer?.edgeTransition("edge39"); } TransitionTo(CW_RECEIVE) + { + // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). + this.#exitUpToStateHandler(ModeSm.StateId.NORMAL_STATES); + + // Step 2: Transition action: `this.tracer?.edgeTransition("edge39");`. + this.tracer?.edgeTransition("edge39"); + + // Step 3: Enter/move towards transition target `CW_RECEIVE`. + this.#CW_RECEIVE_enter(); + + // Step 4: complete transition. Ends event dispatch. No other behaviors are checked. + return; + } // end of behavior for DIGITAL_RECEIVE + + // No ancestor handles this event. + } + + #DIGITAL_RECEIVE_to_ssb_mode() + { + // DIGITAL_RECEIVE behavior + // uml: TO_SSB_MODE / { this.tracer?.edgeTransition("edge38"); } TransitionTo(SSB_RECEIVE) + { + // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). + this.#exitUpToStateHandler(ModeSm.StateId.NORMAL_STATES); + + // Step 2: Transition action: `this.tracer?.edgeTransition("edge38");`. + this.tracer?.edgeTransition("edge38"); + + // Step 3: Enter/move towards transition target `SSB_RECEIVE`. + this.#SSB_RECEIVE_enter(); + + // Step 4: complete transition. Ends event dispatch. No other behaviors are checked. + return; + } // end of behavior for DIGITAL_RECEIVE + + // No ancestor handles this event. + } + + + //////////////////////////////////////////////////////////////////////////////// + // event handlers for state DIGITAL_TRANSMIT + //////////////////////////////////////////////////////////////////////////////// + + #DIGITAL_TRANSMIT_enter() + { + this.stateId = ModeSm.StateId.DIGITAL_TRANSMIT; + + // DIGITAL_TRANSMIT behavior + // uml: enter / { this.tracer?.enterState('DIGITAL_TRANSMIT'); } + { + // Step 1: execute action `this.tracer?.enterState('DIGITAL_TRANSMIT');` + this.tracer?.enterState('DIGITAL_TRANSMIT'); + } // end of behavior for DIGITAL_TRANSMIT + + // DIGITAL_TRANSMIT behavior + // uml: enter / { this.tracer?.log("⚡ FSM would execute action: " + "UpdateHardwareState();"); } + { + // Step 1: execute action `this.tracer?.log("⚡ FSM would execute action: " + "UpdateHardwareState();");` + this.tracer?.log("⚡ FSM would execute action: " + "UpdateHardwareState();"); + } // end of behavior for DIGITAL_TRANSMIT + } + + #DIGITAL_TRANSMIT_exit() + { + // DIGITAL_TRANSMIT behavior + // uml: exit / { this.tracer?.exitState('DIGITAL_TRANSMIT'); } + { + // Step 1: execute action `this.tracer?.exitState('DIGITAL_TRANSMIT');` + this.tracer?.exitState('DIGITAL_TRANSMIT'); + } // end of behavior for DIGITAL_TRANSMIT + + this.stateId = ModeSm.StateId.DIGITAL_STATES; + } + + #DIGITAL_TRANSMIT_ptt_released() + { + // DIGITAL_TRANSMIT behavior + // uml: PTT_RELEASED / { this.tracer?.edgeTransition("edge40"); } TransitionTo(DIGITAL_RECEIVE) + { + // Step 1: Exit states until we reach `DIGITAL_STATES` state (Least Common Ancestor for transition). + this.#DIGITAL_TRANSMIT_exit(); + + // Step 2: Transition action: `this.tracer?.edgeTransition("edge40");`. + this.tracer?.edgeTransition("edge40"); + + // Step 3: Enter/move towards transition target `DIGITAL_RECEIVE`. + this.#DIGITAL_RECEIVE_enter(); + + // Step 4: complete transition. Ends event dispatch. No other behaviors are checked. + return; + } // end of behavior for DIGITAL_TRANSMIT + + // No ancestor handles this event. + } + + //////////////////////////////////////////////////////////////////////////////// // event handlers for state SSB_RECEIVE //////////////////////////////////////////////////////////////////////////////// @@ -2346,14 +2669,14 @@ #SSB_RECEIVE_ptt_pressed() { // SSB_RECEIVE behavior - // uml: PTT_PRESSED [this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("SSB_RECEIVE","PTT_PRESSED [IsTxAllowed()] TransitionTo(SSB_TRANSMIT)")] / { this.tracer?.edgeTransition("edge21"); } TransitionTo(SSB_TRANSMIT) + // uml: PTT_PRESSED [this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("SSB_RECEIVE","PTT_PRESSED [IsTxAllowed()] TransitionTo(SSB_TRANSMIT)")] / { this.tracer?.edgeTransition("edge41"); } TransitionTo(SSB_TRANSMIT) if (this.tracer?.log("🛡️ User evaluating guard: " + "IsTxAllowed()") || this.evaluateGuard("SSB_RECEIVE","PTT_PRESSED [IsTxAllowed()] TransitionTo(SSB_TRANSMIT)")) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#SSB_RECEIVE_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge21");`. - this.tracer?.edgeTransition("edge21"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge41");`. + this.tracer?.edgeTransition("edge41"); // Step 3: Enter/move towards transition target `SSB_TRANSMIT`. this.#SSB_TRANSMIT_enter(); @@ -2368,13 +2691,13 @@ #SSB_RECEIVE_to_cw_mode() { // SSB_RECEIVE behavior - // uml: TO_CW_MODE / { this.tracer?.edgeTransition("edge20"); } TransitionTo(CW_RECEIVE) + // uml: TO_CW_MODE / { this.tracer?.edgeTransition("edge43"); } TransitionTo(CW_RECEIVE) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#SSB_RECEIVE_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge20");`. - this.tracer?.edgeTransition("edge20"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge43");`. + this.tracer?.edgeTransition("edge43"); // Step 3: Enter/move towards transition target `CW_RECEIVE`. this.#CW_RECEIVE_enter(); @@ -2386,6 +2709,28 @@ // No ancestor handles this event. } + #SSB_RECEIVE_to_digital_mode() + { + // SSB_RECEIVE behavior + // uml: TO_DIGITAL_MODE / { this.tracer?.edgeTransition("edge42"); } TransitionTo(DIGITAL_STATES) + { + // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). + this.#SSB_RECEIVE_exit(); + + // Step 2: Transition action: `this.tracer?.edgeTransition("edge42");`. + this.tracer?.edgeTransition("edge42"); + + // Step 3: Enter/move towards transition target `DIGITAL_STATES`. + this.#DIGITAL_STATES_enter(); + + // Finish transition by calling pseudo state transition function. + this.#DIGITAL_STATES_InitialState_transition(); + return; // event processing immediately stops when a transition finishes. No other behaviors for this state are checked. + } // end of behavior for SSB_RECEIVE + + // No ancestor handles this event. + } + //////////////////////////////////////////////////////////////////////////////// // event handlers for state SSB_TRANSMIT @@ -2425,13 +2770,13 @@ #SSB_TRANSMIT_ptt_released() { // SSB_TRANSMIT behavior - // uml: PTT_RELEASED / { this.tracer?.edgeTransition("edge26"); } TransitionTo(SSB_RECEIVE) + // uml: PTT_RELEASED / { this.tracer?.edgeTransition("edge25"); } TransitionTo(SSB_RECEIVE) { // Step 1: Exit states until we reach `NORMAL_STATES` state (Least Common Ancestor for transition). this.#SSB_TRANSMIT_exit(); - // Step 2: Transition action: `this.tracer?.edgeTransition("edge26");`. - this.tracer?.edgeTransition("edge26"); + // Step 2: Transition action: `this.tracer?.edgeTransition("edge25");`. + this.tracer?.edgeTransition("edge25"); // Step 3: Enter/move towards transition target `SSB_RECEIVE`. this.#SSB_RECEIVE_enter(); @@ -2466,6 +2811,9 @@ case ModeSm.StateId.CW_TRANSMIT_KEYER_WAIT: return "CW_TRANSMIT_KEYER_WAIT"; case ModeSm.StateId.CW_TRANSMIT_MARK: return "CW_TRANSMIT_MARK"; case ModeSm.StateId.CW_TRANSMIT_SPACE: return "CW_TRANSMIT_SPACE"; + case ModeSm.StateId.DIGITAL_STATES: return "DIGITAL_STATES"; + case ModeSm.StateId.DIGITAL_RECEIVE: return "DIGITAL_RECEIVE"; + case ModeSm.StateId.DIGITAL_TRANSMIT: return "DIGITAL_TRANSMIT"; case ModeSm.StateId.SSB_RECEIVE: return "SSB_RECEIVE"; case ModeSm.StateId.SSB_TRANSMIT: return "SSB_TRANSMIT"; default: return "?"; @@ -2492,6 +2840,7 @@ case ModeSm.EventId.PTT_PRESSED: return "PTT_PRESSED"; case ModeSm.EventId.PTT_RELEASED: return "PTT_RELEASED"; case ModeSm.EventId.TO_CW_MODE: return "TO_CW_MODE"; + case ModeSm.EventId.TO_DIGITAL_MODE: return "TO_DIGITAL_MODE"; case ModeSm.EventId.TO_SSB_MODE: return "TO_SSB_MODE"; default: return "?"; } @@ -2531,7 +2880,7 @@ center: true }); - const diagramEventNamesArray = ['do', 'CALIBRATE_EXIT', 'CALIBRATE_FREQUENCY', 'CALIBRATE_POWER', 'CALIBRATE_RX_IQ', 'CALIBRATE_TX_IQ', 'DAH_PRESSED', 'DIT_PRESSED', 'KEY_PRESSED', 'KEY_RELEASED', 'OFFSET_END', 'OFFSET_START', 'PTT_PRESSED', 'PTT_RELEASED', 'TO_CW_MODE', 'TO_SSB_MODE', ]; + const diagramEventNamesArray = ['do', 'CALIBRATE_EXIT', 'CALIBRATE_FREQUENCY', 'CALIBRATE_POWER', 'CALIBRATE_RX_IQ', 'CALIBRATE_TX_IQ', 'DAH_PRESSED', 'DIT_PRESSED', 'KEY_PRESSED', 'KEY_RELEASED', 'OFFSET_END', 'OFFSET_START', 'PTT_PRESSED', 'PTT_RELEASED', 'TO_CW_MODE', 'TO_DIGITAL_MODE', 'TO_SSB_MODE', ]; // Mapping from state to available events const stateEventsMapping = { @@ -2575,14 +2924,6 @@ "CALIBRATE_RX_IQ", "CALIBRATE_TX_IQ" ], - "SSB_RECEIVE": [ - "CALIBRATE_FREQUENCY", - "CALIBRATE_POWER", - "CALIBRATE_RX_IQ", - "CALIBRATE_TX_IQ", - "PTT_PRESSED", - "TO_CW_MODE" - ], "CW_RECEIVE": [ "CALIBRATE_FREQUENCY", "CALIBRATE_POWER", @@ -2592,6 +2933,7 @@ "DIT_PRESSED", "do", "KEY_PRESSED", + "TO_DIGITAL_MODE", "TO_SSB_MODE" ], "SSB_TRANSMIT": [ @@ -2645,6 +2987,37 @@ "CALIBRATE_RX_IQ", "CALIBRATE_TX_IQ", "do" + ], + "DIGITAL_STATES": [ + "CALIBRATE_FREQUENCY", + "CALIBRATE_POWER", + "CALIBRATE_RX_IQ", + "CALIBRATE_TX_IQ" + ], + "DIGITAL_RECEIVE": [ + "CALIBRATE_FREQUENCY", + "CALIBRATE_POWER", + "CALIBRATE_RX_IQ", + "CALIBRATE_TX_IQ", + "PTT_PRESSED", + "TO_CW_MODE", + "TO_SSB_MODE" + ], + "DIGITAL_TRANSMIT": [ + "CALIBRATE_FREQUENCY", + "CALIBRATE_POWER", + "CALIBRATE_RX_IQ", + "CALIBRATE_TX_IQ", + "PTT_RELEASED" + ], + "SSB_RECEIVE": [ + "CALIBRATE_FREQUENCY", + "CALIBRATE_POWER", + "CALIBRATE_RX_IQ", + "CALIBRATE_TX_IQ", + "PTT_PRESSED", + "TO_CW_MODE", + "TO_DIGITAL_MODE" ] }; diff --git a/code/src/PhoenixSketch/PhoenixSketch.ino b/code/src/PhoenixSketch/PhoenixSketch.ino index ab3dd08..17c74d5 100644 --- a/code/src/PhoenixSketch/PhoenixSketch.ino +++ b/code/src/PhoenixSketch/PhoenixSketch.ino @@ -39,7 +39,8 @@ If not, see . * display are isolated into separate modules with clear interfaces. * * 2. **State Machine Control**: All hardware state changes flow through state - * machines (ModeSm, UISm, TuneSm) ensuring deterministic, predictable behavior. + * machines (ModeSm and UISm, generated by StateSmith; plus the hand-written + * HardwareSm) ensuring deterministic, predictable behavior. * * 3. **Real-Time Constraints**: The main loop must complete within 10ms to * prevent audio buffer overflows. Display updates are rate-limited. @@ -58,9 +59,9 @@ If not, see . * ├─────────────────────────────────────────────────────────────────────┤ * │ State Machines │ * │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ - * │ │ ModeSm │ │ UISm │ │ TuneSm │ │ - * │ │ (Operating │ │ (User │ │ (Frequency │ │ - * │ │ Modes) │ │ Interface) │ │ Control) │ │ + * │ │ ModeSm │ │ UISm │ │ HardwareSm │ │ + * │ │ (Operating │ │ (User │ │ (Hardware │ │ + * │ │ Modes) │ │ Interface) │ │ & Tuning) │ │ * │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ * │ │ │ │ │ * │ │ │ │ │ @@ -82,10 +83,12 @@ If not, see . * * STATE MACHINES * -------------- - * Generated by StateSmith from UML diagrams, these provide deterministic control: + * These provide deterministic control. ModeSm and UISm are generated by StateSmith from + * UML diagrams; HardwareSm is hand-written: * * **ModeSm** (ModeSm.cpp/h) - Operating mode control - * States: SSB_RECEIVE, SSB_TRANSMIT, CW_RECEIVE, CW_TRANSMIT, TUNE + * States: SSB_RECEIVE, SSB_TRANSMIT, CW_RECEIVE, six CW_TRANSMIT_* keyer sub-states, + * and the CALIBRATE_* states (see ModeSm.h; there is no TUNE state) * - Controls TX/RX switching, VFO selection, modulation routing * - Handles CW keyer timing and character generation * - Manages transmit timeouts and safety interlocks @@ -96,17 +99,22 @@ If not, see . * - Manages menu navigation hierarchy * - Handles parameter adjustment workflow * - * **TuneSm** (Tune.cpp/h) - Frequency control (this one isn't generated by StateSmith) - * States: TuneReceive, TuneSSBTX, TuneCWTX - * - Sets appropriate VFO for current mode - * - Applies CW tone offset in CW mode - * - Coordinates SSB I/Q or CW single-output VFO selection + * **HardwareSm** (HardwareSm.cpp/h) - Hardware & frequency control + * (hand-written, NOT generated by StateSmith) + * - Maps ModeSm operating modes onto concrete RF hardware states (RFReceive, + * RFTransmit, RFCWMark/Space, calibration paths) + * - Drives the TuneState transitions (TuneReceive, TuneSSBTX, TuneCWTX, plus + * calibration variants) in HandleTuneState(): VFO selection, Fs/4 shift, CW tone offset + * - Orchestrates the four generated calibration sub-state-machines + * + * NOTE: Tune.cpp/h is a pure-function library (frequency math + power-curve fit), NOT a + * state machine. The frequency-control state lives in HardwareSm, not in Tune.cpp. * * MAIN EXECUTION FLOW * ------------------- * 1. **setup()** (Globals.ino) * - Initialize hardware (display, audio, RF boards, front panel) - * - Load settings from EEPROM + * - Load settings from flash/SD storage (LittleFS + SD card) * - Start state machines * - Begin 1ms timer for state machine DO events * @@ -145,7 +153,7 @@ If not, see . * * **Radio Control:** * - ModeSm.cpp/h: Operating mode state machine (generated by StateSmith) - * - Tune.cpp/h: Frequency tuning state machine + * - Tune.cpp/h: Frequency tuning math (pure functions; not a state machine) * - CAT.cpp/h: Computer control protocol (Kenwood emulation) * * **Program Execution and Flow Control:** @@ -154,13 +162,14 @@ If not, see . * **Configuration:** * - Config.h: Pin definitions, constants, system configuration * - SDT.h: System data types and global state (ED structure) - * - Storage.cpp/h: EEPROM persistence for settings + * - Storage.cpp/h: settings persistence (JSON on LittleFS flash + SD card; not true EEPROM) * - Globals.cpp: Global variable definitions * * PERSITENT CONFIGURATION * ------------ - * The `ED` (EEPROM Data) structure in SDT.h holds the radio operating configuration. - * This persists across power cycles and is saved to EEPROM and SDCard (if present). + * The `ED` (EEPROMData) structure in SDT.h holds the radio operating configuration. + * (The name is historical — the Teensy 4.1 has no true EEPROM.) This persists across power + * cycles and is serialized as JSON to LittleFS program flash and the SD card (if present). * - Frequencies, band settings, filter parameters * - Volume, gain, AGC settings * - Display preferences, spectrum zoom diff --git a/code/src/PhoenixSketch/RFBoard.cpp b/code/src/PhoenixSketch/RFBoard.cpp index 9160fec..292224a 100644 --- a/code/src/PhoenixSketch/RFBoard.cpp +++ b/code/src/PhoenixSketch/RFBoard.cpp @@ -38,18 +38,18 @@ bool dualVFO = true; /** Set to true if we have separate RX and TX VFOs */ // There are three VFOs: RX, TX, and CW. They are controlled separately. #define SI5351_DRIVE_CURRENT_RX SI5351_DRIVE_8MA static int32_t rxmultiple, oldrxMultiple; -static int64_t RXVFOFreq_dHz; +static int64_t RXVFOFreq_cHz; si5351_clock CLK0RX = SI5351_CLK0; si5351_clock CLK90RX = SI5351_CLK1; #define SI5351_DRIVE_CURRENT_TX SI5351_DRIVE_2MA static int32_t txmultiple, oldtxMultiple; -static int64_t TXVFOFreq_dHz; +static int64_t TXVFOFreq_cHz; si5351_clock CLK0TX = SI5351_CLK4; si5351_clock CLK90TX = SI5351_CLK5; #define SI5351_DRIVE_CURRENT_CW SI5351_DRIVE_2MA -static int64_t CWVFOFreq_dHz; +static int64_t CWVFOFreq_cHz; si5351_clock CLKCW = SI5351_CLK6; #define CLKCWSINGLEVFO SI5351_CLK2 @@ -306,7 +306,7 @@ errno_t SetTXAttenuation(float32_t txAttenuation_dB){ void SetFrequencyCorrectionFactor(int32_t corr){ int64_t freq = GetRXVFOFrequency(); - RXVFOFreq_dHz = 0; + RXVFOFreq_cHz = 0; si5351.reset(); si5351.init(SI5351_LOAD_CAPACITANCE, Si_5351_crystal, corr); @@ -322,35 +322,35 @@ void SetFrequencyCorrectionFactor(int32_t corr){ * Get the current RX VFO frequency setting. * * Returns the frequency of the RX VFO (CLK0RX & CLK90RX quadrature outputs) - * used for reception. The internal frequency is stored in deci-Hertz (Hz × 10) + * used for reception. The internal frequency is stored in centi-Hertz (Hz × 100) * but this function returns the value in Hertz. * * @return Current RX VFO frequency in Hz * * @see SetRXVFOFrequency() to change the frequency - * @see RXVFOFreq_dHz internal storage variable + * @see RXVFOFreq_cHz internal storage variable */ int64_t GetRXVFOFrequency(void){ - return RXVFOFreq_dHz/100; + return RXVFOFreq_cHz/100; } /** * Get the current TX VFO frequency setting. * * Returns the frequency of the TX VFO (CLK0TX & CLK90TX quadrature outputs) - * used for SSB transmission. The internal frequency is stored in deci-Hertz - * (Hz × 10) but this function returns the value in Hertz. + * used for SSB transmission. The internal frequency is stored in centi-Hertz + * (Hz × 100) but this function returns the value in Hertz. * * @return Current TX VFO frequency in Hz * * @see SetTXVFOFrequency() to change the frequency - * @see TXVFOFreq_dHz internal storage variable + * @see TXVFOFreq_cHz internal storage variable */ int64_t GetTXVFOFrequency(void){ if (!dualVFO){ return GetRXVFOFrequency(); } - return TXVFOFreq_dHz/100; + return TXVFOFreq_cHz/100; } /** @@ -478,13 +478,13 @@ int32_t EvenDivisor(int64_t freq2_Hz) { /** * Set the CLK0RX and CLK90RX outputs as quadrature outputs at the specified frequency. * - * @param frequency_dHz The desired clock frequency in (Hz * 100) + * @param frequency_cHz The desired clock frequency in (Hz * 100) */ -void SetRXVFOFrequency(int64_t frequency_dHz){ +void SetRXVFOFrequency(int64_t frequency_cHz){ // No need to change if it's already at this setting - if (frequency_dHz == RXVFOFreq_dHz) return; - RXVFOFreq_dHz = frequency_dHz; - int64_t ClkSetFreq = frequency_dHz; + if (frequency_cHz == RXVFOFreq_cHz) return; + RXVFOFreq_cHz = frequency_cHz; + int64_t ClkSetFreq = frequency_cHz; rxmultiple = EvenDivisor(ClkSetFreq / SI5351_FREQ_MULT); uint64_t pll_freq = ClkSetFreq * rxmultiple; uint64_t freq = pll_freq / rxmultiple; @@ -529,17 +529,17 @@ void SetRXVFOFrequency(int64_t frequency_dHz){ /** * Set the CLK0TX and CLK90TX outputs as quadrature outputs at the specified frequency. * - * @param frequency_dHz The desired clock frequency in (Hz * 100) + * @param frequency_cHz The desired clock frequency in (Hz * 100) */ -void SetTXVFOFrequency(int64_t frequency_dHz){ +void SetTXVFOFrequency(int64_t frequency_cHz){ if (!dualVFO){ - SetRXVFOFrequency(frequency_dHz); + SetRXVFOFrequency(frequency_cHz); return; } // No need to change if it's already at this setting - if (frequency_dHz == TXVFOFreq_dHz) return; - TXVFOFreq_dHz = frequency_dHz; - int64_t ClkSetFreq = frequency_dHz; + if (frequency_cHz == TXVFOFreq_cHz) return; + TXVFOFreq_cHz = frequency_cHz; + int64_t ClkSetFreq = frequency_cHz; txmultiple = EvenDivisor(ClkSetFreq / SI5351_FREQ_MULT); uint64_t pll_freq = ClkSetFreq * txmultiple; uint64_t freq = pll_freq / txmultiple; @@ -631,7 +631,7 @@ void DisableTXVFOOutput(void){ * Set the CW VFO frequency for Morse code transmission. * * Configures the Si5351 CLKCW output frequency used for CW (Morse code) operation. - * The frequency is stored and set in deci-Hertz units (Hz × 10) for high precision. + * The frequency is stored and set in centi-Hertz units (Hz × 100) for high precision. * * Optimization: Skips the Si5351 write if the requested frequency matches the * current setting, preventing unnecessary I2C transactions. @@ -640,36 +640,36 @@ void DisableTXVFOOutput(void){ * (e.g., centerFreq + 700Hz for a 700Hz tone). The tune state machine handles * this offset calculation. * - * @param frequency_dHz Desired CW VFO frequency in deci-Hertz (Hz × 10) + * @param frequency_cHz Desired CW VFO frequency in centi-Hertz (Hz × 100) * * @see GetCWVFOFrequency() to read current frequency * @see EnableCWVFOOutput() to enable CLK2 output * @see Tune.cpp for CW frequency offset handling */ -void SetCWVFOFrequency(int64_t frequency_dHz){ +void SetCWVFOFrequency(int64_t frequency_cHz){ // No need to change if it's already at this setting - if (frequency_dHz == CWVFOFreq_dHz) return; - CWVFOFreq_dHz = frequency_dHz; + if (frequency_cHz == CWVFOFreq_cHz) return; + CWVFOFreq_cHz = frequency_cHz; if (dualVFO) - si5351.set_freq(CWVFOFreq_dHz, CLKCW); + si5351.set_freq(CWVFOFreq_cHz, CLKCW); else - si5351.set_freq(CWVFOFreq_dHz, CLKCWSINGLEVFO); + si5351.set_freq(CWVFOFreq_cHz, CLKCWSINGLEVFO); } /** * Get the current CW VFO frequency setting. * * Returns the frequency of the CW VFO (CLK2 output) used for CW transmission. - * The internal frequency is stored in deci-Hertz (Hz × 10) but this function + * The internal frequency is stored in centi-Hertz (Hz × 100) but this function * returns the value in Hertz. * * @return Current CW VFO frequency in Hz * * @see SetCWVFOFrequency() to change the frequency - * @see CWVFOFreq_dHz internal storage variable + * @see CWVFOFreq_cHz internal storage variable */ int64_t GetCWVFOFrequency(void){ - return CWVFOFreq_dHz/100; + return CWVFOFreq_cHz/100; } /** @@ -1000,7 +1000,7 @@ uint16_t GetRFMCPRegisters(void){ void ResetVFOState(void){ oldrxMultiple = 0; oldtxMultiple = 0; - RXVFOFreq_dHz = 0; - TXVFOFreq_dHz = 0; - CWVFOFreq_dHz = 0; + RXVFOFreq_cHz = 0; + TXVFOFreq_cHz = 0; + CWVFOFreq_cHz = 0; } \ No newline at end of file diff --git a/code/src/PhoenixSketch/RFBoard.h b/code/src/PhoenixSketch/RFBoard.h index 2dc2984..0188450 100644 --- a/code/src/PhoenixSketch/RFBoard.h +++ b/code/src/PhoenixSketch/RFBoard.h @@ -88,27 +88,27 @@ void SetFrequencyCorrectionFactor(int32_t corr); /** * @brief Get the current RX VFO frequency setting - * @return Frequency in decihertz (Hz × 10) + * @return Frequency in centihertz (Hz × 100) */ int64_t GetRXVFOFrequency(void); /** * @brief Get the current TX VFO frequency setting - * @return Frequency in decihertz (Hz × 10) + * @return Frequency in centihertz (Hz × 100) */ int64_t GetTXVFOFrequency(void); /** * @brief Set the RX VFO frequency - * @param frequency_dHz Desired frequency in decihertz (Hz × 10) + * @param frequency_cHz Desired frequency in centihertz (Hz × 100) */ -void SetRXVFOFrequency(int64_t frequency_dHz); +void SetRXVFOFrequency(int64_t frequency_cHz); /** * @brief Set the TX VFO frequency - * @param frequency_dHz Desired frequency in decihertz (Hz × 10) + * @param frequency_cHz Desired frequency in centihertz (Hz × 100) */ -void SetTXVFOFrequency(int64_t frequency_dHz); +void SetTXVFOFrequency(int64_t frequency_cHz); /** * @brief Set the RX VFO output power level @@ -162,16 +162,16 @@ errno_t InitTXVFO(void); /** * @brief Get the current CW VFO frequency setting - * @return Frequency in decihertz (Hz × 10) + * @return Frequency in centihertz (Hz × 100) */ int64_t GetCWVFOFrequency(void); /** * @brief Set the CW VFO frequency - * @param frequency_dHz Desired frequency in decihertz (Hz × 10) + * @param frequency_cHz Desired frequency in centihertz (Hz × 100) * @note Frequency is applied to Si5351 CLK1 output */ -void SetCWVFOFrequency(int64_t frequency_dHz); +void SetCWVFOFrequency(int64_t frequency_cHz); /** * @brief Set the CW VFO output power level diff --git a/code/src/PhoenixSketch/SDT.h b/code/src/PhoenixSketch/SDT.h index 5bd4a28..adf1008 100644 --- a/code/src/PhoenixSketch/SDT.h +++ b/code/src/PhoenixSketch/SDT.h @@ -23,11 +23,22 @@ If not, see . #include "Config.h" #define RIGNAME "T41-EP SDT" -#define VERSION "Phx V1.3.2" +#define VERSION "Phx V1.4.0" #include "BuildInfo.h" +// Teensyduino has no "Dual Serial + Audio" USB type, so a build with a USB audio +// interface (usb=serialmidiaudio, which digital mode requires) has only one serial +// port. CAT then shares the primary Serial, and Debug() must go quiet or its +// output would corrupt the CAT stream. Without USB audio, nothing changes: CAT +// keeps its own SerialUSB1 and Debug() keeps Serial to itself. +#ifdef AUDIO_INTERFACE +#define CATSerial Serial +#define Debug(x) +#else +#define CATSerial SerialUSB1 #define Debug(x) Serial.println(x) +#endif #include // Installed via Arduino library manager #include // https://github.com/chipaudette/OpenAudio_ArduinoLibrary @@ -207,6 +218,18 @@ enum FilterType { Notch = 5 }; +/** One second-order analog bandpass section of a stagger-tuned cascade. + * + * The section is (wn/Q)s / (s^2 + (wn/Q)s + wn^2). wnRatio is wn expressed as a + * fraction of the cascade's centre frequency, so the same prototype describes + * the filter shape at any centre frequency and any sample rate. + * See CalcBandpassCascadeCoeffs(). + */ +struct BandpassProtoSection { + float32_t wnRatio; /** Section resonance as a fraction of the centre frequency */ + float32_t Q; /** Section quality factor */ +}; + enum TXRXType { TX = 1, RX = 0 @@ -272,6 +295,7 @@ extern struct config_t { int16_t spectrumNoiseFloor[NUMBER_OF_BANDS] = {50,50,50,50,50,50,50,50,50,50,50,50,50 }; /** Shift spectrum up/down on display */ int8_t spectrumFloorAuto = 1; /** Automatically adjust the spectrum floor */ uint32_t spectrum_zoom = 1; /** Zoom level for spectrum */ + uint8_t sampleRate = SAMPLE_RATE_192K; /** Audio sample rate selector (index into SR[]) */ int32_t CWFilterIndex = 5; /** Selects the receive CW audio filter */ int32_t CWToneIndex = 3; /** Selects the transmitted CW tone frequency */ int32_t decoderFlag = 0; /** CW decoder on/off */ @@ -288,6 +312,16 @@ extern struct config_t { int32_t equalizerRec[EQUALIZER_CELL_COUNT] = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 }; /** Receive audio equalizer amplitudes */ int32_t equalizerXmt[EQUALIZER_CELL_COUNT] = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 }; /** Transmit audio equalizer amplitudes */ int32_t currentMicGain = 20; /** Gain of the mic used for SSB */ + int32_t digitalDriveLevel = 50; /** Drive level (0-100) applied to USB transmit audio in digital mode */ + /** Level (0-100) applied to USB receive audio in digital mode. + * + * The receive audio arriving at the USB tap is unregulated: with AGC off the + * AGC stage applies a fixed gain of 20, so the level is whatever the antenna + * and the DSP chain produce, and a strong signal reaches full scale and clips. + * The default of 25 is -12 dB, leaving headroom while staying far above the + * chain's noise floor (measured ~66 dB below a strong carrier). + */ + int32_t digitalRxLevel = 25; float32_t dbm_calibration[NUMBER_OF_BANDS] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; /** Calibrates the S-meter scale on the display */ float32_t powerOutCW[NUMBER_OF_BANDS] = {DEFAULT_POWER_LEVEL,DEFAULT_POWER_LEVEL,DEFAULT_POWER_LEVEL, DEFAULT_POWER_LEVEL,DEFAULT_POWER_LEVEL,DEFAULT_POWER_LEVEL, @@ -353,9 +387,22 @@ struct band { int64_t fBandLow_Hz; /** Lower band edge */ int64_t fBandHigh_Hz; /** Upper band edge */ const char *name; /** Name of band */ - ModulationType mode; /** Modulation type (USB, LSB) */ - int32_t FHiCut_Hz; /** Audio bandpass filter edge */ - int32_t FLoCut_Hz; /** Audio bandpass filter edge */ + /** The band's DEFAULT modulation - not the current one. + * + * The current modulation is ED.modulation[activeVFO]; that is what Demodulate() + * switches on and what the user selects. This field is the fixed reference the + * default is measured against, and the sign of FHiCut_Hz/FLoCut_Hz below is + * expressed in its convention (negative below the carrier for an LSB default). + * InitFilterMask() mirrors the stored cutoffs whenever the current modulation + * differs from this, which is how the other sideband is produced. + * + * Nothing may write this at run time. Doing so silently flips the sideband: + * making it agree with a newly selected modulation removes the mirroring and + * hands back the band-default passband instead of the requested one. + */ + ModulationType mode; + int32_t FHiCut_Hz; /** Audio bandpass filter edge, in the mode-default convention */ + int32_t FLoCut_Hz; /** Audio bandpass filter edge, in the mode-default convention */ float32_t RFgain_dB; /** Gain applied in the DSP receive chain */ BandType band_type; /** type of band */ int32_t AGC_thresh; /** AGC threshold value used by DSP receive code */ @@ -382,9 +429,9 @@ struct DecimationFilter{ float32_t n_samplerate_Hz; /** Samplerate before decimation, Hz */ float32_t n_att_dB; /** Attenuation of the stopband, dB */ float32_t n_desired_BW_Hz; /** Desired max BW of the filters, Hz */ - float32_t *FIR_dec_I_state; /** Pointer to the state vector for I decimator FIR filter*/ - float32_t *FIR_dec_Q_state; /** Pointer to the state vector for Q decimator FIR filter */ - float32_t *FIR_dec_coeffs; /** Pointer to the decimator FIR filter coefficients */ + float32_t *FIR_dec_I_state = nullptr; /** Pointer to the state vector for I decimator FIR filter*/ + float32_t *FIR_dec_Q_state = nullptr; /** Pointer to the state vector for Q decimator FIR filter */ + float32_t *FIR_dec_coeffs = nullptr; /** Pointer to the decimator FIR filter coefficients */ float32_t n_fpass; /** FIR filter passband edge */ float32_t n_fstop; /** FIR filter stopband edge */ uint16_t n_dec_taps; /** Number of taps in FIR filter*/ @@ -427,6 +474,14 @@ struct ReceiveFilterConfig { const uint32_t N_stages_biquad_lowpass1 = 1; float32_t biquad_lowpass1_coeffs[5] = { 0, 0, 0, 0, 0 }; + // AM demodulation DC blocker. A one pole highpass, y[n] = x[n] - x[n-1] + + // pole*y[n-1], that strips the carrier's DC term out of the envelope. The + // pole is derived from the audio sample rate in InitializeFilters() so the + // corner stays put when the rate changes. + const float32_t amDCBlockCorner_Hz = 38.0; /** Corner of the AM DC blocker */ + float32_t amDCBlockPole = 0.99; /** Pole position, set from the audio rate */ + float32_t amDCBlockState = 0.0; /** Filter history, one sample */ + // Audio equalization filters const uint32_t eqNumStages = 4; arm_biquad_cascade_df2T_instance_f32 S_Rec[EQUALIZER_CELL_COUNT]; @@ -673,6 +728,7 @@ struct AGCConfig { #include "DSP_CWProcessing.h" #include "DSP.h" #include "MainBoard_AudioIO.h" +#include "USBAudio.h" #include "FrontPanel.h" #include "FrontPanel_Rotary.h" #include "RFBoard.h" @@ -711,7 +767,7 @@ extern AudioPlayQueue Q_out_R_Ex; extern const float32_t CWToneOffsetsHz[]; -extern uint8_t SampleRate; +extern uint8_t& SampleRate; // reference to ED.sampleRate (persisted); keeps SR[SampleRate] usage working extern VolumeFunction volumeFunction; diff --git a/code/src/PhoenixSketch/Storage.cpp b/code/src/PhoenixSketch/Storage.cpp index 5eb7f1c..2a916ef 100644 --- a/code/src/PhoenixSketch/Storage.cpp +++ b/code/src/PhoenixSketch/Storage.cpp @@ -66,6 +66,7 @@ void SaveDataToStorage(bool savetosd){ doc["spectrumNoiseFloor"][i] = ED.spectrumNoiseFloor[i]; } doc["spectrum_zoom"] = ED.spectrum_zoom; + doc["sampleRate"] = ED.sampleRate; doc["CWFilterIndex"] = ED.CWFilterIndex; doc["CWToneIndex"] = ED.CWToneIndex; doc["decoderFlag"] = ED.decoderFlag; @@ -93,6 +94,8 @@ void SaveDataToStorage(bool savetosd){ } doc["currentMicGain"] = ED.currentMicGain; + doc["digitalDriveLevel"] = ED.digitalDriveLevel; + doc["digitalRxLevel"] = ED.digitalRxLevel; // Band-specific arrays for(int i = 0; i < NUMBER_OF_BANDS; i++) { @@ -274,6 +277,7 @@ void RestoreDataFromStorage(void){ } } ED.spectrum_zoom = doc["spectrum_zoom"] | ED.spectrum_zoom; + ED.sampleRate = doc["sampleRate"] | ED.sampleRate; ED.CWFilterIndex = doc["CWFilterIndex"] | ED.CWFilterIndex; ED.CWToneIndex = doc["CWToneIndex"] | ED.CWToneIndex; ED.decoderFlag = doc["decoderFlag"] | ED.decoderFlag; @@ -315,6 +319,8 @@ void RestoreDataFromStorage(void){ } ED.currentMicGain = doc["currentMicGain"] | ED.currentMicGain; + ED.digitalDriveLevel = doc["digitalDriveLevel"] | ED.digitalDriveLevel; + ED.digitalRxLevel = doc["digitalRxLevel"] | ED.digitalRxLevel; if (doc["dbm_calibration"].is()) { for(int i = 0; i < NUMBER_OF_BANDS; i++) { @@ -499,6 +505,7 @@ void RestoreDataFromSDCard(void){ } } ED.spectrum_zoom = doc["spectrum_zoom"] | ED.spectrum_zoom; + ED.sampleRate = doc["sampleRate"] | ED.sampleRate; ED.CWFilterIndex = doc["CWFilterIndex"] | ED.CWFilterIndex; ED.CWToneIndex = doc["CWToneIndex"] | ED.CWToneIndex; ED.decoderFlag = doc["decoderFlag"] | ED.decoderFlag; @@ -540,6 +547,8 @@ void RestoreDataFromSDCard(void){ } ED.currentMicGain = doc["currentMicGain"] | ED.currentMicGain; + ED.digitalDriveLevel = doc["digitalDriveLevel"] | ED.digitalDriveLevel; + ED.digitalRxLevel = doc["digitalRxLevel"] | ED.digitalRxLevel; if (doc["dbm_calibration"].is()) { for(int i = 0; i < NUMBER_OF_BANDS; i++) { @@ -672,7 +681,7 @@ void RestoreDataFromSDCard(void){ ED.PowerCal_20W_to_100W_threshold_W = doc["PowerCal_20W_to_100W_threshold_W"] | ED.PowerCal_20W_to_100W_threshold_W; - // Save the data to the EEPROM so that it matches + // Save the data to flash/SD storage so that it matches SaveDataToStorage(false); Serial.println("Config data restored successfully"); } @@ -695,6 +704,7 @@ void PrintEDToSerial(void){ } Serial.println(); Serial.print("spectrum_zoom: "); Serial.println(ED.spectrum_zoom); + Serial.print("sampleRate: "); Serial.println(ED.sampleRate); Serial.print("CWFilterIndex: "); Serial.println(ED.CWFilterIndex); Serial.print("CWToneIndex: "); Serial.println(ED.CWToneIndex); Serial.print("decoderFlag: "); Serial.println(ED.decoderFlag); @@ -713,6 +723,8 @@ void PrintEDToSerial(void){ Serial.print("fineTuneFreq_Hz[0]: "); Serial.println(ED.fineTuneFreq_Hz[0]); Serial.print("fineTuneFreq_Hz[1]: "); Serial.println(ED.fineTuneFreq_Hz[1]); Serial.print("currentMicGain: "); Serial.println(ED.currentMicGain); + Serial.print("digitalDriveLevel: "); Serial.println(ED.digitalDriveLevel); + Serial.print("digitalRxLevel: "); Serial.println(ED.digitalRxLevel); Serial.print("dbm_calibration: "); for(int i = 0; i < NUMBER_OF_BANDS; i++) { Serial.print(ED.dbm_calibration[i]); diff --git a/code/src/PhoenixSketch/Tune.cpp b/code/src/PhoenixSketch/Tune.cpp index dec0b19..71aebb1 100644 --- a/code/src/PhoenixSketch/Tune.cpp +++ b/code/src/PhoenixSketch/Tune.cpp @@ -107,7 +107,7 @@ void AdjustFineTune(int32_t filter_change){ * * @return The effective transmit/receive frequency in units of Hz * 100 */ -int64_t GetTXRXFreq_dHz(void){ +int64_t GetTXRXFreq_cHz(void){ int64_t val = 100*(ED.centerFreq_Hz[ED.activeVFO] - ED.fineTuneFreq_Hz[ED.activeVFO] - SR[SampleRate].rate/4); return val; } @@ -129,8 +129,8 @@ int64_t GetTXRXFreq(uint8_t vfo){ * * @return The CW tone transmit frequency in units of Hz * 100 */ -int64_t GetCWTXFreq_dHz(void){ - int64_t txrx = GetTXRXFreq_dHz(); +int64_t GetCWTXFreq_cHz(void){ + int64_t txrx = GetTXRXFreq_cHz(); int64_t offset = (int64_t)(100*CWToneOffsetsHz[ED.CWToneIndex]); if (bands[ED.currentBand[ED.activeVFO]].mode == LSB) { return txrx - offset; diff --git a/code/src/PhoenixSketch/Tune.h b/code/src/PhoenixSketch/Tune.h index 46e4e90..098361f 100644 --- a/code/src/PhoenixSketch/Tune.h +++ b/code/src/PhoenixSketch/Tune.h @@ -20,11 +20,11 @@ If not, see . /** * @brief Get effective TX/RX frequency for active VFO - * @return Effective TX/RX frequency in deci-Hertz (Hz × 100) + * @return Effective TX/RX frequency in centi-Hz (Hz × 100) * @note Combines center frequency, fine tune offset, and sample rate quarter-shift * @note Formula: (centerFreq - fineTune - sampleRate/4) × 100 */ -int64_t GetTXRXFreq_dHz(void); +int64_t GetTXRXFreq_cHz(void); /** * @brief Get effective TX/RX frequency for specified VFO @@ -37,11 +37,11 @@ int64_t GetTXRXFreq(uint8_t vfo); /** * @brief Get CW transmit frequency with tone offset applied - * @return CW transmit frequency in deci-Hertz (Hz × 100) + * @return CW transmit frequency in centi-Hz (Hz × 100) * @note Adds/subtracts CW tone offset from TX/RX frequency * @note Offset direction depends on sideband (LSB subtracts, USB adds) */ -int64_t GetCWTXFreq_dHz(void); +int64_t GetCWTXFreq_cHz(void); /** * @brief Determine amateur radio band containing given frequency diff --git a/code/src/PhoenixSketch/USBAudio.cpp b/code/src/PhoenixSketch/USBAudio.cpp new file mode 100644 index 0000000..e3ad368 --- /dev/null +++ b/code/src/PhoenixSketch/USBAudio.cpp @@ -0,0 +1,403 @@ +/* +Copyright (C) 2026 T41 EP Software Contributors +See Contributors.txt for list of known authors. + +This file is part of Phoenix. + +Phoenix is free software: you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later version. + +Phoenix is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with Phoenix. +If not, see . +*/ + +/** + * USB audio transport for DIGITAL mode. + * + * ## Why this file exists + * + * The stock Teensy AudioInputUSB / AudioOutputUSB objects (the same ones + * OpenAudio's USB_Audio_F32.h wraps) do everything we need: descriptors, DMA, + * the isochronous ISRs, and the asynchronous feedback endpoint that keeps the + * host's clock and ours in step. None of that is reimplemented here. + * + * What does not work is putting them in the AudioConnection graph directly. The + * graph is clocked by the I2S DMA, not by USB: software_isr() runs once per + * AUDIO_BLOCK_SAMPLES of I2S, which at 176.4 ksps is 1378.125 Hz. The USB audio + * objects must be updated at 44100/128 = 344.53 Hz. Overfed 4:1, AudioOutputUSB + * only holds two blocks and discards the rest, and AudioInputUSB's feedback + * control loop is calibrated for the nominal rate. + * + * At 176.4 ksps that ratio is exactly 4:1, which is the whole reason DIGITAL + * mode forces this sample rate. So we take the USB objects out of the graph + * clock (AudioStream::update_all skips any object whose protected `active` flag + * is false) and drive their update() from a pacer that does real work on every + * fourth call. + * + * ## Data flow + * + * radio -> PC: DSP block (512 samples @ 44.1 kHz) + * -> USBAudioWriteRx -> usbPlayL/R -> usbOut -> host + * PC -> radio: host -> usbIn -> usbRecL/R -> USBAudioReadTx -> DSP block + * + * The AudioPlayQueue / AudioRecordQueue objects are the buffering, so there is + * no ring buffer here: the DSP delivers four blocks at once every 11.6 ms while + * the pacer moves one block every 2.9 ms. + * + * ## A note on style + * + * Phoenix is written as C-style C++ - free functions over file-scope data - and + * this file follows that. The two places it cannot are forced by the Teensy + * Audio library, and both are as small as they can be made: + * + * 1. Clearing AudioStream::active needs a derived type, because the flag is + * protected. Hence the four one-line Deactivatable* structs below. + * 2. Getting into update_all() at all needs an AudioStream subclass with an + * update() method. Hence USBAudioPacer, whose state is a file-scope + * variable and whose body is an ordinary out-of-line function. + * + * @see USBAudio.h for the public API + */ +#include "SDT.h" +#include "USBAudio.h" + +#ifdef AUDIO_INTERFACE + +#include + +// The core's usb_audio.cpp exports these but does not declare them in a header. +extern volatile uint32_t usb_audio_underrun_count; +extern volatile uint32_t usb_audio_overrun_count; + +/** Depth of the radio-to-host play queue, in AUDIO_BLOCK_SAMPLES blocks. + * + * The producer and consumer are rate-matched on average (both 44,100 samples/s) + * but not in phase: the DSP delivers four blocks at once every 11.6 ms, while + * the pacer takes one block every 2.9 ms. So the queue swings by four blocks + * every DSP period no matter what, and anything that delays the main loop - + * a display refresh is the obvious one - drains it further. + * + * This started at 8 with no prefill, which left the queue living at a depth of + * 0-4 blocks, i.e. no underrun margin at all. A 12 s capture then contained 147 + * dropouts totalling 903 ms, every one an exact multiple of AUDIO_BLOCK_SAMPLES + * and spaced about 133 ms apart: AudioOutputUSB::update() substitutes a silence + * block whenever its input queue is empty, so an empty play queue is heard as + * digital silence, not as a glitch. + * + * 24 blocks prefilled to half depth gives ~35 ms of margin in both directions - + * three times the worst observed stall - for ~35 ms of added latency, which is + * nothing to an FT8 decoder. */ +#define USB_PLAY_QUEUE_BLOCKS 24 + +/** Blocks of silence queued at start-up so the first stall has something to eat. */ +#define USB_PLAY_QUEUE_PREFILL (USB_PLAY_QUEUE_BLOCKS / 2) + +/** Blocks the record queue may accumulate before USBAudioReadTx() discards the + * oldest. AudioRecordQueue has no built-in cap and will happily swallow the + * whole audio memory pool if the main loop stalls. */ +#define USB_REC_QUEUE_CAP 12 + +/** AudioStream blocks per DSP block. 512 / 128 = 4, and also the pacer divisor. */ +#define USB_BLOCKS_PER_DSP_BLOCK (USB_AUDIO_BLOCK_SAMPLES / AUDIO_BLOCK_SAMPLES) + +// --------------------------------------------------------------------------- +// Audio graph objects +// +// AudioStream::active is protected, so only a derived type may clear it. These +// four structs add nothing else. Clearing the flag removes the object from +// update_all(), which is what lets DriveUSBAudioObjects() below run them at the +// USB rate instead of the I2S rate. +// --------------------------------------------------------------------------- +struct DeactivatableInputUSB : public AudioInputUSB { void Deactivate(void){ active = false; } }; +struct DeactivatableOutputUSB : public AudioOutputUSB { void Deactivate(void){ active = false; } }; +struct DeactivatablePlayQueue : public AudioPlayQueue { void Deactivate(void){ active = false; } }; +struct DeactivatableRecordQueue : public AudioRecordQueue { void Deactivate(void){ active = false; } }; + +static DeactivatableInputUSB usbIn; // host -> radio (transmit audio) +static DeactivatableOutputUSB usbOut; // radio -> host (receive audio) +static DeactivatablePlayQueue usbPlayL, usbPlayR; // staging for usbOut +static DeactivatableRecordQueue usbRecL, usbRecR; // staging from usbIn + +static AudioConnection usbPatch1(usbPlayL, 0, usbOut, 0); +static AudioConnection usbPatch2(usbPlayR, 0, usbOut, 1); +static AudioConnection usbPatch3(usbIn, 0, usbRecL, 0); +static AudioConnection usbPatch4(usbIn, 1, usbRecR, 0); + +static volatile bool usbAudioRunning = false; +static volatile uint8_t usbPacerCount = 0; + +// Transmit-path health counters. The USB->exciter path joins 128-sample blocks +// pulled from the record queue; if that queue ever runs dry or has to be trimmed, +// the join is discontinuous and the discontinuity lands on the air as sidebands +// at the block rate. These say which is happening. +static volatile uint32_t usbTxUnderruns = 0; // ReadTx found fewer than 4 blocks +static volatile uint32_t usbTxTrimmed = 0; // blocks discarded for exceeding the cap +static volatile uint32_t usbTxCalls = 0; // ReadTx calls, to normalise the above +static volatile uint8_t usbRecDepthMin = 255; +static volatile uint8_t usbRecDepthMax = 0; + +/** Scratch for scaling receive audio on its way to the host, so the caller's + * buffer - which still has to feed the speaker - is left untouched. */ +static float32_t usbRxScratch[AUDIO_BLOCK_SAMPLES]; + +/** + * Run one USB audio block in and one out. + * + * Called from the pacer at 44100/AUDIO_BLOCK_SAMPLES Hz. The six objects are all + * out of update_all(), so this is the only thing driving them, and the order + * here is their data dependency order. + */ +static void DriveUSBAudioObjects(void){ + // radio -> host: staged blocks into the USB output object + usbPlayL.update(); + usbPlayR.update(); + usbOut.update(); + // host -> radio: USB input object into the staging queues + usbIn.update(); + usbRecL.update(); + usbRecR.update(); + + // Bound the record queue here rather than only in USBAudioReadTx(), which is + // called only while transmitting. Left to itself the queue fills for the whole + // time we are receiving: it was measured pinned at 208 of AudioRecordQueue's + // 209-block ceiling, holding ~418 of the 500 audio blocks between the two + // channels and handing the first transmit ~0.6 s of stale audio to discard. + while (usbRecL.available() > USB_REC_QUEUE_CAP) { + usbRecL.readBuffer(); + usbRecL.freeBuffer(); + } + while (usbRecR.available() > USB_REC_QUEUE_CAP) { + usbRecR.readBuffer(); + usbRecR.freeBuffer(); + } +} + +/** + * Divides the audio library's graph clock down to the USB audio block rate. + * + * This is the only object in this file left in update_all(). It runs in the + * audio ISR at Fs/AUDIO_BLOCK_SAMPLES and does real work on every fourth call, + * i.e. at exactly 44100/128 Hz when the radio is at 176.4 ksps. + */ +struct USBAudioPacer : public AudioStream { + USBAudioPacer(void) : AudioStream(0, NULL) { active = true; } + void update(void); +}; + +static USBAudioPacer usbPacer; + +void USBAudioPacer::update(void){ + if (++usbPacerCount < USB_BLOCKS_PER_DSP_BLOCK) + return; + usbPacerCount = 0; + if (!usbAudioRunning) + return; + DriveUSBAudioObjects(); +} + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- + +void USBAudioInit(void){ + // AudioConnection::connect() sets active = true on both ends, so this has to + // happen after the static AudioConnections above are constructed - which is + // why it lives here and not in the constructors. It also has to happen at + // startup rather than on entry to digital mode: until it does, update_all() + // is driving these objects at the I2S block rate. + usbIn.Deactivate(); + usbOut.Deactivate(); + usbPlayL.Deactivate(); + usbPlayR.Deactivate(); + usbRecL.Deactivate(); + usbRecR.Deactivate(); +} + +void USBAudioBegin(void){ + // Defensive: harmless if USBAudioInit() already ran, and guarantees the + // objects are off the graph clock before we start feeding them. + USBAudioInit(); + + usbPlayL.setMaxBuffers(USB_PLAY_QUEUE_BLOCKS); + usbPlayR.setMaxBuffers(USB_PLAY_QUEUE_BLOCKS); + // Never stall the main loop waiting on the host to drain a queue + usbPlayL.setBehaviour(AudioPlayQueue::NON_STALLING); + usbPlayR.setBehaviour(AudioPlayQueue::NON_STALLING); + + AudioNoInterrupts(); + usbRecL.clear(); + usbRecR.clear(); + usbRecL.begin(); + usbRecR.begin(); + usbPacerCount = 0; + usbTxUnderruns = 0; usbTxTrimmed = 0; usbTxCalls = 0; + usbRecDepthMin = 255; usbRecDepthMax = 0; + usbAudioRunning = true; + AudioInterrupts(); + + // Prefill with silence so the queue starts at half depth rather than empty. + // Without this the very first main-loop stall is heard as a dropout, and the + // queue never gets a chance to build up a cushion of its own. + for (unsigned i = 0; i < USB_PLAY_QUEUE_PREFILL; i++) { + int16_t *bufferL = usbPlayL.getBuffer(); + int16_t *bufferR = usbPlayR.getBuffer(); + if (bufferL == NULL || bufferR == NULL) + break; + memset(bufferL, 0, AUDIO_BLOCK_SAMPLES * sizeof(int16_t)); + memset(bufferR, 0, AUDIO_BLOCK_SAMPLES * sizeof(int16_t)); + usbPlayL.playBuffer(); + usbPlayR.playBuffer(); + } +} + +void USBAudioEnd(void){ + AudioNoInterrupts(); + usbAudioRunning = false; + usbRecL.end(); + usbRecR.end(); + usbRecL.clear(); + usbRecR.clear(); + AudioInterrupts(); + + // AudioPlayQueue has no clear(), and its stop() is declared in the header but + // never defined in this version of the Audio library. Drain it by hand + // instead, so re-entering digital mode does not start by sending the host a + // burst of stale audio. The queue is bounded at USB_PLAY_QUEUE_BLOCKS, so + // that many updates empty it. Safe to call from the main loop: the pacer sees + // usbAudioRunning false and leaves these objects alone. + for (unsigned i = 0; i < USB_PLAY_QUEUE_BLOCKS; i++) + DriveUSBAudioObjects(); +} + +void USBAudioWriteRx(const float32_t *src, size_t n){ + if (!usbAudioRunning || n != USB_AUDIO_BLOCK_SAMPLES) + return; + + // Scale into scratch rather than in place: the caller is still going to run + // the second interpolation stage over this same buffer to feed the speaker. + float32_t level = ED.digitalRxLevel / 100.0f; + + for (unsigned i = 0; i < USB_BLOCKS_PER_DSP_BLOCK; i++) { + int16_t *bufferL = usbPlayL.getBuffer(); + int16_t *bufferR = usbPlayR.getBuffer(); + if (bufferL == NULL || bufferR == NULL) + return; // audio memory exhausted; drop the rest of this block + + // Teensy's CMSIS declares pSrc non-const even though it only reads it + arm_scale_f32((float32_t *)&src[AUDIO_BLOCK_SAMPLES * i], level, + usbRxScratch, AUDIO_BLOCK_SAMPLES); + arm_float_to_q15(usbRxScratch, bufferL, AUDIO_BLOCK_SAMPLES); + // Digital receive audio is mono; the host sees it on both channels + memcpy(bufferR, bufferL, AUDIO_BLOCK_SAMPLES * sizeof(int16_t)); + + // NON_STALLING: a non-zero return means the queue is full and the block + // is retained for a retry. We simply refill it next time round, which + // drops the stale audio in favour of the newer audio - the right trade + // for a live stream. + usbPlayL.playBuffer(); + usbPlayR.playBuffer(); + } +} + +bool USBAudioReadTx(float32_t *dst, size_t n){ + if (!usbAudioRunning || n != USB_AUDIO_BLOCK_SAMPLES) + return false; + + // AudioRecordQueue has no maximum depth of its own, so bound it here or a + // stalled main loop would drain the audio memory pool. Discard oldest first. + int depth = usbRecL.available(); + usbTxCalls++; + if (depth < usbRecDepthMin) usbRecDepthMin = (depth > 255) ? 255 : (uint8_t)depth; + if (depth > usbRecDepthMax) usbRecDepthMax = (depth > 255) ? 255 : (uint8_t)depth; + + while (usbRecL.available() > USB_REC_QUEUE_CAP) { + usbRecL.readBuffer(); + usbRecL.freeBuffer(); + usbTxTrimmed++; + } + while (usbRecR.available() > USB_REC_QUEUE_CAP) { + usbRecR.readBuffer(); + usbRecR.freeBuffer(); + } + + if (usbRecL.available() < (int)USB_BLOCKS_PER_DSP_BLOCK || + usbRecR.available() < (int)USB_BLOCKS_PER_DSP_BLOCK) { + usbTxUnderruns++; + return false; // underrun; caller substitutes silence + } + + for (unsigned i = 0; i < USB_BLOCKS_PER_DSP_BLOCK; i++) { + int16_t *bufferL = usbRecL.readBuffer(); + arm_q15_to_float(bufferL, &dst[AUDIO_BLOCK_SAMPLES * i], AUDIO_BLOCK_SAMPLES); + usbRecL.freeBuffer(); + // Transmit audio is mono - take the left channel and discard the right, + // but drain both in lockstep or the right queue grows without bound. + usbRecR.readBuffer(); + usbRecR.freeBuffer(); + } + return true; +} + +bool USBAudioIsRunning(void){ + return usbAudioRunning; +} + +bool USBAudioHostActive(void){ + return usb_audio_receive_setting != 0; +} + +float USBAudioHostVolume(void){ + return usbIn.volume(); +} + +void USBAudioGetStats(uint32_t *underruns, uint32_t *overruns){ + if (underruns) + *underruns = usb_audio_underrun_count; + if (overruns) + *overruns = usb_audio_overrun_count; +} + +void USBAudioGetTxStats(uint32_t *calls, uint32_t *underruns, uint32_t *trimmed, + uint8_t *depthMin, uint8_t *depthMax){ + if (calls) *calls = usbTxCalls; + if (underruns) *underruns = usbTxUnderruns; + if (trimmed) *trimmed = usbTxTrimmed; + if (depthMin) *depthMin = usbRecDepthMin; + if (depthMax) *depthMax = usbRecDepthMax; +} + +#else // !AUDIO_INTERFACE + +// Built without a USB audio interface. DIGITAL mode is not reachable from the +// UI or CAT in this configuration, but these stubs keep every call site free of +// conditional compilation. + +void USBAudioInit(void){} +void USBAudioBegin(void){} +void USBAudioEnd(void){} +bool USBAudioIsRunning(void){ return false; } +void USBAudioWriteRx(const float32_t *src, size_t n){ (void)src; (void)n; } +bool USBAudioReadTx(float32_t *dst, size_t n){ (void)dst; (void)n; return false; } +bool USBAudioHostActive(void){ return false; } +float USBAudioHostVolume(void){ return 1.0f; } + +void USBAudioGetStats(uint32_t *underruns, uint32_t *overruns){ + if (underruns) *underruns = 0; + if (overruns) *overruns = 0; +} + +void USBAudioGetTxStats(uint32_t *calls, uint32_t *underruns, uint32_t *trimmed, + uint8_t *depthMin, uint8_t *depthMax){ + if (calls) *calls = 0; + if (underruns) *underruns = 0; + if (trimmed) *trimmed = 0; + if (depthMin) *depthMin = 0; + if (depthMax) *depthMax = 0; +} + +#endif // AUDIO_INTERFACE diff --git a/code/src/PhoenixSketch/USBAudio.h b/code/src/PhoenixSketch/USBAudio.h new file mode 100644 index 0000000..1a16e6a --- /dev/null +++ b/code/src/PhoenixSketch/USBAudio.h @@ -0,0 +1,127 @@ +/* +Copyright (C) 2026 T41 EP Software Contributors +See Contributors.txt for list of known authors. + +This file is part of Phoenix. + +Phoenix is free software: you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later version. + +Phoenix is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with Phoenix. +If not, see . +*/ +#ifndef USBAUDIO_H +#define USBAUDIO_H + +#include +#include +#include +#include + +/** + * USB audio transport for DIGITAL mode. + * + * Carries demodulated receive audio to the host and transmit audio back from it, + * at 44.1 kHz. DIGITAL mode forces the radio to 176.4 ksps, where the receive + * chain's Fs/4 tap IS 44,100 Hz and one DSP block is exactly 512 samples, so no + * resampling happens anywhere. + * + * When AUDIO_INTERFACE is not defined (any USB type without an audio interface, + * and the host unit-test build) every function below is a no-op stub, so callers + * need no conditional compilation. + * + * @see USBAudio.cpp for how the stock Teensy USB audio blocks are paced 4:1 + * against the audio library's graph clock. + */ + +/** Number of audio samples exchanged per DSP block (4 x AUDIO_BLOCK_SAMPLES). */ +#define USB_AUDIO_BLOCK_SAMPLES 512 + +/** + * @brief Take the USB audio objects off the audio library's graph clock + * @note Must be called once from InitializeAudio(), before any mode change + * @note Until this runs, update_all() drives the USB audio objects at the I2S + * block rate - four times too fast - which churns audio blocks and makes + * AudioInputUSB ask the host for samples far faster than we can consume them + */ +void USBAudioInit(void); + +/** + * @brief Start the USB audio transport + * @note Called on entry to DIGITAL mode, and again after ChangeSampleRate() + * @note Idempotent; safe to call when already running + */ +void USBAudioBegin(void); + +/** + * @brief Stop the USB audio transport and discard any buffered audio + * @note Called on exit from DIGITAL mode, and before ChangeSampleRate() + */ +void USBAudioEnd(void); + +/** + * @brief Send demodulated receive audio to the host + * @param src Audio samples, nominally -1.0 to 1.0 + * @param n Sample count; must be USB_AUDIO_BLOCK_SAMPLES + * @note Mono; the same samples are sent on both USB channels + * @note Drops the block rather than blocking if the host is not consuming + */ +void USBAudioWriteRx(const float32_t *src, size_t n); + +/** + * @brief Fetch transmit audio from the host + * @param dst Destination for the samples, standardized to -1.0 to 1.0 + * @param n Sample count; must be USB_AUDIO_BLOCK_SAMPLES + * @return true if a full block was available, false on underrun (dst untouched) + * @note Takes the USB left channel only; digital transmit audio is mono + */ +bool USBAudioReadTx(float32_t *dst, size_t n); + +/** + * @brief Report whether the transport is currently started + * @return true between USBAudioBegin() and USBAudioEnd() + * @note Lets ChangeSampleRate() restart the transport only if it was running + */ +bool USBAudioIsRunning(void); + +/** + * @brief Report whether the host has opened the transmit (host to radio) stream + * @return true if the host has selected a non-zero alternate setting + */ +bool USBAudioHostActive(void); + +/** + * @brief Report the host's playback volume setting for the radio's audio device + * @return Volume from 0.0 to 1.0, or 1.0 when USB audio is not compiled in + * @note Provided by the Teensy core's USB audio feature-unit handling + */ +float USBAudioHostVolume(void); + +/** + * @brief Read the core's USB audio under/overrun counters + * @param underruns Set to the number of times a buffer ran dry, may be NULL + * @param overruns Set to the number of times a buffer overflowed, may be NULL + * @note Both should stay flat once streaming is established; a climbing counter + * means the 4:1 pacing is wrong or the DSP loop is not keeping up + */ +void USBAudioGetStats(uint32_t *underruns, uint32_t *overruns); + +/** + * @brief Read the transmit-path health counters, reset by USBAudioBegin() + * @param calls Number of USBAudioReadTx() calls, may be NULL + * @param underruns Times the record queue held fewer than a DSP block's worth + * @param trimmed Blocks discarded because the record queue exceeded its cap + * @param depthMin Lowest record-queue depth seen + * @param depthMax Highest record-queue depth seen + * @note Underruns and trims both splice discontinuous audio into the transmit + * stream, which shows up on the air as sidebands at the block rate + */ +void USBAudioGetTxStats(uint32_t *calls, uint32_t *underruns, uint32_t *trimmed, + uint8_t *depthMin, uint8_t *depthMax); + +#endif // USBAUDIO_H diff --git a/code/test/Arduino.h b/code/test/Arduino.h index 3769cf8..4f21720 100644 --- a/code/test/Arduino.h +++ b/code/test/Arduino.h @@ -11,6 +11,7 @@ typedef float float32_t; #define AudioInterrupts() +#define AudioNoInterrupts() #define DMAMEM #define FASTRUN #define DEC 10 @@ -92,6 +93,8 @@ class IntervalTimer { _interval_us = 0; } + void priority(uint8_t n) { (void)n; } + private: voidFuncPtr _callback; uint32_t _interval_us; diff --git a/code/test/CAT_test.cpp b/code/test/CAT_test.cpp index 674aaf3..8d57ca3 100644 --- a/code/test/CAT_test.cpp +++ b/code/test/CAT_test.cpp @@ -37,13 +37,27 @@ char *PS_write(char* cmd); char *PS_read(char* cmd); char *RX_write(char* cmd); char *TX_write(char* cmd); +char *FW_write(char* cmd); +char *FW_read(char* cmd); +char *SR_write(char* cmd); +char *SR_read(char* cmd); +char *DG_write(char* cmd); +char *DG_read(char* cmd); +char *DR_write(char* cmd); +char *DR_read(char* cmd); +char *CF_write(char* cmd); +char *CF_read(char* cmd); +char *EQ_write(char* cmd); +char *EQ_read(char* cmd); +char *FL_write(char* cmd); +char *FL_read(char* cmd); void UpdateTransmitAudioGain(void); void ShutdownTeensy(void); // External variables needed for testing extern struct config_t ED; extern const struct SR_Descriptor SR[]; -extern uint8_t SampleRate; +extern uint8_t& SampleRate; extern struct band bands[]; TEST(CAT, ChangeBandUp){ @@ -883,9 +897,10 @@ TEST(CAT, MD_write_SetsLSBMode) { char command[] = "MD1;"; // LSB mode char *result = MD_write(command); - - // Verify LSB mode was set - EXPECT_EQ(bands[ED.currentBand[VFO_A]].mode, LSB); + + // The current modulation is what changes; bands[].mode is the band default + // and must be left alone (see SetModulation). + EXPECT_EQ(ED.modulation[VFO_A], LSB); // Verify interrupt was set EXPECT_EQ(GetInterrupt(), iMODE); @@ -903,7 +918,7 @@ TEST(CAT, MD_write_SetsUSBMode) { char *result = MD_write(command); // Verify USB mode was set - EXPECT_EQ(bands[ED.currentBand[VFO_B]].mode, USB); + EXPECT_EQ(ED.modulation[VFO_B], USB); // Verify interrupt was set EXPECT_EQ(GetInterrupt(), iMODE); @@ -922,7 +937,7 @@ TEST(CAT, MD_write_SetsCWModeFromSSBReceive) { char *result = MD_write(command); // Verify LSB mode was set for low band - EXPECT_EQ(bands[ED.currentBand[VFO_A]].mode, LSB); + EXPECT_EQ(ED.modulation[VFO_A], LSB); // Verify mode state machine event was dispatched // Note: We can't easily verify ModeSm_dispatch_event was called in unit test @@ -943,7 +958,7 @@ TEST(CAT, MD_write_SetsCWModeHighBandUSB) { char *result = MD_write(command); // Verify USB mode was set for high band - EXPECT_EQ(bands[ED.currentBand[VFO_A]].mode, USB); + EXPECT_EQ(ED.modulation[VFO_A], USB); // Verify interrupt was set EXPECT_EQ(GetInterrupt(), iMODE); @@ -957,13 +972,13 @@ TEST(CAT, MD_write_CWModeIgnoredWhenNotInSSBReceive) { modeSM.state_id = ModeSm_StateId_CW_RECEIVE; // Different mode ED.activeVFO = VFO_A; ED.currentBand[VFO_A] = BAND_20M; - bands[BAND_20M].mode = USB; // Set initial mode - + ED.modulation[VFO_A] = USB; // Set initial modulation + char command[] = "MD3;"; // CW mode char *result = MD_write(command); // Verify mode was NOT changed (should remain USB) - EXPECT_EQ(bands[ED.currentBand[VFO_A]].mode, USB); + EXPECT_EQ(ED.modulation[VFO_A], USB); // Should return empty string EXPECT_STREQ(result, ""); @@ -978,7 +993,7 @@ TEST(CAT, MD_write_SetsAMMode) { char *result = MD_write(command); // Verify SAM mode was set (defaults to SAM rather than AM) - EXPECT_EQ(bands[ED.currentBand[VFO_A]].mode, SAM); + EXPECT_EQ(ED.modulation[VFO_A], SAM); // Verify interrupt was set EXPECT_EQ(GetInterrupt(), iMODE); @@ -991,13 +1006,13 @@ TEST(CAT, MD_write_InvalidModeIgnored) { // Set up test conditions ED.activeVFO = VFO_A; ED.currentBand[VFO_A] = BAND_20M; - bands[BAND_20M].mode = USB; // Set initial mode - + ED.modulation[VFO_A] = USB; // Set initial modulation + char command[] = "MD9;"; // Invalid mode char *result = MD_write(command); // Verify mode was not changed - EXPECT_EQ(bands[ED.currentBand[VFO_A]].mode, USB); + EXPECT_EQ(ED.modulation[VFO_A], USB); // Should return empty string EXPECT_STREQ(result, ""); @@ -1019,11 +1034,11 @@ TEST(CAT, MD_read_ReturnsLSBMode) { modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; // Not CW mode ED.activeVFO = VFO_A; ED.currentBand[VFO_A] = BAND_40M; - bands[BAND_40M].mode = LSB; - + ED.modulation[VFO_A] = LSB; // the modulation in use, not the band default + char command[] = "MD;"; char *result = MD_read(command); - + // Should return LSB mode (1) EXPECT_STREQ(result, "MD1;"); } @@ -1033,7 +1048,7 @@ TEST(CAT, MD_read_ReturnsUSBMode) { modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; // Not CW mode ED.activeVFO = VFO_B; ED.currentBand[VFO_B] = BAND_20M; - bands[BAND_20M].mode = USB; + ED.modulation[VFO_B] = USB; char command[] = "MD;"; char *result = MD_read(command); @@ -1047,13 +1062,14 @@ TEST(CAT, MD_read_ReturnsAMMode) { modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; // Not CW mode ED.activeVFO = VFO_A; ED.currentBand[VFO_A] = BAND_10M; - bands[BAND_10M].mode = AM; + ED.modulation[VFO_A] = AM; char command[] = "MD;"; char *result = MD_read(command); - - // Should return AM mode (5) - EXPECT_STREQ(result, "MD5;"); + + // AM and SAM are distinct demodulators, so they read back distinctly: + // MD4 for AM, MD5 for SAM. + EXPECT_STREQ(result, "MD4;"); } TEST(CAT, MD_read_ReturnsSAMMode) { @@ -1061,7 +1077,7 @@ TEST(CAT, MD_read_ReturnsSAMMode) { modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; // Not CW mode ED.activeVFO = VFO_A; ED.currentBand[VFO_A] = BAND_15M; - bands[BAND_15M].mode = SAM; + ED.modulation[VFO_A] = SAM; char command[] = "MD;"; char *result = MD_read(command); @@ -1075,7 +1091,7 @@ TEST(CAT, MD_read_ReturnsErrorForUnknownMode) { modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; // Not CW mode ED.activeVFO = VFO_A; ED.currentBand[VFO_A] = BAND_20M; - bands[BAND_20M].mode = (ModulationType)99; // Invalid mode + ED.modulation[VFO_A] = (ModulationType)99; // Invalid modulation char command[] = "MD;"; char *result = MD_read(command); @@ -1096,7 +1112,7 @@ TEST(CAT, command_parser_RecognizesMDCommands) { char *result = command_parser(md_write); // Verify mode was set - EXPECT_EQ(bands[ED.currentBand[VFO_A]].mode, USB); + EXPECT_EQ(ED.modulation[VFO_A], USB); EXPECT_STREQ(result, ""); // Test MD read command @@ -1140,7 +1156,7 @@ TEST(CAT, IF_read_ReturnsCorrectFormatInSSBReceive) { SampleRate = SAMPLE_RATE_48K; ED.centerFreq_Hz[VFO_A] = 14200000L + SR[SampleRate].rate/4; ED.fineTuneFreq_Hz[VFO_A] = 0; - bands[BAND_20M].mode = USB; + ED.modulation[VFO_A] = USB; char command[] = "IF;"; char *result = IF_read(command); @@ -1190,7 +1206,7 @@ TEST(CAT, IF_read_ReturnsCorrectFormatInSSBTransmit) { SampleRate = SAMPLE_RATE_48K; ED.centerFreq_Hz[VFO_A] = 21200000L + SR[SampleRate].rate/4; ED.fineTuneFreq_Hz[VFO_A] = 0; - bands[BAND_15M].mode = USB; + ED.modulation[VFO_A] = USB; char command[] = "IF;"; char *result = IF_read(command); @@ -1259,23 +1275,23 @@ TEST(CAT, IF_read_HandlesAllModeTypes) { ED.freqIncrement = 1000; // Test LSB mode - bands[BAND_20M].mode = LSB; + ED.modulation[VFO_A] = LSB; char command[] = "IF;"; char *result = IF_read(command); EXPECT_EQ(result[29], '1'); // LSB = mode 1 - // Test USB mode - bands[BAND_20M].mode = USB; + // Test USB mode + ED.modulation[VFO_A] = USB; result = IF_read(command); EXPECT_EQ(result[29], '2'); // USB = mode 2 // Test AM mode - bands[BAND_20M].mode = AM; + ED.modulation[VFO_A] = AM; result = IF_read(command); EXPECT_EQ(result[29], '5'); // AM = mode 5 // Test SAM mode (should return as AM) - bands[BAND_20M].mode = SAM; + ED.modulation[VFO_A] = SAM; result = IF_read(command); EXPECT_EQ(result[29], '5'); // SAM = mode 5 (reported as AM) } @@ -1287,7 +1303,7 @@ TEST(CAT, IF_read_HandlesFrequencyIncrement) { SampleRate = SAMPLE_RATE_48K; ED.centerFreq_Hz[VFO_A] = 7100000L + SR[SampleRate].rate/4; ED.fineTuneFreq_Hz[VFO_A] = 0; - bands[BAND_40M].mode = LSB; + ED.modulation[VFO_A] = LSB; // Test IF command char command[] = "IF;"; @@ -1328,7 +1344,7 @@ TEST(CAT, command_parser_RecognizesIFCommand) { SampleRate = SAMPLE_RATE_48K; ED.centerFreq_Hz[VFO_A] = 14200000L + SR[SampleRate].rate/4; ED.fineTuneFreq_Hz[VFO_A] = 0; - bands[BAND_20M].mode = USB; + ED.modulation[VFO_A] = USB; // Test IF read command through command parser char if_read[] = "IF;"; @@ -2343,4 +2359,901 @@ TEST(CAT, command_parser_RecognizesTXCommands){ char tx_cmd[] = "TX;"; char *result = command_parser(tx_cmd); EXPECT_STREQ(result, ""); -} \ No newline at end of file +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// PTT through command_parser(), with the optional TX parameter +// +// ts_480_pc.pdf p.21: the TX set form is "TX P1;" where P1 is 0 (normal/MIC), +// 1 (DTS via ANI input) or 2 (TX Tune), and "if no P1 parameter is specified, +// P1=0 is used". So TX;, TX0;, TX1; and TX2; are all valid ways to key. +// +// This matters in the field because Hamlib - which WSJT-X, fldigi and Pat all +// drive the radio through - picks its form from the PTT type: TX; for +// RIG_PTT_ON, TX0; for RIG_PTT_ON_MIC and TX1; for RIG_PTT_ON_DATA. +// +// These go through command_parser() deliberately. The TX_write tests above call +// the handler directly, so they passed even while the parser was rejecting +// TX0; and TX1; with "?;" - the handler ignores its argument, and the +// dispatcher was the part that was wrong. +/////////////////////////////////////////////////////////////////////////////////////////////////// + +TEST(CAT, command_parser_TXAcceptsOptionalParameterFromSSBReceive){ + UISm_start(&uiSM); + ModeSm_start(&modeSM); + + const char *forms[] = { "TX;", "TX0;", "TX1;", "TX2;" }; + + for (const char *form : forms) { + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + + char cmd[8]; + strcpy(cmd, form); + char *result = command_parser(cmd); + + // Accepted, and silent: TX_write returns empty_string_p + EXPECT_STREQ(result, "") << "form " << form << " was not accepted"; + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_TRANSMIT) + << "form " << form << " did not key the radio"; + } +} + +TEST(CAT, command_parser_TXAcceptsOptionalParameterFromCWReceive){ + UISm_start(&uiSM); + ModeSm_start(&modeSM); + + const char *forms[] = { "TX;", "TX0;", "TX1;", "TX2;" }; + + for (const char *form : forms) { + modeSM.state_id = ModeSm_StateId_CW_RECEIVE; + + char cmd[8]; + strcpy(cmd, form); + char *result = command_parser(cmd); + + EXPECT_STREQ(result, "") << "form " << form << " was not accepted"; + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_CW_TRANSMIT_MARK) + << "form " << form << " did not key the radio"; + } +} + +TEST(CAT, command_parser_RXAcceptsOptionalParameter){ + UISm_start(&uiSM); + ModeSm_start(&modeSM); + + // The TS-480 set form is a bare RX;, but TS-2000 style clients address the + // main/sub receiver as RX0;/RX1;. Accept all three; Phoenix has one receiver. + const char *forms[] = { "RX;", "RX0;", "RX1;" }; + + for (const char *form : forms) { + modeSM.state_id = ModeSm_StateId_SSB_TRANSMIT; + + char cmd[8]; + strcpy(cmd, form); + char *result = command_parser(cmd); + + EXPECT_STREQ(result, "") << "form " << form << " was not accepted"; + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE) + << "form " << form << " did not unkey the radio"; + } +} + +TEST(CAT, command_parser_RejectsMalformedPTTCommands){ + UISm_start(&uiSM); + ModeSm_start(&modeSM); + + // Two parameter characters is not a form the spec defines, and accepting the + // optional parameter must not turn the length check into "anything goes". + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + + char tx_too_long[] = "TX00;"; + EXPECT_STREQ(command_parser(tx_too_long), "?;"); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE); + + char rx_too_long[] = "RX00;"; + EXPECT_STREQ(command_parser(rx_too_long), "?;"); +} + +TEST(CAT, command_parser_ZeroLengthFieldCommandsStillDispatch){ + UISm_start(&uiSM); + ModeSm_start(&modeSM); + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + + // Read-only commands carry set_len 0, so the parser must not evaluate the + // write-length test for them - command[set_len - 1] would be command[-1]. + // Each must reach its read handler and answer something other than "?;". + const char *reads[] = { "ID;", "IF;", "PD;", "ED;", "PR;" }; + + for (const char *form : reads) { + char cmd[8]; + strcpy(cmd, form); + char *result = command_parser(cmd); + + EXPECT_STRNE(result, "?;") << "read command " << form << " was rejected"; + EXPECT_NE(result[0], '\0') << "read command " << form << " answered nothing"; + } + + // The mirror case: band up/down are writes with read_len 0. + char bd[] = "BD;"; + EXPECT_STRNE(command_parser(bd), "?;"); + char bu[] = "BU;"; + EXPECT_STRNE(command_parser(bu), "?;"); +} + +// ============================================================================ +// Commands added for the hardware-in-the-loop filter test suite +// +// These drive radio state that was previously reachable only from the +// touchscreen menus. Every one of them is exercised through command_parser() as +// well as directly, because the parser selects write-vs-read purely by where the +// semicolon falls: it tests the write length first, so a command whose set_len +// and read_len are equal can never reach its read function. +// ============================================================================ + +TEST(CAT, SR_write_SetsSampleRate) { + uint8_t saved = SampleRate; + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + + char cmd176[] = "SR0;"; + EXPECT_STREQ(SR_write(cmd176), ""); + EXPECT_EQ(SampleRate, SAMPLE_RATE_176K); + + char cmd192[] = "SR1;"; + EXPECT_STREQ(SR_write(cmd192), ""); + EXPECT_EQ(SampleRate, SAMPLE_RATE_192K); + + SampleRate = saved; +} + +TEST(CAT, SR_read_ReturnsSampleRateIndex) { + uint8_t saved = SampleRate; + + SampleRate = SAMPLE_RATE_176K; + char cmd[] = "SR;"; + EXPECT_STREQ(SR_read(cmd), "SR0;"); + + SampleRate = SAMPLE_RATE_192K; + EXPECT_STREQ(SR_read(cmd), "SR1;"); + + SampleRate = saved; +} + +TEST(CAT, SR_write_RejectsOutOfRange) { + uint8_t saved = SampleRate; + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + SampleRate = SAMPLE_RATE_192K; + + char cmd[] = "SR2;"; + EXPECT_STREQ(SR_write(cmd), "?;"); + EXPECT_EQ(SampleRate, SAMPLE_RATE_192K) << "a rejected rate must not change anything"; + + SampleRate = saved; +} + +TEST(CAT, SR_write_RefusedWhileTransmitting) { + uint8_t saved = SampleRate; + SampleRate = SAMPLE_RATE_192K; + modeSM.state_id = ModeSm_StateId_SSB_TRANSMIT; + + char cmd[] = "SR0;"; + EXPECT_STREQ(SR_write(cmd), "?;"); + EXPECT_EQ(SampleRate, SAMPLE_RATE_192K) + << "changing rate mid-transmission would reconfigure the I2S clock underneath the TX chain"; + + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + SampleRate = saved; +} + +TEST(CAT, SR_ParserReachesBothForms) { + uint8_t saved = SampleRate; + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + + char write_cmd[] = "SR0;"; + EXPECT_STREQ(command_parser(write_cmd), ""); + EXPECT_EQ(SampleRate, SAMPLE_RATE_176K); + + char read_cmd[] = "SR;"; + EXPECT_STREQ(command_parser(read_cmd), "SR0;"); + + SampleRate = saved; +} + +TEST(CAT, CF_write_SetsCWFilterIndex) { + int32_t saved = ED.CWFilterIndex; + + for (int i = 0; i <= 5; i++) { + char cmd[] = "CF0;"; + cmd[2] = '0' + i; + EXPECT_STREQ(CF_write(cmd), ""); + EXPECT_EQ(ED.CWFilterIndex, i); + } + + ED.CWFilterIndex = saved; +} + +TEST(CAT, CF_read_ReturnsCWFilterIndex) { + int32_t saved = ED.CWFilterIndex; + + ED.CWFilterIndex = 4; + char cmd[] = "CF;"; + EXPECT_STREQ(CF_read(cmd), "CF4;"); + + ED.CWFilterIndex = saved; +} + +TEST(CAT, CF_write_RejectsOutOfRange) { + int32_t saved = ED.CWFilterIndex; + ED.CWFilterIndex = 2; + + char cmd[] = "CF6;"; + EXPECT_STREQ(CF_write(cmd), "?;"); + EXPECT_EQ(ED.CWFilterIndex, 2); + + ED.CWFilterIndex = saved; +} + +TEST(CAT, CF_ParserReachesBothForms) { + int32_t saved = ED.CWFilterIndex; + + char write_cmd[] = "CF3;"; + EXPECT_STREQ(command_parser(write_cmd), ""); + EXPECT_EQ(ED.CWFilterIndex, 3); + + char read_cmd[] = "CF;"; + EXPECT_STREQ(command_parser(read_cmd), "CF3;"); + + ED.CWFilterIndex = saved; +} + +TEST(CAT, EQ_write_SetsEqualizerCell) { + int32_t saved = ED.equalizerRec[7]; + + char cmd[] = "EQ07050;"; + EXPECT_STREQ(EQ_write(cmd), ""); + EXPECT_EQ(ED.equalizerRec[7], 50); + + ED.equalizerRec[7] = saved; +} + +TEST(CAT, EQ_read_ReturnsEqualizerCell) { + int32_t saved = ED.equalizerRec[13]; + + ED.equalizerRec[13] = 100; + char cmd[] = "EQ13;"; + EXPECT_STREQ(EQ_read(cmd), "EQ13100;"); + + ED.equalizerRec[13] = 0; + EXPECT_STREQ(EQ_read(cmd), "EQ13000;"); + + ED.equalizerRec[13] = saved; +} + +TEST(CAT, EQ_write_RejectsOutOfRange) { + int32_t saved = ED.equalizerRec[0]; + ED.equalizerRec[0] = 100; + + char bad_cell[] = "EQ14050;"; + EXPECT_STREQ(EQ_write(bad_cell), "?;"); + + char bad_value[] = "EQ00101;"; + EXPECT_STREQ(EQ_write(bad_value), "?;"); + EXPECT_EQ(ED.equalizerRec[0], 100); + + char bad_read[] = "EQ14;"; + EXPECT_STREQ(EQ_read(bad_read), "?;"); + + ED.equalizerRec[0] = saved; +} + +TEST(CAT, EQ_ParserReachesBothForms) { + int32_t saved = ED.equalizerRec[2]; + + char write_cmd[] = "EQ02075;"; + EXPECT_STREQ(command_parser(write_cmd), ""); + EXPECT_EQ(ED.equalizerRec[2], 75); + + char read_cmd[] = "EQ02;"; + EXPECT_STREQ(command_parser(read_cmd), "EQ02075;"); + + ED.equalizerRec[2] = saved; +} + +TEST(CAT, FL_write_SetsLowCutOnUSB) { + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_20M; + bands[BAND_20M].mode = USB; + bands[BAND_20M].FLoCut_Hz = 200; + bands[BAND_20M].FHiCut_Hz = 3000; + + char cmd[] = "FL0400;"; + EXPECT_STREQ(FL_write(cmd), ""); + EXPECT_EQ(bands[BAND_20M].FLoCut_Hz, 400); + EXPECT_EQ(bands[BAND_20M].FHiCut_Hz, 3000) << "FL must not disturb the other edge"; + + bands[BAND_20M].FLoCut_Hz = 200; +} + +TEST(CAT, FL_write_RejectsCrossingTheHighCut) { + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_20M; + bands[BAND_20M].mode = USB; + bands[BAND_20M].FLoCut_Hz = 200; + bands[BAND_20M].FHiCut_Hz = 3000; + + char cmd[] = "FL3500;"; + FL_write(cmd); + EXPECT_EQ(bands[BAND_20M].FLoCut_Hz, 200) << "low cut must stay below the high cut"; +} + +TEST(CAT, FL_read_ReturnsLowCut) { + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_20M; + bands[BAND_20M].mode = USB; + bands[BAND_20M].FLoCut_Hz = 300; + + char cmd[] = "FL;"; + EXPECT_STREQ(FL_read(cmd), "FL0300;"); + + bands[BAND_20M].FLoCut_Hz = 200; +} + +TEST(CAT, FW_read_IsReachableThroughTheParser) { + // FW used to declare set_len == read_len, and because command_parser tests + // the write form first, "FW;" fell through to "?;" and the bandwidth could + // be set but never read back. + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_20M; + bands[BAND_20M].mode = USB; + bands[BAND_20M].FLoCut_Hz = 200; + bands[BAND_20M].FHiCut_Hz = 2800; + + char read_cmd[] = "FW;"; + EXPECT_STREQ(command_parser(read_cmd), "FW2800;"); + + char write_cmd[] = "FW2400;"; + EXPECT_STREQ(command_parser(write_cmd), ""); + EXPECT_EQ(bands[BAND_20M].FHiCut_Hz, 2400); + EXPECT_STREQ(command_parser(read_cmd), "FW2400;"); + + bands[BAND_20M].FHiCut_Hz = 3000; +} + +TEST(CAT, MD_write_SetsModulationAndLeavesTheBandDefault) { + // Demodulate() switches on ED.modulation, while InitFilterMask() compares it + // against bands[].mode and mirrors the passband when they disagree. So + // bands[].mode is the fixed reference, not a second copy of the current mode: + // writing it is what made MD select the band default instead of the requested + // sideband. This test previously asserted the opposite and passed, which is + // how the bug survived - it encoded the defect as the contract. + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_20M; + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + ModulationType bandDefault = bands[BAND_20M].mode; + + const ModulationType wanted[4] = { USB, LSB, AM, SAM }; + const char *cmds[4] = { "MD2;", "MD1;", "MD4;", "MD5;" }; + + for (int i = 0; i < 4; i++) { + char cmd[8]; + strcpy(cmd, cmds[i]); + MD_write(cmd); + EXPECT_EQ(ED.modulation[VFO_A], wanted[i]); + EXPECT_EQ(bands[BAND_20M].mode, bandDefault) + << "the band default must survive a modulation change"; + } +} + +TEST(CAT, MD_write_LeavesCWReceive) { + // TO_SSB_MODE used to be reachable only from the front-panel TOGGLE_MODE + // button, so CAT could enter CW receive and never get back out. + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_20M; + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + + char cw[] = "MD3;"; + MD_write(cw); + ASSERT_EQ(modeSM.state_id, ModeSm_StateId_CW_RECEIVE); + + char usb[] = "MD2;"; + MD_write(usb); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE) + << "MD1/MD2 must be able to bring the radio back out of CW receive"; + EXPECT_EQ(ED.modulation[VFO_A], USB); +} + +// ============================================================================ +// DG - digital (USB audio) mode +// +// These tests run in a build without AUDIO_INTERFACE, so DG_write always +// reports "?;": digital mode has no transport to offer. What they pin down is +// that the refusal is total - no state change, no sample-rate change - and that +// DG_read still answers honestly. The mode transitions themselves are covered +// by the ModeSm suite, which does not depend on the USB build configuration. +// ============================================================================ + +TEST(CAT, DG_read_ReportsDigitalModeOff) { + ModeSm_start(&modeSM); + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + + char cmd[] = "DG;"; + EXPECT_STREQ(DG_read(cmd), "DG0;"); + + modeSM.state_id = ModeSm_StateId_CW_RECEIVE; + EXPECT_STREQ(DG_read(cmd), "DG0;"); + + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; +} + +TEST(CAT, DG_read_ReportsDigitalModeOn) { + ModeSm_start(&modeSM); + char cmd[] = "DG;"; + + modeSM.state_id = ModeSm_StateId_DIGITAL_RECEIVE; + EXPECT_STREQ(DG_read(cmd), "DG1;"); + + modeSM.state_id = ModeSm_StateId_DIGITAL_TRANSMIT; + EXPECT_STREQ(DG_read(cmd), "DG1;") + << "digital mode is still on while transmitting"; + + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; +} + +TEST(CAT, DG_write_RejectsOutOfRange) { + ModeSm_start(&modeSM); + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + + char cmd[] = "DG2;"; + EXPECT_STREQ(DG_write(cmd), "?;"); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE) + << "a rejected parameter must not change the mode"; +} + +TEST(CAT, DG_ParserReachesBothForms) { + ModeSm_start(&modeSM); + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + + // The parser tests the write length first, so confirm a bare DG; still + // reaches the read handler rather than being taken as a malformed write. + char read_cmd[] = "DG;"; + EXPECT_STREQ(command_parser(read_cmd), "DG0;"); + + char write_cmd[] = "DG1;"; + char *out = command_parser(write_cmd); +#ifdef AUDIO_INTERFACE + EXPECT_STREQ(out, ""); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + char off[] = "DG0;"; + command_parser(off); +#else + EXPECT_STREQ(out, "?;") << "no USB audio interface compiled in"; + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE); +#endif +} + +// WSJT-X sends MD2; to force USB on startup and before every transmission. If +// that were treated as a request to leave digital mode, the mode would be +// impossible to hold. Only DG0; or the front panel MODE button may leave it. +TEST(CAT, MD_write_DoesNotLeaveDigitalMode) { + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_20M; + modeSM.state_id = ModeSm_StateId_DIGITAL_RECEIVE; + + char usb[] = "MD2;"; + MD_write(usb); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE) + << "a modulation change must not drop the radio out of digital mode"; + EXPECT_EQ(ED.modulation[VFO_A], USB) << "but it must still take effect"; + + char lsb[] = "MD1;"; + MD_write(lsb); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + EXPECT_EQ(ED.modulation[VFO_A], LSB); + + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; +} + +// MD3; is a genuine mode change and must be honoured from digital mode +TEST(CAT, MD_write_LeavesDigitalModeForCW) { + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_20M; + modeSM.state_id = ModeSm_StateId_DIGITAL_RECEIVE; + + char cw[] = "MD3;"; + MD_write(cw); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_CW_RECEIVE); + + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; +} + +TEST(CAT, MD_read_ReportsSidebandInDigitalMode) { + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_20M; + ED.modulation[VFO_A] = USB; + modeSM.state_id = ModeSm_StateId_DIGITAL_RECEIVE; + + char cmd[] = "MD;"; + EXPECT_STREQ(MD_read(cmd), "MD2;") + << "hamlib must see a sane sideband, not an unknown mode, in digital mode"; + + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; +} + +// This is how WSJT-X keys the rig +TEST(CAT, TX_and_RX_write_KeyDigitalTransmit) { + ModeSm_start(&modeSM); + bands[ED.currentBand[ED.activeVFO]].band_type = HAM_BAND; + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + ASSERT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + + char tx[] = "TX;"; + TX_write(tx); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_TRANSMIT); + + char rx[] = "RX;"; + RX_write(rx); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_SSB_MODE); +} + +TEST(CAT, SR_write_RefusedInDigitalMode) { + uint8_t saved = SampleRate; + ModeSm_start(&modeSM); + modeSM.state_id = ModeSm_StateId_DIGITAL_RECEIVE; + SampleRate = SAMPLE_RATE_176K; + + char cmd[] = "SR1;"; + EXPECT_STREQ(SR_write(cmd), "?;"); + EXPECT_EQ(SampleRate, SAMPLE_RATE_176K) + << "digital mode pins the rate so the USB endpoint needs no resampling"; + + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + SampleRate = saved; +} + +TEST(CAT, IF_read_ReportsReceiveInDigitalMode) { + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_20M; + bands[BAND_20M].mode = USB; + char cmd[] = "IF;"; + + // Nothing but the mode state differs between these two, and both are receive + // states reporting the same sideband, so the responses must match exactly. + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + std::string ssb = IF_read(cmd); + + modeSM.state_id = ModeSm_StateId_DIGITAL_RECEIVE; + std::string digital = IF_read(cmd); + + EXPECT_EQ(digital, ssb) + << "digital receive must report RX and the same sideband as SSB receive"; + + // ...and a transmit state must differ, or the comparison above proves nothing + modeSM.state_id = ModeSm_StateId_DIGITAL_TRANSMIT; + EXPECT_NE(std::string(IF_read(cmd)), ssb) << "digital transmit must report TX"; + + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; +} + +// ============================================================================ +// Sideband selection: MD must change the sideband that is actually received +// +// The receive passband is bands[].FLoCut_Hz/FHiCut_Hz, stored in the convention +// of the band's DEFAULT modulation (negative below the carrier for an LSB-default +// band). InitFilterMask() mirrors those cutoffs whenever the CURRENT modulation +// differs from that default - which is the only thing that produces the opposite +// sideband. +// +// SetModulation() used to write bands[].mode too. That made the default agree +// with the newly requested modulation, which switched the mirroring OFF and +// handed back the band-default passband. On 40 m, "MD2;" (select USB) therefore +// tuned the radio to LSB, with the display still reading USB because it reads +// ED.modulation[]. These tests pin the boundary. +// ============================================================================ + +/** Effective receive passband, computed the same way InitFilterMask() does. */ +static void EffectivePassband(int32_t *low_Hz, int32_t *high_Hz) { + int band = ED.currentBand[ED.activeVFO]; + if (ED.modulation[ED.activeVFO] == bands[band].mode) { + *low_Hz = bands[band].FLoCut_Hz; + *high_Hz = bands[band].FHiCut_Hz; + } else { + *low_Hz = -bands[band].FHiCut_Hz; + *high_Hz = -bands[band].FLoCut_Hz; + } +} + +TEST(CAT, MD_write_DoesNotDisturbTheBandDefault) { + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_40M; + ModulationType bandDefault = bands[BAND_40M].mode; + + char usb[] = "MD2;"; + MD_write(usb); + + EXPECT_EQ(bands[BAND_40M].mode, bandDefault) + << "bands[].mode is the band default and is the reference the passband " + "mirroring is measured against; writing it flips the sideband"; + EXPECT_EQ(ED.modulation[VFO_A], USB); +} + +// The bug, stated as behaviour: asking for USB on an LSB-default band must put +// the passband above the carrier. +TEST(CAT, MD_write_USBOnLSBBandGivesAnUpperSideband) { + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_40M; + ASSERT_EQ(bands[BAND_40M].mode, LSB) << "40 m is an LSB-default band"; + + char usb[] = "MD2;"; + MD_write(usb); + + int32_t low_Hz, high_Hz; + EffectivePassband(&low_Hz, &high_Hz); + EXPECT_GT(high_Hz, 0) << "USB passband must lie above the carrier"; + EXPECT_GE(low_Hz, 0); +} + +TEST(CAT, MD_write_LSBOnLSBBandGivesALowerSideband) { + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_40M; + + char lsb[] = "MD1;"; + MD_write(lsb); + + int32_t low_Hz, high_Hz; + EffectivePassband(&low_Hz, &high_Hz); + EXPECT_LT(low_Hz, 0) << "LSB passband must lie below the carrier"; + EXPECT_LE(high_Hz, 0); +} + +// ...and the same on a band whose default is the other way round, or the fix +// would just be moving the bug to the opposite set of bands. +TEST(CAT, MD_write_LSBOnUSBBandGivesALowerSideband) { + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_4M; + ASSERT_EQ(bands[BAND_4M].mode, USB) << "4 m is a USB-default band"; + + char lsb[] = "MD1;"; + MD_write(lsb); + + int32_t low_Hz, high_Hz; + EffectivePassband(&low_Hz, &high_Hz); + EXPECT_LT(low_Hz, 0) << "LSB passband must lie below the carrier"; + EXPECT_LE(high_Hz, 0); +} + +TEST(CAT, MD_write_SelectingBothSidebandsGivesDifferentPassbands) { + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_40M; + + char lsb[] = "MD1;"; + MD_write(lsb); + int32_t lsbLow, lsbHigh; + EffectivePassband(&lsbLow, &lsbHigh); + + char usb[] = "MD2;"; + MD_write(usb); + int32_t usbLow, usbHigh; + EffectivePassband(&usbLow, &usbHigh); + + // Before the fix both produced the band default, so this was the assertion + // that would have caught it. + EXPECT_NE(lsbLow, usbLow); + EXPECT_EQ(lsbLow, -usbHigh) << "the two sidebands are mirror images"; + EXPECT_EQ(lsbHigh, -usbLow); +} + +// MD_read reported bands[].mode, so it announced the band default rather than +// what the operator had actually selected - including via the front panel, which +// has always written ED.modulation[] alone. +TEST(CAT, MD_read_ReportsCurrentModulationNotBandDefault) { + ModeSm_start(&modeSM); + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_40M; + ASSERT_EQ(bands[BAND_40M].mode, LSB); + + // Exactly what the front-panel DEMODULATION button does + ED.modulation[VFO_A] = USB; + + char cmd[] = "MD;"; + EXPECT_STREQ(MD_read(cmd), "MD2;") + << "MD; must report the modulation in use, not the band default"; +} + +TEST(CAT, IF_read_ReportsCurrentModulationNotBandDefault) { + ModeSm_start(&modeSM); + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + ED.activeVFO = VFO_A; + ED.currentBand[VFO_A] = BAND_40M; + ASSERT_EQ(bands[BAND_40M].mode, LSB); + + char cmd[] = "IF;"; + + ED.modulation[VFO_A] = USB; + std::string usbReply = IF_read(cmd); + ED.modulation[VFO_A] = LSB; + std::string lsbReply = IF_read(cmd); + + EXPECT_NE(usbReply, lsbReply) + << "the IF mode digit must track the modulation in use"; +} + +// ============================================================================ +// DR - digital-mode receive level +// +// The audio the radio sends to the host is unregulated: with AGC off the AGC +// stage applies a fixed gain of 20, so a strong signal reaches full scale and +// clips. A 20 s bench capture sat at 98 % of full scale with only 0.15 dB of +// headroom. DR is the attenuation that buys that headroom back. +// ============================================================================ + +TEST(CAT, DR_write_SetsReceiveLevel) { + int32_t saved = ED.digitalRxLevel; + + char cmd[] = "DR040;"; + EXPECT_STREQ(DR_write(cmd), ""); + EXPECT_EQ(ED.digitalRxLevel, 40); + + char zero[] = "DR000;"; + EXPECT_STREQ(DR_write(zero), ""); + EXPECT_EQ(ED.digitalRxLevel, 0) << "0 is a legal level - it mutes the USB stream"; + + char full[] = "DR100;"; + EXPECT_STREQ(DR_write(full), ""); + EXPECT_EQ(ED.digitalRxLevel, 100); + + ED.digitalRxLevel = saved; +} + +TEST(CAT, DR_write_RejectsOutOfRange) { + int32_t saved = ED.digitalRxLevel; + ED.digitalRxLevel = 25; + + char cmd[] = "DR101;"; + EXPECT_STREQ(DR_write(cmd), "?;"); + EXPECT_EQ(ED.digitalRxLevel, 25) << "a rejected level must not change anything"; + + ED.digitalRxLevel = saved; +} + +TEST(CAT, DR_read_ReturnsLevelZeroPadded) { + int32_t saved = ED.digitalRxLevel; + char cmd[] = "DR;"; + + ED.digitalRxLevel = 25; + EXPECT_STREQ(DR_read(cmd), "DR025;"); + + ED.digitalRxLevel = 100; + EXPECT_STREQ(DR_read(cmd), "DR100;"); + + ED.digitalRxLevel = 0; + EXPECT_STREQ(DR_read(cmd), "DR000;"); + + ED.digitalRxLevel = saved; +} + +TEST(CAT, DR_ParserReachesBothForms) { + int32_t saved = ED.digitalRxLevel; + + char write_cmd[] = "DR030;"; + EXPECT_STREQ(command_parser(write_cmd), ""); + EXPECT_EQ(ED.digitalRxLevel, 30); + + char read_cmd[] = "DR;"; + EXPECT_STREQ(command_parser(read_cmd), "DR030;"); + + ED.digitalRxLevel = saved; +} + +// ============================================================================ +// Time-sync packets on the CAT port +// +// In a build with a USB audio interface there is one CDC port, CATSerial is +// Serial, and CheckForCATSerialEvents() drains it before CheckForSerialTimeSync() +// could run. The CAT reader therefore has to recognise the PJRC packet itself - +// 'T' + 10 digits + '\n', unchanged on the wire - and everything else that +// arrives newline-terminated has to be discarded rather than prepended to the +// next command. These tests drive CATSerial directly, so they exercise that path +// in either build. +// ============================================================================ + +// Helper: feed bytes to the CAT port and process them in one call. +static void runCATSerial(const char* bytes) { + Teensy3Clock.wasSet = false; + Teensy3Clock.lastSet = 0; + CATSerial.clearBuffer(); + CATSerial.feedData(bytes); + CheckForCATSerialEvents(); +} + +TEST(CAT, TimeSyncPacketOnCATPortSetsClock) { + runCATSerial("T1748476800\n"); + EXPECT_TRUE(Teensy3Clock.wasSet) + << "the CAT reader owns the port on a USB-audio build and must honour " + "the time packet itself"; + EXPECT_EQ(Teensy3Clock.lastSet, (time_t)1748476800); +} + +TEST(CAT, TimeSyncPacketOnCATPortAcceptsCarriageReturn) { + runCATSerial("T1748476800\r"); + EXPECT_TRUE(Teensy3Clock.wasSet); + EXPECT_EQ(Teensy3Clock.lastSet, (time_t)1748476800); +} + +TEST(CAT, TimeSyncPacketDoesNotCorruptTheNextCATCommand) { + // The bug this fixes: the packet's bytes stayed in catCommand, so the next + // command parsed as "T1748476800\nFA00014200000;" and came back "?;". + int64_t savedFreq = ED.centerFreq_Hz[VFO_A]; + int32_t savedBand = ED.currentBand[VFO_A]; + + runCATSerial("T1748476800\nFA00014200000;"); + ConsumeInterrupt(); + EXPECT_TRUE(Teensy3Clock.wasSet); + EXPECT_EQ(ED.centerFreq_Hz[VFO_A], 14200000L + SR[SampleRate].rate/4) + << "a command arriving straight after a time packet must still execute"; + + ED.centerFreq_Hz[VFO_A] = savedFreq; + ED.currentBand[VFO_A] = savedBand; +} + +TEST(CAT, TimeSyncPacketRejectsMalformedTimestamps) { + runCATSerial("T12345\n"); // too few digits + EXPECT_FALSE(Teensy3Clock.wasSet); + + runCATSerial("T17484768000\n"); // too many digits + EXPECT_FALSE(Teensy3Clock.wasSet); + + runCATSerial("T0000000001\n"); // parses, but fails the ~2001 sanity check + EXPECT_FALSE(Teensy3Clock.wasSet); + + runCATSerial("Tabcdefghij\n"); // right length, not digits + EXPECT_FALSE(Teensy3Clock.wasSet); + + runCATSerial("T -174847680\n"); // atoll() would stop at the space + EXPECT_FALSE(Teensy3Clock.wasSet); + + runCATSerial("1748476800\n"); // no 'T' header + EXPECT_FALSE(Teensy3Clock.wasSet); +} + +TEST(CAT, TCommandsAreStillCATCommands) { + // "TX;" and "TX0;" start with 'T' too. They are semicolon-terminated, so the + // newline branch must never see them. + ModeSm_start(&modeSM); + modeSM.state_id = ModeSm_StateId_SSB_RECEIVE; + + runCATSerial("TX;"); + ConsumeInterrupt(); + EXPECT_FALSE(Teensy3Clock.wasSet) + << "TX; must not be mistaken for a time packet"; + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_TRANSMIT); + + runCATSerial("RX;"); + ConsumeInterrupt(); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE); +} + +TEST(CAT, StrayNewlineTerminatedBytesAreDiscarded) { + // A client that ends its commands with CRLF used to leave the line ending in + // catCommand, which then prefixed - and broke - the following command. + int64_t savedFreq = ED.centerFreq_Hz[VFO_A]; + int32_t savedBand = ED.currentBand[VFO_A]; + + runCATSerial("FA00014200000;\r\nFA00007100000;"); + ConsumeInterrupt(); + EXPECT_EQ(ED.centerFreq_Hz[VFO_A], 7100000L + SR[SampleRate].rate/4) + << "a CRLF between commands must not break the command after it"; + + ED.centerFreq_Hz[VFO_A] = savedFreq; + ED.currentBand[VFO_A] = savedBand; +} diff --git a/code/test/CMakeLists.txt b/code/test/CMakeLists.txt index afb3cf9..1785c59 100644 --- a/code/test/CMakeLists.txt +++ b/code/test/CMakeLists.txt @@ -40,74 +40,80 @@ include_directories(../test) add_executable(all_RFboard_tests RFBoard_test.cpp ../src/PhoenixSketch/RFBoard.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp Adafruit_I2CDevice_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp ) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp Adafruit_I2CDevice_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp ) target_link_libraries(all_RFboard_tests GTest::gtest_main) add_executable(all_ModeSm_tests ModeSm_test.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/Globals.cpp ../src/PhoenixSketch/DSP_FIR.cpp arm_functions.c ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_ModeSm_tests GTest::gtest_main) add_executable(all_UISm_tests UISm_test.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/RFBoard.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp ../src/PhoenixSketch/Storage.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_UISm_tests GTest::gtest_main) add_executable(all_Loop_tests Loop_test.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_Loop_tests GTest::gtest_main) add_executable(all_SigProc_tests SignalProcessing_test.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_SigProc_tests GTest::gtest_main) +add_executable(all_FilterDesign_tests FilterDesign_test.cpp reference_filters.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp + ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp + ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) +target_link_libraries(all_FilterDesign_tests GTest::gtest_main) + add_executable(all_NoiseReduction_tests NoiseReduction_test.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_NoiseReduction_tests GTest::gtest_main) add_executable(all_TransmitChain_tests TransmitChain_test.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_TransmitChain_tests GTest::gtest_main) add_executable(all_FrontPanel_tests FrontPanel_test.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_FrontPanel_tests GTest::gtest_main) add_executable(all_CAT_tests CAT_test.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_CAT_tests GTest::gtest_main) add_executable(all_LPFBoard_tests LPFBoard_test.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/BPFBoard.cpp RA8875_mock.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp ../src/PhoenixSketch/Storage.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_LPFBoard_tests GTest::gtest_main) add_executable(all_BPFBoard_tests BPFBoard_test.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_BPFBoard_tests GTest::gtest_main) add_executable(all_RFhardwareSM_tests RFHardwareSM_test.cpp ../src/PhoenixSketch/RFBoard.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_RFhardwareSM_tests GTest::gtest_main) add_executable(all_Micros_tests micros_test.cpp Arduino_mock.cpp) @@ -116,25 +122,25 @@ target_link_libraries(all_Micros_tests GTest::gtest_main) add_executable(all_Radio_tests Radio_test.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_Radio_tests GTest::gtest_main) add_executable(all_Display_tests Display_test.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_Display_tests GTest::gtest_main) add_executable(all_Calibration_tests Calibration_test.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_Calibration_tests GTest::gtest_main) add_executable(all_PowerCalibration_tests PowerCalibration_test.cpp ../src/PhoenixSketch/MainBoard_Display.cpp ../src/PhoenixSketch/MainBoard_DisplayHome.cpp ../src/PhoenixSketch/MainBoard_DisplayMenus.cpp ../src/PhoenixSketch/MainBoard_DisplayDFE.cpp ../src/PhoenixSketch/MainBoard_DisplayEqualizer.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Frequency.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_RXIQ.cpp ../src/PhoenixSketch/ReceiveIQCalSm.cpp ../src/PhoenixSketch/TransmitIQCalSm.cpp ../src/PhoenixSketch/TransmitCarrierCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_Power.cpp ../src/PhoenixSketch/PowerCalSm.cpp ../src/PhoenixSketch/MainBoard_DisplayCalibration_TXIQ.cpp ../src/PhoenixSketch/Loop.cpp ../src/PhoenixSketch/Tune.cpp ../src/PhoenixSketch/Mode.cpp ../src/PhoenixSketch/ModeSm.cpp ../src/PhoenixSketch/HardwareSm.cpp ../src/PhoenixSketch/HardwareSm_PowerCalibration.cpp ../src/PhoenixSketch/HardwareSm_ReceiveIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitIQCalibration.cpp ../src/PhoenixSketch/HardwareSm_TransmitCarrierCalibration.cpp ../src/PhoenixSketch/UISm.cpp ../src/PhoenixSketch/RFBoard.cpp ../src/PhoenixSketch/DSP.cpp ../src/PhoenixSketch/CAT.cpp ../src/PhoenixSketch/BPFBoard.cpp ../src/PhoenixSketch/Storage.cpp ../src/PhoenixSketch/DSP_FFT.cpp DSP_FFT_stub_test.cpp ../src/PhoenixSketch/Globals.cpp arm_functions.c ../src/PhoenixSketch/DSP_FIR.cpp ../src/PhoenixSketch/DSP_Noise.cpp ../src/PhoenixSketch/DSP_CWProcessing.cpp - ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) + ../src/PhoenixSketch/MainBoard_AudioIO.cpp ../src/PhoenixSketch/LPFBoard.cpp ../src/PhoenixSketch/LPFBoard_AD7991.cpp ../src/PhoenixSketch/FrontPanel.cpp ../src/PhoenixSketch/FrontPanel_Rotary.cpp ../src/PhoenixSketch/ParamSave.cpp si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp RA8875_mock.cpp LittleFS_mock.cpp ArduinoJson.cpp) target_link_libraries(all_PowerCalibration_tests GTest::gtest_main) add_executable(all_ParamSave_tests ParamSave_test.cpp ../src/PhoenixSketch/ParamSave.cpp) @@ -147,6 +153,7 @@ gtest_discover_tests(all_ModeSm_tests) gtest_discover_tests(all_UISm_tests) gtest_discover_tests(all_Loop_tests) gtest_discover_tests(all_SigProc_tests) +gtest_discover_tests(all_FilterDesign_tests) gtest_discover_tests(all_NoiseReduction_tests) gtest_discover_tests(all_TransmitChain_tests) gtest_discover_tests(all_FrontPanel_tests) @@ -205,7 +212,7 @@ if(USE_SDL_DISPLAY) si5351_mock.cpp Arduino_mock.cpp Adafruit_I2CDevice_mock.cpp - OpenAudio_ArduinoLibrary_mock.cpp + OpenAudio_ArduinoLibrary_mock.cpp ../src/PhoenixSketch/USBAudio.cpp LittleFS_mock.cpp ArduinoJson.cpp RA8875_SDL.cpp diff --git a/code/test/Calibration_test.cpp b/code/test/Calibration_test.cpp index 1f6c1be..5df4924 100644 --- a/code/test/Calibration_test.cpp +++ b/code/test/Calibration_test.cpp @@ -86,7 +86,7 @@ void SelectCalibrationMenu(void){ // Verify that we're on the calibration secondary menu EXPECT_EQ(uiSM.state_id, UISm_StateId_SECONDARY_MENU); - extern struct PrimaryMenuOption primaryMenu[8]; + extern struct PrimaryMenuOption primaryMenu[9]; extern size_t primaryMenuIndex; EXPECT_STREQ(primaryMenu[primaryMenuIndex].label, "Calibration"); } diff --git a/code/test/Display_test.cpp b/code/test/Display_test.cpp index 4843bea..f4a0248 100644 --- a/code/test/Display_test.cpp +++ b/code/test/Display_test.cpp @@ -9,6 +9,7 @@ #include #include "SDT.h" +#include "RA8875.h" // for the mock display's print log #include #include @@ -130,6 +131,83 @@ TEST_F(DisplayTest, MenuRedrawn) { } +/** + * The VFO panes are the only part of the home screen drawn in a GFX font + * (FreeSansBold). The font source is sticky in the RA8875 library - setFontScale() + * does not clear it, only setFontDefault() does - so if the VFO panes leave their + * font installed, every pane drawn afterwards that only sets a font scale renders + * its text in FreeSansBold and overflows its box. That was visible as the + * "Decoder:" line, and the decoded CW text, growing huge while the fine tune knob + * was turned in CW mode: the fine tune redraws the VFO panes, but the spectrum pane + * (which would otherwise have restored the default font) skips its redraw while the + * knob is spinning. + * + * Check the invariant directly: no text outside the two VFO panes is ever drawn in + * a GFX font. + */ +TEST_F(DisplayTest, HomeScreenFontIsNotLeakedOutOfTheVFOPanes) { + // The VFO panes occupy the top left of the screen: {5,5,280,50} and {300,5,220,40} + const uint16_t VFO_PANE_MAX_X = 525; + const uint16_t VFO_PANE_MAX_Y = 55; + + Q_in_L.setChannel(0); + Q_in_R.setChannel(1); + Q_in_L.clear(); + Q_in_R.clear(); + StartMillis(); + + InitializeStorage(); + InitializeFrontPanel(); + InitializeSignalProcessing(); + InitializeAudio(); + InitializeDisplay(); + InitializeRFHardware(); + + modeSM.vars.waitDuration_ms = CW_TRANSMIT_SPACE_TIMEOUT_MS; + modeSM.vars.ditDuration_ms = DIT_DURATION_MS; + ModeSm_start(&modeSM); + ED.agc = AGCOff; + ED.nrOptionSelect = NROff; + uiSM.vars.splashDuration_ms = 1; + UISm_start(&uiSM); + UpdateAudioIOState(); + start_timer1ms(); + + loop(); MyDelay(10); + ASSERT_EQ(uiSM.state_id, UISm_StateId_HOME); + + // Select CW mode + SetButton(TOGGLE_MODE); + SetInterrupt(iBUTTON_PRESSED); + loop(); MyDelay(10); + ASSERT_EQ(modeSM.state_id, ModeSm_StateId_CW_RECEIVE); + + RA8875ClearPrintLog(); + + // Turn the decoder on and off again, spinning the fine tune knob throughout. The + // spins are close enough together to latch the rapid-tuning state, which is what + // makes the spectrum pane skip the redraw that would have reset the font. + for (int i = 0; i < 6; i++) { + SetInterrupt(iFINETUNE_INCREASE); + loop(); MyDelay(2); + SetInterrupt(iFINETUNE_INCREASE); + loop(); MyDelay(2); + SetButton(DECODER_TOGGLE); + SetInterrupt(iBUTTON_PRESSED); + loop(); MyDelay(2); + } + + unsigned nprints = RA8875PrintLogSize(); + EXPECT_GT(nprints, 0u) << "no text was drawn - the test did not exercise the home screen"; + for (unsigned i = 0; i < nprints; i++) { + RA8875PrintRecord r = RA8875PrintLogEntry(i); + if (!r.customFont) continue; + EXPECT_TRUE((r.x <= VFO_PANE_MAX_X) && (r.y <= VFO_PANE_MAX_Y)) + << "text at (" << r.x << "," << r.y << ") was drawn in a GFX font left " + << "installed by the VFO panes"; + } +} + /** * Test IncrementVariable() with TYPE_I8 * Verifies that 8-bit integer variables are incremented correctly @@ -1421,13 +1499,14 @@ TEST_F(DisplayTest, CWOptionsMenu_SidetoneVolume_Configuration) { EXPECT_EQ(CWOptions[5].action, variableOption); EXPECT_EQ(CWOptions[5].varPam, &stv); EXPECT_EQ(CWOptions[5].func, nullptr); - EXPECT_EQ(CWOptions[5].postUpdateFunc, nullptr); + // Changing the volume has to re-apply the gain to the sidetone oscillator + EXPECT_EQ(CWOptions[5].postUpdateFunc, (void *)UpdateSidetoneOscillator); // Verify variable parameter configuration EXPECT_EQ(stv.type, TYPE_F32); EXPECT_FLOAT_EQ(stv.limits.f32.min, 0.0f); - EXPECT_FLOAT_EQ(stv.limits.f32.max, 100.0f); - EXPECT_FLOAT_EQ(stv.limits.f32.step, 0.5f); + EXPECT_FLOAT_EQ(stv.limits.f32.max, 500.0f); + EXPECT_FLOAT_EQ(stv.limits.f32.step, 1.0f); } /** @@ -1444,21 +1523,21 @@ TEST_F(DisplayTest, CWOptionsMenu_SidetoneVolume_IncrementDecrement) { // Increment volume IncrementVariable(&stv); - EXPECT_FLOAT_EQ(ED.sidetoneVolume, 50.5f); + EXPECT_FLOAT_EQ(ED.sidetoneVolume, 51.0f); // Decrement volume DecrementVariable(&stv); EXPECT_FLOAT_EQ(ED.sidetoneVolume, 50.0f); // Test max boundary - ED.sidetoneVolume = 99.8f; + ED.sidetoneVolume = 499.0f; IncrementVariable(&stv); - EXPECT_FLOAT_EQ(ED.sidetoneVolume, 100.0f); + EXPECT_FLOAT_EQ(ED.sidetoneVolume, 500.0f); IncrementVariable(&stv); - EXPECT_FLOAT_EQ(ED.sidetoneVolume, 100.0f); + EXPECT_FLOAT_EQ(ED.sidetoneVolume, 500.0f); // Test min boundary - ED.sidetoneVolume = 0.3f; + ED.sidetoneVolume = 1.0f; DecrementVariable(&stv); EXPECT_FLOAT_EQ(ED.sidetoneVolume, 0.0f); DecrementVariable(&stv); diff --git a/code/test/FilterDesign_test.cpp b/code/test/FilterDesign_test.cpp new file mode 100644 index 0000000..7f5dcf7 --- /dev/null +++ b/code/test/FilterDesign_test.cpp @@ -0,0 +1,683 @@ +/** + * Tests for the run-time generated filter tables. + * + * Several stages of the DSP chain used to ship coefficient tables designed + * offline for a single audio sample rate of 24 ksps. They are now generated + * from an analog design spec on every sample rate change, so that a filter + * labelled 2.0 kHz cuts at 2.0 kHz whether the radio is running at 192 ksps or + * 176.4 ksps. + * + * These tests answer two questions: + * + * 1. Do the generated filters still do what the frozen tables did? Every + * response here is measured against the original coefficients, kept in + * reference_filters.cpp, at the rate they were designed for. + * + * 2. Do they now hold their frequencies when the sample rate changes? The + * same corners and peaks are measured at both rates and the ratio checked + * against 1.0. Before this work those ratios read 176400/192000 = 0.919. + * + * Sweeps are written to filtercmp_*.txt for compare_176k_vs_192k.ipynb. + */ + +#include "gtest/gtest.h" + +#include "../src/PhoenixSketch/SDT.h" +#include "reference_filters.h" + +// --------------------------------------------------------------------------- +// Measurement +// --------------------------------------------------------------------------- + +/** Samples used to measure a settled response. Long enough that the DFT bin is + * narrow (5.9 Hz at 24 ksps) and short enough to stay fast. */ +#define MEASURE_SAMPLES 4096 + +/** Blocks pushed through a filter before measuring, to let the state settle. */ +#define WARMUP_BLOCKS 4 + +/** + * Amplitude of a single frequency component of a real signal. + * + * Correlates the signal against a complex exponential at tone_Hz through a Hann + * window. Peak picking, which the older sweep tests use, misses the true peak + * of a sampled sine by up to a decibel when there are only a handful of samples + * per cycle; this is exact to well under 0.01 dB, which is what comparing two + * filter designs against each other needs. + * + * @param signal Samples to analyse + * @param nSamples Length of signal + * @param tone_Hz Frequency to measure + * @param fs_Hz Sample rate + * @return Amplitude of that component + */ +static float32_t ToneAmplitude(const float32_t *signal, uint32_t nSamples, + float32_t tone_Hz, float32_t fs_Hz) { + double sumI = 0.0, sumQ = 0.0, windowSum = 0.0; + const double w = 2.0 * M_PI * (double)tone_Hz / (double)fs_Hz; + for (uint32_t n = 0; n < nSamples; n++) { + const double hann = 0.5 * (1.0 - cos(2.0 * M_PI * (double)n / (double)(nSamples - 1))); + windowSum += hann; + sumI += hann * (double)signal[n] * cos(w * (double)n); + sumQ += hann * (double)signal[n] * sin(w * (double)n); + } + if (windowSum == 0.0) return 0.0; + // The factor of two recovers the amplitude split between the positive and + // negative frequency halves of a real signal. + return (float32_t)(2.0 * sqrt(sumI * sumI + sumQ * sumQ) / windowSum); +} + +/** Fill a buffer with a unit-amplitude cosine, continuing from sample offset. */ +static void FillTone(float32_t *buffer, uint32_t nSamples, float32_t tone_Hz, + float32_t fs_Hz, uint32_t offset) { + const double w = 2.0 * M_PI * (double)tone_Hz / (double)fs_Hz; + for (uint32_t n = 0; n < nSamples; n++) { + buffer[n] = (float32_t)cos(w * (double)(n + offset)); + } +} + +/** + * Gain of a biquad cascade at one frequency, measured through the ARM filter. + * + * Runs the same arm_biquad_cascade_df2T_f32 the radio uses, so the result + * includes whatever the float32 arithmetic does, not just the ideal response. + * + * @param coeffs Cascade coefficients, nSections sets of 5 + * @param nSections Number of biquad sections + * @param tone_Hz Frequency to measure at + * @param fs_Hz Sample rate + * @return Linear gain + */ +static float32_t BiquadCascadeGain(const float32_t *coeffs, uint32_t nSections, + float32_t tone_Hz, float32_t fs_Hz) { + std::vector state(nSections * 2, 0.0f); + std::vector in(MEASURE_SAMPLES), out(MEASURE_SAMPLES); + + arm_biquad_cascade_df2T_instance_f32 filter; + filter.numStages = nSections; + filter.pState = state.data(); + filter.pCoeffs = (float32_t *)coeffs; + + uint32_t offset = 0; + for (int block = 0; block < WARMUP_BLOCKS; block++) { + FillTone(in.data(), MEASURE_SAMPLES, tone_Hz, fs_Hz, offset); + arm_biquad_cascade_df2T_f32(&filter, in.data(), out.data(), MEASURE_SAMPLES); + offset += MEASURE_SAMPLES; + } + return ToneAmplitude(out.data(), MEASURE_SAMPLES, tone_Hz, fs_Hz); +} + +/** + * Gain of an FIR filter at one frequency, measured through the ARM filter. + * + * @param taps Filter coefficients + * @param nTaps Number of taps + * @param tone_Hz Frequency to measure at + * @param fs_Hz Sample rate + * @return Linear gain + */ +static float32_t FIRGain(const float32_t *taps, uint32_t nTaps, + float32_t tone_Hz, float32_t fs_Hz) { + std::vector state(nTaps + MEASURE_SAMPLES - 1, 0.0f); + std::vector in(MEASURE_SAMPLES), out(MEASURE_SAMPLES); + + arm_fir_instance_f32 filter; + arm_fir_init_f32(&filter, nTaps, (float32_t *)taps, state.data(), MEASURE_SAMPLES); + + uint32_t offset = 0; + for (int block = 0; block < 2; block++) { + FillTone(in.data(), MEASURE_SAMPLES, tone_Hz, fs_Hz, offset); + arm_fir_f32(&filter, in.data(), out.data(), MEASURE_SAMPLES); + offset += MEASURE_SAMPLES; + } + return ToneAmplitude(out.data(), MEASURE_SAMPLES, tone_Hz, fs_Hz); +} + +static float32_t ToDB(float32_t gain) { + return 20.0f * log10f(gain + 1e-30f); +} + +/** Write a frequency sweep as index,frequency,gain - the format the notebooks read. */ +static void WriteSweep(const char *filename, const float32_t *freq, + const float32_t *gain, uint32_t nPoints) { + FILE *file = fopen(filename, "w"); + if (file == NULL) return; + for (uint32_t i = 0; i < nPoints; i++) { + fprintf(file, "%u,%7.6f,%7.6f\n", i, freq[i], gain[i]); + } + fclose(file); +} + +// --------------------------------------------------------------------------- +// Response feature finders +// --------------------------------------------------------------------------- + +/** Frequency at which a response first falls level_dB below its value at fLow. */ +static float32_t LowpassCorner(const float32_t *coeffs, uint32_t nSections, + float32_t fLow, float32_t fHigh, float32_t fStep, + float32_t level_dB, float32_t fs_Hz, bool isFIR, + uint32_t nTaps) { + const float32_t reference = isFIR ? FIRGain(coeffs, nTaps, fLow, fs_Hz) + : BiquadCascadeGain(coeffs, nSections, fLow, fs_Hz); + const float32_t target = reference * powf(10.0f, level_dB / 20.0f); + float32_t prevF = fLow, prevG = reference; + for (float32_t f = fLow + fStep; f <= fHigh; f += fStep) { + const float32_t g = isFIR ? FIRGain(coeffs, nTaps, f, fs_Hz) + : BiquadCascadeGain(coeffs, nSections, f, fs_Hz); + if (g <= target) { + // Linear interpolation between the bracketing points. + return prevF + (target - prevG) * (f - prevF) / (g - prevG); + } + prevF = f; + prevG = g; + } + return -1.0f; +} + +/** Frequency of maximum response over a range. */ +static float32_t BandpassPeak(const float32_t *coeffs, uint32_t nSections, + float32_t fLow, float32_t fHigh, float32_t fStep, + float32_t fs_Hz) { + float32_t bestF = fLow, bestG = -1.0f; + for (float32_t f = fLow; f <= fHigh; f += fStep) { + const float32_t g = BiquadCascadeGain(coeffs, nSections, f, fs_Hz); + if (g > bestG) { + bestG = g; + bestF = f; + } + } + return bestF; +} + +// --------------------------------------------------------------------------- +// Fixtures for switching sample rate +// --------------------------------------------------------------------------- + +/** Audio sample rate the frozen reference tables were designed for. */ +#define REFERENCE_AUDIO_FS_HZ 24000.0f + +static float32_t AudioRateHz() { + return (float32_t)SR[SampleRate].rate / (float32_t)RXfilters.DF; +} + +/** + * Rebuild every filter table for a given sample rate. + * + * SampleRate is a reference into the persisted config, and gtest shares process + * state between tests, so anything that changes it has to put it back. + */ +static void RebuildFiltersAtRate(uint8_t rate) { + SampleRate = rate; + InitializeFilters(SPECTRUM_ZOOM_1, &RXfilters); + InitializeTransmitFilters(&TXfilters); +} + +/** Nominal cutoffs of the five CW audio filters, in Hz. */ +static const float32_t CW_FILTER_FC_HZ[5] = {840.0f, 1080.0f, 1320.0f, 1800.0f, 2000.0f}; + +/** Centre frequencies of the 14 equaliser cells, in Hz. */ +static const float32_t EQ_FC_HZ[EQUALIZER_CELL_COUNT] = { + 198.425f, 250.0f, 314.98f, 400.0f, 500.0f, 630.0f, 793.0f, + 1000.0f, 1259.0f, 1587.0f, 2000.0f, 2500.0f, 3150.0f, 4000.0f +}; + +/** The generated CW audio coefficient tables, in the same order as above. */ +static const float32_t *GeneratedCWFilter(int index) { + switch (index) { + case 0: return CW_AudioFilterCoeffs1; + case 1: return CW_AudioFilterCoeffs2; + case 2: return CW_AudioFilterCoeffs3; + case 3: return CW_AudioFilterCoeffs4; + default: return CW_AudioFilterCoeffs5; + } +} + +/** The reference CW audio coefficient tables. */ +static const float32_t *ReferenceCWFilter(int index) { + switch (index) { + case 0: return CW_AudioFilterCoeffs1_ref; + case 1: return CW_AudioFilterCoeffs2_ref; + case 2: return CW_AudioFilterCoeffs3_ref; + case 3: return CW_AudioFilterCoeffs4_ref; + default: return CW_AudioFilterCoeffs5_ref; + } +} + +/** The reference equaliser coefficient tables. */ +static const float32_t *ReferenceEQBand(int index) { + static const float32_t *bands[EQUALIZER_CELL_COUNT] = { + EQ_Band1Coeffs_ref, EQ_Band2Coeffs_ref, EQ_Band3Coeffs_ref, EQ_Band4Coeffs_ref, + EQ_Band5Coeffs_ref, EQ_Band6Coeffs_ref, EQ_Band7Coeffs_ref, EQ_Band8Coeffs_ref, + EQ_Band9Coeffs_ref, EQ_Band10Coeffs_ref, EQ_Band11Coeffs_ref, EQ_Band12Coeffs_ref, + EQ_Band13Coeffs_ref, EQ_Band14Coeffs_ref + }; + return bands[index]; +} + +// =========================================================================== +// 1. Do the generated filters match the tables they replace? +// =========================================================================== + +TEST(FilterDesign, CWAudioFiltersMatchReference) { + RebuildFiltersAtRate(SAMPLE_RATE_192K); + ASSERT_FLOAT_EQ(AudioRateHz(), REFERENCE_AUDIO_FS_HZ) + << "the reference tables were designed at this rate"; + + const uint32_t nPoints = 121; + float32_t freq[nPoints], genDB[nPoints], refDB[nPoints]; + char filename[64]; + + for (int band = 0; band < 5; band++) { + const float32_t fMin = 100.0f; + const float32_t fMax = CW_FILTER_FC_HZ[band] * 2.5f; + const float32_t fStep = (fMax - fMin) / (float32_t)(nPoints - 1); + float32_t worstError = 0.0f; + + for (uint32_t i = 0; i < nPoints; i++) { + freq[i] = fMin + (float32_t)i * fStep; + genDB[i] = ToDB(BiquadCascadeGain(GeneratedCWFilter(band), 6, freq[i], + REFERENCE_AUDIO_FS_HZ)); + refDB[i] = ToDB(BiquadCascadeGain(ReferenceCWFilter(band), 6, freq[i], + REFERENCE_AUDIO_FS_HZ)); + // Below the noise floor of the cascade the two designs are both + // just rounding error, so only compare where there is signal. + if (refDB[i] > -90.0f) { + worstError = fmaxf(worstError, fabsf(genDB[i] - refDB[i])); + } + } + + sprintf(filename, "filtercmp_cw_band_%d_gen.txt", band); + WriteSweep(filename, freq, genDB, nPoints); + sprintf(filename, "filtercmp_cw_band_%d_ref.txt", band); + WriteSweep(filename, freq, refDB, nPoints); + + EXPECT_LT(worstError, 0.05f) + << "CW audio filter " << band << " (" << CW_FILTER_FC_HZ[band] + << " Hz) departs from the reference Chebyshev by " << worstError << " dB"; + } +} + +TEST(FilterDesign, EqualiserCellsMatchReference) { + RebuildFiltersAtRate(SAMPLE_RATE_192K); + ASSERT_FLOAT_EQ(AudioRateHz(), REFERENCE_AUDIO_FS_HZ); + + const uint32_t nPoints = 121; + float32_t freq[nPoints], genDB[nPoints], refDB[nPoints]; + char filename[64]; + + for (int band = 0; band < EQUALIZER_CELL_COUNT; band++) { + const float32_t fMin = EQ_FC_HZ[band] * 0.3f; + // Stop short of Nyquist. These cells have a zero there, and comparing + // two designs inside a null measures rounding error, not the response. + const float32_t fMax = fminf(EQ_FC_HZ[band] * 3.0f, REFERENCE_AUDIO_FS_HZ * 0.45f); + const float32_t fStep = (fMax - fMin) / (float32_t)(nPoints - 1); + float32_t worstError = 0.0f; + + for (uint32_t i = 0; i < nPoints; i++) { + freq[i] = fMin + (float32_t)i * fStep; + genDB[i] = ToDB(BiquadCascadeGain(*EQ_Coeffs[band], 4, freq[i], + REFERENCE_AUDIO_FS_HZ)); + refDB[i] = ToDB(BiquadCascadeGain(ReferenceEQBand(band), 4, freq[i], + REFERENCE_AUDIO_FS_HZ)); + // Deep in the stopband both designs are down in the float32 noise. + if (refDB[i] > -90.0f) { + worstError = fmaxf(worstError, fabsf(genDB[i] - refDB[i])); + } + } + + sprintf(filename, "filtercmp_eq_band_%d_gen.txt", band); + WriteSweep(filename, freq, genDB, nPoints); + sprintf(filename, "filtercmp_eq_band_%d_ref.txt", band); + WriteSweep(filename, freq, refDB, nPoints); + + // The prototype is recovered from these very tables by an exact inverse + // bilinear transform, so anything above rounding error is a real defect. + EXPECT_LT(worstError, 0.01f) + << "equaliser cell " << band << " (" << EQ_FC_HZ[band] + << " Hz) departs from the reference by " << worstError << " dB"; + } +} + +TEST(FilterDesign, CWDecodeFIRMatchesReferenceCorners) { + RebuildFiltersAtRate(SAMPLE_RATE_192K); + + // The replacement is a Kaiser windowed sinc where the original was a + // Parks-McClellan design, so the skirts differ in detail. What has to carry + // over is where the filter turns over and how well it stops. + const float32_t genMinus6 = LowpassCorner(CW_Filter_Coeffs2, 0, 100.0f, 6000.0f, 5.0f, + -6.0f, REFERENCE_AUDIO_FS_HZ, true, 64); + const float32_t refMinus6 = LowpassCorner(CW_Filter_Coeffs2_ref, 0, 100.0f, 6000.0f, 5.0f, + -6.0f, REFERENCE_AUDIO_FS_HZ, true, 64); + EXPECT_NEAR(genMinus6 / refMinus6, 1.0f, 0.02f) + << "generated -6 dB corner " << genMinus6 << " Hz vs reference " << refMinus6 << " Hz"; + + // The CW decoder thresholds on absolute magnitude, so passband gain matters. + EXPECT_NEAR(FIRGain(CW_Filter_Coeffs2, 64, 200.0f, REFERENCE_AUDIO_FS_HZ), 1.0f, 0.01f); + + // Well past the corner it must still be a stopband. + EXPECT_LT(ToDB(FIRGain(CW_Filter_Coeffs2, 64, 4000.0f, REFERENCE_AUDIO_FS_HZ)), -60.0f); +} + +TEST(FilterDesign, TransmitAudioFilterMatchesReferenceCorners) { + RebuildFiltersAtRate(SAMPLE_RATE_192K); + + const float32_t genMinus3 = LowpassCorner(FIR_int3_12ksps_48tap_2k7, 0, 100.0f, 8000.0f, 5.0f, + -3.0f, REFERENCE_AUDIO_FS_HZ, true, 48); + const float32_t refMinus3 = LowpassCorner(FIR_int3_12ksps_48tap_2k7_ref, 0, 100.0f, 8000.0f, 5.0f, + -3.0f, REFERENCE_AUDIO_FS_HZ, true, 48); + EXPECT_NEAR(genMinus3 / refMinus3, 1.0f, 0.02f) + << "transmit audio bandwidth moved: generated " << genMinus3 + << " Hz vs reference " << refMinus3 << " Hz"; + + EXPECT_NEAR(FIRGain(FIR_int3_12ksps_48tap_2k7, 48, 300.0f, REFERENCE_AUDIO_FS_HZ), 1.0f, 0.01f); +} + +// =========================================================================== +// 2. Do the generated filters hold their frequencies across sample rates? +// =========================================================================== + +TEST(FilterDesign, GeneratedCornersHoldAcrossRates) { + const uint8_t savedRate = SampleRate; + + float32_t cw192[5], cw176[5], eq192[EQUALIZER_CELL_COUNT], eq176[EQUALIZER_CELL_COUNT]; + float32_t txAudio192, txAudio176, cwDecode192, cwDecode176; + + RebuildFiltersAtRate(SAMPLE_RATE_192K); + float32_t fs = AudioRateHz(); + for (int b = 0; b < 5; b++) { + cw192[b] = LowpassCorner(GeneratedCWFilter(b), 6, 200.0f, 3600.0f, 5.0f, -6.0f, fs, false, 0); + } + for (int b = 0; b < EQUALIZER_CELL_COUNT; b++) { + eq192[b] = BandpassPeak(*EQ_Coeffs[b], 4, EQ_FC_HZ[b] * 0.85f, EQ_FC_HZ[b] * 1.15f, + EQ_FC_HZ[b] * 0.002f, fs); + } + txAudio192 = LowpassCorner(FIR_int3_12ksps_48tap_2k7, 0, 100.0f, 8000.0f, 5.0f, -3.0f, fs, true, 48); + cwDecode192 = LowpassCorner(CW_Filter_Coeffs2, 0, 100.0f, 6000.0f, 5.0f, -6.0f, fs, true, 64); + + RebuildFiltersAtRate(SAMPLE_RATE_176K); + fs = AudioRateHz(); + for (int b = 0; b < 5; b++) { + cw176[b] = LowpassCorner(GeneratedCWFilter(b), 6, 200.0f, 3600.0f, 5.0f, -6.0f, fs, false, 0); + } + for (int b = 0; b < EQUALIZER_CELL_COUNT; b++) { + eq176[b] = BandpassPeak(*EQ_Coeffs[b], 4, EQ_FC_HZ[b] * 0.85f, EQ_FC_HZ[b] * 1.15f, + EQ_FC_HZ[b] * 0.002f, fs); + } + txAudio176 = LowpassCorner(FIR_int3_12ksps_48tap_2k7, 0, 100.0f, 8000.0f, 5.0f, -3.0f, fs, true, 48); + cwDecode176 = LowpassCorner(CW_Filter_Coeffs2, 0, 100.0f, 6000.0f, 5.0f, -6.0f, fs, true, 64); + + SampleRate = savedRate; + RebuildFiltersAtRate(savedRate); + + FILE *summary = fopen("filtercmp_rate_summary.txt", "w"); + if (summary != NULL) { + fprintf(summary, "stage,type,f_192k_Hz,f_176k_Hz,measured_ratio,expected_ratio\n"); + for (int b = 0; b < 5; b++) { + fprintf(summary, "CW_audio_%.0f_minus6dB,fs_derived,%.1f,%.1f,%.4f,1.0000\n", + CW_FILTER_FC_HZ[b], cw192[b], cw176[b], cw176[b] / cw192[b]); + } + for (int b = 0; b < EQUALIZER_CELL_COUNT; b++) { + fprintf(summary, "EQ_band%d_%.0f_peak,fs_derived,%.1f,%.1f,%.4f,1.0000\n", + b, EQ_FC_HZ[b], eq192[b], eq176[b], eq176[b] / eq192[b]); + } + fprintf(summary, "TX_audio_bandwidth_minus3dB,fs_derived,%.1f,%.1f,%.4f,1.0000\n", + txAudio192, txAudio176, txAudio176 / txAudio192); + fprintf(summary, "CW_decode_FIR_minus6dB,fs_derived,%.1f,%.1f,%.4f,1.0000\n", + cwDecode192, cwDecode176, cwDecode176 / cwDecode192); + fclose(summary); + } + + for (int b = 0; b < 5; b++) { + EXPECT_NEAR(cw176[b] / cw192[b], 1.0f, 0.01f) + << "CW audio filter " << CW_FILTER_FC_HZ[b] << " Hz moved from " + << cw192[b] << " Hz to " << cw176[b] << " Hz across the rate change"; + } + for (int b = 0; b < EQUALIZER_CELL_COUNT; b++) { + EXPECT_NEAR(eq176[b] / eq192[b], 1.0f, 0.01f) + << "equaliser cell " << EQ_FC_HZ[b] << " Hz moved from " + << eq192[b] << " Hz to " << eq176[b] << " Hz across the rate change"; + } + EXPECT_NEAR(txAudio176 / txAudio192, 1.0f, 0.01f) + << "transmit audio bandwidth moved from " << txAudio192 << " Hz to " << txAudio176 << " Hz"; + EXPECT_NEAR(cwDecode176 / cwDecode192, 1.0f, 0.01f) + << "CW decode filter moved from " << cwDecode192 << " Hz to " << cwDecode176 << " Hz"; +} + +TEST(FilterDesign, EqualiserCellsPeakOnTheirLabelledCentres) { + const uint8_t savedRate = SampleRate; + const uint8_t rates[2] = {SAMPLE_RATE_192K, SAMPLE_RATE_176K}; + + for (int r = 0; r < 2; r++) { + RebuildFiltersAtRate(rates[r]); + const float32_t fs = AudioRateHz(); + for (int b = 0; b < EQUALIZER_CELL_COUNT; b++) { + const float32_t peak = BandpassPeak(*EQ_Coeffs[b], 4, EQ_FC_HZ[b] * 0.85f, + EQ_FC_HZ[b] * 1.15f, EQ_FC_HZ[b] * 0.002f, fs); + EXPECT_NEAR(peak / EQ_FC_HZ[b], 1.0f, 0.01f) + << "cell " << b << " labelled " << EQ_FC_HZ[b] << " Hz peaks at " + << peak << " Hz at " << SR[rates[r]].rate << " sps"; + // Peak gain is what the equaliser's flat setting depends on. + EXPECT_NEAR(BiquadCascadeGain(*EQ_Coeffs[b], 4, peak, fs), 1.0f, 0.02f); + } + } + + SampleRate = savedRate; + RebuildFiltersAtRate(savedRate); +} + +// =========================================================================== +// 3. Behaviour the redesign must not break +// =========================================================================== + +/** Number of points in the flat-equaliser sweep. */ +#define FLATSUM_POINTS 61 + +/** + * Response of BandEQ with every cell at unity, measured through the real path. + * + * @param responseDB Output, FLATSUM_POINTS values + * @param freq Output, the frequencies measured at + * @param useReference Bind the cells to the reference tables instead of the generated ones + */ +static void MeasureFlatEqualiserSum(float32_t *responseDB, float32_t *freq, bool useReference) { + const float32_t fs = AudioRateHz(); + const uint32_t nSamples = READ_BUFFER_SIZE / RXfilters.DF; + + if (useReference) { + for (int i = 0; i < EQUALIZER_CELL_COUNT; i++) { + RXfilters.S_Rec[i].pCoeffs = (float32_t *)ReferenceEQBand(i); + memset(RXfilters.S_Rec[i].pState, 0, + sizeof(float32_t) * 2 * RXfilters.eqNumStages); + } + } + + for (uint32_t i = 0; i < FLATSUM_POINTS; i++) { + // Log spacing over the range the equaliser covers. + freq[i] = 250.0f * powf(3200.0f / 250.0f, + (float32_t)i / (float32_t)(FLATSUM_POINTS - 1)); + + std::vector I(nSamples), Q(nSamples); + DataBlock data; + data.I = I.data(); + data.Q = Q.data(); + data.N = nSamples; + data.sampleRate_Hz = fs; + + // The cells at the bottom of the range have long impulse responses, so + // they need several blocks before the output settles. + uint32_t offset = 0; + for (int block = 0; block < 12; block++) { + FillTone(I.data(), nSamples, freq[i], fs, offset); + BandEQ(&data, &RXfilters, RX); + offset += nSamples; + } + responseDB[i] = ToDB(ToneAmplitude(data.I, nSamples, freq[i], fs)); + } +} + +/** Peak-to-peak variation of a response, in dB. */ +static float32_t Ripple(const float32_t *responseDB, uint32_t nPoints) { + float32_t lo = responseDB[0], hi = responseDB[0]; + for (uint32_t i = 1; i < nPoints; i++) { + lo = fminf(lo, responseDB[i]); + hi = fmaxf(hi, responseDB[i]); + } + return hi - lo; +} + +TEST(FilterDesign, FlatEqualiserSumStaysFlat) { + const uint8_t savedRate = SampleRate; + + // BandEQ sums the 14 cells with alternating sign, a reconstruction that only + // comes out flat if every cell keeps its designed shape and peak gain. It is + // the property most at risk from regenerating the cells, so check it through + // the real BandEQ path rather than from the coefficients. + // + // Note the flat sum does not sit at 0 dB - the overlapping cells add to + // roughly +4 dB. That is how the equaliser has always behaved; what matters + // is that the sum is level, and that regenerating the cells did not move it. + int32_t savedEQ[EQUALIZER_CELL_COUNT]; + for (int i = 0; i < EQUALIZER_CELL_COUNT; i++) { + savedEQ[i] = ED.equalizerRec[i]; + ED.equalizerRec[i] = 100; // flat + } + + float32_t freq[FLATSUM_POINTS]; + float32_t generated192[FLATSUM_POINTS], reference192[FLATSUM_POINTS]; + float32_t generated176[FLATSUM_POINTS]; + + RebuildFiltersAtRate(SAMPLE_RATE_192K); + MeasureFlatEqualiserSum(generated192, freq, false); + // Rebuilding puts the coefficient pointers back before the reference pass. + RebuildFiltersAtRate(SAMPLE_RATE_192K); + MeasureFlatEqualiserSum(reference192, freq, true); + WriteSweep("filtercmp_eq_flatsum_192000_gen.txt", freq, generated192, FLATSUM_POINTS); + WriteSweep("filtercmp_eq_flatsum_192000_ref.txt", freq, reference192, FLATSUM_POINTS); + + RebuildFiltersAtRate(SAMPLE_RATE_176K); + MeasureFlatEqualiserSum(generated176, freq, false); + WriteSweep("filtercmp_eq_flatsum_176400_gen.txt", freq, generated176, FLATSUM_POINTS); + + // The generated cells must reconstruct exactly what the frozen ones did. + for (uint32_t i = 0; i < FLATSUM_POINTS; i++) { + EXPECT_NEAR(generated192[i], reference192[i], 0.05f) + << "flat equaliser sum differs from the reference by " + << (generated192[i] - reference192[i]) << " dB at " << freq[i] << " Hz"; + } + + // And the reconstruction must survive the rate change. + const float32_t rippleRef = Ripple(reference192, FLATSUM_POINTS); + const float32_t ripple176 = Ripple(generated176, FLATSUM_POINTS); + EXPECT_LT(ripple176, rippleRef + 0.25f) + << "flat equaliser is less level at 176.4 ksps (" << ripple176 + << " dB peak to peak) than the reference is at 192 ksps (" << rippleRef << " dB)"; + + for (uint32_t i = 0; i < FLATSUM_POINTS; i++) { + EXPECT_NEAR(generated176[i], reference192[i], 0.5f) + << "flat equaliser at 176.4 ksps is " << (generated176[i] - reference192[i]) + << " dB away from the 192 ksps reference at " << freq[i] << " Hz"; + } + + for (int i = 0; i < EQUALIZER_CELL_COUNT; i++) ED.equalizerRec[i] = savedEQ[i]; + SampleRate = savedRate; + RebuildFiltersAtRate(savedRate); +} + +TEST(FilterDesign, TransmitDecimatorRejectsAliases) { + const uint8_t savedRate = SampleRate; + const uint8_t rates[2] = {SAMPLE_RATE_192K, SAMPLE_RATE_176K}; + + // coeffs12K_8K_LPF_FIR feeds a decimate-by-2 stage, so everything above a + // quarter of its input rate folds back into the transmit audio. The table it + // replaces was flat to 0.425 * Fs and gave essentially no protection. + const float32_t referenceAtFold = ToDB(FIRGain(coeffs12K_8K_LPF_FIR_ref, 48, + REFERENCE_AUDIO_FS_HZ * 0.25f, + REFERENCE_AUDIO_FS_HZ)); + EXPECT_GT(referenceAtFold, -6.0f) + << "the reference table is expected to be wide open at the fold point; " + "if this fails the reference data has changed"; + + for (int r = 0; r < 2; r++) { + RebuildFiltersAtRate(rates[r]); + const float32_t fs = AudioRateHz(); + const float32_t atFold = ToDB(FIRGain(coeffs12K_8K_LPF_FIR, 48, fs * 0.25f, fs)); + EXPECT_LT(atFold, -60.0f) + << "generated transmit decimator is only " << atFold + << " dB down at the fold point, running at " << SR[rates[r]].rate << " sps"; + + // It must still pass the audio the transmit chain actually carries. + EXPECT_NEAR(FIRGain(coeffs12K_8K_LPF_FIR, 48, 2500.0f, fs), 1.0f, 0.05f); + } + + SampleRate = savedRate; + RebuildFiltersAtRate(savedRate); +} + +TEST(FilterDesign, AMDCBlockerCornerHoldsAcrossRates) { + const uint8_t savedRate = SampleRate; + const uint8_t rates[2] = {SAMPLE_RATE_192K, SAMPLE_RATE_176K}; + float32_t corner[2]; + + for (int r = 0; r < 2; r++) { + RebuildFiltersAtRate(rates[r]); + const float32_t fs = AudioRateHz(); + // y[n] = x[n] - x[n-1] + pole*y[n-1] is a one pole highpass; read its + // -3 dB corner straight off the pole. + corner[r] = -logf(RXfilters.amDCBlockPole) * fs / TWO_PI; + EXPECT_NEAR(corner[r], RXfilters.amDCBlockCorner_Hz, 1.0f) + << "at " << SR[rates[r]].rate << " sps"; + } + EXPECT_NEAR(corner[1] / corner[0], 1.0f, 0.01f); + + SampleRate = savedRate; + RebuildFiltersAtRate(savedRate); +} + +// =========================================================================== +// 4. The generated tables reach the filters that use them +// =========================================================================== + +TEST(FilterDesign, LiveCWFilterUsesGeneratedCoefficients) { + const uint8_t savedRate = SampleRate; + const int32_t savedIndex = ED.CWFilterIndex; + + // Run a tone through the real CWAudioFilter() path and check it lands where + // the coefficient table says it should. This is what catches a table that is + // generated but never bound, or bound but never re-cleared. + for (int r = 0; r < 2; r++) { + RebuildFiltersAtRate(r == 0 ? SAMPLE_RATE_192K : SAMPLE_RATE_176K); + const float32_t fs = AudioRateHz(); + ED.CWFilterIndex = 4; // the 2.0 kHz filter + + const uint32_t nSamples = READ_BUFFER_SIZE / 8; + std::vector I(nSamples), Q(nSamples); + DataBlock data; + data.I = I.data(); + data.Q = Q.data(); + data.N = nSamples; + data.sampleRate_Hz = fs; + + // In band it should pass, well out of band it should not. + uint32_t offset = 0; + for (int block = 0; block < 8; block++) { + FillTone(I.data(), nSamples, 1000.0f, fs, offset); + CWAudioFilter(&data, &RXfilters); + offset += nSamples; + } + EXPECT_NEAR(ToneAmplitude(data.I, nSamples, 1000.0f, fs), 1.0f, 0.05f) + << "at " << SR[SampleRate].rate << " sps"; + + offset = 0; + for (int block = 0; block < 8; block++) { + FillTone(I.data(), nSamples, 4000.0f, fs, offset); + CWAudioFilter(&data, &RXfilters); + offset += nSamples; + } + EXPECT_LT(ToDB(ToneAmplitude(data.I, nSamples, 4000.0f, fs)), -60.0f) + << "at " << SR[SampleRate].rate << " sps"; + } + + ED.CWFilterIndex = savedIndex; + SampleRate = savedRate; + RebuildFiltersAtRate(savedRate); +} diff --git a/code/test/Loop_test.cpp b/code/test/Loop_test.cpp index 985ff3c..7b8e3ee 100644 --- a/code/test/Loop_test.cpp +++ b/code/test/Loop_test.cpp @@ -1265,7 +1265,7 @@ TEST(Loop, ResetTuningButtonCallsResetFunction) { // Set up initial state with non-zero fine tune ED.fineTuneFreq_Hz[ED.activeVFO] = 1500L; ED.centerFreq_Hz[ED.activeVFO] = 14200000L; - int64_t oldRXTX = GetTXRXFreq_dHz(); + int64_t oldRXTX = GetTXRXFreq_cHz(); // Call reset tuning button handler SetButton(RESET_TUNING); @@ -1279,7 +1279,7 @@ TEST(Loop, ResetTuningButtonCallsResetFunction) { EXPECT_EQ(ED.centerFreq_Hz[ED.activeVFO], 14198500L); // 14200000 - 1500 // RXTX frequency should remain the same - EXPECT_EQ(GetTXRXFreq_dHz(), oldRXTX); + EXPECT_EQ(GetTXRXFreq_cHz(), oldRXTX); } TEST(Loop, ResetTuningButtonViaInterruptHandling) { @@ -2141,6 +2141,20 @@ TEST(Loop, TimeSyncNewHeaderResetsCollection) { EXPECT_EQ(Teensy3Clock.lastSet, (time_t)1748476800); } +TEST(Loop, TimeSyncRejectsNonDigitTimestamp) { + // Right length, wrong characters. atoll() alone would return 0 here and the + // sanity check would catch it, but the CAT reader feeds ApplyTimeSyncDigits() + // arbitrary newline-terminated bytes, so the digit check has to be explicit. + runSerialTimeSync("Tabcdefghij\n"); + EXPECT_FALSE(Teensy3Clock.wasSet); +} + +TEST(Loop, TimeSyncRejectsSignedTimestamp) { + // atoll() would stop at the space and hand back a plausible-looking number. + runSerialTimeSync("T -174847680\n"); + EXPECT_FALSE(Teensy3Clock.wasSet); +} + TEST(Loop, TimeSyncRejectsOverrunPacket) { // 11 digits then newline: tsidx hits TIME_SYNC_LEN before newline, // 11th digit triggers overrun branch, clock must not be set. @@ -2155,3 +2169,67 @@ TEST(Loop, TimeSyncNoDataLeavesClockUntouched) { CheckForSerialTimeSync(); EXPECT_FALSE(Teensy3Clock.wasSet); } + +/////////////////////////////////////////////////////////////////////////////// +// Rapid-tuning detection (MUTE_ON_RAPID_TUNE) +/////////////////////////////////////////////////////////////////////////////// +#ifdef MUTE_ON_RAPID_TUNE +// Drop out of the rapid-tuning latch into a known idle baseline. Jumping the +// mock clock past the release window and querying clears the static latch. +static void ResetRapidTune(void){ + AddMillisTime(RAPID_TUNE_RELEASE_MS + 50); + (void)IsRapidTuning(); +} + +TEST(Loop, RapidTuningEngagesOnFastEvents){ + ResetRapidTune(); + NoteTuneActivity(false); // baseline event (large gap, no latch) + NoteTuneActivity(false); // immediate follow-up: gap < engage threshold + EXPECT_TRUE(IsRapidTuning()); +} + +TEST(Loop, RapidTuningReleasesAfterIdle){ + ResetRapidTune(); + NoteTuneActivity(false); + NoteTuneActivity(false); + EXPECT_TRUE(IsRapidTuning()); + AddMillisTime(RAPID_TUNE_RELEASE_MS + 20); + EXPECT_FALSE(IsRapidTuning()); +} + +TEST(Loop, SlowTuningDoesNotEngage){ + ResetRapidTune(); + NoteTuneActivity(false); + AddMillisTime(RAPID_TUNE_ENGAGE_MS + 20); // gap above engage threshold + NoteTuneActivity(false); + EXPECT_FALSE(IsRapidTuning()); +} + +TEST(Loop, RapidCenterTuningFreezesWholeSpectrum){ + ResetRapidTune(); + NoteTuneActivity(false); // Center Tune + NoteTuneActivity(false); + EXPECT_TRUE(IsRapidTuning()); + EXPECT_TRUE(IsRapidCenterTuning()); // center tune -> whole trace + waterfall frozen + EXPECT_FALSE(IsRapidFineTuning()); +} + +TEST(Loop, RapidFineTuningTracksBarOnly){ + ResetRapidTune(); + NoteTuneActivity(true); // Fine Tune + NoteTuneActivity(true); + EXPECT_TRUE(IsRapidTuning()); // still mutes audio + EXPECT_FALSE(IsRapidCenterTuning()); // trace held frozen... + EXPECT_TRUE(IsRapidFineTuning()); // ...but the blue tuning bar keeps tracking +} + +TEST(Loop, TuneSourceUpdatesWhenSwitchingEncoders){ + ResetRapidTune(); + NoteTuneActivity(false); // start on Center Tune + NoteTuneActivity(false); + EXPECT_TRUE(IsRapidCenterTuning()); + NoteTuneActivity(true); // switch to Fine Tune mid-spin + EXPECT_TRUE(IsRapidFineTuning()); + EXPECT_FALSE(IsRapidCenterTuning()); +} +#endif // MUTE_ON_RAPID_TUNE diff --git a/code/test/ModeSm_test.cpp b/code/test/ModeSm_test.cpp index 00a07eb..7236b7d 100644 --- a/code/test/ModeSm_test.cpp +++ b/code/test/ModeSm_test.cpp @@ -376,3 +376,163 @@ TEST(ModeSm, ExitOffsetModeToSSBReceive){ EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE); } + +// ============================================================================ +// Digital (USB audio) mode +// +// DIGITAL_RECEIVE and DIGITAL_TRANSMIT live inside a DIGITAL_STATES composite +// whose enter/exit actions force the radio to 176.4 ksps and put the previous +// rate back. The composite matters: every way out of digital mode has to restore +// the sample rate, including the calibration events dispatched at the +// NORMAL_STATES level. +// ============================================================================ + +// Reach digital mode from SSB and get back again +TEST(ModeSm, NavigateBetweenSSBReceiveAndDigitalReceive){ + ModeSm_start(&modeSM); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_SSB_MODE); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE); +} + +// Reach digital mode from CW and go back to CW, which is the front panel's +// SSB -> CW -> DIGITAL -> SSB cycle in both directions +TEST(ModeSm, NavigateBetweenCWReceiveAndDigitalReceive){ + ModeSm_start(&modeSM); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_CW_MODE); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_CW_RECEIVE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_CW_MODE); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_CW_RECEIVE); +} + +// PTT keys digital transmit, which is how WSJT-X keys the rig over CAT +TEST(ModeSm, NavigateBetweenDigitalReceiveAndDigitalTransmitStates){ + FakeHamBandActive(); + ModeSm_start(&modeSM); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_PTT_PRESSED); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_TRANSMIT); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_PTT_RELEASED); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); +} + +// The out-of-band interlock guards digital transmit exactly as it guards SSB +TEST(ModeSm, IgnorePTTPressedInDigitalModeWhileNonHamBandIsActive){ + FakeNonHamBandActive(); + ModeSm_start(&modeSM); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_PTT_PRESSED); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + FakeHamBandActive(); +} + +// Digital receive must not respond to the CW keying events +TEST(ModeSm, DigitalReceiveIgnoresKeyEvents){ + FakeHamBandActive(); + ModeSm_start(&modeSM); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_KEY_PRESSED); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_DIT_PRESSED); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_DAH_PRESSED); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); +} + +// A calibration event dispatched at the NORMAL_STATES level exits the composite, +// so ExitDigitalMode() runs and the sample rate is restored +TEST(ModeSm, EnterCalibrationFromDigitalReceive){ + ModeSm_start(&modeSM); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_CALIBRATE_FREQUENCY); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_CALIBRATE_FREQUENCY); + // Calibration always returns to SSB receive, never back into digital mode + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_CALIBRATE_EXIT); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE); +} + +// Entering digital mode forces 176.4 ksps; leaving puts the old rate back. This +// is the whole reason the mode exists at that rate: Fs/4 is then exactly the +// 44.1 kHz the USB audio endpoint runs at, so nothing has to be resampled. +TEST(ModeSm, DigitalModeForcesAndRestoresSampleRate){ + uint8_t saved = SampleRate; + + SampleRate = SAMPLE_RATE_192K; + ModeSm_start(&modeSM); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_RECEIVE); + EXPECT_EQ(SampleRate, SAMPLE_RATE_176K) + << "digital mode only works where Fs/4 == 44100 Hz"; + + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_SSB_MODE); + EXPECT_EQ(SampleRate, SAMPLE_RATE_192K) << "the previous rate must come back"; + + SampleRate = saved; +} + +// Transmitting and returning must not disturb the saved rate: the composite is +// not exited on a PTT press, so EnterDigitalMode() must not run again and +// overwrite the saved rate with 176.4 ksps. +TEST(ModeSm, DigitalTransmitDoesNotClobberSavedSampleRate){ + uint8_t saved = SampleRate; + FakeHamBandActive(); + + SampleRate = SAMPLE_RATE_192K; + ModeSm_start(&modeSM); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_PTT_PRESSED); + EXPECT_EQ(modeSM.state_id, ModeSm_StateId_DIGITAL_TRANSMIT); + EXPECT_EQ(SampleRate, SAMPLE_RATE_176K); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_PTT_RELEASED); + + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_SSB_MODE); + EXPECT_EQ(SampleRate, SAMPLE_RATE_192K) + << "a transmit round trip must not lose the pre-digital sample rate"; + + SampleRate = saved; +} + +// Entering digital mode when already at 176.4 ksps must still restore correctly +TEST(ModeSm, DigitalModeFromNativeRateRestoresSameRate){ + uint8_t saved = SampleRate; + + SampleRate = SAMPLE_RATE_176K; + ModeSm_start(&modeSM); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + EXPECT_EQ(SampleRate, SAMPLE_RATE_176K); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_SSB_MODE); + EXPECT_EQ(SampleRate, SAMPLE_RATE_176K); + + SampleRate = saved; +} + +// Regression: EnterDigitalMode() and ExitDigitalMode() are the DIGITAL_STATES +// composite's entry and exit actions, so they run while state_id is still the +// composite rather than a leaf. Both call ChangeSampleRate(), which ends in +// UpdateTuneState(). If the composite is not handled there, UpdateTuneState() +// falls through to its default branch and calls HandleTuneState() with whatever +// tune state was left over from before - reprogramming the VFO from stale state +// on every entry to and exit from digital mode. +TEST(ModeSm, DigitalModeTransitionsHandleTheCompositeState){ + uint8_t saved = SampleRate; + SampleRate = SAMPLE_RATE_192K; + ModeSm_start(&modeSM); + + Serial.lines.clear(); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_DIGITAL_MODE); + ModeSm_dispatch_event(&modeSM, ModeSm_EventId_TO_SSB_MODE); + + for (const std::string &line : Serial.lines) { + EXPECT_EQ(line.find("Unhandled modeSM.state_id"), std::string::npos) + << "unhandled state during a digital mode transition: " << line; + } + + SampleRate = saved; +} diff --git a/code/test/OpenAudio_ArduinoLibrary_mock.cpp b/code/test/OpenAudio_ArduinoLibrary_mock.cpp index 75f8c8c..95b7811 100644 --- a/code/test/OpenAudio_ArduinoLibrary_mock.cpp +++ b/code/test/OpenAudio_ArduinoLibrary_mock.cpp @@ -178,11 +178,19 @@ class FreqShiftedFeedback { // Global frequency-shifted feedback processor static FreqShiftedFeedback g_freqShiftFeedback; +// Current radio audio sample rate (Hz). Follows the global SampleRate selector so +// the simulator's mock audio tracks run-time sample-rate changes (Sample Rate menu). +static inline double MockRadioSampleRate(void) { + return (double)SR[SampleRate].rate; +} + // ============== Tone Generator ============== -// Sample rate is 192kHz +// Sample rate follows MockRadioSampleRate() (192kHz, 176.4kHz, ...). // For I/Q signal at frequency f: I = cos(2*pi*f*t), Q = -sin(2*pi*f*t) // (negative sin for USB representation where positive frequency = lower sideband) -static const double TONE_SAMPLE_RATE = 192000.0; +// The RF carrier the tones sit on is the sample rate / 4, because the receive DSP +// translates the input by +Fs/4 (FreqShiftFs4) before demodulation. Tying the +// carrier to Fs/4 keeps the injected tones at the intended audio pitch at any rate. static const double TONE_TWO_PI = 2.0 * M_PI; // Phase accumulators for continuous tone generation @@ -215,9 +223,9 @@ static size_t getToneSamplesAvailable() { auto now = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast(now - toneStartTime); - // Calculate total samples that should have been generated at 192kHz - // samples = time_in_seconds * 192000 - uint64_t totalSamplesExpected = (elapsed.count() * 192000) / 1000000; + // Calculate total samples that should have been generated at the current rate + // samples = time_in_seconds * sampleRate + uint64_t totalSamplesExpected = (elapsed.count() * (uint64_t)MockRadioSampleRate()) / 1000000; // Available = expected - consumed if (totalSamplesExpected > toneSamplesConsumed) { @@ -229,18 +237,19 @@ static size_t getToneSamplesAvailable() { // Generate I/Q samples for two-tone test signal // Tones at 700Hz and 1900Hz offset from 48kHz carrier static void generateTwoToneSamples(int16_t* samplesI, int16_t* samplesQ, int numSamples) { - // Audio offsets from 48kHz + const double sampleRate = MockRadioSampleRate(); + // Audio offsets from the Fs/4 carrier const double audioFreq1 = 700.0; // Hz const double audioFreq2 = 1900.0; // Hz - // RF carrier offset - const double carrierFreq = 48000.0; // Hz + // RF carrier offset = Fs/4 (undone by the DSP FreqShiftFs4 step) + const double carrierFreq = sampleRate / 4.0; // Combined frequencies - const double freq1 = carrierFreq + audioFreq1; // 48700 Hz - const double freq2 = carrierFreq + audioFreq2; // 49900 Hz + const double freq1 = carrierFreq + audioFreq1; + const double freq2 = carrierFreq + audioFreq2; - const double phaseInc1 = TONE_TWO_PI * freq1 / TONE_SAMPLE_RATE; - const double phaseInc2 = TONE_TWO_PI * freq2 / TONE_SAMPLE_RATE; + const double phaseInc1 = TONE_TWO_PI * freq1 / sampleRate; + const double phaseInc2 = TONE_TWO_PI * freq2 / sampleRate; // Amplitude for each tone (half amplitude so sum doesn't clip) const double amplitude = 1380.0; @@ -269,8 +278,9 @@ static void generateTwoToneSamples(int16_t* samplesI, int16_t* samplesQ, int num // Generate I/Q samples for single-tone test signal // Tone at -49kHz (1kHz below -48kHz, will appear at 1kHz audio) static void generateSingleToneSamples(int16_t* samplesI, int16_t* samplesQ, int numSamples) { - const double freq = 49000.0; // Hz (48kHz + 1kHz = 49kHz) - const double phaseInc = TONE_TWO_PI * freq / TONE_SAMPLE_RATE; + const double sampleRate = MockRadioSampleRate(); + const double freq = sampleRate / 4.0 + 1000.0; // Fs/4 carrier + 1kHz -> 1kHz audio + const double phaseInc = TONE_TWO_PI * freq / sampleRate; const double amplitude = 1380.0; // Full scale single tone. 1380 = S9 tone (determined experimentally). // Noise amplitude is 1/20th of signal amplitude const double noiseAmp = amplitude / 20.0; @@ -293,8 +303,9 @@ static void generateSingleToneSamples(int16_t* samplesI, int16_t* samplesQ, int // Generate I/Q samples for RX LSB IQ calibration case // Tone at 48kHz carrier, with a small error included static void generateRXIQLSBSamples(int16_t* samplesI, int16_t* samplesQ, int numSamples) { - const double freq = 48000.0; // Hz - const double phaseInc = TONE_TWO_PI * freq / TONE_SAMPLE_RATE; + const double sampleRate = MockRadioSampleRate(); + const double freq = sampleRate / 4.0; // Fs/4 carrier + const double phaseInc = TONE_TWO_PI * freq / sampleRate; const double amplitude = 1380.0; // Full scale single tone. 1380 = S9 tone (determined experimentally). // Noise amplitude is 1/40th of signal amplitude const double noiseAmp = amplitude / 40.0; @@ -317,8 +328,9 @@ static void generateRXIQLSBSamples(int16_t* samplesI, int16_t* samplesQ, int num // Generate I/Q samples for RX USB IQ calibration case // Tone at -48kHz carrier, with a small error included static void generateRXIQUSBSamples(int16_t* samplesI, int16_t* samplesQ, int numSamples) { - const double freq = -48000.0; // Hz - const double phaseInc = TONE_TWO_PI * freq / TONE_SAMPLE_RATE; + const double sampleRate = MockRadioSampleRate(); + const double freq = -sampleRate / 4.0; // -Fs/4 carrier + const double phaseInc = TONE_TWO_PI * freq / sampleRate; const double amplitude = 1380.0; // Full scale single tone. 1380 = S9 tone (determined experimentally). // Noise amplitude is 1/40th of signal amplitude const double noiseAmp = amplitude / 40.0; @@ -454,11 +466,23 @@ bool SDL_Audio_Init(int sampleRate) { } } + // Close any devices from a previous initialization so this function can be + // called again at run time when the sample rate changes (Sample Rate menu). + if (audioOutDevice != 0) { + SDL_CloseAudioDevice(audioOutDevice); + audioOutDevice = 0; + } + if (audioInDevice != 0) { + SDL_CloseAudioDevice(audioInDevice); + audioInDevice = 0; + } + currentSampleRate = sampleRate; // ---- Initialize Audio Output (Playback) ---- - // DSP output is at 192kHz, downsample to 48kHz for playback - int outputRate = 48000; + // The DSP output is at the full radio sample rate; decimate by DOWNSAMPLE_FACTOR + // for playback (e.g. 192k->48k, 176.4k->44.1k). + int outputRate = sampleRate / DOWNSAMPLE_FACTOR; SDL_AudioSpec outDesired, outObtained; SDL_zero(outDesired); @@ -872,7 +896,7 @@ class SynchronizedOscillatorGenerator { // Calculate how many samples should have been generated since last call uint64_t elapsedUs = nowUs - lastGenerateTime; - uint64_t samplesExpected = (elapsedUs * 192000) / 1000000; + uint64_t samplesExpected = (elapsedUs * (uint64_t)MockRadioSampleRate()) / 1000000; // Generate complete blocks only uint64_t blocksToGenerate = samplesExpected / BLOCK_SIZE; @@ -934,7 +958,7 @@ class SynchronizedOscillatorGenerator { } // Update timestamp - lastGenerateTime += blocksToGenerate * (BLOCK_SIZE * 1000000 / 192000); + lastGenerateTime += blocksToGenerate * (BLOCK_SIZE * 1000000 / (uint64_t)MockRadioSampleRate()); } // Get number of blocks available for I channel diff --git a/code/test/PowerCalibration_test.cpp b/code/test/PowerCalibration_test.cpp index 85fc35d..c4ac1a6 100644 --- a/code/test/PowerCalibration_test.cpp +++ b/code/test/PowerCalibration_test.cpp @@ -175,7 +175,7 @@ void SelectRFMenu(void) { // Verify we're on the RF secondary menu EXPECT_EQ(uiSM.state_id, UISm_StateId_SECONDARY_MENU); - extern struct PrimaryMenuOption primaryMenu[8]; + extern struct PrimaryMenuOption primaryMenu[9]; extern size_t primaryMenuIndex; EXPECT_STREQ(primaryMenu[primaryMenuIndex].label, "RF Options"); } diff --git a/code/test/RA8875.h b/code/test/RA8875.h index 6b6c9f5..8b35d1b 100644 --- a/code/test/RA8875.h +++ b/code/test/RA8875.h @@ -96,6 +96,9 @@ class RA8875 { void updateScreen(); private: + // Test instrumentation - see RA8875ClearPrintLog() below + void recordPrint(); + uint8_t _cs; uint8_t _rst; uint8_t _font_scale; @@ -105,6 +108,19 @@ class RA8875 { const void* _custom_font; }; +// Test instrumentation (implemented by RA8875_mock.cpp). Every print() is logged +// along with the cursor position and whether a GFX font was installed at the time, +// so tests can check that each pane draws its text in the font it intends to. +struct RA8875PrintRecord { + uint16_t x; + uint16_t y; + bool customFont; + uint8_t fontScale; +}; +void RA8875ClearPrintLog(); +unsigned RA8875PrintLogSize(); +RA8875PrintRecord RA8875PrintLogEntry(unsigned index); + #ifdef USE_SDL_DISPLAY // Cleanup function for SDL resources - call at program exit void RA8875_SDL_Cleanup(); diff --git a/code/test/RA8875_mock.cpp b/code/test/RA8875_mock.cpp index 1d29f07..c917d0c 100644 --- a/code/test/RA8875_mock.cpp +++ b/code/test/RA8875_mock.cpp @@ -2,6 +2,7 @@ #include "Arduino.h" #include #include +#include RA8875::RA8875(uint8_t cs, uint8_t rst) : _cs(cs), _rst(rst), _font_scale(1), _cursor_x(0), _cursor_y(0), _text_color(RA8875_WHITE), _custom_font(nullptr) { } @@ -64,28 +65,49 @@ void RA8875::setFont(const void* font) { _custom_font = font; } +// Log of every print() made, for tests that check which font text was drawn in +static std::vector printLog; + +void RA8875ClearPrintLog() { + printLog.clear(); +} + +unsigned RA8875PrintLogSize() { + return (unsigned)printLog.size(); +} + +RA8875PrintRecord RA8875PrintLogEntry(unsigned index) { + if (index >= printLog.size()) + return {0, 0, false, 0}; + return printLog[index]; +} + +void RA8875::recordPrint() { + printLog.push_back({_cursor_x, _cursor_y, _custom_font != nullptr, _font_scale}); +} + void RA8875::print(const char* text) { - // Mock implementation - could log the text if needed for testing + recordPrint(); } void RA8875::print(const String& str) { - // Mock implementation - could log the text if needed for testing + recordPrint(); } void RA8875::print(int value) { - // Mock implementation - could log the value if needed for testing + recordPrint(); } void RA8875::print(int64_t value) { - // Mock implementation - could log the value if needed for testing + recordPrint(); } void RA8875::print(float value) { - // Mock implementation - could log the value if needed for testing + recordPrint(); } void RA8875::print(float value, int digits) { - // Mock implementation - could log the value if needed for testing + recordPrint(); } void RA8875::setFontDefault() { diff --git a/code/test/README.md b/code/test/README.md index 546d711..1208aca 100644 --- a/code/test/README.md +++ b/code/test/README.md @@ -251,7 +251,7 @@ Mock objects simulate hardware behavior: ```cpp TEST(RFBoard, SetFrequency) { // Mock will record VFO commands - SetFrequency_dHz(145000000); // 14.500 MHz + SetFrequency_cHz(145000000); // 14.500 MHz // Verify mock received correct commands EXPECT_EQ(GetLastVFOFrequency(), 145000000); diff --git a/code/test/RFBoard_test.cpp b/code/test/RFBoard_test.cpp index a1f5ecb..9fa2e2c 100644 --- a/code/test/RFBoard_test.cpp +++ b/code/test/RFBoard_test.cpp @@ -6,8 +6,8 @@ //} extern int32_t EvenDivisor(int64_t freq2_Hz); -extern int64_t GetTXRXFreq_dHz(void); -extern int64_t GetCWTXFreq_dHz(void); +extern int64_t GetTXRXFreq_cHz(void); +extern int64_t GetCWTXFreq_cHz(void); // Mock control function for Si5351 address simulation extern void Si5351_Mock_SetDeviceAddress(uint8_t addr); @@ -168,7 +168,7 @@ TEST(RFBoard, AttenuatorRoundingToNearestHalfdB) { extern struct config_t ED; extern Si5351 si5351; extern const struct SR_Descriptor SR[]; -extern uint8_t SampleRate; +extern uint8_t& SampleRate; extern const float32_t CWToneOffsetsHz[]; extern struct band bands[]; @@ -213,32 +213,32 @@ TEST(RFBoard, EvenDivisorTest) { EXPECT_EQ(EvenDivisor(220000000), 2); } -TEST(RFBoard, GetTXRXFreq_dHz_Test) { +TEST(RFBoard, GetTXRXFreq_cHz_Test) { ED.centerFreq_Hz[ED.activeVFO] = 7074000L; ED.fineTuneFreq_Hz[ED.activeVFO] = 100L; SampleRate = SAMPLE_RATE_48K; // Calculation is: 100 * (7074000 - 100 - 48000/4) = 100 * (7073900 - 12000) = 100 * 7061900 = 706190000 - EXPECT_EQ(GetTXRXFreq_dHz(), 706190000); + EXPECT_EQ(GetTXRXFreq_cHz(), 706190000); } -TEST(RFBoard, GetCWTXFreq_dHz_LSB_Test) { +TEST(RFBoard, GetCWTXFreq_cHz_LSB_Test) { ED.centerFreq_Hz[ED.activeVFO] = 7074000L; ED.fineTuneFreq_Hz[ED.activeVFO] = 100L; SampleRate = SAMPLE_RATE_192K; ED.currentBand[ED.activeVFO] = BAND_40M; // LSB ED.CWToneIndex = 3; // 750 Hz // Calculation is: 100 * (7074000 - 100 - 192000/4 - 750) - EXPECT_EQ(GetCWTXFreq_dHz(), 702515000); + EXPECT_EQ(GetCWTXFreq_cHz(), 702515000); } -TEST(RFBoard, GetCWTXFreq_dHz_USB_Test) { +TEST(RFBoard, GetCWTXFreq_cHz_USB_Test) { ED.centerFreq_Hz[ED.activeVFO] = 14074000L; ED.fineTuneFreq_Hz[ED.activeVFO] = 100L; SampleRate = SAMPLE_RATE_192K; ED.currentBand[ED.activeVFO] = BAND_20M; // USB ED.CWToneIndex = 3; // 750 Hz // Calculation is: 100 * (14074000 - 100 - 48000 + 750) - EXPECT_EQ(GetCWTXFreq_dHz(), 1402665000); + EXPECT_EQ(GetCWTXFreq_cHz(), 1402665000); } TEST(RFBoard, SetFreq_Test) { @@ -303,7 +303,7 @@ TEST(RFBoard, SetCWVFOFrequency_Test) { SampleRate = SAMPLE_RATE_192K; ED.currentBand[ED.activeVFO] = BAND_40M; // LSB ED.CWToneIndex = 3; // 750 Hz - SetCWVFOFrequency(GetCWTXFreq_dHz()); + SetCWVFOFrequency(GetCWTXFreq_cHz()); // Calculation is: 100 * (7074000 - 100 - 192000/4 - 750) EXPECT_EQ(si5351.clk_freq[SI5351_CLK6], 702515000); @@ -314,7 +314,7 @@ TEST(RFBoard, SetCWVFOFrequency_Test) { SampleRate = SAMPLE_RATE_192K; ED.currentBand[ED.activeVFO] = BAND_40M; // LSB ED.CWToneIndex = 3; // 750 Hz - int64_t a = GetCWTXFreq_dHz(); + int64_t a = GetCWTXFreq_cHz(); SetCWVFOFrequency(a); // Calculation is: 100 * (7075000 - 100 - 192000/4 - 750) EXPECT_EQ(si5351.clk_freq[SI5351_CLK2], 702615000); diff --git a/code/test/RFHardwareSM_test.cpp b/code/test/RFHardwareSM_test.cpp index 305dea6..66a00eb 100644 --- a/code/test/RFHardwareSM_test.cpp +++ b/code/test/RFHardwareSM_test.cpp @@ -131,7 +131,7 @@ and between SSB receive and SSB transmit mode? it changes from state to state. UpdateRFHardwareState(); EXPECT_EQ(GetRXVFOFrequency(), 7100000L); EXPECT_EQ(ED.fineTuneFreq_Hz[ED.activeVFO], 500L); - EXPECT_EQ(GetTXRXFreq_dHz(),rxtx*100); + EXPECT_EQ(GetTXRXFreq_cHz(),rxtx*100); } @@ -180,7 +180,7 @@ TEST(RFHardwareState, TuneStateMachine_UpdateTuneStateFromSSBTransmit) { modeSM.state_id = ModeSm_StateId_SSB_TRANSMIT; UpdateTuneState(); - // Should set TX VFO frequency to GetTXRXFreq_dHz() + // Should set TX VFO frequency to GetTXRXFreq_cHz() // Calculation: 7074000 - 100 - 48000/4 = 7061900 Hz * 100 = 706190000 (see Tune.cpp:98) EXPECT_EQ(si5351.clk_freq[SI5351_CLK4], 706190000); EXPECT_EQ(si5351.clk_freq[SI5351_CLK5], 706190000); @@ -198,9 +198,9 @@ TEST(RFHardwareState, TuneStateMachine_UpdateTuneStateFromCWTransmitMark) { modeSM.state_id = ModeSm_StateId_CW_TRANSMIT_MARK; UpdateTuneState(); - // Should set CW VFO frequency to GetCWTXFreq_dHz() - // GetTXRXFreq_dHz() = (7074000 - 100 - 12000) * 100 = 706190000 (see Tune.cpp:98) - // GetCWTXFreq_dHz() = 706190000 - 75000 = 706115000 (LSB) + // Should set CW VFO frequency to GetCWTXFreq_cHz() + // GetTXRXFreq_cHz() = (7074000 - 100 - 12000) * 100 = 706190000 (see Tune.cpp:98) + // GetCWTXFreq_cHz() = 706190000 - 75000 = 706115000 (LSB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK6], 706115000); } @@ -216,9 +216,9 @@ TEST(RFHardwareState, TuneStateMachine_UpdateTuneStateFromCWTransmitSpace) { modeSM.state_id = ModeSm_StateId_CW_TRANSMIT_SPACE; UpdateTuneState(); - // Should set CW VFO frequency to GetCWTXFreq_dHz() - // GetTXRXFreq_dHz() = (14074000 - 100 - 12000) * 100 = 1406190000 (see Tune.cpp:98) - // GetCWTXFreq_dHz() = 1406190000 + 75000 = 1406265000 (USB) + // Should set CW VFO frequency to GetCWTXFreq_cHz() + // GetTXRXFreq_cHz() = (14074000 - 100 - 12000) * 100 = 1406190000 (see Tune.cpp:98) + // GetCWTXFreq_cHz() = 1406190000 + 75000 = 1406265000 (USB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK6], 1406265000); } @@ -234,9 +234,9 @@ TEST(RFHardwareState, TuneStateMachine_UpdateTuneStateFromCWTransmitDitMark) { modeSM.state_id = ModeSm_StateId_CW_TRANSMIT_DIT_MARK; UpdateTuneState(); - // Should set CW VFO frequency to GetCWTXFreq_dHz() - // GetTXRXFreq_dHz() = (7074000 - 100 - 12000) * 100 = 706190000 (see Tune.cpp:98) - // GetCWTXFreq_dHz() = 706190000 - 65650 = 706124350 (LSB) + // Should set CW VFO frequency to GetCWTXFreq_cHz() + // GetTXRXFreq_cHz() = (7074000 - 100 - 12000) * 100 = 706190000 (see Tune.cpp:98) + // GetCWTXFreq_cHz() = 706190000 - 65650 = 706124350 (LSB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK6], 706124350); } @@ -252,9 +252,9 @@ TEST(RFHardwareState, TuneStateMachine_UpdateTuneStateFromCWTransmitDahMark) { modeSM.state_id = ModeSm_StateId_CW_TRANSMIT_DAH_MARK; UpdateTuneState(); - // Should set CW VFO frequency to GetCWTXFreq_dHz() - // GetTXRXFreq_dHz() = (14074000 - 200 - 12000) * 100 = 1406180000 (see Tune.cpp:98) - // GetCWTXFreq_dHz() = 1406180000 + 56250 = 1406236250 (USB) + // Should set CW VFO frequency to GetCWTXFreq_cHz() + // GetTXRXFreq_cHz() = (14074000 - 200 - 12000) * 100 = 1406180000 (see Tune.cpp:98) + // GetCWTXFreq_cHz() = 1406180000 + 56250 = 1406236250 (USB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK6], 1406236250); } @@ -270,9 +270,9 @@ TEST(RFHardwareState, TuneStateMachine_UpdateTuneStateFromCWTransmitKeyerSpace) modeSM.state_id = ModeSm_StateId_CW_TRANSMIT_KEYER_SPACE; UpdateTuneState(); - // Should set CW VFO frequency to GetCWTXFreq_dHz() - // GetTXRXFreq_dHz() = (3574000 - 50 - 12000) * 100 = 356195000 (see Tune.cpp:98) - // GetCWTXFreq_dHz() = 356195000 - 40000 = 356155000 (LSB) + // Should set CW VFO frequency to GetCWTXFreq_cHz() + // GetTXRXFreq_cHz() = (3574000 - 50 - 12000) * 100 = 356195000 (see Tune.cpp:98) + // GetCWTXFreq_cHz() = 356195000 - 40000 = 356155000 (LSB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK6], 356155000); } @@ -288,9 +288,9 @@ TEST(RFHardwareState, TuneStateMachine_UpdateTuneStateFromCWTransmitKeyerWait) { modeSM.state_id = ModeSm_StateId_CW_TRANSMIT_KEYER_WAIT; UpdateTuneState(); - // Should set CW VFO frequency to GetCWTXFreq_dHz() - // GetTXRXFreq_dHz() = (21074000 - (-50) - 12000) * 100 = 2106205000 (see Tune.cpp:98) - // GetCWTXFreq_dHz() = 2106205000 + 84375 = 2106289375 (USB) + // Should set CW VFO frequency to GetCWTXFreq_cHz() + // GetTXRXFreq_cHz() = (21074000 - (-50) - 12000) * 100 = 2106205000 (see Tune.cpp:98) + // GetCWTXFreq_cHz() = 2106205000 + 84375 = 2106289375 (USB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK6], 2106289375); } @@ -309,7 +309,7 @@ TEST(RFHardwareState, TuneStateMachine_StateTransitionSequenceSSBToReceive) { // Transition to SSB transmit modeSM.state_id = ModeSm_StateId_SSB_TRANSMIT; UpdateTuneState(); - // GetTXRXFreq_dHz() = (14230000 - 100 - 12000) * 100 = 1421790000 (see Tune.cpp:98) + // GetTXRXFreq_cHz() = (14230000 - 100 - 12000) * 100 = 1421790000 (see Tune.cpp:98) EXPECT_EQ(GetTXVFOFrequency(), 14217900); // Back to SSB receive @@ -336,8 +336,8 @@ TEST(RFHardwareState, TuneStateMachine_StateTransitionSequenceCWReceiveToTransmi // Transition to CW transmit mark modeSM.state_id = ModeSm_StateId_CW_TRANSMIT_MARK; UpdateTuneState(); - // GetTXRXFreq_dHz() = (7030000 - 200 - 12000) * 100 = 701780000 (see Tune.cpp:98) - // GetCWTXFreq_dHz() = 701780000 - 75000 = 701705000 (LSB) + // GetTXRXFreq_cHz() = (7030000 - 200 - 12000) * 100 = 701780000 (see Tune.cpp:98) + // GetCWTXFreq_cHz() = 701780000 - 75000 = 701705000 (LSB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK6], 701705000); // Transition to CW transmit space @@ -362,19 +362,19 @@ TEST(RFHardwareState, TuneStateMachine_DifferentSampleRates) { SampleRate = SAMPLE_RATE_192K; modeSM.state_id = ModeSm_StateId_SSB_TRANSMIT; UpdateTuneState(); - // GetTXRXFreq_dHz() = (14074000 - 100 - 192000/4) * 100 = (14073900 - 48000) * 100 = 1402590000 (see Tune.cpp:98) + // GetTXRXFreq_cHz() = (14074000 - 100 - 192000/4) * 100 = (14073900 - 48000) * 100 = 1402590000 (see Tune.cpp:98) EXPECT_EQ(GetTXVFOFrequency(), 14025900); // Test with 96kHz sample rate SampleRate = SAMPLE_RATE_96K; UpdateTuneState(); - // GetTXRXFreq_dHz() = (14074000 - 100 - 96000/4) * 100 = (14073900 - 24000) * 100 = 1404990000 (see Tune.cpp:98) + // GetTXRXFreq_cHz() = (14074000 - 100 - 96000/4) * 100 = (14073900 - 24000) * 100 = 1404990000 (see Tune.cpp:98) EXPECT_EQ(GetTXVFOFrequency(), 14049900); // Test with 48kHz sample rate SampleRate = SAMPLE_RATE_48K; UpdateTuneState(); - // GetTXRXFreq_dHz() = (14074000 - 100 - 48000/4) * 100 = (14073900 - 12000) * 100 = 1406190000 (see Tune.cpp:98) + // GetTXRXFreq_cHz() = (14074000 - 100 - 48000/4) * 100 = (14073900 - 12000) * 100 = 1406190000 (see Tune.cpp:98) EXPECT_EQ(GetTXVFOFrequency(), 14061900); } @@ -665,8 +665,8 @@ TEST(RFHardwareState, SingleVFO_TuneStateMachine_CWTransmitMark) { UpdateTuneState(); // In single VFO mode, CW uses CLK2 instead of CLK6 - // GetTXRXFreq_dHz() = (7074000 - 100 - 12000) * 100 = 706190000 - // GetCWTXFreq_dHz() = 706190000 - 75000 = 706115000 (LSB) + // GetTXRXFreq_cHz() = (7074000 - 100 - 12000) * 100 = 706190000 + // GetCWTXFreq_cHz() = 706190000 - 75000 = 706115000 (LSB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK2], 706115000); } @@ -684,8 +684,8 @@ TEST(RFHardwareState, SingleVFO_TuneStateMachine_CWTransmitSpace) { UpdateTuneState(); // In single VFO mode, CW uses CLK2 instead of CLK6 - // GetTXRXFreq_dHz() = (14074000 - 100 - 12000) * 100 = 1406190000 - // GetCWTXFreq_dHz() = 1406190000 + 75000 = 1406265000 (USB) + // GetTXRXFreq_cHz() = (14074000 - 100 - 12000) * 100 = 1406190000 + // GetCWTXFreq_cHz() = 1406190000 + 75000 = 1406265000 (USB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK2], 1406265000); } @@ -703,8 +703,8 @@ TEST(RFHardwareState, SingleVFO_TuneStateMachine_CWTransmitDitMark) { UpdateTuneState(); // In single VFO mode, CW uses CLK2 instead of CLK6 - // GetTXRXFreq_dHz() = (7074000 - 100 - 12000) * 100 = 706190000 - // GetCWTXFreq_dHz() = 706190000 - 65650 = 706124350 (LSB) + // GetTXRXFreq_cHz() = (7074000 - 100 - 12000) * 100 = 706190000 + // GetCWTXFreq_cHz() = 706190000 - 65650 = 706124350 (LSB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK2], 706124350); } @@ -722,8 +722,8 @@ TEST(RFHardwareState, SingleVFO_TuneStateMachine_CWTransmitDahMark) { UpdateTuneState(); // In single VFO mode, CW uses CLK2 instead of CLK6 - // GetTXRXFreq_dHz() = (14074000 - 200 - 12000) * 100 = 1406180000 - // GetCWTXFreq_dHz() = 1406180000 + 56250 = 1406236250 (USB) + // GetTXRXFreq_cHz() = (14074000 - 200 - 12000) * 100 = 1406180000 + // GetCWTXFreq_cHz() = 1406180000 + 56250 = 1406236250 (USB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK2], 1406236250); } @@ -741,8 +741,8 @@ TEST(RFHardwareState, SingleVFO_TuneStateMachine_CWTransmitKeyerSpace) { UpdateTuneState(); // In single VFO mode, CW uses CLK2 instead of CLK6 - // GetTXRXFreq_dHz() = (3574000 - 50 - 12000) * 100 = 356195000 - // GetCWTXFreq_dHz() = 356195000 - 40000 = 356155000 (LSB) + // GetTXRXFreq_cHz() = (3574000 - 50 - 12000) * 100 = 356195000 + // GetCWTXFreq_cHz() = 356195000 - 40000 = 356155000 (LSB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK2], 356155000); } @@ -760,8 +760,8 @@ TEST(RFHardwareState, SingleVFO_TuneStateMachine_CWTransmitKeyerWait) { UpdateTuneState(); // In single VFO mode, CW uses CLK2 instead of CLK6 - // GetTXRXFreq_dHz() = (21074000 - (-50) - 12000) * 100 = 2106205000 - // GetCWTXFreq_dHz() = 2106205000 + 84375 = 2106289375 (USB) + // GetTXRXFreq_cHz() = (21074000 - (-50) - 12000) * 100 = 2106205000 + // GetCWTXFreq_cHz() = 2106205000 + 84375 = 2106289375 (USB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK2], 2106289375); } @@ -781,7 +781,7 @@ TEST(RFHardwareState, SingleVFO_StateTransitionSequenceSSBToReceive) { // Transition to SSB transmit - in single VFO mode, RX VFO is used for TX modeSM.state_id = ModeSm_StateId_SSB_TRANSMIT; UpdateTuneState(); - // GetTXRXFreq_dHz() = (14230000 - 100 - 12000) * 100 = 1421790000 + // GetTXRXFreq_cHz() = (14230000 - 100 - 12000) * 100 = 1421790000 // In single VFO mode, GetTXVFOFrequency returns RX VFO frequency EXPECT_EQ(GetRXVFOFrequency(), 14217900); @@ -810,8 +810,8 @@ TEST(RFHardwareState, SingleVFO_StateTransitionSequenceCWReceiveToTransmit) { // Transition to CW transmit mark - uses CLK2 in single VFO mode modeSM.state_id = ModeSm_StateId_CW_TRANSMIT_MARK; UpdateTuneState(); - // GetTXRXFreq_dHz() = (7030000 - 200 - 12000) * 100 = 701780000 - // GetCWTXFreq_dHz() = 701780000 - 75000 = 701705000 (LSB) + // GetTXRXFreq_cHz() = (7030000 - 200 - 12000) * 100 = 701780000 + // GetCWTXFreq_cHz() = 701780000 - 75000 = 701705000 (LSB) EXPECT_EQ(si5351.clk_freq[SI5351_CLK2], 701705000); // Transition to CW transmit space @@ -837,20 +837,20 @@ TEST(RFHardwareState, SingleVFO_DifferentSampleRates) { SampleRate = SAMPLE_RATE_192K; modeSM.state_id = ModeSm_StateId_SSB_TRANSMIT; UpdateTuneState(); - // GetTXRXFreq_dHz() = (14074000 - 100 - 192000/4) * 100 = (14073900 - 48000) * 100 = 1402590000 + // GetTXRXFreq_cHz() = (14074000 - 100 - 192000/4) * 100 = (14073900 - 48000) * 100 = 1402590000 // In single VFO mode, this is on RX VFO EXPECT_EQ(GetRXVFOFrequency(), 14025900); // Test with 96kHz sample rate SampleRate = SAMPLE_RATE_96K; UpdateTuneState(); - // GetTXRXFreq_dHz() = (14074000 - 100 - 96000/4) * 100 = (14073900 - 24000) * 100 = 1404990000 + // GetTXRXFreq_cHz() = (14074000 - 100 - 96000/4) * 100 = (14073900 - 24000) * 100 = 1404990000 EXPECT_EQ(GetRXVFOFrequency(), 14049900); // Test with 48kHz sample rate SampleRate = SAMPLE_RATE_48K; UpdateTuneState(); - // GetTXRXFreq_dHz() = (14074000 - 100 - 48000/4) * 100 = (14073900 - 12000) * 100 = 1406190000 + // GetTXRXFreq_cHz() = (14074000 - 100 - 48000/4) * 100 = (14073900 - 12000) * 100 = 1406190000 EXPECT_EQ(GetRXVFOFrequency(), 14061900); } diff --git a/code/test/RadioSimulator_main.cpp b/code/test/RadioSimulator_main.cpp index d88732f..abd0ff2 100644 --- a/code/test/RadioSimulator_main.cpp +++ b/code/test/RadioSimulator_main.cpp @@ -148,6 +148,29 @@ static void updateAudioSourceForRFState() { // Simulated time is handled by Arduino_mock.cpp +// Track the sample rate SDL audio was configured for, so we can re-init the SDL +// audio devices when the firmware changes it at run time (Sample Rate menu). +static uint8_t previousSampleRate = 0xFF; + +/** + * Re-initialize SDL audio when the radio's sample rate changes. + * ChangeSampleRate() (firmware) reconfigures the DSP for the new rate; the SDL + * output device rate depends on it too (it decimates the DSP output by 4), so the + * simulator must re-open the SDL audio devices. Called once per loop iteration. + */ +static void updateAudioForSampleRateChange() { + if (SampleRate == previousSampleRate) { + return; + } + if (previousSampleRate != 0xFF) { + // Not the first call: the rate was changed at run time. Re-init SDL audio. + std::cout << "Sample rate changed to " << SR[SampleRate].rate + << " Hz - re-initializing SDL audio" << std::endl; + SDL_Audio_Init(SR[SampleRate].rate); + } + previousSampleRate = SampleRate; +} + // Simple keyboard event handler enum SimulatorAction { ACTION_NONE, @@ -428,10 +451,11 @@ int main(int argc, char* argv[]) { Q_out_L_Ex.setAudioChannel(2); // I channel (IQ output) Q_out_R_Ex.setAudioChannel(3); // Q channel (IQ output) - // Initialize SDL audio for demodulated audio playback - // Using 192kHz to match the DSP output sample rate (SR[SampleRate].rate) - // Most modern audio systems can handle this via software resampling - if (!SDL_Audio_Init(192000)) { + // Initialize SDL audio for demodulated audio playback. + // Use the current radio sample rate (SR[SampleRate].rate); the mock decimates + // this by 4 for the speaker output. See updateAudioForSampleRateChange() below, + // which re-initializes SDL audio when the Sample Rate menu changes the rate. + if (!SDL_Audio_Init(SR[SampleRate].rate)) { std::cerr << "Warning: SDL Audio initialization failed. Audio playback disabled." << std::endl; } else { std::cout << "SDL Audio initialized for demodulated audio playback" << std::endl; @@ -481,6 +505,9 @@ int main(int argc, char* argv[]) { // Update audio source based on RF hardware state (for calibration modes) updateAudioSourceForRFState(); + // Re-initialize SDL audio if the sample rate was changed at run time + updateAudioForSampleRateChange(); + // Update the SDL display once per frame (not on every draw call) tft.updateScreen(); } diff --git a/code/test/Radio_test.cpp b/code/test/Radio_test.cpp index 990ad13..abe1b7c 100644 --- a/code/test/Radio_test.cpp +++ b/code/test/Radio_test.cpp @@ -197,7 +197,7 @@ void print_frequency_state(void){ line += String(ED.fineTuneFreq_Hz[ED.activeVFO]); while (line.length() < 32) line += " "; line += " | "; - line += String(GetTXRXFreq_dHz()/100); + line += String(GetTXRXFreq_cHz()/100); while (line.length() < 49) line += " "; line += " | "; line += String(GetRXVFOFrequency()); @@ -282,7 +282,7 @@ TEST(Radio, RadioStateRunThrough) { Debug("Before fine tune change:");print_frequency_state(); SetInterrupt(iFINETUNE_INCREASE); loop(); MyDelay(10); - int64_t oldrxtx = GetTXRXFreq_dHz(); + int64_t oldrxtx = GetTXRXFreq_cHz(); Debug("After fine tune change:");print_frequency_state(); // Change the zoom level @@ -304,7 +304,7 @@ TEST(Radio, RadioStateRunThrough) { MyDelay(10); } CheckThatStateIsSSBTransmit(); - EXPECT_EQ(oldrxtx, GetTXRXFreq_dHz()); + EXPECT_EQ(oldrxtx, GetTXRXFreq_cHz()); EXPECT_EQ(oldrxtx, GetTXVFOFrequency()*100); Debug("In TX mode:");print_frequency_state(); @@ -314,7 +314,7 @@ TEST(Radio, RadioStateRunThrough) { loop(); MyDelay(10); CheckThatStateIsSSBTransmit(); EXPECT_EQ(ED.centerFreq_Hz[ED.activeVFO], oldfreq+ED.freqIncrement); - EXPECT_EQ(oldrxtx+100*ED.freqIncrement, GetTXRXFreq_dHz()); + EXPECT_EQ(oldrxtx+100*ED.freqIncrement, GetTXRXFreq_cHz()); int64_t txcentfreq = ED.centerFreq_Hz[ED.activeVFO]; Debug("After center change:");print_frequency_state(); @@ -323,7 +323,7 @@ TEST(Radio, RadioStateRunThrough) { loop(); MyDelay(10); EXPECT_EQ(modeSM.state_id, ModeSm_StateId_SSB_RECEIVE); CheckThatStateIsReceive(); - EXPECT_EQ(oldrxtx+100*ED.freqIncrement, GetTXRXFreq_dHz()); // rxtx should stay the same + EXPECT_EQ(oldrxtx+100*ED.freqIncrement, GetTXRXFreq_cHz()); // rxtx should stay the same Debug("Back to SSB receive mode:");print_frequency_state(); // Switch to CW receive mode @@ -332,7 +332,7 @@ TEST(Radio, RadioStateRunThrough) { loop(); MyDelay(10); EXPECT_EQ(modeSM.state_id, ModeSm_StateId_CW_RECEIVE); CheckThatStateIsReceive(); - EXPECT_EQ(oldrxtx+100*ED.freqIncrement, GetTXRXFreq_dHz()); // rxtx should stay the same + EXPECT_EQ(oldrxtx+100*ED.freqIncrement, GetTXRXFreq_cHz()); // rxtx should stay the same Debug("Change to CW receive mode:");print_frequency_state(); // Press the key to start transmitting @@ -342,7 +342,7 @@ TEST(Radio, RadioStateRunThrough) { EXPECT_EQ(modeSM.state_id, ModeSm_StateId_CW_TRANSMIT_MARK); CheckThatStateIsCWTransmitMark(); Debug("Change to CW transmit mark mode:");print_frequency_state(); - EXPECT_EQ(GetCWVFOFrequency()*100, GetCWTXFreq_dHz()); + EXPECT_EQ(GetCWVFOFrequency()*100, GetCWTXFreq_cHz()); for (size_t i = 0; i < 50; i++){ loop(); MyDelay(10); diff --git a/code/test/SignalProcessing_test.cpp b/code/test/SignalProcessing_test.cpp index 5a4f85f..0bd9ceb 100644 --- a/code/test/SignalProcessing_test.cpp +++ b/code/test/SignalProcessing_test.cpp @@ -2012,4 +2012,283 @@ TEST(SignalProcessing, ReceiveProcessing){ for (size_t i=0; iN; i++){ if (data->I[i] > amp) amp = data->I[i]; } -}*/ \ No newline at end of file +}*/ + +// ============================================================================ +// 176.4 kHz receive-chain stage-response measurement +// ---------------------------------------------------------------------------- +// The receive DSP is designed for, and normally run at, Fs = 192 kHz (audio +// rate Fs/DF = 24 kHz after the decimate-by-8). This block measures how the +// receive stages behave when the radio is run at Fs = 176.4 kHz (audio rate +// 176400/8 = 22.05 kHz) WITHOUT changing any DSP stage, by flipping the global +// SampleRate selector and re-running the existing per-stage sweep helpers. +// +// Every stage measured here is now Fs-derived: its coefficients are recomputed +// from SR[SampleRate].rate at InitializeFilters() time, so its corner and centre +// frequencies stay fixed in Hz when the sample rate changes. +// +// This was not always so. The CW audio filters, the CW decode FIR and the EQ +// cells used to ship frozen tables designed for 24 kHz audio, and running them +// at 22.05 kHz scaled every characteristic frequency by 176400/192000 = 0.91875. +// These tests asserted that shift; they now assert its absence. FilterDesign_test.cpp +// covers the generated filters in more detail, including a direct comparison +// against the frozen tables in reference_filters.cpp. +// +// These tests are non-destructive: each saves and restores the global +// SampleRate (and rebuilds the global RXfilters at the original rate) so the +// rest of the suite is unaffected. They use EXPECT_* (non-fatal) so the +// restore at the end always runs. +// ============================================================================ + +// The rate ratio the frozen tables used to shift by. Kept as documentation of +// what these tests are guarding against. +static const float32_t RATE_RATIO_176_192 = 176400.0f / 192000.0f; // 0.91875 + +// Sweep a lowpass-style stage-response helper and return the frequency (Hz) +// at which its gain first falls to `frac` of the passband (fstart) value, using +// linear interpolation between sweep points. Returns -1 if the crossing is +// never reached within [fstart, fstop]. +static float32_t Find176kGainCrossing(void (*resp)(float32_t, DataBlock *, float32_t *), + float32_t fstart, float32_t fstop, + float32_t fstep, float32_t frac){ + DataBlock *dummy = nullptr; + float32_t g0; + resp(fstart, dummy, &g0); // passband reference gain + float32_t target = frac * g0; + float32_t prev_f = fstart, prev_g = g0; + for (float32_t f = fstart + fstep; f <= fstop; f += fstep){ + float32_t g; + resp(f, dummy, &g); + if (g <= target){ + return prev_f + (target - prev_g) * (f - prev_f) / (g - prev_g); + } + prev_f = f; + prev_g = g; + } + return -1.0f; +} + +// -6 dB (half-amplitude) upper cutoff of a CW audio filter. +static float32_t CW176kUpperCutoffHz(int bf){ + ED.CWFilterIndex = bf; + return Find176kGainCrossing(CW_filter_tone, 200.0f, 3600.0f, 10.0f, 0.5f); +} + +// -6 dB (half-amplitude) corner of the AM audio lowpass IIR (Fs-derived). +static float32_t AM176kCornerHz(){ + return Find176kGainCrossing(AM_IIR_filter_tone, 200.0f, 6000.0f, 20.0f, 0.5f); +} + +// Peak (center) frequency of an EQ band, found by argmax of a fine sweep +// generated for the current sample rate. +static float32_t EQ176kPeakHz(int bf, float32_t fmin, float32_t fmax, float32_t fstep){ + DataBlock *dummy = nullptr; + float32_t best_f = fmin, best_g = -1.0f; + for (float32_t f = fmin; f <= fmax; f += fstep){ + float32_t g; + EQ_filter_tone(f, (uint16_t)bf, dummy, &g); + if (g > best_g){ best_g = g; best_f = f; } + } + return best_f; +} + +// Measure a characteristic frequency of three representative stages at both +// 192 kHz and 176.4 kHz and confirm that each one keeps that frequency fixed in +// Hz. Also writes a summary CSV for the record. +TEST(ReceiveChain176k, AllStagesHoldTheirFrequencies){ + uint8_t saved_rate = SampleRate; + + // --- CW audio filter index 4 ("2.0 kHz") --------------------------------- + SampleRate = SAMPLE_RATE_192K; + float32_t cw_192 = CW176kUpperCutoffHz(4); + SampleRate = SAMPLE_RATE_176K; + float32_t cw_176 = CW176kUpperCutoffHz(4); + + // --- Receive EQ band 13 (fc = 4000 Hz) ----------------------------------- + SampleRate = SAMPLE_RATE_192K; + float32_t eq_192 = EQ176kPeakHz(13, 3000.0f, 4600.0f, 5.0f); + SampleRate = SAMPLE_RATE_176K; + float32_t eq_176 = EQ176kPeakHz(13, 3000.0f, 4600.0f, 5.0f); + + // --- AM audio lowpass IIR: the stage that was always Fs-derived ---------- + SampleRate = SAMPLE_RATE_192K; + float32_t am_192 = AM176kCornerHz(); + SampleRate = SAMPLE_RATE_176K; + float32_t am_176 = AM176kCornerHz(); + + // Restore global state before any assertion can abort the test. + SampleRate = saved_rate; + InitializeFilters(SPECTRUM_ZOOM_1, &RXfilters); + + // Record the measurements. + FILE *f = fopen("176k_stage_shift_summary.txt", "w"); + if (f != nullptr){ + fprintf(f, "stage,type,f_192k_Hz,f_176k_Hz,measured_ratio,expected_ratio\n"); + fprintf(f, "CW_audio_filter_2k0_upper_cutoff,fs_derived,%.1f,%.1f,%.4f,%.4f\n", + cw_192, cw_176, cw_176 / cw_192, 1.0f); + fprintf(f, "EQ_band13_4000_peak,fs_derived,%.1f,%.1f,%.4f,%.4f\n", + eq_192, eq_176, eq_176 / eq_192, 1.0f); + fprintf(f, "AM_audio_lowpass_corner,fs_derived,%.1f,%.1f,%.4f,%.4f\n", + am_192, am_176, am_176 / am_192, 1.0f); + fclose(f); + } + + // Sanity: every sweep found its crossing/peak. + ASSERT_GT(cw_192, 0.0f); ASSERT_GT(cw_176, 0.0f); + ASSERT_GT(eq_192, 0.0f); ASSERT_GT(eq_176, 0.0f); + ASSERT_GT(am_192, 0.0f); ASSERT_GT(am_176, 0.0f); + + // All three stages are generated from Fs, so their characteristic + // frequencies stay put. Each of these used to read RATE_RATIO_176_192. + EXPECT_NEAR(cw_176 / cw_192, 1.0f, 0.03) + << "CW audio filter cutoff moved from " << cw_192 << " Hz to " << cw_176 + << " Hz; the Chebyshev design should be regenerated for the new rate"; + EXPECT_NEAR(eq_176 / eq_192, 1.0f, 0.03) + << "EQ band centre moved from " << eq_192 << " Hz to " << eq_176 + << " Hz; the cell prototype should be rebilineared for the new rate"; + EXPECT_NEAR(am_176 / am_192, 1.0f, 0.03) + << "AM audio lowpass corner should stay constant in Hz (recomputed from Fs)"; + + // Guard against a regression to the old behaviour specifically. + EXPECT_GT(cw_176 / cw_192, RATE_RATIO_176_192 + 0.03) + << "CW audio filter is still tracking the sample rate ratio"; + EXPECT_GT(eq_176 / eq_192, RATE_RATIO_176_192 + 0.03) + << "EQ band is still tracking the sample rate ratio"; +} + +// Dump full stage-response sweeps at 176.4 kHz to "176k_*.txt" files, in the +// same format the existing analysis notebook reads for the 192 kHz case. Load +// these alongside the 192 kHz files (build/CWFilter_band_*.txt, +// ReceiveEQ_band_*.txt, AudioIIRPassband.txt) to overlay the two rates. +TEST(ReceiveChain176k, StageResponseDump){ + uint8_t saved_rate = SampleRate; + SampleRate = SAMPLE_RATE_176K; + + DataBlock *dout = nullptr; + char strbuf[64]; + + // CW audio filters: 5 selectable bandwidths. + { + float32_t fmin = 100.0f, fmax = 6000.0f; + uint32_t Npoints = 201; + float32_t fstep = (fmax - fmin) / (float32_t)Npoints; + float32_t gain[Npoints], freq[Npoints]; + for (uint16_t bf = 0; bf < 5; bf++){ + ED.CWFilterIndex = bf; + for (uint32_t i = 0; i < Npoints; i++){ + freq[i] = fmin + (float32_t)i * fstep; + CW_filter_tone(freq[i], dout, &gain[i]); + } + sprintf(strbuf, "176k_CWFilter_band_%d.txt", bf); + WriteIQFile(freq, gain, strbuf, Npoints); + } + } + + // Receive EQ bands: 14 graphic-EQ cells. + { + float32_t fmin = 100.0f, fmax = 8000.0f; + uint32_t Npoints = 401; + float32_t fstep = (fmax - fmin) / (float32_t)Npoints; + float32_t gain[Npoints], freq[Npoints]; + for (uint16_t bf = 0; bf < 14; bf++){ + for (uint32_t i = 0; i < Npoints; i++){ + freq[i] = fmin + (float32_t)i * fstep; + EQ_filter_tone(freq[i], bf, dout, &gain[i]); + } + sprintf(strbuf, "176k_ReceiveEQ_band_%d.txt", bf); + WriteIQFile(freq, gain, strbuf, Npoints); + } + } + + // AM audio lowpass IIR (Fs-derived control): should match its 192 kHz shape. + { + float32_t fmin = 50.0f, fmax = 12000.0f; + uint32_t Npoints = 101; + float32_t fstep = (fmax - fmin) / (float32_t)Npoints; + float32_t gain[Npoints], freq[Npoints]; + for (uint32_t i = 0; i < Npoints; i++){ + freq[i] = fmin + (float32_t)i * fstep; + AM_IIR_filter_tone(freq[i], dout, &gain[i]); + } + WriteIQFile(freq, gain, "176k_AudioIIRPassband.txt", Npoints); + } + + // Restore global state. + SampleRate = saved_rate; + InitializeFilters(SPECTRUM_ZOOM_1, &RXfilters); +} + +// Changing the sample rate at run time changes the Fs/4 IF offset, which would +// move the received (dial) frequency unless ChangeSampleRate() compensates the +// stored center frequency. Verify the dial frequency is held constant and that +// the center frequency is shifted by the change in Fs/4. +TEST(ReceiveChain176k, DialFrequencyPreservedAcrossRateChange){ + uint8_t saved_rate = SampleRate; + int64_t savedA = ED.centerFreq_Hz[0]; + int64_t savedB = ED.centerFreq_Hz[1]; + float32_t savedFine = ED.fineTuneFreq_Hz[ED.activeVFO]; + + // Start at 192 kHz with a known center frequency (RX VFO / "LO" = 7198 kHz). + SampleRate = SAMPLE_RATE_192K; + ED.fineTuneFreq_Hz[ED.activeVFO] = 0.0f; + ED.centerFreq_Hz[0] = 7198000; + ED.centerFreq_Hz[1] = 7198000; + // Dial (received) frequency = centerFreq - fineTune - Fs/4 = 7198000 - 48000 + int64_t dial_192 = GetTXRXFreq(ED.activeVFO); + EXPECT_EQ(dial_192, 7150000); + + // Switch to 176.4 kHz. Fs/4 drops 48000 -> 44100 (delta -3900), so the center + // frequency should move by -3900 to keep the dial frequency fixed. + ChangeSampleRate(SAMPLE_RATE_176K); + EXPECT_EQ((int)SampleRate, (int)SAMPLE_RATE_176K); + EXPECT_EQ(ED.centerFreq_Hz[ED.activeVFO], (int64_t)7194100); + EXPECT_EQ(GetTXRXFreq(ED.activeVFO), dial_192); // dial frequency preserved + + // Switch back to 192 kHz: center returns to the original value. + ChangeSampleRate(SAMPLE_RATE_192K); + EXPECT_EQ(ED.centerFreq_Hz[ED.activeVFO], (int64_t)7198000); + EXPECT_EQ(GetTXRXFreq(ED.activeVFO), dial_192); + + // Restore global state. + ED.centerFreq_Hz[0] = savedA; + ED.centerFreq_Hz[1] = savedB; + ED.fineTuneFreq_Hz[ED.activeVFO] = savedFine; + SampleRate = saved_rate; + InitializeFilters(SPECTRUM_ZOOM_1, &RXfilters); +} +// The zoom-FFT spectrum trace must place a tone at the same bin the display axis +// (frequency_to_bin, the test mirror of FreqToBin) predicts, at both sample rates. +// A tone injected at a known offset from the display center should peak at that bin. +TEST(ReceiveChain176k, ZoomFFTToneLandsWhereAxisPredicts){ + uint8_t saved_rate = SampleRate; + for (int which = 0; which < 2; which++){ + SampleRate = (which == 0) ? SAMPLE_RATE_192K : SAMPLE_RATE_176K; + uint32_t fs = SR[SampleRate].rate; + uint32_t zoom = SPECTRUM_ZOOM_16; // spectrum_zoom = 4 -> 16x + float32_t Delta = 2000.0; // tone 2 kHz above display center + // ADC-baseband tone so that after FreqShiftFs4 (+fs/4) it sits at +Delta + float32_t tone_Hz = Delta - (float32_t)fs/4.0; + + uint32_t Nsamples = 2048*4; + float I[Nsamples], Q[Nsamples]; + CreateIQTone(I, Q, Nsamples, fs, tone_Hz); + + ReceiveFilterConfig rf; + InitializeFilters(zoom, &rf); + ZoomFFTPrep(zoom, &rf); + + DataBlock data; data.N = 2048; data.sampleRate_Hz = fs; + bool val = false; + for (int b = 0; b < 4; b++){ + data.I = &I[b*2048]; data.Q = &Q[b*2048]; data.N = 2048; + val = ZoomFFTExe(&data, zoom, &rf); + } + EXPECT_TRUE(val); + int peak = 0; float32_t pmax = -1e30; + for (int i = 0; i < 512; i++){ if (psdnew[i] > pmax){ pmax = psdnew[i]; peak = i; } } + int expected = frequency_to_bin(Delta, 512, fs/(1<= SETTLE_BLOCKS){ + memcpy(&out[captured*2048], I, 2048*sizeof(float32_t)); + captured++; + } + } + resp[k] = TXToneAmplitude(out, 2048*CAPTURE_BLOCKS, tone, fs); + } + + // Referenced to 800 Hz, which is where the bench sweeps peak and how the + // measured tables in the investigation are normalised. + const int ref = (int)((800.0f - fStart)/fStep); + printf("\n SSB (microphone) TX chain, software only, %d sps\n", + SR[SampleRate].rate); + for (int k = 0; k < NF; k++){ + const float32_t db = 20.0f*log10f(resp[k]/resp[ref]); + printf(" %8.0f Hz %+8.2f dB\n", fStart + fStep*(float32_t)k, db); + if (f) fprintf(f, "%d,%.0f,%.8f,%.4f\n", SR[SampleRate].rate, + fStart + fStep*(float32_t)k, resp[k], db); + } + EXPECT_GT(resp[ref], 0.0f); + } + if (f) fclose(f); + + SampleRate = saved_rate; + InitializeFilters(ED.spectrum_zoom, &RXfilters); + InitializeTransmitFilters(&TXfilters); +} + +/** + * The digital-mode passband on the same fine grid as MicPassbandAcrossRates. + * + * Writes digital_tx_passband_fine.csv in the same shape as mic_tx_passband.csv + * so the same tool differences either bench sweep against its own model. Digital + * mode forces 176.4 ksps, so there is only the one rate. + */ +TEST(TransmitChain176k, DigitalPassbandFineGrid){ + uint8_t saved_rate = SampleRate; + SampleRate = SAMPLE_RATE_176K; + InitializeFilters(ED.spectrum_zoom, &RXfilters); + InitializeTransmitFilters(&TXfilters); + const float32_t audioFs = (float32_t)SR[SampleRate].rate / 4.0f; // 44100 + const float32_t fs = (float32_t)SR[SampleRate].rate; + + const float32_t fStart = 200.0f, fStop = 3400.0f, fStep = 100.0f; + const int NF = (int)((fStop - fStart)/fStep) + 1; + const int CAPTURE_BLOCKS = 4, SETTLE_BLOCKS = 8; + + static float32_t I[2048], Q[2048]; + static float32_t out[2048*4]; + float32_t resp[64]; + + for (int k = 0; k < NF; k++){ + const float32_t tone = fStart + fStep*(float32_t)k; + int captured = 0; + for (int blk = 0; blk < SETTLE_BLOCKS + CAPTURE_BLOCKS; blk++){ + for (uint32_t i = 0; i < 512; i++){ + const double t = (double)(blk*512 + (int)i)/(double)audioFs; + I[i] = 0.5f*(float32_t)sin(2.0*M_PI*(double)tone*t); + Q[i] = I[i]; + } + DigitalTxChain(I, Q, (uint32_t)audioFs); + if (blk >= SETTLE_BLOCKS){ + memcpy(&out[captured*2048], I, 2048*sizeof(float32_t)); + captured++; + } + } + resp[k] = TXToneAmplitude(out, 2048*CAPTURE_BLOCKS, tone, fs); + } + + const int ref = (int)((800.0f - fStart)/fStep); + FILE *f = fopen("digital_tx_passband_fine.csv","w"); + if (f) fprintf(f, "rate_sps,f_Hz,amplitude,dB\n"); + printf("\n digital TX chain, software only, 176400 sps\n"); + for (int k = 0; k < NF; k++){ + const float32_t db = 20.0f*log10f(resp[k]/resp[ref]); + printf(" %8.0f Hz %+8.2f dB\n", fStart + fStep*(float32_t)k, db); + if (f) fprintf(f, "176400,%.0f,%.8f,%.4f\n", + fStart + fStep*(float32_t)k, resp[k], db); + } + if (f) fclose(f); + EXPECT_GT(resp[ref], 0.0f); + + SampleRate = saved_rate; + InitializeFilters(ED.spectrum_zoom, &RXfilters); + InitializeTransmitFilters(&TXfilters); +} + +TEST(TransmitChain176k, DigitalPassbandIsFlatInBand){ + uint8_t saved_rate = SampleRate; + SampleRate = SAMPLE_RATE_176K; + InitializeFilters(ED.spectrum_zoom, &RXfilters); + InitializeTransmitFilters(&TXfilters); + const float32_t audioFs = (float32_t)SR[SampleRate].rate / 4.0f; // 44100 + + const float32_t freqs[] = {200,400,600,800,1000,1200,1400,1600,1800, + 2000,2200,2400,2600,2800,3000,3200}; + const int NF = sizeof(freqs)/sizeof(freqs[0]); + float32_t resp[NF]; + + float32_t I[2048], Q[2048]; + for (int k = 0; k < NF; k++){ + float32_t amp = 0.0f; + // Several blocks so the FIR state settles; measure the last one. + for (int rep = 0; rep < 8; rep++){ + for (uint32_t i = 0; i < 512; i++){ + float32_t t = (float32_t)(rep*512 + i)/audioFs; + I[i] = 0.5f*sinf(TWO_PI*freqs[k]*t); + Q[i] = I[i]; + } + DigitalTxChain(I, Q, audioFs); + if (rep == 7) amp = getmax(I, 2048); + } + resp[k] = amp; + } + + float32_t peak = 0.0f; + for (int k = 0; k < NF; k++) if (resp[k] > peak) peak = resp[k]; + + FILE *f = fopen("digital_tx_passband.txt","w"); + printf("\n digital TX chain response at 176.4 ksps (software only)\n"); + printf(" %8s %10s %9s\n", "f (Hz)", "amp", "dB"); + for (int k = 0; k < NF; k++){ + float32_t db = 20.0f*log10f(resp[k]/peak); + printf(" %8.0f %10.5f %+9.2f\n", freqs[k], resp[k], db); + if (f) fprintf(f, "%.0f,%.6f,%.3f\n", freqs[k], resp[k], db); + } + if (f) fclose(f); + + // In-band flatness, 200-2200 Hz (indices 0..10) + float32_t lo = 1e9f, hi = -1e9f; + for (int k = 0; k <= 10; k++){ + float32_t db = 20.0f*log10f(resp[k]/peak); + if (db < lo) lo = db; + if (db > hi) hi = db; + } + printf(" 200-2200 Hz spread: %.2f dB\n", hi-lo); + + SampleRate = saved_rate; + InitializeFilters(ED.spectrum_zoom, &RXfilters); + InitializeTransmitFilters(&TXfilters); + + // Loose bound: this documents what the DSP actually does. The bench measured + // 2.8 dB; if the DSP is much flatter than that the rest is downstream. + EXPECT_LT(hi-lo, 6.0f) << "digital transmit passband spread over 200-2200 Hz"; +} diff --git a/code/test/Wire.h b/code/test/Wire.h index ee79deb..e4dd288 100644 --- a/code/test/Wire.h +++ b/code/test/Wire.h @@ -12,6 +12,7 @@ class TwoWire { ~TwoWire() {} void begin() {} + void setClock(uint32_t clock) {} void beginTransmission(uint8_t address) {} size_t write(uint8_t data) { return 1; } uint8_t endTransmission(void) { return 0; } diff --git a/code/test/analyze_transmit_filter_chain.ipynb b/code/test/analyze_transmit_filter_chain.ipynb index 4f9a450..31d4ac8 100644 --- a/code/test/analyze_transmit_filter_chain.ipynb +++ b/code/test/analyze_transmit_filter_chain.ipynb @@ -437,7 +437,7 @@ "\n", "\n", "\n", - "#sbs = np.genfromtxt('build/TXEndToEnd_sidebandseparation.txt',delimiter=\",\")\n", + "#sbs = np.genfromtxt('build/TXEndToEnd_sidebandseparation_fixed.txt',delimiter=\",\")\n", "#plt.figure(facecolor='white')\n", "#plt.plot(sbs[:,1],10*sbs[:,2],'k-')\n", "##plt.xlim([-5000,5000])\n", @@ -2079,4 +2079,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/code/test/compare_176k_vs_192k.ipynb b/code/test/compare_176k_vs_192k.ipynb new file mode 100644 index 0000000..03e663d --- /dev/null +++ b/code/test/compare_176k_vs_192k.ipynb @@ -0,0 +1,812 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a048f9ed", + "metadata": {}, + "source": [ + "# Receive DSP chain: 176.4 kHz vs 192 kHz\n", + "\n", + "Compares the per-stage sweep files produced by the `ReceiveChain176k` test suite\n", + "(`176k_*.txt`, generated at Fs = 176.4 kHz / audio rate 22.05 kHz) against the\n", + "192 kHz sweeps from the `SignalProcessing` suite (audio rate 24 kHz).\n", + "\n", + "Several stages used to carry coefficient tables designed offline for 24 kHz\n", + "audio. Run at 22.05 kHz, every corner and centre frequency in them scaled by\n", + "176400/192000 = 0.91875. They are now generated from an analog design spec on\n", + "every sample rate change, so the two rates should lie on top of each other.\n", + "\n", + "The second half of this notebook compares the generated filters against those\n", + "original tables, which are kept in `code/test/reference_filters.cpp`.\n", + "\n", + "Regenerate the data with:\n", + "\n", + "```bash\n", + "cd code/test/build && cmake ../ && make all_SigProc_tests all_FilterDesign_tests\n", + "./all_SigProc_tests && ./all_FilterDesign_tests\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "303ac25e", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:18.544776Z", + "iopub.status.busy": "2026-07-28T10:57:18.544547Z", + "iopub.status.idle": "2026-07-28T10:57:19.100975Z", + "shell.execute_reply": "2026-07-28T10:57:19.099908Z" + } + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "RATE_RATIO = 176400 / 192000 # 0.91875\n", + "\n", + "def load_sweep(path):\n", + " \"\"\"Return (freq_Hz, gain_linear) from a WriteIQFile sweep: idx,freq,gain.\"\"\"\n", + " d = np.genfromtxt(path, delimiter=',')\n", + " return d[:, 1], d[:, 2]\n", + "\n", + "def minus6dB_cutoff(f, g):\n", + " \"\"\"First frequency where |gain| falls to half the passband (first-sample) value.\"\"\"\n", + " target = 0.5 * g[0]\n", + " below = np.where(g <= target)[0]\n", + " if len(below) == 0:\n", + " return np.nan\n", + " i = below[0]\n", + " if i == 0:\n", + " return f[0]\n", + " # linear interpolation between i-1 and i\n", + " return f[i-1] + (target - g[i-1]) * (f[i] - f[i-1]) / (g[i] - g[i-1])\n", + "\n", + "def peak_freq(f, g):\n", + " return f[int(np.argmax(g))]" + ] + }, + { + "cell_type": "markdown", + "id": "3471c4bf", + "metadata": {}, + "source": [ + "## CW audio filters\n", + "\n", + "The five selectable CW bandwidths: 12-pole Chebyshev type I, 0.02 dB ripple.\n", + "Solid = 192 kHz, dashed = 176.4 kHz. The pairs should be indistinguishable.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c5593dfc", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:19.103848Z", + "iopub.status.busy": "2026-07-28T10:57:19.103538Z", + "iopub.status.idle": "2026-07-28T10:57:19.405209Z", + "shell.execute_reply": "2026-07-28T10:57:19.404705Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " filter 192k -6dB 176k -6dB ratio (expected 0.9187)\n", + " 0.8 kHz 852.6 852.5 1.0000\n", + " 1.0 kHz 1093.9 1093.8 0.9999\n", + " 1.3 kHz 1338.2 1337.9 0.9998\n", + " 1.8 kHz 1823.4 1822.8 0.9997\n", + " 2.0 kHz 2065.4 2064.5 0.9996\n" + ] + }, + { + "data": { + "image/png": "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uoi//fbbjBgxwpq0l/r888/p1q0bfn5+eHp60qxZMyZOnFimTEpKCvfddx9BQUG4ubnRpk0bXn31Vcxmc5XHrKzL8cqVK2nVqpV1Xx9++GGFzw8ODmbgwIG88847VR5n//79KIpSYffxDRs2oCgK69evByAjI4OpU6cSHh6Om5sbjRo1okePHmzZsqXKY5S+zjciJyeHzz//nD59+tC8eXPr9u+//56EhAQeffTRCj/7auqHH35g2bJlvPfee+j1+hveD8CRI0do1qwZ3bp14/z58ze0j9LP24r+qutC//bbb9O4cWMGDhxYZruqqrzyyitERkbi7u5O586d2bBhQ7nnFxYWMmvWLGJiYvDz8yMgIIDu3bvz5Zdflitbk7oPlu6/c+bMISQkBF9fXwYMGMDRo0fLlavJZyPAN998Q0xMDG5ubjRt2pTFixdX+FoYDAbuvvtuli1bVu7fISGEfUlCK4SolMlkYtu2bXTp0oXw8PBqy+t0Onr37s3OnTutSUFCQgJZWVn06dOHPn36sGPHDmv5Xbt2UVBQUKPuxklJSTz44IN89tlnrF27ljvuuINHHnmE559//obO7dChQ/Tv35/s7GxWrlzJO++8w759+2rUelJYWEi/fv348MMPefzxx/nmm2+47777eOWVV7jjjjuqfO66deusrUDffvst8fHxNW6VGzZsGC+++CIAS5YsIT4+nvj4eIYNGwbAxx9/zKBBg/D19eWDDz7gs88+IyAggLi4uAq/uN1xxx00b96czz//3JqUDB06lF9//ZVXXnmFzZs38/bbbxMbG0t2drb1eaXjjGtz/KjRaKwwaSjdlpiYWOXzT548SXJy8g11N3799de58847eeaZZ3jvvfdwcfmj85KqqpSUlJT7M5lM5fZTej1K/7Zt20ZoaCiNGzcmICCg0uOnpqby22+/lXsfxMfHc/fdd9OsWTP++9//8s033zBv3rwyCXdGRga33normzZt4vnnn2f9+vUMGDCAJ554ghkzZlz3a7Fy5UoeeOAB2rRpw5o1a3j22Wd5/vnn2bZtW4Xl+/bty48//limflyrU6dOxMbG8v7771d4vKCgIIYOHQrA/fffzxdffMG8efPYtGkT7733HgMGDODixYvXfS419d///pe8vLxy78Pvv/8eAB8fH4YOHWqdO2D48OEcOXKkRvsuKChg0qRJ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1/O+KI25uvdgQEAAt99+Ox9++KG1K+jKlSu5+eaby3QT//TTTxk/fjzvvfce3bt3JyAggL/+9a+cPXu2xudxPUrH9VbU7b905tq4uLgy22NiYmjSpAl79+6tct8TJ07kjjvuoGvXrmRnZ5OdnU1hYSEAly9frvF76uOPPyY0NJR77rmn0jI6na7Cetq1a9dKfwzavn07EyZM4K9//WuNhm5UVk+vp96sXbuWu+66i9DQUD7++GPi4+PZvXs3EydOtL42ULO6X+raGYZLhymUxlvTz8asrCzMZrNN6r8QwrZklmMhRKX0ej39+/dnw4YNpKamEhYWVu1zFEWhT58+fPvtt/zyyy9kZ2eXSWj79OnD/Pnzrb/q1ySh/e9//4urqytff/11mS9TFa2B6ebmVuHETNd+sW/YsGGFX5Jr8sW5YcOG/Pzzz6iqWiapPX/+PCUlJQQGBla7j9pWesw333yz0plrr26NBiqcRCcyMtL6Jf/333/ns88+Y/78+RiNxmon//mzhgwZQnJyMsePH6ekpISWLVvy2WefAZYvuFcrTWbff/99li9fzn333Xddx4qIiOC1115j9OjR3HHHHXz++eflvqjfiJUrVzJ37lzmz59f4QQ2FSm9dpmZmeWS05EjRzJy5EiKiorYtWsX//jHP7j33nuJioqie/fuNGzYkDNnzpTbZ2lr2vXUxdLE4HreF6U/ktTkOA888ACff/45mzdvJiIigt27d/P222+XKRMYGMgbb7zBG2+8QUpKCuvXr2f27NmcP3++1mfWNRqNfPTRR3Tp0oWYmJhyj5e29FVEVdVqJzw7ePAgBw8e5PPPPy/3WHR0NJ06darRZGvffvstd999N7169WLr1q0Vtnper8TEREaNGkWfPn149913a/Scq+vp1aqrN1cvL/bxxx/TtGlTPv300zKfPxV9ZldX92uqpp+NxcXFKIpis/ovhLAdaaEVQlTp6aefRlVVpkyZgtFoLPd4cXExX331VZlt/fr1Iy8vj0WLFhEUFFSmNatPnz5cvHiRN99801q2Ooqi4OLiUmaG0IKCAj766KNyZaOiospNILRt2zZyc3PLxbh161brr/dgmQSrtItrVfr3709ubm65hLq0G2r//v2r3ceNurb1oVSPHj3w9/fn0KFDlbbUXO9aoS1btuTZZ5+lQ4cO1bZG1RZFUWjRogVt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VhvHzJkziYqKQlEUDhw4UGW8jlafABYtWkT79u1p27Yto0ePJjs7G4D09HTi4uJo1aoVHTt25K677iIzM/NPx1yXybI9QgghhBAO7naf+yt97Oahsbzw9TPW+3cFT6Ywv6jCsh37tOXV7Qus9+9vOp3V51fUKIYHH3yQqVOnMmHCBFavXs2kSZOIj48vV279+vV8//33JCQk4OrqysKFC3nmmWf47LPPanSc2rZhwwbmzZvH3LlzefXVV3FzcyM5OZkFCxbwww8/8MorrwDg6+vLwoULuXTpEs8991yZfQwYMICEhATr/eHDh9OvXz/r/YkTJ9KjRw8++eQTAM6cOVNlTNOnT2fo0KHk5OTU0lnWXIGpmG7/e8Gmx/h56Bw8XQxVlhk7dixPPfUUPXv2rLKcI9anzZs38+GHHxIfH4+Pjw8LFixgzpw5LFmyBL1ez9y5c62vy5NPPsns2bNZtmyZ3c/VXqSFVgghhBBC2NT58+fZu3cv9913HwBjxozh1KlTJCUlVVi+qKiIwsJCVFXl8uXLhIWFVXuM1atXExMTw4kTJ6otm5CQUKbF1NfXlwULFpQrl56ezrx589i6dSu33347bm5uAERGRrJixQqys7PZsmULAAEBAfTs2RMvL68qj52ens62bdu4/37LjwzHjx9n7969PP7449YyTZo0qfT5n3zyCcHBwfTp06fSMmlpadx00028//77VcZSn/Xu3btG9QIcrz7t37+fXr164ePjA1h+IPnoo48ACA4OLpPkd+vWjZMnT5bbh6qq/O1vf2PkyJHk5+dXe451mbTQCiGEEEI4uPU5H1X6mF5ftn3js3PvVVpWp1PK3P/o1Fs1Ov7p06cJCQnBxcXy1VNRFCIiIkhJSSEqKqpM2REjRrBjxw4aN26Mj48PoaGh7Nixo8r9v/rqq6xfv55t27YREBBAUlIS2dnZxMTEVFg+JibG2mK6fft2pkyZwuTJk8uVW7p0KXPmzMHX15fPPvuMF198keDgYNq2bcstt9zCwoULeeihhxgwYECNXgeADz74gCFDhhAUFATAoUOHCA8PZ9q0aezZs4fAwEBefvllYmNjyz03PT2d1157jR07drB69eoK95+YmMi9997L66+/zsCBA2scV0156F35eeicG3quqqoUG424GgwoilJpOQ+9642GV86IESP47rvvHKo+de3a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e1xei+hgSpfN+3m3Y58rwP23xABQImNoHYZe0RHq2QCA784d1Tga2zLovfF2aQzAicubNI5GO6qqkm8stvmfqqrVxjJ27Fh27txJZGRkleU6derE7t27SUhI4LfffiMjI4OlS5fW1kty3TZs2MDdd9/NoEGD+OWXX0hISOCtt95i3bp1PPXUU9Zyvr6+LFy4kP/85z/l9rF582Y+/PBD4uPjOXToEDExMcyZMwcAvV7P3LlzOXr0KImJiURGRlabgNQFxeaCSv9KzEU3XLampk6dytGjR0lISGD48OFMnTq1wnKnTp1i7ty57Ny5k+PHj3P27FmWL19+Q8esDbVRnwYMGEBCQoL1r3PnzowbN876+MSJE4mNjeXYsWMcPnyY//u//6sypunTpzN06NDaO0k7k2V7hBB/iqurC3pXPaZiE8f2nKRDjzZah2QziqLg6elGXl4RCYkpDLytndYh2VTLYMtMx7+fu4Cqqiil2byo17o1asbp5EyOX3b8idyivHtzIPszsownMZmN6HUGrUOyu4LiEjq/8G+bH2fvnBl4GlyrLNO7d+8a7cvT09P6eWM0GikoKECnq74NZvXq1SxcuJA1a9ag1+urLJuQkMCECROs90+ePMmsWbN47rnnypRLT09n3rx5bN26FV9fX+v2yMhIVqxYwdSpU9myZQsDBgwgICCAnj178t1335U73v79++nVq5d1ndHhw4fTr18/lixZQnBwMMHBwday3bp145133im3D1VVmT17NkeOHGHVqlV4emq79NYHxwdV+li41y3EhS6y3v/kxO2UqIUVlm3sEcPw8Dev69ju7u5lErBbbrmFN954o8Kyq1evZvTo0dbXeNq0abzyyis8+OCDVR6jLtena/e5bds2VqxYAcDx48fZu3cva9assZZp0qTypQY/+eQTgoOD6dq1a4Wt0wBpaWmMGjWK6dOn88ADD1QZjxakhVYI8ad5+ngAcOpAisaR2F77NiGApduxo2veqCGKAln5BWTkOv64YWcxMjwGgCJzCadyLmgbjI218RsFKKiYSc937C7WjiYpKYmYmBgCAwPx9fWttPWt1Kuvvsqbb77Jtm3biI6OBiA7O7tMt8yYmBhr+ZiYGGvr1uuvv05QUBCTJ08ut9+lS5cyZ84cfH19+eyzz4iJiSEuLo7HHnuMTz/9lIULF/L2229Xez5d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Vlaajibn4Stf+Yq1bNkyq7y83Fq7dq110003WQkJCcH2+8EPfmAlJSVZL7/8srV9+3brk5/8pJWdnW21trYGv8ZnP/tZKzc313r77betzZs3W1dddZU1fvx4q6+vz9SP5XhtbW3Wli1brC1btliA9d///d/Wli1brIMHD1qWdfHa9frrr7fGjRtnrVmzxlqzZo01duxY66abbur3n9epztXObW1t1le+8hVr9erVVkVFhbV06VJrxowZ1uDBg9XOYeSf/umfrKSkJGvZsmVWdXV18NbZ2Rl8jK7n8PdB7azreWB49NFHrRUrVlgVFRXWtm3brH/7t3+z3G63tXjxYsuydC0PBOdq41C8jlXQnuSnP/2pVVBQYEVFRVmTJk06ZZl5CW133323lZ2dbUVGRlo5OTnW7bffbu3cuTP48UAgYH3729+2srKyLK/Xa11++eXW9u3bT/kaXV1d1iOPPGKlpqZaMTEx1k033WRVVVX1948iJ1m6dKkFnHa7//77Lcu6eO3a0NBg3XvvvVZCQoKVkJBg3XvvvVZTU1M//ZRyrnbu7Oy0rr32WmvQoEFWZGSklZ+fb91///2ntaHaObSdqX0B63e/+13wMbqew98HtbOu54HhwQcfDL5eHjRokHX11VcHi1nL0rU8EJyrjUPxOnZZlmVdWJ+uiIiIiIiIiHmaQysiIiIiIiJhSQWtiIiIiIiIhCUVtCIiIiIiIhKWVNCKiIiIiIhIWFJBKyIiIiIiImFJBa2IiIiIiIiEJRW0IiIiIiIiEpZU0IqIiIiIiEhYUkErIiIip3jggQdwuVy4XC5effXVi/q1ly1bFvzat91220X92iIi4jwqaEVEZMA7uUA7+bZ//37T0ULW9ddfT3V1NTfccEPwvrMVuA888MB5F6czZ86kurqau+666yIlFRERJ4swHUBERKQ/XH/99fzud7875b5Bgwad9rienh6ioqL6K1bI8nq9ZGVlXfSvGxUVRVZWFjExMfh8vov+9UVExFnUQysiIo5wokA7+ebxeJg7dy6PPPIIX/7yl0lPT+eaa64BYNeuXdx4443Ex8eTmZnJggULqK+vD369jo4O7rvvPuLj48nOzubJJ59k7ty5fPGLXww+5kw9msnJyfz+978Pnh85coS7776bw+udCQAABm5JREFUlJQU0tLSuPXWW6msrAx+/ETv5xNPPEF2djZpaWl87nOfo7e3N/gYn8/Hv/7rv5KXl4fX62XYsGH85je/wbIsiouLeeKJJ07JsGPHDtxuNwcOHPjov9j3qaysPGNv+Ny5cy/69xIREVFBKyIijvf0008TERHBu+++yy9/+Uuqq6u54oormDBhAhs3bmTRokUcO3bslGGyX/va11i6dCmvvPIKixcvZtmyZWzatOmCvm9nZydXXnkl8fHxrFixglWrVhEfH8/1119PT09P8HFLly7lwIEDLF26lKeffprf//73pxTF9913H8899xz/93//x+7du/nFL35BfHw8LpeLBx988LSe6d/+9rfMmTOHoUOHfrhf2Dnk5eVRXV0dvG3ZsoW0tDQuv/zyi/69RERENORYREQcYeHChcTHxwfPb7jhBl588UUAiouL+dGPfhT82Le+9S0mTZrE//t//y94329/+1vy8vLYu3cvOTk5/OY3v+GZZ54J9ug+/fTT5ObmXlCm5557Drfbza9//WtcLhcAv/vd70hOTmbZsmVce+21AKSkpPDUU0/h8XgYMWIE8+fP55133uHhhx9m7969vPDCC7z11lvMmzcPgCFDhgS/x6c+9Sm+9a1vsX79eqZOnUpvby9//OMfefzxxy8o6wmf/OQn8Xg8p9zn8/mYP38+AB6PJzhUubu7m9tuu40ZM2bw2GOPfajvJyIici4qaEVExBGuvPJKfv7znwfP4+LigsdTpkw55bGbNm1i6dKlpxTAJxw4cICuri56enqYMWNG8P7U1FRKSkouKNOmTZvYv38/CQkJp9zf3d19ynDg0aNHn1JEZmdns337dgBKS0vxeDxcccUVZ/we2dnZzJ8/n9/+9rdMnTqVhQsX0t3dzZ133nlBWU/48Y9/HCycT/j617+O3+8/7bEPPfQQbW1tvPXWW7jdGhQmIiIXnwpaERFxhLi4OIqLi8/6sZMFAgFuvvlmfvjDH5722OzsbPbt23de39PlcmFZ1in3nTz3NRAIMHnyZP70pz+d9rknL1gVGRl52tcNBAIAxMTEfGCOT3/60yxYsIAf//jH/O53v+Puu+8mNjb2vH6G98vKyjrt95iQkEBzc/Mp9333u99l0aJFrF+//rSCXURE5GJRQSsiIvI+kyZN4qWXXqKwsJCIiNP/qywuLiYyMpK1a9eSn58PQFNTE3v37j2lp3TQoEFUV1cHz/ft20dnZ+cp3+f5558nIyODxMTED5V17NixBAIBli9fflrP6Qk33ngjcXFx/PznP+eNN95gxYoVH+p7na+XXnqJ//zP/+SNN964JPN0RURETtD4HxERkff53Oc+R2NjI5/85CdZv3495eXlLF68mAcffBC/3098fDwPPfQQX/va13jnnXfYsWMHDzzwwGnDaq+66iqeeuopNm/ezMaNG/nsZz97Sm/rvffeS3p6OrfeeisrV66koqKC5cuX84UvfIHDhw+fV9bCwkLuv/9+HnzwQV599VUqKipYtmwZL7zwQvAxHo+HBx54gEcffZTi4uJThkpfbDt27OC+++7j61//OqNHj6ampoaamhoaGxsv2fcUERHnUkErIiLyPjk5Obz77rv4/X6uu+46xowZwxe+8AWSkpKCRevjjz/O5Zdfzi233MK8efOYPXs2kydPPuXrPPnkk+Tl5XH55Zdzzz338NWvfvWUob6xsbGsWLGC/Px8br/9dkaOHMmDDz5IV1fXBfXY/vznP+eOO+7gn//5nxkxYgQPP/wwHR0dpzzmoYceoqenhwcffPAj/GY+2MaNG+ns7OS73/0u2dnZwdvtt99+Sb+viIg4k8t6/+QeERER+VDmzp3LhAkT+J//+R/TUU7z7rvvMnfuXA4fPkxmZuY5H/vAAw/Q3Nx82h66F1N/fA8RERn41EMrIiIygPl8Pvbv3883v/lN7rrrrg8sZk84sc3RwoULL2qelStXEh8ff8aFsERERC6UFoUSEREZwJ599lkeeughJkyYwB/+8Ifz+pwf/ehH/Md//Adgr+p8MU2ZMoXS0lKAM26LJCIiciE05FhERERERETCkoYci4iIiIiISFhSQSsiIiIiIiJhSQWtiIiIiIiIhCUVtCIiIiIiIhKWVNCKiIiIiIhIWFJBKyIiIiIiImFJBa2IiIiIiIiEJRW0IiIiIiIiEpb+f4ESae+5LifcAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cw_labels = ['0.8 kHz', '1.0 kHz', '1.3 kHz', '1.8 kHz', '2.0 kHz']\n", + "colors = plt.cm.viridis(np.linspace(0, 0.85, 5))\n", + "\n", + "plt.figure(figsize=(11, 6))\n", + "print(f\"{'filter':>8} {'192k -6dB':>10} {'176k -6dB':>10} {'ratio':>7} (expected {RATE_RATIO:.4f})\")\n", + "for bf in range(5):\n", + " f0, g0 = load_sweep('build/CWFilter_band_%d.txt' % bf)\n", + " f1, g1 = load_sweep('build/176k_CWFilter_band_%d.txt' % bf)\n", + " plt.plot(f0, 20*np.log10(g0), '-', color=colors[bf], label='%s @192k' % cw_labels[bf])\n", + " plt.plot(f1, 20*np.log10(g1), '--', color=colors[bf], label='%s @176.4k' % cw_labels[bf])\n", + " c0, c1 = minus6dB_cutoff(f0, g0), minus6dB_cutoff(f1, g1)\n", + " print(f\"{cw_labels[bf]:>8} {c0:10.1f} {c1:10.1f} {c1/c0:7.4f}\")\n", + "\n", + "plt.ylim(-60, 5)\n", + "plt.xlim(0, 3500)\n", + "plt.grid(True, alpha=0.4)\n", + "plt.legend(fontsize=8, ncol=2)\n", + "plt.xlabel('Frequency [Hz]')\n", + "plt.ylabel('Gain [dB]')\n", + "plt.title('CW audio filters: 192 kHz (solid) vs 176.4 kHz (dashed)')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "2e21ef92", + "metadata": {}, + "source": [ + "## Receive EQ bands\n", + "\n", + "All 14 graphic-EQ cells. Each cell should peak on its labelled centre at both\n", + "rates.\n", + "\n", + "These sweeps run on a ~20 Hz grid, so a peak that falls between two grid points\n", + "can read one step off and show a ratio like 1.016 or 0.994. That is the sweep\n", + "resolution, not a shift: the precise measurement in `filtercmp_rate_summary.txt`\n", + "further down reads 1.0000 for all 14 cells.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "810bbe3c", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:19.410095Z", + "iopub.status.busy": "2026-07-28T10:57:19.409802Z", + "iopub.status.idle": "2026-07-28T10:57:19.832485Z", + "shell.execute_reply": "2026-07-28T10:57:19.831812Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "band 192k peak 176k peak ratio\n", + " 0 198.5 198.5 1.0000\n", + " 1 257.6 257.6 1.0000\n", + " 2 316.7 316.7 1.0000\n", + " 3 395.5 395.5 1.0000\n", + " 4 494.0 494.0 1.0000\n", + " 5 631.9 631.9 1.0000\n", + " 6 789.5 789.5 1.0000\n", + " 7 1006.2 1006.2 1.0000\n", + " 8 1242.6 1262.3 1.0159\n", + " 9 1597.3 1597.3 1.0000\n", + " 10 1991.3 1991.3 1.0000\n", + " 11 2503.5 2503.5 1.0000\n", + " 12 3153.6 3133.9 0.9938\n", + " 13 4000.7 4000.7 1.0000\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_1550931/2527797174.py:8: RuntimeWarning: divide by zero encountered in log10\n", + " plt.semilogx(f1, 20*np.log10(g1), '--', color=colors[bf])\n", + "/tmp/ipykernel_1550931/2527797174.py:7: RuntimeWarning: divide by zero encountered in log10\n", + " plt.semilogx(f0, 20*np.log10(g0), '-', color=colors[bf])\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6MAAAImCAYAAACmbFzDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3gU1feH35kt6b0Seg9dOqI0FZGmqGBBwYIde++CvZeffu0KdgFRVDoioFIE6b2XQCC9ty1zf3/cJBCy6cnuovd9Hh52Z2fufHZyd+aee849RxNCCBQKhUKhUCgUCoVCoXAjuqcFKBQKhUKhUCgUCoXiv4cyRhUKhUKhUCgUCoVC4XaUMapQKBQKhUKhUCgUCrejjFGFQqFQKBQKhUKhULgdZYwqFAqFQqFQKBQKhcLtKGNUoVAoFAqFQqFQKBRuRxmjCoVCoVAoFAqFQqFwO8oYVSgUCoVCoVAoFAqF21HGqEKhUCgUCoVCoVAo3I4yRhWK/zjTp09H07TSf2azmUaNGnHVVVexd+9eT8sDoEWLFlx//fVuP+/gwYPLXJtT/7Vo0aLc/jt37uT666+nWbNm+Pj4EBUVxahRo1i8eHG1znfo0CE0TeP111+v529SNwYPHszgwYMbrP2cnBwefvhhLrzwQqKiotA0jSlTprjcVwjB//3f/xEfH4+Pjw+NGjXi9ttvJyMjo8x+e/bs4cEHH6Rnz56EhoYSHh7OOeecww8//FAtTSW/i3/++afS/aZMmYKmaaSmprr8vHPnzvV67TIzM4mMjOT777+vtzZP5frrry/Xt6v7+1u+fDmaprF8+fLSbRMmTGDMmDH1qrEufPnll1x11VW0b98eXddd/o5BXoeKfvuaprFmzZoy+9vtdt588026dOmCn58foaGh9O/fn1WrVtVIX0FBAe3atav2faC694ySv01F/f/OO+9E07Qaaa2K888/n9tuu63K/Up+a4cOHarX85fQokULRo0a1SBtn0rJ32L69Oml25566il69OiBYRgNfn6F4kzF7GkBCoXCO5g2bRrx8fEUFhaycuVKXnjhBZYtW8auXbsICwvzqLaffvqJ4OBgj5y7VatWfPPNN+W2+/j4lHn/448/Mn78eFq1asVTTz1F+/btSUpKYtq0aQwbNownn3yS5557zl2yzyjS0tL4+OOP6datG2PGjOHTTz+tcN8HH3yQt99+mwcffJALLriAHTt28PTTT7Nu3TpWr16NxWIBYPHixcybN48JEybQu3dvHA4HM2bMYNy4cUydOpWnn37aXV+vXpk6dSpxcXFceeWVbjtnXX5/U6ZMIT4+nt9//53zzjuvnpXVnK+++ooTJ07Qp08fDMPAbre73O+pp55yaUiNHj0aHx8fevfuXbrN6XRy6aWX8tdff/Hwww/Tv39/8vLyWL9+PXl5eTXS99RTT9X4GG/k559/ZuXKlXz55ZeeluJRHnzwQd577z2++OILbrjhBk/LUSi8EmWMKhQKQHpwevXqBUhPmNPp5JlnnmHOnDkef4h2797dY+f28/OjX79+le6zf/9+JkyYQJcuXVi+fDkBAQGln40bN47bb7+d559/nh49enDppZc2tOQzjubNm5ORkVHqYazIGD127BjvvPMOkydP5pVXXgFg6NChREdHM378eKZPn87NN98MwFVXXcXkyZPLeHuGDx9Oamoqr7zyCo888ki5CQVvJz09nY8++oi33nqr3r1YlVGX31/r1q256KKLePnll73CGF20aBG6LoPCRo0axbZt21zu17p1a1q3bl1m24oVK0hNTeXJJ5/EZDKVbn/33XdZsGABK1euLHOvGDlyZI20rV27lnfffZdvvvmGcePG1ehYb+PFF1/k0ksvpXHjxp6W4lFCQkK49tprefnll0u97QqFoiwqTFehULikxDBNSkoqs/2ff/7h4osvJjw8HF9fX7p3787MmTPLHX/s2DFuueUWmjZtitVqJS4ujrFjx5ZpLzs7mwcffJCWLVtitVpp3Lgx9957bznPwKlhgikpKVitVp566qly59y1axeapvF///d/pdtOnDjBrbfeSpMmTbBarbRs2ZKpU6ficDhqfW1O56233iI/P5933323jCFawhtvvEFoaGi1PaOGYfDCCy/QrFkzfH196dWrF0uXLi2zz759+7jhhhto27Yt/v7+NG7cmNGjR7N169Yy+5WE53333Xc88cQTxMXFERwczAUXXMDu3bvL7CuE4NVXX6V58+b4+vrSo0cPFixY4FLf888/T/v27UtDErt27co777xTre93OiWhj1WxZs0anE4nI0aMKLO9JARv9uzZpdsiIyNdttmnTx/y8/NJT0+vsc7jx4/Ts2dP2rZtW+sQ9srCPysKTS5h+vTpOByOcl7RAwcOcNVVVxEXF4ePjw8xMTGcf/75bNq0qXQfwzB49dVXS8Obo6OjmThxIkePHq1Ss6sw3V27dnHRRRfh7+9PZGQkt912Gzk5OS6PnzBhAr/99hv79++v9Dzdu3dnwIAB5bY7nU4aN27MZZddVrrtgw8+oFu3bgQGBhIUFER8fDyPP/54ld+lxBCtDZ999hmapnHjjTeW2f7OO+8wcODAKietKsNms3HjjTcyefLk0ntvbbHb7Vx33XUEBgYyd+7cWrVx+vKNU/9VFXa+ceNG1q5dy4QJE8p9tmbNGs455xx8fX2Ji4vjsccec+mdnjFjBhdeeCGNGjXCz8+PDh068Oijj5Z7NlSn75ewcOFCevTogZ+fH/Hx8Xz++efl9qnu8yIxMZErrriCoKAgQkJCuPLKKzlx4oTL6zFhwgT27NnDsmXLKrtsCsV/FuUZVSgULjl48CAA7dq1K922bNkyLrroIvr27cuHH35ISEgI33//PVdeeSX5+fmlA9Zjx47Ru3dv7HY7jz/+OF27diUtLY1FixaRkZFBTEwM+fn5DBo0iKNHj5bus337dp5++mm2bt3Kb7/95tKYKFmH+cUXXzB16tQyg8tp06ZhtVq55pprAErD8XRd5+mnn6Z169asXr2a559/nkOHDjFt2rRqXQtXhquu66XnXrJkCTExMRUORv39/bnwwguZOXMmycnJREdHV3q+9957j+bNm/P222+XGhHDhw9nxYoVnH322YAcDEVERPDyyy8TFRVFeno6X3zxBX379mXjxo20b9++TJuPP/4455xzDp9++inZ2dk88sgjjB49mp07d5Z6eaZOncrUqVOZNGkSY8eOJSEhgZtvvhmn01mmvVdffZUpU6bw5JNPMnDgQOx2O7t27SIzM7PMOTVNY9CgQWXWENYFm80GlA+RtlgsaJrGli1bqmxj2bJlREVFVfk3OJ1t27YxYsQImjRpwurVq4mMjCzzudPprNYEh6vwz//97398/fXXdOzYsdJj582bR/fu3QkNDS2zfcSIETidTl599VWaNWtGamoqq1atKvP3uP322/n444+58847GTVqFIcOHeKpp55i+fLlbNiwodz3qYykpCQGDRqExWLh/fffJyYmhm+++YY777zT5f6DBw9GCMH8+fO56667Kmz3hhtu4J577mHv3r20bdu2dPvixYtJTEwsjdD4/vvvueOOO7jrrrt4/fXX0XWdffv2sWPHjmp/h5qSlZXFDz/8wPnnn0/Lli1LtyckJHDo0CFGjx7N448/zmeffUZaWhrt27fn4Ycf5rrrrqtW+88++yx5eXk899xzpKSk1FpnZmYml112GTt37mTFihX07NmzzOeGYbjsp0KIMu9HjhzJ6tWry2xbvXo1999/P506dapUw9y5czGZTAwcOLDM9h07dnD++efTokULpk+fjr+/P++//z7ffvttuTb27t3LiBEjuPfeewkICGDXrl288sorrF27lt9//710v+r0fYDNmzfzwAMP8OijjxITE8Onn37KpEmTaNOmTanO6j4vCgoKuOCCC0hMTOSll16iXbt2zJs3r8LQ+Z49exIYGMi8efO8IjpAofA6hEKh+E8zbdo0AYg1a9YIu90ucnJyxMKFC0VsbKwYOHCgsNvtpfvGx8eL7t27l9kmhBCjRo0SjRo1Ek6nUwghxI033igsFovYsWNHhed96aWXhK7rYt26dWW2//DDDwIQ8+fPL93WvHlzcd1115W+/+WXXwQgFi9eXLrN4XCIuLg4cfnll5duu/XWW0VgYKA4fPhwmXO8/vrrAhDbt2+v9NoMGjRIAC7/TZo0qXQ/X19f0a9fv0rbeuSRRwRQ7vueysGDBwUg4uLiREFBQen27OxsER4eLi644IIKj3U4HMJms4m2bduK++67r3T7smXLBCBGjBhRZv+ZM2cKQKxevVoIIURGRobw9fUVl156aZn9Vq5cKQAxaNCg0m2jRo0SZ511VqXfVwghTCaTOO+886rc71RSUlIEIJ555plyn23atEkA4rnnniuzfenSpQIQVqu10rY/+eQTAYh33nmnSh0lv4t169aJJUuWiODgYDF27NgyfxchhHjmmWcq7CMl/069dqczc+ZMoWmaePzxx6vU5O/vL2677bYy21JTUwUg3n777QqP27lzpwDEHXfcUWb733//LYAy577uuutE8+bNy+x3+u/vkUceEZqmiU2bNpXZb+jQoQIQy5YtK6ehcePG4sorr6z0+6Wmpgqr1VruWlxxxRUiJiam9L5z5513itDQ0Erbqg4jR44s910r4oMPPhCA+O6778psX716tQBEcHCw6Nixo5g5c6ZYtGiRGDt2rADExx9/XGXbGzduFBaLRSxcuFAIcfI+8Nprr1V57Kn7Hjx4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eOAB+vbtW6nGG2+8kVtvvZXExET69+9fLoPss88+y5IlS+jfvz9333037du3p7CwkEOHDjF//nw+/PDDKmf7CwoKKjRASrygrVu35ssvv+Saa66hd+/e3H///bRv356kpCQ+//xzFixYwA033ODSs+IKk8nE0KFDuf/++zEMg1deeYXs7GymTp1aus+oUaOYPn068fHxdO3alfXr1/Paa69V23txOmFhYTz44IM8//zz3HTTTYwbN46EhASmTJlSLvxs9OjRpXVpo6KiOHz4MG+//TbNmzcv4+Exm80MGjSoWmsSFyxYQF5eXml5kB07dvDDDz8AMmNmiffpk08+AeQ1z8zMZMGCBXz22We8+OKL9OjRo7S9v/76izFjxhAbG8vjjz9ertRDx44dq20IBgUFsXDhwtJQ319++YUhQ4ZU69jTGT9+PDt27ODjjz8mISGBhISE0s+aNGlS6d9v8ODB5UrtbNmyhTvvvJNx48bRtm1brFYrv//+O1u2bOHRRx8FZMTCLbfcwrvvvouu6wwfPrw0m27Tpk257777avQd7r33Xj7//HNGjhzJ888/X5pNd9euXS7337JlC/n5+dW+ZjfeeCOvvPIK48ePx8/Pr9yawptvvhk/Pz/OOeccGjVqxIkTJ3jppZcICQmhd+/elba9Y8eO0qy7J06cID8/v7SfdezYsZzBMGfOHNLT0yv97T733HMsWLCAiy66iClTphAcHMynn37K5s2by5W9Ov03ER8fT3x8fJl9Soza1q1bV1lG5XTeeOMNgoKCuOOOO8jNzeWhhx6q0fElvPbaa3z11VfcddddBAQElLkHBgcHV2pYDR48mM8//5w9e/aUycb+5JNP8ssvv3Deeefx9NNP4+/vz//+979yE3j9+/cnLCyM2267jWeeeQaLxcI333xTbvKjOn2/JlT3eTFx4kTeeustJk6cyAsvvEDbtm2ZP38+ixYtctluWloae/furdFadYXiP4WHEygpFAoPc2rW0NMpKCgQzZo1E23bthUOh0MIIcTmzZvFFVdcIaKjo4XFYhGxsbHivPPOEx9++GGZYxMSEsSNN94oYmNjhcViEXFxceKKK64QSUlJpfvk5uaKJ598UrRv315YrVYREhIiunTpIu67774yGRdPz+ZZQlZWlvDz8xOA+OSTT1x+v5SUFHH33XeLli1bCovFIsLD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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(11, 6))\n", + "colors = plt.cm.turbo(np.linspace(0, 1, 14))\n", + "print(f\"{'band':>4} {'192k peak':>10} {'176k peak':>10} {'ratio':>7}\")\n", + "for bf in range(14):\n", + " f0, g0 = load_sweep('build/ReceiveEQ_band_%d.txt' % bf)\n", + " f1, g1 = load_sweep('build/176k_ReceiveEQ_band_%d.txt' % bf)\n", + " plt.semilogx(f0, 20*np.log10(g0), '-', color=colors[bf])\n", + " plt.semilogx(f1, 20*np.log10(g1), '--', color=colors[bf])\n", + " p0, p1 = peak_freq(f0, g0), peak_freq(f1, g1)\n", + " print(f\"{bf:>4} {p0:10.1f} {p1:10.1f} {p1/p0:7.4f}\")\n", + "\n", + "plt.ylim(-40, 3)\n", + "plt.xlim(100, 8000)\n", + "plt.grid(True, which='both', alpha=0.3)\n", + "plt.xlabel('Frequency [Hz]')\n", + "plt.ylabel('Gain [dB]')\n", + "plt.title('Receive EQ bands: 192 kHz (solid) vs 176.4 kHz (dashed)')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c05ba0a0", + "metadata": {}, + "source": [ + "### EQ top band zoom\n", + "\n", + "The 4000 Hz cell is where the old shift was largest (it landed at 3675 Hz).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "31eff58e", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:19.835543Z", + "iopub.status.busy": "2026-07-28T10:57:19.835294Z", + "iopub.status.idle": "2026-07-28T10:57:20.018461Z", + "shell.execute_reply": "2026-07-28T10:57:20.017738Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_1550931/1314273394.py:7: RuntimeWarning: divide by zero encountered in log10\n", + " plt.plot(f0, 20*np.log10(g0), 'k-', label='192 kHz (peak %.0f Hz)' % p0)\n" + ] + }, + { + "data": { + "image/png": "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ERERmfZUXL9+nbFjx9K6detcDQ4gODiYGjVqZHkUKFCABg0a4Ofnx5EjR+zPTU5O5sSJE5TXRFERl3XmzBnGjRsHwKRJk9I+XRk+3FwDvWVLaNHCiRGKOE5KQgI/DxrEubFjScnlkQEi+ULz5vD88+Zytp9/fstqdevWZcqUKYC58tSNYfeSe3KcZIwcOZLLly9TvXp1pk6dymeffca6deuYMmUK1atXJzo6mpEjR+ZlrFkKDAykb9++jB49msjISI4cOUK/fv0A6KCdgUVc1vDhw4mLi6NRo0Z07drVfPDbb2HtWnMy37Rpzg1QxIEsViuWwEBsAQEe0Xsn4hTTp8O6dTBpUpbVXnzxRZo2bUpCQgKzZ892UHD5x23t+H38+HH69evHxo0b7duyWywWHnvsMd5++237SlPOkpyczIgRI3j33Xe5fv06jRo1YubMmVmuLvVX2vFbckrjYP++7du307hxYwB27tzJfffdZ64e1agR7N4NL7wACxY4OcrcofYiOaW2IrdD7eXv2bBhA61atSIwMJDTp08TEBDg7JDyjEvv+F2xYkU2bNjAhQsX2LFjBzt27ODChQts2LDB6QkGgI+PD9OmTePcuXPExsaycePG20owRMRxDMNg6NChADz//PNmggFmD8bu3RAQANks+iAiIpKls2fTht9monnz5lSrVo3Y2FhWrlzp4OA82x2lvMWKFeP+++/n/vvvzzfLfolI7lq/fj3btm2jYMGCjL955SjDgNKlYfBgCAlxXoAiIuLeUlPh4YdhyhT4c9XCv7JarQwcOBAwFyG5jQE+kg31q4mIw6WmpjJixAjAHBNbunTptMIOHcyVpV55xUnRiThPSkIC219+mV/GjdPEb5G/y8sLXn/dPB871twRPBPdunUjICCAX375ha+++sqBAXo2JRki4nAffPABBw8epEiRIgwfPjxjhYIFIZNNlEQ8nS0lhaR9++DwYWwpKc4OR8T9PfcctGoFSUnQs6fZu/EXgYGBPP/884DZmyG5Q0mGiDhUUlISERERALzyyisULVrULFizBlatyvQPgEh+4eXrS3DXrhRo3x4vX19nhyPi/iwWcwGRgADYtg3efjvTajeGTH3xxRdazjaXKMkQEYdatGgRx48fJzQ0lBdffNF8MDERXn7Z/MRp+XKnxifiTF6+vtz9/PNUePppJRkiuaVc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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "bf = 13\n", + "f0, g0 = load_sweep('build/ReceiveEQ_band_%d.txt' % bf)\n", + "f1, g1 = load_sweep('build/176k_ReceiveEQ_band_%d.txt' % bf)\n", + "p0, p1 = peak_freq(f0, g0), peak_freq(f1, g1)\n", + "\n", + "plt.figure(figsize=(9, 5))\n", + "plt.plot(f0, 20*np.log10(g0), 'k-', label='192 kHz (peak %.0f Hz)' % p0)\n", + "plt.plot(f1, 20*np.log10(g1), 'r--', label='176.4 kHz (peak %.0f Hz)' % p1)\n", + "plt.axvline(p0, color='k', ls=':', alpha=0.5)\n", + "plt.axvline(p1, color='r', ls=':', alpha=0.5)\n", + "plt.xlim(2500, 5000)\n", + "plt.ylim(-12, 2)\n", + "plt.grid(True, alpha=0.4)\n", + "plt.legend()\n", + "plt.xlabel('Frequency [Hz]')\n", + "plt.ylabel('Gain [dB]')\n", + "plt.title('EQ band 13: measured ratio %.4f vs expected %.4f' % (p1/p0, RATE_RATIO))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "2dc1781f", + "metadata": {}, + "source": [ + "## AM audio lowpass IIR\n", + "\n", + "This stage always recomputed its coefficients from the sample rate, so it served\n", + "as the control while the others were being fixed. The two curves should lie\n", + "almost on top of each other.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cc49c429", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:20.022177Z", + "iopub.status.busy": "2026-07-28T10:57:20.020924Z", + "iopub.status.idle": "2026-07-28T10:57:20.199584Z", + "shell.execute_reply": "2026-07-28T10:57:20.198871Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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tWpWp8k1NQgiIiIi4nTxIuzZA7Nne/yVlQFq1apFgwYNuHz5MlOnTrU6jtPly84GAbxqatMrqUEQEREREacWLaBUKechMqtXW50mRzL2IkyfPp0///zT4jQ498L88guUKQNPPGF1mhuiBkFEREREnOx26NjReX/mTGuz5FCLFi2oWLEiv//+O/PmzbM6zv+uI9G1q/Pv6YXUIIiIiIjI/8TFOX8uXw6//25tlhzw9fXl+eefB5wnKxtjrAtz5Z6X+HjrctwkNQgiIiIi8j81azpPVE5NhQ8/tDpNjsTFxREQEMC3337L2rVrrQty/jw89hg0bgyVK1uX4yapQRARERGRzDL2InjJYUYlSpTgmWeeASye8jQy0nk16jVrrMuQB9QgiIiIiEhmHTpA69bw2mtg5SE7uZBxmNHKlSs5ePCgtWF8vPsjtnenFxEREZG8V6oULFrkPFzGZrM6TY7ccccdREdHA/D222+7P8DmzXD4sPu3mw/UIIiIiIhIgZAx5enMmTM5c+aM+zZsDHTr5jzvYPly9203n6hBEBEREZHsHToEgwfDypVWJ8mRJk2aULVqVS5cuMDs2bPdt+G9e2H/fue0po0auW+7+UQNgoiIiIhkb84cGD0aJk2yOkmO2Gw217kI77zzjvumPJ0/3/mzeXMoXtw928xHahBEREREJHv/nRmINWucVwf2Ah07diQwMJDvv/+eDRs25P8GjYEFC5z327fP/+25gRoEEREREclepUpw//3OD8FLllidJkeCgoLo+N+rQb+TcVXj/LR1Kxw5AoGBzpO6CwA1CCIiIiJyda1bO38uWmRtjlzo3r07AEuWLOHEiRP5u7GMw4tatgR///zdlpuoQRARERGRq3vySefPL76A5GRrs+RQrVq1qFu3LmlpacyaNSv/NmQMfPqp834BObwI1CCIiIiIyLVEREDdul51mBFAjx49AJg+fToOhyN/NmKzwddfO89BePjh/NmGBdQgiIiIiMi1tW4NJUrAhQtWJ8mxtm3bUqJECY4cOUJiYmL+bSggAJ56CgoXzr9tuJkaBBERERG5tmefhRMnYMAAq5PkWNGiRencuTMA06ZNy/sNuGsKVQuoQRARERGRawsIAD8/q1PkWsZhRitXruTYsWN5u/Lly+Huu8EdMyW5mRoEEREREckZY+DAAatT5FhkZCSNGjXC4XDw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EREREZECxCtOUi5WrBg9evRg2LBhhIeHU6FCBRISEgBo06YNAE2bNqVq1arExsaSkJDAqVOn6N+/P/Hx8eqaRURERERyyCsaBICEhAQKFSpEbGwsFy9epG7dunz++eeULFkSAF9fXz755BN69uzJAw88gL+/Px06dGDcuHEWJ78+u93OsGHDshzqJJ5HtfIeqpX3UK28h2rlXVQv7+FptbIZk5O5jkRERERE5FagSYxFRERERMRFDYKIiIiIiLioQRARERERERc1CCIiIiIi4qIGwWJTp06lUqVKFClShKioKL744gurIxVoY8aM4Z577iEoKIiyZcvSsmVLvv/++0xjjDEMHz6csLAw/P39adSoEd9++22mMSkpKTz//PMEBwcTEBDA448/zs8//5xpzOnTp4mNjaV48eIUL16c2NhYzpw5k98vscAaM2YMNpuNvn37upapVp7j+PHjPP3005QuXZqiRYtSs2ZNdu7c6XpctfIcly9fZsiQIVSqVAl/f38qV67Mq6++isPhcI1RvayxceNGYmJiCAsLw2azsWzZskyPu7MuR48eJSYmhoCAAIKDg+nduzepqan58bK90rVqlZaWxssvv8zdd99NQEAAYWFhdOrUiV9++SXTOjy6VkYss2DBAlO4cGEzY8YMs3//ftOnTx8TEBBgfvrpJ6ujFVjNmjUzs2bNMvv27TN79uwx0dHRJiIiwvzxxx+uMa+//roJCgoyixcvNnv37jVPPfWUCQ0NNefOnXON6dGjh7ntttvM6tWrza5du0zjxo3N//t//89cvnzZNeaRRx4x1atXN19++aX58ssvTfXq1c1jjz3m1tdbUGzfvt1UrFjR1KhRw/Tp08e1XLXyDKdOnTIVKlQwXbp0Mdu2bTOHDx82a9asMT/88INrjGrlOUaOHGlKly5tVq5caQ4fPmwWLVpkAgMDzcSJE11jVC9rfPrpp2bw4MFm8eLFBjBLly7N9Li76nL58mVTvXp107hxY7Nr1y6zevVqExYWZnr16pXvfwNvca1anTlzxjRp0sQsXLjQ/Oc//zFbtmwxdevWNVFRUZnW4cm1UoNgoXvvvdf06NEj07LIyEgzcOBAixLden799VcDmA0bNhhjjHE4HCYkJMS8/vrrrjGXLl0yxYsXN++8844xxvnGL1y4sFmwYIFrzPHjx42Pj49ZtWqVMcaY/fv3G8Bs3brVNWbLli0GMP/5z3/c8dIKjPPnz5u//e1vZvXq1aZhw4auBkG18hwvv/yyqV+//lUfV608S3R0tImLi8u0rFWrVubpp582xqhenuKvHzrdWZdPP/3U+Pj4mOPHj7vGzJ8/39jtdnP27Nl8eb3eLLtm7q+2b99uANeXwJ5eKx1iZJHU1FR27txJ06ZNMy1v2rQpX375pUWpbj1nz54FoFSpUgAcPnyY5OTkTHWx2+00bNjQVZedO3eSlpaWaUxYWBjVq1d3jdmyZQvFixenbt26rjH33XcfxYsXV31z6bnnniM6OpomTZpkWq5aeY4VK1ZQp04d2rRpQ9myZalVqxYzZsxwPa5aeZb69euzdu1aDhw4AMDXX3/Npk2baN68OaB6eSp31mXLli1Ur16dsLAw15hmzZqRkpKS6dBBybmzZ89is9koUaIE4Pm18porKRc0v/32G+np6ZQrVy7T8nLlypGcnGxRqluLMYZ+/fpRv359qlevDuD622dXl59++sk1xs/Pz3UV7yvHZDw/OTmZsmXLZtlm2bJlVd9cWLBgAbt27eKrr77K8phq5Tl+/PFHpk2bRr9+/XjllVfYvn07vXv3xm6306lTJ9XKw7z88sucPXuWyMhIfH19SU9PZ9SoUbRv3x7Qe8tTubMuycnJWbZTsmRJ/Pz8VLsbcOnSJQYOHEiHDh0oVqwY4Pm1UoNgMZvNlul3Y0yWZZI/evXqxTfffMOmTZuyPHYjdfnrmOzGq745d+zYMfr06UNiYiJFihS56jjVynoOh4M6deowevRoAGrVqsW3337LtGnT6NSpk2ucauUZFi5cyNy5c/nwww+pVq0ae/bsoW/fvoSFhdG5c2fXONXLM7mrLqpd3khLS6Ndu3Y4HA6mTp163fGeUisdYmSR4OBgfH19s3R3v/76a5ZOUPLe888/z4oVK1i3bh3ly5d3LQ8JCQG4Zl1CQkJITU3l9OnT1xxz4sSJLNs9efKk6ptDO3fu5NdffyUqKopChQpRqFAhNmzYwKRJkyhUqJDr76haWS80NJSqVatmWnbXXXdx9OhRQO8rTzNgwAAGDhxIu3btuPvuu4mNjeWFF15gzJgxgOrlqdxZl5CQkCzbOX36NGlpaapdLqSlpdG2bVsOHz7M6tWrXXsPwPNrpQbBIn5+fkRFRbF69epMy1evXs39999vUaqCzxhDr169WLJkCZ9//jmVKlXK9HilSpUICQnJVJfU1FQ2bNjgqktUVBSFCxfONCYpKYl9+/a5xtSrV4+zZ8+yfft215ht27Zx9uxZ1TeHHnroIfbu3cuePXtctzp16tCxY0f27NlD5cqVVSsP8cADD2SZLvjAgQNUqFAB0PvK0/z555/4+GT+37+vr69rmlPVyzO5sy716tVj3759JCUlucYkJiZit9uJiorK19dZUGQ0BwcPHmTNmjWULl060+MeX6sbPr1ZblrGNKfvv/++2b9/v+nbt68JCAgwR44csTpagfXss8+a4sWLm/Xr15ukpCTX7c8//3SNef31103x4sXNkiVLzN69e0379u2znUaufPnyZs2aNWbXrl3mwQcfzHZqsho1apgtW7aYLVu2mLvvvlvT+92kK2cxMka18hTbt283hQoVMqNGjTIHDx408+bNM0WLFjVz5851jVGtPEfnzp3Nbbfd5prmdMmSJSY4ONi89NJLrjGqlzXOnz9vdu/ebXbv3m0A8+abb5rdu3e7Zr5xV10yps586KGHzK5du8yaNWtM+fLlNc3pFa5Vq7S0NPP444+b8uXLmz179mT6vJGSkuJahyfXSg2CxaZMmWIqVKhg/Pz8TO3atV3TbUr+ALK9zZo1yzXG4XCYYcOGmZCQEGO3202DBg3M3r17M63n4sWLplevXqZUqVLG39/fPPbYY+bo0aOZxvz++++mY8eOJigoyAQFBZmOHTua06dPu+FVFlx/bRBUK8/x73//21SvXt3Y7XYTGRlp3n333UyPq1ae49y5c6ZPnz4mIiLCFClSxFSuXNkMHjw40wcX1csa69aty/b/UZ07dzbGuLcuP/30k4mOjjb+/v6mVKlSplevXubSpUv5+fK9yrVqdfjw4at+3li3bp1rHZ5cK5sxxtz4/gcRERERESlIdA6CiIiIiIi4qEEQEREREREXNQgiIiIiIuKiBkFERERERFzUIIiIiIiIiIsaBBERERERcVGDICIiIiIiLmoQRERERETERQ2CiIgUaF26dMFms2Gz2Vi2bFmernv9+vWudbds2TJP1y0iYhU1CCIiXubKD7xX3n744Qero3msRx55hKSkJB599FHXsqs1DF26dMnxh/3777+fpKQk2rZtm0dJRUSsV8jqACIiknuPPPIIs2bNyrSsTJkyWcalpqbi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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f0, g0 = load_sweep('build/AudioIIRPassband.txt')\n", + "f1, g1 = load_sweep('build/176k_AudioIIRPassband.txt')\n", + "c0, c1 = minus6dB_cutoff(f0, g0), minus6dB_cutoff(f1, g1)\n", + "\n", + "plt.figure(figsize=(9, 5))\n", + "plt.plot(f0, 20*np.log10(g0), 'k-', label='192 kHz (-6dB %.0f Hz)' % c0)\n", + "plt.plot(f1, 20*np.log10(g1), 'r--', label='176.4 kHz (-6dB %.0f Hz)' % c1)\n", + "plt.ylim(-60, 5)\n", + "plt.grid(True, alpha=0.4)\n", + "plt.legend()\n", + "plt.xlabel('Frequency [Hz]')\n", + "plt.ylabel('Gain [dB]')\n", + "plt.title('AM audio lowpass (Fs-derived): corners nearly coincide, ratio %.4f' % (c1/c0))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "3d53d121", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "The `176k_stage_shift_summary.txt` file written by the test, plus a bar chart of\n", + "the measured ratio per stage. Every bar should now sit on the 1.0 line; the\n", + "0.91875 line marks where the CW and EQ bars used to be.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "815885a4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:20.202126Z", + "iopub.status.busy": "2026-07-28T10:57:20.201918Z", + "iopub.status.idle": "2026-07-28T10:57:20.369144Z", + "shell.execute_reply": "2026-07-28T10:57:20.368572Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('CW_audio_filter_2k0_upper_cutoff', 'fs_derived', 2064.6, 2063.7, 0.9996, 1.)\n", + " ('EQ_band13_4000_peak', 'fs_derived', 4000. , 4000. , 1. , 1.)\n", + " ('AM_audio_lowpass_corner', 'fs_derived', 4475.9, 4425.8, 0.9888, 1.)]\n" + ] + }, + { + "data": { + "image/png": "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IipPNDQ0YG9vj8TERDx8+LCs0yGi90CFChVQvXp1hQJPHSzyiIiIiMqQjo4OqlevjpycnFKfQp6I3m+amprQ0tJ65yv6LPKIiIiIyphMJoO2trbcbOFERMX1QT1CgYiIiIiIiIrGIo+IiIiIiKgcYZFHRERERERUjrDIIyIiIiIiKkdY5BEREREREZUjLPKIiIiIiIjKERZ5RERERERE5QiLPCIiIiIionKERR4REREREVE5wiKPiIiIiIioHGGRR0REREREVI6wyCMiIiIiIipHWOQRERERERGVIyzyiIiIiIiIyhEWeUREREREROUIizwiIiIiIqJyhEUeERERERFROcIij4iIiIiIqBxhkUdERERERFSOsMgjIiIiIiIqR1jkERERERERlSMs8oiIiIiIiMoRFnlERERERETlCIs8IiIiIiKicoRFHhERERERUTnCIo+IiIiIiKgcYZFHRERERERUjrDIIyIiIiIiKkdY5BEREREREZUjWupukJmZicjISMTHxyMjIwMWFhZwdnaGvb19aeRHREREREREalC5yAsLC8OyZcuwZ88eZGVlwcTEBPr6+khJSUFmZiYcHBwwYsQIjBo1ChUrVizNnImIiIiIiKgQKg3X7Nq1K3r16oWqVasiJCQEz58/x5MnT3D//n1kZGTg5s2bmDp1Ko4cOQJHR0eEhoaWdt5ERERERESkhEpFnpeXF+Lj4/HDDz+gRYsWqFChgtx6BwcHDB48GIcOHcKff/6p8sFPnjyJzp07o0qVKpDJZNizZ89btzlx4gRcXFygp6cHBwcH/PLLLwoxO3fuRN26daGrq4u6deti9+7dCjGBgYGwt7eHnp4eXFxccOrUKZXzJiIiIiIiel+pVOSNHj0aOjo6b40TQqBevXr45JNPVDp4eno6GjZsiJ9//lml+Li4OHTo0AHNmzfHhQsX8N1338HPzw87d+6UYsLDw+Hr64uBAwfi4sWLGDhwIPr06YOzZ89KMdu3b8eYMWMwZcoUXLhwAc2bN4ePjw8SEhJUyoOIiIiIiOh9JRNCCHU28Pf3x+TJkxXac3NzMWDAAGzdurV4ichk2L17N7p161ZozMSJE/HHH38gNjZWahs1ahQuXryI8PBwAICvry/S0tJw8OBBKaZ9+/aoVKmSlFvTpk3RqFEjBAUFSTF16tRBt27d4O/vr1K+aWlp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SDUqF3kzZ87E+PHjceXKFcTHx2PChAno0qULDh06VJr5ERERERERkRpUflDD1atXsXHjRgD5z3j49ttvUa1aNfTq1Qtbt25FkyZNSi1JIiIiIiIiUo3KRZ6uri6ePXsm19avXz9oaGigb9++WLRoUUnnRkRERERERGpSucj7+OOPcezYMbi4uMi1+/r6Ii8vD4MHDy7x5IiIiIiIiEg9Khd5X3zxBU6ePKl0Xb9+/QAAK1euLJmsiIiIiIiIqFhULvK6d++O7t27F7q+X79+UrFHREREREREZUPlIu91CQkJSExMhKamJuzs7GBubl7SeREREREREVExqPUw9MDAQNja2sLe3h4eHh5o2rQpLC0t0axZM0RFRZVWjkRERERERKQilYu8H374AXPnzsW4ceMQGBiIWrVqYebMmdi/fz8cHBzQokULnD9/vjRzJSIiIiIiordQebjm8uXLERwcDB8fHwBA69at4eHhgaSkJLRv3x6VKlXCd999h8OHD5daskRERERERFQ0la/kPXr0CHXq1JGWa9asidTUVDx+/BgA8NlnnyE8PLzkMyQiIiIiIiKVqXwlz9HREaGhoRg+fDgA4NixY9DR0YGVlRUAQE9PDzKZrHSyJCIiIqJis5u0v6xTIPpgxX/fsaxTUJvKRd7kyZMxYMAA/Pnnn9DT08OuXbvg5+cnFXbHjx9H/fr1Sy1RIiIiIiIiejuVh2v26dMHv//+O7S0tJCeno7FixfD399fWt+rVy/s3bu3VJIkIiIiIiIi1aj1nDwfHx9p4pU3mZmZlUhCREREREREVHxqPSevKDk5OUhISCip3REREREREVExlFiRd/XqVdjb25fU7oiIiIiIiKgYSqzIIyIiIiIiorKn8j15jRo1KnL9y5cv3zkZIiIiIiIiejcqF3kxMTHo27dvoUMyExMTcePGjRJLjIiIiIiIiNSncpFXv359NG3aFF988YXS9dHR0Vi1alWJJUZERERERETqU/mevGbNmuH69euFrq9YsSJatGhRIkkRERERERFR8ah8JW/JkiVFrq9RowaOHTv2rvkQERERERHRO+DsmkREREREROWISkWeug85f/DgQbGSISIiIiIionejUpHXuHFjDB8+HJGRkYXGpKamYtWqVahfvz527dpVYgkSERERERGR6lS6Jy8mJgb+/v5o3749tLW14erqiipVqkBPTw9Pnz5FTEwMrl69CldXVyxcuBA+Pj6lnTcREREREREpodKVPDMzM/zwww94+PAhgoKC4OjoiOTkZNy8eRMA0L9/f0RFReHMmTMs8IiIiIiIiMqQSlfyLl26hPr160NPTw89evRAjx49SjsvIiIiIiIiKgaVruQ5OzsjOTkZAODg4IAnT56UalJERERERERUPCoVeSYmJoiLiwMAxMfHIy8vr1STIiIiIiIiouJRabhmz5490bJlS1hbW0Mmk8HV1RWamppKY+/cuVOiCRIREREREZHqVCryVq5ciR49euDWrVvw8/PD8OHDUbFixdLOjYiIiIiIiNSkUpEHAO3btwcAREVF4euvvy6xIi8wMBALFy5EYmIi6tWrhyVLlqB58+aFxi9fvhw///wz4uPjUb16dUyZMgWDBg2S1rdq1QonTpxQ2K5Dhw7Yv38/AGDmzJmYNWuW3HpLS0skJSWVyDkRERERERGVFZWLvAJr164tsYNv374dY8aMQWBgIDw9PbFixQr4+PggJiYG1atXV4gPCgrC5MmTsWrVKjRu3BiRkZEYPnw4KlWqhM6dOwMAdu3ahaysLGmbJ0+eoGHDhujdu7fcvurVq4c///xTWi5s+CkREREREdGHRO0iryQtXrwYw4YNw+effw4AWLJkCUJCQhAUFAR/f3+F+I0bN2LkyJHw9fUFkD/TZ0REBBYsWCAVeaampnLbbNu2DRUqVFAo8rS0tGBlZaVyrpmZmcjMzJSW09LSVN6WiIiIiIjo36LS7JqlISsrC1FRUfDy8pJr9/LyQlhYmNJtMjMzoaenJ9emr6+PyMhIZGdnK90mODgYffv2hYGBgVz7zZs3UaVKFdjb26Nv375vnTDG398fxsbG0svGxuZtp0hERERERPSvK7MiLzk5Gbm5ubC0tJRrL+reOG9vb6xevRpRUVEQQuD8+fNYs2YNsrOzpef4vS4yMhJXrlyRrhQWaNq0KTZs2ICQkBCsWrUKSUlJ8PDwKPL5f5MnT0Zqaqr0unfvXjHOmoiIiIiIqHSpXOR99913iIyMLPEEZDKZ3LIQQqGtwLRp0+Dj4wM3Nzdoa2uja9euGDJkCADl99QFBwejfv36aNKkiVy7j48PevbsCScnJ7Rr106akGX9+vWF5qmrqwsjIyO5FxERERER0ftG5SIvMTERnTp1grW1NUaMGIH9+/fL3aOmLnNzc2hqaipctXv06JHC1b0C+vr6WLNmDTIyMhAfH4+EhATY2dmhYsWKMDc3l4vNyMjAtm3bFK7iKWNgYAAnJyfcvHmz2OdDRERERET0PlC5yFu7di3+/vtv7NixAyYmJvjmm29gbm6OHj16YN26dUqHSxZFR0cHLi4uCA0NlWsPDQ2Fh4dHkdtqa2ujWrVq0NTUxLZt29CpUydoaMifyo4dO5CZmYkBAwa8NZfMzEzExsbC2tparXMgIiIiIiJ636h1T55MJkPz5s0REBCAa9euITIyEm5ubli1ahWqVq2KFi1a4IcffsCDBw9U2t+4ceOwevVqrFmzBrGxsRg7diwSEhIwatQoAPn3wb3+DLwbN25g06ZNuHnzJiIjI9G3b19cuXIF8+fPV9h3cHAwunXrBjMzM4V148ePx4kTJxAXF4ezZ8+iV69eSEtLw+DBg9V5O4iIiIiIiN477/QIhTp16qBOnTqYMGECHj9+jD/++AN//PEHgPxC6m18fX3x5MkTzJ49G4mJiahfvz4OHDgAW1tbAPlDRBMSEqT43NxcLFq0CNevX4e2tjZat26NsLAw2NnZye33xo0bOH36NA4fPqz0uPfv30e/fv2QnJwMCwsLuLm5ISIiQjouERERERHRh0omhBBlncSHKC0tDcbGxkhNTX2vJmGxm7S/rFMg+mDFf9+xrFMoUewPiIqP/QERFXif+gNVa5Aye4QCERERERERlTwWeUREREREROUIizwiIiIiIqJyhEUeERERERFROaL27JqZmZmIjIxEfHw8MjIyYGFhAWdnZ9jb25dGfkRERERERKQGlYu8sLAwLFu2DHv27EFWVhZMTEygr6+PlJQUZGZmwsHBASNGjMCoUaNQsWLF0syZiIiIiIiICqHScM2uXbuiV69eqFq1KkJCQvD8+XM8efIE9+/fR0ZGBm7evImpU6fiyJEjcHR0RGhoaGnnTUREREREREqodCXPy8sLv/76K3R0dJSud3BwgIODAwYPHoyrV6/i4cOHJZokERERERERqUalIm/06NEq7UwIgXr16qFevXrvlBQREREREREVj9qza/r7+yttz83NxaeffvrOCREREREREVHxqV3kLVmyBCtXrpRry83NRd++fREdHV1SeREREREREVExqP0IhQMHDqBdu3YwMTFBnz59kJ2dDV9fX1y7dg3Hjh0rjRyJiIiIiIhIRWoXeS4uLti9eze6du0KXV1dBAcH4/bt2zh27BgsLS1LI0ciIiIiIiJSkdrDNQGgVatW2LhxI3r16oX4+HicOHGCBR4REREREdF7QKUreT169FDabmFhARMTE4wYMUJq27VrV8lkRkRERERERGpTqcgzNjZW2u7t7V2iyRAREREREdG7UanIW7t2bWnnQURERERERCWgWPfkve748eN4+fJlSeRCRERERERE7+idizwvLy/Ex8eXQCpERERERET0rlR+hEKjRo2Utufk5KBnz57Q09MDAPz1118lkxkRERERERGpTeUi7/Lly2jXrh3c3NykNiEELl68iNatW6Ny5cqlkiARERERERGpTuUi7/jx4xg8eDCaNGmCGTNmQEMjf6TnvHnzMHr0aNStW7fUkiQiIiIiIiLVqHxPnqenJ/766y/cuHED7u7uuH37dmnmRURERERERMWg1sQrRkZG2Lp1K0aNGoVmzZph5cqVkMlkpZUbERERERERqUnl4ZqvGzp0KJo1a4b+/fsjJyenpHMiIiIiIiKiYipWkQcANWvWREREBJ4/fw4jI6OSzImIiIiIiIiKqdhFHgBoaGjA2Ni4pHIhIiIiIiKid/TOD0MvMHjwYLRp06akdkdERERERETF8E5X8l5XtWpV6bEKREREREREVDZKrMibP39+Se2KiIiIiIiIiomX3oiIiIiIiMoRlYu8CxcuIC4uTlretGkTPD09YWNjg2bNmmHbtm2lkiARERERERGpTuUib9iwYYiPjwcArF69GiNGjICrqyumTJmCxo0bY/jw4VizZk1p5UlEREREREQqUPmevOvXr6NGjRoAgMDAQCxZsgQjRoyQ1jdu3Bjz5s3DZ599VvJZEhERERERkUpUvpKnr6+Px48fAwAePHiApk2byq1v2rSp3HBOVQUGBsLe3h56enpwcXHBqVOnioxfvnw56tSpA319fdSqVQsbNmyQW79u3TrIZDKF16tXr97puERERERERB8ClYs8Hx8fBAUFAQBatmyJ3377TW79jh078NFHH6l18O3bt2PMmDGYMmUKLly4gObNm8PHxwcJCQlK44OCgjB58mTMnDkTV69exaxZszB69Gjs3btXLs7IyAiJiYlyLz09vWIfl4iIiIiI6EOh8nDNBQsWwNPTEy1btoSrqysWLVqE48ePo06dOrh+/ToiIiKwe/dutQ6+ePFiDBs2DJ9//jkAYMmSJQgJCUFQUBD8/f0V4jdu3IiRI0fC19cXAODg4ICIiAgsWLAAnTt3luJkMhmsrKxK7LhEREREREQfCpWv5FWpUgUXLlyAu7s7Dh06BCEEIiMjcfjwYVSrVg1nzpxBhw4dVD5wVlYWoqKi4OXlJdfu5eWFsLAwpdtkZmbKXZED8oeRRkZGIjs7W2p78eIFbG1tUa1aNXTq1AkXLlx4p+MWHDstLU3uRURERERE9L5R6zl5JiYm+P7773H16lW8fPkSmZmZiI+Px+bNm+Hq6qrWgZOTk5GbmwtLS0u5dktLSyQlJSndxtvbG6tXr0ZUVBSEEDh//jzWrFmD7OxsJCcnAwBq166NdevW4Y8//sDWrVuhp6cHT09P3Lx5s9jHBQB/f38YGxtLLxsbG7XOl4iIiIiI6N9Q5g9Dl8lkcstCCIW2AtOmTYOPjw/c3Nygra2Nrl27YsiQIQAATU1NAICbmxsGDBiAhg0bonnz5tixYwccHR2xbNmyYh8XACZPnozU1FTpde/ePXVPlYiIiIiIqNSpXOR17twZGzduxMuXL0vkwObm5tDU1FS4evbo0SOFq2wF9PX1sWbNGmRkZCA+Ph4JCQmws7NDxYoVYW5urnQbDQ0NNG7cWLqSV5zjAoCuri6MjIzkXkRERERERO8blYu8/fv347PPPoO1tTW++OILREVFvdOBdXR04OLigtDQULn20NBQeHh4FLmttrY2qlWrBk1NTWzbtg2dOnWChobyUxFCIDo6GtbW1u98XCIiIiIiovedyrNrAsDFixdx+PBhrFmzBitXrkT9+vUxfPhw9O/fH5UqVVL74OPGjcPAgQPh6uoKd3d3rFy5EgkJCRg1ahSA/CGSDx48kJ6Fd+PGDURGRqJp06Z4+vQpFi9ejCtXrmD9+vXSPmfNmgU3NzfUrFkTaWlpWLp0KaKjo7F8+XKVj0tERERERPShUqvIMzc3x5gxYzBmzBhERkYiODgYU6dOxYQJE9CtWzd8/vnnaNOmjcr78/X1xZMnTzB79mwkJiaifv36OHDgAGxtbQEAiYmJcs+uy83NxaJFi3D9+nVoa2ujdevWCAsLg52dnRTz7NkzjBgxAklJSTA2NoazszNOnjyJJk2aqHxcIiIiIiKiD5VMCCFUCdTQ0EBSUhIqV64s1/7y5Uts374dwcHBCAsLQ25ubqkk+r5JS0uDsbExUlNT36v78+wm7S/rFIg+WPHfdyzrFEoU+wOi4mN/QEQF3qf+QNUa5J1n19TX18eQIUNw6tQpXLt27V13R0RERERERO9A5SKvZcuW0NHRKTKmZs2a75wQERERERERFZ/K9+QdO3asNPMgIiIiIiKiElDmD0MnIiIiIiKiklNiRV5sbCwcHBxKandERERERERUDCVW5GVlZeHu3bsltTsiIiIiIiIqBpXvyRs3blyR6x8/fvzOyRAREREREdG7UbnI++mnn/Dxxx8X+jyGFy9elFhSREREREREVDwqF3k1a9bE2LFjMWDAAKXro6Oj4eLiUmKJERERERERkfpUvifPxcUFUVFRha6XyWQQQpRIUkRERERERFQ8Kl/JW7RoETIzMwtd37BhQ+Tl5ZVIUkRERERERFQ8Khd5VlZWpZkHERERERERlYBSeRg6h20SERERERGVDZWKvDp16mDLli3IysoqMu7mzZv44osvsGDBghJJjoiIiIiIiNSj0nDN5cuXY+LEiRg9ejS8vLzg6uqKKlWqQE9PD0+fPkVMTAxOnz6NmJgYfPXVV/jyyy9LO28iIiIiIiJSQqUir02bNjh37hzCwsKwfft2bNmyBfHx8Xj58iXMzc3h7OyMQYMGYcCAATAxMSnllImIiIiIiKgwKk+8AgAeHh7w8PAorVyIiIiIiIjoHal0T56pqSmSk5MBAJ999hmeP39eqkkRERERERFR8ahU5GVlZSEtLQ0AsH79erx69apUkyIiIiIiIqLiUWm4pru7O7p16wYXFxcIIeDn5wd9fX2lsWvWrCnRBImIiIiIiEh1KhV5mzZtwo8//ojbt29DJpMhNTWVV/OIiIiIiIjeQyoVeZaWlvj+++8BAPb29ti4cSPMzMxKNTEiIiIiIiJSn1qzawJAXFxcaeRBREREREREJUCliVeIiIiIiIjow8Aij4iIiIiIqBxhkUdERERERFSOsMgjIiIiIiIqR1SaeKXgQeiqMDIyKnYyRERERERE9G5UKvJMTEwgk8lU2mFubu47JURERERERETFp1KRd+zYMenf8fHxmDRpEoYMGQJ3d3cAQHh4ONavXw9/f//SyZKIiIiIiIhUolKR17JlS+nfs2fPxuLFi9GvXz+prUuXLnBycsLK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Hg0bNiyxxIiIiIiIiEh9ahd5H3/8MWQyGd6cr8XNzQ1r1qwpscSIiIiIiIhIfWoXeXFxcXLLGhoasLCwgJ6eqpMcEBERERERUWlRu8iztbVVaHv27BmLPCIiIiIioveA2hOvLFiwANu3b5eW+/TpA1NTU1StWhUXL14s0eSIiIiIiIhIPWoXeStWrICNjQ0AIDQ0FKGhoTh06BB8fHzw7bfflniCREREREREpDq1h2smJiZKRd6+ffvQp08feHl5wc7ODk2bNi3xBImIiIiIiEh1al/Jq1SpEu7duwcAOHToENq1awcg/1EKubmqPYGdiIiIiIiISofaV/J69OiBTz/9FDVr1sSTJ0/g4+MDAIiOjsZHH31U4gkSERERERGR6tQu8n788UfY2dnh3r17CAgIgKGhIYD8YZxffvlliSdIREREREREqlO7yNPW1sb48eMV2seMGVMS+RAREREREdE7ULvIKxATE4OEhARkZWXJtXfp0uWdkyIiIiIiIqLiUbvIu3PnDrp3747Lly9DJpNBCAEAkMlkAMDJV4iIiIiIiMqQ2rNrfv3117C3t8fff/+NChUq4OrVqzh58iRcXV1x/PjxUkiRiIiIiIiIVKX2lbzw8HAcPXoUFhYW0NDQgIaGBpo1awZ/f3/4+fnhwoULpZEnERERERERqUDtK3m5ubnSjJrm5uZ4+PAhAMDW1hbXr18v2eyIiIiIiIhILWpfyatfvz4uXboEBwcHNG3aFAEBAdDR0cHKlSvh4OBQGjkSERERERGRitQu8qZOnYr09HQAwNy5c9GpUyc0b94cZmZm2L59e4knSERERERERKpTu8jz9vaW/u3g4ICYmBikpKSgUqVK0gybREREREREVDbUvievwK1btxASEoKXL1/C1NS0JHMiIiIiIiKiYlK7yHvy5Anatm0LR0dHdOjQAYmJiQCAzz//HN98802JJ0hERERERESqU7vIGzt2LLS1tZGQkIAKFSpI7b6+vjh06FCJJkdERERERETqUfuevMOHDyMkJATVqlWTa69Zsybu3r1bYokRERERERGR+tS+kpeeni53Ba9AcnIydHV1SyQpIiIiIiIiKh61i7wWLVpgw4YN0rJMJkNeXh4WLlyI1q1bl2hyREREREREpB61h2suXLgQrVq1wvnz55GVlYUJEybg6tWrSElJwZkzZ0ojRyIiIiIiIlKR2lfy6tati0uXLqFJkyb45JNPkJ6ejh49euDChQuoUaOG2gkEBgbC3t4eenp6cHFxwalTp4qMX758OerUqQN9fX3UqlVL7qpigZ07d6Ju3brQ1dVF3bp1sXv37nc+LhERERER0YdA7St5AGBlZYVZs2a988G3b9+OMWPGIDAwEJ6enlixYgV8fHwQExOD6tWrK8QHBQVh8uTJWLVqFRo3bozIyEgMHz4clSpVQufOnQEA4eHh8PX1xZw5c9C9e3fs3r0bffr0wenTp9G0adNiHZeIiIiIiOhDIRNCCHU3evXqFS5duoRHjx4hLy9Pbl2XLl1U3k/Tpk3RqFEjBAUFSW116tRBt27d4O/vrxDv4eEBT09PLFy4UGobM2YMzp8/j9OnTwPIf5RDWloaDh48KMW0b98elSpVwtatW4t1XADIzMxEZmamtJyWlgYbGxukpqbCyMhI5XMubXaT9pd1CkQfrPjvO5Z1CiWK/QFR8bE/IKIC71N/kJaWBmNj47fWIGpfyTt06BAGDRqE5ORkhXUymQy5ubkq7ScrKwtRUVGYNGmSXLuXlxfCwsKUbpOZmQk9PT25Nn19fURGRiI7Oxva2toIDw/H2LFj5WK8vb2xZMmSYh8XAPz9/Uvk6iUREREREVFpUvuevK+++gq9e/dGYmIi8vLy5F6qFnhA/iMXcnNzYWlpKdduaWmJpKQkpdt4e3tj9erViIqKghAC58+fx5o1a5CdnS0VnUlJSUXuszjHBYDJkycjNTVVet27d0/lcyUiIiIiIvq3qH0l79GjRxg3bpxCkVRcMplMblkIodBWYNq0aUhKSoKbmxuEELC0tMSQIUMQEBAATU1NtfapznEBQFdXl88BJCIiIiKi957aV/J69eqF48ePv/OBzc3NoampqXD17NGjR4UWkPr6+lizZg0yMjIQHx+PhIQE2NnZoWLFijA3NweQPylMUfssznGJiIiIiIg+FGpfyfv555/Ru3dvnDp1Ck5OTtDW1pZb7+fnp9J+dHR04OLigtDQUHTv3l1qDw0NRdeuXYvcVltbG9WqVQMAbNu2DZ06dYKGRn696u7ujtDQULn78g4fPgwPD493Pi4REREREdH7Tu0ib8uWLQgJCYG+vj6OHz8uN8RRJpOpXOQBwLhx4zBw4EC4urrC3d0dK1euREJCAkaNGgUg/z64Bw8eSM/Cu3HjBiIjI9G0aVM8ffoUixcvxpUrV7B+/Xppn19//TVatGiBBQsWoGvXrvj999/x559/SrNvqnJcIiIiIiKiD5XaRd7UqVMxe/ZsTJo0Sbp6Vly+vr548uQJZs+ejcTERNSvXx8HDhyAra0tACAxMREJCQlSfG5uLhYtWoTr169DW1sbrVu3RlhYGOzs7KQYDw8PbNu2DVOnTsW0adNQo0YNbN++XXpGnirHJSIiIiIi+lCp/Zw8U1NTnDt3DjVq1CitnD4Iqj6j4t/G5+AQFd/79BycksD+gKj42B8QUYH3qT9QtQZR+1Lc4MGDsX379ndKjoiIiIiIiEqH2sM1c3NzERAQgJCQEDRo0EBh4pXFixeXWHJERERERESkHrWLvMuXL8PZ2RkAcOXKFbl1RT1njoiIiIiIiEqf2kXesWPHSiMPIiIiIiIiKgHvNj0mERERERERvVdY5BEREREREZUjLPKIiIiIiIjKERZ5RERERERE5QiLPCIiIiIionKERR4REREREVE5wiKPiIiIiIioHGGRR0REREREVI6wyCMiIiIiIipHWOQRERERERGVIyzyiIiIiIiIyhEWeUREREREROUIizwiIiIiIqJyhEUeERERERFROcIij4iIiIiIqBxhkUdERERERFSOsMgjIiIiIiIqR1jkERERERERlSMs8oiIiIiIiMoRFnlERERERETlCIs8IiIiIiKicoRFHhERERERUTnCIo+IiIiIiKgcYZFHRERERERUjrDIIyIiIiIiKkdY5BEREREREZUjLPKIiIiIiIjKERZ5RERERERE5QiLPCIiIiIionKERR4REREREVE5UuZFXmBgIOzt7aGnpwcXFxecOnWqyPjNmzejYcOGqFChAqytrTF06FA8efJEWt+qVSvIZDKFV8eOHaWYmTNnKqy3srIqtXMkIiIiIiL6t5Rpkbd9+3aMGTMGU6ZMwYULF9C8eXP4+PggISFBafzp06cxaNAgDBs2DFevXsWvv/6Kc+fO4fPPP5didu3ahcTEROl15coVaGpqonfv3nL7qlevnlzc5cuXS/VciYiIiIiI/g1lWuQtXrwYw4YNw+eff446depgyZIlsLGxQVBQkNL4iIgI2NnZwc/PD/b29mjWrBlGjhyJ8+fPSzGmpqawsrKSXqGhoahQoYJCkaelpSUXZ2FhUarnSkRERERE9G8osyIvKysLUVFR8PLykmv38vJCWFiY0m08PDxw//59HDhwAEII/P333/jtt9/khmK+KTg4GH379oWBgYFc+82bN1GlShXY29ujb9++uHPnTpH5ZmZmIi0tTe5FRERERET0vimzIi85ORm5ubmwtLSUa7e0tERSUpLSbTw8PLB582b4+vpCR0cHVlZWMDExwbJly5TGR0ZG4sqVK3LDOQGgadOm2LBhA0JCQrBq1SokJSXBw8ND7t6+N/n7+8PY2Fh62djYqHnGREREREREpa/MJ16RyWRyy0IIhbYCMTEx8PPzw/Tp0xEVFYVDhw4hLi4Oo0aNUhofHByM+vXro0mTJnLtPj4+6NmzJ5ycnNCuXTvs378fALB+/fpC85w8eTJSU1Ol171799Q5TSIiIiIion+FVlkd2NzcHJqamgpX7R49eqRwda+Av78/PD098e233wIAGjRoAAMDAzRv3hxz586FtbW1FJuRkYFt27Zh9uzZb83FwMAATk5OuHnzZqExurq60NXVVeXUiIiIiIiIykyZXcnT0dGBi4sLQkND5dpDQ0Ph4eGhdJuMjAxoaMinrKmpCSD/CuDrduzYgczMTAwYMOCtuWRmZiI2NlauSCQiIiIiIvoQlelwzXHjxmH16tVYs2YNYmNjMXbsWCQkJEjDLydPnoxBgwZJ8Z07d8auXbsQFBSEO3fu4MyZM/Dz80OTJk1QpUoVuX0HBwejW7duMDMzUzju+PHjceLECcTFxeHs2bPo1asX0tLSMHjw4NI9YSIiIiIiolJWZsM1AcDX1xdPnjzB7NmzkZiYiPr16+PAgQOwtbUFACQmJso9M2/IkCF4/vw5fv75Z3zzzTcwMTFBmzZtsGDBArn93rhxA6dPn8bhw4eVHvf+/fvo168fkpOTYWFhATc3N0REREjHJSIiIiIi+lDJxJvjHEklaWlpMDY2RmpqKoyMjMo6HYndpP1lnQLRByv++8Ifx/IhYn9AVHzsD4iowPvUH6hag5T57JpERERERERUcljkERERERERlSMs8oiIiIiIiMoRFnlERERERETlCIs8IiIiIiKicoRFHhERERERUTnCIo+IiIiIiKgcYZFHRERERERUjrDIIyIiIiIiKkdY5BEREREREZUjLPKIiIiIiIjKERZ5RERERERE5QiLPCIiIiIionKERR4REREREVE5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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "rows = np.genfromtxt('build/176k_stage_shift_summary.txt', delimiter=',',\n", + " names=True, dtype=None, encoding='utf-8')\n", + "print(rows)\n", + "\n", + "labels = [r['stage'] for r in rows]\n", + "measured = np.array([r['measured_ratio'] for r in rows])\n", + "types = [r['type'] for r in rows]\n", + "bar_colors = ['tab:orange' if t == 'hardcoded' else 'tab:blue' for t in types]\n", + "\n", + "plt.figure(figsize=(9, 5))\n", + "x = np.arange(len(labels))\n", + "plt.bar(x, measured, color=bar_colors)\n", + "plt.axhline(RATE_RATIO, color='tab:orange', ls='--', label='hard-coded expected (%.4f)' % RATE_RATIO)\n", + "plt.axhline(1.0, color='tab:blue', ls='--', label='Fs-derived expected (1.0)')\n", + "plt.xticks(x, labels, rotation=20, ha='right', fontsize=8)\n", + "plt.ylim(0.85, 1.05)\n", + "plt.ylabel('measured f(176.4k) / f(192k)')\n", + "plt.title('Stage frequency shift: 176.4 kHz relative to 192 kHz')\n", + "plt.legend()\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "896b46dd", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "* **CW audio filters** and **EQ bands** now hold their frequencies across the\n", + " rate change. Their coefficients are regenerated from an analog design spec\n", + " whenever the sample rate changes, so the ratio reads 1.00 instead of 0.91875.\n", + "* **The AM audio lowpass** behaves as it always did \u2014 it was Fs-derived from the\n", + " start.\n", + "\n", + "The remaining cells check the other half of the question: that regenerating\n", + "these filters reproduced what the frozen tables actually did.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d0082790", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "393c9a78", + "metadata": {}, + "source": [ + "---\n", + "\n", + "# Generated filters vs the tables they replace\n", + "\n", + "`FilterDesign_test.cpp` sweeps each stage twice at 192 kHz \u2014 once with the\n", + "generated coefficients, once with the original frozen table from\n", + "`reference_filters.cpp` \u2014 and writes both curves. If the redesign was faithful,\n", + "the pairs overlie each other and the difference traces sit on zero.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f5dbea61", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:20.373287Z", + "iopub.status.busy": "2026-07-28T10:57:20.373027Z", + "iopub.status.idle": "2026-07-28T10:57:20.380023Z", + "shell.execute_reply": "2026-07-28T10:57:20.379456Z" + } + }, + "outputs": [], + "source": [ + "def load_pair(stem):\n", + " \"\"\"Load the generated and reference sweeps for one stage.\n", + "\n", + " FilterDesign_test writes gain already in dB, unlike the linear-gain sweeps\n", + " the ReceiveChain176k tests produce.\n", + " \"\"\"\n", + " fg, gg = load_sweep('build/filtercmp_%s_gen.txt' % stem)\n", + " fr, gr = load_sweep('build/filtercmp_%s_ref.txt' % stem)\n", + " return fg, gg, fr, gr\n", + "\n", + "\n", + "def plot_generated_vs_reference(stems, labels, title, cmap, floor_dB=-90):\n", + " fig, (ax, axd) = plt.subplots(2, 1, figsize=(11, 8), sharex=False,\n", + " gridspec_kw={'height_ratios': [3, 1]})\n", + " colors = cmap(np.linspace(0, 0.85, len(stems)))\n", + " worst = 0.0\n", + " for stem, label, c in zip(stems, labels, colors):\n", + " fg, gg, fr, gr = load_pair(stem)\n", + " ax.plot(fg, gg, color=c, lw=1.6, label='%s generated' % label)\n", + " ax.plot(fr, gr, color=c, lw=1.0, ls='--', label='%s frozen' % label)\n", + " keep = gr > floor_dB\n", + " diff = gg[keep] - gr[keep]\n", + " axd.plot(fg[keep], diff, color=c, lw=1.2)\n", + " worst = max(worst, np.max(np.abs(diff)))\n", + "\n", + " ax.set_title('%s (worst difference %.4f dB)' % (title, worst))\n", + " ax.set_ylabel('gain (dB)')\n", + " ax.set_ylim(floor_dB, 5)\n", + " ax.grid(alpha=0.3)\n", + " ax.legend(fontsize=7, ncol=2)\n", + " axd.axhline(0, color='k', lw=0.8)\n", + " axd.set_xlabel('frequency (Hz)')\n", + " axd.set_ylabel('generated\\n- frozen (dB)')\n", + " axd.grid(alpha=0.3)\n", + " plt.tight_layout()\n", + " plt.show()\n", + " return worst\n" + ] + }, + { + "cell_type": "markdown", + "id": "5b1e5244", + "metadata": {}, + "source": [ + "## CW audio filters: generated vs frozen\n", + "\n", + "The frozen tables are 12-pole Chebyshev type I with 0.02 dB ripple. The\n", + "generator places the same poles in closed form from the ripple edge, so the two\n", + "should agree to a few thousandths of a decibel.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "3d09644c", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:20.382462Z", + "iopub.status.busy": "2026-07-28T10:57:20.382236Z", + "iopub.status.idle": "2026-07-28T10:57:20.748421Z", + "shell.execute_reply": "2026-07-28T10:57:20.747374Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABEoAAAMWCAYAAADmrWPiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3wUdf748dfsbnohnZAEEjoCCaEjNcEoSkcBgVMOFRWVoyi2UxD4yfm1naigiAXLWUBUkColBkVQivTeElIgCQFSSdnd+f2xZGXZVCBMNr6fj8vJzn5m5r0zn93Zee+nKKqqqgghhBBCCCGEEEIIdFoHIIQQQgghhBBCCFFbSKJECCGEEEIIIYQQ4jJJlAghhBBCCCGEEEJcJokSIYQQQgghhBBCiMskUSKEEEIIIYQQQghxmSRKhBBCCCGEEEIIIS6TRIkQQgghhBBCCCHEZZIoEUIIIYQQQgghhLhMEiVCCCGEEEIIIYQQl0miRAhxXfbu3csDDzxA48aNcXV1xdPTkw4dOvDaa69x/vx5AAYOHIiXlxdGo9Fm3V27dqEoCg0aNLDb7q+//oqiKLzzzjs35XVU5tNPP0VRFBITE63LYmJiiImJuaH7efHFF2nUqBEGgwEfH59y96MoCjNnzrQ+PnjwIDNnzrSJz5FUN/7c3FyeeeYZ7rjjDgIDA+2Ox5VUVeWdd96hVatWuLi40KBBAx577DEuXLhgU+7o0aNMmzaNjh074uPjg5+fHz169GDp0qVViqm0juzYsaPCcjNnzkRRFM6dO1fm823btr3h9ervavXq1eXWi+tVE+//a5GYmMiAAQPw8/NDURSmTJmidUg31ezZs2ndujVms1nrUKrkq6++Yu7cude9nYiICMaNG2d9nJCQgKIoJCQk2JR79913adasGc7OziiKwsWLF4GyrzV/ZydPnuTuu+/Gx8cHT09Pbr/9dv78888qr//nn38SFxeHp6cnPj4+3H333Zw8edKmTHWuMSkpKUyZMoU+ffrg4+ODoih8+umn5e4/Pz+fGTNm0KJFC1xcXPD39yc2NpZjx45V+TVcKTEx0W6fpdeu0j+dTkeDBg3o378/v/32m91rdXZ2rtYxFKK2kUSJEOKaffjhh3Ts2JHt27fz9NNPs3btWn744QdGjBjBggULeOihhwCIjY0lLy/P7gYyISEBDw8Pzp49y+HDh+2eK123tnrvvfd47733btj2li9fzpw5cxg7diybNm1iw4YNVd7PwYMHmTVrlkMnSqoTf1ZWFgsXLqSoqIihQ4dWWHbatGlMnTqVIUOGsHLlSp577jm++uorbr/9dkpKSqzl1q1bx6pVq7jnnnv49ttv+fLLL2nevDkjRoxg9uzZ1/HqhFZWr17NrFmztA6jRk2dOpU//viDTz75hK1btzJ16lStQ7pp0tLSeO2115g9ezY6nWN8pb1RiZKrdejQga1bt9KhQwfrst27dzNp0iRiY2OJj49n69ateHl5lXut+bvKzMykV69eHD16lE8++YQlS5ZQWFhITEwMR44cqXT9w4cPExMTQ3FxMUuWLOGTTz7h6NGj9OrVi8zMTGu56lxjjh8/zpdffomzszP9+/evcP95eXnExMTw8ccf869//Yt169axaNEiunbtSkFBwbUdlAqsXbuWrVu3snnzZt566y3Onj1LTEyMTVKkRYsW/OMf//hbfR6JOkgVQohrsGXLFlWv16t33nmnWlhYaPd8UVGRunz5clVVVXXnzp0qoL7yyis2ZQYPHqyOGTNGbdCggfree+/ZPNe3b181ICBANZvNNfciqmHRokUqoJ46darG9vHyyy+rgJqenl5pWUB96aWXrI+//fZbFVB//vnnGxpTfn7+Dd1eeaobv9lsttaNzMxMu+NRKiUlRdXr9eq//vUvm+VfffWVCqgLFy60LsvMzCyzvg0YMEB1d3cvs55fqbSObN++vcJyL730kgqomZmZZT7fpk0btU+fPhVu4++quvXxiSeeUGvqq06fPn1qxXlq1qyZetddd1Varri4WC0pKbkJEd08zzzzjBoaGqqaTCZN4ygoKKjytWrAgAFqeHj4de8zPDxc/ec//1lhmf/9738qoP7xxx82y6tzramqm3WtqAlPP/206uTkpCYmJlqXZWdnqwEBAerIkSMrXX/EiBFqQECAmp2dbV2WmJioOjk5qc8884x1WXWuMVfW6e3bt6uAumjRojL3P3nyZNXDw0M9ceJEpbFW1alTp+z2Wd6168SJEyqgPv/88zbLd+zYoQLqb7/9dsPiEuJmcoz0uxCi1vnPf/6DoigsXLgQFxcXu+ednZ0ZPHgwANHR0fj6+to0CTabzfz666/ExMTQp08ffv75Z+tzxcXFbN26lZiYGBRFqTCOWbNm0bVrV/z8/PD29qZDhw58/PHHqKpqU668rhlXN18G+P333+nRoweurq6EhITw/PPP27Q8KFVW0/vz58/z+OOPExoairOzM02aNOGFF16gqKiowtcRERHBiy++CED9+vVt4q2sif+nn37KiBEjAEsLnNJmsVc2md2wYQO33XYb3t7euLu706NHDzZu3GizndJmtX/++SfDhw/H19eXpk2bApZmyaNGjSIkJAQXFxfq16/Pbbfdxu7duyt8XTt27GDUqFFERETg5uZGREQEo0ePJikpqVrxX620TGV+//13TCaT3S9yAwcOBOC7776zLgsICChzm126dKGgoMDalaw6zpw5Q8eOHWnevPk1N4EeN26cTXPnK/+utVvJgQMHuOOOO3B3dycwMJAnnniCVatWldl0vzp158CBA4wePZp69epRv359HnzwQbKzs23KqqrKe++9R3R0NG5ubvj6+jJ8+HC7ZuoxMTG0bduWX375he7du+Pu7s6DDz4IwOLFi7njjjto0KABbm5u3HLLLTz33HPk5+fbHLf58+cD2Byz0lZLVY1DVVVee+01wsPDcXV1pUOHDqxZs6ZKx7l9+/b06tXLbrnJZCI0NJS7777buuz999+nXbt2eHp64uXlRatWrfj3v/9d7rZLu1ocP36cNWvW2Ly+0ue++OILnnrqKUJDQ3FxceH48eMAfPLJJ7Rr1w5XV1f8/PwYNmwYhw4dsm67tNl9eX9XutH1o6qKi4v5+OOPGTNmjE1rks6dOzNgwACbspGRkSiKwvbt263Lvv/+exRFYd++fdZlmzdv5rbbbsPLywt3d3e6d+/OqlWrbLZV2sVu3bp1PPjggwQGBuLu7k5RURGZmZk88sgjNGzYEBcXFwIDA+nRo4e1xUZMTAyrVq0iKSmp3ON5tZKSEp555hmCg4Nxd3enZ8+ebNu2za7c1V1vYmJiuO+++wDo2rUriqIwbty4Cq81YHlv3XrrrXh4eODp6Um/fv3YtWuXzb7GjRuHp6cn+/bt44477sDLy4vbbrvNel5efvlla1fHwMBAHnjgAZuWFWC55g0cOJC1a9fSoUMH3NzcaNWqFZ988onda0tNTbUeV2dnZ0JCQhg+fDjp6enWMjk5OUybNo3GjRvj7OxMaGgoU6ZMsflMKM8PP/xA3759CQ8Pty7z9vbm7rvvZsWKFXbdhq9kNBpZuXIl99xzD97e3tbl4eHhxMbG8sMPP1iXVecaU9UWUgUFBXz00UeMGDGCJk2aVGmdq6WlpTFy5Ei8vLyoV68e9957L2fPnq3y+vXq1QPAycnJZnnHjh255ZZbWLBgwTXFJYTWJFEihKg2k8lEfHw8HTt2pGHDhpWW1+l09O7dm82bN1u/cOzevZsLFy7Qp08f+vTpw6ZNm6zlf//9dy5dulSlbjeJiYk8+uijLFmyhO+//567776bf/3rX/y///f/rum1HTx4kNtuu42LFy/y6aefsmDBAnbt2sXLL79c6bqFhYXExsby+eef8+STT7Jq1Sruu+8+XnvtNZsborL88MMP1q5Kpc1ax48fX6WYBwwYwH/+8x8A5s+fz9atW9m6dav1ZuF///sfd9xxB97e3nz22WcsWbIEPz8/+vXrZ3dDA3D33XfTrFkzvv32W+sXnP79+7Nz505ee+011q9fz/vvv0/79u2t/d3Lk5iYSMuWLZk7dy4//fQTr776KmfOnKFz587WMToqi/96FBcXA9gl85ycnFAUhb1791a6jZ9//pnAwECCgoKqte/9+/fTtWtXXFxc2Lp1K82bN7d53mQyYTQa7f6uNn36dOsxKf0rvQFq3bq1tVxVEotgSd706dOHI0eO8P777/P555+Tm5vLxIkT7cpWt+7cc889tGjRgu+++87axenqptePPvooU6ZMIS4ujmXLlvHee+9x4MABunfvbnPjUxrrfffdx5gxY1i9ejWPP/44AMeOHaN///58/PHHrF27lilTprBkyRIGDRpkc9yGDx8OYHPsSsdEqmocs2bN4tlnn+X2229n2bJlPPbYYzz88MNVapL/wAMPsHnzZrsk2bp160hLS+OBBx4A4JtvvuHxxx+nT58+/PDDDyxbtoypU6dWeJNX2tUiODiYHj162L0+gOeff57Tp0+zYMECVqxYQVBQEK+88goPPfQQbdq04fvvv+ftt99m79693HrrrdY4GzRoYFfnfvzxR7y9vbnlllus26+J+lFVf/zxB1lZWXbXibi4OH755Rdrcjs9PZ39+/fj5ubG+vXrreU2bNhA/fr1iYyMBGDTpk307duX7OxsPv74Y77++mu8vLwYNGgQixcvttv/gw8+iJOTE1988QVLly7FycmJ+++/n2XLljFjxgzWrVvHRx99RFxcHFlZWYClG2WPHj0I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eixYsID8/Hy7AUzXrVvH0KFD6dmzJ8uWLSvzJroyfn5+bNiwgVtuuYXY2Fh+//3364o7Ozubu+66C0VRWL16td2vuNXVp08f9u/fbzc44zfffGPzuCbqzsCBA1FVldTU1DK3VzqwZkVKb9CuPjcffPCBXdny6lVV4+jWrRuurq58+eWXNutv2bLFpntARUq7byxbtoxff/2VHTt2WGfvKYuHhwd33XUXL7zwAsXFxRw4cKBK+6mKW2+9FTc3N/73v//ZLE9JSSE+Pt7mM+rjjz9m1qxZzJ49266rDtRM/aiOVq1aAZbBNK8WFxeH0Whk+vTphIWFWcvGxcWxYcMGa5fNUh4eHnTt2pXvv//epq6YzWb+97//ERYWRosWLaoVX6NGjZg4cSK33367zefk1S0mKlI629nV9W/JkiVV6mZXHf369cNgMHDixIlyz2dlBg4cSFZWFiaTqcz1W7ZsWe247rrrLn7++ecKB08eOHAgJ06cwN/fv8z9VpbQHDZsGPHx8SQnJ1uX5ebm8v333zN48OAKuzkZDAYGDRrE999/T25urnX56dOn+fnnn+0Gcr8R15grNWjQgFtvvZXffvuNnJwc6/KCggI2bdpUbhKzVGxsLLm5ufz44482y7/66qsqx2Aymdi3bx8uLi5216eTJ0+i0+mu6dwLoTVpUSKEuCa33nor77//Po8//jgdO3bkscceo02bNpSUlLBr1y4WLlxI27ZtbWahKE1+/PDDD3a/5Ldt2xZ/f39++OEHQkND7WYIKcuAAQP473//y5gxY3jkkUfIysrijTfeKPOLx/3338/06dOZMWMGffr04eDBg8ybN886rV2pF198kR9//JG+ffsyY8YM3N3dmT9/fpWmGBw7dizz58/nn//8J4mJiURGRrJ582b+85//0L9/f5sv5jda27ZtAVi4cCFeXl64urrSuHFj/P39effdd/nnP//J+fPnGT58OEFBQWRmZrJnzx4yMzN5//33K9z23r17mThxIiNGjKB58+Y4OzsTHx/P3r17bVqKXM3b29s6PkhAQAARERFs2rSJjz/+2K4pckXxl2fNmjXk5+dbv5wePHiQpUuXApZZetzd3QH48MMPAcsvfxcvXmTNmjV8/PHH/Oc//6FDhw7W7W3evJmhQ4cSHBzMv//9b7upj1u3bl3lJIWXlxdr1661Nq3+8ccfq5T8K8uYMWM4ePAgCxcuJDk52ebLfFhYmLVF12233camTZsqvYGaMmUKn3zyCXfddRezZ8+mfv36fPXVVxw+fBj4q4m9p6fnddedq/Xo0YNHHnmEBx54gB07dtC7d288PDw4c+YMmzdvJjIykscee6zCbXTv3h1fX18mTJjASy+9hJOTE19++SV79uyxK1ua8Hj11Ve566670Ov1REVFVTkOX19fpk2bxssvv8z48eMZMWIEycnJzJw5s1pdKR588EFeffVVxowZg5ubm92YRw8//DBubm706NGDBg0acPbsWV555RXq1atXbleIa+Hj48P06dP597//zdixYxk9ejRZWVnMmjULV1dXXnrpJcAylsmECRPo0aMHt99+u12yr1u3bjVSP6qjNInw+++/2/2q3rFjR3x9fVm3bp11ZiGwJEpKx2y4+vP4lVde4fbbbyc2NpZp06bh7OzMe++9x/79+/n6668r7RqRnZ1NbGwsY8aMoVWrVnh5ebF9+3br50CpyMhIvv/+e95//306duyITqcrNwlxyy23cN999zF37lycnJyIi4tj//79vPHGG9edML1aREQEs2fP5oUXXuDkyZPceeed+Pr6kp6ezrZt2/Dw8GDWrFkVbmPUqFF8+eWX9O/fn8mTJ9OlSxecnJxISUnh559/ZsiQIXZdMyoze/Zs1qxZQ+/evfn3v/9NZGQkFy9eZO3atTz55JO0atWKKVOm8N1339G7d2+mTp1KVFQUZrOZ06dPs27dOp566im6du1a7j6mTZvGF198wYABA5g9ezYuLi783//9H4WFhXZTsDdr1gzAOtU2WGbG6ty5MwMHDuS5556jsLCQGTNmEBAQwFNPPWUtV91rTOn1rHTWnR07dljH0LnyO9Qbb7xBbGws/fr149lnn0VRFN58803OnTtX6RglY8eO5a233mLs2LHMmTOH5s2bs3r1an766ady19m5c6f1u1N6ejqffPIJhw8fZurUqXatZ37//Xeio6Px9fWtMA4haiXNhpEVQtQJu3fvVv/5z3+qjRo1Up2dnVUPDw+1ffv26owZM9SMjAy78sHBwSqgzps3z+65oUOHqoD6j3/8o8r7/+STT9SWLVuqLi4uapMmTdRXXnlF/fjjj+1mqCkqKlKfeeYZtWHDhqqbm5vap08fdffu3Xaz3qiqZRT7bt26qS4uLmpwcLD69NNPqwsXLqx01htVVdWsrCx1woQJaoMGDVSDwaCGh4erzz//vFpYWFjpa7meWW9U1TKzUOPGjVW9Xm83Wv2mTZvUAQMGqH5+fqqTk5MaGhqqDhgwQP32228r3X96ero6btw4tVWrVqqHh4fq6empRkVFqW+99ZZqNBorfE0pKSnqPffco/r6+qpeXl7qnXfeqe7fv7/M415R/GUJDw8vd9aYK8/TBx98oN5yyy2qu7u76unpqfbq1UtdtmyZ3fYqm42mshl5ypphoqioSL3nnntUV1dXddWqVTb7ufo4l2rTpo3N+a7odV5ZB0pniamK/fv3q3Fxcaqrq6vq5+enPvTQQ+pnn31mN2uMql5f3Sk9JleeD1W1vG+7du2qenh4qG5ubmrTpk3VsWPHqjt27LB5PW3atCkz/i1btqi33nqr6u7urgYGBqrjx49X//zzT7t6U1RUpI4fP14NDAxUFUWxi6UqcZjNZvWVV15RGzZsqDo7O6tRUVHqihUrynxfVqR79+7lfr599tlnamxsrFq/fn3V2dlZDQkJUUeOHKnu3bu30u1WNOvNlefoSh999JEaFRWlOjs7q/Xq1VOHDBliMwtS6Xkr7+9KNVE/qqpXr152M/iUGjZsmAqoX375pXVZcXGx6uHhoep0OvXChQt26/z6669q3759rfWhW7du6ooVK8qM+eoZVgoLC9UJEyaoUVFRqre3t+rm5qa2bNlSfemll9T8/HxrufPnz6vDhw9XfXx8rHWyIkVFRepTTz2lBgUFqa6urmq3bt3UrVu32n2GXu+sN6WWLVumxsbGqt7e3qqLi4saHh6uDh8+XN2wYYO1zD//+U/Vw8OjzHhLSkrUN954Q23Xrp3q6uqqenp6qq1atVIfffRR9dixY9ZyZdVbVS37epecnKw++OCDanBwsOrk5GR9f6Snp1vL5OXlqS+++KLasmVLa72OjIxUp06dajczUlmOHz+uDh06VPX29lbd3d3V2267Td25c6ddufDw8DJnLdqxY4d62223qe7u7qq3t7c6dOhQ9fjx4zZlqnuNqep7UFUtdbdPnz6qu7u76u7urvbt21f97bffKn3dqvrXddrT01P18vJS77nnHnXLli1VmvXGz89P7dq1q/rJJ5+oJpPJZru5ubmqu7u73exiQjgKRVVlYmshhBDi7+6RRx7h66+/Jisrq0a7TAhxo3z33Xfce++9JCUl2YzhIYTQ3scff8zkyZNJTk6WFiXCIUmiRAghhPibmT17NiEhITRp0oS8vDxWrlzJRx99xIsvvsjs2bO1Dk+IKlFVle7du9OxY0fmzZundThCiMuMRiOtW7fmn//8Jy+88ILW4QhxTWSMEiGEEOJvxsnJiddff52UlBSMRiPNmzfnv//9L5MnT9Y6NCGqTFEUPvzwQ3788UfMZnOlM3wIIW6O5ORk7rvvPpsxWoRwNNKiRAghhBBCCCGEEOIySb0LIYQQQgghhBBCXCaJEiGEEEIIIYQQQojLJFEihBBCCCGEEEIIcZkM5uogzGYzaWlpeHl5oSiK1uEIIYQQQgghhBAORVVVcnNzCQkJqXAQcEmUOIi0tDQaNmyodRhCCCGEEEIIIYRDS05OJiwsrNznJVHiILy8vADLCfX29q6x/ZjNZjIzMwkMDJRp9kSdInVb1EVSr0VdJPVa1EVSr0Vd5Ij1Oicnh4YNG1rvr8sjiRIHUdrdxtvbu8YTJYWFhXh7eztMZReiKqRui7pI6rWoi6Rei7pI6rWoixy5Xlc2nIVjvRohhBBCCCGEEEKIGiQtSoQQQgghhBB1hslkoqSkROswbJjNZkpKSigsLHS4X96FKE9tr9dOTk7o9fprWlcSJUIIIYQQQog6IS8vj5SUFFRV1ToUG6qqYjabyc3NlRksRZ1R2+u1oiiEhYXh6elZ7XUlUSKEEEIIIYRweCaTiZSUFNzd3QkMDKxVN26qqmI0GjEYDLUqLiGuR22u16qqkpmZSUpKCs2bN692yxJJlAghhBBCCCEcXklJCaqqEhgYiJubm9bh2KjNN5RCXKvaXq8DAwNJTEykpKSk2omS2teRSAghhBBCCCGuUW28YRNC3HzX81kgiRIhhBBCCCGEuAFWrlxJy5Ytad68OR999FGZZb755hsiIyNp27Yto0aNoqioyK5MTEwM+/fvt1seEBBg83jatGl8+umnNyT2myUxMZElS5ZUe72IiAjy8vJqIKKbZ9iwYfj6+jJ8+PByy8TGxtKuXTvatGnD7NmzyyxTE/Xj0KFDtGvXjujoaLKysqq0Tl0miRIhhBBCCCGEuE5Go5Enn3yS+Ph4/vzzT1599VXOnz9vU0ZVVZ588kkSEhKsN7rff/+9FuHWKJPJVO5z15ooqQsmTZrE559/XmGZ5cuXs2fPHvbu3cuaNWvYtWvXTYlt+fLljB49mt27d+Pv729dXtG5rMskUSKEEEIIIYQQ12nbtm20adOG0NBQvLy86N+/Pz/99JNdOVVVKSgowGQyUVBQQIMGDcrdZnFxMUOGDOHDDz+scN9paWlER0cTHR1NVFRUmV0Ojh49SqdOnejWrRtPPfUUnTp1AiwzBY0dO5bOnTvTqVMnfvvtNwBmzpzJ+PHj6d27N02aNOGbb76xbmvOnDl07tyZqKgoFixYAEBCQgJ33HEHI0eOJDY2lpycHPr27UuHDh1o3749mzdvBuCFF15gw4YNREdHs2jRIoxGI5MnT6ZLly5ER0ezbNkyAPLz8xk2bBjR0dE88sgjtW4mo2sRGxuLl5dXhWW8vb0By7kvLi6usPvIjaofGzZsYO7cucybN4/Bgwfbnctz584xaNAgoqKiiImJITExEYD27dvTqVMn2rdvj8FgICkpifT0dIYOHUqnTp3o2bMnhw8fBmDcuHFMnjyZbt260bx5czZt2lTZ4dKUDOYqhBBCCCGEqDNMRhOZKTXTdcAv2Ae9oexBIdPS0ggNDbU+DgsLIzU11aaMoijMmzePtm3b4uLiQlxcHDExMWVur7i4mBEjRjBw4EAefvhhAC5evEh0dLTNPl977TVCQkLYvXs3ANOnTycuLs5ue1OmTOHFF19k6NChvPDCC9blL7/8MsOGDePzzz8nJSWFAQMGsGfPHgBOnTpFfHw8SUlJ9OvXj1GjRrF27VoyMjLYvn07xcXF9OzZk4EDBwLwxx9/cOjQIUJCQigpKWH58uV4eXlx+vRp7rnnHrZv386cOXOYN28eS5cuBWDBggVERETw9ttvk5OTQ9euXbnrrruYP38+DRs25IcffmD16tWVJgPqku7du7Nv3z4ef/xxm/N9pRtZP+Li4pgwYQIBAQFMnDiRhIQEm3M5ceJEevXqxYoVK1i8eDGTJk3ixx9/ZNeuXRiNRj777DPWrFlDeHg4o0ePZvr06XTs2JHt27czZcoU1q5da43v999/Jz4+ntmzZ7Nx48YbfuxuFEmUCCGEEEIIIeqMC2ezeaDF5BrZ9lenFxAY5l/mc2W1eLj6l/uSkhIWLlzIvn37CA0N5b777uN///sf9913n92648aN45FHHrHeBAP4+PhYb3jBMgbFldauXUtCQgLx8fF229u5cydDhgwBYNSoUdbWLuvXr2f16tXMmjULgKysLIqLiwHo378/BoOBpk2bcvHiRWv5FStWWFsEZGdnc+LECQB69OhBSEiI9Xg888wzbN68Gb1ez7Fjx8o8buvXr+fAgQN89tlngKUlSWpqKlu2bOGZZ56xxuHr61vm+tcjIzePzNx8m2X13FwJ861HUYmR45n2Cbc2IfUBOHnuPJeKS6zLA708CPLyvCFxbdmyhdzcXIYPH87+/ftp27atXZkbXT+uduW53Lx5M6tXrwZg5MiRTJ781/trz549vPPOO9YWQ/Hx8Rw6dKjMbQ4ePBiAjh07Wlul1FaSKBFCCCGEEEKI6xQaGmrTgiQlJYWuXbvalNm9ezcGg4FGjRoBcPfdd/Pzzz+XmSjp3r0769evZ8KECRgMld+2nT59mqlTp7JhwwacnJwqLHtlUkdVVVauXGmN6UouLi5lrjtz5kzGjh1rszwhIQF3d3fr4y+//JL8/Hx27dqFXq+3ee7q7S1cuJDevXvbLa/pGYwW79jH/ITfbZYNimrF6/fcxdmcPO754Cu7dQ7PmgrA8z+sY0/KGevyJ2K68a/YW29YbF5eXvTt25c1a9aUmSipyfoBlHu+4K8EYHZ2Ng888ABffPGFtcsQWJJyZU3HW1qf9Hp9rR/7RBIlQgghhBBCiDrDN7geX51eUCPb9gv2Kfe5Ll26sH//flJTU/H29mb16tXMmDHDpkxoaCh79+7lwoUL+Pr6snHjRm655ZYytzdx4kSWLFnC+PHjWbRoUaVjVYwaNYp33nnHpvvPlTp06MCKFSsYPHgw3377rXV5XFwc8+fP59VXXwUsLQTatWtX7r7i4uJ49dVXGTFiBG5ubhw5coTw8HC7cjk5OdSvXx+DwcC3335LYWEhYEkA5Obm2mxvwYIF9OjRA71ez+7du4mOjqZHjx4sXryYW2+9lbVr13LhwoVyY7pW93aKpG/LJjbL6rm5AhDs7cl3j44pd91Xht1h16LkeuXk5FBYWEhQUBBFRUWsW7eOKVOmlFn2RtePivTs2ZOvvvqKadOmsXTpUrp06QLAQw89xKRJk2zqS58+ffjggw94/PHHMZvNHDhwgMjIyGrvU2uSKBFCCCGEEELUGXqDvtzuMTXJYDDw5ptvEhsbi9ls5plnnrHOHjJgwADef/99GjVqxHPPPUf37t0xGAy0bduWRx99tNxtzp49myeeeIJp06bx5ptvlltu69at7N69m6efftq67MouGABvvfUW//jHP/jPf/5D7969rS0AZsyYwb/+9S8iIyMxmUzcdtttvPvuu+Xuq3///uzfv58uXbqgqipBQUGsWLHCrtyYMWMYMGAAXbp0oWfPntZjERUVRUlJCdHR0UyePJlHH32UkydPEh0djaqqtGjRgu+//54nnniC++67j+joaPr06VNmi5frFeTlWW53GRcng7WbTVmaBPhVe3/9+vXjzz//JD8/n7CwMH744Qc6d+5M//79+eijjzCZTAwbNozi4mLMZjP33HMPgwYNKnd7N7J+VGTmzJmMGzeOzz//HD8/Pz799FOSkpJYvnw5x48fZ/78+QCsXr2ad999lwkTJrBgwQKMRiNjx451yESJotaF4YP/BnJycqhXrx7Z2dk2zZpuNLPZTEZGBkFBQeh0MimSqDukbou6SOq1qIukXotrVVhYyKlTp2jcuDGurq5ah2NDVVWMRiMGg6HGu5OUp6CgADc3NxRF4fXXXyc9PZ033nhDk1hE3VAb6nVFyvpMqOp9tbQoEUIIIYQQQog6btu2bUyZMgWTyURYWBiff/651iEJUWtJokQIIYQQQggh6riYmJhqdbcQ4u9M2jMKIYQQQgghhBBCXCaJEiGEEEIIIYQQQojLJFFyE7333nvWgWQ6duzIr7/+qnVIQgghhBBCCCGEuIIkSm6SxYsXM2XKFF544QV27dpFr169uOuuuzh9+rTWoQkhhBBCCCGEEOIySZTcJP/973956KGHGD9+PLfccgtz586lYcOGvP/++1qHJoQQQgghhLgBVq5cScuWLWnevDkfffRRmWW++eYbIiMjadu2LaNGjaKoqMiuTExMDPv377dbHhAQYPN42rRpfPrpp1WK7dChQ7Rr147o6GiysrKqtI64sYYNG4avry/Dhw8vt4xW9aO2SExMZMmSJdVeLyIigry8vBsWh8x6cxMUFxezc+dOnnvuOZvld9xxB1u2bNEoqpr1wpI3OOd8CEVnRlVAUVQUQFUVFHSoqCh6k3W5ogAKmE06FEWHTm9E0amAZV0ATDpUVY+imNDrTTb7U1Uwm5xRVBWdoQRU23hMRgOgQ1FKrNtTVctc36pZh6oaQDWju7xdFcXyvKqgmg2oKKAYbdcDVLMeBR1m1QyKiqqqgGLZvVlB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Qkkzp9fr0b9/f6SkpHitT0lJwZAhQ/wUFTUmNpsN+/fvR1xcHJKSkhAbG+uVL3a7HWvWrFHzpX///tDpdF5tMjIysGfPHuZUC1FfeZKcnAyLxYItW7aobTZv3gyLxcJcaiHy8vJw8uRJxMXFAWDetERCCMyaNQvfffcdfvvtNyQlJXlt5+cNVedCeVMdft5QdYQQsNls/Kyhqhp06ljyi6VLlwqdTic++ugjsW/fPjFnzhwRFBQkjh8/7u/QyA8efPBBsXr1anHs2DGxadMmMX78eGEymdR8eOGFF4TZbBbfffed2L17t7j55ptFXFycsFqt6j5mzpwpWrduLVauXCl27NghRo4cKXr37i2cTqe/TovqWVFRkdi5c6fYuXOnACBeffVVsXPnTnHixAkhRP3lyZgxY0SvXr3Exo0bxcaNG0XPnj3F+PHjG/x8qX6cL2+KiorEgw8+KDZs2CDS0tLEqlWrRHJysmjVqhXzpgX761//Ksxms1i9erXIyMhQH6WlpWobft7QuS6UN/y8oerMnz9frF27VqSlpYldu3aJv//970KWZbFixQohBD9ryBsLJS3E22+/LRITE4Verxf9+vXzun0atSxTpkwRcXFxQqfTifj4eDF58mSxd+9edbuiKOLJJ58UsbGxwmAwiGHDhondu3d77aOsrEzMmjVLhIeHi4CAADF+/HiRnp7e0KdCl9CqVasEgCqP6dOnCyHqL0/y8vLELbfcIkwmkzCZTOKWW24RBQUFDXSWVN/OlzelpaVi9OjRIioqSuh0OtGmTRsxffr0KjnBvGlZqssXAOLjjz9W2/Dzhs51obzh5w1V54477lC/D0VFRYmrrrpKLZIIwc8a8iYJIUTDjV8hIiIiIiIiImq8OEcJEREREREREZEHCyVERERERERERB4slBARERERERERebBQQkRERERERETkwUIJEREREREREZEHCyVERERERERERB4slBARERERERERebBQQkRERERERETkwUIJERER+Z0QAnfffTfCw8MhSRJSU1P9HVKjZbfb0aFDB6xfv75e9/vTTz+hb9++UBSlXvdLRETU1LBQQkRERH63fPlyfPLJJ/jpp5+QkZGBHj16+DukRuv9999HYmIihg4dqq6TJAnff/99lba33XYbrr/++lrtd/z48ZAkCV9++WU9RUpERNQ0sVBCREREfnf06FHExcVhyJAhiI2NhVarrdLGbrf7IbLG56233sJdd911SfZ9++2346233rok+yYiImoqWCghIiIiv7rttttw//33Iz09HZIkoW3btgCAESNGYNasWZg3bx4iIyMxatQoAMC+ffswbtw4BAcHIyYmBtOmTUNubq66v5KSEtx6660IDg5GXFwcXnnlFYwYMQJz5sxR21Q3AiM0NBSffPKJunz69GlMmTIFYWFhiIiIwMSJE3H8+HGvuK+//nr885//RFxcHCIiInDffffB4XCobWw2Gx5++GEkJCTAYDCgY8eO+OijjyCEQIcOHfDPf/7TK4Y9e/ZAlmUcPXq02vdqx44dOHLkCK699to6vMNux48fhyRJVR4jRoxQ20yYMAFbtmzBsWPH6rx/IiKi5oKFEiIiIvKrN954A08//TRat26NjIwMbN26Vd326aefQqvVYv369XjvvfeQkZGB4cOHo0+fPti2bRuWL1+OrKws3HjjjWqfv/3tb1i1ahWWLVuGFStWYPXq1di+fXudYiotLcWVV16J4OBgrF27FuvWrUNwcDDGjBnjNbJl1apVOHr0KFatWoVPP/0Un3zyiVex5dZbb8XSpUvx5ptvYv/+/Xj33XcRHBwMSZJwxx134OOPP/Y67r/+9S9cccUVaN++fbVxrV27Fp06dUJISEidzgcAEhISkJGRoT527tyJiIgIDBs2TG2TmJiI6Oho/P7773XePxERUXNRdVwrERERUQMym80wmUzQaDSIjY312tahQwe89NJL6vI//vEP9OvXD88//7y67l//+hcSEhJw6NAhxMfH46OPPsJnn32mjkD59NNP0bp16zrFtHTpUsiyjA8//BCSJAEAPv74Y4SGhmL16tUYPXo0ACAsLAyLFi2CRqNBly5dcO211+LXX3/FjBkzcOjQIfz73/9GSkoKrr76agBAu3bt1GPcfvvt+Mc//oEtW7Zg4MCBcDgcWLJkCV5++eUa4zp+/Dji4+Or3XbzzTdDo9F4rbPZbOrok8rvb3l5Oa6//nokJydjwYIFXn1atWrlNXKGiIiopWGhhIiIiBqtAQMGeC1v374dq1atQnBwcJW2R48eRVlZGex2O5KTk9X14eHh6Ny5c52Ou337dhw5cgQmk8lrfXl5uddlMd27d/cqTsTFxWH37t0AgNTUVGg0GgwfPrzaY8TFxeHaa6/Fv/71LwwcOBA//fQTysvL8ec//7nGuMrKymA0Gqvd9tprr6kFmQqPPPIIXC5XlbZ33nknioqKkJKSAln2HmAcEBCA0tLSGmMgIiJq7lgoISIiokYrKCjIa1lRFFx33XV48cUXq7SNi4vD4cOHa7VfSZIghPBaV3luEUVR0L9/f3zxxRdV+kZFRamvdTpdlf1W3F43ICDggnHcddddmDZtGl577TV8/PHHmDJlCgIDA2tsHxkZqRZizhUbG4sOHTp4rTOZTCgsLPRa9+yzz2L58uXYsmVLlUIQAOTn53udIxERUUvDQgkRERE1Gf369cO3336Ltm3bVntnnA4dOkCn02HTpk1o06YNAKCgoACHDh3yGtkRFRWFjIwMdfnw4cNeoyj69euHr7/+GtHR0T7NBwIAPXv2hKIoWLNmTZWRHhXGjRuHoKAgLF68GL/88gvWrl173n327dsXixcvhhBCvSSoLr799ls8/fTT+OWXX6qdB6VixEzfvn3rvG8iIqLmgpO5EhERUZNx3333IT8/HzfffLN6d5YVK1bgjjvugMvlQnBwMO6880787W9/w6+//oo9e/bgtttuq3J5yciRI7Fo0SLs2LED27Ztw8yZM71Gh9xyyy2IjIzExIkT8fvvvyMtLQ1r1qzB7NmzcerUqVrF2rZtW0yfPh133HEHvv/+e6SlpWH16tX497//rbbRaDS47bbbMH/+fHTo0MHrkqHqXHnllSgpKcHevXvr8K657dmzB7feeiseeeQRdO/eHZmZmcjMzER+fr7aZtOmTTAYDBeMg4iIqDljoYSIiIiajPj4eKxfvx4ulwvXXHMNevTogdmzZ8NsNqvFkJdffhnDhg3DhAkTcPXVV+Pyyy9H//79vfbzyiuvICEhAcOGDcPUqVPx0EMPeV3yEhgYiLVr16JNmzaYPHkyunbtijvuuANlZWV1GmGyePFi3HDDDbj33nvRpUsXzJgxAyUlJV5t7rzzTtjtdtxxxx0X3F9ERAQmT55c7SVBF7Jt2zaUlpbi2WefRVxcnPqYPHmy2uarr77CLbfcct7Lf4iIiJo7SZx7gS4RERFRMzNixAj06dMHr7/+ur9DqWL9+vUYMWIETp06hZiYmAu23717N66++upqJ5u9GDk5OejSpQu2bduGpKSketsvERFRU8MRJURERER+YLPZcOTIETzxxBO48cYba1UkAdxzn7z00kv1fgvftLQ0vPPOOyySEBFRi8fJXImIiIj84KuvvsKdd96JPn364PPPP69T3+nTp9d7PAMHDsTAgQPrfb9ERERNDS+9ISIiIiIiIqL/b9+OaQAAAAAE9W/tYwyI4Saz3gAAAABMKAEAAACYUAIAAAAwoQQAAABgQgkAAADAhBIAAACACSUAAAAAE0oAAAAAJpQAAAAALB5SgzRvAKe4AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "worst CW departure from the frozen Chebyshev: 0.0216 dB (test allows 0.05)\n" + ] + } + ], + "source": [ + "cw_labels = ['0.8 kHz', '1.0 kHz', '1.3 kHz', '1.8 kHz', '2.0 kHz']\n", + "worst = plot_generated_vs_reference(\n", + " ['cw_band_%d' % b for b in range(5)],\n", + " cw_labels,\n", + " 'CW audio filters at 192 kHz: generated vs frozen',\n", + " plt.cm.viridis)\n", + "print('worst CW departure from the frozen Chebyshev: %.4f dB (test allows 0.05)' % worst)\n" + ] + }, + { + "cell_type": "markdown", + "id": "6d4662c5", + "metadata": {}, + "source": [ + "## EQ cells: generated vs frozen\n", + "\n", + "Each cell's analog prototype is recovered from the frozen table by an exact\n", + "inverse bilinear transform, so agreement here should be at the level of float32\n", + "rounding.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "598e6c1a", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:20.751201Z", + "iopub.status.busy": "2026-07-28T10:57:20.750938Z", + "iopub.status.idle": "2026-07-28T10:57:21.256020Z", + "shell.execute_reply": "2026-07-28T10:57:21.255129Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABEEAAAMWCAYAAAAeTZgVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydZ3gUVReA39ndbHovJCFA6D0ECF26dFBAUEDpoAgIfIogShexUMRCUVGaCihSBaWDCig1gPTeCSG9bbLlfj8mWbJkExIIRb3v8+SBuXPLmdk75Z45RRFCCCQSiUQikUgkEolEIpFI/uVoHrcAEolEIpFIJBKJRCKRSCSPAqkEkUgkEolEIpFIJBKJRPKfQCpBJBKJRCKRSCQSiUQikfwnkEoQiUQikUgkEolEIpFIJP8JpBJEIpFIJBKJRCKRSCQSyX8CqQSRSCQSiUQikUgkEolE8p9AKkEkEolEIpFIJBKJRCKR/CeQShCJRCKRSCQSiUQikUgk/wmkEkQikUgkEolEIpFIJBLJfwKpBJFIJA/EwoULURQl178dO3Y8bhEB6NOnD6GhoTZloaGh9OnT57HI87B5Uo536tSprF69Ot/1Fy9eTLdu3ShfvjwajSbHMWRn7969tGrVCnd3d9zc3GjatCm7du2yqWM2m5k5cyatW7cmJCQEFxcXKlasyFtvvUV8fHy+ZFIUhaFDh+ZZ5+LFiyiKwvTp0+3unz59OoqicPHixXyNKcmd69evM3HiRCIjIwu976z72ZPwO40dO5bixYuj0+nw8vJ63OI8Us6dO4ejoyN79ux53KLki+PHjzNx4sQHnjcTJ05EURSbMnv37UOHDtG4cWM8PT1RFIVZs2YBsHXrViIiInB1dUVRlALde/+NGI1GJk2aRGhoKI6OjlSoUIHPPvss3+2Tk5MZMWIEwcHBODk5ER4ezrJly+zWPXjwIE8//TRubm54eXnRuXNnzp8/n6PerFmz6Ny5MyVLlkRRFJo0aZLr+Bs3bqRBgwY4Ozvj6elJhw4dOHbsWL7lt0eTJk1sxsx6dmX/8/DwoFq1asyaNQuz2WzTvlGjRowYMeKBZJBIngR0j1sAiUTy72DBggVUqFAhR3mlSpUegzT5Y9WqVXh4eDxuMf7VTJ06lS5dutCxY8d81V+yZAk3b96kdu3aWCwWjEaj3Xr79u2jUaNG1K5dmyVLliCE4KOPPqJ58+Zs376devXqAZCWlsbEiRPp3r07AwYMwM/Pj4MHDzJlyhTWrVvH/v37cXZ2LqzDlTwCrl+/bl3YhIeHP25xHgpr1qzhvffe45133qFNmzY4Ojo+bpEeKSNHjqRFixbW6/hJ5/jx40yaNIkmTZrkqbi9H+w9p/r160dKSgrLli3D29ub0NBQhBA8//zzlCtXjrVr1+Lq6kr58uULVZZ/GoMHD2bJkiW8++671KpVi40bNzJ8+HCSkpJ4++2379m+c+fO7Nu3jw8++IBy5crx/fff0717dywWCz169LDWO3nyJE2aNCE8PJwffvgBg8HA+PHjadiwIZGRkfj7+1vrzps3D1dXV5o1a8a6detyHXvNmjV06tSJZ599lp9++omEhAQmTZpEw4YN2bdvH6VLl36wk3MXr732mvWY4uPjWbt2Lf/73/+4cuUKM2bMsNZ79913adGiBa+++up/fn5J/tlIJYhEIikUqlSpQkRExOMWo0BUr179kY5nNBpRFAWdTt56c2Pjxo1oNKqRYvv27fn777/t1hs3bhxeXl78+uuvuLi4APD0009TqlQpRo4cabUIcXZ25sKFC/j6+lrbNmnShOLFi9O1a1d++uknXnrppYd8VJK8SEtLw8nJKccX8P8yWfN+2LBhBAQE5Fk3LS3tX6XIO3HiBKtXr+bXX399rHIIITAYDI/93Np7Tv39998MHDiQNm3aWMuuXbtGbGwsnTp1onnz5oUy9j/5mXXs2DG+/vpr3nvvPd58801AvffHxMQwZcoUBg0ahI+PT67tN2zYwObNm62KD4CmTZty6dIl3nzzTV544QW0Wi0A48ePx9HRkZ9//tmqsKpZsyZly5Zl+vTpfPjhh9Z+jx8/bn3GValSJdfxR48eTdWqVVm5cqX13li/fn3KlSvH+PHj+e677x7g7OSkePHi1K1b17rdunVr/v77b5YuXWqjBGncuDHly5dnxowZfPnll4Uqg0TyKJHuMBKJ5JGRmJjIwIED8fX1xc3NjdatW3P69GkURWHixInWevZcOcC+qfDs2bNp1KgRAQEBuLq6UrVqVT766KNcLQiyc7eZscViYcqUKZQvXx5nZ2e8vLwICwvjk08+sWl35swZevToQUBAAI6OjlSsWJHZs2fb1NmxYweKorBkyRLeeOMNihYtiqOjI2fPns1VnvT0dCZPnkzFihVxcnLC19eXpk2bsnv3bmsdIQRz5swhPDwcZ2dnvL296dKli12z23uR3+O9G4PBwBtvvEF4eDienp74+PhQr1491qxZY1NPURRSUlJYtGiR1cw2L9NfwPpyeC927dpFkyZNrAoQAHd3dxo1asTu3bu5ceMGAFqt1kYBkkXt2rUBuHLlSr7Gy44QgrfffhsHBwe++uqrAreHO/PD3t/9fklOT0/njTfeIDAwEBcXFxo1asSBAwfsmtPfvHmTV155hZCQEPR6PSVLlmTSpEmYTCZrnewuPjNnzqRkyZK4ublRr149/vzzzxzj79+/n2eeeQYfHx+cnJyoXr06P/zwg02dLHeTTZs20a9fP/z9/XFxcSE9PZ2zZ8/St29fypYti4uLC0WLFqVDhw4cPXrU5rzVqlULgL59+1rPWfb7R37kAPjzzz9p0KABTk5OBAcHM2bMmHzdN2bNmoWiKHav5dGjR6PX67l9+zagui20b9/eeq8IDg6mXbt2XL16Ndf+Q0NDGTt2LABFihSxOb7Q0FDat2/PypUrqV69Ok5OTkyaNAlQF8bPPvss3t7eVtP9RYsW2fTdpEmTXOfdwoULrfUexvzIL3PnziUwMJAWLVpYy2bPno1Go+HWrVvWshkzZqAoCkOGDLGWWSwWvL29eeONN6xlsbGxDB48mKJFi6LX6ylVqhTvvPMO6enpNuNmub3NmzePihUr4ujoaD1/c+fOpVq1ari5ueHu7k6FChWslgQLFy6ka9eugLpItnc+7bF+/XrCw8NxdHSkZMmSubrSZb9+s64fk8nE3LlzbeZ/SEgIoM7Bu+8jhfHM2rJlC82bN8fDwwMXFxcaNGjA1q1bbfrIekYfO3aM7t274+npSZEiRejXrx8JCQk2dS0WC5999pn1Webl5UXdunVZu3atTb3ly5dTr149XF1dcXNzo1WrVhw6dCjPcwuwevVqhBD07dvXprxv376kpaXdU8m2atUq3NzcrL9t9vbXr1/nr7/+AsBkMvHzzz/z3HPP2VjslChRgqZNm7Jq1Sqb9vl5xsXExHDq1CnatGlj885TokQJqlSpwurVq3O4qdxNlnVkiRIlcHJyokaNGvzyyy/3HDs7np6eODg45Cjv2bMn33//PUlJSQXqTyJ5kvjnqXYlEskTidlstnlBBvWlMutLiRCCjh07snv3bsaPH0+tWrXYtWuXzZes++HcuXP06NGDkiVLotfrOXz4MO+99x4nT57km2++KVBfH330ERMnTmTs2LE0atQIo9HIyZMnbWJHHD9+nPr161O8eHFmzJhBYGAgGzduZNiwYdy+fZsJEybY9DlmzBjq1avHvHnz0Gg0uX7VNZlMtGnTht9//50RI0bQrFkzTCYTf/75J5cvX6Z+/foAvPLKKyxcuJBhw4bx4YcfEhsby+TJk6lfvz6HDx+mSJEihXq89khPTyc2NpaRI0dStGhRMjIy2LJlC507d2bBggX06tULgD179tCsWTOaNm3KuHHjAArN/SgjI8Oui0BW2dGjRwkKCsq1/bZt2wCoXLlygcZNT0+nT58+rF+/nnXr1tG6dWub/RaLJcd1kFWenRo1auSId3DmzBn69+9vI9PChQvp27cvCxYsuGc8l759+7J8+XJGjRpFs2bNOH78OJ06dSIxMdGmXpa7kUajYfz48ZQuXZo9e/YwZcoULl68yIIFC2zqz549mwoVKljjDowbN462bdty4cIFPD09Adi+fTutW7emTp06zJs3D09PT5YtW8YLL7xAampqDtn79etHu3btWLJkCSkpKTg4OHD9+nV8fX354IMP8Pf3JzY2lkWLFlGnTh0OHTpE+fLlqVGjBgsWLKBv376MHTuWdu3aAVgXgPmV4/jx4zRv3pzQ0FAWLlyIi4sLc+bM4fvvv8/zHAO89NJLjB49moULFzJlyhRrudls5ttvv6VDhw74+fmRkpJCixYtKFmyJLNnz6ZIkSLcvHmT7du357l4WLVqFbNnz+brr7/m119/xdPT03p8oMYeOHHiBGPHjqVkyZK4urpy6tQp6tevT0BAAJ9++im+vr58++239OnTh6ioKEaNGgXAnDlzcsyHcePGsX37dqtp+8OYHwVh/fr1NGrUyGax+PTTTyOEYOvWrdav8lu2bMHZ2ZnNmzdb6+3fv5/4+HiefvppQFXYNm3alHPnzjFp0iTCwsL4/fffef/994mMjGT9+vU2Y69evZrff/+d8ePHExgYSEBAAMuWLWPw4MG89tprTJ8+HY1Gw9mzZzl+/DgA7dq1Y+rUqbz99tvMnj2bGjVqAOTprrB161aeffZZ6tWrx7JlyzCbzXz00UdERUXleW7atWvHnj17qFevHl26dLEqe0JCQqhWrRqdO3e2ujVk3QsL45n17bff0qtXL5599lkWLVqEg4MDX3zxBa1atWLjxo05LE+ee+45XnjhBfr378/Ro0cZM2YMgM0zuU+fPnz77bf079+fyZMno9frOXjwoE1clalTpzJ27Fjr9Z6RkcG0adNo2LAhe/fuzdPd9u+//8bf35/AwECb8rCwMOv+vPj777+pWLFiDiuY7O3r16/PuXPnSEtLs5bfXXfz5s0YDAacnJzyHC87GRkZALk+41JTUzl37hzlypXLtY9JkyYxadIk+vfvT5cuXbhy5QoDBw7EbDbbdWPJ/uxKSEhgzZo1/Prrr4wePTpH3SZNmjB69Gh27NhBhw4d8n1cEskThZBIJJIHYMGCBQKw+6fVaq31fvnlFwGITz75xKb9e++9JwAxYcIEa1nv3r1FiRIlcow1YcIEkddty2w2C6PRKBYvXiy0Wq2IjY3Ns88SJUqI3r17W7fbt28vwsPD8zzeVq1aiZCQEJGQkGBTPnToUOHk5GQdc/v27QIQjRo1yrO/LBYvXiwA8dVXX+VaZ8+ePQIQM2bMsCm/cuWKcHZ2FqNGjbKWFdbx5geTySSMRqPo37+/qF69us0+V1dXmzELQrt27ezOAyGECA8PF+XKlRNms9laZjQaRalSpQQgvv/++1z7vXr1qihSpIiIiIiwaZ8bgBgyZIiIiYkRTz31lChatKiIjIy0qXPhwoVcr4PsfxcuXLA7RlRUlChVqpSoXLmyiIuLs5YvWrRIaLVasWjRojxlPHbsmADE6NGjbcqXLl0qAJvf4JVXXhFubm7i0qVLNnWnT58uAHHs2DGbY6pataowmUzWenv37hWAWLp0qbWsQoUKonr16sJoNNr02b59exEUFGQ9z1n3i169euV5PEKo8yojI0OULVtW/O9//7OW79u3TwBiwYIFOdrkV44XXnhBODs7i5s3b9qMV6FChTx/pyw6d+4sQkJCbObPhg0bBCDWrVsnhBBi//79AhCrV6++57HeTda9Ljo62qa8RIkSQqvVilOnTtmUd+vWTTg6OorLly/blLdp00a4uLiI+Ph4u+NMmzZNAOLLL7+0lj2M+ZFfoqKiBCA++OCDHPtCQkJEv379hBBCpKenC1dXVzF69GgBWGV97733hIODg0hOThZCCDFv3jwBiB9++MGmrw8//FAAYtOmTdYyQHh6eto8N4RQ7+1eXl55yv3jjz8KQGzfvj1fx1mnTh0RHBws0tLSrGWJiYnCx8cnxzPu7vt2lqxDhgyxKcv6PaZNm2ZT/qDPrJSUFOHj4yM6dOhgU242m0W1atVE7dq1rWVZ8/ajjz6yqTt48GDh5OQkLBaLEEKI3377TQDinXfesXt+hBDi8uXLQqfTiddee82mPCkpSQQGBornn38+17ZCCNGiRQtRvnx5u/v0er14+eWX82xftmxZ0apVqxzl169fF4CYOnWqEEKIXbt25Trfp06dKgBx/fp1u2NUrlxZNG7cOEe52WwWPj4+onnz5jblcXFxwt3dXQBi9+7ducoeFxcnnJycRKdOnWzKs2TNPmZez64+ffrYXNtZZGRkCEVRcjxvJJJ/EtIdRiKRFAqLFy9m3759Nn9Z5qKgfqEFePHFF23aZQ8udj8cOnSIZ555Bl9fX7RaLQ4ODvTq1Quz2czp06cL1Fft2rU5fPgwgwcPZuPGjTm+mBoMBrZu3UqnTp1wcXHBZDJZ/9q2bYvBYMhhBv7cc8/la+xffvkFJycn+vXrl2udn3/+GUVReOmll2zGDgwMpFq1agXOxHOv482LH3/8kQYNGuDm5oZOp8PBwYGvv/6aEydOFEiG++W1117j9OnTDB06lGvXrnHlyhUGDRrEpUuXgNxNjmNjY2nbti1CCJYvX55v95sLFy5Qr149EhMT+fPPP6lWrZrdesOHD89xHezbt4/hw4fn2ndKSgrt2rXDYDDwyy+/2GQC6dWrFyaTyWpdkxs7d+4E4Pnnn7cp79KlS44vmT///DNNmzYlODjYZh5lWWVl9ZVFu3btrBZdcOdLaNa5Pnv2LCdPnrRe23dfFzdu3ODUqVM2fdq7LkwmE1OnTqVSpUro9Xp0Oh16vZ4zZ87ka14VRI7t27fTvHlzG8sprVbLCy+8cM9xQLW6uXr1Klu2bLGWLViwgMDAQOt5LFOmDN7e3owePZp58+ZZLQcelLCwsBxfgLdt20bz5s0pVqyYTXmfPn1ITU21m2Vl6dKljBo1irFjxzJw4EBreWHPj4Jw/fp1ALsWc82bN7ee7927d5Oamsrrr7+On5+f1Rpky5YtVtcJUM+Lq6srXbp0sekryyLobneOZs2a4e3tbVNWu3Zt4uPj6d69O2vWrLG6Ot0vKSkp7Nu3j86dO9tYB7i7uxf6V/XCeGbt3r2b2NhYevfubdPeYrHQunVr9u3bR0pKik2bZ555xmY7LCwMg8FgdWfKcsvI7sp0Nxs3brTe+7KP6+TkROPGjfP1vMsrzlB+YhAVpP2DjpUdjUbDkCFD2Lp1K++++y63bt3i7NmzvPTSS6Smplrr5MaePXswGAw53rfq169PiRIl7LbJ/uzavn07U6dO5YcffrBaXmXHwcEBLy8vrl27VqDjkkieJKQ7jEQiKRQqVqyYZ2DUmJgYdDpdjvgMd5uqFoTLly/TsGFDypcvzyeffEJoaChOTk7s3buXIUOGkJaWVqD+xowZg6urK99++y3z5s1Dq9XSqFEjPvzwQyIiIoiJicFkMvHZZ5/lmmbv7hfkvFwyshMdHU1wcHCeLzZRUVEIIXJ1eSlVqlS+xsriXsebGytXruT555+na9euvPnmmwQGBqLT6Zg7d26BXZDul379+hEdHc2UKVOYO3cuAPXq1WPkyJF8+OGHFC1aNEebuLg4WrRowbVr19i2bVuBztfevXu5ffs27733no1rwt2EhITYPXe5vbCbTCa6dOnC6dOn+e2333IsYvNLTEwMQI65Ye+ai4qKYt26dXZ9vSHnHL67fZaJdtb1lWXCP3LkSEaOHJmvPu1dF6+//jqzZ89m9OjRNG7cGG9vbzQaDQMGDMjXtVwQOWJiYuzee/J7P2rTpg1BQUEsWLCAli1bEhcXx9q1axk+fLhVIeDp6cnOnTt57733ePvtt4mLiyMoKIiBAwcyduzYXM//vbB37mJiYuyWBwcHW/dnZ/v27fTp04devXrx7rvv2uwr7PlRELLa2HMdePrpp1m0aBFnzpxhy5YtVK9enYCAAJo1a8aWLVvo0aMHu3fv5p133rG2yfqd716EBgQEoNPpcpwXe+ewZ8+emEwmvvrqK5577jksFgu1atViypQpNnFL8ktcXBwWi+WB5l9+KYxnVtZ1dbciKTuxsbFWxRPce05ER0ej1WrzPN6scbNiAN3NvRTYvr6+dtNop6SkkJGRkWdQ1Kz2d88PUI8VsLbPOtbc6iqKcl8prsePH09ycjJTpkxh/PjxgKpw7Nu3L/Pnz7f7jMsiS5aCzLG7n11Z8YPGjBnDxo0badWqlU19Jyen+7rGJZInBakEkUgkjwRfX19MJhMxMTE2L0g3b97MUdfJySlH0DrI+bK2evVqUlJSWLlypc3XDXsvPvlBp9Px+uuv8/rrrxMfH8+WLVt4++23adWqFVeuXMHb2xutVkvPnj1z/YJVsmRJm+38fgHy9/fnjz/+wGKx5Ppy5+fnh6Io/P7773nGw8gv9zre7EFHs/Ptt99SsmRJli9fbnN89n6zh8no0aMZMWIEZ86cwd3dnRIlSvDKK6/g6upKzZo1berGxcXx9NNPc+HCBbZu3WrXfzsvXnjhBQIDA3nnnXewWCzWwJUPyssvv8zWrVvZsGFDrtYl+SHrmoqKirJ5Oc665rLj5+dHWFgY7733nt2+shbO+cXPzw9QlWqdO3e2W+duH3R710VW3IGpU6falN++fTtfi4iCyOHr62v33mOvzB5Z94FPP/2U+Ph4vv/+e9LT03MEYaxatSrLli1DCMGRI0dYuHAhkydPxtnZmbfeeitfY92NvXPn6+trDQacnSzLiqxzA3DkyBE6duxI48aN7Qb2Lez5URCy5MxaaGYnK+7Eli1b2Lx5s1UB0bx5c8aOHctvv/1Genq6NR4IqOflr7/+Qghhc95u3bqFyWSyOS+Q+/26b9++9O3bl5SUFH777TcmTJhA+/btOX36dK5f1nPD29sbRVEeaP4VZKwHfWZlnaPPPvvMJntIdgoSiwrU553ZbObmzZu5fijIGnfFihUFPsdw59q7efOmzcI/K9ByXplZstovXboUk8lkY013d/vSpUvj7OxsE8A5e90yZcoUKB5IFjqdjpkzZzJ58mQuXLiAn58fQUFBtGrVipIlS+apjM96HuQ2x/IbfDvrOXn48OEcSpC4uLgc149E8k9CusNIJJJHQtOmTQFypHWzF4gwNDSUW7du2QSJy8jIYOPGjTb1sl7Wsi/+hRD3nbEjO15eXnTp0oUhQ4YQGxvLxYsXcXFxoWnTphw6dIiwsDAiIiJy/NnLRJIf2rRpg8FgyDOjQPv27RFCcO3aNbtjV61a9T6P1v7x5oaiKOj1epuX5Zs3b+bIDgPqb/MwvxY5OjpSpUoVSpQoweXLl1m+fDkDBw60SWuZpQA5f/48mzZtuu/UyGPHjmXWrFmMHz/eGujvQRg7diwLFixg/vz5Ngu3+6FRo0aAmkkhOytWrMgRqDUr9XDp0qXtzqOCLnLLly9P2bJlOXz4sN3+IiIicHd3v2c/iqLkUOStX78+h8l1bpYGBZGjadOmbN261eYeYzabc5y/vOjbty8Gg4GlS5eycOFC6tWrR4UKFXI9tmrVqvHxxx/j5eXFwYMH8z1OfmjevDnbtm2zKj2yWLx4MS4uLtbF6+XLl2nTpg2lSpXip59+smvtUdjzoyCUKFECZ2dnzp07l2NfUFAQlSpV4qeffuLAgQNWJUiLFi2Ijo5m5syZeHh42FgONG/enOTkZFavXm3T1+LFi637C4Krqytt2rThnXfeISMjg2PHjgEFs35xdXWldu3arFy5EoPBYC1PSkpi3bp1BZLnXhTGM6tBgwZ4eXlx/PjxXK8rvV5fILmyXKuyrPjs0apVK3Q6HefOnct13Lx49tlnURQlR4akhQsX4uzsnCOo9d106tSJ5ORkfvrpJ5vyRYsWERwcTJ06dQBVWdGhQwdWrlxpE/D48uXLbN++PVeFbH5xc3OjatWqBAUFcfDgQbZu3ZqneyVA3bp1cXJyyvG+tXv37gK5qWV9ULrbPe369esYDIY8A9NKJE860hJEIpEUCn///bfdrBilS5fG39+fli1b0qhRI0aNGkVKSgoRERHs2rWLJUuW5GjzwgsvMH78eLp168abb76JwWDg008/zZESrkWLFuj1erp3786oUaMwGAzMnTuXuLi4+zqGDh06UKVKFSIiIvD39+fSpUvMmjWLEiVKULZsWQA++eQTnnrqKRo2bMirr75KaGgoSUlJnD17lnXr1lmzjhSU7t27s2DBAgYNGsSpU6do2rQpFouFv/76i4oVK9KtWzcaNGjAyy+/TN++fdm/fz+NGjXC1dWVGzdu8Mcff1C1alVeffXVQj1ee2Sl6Bw8eLA16vy7775LUFAQZ86csalbtWpVduzYwbp16wgKCsLd3d1uZPosjh8/bo2dcPPmTVJTU1mxYgUAlSpVsr50/f333/z0009ERETg6OjI4cOH+eCDDyhbtqyNeX9aWpo1peKsWbOsGXey8Pf3zzOLw90MHz4cNzc3Xn75ZZKTk/n0008L7O8NakyV9957jy5dulCuXDkbmRwdHa2KmsWLF9OvXz+++eabPOOCVK5cme7duzNjxgy0Wi3NmjXj2LFjzJgxA09PTxvrosmTJ7N582bq16/PsGHDKF++PAaDgYsXL7JhwwbmzZuX51dGe3zxxRe0adOGVq1a0adPH4oWLUpsbCwnTpzg4MGD/Pjjj/fso3379ixcuJAKFSoQFhbGgQMHmDZtWg5Zsr68fvfdd1SsWBE3NzeCg4MJDg7Otxxjx45l7dq1NGvWjPHjx+Pi4sLs2bNzxDbIiwoVKlCvXj3ef/99rly5wpdffmmz/+eff2bOnDl07NiRUqVKIYRg5cqVxMfH35cbRV5MmDDBGstj/Pjx+Pj48N1337F+/Xo++ugja5aWNm3aEB8fz+eff25dwGeRda9+GPMjv+j1+jxT7DZv3pzPPvsMZ2dnGjRoAKiWDCVLlmTTpk0888wzNl/te/XqxezZs+nduzcXL16katWq/PHHH0ydOpW2bdvmS/mYpVRt0KABQUFB3Lx5k/fffx9PT0+rwiXLKuDLL7/E3d0dJycnSpYsmauC4d1336V169a0aNGCN954A7PZzIcffoirq6tdK5gH4UGfWW5ubnz22Wf07t2b2NhYunTpQkBAANHR0Rw+fJjo6Og8lRn2aNiwIT179mTKlClERUXRvn17HB0dOXToEC4uLrz22muEhoYyefJk3nnnHc6fP0/r1q3x9vYmKiqKvXv34urqak0PbY/KlSvTv39/JkyYgFarpVatWmzatIkvv/ySKVOm2LjDTJ48mcmTJ7N161YaN24MqNdKixYtePXVV0lMTKRMmTIsXbqUX3/9lW+//dYmDs6kSZOoVasW7du356233sJgMDB+/Hj8/Pxs0jWDmsEo6yNDYmIiQgjrM65WrVpWq5cdO3awb98+wsLCEEKwd+9ePvzwQ1q3bs3QoUPzPL/e3t6MHDmSKVOmMGDAALp27cqVK1eYOHFiru4wly9ftl53KSkp7Nmzh/fff58SJUrkUORk1cv6uCWR/CN5bCFZJRLJv4K8ssNwV7aT+Ph40a9fP+Hl5SVcXFxEixYtxMmTJ3NkhxFCzbQQHh4unJ2dRalSpcTnn39uNzvMunXrRLVq1YSTk5MoWrSoePPNN62ZaLJH6s9PtpQZM2aI+vXrCz8/P6HX60Xx4sVF//79xcWLF23aXbhwQfTr108ULVpUODg4CH9/f1G/fn0xZcoUa52sSPs//vhjvs9lWlqaGD9+vChbtqzQ6/XC19dXNGvWLEcU+G+++UbUqVNHuLq6CmdnZ1G6dGnRq1cvsX///odyvPb44IMPRGhoqHB0dBQVK1YUX331ld3fJzIyUjRo0EC4uLjkiEpvj6w+7P1lnyOnTp0SjRo1Ej4+PkKv14syZcqIsWPHWrNCZHGvrC35yVyDnUwMS5cuFTqdTvTt21eYzeZcMzNkkZWFIyvrSF7Hmf13y7q+7GVCuRuDwSBef/11ERAQIJycnETdunXFnj17hKenp012FSGEiI6OFsOGDRMlS5YUDg4OwsfHR9SsWVO888471nOY1zHZu2YPHz4snn/+eREQECAcHBxEYGCgaNasmZg3b16O49m3b1+OPuPi4kT//v1FQECAcHFxEU899ZT4/fffRePGjXPMm6VLl4oKFSoIBweHHLLkRw4h1EwJdevWFY6OjiIwMFC8+eab4ssvv8xXdpgssuo7OzvnyL5x8uRJ0b17d1G6dGnh7OwsPD09Re3atcXChQvv2W9e2WHatWtnt83Ro0dFhw4dhKenp9Dr9aJatWo55k1e10L2ug9jfuSXr7/+Wmi1WrsZNdasWSMA0aJFC5vygQMHCkB8+umnOdrExMSIQYMGiaCgIKHT6USJEiXEmDFjhMFgyCHz3de5EGqGpqZNm4oiRYoIvV4vgoODxfPPPy+OHDliU2/WrFmiZMmSQqvV5uuaXbt2rQgLC7Peez/44AO799AHzQ6Tte9Bn1k7d+4U7dq1Ez4+PsLBwUEULVpUtGvXzqZ+bvM267rPfl2ZzWbx8ccfiypVqgi9Xi88PT1FvXr1rNmVsli9erVo2rSp8PDwEI6OjqJEiRKiS5cuYsuWLXblzE5GRoaYMGGCKF68uNDr9aJcuXJ250iW3Hdn90lKShLDhg0TgYGBQq/Xi7CwsFyzHu3fv180b95cuLi4CA8PD9GxY0dx9uzZHPV69+6dr2tw165dok6dOtbjrlKlipg+fbrIyMi453ELIYTFYhHvv/++KFasmFX2devW5bif2ntGOjk5iXLlyokRI0aIGzdu5Oi7Z8+eomrVqvmSQyJ5UlGEEOK+NSgSiURSCCiKwoQJE5g4ceLjFkUi+Vexe/duGjRowHfffffAmZgkkkeBwWCgePHivPHGG4wePfpxiyORSLKRmJhIcHAwH3/8sU1WKYnkn4Z0h5FIJBKJ5F/A5s2b2bNnDzVr1sTZ2dnGRehB/dIlkkeFk5MTkyZNYuLEiQwdOtQm64hEInm8fPzxxxQvXjxHEGiJ5J+GVIJIJBKJRPIvwMPDg02bNjFr1iySkpLw8/OjTZs2vP/++/eVnUAieVy8/PLLxMfHc/78+QcK+CyRSAoXDw8PFi5caBN7RyL5JyLdYSQSiUQikUgkEolEIpH8J5ApciUSiUQikUgkEolEIpH8J5BKEIlEIpFIJBKJRCKRSCT/CaQSRCKRSCQSiUQikUgkEsl/AhnV5h+CxWLh+vXruLu7oyjK4xZHIpFIJBKJRCKRSCSSJwYhBElJSQQHB6PR5G7vIZUg/xCuX79OsWLFHrcYEolEIpFIJBKJRCKRPLFcuXKFkJCQXPdLJcg/BHd3d0D9QT08PB6zNLZYLBaio6Px9/fPU+MmkTwq5JyUPGnIOSl5kpDzUfKkIeek5ElDzsl/JomJiRQrVsy6ds4NqQT5h5DlAuPh4fFEKkEMBgMeHh7yJiF5IpBzUvKkIeek5ElCzkfJk4ack5InDTkn/9ncK3yE/EUlEolEIpFIJBKJRCKR/CeQliASiUQikUgkEomk0DCbzRiNxnzXt1gsGI1GDAaD/OoueSKQc/LJx8HBAa1We19tpRJEIpFIJBKJRCKRFArJyclcvXoVIUS+2wghsFgsJCUlySyIkicCOSeffBRFISQkBDc3twK3lUoQiUQikUgkEolE8sCYzWauXr2Ki4sL/v7++V48CiEwmUzodDq54JQ8Ecg5+WQjhCA6OpqrV69StmzZAluESCWIRCKRSCQSiUQieWCMRiNCCPz9/XF2ds53O7nglDxpyDn55OPv78/FixcxGo0FVoJIByeJRCKRSCQSiURSaMhFo0Qiedg8yH1GKkEkEolEIpFIJBLJv4JOnTrh7e1Nly5dbMq/++47qlSpQuXKlZk2bZq1fNu2bVSvXp1q1arRsmVLYmNjc+175MiR+Pn5WbdnzJhBxYoVCQsLo1OnTiQmJgKwcOFCAgICCA8PJzw8nLVr1+bo6+LFi0RERNiUdenShR07dtzPYT82IiMj2bRpU4HbZT+P/2Rym2979+6lcuXKlClThsmTJ1vLz507R0REBGXKlGHQoEHW2Dm3b9+madOmlC1bls6dO2MwGHKMtXDhQkaOHGlT9k88j6tXr+b06dMFarNjx44c5/hBkEoQiUQikUgkEolE8q9g2LBhLF682Kbs9u3bjBs3jt9//52jR4+yc+dOTp06BcDw4cNZtmwZhw8fpnr16nzxxRd2+z1+/Dg3b960KatZsyaHDh3iyJEjVK5cmenTp1v39erVi8jISCIjI3nmmWcK+SgfLWazOdd996sE+bdgb74BDBkyhKVLl3Ly5EnWrVvH33//DcCoUaOYOHEiZ8+eJSoqivXr1wPw/vvv89xzz3HmzBlKlCjB/PnzH+lxFDZ5zZn7UYIUNlIJIpFIJBKJRCKRSP4VNG3aFHd3d5uy8+fPU6lSJby9vdFoNDRu3JhVq1YBqkl9UlISoGa2CQoKstvvqFGjmDp1qk1ZkyZNcHJyAqBGjRpcu3atUI5h//79ViuSChUqULJkyRx19uzZQ+XKlWnQoAFDhgyxfiWPioqiY8eORERE8NRTT3Hy5EkA+vTpw/Dhw6lbty5ly5Zl586dAJhMJoYPH07t2rUJDw9n9erVgGp10L17d9q1a0f37t05d+4cDRs2pEaNGtStW5cTJ05gNpsZP348ixcvJjw8nI0bN5KcnEyvXr2oVasWERER7Nq1yypX06ZNiYiIYOzYsYVynp4E7M2369evYzKZCAsLQ6fT0aNHD9atW4cQgj179tCuXTtAVZStW7cOgHXr1tGzZ88c5fll3rx51jkTEhJC3759c9SZO3cu5cqVo3nz5nTr1o3PP/8cUK1Wsn7b5557juTkZABCQ0OZOHEi1atXp1atWty4cQPIe4698cYbNGnShI8++og1a9ZQp04dwsPDefbZZ0lOTuavv/5i7dq1DBs2jPDwcGJiYjhz5gwtWrSgZs2atGzZ0jpO9jn+008/Feh83AsZGFUikUgkEolEIpEUKiaTiZio3F1LsiMQmExmdDotCvf28/ct4oNOl/9lTJkyZTh69CjXrl3Dz8+PDRs2UKVKFUBdGLZu3Rq9Xk/p0qX59NNPc7Rfvnw5ERERFC9ePNcxFi5cyIsvvmjdXrp0KZs2bSI8PJxZs2bh4+OTo83x48cJDw+3bl+8eJGhQ4cSERFBZGQkoC6I73abARgwYABLliyhRo0avPTSS9byESNGMG7cOGrWrMm+ffsYMWIEv/76KwDx8fH8+eefbNu2jcmTJ7N161bmz59PaGgon3zyCYmJidSpU4c2bdoA6uL40KFDeHh4kJqaypYtW3B0dGT37t28/fbbrFq1ismTJ/P3339brWDeeustOnXqxOLFi7l69Srt2rXj8OHDTJo0iQ4dOvD6668zZ86cXM/j/WLBTDLxhdafQGDChBd+aAu4ZL5+/TpFixa1boeEhLBz505iYmLw8fGxxrIICQmxKs4SEhLw9PTMUX43ixcvZsuWLdbt+Ph4AAYNGsSgQYNISUnhqaeeYvDgwTbtrl27xowZMzhw4AA6nY4aNWrw1FNPkZGRwciRI1m7di3e3t5MmzaNzz//nLfeeguA4sWLc+jQIcaPH8/8+fMZN25cnnPsypUrbN++HUVRiIuL49lnnwVg6tSpfP311wwfPpxnnnmGLl260L59ewC6devG/PnzKVGiBD/++COTJk1i3rx5DBgwgEWLFhEREcELL7xQoN/gXkgliEQikUgkEolEIilUYqJiaR3W+aH0/euRlRQpGpDv+j4+PnzyySd07NgRvV5PtWrVrEqUjz/+mM2bN1O9enVGjRrF+++/b2OpkJKSwqeffmqz8LybWbNmAVgXah06dKB79+7o9XqmTp3KG2+8wYIFC3K0q1SpEvv377du3x3z4IsvvsBgMDBs2DCb8vj4eEwmEzVq1LCOu2jRIkCNcXLixAm7cma55dSsWZOLFy8CsHnzZo4dO2Ztn5KSYl2At2rVCg8PDwDS09MZMmQIR44cQaPRkJ6ebneMzZs3s2HDBiZNmgRATEwMGRkZ7N6923peX3rpJcaPH2+3/f2STDwf80rhdagADjBCzMOTgsXdyIrzYdOdouRanv3fu8vvplevXjZuV3fHBBk4cCADBw6kVq1aNuX79u2jefPmVkVLlgLi1KlTHDlyhKZNmwKQkZFBkyZNrO2ylBg1a9a0xrbJa4516dLFKvvly5fp0qULt27dIiUlhRYtWuSon5SUxK5du6zjmM1mQkNDiY+Px2g0WhWAL774ol23o/tFKkEkEolEIpFIJBLJv5qOHTvSsWNHAKZMmYK3tzfR0dGcOHGC6tWrA9C1a1cmTJhg0+78+fOcPXuWihUrAhAXF0dYWBhHjhwBVDeGJUuWWN1LAHx9fa3/HzBgAM2bNy+wvAcPHmTOnDn88ccfOfbdvZi+e/vAgQN2U4Y6OjoCoNVqrTEbhBB8+eWXNGrUyKbub7/9houLi3V71qxZlCxZku+++46oqCjq1q1rV24hBD///HMOqxkhxH8ma1DRokVtLDmuXr1KUFAQfn5+xMbGWs9FVjmAh4eH1Roke3lBmD17NkAOKxDIfc4IIahRowbbtm2z26e9OQO5z7Hsc2bYsGG8/fbbtGrVimXLllmtRe6WIzAw0Gr5lEVcXNxDnS9SCSKRSCQSiUQikUgKFd8iPvx6ZGW+6t6PO0xBuXXrFgEBAdy8eZPly5ezc+dOPDw8iI6O5sKFC5QsWZKtW7dSvnx5m3ZVq1YlKirKuu3n52dVgBw4cICRI0eydetW3NzcrHVu3rxJYGAgoAaBrFy5coFkjY+Pp3fv3ixdujRHvAkAb29vdDodkZGRhIeHs2LFCuu+xo0b88UXXzB48GAsFgvHjh2jatWquY719NNPM2/ePBo0aIBWq7X2eTeJiYmUKVMGRVFYsmSJtdzd3d0aUyWrv9mzZ/Phhx8CcPjwYapVq0aDBg1Yvnw5I0aM4Pvvvy/Q+cgPbnjxP+wHtb0fhBCYTCbcdF4FbhscHIxWq+XIkSNUqlSJpUuX8vXXX6MoCnXr1mX9+vW0b9+exYsX069fP0C1zFiyZAlDhw5l8eLFdOjQoUBj7tu3j/nz59tVmgHUqlWLUaNGkZiYiE6nY8OGDQwdOpQKFSpw6dIl6++ekpLCjRs3KFOmTK5j5XeOJSYmEhISgsVi4fvvv7e6hGWfMx4eHvj7+7Nhwwbatm2L0Wi0Kh0dHBw4ePAgNWrUYOnSpQU6H/dCBkaVSCQSiUQikUgkhYpOp6NI0YD8/QUHUCTYX/03H/XzigfSqlUrunbtyoYNGwgJCWHfvn2Amq2jUqVKtGjRgunTp+Pjo8YVmTNnDh06dKBatWr89ttvvP322wCMHz/ebmrb7IwePZrExETat29PeHg4Q4YMAVSriSpVqlCtWjXWrFnDzJkzC3Tu1qxZw5UrV3jppZcIDw+nbdu2Oep8+eWXvPjiizRo0ABvb2+r28pnn33G5s2bCQsLo0qVKtbsI7nxyiuvEBwcTHh4OFWqVLFJ55qdQYMGMXfuXOrXr2+j9GjatCkHDx6kevXqbNy4kfHjx3Pr1i2qVq1KpUqVrFlOJkyYwJo1a6hZs2aeaYjvFw1aPPAt9D8NOa0dspPbfPv888/p3r075cuXp23btlYlwYcffsiECRMoXbo0/v7+1iCpY8aM4ccff6RMmTJcuHCBAQMGFOj458yZQ3R0NA0aNCA8PDyHu1FISAgjRowgIiKCZ555hurVq+Ph4YFer2fZsmUMHjyYsLAw6tWrx9mzZ/McK79zbNy4cXTo0IGmTZsSGhpqLe/WrRvvvvuuNTDqd999x8yZM6lWrRrh4eH89ddfAHz11Vf07NmT+vXr5xmP535QhD3nJMkTR2JiIp6eniQkJFhvck8KFovFql3XaKReTfL4kXNS8qQh56TkSULOR8nDwmAwWK0qsrKm5Iesr+46ne4/4zLxoKSkpODq6gpg/aI/dOjQxyzVv4d/45zMmjNpaWk0atSIb775Jk8roScde/eb/K6Z5ZNPIpFIJBKJRCKRSP5BrFmzhvDwcCpVqkRMTAz9+/d/3CJJnnDGjh1LeHg41atXp1OnTv9oBciDImOCSCQSiUQikUgkEsk/iB49etCjR4/HLYbkH8THH3/8uEV4YpCWIBKJRCKRSCQSiUQikUj+E0gliEQikUgkEolEIpFIJJL/BFIJ8giZM2eONXBLzZo1+f333x+3SBKJRCKRSCQSiUQikfxnkEqQR0RWXux33nmHQ4cO0bBhQ9q0acPly5cft2gSiUQikUgkEolEIpH8J5BKkEfEzJkz6d+/PwMGDKBixYrMmjWLYsWKMXfu3MctmkQikUgkEolE8q+gU6dOeHt706VLF5vy7777jipVqlC5cmWmTZtmLd+2bRvVq1enWrVqtGzZktjY2Fz7HjlyJH5+ftbtGTNmULFiRcLCwujUqROJiYkALFy4kICAAMLDwwkPD2ft2rU5+rp48SIRERE2ZV26dGHHjh35Os6dO3dSuXJl6tSpk6/6kodDbvNt7969VK5cmTJlyjB58mRr+blz54iIiKBMmTIMGjQIIQQAt2/fpmnTppQtW5bOnTtjMBhyjLVw4UJGjhxpU5Z9Pt6Ljz/+mIoVKzJkyJCCHOK/EqkEeQRkZGRw4MABWrZsaVPesmVLdu/e/ZikenJITU5lyZxlXL14DVDzcm/ffpHjx6Nt6p28mM4vu1IwmkSOPo7cgFXHwGCyP8b5VBPfXEnmmsGcpyxmIVifEsXipKvcNKfn+xjOWW6xzLiXQ+bLmETeY9hDILjMCX5jBafYRyqJBe4jR59CkGA5xVnzd1wyryHOchyzyP8xFWwsI2mGQ8QmfE180irS0g9hNic8lLFyl0FgSbuG+fYOTJfmo4/bgCV2F5bkMwhTyiOVJTdERgoi+jjizAbEX58iDn2j/v/qX4jYc4j0pMctYoEQRgOW6EuYT+/BtHcV6etnkb5qKhlbv8L010+Yjm7BfG4/lptnEBmpj1vch44lJZGM88cwHN1D6l+bSN62goS1XxP37TRi5r6NceXnJK6cS9Kv35Hy+1rSDuwg/eQBjNcvIMwFv29IJBKJJCfDhg1j8eLFNmW3b99m3Lhx/P777xw9epSdO3dy6tQpAIYPH86yZcs4fPgw1atX54svvrDb7/Hjx7l586ZNWc2aNTl06BBHjhyhcuXKTJ8+3bqvV69eREZGEhkZyTPPPFPIRwlLly5l3Lhx/PXXXzblZvk8eaTYm28AQ4YMYenSpZw8eZJ169bx999/AzBq1CgmTpzI2bNniYqKYv369QC8//77PPfcc5w5c4YSJUowf/78Qpf1iy++YPv27cyePdum/L84Z2SK3EfA7du3MZvNFClSxKa8SJEiOW6mWaSnp5OefmfBmqVZtlgsWCyWhyfsfWCxWNQF6H3KNX7IFLb+/BvfzV3Oqr++Z/2GC8yefQCNRuHjj5+mSpUAzlzO4H+z4hACth1I48OhPtb2W87A+zsVQGH5YcHCrgK99k7/f8Sl8+qxBIwCPjyfzPzKnjTwccwhR7zFSPtb+7loTgNgQvxp5vlUoYVz7hpWozDzjnEV+8Ula5kfrszWv4i/4p6v47/MCdYqc4hTou4UCoWGojON6YpyH7rKC+YVnBJfYCLZplyDI5WUYZTQdEJRlAL3ezcZxotEx79HesYJIOcN1ElfFz+vIegdyjzwWLlhSTyK+coSRMIRsNxRdrgAJqseTQNeNdEGdUHjUwdF0drrqvARFri6B06sgKgjKKnReVcHhFdJKPcMlGkN7kUfjZz5xHL7MubDv2Deuxpx8zRkpBWgtQK+xdCUq4e2cjO0ZWqjeBa5d7MnEEt6GsbLp8g4f4z0Y3vJOHUQ47VziOR7K/5y/b6odcChRDl0QaVwKFEOx3LhOJSogEOxsig6h0KVXyJ50Oe2RJIbWXMr668gZNUvaLu7adKkidWaIquvc+fOUalSJby8vABo1KgRK1eu5K233kJRFBITExFCkJSURIUKFezKMGrUKGbPns2vv/5q3d+4cWPrONWrV2f9+vU2x5/XseR2vEII9u3bx8CBAwEwGAykp6dz/vx5a53Fixfzww8/sGnTJrZv307dunXZtGkTiYmJuLq68v7779O/f39iY2MJDQ1lwYIFGAwG2rVrB6i/09GjR7FYLJw5c4YhQ4YQGxuLr68vCxcuJCgoiKZNm1K7dm22b99OWloay5Yto3LlygX9Of7R5GdO2ptv169fx2QyUbVqVQC6d+/O2rVrqVSpEnv27OHHH39ECEHPnj1Zu3Yt7dq1Y926dezdu9daPmbMmBwWG7nNKyEE8+bNsyrwbt++TYsWLfjmm2+sdYYNG8b58+dp2bIlr732Grt27cLHx4eDBw/SsmVLatasyejRozGZTLRo0YIZM2awbt06JkyYAKhr0RIlSrBt2zY2bNjAu+++i8FgoFatWsybNw+NRoO/vz+9e/dm06ZNBAQEsGbNGlxdXR/gF8ibrHORfX2c3+eaVII8Qu5edAohcl2Ivv/++0yaNClHeXR0tF3zqMeJxWIhISEBIQQaTcEW7Gazma3rfwMg6no0Ozb9ztKl8Zn9CpYtO8KwYWHMXyPIut6PnjMSeSKKYF8Fi4A5f/qTZdQUlazw3d4k2pVWvzqbBEy4AMbMtgJ4/UQCK0qD412ivma8yEXURZ0rGlKwMCj2CN9oS1FR42JX/oVOe9nvqCpAXCwOpCpGbispvJK2hA9S2uElnPM8/msOp1nv8zlCUS9YV7M3qZoEhGLhd+UnzqYfpm3cEHTkbxFkwcQF10+JcdxpLXMyF8WMAaM2Bgvp/C2mcS59BeWTxqEXvvnq926EEJgsv5Ju+RowWssV/BCkA8mAwJDxJ1dv/YmWejjpXkVRPO9rPHtoDedwjvoKXfoZW9nQYXbwA5MBrUhGwQRYIH4f5vh9GDWupHt1IN23EygP5xaopMfhfH4dLudXo83IadVj0TpjcfIFixFFGNGkJ6IIEwpA/AXY+wns/QSTa1HSSnUgtWQH0OZU3D10LGa0Fw+gO7UT3dFf0aTE2K0mUBCOLuDijdDpUdJTQFhQMtJQ0pOttYi5jGXPZSx7lmMELF5FMYXWwFi/F5YiZR/ZYRUUIQTi6hlMf/2C+fDviDORYLnHVxOdAzg4gqMziqMLOLti1rugNaYhYm5CeioY0yHrYW02Yjx/DOP5Y6TtytaP1gGlTDV09dqirdoAJaRsoSgwJf9tHuS5LZHkhdFoxGKxYDKZMJlyMc+1gxDC+jW6MO5xZrPZKgdAaGgoR48e5dKlS/j5+bFhwwYqV66MyWTis88+o02bNuj1ekqVKsXMmTNzyP7DDz9QvXp1goODAewe24IFC+jevTsmkwmLxcKyZcvYtGkT1apVY8aMGfj4+NjUN5lMHD9+nPDwcGvZpUuXGDRoEOHh4ezbtw+Avn37UrNmTZsxe/TowdatW+ncuTPt2rVj8eLF7N27l7179+Lh4UHHjh15+eWX6dq1K9OmTWPChAl8/PHH1j4nTJhAs2bNMJlMDB48mHnz5lGiRAlWrFjBxIkTmT17NkIIHBwc2L17NwsXLmTGjBl8+eWXD/zb/FMoyJy8e75duXKF4OBg63ZQUBC///47UVFReHt7W/sNCgri2rVrmEwmEhIScHV1xWQyERgYyNWrV3PMM4vFwpIlS9iyZYu1LD4+HpPJxIABAxgwYAApKSk0adKEl19+2ab9zJkzWbduHTt37sTNzY3ff/+dy5cvs2nTJgwGA1WrVmXLli0UL16czp07s2LFCjp16kTbtm0xm820adOGoUOHcvPmTWbOnMnmzZtxcnJi+PDhLF26lBdeeIGYmBhatWrFBx98QN++ffnxxx956aWXHvzHyIWsay0mJgYHB3WtlJSUP6tqqQR5BPj5+aHVanNYfdy6dSuHdUgWY8aM4fXXX7duJyYmUqxYMfz9/fHw8Hio8hYUi8WCoij4+/sX+GXqwumLqmYik78PnCM21s26ffhwDL6+/py8fMum3fHLroRXdGPfVUhI1wCC8CCIvKGw4bw7feupfayNSuOaMQkN8FUVLwb+HU+CBX6zuPFi4B3Fxpa02+yKVRdr07zK09opgGei93PBnMYk5SZb/evkuAHuNJ3mV7NqStlXW5+X9HU5bLnKm6Yfidem8b3XESY6dMj12G9ykQ2KqgBxE170FBPxU4IxCSPr+ZIjyk5uOJ7lQJF1dBCD7nkuLcLELvPLJHACAH/qUkU7Eledak2QLmI5Yv6QKH4jTXeBE96jaaRdhKPifc++bcaxpHIj5nXSTYcB0GqC8fF8FRenWmg1npmypGNIP0h03IeYLVGY2UOa+QRFA77GQRdcoPHuRljSMZ2chIjNll3JvTLa4OfRuFcAxyCEEERHR+Pv749iScMSfxDz1SWQfAKNJQXn2GU4p/6GruIHaFxLPpA8NpjSYdeHcPInlGwTWwTVhPIdwacMeJZA0bthY4siBCI9EWJOwsk1cGk7ijEFXco13I/Ow+3cCqg5CCp0Bs3Dv20LsxHT7uWYNnwM8Tdsdzq5oanYGE31dmj9S6B4BYK7P4rWvlzCbIK0BCxXj2M+8RuW4zsQUefAaEATfw195DX0kevAPxRd81fQ1XkOxcnNbl+PEkt6GoZDO0nZspy0PzchkuNz1FFc3NEVLYVjueroK9fGsVQVdEVLoXHxQNHaWhtZLBbrnMx+nxQZ6ZjjozFeOonx0ikMx/eSceYIpqjLkGEAsxFxaj/GU/sxAoqzG45V6+PatDMuT7VH616w61cigQd7bkskeWEwGEhKSkKn06HTqc+F6Ju3uR1lq0T38HKnaIlg0g3pnD91EVAXNFltKlYrD8DFM5dJS7W1OgwuHoSnd97vwlqtFo1GY+0vICCAWbNm0bVrV/R6PWFhYTg4OKDT6fjss8/YtGkT1atXZ9SoUUybNo2xY8da+0pJSWHOnDls3rzZ2l/Wv1nMmjULjUZDjx49AHj22Wd58cUX0ev1TJ06lbfeesvmq3xWH5UqVbIqJgC6du2KVqu19v/FF1+QkZHBiBEjchyjRqOx1tVoNLRs2dKqaNm/fz/r1q1DURR69+5N+/btrX3++uuv/P7772zdupW0tDR2795tjWdhNpsJDQ1Fp9OhKAqdOnVCp9NRq1Ytli1bluO4n0SSiCOZOJsyJ1zxpggmMojmao42QZQC4DbXMJKerZ0b3g4B9xzz7vmm0WhQFMW6nbVfq9XaLc8639nnV/b+stBoNPTs2dPG7crf39+m3uDBgxk4cCB169a1K2vWtanRaOjatSsODg4cO3aM8uXLU6aMarndo0cPdu/eTdeuXQEYN24cERERdO7cmXXr1nH06FEaNmwIQFpaGiEhIeh0Otzc3GjRogUAERERXLly5aHOmazj8PX1xcnJCcD67z3bPjSpJFb0ej01a9Zk8+bNdOrUyVq+efNmnn32WbttHB0dcXTM+eVXo9E8kS8siqLcl2yXz9neiI5EXgPKW7dTU00cP5eGMVOR2aSGIzsOprP3eDovtfHgz8zkOtWDFYbUgwE/QWyawtVEheJe8O0N1Wqmobeehr5OtPRz5Nfb6Sy9kUbPkDsLrXnJakfhDh70cAtBURRm+lSiU/QBTptS2ZoeS0sXf2t9ixB8bt4GQG2lJD0d6qNRFGpoSzBO04GJGWv5zXKag5bLROhCcxy3wMJKZmHBgguevKx8hLuiPrj0ONKJ1/AliO0sI1LZRnGlAtVplue5PGWab1WAlNX0pYL2FRvFjTN+1NFO46b5D/aaR5FONHst/6O+bg4OSv4WnUKYuRnzBukZqgLEw/UZ/Lz+h+YuSxkNzri5NMDVeRWJyWuJjp+ORcRz9VZPQgLm46gvna/xcoxvjCfj8FBIvaAWOBVFV/p1tD62SqqsF3yNRoNG5442oDEOAY0RhpsYLy/CcnMtGK5jOtQPXcmBaEO6P7CLjLh1FLa9A3GZ5qo6Z6jwLFTrjcaj2L07cPEGl3pQrB5CWODW33B6PZxYgZJ6G36fAge+gIbvQMnmD8UaQBjTMf62BOPP0yE13lquKV0LTcUm6MJboQmpXLCxNXpw8EdbqTEOlRrDc+MQZhOWaycwH9uGcccCiL8J0RcxLRuD6cfx6Op2weHpV9AEVyj0Y7wXGZdPk7jqC5J+/RaRYmvFo/H0xaV+W9yad8WxYkSBFRB275NOzmgDi6MPLA517sSNEkJgjo0iLfJ30vZtwXBwJ6ablxBpyRj2bsKwdxMx0zQ4VW+EZ9fXcKndQrrNSArE/T63JZK8yFr8Zf0BrFy8li8+WmBTr22Xlrz3xXhu3bjNi80H5OjnUMwfAEx4bSpH9x+z2Tdl7jjaPd8qTzmyxs7+vOrUqZP1PXzKlCl4e3tz+/ZtTpw4QY0aNQB4/vnnmTBhgk27CxcucPbsWSpVqgRAXFwc1apV48iRIwCsW7eOb7/9lp07d1rbZQ9WOXDgQJo3z/nctidj1raiKBw8eJC5c+fyxx9/5PrczX6uXV1dbfrM/htk/f/y5cu8/vrrbNmyBb1ej8FgIDAwkMjISLv9Ozk5WRfnZrP5H2GJeJDN7ORHm7KqNKQzw0kilq8YnaPNBFYAsJY5XOW0tfwp7XM0o9s9j/vu3zIkJIRr165Zt69du0ZwcDD+/v7WwLuKonDt2jWCgoJQFAUPDw8SExPx9PS0Kb97nOy/693jZ8X6yCvwafb2WXPG3lzMupZ//vln9uzZw9atW63727dvn0OpB+r6NauOTqezvo8/LLJkz/4sy+8zTSpBHhGvv/46PXv2JCIignr16vHll19y+fJlBg269xf+fzOXztsqQW7cTAU3cHfXk5ycgRCw74hq1uTlptCoujM7DqZz7qoJk1mw+5J6YYUVgVI+EOQON5Jg9yUo4iE4nqS6anQOVN1SeoW48uvtdM6mmrmUZqKEs45LplT+yogH4E2PUtaLtY6TN7X0nuzLSGBqwlkbJchu8zliUONPDNE3RZPtAm+sKUeYEsIRcZUPjL/wg3aQzX6Ag2wlhusAvMCbuGNrIgnQkOe4xWWOsZuf+YJQKuONfcuhaMs+zljUoEyllV5U1OU+rwK1T1FHmc5e05skiFP8aRzGUw7zUZR73zSi46ZjyIgEwM/rTbzcu+RZX1G0eLp3Qu9QjmvRryJEKldvvULRgM9w0le853jZsaRdwXh0JBjUOaMt+Sq6kBcLdHNVnALRlxuNObADxlOTIe0KpgtzMUdvQx/2GYqu4H6LwmyEPz+GI98CFtXFpsYAqPkyilZf4P4A9bcoEgZFwhDV+8Kuj+D8JkiNho0jIDAc0fozFOfCsQIQxnRMvy0mY+1HYEjKEgJt9fboO7+Dxj+0UMbJQtHq0BavirZ4VRxaD8Ny8RDGTXMxH/4VzEZMu5Zi2rUMbXhr9N3eQ+P9YNZD90KYzaT88TPxi98n48zhOzu0WvShlXB9+nlcGz2LQ0iZR/YCqCgKOt9A3Jt3xb25+iXGeO08qX9tImXHSgzH/gJjBoYDOzAc2IHGyw+X+m3x7Pwq+rLV/hEvqhKJ5L/Bc72fpXHrp2zKPLzUuGlFgv35ftvXVteDrC/lWUz+/B27liD3w61btwgICODmzZssX76cnTt34uHhQXR0NBcuXKBkyZJs3bqV8uXL27SrWrUqUVF34rb5+flZFSAHDhxg5MiRbN26FTe3Ox+Ubt68SWBgIACrV68ucCyN+Ph4evfuzdKlS3F3z1+MuexERETw008/0aVLF77//nsaNmxIRkYG3bp149NPP6VoUdVK2MPDA39/fzZs2EDbtm0xGo2cPXuWihUL9o72JFGTlpSnlk2ZE+r7nQe+vMxHubZ9liFWSxAhBM4W9/tKIxIcHIxWq+XIkSNUqlSJpUuX8vXXX6MoCnXr1mX9+vW0b9+exYsX069fP0BVLCxZsoShQ4eyePFiOnTI3ZrcHvv27WP+/Pn88ccfBZa3fPnynD59mkuXLlGsWDGWLVtGv379uHjxIm+++Sbbtm2zWnTUrVuX4cOHc+XKFYoVK0ZMTIzVGuSfhFSCPCKy/KQmT57MjRs3qFKlChs2bKBEiRKPW7THyuVzqgWGoigIITCYnHEAgoPdiI5OJTbWwMmLBsCJssX1VAhVF5VmC5y+buJWivrls0YIKArUKArrT8Key1CsWAYmQAFrINSaHg4EO2q4nm5hx20DvYu5sST5GgIooXWmsbNtjIy3PMvwXPQBTptSOG9MpZSDavHwtUl1xaiiBFNCY9tGURT+p29B3/QF3CaZfeYL1NGVsu5PJ5XNfAtABWpTHPtfuxUUOvAq5zlCGsn8zJf0ZFyOeukinn2m0YDARwmnou6Ve573Ipr61NBO4oD5HeI4xlnz95TV5e2zl5D0E4kpKwHwdO16TwVIdpydKlM8cDHXbg3FbInmevQbFA9cgk6bv5gk5oRjGP/+H5hTQHFCV3ECOr9G+R7/brQeldDUXITp4leYry5FJJ8i/VB/HMO/QHHIf9wSkXwDVveFpExlnl9FaPYeim+5+5btbhS3QGg1ExF3Dn57F67vh5uR8ENnRMsZKEE1Hqh/y9XjpH09GK6fzBxQg7Z2Z/Qd30Lj8/AfaIqioC1ZA+0rXyEMKZgOrMW49UvEtROYI38h7fAmdA17ou/4FoqrV6GObU6MJf7Hz0n6aS6WbO4uWv+iePV4HbeWPdC6F+6YD4JD0VJ4dh6EZ+dBWNLTSPl9HUm/LMFwcDuW+Nskb1hM8obFaIsUx7vfWNxbdEf5B5guSySSfzf+gX74B9oPMu/o5EjFauXVWGOZ7jDZlSChZYsXeLxWrVpx8OBBUlJSCAkJYdWqVdSqVYshQ4Zw7NgxtFot06dPt7qOzJkzhw4dOqDVailatCiLFi0CYPz48UREROSZ2WX06NEkJibSvn17ABo0aMDs2bOZNWsWP//8s7XPr776qkDHsGbNGq5cuWKNpxAcHMyGDRvy3f7TTz+lb9++TJ48mRIlSrBo0SL27NlDZGQkb775prVeZGQk3333HYMGDWLMmDGYTCbefPPNf7QSxB1v3LH/kUiH3ur6Yg8/7gSkFwhM3DuuTW7z7fPPP6d79+4YDAZ69uxpDZL64Ycf0q1bN4YPH07z5s2twWrHjBlDly5dmDVrFlWqVGHq1KkFOWzmzJlDdHQ0DRo0AOCZZ56xSc2bF87Oznz55Zc8++yzmEwmWrZsSceOHZk8eTIxMTG0adMGUJVr8+fPZ+7cuXTs2BGj0YiDgwNfffXVP04JoogHDcEseSRkmUclJCQ8kTFBsrTrBTWrHdVvHJvXbCe8TlUi/zqKS/GW6L1K0rZtGS5diufYsdv4RzxFYoYTnZu4MLCjBx3fvEm6Ebp18mHRaVW5sbEf6HWw6TS8vwMcdVCvYQLfXU+jlLOWX2vfseJ4/Xg8P0cbCHd34IcavkRc/53r5nQGuRdnvJft4lUIQdj134ixGHnVrTjjvMtx1RLHS+lq2qpZDi8QrrP/gB5kWMJJcZOKShBzne4oGP5iPb+yAD3ODONzXMl70X2U31nJJwD0ZUoOpckh47tcET+jQU9zhxU4K/nPuHHAOJ5rYiMKGpo6LMdNsX8s6RmnuRLVBzDj5FiTov6f58ty5G6MpmtcvvkSQqSidyhLsSILUe4RnFSk3yJ9Xw+wpIGDF/oqM9G4l8+zTUHmpOnmBkyn31M39P44Vv8KxdE/zzYAIvEarHgB0uPVgrDeUHcEivbhuiSIM7/AjglgSgU0UL0/1HmtwL+HsJjJWD8L0/oZahYbjQ5tk37oWw9B85iztgiLGePuZRhXTIa0zIwrOkcc2g7HodVQFN39WdhY+89IJ2HlXOIXf2ij/HAMq49X77dxiWhW6JYUD3KfvBemmJsk/bKExDVfYY66Yi3XePnj3edt3Nv2QuNkP7iz5L/Jw5yPkv82BoPBalWRX998IFcliETyuJBz8snH3v0mv2tm+eSTPFZu31IDZVWurmqcNQ6q20pIiAcVK6pfDVIy1EVySIB6Ewr0VbePXFWzKng7qwoQgCqq5SHpJtgXp7rC1PGyXTA181W3jyUbuWo0cN2smr21c8658FMUhX5uqmZzTVoUQgh2mNQv5u44UU2be6yHPrr6AJwQN7hqUQM0CQR7+BmA6jS7pwIEoApPWTXTa5mDyBZwM03c4opQvwxU0AwqkAIEoJpuDHq8EFjYa3wDIXJmvBBCEB0/AzDjoCtFsN+M+1KAADjoilLER9VKZxjPEB03Lc/6wpxO+uHXVAWI4og+/Mt7KkAKii6wLbpKHwAayIgm/UBvLGnX85Yr4TL82EVVgGh08MxClAZvPnQFCIBStg288BMEVAEscOgr+Kk7Iv3e6VmzsNy+TNq7T2P6eZqqAPEKwmnMLzi9MPmxK0AAFI0W/VMv4jLtMA7PjAKdI5jSMa79CMP7bbBcPX5f/QohSNr0PZc6lyJ2zhgsyfEobl54PPcqxX88RdHPt+Ja6+HEW3mY6HwD8X7pTUr8eJqi3/yFc/22oChY4qOJmfU/Lj1XlpgvJ2BOirt3ZxKJRCKRSCT/cqQSRPJYyQqMGlq2ODoHHRq9qrHz83MmOFj1gTQLNWBloJ+q6ShTTP33crI6fYtl0yMEuatWIALBVYO6oK/labswre+tagqNAr6NV308ndAQrrevLezkqvqeXjenc8yYzC7LOQCe1lTMc7FUW1sKL9Svr+syM6mc5wgJRAMQQctc22ZHQeEZBgMQw3UuZwY/BThumg1Y0OFGSW3+3VOy0CnORGg/BCCZy1wyr8tRJyllA4b0SAACfEaj0eSd9vdeuLk0xMtNtYxJTFlNUsoWu/WEEGScGG+NAaKr8hEa56J26z4oOr+GOFSdpcbzMCVg/HskwmQ/xZaIOw+re0NGkhr089nFKEUjHopcuaF4FIOOS6DCc2pB9DH4oSsi9Xae7YQQZPz+LWnjGyCuq/NI2+BFXKbsQVu86sMWu8AoDk7o272Oy0eH0TUbABodlqvHSJvyNOnrpiHulaY2G6mHfudKjypET+mPJTEWNBo8XhhO8eXH8Rs+E12RgptcP4k4lgkj6IOfKLb8BB7PDUZxdEYkxZLw7UdceqYEtz8diSU1f+njJBKJRCKRSP6NSCWI5LGSnKgGF/UN8MXL1wtFpyoofHyc8fd3Ub8AZyoaAn1VZUjZENWSI9WSGRQ18E5/igJFPcCsM5Oa6elV1cPWEsRHr8HXQW37c5qqBKnt6IU2F4VGqM6FYI3qdrM85QInhJoytKku78wVGkWhk7Y6AL9ZTiOE4LfM6NOBlLTxO7wXxShPMGraqj2oiopUcZNrYhMAFTQvo1VyZhPKD37acIIUNfPMacvXmIXBus9iSc20AgFnp/o4O4bf1xh34+s1BEe9uui+FfceZkvORZn52nJErBrcSVvyVXTeD1fRoPWuib7aHNA4ItIukfH3mwiLrS+oiDkDK3uoAUqdvKDztyiBYQ9VrtxQtA4oTSfB0x8BCiRfhx+eQyTdsFtfWCxk/DAO47cjwWwEZ08cR/yAU68ZKA75N1l+HCiuXji+MAWnMRvAtzgIC6afZ5A2uRmW6It5tjVFX+PGmC7cHN4S0zU1c49znZYUW3ocvyEf/GtTzDoElsBv+AyK/3gajxeGg94JzEYSV8zmUqdSJKz6EmHOvxJJIpFIJBKJ5N+CVIJIHhsWi4V0g+qK4u3rid7Rxepm4efngr+/K4r+zuIswFtVggT5q/8aUP8tdVdszYoBYHRSF696BYo55Ux9WtldtQ65IlQlTDvnvHOAt3ZWY0RstaiuMK7oqay5d8aK5jrVzeeGSOCwOGO14mhEwa02stqcYh8x3OCseTFgwRFfQrWdC9xfdqro/ocGRwzc4px5mbU8Jn4uQqQAWop4j3mgMbKjKBqC/D5AwREhUolNmGuz35L4N6bzapovjV9TdCEvFtrYeaHxqIxDeTX4rEg8ivHku2SFTRIpt2DVi5CRDHo3eOYbFP9Kj0SuvFDKtoX280DRQloMrO6JiL9oU0eYMjDM7olpmxrLRlPzGVym7kVX8f6Dyz4OtMXDcJn0G9qn1PkgbpwibfxTZGybj73wVkmbvudK7wjSdq0HwKFUFYp++QdB09bgEPTfCEqt9fLDb8gHhK69gmfP0aB1QKQlE/PxcK693IC0gzsft4gSiUQikUgkjxSpBJE8NpITk63/d/d0x933TjBKb28n/PycrV+oXZ1Ap1UtNYL9dAiNgtCpyo2id4XVqBII6U5qPJAQJ22O9LQADb31WLRGjBr1S2iEo1eesnZ0Vc1NTDrV3SBcUwxtPuJihGi8CcqM+7HBoi7EtDhQjpr3bHs35aiBB6rGZ4f4nisWNRZIOW1/NMqDxaJwVgIoqTwPqNYgGSIBo+kmCSlqnnVv997odHkrigqKTuuHr9drACQk/0Sa4W8AhDCRcXISYEFxq4BDhXGPNEaD1r8p2mJ9ALDc3oLp8mI1De66gWBMBa0jdP6uUDPAPChKsQbw7EJwcIfkm7DyRUS0qnAT6SkYpnXE8vdWABxaDsFp4BcoLvnPgvMkoTg44dRzBo6vrwBXL7CYMC4fS8bC1xBG1YrJnBjLjTefJXpKf0RyPFqfIhSZsoyQBXtxrFDwa+/fgMbFDd+BEym+4jRurV8CRSHjzGFujGjNtaFPk3HlzOMWUSKRSCQSieSRIJUgksdGYvwdFwgPL3fcvLJMOgRubnq8vJxQHFRXFi/XO+2K+GoRDnesOwLvpGUHoJQPGDOVICWd7Wceqe7hiMVRzTvvomgp5+Bqt14W4XoP9ICjTm3TQFP2XodnpbVWzQ1/WzkGQGnC0N5HdmoFDfVQc4bfMG/FTBoKOkI0rQrclz3K6XqjQY+FDE6Z5hOf9C0g0Cju+Hj2LZQx7sbTrTN6B1WZcDN2LEKYMF35HgxqYFKHcm+haO7PzedB0IUOQOPbGADzpS+xbHoN4tRYMLT+BMW79COX6V4oQdWh4wJw9IT0BFj1EparkaS91wrLxYMAOHQYhf65R6tUeljoyj+Fy3v70NZUrwnTnytIe78tyVt/4PLzFUj7S3UVc6rZhJCF+3Ft9Oy/4rgfFJ1vIAFvf0XRr//EsVJtANKP7OLqS9W4PWcMwpjxmCWUSCQSiUQiebhIJYjksXG3EsTVwwsABTMajYJWq0HnrAYWddDc8V3X6xT0LqoSQasI3O9aIxfzBLNedYcJziVbRwU3HWZndfwAxSnXeCBZ6BQNlRx1aDVqRprwPLLC3E1zXSW0mHHXqNk7qtM8323vJpymKGjws6h9+St1cVDc7tEqfzgo7pTR9ATginkViSmqpYmXx0soyoOlJM0NRdFSxEd1PzGbbxAfMx/zpUyXjSLt0bjlX9lUuHIpOFScBC4l0SRkoLmoxiah+gCU4k89Fpnyg+JXATp/Bw6uWNJSSfugHSLqLAAOL01D3/71xyxh4aI4u+M48Ev0L0xBWCB+335uTeqNSE0CnR6/0fMImrkBrZff4xb1icOxTBjBc3cQMPUHtD5FQAgSl83iyovVSD916HGLJ5FIJPfFlStXaNKkCZUqVSIsLIwff/zRui80NJSwsDDCw8Np27attfzcuXNERERQpkwZBg0aZNe9cuLEiXz++efW7eTkZEJDQx/qsTwMFi5cyK1btwrcZuTIkQ9Jon8+nTp1wtvbmy5d7ri6p6am0rZtWypUqECVKlX47LPPrPuaNGlChQoVCA8PJzw83Fp+6NAh6tSpQ9WqVenRowdGozHHWPZ+Cz+/f947zurVqzl9+nSB2uzYscPmHD8oUgkieWwkJajuMI5OehydHHF2U83zFcudwJyO7mqGGO7KAqF3U5UgThrB3foLJ53ArFOVFc4m+xYXeo0CzqkABFjyp0So6KzKICxagpT8uxKEaLwJ0aagUQQILaWplu+2d+OEK2VEKVxQlTxltIUbK6O0tjsKOjzSjAiRgqK44OlWeDccezjqy+Hu0k7dOL8EhBm0LjiUHvZQx70XisYBx6JD0V1TrX8s3v5Q+7XHKlN+ULxCsTT+kPQzCWBU56x+4Dz0DXs+ZskeDoqiQIWniUv0wpCgvjDoHLUEjZ6OR7ve0vojDxRFwe2pDneCpyoKppsXuTaoITFfjkdkpD9uESUSiaRA6HQ6Zs2axfHjx9myZQv/+9//SElJse7fvXs3kZGRbNiwwVo2atQoJk6cyNmzZ4mKimL9+vWPQ/RCw5xH0Ov7UYJI8mbYsGEsXrw4R/no0aM5efIkf/31F3PmzOHs2bPWfStWrCAyMpLIyEhr2YABA/j00085evQo1apVY8GCBY9C/IdGXvPwfpQghY1UgkgeG4kJqiWG3lE15dA6qFYfiDvm2IqDus8BW22oxkW18HAQOS+w20YLZK57DEn2lSBCCEwOmeOk5O0KYx3TQZU3KcON6+aCLQ5KaVXLjXSLJw48mHtHcZN6cEY06JSQB+rrbhwUd4rRGr/M9wU3l9ZoNYVjaZIXfl6v4ZiqwzlT/6UrOwpFl7/f5WEhMpJh41soAoReg7FIOqabOVMIP2mI1AQMC0chjBbQKjiW8UR3Y4Ma1+RfSNrhP7jauybGG5fAQY97CT98SrpiWTmO9J+m2P2iJ7FFcdDjN+QDis7fg75sNTCbSfh2Gpe7VSLt2N7HLZ5EIvmHYjZbiI5OKcBfar7rms0Wu2MGBQVZv64HBATg4+NDbGxsrjIKIdizZw/t2qkfY3r16sW6dQV71o8fP976VT8gIIBJkyblqDN27FgqVqxI27ZtadOmDT///DMAGzZsoG7duoSHh/Pyyy9jsajH5efnx8iRI6latSrNmze3KnLOnDlDixYtqFmzJi1btuTGDTUjXJMmTXj77bdp1KgR3333HfPmzaN27dpUrVqVvn37YrFYWLVqFfv376dLly7UqVMHgL1799KwYUNq1KjBc889R3Ky+oFyzZo1lCtXjsaNG/PHH38U6Hw8LizCRJqIKsS/W6SJW1iEKc9xmzZtinvWR9tMXFxcaNxYdat2dXWlbNmy1t8qNy5fvmz9XZo1a8bKlSsLdPzz5s2zzsOQkBD69s3pyj537lzKlStH8+bN6datm9W6Kbd5EBoaysSJE6levTq1atWyHkNUVBQdO3YkIiKCp556ipMn1cQRffr04Y033qBJkyZ89NFHrFmzhjp16hAeHs6zzz5LcnIyf/31F2vXrmXYsGGEh4cTExOT67zes2cPlStXpkGDBvz0008FOh/3ouCBCSSSQiIlSb2hOzio0zDd7AAYMBvvKDbMmVM0IyXZpq2jsxaM4GQxA7YuLxdTM9sLuBWbMzMMwA1zOkJRF0e3k/Pn6nFJ3AQgzeTOvvQ4iuqC8tXOghlFcwsBXDR7karJwOU+3UuEMJMo9qlya9w4ovx2X5lm8iLEWJF48TMCyHANLdS+c0OjuOMb5wYkk+4IOt/aj2TcPNn2DqTdBkWLqWpjMBzAfHYmWu8INM6Fq3wqLIQpg7SZXeD2ZdBocXzuf2hPL4Sru2HnRETTKf8qy4jEtd9we8ZQEALFxZ2gmT/jGFoewyfdsFw8hGnT55CejL7bVBSN1PnfC8ey1Sj6xe/ELXiP+G8/wnz7OjdebYxHp0H4vvYRiu7BAjBLJJL/FrGxaTz/fMEWcvnlhx864++f98eS/fv3Y7FYKFZMdWFWFIVGjRqh0+kYPXo0zz33HDExMfj4+FifjSEhIVy7ds1ufx988AHz56suu1nKCoDJkyczefJkbty4QbNmzejdu7dNu71797Jp0yYOHz5MfHw8FSpUYMiQIdy+fZuZM2eyY8cOnJycGDp0KD/88APdunUjJiaGtm3bMn36dHr16sXKlSvp2bMngwcPZv78+ZQoUYIff/yRSZMmMW/ePACMRiO//fYbALGxsQwaNAiAl19+mXXr1tGpUyciIiL4/PPPqVKlChkZGYwcOZK1a9fi7e3NtGnT+Pzzzxk+fDivvfYau3btIjAwkKZNm1K3bt2C/kSPnHRi2Gx8ptD7fZq1uFDkvttfuXKFI0eOUKNGDWtZjx490Ol0DBgwgMGDBwNQunRpNm7cSKtWrVi1alWu83Dx4sVs2bLFuh0fHw/AoEGDGDRoECkpKTz11FPWfrO4du0aM2bM4MCBA+h0OmrUqMFTTz2V6zx46623AChevDiHDh1i/PjxzJ8/n3HjxjFixAjGjRtHzZo12bdvHyNGjODXX3+1Hu/27dtRFIW4uDieffZZAKZOncrXX3/N8OHDeeaZZ+jSpQvt27cHoFu3bnbn9YABA1i0aBERERG88MIL9/0b2EMqQSSPjayYIE7OqmVERkamhUN6KhaLBY1GgyUzDW5qUopNW4tWA0awpOXUzl5IVb94a0waYlLsL/hOGTOVKgJup2gxC5FnXJBYkcItVHnTjG7sMMTS0TV/SpAoLiEUVc7bZk/2ay7SSHd/mUXixDFMmXLEaF05yh+FrgRJSfwBgFQHuKqspRiFe9OxhylqA5qMZAQQ52/ClPQ9vl6vPvRxc0Nc2wsX1GwqNHgLh4odSN/bFUyJZPz9Jo4R36Io9hVsjwshBOlfvoy4chQAfd/P0NXujPDxgT9nwqk14OIPdUc8XkELAWGxcPuT10la9QUAusASBH+2CV2R4gA4jVpHxvJ3MO1chGnnQkTCLRxf+QpF82T9Zk8iis4Bn4ETcWvWhZtjX8B07TyJq+aRdmgHQdPWoiuS/3hIEolE8riIiYmhV69eVqUFwK5duwgODubq1as0a9aMatWq4emZ0705t48Fb731FkOHDgXUmCBVqlSx7jOZTHTr1o3p06fniBWye/duOnXqhF6vJyAggKZNmwLqV+4jR45YFQxpaWkULVoUADc3N5o1awZAzZo1uXjxIklJSezatcu6qDSbzTZjde3a1fr/w4cPM3bsWBITE4mLi6NkyZLWdlmcOnWKI0eOWOXJyMigSZMmnDp1igoVKliVR88//zyXL1+2e04keWMwGHjhhReYPn06rq6q0u77778nODiY2NhYWrduTeXKlWncuDHffPMNw4YNY+zYsbRu3Rqdzv4yvVevXkyfPt26fXdMkIEDBzJw4EBq1aplU75v3z6aN29unfNZCojc5kEWWfOmZs2arF27FoBt27Zx4sQJu/J16dLFeg1dvnyZLl26cOvWLVJSUmjRokWO+rnN6/j4eIxGIxEREQC8+OKLdt2O7hepBJE8NuJjVRcRZ1dnANIzrfWFOY3kxGTcPd0xC/UiMqSk2bRNynQJSU7IqQQ5l6ZagmjMGhIMIAQ54oacNKpKFSXDEQsK1w1miuWSSQbgjCXTf1JAhtmJP9Pj8n2cZ4kEwGxxJAM9u8zn7lsJcsO8EwAXpRRGxchtrnKba/hR9L76u5v0jDMYTZcAuOUGaZwlwXIaT83DSwcrhAnzBXUxa/Yui8nhBHFJ3+Lp/jw6re89Wj8EecwZsHmUuuFTDqp0UwOlVvoA45HBkHYZ07UfcQjp9shly4uMFZMwH1a18A7PjMKhdmd1R3hfiD0Lp9fCofmI4IgnOrjrvbCkJhP1bh/Sdqk+207VGhL44Uo0LnfcthStDn33D0DvgmnzXMyRGzB8/hJOQxaj5BIsWWKLvnQVii05TOxX40lY+jHGiye52r8uAe98jUu91o9bPIlE8g/Ax8eZH37onK+6QghMJjM6nTZfFos+Ps657ktPT6dTp06MGTOG+vXrW8uDg4MB1dqjefPmREZG8txzzxEbG4sQAkVRuHr1KkFB+fvIlZ0xY8bQoEEDq1vN3cdmb1sIQfv27fnmm29ytHF0vOM6rdVqMZvNCCEIDAy0iSORHRcXF+v/+/fvz88//0ylSpX44IMPMBgMOeoLIahRowbbtm2zKT906NA/0mrUEV9aOKwttP6EUJVbjvjcZ3tB7969adu2rU1Az6x56OPjw3PPPce+ffto3LgxlSpVslp4/PHHH1YXk4Iwe/ZsgBxWIFny2NvObR5kkTUXs+ZhFgcOHECrzflxKfs8HDZsGG+//TatWrVi2bJlVmuRu+WwN6/j4uIe6jyU9sGSx0ZinGrR4OqmakbTMzIvRpOBxPgkUtIEWcE9sitBLAJSs+JipJkxmW0v6gupqmJEZ9SSkgFJdsJ3ZFmC6I3qQ/R8au7BewCOm1WTNC/FDVC4YjaQZsm7jVUejgDgJtSv1ActF/PVzh5XxS8AFFWa4ozqf3iE3+67v7tJTFH712r8EA4BAJw1f1to/dvDfGszmOIBcC41FkVxBkzEJnz9UMfNlUPfqG4wKNBymvUGrPWqhsZfTUdsvjAPkRHzeOSzg3HXUkxbVHNYbd2uOLT9n3WfoijQZBJ4l1ELfh2OSM7bL/VJxRR9jWtDmlkVIO4dXyHok19tFCBZKIqC/rnx6FqoFkWWY9sxfPw8wiiDfeYXRafD99WpBM7cgNanCJbEWG6O7kT0zBEI078zxoxEIik8tFoN/v6uBfhzyXddrdb+EkYIQZ8+fWjWrBk9e94JCJ6SkkJSkvreGR8fz2+//UbFihVRFIW6detag6EuXryYDh06FOg416xZw4EDB3j33Xft7q9fvz5r1qzBaDQSHR3Nzp3qB626deuyfft2rly5AqjWK1evXs11HA8PD/z9/a1BXY1GY65f41NSUggMDMRgMLBixQprubu7u/U8VKhQgUuXLlkXnykpKZw9e5YKFSpw8uRJrl69islkssmw8ySjUXQ4K0UK8S8AZyUAjXJ/NgNjxozBxcWFsWPHWstMJhO3b98GVCuRjRs3UrlyZQCio6OtdT788ENefvnlAo23b98+5s+fz1dffWV3f61atdi2bRuJiYmkpqZa51Fu8yAvGjduzBdfqB8wLRYLR48etVsvMTGRkJAQLBYL33//vbU8+zzMbV57e3vj4ODAwYMHAVi6dGk+z0T+kEoQyWPDmKG+RPsVUTWsGRmqf6UwpZEQl0Riyh1/y/RsSpBEA4isyKcmM3FJtsGxrhvUbW2GetO6kUQO9qbHA+AtnAA4nZL3C/1hoT6UKimBqozAEaOdju/CgpnrnAegqqJ+jYgmmUSRllczuySLy6SjLryDNU2oRD2g8JQgQlhISVM10B5uXSit7Q7AdbENk8j5BaGwxjRdmAuA4lMfrWsZvNzVl5bElLVYLMl5NS98eRIuw8Ev1Y1qvVG8S9vsdyj7P9C5gzBiPPeZnR4ePebjO8n49k0ANBUb49h7Vg7NuaJ1gA5fgs4ZzOmw9uV/XKBUU9QVrvavi/HcUdDq8B/zJf6vz8oz1oeiKDh2mYCuvZpOznJmD4bpHREZqY9K7H8FLhFNKfr1nzhWVe9hSau/4Gq/Ophu5f6yLpFIJI+DXbt2sXz5clavXm0NEnn06FGioqJ46qmnqFatGg0bNmTYsGHWxeeHH37IhAkTKF26NP7+/natOfJi1qxZXLx4kZo1axIeHm6N0ZFFnTp1aNasGWFhYfTv359atWrh4eFBQEAAc+fOpWPHjoSFhdGyZct7Zm757rvvmDlzJtWqVSM8PJy//vrLbr1x48YRERFB27ZtbdKw9unThz59+lCnTh30ej3Lli1j8ODBhIWFUa9ePc6ePYuzszOffvopzZs3p1mzZlSvXr1A5+O/RqtWrejatSsbNmwgJCSEffv2cfXqVT788EP27t1rnYcbN24kPT2dVq1aERYWRs2aNWncuDFt2rQBVAVc+fLlqVSpEg0bNrTrOpIXc+bMITo6mgYNGhAeHs748eNt9oeEhDBixAgiIiJ45plnqF69Oh4eHrnOg7z47LPP2Lx5M2FhYVSpUiXXjErjxo2jQ4cONG3a1MZ1q1u3brz77rvWwKi5zeuvvvqKnj17Ur9+fYoXL16g83EvFCFD5/8jSExMxNPTk4SEBDw8PB63ODZYLBZu3bpFQEAAmgIEH3znlclsWLGJrn078vb0kfTqtYYrVxJJvbKDWV+9gnfJcEZ8rC76049sZdOm7jg4aDkbAwMzAwTrT9zk0xE+lC9xJ9Bo7V1RxJsEfrfccYxzZXxzaJptLWsRgtCrWzEB4UmlORvtTCs/Rz6r7J2rrB3TPieeNIbpmjEz2sB5cxoTvMryinuJPI/xOuf4itEADBPz6GJYhBkLkx2eLbBLzGnTAk5a5uGAO60dNnNdOct8xqh9MxvvBwjaBJBmOMS1aDWIVomgVaB151djKwRmqmneoYSu8INNmW5txXRSvUnrI75H41ICsyWZC9daASZ8PF/Fx6NPgfu9nzkphICVPeDWUfAoBi+sQtE55ahnvrUF48kJAOiqzEDn8/iChVluXyJtQkMwZaApUQ2nN1aiOOYeKE5c/RPWDVA3qvZAeertRyTpg2G8eYlrAxtgSYgBrY7AGT/jUqNxgfrI2DQH40+TAdCUq4/Ta9+i6F3u0arwuN/75JOEMJuJ/WIcCcs+VgscnSny3nJcaxfsRU3y+Pk3zEfJk4nBYODChQuULFkSJ6ecz9DcUN1hTOh0un+kK8a9SElJwdXVlbi4OGrXrs2ePXtyxHKQPFn8G+dk1jxMS0ujUaNGfPPNN1StWvVxi3Xf2Lvf5HfNLJ98ksdGzG01ZZmjk+prlpyspqwV5gySE5NJyLQEERYzIEhMVM3YY7JipAqBYhHEJNyxBLEIQZJJ1ev5alVLkEvxtuNeN6eTFUmkuqNqRn82Nff0V6kig3hUy43y2iAiHL0AOJJxb0uQc5nxQFzxxFvxo6Sixrj403zhnm3v5qplIwBFlIYoikIwZXBEXcQdY3eB+7ub+GTVXNJBF4qDLhgHxZ2ATOuVi5bCj+4uhMB0SXV5Ubwi0LioCiWtxg0PVzVYU3ziEsQ9UpMVGqfXqQoQgEbj7CpAADT+zVE8wgEwnXwXYXk87hXCbMLw2UtgygBnD5yGfpunAgRACakLtYerG0e/R5z++RFI+mAYr1/k2oB6qgJE50DQJxsLrAAB0LccjL7XTFAULKd3Y/jsxX+cNczjRtFq8R08lcAZP6M4uUJ6GlFvPkvi6i8ft2gSiUTyRNOvXz/Cw8Np0KABb7/9tlSASB4LY8eOJTw8nOrVq9OpU6d/tALkQZFKEMlj4/ZN1crDwVENVJiQoC4mhSWDpIRkqzuMyIy9ER+v7r+dacmuyUxPFpt4JzbH7QwLWVtFHdVgPZfuimF60aR2oAHqZsYjyXKhscfZzKCoClBK8aOqXo3FsduQe975LE6xH4ASVAKgYWaA0VOiYDEZMkQCyaiKk2LaNpnyKFRFDXB5lkMF6u9uhDCSkqa61Xi63QliVkaruqYkcIIkUXDFTV5YYndBmhqE1aHUazb7vD36ARosIpnk1C12WhcuIj0Jfsv05S32FEqx+rnWVRQFh/JvARowxWO8YN/38mGT8dNkxM0zADi+ugDFwz9/DWv0h1A1Ajjb3kHEX3pIEj44xmvnuT64MZbEONDpCfp0E85huf8298KhQQ/0L6kR1S2n92CY2w9hyf3al9jHpVZzin1/FIcS5UEIbs8cTvTMYQjTI1JYSiQSyT+M5cuXExkZyfHjx+nbt+/jFkfyH+Xjjz8mMjKSkydP8vbb/wxr4IeFVIJIHhvpBlWp4e7pTkaGGYslMzCqOZ242/F3lBtm9cU6KTPCaXxmOA1XRV28ZI8Jcj39jkKklLuqBLmRaDvu+czMMD4aB0q7qAqYNIsgyWR/MXTKchOAQDxxVvSE6VXTqihLBsmW3F/6BYJbqCnFyqGmdwrXqunGzotoUkVGrm3v5pZlDwBaXPBV7vhmlqc2AJc4gYEUu23zQ0rabiADUHB3aWUt91HCcEGV+aJpzX33bw/jRVV5oPFtiMatjM0+B10Rqxyxid/miGhd6OyfB6Y00DhAsyn3rK5xLoamqJodxnLtB0R69MOV7y5MJ3/HtFX9+q57+hV05Rvku62iaKDZe+DoBcIMvwxF5DGPHxfGq+e4Pqwl5thbKE6uBH2+BecqD+565PDUi+javwGA5ehm0hePePjz61+Izi+IovP34NpcTcmYtPorrg1uijkp/vEKJpFIJBKJRHIPpBJE8thIN6hKADd3F1JT75ilC7OR2OhY4hJVpYQm0x0iMVGtH5NpCaLXqAuX69F3FnA309U2zhqFMj6ZmWXuWt+dN6lalLI6N4o730ntdDnNfraXY5brABTRqMqPyg7u1n1/5+ESk8BtjKiKm6Koi/zymkAUFARwwpJ/a5Boyz4A/JVaaJQ7KT5DqYQGLSCsqXjvh4RkNfK3o0NltFova7miKARrmgBwVawvtMWiJeU8pKhBl3Qh3e3W8XLvAYDRdIZUw75CGdceIi0O/v5O3Qjvg+KSPxNVh9D+oHUBzBjPzXpo8t2NSI4l/euhAChB5dB3HlfgPhRHD2j9iboRfwH2zi5MER+YjCtnuDqwHuboa2jcvQn+bBPOlWrdu2E+cezwJrrGfQAw7/mBjMxYIZKCoXF0JmD8Ijy7vw5Axsn9XO1VHePVc49ZMolEIpFIJJLckUoQyWMjyxLExfUuJYjFSFxMgjX1rcaiKj8SEtQMJVcT1Hr6zIxVUbF3lBc30lWNh6eDQlCmruJWiprrO4srZlUJUlnvhptOg6+DehlcSrP/NfyiUFNZlVfUwKMuGi2BWjUQ6/6M+FyP7zrqIl+LDl/UnPNOigNFUJUpB835d0O4KVRXFV+lhk25Dj3BqFFfj7Az3/1lx2JJIy1ddafxdOuSY39x7bMAGEkkTthPgVVQTFcy0+7q/VE8wuzWcdSXQ++gug/FJX5TKOPaJXIBWEzg4ArVB+S7maJ1QltSVUZYbu/Akpx3JO3CQAhB+pI3IDEKnNzVOCDa+0vdpgTXhMqqNQuH5iNuHS9ESe8f481LXHu5ASIlCfROBH28AcfyNe7dsIDou7+PtqYa7Ne0eS7GbfMLfYz/Aoqi4Pvqe/iP/QY0WswxN7nSJ4LUg/d3P5JIJBKJRCJ52EgliOSxYTapygtnFyfSsikghCWD+NgEUtJUzYVeo9aLi1OVF5n/4Ous7s/uDnM5Va3r66ChSKYSJM0Iydk8T05kqGlXQ3VqUNHiTuplcC6X4Kg3hepPU04TaC2rrFM7/8sQn+vxXctUghSjAkq2S62apigA+y0Xc22bnVRxAyOqDP6aiBz7w2gEwEWOISh4fIPU9L2ACQU9bi5Ncux3U4rhSggAF8wrcuwvKMKchiV6GwDaoi/kGXHb2131mzVkRGIy5Z027r5kSYmGo5lWIBGvoujzDix6N7qg9iiuqpWP6cKcwhYvB8atX2GO/AUAx5emofF7wHRhDUaBayAgYOsYhOnxBHnNwpwYy/XBTa0KkOC5O3AsF/5QxlIUBccBc9FUfRqAjOVjMe758aGM9V/AvWV3guZsR3FxhwwDN99oT/K2B79fSCQSiUQikRQ2UgkieWxYMs0znF2ds1mCCLCYSEpM5lamhYeTXl0kx8aqliCJ6j8Euqvlyal3Fv7XMmOCBDpqKeJ2Z6yo5MzehbBagpTUOQPgkWkJciw5pxIkSRgwoMpWXONjLa/j5AXA5cy+7HENNWhlUcralNfSlATgvLhtPQd5EW1WXUG0OOGulMqxvzyqm4CRdKvipSAkp6oKCWenmmg0znbrhGqeA+Cm2InlAbO1mG5tAmEEtOiCOuRZ182lEYriCgjik354oHHt8tfHYE4HJy+o0q3AzRVFi67UEAAscX9hitlTyALewXL9JMYVkwDQ1miHrlbHB+5T0eqh7eeg0UH8Ofjr0wfu836xpBu4MawV5ts3QKMh6OMNOJWt9lDHVDRanF75Gk1FNdtMxqJhmE798VDH/DfjXKkWxZYcwqF0FTCbuDWxJ3HLPnncYkkkkv8QV65coUmTJlSqVImwsDB+/PGOcjs0NJSwsDDCw8Np27attfzcuXNERERQpkwZBg0aZNf1d+LEiXz++efW7eTkZEJDQ/Mt1+uvv06VKlV477337u/AJE8snTp1wtvbmy5d7lhTp6am0rZtWypUqECVKlX47LPPrPuaNGlChQoVCA8PJzw83Fp+6NAh6tSpQ9WqVenRowdGY84MdgsXLmTkyJE2ZQXJNPTxxx9TsWJFhgwZUoAj/HcilSCSx4IQgrQUVYGgWoKoF7ouM0SHxWwmPllVbnh5qIWmzMClWVYdRTKVIKmGOw+rOKNaJ8RJi6seMvUbRGfGDI2yZFizx2RZglRwVWNsXLRjCXLZEmP9fzHljhIkKzjqRVMaGSKn9YXAwlVOA1A0010li6pa1arCiJkr4t4ZZm6IHQB4UlENankXHvjigZp69xQFi50hhLBmhXF2rJNrvRBta0DBjIFo8WeBxrgb843VAGh8n0LRueVZV1F0eLqq2WoSUlYXarpckXQDTq1TN2q8nGtK3Huh9a6N4qZm/zGdnYYQ9mPLPAjCbFTT4QozePjj2KfwlBWKXwWopbr1cGQR4trDi7+SG8JiIXpqfzLO/w1AwMQlOFet90jGVhwccRr0DYpfCRCC9M9ewnKrcDMh/ZfQ+Rel6OdbcaquKpbi5rzF7dljZPBZiUTySNDpdMyaNYvjx4+zZcsW/ve//5GScidw/O7du4mMjGTDhg3WslGjRjFx4kTOnj1LVFQU69evL3S5Fi1axOHDh3nnnXdsys3mwn9nkDxahg0bxuLFi3OUjx49mpMnT/LXX38xZ84czp6986FyxYoVREZGEhkZaS0bMGAAn376KUePHqVatWosWLCg0GX94osv2L59O7Nn28aC+y/OQ6kEkTwWDGl3zO6dXZxJzVRAaHWqYsNstpCarr40uzur0zQxMQMhwJCpGA30zKxrAUNmQNSsTLehzmqcBHdHdftWZvzSS5npcQFCMhe95d3UulEZOZUZlzOVFIGKJ07ZApJmBUc1IjhrzJmVJYYbmFGPKRjbzCcBijveqAqY45lBV3NDCEGsOAJAUGaAUntUQM2acZkTefZ3N+nGUwihnhM3l8a51nNUfAhQ1DGuWe4/Za0l6RQkq8ohXfGe+Wrj5f48oEGIJFLSCvEr/e7pgABHj/uyAsmOQ/kx6n/SozBH/fLgst2F8ZfPELFXAXAc+i2KY8Hcdu5JeF/wzrQy2vQ/hDF3C6eHwe3pr5GyfSUAviM+xq1J53u0KFwUJ1ecRq4GJ3cwGkib9iwiJf6RyvBvQuPqQeBHq3Gq0QSAxOWziJ4yAPEffMmSSCSPlqCgIOvX9YCAAHx8fIiNzf2DkxCCPXv20K5dOwB69erFunXrCjTm+PHjrV/1AwICmDRpks3+Ll26kJCQQM2aNdmwYQNNmjTh7bffplGjRnz33XcsWbKEqlWrUrVqVaZNmwbAvHnzrH2GhIRY0+ouWLCA2rVrExYWxvjx4wG4ePEi1apVo3fv3lSsWJEXXnhBKp4fIU2bNsXd3d2mzMXFhcaN1fdqV1dXypYty40beSdEuHz5MnXqqB8kmzVrxsqVKwskR25zJothw4Zx/vx5WrZsyfz58+nTpw9vvPEGTZo04aOPPmLTpk2Eh4dTpUoVXn/9dYQQrF271tpnqVKlaNq0KQAbNmygbt26hIeH8/LLL2OxqGsoPz8/Ro4cSdWqVWnevLmNAvJJQypBJI8FQ5rB+n+nbJYgmsz4EAlxCRgylSAumR/or15NIMWINepFkNedWBJZViNRmYFR/R3Vqe2j6hq4khlM9apJHddD0eGQaVVRzEm1NEkxCwxm24fGGUsUACF42ZT7avW4KWq7vzPuysELXM10hXHAyWqlkYWiKFTSBANwMjP9bm6kch0TqgYnQFs713rlUNPmXuE06eR/AZucqio0tFp/HHTBedYN1jQH4LplO+YCpPfNjulKZvwN1zIobhXy1UanC8DVWY17Ep+0/L7GvRuRcBnOb1I3ag9X3UIeAI1rKTS+qoym83MKNeWsJeYKxl9UlwJdw57oShS+i4ii0UKbz0HRgCE+U0H0aIhb8hFJP6uBbz27v45n50GPbOzsaLyDcPzfj6BoIfEWabOeR5hzmqJK8ofG0YmgGT/j2kxNoZu8+XtujuqIyHi8cWckEsmjJyYmldOnY2z+btxQ320yMszWsjNnYq3/z+Ly5YQcbRMT83cf2b9/PxaLhWLFigHq+1ejRo2oXbs2P/30U6ZsMfj4+Fjjk4WEhHDt2jW7/X3wwQfWBWH9+vWt5ZMnTyYyMpJffvkFX19fevfubdNuxYoVeHl5ERkZaXXDMRqN/PbbbzRv3pyJEyeyc+dO9u3bx9KlSzlw4ACDBg0iMjKSXbt24e/vz+DBgzl+/DgbNmxgz549REZGcujQIfbsUd1wT5w4wZgxYzh+/DhRUVH88cd/17XTIG4Tbzlp85ci1I+OZpGeY1+85aS1bbK4dKdcnMSQmRzhQbhy5QpHjhyhRo07Qd579OhBjRo1mDPnTjy50qVLs3HjRgBWrVqV6zxcvHixdR6Gh4cTHx8PYHfOZOfTTz8lODiY3bt3M2DAAKts27dvZ8SIEQwcOJDVq1dz5MgRTp8+zapVq3jmmWeIjIzkwIEDhIaGMmLECG7fvs3MmTPZsWMHkZGR6PV6fvhBdVmPiYmhbdu2HD16lKJFixZYkfMoub+0AhLJA5JdCeLs7ERysvow1OtVxURcTAK+RlUh4eulWmAkJxtJyLa+D/G5o8NLSLbg4y2Iz1x7BmT2E+IJZ2PuBFO9lJkeN1jneKcfpztpcq+lmyntcueyyFJS+Cu2Gl6AUjoXjhiT2JuewPNuRW32nUe13gggBIWcgT/LKUXYxVn2my/m2Jed25YDADjigxslc61XnIooaBBYuMDfVCB/6USz4oG4OuVuBZJFoKYRmBUsGIi27CVQ+1S+xshCmFKw3N4BgDbwmTwDot6Np9v/2Tvv8Ciq9Y9/ZmZbek8gCb33paMUKYqIBVCsVxEVLKiIVyxwEbCiXttPvYqKiNyrYkVEsSEgUhREAyjSlNBJ78nWmd8fZ3bTNpWQIM7nefIkO3POmbO7J7sz33nf73sZRSXrcLh+xuU+hMV8koagW14CNAiKhq6XndxYOqa2d+LK+h48eXhOrMKceMlJj6lpGq5l/wKPE6ISsVw+/+QnWgVSREu0vrfAT6/ArvfQul0uUmVOIQWr3yfn9XkABA8aQ/Qtj5zS49WEqbUd7aaXcS26Be3QDlzvzsbyj6fqtFYNSpEUhfh5b5EV04z8D16kZOtqTjxwKQmPLkMOrvyZamBgcGaycuU+3nprR7lt557bhn/9awgZGUXccsuqSn3WrhXRok8+uYldu8pfiM6ePZjzzqvskVaWrKwsJk2axKJFpZW/Nm7cSGJiIkeOHGHkyJH06tWLiIiISn2r+sx/4IEHuOMOkT5aWFhI9+7d/fs8Hg9XXXUVTz/9dK28Qi6/XAjEW7duZdSoUURHi5TriRMnsmHDBvr27QvA1KlTmTp1Kv379+fFF19k8+bN/n2FhYX88ccfNG/enE6dOtG5s/jO7t27N6mpqQwdOrTGeZyJpHqXs1ctX/EtSR5DX9NDlJDOes/1lfpcYvkRgF88D5Oj/erf3p4b6MIt9Z6Lw+Hgyiuv5OmnnyYkRETxvvPOOyQmJpKdnc2YMWPo1q0b55xzDosXL2b69OnMmTOHMWPGYDIFvkyfNGkSTz9derOqoidI2TVTExMnTkSSJPbs2UOnTp38a/eaa67h+++/59JLRWTunDlz6NevH+PGjWPlypXs2LGDQYNEhHhJSQlJSeI6KDQ0lJEjRwLQt29fUlNTa/9iNTKGCGLQJDiKS1V8a5DVr+rbdEHC5fbi1UM+oiLEMi0p8VBW/I8JlTCbwO2B3AKVrDLpLHEWMU7LSPE4V9dcjnvFAF3NpSfg0WYZmwQODQ6XlBdBjmq5AHSRm1d6Dr0t4exwF5ASIBLkOH8C0IKuAZ9/V6U5eOEYubg0DxYp8L/icVWIFJFSt2ovxMxYiaMF6RzkdzbXSgTxeLPweIXKHBZyXo3tLVIE4XQknz0cUj+tswjiSfsS8IJkwpQwpk59g6z9kOVIVDWXvIIPiIu+p079y6IVHIc/hNLOWTOR5Ib5GJSDEpHjzkfN+BLv4bcwNbsASTbX3LEaPD9/hneHiFixXv1Ew6fBVKTPzbD7Eyg8DmvnoF32nogSOQWU7NhIxqMiVNPSoRcJjy5Dkps+ONHcfxxa1iHcyx/D8/1/kWKSsVxwV1NP6y+LJEnE3vkUprgksl9+gJKf1nDsznNp/vxXKGGRTT09AwODRuDiiztw9tnJ5baFhYkIzLi4EF59dSyapuH1elEUpdz5zv33n43DUT66slmz6v3EnE4nEyZMYNasWeUiNhITRcRrcnIyo0aNIiUlhcsuu4zs7Gw0TUOSJI4cOULz5pXP+Wpi1qxZDB482J9WUxPBwcEBt/vmAfh9G3x39DVN4+abb/anwfhITU3Fai29uacoyt/S48FHa2UCzeTyApBZEl5+QcQzzPRWlX17m+bi0cQNUw0Nkyey3vPQNI3rr7+esWPHljNN9a3D6OhoLrvsMrZu3co555xD165dWb1aRGhv2LCB3bt3Bxy3OiqumZqozTr87LPP2LRpE99++61/30UXXcTixYsr9fsrrcOmP+M0+FvidJQRQWxWCnW3U5tNv2hUSquURIWLbU6nx18ZxiSLn2Cr+AfNLfCS7ir9R4vTI0Hi9GvGo3o6zAGPyE1Lkkv/SSVJooXuIXKkzBetR/OSp6eWtJLLp7QA9LOIuwcVK8RoaBQg8k9b0DHg8++kl9vVgD+1jIBtAHK0XQDESpVL41akCyKP8A+219gWoNghQihlORybpXsNrQWt5HEApGub61wlxntchMTJMYORTHW7mJckmfBQoUbnF39+cuajP78uDEZDm0OHsTW3rwPmNlNBMoPzBJ5jy09qLM1RiGvpPwGQOw7G1Gt0Q0yxWiTFDOc9Ix5k7oZf3zklx/FkHCVt1uWgqihxyTR//kski7Xmjo2E+fw7UAaJu3TuTxbgTml4n5e/G5FX3UX8g2+CLOPat4OjtwzBW5DT1NMyMDBoBGJigunYMabcT/Pm4maUxaL4t3XoEO3/20fLlhGV+oaHV/19oWkakydPZuTIkVx3Xan3WFFREQUFIuo4NzeX9evX06VLFyRJYtCgQX4z1KVLl3LxxdVXrqvIihUr2LZtG488UvdoxgEDBvDtt9+Sk5OD0+lk+fLlDBkyhK1bt7Jo0SJef/11f9uRI0fy3nvvkZMjPjuPHDlCVlZWVUP/bbFJsUTKncv9hEhCeFAka6V9kXJp1Guo1Kp0u9QZm1T7yisVmTVrFsHBwcyZM8e/zePxkJkpIpscDgdfffUV3bp1AyAjI8Pf5sknn+Tmm2+u0/ECrZna0qlTJ/bu3cvBgwdRVZVly5YxdOhQUlNTuffee1m2bJk/MmXQoEGsXbuWw4cPAyLq6siRI3U+ZlNjiCAGTULZdBirzYJTL20bFi7uDMjmUhEkOkqIIG63Sl6JiPaw6TfvQ4PFEs7MU8nWK8NYJbDIQhzxiSCZRaBpsFc3MU2qUAkkQjdk3V1Y6gFwQiuN8EiUIys9h84W8QVeqHnJ9pZ6ZBSQjRNhNppAq4DPP1wKIhwxh9+8gc1RnVo2boR6EyPbA7YpSyeEUFJEHvnU/KXoS4UJtp2FVEUkSkUSFRHipuIiU9tWqz4AmiMNilMBUBLrl34SGTJejKUVUVRSvwo1mqsQduviRLcrGywKxIdka4asR7l4D76Bptbf/8D5/lxwFIBiwnrjizV3aCCkZj2hxz/Eg83PiMiZBkRzOUmbew1qQQ5SWBRJL3972kUESJKE9dqnkRK7AOB67WbUtD+aeFZ/fULPu4r4B98CJDxH/uDolMF484wTeAMDg4Zj48aNvPfee3zyySd+z4SdO3eSlpbGkCFD6NWrF0OHDmX69On+i88nn3ySefPm0a5dO+Li4modzeHj+eefJzU1lb59+2K321m4cGGt+yYmJjJv3jyGDRtG3759ufLKK/1eERkZGQwePBi73c7cuXPp3r07999/P8OHD6dHjx5cccUVp7Xx5N+F888/n8svv5xVq1aRnJzM1q1bOXLkCE8++SRbtmzxr8OvvvoKp9PJ+eefT8+ePenbty/nnHMOF1xwASAEuE6dOtG1a1eGDh3KeefVHKVdlkBrprYEBQXx2muvMW7cOHr27EmHDh0YP348b731FllZWVxwwQXY7XamTJlCfHw8r7zyCuPHj6dnz56MHj2a9PT0Os31dMBIhzFoEnzVYWxB1nJhj/G6aiGZS8Oz4qJLFf/0fC8gE6z7WEaEyhzN8JKe48XiFIJIiKl0vFhdBPFqUOTSyFGFyNHSVD78K9mm8FO+mz+LSyMMjumpMAoyMVQOvWxnDkZBwovGXncRg3RzzTQOAiCjEEV8la9BBzmebeohflIPchl9K+3P0X4TrwUK4VL7Svsr0ozWmLDgwcWf7MDOiCrbapqHYofIfwy2nl1lu4pYpSg9JWYvx7yriZerLqtbFm+GCKHDFIYcYa/18cpiMiVgNXfB6f6d/KKPCQ0eXPdBfn0PVDfI5pOuCFMV5lY34TzxOXgL8Rz9EHOLf9R5DO+hHXg3iigM88X3IUdVb1rb4AyYDntWgKsQVt+LNv6/DeaLkfHkrTh/2wKSRLOH38GUcJL+LqcIyWwl6J8fUPzgYCjJo+S5iQTP34BkO8UpSWc4oaMmgqKQPu8feI4f4OiUs0l6fQNKZFxTT83AwOAMYMiQIf5KFRXZvj1wpGyHDh3Ytq36Gzvz588v9zg0NNTvd7B27doa5+W7+w+wbt26cvsmTZrEpEmTym2rqjxqoLYgTGB9lPWLMDj1+MxMK1JVhZ6q1to999zDPfdUn+49efLkStt8a6s2JXXLenQsWbKk3L7Ro0czenT5qON58+Yxb968SuOMGTOGMWMqp7aXXec+/5zTFSMSxKBJ8KXDKIpemaVIRFIEBwvBQ9IjQSQgOqq0csfxPPHFpqeSEhkmlnBuoUqWHgnSsozRaWyZ65X9RW58EkfFSJCOepnco87KIkgLKcpftaYsNkmhlaJHc7gK/NuPIuqAhxODTNV+Cn0lESVyVA0cEp7h3QJACC2QaxGpISHThh4AHGRXtW0drl2gl/ANCRpU49hlaaWIlJgT2ve1TkvxZnwDgJIwFkmqv8dERNg1ABQ7fsTrzatTX031QIqev9jpEiRL9TnF9UWyxiEnCFXfe2gJmrdu0SCa6sX55p1irJiWmEfXLq+zIZEsITDycfHgRArs/7JBxs1fsYjCb5YBEHnDvwjqO7xBxj1VSGGxWO9aJqrm5BzHsfh2o+xgAxA6fAIJj70Pkown7RBHp4/Bm/PXu4tkYGBgYGBg8NfEEEEMmgRfJIjv7nJ6ukgfUUyKMMXSI0HMJggLK40EKdTTYeL169cW8UIcUFXI1qvJxFtLL7LDraWLfHdxaQpOklJeBGmle4JklzFXPaKLE4lSZJXPI0ERc/vJVXpBfhhhZJRA6yr7AXRVhJPyEXJwapVLceZrosxunFS7Si8A7bEDcIBfq21XVLIRAEVJQFEiaz0+6FViABc5ZGvVHwdALT6IVrhXHC++bqF9FQkLHo4shwNu8os+q1vnP78BZx4gQd/6O33XBnObWwAZvMV4jtfNG8Tz3RK0Y3sAsExdiKQ0TcCe1GYkJOmRPusfQnMXn9R4jt3byHxOGIwG9RtJ1PWzT3aKjYKpTW/MVwlBSN3+JZ7VrzbxjM4MQoZcRMKCD8FswZO6i6N3nocnq/qS4QYGBgYGBgYGDYEhghg0CU5dBDFZxAWe0ymiEkJDzZjMit8TxGKWsFgUfEUjCvSb6nG6CBIeKnbkF6mklogxguTSqA1JgjBd7/jDIUSQIEkmuELFiyRdOHFqUOgRQsjvqvBCiCCIquitm6P+WiYSJANhFNSS6suLtpdFqoyKxp8V6pBrmpdcxIVwrFKzKaqP1giD0zwyyCGtynbFJd8DEGytXTpLWYKkeILRBRxvzRECnuMrxR+mSKTQkyu5KkkWQmxChMkrfL9unbfrbuDJg5DCTm16iWSJQY4/HwDvkXdFFEot0IpycS1fAIBp+I2Y2vSpoccpZuSjICkiLean2uc4V8Sbm8mJey4WRqixiaISzF+o7Kxl+GRMQ4XBnuujh/Ds/r6JZ3RmEHL2BTR7cjmYrXgO7eXolLPwZDasB42BgYGBgYGBQUUMEcSgSSgpFhVVLFaR1+JwiLSK0FALZqvFHwkSpFd/sehiSVaJeByiF5GJ0EWQ45keTjiFeBFtKb+sW+gl4A97hAjSTqlcDiqpTArNMT0l5oQmojvaylXnqtutouTWEW8JmqbhwU0BuQA0p/oa9qGS1S+w/O4tf+JfoB3Aq5urRkndqh2nLHEkY0ZEp/zBjoBtVNWBy5Mq5hB8Tq3HLkuSLHIGj2vV58FqmoaaLipryAkXNMiFb0SYqNrh8Z7A6dpbqz7aiRRI16NWBkw/6TnUBnPrqSCZwJWJNz1wvmhFnMsfBWchmG1YLrnvFM+wZqTQ5qJsLsCOpWi5qXUeQ/N6SXtoEmpBDpjMNH/+C+TgsJo7nmZYrnwUqXlH0DSc/5mEmhPY0NigbgT3GymEEEXBm3WCozcPwZtbdcUsAwMDAwMDA4OTxRBBDJqEokJxge8TQXyRICEhFmw2q98TJD5aiBM2XaTIc4kl68uQiQgRj4sdGrl6BEeitfyyjtF9QY57RBhJ8wp+IADhJokQRVygH3V40TSNXL08bks5usrn0cksQlKcaGSoLjI5iih8CwnUbPjYVhalt1LUQ+W2Z6tCwDARhk2qvWGghEQyHQDYzY8B2zhcvwLCYDbIaq/12GVJkkVai4scCrTUKttphbvBnQuAqXndSs5VhdXcCUURUTR5hR/VrtMWvbpKQi+khB4NMo+akGwJKHqlGE/qqzX6p6iZB/Fu0M1Qx85ACok81VOsHX2nQkQrUD2w5sE6e2Jkvz4PxzYhlsXPW4qlZeCy0ac7ktmKbfq7YAkCVwmO5y5Hc9e/+o9BKcH9RtDs6c9AlvFmHuPoLcOM8rkGBgYGBgYGpwxDBDFoElwOYYQaESnuCLt0Lw6bzYQt2OaPBAm2iSUaFCRCPxxe8ThKz1DxRYJ4vFDgERdncZbyqS5B+sODiJSV8AAmo5IkEatHkBwu8ZBNEV50UaUaT5DWpiB8sQ173UWkI8SMUKIIJry6lwCAXlILAPao5VNX0rXN4vlJnWocoyKdGQDAYfagUfmC1VcVxmrpiizXzxw0TGqLGRFic9T7TZXtPMdWiD+szZCDA5cLriuSJBGul8stKP6mRnFByz8MR3VBqNf1DTKH2qK0ECkUuLLwpq+utq3znVmgqRAShfm82xphdrVDUiwwRPfvSPsF/qz+eZSl8PuV5L3zDACR191P6DnjT8EMGw85Ognr7SKtSkv7A+fSfzbxjM4cgvsOJ2HBR8Is9Xgqx2eMRS3Kr7mjgYGBgYGBgUEdMUQQgybB6xUXrpExkQB+z4+gIBPBIUEoISJCwuMVF/FRUSJ6w035SJBwPRJEA4r1tjEV0mES9XSYArNIh0k2V44EAYhQRL+9RR6Oqrn+7c2kiCqfh1mSaa+n1+x1F3EUYWYaQ/Mq+5Slu26OmkEB7jIX877yuPFS3T072tILABclZFPZaLCoWNyVD7L0rPPYPiRJork0HIA0dUPANprmRc3eBIDSrGGiQHxEhFykH6OIEmf1Ze34+Q3x2xYJbUY16DxqQg5KRooS1Xc8qQvRtMBl+7ypv6D+tgbQ0y7M1oDtmgqp5WBI1L1pvpuP5nFU3wHwZB4n/WEhOlk69SHqxgdP5RQbDVPnYZgvFqlK3i0f4dn2aRPP6Mwh5KwxxD/8NsgKrn0pnLh/AmpJUVNPy8DA4C9EQUEB/fv3x26306NHD15//XX/vttvv534+Hj69QvstTZx4sQq9/3yyy8MHDiQHj16cM011+B2C0P7w4cPM3z4cOx2O3379mXr1q2V+q5bt46JEyeW29avX79y5Ur/Cqxbt44tW7bUqU9qamqVr+mZwoQJE4iKiqr0Hrdu3ZqePXtit9sZO3asf/uaNWvo3bs3vXr1YvTo0WRnZwNw5ZVXYrfbsdvtJCUlMX78+ErHWrJkCTNnziy3LTY2tuGf1Cnmk08+Ye/e2qW0+wj0f3QyGCKIQZNQqKfDyLr64dR9OGw2E/HN40SJTiBY9wSJixOPVU089qfD6JEgqhl/zEOMuXwkSDPdfsBlEtEnrZTARqct9ZCRgyWqvzxuHKGYayjp2lkvtbrXVcgxvTxuJPHV9vFR1hw1VTdHdWuFOMkSz0W212qcssSQiA0xp4qlclW1CLf3CADBQWfVeeyytFBEGdg89uDQsirt1/J3gltsN+klYxsKkymBIKv4Ui0oqsac1eOEfXoVmZ6TkOT6l+etL+a2t4s/nOl4syobamqahvOD+QBICe0wDbi0EWdXB0Y8JkrFOvNgy0vVNtVUlROzLgdnCZItmGZPfISkNP5rf6owX3g3chdh0Otc+k/U9ANNPKMzh9BzxhM/dwlIEo4dmzg2/TxUZ0lTT8vAwOAvQnBwMN999x0pKSn8+OOPLFiwgKwscS5yzTXX8MUXXwTs980336BU8z01ZcoUXnjhBXbu3EmvXr148803AXjqqae4+uqrSUlJ4dFHH2XOnDkN/6QaEd9NykDURwT5OzB9+nSWLl0acN+mTZtISUlh1apV/m133XUXy5YtY/v27fTu3ZtXXxVV59577z1SUlJISUlhxIgRAUWQvxLVraX6iCANjSGCGDQJuZki39vtcouLQF0EsVpNRMVE+qvDhAb50mEUMJlFuRcgVBdBbBYJkwLeMjfOo83ll3V0MGhoeE3CdyQxgCcIQIcQkSZz1On1m6ImyVE1PpdWJjHXH1w5ZOsVWZJoX2M/gEgpmHhJqDT71XQA8jTfh4JEhFR3/wQJiXaIKI9DFUSQEud2hFwkYzuJSBCAKKkHJsIAjTTv+kr7PSd0cSKkA5It4aSOFYiwECGsFBR/i6pWEZlw4BvwOAAJul7e4HOoDXJIW6RwEZ3j+fPlSp4anu1foe3XU5Sue+a0rZoihSdBr8niwY6laPlHq2ybs/QJXHtEhE783LcwxTRrhBk2HpIkYZv6KlJ0EjgKcfzfVWjumqNjDGpH6MiJxN77MgCuPb9w/O4L0dyuJp6VgYFBXfF6NTJyvbX+yaxDW683sD+VoigEB4sIXYfDgdfr9X/vDh48mJiYmEp93G43jz/+eLUCxqFDhxg4UETnjhw5ko8//hgQ3wcFBSLduqCggObNaxcJ7OPTTz/13/1v27YtI0aMqNRmxYoVdOzYkWHDhnHTTTf5IwH27dvHeeedR9++fRk9ejTHjwuT/eHDh3P//ffTv39/unfvzm+/iejiwsJCJk2aRP/+/enXrx8bN24EYP78+dx6662ce+653H333fzwww+cffbZ9O7dm5EjR3L8+HEOHz7MwoULeeKJJ7Db7ezcuZO0tDTGjx9Pv379GDJkCLt37wZg79699OvXj4EDB/LSS9XfNGlINM2Dx5PWgD/peLzpaFr1Ff5GjBhBWFjtDd/LrpnCwsJKa8bpdPLVV1/VWQRZuHChfy0lJydzww03VGrzyiuv0LFjR0aNGsVVV13lf3+2bNnC0KFD6dOnD5dddhmFhYWAiGaZP38+vXv3pn///v41VtV7P3nyZO655x6GDx/OU089xYoVKxg4cCB2u51x48ZRWFjIjz/+yKeffsr06dOx2+1kZWVVuZY3b95Mt27dGDx4MB99VEsfwFpS2RzBwKARKNFL5FqDrLhcpUphUJAJxWTyG6OG6ukuJpMMFrO/XajwU0WSJCJCZQqV0jSDCHP5i8jYYPCa3X7Jr7kSWARppUeCZLtVvyBRXXlcH90twvvjqLeIYkQOe3wtTFF9tCOedAr4zXuMC0w9yNNEadwwqS2KFHiuNdGSLvzGJvbyc7ntRSXrADCbWiHL9RvbhyyZiJa6k65t5pD6Ba2Y4N+naRpq1ncAKLHDTuo4VREaNJx0HgccFBavJTw0QLTJ7+IkhZZDkYJqFrROFea2d+BKmQqOI2h525Ei7QBoXjeut0VqhdzrfJQOg5psjrWi/+2wZwWUZMEPz8LoZyo1ce75mdy3RJnf0DHXEjLkosaeZaMghURhnfIqjqcuRss8iPO/M7Hd2Hgne2c64RdNRnMUk/XCPTh/3czxe8fR/OmVSCbjtMXA4K9CdoHKdfPST8nY/30onrjIwJEbubm5nHPOOezbt49///vfNaYLPPvss1x//fXVXsi2a9eOr776ivPPP5/ly5dz9Ki4ETB79mzOO+88nn/+eVRVZfPmzQH7r169Grvd7n/suwt+ySWXcMkll+D1ejnvvPO46667yvUrKSlh+vTpbNy4kWbNmnHuuef600umTZvGokWLaNWqFR988AEPPfQQCxeKcvZWq5WtW7eyePFinn32Wd544w0effRRJkyYwNKlSzly5AgXXngh27dvB2Dnzp2sXbsWi8VCfn4+33//PYqi8M477/DUU0/x3HPPceuttxIbG8sdd9wBwNVXX82DDz7oTwOaMWMGX375JTNmzGD27Nlceuml3Hdf41W683qzSD1+SYOP26rZp8hy3W/mSZLEsGHDMJlM3H///Vx22WWAECLGjBmDxWKhXbt2vPDCC+X6ffHFF5x11llERkYGHHfp0qWsXl3qz5abmwvArbfeyq233kpRURFDhgxh2rRp5fodPXqUZ555hm3btmEymejTpw9DhgzB5XIxc+ZMPv30U6Kiovj3v//NSy+9xAMPPABAy5Yt+eWXX5g7dy6LFi3iwQcfZMaMGQHfexApYmvXrkWSJHJychg3bhwAjz/+OG+88QZ33XUXl1xyCRMnTuSii8Q54lVXXRVwLU+ZMoW33nqLfv36ceWVV9b5PagO42zCoElw6iKIzWb1l8cFEQlitVmQ9GiN8GAhaEREWMFSGu4RVibyw2aR8Oor2SqBUuFOekwweGylVRyaKYH9FhL1CjTFXo3DqohUqc4PxEdHk0jVsZhKqxnEklRjPx8t5Cg2e2GHJtJUMtVfAIjQq7zUh9aIsrolFJBLBpGICjPFDpGrGmIbUu+xy5IsXUC6tplcfsOrOVEk8dpqRX+ARwhCStyp8eGQ5VCCrH0ocW4lr/D9SiKIUnAY6fhP4kHvymp4YyKHd0WO6I2a9wvuw//Dqosg7nVvQn46IGG99PT3zJBMVrSh/4Kv/wl/fIV29GqkpNJcX7W4kLT5k8DrwdK2O7H3vNiEsz31KO36Yb54Ju6V/8b744e4u4/CPGBCzR0NakXExGmojiJyXpuL4+d1pD96A/Hzlp620VIGBganB5GRkWzfvp20tDQuvfRSJk6cSEJC4IvYo0eP8vXXX7N69WoOHjxY5ZiLFy9m+vTpzJkzhzFjxmDSBdl33nmH2267jWnTpvH5559z0003lbtA9XHuuefy4Ycf+h9X9MmYM2cO/fr1818w+tizZw+dO3cmOTkZgMsuu4yDBw9SUFDAxo0b/e29Xi+tW7f29/Nt79u3L2+//TYgUn5WrVrFQw89BEBWVhYul8vf3mIRdxhzcnK49tpr+fPPP/F4PLRqFdjYfs2aNfz++++Vtm/bto3PP/8cgGuvvZY1a9YE7H+ms3HjRhITEzly5AgjR46kV69etG/fnueee45vvvmG3r17c99997FgwYJyUUjvv/9+tRf8kyZN4umnn/Y/rijyTZ06lalTp9K/f/9y27du3cqoUaOIiBDXNj4BYs+ePezYscMfheRyuRg+fLi/X9m19OmnwgetqvcehLeO73v60KFDTJw4kfT0dIqKijjvvPMqta9qLefm5uJ2u/3/K//4xz+qTDuqD4YIYtAkOEpE6HhQaJC/PC6A1aoQERUOaUIYCQ3Wq8FEBYG5NBLEVmblmhQJrx4ZEmKqfHIcYgGChQgShEKYHHjZN7eW3lHIRJjxtZIqh01WpI1eySZKF0HM2AihZvHERw8life9P3FMy0XVNHK1nQCE1yMVxkccyZiw4MFFKr9hZzhetRCPV4SXhQQPrvfYZUlQzgZVQsNDlvYL8ZKIZPCmfy0aWGIarCpMICJCr6TEuRWn+3c83ixMSun7FbxPP9kITYLmTW/KpbT4B2reL2g5m1GL/kRS4nF/8oTYN+BS5Ga1S6FqctqeBwl2SEuBtXPQ/rEKSRL/pxlP3ILn6B9gthA/7y1k68lFG/0VMI+9G++u71D/2IJryXSUNr2R41o39bTOGKKuvRe1IJe8d5+laM2HZCe0IOa2x5t6WgYGBrUgOkzmvw/VziNN0zS8Ho+IBq6F0BkdVnNGf0JCAj179mT9+vVcfnnglNiUlBR27dpFmzZt8Hg8ZGRkMHbs2HIeDgBdu3b1ixsbNmzwh/+/8cYbrFu3DoALL7yQ66+vexW6zz77jE2bNvHtt99W2lcxhdb3WNM0mjVrRkpKSsAxrVZxU0pRFL83g6ZpfPbZZ7RsWTla2ZdCBDB37lwuvPBCbrnlFn744Qd/REAgtm3bVslLpamEakWJoXXzhjMr1zTweD0oSnS9+icmJgKQnJzMqFGjSElJISIigt9//53evXsDcPnllzNv3jx/n5KSElavXu33Cakr//nPfwAqRYFA9WupT58+VYpVgdYSBH7vofxamj59OrNnz+b8889n2bJl/miRivMItJZzcnJO6VoyPEEMmgSPR/wTBQcH4XCUFUFMhEeGibKcQLBVrwYTVhoJYlX81iAAhIfKfk+QMFPlJS1JIIcIY70Q1Vxpv484i6yrgipFmhBpmss1ixlWSSZGNhNpzhV9aF1jn7K0l8TdCQ8qR9QTOBEu0VFytzqNUxYJmea0BWAPwsTK4dyJ8AMxY7V0rffYZTFLYYTpxznsLT1h8JWDlWMr57Y2JCFBZyFJNkCjoOir0h0eJ0GH9dK9XS87Le4cy1GDwCpOBt0HFuJa+TS4ikExY718ftNOrg5IkgRD/yUeFByBXUJsKvjmPYrWifSjmFsexdKmYdbY6Y4ky9imLYGgCPC6cSy8Cc3trLGfQe2JvvVRwi8TJ3R57z5H9hsPN/GMDAwMaoOiSMRFKrX+ia1DW0UJ/L2elpZGfr6IRM3Pz2f9+vV06tSpyjleeOGFHD9+nNTUVDZs2ECPHj0qCSAAGRkZAHg8Hp588kluvvlmAFq0aOEXL3744QdatGhRp9coNTWVe++9l2XLlvmjS8rSuXNndu/ezbFjx/B6vXzyyScAhIeHExcX55+r2+2u8s68j3PPPdd/kQz4U2Eqkp+f7488+d///uffHhYW5veyADjnnHP8F+uqqrJzp7iJ16dPH1asWAGISJnGQpJMmEwJDfgTj0mJR5LqHjNQVFTkf61yc3NZv349Xbp0ISoqioyMDA4cEIbq3377bbn1uWrVKoYOHVonjxEfW7duZdGiReUqIpWlf//+rFmzhvz8fIqLi/1rp3Pnzhw8eNAvQhQVFbF///5qj1XVe18R31pSVbXcWii7lqpay1FRUZjNZn7+WaT2v/vuu7V8JWqHIYIYNAlBQeIOcWR0hN8UFcBmUwgLD0Wyin/+IJv4kgsJMfs9QWwVPouiQmU8unVHZAARBMCriyAmb9UfZLIkEWqSkM0loH+3NpPCa/V8epjDiDGJL8iYOqTC+I5hRiip+7TScq/1MUUtS0f6AnAIcbei2PEDABZTS2Sp4UqwJstjAMjUtgkvEMdxcAmDWFPCmAY7TiAkyUSwTXiOFBSXUZf//BpJdaE1oSFqRSRJwtRqKgDq8e/xrBPO8qbzbkMKj2vKqdUZKa4LtNFDGjc/jevwbjKeECeENvsQwi+/owln1/hIodFY7/gfSArakd9wLX+sqad0RiFJEjF3/puQc68AIPetBeR99EoTz8rAwOB05MiRIwwbNoxevXoxZMgQ7rjjDnr2FEbwU6ZM4ayzzmLHjh0kJyezfPnyaseaO3euP/x/6dKldOrUia5duzJ06FB/WP/TTz/N//3f/9GrVy/uvPNOXnvttTrN96233iIrK4sLLrgAu93OlClTyu0PCgriueeeY/jw4YwYMYL27dsTHi7OTd9++22effZZevXqhd1u58cff6zx+aSnp9OjRw+6du3KokWLArabOXMmM2bMYMiQIeXu6l988cW8++67fmPUF198kW+++YaePXvSvXt3fwrM888/z6OPPsrAgQP9KTZnMueffz6XX345q1atIjk5ma1bt5KWlsaQIUPo1asXQ4cOZfr06XTr1g2TycTLL7/MxRdfTK9evVi/fj2zZ8/2j/X+++9zxRVX1GseL7/8MhkZGQwePBi73c7cuXPL7U9OTmbGjBn069ePSy65hN69exMeHo7FYmHZsmVMmzaNnj17ctZZZ9UoglT13lfkwQcf5OKLL2bEiBHl0rWuuuoqHnnkEb8xalVr+fXXX+e6667j7LPPDhjBdDJIWsXYGIPTkvz8fCIiIsjLy/N/+J0uqKpKeno68fHx/pK3NTHp/FvY+dNv3P3w7fQeNorp08Vd/DVrruXbld/x7286IMkyT94RTa8OVrZvT2PGwiPQuy/NwjTevbr0DsDCj/N4taSYomSJc2OsvNy9sgFmvx3bORaVQcvCGH7o0rvKeV24NZOD8jFiu36FBHxj+yemGkrkAjyWu4+c0EcJMxUxin8whLr5Akx2LCZVy+ImxUEEn2EhmjGWwGXcassx/uB17gfgHl4n6/htuD0HCA+5lPjo+09q7LIUaodY4xZCw3DT2wQf24bnzxfAEod14Mf+VIlTRYkzhaPptwDQqvlyzKZE1GXjkXL2oyWfjXxx3U5ITiWa6sG5+SLUbalov+VCcCTBC35CsoU29dTqjFacCf89F83r5ujaQtxp6UjBYbRctgsl8q9Xs74hcH31Eu6PHwXAMm0J5l6lImB9PicNyqN53BybMQbnjk0AxM1dQti5DWuU9nfBWI8GpwqHw8GBAwdo06YNNlvtUyI1TcPj8WCqZTrM34mioiJCQkLwer1ceumlTJ061e/nYHDqOBPXpG8tlZSUMGzYMBYvXkyPHj2aelr1JtDnTW2vmY1vPoMmIeNEJgBms9lfHcZikZEkCUtQEJJ+UhZkLRMJouekBZnK63axkQqavpJ9FV4q4gkS6S3mkuq/kJNsMopVlIWKk8JqJYAAtDcHEawUA5BA3T0w+smtAXBr+4CTjwIBaEZrLHp1m0Par7g9hwAICTr7pMcuS6jUkhC9Gs4xdQ2eNKEGyzGDT7kAAmCz9ETRXbvzilai5RxAytEV7N5TqunZ+EiyCTl2AtrvuQCYz73pLymAAEjBsdBnKvl783CnCff/hEfe/dsKIADm86YhtRLlkF2LbkPNS2viGZ1ZSCYzzZ/5DHNbkSqY8cgNFP34dRPPysDAwODU8vLLL2O32+nevTstW7bkwgsvbOopGfxFmTNnDna7nd69ezNhwoS/tAByshgiiEGT4HYKN2pbsM3vCeJTWRVbiL+dTY+iCw21gCJSWeKDVMoSGSb7jVGjzIGXtNPkBkAuDA6430ebIBOKVeSSRhNSbduyJJkcKJIQZ0LUZrXu56OdLLwiZMTFZJw8oM5jVERGIZF2ABx2fQsIsclm6XnSY1ckRhLRNenOL6HoDwCU2OENfpxASJJMSNBQAAqKVsLvwqPCE9wMmvdtlDnUBfWnfaACioTUqfYGuqcj7tjh5GwXhsDh/XoQ3P/UVAL6qyDJMrbbl4IlCFwlOF66Dk1Va+5oUGtkaxBJL32LqXlr0DTS5lyFY9eWpp6WgYGBwSnj3nvvJSUlhd9//50XX3zxjIlKMGh8nnvuOVJSUti9e3e5NJy/I4YIYtAkuN1C+LBaLf7qMGZdwJDNQf52sirEknKeILK37FCEB8u4db0iIkB1GACPLI6h1BAJ0iZYwRycC0CYVPswznCzuBD0ahIZnuqFlkC0l+NQ8BKJGCdS6lznMQKRjDBbcjpE2V1FjkFRGv7CO0kZDUBw9jGxQbIgR1SddtTQRITqZbVc6Wi/fwRASdvx5R10TwO0/Ay8G3Rjp26ReNM/QVP/miaamtdL2txr0bwqSohCVJtCtGPbau54hiNHJGCZshAA7dAOXJ89XUMPg7oih0aQ+Mo6lOZtwFnC8fsm4Dq8r6mnZWBgYGBgYPAXwRBBDJoEjy6CmK1mHA4hapjNIvVENpWKIKpbGJoGB5shRKQNaJ4KIkiIjK/oS4RSeUl7NY0SXQRxF1mozgUnyWbyp8O0pPYlsYpkUXq22BvMPldxrfv5aCXFEEcesn7N3hDpMADtEaH5Ya5cAIJs/atpXX9ipF5ImEjKEE9AiuyDVEUp4lOBxdwBRY4h5IQHyVWIJsmUtKxci7ypcX36FKhesAQhd4kGTx6e45Vd6P8K5PzvKdwHhelu3Ll9kE0yrHsQTTMiH8y9zkcZfA0AnlXP4z3wcxPP6MzDFJ1A4nOrkKMS0PKzOXbbcDyZx5t6WgYGBgYGBgZ/AQwRxKBJ8JXItVotlJSIVBWfCCKZSyMwvE4hgiiK7PcEManucmOFhkjoxVWweCvf+c9UXfguy9RiK8XuSk38NLcqKGYhYsRptRdBshG5/+muZuxw59e6nw+LZKKNJI6rEoxZqntprEAk0R5JgziXiKgJtg1skHErIktmotVuRBTqKU0JjZuvKkkSYSEXE3FAL7ec0BvNenqlmqh56Xg2ivJg5rEzUJqNBMB7+M2/nHDgOriH3DeFAWjYRZMJuk4vuZd3CPZ+1oQzO32wXr0AKbkraCrORbehlRTU3MmgTpgTW9Ps35+AyYyan82xaSNQC/OaeloGBgYGBgYGpzmGCGLQJPikCovVQkmJuHANDhaRA5osDD40jwNHSUlpJ7MI9zB7PeXHskr+tAeTq3KYR5q3NN3A5LSSVU2gRjOrhGwWgoHiqb1hZRYiDSTPHcFBj6PW/crSXsoFoKAO4ktNmLCQ7InCpvsSBFl7NdjYFWlb0BkZCRWQo05NxEl1RMhDseWK5+nqek6jH78m3F+9JKJAgsIxj7oZU2vdtNWVhTdrU9NOrg5oHg8nZk0EVUWJiidm+jNI8T2gpfBlYcMTaPX8HziTkMxWbFNfA7MNLfMgrsXTqDYMzaBe2DraafbUCpBkPCcOcmzGGDTXXzPFzMDA4OQpKCigf//+2O12evToweuvv+7fd/vttxMfH0+/fv0C9p04cWKV+3755RcGDhxIjx49uOaaa3C7xR21w4cPM3z4cOx2O3379mXr1q2V+q5bt46JEyeW29avXz9SU1Nr9Zzee+89unTpwoQJdas8aNA4TJgwgaioqErvcevWrenZsyd2u52xY8f6t69Zs4bevXvTq1cvRo8eTXZ2NgBXXnkldrsdu91OUlIS48ePr3SsJUuWMHPmzHLbYmNrb0j/3HPP0aVLF26//fY6PMMzE0MEMWh0NE3ze4JYrBa8XnHhGhMj0mA8qqK3g6LCUsVCMguRRPK4yo3nLlMtRgpw7pvu1durErJXIbsaEcSjOJF0g1Ovs/bGqMcRZqC5nggOekpqaB2YaCkLgENaZL36V0Unh4iI8EgKJiWxQccuS1SueN454So5yp+n7DhVYdq/GQlQFciPyWr041eHmnsCz/qlAFguuQ/JEoQc3AopTLhye1Nfbcrp1Ym8957Hc0RU34l/5F1km+6BM2wuSDK48iHlrSac4emD3Kw95ssfAkD99VtMv3zStBM6QwnuN4K4fy0CwLU3hRNz/2EY0hoY/E0JDg7mu+++IyUlhR9//JEFCxaQlSXOCa655hq++OKLgP2++eYbFKXqioBTpkzhhRdeYOfOnfTq1Ys333wTgKeeeoqrr76alJQUHn30UebMmdPgz+nNN9/kzTffZPny5eW2e73eKnoYNCbTp09n6dKlAfdt2rSJlJQUVq0qTX2+6667WLZsGdu3b6d37968+qo4B3zvvfdISUkhJSWFESNGBBRBTpZXX32VtWvX8p///Kfc9r/jWjJEEINGx+PxouonqNYykSAWi/jycejRHJrXTXEZEcRXHUZzlRdB8jylIoi3pPKd1hP6XWnFLfpXJ4Kka6Uh6/klQVU3LIMbJw6K9blE8oenCE8d0xs0TUXRTVFTtXDcWsN9GMU7RHh4ltmEV6omF+gk0DQNMkQ0Q2aUxnHvmlNynGrZJarCFDZXKHR8jdaAr+HJ4lr+OLgdEBaLaei1/u2m1rcAoBX/iVrwe1NNr9a4Duwie/EjAIRfeRdBPUvLLUthzaHb1eJBymK04tNLiGoqzMMmIXcdAYDts8dQMw428YzOTMJGX03ULWJtlmz6nKwX7xWfSwYGBn8rFEUhOFiI8w6HA6/X6/8sGDx4MDExMZX6uN1uHn/88WoFjEOHDjFwoEgpHjlyJB9//DEg0nELCsS5Y0FBAc2bN6/TfD/99FP/3f+2bdsyYsSIcvufeOIJNmzYwOTJk3n44YeZP38+t956K+eeey533303P//8MwMGDKBnz55MmjQJh8PBTz/95B+zc+fOtGnTBoAtW7YwdOhQ+vTpw2WXXUZhofDAa926NfPnz6d3797079+f48cNf6W6MGLECMLCap/GXnbNFBYWVlozTqeTr776qs4iyMKFC/3ve3JyMjfccEO5/dOnT+fPP/9k9OjRLFq0iMmTJ3PPPfcwfPhwnnrqKb7++mt/KeZ//vOfaJpW5fpctWoVgwYNwm63c/PNN/uv62JjY5k5cyY9evRg1KhRFBUV1ek5NCaGCGLQ6LgcpSKGxWYhO1uIFD4xpMSpCwheF8VFIrpA00DTU16cBeUjLXLd4stNcmuUBBA4DntFe6tHpNOkF1Y9t3RN+HmoHjOHimpXWSSbE/6/8zwReKHO0SDFHAfE808jgoNaw11AKq5DABwJsnFMj1hpaLTiA+DJBSAjUuOY1rgiiJa5GwqOApDXxoyq5ePVfmvUOVSFmnMM749CoDGPubOc540caUcK6wqA58i7TTK/2qJ53JyYfTm4XZhadCR6yrzKjQbeCUHR4C6CH55t/EmehkiShG3qQgiOQPJ6cP7nOrQKKX0GDUPUP2YS+Q8RJpz/0cvk6IKdgYHB34vc3Fx69epFcnIy9913X43pAs8++yzXX399tRey7dq146uvvgJg+fLlHD0qzjlmz57NW2+9RXJyMjNmzOChhx4K2H/16tX+i0m73c6uXbsAuOSSS0hJSWHbtm20bt2aGTNmlOv3wAMP0K9fPz788EPmzp0LwM6dO1m1ahUvvPAC119/PS+++CI7duwgJCSEl19+mX79+vkjCgYMGMDdd9+Ny+Vi5syZfPrpp/z8888MGjSIl156yX+cli1b8ssvv3DBBRewaNGi6l9gg1ohSRLDhg1jwIABfPTRR/7tr7zyCmPGjCExMZEdO3Zw3XXXlev3xRdfcNZZZxEZGRlw3KVLl5ZbS7m5uQDceuutpKSksHHjRuLi4pg2bVq5fi+88AKJiYls2rSJKVNESvbhw4dZu3YtM2bMYOrUqXzyySfs2LGDvXv3snz58oDrMzMzk2effZZ169aRkpKCxWLh/fffByArK4uxY8eyc+dOkpKS/GLh6Yghghg0Oq4ykRyWMsaoQUEiUqOoxBcJ4vJHgjg8iFB7oCS/vNKR5xGiieSF/KLKERhHPCJHJsQrjFXTqxElT6giakJTzRwsqV00RxZCMTdpFlRVRI/s89RN+czXRHlHl2Ymn2D2e9Pq1L8qvN48VDUXgHSrlT/Y3iDjVjpO5ncAqKZQim3gIJ0SrWGeQ63Qy+IS0xEtpgMAbu/pUXXFteJJ0FThBXLO5HL7JEnClCyiJ9SMNaiO0/fuS86Sx/EcFWlOcbNfQ7ZWjpSSLKHQ/w7xYM8KtOxTI7r91ZCCIzDfshgNIG0/7s8NgehUEXXzw4SMugKA3LcWkP/ZkqadkIGBAVl5XvYddpf7OZElxGCXW2PfYTf7D7vZf8TDfn2/j8Npnkp9CwKc65UlMjKS7du3c+DAAd555x3S0qo+Hzl69Chff/01119/fbVjLl68mH//+9/0798fRVEwmcQ56zvvvMNtt93GkSNHeP3117npppsC9j/33HP9wkRKSgpdu3Ytt3/OnDn069ePcePGVTsPgHHjxmGxWMjLy8PpdPojVK677jq+//57f7tXX30Vh8PB9OnT2bNnDzt27GDEiBHY7XbefPNNDh06VG5MgL59+9baq+R0xePNxOHaXe7H7RHefarmrLTP4drt7+tyH/Rvc7p24/Fm1nseGzdu5Oeff+bjjz9m1qxZ7N8vUomfe+45vvnmG44dO8ZZZ53FggULyvV7//33ufLKK6scd9KkSeXWUkWxZOrUqUydOpX+/Wv255s4cSKSJLFnzx46depE69atkWWZa665ptxaKrs+N2/ezI4dO/yRIN988w0HDhwAIDQ0lJEjhfH/6b6WGq+GpYGBTrlIEKsZh0N8EVqtYjkW+kQQj4OCPBG2UVgmA8ZRIRIk2y3SHiQvnMitfIe1BLE/WQuluMJYFTmkCXMiryuIklrmlKcjvkTCpWiaK1YOeR385ipkTFB8rfoDZHt3AuAgDJDYoR1lDD1q3b8qHK5fAVCRybVY2McvjOCqkx63It6MbwEwRQ9BkVbjxUGadwOtTZc1+LEqonndsPsT8aDjJUSEBpOZ+wxefkLT3ID1lM+hyrnlZ5RGgVx4N5K58lzk2GFgihDlcg++iaXT7MaeZo24D+8n939PARA27maCulVTZajLpfDTQihOh3Vz4dK3G2mWpzemjmdROPRGrN8vxr3qeZSu56C0PzXVmv7OSJJE/L8WcexEKs7ftpD51DSU+CRCBpx+JbMNDP4urNpUzNtflg/DHdHXxv2TosjM9XLn05UvNL/8P5Ei8Mw7uexOLZ/Ke++1EYzqH1zjcRMSEujZsyfr16/n8ssvD9gmJSWFXbt20aZNGzweDxkZGYwdO7achwNA165dWb16NQAbNmxg925x4fzGG2+wbt06AC688MIaxZRAfPbZZ2zatIlvv/22Vu196T4VU/40TUPSo6Z//vlnXn75ZTZs2ODf16dPH9asCRypa9UrMCqK8pf3h8grXE5OfvloltDgMTSLeQiPJ50jaZXfo/YtfgQgLfthnPq5M0BEyA3YrLfUax6JicKHLzk5mVGjRpGSkkJERAS///47vXv3BuDyyy9n3rzSyNqSkhJWr17t9wmpKz6vj4pRIFXhW0sVKbuWKq5PTdO46KKLWLx4caV+vnUEp/9aMkQQg0bH6SxVIaxWK06n+AfxRYKo+me6tzCD3BwRmVFUTgQpHwmS7hQdFDfk5FcWLjJ0Y9R42UoqkFlNOsxRLRcAjyOUNGftRJBc0gFIpB0dTCEc8jrY7qxbmcZsbQcAkpQMwG61YSICHC4hrmBphSp5SOcgKl5kqjb/qiuapwCKUwFQ4kcTI+WQrm3ksPolrTn1IgiHNoCnBJCg40WEWU1k5j4LuCkq+YHw0KarFOP6ZqGoCGMJrhQF4kOSTCgtrsV74D+o6V+itbsTydQwJZIbAk3TODHvGlBV5MhYYu54otr2kmxCO2cefHE7pG1HO7wZqcVZjTTb0xvXiNuwHU5BS/0Zx8vXE/zoj0jBp1cp5zMByWSm+TOfc+TGgXiO/UnaA5eR+Or32DqcuupYBgYGVTP27GAGdbeV2xYWLC6wYiMVXpwZC5qGx+vFpCj+in8A91wT6feK89EsuupzmLS0NIKCgggPDyc/P5/169dz2223Vdn+wgsv9HtgpKamMnHixEoCCEBGRgZxcXF4PB6efPJJpk+fDkCLFi349ttvueqqq/jhhx9o0aJFDa9GeVJTU7n33ntZs2aNP7qktkRGRmK1Wtm6dSv9+/fnnXfeYejQoeTm5nL99dfz7rvv+lN8OnfuzMGDB0lJScFut1NUVMTx48dp3759nY75VyAidAIhQUPLbVPkcABMpniSE6o2b0+Inouq6TdbNQ2tnsUKioqKUFWVsLAwcnNzWb9+PXfccQdRUVFkZGRw4MAB2rRpw7fffkunTp38/VatWsXQoUPr5DHiY+vWrSxatMgvfNWFTp06sXfvXg4ePEiLFi1YtmwZN954Y8D1OWjQIO666y4OHz5MixYtyMrKoqSkhOTk5DoftykxRBCDRsddIR3G6RTRGz4RxOksEwmSKxSLsiJISX75SJB0lxBRZBfkFlQWLv50C9EkwWQhFThUjT6RpnuCeBzh5LlU3KqGWa7eG8TnCRJHS3pZw/nWmcURb91KhBYizBKjsQPFHNFyy6mw9aW4RCjbIZZewDa8eEjnMM1ofVLjlkXN2QJoIJmRI3uTrOaRrm0kj914NReKZGmwYwVkh+7IHd8dKTgWBbCYu+Jy/0ZRyddNJoJoxXn+ijCm0dOQLFUb7ZoSx+NNfR00F56jH2BudWNjTbNGCj5/C/d+IabFz10aMA2mEq2GQWwXyPwdvpuH9o8vkSQj+xLFjOXGl3DOHwZFuTjeuJ2gO//X1LM6I5GDQ0n8z7ccub4van42J+4bR/LC9ZgSWjb11AwM/nbERCjERAQWLixmiQ4tzGiahscjYTKZyp37tEio26XKkSNHuOmmm9A0DU3TuOOOO+jZsycgKrx8/vnnZGVlkZyczIsvvlht2dm5c+fSr18/LrnkEpYuXcprr72GpmlMmTKF884T0WVPP/00U6dOZcGCBVgsFl577bU6zfett94iKyuLCy64ABClc+viybFkyRJuu+02HA4Hdrud2267jffee4/Dhw9z7bXCiD0xMZFVq1axbNkypk2b5jdEfeqpp85IEcSkxGJSAvvAyJIVm6VzlX0t5lb+v8WarNnD6/zzz+fnn3+mqKiI5ORkli9fTkxMjH9tqarK9OnT6datGwAvv/wyF198MYqikJSUxFtvlYoy77//PldccUWtnmdFXn75ZTIyMhg8eDAg/GYefvjhWvUNCgritddeY9y4cXg8HkaPHs348eN5+OGHA67PV155hfHjx+N2uzGbzbz++ut/ORFE0gz79L8E+fn5REREkJeXR3h4eFNPpxyqqpKenk58fDyyXPOFzq6U3fxjlDDk+fHYGu67fy3bt6dzww29mDSpJw++ms3WXU5KDmxgYOxOnlr8MFsOw/1fAF4vyZtW8t//jvePd+OObDbkuAg5rNEnVeGNOaVpKJqm0fLIt3iBf3l78+HXMVgU+CpwyiYXlbxAIU5y/hhMSVZb1g6MI8lWfdTEAq7FhYOJ/JNDxe25KWsH4ZKJ35POqZWI4dYK+cI9CoD2yrNMc4kqKx/YbiVOqn9EgKZ5+ePIMMBDQvRjLAx5h2LyGcONDGRsjf1ri2v3I6jpXyLHDMHS7UlcWj5fuceg4WWQ6QXi5VMX8q85cuHNoYAG5z2N1H4MAHmFn5GR8wiSFESbxC+RZVu145wKnCuewrPqWQiOIPjxn5CCqn8vXfufQT32MSjBWM9ahSSbG2mmVePJPM6RSX1QC3MJHX0N8XPeqHVfLXM3fDBRPBjxGFLnmvOcz2TKfk56Nr6N+3/3AmC57jnMQ65u4tmdubgO7eXotBFo+dmYWnYi6ZW1KGFRTT2tJqeu39sGBrXF4XD473LbbLX/7vVdcFYUQQwMmgpjTZ7+BPq8qe01s/HNZ9DouFyluZ1mi9mfDmOz+YxRRTSH5nHg+8gpdOp/eL14veV1O7eu45lKoMhRPhKkUPPiy0ZraRMRCS4vuAOkqHk1lSLEgbyuEACOOarPZSuhEBci6iOGRNqbRb98zUOGWo35SBnytVLzyHaSHbOeqvKHmlGr/lXh8hzEV3EmyNqTDoj8w8PsrqZX3dA0FTVrPQBytCiXapHCiZKEn8lx79oGO1ZA9q0CNFAs0Gakf3OI7RzAhKaVUFTyfZXdTxWaqxjP6lcAMA2bVKMAAmBuMQmQwVuMmlG7vOBTTfpjN6EW5qJEJxAz/d916ivFdobO48WDLS+guetWMelMxjzkWuSuwwFwvXMfaqZRNvdUYWnZkeYLPgSzFc+hPRybPhrVWbdIPQMDAwMDA4MzC0MEMWh0fMaosiwjSRK5ueKE1GoVF/++3E/VVeQXTIp8uonbTUFBeXHBp1MoDqjov+PzAwFoF1yalpEd4HosmyJ88orVI8SME87qRZCy5XGjaUZrU5BfuNnnrl2FGF9lmCCaY5VDaCfFAfCHml6r/lXhcAifEVkKwWSKpyVdAEjlNzQaJgBMK/gdvCLdSIku9X2Ik4Qj9XHtFIsge1eK3x0vQVJK319ZDkFG5FjmFX54aucQAPeaxeAqAVnBct6tteojWeOQ40cDolxuUwfpFa77BMc28f5F3/EUSnh03Qfpf6cQqIrSYFv9TL7ORETZ3FchKAK8bhxvTDPK5p5CbD3OIv5fIorJ/cevpM2+HK2WxtcGBgYGBgYGZx6GCGLQ6PhK5ComIXqUlJSvDuPURRDNVURWehYAxT4to7iIoiJXuQtEnyeI4hLldVW1dF+G6vT/3aasCFLeW1WMoxX4/46WQgFILan+wsQnglgIwoINsyQTo6cx7Km1CCJKZkVKQqRoJcUAsF09XKv+VVHsFGk1FnNHAL8IUkSe38z1ZPFk6CKHJR7JWpqG1FweDoCLXAq1QwF6njxa3iFI141ffREHZTDLIuXH4dqBV63GDbeh5+Vx4f7i/wBQzroSKTSm1n195XK1ov14c7aekvnVBrUwj4wnbgbA2nMwoaMCu+rXhBSaAN30VI/tS9CK619q7kxDCo7AeptwVtf+3OZfMwanhtCRlxE9TZQhLNm6msyn72jiGRkYGBgYGBg0FYYIYtDouJ0irMMngrjd4o5cxUgQzVVEdmYuAAU+LcPtRtPwp9AAZLtEf9klKssUOcqIIHokSJRkIsgkEabrIFkBRJAMXQSxYaa1VTQ8XkMkSBqpAIRTepe8jUmUm/rFVbsKMVnqL2IMqR0AHWQhJuw9yUgQl0uk2QTbBgEiXcesl4tN5beTGtuHPxUmdki57WFSO0wIIemE97sGOVYlfv9I/LZFQ0Llqg8muT/C+1mlsPgUR6SUwb3xXXAUgCRjufjeOvWVQ9sjhQjRypvadJETmc/NQCsuAJOZhLlLTi4XdsDtYAoG1QMbqq8s83fD1Gkw5jGiwoB75dN49jed8PV3IPKqGYRNEKUOCz57k9wPXmziGRkYGBgYGBg0BYYIYtDo+FJcTIoQPTweITT4RBBFX5Wax4GjRKTKpPuCKnQDt8JCIW6omoZeTAZFT5kpKCoNc07XRZDmJmGWEyOyXAJGghxXcwGIJJiOoSKaI8tVfUpCHsK3I57SigPdzcL/4XdXzdEHmqZRxBEAwuUOAHSUmwGQSzEOzV1l3+rwqoW4vUcBCLL1AUBCojltAdjDT/UatyyaOxcc4him2JHl9kmSRLwkxJcj6lcnfaxKx9Y0+P0T8aDD2IAX6ZJkJcgq0nLyCz9q8DkEnJfXg/urlwBQ+lyMHNW8zmMorcVFmla4G7XozwadX21w7NxE4TfLAIi+5VFM8Sfn9i2Zg2HQ3eLBH1+iZe8/2SmeUZgvnokU1xrQcL48Ca2koKYuBidB7F3PEnSWMFDOful+ir77pGknZGBgYGBgYNDoGCKIQaPj1D1BTBYhNPiMTn3pMD7TUs3jxOkQISD5Ph87PZWmSDcJKfCUihSynjKTV0YEOaz7VYRJYmzde5Wj+ZXndVjLASBWCqGZVfxr1JQOk4cI729GG/+2XhYhgtSmTG4Jx9F081JfJEg7Oc6//4BWv/QBp2sXoAEKVj0dBqADQhA5zJ56jVsWNUcXUiQLUnj3SvuT5PMBKOBPPFoA1elkyPgNHCJVim5Vp2qEh1wKgNO9B683p2HnEADvz59B1mERBTJhVr3GUKIHgkVEA3lS61Zq72TRXE4ynrodAHOHXkRc3kApA90uh5AE8ff3jzfMmGcIksmC7c63QVagKAfnm3c29ZTOaCRZptkjy7D1HgaaRtr8SZTs2NTU0zIwMDAwMDBoRAwRxKDRcetCRkxcFJqm+UUQi0VEghQX+6rDOHE5ddHD5wniEqJIkb4hz1MqeFh08SS/jAhyyC2EiFBJjB0mskE4HkAEOa7lAtBMiiBRj0o5WkN1mAw9iiOaZv5tHc0iDSRf81CoVi+i5GviTr+EiWASAQiRrIQjIlf2ek9U2bc6ih3bADApCeXKw7ZFVG0pJo9Ccus1tg9vzg8AyNEDA5ZzjZP7I2FGw0uG1sBh/r+9L36HJiJFtauyWbBtILIcDqgUlpzalBhN03AufwwApf945LjW9RpHkiRMrUUNZzVrA5rz5KoE1YXsJY/jPrhbpME8+CZSA5XOlGQTnDNPPDi2Be3I5gYZ90xBTmiH+cpHAfBu/xL3D41v5vt3QrJYSXj0PZRmrcDr5vg9F+E6vK+pp2VgYNCAFBcX06pVK2bOnOnftmXLFrp160b79u15+OGH/dv/+OMP+vXrR/v27bn11lsDGpPPnz+fl156yf+4sLCQ1q1bn9LncCpYsmQJ6el1S7desmRJudfRoJTDhw8zfPhwunbtSs+ePfnggw/8++q63jIzMxkxYgQdOnTg0ksvxeGofDM10HsRGxt7ip7dqeOTTz5h7969deqzbt06Jk6c2GBzMEQQg0bHpXuCWKxmvx8ICBFE0zScum6geRx43B6RMqKLIIpH9C0sFL/zykSChOgpEWXTYU54hWiSqKfDJAh9gswAnqXFmjhISyma5jYhgrg0KPQEriLgpBgHYqCyIoivTC7A/hrMUXPVXQAEkYAklf47tpNEJMA+Na3a/lVR4vgRAJu1vFdGM9r4fUEOnUSpXE3TULM2ACBHDQzYxiQFESf1A+C4d129j1Xp2KoXDuglZLtW/2EoSWZCbCMAyCtc3mBzCIRn59ciCgSwjDm5u/lK/PlgjgI0PMca54LYffRP8t55BoCIK+/C0rpLg44vtRoGLUQZZdY/It5HAz/mcyYjdxwMgOvdB1CzjzTxjM5slLBIkl78Gik4FJwlHJs2Am9OwxhGGxgYND2PPfYYAweWPz+5/fbbeffdd9m9ezcrV67k119/BeC+++5j/vz57N+/n7S0ND7//POmmHKD4a1YKrEM9RFBDKrGZDLx/PPPs2vXLlavXs3dd99NUZE496/reluwYAGXXXYZ+/bto1WrVixatKjJnldDUN06rI8I0tAYIohBo1NcKFIjSoqduFyl/yBWq4KrjAWG5nGgqhoupwtfVooVvWSurork6yJKkCwRGSyWc25h6ZiZqi5s6CJIUrjYnhMgUyUXUTe3uRzpjwSBqs1RK5bH9REqm4jU029qKpNboKUCpZVhfNiVFgCkklVt/0BomobLIyJMgq2Dyu2TUWihl449wK91Htt/jKL94BHeBVWJIADxkiibe0L7ruFKvh7bAk7ddLbTuBqbh4WIsrMu9148nvqJSrXBvVykecjt+iMnnZyAIMlmf6UY77HlaJ7aVRqqL5qmkfbQ9aB6kSNiiJo8+9Qc6Cz97kXeIdhlRDuURZIkbLe8DhEJ4CjE+eadhlB0ijEltKT5C9+AYkLNy+LoHeeiOho4dc/AwKDR2bdvH7t372bs2LH+bceOHcPj8dCzZ09MJhPXXHMNK1euRNM0Nm/ezIUXXgjApEmTWLlyZZ2ON3fuXOx2O3a7nfj4eB566KFKbebMmUOXLl0YO3YsF1xwAZ999hkAq1atYtCgQdjtdm6++WZUvXx3bGwsM2fOpEePHowaNcp/Yb1v3z7OO+88+vbty+jRozl+/DgAw4cPZ/bs2QwbNoy3336bhQsXMmDAAHr06MENN9yAqqosX76cn376iYkTJ/oFoi1btjB06FD69OnDZZddRmGh8LNbsWIFHTt25JxzzmHDhg11ej3+TjRv3hy73Q5AfHw80dHRZGdn12u9rVy5kuuuu67S9tqycOFC/zpMTk7mhhtuqNTmlVdeoWPHjowaNYqrrrrKH91U1Tpo3bo18+fPp3fv3vTv39+/3tLS0hg/fjz9+vVjyJAh7N4tbqxOnjyZe+65h+HDh/PUU0+xYsUKBg4ciN1uZ9y4cRQWFvLjjz/y6aefMn36dOx2O1lZWVWu682bN9OtWzcGDx7MRx81rL+fIYIYNDrFRUJsUBQZp7M0XcRqVfyVYUCkw/jaK7rvpez1RYIIcSNXj9IIN0k0jxXCQ2Fx6Ri5qmjfXBEiSLweCZJfQQTxaqq/OkycFEaESUK3D+GYI3AkiE8EMWPFSnC5fYn68VJcAfJuylDIQQCi5PKeGj5fkH1qGmodxQOP9xiaJl67IFtlr45khEfI3pMwR/XqUSCYI5GDEqtsl6AMFXOiiHytgRTfXR+L34kDRAnWGgiy9kaSRHROftGqhplDBbx/bkM7JnxWzBP+1SBjKs3HgWQGbxGe46c2iqVw9Xu4dov1EPevN5CtQafkOFJMR2grRCl+eBbNbVxwlkUKjcZ2g6hYou7djGvlv5t4Rmc+to52Eh4X4cuew/tIf+h6tGruXhkYGNQerwoZhXX4Kap9W2/gUzMAZs6cyYIFC8ptO3bsGElJSf7HycnJHD16lKysLKKjo/0G677tgXjiiSf8F5lnn322f/vDDz9MSkoKX3zxBTExMVx//fXl+m3ZsoWvv/6a7du3s2TJEn78UUTrZmZm8uyzz7Ju3TpSUlKwWCy8/75I983KymLs2LHs3LmTpKQkPv5YnPtMmzaNRYsWsW3bNqZOnVpOcHG73axfv55JkyZxxRVXsGXLFnbu3InZbGblypVMmDCBfv368eGHH/Ljjz/icrmYOXMmn376KT///DODBg3ipZdeoqSkhDvvvJNvv/2W1atX+y9wT3c0zYPmTG/4H6361HYfP/30E6qq0qJFi3qtt7y8PCIiIiptr8jSpUv969But5ObmwvArbfeSkpKChs3biQuLo5p06aV63f06FGeeeYZtm7dyqeffsovv4jqlFWtAx8tW7bkl19+4YILLvBHp8yYMYMHH3yQn376ieeee44ZM2b42x8+fJi1a9cya9Yshg0bxo8//khKSgoDBw7kjTfeYODAgVxyySW88MILpKSkEBMTU+W6njJlCm+99RYbN25s8AgmU81NDAwaFodudmq2msuVurVaTThcpd9qfhGksJhid6Tog9ifny/25ZRJpwkNEh8o2fm6p4imUaKJ8eMUkQISrWsVDrcopyvr4koOxagIsSFOCkWSJKIsEhkujWMOD+gpJGVJR6Q+hJUpj+ujiyWUXZ5CfnVXXelB1TwU6J4g4VL7cvva6+kwTrwc03JJlqKqHKciDpcofytJVkxKUqX9bejBej4kn0wcFGEjpFKbmlAz1gAgR51VbbsQKRErMTjJ4pi6hgi5U52PVRbN44ADq8WDDhfUqo8kKYQGjaKg+FPyiz4hOqKyMn6yuHQvECmhHUr7qiNj6oJkCkWOH4OathLvof9hSr4KSWr4j2y1MI/Mp0WZVlv/cwkZdH6DH6McQ2aJdCZ3EWx9Gc428ozLonQZhjL0Wrzf/w/Pqv9D6TkaU5s+TT2tM5qQs8YQO/MlMp++g+KNn5H5f/8k9u7nT640tIGBAdnFcMU7tW0tAZX9xari/WsgLrTydl8EQ8eOHdm0qdT0OFA0qiRJVW4PxAMPPMAddwjD8MLCQrp3L73R5PF4uOqqq3j66acreYVs2rSJCRMmYLFYiI+PZ8QIkaa7efNmduzYwaBBImq3pKTEf+EcGhrKyJGi8l7fvn1JTU2loKCAjRs3Mm6ciIL1er3ljnX55aVG8du3b2fOnDnk5+eTk5NDmzZt/P187Nmzhx07dvjn43K5GD58OHv27KFz5860aCGikq+44goOHToU8DU5rXBl4/xxQsOPO+BjsFV/0y0rK4tJkyb5RYL6rLeK666qdThp0iSefvpp/+OKniBTp05l6tSp9O/fv9z2rVu3MmrUKL/QctFFFwFVrwMfvnXTt29fPv30UwDWrFnD77//HnB+EydO9M/90KFDTJw4kfT0dIqKijjvvPMqta9qXefm5uJ2u+nXT6TW/+Mf/2Dp0qUBj1kfDBHEoNFxlggBw2KxlEuHsVgU8gvKRoKIcI2iwmJ/5EawSSMHyM0VGzKcQvAINUmY9AyWY5lCsc3XPPi02zjZAkCMLoKoQJ4DovQb3r4oEIBYSVR36RxiJsPl4rgr8O2GTIRCG0vlSIjelgg+Kj7BAU/Vd7oLtUP6TEorw/hIkMIxo+DGy34tnWTqIII4hQgSZO0T8AM0ifZISGhoHGaPv2JMbdG8xWjFBwBQ4kfW0BqaScM4qC3nmLqaLtxWp2NVInUdqG5Ahna1v1iPCLuUguJP8XhP4HKnYjG3Prl5lEFN+wN1rzjRMo+f3aAXTuZWk3GmfQbeArzp32JKaHiBInvRfFGW1WIjftarDT5+RaSQOLRe10PKYtjxX7Rek5BC4k/5cf9KWK98jJJd36FlHcb5n0koj/6IZKu7WGlQe8IvuQlP5nFylzxGwSevoUTHEz25YaK6DAwMGo8ffviBZcuW8cEHH1BYWIjb7SY8PJwpU6aUu7N+5MgRmjdvTmxsLNnZ2WiahiRJ/u11ZdasWQwePNif5lCWihe+vseapnHRRRexePHiSn2s1tKbb4qi4PV60TSNZs2akZKSEnAOwcGlUck33XQTn332GV27duWJJ54IaLKpaRp9+vRhzZo15bb/8ssvhghcB5xOJxMmTGDWrFn+CKGkpKQ6r7fw8HB/NEh91+F//vMfgEpRIFD9Ogy0Dnz41qJvHfrYtm0biqJUal92HU6fPp3Zs2dz/vnns2zZMr788suA8wq0rnNyck7pOjREEINGp6RYfBBbKkSCWCwKzjKiiC8SJD+/BL2ADCH6d0JurtiXqdfTDVdkYiLEP2J+kWic4XX5x4pTyosgAFnFlUUQKyas+t12nznq0SrK5Bbp1VUSaV9pX2fdHDVLdePSVCxS5cyzfFVUI1CwYZXKR5NIkkSSFEmqlsVO7xGGK7WPoHA4d4jnYukacL8ZKzE0J5Nj7OOXOosgau4v+MrvyhG9a2yfrJzPQc9yijiCU8uu9FzrxK/6LaXmfZCs4bXuZjV3RpFj8KpZFBR/TUzEzfWfQwXc3ywERBSIyV676JTaItmaIUUNRMv5AU/q6yjxoxv0C8Hx+0/kfyzmH3Pb45hiq05talD63Qq/fwjOfNjyAox4tHGO+xdBMluxTX+HkvnDoSAT55I7sd1a+STZoGGJuuFfuP78leL1K8hd/Cjm5q0JO/8fTT0tA4O/LNHBImKjNmiahsfrwaSYavU9Fx0cePuCBQv8qTBLlizh119/Ze7cuYC4iNuxYwddu3bl3Xff5Y033kCSJAYNGsTnn3/ORRddxNKlS7nxxhtrN2mdFStWsG3bNr755puA+88++2zuuusuZs6cSW5uLt999x033ngjgwYN4q677uLw4cO0aNGCrKwsSkpKSE5ODjhOeHg4cXFxrFq1irFjx+J2u9m/fz9dulT2ISsqKqJZs2Y4HA4+/PBD/13/sLAwCgrEOW/nzp05ePAgKSkp2O12ioqKOH78OJ07d2b37t0cOXKEZs2a8cEHH1QymT0tsURjHdhw6cOapuHxeMBS9XmrpmlMnjyZkSNH+v08ABITE+u83i666CL++9//cscdd7B06VIuvvjiOs1369atLFq0qEoPl/79+3PfffeRn5+PyWRi1apV3HHHHVWug/btK1/f+DjnnHN49dVXmTZtGqqq8ttvv9GjR49K7fLz80lOTkZVVd555x2io8VrWXYdVreuzWYzP//8M3369OHdd9+t0+tRE4YniEGjYzILcSEqJrJcJIjZLPs9QRQZTCbxJZhTWCpmhAeJJetLh8l2i/ZRFpnYSLGvSC+xm6WW9ovUS7gGW/D7i2SXCdI4oQqjzQhKvRBizWK8XYWBRZAsjgEQTWWltoMugmhQZTRIjiaMSYOpnLIC0FUS4/6mHgu4PxCa5sHpFt4UtipEEIC2iKoxB9hR67F9qL7SuJG9kZSavSOipB6YEDGraeqmGlpXjebMg+Mp4kH3q+vUV5IkwkNFiGRh8dcNZtKq5Wfg2SCEGfPoaQ1WUrYs5ja3iD+cx1Fzf26wcTWvl/T5kwCwtO9B+PiGE4ZqQjIHw9n3iwe7P0HLCBxS+XdGbtYB8xUiJ9b7yyo82z5t4hmd+UiSRML8/2Lp3BeAjMdvpvjn9U08KwODvy6KLFJWav0TUvu2Sj2+bl966SWuvvpqOnXqxNixY/0XbU8++STz5s2jXbt2xMXFBYzmqI7nn3+e1NRU+vbti91uZ+HCheX2Dxw4kJEjR9KzZ09uuukm+vfvT3h4OPHx8bzyyiuMHz+enj17Mnr06Bp9D95++22effZZevXqhd1u9/uLVOTBBx+kX79+jB071m/cCcK4cvLkyQwcOBCLxcKyZcuYNm0aPXv25KyzzmL//v0EBQXxwgsvMGrUKEaOHEnv3jXf8DodkCQTkjW+4X+qSUXeuHEj7733Hp988onfo2Pnzp1A3dfbrFmz+OCDD2jfvj0HDhxgypQpdXr+L7/8MhkZGQwePBi73e4X/3wkJyczY8YM+vXrxyWXXELv3r0JDw+vch1Ux4svvsg333xDz5496d69e5UVlR588EEuvvhiRowYUS5166qrruKRRx7xG6NWta5ff/11rrvuOs4++2xatmxZp9ejJiStwUo2GJxK8vPziYiIIC8vj/Dw2t8BbwxUVSU9PZ34+HjkWlwEzr39MVYu+4IJ113M2Guv4957v8VmU/jii2v48VcH817PwWyC7A8mUVxUwqzX/80rmcJ74gJnCl98vJMBAxJ58slRXPlzFr8UuLm8mY3zi608viSXIKvE8qea8VlxGjdn7SRYUtifPMJ//PFvQZ4T7h0GYzuLbS+4VvOx9xe6S0m8ZBO3LZafKOb+PfmEKxI/DSmfC+jGyeOIO4RTWEASHcrt1zSN7sfWk6O6eS2mBxcFV84l/N51Ezn8SgtpLL3N8yrt/9K9kyc8XxKGjZVBtSu56nTt4XCauLBtk/glihI4jWY/v/A2jyFj4gHe8pfNrQ2OH8aDKwNT2zv8FUxqYpvnQY6qX5PAUAZanq65QwC0XR/Cd/NBtsBNm5FMVc850Jp0uQ9y6MQVACQnLMFmOfkSsM73HsSz5nWwhhD8zG9IZttJjxnwONvvQsv7CTlqIJYezzbImLnvPEP2wjkAJL62AZt+4ddYaJoK718O2XsgpiNc/tEZHX5b189JEJ8jjpcno+74CoIjCHpwDXJ0YNHUoOFQi/I5csMAPCcOIllsJC3ajKV156aeVoNSn/VoYFAbHA4HBw4coE2bNthstf9O9N11N5lqFwnyV6OoqIiQkBBycnIYMGAAmzdvruTlYHB6cSauSd86LCkpYdiwYSxevDhgBMdfhUCfN7W9Zja++QwanbxcEXWhaZo/EsRiESpriR4JYjZJxCSIkKm8MpEY8ZGinS+NRpFE+0SrQniIWM5OlyZKfurpNBFyeQU3Qv9OPlHGszQPkaLTVi79QkqyiX4FXg1vBa0wh9JSq1FlyuP6kCSJZN2MdWcVFWKKEeWfoqSeAfd3UIRwUoCDHK12JVJL9FQYWQqvUgABaEEnJGRUPBxlX63GBlBLjoArQxyjmtK4FYlnMADpbEbV3DW0roL9eh5hh7HVCiBVYTG3wqSI9yqv4OP6zaEMmqMIz3ph0GQ695ZTJoAAmFpeC4Ca8yNqYe3fr6rwZBwle5GIMggdc12jCyAAkiTDED0aJGuvMEs1KIckSdiufxbC46E4D8d/rjPK5jYCckg4if/5FiksEs3l4MR94/BkHm/qaRkYGPyFufHGG7Hb7QwePJjZs2cbAohBkzBnzhzsdju9e/dmwoQJf2kB5GQxRBCDRic/x6c+aH4xw6vXOnM4hdhgMUFomF7WVPfkkIDwECFMZGWJFJMC/XogylIqgqgalDg1DnuFsBEllXcb9/mCHCujTRzX02FiKbUaT7TJ+iwho4I5qq88roKJoDJ9ypJsEqkigcrkerRinGQBECF3qLQfoJUUgxmROvSHmhGwTUWKHSJ8zGruWG07K8FE6+LNflJqNTaAN3uz+EMJRgpuU+t+CYqI5NHwkKX9Uut+PrTiTDiqh3zWsipMIMJDxgNQWLIaTTu5i0n32sXgcYJiwnLuLSc1Vk3Ikf3AKt4v94GTNy9NX3AzeNxIwWHE3lW/yJyGQEoaAInC9Zv1D6N56ymQncFIoTFYJ/8fANqRXbg+faqJZ/T3wBSXRNKLq5FDI/CcOMSx6eejFhc29bQMDAz+orz33nukpKSwa9cubrih4avUGRjUhueee46UlBR2797N7Nmzm3o6TYohghg0Oi6nuNCxBdn8IojJJJZisV7txWKW/MJIboHw9gi1QliYMDjNyxNRHif0/uEmiYjQ0uWcX6RyQhdB4nVTVB/NRfEXcktKtx3WsoHSyjAACZZSx+OjjvIXzL7KMKFEIhE4RK6PRYRg7Q/gCVKgHfD/HSa1DdjfJCnE6OVrf/fW7i6kyyX8QIKCBtTYtgUivHsftfeZ8JfGjQhceaYqLFIEobQG4Ii3sjN0jez9DNDAFARJ9TfnCg8ReZeaVkyJs/7+GprXjfubVwBQzr4KKTii3mPVBkmSMLWeKo6d8wOa40S9xyre+i2On8T7GDvzReSQJk6vG/4wIEFJNqS81bRzOU0xdRuBMlREA3m++D88f25r4hn9PbC07UbCI8tAkvEc2cfxey5C8wT2iDIwMDAwMDD462CIIAaNjsslRA1bsA2nU5xQmnUT0qISEQlitUhYLCKCI69YtLEoEBIitvn6FXlE+wiTTFhIeRHEhdjX0VS+tGQLPUvEV/RF0zSKEKJKvFwqgphliVizuNA/VkEESeMgAJFUXTe8m1lcXKZ7nZXSafJVYThkJgyTVIXFOdBOFqVDU7TDVbbxoapFePSIkSBrrxrbd0Lcgc/gCF5qvgOvqR60AmFgKcfVXBq3IonyaABOaBvqbky66wPxu/VIJLn+Ra1MpngsJlGOOLfw/XqP4926AoqyQVKwXPjPeo9TF5T4c0EJAzTcB+tXKURzOcl6/m4AgvqNInTUFQ04w/ohRbSELpeJBz+/hubIbdL5nK5Yr3wMKUaYgjlfulaUNTY45QT1HU7sfS8D4PztR9IfmdxgxsoGBgYGBgYGTYMhghg0Om5XaSSIw1FeBFH1rJOEaBMhejpMgZ4iIwGhoSKqw+VScXpVfPfkIkwyFpOESQ/eyC9S/SVy4yr4R/jSYTJ0m408SlB1wSSuTCQIQMsgccF9zFleBClBhEUHKo/rw1chxgsc8pSU25etV4YJoUWV/QHsstj/Zy3SYRyu3fhK11rNNZv4tUIYg2qoHOWPGttrBbtA9/NQomqONKlIkiKEEzd5FHKghtZljpt/FPKE6ET3K+t83IpEhF4OQHHJFlTVUef+mqbh+lKkJ5gGXYYc1ThlZSXJhNJSmN6qaV+iuQN7zVRH9lsLcB/eB4qJmLufO32Mvs66Gyzh4CmGn15u6tmclvjK5iIrUJSD850HmnpKfxvCL7yeiEni9S5a+xHZrz7YxDMyMDAwMDAwOBkMEcSg0ZEkseyCgm0UF4uLarNeNtdXItdmkQgNFyJCsVvss5lKRRCA9MLS6IUIPWLDZhG/8wpVDrhFGkpchXQYnwiSWQSaBhla6R3VWKm8v0ekLs7sKSwfKZGje4LEBiiP6yNRsWLV/8X2esobm+Zpu8X4UtVlbAE6y8304xVTrLmqbetwCq8Nk9IMWa7ZpDOIMMIR5rN/ULNPhzdnCwBSaCckS9Wmq1URSmuC9HLAJ9Tva99xzwrx2xIKzex1Pm6leYSch4QFcFDs2Fjn/p5d69COC3NS83m3nfR86oIpcQLINsCL9/jyOvV1Hz9I3tvC/yN8ws1YWgT2omkKJGsEDLhdPNj5LlrOn007odMUuVl7zP94EgDvlo9w//BBE8/o70P0TXMJOVeIsHnvPEPBF/9t4hkZGBgYGBgY1BdDBDFodMx6JRhbkM0f+REbK5SJzFwRceHxaoRFiKiMEr18a7AFQkJKBY0T+U7/3+G6p0iwbmaaW6BSoIk4kTg5sAiiAflOyNREVIcJmRCpfNRIM4sY70BJaSSIitdfHSY6QGUYH5Ik0dUiRJW97vIiSLHuKRIpdauyP5Smw0DN0SDFjq0AWC2dqm1XbnxE7fcjtagQ483aAIAc1b/W45dFkiSay8MAOO5dX/uO+78Qv9td4BfQTgZFDiXIJoxacwvqnhLjXv44AHLr3shJJ19mty5IShCKXpbYc/R9NG/tI1nSH58Cqhc5LIromx85VVOsP12vgKBYQIO1c5p6Nqct5sH/QOl7CQCupf9ETa99VJVB/ZEkifjZiwgaINL6Mp6aRtGPXzfxrAwMDKqiuLiYVq1aMXPmTP+2LVu20K1bN9q3b8/DDz/s3/7HH3/Qr18/2rdvz6233how5W3+/Pm89NJL/seFhYW0bt261vP55z//Sffu3Xnsscfq94QMTksOHz7M8OHD6dq1Kz179uSDD0pvTtR1vWVmZjJixAg6dOjApZdeisNR+RxvyZIl5dY0UKdKQ8899xxdunTh9ttvr+tTPeMwRBCDRsdZLMQLi9WM2y3EhSA97aSoRKgiVrNETLyIUlCtQrUItUBoaGmll7Si0uiMcJOIAAkP0T088l249RSX2IqRIGUsQjKLSkWQ5lQ2t+ygV6NJK5MOk0cmmj52oPK4ZWmriLnvcOb5t7m0fDwIUSRCbldt/2DJQhIi6mKfllZtW5dbCBlB1tqnqrTXRZDD7EWl6mopmqcAisT4cj1SYXw0k4cCkMuvOHUz2urQcv6EXP0ir9vEeh+3ImHBYwFwuLbj9ebV0LoU7+Hf0A7vBMA8blaDzacumJImgmQGdy6eY7WLBina+BnO7ULEir33ZWRb1T40TYWkmGG4KNtL2g601O+adkKnKZIkYb323xAcCV43jhevQfNUHyVm0DBIJhMJj7yDtUs/8HpIe2Aijj11r3ZlYGBw6nnssccYOLC8kfrtt9/Ou+++y+7du1m5ciW//ipSk++77z7mz5/P/v37SUtL4/PPP2/w+bz11lts376df/3rX+W2e71G2fO/MiaTieeff55du3axevVq7r77boqKxDl+XdfbggULuOyyy9i3bx+tWrVi0aJFDT7fV199lbVr1/Kf//yn3Pa/4zo0RBCDRic3R1x0WiwW8vKEyun1ClHBlw4TZJOIiBLGol5JiBjhVggKMuOzMcgsEpEeoYqEom9MiBapM1llSm3GKeWjO0LMoOhjZBWXpsPEyeX9QACSbUIEyXVrfqXWVx5XQvank1RFO7O42NzuLk25KdB8of4SoVKravsDdFKE+eo+Nb3KNh5vJqomPnSDrN1rHNOHzxfEjYNj1fiCeHN+0v9SkMPrX1M8WuqFjHg/T3g31Nxh9yfid3hLiK0+daguhAafDVgAjYLir2rdz/2pSEWQopNRugxtsPnUBckciRx3HgDeQ2+hqdVXq1CdJWQ+cxcA1u6DCDln3CmfY32RWp8DCT3Fg3XzjJK5VSAFR2CdJirpaOkHcL03t4ln9PdBDgqh2RMfIUfGgtfN8emjcZ842NTTMjAwKMO+ffvYvXs3Y8eO9W87duwYHo+Hnj17YjKZuOaaa1i5ciWaprF582YuvFBUj5s0aRIrV66s0/Hmzp2L3W7HbrcTHx/PQw89VG7/xIkTycvLo2/fvqxatYrhw4cze/Zshg0bxttvv81///tfevToQY8ePfj3v/8NwMKFC/1jJicn+8vqvvnmmwwYMICePXsyd6747E9NTaVXr15cf/31dOnShSuvvNIwcG4kmjdvjt1uByA+Pp7o6Giys7Prtd5WrlzJddddV2l7balqzfiYPn06f/75J6NHj2bRokVMnjyZe+65h+HDh/PUU0/x9ddfY7fb6d69O//85z/RNI1PP/3UP2bbtm0ZMWIEAKtWrWLQoEHY7XZuvvlmVD20PzY2lpkzZ9KjRw9GjRrlF4RORwwRxKDR8bh1M1SrmULda8Nn0OjQTVBDgmRCQoWA4DNSTQgDWZb85XQz9fIuIaWVbImL0kWQMtVOouXS6BFxLFFuFyCjEP5UMwEIpnzECECSTYznAXI8PhHkmN4+DKmGf6HuepncE14Hqv6F5BNBQmiBItXs3dGOOAC2eas+0Xa6dul/KVjMbWoc00cIEYTqkSb7Samyna80rhTaAUmu/DrVFlkyESPp0Sdq9XdaNE0r9QNpM6JBTTwlyUJI0BAA8go/rFUfNecY3p2rATBffG+TmoqaW98ESOAtwJtefUh+7ttP4808BmYr8XMWnz5mqFUx4lFEydxM2Pl2U8/mtMXUYSCm0SKc1bN+CZ5d65p2Qn8jlKh4kl5eB9YgtJJCjt02Am9+zZFtBgYGjcPMmTNZsGBBuW3Hjh0jKSnJ/zg5OZmjR4+SlZVFdHS0/7vRtz0QTzzxhP+C8Oyzz/Zvf/jhh0lJSeGLL74gJiaG66+/vly/Dz/8kMjISFJSUvzCjNvtZv369YwaNYr58+fz3XffsXXrVt599122bdvGrbfeSkpKChs3biQuLo5p06axa9cuVq1axebNm0lJSeGXX35h8+bNAPz+++/MmjWLXbt2kZaWxoYNtbjRZNCg/PTTT6iqSosWLeq13vLy8oiIiKi0vSJLly71r0O73U5ubi5AwDVTlhdeeIHExEQ2bdrElClTAJHOs3btWmbMmMHUqVP55JNP2LFjB3v37mX58uVccsklpKSksG3bNlq3bs2MGTPIzMzk2WefZd26daSkpGCxWHj/fZFenpWVxdixY9m5cydJSUl8/PHHDfcCNzCGCGLQ6PhCriwWs786jNUqxAanWwgFoTaJYJ8Iol90B+vX3jY9OiNbT1GRy1zUhQXr6TBOEWESJilYAvhItIwUv7NLIE0TkSnxUnildom20r6+Mrkn9PK4EdScg9dRrxDjAY7o/g1Zaop4Hrq4UROdFJFyk04+bi1wuJpDF0Gs5k5IUt1KyLZBRI7s5aeA+zVNQ9UjQeTYEXUaOxAtJKF+57ATr+asumHmbijJEn93vvSkj1uRyFBRHtbtOYjbE/iLpiyeNW+ApiJFNsc0sOHnUxckWzOkmMFiXqmvomlqwHbuI3+Q+9+nAIi67j7MibUXyJoKKaotdJ4gHmx7Da0kp2kndBpjmTAbSfelcS6+Ay2/5ipSBg2DObkdzZ//AmQFb9Zxjk0fjeosqbmjgcHfkKxi2JtZ/ue4XuDM5Sndtq/Mfh+Hciv3za/GDmvFihV07NiRjh07ltseKDJCkqQqtwfigQceICUlhZSUFDZt2lRun8fj4aqrruLpp5+ulVfI5ZeLSnVbt25l1KhRREdHY7PZmDhxYjkBY+rUqUydOpX+/fvz7bffsnnzZvr27UufPn34/fff+eMPEcXbqVMnOnfujCRJ9O7dm9TU1BrncKaiOTNRC/aU/ykRNzA11Vl5X8Eef1+1+GDp9sI9aK6sWh0zKyuLSZMm8dprr4nj1GO9VVx3Va3DSZMm+ddhSkoKkZGR5faXXTM1MXHiRCRJYs+ePXTq1InWrVsjyzLXXHMN339fWsRgzpw59OvXj3HjxrF582Z27NjhjwT55ptvOHBApK6HhoYycqSoBtm3b9/Teh3W7WrJwKAB8HrFBZvFasHp1FM4dE8QRdccQoIkQiTdtyBCiAC6ToLNZqKgwEW6ywsmCFNKhYqIUPF3tqpHj1RIhfERp/uCZBZDlp5GkixVrngSrMhEmiRyPRpHHV66h5kpQFyUJVDzBWWyYsOEEEH2uAtpaQoiT9sr5ip1rLavj/a6OaoGpGqZdJASKrVxun4HwGbtVasxy9KJ/uzke9I4iBcPSoWPBc1xFLzibEXRL7xPhgRlMKgSGl4ytZ9IkKoYc5ceoRGSgBRdvXdKfbBZeyHL0ahqNgVFXxAdMaXKtpqjEPe6xQCYR00V/hVNjLn1rbiyNoArEzV7c6X3RtM00h69Ebwe5MhYIq7+ZxPNtB6cfQ+krgVHDvzwHIx4uOY+f0MkWcF2x/8oeWQUFGTifHM61jvfRpKN+xuNQVC3gcQ/9D/SH7wa95+/kf7IDSQ89DaSotTc2cDgb8TKXfDWz+W3ndse/jUSMorglo8BJKD0u3XtzeL3k+tgV4Vs4Nkj4LwqCpz98MMPLFu2jA8++IDCwkLcbjfh4eFMmTKl3J31I0eO0Lx5c2JjY8nOzkbTNCRJ8m+vK7NmzWLw4MH+NIeaCA4O7M3lmwfg923w3dHXNI2bb77ZnwbjIzU1Fau19HxXUZS/pceDD8/xFXgPLS63TY4fjaXzPDRnBq5fbqzUxzZMVAt073kMreA3/3Yp+XpoM7Xa4zmdTiZMmMCsWbP8EUJJSUl1Xm/h4eH+aJD6rsOKa6YmarMOP/vsMzZt2sS3337r33fRRRexePHiSv3+SuvQEEEMGh2vR/xDmC1mXC7xty+6Q99FkE0mRI+iwCz+ocL0/6uQEDMZGZDtEWKKzxQVIDJMnHwWWEWEQYgU+GTUN9aBLChA3FJIkCtHggAkWGRyPV4O6uk3+YhbFAm0qPG5ypJEsimIVE8Jv7sKOdcWS4meThMl1867I1IKJhQrhTjZ7T1BB7m8CKJpGiXOFABs1rr7ZrRGVKhR8XKcP0mmvDij6qVxscQhBbeu8/gVMUuhxNCHLLZxQv2OBLmyCKJpGuxfJR74ogIaGEmSiQgdT07+YgqKvyAq/KYqVXf32jfBVQKKGdPQa0/JfOqKHNIGKbI/Wu5WPIf/ixx9drn5F333Ca5d4r2Le+BVZGvNqVenC5I1Am3AHbD+Edj9MVrPa5Fiaica/t2Qo5OwTv4/nC9fj3fXWlyfP4P14nubelp/G0LPGY96z4tkPnMnxetXkPHEzcTNXnT6p50ZGDQiF3eFs1uX3xamR/fGhcCrl4rvfa/Hg2Iylfv/uX84OCpYXzULrfpYCxYs8KfCLFmyhF9//dUvGiiKwo4dO+jatSvvvvsub7zxBpIkMWjQID7//HMuuugili5dyo03Vr5Iro4VK1awbds2vvnmmzr1AxgwYAD33HMPOTk5BAcHs3z5cl577TW2bt3KokWLykWFjBw5kiuvvJI777yTqKgojhw5QlBQUJ2PeaZjaj4OJWZIhY3C90+yxmHpXfni3Ye5079Aj9zW0PDKkdUeS9M0Jk+ezMiRI/1+HgCJiYl1Xm8XXXQR//3vf7njjjtYunQpF198cZ2ed6A1U1s6derE3r17OXjwIC1atGDZsmXceOONpKamcu+997JmzRpMJnGtNmjQIO666y4OHz5MixYtyMrKoqSkhOTk5DoftykxbhcZNCqqqvpDwSwWM74blr6qLwXFQtiwWSS/JwgmoVj4quOGhoo/8vUMgChzmUiQEPF3SaiIBAmuQgSJ179A051u3HpVlFgp8LdqmO5Bsq/Yg4ZGlk/EoHJERiAGWCIB2O8pwkk2XoRAEya1rVV/gDaSSL35WT1UaZ/HexRNEx/YNkvdRZAQIvzPJZXfKu33Zgl1XIka0GAn9omKSKs5rq4PnMqRth1cupls51Nn5BkWfAEAbs8RHK5fA7bRvB7cX4uyeMpZVyAFBRbLmgJzaxG9ouXvRM0trVKhOorJ/Lfwi7DahxJy9tiA/U9rulwGIXr1pTWzDZO3ajD1Oh/l7KsA8Hz2LJ4/Aqe2GZwawsdNIeK6+wEo/OodchafhiWoDQyakJhg6Bhb/qe5/lVqMZVu61Bmv4+WkZX7htdT03/ppZe4+uqr6dSpE2PHjqVHD2H0/uSTTzJv3jzatWtHXFxcraM5fDz//POkpqbSt29f7HY7CxcurHXfxMRE5s2bx7Bhw+jbty9XXnklffr04eWXXyYjI4PBgwdjt9uZO3cu3bt35/7772f48OH06NGDK6644rQ2nmwqJGssclin8j9BiWKfbK28L6yTv68c3Kp0e2gnJEtMtcfauHEj7733Hp988onfo2PnTlFFsK7rbdasWXzwwQe0b9+eAwcO+H07akugNVNbgoKCeO211xg3bhw9e/akQ4cOjB8/nrfeeousrCwuuOAC7HY7U6ZMIT4+nldeeYXx48fTs2dPRo8eTXp61cUbTleMSBCDRsXlLDUstVgtyLoKEqIrHCW6MarVLBESIkQQyST2+USQpKQwfv01A5feN7aMCBKup8O4dBEkwRQ4HcZ3FyFPKvRvq0oEaROs8FO+m4PFXorJx6ObrtZUHtdHJ7MY9zdXIQWaXu4ViVCp5kgSH73lluz0HuWYmltpX4nDd/FuwaQkVdpfGzrQhy18QSq/MYTSyAtN9aDlbhMzjuxXr7ED0Uwexk7v07jIIUf7jWipQsWZ/V+I3/E9kMJr/zrVFYu5JSZTCzyew+QWvEeQtXLlG89PK6A4D5CwXHj3KZtLfZDDuyOFdkUr3IXnzxdR+r4JQM6Sx1ELckBWiJ/1ehPPsn5Isglt5GOw8ibhD7P/K+gwpqmnddpiveZJSvZsQss6hPM/16E8+gNScOWy3wanhugp83Af3E3x+hXkvrUAU0JLwi+a3NTTMjD4WzN58uRyjwcNGsRvv1W+2dOhQwe2bdtW7Vjz588v9zg0NNTvd7B27doa55KZWWp0sm7dunL7Jk2axKRJk8pte/PNNwOOE6gtCFNOH08//XSN8zFoGIYMGeKvjFKRuq63uLg4vvvuu2qPV3FNQ+naqmrNlKWsR8eSJUvK7Rs9ejSjR48ut23evHnMmzev0jhjxoxhzJjK52Rl1/kdd9xR43yaEiMSxKBRcbtc/r/NFjOFheKxxSL0OF/qmM2qG6NKMpJJRIn4jFHD9BhKryoEk+ZBpdEePk8Qb4gYKEkOfLsgVs+0KbGIaAMFmShCArZtHyLmdtzp9ZfHBYgivqanC0AnPa1nr6eQPHU/ACEkI0u195XopggF+wCZeCpETpQ4xRef1dym3pEavpSYVH7DS2ncqVawCzQh+ihRNRss1ZYgKYEgRK7jEe+X5fZpqhf2fiYetL+gwY5ZFZGhwpysqOQ7NM1Vbp+mabhXiLK4ctfhyNGnX6if0lokTmtFe1ELfsd99E/yPxSRKxFX3425ec1lmE9XpOSBkDRIPFj/MJrbMJ6sCslsxXbXMpBNUJSD47WbjeiZRkSSJBLm/xdrtwEAZD41jaIfq6/cZGBgYGBgYNA0GCKIQaNSMRIkL0+khlgsMm6Phu+U3WaRCA0LQbKWGvaE6JqBxSJEj0LEBX+EqXQZhwXLSBJ4bEIESTYFFkFifHpHsBBBIggqV2WmLK181WjcKlnacQCsBGMKUFI3EB31SBAvcELdJ44ni2WIwAABAABJREFUd6qmR2V8PiAuPBzUMsvtczi3A2Cz9qnTmGVppYsgXtwcY79/uydTd4a2JiBZKhvHngzJslCbj2tryu84vg2comIP7c5v0GMGIix4DMKQzUVh8fpy+9R9m9GyRAqSZfwDp3wu9UGJ6gc2Ic64/3iRzKfvRHM5MSW1JWryv5p4dg3AiIdBUsCVDylV5/EagJzQFss//g2A+vt3eL7/bxPP6O+FZDLT/JnPMSW1AzTS5lyFc29KU0/LwMDAwMDAoAKGCGLQqLjKRIJYLGY8uhOq1WrC4Sq9a2mzSFisFqSg0uiMYF0ECQ8XKS7OILGhrDGqIkuEBoFqFtES8VVUh4n1aSuh4mI7qJqojCSbEF3cGhxRDwMQRnT1T7Rsf8WKWRdssrUd4rC0rnV/gGgphGBddNnjTfNv1zQPbq+ITgm29a3TmGUJJoxwRN7jHkpD9NRsIYLI0WfXe+yqSJKFwOEkmwIttXTHb++J31FtkUJr57tyMihKBDaLqKqTV7Cs3D73NyKvV+54NkqrulfeaQwkScLUVvh/FP+wjpJtQlSKnf70X8oMtSqksETod6t48MtitPyayxn/nTEPuRrTWaL8s+u9B1GP/t7EM/p7IQeHkvifb1GatQRnCcfvHYf7WGpTT8vAwMDAwMCgDIYIYtColI0EMVvNeDy6B4hVqSCCiKVpCS3Nafelw0REiAs7VY8AKRsJAiIaXLUKESRWCRytYTVBuBUIF+VuY6naatwnggCkqSf09rX33pAkiWTFBmiouqlquNy+1v19+MxRt6kH/dtc7gOAEJas9TBFLUs77ADsRaTXaJ5CKDkCgBJ7zkmNHYgwqS1mxPt7zCsu3DWvGw7q+ZBdr2jwY1ZFRNjVADjcv+HxZgOgntiHd4cIZzefd2ujzaU+KDFD0eRYcpeLqBVrj7MJPuvUpxI1GvYbILQ5eJ2wdk5Tz+a0x3LVAohvCx4nJc9fieYwjPMaE1N0AonPfI4UHoOak86x287Bm5vR1NMyMDAwMDAw0DFEEINGxe0qkw5jseD1qvrfCg5nGRHEKiInLOGR/m164AdhYRY0RQJFLN/wCiKINUpFD7wgVq46ZSXCBoSISJBmUtUGgqEmmQhdB8lDiCbNqX1lF4CuljAi5XxkSfhthNehMowPuyxSHnarx/3bSpzCFFWRYzAp1TtY10Rn9Fx2juDGiZr7M6CBZEaO6HlSYwdCkiSSJZESk6bp5byO/AgeUemG9o1nghkaNARFjgJUCou/AsC18hmxMzwepfu5jTaX+iBJEoU/hKKVeEGC2HvOrOoUkskGZ+tlX49tRTtU9/JvfyckWwhBtywCSYb8dByLbjP8QRoZc4v2NHtqOSgmvDnpHJ02ErW4sOaOBgYGBgYGBqccQwQ5CVJTU7npppto06YNQUFBtGvXjnnz5pVL+QA4dOgQF198MSEhIcTGxjJ9+vRKbf4uuJxl0mGsZrzewJEgVrMugoRFAiDjRdaFjdBQC2pQafpKhLm8l4c5qtQ4tKpIEACbGQgWJ6UtpOr9LkJ1oaVQEgJEbcvj+hhgiaC5yVc+Sia4DpEkPnoqokrKcfLwaCKNqMS5BQCz6eQNO1vRBZDQ0DjMHrzZm8VsI3sjyYHTik6WJEWIILnab5RoabBfN0SN7YIUHFtNz4ZFkkyEBJ0HQE7Bu6j5GXh/XgmAeewMJPn0/qh0H0ul4LMVAIScHY9U8nkTz+gU0PY8iBPeNayZI6KGDKpETu6K+Uohhqk7v8a9bknTTuhvSFDX/iQ8/gEg4Tmyn+P/HIvm/nt+9xsYGBgYGJxOnN5n9qc5u3fvRlVVXn31VX777Teee+45Fi5cyOzZs/1tvF4vF154IUVFRWzYsIFly5bx0Ucfcc899zThzJsOV5lIEFlRUPUKLxaLgrOMCGLxmaCGiQgNWfX694WFWVBtpSJIxUgQnwgiqRAqKVRFfAhgEsaszeTqS0kmWhUU2YVmEkaq0XUUQbpawkg2iVQYK7HIUt2rU3fUzVFVNFK1LACcrl0ABNlOvnKLlWCS6QDAAX5FzRImoVJE/Q1XayJK6o5JT0U66voSUvVUmO5XnbJjVkVE6CUAeL1plHz1OKhesARhHnx1o8+lrmS9eC+oXqSwMMLPTUTN+g7Vcbzmjn8hJEmCUQsACUoy4Zc3mnpKpz3m4Tci9xDinvu9OYY/SBMQctYYYu9/BQDnrq2kzb8OrYpyigYGBg2DyWTCbrdjt9uZMmWKf/uWLVvo1q0b7du35+GHH/Zv/+OPP+jXrx/t27fn1ltvDRg5N3/+fF566SX/48LCQlq3bn1Kn8epYMmSJaSnp9fcsEKfmTNnnqIZ/bU5fPgww4cPp2vXrvTs2ZMPPvjAv69169b07NkTu93O2LFj/durWm+ZmZmMGDGCDh06cOmll+JwOCodL9B7ERvbeDcNG4pPPvmEvXv31qnPunXrmDhxYoPNwRBBToIxY8bw5ptvMnr0aNq2bcsll1zCzJkz+fjjj/1tvv76a3bt2sX//vc/evfuzbnnnsszzzzD66+/Tn5+fhPOvmlw654giknB7S49EbRYFBwu8dik4C/1Gt6smWivlYonIhKkVEQoa4wKIEcKwUTxyNWWjG0eroJViCCxUli1824TrBBqy/I/rmskSGdzKEl6JIhSx1Qa/zGlEBKkcAD2qCdQVQce3SQ1yNq7XmNWxFcl5qhjA7hzAVCiBzXI2IGQJJkESZiuFh98D1wFohJIm8ZPP7FaOmBSmoFHQ13/IQCmcyYjWYIafS51oXjzlxRvFBE0cQ+8jhQUBWh4/ny5aSd2CpCi2kJX/Qvw59fQCtOq7/A3R5IkbFMWQng8aF5KFk4x/EGagPALryfyxgcBKP7+U7IXngFVmwwMTmMiIyNJSUkhJSWFRYsW+bfffvvtvPvuu+zevZuVK1fy668ipfi+++5j/vz57N+/n7S0ND7//K8dTen1eqvcVx8RxKBqTCYTzz//PLt27WL16tXcfffdFBWVfs9u2rSJlJQUVq1a5d9W1XpbsGABl112Gfv27aNVq1bl1u5fkerWYX1EkIbGEEEamLy8PKKjSyuHbN68me7du5OYmOjfdv755+N0Otm2bVugIc5ofGlAsiThcpX+cwgRRCihJqVUuDDrxqhmT7F/W2ioBU2PBAmWQKkgdEjhwnfD7Ko6CgQgOroYZHHMOKlqY1SATiFmQoOEsZ2CiSCqF00qEqNYaG4SIkqBp12d+palPXEApHgP4XTvA72osNXSud5jlqUtPQCIyD4gNshBSCH1n29taKFcBED8bmHCSlxXJFv1kTmniojQKwjaWYjscoNixjJ6WpPMo7aoTgfpC24GwDbwfEKGXILSaqrYl7kWzXGiKad3ajhrJgTHgtcFm55q6tmc9ki2EILuWgZmG6T/geN/Mw1/kCYg6vpZRFxxJwB5y54ne+kTTTwjA4O/F8eOHcPj8dCzZ09MJhPXXHMNK1euRNM0Nm/ezIUXXgjApEmTWLlyZZ3Gnjt3rj/yJD4+noceeqhSmzlz5tClSxfGjh3LBRdcwGefiZsXq1atYtCgQdjtdm6++WZUPVIsNjaWmTNn0qNHD0aNGuW/sN63bx/nnXceffv2ZfTo0Rw/LqI+hw8fzuzZsxk2bBhvv/02CxcuZMCAAfTo0YMbbrgBVVVZvnw5P/30ExMnTmTgwIGAiI4ZOnQoffr04bLLLqOwUKSJr1ixgo4dO3LOOeewYYPhw1UVzZs3x263AxAfH090dDTZ2dlVtq9uva1cuZLrrruu0vbasnDhQv86TE5O5oYbbqjU5pVXXqFjx46MGjWKq666yh/dVNU6aN26NfPnz6d3797079/fv97S0tIYP348/fr1Y8iQIezevRuAyZMnc8899zB8+HCeeuopVqxYwcCBA7Hb7YwbN47CwkJ+/PFHPv30U6ZPn47dbicrK6vKdb1582a6devG4MGD+eijj+r0etRE3WPyDarkjz/+4MUXX+SZZ57xbztx4gQJCeWjBqKiorBYLJw4UfUFitPpxOl0+h/7okZUVfV/QJ4uqKqKpmm1mpfTIZ6TbFJwODz+7WazTIlD9Deb8I+l+krcFuWgqsL402qV/ZEg5gDHLQoWQoup2FTtnJTQ0kicaC242rYtbDLhQeKuc4gWgaZpaNT+QkLTNBJN4v3e64pBtdXvPWwnxbFR+3/2zjs8qir94587d2p6J4TQewuBhCK9KAoioqCirogKyiIqq1hwUVF3LStWsGPDVVFcFVD4WRGkqAiEKr2Gkp5MyvR7f3+cmUlCJpWQAN7P8+RJ5txzzn1ncmbm3u95ywG2K8exu8QHlKyLRaJq+2tKIh2QJB2dsoQLnhTWHVUFVT17ay5K7YnebSD2hPiCVztfc8bu4rVZk2UJNo9C+vVBMUfqANSQ6HPadT33g6dR8rNA0hF913OoqoquyeV4jrwJ7kKcB1/D0GluY5tZv+gt0P9BpB/uhwPfohy5CprXfwnn+qaua7JeSOiE4doncX10P8rGL3G2TcUwpOLFkcbZJWLaU7iyjlOy6gvyFz6OHN2U0FE3NYotjboeNS5ofGtLVVVcikK2s+ZrzOXyYDBU7sFblhijDn0l3r5Wq5WUlBQsFgv/+te/GDJkCMePH6dZs2Z+EbhZs2asXr2a7Oxs/+alqqo0a9aM48ePVxCLVVXlmWee8e/O+947qqry+OOP8/jjj3Py5ElGjBjBpEmTyo3//fff+e6770hLSyM/P5/OnTszffp0srKyeOGFF1i1ahVms5kZM2bw6aefMnHiRHJychg1ahTPPfccN998M//73/+46aabmD59Om+//TYtW7ZkyZIlzJ07lzfeeAMQG42rV4uw4tzcXO644w4Abr/9dpYtW+a/aZ0/fz7dunXD4XAwa9Ysli5dSmRkJM899xzz58/nnnvu4a677mLt2rXEx8czfPhw+vbte+4L6IobSrLrdUrV7YaweFRd9bfMf/zxB4qikJiYiKqqSJLE4MGD0ev1PPDAA4wfP77K9VZQUEBYWFi163DRokX88MMP/rb8/HxUVeWOO+7gjjvuoLi4mEGDBvH3v5dPin78+HGef/55/vjjD/R6PSkpKQwYMKDSdfDQQw8B0Lx5czZv3syjjz7K22+/zSOPPMLMmTOZM2cOKSkpbNy4kZkzZ7Jy5UpAhAj99NNPSJJEXl4ev/76KwBPPfUUCxcu5J577mHs2LGMHz+eMWPERujEiRMDruspU6bw/vvvk5qaysSJE/2vQdnXw/dd5r93rOH3miaCBGDu3LkBVdyybNy4kdTUVP/jEydOcNlll3HNNdeUiz8EAoZk+N4clfH0008HtCErKytgjFhjoigKBQUF4gasmgSSOdnCG0In6zhxotSV3WrNIzNbeHfIOtXvqufSB4nfJcXl3feCvQlPFU8Ftz4H4vUxZJrIyMio9HUu8nhzJrhlTmbnE2So/MPd4oDwYNHf6IggM792roQOXSaGCBHS83tJMJn2urkiJuqDIRgyVCt51v0ASGrXenVtjIqKp2nhcQCKjKm4GsBtsmV2U3RqPgqQHdoD9QzPWZs1WRZ57y8E5QhxLq+nnuJz2GVUyT6O/WMhuMqjbibPGApee42R1xKU9Q5K9s9kHd+Fajj/4kWrJCSZyIgOGPP3ovw4m+xLP4IqkiCfC9R1TdYb7S/G3GEQhr2/4Pr0EQoi26HEd2x4O/7iqFOfRjq6H/XANnKe/TuF6NGnjGhwOxp9PWpcsLhcLhRFwe12k+2RGLEp/6yc58eUCOJNgT1+9+3bR0JCAjt27GDcuHFs3rwZt9uNqqq43eI73ueq73K5KrSXfexDURTuv/9+pk8XHqJFRUX07NnT38/tdjNx4kSeeeYZEhMTy41fu3YtY8eORafTERUVxZAhQ/B4PKxdu5Zt27bRr58IO7bZbDRt2hS3201ISAiDBw/G7XaTnJzMwYMHycvLY926dVx55ZV+W1u2bOl/bldffbX/vJs3b+axxx7DarWSn59Py5Ytufzyy/3Pze12s3PnTrZt28awYcMAIaIMGTKEnTt30rFjR5o2bQrA+PHjOXbsWIXX5JyjOAP9J/VbWdAAuCauRAqJr7JfTk4OkyZN4s033/S/Tj///DMJCQmkp6czcuRIunbtSnh4eKXrTZKkcuup7G8fiqLwt7/9jWeffdbf5lszPqZMmcKtt95abn0C/PrrrwwbNozg4GAARo8ejaIola4D39jLL7/cvw6//vpr3G43P/30E7t27Spnm9vtRlEUxo0b539/HTx4kAceeIDMzExKSkoYMWKEv5/H48HtdlNYWBhwXWdnZ+N0OklOTsbtdnPdddfx3//+t9xz8s2Vk5ODwSDuIwsLC6v8X/nQRJAAzJgxw682VUbZZEgnTpxg2LBhXHTRRbz11lvl+sXHx/Pbb7+Va8vLy8PlclXwECnL7Nmzuffee/2PrVYrzZs3JzY2lrCwsFo8m7OPoihIkkRsbGy1F1MWsxA1DAYDod7KLwDNmjVh2zEHUExclJ64OOH1IYcJ7wBFVYmLi/P310UeBSBIlcq1A7hcIgGpXKwnNDyWIHNgm4z2Y+IPhwWCYomrokBMuKJiLhCeF+F0rnDO6shQ9oMCHlXHTiWUuPjajffRRw0F54+oEnikP5FUCA/rRXhI3eYLRN/C9hgVEaoV0fJiJFNsvc1dGREbhECU20QmIiEGQzU5WqqjNmuyLPa330AFnAlGnDH7iY8GvVx/r219curZW0Uy1JBwmt31LDpLsP+YGnMjLutyJEcmkfb/Q9/s3ipmOk+59DnUT8chO/KIS/8Kes9obIuqpK5rsj5R//4u9scGIFkzCf7wTsxPrEWynFvfJ38FlPnfcWLqANzHD+B87g4iX/kOS7ezl3spoA3nwHrUuDCx2+0UFhai1+vR1yEJfE3R6/Xo9YFFkBYtWgCQnJxMly5dOHjwIC1atODEiRPo9cKmkydPkpCQQHx8PHl5eciyjCRJ/nZfPx86nQ6dTudvP/337NmzGTBgAGPHjq1gjyRJ5cZKkoQsyyiKwuWXX867775bYYzJZPL3NxgMqKqKLMvEx8eTlpYW8ByhoaH+MXfccQfLly+nS5cuPPPMM9jtdvR6PZIkeV87PbIs06tXL3788cdyc23ZsqWcvTqdzj/unEauOgy+rhj0eqjiuTscDq699lpmz57NoEGD/O2+ddiqVStGjBjBjh07GD9+fKXrLSwsjOLiYsLDwzl16lSl6zDQ/8L3+NVXX0Wn0zFjRsVrokBjdTpdpevAR3BwMHq9HqPRiKqq/vGbNm1CPu011+l05dbhfffdx+zZs7n00ktZvHgx3377LXq93n9e3zoMtK7z8vLKrUNZlss99j1vnU5HdHQ0ZrMZwP+7Os7x1dw4xMTE1DjT7vHjxxk2bBgpKSm89957FS4mLrroIv79739z8uRJv6L63XffYTKZSElJqXRek8mEyVSxLKnvQ/hcw/cBX51tLpdQ78xmEy5XqeeFxWLA6RZhLEGm0nlUk7ixU4oLy82thonXxuD2VDhnuq4EFJBtOqwlEBIU2KZsuQAUwBZMjqSjTXTldlt0EB4kXOxczlh0lQgrlVGoiOQ/eZ4wrKqKFQ8ROkM1oyoSQTDhWHAqBUiKyFFiMXWt1zXRLl/8j7KC9IRb9ISd5dRBqrMYY+YRAA53lmmirqWFfPkZz1vTNenDc2wnavpOAIqHNQMUrMVfEhPx9zO2pb6xbVqFfdMqAGLuewV98Gmikc6E2nwS7v3zUE4uRWoxCcl0boo5dSaqLWq362HHx0hb3oEuE5BCE6of14jUdk3WO0GhWP7xGbYnR0BRNs43p2L+x2dVeiVq1D+6kHCavb6K9Ml98OSeIvPBq2n22k8YW3dpUDsafT1qXJD4brQkSSLWJLOmX802Uny74b4b9eqIMQZOfp+Xl0dQUBAmk4n09HR27dpF27ZtiYqKQpZltm/fTpcuXVi8eDHvvPMOOp2Ofv36sWLFCsaMGcOHH37IrbfeWmFu33PytZf9vXTpUjZv3sz3338f0KYBAwZwzz33cP/995Ofn8/q1au59dZbueiii5g5cybp6ek0b96cnJwcbDYbiYmJFc4hSRLh4eHExsaycuVKRo8ejcvlYv/+/XTu3LlcP4Di4mKaNm2Kw+Hgf//7H2PGjPELJUVFRUiSROfOnTly5Ahbt24lOTmZ4uJiTp48SefOndm9ezfHjx8nPj6ezz//nL59+57z3xVqcCzc9EP1HWs8oYrb40EfFFPpc1dVlVtuuYXhw4czadIkf3txcTGKohAaGkp+fj6//PILd911V5XrbcyYMfz3v/9lxowZfPjhh1xxxRXVrsOy7Rs3buSdd95h7dq1Ae3t06cPDz74oF+kXLlyJTNmzKh0HbRr1y7gOSVJYsiQIbz11ltMnz7d703SvXv3cv2hdBNfVVU++eQToqKiKqzDqta1wWBgy5Yt9OrVi8WLF/vnP/31KPtdVtPvNO2b7ww4ceIEQ4cOpXnz5sybN4+srCxOnTpVLtfHyJEj6dKlCzfddBNbtmzhxx9/ZNasWUydOvWc8+hoCFwOIXRExkT4E6NKEsiyjvxC8ditlIojHr1Q8zxFeeXmkUK9IoizYubhAtWbGLXYQEFR5XFhmXhzghSHklmN55SCh2CzEB2yi6tQSyohTxUZyE+6xY3obmdRrefw0VEXTyu37/WQMBrb13muQFiyhBfIsXAjB9lWr3MH5PAqJMWFRy+T2ULPEeXLs3/OALiWCddCKaoZpm7XAGAt+uKs5kOpC6rbRfZLwrPD3HMIIcOvCdhPjr8c5BBAwXXojQa0sAHpNxOMYaB6YNWcxrbmvECX0Anj30QYlbLnF9w/XKBr4xxHjogl4Y2f0cU0RS0u4MR9Y3CdOtLYZmlo1Ct6SSLeJJ+Vn8rygfz555+kpqbSo0cPxowZw8svv+zPwbBgwQKuv/56OnbsyOjRo/03bc8++yyPPfYYbdu2JTY21p+0sqa89NJLHD58mJSUFJKTk/05Onz07duX4cOHk5SUxG233Ubv3r0JCwsjLi6O119/nXHjxpGUlMTIkSOrDW/+6KOPeOGFF+jRowfJyckVvM19PPLII6SmpjJ69Gh/4k4QiSsnT55M3759MRqNLF68mOnTp5OUlMRFF13E/v37sVgsvPLKK4wYMYLhw4fTs2f9VCA820g6PVJIfL39EBIPwU2ginwg69at49NPP+Wrr77yJyXdvn07GRkZDBw4kB49ejBo0CDuvvtuunYVFRgrW2+zZ89myZIltGvXjkOHDlVIr1Adr732GllZWQwYMIDk5GQeffTRcscTExOZOXMmqampjB07lp49exIWFlbpOqiK+fPn8/3335OUlES3bt0qraj0yCOPcMUVVzBs2LByURQTJ07kySef9CdGrWxdv/3229x0003079/f71lTX0jqOZ/l5tzl/fffD5h5F8onbTl69CjTp0/np59+wmKxcMMNNzBv3ryAnh6VYbVaCQ8P9yfNOZdQFIXMzEzi4uKqVd8+fG0xLzyygG69OnPXvx/nwQd/xGLRs2LF9Ty7KI9Vm+wkdzDyzJ1CaBj/Tgm5niBY8z6r/jvZP8/gLw9wKiqYblmFfDGhvAjQ4tgPuIHWS1oy75LmXNQ9sFvUvY5P2awcha39uF4axB19K7e7gCxeQngEZO15igUdO1T/wpThR+e1FHOE1cWX8UnRIOaGd+D2sLq9mT93b+JI/nyutP2JXo6nVcLSOs0TCNVjw7HuEkBlSbdIDFEDmchD9TZ/wHN+dQuc3IitTU9+GLYX0DHK8D2Gair2VEVt1iSAkn8K20MpoHow3PwSUp9BHDl5NQBNY+YTbOlTZ1vqm9xFz5K/cC7oZBLf34ixVedK+7rSP8Nz8GVAwtTncyRz1TGt5yPqge/gO2+4z6gFSK2GNqo9lVHbNXm2cXz8IO7VH4Ckw3Tv/9B3uKixTfpL4jy0i+N3jkAtykeOakLi+xuRI85+COK5th41LhzsdjuHDh2idevWNXZLh9p7gpxvFBcXExwcTF5eHn369GHDhg019jrXaBwuxDXpW4c2m43Bgwfz7rvv+sXA85FAnzc1vWfWvvnOgMmTJ/uz0p7+U5YWLVrw9ddfU1JSQk5ODvPnz6+VAHIhUVwocnwUFZX4PUF0OvHBYnOI181iKv2g8Ugi1sxVeJoniEG0y4Xlk8QWK2586XL0JXryq/AEyVK93hi2MI4XVG13LiKJq6rCIWvtyreqqoLdO96jtAbgd2d+reYoS2cpns4usVMgGyu/Aa4LSkEaeOveCE+QHaicPU8I1VEAJ/8AwNTuBiT0gMIpzy9n7ZyBcK96R3gThDfB0OdqDPpmGPVCXMsv/LBBbakKd/ZJ8t//NwChl0+uUgAB0CeMAzkUUHEdfO3sG9gYtLkEWg4Rf69+AtVVUnV/DQCM1zyBlNgVVAXHqzehFJy7SYAvZIytuxD/7Bcgy3hyMzg+fRhKSc2SumloaJw/3HrrrSQnJzNgwAAefvhhTQDRaBTmzJlDcnIyPXv25KqrrjqvBZAzRRNBNBoUu02IFkaDAaezfMbjkgAiiOwVSJyFVn8+EYASg1i6tuzyNzzZitP/t75EpqCw8hv4k2q++KM4lIxqolNyESFODlcwGY6q+55OCSfxeCvWtDSIagw7ndaqhlRJO10cTT3iIjm/nkNhPFkiz4QS1AKXrMOFnQyO1us5yrH/O0AFnQFdqxFES8kADRoSo9qLca0SSckMw6cg6UWVkYiwvwFgc/yBx1ONStZAZD0/A9wupKAQoqc/VW1/SWdEbnU7AEr2Tyi2E2fbxAZHkiQY9E/QGaAkE9Y/19gmnRdIBhPmv78HehPYi7DPvwHVc45n/r9AsXS/iCb/+gyQcKcf4MQ9l6E6a/lFo6GhcU7z6aefkpaWxq5duyr1ItfQONu8+OKLpKWlsXv3bh5++OHGNqdR0UQQjQbFbhMihdFkwOmtHa/Xi2Vot4vHQeZSEcShCI8P1VHs9yIBsBlEfJ7bWv5CMdvj8v+tt+nJyA18UV+sOnD7PBxsIQRILVKODA6LcY4IrB4Vp1LzKLJC9SAAEnq6G9oCkO6x46ljJJqsFBCqitdxl1y/oVFKnojBM0YPIxjh8bKHjfV6jnLs+kz8bj4ASTbSUjcOgDx24FaLKx9Xj7h+WQSOYpD1GAbd5G8PCRqGJImcGoUl/9cgtlSFbetabOtWABB99/Pogmv2v9c3HQumeEDFc/SDs2hh4yGFJkCvqeLBriWo2bsb16DzBF1MC4y3i4pm6rEdOD97rJEt+usSPGA0MQ++DoBzz2YyHr0B1VPNF5OGhoaGhoZGndBEEI0GxecJojcasNuFYGHwhrb4wmLCgr2VYVQodnv/tpcXQdzevp7TRRCvJ4jZJSMpEidzAl9EZqtlXD9KQsiqxhOkiHwA8gpFHo/j9ppfnOYrfwJgoQldDOLG1QMcctfNbd/hFHW57ehYq7NX07vmqI4scIoKOHLMINrQA4A/+bXezlHufLZc8N2sdrkWgCa6gegwoeLhlLL2rJy3nA2KB9f/zQdA7n01UnCE/5hOMhEWPBqAgqIvK4S5NSSq203WU+Im39C6M6GjbqpmRCmSTo+h5W0AeDJWoNjSz4qNjU6vqSKJGcB3s865hLbnKoYel6IfIbyF3D+/gzut8QW/vyphl99M5LR/AVCyfgXZ82Y06ueOhoaGhobGhYomgmg0KE67EC1MJiN2u7eKize0xXepF2IRjx0eAK9XiKOYIqsQQZyKiuJNUOS2lhcBstxifrPXgyS/knCYLFWEk0iqBA4LxS4odgbsCojEqADF9iYAHKuFCJKnirKroVIbmsomgr15Tna56lYhpsQuqrfk6oLZT069XSQreV6PD30YUkgHuiISJWZxDBdnwTX74PeACnozNBfn0ksW4nWixvpxz7f1f87TcKethKJcAIxj7q1wPCx4HAAu9yHszu1n3Z7KsC5biPvkYZAk4h55v9YJunRNRoIhClBwHXjlrNjY2EiyAS6eJx4UHIZt/21Ue84njBMeQ2olsv873puBcqrqrPAaZ4/IG+4j8hZR6ajwm/fJfv5uTQjR0NDQ0NCoZzQRRKNBMZpFQtiYJtHYvUJCSIjIwWD1JjE1m8SyLCkjSqj2Eoq8niBWd6mw4bY6yl0gHleEKGKWxBzW4kpEEEWIIMGSCckrtGRVEX2Rhdg9V52ixO3hElflnU+jUD0EQKTUHUmSSDYKb5Bdzrolv7M5NgNwQB+NDReZav0k0XNnidrqUmg3JEmmNd3QoUdB4Qi76uUc5di/UvxuP0bcwHpJ0F0MQAYbcNXTc6sM11JRFlfXoT+62FYVjpuMbTHoWwKQZ22cUBJPfha5b4kwhbBxt2Nql1TrOSRJj77NdADU3HUoJYfr08RzBqlpMrQT3jtsfA21JLtR7TlfkHQylrv+ixSdCPYibK9MRLXXvYy3xpkRMflhQscK763CZQvJe+eJRrZIQ0NDQ0PjwkITQTQaFLc3uak5yIzizasRGSlKGhWWeEUQoxAlyuoMqrOEIqu4KC9wl4oeks2NzVaa9yPdLUSQKISwUmwPvIPmC4dpRjiyd1M9s5JrfhtFfk+IEFV4gvxZVLMEgqrqwYG4EYvQiaSonfWi9OtGR36N5ig/n4rTdRiA/cYEYYt6stbzBJpXLdgGgC66PwBGLCQiEq/+ye9nfI5y5yvOhBOiKgztLit3rIl0kb9KzAnPz/V63rJ4Dm1GPbUPAOO42ZX2iwgVoScl9vV4lLontK0r2S/+A7XEihQUSuSUuudskONGglFko3fte76+zDv3GDwHLNHgKoK1Tze2NecNUkg0pmnvgiRDTjr212/VPBAaCUmSiLn3FYIGjgEgf9EzFCx5tZGt0tA4f9Dr9SQnJ5OcnMyUKVP87b///jtdu3alXbt2PPFEqbh44MABUlNTadeuHdOmTQv42Td37lwWLFjgf1xUVESrVq1qbNO9995Lt27d+Pe//123J6VxTnLs2DGGDh1Kly5dSEpKYsmSJf5jrVq1IikpieTkZEaPHu1vr2y9ZWdnM2zYMNq3b8/VV1+N3V4x5P39999n1qxZ5dpqU2noxRdfpHPnztx55521faoXHJoIotGg5GaJUrdulxubTagcsleFcHkjTHwiSHE5T5DScBirq9S7Q2d3YS2TF+SUNxymiSw8ThxOFY+n4pdZNkLxSJAjCfVWK86oxOkgz1veFiBRFiLIgZKahcMUcxwV0TdUEuVxuxqFCLLdVXsvB5c7HfAll+0i5vGceY4HtfgAKDYA5Kh+/vZWdAVgTz2LIOxdLn7rLZDQu9whWTITK4m2w8r/6ve8ZXB9/wYAuta90LVJrbRfaNAlgBFQsBYtPWv2BMK2ayPFq8RrEHXHk8ihkXWeS5Jk9G3/AYBasBml8M96sfFcQzKFwYAHxYMD36Ie+qlxDTqPkFskYbhBCEfK7jU4v76AxbJzHEmno8kTH2PuIcIDc+bPovDbjxvZKg2N84OIiAjS0tJIS0tj4cKF/vY777yTTz75hN27d7N8+XJ27NgBwAMPPMDcuXPZv38/GRkZfPPNN/Vu0wcffMDWrVv55z//Wa7doyVAPq/R6/W89NJL7Nq1ix9++IF//OMfFBeXupavX7+etLQ0VqxY4W+rbL09/fTTjB8/nn379tGyZctya7e+ePPNN1m1ahWvvlpeWP8rrkNNBNFoUIoLRTJQvV4mL08onA6R/AO318OjgieIxwUeF4UFQjTweYJIdheSCoWFpWqJLzFqC6PZ31YQICTmiJIDQAQWooNE29FKqqD6RBADJjoHCQGjpolRfZVh9ARjRoTSdPeGwxSpHrI9VSQiCYAvKSqYaCK3A+B35VCt5giEJ8ebhNQQgc7c1N/emb4AFFNAPplnfB4/f34hfrcegaSTKxxuqRsPQAG7car1X55WyT6KZ5MQYgyXTKsyx4ZOZyY0aCQA+UWfN9juuKooZP3rVgD0zdoQduXUM55TjhkCFpHc13XozTOe75yl3ShoIhL78tPDqM6GqTR0IWAcPAm5z9UAuL+eh/vPNY1s0V8XSW8gft4yjO1FCFzW07dT8uvZz5WkoXEhcuLECdxuN0lJSej1em644QaWL1+Oqqps2LCByy+/HIBJkyaxfPnyWs396KOP+j1P4uLiePzxx8sdnzBhAgUFBaSkpLBixQqGDh3Kww8/zODBg/noo4/48MMP6d69O927d+e550SZ9zfeeMM/Z2Jior+s7nvvvUefPn1ISkri0UcfBeDw4cP06NGDm2++mc6dO3PddddpnnwNRNOmTUlOTgYgLi6OqKgocnNzK+1f1Xpbvnw5N910U4X2mlLZmvFx9913c/DgQUaOHMnChQuZPHky9913H0OHDuU///kP3333HcnJyXTr1o17770XVVVZtmyZf842bdowbNgwAFasWEG/fv1ITk7m9ttvR1HEvVZMTAyzZs2ie/fujBgxopwgdK6hiSAaDYrTJW76TWaTPzGqyaRHVVU8Xq3CdJoniOQSYkluVj5QJieIN5ymsLDUE8SmCnGijdnibwuUHPWk98a6iRRGiwjRlmcLbLMvH0gokbQKErkr8twKSg2+YHyVYcw08d9otzcE+994O2rpDWL3iiAWUzI99N5KNWo+LvXMFFwlZzUAuojyXhlNaIURISjt4Y8zOocPtfAEFBwRD7peG7BPE10/dBgBlROe+t/Jd654CVAhKAI5eXR13YkM+xsAHs8p7M60ercnEIVfv4c7XSSojJ3zLpLuzD+uJUnC0O4+ANT8jXjyN5/xnOcikiTBJfNApwdnEfyiuR/XBtPNLyE1ESKr443bUHIv0IpC5wE6k5mEV77H2LEXKB5OzZlIyWZNmNI4v8h0eNhZ6Cr3c8wbyuxQVH/briK3/28fB0vcFcbmu6qu/mW1WklJSWHgwIGsXi2ub06cOEGzZs38fRITEzl+/Dg5OTlERUX5r9F87YF45pln/DeE/fv397c/8cQTpKWlsXLlSqKjo7n55pvLjfv888/93im+sAiXy8WaNWsYMWIEc+fOZfXq1WzcuJFPPvmETZs2MW3aNNLS0li3bh2xsbFMnz6dXbt2sWLFCjZs2EBaWhpbtmxhw4YNAPz555/Mnj2bXbt2kZGRwdq1Z7/C3rmKWpyFmrWr/I/Vm9vP7ah4LKs0752ad6i0LWsXlGTV+Lx//PEHiqLQvHlzQFyLDB48mD59+vC//wmv3qrWW0FBAeHh4RXaT2fRokX+dZicnEx+fj5AwDVTlldeeYWEhATWr1/vDxM7duwYq1atYubMmUydOpWvvvqKbdu2sXfvXr788kvGjh1LWloamzZtolWrVsycOZPs7GxeeOEFfv75Z9LS0jAajXz22Wf+5zd69Gi2b99Os2bN+OKLL2r8+jU0+sY2QOOvhcshvtjMFhOZVnHjbjbLOMrk//B7gvhEEO8Nfl6OCKXJ88bN6LxiSFlPkGJv32ZmE7JOwaNAXgARxIpQPJpIYdgjRFtuJRVrfZ4gMSTS0iK8FtwqZDoV4k0VvRjKkqsKV8tQqaW/zSDpaCqbOe6xs9lRwFBzdJVzlMXnCWI2daOLTuQEUVDZr2bSWWpa1dBKURUHarHwJtHFDCt3TEKiFd3Yyx/sYC19qV4wqJbd3pASYwjEJwfsopMMJEgjSFdXckL9nlZcdebn9aLarHh+FTGbhkvvRJKr/xg0GlpjNiVjd6SRZ/0ES2zPerMnEJ7CfHLengtA0OBxWLr2rbe55chU3OE9UQu24Nr3HLrUj2tdbeZ8QAptitrnHvj1edi7DLXLBKSmvRrbrPMCSW/E/I8l2J4cDsV5OF6/FfP9S5GMluoHa9Q7uuAwmj63lOMzLsZ9dA+nZo2h6YIfsXTpXf1gDY1zgMUnS1hwpPyO8Ng4M/M6R3DK4eGqzTkVxuwdIkqeP7S7gLTC8snon+sUzpVNKv88Onz4MAkJCezYsYPLL7+c7du3B/SMkCSp0vZAPPTQQ8yYMQMQOUG6devmP+Z2u5k4cSLz5s2rUa6Qa665BoCNGzcyYsQIoqKiAOE1snbtWlJSUgCYOnUqU6dOpXfv3syfP58NGzb4jxUVFXHgwAGaNm1Kx44d6dSpEwA9e/bk8OHDDBo0qFo7Lkh2fQZ/vF6+rf3lcPGzUJwBnwfYgPu7uF5n1RzI2Opv1vW8A/rOqPaUOTk5TJo0qVwIy7p160hISCA9PZ3hw4fTo0cPv8hRFt96O33dVbYOJ02axLx58/yPT88JUnbNVMeECROQJIk9e/bQsWNH/9q94YYb+OWXX7j6auEZOmfOHFJTU7nyyitZvnw527Zto18/ET5vs9n8AmNISAjDhw8HICUlhcOHD1drQ2OhiSAaDYrLKZR/S5AFe6YQLCwWA3ZnqVBxek4QnSS+oPJzhfdGtlM81jvF+Px84SniVhVyFPFFGSObsJjsFNlU8grLe0m4VQ82vP2kEEpEhAvH8gPbbEV8OcfTmgSTjA5QgKM2T7UiSJF6GIBIqVu59iRjKMdtdtKcNU+0qapu7E5Rbtds7EKwZCECC/nY2Oo5Rmdd3UQQpWAbqC5ARo5MqXC8O4PYyx+c5BBuXOgxVJykNhz8XvxueymSVLl3Q3P5ctLdK8lWN2FTM7FIcWd2Xi+uVe+KECu9EcPQW6of4CUs6CrsjjRK7Gtwe3LRy1H1Yk8g8t59ErUgG11IOLH3vVzv8+tbTcO19Q6wHcWT8wv6mMH1fo5zgh6TYPcXkH8Ifn4U9dovkGRjY1t1XqCLbIp52rvYX5iAcnQbjoV3YPr7BxekYHY+IEfEkPDSCtJv6YNSkMPJu0eS+NZajG26NrZpGhrVMrFpECOizeXawvTisyTeJPNlr2jhEezxIMtyuc+ZZzqFYzstt1szc9XXXgkJYpOoW7dudOnShb1799KsWbNyO+vp6ek0bdqUmJgYcnNzUVUVSZL87bVl9uzZDBgwwB/mUB1BQUEB2312AP68Db4dfVVVuf322/1hMD4OHz6MyWTyP5Zl+S+Z48FPl2uhVflNPUwiFJ3gJjDhs8rHDvsXuL2u4aqKYoqsNmzC4XBw1VVXMXv27HIeQr51mJiYyIgRI0hLS2P8+PGVrrewsDC/N0hd1+Hpa6Y6arIOv/76a9avX8+PP/7oPzZmzBjefffdCuPOp3WohcNoNCh6g/jiMgeZcbtLPUHsjtIvOLNJvOkKvFEuelUIFgV5QjDI8oofRq9HSG6u+LDKU0p3CmJ0RkKDxPLOzi//BsxVS3cjYqRQ4r0iSK7NH2FTjmxvOEwUTTDoJP8X96FqyuQqqhuHV0AJ13Uod2yASdxAH3JX4n4SAKfrIHiTrJqMIilqZ683yMYzyAviyRauogS3RfJWrilLW5KQ0OHBxTF21/k8AGr+YcjdKx50uabKvjFSL/QIe455VlTZt8bn97hwfSd2B/T9JyKZKz7fyggNHo4kmQGV/KIl1favK84DO7B+IWyMvO1R5Mj6EX/KIod3QwoTOTPc+19APcNwqnMVSSfDpS+Kiif5h2Hz241t0nmF3OEiDOPnAODZ+h2u/3ulkS36a6OPSaDZm2uRgkPBaef434fiSj/Q2GZpaFRLnEmma6ih3E9zi9iHNekkf1uXEL3/bx9tgvQVxkYYKr99ycvLw+EQF5Dp6ens2rWLNm3akJCQgCzLbNu2DbfbzSeffMIVV1yBJEn069fPn5xy0aJFXHHFFbV6fkuXLmXTpk08+eSTtX1p6NOnDz/++KPf7i+//JKBAweyceNGFi5cyNtvl35vDR8+nE8//ZS8vDz/88vJqehF81dHCo5Fiu1S/icsURzTmyoei+1SOjaydWlbbBcIiq3yXKqqMnnyZIYPH+7P5wFQXFxMYaEIec/Pz2fNmjV07ty5yvU2ZswYPvzwwwrtNSXQmqkpHTt2ZO/evRw5cgRFUVi8eDGDBg3i8OHD3H///SxevBi9Xrxn+/Xrx6pVqzh27BggvGDS08+/sFlNBNFoUHTevAZmiwmL9wswMtKC3VlGBPF6ghR4hViTJG7QCr0lcnNdom8I4ndxsRAjsj2lokSsbCQ8RJzrVE75G7wsSmvhRkvBxHnvgxUV8k/LC+LBRRH5wk5EZZgEr/fHrmrK5BZzFLw2hkptyh3rbgwF4IC7hGKlZuV2bY7tAOikUL8XQj+dmPeYmlejOQKh5KwHQI4M7DZnIbRMqdzf6nweAHZ/KX6HNoPYqncwJUmmqTQUgCPKl2d2Xi+ezd+ArQAkHYZR99RqrCQZCQsaC4C18LOzIhyoqkrGv24BVUWOSyTsytvr/Rw+DO29JdacWbhPfn3WztPYSFHtIMX7Ov7xBmru/sY16DzDcPE05F6iVKvrq6dx7/y5cQ36i2NIaEWz19eAyYJqK+LE3ZfgzjjW2GZpaJwz/Pnnn6SmptKjRw/GjBnDyy+/7A81WbBgAddffz0dO3Zk9OjRdO/eHYBnn32Wxx57jLZt2xIbG1tjbw4fL730EocPHyYlJYXk5GTeeOONGo9NSEjgscceY/DgwaSkpHDdddfRq1cvXnvtNbKyshgwYADJyck8+uijdOvWjQcffJChQ4fSvXt3rr322nM68eRfgXXr1vHpp5/y1Vdf+XN0bN++nYyMDAYOHEiPHj0YNGgQd999N127iuveytbb7NmzWbJkCe3atePQoUPlyjvXhEBrpqZYLBbeeustrrzySpKSkmjfvj3jxo3jgw8+ICcnh1GjRvlLTsfFxfH6668zbtw4kpKSGDlyJJmZ9Vg8oYHQwmE0GpTiIvFhbTQa/VVhjEYZRwARxFf5Nsggjsmyz/1RPI5SVfKBEq9Hhq8yjAyESDLRETIccZFTUD4nSJYqlNlIgjBKer8IApBRBFFlPMPyKU2IFImIT20bpGdXsZv9xVWLF4Wq8M7QE4KJ8nk/uhpC/X/vdBXRxxRR5VwANocoU2sytPe3dZebgRsy1UIy1ULipNDKhgdEdeaBU+Q8kaMrjx1tRXeOsYdd/Mpoaveh7D+XqsIebz6QVsNq5FbfSh7PMffX2DhFoXqYUKlVnc7tO7/re+FhIfcehy6qWTUjKhIRdiMFxZ+hqEUU2dYQGjSs+kG1oOj7T3AdEHGpsf98B0l/9j6idcFt0EUPQclZjefwm+ibXIYkm6ofeD7Sayrs+lwkOPu/e1AnLkXSaV9/NUGSJEy3vort+G7UjP04Xp+M7rHV6GJbVj9Y46xgbNWJhAU/cvKeS/Fkn+TkvZfTdP736KOaNLZpGhqNTv/+/dm+fXvAY/369WPnzp0V2tu3b8+mTZuqnHfu3LnlHoeEhPjzHaxatapau7Kzs/1///zzz+WOTZo0iUmTJpVre++99wLOE6gviKScPsrmi9A4uwwcONBfGeV0tm7dGrC9svUWGxvrT+RbGZMnT67Q5ltbla2ZspTN0fH++++XOzZy5EhGjhxZru2xxx7jscceqzDPZZddxmWXXVapLYA/f865iuYJotGgFFqFCGIwGcjJEW4XBoPO7wmik0CWxc2xL/l3mEGIJSVFon+xNzY0zLt6MzPFnFnecrNBkognbdlEiCae02JJMxURVhOJUDtMejB774cyi8p1JZdTwi5kQogAoEuo6HysmjK5VkW4KYdL7Svc8AfpZGJ1IjfBFkd+lfP48OUDsZj7+NtaSTGYEM9zpydwFumq8OQJYQXJgBTWudJ+XRDJj4rJ978mtSZ3H5R4Pxw7X12jIRFSZ4xEAnDEvbRu5/Xi2bsB5Yj4QjJcMq1Ocxj08ZiNyQAUFFYRU1oHlJIisl/8BwCWviMJ6nn283QY2s0EyQDuAjwnPj/r52ssJNkII18UDwqOwKa3Gteg8wzJYMJ87+dgDgGXHdurk1Dt2u5jY2Lu2JOmzy0FkwXXsX2cuGMwHmvlZRk1NDQ0NDQ0StFEEI0GxeP2eX+UeoKYTHq/CCKXyXXlE1YjzeKP7AwR93jSOy7MK5ZkZoq8Gpke4ToSrhOxpFHhYrJca3mF9pgqLhRNUmnMaUyw+H3qtIq1OZwEIJgwJMT52nrL5Oa4lCrrsOcqW71jmwc83tUgXFDW10AEURQbHo94/hZTD3+7TpJoIQkvk988tc8L4sn6AQAptDOSVPnOeBNaYvKKRrvrGhLzpygPRlAsRLWvuq8XSZJoLgk3wePqt2dU99619BkxZ0In5BZJdZ4nKvxWAOzOzThdR+s8z+nkfvA0arEVZD2xD7xWb/NWhWSKQ068DgD30fdRXTVP1Hu+ITVNhs4TxINNb6DmHWxUe843dBHxmO75FGQDnNyD/f27zuj9qHHmmLtfRJN/fwqSDnfGUY5PG4JSfOG+hzU0NDQ0NOoLTQTRaFA8bhFCYjQZ/IlRTabScBiDXOoxUSCKvhDizQJeUizEjnxvTpDYYCFGFHvLyPgSo3Y0CEUjIjRwTpATqqgy00QK87e18Rb6yDjNEyQb4V0RQWlyylbeMrkub5ncyrAiPEHCpMA3/P3NwsNhu6sw4PGyOFx7EDVpdJiMncod661rBUCaUru4cFVVUQtFolNd7Igq+0pItEGIL9upfe15VVVhn0gCRccra1VhoqX+SgAc5JCnBnZxrQ4l4wDKAeH1Yhj3UJ3m8GEx9UYvC2Erz7rojOby4Ty2D+uS+QBE3vJP9LG1D9WpK/rmfwOdCTwluA7XPI75vGTgQ2CJAlWBHx9GVS7MhLBnC32bFIw3/gcAZcsKnF8+1cgWaQT3uYS4Jz8GJNzp+zk+fRiKTfPS0dDQ0NDQqApNBNFoUDweIRoYDAbcbiFmmEyl1WHCQ0tvjrO813GhQcJDweP24HK6sHvDW2K97SUlQljJ8uYEifaGmUSFCbHC7lTLhcRke3OCNJMi/W1xXk+Q9ILy9hYhvEaaUSpkNDPL+BxWDtsC5wXxqA6c3oSq4brAIkgvo6gVnuFxYKvmZszmEF4lerkpOl35clYpcisATlGATXVWOU9Z1JJD4BLPT47qV23/JETOkAyO4MRWTe/TyNoB9nzxd6dxtRoaIrUgUhLJpI54ltXuvF6cy58Tf4TGou8+surO1SBJOsJDhDBTWPJ/KMqZ3XCoqkrWv6eA24WheXsiJv7jjOarLZI+FLnFZACUk8tQ7XUMdzoPkPTm0rCYrB2w/aPGNeg8xDDgeuSLvN5D387HtfHMwtQ0zpyQwVcS+4goVeg6tIsTM0ehOGr5Ga2hoaGhofEXQhNBNBoUxSeCmAy43eJvo1H2h8MEmUuXpN2rL0SVKZWWm1+IT3aICxZih8PhRlVV9jqFG0eQJCSKyNDSufKLSj028lThUdJMivC3xXqTox4+rciKLxzGVxkGwKCTiDQIseZgSWARpEg9QmWVYXx0MwpPFBXY5SoK2MeHzb4RAKOhdYVjnXWldcR3KzW/gfXkrBN/GGPRWRKr7d+GJHToUVE4SC09Mvb/n/gd0wUpolXtxgLNJJF86bj6LZ5aCD0AalEOnk2i+onh8plIujP/2AsPuQqRV9pFQdGZ3QQWr1mGY5fwUom6ex6SseGTk+oTJ4IcCqg491/YCdWkhBTofqN48OsLqAX1F9L0V8F00/NILYVnmPPd6biP1s1DS6P+CL1kIjEPiMTPzj83kvHIDaiu2n1WamhoaGho/FXQRBCNBsPtdvtjyI1GQ5m/9RSVCJFCUUo9Nhx+EaT0pvBkfumue5MwIYKoqqgQ46sO00wv+keGlSYY8eUFUVWVIkTukDhdaSWVZt7ImLIlclVUvwgS5a0M4yPeWyZ3Z6GLQPiSospYMErhAfuE6fS00Quvjm3OquO4Hc69AASZK3psBElGWnmrz2xXal6nW8n+GQBdWPca9Tdipg2ib21K5aqqAru9QkG7ipmka0IzeSQgoeAkQ1lXq7Gu1R+A4oagCAwDbqjT+U9HpwshNEh4lOQXfiieYx1QHDayn5sOgCl5EMF9z8xLpa5IOiP6dqJksJq7AaXwz0axo8Hoew+YI8S6+L976vz/+6siyXos93wKoTGgeHC8MAGl4Pwrj3ehETZmMjGzFgBg+/X/ODlrLKq7ZiXYNTQ0NDQ0/kpoIohGg+FylAoGeoPBH6JiNOootImbEF2ZXBEub4RIdITZ35ZhLVUpmoaViiNWq4MCRVzsxcuiv9kooffqILlWMZkVO4rXQyNGKq2N28Srh7gUKPKW5i0iHxVhV1lPEID2wSIUZ19x4DCWQlWIICFU9NwoSxu9BYCf7TmV9vF48lC8eUzMpsCCRYosylVuV2pWIUZVnKhF+wDQxQ6v0RiA9vQChAjie22q5eQW8CV/raMIYpIiiKIbAAc9i2s8TnXZcf34NgCGYbciGS11On8gIsNuAcCj5FJs+7VOc+S9+y8Uay7oZOIeatyKJXLcpWARuU6c+1+5oJNeSoYgGPmCeJC7Dza/27gGnYdIwRFYZn0JehPYCnC8fguqy97YZv3lCRt7G1EzRN4W+5bVnHp4AqpHy32j8dfi0KFDDBs2jC5dutC9e3eKi8UG2rBhw+jRowddu3bliSee8Pc/cOAAqamptGvXjmnTpgX8/ps7dy4LFizwPy4qKqJVq1Zn/bnUN++//z6ZmbUTrd9//31mzZp1liw6vyksLKR3794kJyfTvXt33n77bf+xO++8k7i4OFJTU8uNGTp0KJ06dSI5OZnk5GR/e3Z2NsOGDaN9+/ZcffXV2O0Vv1MD/S9iYmLq90k1AF999RV79+6t1Ziff/6ZCRMm1JsNmgii0WA4naUiiEqpl4bJpKfEJr5wzCYhgrgV8KXxCAvSY7YIwSOzqFQESYgsFUEKrA6KVCGCRMtGf3tUuFjieV5PEF8+EIBYqdQTJL5UD+GUNzIlr0wp2Ahiyz2XbiEiROeYPfAuWyGHhS26qquQ9DFFALC9iqocducu718yJkO7gH266UQiza3KMTw12NVWCrYD4sJYjkytunMZOiHK87qwc5z9NRu001tKNqIVUmhCjc91Oq1lkYcgl6041YJqegvcGz6D4jzQyRiG3lLncwfCaGiByShEqYKiT2s93nXyCAWfvgxA2LV3YUhoVZ/m1RpJ0mHsMFs8KNyGJ7vqWvXnO1KzPtBR5HZh4ytatZg6oItvj+nOD0DSoRzahOOd6Re0eHa+EHHtXURMEgmgbb9+S8bcv6EqmreTxl+HyZMn88QTT7Br1y5Wr16NySSuF5cuXcrWrVvZtm0bK1euZMuWLQA88MADzJ07l/3795ORkcE333zTmOafMZ4qhM+6iCAalRMUFMTq1atJS0vjt99+4+mnnyYnR2xs3nDDDaxcuTLguM8//5y0tDTS0tL8bU8//TTjx49n3759tGzZkoULFzbEUzhrVLUO6yKC1DeaCKLRYDgdpfHJZfMyGI0yJd7EqBaTaC8pE8ocZABLsNjBzy4WbhrBOrCY9MjeajIZVju+t1qsrlQEaRIlPDZ8niBZqlA4DOgIlkpFlBATGLwm+crk5nhFEDPByJTmJQFo4/UEyXWpeAJc9BeooupKZflAfKQYI8Q5PU5KKkmOanPsBMCob11pGdskWeT0cOLhoJpV5TkBPDk/iz/MiUj60Cr7liWMaMIRinNNqsSoihsO/yQedD4z9TZeNxgdRkAl3fNt9QNUFfcKkQRTTh6FFBZbzYDaExU2BQCb41ecriO1Gpuz4AFQPMhR8UTd9mi921YXdOE9kKKHAODe9xyqEjjc64Jh0BywRItqMd/PEutVo1bouwzFeK3YUfVsWYHz6ws7p8z5QtSUxwi7ToS4laz+iswnb9EEKo0Gx60qnHDba/xz0uOocV93JRs+O3fuxGAwMGiQSOYeFRWFXi+uncLCROyz0+nE6XQiSRKqqrJhwwYuv/xyACZNmsTy5ctr9TwfffRR/65+XFwcjz/+eIU+c+bMoXPnzowePZpRo0bx9dciV9mKFSvo168fycnJ3H777ShewTImJoZZs2bRvXt3RowY4fdm2bdvH5dccgkpKSmMHDmSkydF2PbQoUN5+OGHGTx4MB999BFvvPEGffr0oXv37txyyy0oisKXX37JH3/8wYQJE+jbty8Av//+O4MGDaJXr16MHz+eoiJxnbx06VI6dOjAkCFDWLu29lUBGwPV40bJO1GvP2reSVRP5dcGsiwTFCRC2+12Ox6Px/9ZO2DAAKKjo2ts//Lly7npppuAuq3DN954w78OExMTueWWipt/r7/+Oh06dGDEiBFMnDjR791U2Tpo1aoVc+fOpWfPnvTu3du/3jIyMhg3bhypqakMHDiQ3bvFfc/kyZO57777GDp0KP/5z39YunQpffv2JTk5mSuvvJKioiJ+++03li1bxt13301ycjI5OTmVrusNGzbQtWtXBgwYwP/+979avR7VEfiOSkPjLOCq1BNExuZNAGI2ClGjpMy9V7ARdF7RJMfmhBDQ60Q/i0VPUZGLY8WluUJiyniChFhEvxNZvgoywuMihNIQGx/NI+BgbqkIkolImBhKVIW+rS3iraMAx+0eWlhK30pu1YYdIURUJ4J0N5YKEDtchX7PkLI4XcITxGKu3GMjWgohHAsF2NjkOUJ7XZNK+wIoBdsA0EUPqrJfILrSn/Us409+ZRS3Vt05/Vdwe713Ooyp9bnKIksmmktjOKJ+Qbq6gjZcW3X/fWuhIAMA49gHzujclRFk7oNeTsTtSSfX+g7x0U9UPwgo/vU7Sn4RlW5i7nsZnan+wnTOFEOb6Thz1oA7H3f6JxhaTGpsk84aksGCeunL8NVNkLMXtrwDKXc0tlnnHfpht+E58AeeP77C/fXz6Jp1wdDr8sY26y9P9PSnUe02Cpe+RfGPn5ETFkn0zBdrVaJcQ+NMyPQ4ST15dm6g/2g6kAR9xWu5ffv2ERISwtixY0lPT2fChAk8/PDD/uP9+/dn+/btTJ8+neTkZLKzs4mKivK/LxITEzl+PHBo8TPPPOPfnVfKeFc98cQTPPHEE5w8eZLhw4dz8803lxv3+++/891337F161by8/Pp1KkTd955J9nZ2bzwwgv8/PPPmM1mZsyYwWeffcbEiRPJyclh9OjRzJs3j0mTJvHFF19w0003MX36dBYuXEjLli1ZsmQJjz/+OG+8Icrbu1wu1qxZA0Bubi7Tpk0D4Pbbb2f58uVcddVVpKamsmDBArp164bT6WTWrFksW7aMyMhInnvuORYsWMA999zDXXfdxbp164iPj2fYsGH061d9FcHGRrVmYnuoV73PKz+9CaKaVXo8Pz+fIUOGsG/fPp577rkahafccMMN6PV6pkyZwvTpIjdcQUEB4eEij2BV63DRokX88MMP5c4PMG3aNKZNm0ZxcTEDBw70z+vj+PHjPP/882zatAm9Xk+vXr0YOHBgpevgoYeER2GLFi3YsmULjz76KAsXLuSRRx5h5syZPPLII6SkpLBx40ZmzpzJ//2fKIJw7NgxVq1ahSRJ5OXlceWVwuv2qaee4p133uGee+5h7NixTJgwgTFjxL3BxIkTA67rKVOm8MEHH5Camsp1111X7etaGzQRRKPBcJbJCaJK5T1BfESEiPbiMp4gwUYIDgkiJzOXLJuYI9jrARIcbKSoyMUJW2mYTLSu1GsjxCLmO5EtvCzS1XwAIqXyZWYBEsKECJLhFUFKy+NWDEGJN+kw68CuwMGS8iJIkXrY/3eoVHVOkBCdnlidkSzFyR+O/AoiiKqq/vK4ZmOXKufqpktgnXKA9Z4DTDT0qbSf6syDYpGzRB9TFxFkAOtZRiG55JFRIV9KOfZ53QBjuiIFnXnMYgv5Co64vyBf/ROrcoAwXdtK+5p+FOq2rlUvdE07nPG5AyFJOiJCryE7/0WKSn7AE3Efshw4Ea4P1eUk+5nbATAnDyJo4BVnxba6orMkomsyBiVjOZ4j76FveiWSoerndD4jNU1G7XkbbFkIG19FbTEYKbZzY5t1XiFJEqZbXsF2ai9q+i6cb9+B9NAK9C2rDgfUOLtIkkTMvS+hM5ko+Gw+1i/fRHHYiX3w9cY2TUPjrOFyufjll19IS0sjLi6Oyy67jN69e3PJJZcAsH79egoLC5kwYQI7duygSZOK1zCVCYUPPfQQM2bMAEROkG7duvmPud1uJk6cyLx58yrkClm/fj1XXXUVRqORuLg4hg0bBohd7m3btvkFBpvNRrNm4mY7JCSE4cNFzraUlBQOHz5MYWEh69at899Uejyecue65ppr/H9v3bqVOXPmYLVaycvLo3Xr1v5xPvbs2cO2bdv89jidToYOHcqePXvo1KkTzZuLPGHXXnstR49qldQqIyIigq1bt5KRkcHVV1/NhAkTAq4rHx9//DEJCQnk5uZy2WWX0bVrV4YMGVJh3VW2DidNmsS8eaVel6eLLlOnTmXq1Kn07t27XPvGjRsZMWKEX2jxCRCVrQMfvnWTkpLCsmViA++nn37izz8DJ9GfMGGC3/ajR48yYcIEMjMzKS4u9r8Py1LZus7Pz8flcvlzqtx4440sWrQo4DnrgiaCaDQYTmepsqEq5T1BfF66YV4RpKwniFkPIWEiaUe2UyjvIbLoFxpqJCOjmPQSUfY2VJLRlxFYEmLEefIKxbjjqqiBGyeFVbAv3Bsds9sbTZKHiJmMpmIeC50kEW+SOWzzsK/YxdDoMvlJFJErQ08ohjLJVyujnymC5bZMdjgLKxxze46jekv6mk1dq5ynv64965QD7FUzUFW10g9PT97vgAo6M1Jo1XMGoiltCCWKQnLZwx/0I/COr+p2wOEfxYNuVXtt1JQIqTNmYrGTxSHPZ/TQzQ7YT0nfiXxqDwCGcYH71BdhwVeSnf8q4CS/aDHR4VV7EuR99Bye3AyQJGJmLTgnd2UNbabjyPwWVCeuA69g7PRIY5t0duk9HfZ9A0UnYeVdqDeuQCrjUaZRPZLeiOUfn1MydzAUZuN4eSK6R35EF9m0+sEaZw1Jkoi681lUjxvr/16naMUHSHoDUf94qbFN0/gLECcb+aPpwBr1VVUVj8eDLMs1+l6Mq+QzOjExkd69e/tv4EePHk1aWlq5m6/Q0FCGDx/OypUrmTVrFrm5uf7rpvT0dJo2rf3n1uzZsxkwYIA/rOb05xbosaqqjBkzhnffrZic25fHBETIhS/MIj4+vlweibL4wjIAbrvtNr7++mu6dOnCM888EzDJpqqq9OrVi59++qlc+5YtW87Ja5PqkMLisDyzud7mU1UVj9uDFBZXo/5NmjQhKSmJNWvWlBOkTichQdxXREVFMX78eDZu3MiQIUMICwvze4PUdR2++uqrABW8QHzPJ9DjytaBD99a9K1DH5s2bUKW5Qr9y67Du+++m4cffphLL72UxYsX+71FTrcj0LrOy8s7q+tQywmi0WCUrQ6jULqojUYZq7fKitHrxOHzBDHoQJIgLEKEjeR7l2y4XowP9yoXGd6qBGap/JsxLko8thYLESTDmxi1aYCytS0ixe8Mb2LULI4BFcvj+mhiDFwmN08VoSbBJAYcdzp9TeLEWwMkR7XZd3j/MqGXK3fFA0j25gWx4+KYV+wJhJIlPuSkkA5IutrroBKSP0HqLtZX3vHoL+AsAkmGNhfX+jwBzy1JtNRdDUC6+i2KGjhO0/3Dm6J/YlfkTjW7AKsrOp2F8OBxAOQXfoqqVp5Hw511nPwPngUgdOwUjC3OjofKmSIZwpBbC28VJfNblOILO2moJBth1HxAguJTsP4/jW3SeYkUEoXl/qVgCoHiXByvTkK1F1c/UOOsIkkS0Xc/T/DFwpW4cNlCcuffr+UI0Tjr6CUdCXpzjX+ayqYa9y274VWW3r17k5GRQV5eHoqisGbNGjp37ozVavUnBHU4HHz33Xd06tQJSZLo16+fPxnqokWLuOKK2nloLl26lE2bNvHkk08GPN6/f3+WLl2Ky+UiKyuL1atF4vF+/fqxatUqjh0T15s5OTmkp6dXep6wsDBiY2NZsWIFILxeKtuNLy4uJj4+Hrvdzueff+5vDw0NpbBQXAt36tSJI0eO+G8+i4uL2b9/P506dWL37t2kp6fjdrtZsmRJrV6PxkKS9egiE+r1R4psiiRXfq2ckZGB1Squ361WK2vWrKFjx46V9ne73WRnZwMih8i3335L165iQ3LMmDF8+OGHQN3W4caNG1m4cGG5CjVl6d27Nz/99BNWq5WSkhL/OqpsHVTFkCFDePNNca2tKArbt28P2M9qtZKYmIiiKHz88cf+9rLrsLJ1HRkZicFgYPNmIWx98sknNXwlaoYmgmg0GGU9QXyhlLIsIcs68otEg8WXE8Tb1RcpExUrhAKb96Y90iiWbvPmQswoDBYXc5G68glMo8LEBDa7iqqqOL03qM2link+mnmdQ/Jt4KAEJ0JYqSzco3OIsGV/SfmEpoXecJhIqWYu9T2N4sSH3DbyT0tEaXNsBMBkaF2tGpogRRCD8DzZphwL2EdVVZQC8WGiix1RI/sC4RNBjrGHEiqpbLPD+2EV1w3JVH/hFC3lKwEJDzYylIoijJJ3As/vXwCgv+TvDbKbERl+MyChqsVYiytP2pr1nzvB40IKCiX67/8+63adCfpm14ClFaDiPnBhl8wFkGI6Qc/bxIMdi1GPb2xcg85TdE3aYp6xCGQDyrHt2BfciFpJ0meNhkOSJOLmvEvwsPEAFH7xOs4Pn2pkqzQ06h+9Xs9TTz3F4MGDSUpKon379owZM4aCggJGjx5NUlISKSkpDBw40H+T+eyzz/LYY4/Rtm1bYmNjA3pzVMVLL73E4cOHSUlJITk52Z+jw0ffvn0ZPnw4SUlJ3HbbbfTu3ZuwsDDi4uJ4/fXXGTduHElJSYwcObLayi0fffQRL7zwAj169CA5OZnffvstYL9HHnmE1NRURo8eXa4M6+TJk5k8eTJ9+/bFaDSyePFipk+fTlJSEhdddBH79+/HYrHwyiuvMGLECIYPH07Pnj1r9Xr8lUhPT2fw4MH06NGDgQMHMmPGDJKSRCjolClTuOiii9i2bRuJiYl8+eWXOBwOLr30Uv86HDJkCKNGjQKEN9GSJUto164dhw4dYsqUKbWy5bXXXiMrK4sBAwaQnJzMo4+WT7qfmJjIzJkzSU1NZezYsfTs2ZOwsLBK10FVzJ8/n++//56kpCS6detWaUWlRx55hCuuuIJhw4aVC92aOHEiTz75pD8xamXr+u233+amm26if//+tGjRolavR3VI6oV+ZXuBYLVaCQ8Pp6CgwJ/d+lxBURQyMzOJi4vzJzANxG+r/2Da1TPR6/W8uvwjHnzwJywWPStWXM91/zxFQZHKvdeHM7JfEMt2wYtrISoI/vc3ePWpt1n4/AdYnn+G7NbtmNo8mPvbhLJo0Tbee28r9ofiOdJFor8xks+bpPjPefSUi9ufForrZ0814UbdqxRi59/Gqxggl8/1cTAXbvOK5QsnH+S/RpFM8yEWYaJiDpGlp0q4f4+VYFliy8BSoeQ75xjsZNFTfozm8uhqXz+HqtA2/ScU4JPYngwxl2aSPnJiAi7PMcJD/kZs5F3VzvWYYymrlb1cpGvD06bxFY4rxQdxbhKZp429P0VnqZm3yul4cPM0f8ODmyv4O70oL6iorhJ45yJQPTDiGaQzTIp6Or84byOPHUSRzEDjm+WOOT56EPeaD1BMIQQ9vxPZYKpklvrlZNZDFNtXYTR0oHmTRRXEF1vaWk7eLdxxY/+5kNBLb2wQu84ET94fuLaLChP6Lk+hjxnSyBadXVTFDZ9dDXkHwRIF13+DZKp59aSqqOnn5IWCc+1HuD68DwB54I2Yb3q+kS3SAFAVhYxHb6BkzVIAIm59hKjJD1czSkOj5tjtdg4dOkTr1q0xmysmLq0MVVVxu93o9frzMhSjOoqLiwkODiYvL48+ffqwYcOGGiXQ1Gg8LsQ16VuHNpuNwYMH8+6779K9e/fGNqvOBPq8qek984V/JaZxzuD0VoeRdBIOh9gZ9ElwLq8DhNlU3hMkxqs9hIYLDwe71yXNFw4TFiZiQvMNYr4m+vIxoj5PEICTBXYKvd4dsVLFG5umZZoO2UVVEQOmgAIIQNtg4XVS7FEpdAtPFqdq9VeGCZMqT9pZFpOko5ks3rgb7Ln+dlV14/KIMr1B5pplu07WiRjYrUp6wJ17T8468Yc+vM4CCICMnlaIhGBpBIghPPijEEAkGVoPr/N5KqOt/DcActmGXc3xt6u2QtzrhAeKc8AkJNkQcPzZICpcVMpxuvZSYv+j3DHV7SbnpX8AYO4xkJCRNzSYXWeCHJmKFC52gNx7/4OqOKsZcX4j6fQw+lXQm8GWC2vPbW+dcxnjwBvRDxe7WJ61H+H84a1GtkgDRHn6Jo9/RNBQEVaY/+6T5L77r0a2SkPjwufWW28lOTmZAQMG8PDDD2sCiEajMGfOHJKTk+nZsydXXXXVeS2AnCmaCKLRYLgc4gZK1ss4nUK00HvFDJdH3LCbfOEw3lQP4d5NBF9OkJIwEVYR6q0OExEhSos6DWJ8c7l8qdFgi4TRG8p3sLg08WhMgISlFgOEejWU4y4RThJCRKXPp3VQqcBy0GtwoVqaOyFEalnp2NNJ9YaL/GIvzeXhcO0HhDpUXWUYH71kcc4SnJzwVsIpi5L3OwC6yL41tq0yeiLEjXT2+UOH/PhCYZr1RjIEFpHOhHjdIExEAQrHlBX+dtfP74HHCbIBV9/r6/28VWEydsBs7AFAbsFr5Y4VLHkF58EdoNMRPfOF82pHwdDhIUASJXOPftjY5px1pLDmMGiOeLD3a9Q9yxrXoPMY4zVPoOsivIdcSx7Ftf3HRrZIA0CSZWLnvIc8UGTiz3//3+S8+Wg1ozQ0NM6ETz/9lLS0NHbt2sUtt9zS2OZo/EV58cUXSUtLY/fu3eVKR/8V0UQQjQbD5RJCgV6W/Z4ger0QEnzJhs1eESTXm0tP571XDAsXIohiEqpIpDdZiC8xqse74Z94Ws14SZIweb1LjtkLRBsQUYl3R2KE+J2rCm+OOJpX+nyCZR1NTeItdNCbF8TqrQxjJBJZqrkb6BCTCIHZ7S7ye3DYHSLJkKxriixH1mieFlIUZsSLsdlzpNwx1eNALRSJVuXYYTW2rTLa0xMJHSoK+0krPY+9ALJ2igddz44QoZP0NNeJmN1DniWoqorqceP6TmTFlvtdC+b6CWOoDZFh4sLG4dqFw7kPAE9eJrkLHwcgZOSNmNqeX6q7zpKILuEqADzHPkB1ZDWyRQ1Axyshsb/4++e5qEUnG9ee8xRJp8P89/eRmgivOOdbU/Ec21HNKI2GQNLrMd45D0vfkQAUfPQcOW9pQoiGhoaGxl8DTQTRaDCcXk8QvUGP3S4EEYNBh9ujongjN/wiiE081ntXqM8TBKNw1Qg7rTqMK0KIIjEBSqZFeMvupjuEJ0gwJnSV7MRHeR1JrDpxo9eEVlU+pxYWcd4/i4THRo66FYAQape8J8XrCWJTFY55hFdFif1XAIz6qqvClEWSJDrrRDWbtUr5pEaKdSsoTkCHLiIlwOjaYcRCO0SoxJ/8Wnrg4PciFMYYBi0HnfF5KqOFLBKa2ckgV03Ds/lrKCkASUI/+p6zdt6qCDL3Q5ZFfpicgtcByH7+HnA5kcxBRN91flYdMbT+O8hBoHpw7nuusc0560iSBBc/C4Zg8Z5ZcReqqjS2WeclktGCZdZXEN0cnCXYX7kBJbfy6gcaDYck64n79xIs/S4FoOC/mhCioaGhofHXQBNBNBoMlzcnSFCwpZwIYneU5q7w5QTxlcgN9ea0DI0IRTUawVuPOtyrjoSHm1BlUIPF4xhdRREkOlyMOe4ND4mQKg/PaOKNknFbqi6P6yPe65GyzVsm16ru856ja5XjTqeNPogIb+WbzU7hsWJ37gIgyNKvVnMN0rUHYK+SUS4viCdrlfjDkoikD67VnJXRFbFbvoc/cHtDd9j5qfjdepgoPXqWCJFaEuIVqfa5P8T1nQhBkXtfhS6q7vlOzgRJkogOmwZAiX09hdtWULzmKwCiZ/wHOTSiUew6UyQ5CH07keRSzV2HJ39zI1t09pEskXDJPPEgZzf88UbVAzQqRQqLxXL3J2AJB2smtv9cgVpS0NhmaSA8QuKf+rzUI+S/z5H34fkp1mpoaGhoaNQUTQTRaDCcDnGTHBYZhscjdlXj4oKwO8uIIMbyIojX0YPwyDDU4NIb93CDzxPEjCe0dBnHBrjpbhIphIp8nfAESZAiKrWxdRRIOheyWVygR1YjgiSFidCTIzY3qqpiQ7jNR8ndqhx3OpIk0c0gvF1+seXgUYpQFJEk1WzqUau5UuRWAORR4hd+AJTcDQDI0fVX4aMDKYCECzsHSEMtzoJsb836dtVXxjlT2upEhRXX3h9Rjm4DwHDJtLN+3qoIDR6JTgoDRSH7uekA6Ju3J3TM+R0DLMdd6k+S6tr3nKikcoEjtRwEHUUoEJveQM3c3rgGncfo4tthuvMDkHSQdxLbCxNQ3Rd2ot3zBUmvJ/7p/2HpdxkAeW8/pgkhGhoaGhoXNJoIotFg2G0ixkWSSqvDmEwGbGU9QYxiSdq8TgXevKciJ0hoaTJTnyeIXq/DGF9aAjWQJ0hCrBBBbAYRZtJKF12hj49m4WAOzcIXLRNFk0r7AnQIFt4buS6VIiUHjzdBaKjUpspxgUgyiDJOGxz5OJxeIQEJk6FDreZpIUUR6c15sslzGADVkQ1OEeIjxwyutW2VYSGEprQGYAs/wd7l4oDeAolnnny1OprJI5Ew0OZrkVBWatYFuUXSWT9vVUiSnsiwW+HnXNQjospQk0feQzrPy6JKkoSh3b2ABLajuNM/bmyTGoYhj0B4K1AV+P4BVGdxY1t03qJv3w/jrfMBUI9tx/HW1IBVrDQaHuERsoTg4RMAIYTkvPFII1uloVE3Dh06xLBhw+jSpQvdu3enuFh8bg8bNowePXrQtWtXnnjiCX//AwcOkJqaSrt27Zg2bVrAz6W5c+eyYMEC/+OioiJatWpVY5vuvfdeunXrxr//rVUdu5AoLCykd+/eJCcn0717d95++23/sTvvvJO4uDhSU1PLjRk6dCidOnUiOTmZ5ORkf3t2djbDhg2jffv2XH311djtpxUdAN5//31mzZpVrq02lYZefPFFOnfuzJ133lnjMRcq5/dVucZ5RXGhEEEcdgf5+eKN7XJ5ynmCWLzhMN5iMYR6c4tagi3owkXeDAmVYLk0p4ccK7wxdCoEe0NKytIkWrQ5w4UnSKDyuD4SwsASJsrSSqpMcBXVYQDaBYm5VeCAY6+wAwPBVSRUrYyB5igAjnpsFNpFbhG93BSdruYJVkHcrLbTxQGwRvEm58z15uyQjEihHWttW1X4qsTsJw111xLR2PpiUW70LKOXzLTOSCXikNhRNlz50Fk/Z00IUYag+6/wCjJc1g9TpzPPwXIuoAtug67JGAA8R95BdeZUM+L8R5KNMOplUTbXegx+ODfW2PmKoc94DGMfAMCz9VucS59pZIs0fEh6PXFz3isNjfl4HtmvztaEKo3zjsmTJ/PEE0+wa9cuVq9ejckkNsuWLl3K1q1b2bZtGytXrmTLli0APPDAA8ydO5f9+/eTkZHBN998U+82ffDBB2zdupV//vOf5do9vsoAGuclQUFBrF69mrS0NH777TeefvppcnLEtdENN9zAypUrA477/PPPSUtLIy0tzd/29NNPM378ePbt20fLli1ZuHBhvdv75ptvsmrVKl599dVy7X/FdaiJIBoNht0mhA+D0UBxsXD10OkkHGVEEIP3vtkbLUOw17FDkiT00aJCiklRyiU29XhzfphcgZOdxniPu8OKxGMqlsf19w2C4IjjABiVMCSqLmUaZdBh8b6L0l17ADATi06qvQDQ0yQ8QRQgx1sZJthyUa3nARjszQuyUzmBqqp4vKEwUlgSkiRXNbTWdEHYGGotRrKKXCp0u7Zez1EVLVdkAuAIk7F2jW2w81ZF3vw54FBQDRKOcTYUpaSxTao3DG3v8iZJdePc+3Rjm9MgSJFtob+4cefIKtQ/v2xcg85zDKP/ISo4Ae6VL+P65b+NbJGGD19oTNBFowCwfvoSOQse1IQQjfOGnTt3YjAYGDRIJGaPiopCrxfXZGFh4jrL6XTidDqRJAlVVdmwYQOXXy4qzk2aNInly5fX6pyPPvqof1c/Li6Oxx9/vNzxCRMmUFBQQEpKCitWrGDo0KE8/PDDDB48mI8++ogPP/yQ7t270717d557TiQff+ONN/xzJiYm+svqvvfee/Tp04ekpCQefVQkMj58+DA9evTg5ptvpnPnzlx33XXae7aBkGWZoCDhfW232/F4PP7XfsCAAURHV+59fjrLly/npptuAuq2DitbMz7uvvtuDh48yMiRI1m4cCGTJ0/mvvvuY+jQofznP//hu+++Izk5mW7dunHvvfeiqirLli3zz9mmTRuGDRPVJVesWEG/fv1ITk7m9ttvR1HEjVtMTAyzZs2ie/fujBgxwu+FdS6iiSAaDYajjAjicIh8AmazHrtTvHH0srcqA1DoDRUPMpSOl71fXrrTqjT4PEHCrYEFi+hwHapOAZM4Z1WeILIOYmLFDr7e1rTa5yRJEp1DxPmLEMJFkFR7LxCAcJ2BOJ0RUFGdosSsyVi73CI+Ur15Qey4OKJkoVrTAJDjRtRpvqoIJpx4WtFtn1U0WKKhSXK9nycQqjUL3ZbVABwcFcZ+9aMGOW9VOPamUfT9JwCo1yVAqEpe0aeNbFX9IemD0beZCYCauwF37sbGNaih6HINNPOKkmseR/UJfhq1RpIkTDe/iNxD5KBw/vd+XJvrf+dVo25Iej1NnlpC0EBRgcu6ZD65b8zRbqo06kyGx8E2p7Xcz1G38A62qx62Oa1sd1rZ7ipku/e4j/2u4gpj8zyuSs+1b98+QkJCGDt2LL169eKpp54qd7x///7ExcVx8cUXk5ycTE5ODlFRUf7rz8TERI4fPx5w7meeecZ/Q9i/f39/+xNPPEFaWhorV64kOjqam2++udy4zz//nIiICNLS0hg9WuRLc7lcrFmzhhEjRjB37lxWr17Nxo0b+eSTT9i0aRPTpk0jLS2NdevWERsby/Tp09m1axcrVqxgw4YNpKWlsWXLFjZsEJtcf/75J7Nnz2bXrl1kZGSwdu3amv57LjiUggw8R7eV+1GyjwCguuwVjnm8OeUAlFP7S8cc3YZakFHt+fLz8+nRoweJiYk88MADNQpPueGGG+jVqxevvfaav62goIBwr9d7Vetw0aJF/nWYnJxMfn4+QMA1U5ZXXnmFhIQE1q9fz5QpUwA4duwYq1atYubMmUydOpWvvvqKbdu2sXfvXr788kvGjh1LWloamzZtolWrVsycOZPs7GxeeOEFfv75Z9LS0jAajXz22WcA5OTkMHr0aLZv306zZs344osvqn0tGouz76+uoeHFbhfKhtFk8OcEMZtlf3WYYIs3FEYBr0bi9wQBkKNEuIjBVT6ZnhSlB1T0hYFLWEaHyxBqw+fUESNV7gkCEBwq3Ng8Be2owmnET7tgPZutLpAPABBZy8owZeltiuAP2x5MiNAds7FuczXVRRCKmULs7LGuJd6VD4AceXbydPRSL6bFvp8AUDtdWWkJ4vrG9fN7oHpQgoI41TcURV2HUy1AT+VC19lEVRQynpwMgD6+FaarJlFo/4p86yKiQm9Eks5etZyGRI4fjefE56jFe3Hvn4ec+iFSgHw8FxKSJKFeOg/+OwqcVvh6Gup1XyHJhuoHa1RA0smYpryO7dkxqOk7cb41FWnWV+jb9Wls0zQASZZp8uQnZM69ieLVX1LwyQugKkT9/Sn/zaKGRk35sCidF6yHyrVdHRTPguhunHQ7uCzj9wpjTjS/GIB/5O5ik7N8Nan5UV0ZHxx4o8rlcvHLL7+QlpZGXFwcl112Gb179+aSSy4BYP369RQWFjJhwgR27NhBkyYVc79VtsYfeughZsyYAYicIN26lW5Uud1uJk6cyLx582qUK+Saa64BYOPGjYwYMYIo7zXuhAkTWLt2LSkpIox26tSpTJ06ld69ezN//nw2bNjgP1ZUVMSBAwdo2rQpHTt2pFOnTgD07NmTw4cP+71h/mq41yzC9fXz5drkPuMx3/Yqat5J7P8eWWFM8JsiFN7x/j0ohzb523Wj/oHhygeqPF9ERARbt24lIyODq6++mgkTJgRcVz4+/vhjEhISyM3N5bLLLqNr164MGTKkwrqrbB1OmjSJefPm+R+fLrqUXTPVMWHCBCRJYs+ePXTs2NG/dm+44QZ++eUXrr76agDmzJlDamoqV155JcuXL2fbtm306yeqV9psNpo1awZASEgIw4eLMPmUlBQOHz5crQ2NhSaCaDQYTm+JXLPZ7C+RKzxBhAgSZPYmRS1TdKKsJ4guTrzJ5dMSBZXEyYAbjy1wPJvRICFHe8MRVIiuRgTRhwrlNSe7CTSr/nm1tshIKJj0IvFopK5L9YMqYZg5mhKbb4fZgEFfN68SgGRdc35R9qHk/OKdLhrJXHWi17rSLTcOc54Qp461b0vLs3KW8qjOElyr3gPAePF0MCwFnBz2fEk73aQGsKAihd9+jPuICIuKnfMOhqgOFJ5YhqqWUFD0FRGhDRcmdDaRJAlD57k4N90M9nQ8xz5G33JyY5t11pFM4aij5sPSm6HgCPz6Igyo+uJIo3IkowXLvZ9T8sRQyM/A8dK16OZ8jy6+fWObpoEQQuIe/y/Zz99F4fJ3KVj8Ep7CPGIfeF0TQjRqxU0hiYy0lA9XjdCJC7ymehP/16QPqCpujwe9LEOZ9fViVBdK1PLXd81lS6XnSkxMpHfv3jRvLq6fRo8eTVpaml8EAQgNDWX48OGsXLmSWbNmkZubi6qqSJJEeno6TZtW7wl8OrNnz2bAgAH+sJrq8IVQnI7PDsCft8G3o6+qKrfffrs/DMbH4cOH/XlPQIRo/BVzPPjQD56E3OPScm1SkDevYGRTzP/8rtKxpskvozp99wwqnuCah7M0adKEpKQk1qxZ4xe5ApGQkACIUK3x48ezceNGhgwZQlhYmN8bpK7r8PQ1Ux01WYdff/0169ev58cff/QfGzNmDO+++26FcefTOtTCYTQaDLNZ7BTHNo1B763uEhZmxubwenB4PW1Lyjh6lPUEkaJEThDdafFlDu+mv5xX+RvNHCvcLg0eA4YqcmIoeMAiXN+ysmv24dMp2ECkKRNZJ84fJrWt0bhA9DZFkMp+8UDfEkmq+1t0qCwSoLbN3Q2ALqpfneeqDvMukfjJGiSzIXr3WTtPWVxrPoSSPJANGIfcSnNJXHgcVD5BVQN7BZ1NlKIC8t6cA0DQ4CuxJPVHL8cQYhEXXnnWj1HVC6esrC6oJXJzUaLYfeQdFFt6I1vUMEgJKdBrqniwbRHq4Z8b1Z7zHSk4EsuD34A5FFx2bM+OQck/1dhmaXiRdDpi7ptPyCgRp170zQdkPTUFVWn4z1iN85cmsokkY1i5nxZ6IWSYJZkkYxjdjWF0N4TS3XvcRztDcIWxkVV44PXu3ZuMjAzy8vJQFIU1a9bQuXNnrFYrmZneHGIOB9999x2dOnVCkiT69evnT4a6aNEirrjiilo9v6VLl7Jp0yaefPLJ2r409OnThx9//JG8vDwcDgdffvklAwcOZOPGjSxcuLBctZHhw4fz6aefkpcnKuKlp6f7k3BqlKILb4LcIqncjy5GbM9JBnOFY2WrCuri25WOaZGEFF715mFGRgZWqwjfslqtrFmzho4dKy9A4Ha7yc7OBkQOkW+//ZauXYXX95gxY/jwww+Buq3DQGumpnTs2JG9e/dy5MgRFEVh8eLFDBo0iMOHD3P//fezePFif26dfv36sWrVKo4dE5u2OTk5pKeff9eAmgii0WD4PEGMxtIvr+BgA8V2oX74hP/iSkQQvbdErsFaGisKUGIS443ZlV+UmbwiSEhReJU2FpILkpgvM6sJNQmBbhesJz5IxBpKqgkL8dUPqoS2+iB6IObKlDvXeR6AXnILgjwuEu3i9ZJjh5/RfJWhqirsExcPaZ3C2U8abiqP162XcyoeXCtfBkBOvRIpJIp2+r8B4CSfLKWia+3ZJvv1h/HkZiAFhxFz78v+9uiIaYCMRzlJYUnluw/nI/rmk0AfASi4/pz718kZ0OcuSPTmB/n+ftSik41rz3mOLioRywPLQDZCSQH2V65HtVmrH6jRIEg6HbEPvUnIZeIztujbj8l8fBLqObzDp/HXRa/X89RTTzF48GCSkpJo3749Y8aMoaCggNGjR5OUlERKSgoDBw7032Q+++yzPPbYY7Rt25bY2Ngae3P4eOmllzh8+DApKSkkJyfzxhtv1HhsQkICjz32GIMHDyYlJYXrrrvOnysiKyuLAQMGkJyczKOPPkq3bt148MEHGTp0KN27d+faa689pxNP/hVIT09n8ODB9OjRg4EDBzJjxgySkoSoMmXKFC666CK2bdtGYmIiX375JQ6Hg0svvdS/DocMGcKoUSIR9ezZs1myZAnt2rXj0KFD/rwdNSXQmqkpFouFt956iyuvvNL/vhk3bhwffPABOTk5jBo1iuTkZKZMmUJcXByvv/4648aNIykpiZEjR/oFxvMJSf3LXLWe31itVsLDwykoKPBntz5XUBSFzMxM4uLi0Okq19WmjL2LTeu2cOWNl3O0qCuHDhUwfXoKBcZEPv+pmNZN9bz+UCw7TsFdy8SYH6eCziuOXLp0O4ciYmnx6zp+eHC8f952R36iRKeQ+GY+vz05PqCb7uStKzncYQdx6S35rH3lIQmH2MEi5qKqEmsWLubzG2WiAnuK+VFVlbsOzGdki4+Q3F24Iui9qgdUOZebPemD0KPwpeku7o/7W53nAnj6+Gz+cWANChKWAT8gybUrt1sT1FNb4EuxS/jKjW3JDzNwHQ/SiepjEeuK64/lON8Wu/GWf/2KLrYVAL84byOPHcQxkFa591e7JusL58GdpE8WdeCjZvyHiGvvKnc8I+cJCku+QdbF0CphWb1X6GlM3DkbcO8UNev1HR9B3+SyRraoYVBLsuHjy8FVDJFt4Jr/VZkfpKafk39l3HvW4nj5evC4kNr1wzJzMZKh/j+zNOq2HlVVJXveXRQufwcQHm9N5v4XSa9FVmuUYrfbOXToEK1bt8Zsrvn7V1VV3G43er1eC7fSOCfQ1uS5T6DPm5reM2tXYhoNhq86jNFoxGoV7h4mk55im/DgMJvEB0yJ14kgyFAqgADYzcJ10u51IwPxAWWTxHgp14PNFjjcwBGbC4CnpOqLtRxOAOCyhaKqMsdrsBkpSRIdwkUISL49ofoBVeB0HUCPeD7fuGoeh1gZFxeKJ3AsKOqsCCAA7PBWPglvSXCY8F7ZyP+dnXMh/ueupaI0q67jQL8AAtBePxmATNbj0DWMKq2qKhlPijJkcmwzwq/+e4U+kWHCLo+STWHxtw1iV0Ohj74IKVIks3Tvew7V9dfYwZeCYuAyr8dP3kFY/2zjGnQBoO84ENNtIlO+uv9X7K/ciOq5cELIznckSSJm1nzCJtwJQMmapWQ+eTOq++x6/mloaGhoaNQ3mgii0WD4E6MGmXG5xI2+ySRT4q0O4xNBfOEwQacVm7AaxU28/VSWvy1fcaN6hRK5QCEvr3zSVB8Oi3AXdJysOilqJiK+zWMTAsTxgqp6l5IQfFiMt7Wu2YBKsHtL454gkr2KAatyZjcAHaxC1PkuOp4S1VlN79qjKm44uk486DyB3ggvgCPsxEng/8WZohzYiJp5EADjVQ+XO9ZE6o+JWEDhpOnLs3L+0yn6fjGuA6I8cuw/3wm4K2o0tMBiHgBATsGCRslZcjYxdpwDkhEUO64DCxrbnAZDSuwHPYQAxo7FqId+blR7LgT0KVdguOZxAJS963AsnPbXCbM6D5AkiZi75xF522MAFK/6gpP3Xo7qdDSyZRoaGhoaGjVHE0E0GgyXVwSxWEy43SKW2GTS48uvFh4slqPPE4TTrnud3iShrtw8f1u2UnpjL1s95OcHvvG2GUROEOepkCovqIsQc8uFHQA4ml/NkwIU1YVBFp4mf1pbVT+gCoptQlA4TBwAmx01VGEC2WVLx2QX3hB/hDVhi+foGdkWkPTfwJEHkg46XkEn+iJjwIObfWyu//MBru9fB0Bq2xe5da9yxyRJpqXuSgCyzD/gUc+OEONDKSki+8WZAJj7XEJQryGV9o2NuBsAj5JDUckPZ9WuhkYyRiO3nQmAkvkNnvxNVQ+4kOg3E2K8+Xt+fBC18ESjmnMhYLz4DvSXijKUns1f4/xkdiNbpHE6kTc/ROS0fwNgT/uFE/eMRHHYGtkqDQ0NDQ2NmqGJIBoNhk8EMQdbcLtLPUF8kkRkqMiTYPXetxrLpE1QVBWXNx5PtVpx2MWuU7bHK4J4VORilby8ihdhHlXBrhP91AILBcWV78LnIaoSmJyiMsyujOqfV5F6FMmbTHVzbiJOpe67lnbnLgCydOKm6jdnXlXdq8STIwSVEp2BI5ZQfvUcrPNclbJzsfgd3xMpKAYTFjoi6tdv4ad6P52ScQBPmqhEY7w0cPmvNvK1gA5VcpKunN3Qk7xFz6AWW0FvIO7B16vsazS0wmLuC1yY3iD6pmORwnsC4PrzcVTPX2NnWNLJcPnrYIkS+UG+uw/VU/9eV381jFf9E/mi6wBwr34f13evNbJFGqcTecO9RE57CgDHzt85cedwFJuWpFFDQ0ND49xHE0E0GgyTWdSOtlhMKF6hwGiUKfKKEgZvTsECr45hKRMOU+xRASGCSEVFFOSKvANZXk8QnUtFUiE3t6IIkk+JP2RGKggmKy/wzaeKShaixFOCQVR4OVFY/fMqUPYB4PCYKHJHcLCkbiEsHqUQRREeJcHmZADW2XPrNBeAkiXqeeeHdwRJIk09Vue5AqG67XB0rXjQfoy/vRuDADjAVmzU4AWsBc7lz4k/wmKRu18SsI9RCieewQDsV987a670zqN7KfhU5ISIuu1R9LHNqh0TEzETALcng2LbqrNiV2MhSRKG9g8AOnDl4DpUtSh0ISEFxcDIFwAdZG6Hnx9rbJPOeyRJwjTpRXTdLwbA+b8ncK37pJGt0jidyBv+QfQ9zwPg3JvG8WmDUYrq7sGooaGhoaHREGgiiEaD4RM+DCYjbnepCJJjFaExelkoFQVeT5CgMoUW8l1lhIuiYvLzxEVWhlvsNpucYmx+fsXd5yy19EZcKrCQnR+4rF8JVjwIAaOlSdQFzy2h2jK5heoBALJtzQHYW1S3JHEObz4Q0NHW0gOALU4rjjp4DKiKC7VoDwDG2JEAHFNzOaXU48Xp4Z9BcQE6aHepv7k9vZAxACrbWVdvp1OtWXg2LQfAMPofSFVUNOgg3wqAjQxy1bR6s8Fvi6qS+a9bweNGn9CG8GvvrtE4k6ENIRZxU5eT/xaqemGVmNQFtUBuLioaKSc+Ryna18gWNRxSQiqkThMP9i5H3bOscQ26AJB0Osx/fw+5myjv7Vz0D1zezwCNc4fw8dOJeUCInq5DuzgxcxSe/OxqRmlonB327NlDcnKy/8disfDVV18B8NFHH9GtWze6du3Kc8895x/zt7/9jR49etC9e3f+/ve/oygVr7vmzp3LggWlOa+Kiopo1arV2X469c77779f63Km77//PrNmzTpLFl0YlJSU0LJly3Kv0++//07Xrl1p164dTzzxhL/9wIEDpKam0q5dO6ZNK817lZ2dzbBhw2jfvj1XX301dnvFkO5A/4uYmJiz9KzOHl999RV79+6t1Ziff/6ZCRMm1JsNmgii0WAUWYUYIZcpI2kyyTi8nuMhQULI8BaOIdRUOtbqLlUiynqCpHuE50eQVwQJlBjVJ4LoSkxIbj2ZuYE9NXK9oTAA7YJETg6PCjklVT+vQg6Jc9u7ALDJWjcRpMQu8ijo5ab0NseK8wPbnLWvtqFYt4MqnmfTqIuxIF7zeg2J2eHdlW2ajGQqLUGlx0B7RK6OP+qxSozzu9dA8YAxCMPAG6rsGya1J8jVHoCDns/qzQYfxT9/iXO3+H9Fz3wRyWCsZkQpUeGi7rvLc/iCqxQDoG95K5jiABXnrodR1b9QdY/Uv0NTb2noVY+g5h5oXHsuACTZgOmOhUgJnQBwvn0H7p0/N65RGhUIGzOZuCc+Br0B594tpE/tjzv7ZGObpfEXpGPHjqSlpZGWlsbatWsJDg7mkksuITs7m0ceeYRffvmF7du3s3r1avbsEZtFr732Glu3bmX79u3k5uaydOnSRn4WZ4bHU/kGS11EEI3q+fe//03fvn3Ltd1555188skn7N69m+XLl7Njxw4AHnjgAebOncv+/fvJyMjgm2++AeDpp59m/Pjx7Nu3j5YtW7Jw4cIGfx71SVXrsC4iSH2jiSAaDUZJsRAoJLm0eobJpMfpzQ8SZBLL0VcVNzaodGy+tw8uF5LT6fcEOe7NOxDqFGOPHKno6ZChCBHB6BKqSnZBYM+KHMQFm4kgmoeZ/HakV+M8UaCK8rgWtQ0A2wvr6gkids2DzL2J0BloKgt7f7bn1HouT+568Ye5GbIxnGSd8FL50fNnnWw7HdVhhZNbxINuFQWJvowCIIt0CsiqcLzW53OW4F79PgD64bchGaov95tgHw/ASXUVJWr9XYwr9hKy54mkjaaegwnuN7JW442G1mUqxcy/4EQCSWfA0FkkTMR+As+xv04IgyRJMOplMEeC6oHlU1Bd1aioGtUiGYOwzPoKopqBquBY8DfcB/5obLM0TiNk6FXEP7UEZD2ejGOk39oH16kjjW2Wxl+YZcuWMWLECIKDgzl48CBdunQhMjISnU7HkCFD+PJLUUUuLExs5Ljdbmw2m/gsrwWPPvqo3/MkLi6Oxx9/vEKfOXPm0LlzZ0aPHs2oUaP4+uuvAVixYgX9+vUjOTmZ22+/3e+FEhMTw6xZs+jevTsjRoyguFjk29m3bx+XXHIJKSkpjBw5kpMnxfXN0KFDefjhhxk8eDAfffQRb7zxBn369KF79+7ccsstKIrCl19+yR9//MGECRP8N+y///47gwYNolevXowfP56ioiIAli5dSocOHRgyZAhr166t7Uv/l2Lfvn3s3r2b0aNH+9tOnDiB2+0mKSkJvV7PDTfcwPLly1FVlQ0bNnD55ZcDMGnSJJYvFx6Oy5cv56abbqrQXlPeeOMN/zpMTEzklltuqdDn9ddfp0OHDowYMYKJEyf6vZsqWwetWrVi7ty59OzZk969e/vXW0ZGBuPGjSM1NZWBAweye7e4F5o8eTL33XcfQ4cO5T//+Q9Lly6lb9++JCcnc+WVV1JUVMRvv/3GsmXLuPvuu0lOTiYnJ6fSdb1hwwa6du3KgAED+N///ler16M6NBFEo8Fwu8XNnqQrFUGMRh3efKlYvCVyHV7hMNxSOtbnCSK5ROe87HzR7i0hG+sRO/E5Adw2jqoir4bZ2+d4VuCbzkxE9ZQwotHroGmoaD9WhQjiVkuwe2/yWxjbAZDlrH2Ig6qqOFwiKarFJLwoLjJFAPCTrfZuxaq3OoccJ27QR3gTrf6pnsRdHyEYB38AFNCbodXQCodb0gUTQsXaxi9nfDr3hs/AaQOdHuMl02o0JtLVBxPRgMo+93tnbIOP3HeeQCnMA51M3Oy36jRHbMRMQMKj5GItXlFvtp0ryGFd0CUIl0X3kXdRSv46N0KSKQzGvCUqJpVkwU9ztBKv9YAUHIHloZUQGgOKG8cLV+M5trP6gRoNSlC/S4mftxxkPUp+Num39sV1bH9jm6XRSLhVhUy1sEY/WWV+atLfXYNQ4c8++4zrrhMJltu1a8f27ds5fvw4DoeDFStWcPz4cX/fCRMm0KRJE0JCQhg7dmzA+Z555hn/TWb//v397U888QRpaWmsXLmS6Ohobr755nLjfv/9d7777ju2bt3K+++/z2+//QaI8IcXXniBn3/+mbS0NIxGI599JrxXc3JyGD16NNu3b6dZs2Z88cUXAEyfPp2FCxeyadMmpk6dWk5wcblcrFmzhkmTJnHttdfy+++/s337dgwGA8uXL+eqq64iNTWVzz//nN9++w2n08msWbNYtmwZmzdvpl+/fixYsACbzcZdd93Fjz/+yA8//OC/wT3XUd1u3Jnp9fuTdRzVXfVm1axZs3j66afLtZ04cYJmzUpzxSUmJnL8+HFycnKIioryC22+doCCggLCw8MrtJ/OokWLyoV85efnAzBt2jTS0tJYt24dsbGxTJ9evoDA8ePHef7559m4cSPLli1jyxaxmVnZOvDRokULtmzZwqhRo/zeKTNnzuSRRx7hjz/+4MUXX2TmzJn+/seOHWPVqlXMnj2bwYMH89tvv5GWlkbfvn1555136Nu3L2PHjuWVV14hLS2N6OjoStf1lClT+OCDD1i3bl29ezDpq++ioVE/eLxlccuKICaTHrdH3CCYjeIDIcebXN5SNieIV1iQ3UIEyTophAeb94a+hWxmB2C1VqzKcELNByDcFYodOHIy8IeZFeFxEU8rAFpGisSoVXmCFKql4SUdzR0AGxlOlQKXQrih5hqjy52O4s3XYTZ1A2CkOZYvSjL401WER1WRa7gzoTpzUIuEi5kc1Q+AVH0rcIMbhR3KCZLl5jW2LSD7hOsebS9D0lf0ypDQ0YuL2cAytrOGgVyFRO12VnyoigfX928AoB98E1JIdI3GSci0kq5hj/oGR9UVdFXvQS8F18kGH67jB7H+T1SpCL/+HxjiW9ZpHqOhBUHmQZTY15CTv4Cw4NFI0oX1cWxoPR1n3m+otmM4d/0TU8oHSJJc/cALACm2M+rgx2D1Y3DwO9jyLiRX3JHRqB268Dgss1die/JisBVgf/k6LPcvRdekbWObplGGoJShNJ3/PSfvuQy1qID0KRfR7PWfMbbp2timaTQwuRRzrf2N2g2q4T7NZ+ZpxBFa6XGr1cq6detYvFhUsYuKiuLll19m3LhxGI1GevTogV5f+r37+eef43Q6ufnmm/nxxx+55JKKydcfeughZswQnqBFRUV069bNf8ztdjNx4kTmzZtXIVfI+vXrueqqqzAajcTFxTFs2DBA7HJv27aNfv3EtZrNZvPfOIeEhDB8uMiHlJKSwuHDhyksLGTdunVceeWV4qXyeMqd65prrvH/vXXrVubMmYPVaiUvL4/WrVv7x/nYs2cP27Zt89vjdDoZOnQoe/bsoVOnTjRvLq4Vr732Wo4ePVrpa32u4Mk9xdEJ7et93uZL9qJrEvi62ecx06FDB9avX+9vD7T5IUlSpe1lf5/efjqTJk1i3rx5/sen5wSZOnUqU6dOpXfv3uXaN27cyIgRI/xCy5gxoqhBZevAh2/dpKSksGyZyHf2008/8eefgb3LJ0yY4Lf96NGjTJgwgczMTIqLiwO+rypb1/n5+bhcLlJTUwG48cYbWbRoUcBz1oUL66pb45zGHxtW5kbIaJTxiflmU/nEqCFl0ixkexOjGryeIJmnhHfESW9i1ASzhR1AcXFFEcSXEyRRiiIDyC8MvHuQj1AY42ghfoeI9p1VlMn1VYYxEEr74DB02FCAvcVuekfUPE+E3SHiBCXJjF5OAOAicyQATlR2uArpYQyrdHxZPLm/ij90RqRQEUcfIQWRQAQnyGedZ98ZiSBqcSYcF7sYtB9dab9khrKBZWSRzkkOkkDdblTcm79BzToMSBguvqNWY1vpJrDXsxAVF4c8X9Bef1OdbPCRM/8BcLuQm7YicvI/z2iu2MiZHDn5C4pagLX4a8JDxp3RfOcakmzC0GE2zq3ToeQQ7mMfYWgxqbHNajCkLuNRs3fBzk/htxchuiOY2jW2Wec9uujmWGavwPbclVCYjW3eVVhmr0AXldjYpmmUwdKtHwmv/8zJGSNQbUWcuHsk8f/5CnOX3tUP1tCoB5YuXcqll16K2Vy6UTNu3DjGjRsHwL/+9S8iIyPLjTEajYwbN46vvvoq4M1aVcyePZsBAwb4wxzKcvqNr++xqqqMGTOGd999t8IYk6k0MZ4sy3g8HlRVJT4+nrS0tIA2BAWVxpHfdtttfP3113Tp0oVnnnkmYJJNVVXp1asXP/30U7n2LVu21Dok6K/Kr7/+yuLFi1myZAlFRUW4XC7CwsKYMmVKOU+O9PR0mjZtSkxMDLm5uaiqiiRJ/nYQYVk+b5Cy7bXh1VdfBajgBQJVr8NA68CHby361qGPTZs2IcsVN7fKrsO7776bhx9+mEsvvZTFixfzf/9XMVdgZes6Ly/vrK5DTQTRaBAURUH1VodRy4ggsl6Hy/t+8nmC2L2OGsFlNIQshxAuzB4XTiA7Q3htZCpCBEn0vuFcLgWn04PRWHqOPFWEyLQyRLIJKLareDwqslz+jZWFKCEbhfjQaeX9bjxehSdIrrpV2EpLTDqJaIOOLJfCjiJnrUSQEocQLoz6tv43fKxsop0+iP3uEtbZcmsugmT+AIAU2q2cd8HFcmcWeTawWTlDNd9X9UIfBM36VtotjhZEEEc+mfzOSsYxo9anUlUV11LhYqjrOABdbKtajTdIwSRKozimLme/8iHt1Bvq7I1QvO5rStYLD5iYe55HZ6o+L0mVtumbERp0JYUlX5FrXUho0GXodGc257mGLrwHurhRKJkr8Rx+Gzl2GDrLGXohnU8MeAiOb4T8g/DtPegufheIa2yrznt0TdpivudT7M+NBWsmtqcuw/LIT+jCtdf2XMLcIZlmb6/n5L2j8WSdEELIM18QlDqssU3TaCCiCOYzc81CWFFV3G638M6owY1PFFV7dn722Wfcfvvt5doyMzOJi4vj1KlTfPrpp6xevRq32016ejqtWrXC4/HwzTffVNhBr46lS5eyadMmvv/++4DH+/fvzz333MOsWbPIz89n9erV3HrrrfTr14977rmHY8eO0bx5c3JycrDZbCQmBhZ1w8LCiI2NZcWKFYwePRqXy8X+/fvp3Llzhb7FxcXEx8djt9v5/PPP/bv+oaGhFBaKzcFOnTpx5MgR0tLSSE5Opri4mJMnT9KpUyd2795Neno68fHxLFmypELSz3MROSqeFp/XX1U6VVVxezzIUfGV9nn66af9oTDvv/8+O3bs4NFHHxX2yDLbtm2jS5cufPLJJ7zzzjtIkkS/fv345ptvGDNmDIsWLeLWW0VFwzFjxvDhhx8yY8YMFi1axBVXXFErezdu3MjChQsrzeHSu3dvHnjgAaxWK3q9nhUrVjBjxoxK10G7dpVv3AwZMoQ333yT6dOnoygKO3fupHv37hX6Wa1WEhMTURSFjz/+mKioKKD8OqxqXRsMBjZv3kyvXr345JP6zTGn5QTRaBBczjLJQlVvAlQJ3J7SLzqTVwTxpdQoK4LkeD1BQrzhL3nZ+ZQoHtwIYaVlaOmXYW6urfRUqkoxwjukVVCpiJBzWnJUO8U4ESp5FOLDzieCFNjBXUnoaZF6GIBISVSGaRcsRIc/8muXHNXu2AaAxdKnXHuSQdj8ja1mcXCq6kG1CmFGF1d+F+MivfDEOKBmkVmmbHCt2bVE/G47EklXtaCQgshJsosN/vLDtcGz/zfUTFF9x3jVw7UeD9BBL75cXBRwUl1TpzkUh52sZ/8OgKlbP4L7V+4BUxuiw28DjHg8WeQVflwvc55rGNrfC/pwQMG586ELrixwVUiyAcYuBH0QksdB5NpZ4K64G6dRe+TmXTHd8yno9MIj5OnLUItyG9ssjdMwtuxIwoKfkJs0B6edU7PGULTm/K68oVFz9JKOOCm0Rj+xZX5q0l8vVX4LU1BQwO+//86ll15arv3OO++kS5cuXHLJJcybN4+oqCg8Hg/XX3893bt3p0ePHoSEhDBtWg2FGy8vvfQShw8fJiUlheTkZN54o3wIUN++fRk+fDhJSUncdttt9O7dm7CwMOLi4nj99dcZN24cSUlJjBw5stq8Bx999BEvvPACPXr0IDk52Z9f5HQeeeQRUlNTGT16NMnJyf72yZMnM3nyZPr27YvRaGTx4sVMnz6dpKQkLrroIvbv34/FYuGVV15hxIgRDB8+nJ49e9bq9WgsJL0efVxi/f7ENkPS181nYMGCBVx//fV07NiR0aNH+0WCZ599lscee4y2bdsSGxvr9x6aPXs2S5YsoV27dhw6dIgpU6bU6nyvvfYaWVlZDBgwgOTkZL8Y4yMxMZGZM2eSmprK2LFj6dmzJ2FhYZWug6qYP38+33//PUlJSXTr1s1f4eZ0HnnkEa644gqGDRtWLnRr4sSJPPnkk/7EqJWt67fffpubbrqJ/v3706JFi1q9HtUhqVrGtvMCq9VKeHg4BQUF/izW5wqKovjVdZ0u8JdSobWIwa0vA+Dxt1/mxfm7MJtlPvzkOv72mPjAf//RWOKi9Ix4W4yZPxa6ecXXadtz+SnXSWpOOn9OnUnnHh14+rsFXHRSxN/9FtOfSaNF1uDXXhtF584iPi5fLWGcXbiGvWu4hen3CXFi3t3RdGtbqrKc4ABv8yAAD/EhJizklsD4/4rjH1wLLSLKPydVVfnWdRlO8kmRn6SZPJL5hwuZf6SYZmYdq/rWbFdSUR0cTB8CqCTEzifIXCqEfFl8kjtzd2JE4kDi8GrzgiiFf+LcIj40TX2/QjLFljmPyuX2l7HhYqb+YsYZav+lpuYfhk/EbgJXf4LUpKLqW5ZiCpjHbQBcxwN0ok+V/U/H9p+xKAd+R0roSNBjq2s87vQ1+ZvzATJYTaTUjYH6hbV2r8t56zEK/vsfkHQ0/3g7hmZtajW+KjJzn8Va/AVgok2zFeh0IfU297mCJ38Lrm3CE0huNR1Dixsb2aKGRT3+B+qyW5BQUVsNR7rsZc3VuJ5w71qN45XrQVWQYlpi+ed3SEHhjW3WOU9NvrfrE3f2SY7fMRhPVjoAsbPfInTUmYUnapyb2O12Dh06ROvWrcuFolSHWsYT5EL8fCwuLiY4OJi8vDz69OnDhg0bKuRy0Di3uBDXpG8d2mw2Bg8ezLvvvhvQg+N8IdDnTU3vmTVPEI0GweUo9YxQ/J4gEnZnqQZnMekoKeNAUdYTpNi7eRzrDXOx5heS5SnN/xFvNhPs9cIo6wmSVcbjIV4OIzZCnDszr/xudC6nADBgxoQoSxNpAV9u06P5FZ+Tg1yciAOhknAZSwoVRp+yK7hrqC86nHvB69FiMnYpd6y/WbiNOVHZ6aree8OTs078YYwtJ4AA6CTJXyr3e8+uGtlWgV2fi9/mCIjrVmVXgGDCSaQDABuoXakv5dQ+lAO/A2AYN7tWY0+ng15kas9Td5CjpNVqrDvjKAUfPw9A2IQ761UAAYgOnwYYAAc5Be/U69znCnJET3TxQjzzHFmIUnK4cQ1qYKRmqdB3pvj78E+w/aPGNegCQt9lCMa/vwdIqNlHsL18Paq9qLHN0jgNfUxTEt/7DUML8X2Q9fTt5H/2SiNbpaHRcNx6660kJyczYMAAHn74YU0A0WgU5syZQ3JyMj179uSqq646rwWQM0UTQTQaBKezVLBQVKGm6nTlRRCzUaKkTF7TsiLICW/d3OggUTIm+1QO2YrobJZ0GCQdJpMQQbKzS8vk+sI+DMgESUZiI4WIkplbXgTJ8pbHDSXK3yZJ0My7oXg0r+Jzsqo+VzGJEEm4aHUKETZ4gMMlNXP7dzhFUlSjvjXyaV4ATWQTMTrxnGtSKlfJ/wMAXeyIgMcv0QmRZbd6Cqdau/AUVVXhkDdpUsdxNVbFL0LENB5jD8VUkWDlNFzfvyn+iG6OvvvIWtl6OpG6roQhhKrdntdrNTZr3l2geJBCwomaOveM7AiELIcTEXIDAAVFn+H2XJgu/Ya29yJZmoPqxLnrn6i1XH/nPT0mY2vhdc1e9x/UY+ur7q9RYww9LsU49U2QdKiHN2ObfyOqs2K5dI3GRQ6Lotlb6zB2SAYgd8GD5P/3ucY1SkOjgfj0009JS0tj165d3HKLVi1Mo3F48cUXSUtLY/fu3Tz8cN3CzC8UNBFEo0FwlvUEUcSy0+t12B2lIojRAGWLuwSVEUHyvTlB4oKFq5PD4eSUQ3h8NJeF50Z4uDh26lTpLmCGYgUgDHEs2CJu3Penl8/ZkYsoARNHs3Lt7b1C/bEA9+4FiihDayYGnTcBaZxRR5TXfWR3cc3ygpTYvElRjZ0CHh9oEsLM99WIIKrLimoVgoocdVHAPr31rQHwoLBVOVYj+/xk7QSrN6lq56trPKwjqVgIRUVhO7/UaIxqzcK94TMAjKP/gVQP7todZZEgLZetFKlHajSmZOOP2H77DoCY+xagMwdVM6JuRIVPRpLMgJuc/FfPyjkaG0k2Yeg4RzwoOYz70MLGNaihkSSsyfegxnYBFFh5F6q1lu9BjUoxpI7FdKt476j7f8M27ypUl5Z/5VxDFxRCwqursAwQMfC5bz1K1vN3BywbqaGhoaGhcbbQRBCNBsFVxhPE7REXOwaDjN0pxA2TUYTHlA2HsZTJQ2TzjmkSXnoTml4kvDxiZaGWREf7RJBif59jqthVj5KEh0V8lPAEOZlTfhfaiqg2E0/5UIcWXk+QPVkVn5OvMkyoVFr6VZIkOgT/P3tnHR63lfXh90oaNHMc5jScpriFNKW0TSntlpmZtsxNGbe0Zab9yty03TJTGmYGM7MHJX1/XI0h5oBnYut9Hj+eEVwdjWVb96dzfkceY15V50QQf3AJAG7nxFbXH+KRZS0rw3WEzDYcWgG94m/ABKGhJE1odZsE4WawSAPg+/DyTsXXwBIpSpAyDJHS+ZIQFQfj2RuA2XzVqX2CXzwOehC8KWi7/bNrcbZBH2VvXMhzXxZ+poOtwQwFKX3oUgA8O+9P/H5bJ47WUBQvaYmy/W9N/ecEQz1zcqwkjkPpKwU0Pfd19OrWe8z3WFQnHPQ4OOJAD8BHZ2KG7IyFrYW261E4Tn4AAHPDAvyPHIcZbtk23Sa6KC43fe58i/iDZAZczcfPU3zbKZjhXpYdZmNjY2MTNWwRxKZbaJoJEgxJQcPpbMwE8brkpRjJBNEUUK2rM2iYDX1F+qUkNIyzMhApdZHZHZmZUugoKWmcVOSZso4lS0hjnEHZUlkpq2xeqlKK7OUdaY8bYZDVISa3CjZ9UFVjlcOkiOb1dIPdVoeYqo5vvsN6CYZVsuNxtS5cRHxB6kydBcHqNscySmRrNhE/EqG03Z73YGUsAHPMjZ1++mYaOqz5n3wz4tBO7dOUHZEtEcvJp4C17R/LX0f4p9cA0KaeiXC4uny81hBCYZRyLgAF5vf4zPYd2Cv++yDhgnUgBGmX/3ubm2IlJRyHQxsAGD02GwTAMfRScEnH49DS6zH1QJQj6mbiMuHQZwEBdYXw+SWY7YibNl3DOeU0HMfeDoCx5i/8j52IqXetW5fNtkdoGhk3PE+8ZY5a98MHFFx9OEbAzt6xsbGxsdn22CKITbcQCDTxBLHu9xMTXQ2eIIo1v4yIIM4mnVerm/SnzUpwo1jqSIHVajKSCdK3rxRBamsbj1VhSkGkv0gGoE+a9NeoqTcbBIAQAeqR4kIqWc3ijoggIQMqGv1WMU0dH3ISnaI078++S7I8xjpfuEORwedfZL3ScDoGt7pNmupksFXy862/9ZIY0zQxKucAoKS37gcSYS9NGtMVmdWsMzv2GQEg708IWRk2o47s3D5N6MMQkpAZLb/xSbvbhn56FcIBUDWcB5zX5WO1x0D1MDTiAZO1+lttbhcuyaPy1fsBSDjiHJyDRm3VOFpDCI20pIsAqPN/jz+wZJsfMxoIxYlz3AOAgGApobW9zxxRZE+CKVZpUP5f8NcTUY2np+E84HwcM2Sts7HyV/zPnWsLITGIUBQyrn+WpJOuAsA/9wfyL94Xo34LWrjb2NjY2Nh0AlsEsekWIt1hNIeGbpW2JCW58AUsgWMTEcTdpBSmMtQoJCQ7VBKTZDZIuZUf0k+TZTCZmXEA+P2NKbU+5HEHKDKbIssqh9ENqKo1rHEKG7bfNBOkb2JDaM06xNSRh4nMJmlaDgMwxuoQ4zegKNj+E15fQHY/cWqDEUJtc7t/uKQa87/6VupyALN+HehSpFDT92r3mP2VFNKQgtH34RXtbtvAojfl99SRiPis9rdtg92RGSTL+IMQrT/9N/UwoS/kpFjd7VhEXPJmHastFOFglCpbCK83PiRotp5ZU/LAxaCHEN4E0i68e6vG0B5xnn3RNGmyW1RxT4+tk1fihqEOlK2TjYKP0CtmRzmi7keMPR5GHSXfzH0Oc/WX0Q2oh+E85DK0w64GwJj/JYEXL8bU7XKLWEMIQdoFd5Fy0X0ABFfOp+CKg9ErOynQ29hswooVK5g0aVLDl8fj4aOPPgLgv//9L+PGjWPs2LE8+GCjKe8pp5zCxIkTGT9+PBdeeCGG0fLebebMmTzxRKNgXVtby+DBgzsd15VXXsm4ceO4++7uu6ew6T7q6+sZNGgQV199dcOyv/76i7FjxzJ8+HDuuOOOhuVr1qxh5513Zvjw4VxwwQUN93qlpaXsu+++jBgxgqOPPhq/v2Vm3CuvvNLsGECXOg098sgjjB49mosvvrirp9jjsEUQm24h0h1GEaJJpoagtt5qDeuQUkO1NTd2Oxr3rbIyQQSQoAn69JeT8BpV7ttPkSJIWprMligrq8c0ZaZHkTXJzRBSOMlMaRQaiqwOMRERRMOBh+bdWTQFkuWwrGvSIabaXGPtE49nk+yRwR6ViIaztKb9p4+BkBQhPO6d293uEG8mIH1B6o2WXWf0MqvThJaI4unf7lgAe6hSuPlW79iTwQz7IecX+WbciR1u3xaT2BeBgk6YJfze6jb63M+gvhIQOA+7crOP1R6DlCPRSECnnjV6y1al9fN+wvenLP1J/9cjKN6EFttsK4QQZKbIdsCh0GrqfD9127G7G23QaYikHQEILZuJGWq71KvHMvU2GLCnfP3t9ZhFC6MbTw/DdfjVOI66CQB9zif4nzrdFkJilJQTLifjlpdB1Qgsn0vuuXsQLuqZ3kg225ZRo0Yxf/585s+fzy+//EJcXBwHHnggpaWl3HLLLfz8888sWrSIH3/8kRUr5D3YU089xYIFC1i0aBHl5eV8/PHHWz2uV199lQULFnDTTTc1W67rneskaBPb3H333ey2227Nll188cW8+eabLF++nE8//ZTFi2XzgmuvvZaZM2eyevVqioqKmDVrFgD33nsv//znP1m1ahWDBg3ihRe2voH8s88+y/fff8+TTzYvu+6N16Etgth0CxFPEKEqVFZKpSMc1qn1WyKIU4ogAev+NLvJvLPK6gwTr0oRJSFJChU+S8/I1KRnRFqa1xrXpLo6SDV+Qla2RqYlgricgpREedlHRJAS5I1WAimtxj4oWX5fU9a4rNKQpQoeslp4RahCMNAjg1vUjghimmGCISmmeN27tLkdwO6uZARgALODlS3HqpRP0pWMfdsdJ8KBqmyVm08lZWZt+xtv+BGMECgaDD+4U+O3hps4hjMJgDmtGKSapknoq6cAUHY6DCVtwGYfqz004WWgOAyAtcZbhM3GOiczHKb0kX8B4Bg2nvhpJ22TGNrD656M2zUJgJKK+3psK1khVJyjbgbhgHAlwWW39djMl7YQigYHPghxfcAIw6fnYtYWRTusHoXz4EvRpsvfaWPxt/ifPlN6HNnEHAkHnkCf+94HzYFelEPOmbsQXN9FA28bmyZ88skn7L///sTFxbF27VrGjBlDSkoKiqKwzz778OGHHwKQmCh948LhMD6fr8seYLfeemtD5klmZia33357s/XHHHMMVVVV7LTTTnz++edMnTqVG2+8kSlTpvDf//6X119/nfHjxzN+/PiGDJVnnnmmYcz+/fs3tNV9+eWX2XXXXZkwYQK33norAOvXr2fixImcfvrpjB49muOPP77X/T+NJqtWrWL58uVMnz69YVl+fj7hcJgJEyagaRonnXQSn376KaZp8vvvv3PooTI7+rTTTuPTTz8F4NNPP+XUU09tsbyztHXNRLjssstYu3Yt06ZN44UXXuCMM87gqquu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+ejbty+nnHIKs2bNonv37spJaVJ77bXXWkuH//LLL3Tp0gXQ70lpWtXV1bhcdd9WuN3u5BK5ykdxUlPmX79+/fjhhx8oLi5OtpkwYQJ+v58+ffps0fuUTdDEE7FKC1O7RO7jjz9u5syZY0aOHGnS09PNn3/+6XRoksL+9a9/mezsbPPJJ5+Y4uLi5KO6ujrZ5rbbbjPZ2dnm1VdfNd9//7056aST6l3qrGPHjmbSpElmxowZ5sADD6x3qbOddtrJTJs2zUybNs3suOOOWmpPNsqaq8MYo5yUpvXVV18Zj8djbrnlFvPrr7+a5557zqSlpZlnn3022UY5KU1l2LBhpkOHDsklcl999VWTl5dnLrvssmQb5aNsSRUVFWbmzJlm5syZBjB33XWXmTlzppk3b54xpunyr3aJ3IMOOsjMmDHDTJo0yXTs2FFL5DYzKoLIZnvggQdMly5djM/nM7vuumtyGVORhgLqfTzxxBPJNrZtm+uuu860a9fO+P1+s++++5rvv/++znlqamrMBRdcYNq0aWOCwaAZNGiQmT9/fp02y5cvN6eccorJzMw0mZmZ5pRTTjErV65sgruUVPf3IohyUpraW2+9ZXr16mX8fr/ZfvvtzaOPPlpnv3JSmkp5ebkZMWKE6dy5swkEAqZ79+7m6quvNuFwONlG+Shb0scff1zv347Dhg0zxjRt/s2bN88MHDjQBINB06ZNG3PBBReYUCi0JW9fNpFljDHO9EEREREREREREWk6mhNERERERERERFoFFUFEREREREREpFVQEUREREREREREWgUVQURERERERESkVVARRERERERERERaBRVBRERERERERKRVUBFERERERERERFoFFUFEREREREREpFVQEUREREREREREWgUVQURERERERESkVVARRERERERERERaBRVBRERERERERKRVUBFERERERERERFoFFUFEREREREREpFVQEUREREREREREWgUVQURERERERESkVVARRERERERERERaBRVBRERERERERKRV8DgdgGwc27ZZvHgxmZmZWJbldDgiIiIiIiIizYYxhoqKCoqKinC51tPfw7QyDzzwgOnatavx+/1m1113NZ9++ul623/yySdm1113NX6/33Tr1s089NBDa7V5+eWXzQ477GB8Pp/ZYYcdzKuvvlpn/6233mr69u1rMjIyTH5+vhk8eLD56aefNinuBQsWGEAPPfTQQw899NBDDz300EMPPfRYx2PBggXrfW/dqnqCvPjii4wcOZIHH3yQvfbai0ceeYTDDz+cOXPm0Llz57Xaz507lyOOOIJzzjmHZ599ls8//5zzzjuP/Px8jjvuOACmTZvGkCFDuOmmmzjmmGN47bXXOOGEE5gyZQp77LEHAJMnT+b8889nt912IxaLcfXVVzNgwADmzJlDenr6RsWemZkJwIIFC8jKymqkV6Rx2LbN0qVLyc/PX3/FTaQZUd5KKlLeSqpRzkoqUt5KKlLeQnl5OZ06dUq+d14Xyxhjmigmx+2xxx7suuuuPPTQQ8ltO+ywA0cffTRjx45dq/3ll1/Om2++yY8//pjcNnz4cL799lumTZsGwJAhQygvL+e9995LtjnssMPIzc3lhRdeqDeOpUuXUlBQwOTJk9l33303Kvby8nKys7MpKytrlkWQ0tJSCgoKWu0PnKQe5a2kIuWtpBrlrKQi5a2kIuXtxr9nbjU9QSKRCNOnT+eKK66os33AgAFMnTq13mOmTZvGgAED6mw79NBDefzxx4lGo3i9XqZNm8aoUaPWajNu3Lh1xlJWVgZAmzZt1tkmHA4TDoeTz8vLy4FEctu2vc7jnGDbNsaYZheXyPoobyUVKW8l1ShnJRUpbyUVKW/Z6HtvNUWQZcuWEY/HKSwsrLO9sLCQkpKSeo8pKSmpt30sFmPZsmW0b99+nW3WdU5jDKNHj2bvvfemV69e64x37Nix3HDDDWttX7p0KaFQaJ3HOcG2bcrKyjDGtNqqo6Qe5a2kIuWtpBrlrKQi5a2kIuUtVFRUbFS7VlMEqfX3lVWMMetdbaW+9n/fvinnvOCCC/juu++YMmXKeuO88sorGT16dPJ57fim/Pz8ZjkcxrKsVj3+TFKP8lZSkfJWUo1yVlKR8lZSkfIWAoHARrVrNUWQvLw83G73Wj00SktL1+rJUatdu3b1tvd4PLRt23a9beo754UXXsibb77Jp59+SseOHdcbr9/vx+/3r7Xd5XI1y6S2LKvZxiayLspbSUXKW0k1yllJRcpbSUWtPW839r5bzavj8/no06cPEydOrLN94sSJ9O/fv95j+vXrt1b7CRMm0LdvX7xe73rbrHlOYwwXXHABr776Kh999BHdunVrjFtqcWKxGBefdhXvvzrJ6VBERERERESkBWo1PUEARo8ezdChQ+nbty/9+vXj0UcfZf78+QwfPhxIDEFZtGgRTz/9NJBYCeb+++9n9OjRnHPOOUybNo3HH3+8zqovI0aMYN999+X2229n8ODBvPHGG0yaNKnOcJfzzz+f559/njfeeIPMzMxkz5Hs7GyCwWATvgLN26+zf+ejdz7lo3c+5bBjD3Y6HBEREREREWlhWlURZMiQISxfvpwbb7yR4uJievXqxbvvvkuXLl0AKC4uZv78+cn23bp1491332XUqFE88MADFBUVce+993Lccccl2/Tv35/x48czZswYrrnmGrbaaitefPFF9thjj2Sb2iV5999//zrxPPHEE5x++ulb7oZTzE/f/+p0CCIiIiIiItKCtaoiCMB5553HeeedV+++J598cq1t++23HzNmzFjvOY8//niOP/74de6vnUxV1u/PX+c5HYKIiIiIiIi0YK1mThBp/hb+uRgAj8etwpGIiIiIiIg0OhVBpNlYPL8YgFgsTqgm7HA0IiIiIiIi0tKoCCLNxsplq5JfV6yqcC4QERERERERaZFUBJFmo2xVeb1fi4iIiIiIiDQGFUGkWQiHwoSqQ8nnZStVBBEREREREZHGpSKINAtlKxPDX7JyMgENhxEREREREZHGpyKINAvlq4e/dOzaAdBwGBEREREREWl8KoJIs1BZXglAYVE+ANWVNU6GIyIiIiIiIi2QiiDSLISqE0vitsnPBaBmjflBRERERERERBqDiiDSLNTUJIoeuXmriyBV1U6GIyIiIiIiIi2QiiDSLIRDiZ4guW1zAPUEERERERERkcanIog0C6FkT5AcQEUQERERERERaXwqgkizUDsnyF89QTQxqoiIiIiIiDQuFUGkWajtCZKZnYnH66G6SkUQERERERERaVwqgkizUFsECQR9BNMChKo0HEZEREREREQal4og0iyEahLDYQLBAGnpaVRrdRgRERERERFpZCqCSLMQqq7tCRIgIyudyvIqhyMSERERERGRlkZFEGkWaofD+AN+MrMzqCivdDgiERERERERaWlUBJFmoaZ2OEyan8zsTCrKVAQRERERERGRxqUiiDQL4ZowHq8Hj8dDZlYGkXCEcCjsdFgiIiIiIiLSgqgIIs1COBQmEPADkJmdAaB5QURERERERKRRqQgizUKoJoQ/mCiCZGSlA1C+qsLJkERERERERKSFURFEmoVwKExgdREkPTNRBKmu1DK5IiIiIiIi0nhUBJFmIVQTwb96OEx6RhoAVSqCiIiIiIiISCNSEUSahVBNKFkESVtdBKmuqnEyJBEREREREWlhVASRZiEcChNICwCQlh4ENBxGREREREREGpeKINIshGv+Wh0mTcNhREREREREZAtQEUSahVBNeK05QWqqVAQRERERERGRxqMiiDguFosRj8fxBXwApGUkhsNUVWpOEBEREREREWk8KoKI46LhKAA+nxdYPRzG5aWyQj1BREREREREpPGoCCKOi0QSRRD/6p4g4aiL7B5D+f43r5NhiYiIiIiISAvjceKi4XCYr776ij///JPq6mry8/Pp3bs33bp1cyIccVgkHAHA60sUQX6YvRLL5WVBqZeamijBoIohIiIiIiIisvmatAgydepU7rvvPl5//XUikQg5OTkEg0FWrFhBOByme/funHvuuQwfPpzMzMymDE0cFF3dE8TnTxQ75sxZntz300/L6d27nSNxiYiIiIiISMvSZMNhBg8ezPHHH0+HDh344IMPqKioYPny5SxcuJDq6mp+/fVXxowZw4cffsi2227LxIkTt0gcDz74IN26dSMQCNCnTx8+++yz9bafPHkyffr0IRAI0L17dx5++OG12rzyyiv06NEDv99Pjx49eO211+rs//TTTznyyCMpKirCsixef/31xryllBcOJXqC1M4JMnfuquS+OXOWOhGSiIiIiIiItEBNVgQZMGAAf/75J3feeSf77rsvaWlpdfZ3796dYcOG8f777zNp0qQtEsOLL77IyJEjufrqq5k5cyb77LMPhx9+OPPnz6+3/dy5czniiCPYZ599mDlzJldddRUXXXQRr7zySrLNtGnTGDJkCEOHDuXbb79l6NChnHDCCXz55ZfJNlVVVey8887cf//9W+S+Ul0ksno4jN+HMYZ588oguhKA4uJKJ0MTERERERGRFqTJhsOcf/75G922Z8+e9OzZs9FjuOuuuzjrrLM4++yzARg3bhwffPABDz30EGPHjl2r/cMPP0znzp0ZN24cADvssAPffPMNd955J8cdd1zyHIcccghXXnklAFdeeSWTJ09m3LhxvPDCCwAcfvjhHH744Y1+Py1F7eowfr+PlStD1NTE8NhlxMhm+XItkysiIiIiIiKNo1msDvPHH38we/ZsbNveYteIRCJMnz6dAQMG1Nk+YMAApk6dWu8x06ZNW6v9oYceyjfffEM0Gl1vm3WdU9YWTk6M6mXVqhAAHncMlwmrCCIiIiIiIiKNpkknRo1Go9x8883MmDGDPffckyuuuIJTTz2V//3vfwBst912vPvuu3Tt2rXRr71s2TLi8TiFhYV1thcWFlJSUlLvMSUlJfW2j8ViLFu2jPbt26+zzbrOubHC4TDhcDj5vLy8HADbtrdosaghbNvGGNPguMKhxH16fZ5kEcTnNYSjNaxYUdPs7ldahs3NWxEnKG8l1ShnJRUpbyUVKW/Z6Htv0iLIFVdcwTPPPMNRRx3F//3f//HVV1/x888/8/zzz+Nyubjpppu4+uqree6557ZYDJZl1XlujFlr24ba/337pp5zY4wdO5Ybbrhhre1Lly4lFApt1rkbm23blJWVYYzB5dr0zkVLSxOTn4ZCIRYsKAXA445jV1WxYkUNxcUluN3NotOStCCbm7ciTlDeSqpRzkoqUt5KKlLeQkVFxUa12+giyOjRozf64nfddVe9219++WWefPJJjjjiCH755Re233573nnnneR8GQUFBZxyyikbfZ1NkZeXh9vtXquHRmlp6Vo9OWq1a9eu3vYej4e2bduut826zrmxrrzyyjqveXl5OZ06dSI/P5+srKzNOndjs20by7LIz89v0A9cWjAxSW7b/LbErAAAmRk+liytxJsGfn82bdoEGzVmkc3NWxEnKG8l1ShnJRUpbyUVKW8hEAhsVLuNLoLMnDmzzvPp06cTj8fZbrvtAPjll19wu9306dNnnedYvHgxO++8MwDbbrstfr+frbfeOrl/22233exhJOvi8/no06cPEydO5JhjjklunzhxIoMHD673mH79+vHWW2/V2TZhwgT69u2L1+tNtpk4cSKjRo2q06Z///6bFa/f78fv96+13eVyNcuktiyrwbFFIzEgcc8ryxPzg2RnB4iFl+MFVq0Kk5eX3pjhigCbl7ciTlHeSqpRzkoqUt5KKmrtebux973RRZCPP/44+fVdd91FZmYmTz31FLm5uQCsXLmSM844g3322Wed54jH48niAYDH48HtdtcJuna4yZYwevRohg4dSt++fenXrx+PPvoo8+fPZ/jw4UCi98WiRYt4+umnARg+fDj3338/o0eP5pxzzmHatGk8/vjjyVVfAEaMGMG+++7L7bffzuDBg3njjTeYNGkSU6ZMSbaprKzkt99+Sz6fO3cus2bNok2bNnTu3HmL3W+qqF0i1+f3Ul5bBMkJYGKJSVFXrmxew39EREREREQkNTVoTpD//Oc/TJgwIVkAAcjNzeXmm29mwIABXHzxxes89oMPPiA7OxtIdNn58MMP+eGHHwBYtWpVQ8LZaEOGDGH58uXceOONFBcX06tXL9599126dOkCQHFxMfPnz0+279atG++++y6jRo3igQceoKioiHvvvTe5PC5A//79GT9+PGPGjOGaa65hq6224sUXX2SPPfZItvnmm2844IADks9rh7kMGzaMJ598covecyqI1C6RG/BTUZGYJDU3Nw07Vg3AihVaIUZEREREREQ2X4OKIOXl5SxZsoSePXvW2V5aWrrByUiGDRtW5/k///nPOs83d0LRDTnvvPM477zz6t1XX0Fiv/32Y8aMGes95/HHH8/xxx+/zv3777//Fu3hkuoi4b96glRWVmJZ0DYvAxNVTxARERERERFpPA0aLHTMMcdwxhln8PLLL7Nw4UIWLlzIyy+/zFlnncWxxx67zuNql3dd3yMejzf4ZiQ1hUO1RRAflZUR0tN9ZOVkJnuCLF9e7WR4IiIiIiIi0kI0qCfIww8/zCWXXMKpp55KNJoYyuDxeDjrrLO44447GjVAafmikbpFkIwML1nZmZjVRZBlyzQcRkRERERERDZfg4ogaWlpPPjgg9xxxx38/vvvGGPYeuutSU9f9woeb7755kaf/6ijjmpIWJKi1uwJUlUVISPDR1ZuFhiboB+WLVNPEBEREREREdl8DSqC1CouLqa4uJh9992XYDCIMWadc3ocffTRdZ5bllVnnow1j9OQmNaldk4Q/+qeIAUF6WTlZCa2+YyKICIiIiIiItIoGjQnyPLlyznooIPYdtttOeKIIyguLgbg7LPPXufKMGvO+zFhwgR22WUX3nvvPVatWkVZWRnvvvsuu+66K++//37D70ZSUu3qMB6fh8rKKBkZPrJzsgDwuqMsX16jiWVFRERERERkszWoCDJq1Ci8Xi/z588nLS0tuX3IkCEbVcQYOXIk99xzD4ceeihZWVlkZmZy6KGHctddd3HRRRc1JCRJYbU9QYzxYNuG9HRvsieIZcJEozbV1VEnQxQREREREZEWoEHDYSZMmMAHH3xAx44d62zfZpttmDdv3gaP//3338nOzl5re3Z2Nn/++WdDQpIUFlk9MWp09SiojAwfgbQAXp+XeDQEZFJeHiY93edckCIiIiIiIpLyGtQTpKqqqk4PkFrLli3D7/dv8PjddtuNkSNHJofRAJSUlHDxxRez++67NyQkSWGRUATLsgiFElWQtDQvlmXRNj+XSHUFAOXlESdDFBERERERkRagQUWQfffdl6effjr53LIsbNvmjjvu4IADDtjg8f/3f/9HaWkpXbp0Yeutt2brrbemc+fOFBcX8/jjjzckJElh4XAEf8BHTU0MgPR0LwD57fKoKl8JQHl52LH4REREREREpGVo0HCYO+64g/33359vvvmGSCTCZZddxuzZs1mxYgWff/75Bo/feuut+e6775g4cSI//fQTxhh69OjBwQcfvM7VZaTlioajq5fHTcz7kZb2VxHk598XkZalIoiIiIiIiIhsvgYVQXr06MF3333HQw89hNvtpqqqimOPPZbzzz+f9u3bb9Q5LMtiwIABDBgwoCEhSAsSDkfw+X3JyU9r5/7IK2yLHf0NUBFERERERERENl+DiiDz58+nU6dO3HDDDfXu69y581rbx48fz4knnrhR51+wYAHz589nr732akh4kmKikShen5fKysS8H7XDYdoUtMGOhwAVQURERERERGTzNWhOkG7durF06dK1ti9fvpxu3brVe8xDDz3E9ttvz+23386PP/641v6ysjLeffddTj75ZPr06cOKFSsaEpqkoGg0itfnSfYEqR0O0yYvFxNLFEFWrVIRRERERERERDZPg3qCGGPqnbujsrKSQCBQ7zGTJ0/m7bff5r777uOqq64iPT2dwsJCAoEAK1eupKSkhPz8fM444wx++OEHCgoKGhKapKBYJIbX600WQTIy1iiCxGuLICHH4hMREREREZGWYZOKIKNHjwYS83lcc801dZbJjcfjfPnll+yyyy7rPH7QoEEMGjSI5cuXM2XKFP78809qamrIy8ujd+/e9O7dG5erQZ1TJIVFo1EyghlUViaKIMHg6iJIfg4YG58XyspUBBEREREREZHNs0lFkJkzZwKJniDff/89Pp8vuc/n87HzzjtzySWXbPA8bdu2ZfDgwZsYqrRU0UgMr9eTnBMkK8sPQGFRojeQxx2nrEzDYURERERERGTzbFIR5OOPPwbgjDPO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PpMmTUoWQCAxz8gDDzzAgAEDNuvckloikQjeenqBrM+RR27DM898T3l5OLntzjsPpk+f9us97pBtYL9uMKsYllTCsqpEj5DubcDjgry1pxgRERERERGRFqTBM6b8/vvvjBkzhpNOOonS0lIgUdyYPXv2Bo+1bXutITQAXq8X27YbGpKkoFgkhte7abU4v9/DqFGJ1XcOPrgbb701ZIMFkFo+T2IJ2yN3gDP6Joa+tMtUAURERERERKQ1aFARZPLkyey44458+eWXvPrqq1RWVgLw3Xffcd11123w+AMPPJARI0awePHi5LZFixYxatQoDjrooIaEJCkqEong8/s2+bj99+/CSy8dx9VX701GxqYfLyIiIiIiIq1Pg4ogV1xxBTfffDMTJ07E5/vrDegBBxzAtGnTNnj8/fffT0VFBV27dmWrrbZi6623plu3blRUVHDfffc1JCRJUZFwFK+vYZNw5OWlNXI0IiIiIiIi0pI1aE6Q77//nueff36t7fn5+SxfvnyDx3fq1IkZM2YwceJEfvrpJ4wx9OjRg4MPPrgh4UgKi0YbXgQRERERERER2RQNKoLk5ORQXFxMt27d6myfOXMmHTp0WO+xsViMQCDArFmzOOSQQzjkkEMaEoK0ENFwFJ+KICIiIiIiItIEGjQc5uSTT+byyy+npKQEy7KwbZvPP/+cSy65hNNOO229x3o8Hrp06UI8Hm9QwNKyRCJRfJu4OoyIiIiIiIhIQzSoCHLLLbfQuXNnOnToQGVlJT169GCfffahf//+jBkzZoPHjxkzhiuvvJIVK1Y05PLSgkQjUbw+TWwqIiIiIiIiW16DhsN4vV6ee+45brrpJmbMmIFt2/Tu3Zttttlmo46/9957+e233ygqKqJLly6kp9ddn3TGjBkNCUtSUKII0qA0FBEREREREdkkDXr3OXr06LW2ffHFF1iWRSAQYOutt2bw4MG0adOm3uOPPvrohlxWWqBIOFJnhSERERERERGRLaVBRZCZM2cyY8YM4vE42223HcYYfv31V9xuN9tvvz0PPvggF198MVOmTKFHjx5AovfHueeeSyAQ4IwzzqBjx464XA0ajSMtSDQaw6s5QURERERERKQJNKgKMXjwYA4++GAWL17M9OnTmTFjBosWLeKQQw7hpJNOYtGiRey7776MGjUqeczo0aMpLy8HoFu3bixbtqxx7kBSljEmMRzGqyKIiIiIiIiIbHkN6glyxx13MHHiRLKyspLbsrKyuP766xkwYAAjRozg2muvZcCAAcn9RUVFvPLKKxxxxBEYY1i4cCGhUKje83fu3LkhYUmKiUVjAFodRkRERERERJpEg4ogZWVllJaWJoe61Fq6dGmyt0dOTg6RSCS5b8yYMVx44YVccMEFWJbFbrvtttZ5jTFYlqXlc1uJSDgKoJ4gIiIiIiIi0iQaVAQZPHgwZ555Jv/5z3/YbbfdsCyLr776iksuuSQ56elXX33Ftttumzzm3HPP5aSTTmLevHnstNNOTJo0ibZt2zbKTUhqqi2SaU4QERERERERaQoNKoI88sgjjBo1ihNPPJFYLDGkwePxMGzYMO6++24Att9+e/773//WOS4zM5NevXrxxBNPsNdee+H3+zczfEll0cjq4TA+FUFERERERERky2tQESQjI4PHHnuMu+++mz/++ANjDFtttRUZGRnJNrvssss6jx82bFhDListTLS2J4iKICIiIiIiItIEGlQEqZWRkcFOO+3UWLFIK6OeICIiIiIiItKUGrRErkhjqJ0TxKMiiIiIiIiIiDQBFUHEMeoJIiIiIiIiIk3J8SLI559/TjgcdjoMcUDtnCA+v8/hSERERERERKQ1cLwIcvjhh7No0SKnwxAH1PYE8Xo3a2oaERERERERkY3ieBHEGON0COKQ2jlBvOoJIiIiIiIiIk3A8SKItF6aE0RERERERESakuNFkEceeYTCwkKnwxAHhEOJuWB8fhVBREREREREZMtzfDKGk08+2ekQxCGh6hAAgbSgw5GIiIiIiIhIa+B4TxBpvUI1iSJIMOh3OBIRERERERFpDVQEEceEahLDYYLqCSIiIiIiIiJNQEUQcUxNdQ0AgTT1BBEREREREZEtT0UQcUxtT5BAMOBwJCIiIiIiItIatJoiyMqVKxk6dCjZ2dlkZ2czdOhQVq1atd5jjDFcf/31FBUVEQwG2X///Zk9e3adNuFwmAsvvJC8vDzS09M56qijWLhwYZ02t9xyC/379yctLY2cnJxGvrPUlZwYVUUQERERERERaQKtpghy8sknM2vWLN5//33ef/99Zs2axdChQ9d7zL///W/uuusu7r//fr7++mvatWvHIYccQkVFRbLNyJEjee211xg/fjxTpkyhsrKSQYMGEY/Hk20ikQj/+Mc/+Ne//rXF7i8V1U6MqiKIiIiIiIiINAXHl8htCj/++CPvv/8+X3zxBXvssQcAjz32GP369ePnn39mu+22W+sYYwzjxo3j6quv5thjjwXgqaeeorCwkOeff55//vOflJWV8fjjj/PMM89w8MEHA/Dss8/SqVMnJk2axKGHHgrADTfcAMCTTz7ZBHfbPHzz+Uxmz/iRYReuewnkmuQSuZoTRERERERERLa8VlEEmTZtGtnZ2ckCCMCee+5JdnY2U6dOrbcIMnfuXEpKShgwYEBym9/vZ7/99mPq1Kn885//ZPr06USj0TptioqK6NWrF1OnTk0WQRoiHA4TDoeTz8vLywGwbRvbtht83i3Btm2MMXXiev3Zt3nnfx8waMhh5Obl1HtcTXUIr8+LZVnN7p6k5asvb0WaO+WtpBrlrKQi5a2kIuUtG33vraIIUlJSQkFBwVrbCwoKKCkpWecxAIWFhXW2FxYWMm/evGQbn89Hbm7uWm3Wdd6NNXbs2GQPkjUtXbqUUCi0WedubLZtU1ZWhjEGlysxwqrb9p0B+HTSFPoduHu9x5WvKscf8FNaWtpksYrUqi9vRZo75a2kGuWspCLlraQi5S11pq1Yn5Quglx//fX1FgrW9PXXXwNgWdZa+4wx9W5f09/3b8wxG9NmQ6688kpGjx6dfF5eXk6nTp3Iz88nKytrs87d2GzbxrIs8vPzkz9w+x+2L/ff+Bizv/mJwScOqve4eNwmPSNYb4FKZEurL29FmjvlraQa5aykIuWtpCLlLQQCGzfXZEoXQS644AJOPPHE9bbp2rUr3333HUuWLFlr39KlS9fq6VGrXbt2QKK3R/v27ZPbS0tLk8e0a9eOSCTCypUr6/QGKS0tpX///pt8P2vy+/34/WvPleFyuZplUluWVSe2rbbrRuetOvLFJ1+vM95QdYhgWrBZ3o+0Dn/PW5FUoLyVVKOclVSkvJVU1NrzdmPvO6Vfnby8PLbffvv1PgKBAP369aOsrIyvvvoqeeyXX35JWVnZOosV3bp1o127dkycODG5LRKJMHny5OQxffr0wev11mlTXFzMDz/8sNlFkJagZ+8dWDSvmFUryurdX1NdQzBdK8OIiIiIiIhI00jpIsjG2mGHHTjssMM455xz+OKLL/jiiy8455xzGDRoUJ1JUbfffntee+01IFFFGzlyJLfeeiuvvfYaP/zwA6effjppaWmcfHJixZPs7GzOOussLr74Yj788ENmzpzJqaeeyo477phcLQZg/vz5zJo1i/nz5xOPx5k1axazZs2isrKyaV+IJrbL7jsC8PjdT9e7v6Y6RCAt2JQhiYiIiIiISCvWKoogAM899xw77rgjAwYMYMCAAey0004888wzddr8/PPPlJX91WvhsssuY+TIkZx33nn07duXRYsWMWHCBDIzM5Nt7r77bo4++mhOOOEE9tprL9LS0njrrbdwu93JNtdeey29e/fmuuuuo7Kykt69e9O7d2+++eabLX/jDjp22FEUdW7P+69MIhqNrbW/pjpEMKjlcUVERERERKRpWMYY43QQsmHl5eVkZ2dTVlbWLCdGLS0tpaCgYK1xWP/9z1M8cOtjjLz+PIZdeHJyuzGGPvn7csDAffnPU7c0dcgi681bkeZKeSupRjkrqUh5K6lIebvx75lb56sjTebEc44nIyuDd176oM72cCiCMYZgmuYEERERERERkaahIohsURlZ6fTsvT0L/1zMmp2OaqprAAhqThARERERERFpIiqCyBbXsVsHaqpqWLZkeXLbquWJuVeyczPXdZiIiIiIiIhIo1IRRLa4nr13AGDKpC+S22oLInmFeY7EJCIiIiIiIq2PiiCyxR1wxD6kpQd5/K6nktuWliwDIK+wrVNhiYiIiIiISCujIohscTltstnv8L1ZNK+YmqrEXCDLlqwugrRTEURERERERESahoog0iQ6du0AwMJ5iwEoXlgKQPsOhY7FJCIiIiIiIq2LiiDSJLps1QmAGVNnAbB4/mI8Xo96goiIiIiIiEiTURFEmsReB++J2+3mzjH3UVVRzeL5JbTvWIjb7XY6NBEREREREWklVASRJpHTJpvDjz+EWDTGpx9MYfnSFZoUVURERERERJqUiiDSZHbZY0cArvrnjVSsqiArJ8vhiERERERERKQ1URFEmkxaRlry61gsTlZOpoPRiIiIiIiISGujIog0me16bVPnuYogIiIiIiIi0pRUBJEm0327rpx98bDk80wVQURERERERKQJqQgiTergo/ZPfp2TqzlBREREREREpOmoCCJNatueW3P48YfQbduuHHTk/k6HIyIiIiIiIq2Ix+kApHWxLItbH7nO6TBERERERESkFVJPEBERERERERFpFVQEEREREREREZFWQUUQEREREREREWkVVAQRERERERERkVZBRRARERERERERaRW0OkyKMMYAUF5e7nAka7Ntm4qKCgKBAC6X6mqSGpS3koqUt5JqlLOSipS3koqUt3+9V65977wuKoKkiIqKCgA6derkcCQiIiIiIiIizVNFRQXZ2dnr3G+ZDZVJpFmwbZvFixeTmZmJZVlOh1NHeXk5nTp1YsGCBWRlZTkdjshGUd5KKlLeSqpRzkoqUt5KKlLeJnqAVFRUUFRUtN7eMOoJkiJcLhcdO3Z0Ooz1ysrKarU/cJK6lLeSipS3kmqUs5KKlLeSilp73q6vB0it1jlYSERERERERERaHRVBRERERERERKRVUBFENpvf7+e6667D7/c7HYrIRlPeSipS3kqqUc5KKlLeSipS3m48TYwqIiIiIiIiIq2CeoKIiIiIiIiISKugIoiIiIiIiIiItAoqgoiIiIiIiIhIq6AiiGyWBx98kG7duhEIBOjTpw+fffaZ0yFJKzF27Fh22203MjMzKSgo4Oijj+bnn3+u08YYw/XXX09RURHBYJD999+f2bNn12kTDoe58MILycvLIz09naOOOoqFCxfWabNy5UqGDh1KdnY22dnZDB06lFWrVm3pW5RWYOzYsViWxciRI5PblLfSHC1atIhTTz2Vtm3bkpaWxi677ML06dOT+5W30pzEYjHGjBlDt27dCAaDdO/enRtvvBHbtpNtlLPitE8//ZQjjzySoqIiLMvi9ddfr7O/KXN0/vz5HHnkkaSnp5OXl8dFF11EJBLZErfdPBiRBho/frzxer3mscceM3PmzDEjRoww6enpZt68eU6HJq3AoYceap544gnzww8/mFmzZpmBAweazp07m8rKymSb2267zWRmZppXXnnFfP/992bIkCGmffv2pry8PNlm+PDhpkOHDmbixIlmxowZ5oADDjA777yzicViyTaHHXaY6dWrl5k6daqZOnWq6dWrlxk0aFCT3q+0PF999ZXp2rWr2WmnncyIESOS25W30tysWLHCdOnSxZx++unmyy+/NHPnzjWTJk0yv/32W7KN8laak5tvvtm0bdvWvP3222bu3LnmpZdeMhkZGWbcuHHJNspZcdq77/5/e/ceFFX5xgH8uyywoksrF2F3BVHDwlwbuQyFEqCSNmLqMKkRCQjaWGKYk2I5WeOomZcstTBL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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "worst EQ departure from the frozen table: 0.001914 dB (test allows 0.01)\n" + ] + } + ], + "source": [ + "eq_fc = [198.425, 250, 314.98, 400, 500, 630, 793,\n", + " 1000, 1259, 1587, 2000, 2500, 3150, 4000]\n", + "worst = plot_generated_vs_reference(\n", + " ['eq_band_%d' % b for b in range(14)],\n", + " ['%g Hz' % f for f in eq_fc],\n", + " 'Equaliser cells at 192 kHz: generated vs frozen',\n", + " plt.cm.turbo)\n", + "print('worst EQ departure from the frozen table: %.6f dB (test allows 0.01)' % worst)\n" + ] + }, + { + "cell_type": "markdown", + "id": "8401ac7c", + "metadata": {}, + "source": [ + "## Flat equaliser reconstruction\n", + "\n", + "`BandEQ` sums the 14 cells with alternating sign. With every cell set to 100 the\n", + "sum should come out level \u2014 this only works if each cell keeps its designed\n", + "shape and peak gain, so it is the sharpest check on the redesign.\n", + "\n", + "Note the sum sits near +4 dB rather than 0 dB. That is how the equaliser has\n", + "always behaved; the overlapping cells add up to more than unity.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "44e42489", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:21.259796Z", + "iopub.status.busy": "2026-07-28T10:57:21.259533Z", + "iopub.status.idle": "2026-07-28T10:57:21.503707Z", + "shell.execute_reply": "2026-07-28T10:57:21.502878Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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PDw8HrrO77//zscff0zLli0pVqwYffv2pVmzZowbN866zqpVq+jevTtly5alYsWKTJs2jaioKPbu3ZvuLOfOnaN48eL07dsXs9mc7u2mT5/+0PfB8OHD070PkT5Gk5n1x68SeydV6yhCCCGEEELkelIESafx48dTuHDhJ97atm37wLZt27ZN17bjx4/PVLaJEycyYsQIChcuzJUrV9i9e7f1uRkzZmAwGNi6dSs///wzly5domXLllSrVo2DBw8yadIkpk6dysiRIwEICAjgypUr1tv+/fspUKAA9erVA+Dw4cM0a9aMjh07cujQIebOncuWLVvo379/mkzjxo2jatWq7N+/n7feeou+ffty/PjxR+avVasWvXr1sh43ICAAs9lM4cKFmTdvHhEREQwdOpSPP/6YefPmpdl+3bp1HDt2jA0bNjB79mwWLVrE559//sjr1aNHD7Zu3cqcOXM4dOgQzz//PM2bN+fUqVMA9OvXj+TkZDZt2sThw4f5+uuvcXV1zfgL8xjJyck4OjqmWebk5MSWLVseuU1sbCwA+fPnT9cxjhw5Qu3atXn++eeZNGkSOl36P+4vvvhimvfB7NmzMRgM1K5dO937EE924sQJRo39hmJ/1mXOd++TkGzUOpIQQgghhBC52oN9JsRDxcXFcenSpSeuFxAQ8MCya9eupWvbuLi4TGXz8PDAzc0NvV6Pr69vmueKFy/ON998Y338ySefEBAQwA8//ICiKJQuXZrLly8zZMgQhg4dmmYfSUlJtG/fnlq1allbAIwZM4YuXbpYx7koUaIE3333HfXr12fSpEnWL/YtW7bkrbfeAmDIkCF8++23hIeHU7p06Yfmt7e3x9nZOU1+vV6fppgRFBTEtm3bmD9/Ph07drQut7e357fffsPZ2ZmyZcsyYsQI3n//fb744osHvvifOXOG2bNnc/HiRQoVKgTA4MGDWbVqFdOmTWPUqFFERUXRqVMnypcvD0CxYsXS/2KkU7NmzRg/fjz16tUjODiYdevWsXjxYkwm00PXV1WVQYMGUadOnXSN97J9+3Zat27NRx99xODBgx94vnDhwg8su3PnjvW+k5MTTk5OgOWa9e/fn1GjRllbE4mnFxcXR68hw/m74iby6xLonTSN76eVpH/vvlpHE0IIIYQQIteSIkg6ubu74+/v/8T1vLy8HrosPdu6u7tn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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ripple, frozen @192k : 0.814 dB peak to peak\n", + "ripple, generated @192k : 0.814 dB peak to peak\n", + "ripple, generated @176k : 0.891 dB peak to peak\n", + "max |generated - frozen| at 192 kHz: 0.0008 dB\n" + ] + } + ], + "source": [ + "f_gen192, g_gen192 = load_sweep('build/filtercmp_eq_flatsum_192000_gen.txt')\n", + "f_ref192, g_ref192 = load_sweep('build/filtercmp_eq_flatsum_192000_ref.txt')\n", + "f_gen176, g_gen176 = load_sweep('build/filtercmp_eq_flatsum_176400_gen.txt')\n", + "\n", + "plt.figure(figsize=(11, 5))\n", + "plt.semilogx(f_ref192, g_ref192, 'k--', lw=2.0, label='frozen tables, 192 kHz')\n", + "plt.semilogx(f_gen192, g_gen192, lw=1.5, label='generated, 192 kHz')\n", + "plt.semilogx(f_gen176, g_gen176, lw=1.5, label='generated, 176.4 kHz')\n", + "plt.xlabel('frequency (Hz)')\n", + "plt.ylabel('summed gain (dB)')\n", + "plt.title('Flat equaliser reconstruction')\n", + "plt.grid(alpha=0.3, which='both')\n", + "plt.legend()\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "print('ripple, frozen @192k : %.3f dB peak to peak' % np.ptp(g_ref192))\n", + "print('ripple, generated @192k : %.3f dB peak to peak' % np.ptp(g_gen192))\n", + "print('ripple, generated @176k : %.3f dB peak to peak' % np.ptp(g_gen176))\n", + "print('max |generated - frozen| at 192 kHz: %.4f dB' % np.max(np.abs(g_gen192 - g_ref192)))\n" + ] + }, + { + "cell_type": "markdown", + "id": "d5b21d79", + "metadata": {}, + "source": [ + "## Every generated stage, at both rates\n", + "\n", + "`filtercmp_rate_summary.txt` measures a characteristic frequency of every\n", + "generated stage at 192 kHz and 176.4 kHz. Before this work the CW and EQ rows\n", + "read 0.9187.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "52ccf5a2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-28T10:57:21.506556Z", + "iopub.status.busy": "2026-07-28T10:57:21.506300Z", + "iopub.status.idle": "2026-07-28T10:57:21.925454Z", + "shell.execute_reply": "2026-07-28T10:57:21.924716Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CW_audio_840_minus6dB 850.5 -> 850.4 Hz ratio 0.9999\n", + "CW_audio_1080_minus6dB 1093.4 -> 1093.3 Hz ratio 0.9999\n", + "CW_audio_1320_minus6dB 1336.3 -> 1336.0 Hz ratio 0.9998\n", + "CW_audio_1800_minus6dB 1821.7 -> 1821.1 Hz ratio 0.9997\n", + "CW_audio_2000_minus6dB 2064.4 -> 2063.5 Hz ratio 0.9996\n", + "EQ_band0_198_peak 198.4 -> 198.4 Hz ratio 1.0000\n", + "EQ_band1_250_peak 250.0 -> 250.0 Hz ratio 1.0000\n", + "EQ_band2_315_peak 315.0 -> 315.0 Hz ratio 1.0000\n", + "EQ_band3_400_peak 400.0 -> 400.0 Hz ratio 1.0000\n", + "EQ_band4_500_peak 500.0 -> 500.0 Hz ratio 1.0000\n", + "EQ_band5_630_peak 630.0 -> 630.0 Hz ratio 1.0000\n", + "EQ_band6_793_peak 793.0 -> 793.0 Hz ratio 1.0000\n", + "EQ_band7_1000_peak 1000.0 -> 1000.0 Hz ratio 1.0000\n", + "EQ_band8_1259_peak 1259.0 -> 1259.0 Hz ratio 1.0000\n", + "EQ_band9_1587_peak 1587.0 -> 1587.0 Hz ratio 1.0000\n", + "EQ_band10_2000_peak 2000.0 -> 2000.0 Hz ratio 1.0000\n", + "EQ_band11_2500_peak 2500.0 -> 2500.0 Hz ratio 1.0000\n", + "EQ_band12_3150_peak 3150.0 -> 3150.0 Hz ratio 1.0000\n", + "EQ_band13_4000_peak 4000.0 -> 4000.0 Hz ratio 1.0000\n", + "TX_audio_bandwidth_minus3dB 2776.1 -> 2797.5 Hz ratio 1.0077\n", + "CW_decode_FIR_minus6dB 1748.0 -> 1748.1 Hz ratio 1.0000\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABEEAAAKyCAYAAAA6t8BZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeXxOZ/7/8dcdkUUQEVupiCUkskiCRNQSpEUs7YygqKI6RlX9Oi1jmWpFW2vpd5rqqNFqxVJbUao61qI0tiSqlAZBETSWUJGInN8fxhm3rCp6S/N+Ph7n8ZBznes6n3Ou+6S9P7mu61gMwzAQEREREREREfmDs7N1ACIiIiIiIiIivwclQURERERERESkRFASRERERERERERKBCVBRERERERERKREUBJEREREREREREoEJUFEREREREREpERQEkRERERERERESgQlQURERERERESkRFASRERERERERERKBCVBRETkgdq3bx8DBgygdu3aODk5UbZsWYKDg5kyZQoXLlwwj/P09KRz5842jPS3++CDD/jkk08eWPsWi4Vx48bdU501a9bkWcfT05P+/fvfd1wAmZmZDB48mEceeYRSpUoRGBhYJO1K0bl27Rrjxo1j8+bNOco++eQTLBYLycnJv3tcxV1+z5jFYmHo0KG/b0C/0YP+/ZWf/v37U7ZsWZucW0RKLntbByAiIn9c//73vxkyZAgNGjRgxIgRNGzYkBs3brB7925mzpzJjh07WL58ua3DvG8ffPABlSpVKrLEwt127NjBo48+ek911qxZw4wZM3L9krZ8+XLKly9fJLH961//4sMPPyQmJobGjRvrC81D6Nq1a0RHRwMQHh5uVdapUyd27NjBI488YoPIirf8nrHi5EH//hIRedgoCSIiIg/Ejh07eOGFF3j88cdZsWIFjo6OZtnjjz/Oq6++ytq1a3/XmG7evElWVpZVLA8rwzC4fv06zs7ONGvWrEjbDgoKKrK29u/fj7Ozc4F/9b7zeuT+3LhxA4vFgr39/f9vXOXKlalcuXIRRPX70Ocof7o/IiIF03QYERF5ICZMmIDFYmHWrFm5Jh0cHBzo2rVrjv1r164lODgYZ2dnvL29+fjjj63Kz58/z5AhQ2jYsCFly5alSpUqtG3blq1bt1odl5ycjMViYcqUKbz11lvUrl0bR0dHNm3axPXr13n1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5MiRI7mWhYeHs3r1agA++eQTDh8+bJZ98sknREVF3V+w+QgMDCQ9Pf2BtD1gwAACAgIIDAykadOmbNiwIc9j77wH/fv359FHHyUwMJCAgABatWrFjz/++EBiFJHczdwwlZkbpto6DBERERGRXBV6OkxCQgIAycnJNGnSxPz5tqeffpqXXnqJefPmMX/+fI4cOcKCBQuKMtYCNWnShPnz5/+u53zQ1qxZU6jjPvnkEypVqkT9+vUfcES33N3/Rendd9+lQoUK5nkiIiI4f/48FoulwLqjRo1i6NChAEyZMoWxY8eyZMmSBxariIiIiIiIFB9FNh3mzTffJD4+npiYGIYPH87cuXMpXbp0nsdnZWXRvn17mjRpgq+vL3369OHatWtAzlEMq1evJjw83Pz5tddeo169erRu3docBQDWo0IAYmNj8ff3JyAggE6dOnHq1KkCr2P+/Pm0atWKevXqMX36dHP/iBEjaNq0KYGBgbRu3ZqffvoJuJUUqlSpEq+//jqNGzemXr16VomLzz//HG9vb8LCwnjzzTfN/R9++CF//etfAdi3bx8Wi4V169YBMHbsWPPYO0enHDhwgNDQUIKDg+nTpw/Xr18HYPbs2ezevZthw4YRGBhonv/KlSv06tULf39/mjRpwtGjR/O99vDwcEaMGEGrVq2oWbMmU6dO5bPPPqN58+bUqlWLzz77zDz2zhEtnp6eREdH07x5c2rXrs1bb71l1eadfRQVFcUnn3xixt2wYUMCAwPx9/cnLi4OwEyAAFy6dMkq+ZHXPbibYRhcunQJNze3PK83IyODtLQ0q01ERERERET+uIosCeLo6MiHH37IsGHDGDp0KH5+fvkeX6pUKRYsWMDu3bvZv38/5cuX54MPPijwPKtWreKLL74gISGBjRs3Wk0BudP+/fsZMWIEa9euZd++fTRv3pxBgwYV2P7Zs2fZsmUL3333Hf/85z/NL+YjR45k165dJCQk8MILL/C3v/3NrJOamkrjxo3Zs2cP77//vll27tw5/vKXv7By5Up27NiBo6OjWefxxx83kx4bNmwgLCzMnPaxfv16IiIicsTWt29fhgwZwt69e3nppZfYtWsXAM8//zxNmjThvffeIyEhgcjISADi4uKYNGkS33//PREREUyePLnA6z9x4gSbN28mLi6O119/nf3797N9+3aWLFnCK6+8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X1/OnDljLL9ITk6mqKio2viurq6YzWY++OADAPLy8li/fj133XXXb3oW7dq1Y82aNcZeHl988QX+/v4A/PGPf2Tz5s388MMPALzzzjvGkpJu3bpRUlJi7JUyd+5cBgwYUOezuRLat29PZmYmlZWVnD592mqZzK5du2jXrh2PPfYYEydOZMOGDQAMHz6cb775hsrKSs6ePcuqVavo2rUrAH369GHBggVA1Z4f//rXv2q99v79+9m9e7fxMyIiV8eUkEeZEvKorcMQEREREamRg60DqMk//vEPXn75ZUJCQnBwcMBisRAaGkp0dDSenp4cP36c/v37G/3DwsKIj49n9OjRdY7r6upKYmIiwcHBeHp6Eh0dbdU+e/ZsnnjiCTw8PIiIiKBly5ZAVcXA0qVLSUhIwMnJifDwcDw9PWu8xpIlSxg7diyzZ8/GZDIxf/78OveayMvLIywsjNOnT1NSUsJtt91mVEY88cQT7Ny5k4CAAJo2bUrr1q2NpSHNmzdn/vz5DBgwgIqKCgICAozki52dHYsXLyY+Pp4zZ85w6623snjx4voffAOLiYkhOTmZzp074+Xlhdls5syZM0BVAio1NZWmTZtib2/PzJkzARg2bBiZmZn4+flhb29PaGiosQRo0qRJjB49ms6dO9O2bVv69u1rdb1ze4JYLBYqKiqYOnWqkUARkavj4A3V93MSEREREblWmCyXssZA5HesuLgYNzc32j71MTi62DocqYcdFjq5W9h53EQlv23JmTS81qd+AWpOhmjOGhfNV+OjOWt8NGeNi8sXz1NRUcHOnTuxs7vmCuqlBpWVlRw5cgQPDw/NWSNx4sQJ3N3dKSoqumLbFegnQUREGsxLGxfw0sYFtg5DRERERKRG1+RymMu1cuVKJk6cWO34hAkTGDp06FWP58iRI9xzzz3Vjvft25fXXnvtuotDRERERERExBZ+l0mQqKgooqKibB2GwcPDg+zsbFuHcc3EISIiIiIiImILWg4jIiIiIiIiItcFJUFERERERERE5Lrwu1wOI3I5sl+6hxYtWtg6DKmHdvu+NuX1fxeA/On3VWvTnDUumq/GR3PW+GjOGhe/L563dQgi0gCUBBERkQbTPiXF1iGIiIiIiNRKKWcRERERERERuS4oCSIiIg3m1Np1nFq7ztZhiIiIiIjUSMthRESkwRx+dToAN9yt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rSReXl7Yt28f5s2bh2+++abUY+vfvz/MzMwwd+5ctc/15b1DEhISSvxciYioauJKECIiIqo0WrVqBXd3d/z000/46KOPVOVjxozB4cOHVe+V/0J/7do11eN1FQoFNmzYgJEjR2rde8LCwgIHDhzApEmT4O7ujrp162LQoEH48ssvVXUePnyoelJKWRkwYAAUCgUCAwNhYGBQ7IqOom7fvo3Lly/j8uXLGpvFCiEAvNjro3HjxhpPjFF6+vQpfvnll9dKFADA2LFjsWHDBkycOFFVFh0djVGjRqneK1e4hISEYO7cuQBeJEZmzZqFe/fuwdHREXPmzFFbcREXF4eUlBSkpKRorMJRju1VfHx88PPPP6NHjx6Qy+WYPHmyzuM6cuQIAKj+21FS/vd04sQJPHz4EAMGDNC5TSIiqhpkQte/aYiIiIjKQUxMDIKDg3HhwoVSP5JW33h4eGDq1KkICAjQenzXrl347LPPVKs2SuvZs2do3rw5tm3bBi8vrzfpapUycOBAuLm5Yfbs2RXdFSIiKmNcCUJERESVSo8ePfDHH38gIyMD9vb2Fd2dSis7OxsDBgzA0KFDi61jYWGBRYsWvfY1TE1NsWnTJty5c+e126hq8vLy0KZNm2L3CiEioqqNK0GIiIiIiIiISC9wjSkRERERERER6QUmQYiIiIiIiIhILzAJQkRERERERER6gUkQIiIiIiIiItILTIIQERERERERkV5gEoSIiIiIiIiI9AKTIERERERERESkF5gEISIiIiIiIiK9wCQIEREREREREekFJkGIiIiIiIiISC/8Pwi5IYyEH9oLAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "largest departure from 1.0: 0.0077\n" + ] + } + ], + "source": [ + "rows = np.genfromtxt('build/filtercmp_rate_summary.txt', delimiter=',',\n", + " names=True, dtype=None, encoding='utf-8')\n", + "\n", + "labels = [r['stage'] for r in rows]\n", + "ratios = np.array([r['measured_ratio'] for r in rows])\n", + "\n", + "for r in rows:\n", + " print('%-34s %8.1f -> %8.1f Hz ratio %.4f'\n", + " % (r['stage'], r['f_192k_Hz'], r['f_176k_Hz'], r['measured_ratio']))\n", + "\n", + "plt.figure(figsize=(11, 7))\n", + "y = np.arange(len(labels))\n", + "plt.barh(y, ratios, color='tab:blue')\n", + "plt.axvline(1.0, color='k', lw=1.2, label='rate independent (1.0)')\n", + "plt.axvline(RATE_RATIO, color='tab:red', ls='--', lw=1.2,\n", + " label='old behaviour (%.5f)' % RATE_RATIO)\n", + "plt.yticks(y, labels, fontsize=8)\n", + "plt.xlim(0.88, 1.04)\n", + "plt.xlabel('f(176.4 kHz) / f(192 kHz)')\n", + "plt.title('Characteristic frequency ratio across the rate change')\n", + "plt.grid(alpha=0.3, axis='x')\n", + "plt.legend()\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "print('\\nlargest departure from 1.0: %.4f' % np.max(np.abs(ratios - 1.0)))\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/code/test/reference_filters.cpp b/code/test/reference_filters.cpp new file mode 100644 index 0000000..db623a5 --- /dev/null +++ b/code/test/reference_filters.cpp @@ -0,0 +1,332 @@ +/** + * Reference copies of the filter coefficient tables Phoenix used to ship. + * + * These tables were designed offline for a single audio sample rate of 24 ksps + * (192 ksps at the ADC, decimated by 8). Production code now generates them at + * run time from an analog spec so that they land on the same frequencies at any + * sample rate - see InitializeReceiveAudioFilterCoeffs() and + * InitializeTransmitFilterCoeffs() in DSP_FIR.cpp. + * + * The originals are kept here, byte for byte, so the test suite can measure the + * generated filters against what the radio actually used to do. They are test + * fixtures: nothing in the firmware links against this file, and changing a + * value here changes what the tests consider correct. + * + * code/tools/extract_filter_prototypes.py reads this file to re-derive the + * analog design constants that DSP_FIR.cpp generates from. + */ + +#include "reference_filters.h" + +const float32_t CW_AudioFilterCoeffs1_ref[30] = { +0.001045672652953040, 0.002091345305906081, 0.001045672652953040, 1.882585857812263620, -0.886768548424075709, //0 +0.002423227458078301, 0.004846454916156603, 0.002423227458078301, 1.884529132690991200, -0.894222042523304395, //1 +0.004829291756048423, 0.009658583512096846, 0.004829291756048423, 1.889384468765871410, -0.908701635790065021, //2 +0.007653393822000297, 0.015306787644000595, 0.007653393822000297, 1.898775913252934710, -0.929389488540935838, //3 +0.010174875101599359, 0.020349750203198718, 0.010174875101599359, 1.914432845416308200, -0.955132345822705675, //4 +0.011739876965796040, 0.023479753931592080, 0.011739876965796040, 1.937529526031872560, -0.984489033895056709, //5 +}; + +const float32_t CW_AudioFilterCoeffs2_ref[30] = { +0.001708601686569496, 0.003417203373138993, 0.001708601686569496, 1.849644394115178780, -0.856478800861456779, //0 +0.003960135567320385, 0.007920271134640770, 0.003960135567320385, 1.850063728088927160, -0.865904270358208716, //1 +0.007896110863694851, 0.015792221727389703, 0.007896110863694851, 1.852618721585121530, -0.884203165039901040, //2 +0.012527469693062619, 0.025054939386125238, 0.012527469693062619, 1.860233461308907320, -0.910343340081157804, //3 +0.016688500558372531, 0.033377001116745061, 0.016688500558372531, 1.876160539268528550, -0.942914541502018699, //4 +0.019316527156182765, 0.038633054312365529, 0.019316527156182765, 1.902936487120827410, -0.980202595745558458 //5 +}; + +const float32_t CW_AudioFilterCoeffs3_ref[30] = { + 0.002526205346474786, 0.005052410692949571, 0.002526205346474786, 1.816854531214501690, -0.826959352600400766, //0 + 0.005854757343402014, 0.011709514686804028, 0.005854757343402014, 1.814915209210166580, -0.838334238583774649, //1 + 0.011674800234072332, 0.023349600468144664, 0.011674800234072332, 1.813684163704128990, -0.860383364640418424, //2 + 0.018533877701340070, 0.037067755402680140, 0.018533877701340070, 1.817698744288731130, -0.891834255094091533, //3 + 0.024728610789430342, 0.049457221578860684, 0.024728610789430342, 1.832107309882979650, -0.931021753040700895, //4 + 0.028704640967983489, 0.057409281935966977, 0.028704640967983489, 1.861191141633472320, -0.976009705505406111 //5 +}; + +const float32_t CW_AudioFilterCoeffs4_ref[30] = { +0.004619667602890411, 0.009239335205780823, 0.004619667602890411, 1.751482350458491770, -0.769961020870053470, //0 +0.010697965393132404, 0.021395930786264807, 0.010697965393132404, 1.742463879042789540, -0.785255740615319220, //1 +0.021310846818856619, 0.042621693637713239, 0.021310846818856619, 1.729488942947587930, -0.814732330223014500, //2 +0.033824238912754968, 0.067648477825509937, 0.033824238912754968, 1.721199473469051890, -0.856496429120071845, //3 +0.045209476618282299, 0.090418953236564598, 0.045209476618282299, 1.727486625620660020, -0.908324532093789383, //4 +0.052728229128958234, 0.105456458257916469, 0.052728229128958234, 1.757051114234371440, -0.967964030750204318 //5 +}; + +const float32_t CW_AudioFilterCoeffs5_ref[30] = { +0.005895699392492981, 0.011791398784985962, 0.005895699392492981, 1.718777480550920830, -0.742360278120892780, //0 +0.013642906943512292, 0.027285813887024585, 0.013642906943512292, 1.705095001540683390, -0.759666629314732500, //1 +0.027147671747232219, 0.054295343494464438, 0.027147671747232219, 1.684291091887056610, -0.792881778875985654, //2 +0.043053647931610858, 0.086107295863221717, 0.043053647931610858, 1.667486185665950420, -0.839700777392394016, //3 +0.057557746560508744, 0.115115493121017487, 0.057557746560508744, 1.667342067521431660, -0.897573053763466633, //4 +0.067256465545230904, 0.134512931090461807, 0.067256465545230904, 1.695113706470476880, -0.964139568651400491, //5 +}; + +const float32_t CW_Filter_Coeffs2_ref[64] = { + 14.11649337493100380E-6, + 26.00645116880263790E-6, + 36.68870031589199950E-6, + 13.68412619593411960E-6, +-78.97178111806820770E-6, +-270.5543007271240870E-6, +-560.2226272240251320E-6, +-895.0536349136069700E-6, +-0.001157191426061149, +-0.001175458847337361, +-766.0401423335821390E-6, + 198.2564157371532760E-6, + 0.001706652959686771, + 0.003541671954793736, + 0.005255696919539346, + 0.006219189024066382, + 0.005752477145569307, + 0.003326972676367999, +-0.001205019703557342, +-0.007414366866133686, +-0.014201761944376253, +-0.019862184667500584, +-0.022329078747153890, +-0.019572975891131203, +-0.010081421213164831, + 0.006688661092777364, + 0.030004344392895913, + 0.057792920156185819, + 0.086867005627322011, + 0.113416964025259234, + 0.133680156710101528, + 0.144647031609622528, + 0.144647031609622528, + 0.133680156710101528, + 0.113416964025259234, + 0.086867005627322011, + 0.057792920156185819, + 0.030004344392895913, + 0.006688661092777364, +-0.010081421213164831, +-0.019572975891131203, +-0.022329078747153890, +-0.019862184667500584, +-0.014201761944376253, +-0.007414366866133686, +-0.001205019703557342, + 0.003326972676367999, + 0.005752477145569307, + 0.006219189024066382, + 0.005255696919539346, + 0.003541671954793736, + 0.001706652959686771, + 198.2564157371532760E-6, +-766.0401423335821390E-6, +-0.001175458847337361, +-0.001157191426061149, +-895.0536349136069700E-6, +-560.2226272240251320E-6, +-270.5543007271240870E-6, +-78.97178111806820770E-6, + 13.68412619593411960E-6, + 36.68870031589199950E-6, + 26.00645116880263790E-6, + 14.11649337493100380E-6 +}; + +const float32_t EQ_Band1Coeffs_ref[20] = { // fc=198.425 BW=60.4, 4 pole Gaussian 1/3 octave + -0.010740354324803263, 0.000000000000000000, 0.010740354324803263, 1.977760288071182870, -0.980176703912204905, + -0.010717730957944621, 0.000000000000000000, 0.010717730957944621, 1.975162619174023470, -0.978112070242933007, + -0.012264037490550410, 0.000000000000000000, 0.012264037490550410, 1.982731279215446560, -0.984673419072692013, + -0.012192623012836674, 0.000000000000000000, 0.012192623012836674, 1.975260232124987250, -0.978939586475078283 +}; + +const float32_t EQ_Band2Coeffs_ref[20] = { // fc=250 BW=72, 4 pole Gaussian 1/3 octave + -0.012933654120114928, 0.000000000000000000, 0.012933654120114928, 1.972230388754230070, -0.976074773963381825, + -0.012902245256420676, 0.000000000000000000, 0.012902245256420676, 1.969054007796797960, -0.973704415266133827, + -0.014776626826402213, 0.000000000000000000, 0.014776626826402213, 1.978267317735213690, -0.981387851708867331, + -0.014677312538120893, 0.000000000000000000, 0.014677312538120893, 1.969044730844959010, -0.974791905478009535 +}; + +const float32_t EQ_Band3Coeffs_ref[20] = { // fc=314.98 BW=91.6, 4 pole Gaussian 1/3 octave + -0.016447315569307643, 0.000000000000000000, 0.016447315569307643, 1.963525244582037700, -0.969599143160199128, + -0.016395762539476878, 0.000000000000000000, 0.016395762539476878, 1.959197203291359160, -0.966559998362339301, + -0.018810466262295416, 0.000000000000000000, 0.018810466262295416, 1.971448267819779780, -0.976369169522296243, + -0.018647471180391263, 0.000000000000000000, 0.018647471180391263, 1.958784738577257430, -0.967908806523534615 +}; + +const float32_t EQ_Band4Coeffs_ref[20] = { // fc=400 BW=117, 4 pole Gaussian 1/3 octave + -0.021107226123143540, 0.000000000000000000, 0.021107226123143540, 1.951288180543548690, -0.961023369255779913, + -0.021020814241623810, 0.000000000000000000, 0.021020814241623810, 1.945259100240296800, -0.957088989767100218, + -0.024173376764279130, 0.000000000000000000, 0.024173376764279130, 1.961858154037972480, -0.969728310529273663, + -0.023900201823886549, 0.000000000000000000, 0.023900201823886549, 1.944062548127177160, -0.958769747478319112 +}; + +const float32_t EQ_Band5Coeffs_ref[20] = { // fc=500 BW=140, 4 pole Gaussian 1/3 octave + -0.025434986078352932, 0.000000000000000000, 0.025434986078352932, 1.937763026417761440, -0.952954919636953890, + -0.025313478543573947, 0.000000000000000000, 0.025313478543573947, 1.930070471504943040, -0.948402481405460684, + -0.029161895846570862, 0.000000000000000000, 0.029161895846570862, 1.950890858299041410, -0.963270463464314108, + -0.028777241258184545, 0.000000000000000000, 0.028777241258184545, 1.927932418232654040, -0.950564622747441468 +}; + +const float32_t EQ_Band6Coeffs_ref[20] = { // fc=630 BW=185, 4 pole Gaussian 1/3 octave + -0.034013087998603600, 0.000000000000000000, 0.034013087998603600, 1.913595532476039860, -0.937338704287993485, + -0.033779293097819303, 0.000000000000000000, 0.033779293097819303, 1.901882114205436290, -0.930895742996760700, + -0.039105400046163162, 0.000000000000000000, 0.039105400046163162, 1.932301402855366890, -0.951404949215225448, + -0.038366657914332684, 0.000000000000000000, 0.038366657914332684, 1.897086382739862300, -0.933431909185264641 +}; + +const float32_t EQ_Band7Coeffs_ref[20] = { // fc=793 BW=215, 4 pole Gaussian 1/3 octave + -0.040044359954689926, 0.000000000000000000, 0.040044359954689926, 1.888394203397243400, -0.925981923711014732, + -0.039740115320392844, 0.000000000000000000, 0.039740115320392844, 1.873614715169800600, -0.918946600083319409, + -0.046099397613266917, 0.000000000000000000, 0.046099397613266917, 1.911355633900693180, -0.942046227315978979, + -0.045135819293132796, 0.000000000000000000, 0.045135819293132796, 1.866325392810697090, -0.922355399057854686 +}; + +const float32_t EQ_Band8Coeffs_ref[20] = { // fc=1000 BW=270, 4 pole Gaussian 1/3 octave + -0.050982851195012183, 0.000000000000000000, 0.050982851195012183, 1.846967337210932980, -0.905880344373915625, + -0.050478998559837972, 0.000000000000000000, 0.050478998559837972, 1.825700576400176360, -0.896927722306557262, + -0.058875166968515282, 0.000000000000000000, 0.058875166968515282, 1.878257463261961750, -0.926279459225752610, + -0.057280286665948199, 0.000000000000000000, 0.057280286665948199, 1.812808299361427180, -0.901187303394047512 +}; + +const float32_t EQ_Band9Coeffs_ref[20] = { //1259 326 4 pole Gaussian 1/3 octave + -0.062436305349349887, 0.000000000000000000, 0.062436305349349887, 1.792407090214479080, -0.884627616406695516, + -0.061695827132588178, 0.000000000000000000, 0.061695827132588178, 1.763182364434806800, -0.874136164738794852, + -0.072306422223616690, 0.000000000000000000, 0.072306422223616690, 1.833501777433602210, -0.909146391672414067, + -0.069961857687408896, 0.000000000000000000, 0.069961857687408896, 1.742557606724184360, -0.879666957860237075 +}; + +const float32_t EQ_Band10Coeffs_ref[20] = { // Band3 //1587 380 4 pole Gaussian 1/3 octave + -0.074363508404526421, 0.000000000000000000, 0.074363508404526421, 1.717508353369523010, -0.862211252084035151, + -0.073370934748750075, 0.000000000000000000, 0.073370934748750075, 1.678381089046226960, -0.850702809396297943, + -0.086324197408935752, 0.000000000000000000, 0.086324197408935752, 1.770356988912942690, -0.890495750927825402, + -0.0831792956517105050, .000000000000000000, 0.083179295651710505, 1.647225955992196010, -0.858053843143523842 +}; + +const float32_t EQ_Band11Coeffs_ref[20] = { // 2000 480 4 pole 4 pole Gaussian 1/3 octave + -0.095836703240171059, 0.000000000000000000, 0.095836703240171059, 1.600465210710192880, -0.822735930728153764, + -0.094139069783896759, 0.000000000000000000, 0.094139069783896759, 1.542179833257436350, -0.808162140160850195, + -0.111862031820526620, 0.000000000000000000, 0.111862031820526620, 1.675022371378555920, -0.858900156431318784, + -0.106503914399111971, 0.000000000000000000, 0.106503914399111971, 1.490054957243781340, -0.817759406379379050 +}; + +const float32_t EQ_Band12Coeffs_ref[20] = { // 2500 579 4 pole Gaussian 1/3 octave + -0.117879553771682077, 0.000000000000000000, 0.117879553771682077, 1.446475829403250920, -0.781724147199137853, + -0.115383310539578524, 0.000000000000000000, 0.115383310539578524, 1.364990025835680850, -0.765170185554548188, + -0.138197674814651450, 0.000000000000000000, 0.138197674814651450, 1.546474742602351290, -0.825007082271826175, + -0.130355600849362346, 0.000000000000000000, 0.130355600849362346, 1.285783233479567580, -0.778191775359172500 +}; + +const float32_t EQ_Band13Coeffs_ref[20] = { //3150 730 4 pole Gaussian 1/3 octave + -0.150762354328435849, 0.000000000000000000, 0.150762354328435849, 1.219119807012296160, -0.720763563050070721, + -0.146749880416786549, 0.000000000000000000, 0.146749880416786549, 1.100462092025051410, -0.701580757063202998, + -0.177820152149393451, 0.000000000000000000, 0.177820152149393451, 1.358721947950491950, -0.774654638713877741, + -0.165372194155001706, 0.000000000000000000, 0.165372194155001706, 0.976661905865581326, -0.720426429558091441 +}; + +const float32_t EQ_Band14Coeffs_ref[20] = { //4000 919 4 pole Gaussian 1/3 octave + -0.191002547843707293, 0.000000000000000000, 0.191002547843707293, 0.899547452783356571, -0.644594993669154070, + -0.185284629488361025, 0.000000000000000000, 0.185284629488361025, 0.731207869008696054, -0.625298174921578354, + -0.226011710394339427, 0.000000000000000000, 0.226011710394339427, 1.091251019040685220, -0.709544302434661267, + -0.208696039181478332, 0.000000000000000000, 0.208696039181478332, 0.546857223443984242, -0.655183243751105593 +}; + +const float32_t FIR_int3_12ksps_48tap_2k7_ref[48] = { + -2.285169471669272310E-6, +-33.85457593285185850E-6, +-90.05495214272963270E-6, +-102.5104398169568180E-6, + 58.41569034528380660E-6, + 454.7904191315104190E-6, + 871.4162433760077420E-6, + 749.7881965886456330E-6, +-468.4956850258753320E-6, +-0.002616105921239791, +-0.004246098300098818, +-0.003078738032270572, + 0.002226282725246520, + 0.009889569653623405, + 0.014414561535852018, + 0.009226938890949424, +-0.007959807904613685, +-0.030336057178768423, +-0.042078062750789499, +-0.025361321875102511, + 0.028447546456669172, + 0.110201064956298028, + 0.193569812629121624, + 0.246261318040085941, + 0.246261318040085941, + 0.193569812629121624, + 0.110201064956298028, + 0.028447546456669172, +-0.025361321875102511, +-0.042078062750789499, +-0.030336057178768423, +-0.007959807904613685, + 0.009226938890949424, + 0.014414561535852018, + 0.009889569653623405, + 0.002226282725246520, +-0.003078738032270572, +-0.004246098300098818, +-0.002616105921239791, +-468.4956850258753320E-6, + 749.7881965886456330E-6, + 871.4162433760077420E-6, + 454.7904191315104190E-6, + 58.41569034528380660E-6, +-102.5104398169568180E-6, +-90.05495214272963270E-6, +-33.85457593285185850E-6, +-2.285169471669272310E-6, +}; + +const float32_t coeffs12K_8K_LPF_FIR_ref[48] = { + 292.7121266034897080E-6, +-488.3180342813371910E-6, + 645.8040165558306850E-6, +-638.1198881550581060E-6, + 309.3480302449689250E-6, + 476.3212758864665380E-6, +-0.001765071979170106, + 0.003440388897049947, +-0.005171865011484901, + 0.006413537425933360, +-0.006472731205884527, + 0.004654709846338252, +-466.7626569695900680E-6, +-0.006156455313021720, + 0.014659150255493822, +-0.023755580034778335, + 0.031441372818989677, +-0.035120434578160220, + 0.031776095760559758, +-0.017990662560858503, +-0.010720286031718308, + 0.063232870546293687, +-0.170792976311007899, + 0.622296121514180789, + 0.622296121514180789, +-0.170792976311007899, + 0.063232870546293687, +-0.010720286031718308, +-0.017990662560858503, + 0.031776095760559758, +-0.035120434578160220, + 0.031441372818989677, +-0.023755580034778335, + 0.014659150255493822, +-0.006156455313021720, +-466.7626569695900680E-6, + 0.004654709846338252, +-0.006472731205884527, + 0.006413537425933360, +-0.005171865011484901, + 0.003440388897049947, +-0.001765071979170106, + 476.3212758864665380E-6, + 309.3480302449689250E-6, +-638.1198881550581060E-6, + 645.8040165558306850E-6, +-488.3180342813371910E-6, + 292.7121266034897080E-6, + +}; diff --git a/code/test/reference_filters.h b/code/test/reference_filters.h new file mode 100644 index 0000000..7cd7825 --- /dev/null +++ b/code/test/reference_filters.h @@ -0,0 +1,52 @@ +/** + * Reference copies of the filter coefficient tables Phoenix used to ship. + * See reference_filters.cpp for what these are and why they are kept. + * + * Test-only. Not part of the firmware build. + */ + +#ifndef REFERENCE_FILTERS_H +#define REFERENCE_FILTERS_H + +#include "arm_math.h" + +/** CW audio lowpass filters: 12 pole Chebyshev type I, 0.02 dB ripple, 24 ksps. + * 6 biquad sections of {b0, b1, b2, -a1, -a2}. Labelled cutoffs, in order: + * 840, 1080, 1320, 1800 and 2000 Hz. */ +extern const float32_t CW_AudioFilterCoeffs1_ref[30]; +extern const float32_t CW_AudioFilterCoeffs2_ref[30]; +extern const float32_t CW_AudioFilterCoeffs3_ref[30]; +extern const float32_t CW_AudioFilterCoeffs4_ref[30]; +extern const float32_t CW_AudioFilterCoeffs5_ref[30]; + +/** CW decoder input filter: 64 tap Parks-McClellan lowpass, 24 ksps. + * -3 dB at 1562 Hz, -6 dB at 1749 Hz, DC gain 0.9992. */ +extern const float32_t CW_Filter_Coeffs2_ref[64]; + +/** Audio equaliser cells: 4 stagger-tuned bandpass biquads each, 24 ksps, + * peak normalised to unity. Centres run 198.425 Hz to 4000 Hz. */ +extern const float32_t EQ_Band1Coeffs_ref[20]; +extern const float32_t EQ_Band2Coeffs_ref[20]; +extern const float32_t EQ_Band3Coeffs_ref[20]; +extern const float32_t EQ_Band4Coeffs_ref[20]; +extern const float32_t EQ_Band5Coeffs_ref[20]; +extern const float32_t EQ_Band6Coeffs_ref[20]; +extern const float32_t EQ_Band7Coeffs_ref[20]; +extern const float32_t EQ_Band8Coeffs_ref[20]; +extern const float32_t EQ_Band9Coeffs_ref[20]; +extern const float32_t EQ_Band10Coeffs_ref[20]; +extern const float32_t EQ_Band11Coeffs_ref[20]; +extern const float32_t EQ_Band12Coeffs_ref[20]; +extern const float32_t EQ_Band13Coeffs_ref[20]; +extern const float32_t EQ_Band14Coeffs_ref[20]; + +/** Transmit interpolate-by-2 (12k -> 24k). This is what set the transmit audio + * bandwidth: 48 tap Kaiser lowpass, -3 dB at 2759 Hz when run at 24 ksps. */ +extern const float32_t FIR_int3_12ksps_48tap_2k7_ref[48]; + +/** Transmit decimate-by-2 (24k -> 12k). Note this table is flat to 0.425 * Fs, + * well past the 0.25 * Fs a decimate-by-2 stage needs, so it aliases. Kept for + * the before/after comparison, not as a target to reproduce. */ +extern const float32_t coeffs12K_8K_LPF_FIR_ref[48]; + +#endif // REFERENCE_FILTERS_H diff --git a/code/test/transmit/transmit_test.py b/code/test/transmit/transmit_test.py new file mode 100644 index 0000000..6b59c65 --- /dev/null +++ b/code/test/transmit/transmit_test.py @@ -0,0 +1,540 @@ +#!/usr/bin/env python3 +""" +Transmit PTT Signal Integrity Test + +Repeatedly engages PTT on a radio transmitter via an Analog Discovery 2, +captures I/Q output waveforms, and analyzes them for discontinuities and +signal quality issues. + +Usage: + python transmit_test.py # 100 iterations with defaults + python transmit_test.py -n 5 # quick 5-iteration test + python transmit_test.py --help # show all options +""" + +import sys +import os +import time +import signal as signal_module +import argparse +from ctypes import * +from pathlib import Path +from datetime import datetime + +import numpy as np +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +# Add Waveforms SDK samples directory so we can import dwfconstants +sys.path.insert(0, "/usr/share/digilent/waveforms/samples/py") +from dwfconstants import * + + +# --------------------------------------------------------------------------- +# SDK helpers +# --------------------------------------------------------------------------- + +def load_dwf(): + """Load the Waveforms SDK shared library.""" + if sys.platform.startswith("win"): + return cdll.dwf + elif sys.platform.startswith("darwin"): + return cdll.LoadLibrary("/Library/Frameworks/dwf.framework/dwf") + else: + return cdll.LoadLibrary("libdwf.so") + + +def dwf_error_msg(dwf_lib): + """Return the last DWF error message as a string.""" + buf = create_string_buffer(512) + dwf_lib.FDwfGetLastErrorMsg(buf) + return buf.value.decode() + + +# --------------------------------------------------------------------------- +# Hardware configuration +# --------------------------------------------------------------------------- + +def configure_device(dwf_lib, args): + """Open the AD2 and configure all I/O. Returns device handle.""" + hdwf = c_int() + + version = create_string_buffer(16) + dwf_lib.FDwfGetVersion(version) + print(f"DWF Version: {version.value.decode()}") + + print("Opening device...") + dwf_lib.FDwfDeviceOpen(c_int(-1), byref(hdwf)) + if hdwf.value == hdwfNone.value: + print(f"Failed to open device: {dwf_error_msg(dwf_lib)}") + sys.exit(1) + + # Manual configure mode + dwf_lib.FDwfDeviceAutoConfigureSet(hdwf, c_int(0)) + + # --- Analog output: W1 = 500 Hz sine, 50 mV amplitude --- + ch_out = c_int(0) + dwf_lib.FDwfAnalogOutNodeEnableSet(hdwf, ch_out, AnalogOutNodeCarrier, c_int(1)) + dwf_lib.FDwfAnalogOutNodeFunctionSet(hdwf, ch_out, AnalogOutNodeCarrier, funcSine) + dwf_lib.FDwfAnalogOutNodeFrequencySet(hdwf, ch_out, AnalogOutNodeCarrier, c_double(500.0)) + dwf_lib.FDwfAnalogOutNodeAmplitudeSet(hdwf, ch_out, AnalogOutNodeCarrier, c_double(0.05)) + dwf_lib.FDwfAnalogOutNodeOffsetSet(hdwf, ch_out, AnalogOutNodeCarrier, c_double(0.0)) + dwf_lib.FDwfAnalogOutConfigure(hdwf, ch_out, c_int(1)) # start + print("W1: 500 Hz sine, 50 mV amplitude — running") + + # --- Scope: Ch1 and Ch2 --- + sample_rate = args.sample_rate + n_samples = int(sample_rate * args.acquire_time) + + for ch in [0, 1]: + dwf_lib.FDwfAnalogInChannelEnableSet(hdwf, c_int(ch), c_int(1)) + dwf_lib.FDwfAnalogInChannelRangeSet(hdwf, c_int(ch), c_double(5.0)) # AD2 minimum HW range + dwf_lib.FDwfAnalogInChannelOffsetSet(hdwf, c_int(ch), c_double(1.6)) # center window at 1.6V + + dwf_lib.FDwfAnalogInAcquisitionModeSet(hdwf, acqmodeRecord) + dwf_lib.FDwfAnalogInFrequencySet(hdwf, c_double(sample_rate)) + dwf_lib.FDwfAnalogInRecordLengthSet(hdwf, c_double(args.acquire_time)) + dwf_lib.FDwfAnalogInConfigure(hdwf, c_int(1), c_int(0)) # apply config, don't start + print(f"Scope: {sample_rate/1000:.0f} kHz, {args.acquire_time*1000:.0f} ms " + f"({n_samples} samples), range 5 V, offset +1.6 V") + + # --- Digital IO: DIO-0 as output, default HIGH (PTT off) --- + dwf_lib.FDwfDigitalIOOutputEnableSet(hdwf, c_int(0x0001)) + dwf_lib.FDwfDigitalIOOutputSet(hdwf, c_int(0x0001)) # HIGH = PTT off + dwf_lib.FDwfDigitalIOConfigure(hdwf) + print("DIO-0: output, HIGH (PTT disengaged)") + + # --- DigitalIn: capture DIO 1-4 (Teensy pins 28-31, Flag() bus) --- + # AD2 internal clock is 100 MHz; divider chosen to match scope sample rate. + if args.capture_flag: + clk_hz = c_double() + dwf_lib.FDwfDigitalInInternalClockInfo(hdwf, byref(clk_hz)) + divider = int(round(clk_hz.value / sample_rate)) + dwf_lib.FDwfDigitalInDividerSet(hdwf, c_uint(divider)) + # 8-bit sample format covers DIO 0..7 (we use DIO 1..4) + dwf_lib.FDwfDigitalInSampleFormatSet(hdwf, c_int(8)) + dwf_lib.FDwfDigitalInAcquisitionModeSet(hdwf, acqmodeRecord) + dwf_lib.FDwfDigitalInInputOrderSet(hdwf, c_int(1)) + # In record mode the run is unbounded; we stop after n_samples are read. + print(f"DigitalIn: {clk_hz.value/divider/1000:.1f} kHz, " + f"capturing DIO 1-4 (Flag bus) in record mode") + + # Wait for offset stabilization + print("Waiting 2 s for offset stabilization...") + time.sleep(2) + + return hdwf, sample_rate, n_samples + + +# --------------------------------------------------------------------------- +# PTT control +# --------------------------------------------------------------------------- + +def ptt_engage(dwf_lib, hdwf): + """Set DIO-0 LOW to engage PTT (radio transmits).""" + dwf_lib.FDwfDigitalIOOutputSet(hdwf, c_int(0x0000)) + dwf_lib.FDwfDigitalIOConfigure(hdwf) + + +def ptt_disengage(dwf_lib, hdwf): + """Set DIO-0 HIGH to disengage PTT.""" + dwf_lib.FDwfDigitalIOOutputSet(hdwf, c_int(0x0001)) + dwf_lib.FDwfDigitalIOConfigure(hdwf) + + +# --------------------------------------------------------------------------- +# Data acquisition +# --------------------------------------------------------------------------- + +def acquire_data(dwf_lib, hdwf, n_samples, capture_flag=False): + """Acquire record-mode data from both scope channels. + + If capture_flag is True, also acquire 8-bit DIO snapshots in parallel + (DIO 1-4 carry the firmware Flag() bus; DIO-0 is the PTT output). + + Returns (ch1_array, ch2_array, dio_array_or_None, lost, corrupted). + """ + buf1 = (c_double * n_samples)() + buf2 = (c_double * n_samples)() + dio_buf = (c_uint8 * n_samples)() if capture_flag else None + + # Start digital first so it's armed when scope acquisition begins + if capture_flag: + dwf_lib.FDwfDigitalInConfigure(hdwf, c_int(0), c_int(1)) + dwf_lib.FDwfAnalogInConfigure(hdwf, c_int(0), c_int(1)) + + sts = c_byte() + c_available = c_int() + c_lost = c_int() + c_corrupted = c_int() + total_samples = 0 + total_lost = 0 + total_corrupted = 0 + + while total_samples < n_samples: + dwf_lib.FDwfAnalogInStatus(hdwf, c_int(1), byref(sts)) + + if total_samples == 0 and sts.value in ( + DwfStateConfig.value, DwfStatePrefill.value, DwfStateArmed.value + ): + continue + + dwf_lib.FDwfAnalogInStatusRecord( + hdwf, byref(c_available), byref(c_lost), byref(c_corrupted) + ) + + total_lost += c_lost.value + total_corrupted += c_corrupted.value + total_samples += c_lost.value # count lost as consumed + + if c_available.value == 0: + continue + + avail = c_available.value + if total_samples + avail > n_samples: + avail = n_samples - total_samples + + dwf_lib.FDwfAnalogInStatusData( + hdwf, c_int(0), + byref(buf1, sizeof(c_double) * total_samples), c_int(avail) + ) + dwf_lib.FDwfAnalogInStatusData( + hdwf, c_int(1), + byref(buf2, sizeof(c_double) * total_samples), c_int(avail) + ) + total_samples += avail + + ch1 = np.frombuffer(buf1, dtype=np.float64).copy() + ch2 = np.frombuffer(buf2, dtype=np.float64).copy() + + dio = None + if capture_flag: + # DigitalIn record mode: pull samples as they arrive until we have n_samples. + d_avail = c_int(); d_lost = c_int(); d_corrupted = c_int() + d_sts = c_byte() + d_total = 0 + # Bounded loop — at the same sample rate as scope, this should fill in + # acquire_time seconds, with very small slack for SDK overhead. + deadline = time.monotonic() + 5.0 + while d_total < n_samples and time.monotonic() < deadline: + dwf_lib.FDwfDigitalInStatus(hdwf, c_int(1), byref(d_sts)) + dwf_lib.FDwfDigitalInStatusRecord( + hdwf, byref(d_avail), byref(d_lost), byref(d_corrupted) + ) + avail = d_avail.value + if avail == 0: + if d_sts.value == DwfStateDone.value: + break + continue + if d_total + avail > n_samples: + avail = n_samples - d_total + dwf_lib.FDwfDigitalInStatusData( + hdwf, + byref(dio_buf, d_total), # uint8 buf, byte offset == sample offset + c_int(avail), + ) + d_total += avail + # Stop digital acquisition cleanly + dwf_lib.FDwfDigitalInConfigure(hdwf, c_int(0), c_int(0)) + dio = np.frombuffer(dio_buf, dtype=np.uint8).copy() + + return ch1, ch2, dio, total_lost, total_corrupted + + +# --------------------------------------------------------------------------- +# Signal analysis +# --------------------------------------------------------------------------- + +def check_amplitude(signal, min_rms): + """Check that the AC-coupled RMS amplitude exceeds min_rms. + + Returns (passed, rms_value). + """ + ac = signal - np.mean(signal) + rms = np.sqrt(np.mean(ac ** 2)) + return rms >= min_rms, rms + + +def check_discontinuities(signal): + """Check for sudden jumps/discontinuities in the waveform. + + For a pure sinusoid, max(|derivative|) / rms(derivative) = sqrt(2). + A ratio much larger than that indicates a discontinuity. + + Returns (passed, peak_to_rms_ratio). + """ + deriv = np.diff(signal) + rms_deriv = np.sqrt(np.mean(deriv ** 2)) + if rms_deriv == 0: + return False, float("inf") + ratio = np.max(np.abs(deriv)) / rms_deriv + # sqrt(2) ~ 1.414 for pure sine; allow up to 5.0 for noise margin + return ratio < 5.0, ratio + + +def check_spectral_purity(signal, sample_rate, expected_freq, min_snr_db): + """Check that the signal is a clean sinusoid via FFT. + + Returns (passed, snr_db, dominant_freq). + """ + ac = signal - np.mean(signal) + n = len(ac) + windowed = ac * np.hanning(n) + + spectrum = np.abs(np.fft.rfft(windowed)) + freqs = np.fft.rfftfreq(n, d=1.0 / sample_rate) + + # Find dominant frequency + peak_bin = np.argmax(spectrum) + dominant_freq = freqs[peak_bin] + + # Frequency check + freq_ok = abs(dominant_freq - expected_freq) < 50.0 + + # SNR: power in fundamental +/- 3 bins vs. everything else + fund_lo = max(0, peak_bin - 3) + fund_hi = min(len(spectrum), peak_bin + 4) # exclusive + power = spectrum ** 2 + fund_power = np.sum(power[fund_lo:fund_hi]) + total_power = np.sum(power[1:]) # exclude DC bin + noise_power = total_power - fund_power + + if noise_power <= 0: + snr_db = 100.0 # effectively infinite + else: + snr_db = 10.0 * np.log10(fund_power / noise_power) + + passed = freq_ok and snr_db >= min_snr_db + return passed, snr_db, dominant_freq + + +def analyze_channel(signal, sample_rate, name, min_rms, min_snr_db, + expected_freq=500.0): + """Run all signal quality checks on one channel. + + Returns a dict with pass/fail, metrics, and failure reasons. + """ + reasons = [] + + amp_ok, rms = check_amplitude(signal, min_rms) + if not amp_ok: + reasons.append(f"{name}: low amplitude (RMS={rms:.4f} V)") + + disc_ok, ratio = check_discontinuities(signal) + if not disc_ok: + reasons.append(f"{name}: discontinuity (peak/rms deriv={ratio:.1f})") + + spec_ok, snr_db, dom_freq = check_spectral_purity( + signal, sample_rate, expected_freq, min_snr_db + ) + if not spec_ok: + if abs(dom_freq - expected_freq) >= 50.0: + reasons.append(f"{name}: unexpected freq ({dom_freq:.1f} Hz)") + if snr_db < min_snr_db: + reasons.append(f"{name}: low SNR ({snr_db:.1f} dB)") + + return { + "name": name, + "passed": len(reasons) == 0, + "rms": rms, + "snr_db": snr_db, + "dominant_freq": dom_freq, + "deriv_ratio": ratio, + "failure_reasons": reasons, + } + + +# --------------------------------------------------------------------------- +# Data saving +# --------------------------------------------------------------------------- + +def save_waveform(outdir, iteration, ch1, ch2, sample_rate, dio=None): + """Save raw waveform data as .npz and a plot as .png.""" + fail_dir = Path(outdir) / "failures" + fail_dir.mkdir(parents=True, exist_ok=True) + ts = datetime.now().strftime("%Y%m%d_%H%M%S") + stem = f"fail_iter{iteration:04d}_{ts}" + + npz_path = fail_dir / f"{stem}.npz" + if dio is not None: + np.savez(npz_path, ch1=ch1, ch2=ch2, sample_rate=sample_rate, dio=dio) + else: + np.savez(npz_path, ch1=ch1, ch2=ch2, sample_rate=sample_rate) + + png_path = fail_dir / f"{stem}.png" + t_ms = np.arange(len(ch1)) / sample_rate * 1000 + fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 6), sharex=True) + ax1.plot(t_ms, ch1, linewidth=0.5) + ax1.set_ylabel("Voltage (V)") + ax1.set_title(f"Iteration {iteration} - I channel") + ax1.grid(True, alpha=0.3) + ax2.plot(t_ms, ch2, linewidth=0.5) + ax2.set_ylabel("Voltage (V)") + ax2.set_xlabel("Time (ms)") + ax2.set_title(f"Iteration {iteration} - Q channel") + ax2.grid(True, alpha=0.3) + fig.tight_layout() + fig.savefig(png_path, dpi=150) + plt.close(fig) + + return npz_path, png_path + + +# --------------------------------------------------------------------------- +# Main test loop +# --------------------------------------------------------------------------- + +def run_test(args): + dwf_lib = load_dwf() + hdwf, sample_rate, n_samples = configure_device(dwf_lib, args) + + # Safety: ensure PTT is disengaged on exit + def cleanup(*_): + print("\nDisengaging PTT and closing device...") + ptt_disengage(dwf_lib, hdwf) + dwf_lib.FDwfAnalogOutReset(hdwf, c_int(0)) + dwf_lib.FDwfDeviceCloseAll() + + def sigint_handler(sig, frame): + cleanup() + sys.exit(1) + + signal_module.signal(signal_module.SIGINT, sigint_handler) + + results = [] + + try: + for i in range(args.iterations): + iter_num = i + 1 + print(f"\n--- Iteration {iter_num}/{args.iterations} ---") + + ptt_engage(dwf_lib, hdwf) + time.sleep(args.settle_time) + + ch1, ch2, dio, lost, corrupted = acquire_data( + dwf_lib, hdwf, n_samples, capture_flag=args.capture_flag + ) + + ptt_disengage(dwf_lib, hdwf) + + if lost > 0: + print(f" WARNING: {lost} samples lost") + if corrupted > 0: + print(f" WARNING: {corrupted} samples corrupted") + + res_i = analyze_channel( + ch1, sample_rate, "I", args.min_rms, args.min_snr + ) + res_q = analyze_channel( + ch2, sample_rate, "Q", args.min_rms, args.min_snr + ) + + passed = res_i["passed"] and res_q["passed"] + status = "PASS" if passed else "FAIL" + + print(f" [{status}] I: RMS={res_i['rms']:.4f}V " + f"SNR={res_i['snr_db']:.1f}dB " + f"freq={res_i['dominant_freq']:.1f}Hz " + f"Q: RMS={res_q['rms']:.4f}V " + f"SNR={res_q['snr_db']:.1f}dB " + f"freq={res_q['dominant_freq']:.1f}Hz") + + if not passed: + for r in res_i["failure_reasons"] + res_q["failure_reasons"]: + print(f" -> {r}") + npz_path, png_path = save_waveform( + args.output_dir, iter_num, ch1, ch2, sample_rate, dio + ) + print(f" Saved: {npz_path}") + print(f" Plot: {png_path}") + elif args.save_all: + save_waveform(args.output_dir, iter_num, ch1, ch2, sample_rate, dio) + + results.append({ + "iteration": iter_num, + "passed": passed, + "i": res_i, + "q": res_q, + "lost": lost, + "corrupted": corrupted, + }) + + if i < args.iterations - 1: + time.sleep(args.interval) + + # --- Summary --- + print("\n" + "=" * 64) + total = len(results) + n_passed = sum(1 for r in results if r["passed"]) + n_failed = total - n_passed + print(f"SUMMARY: {n_passed}/{total} passed, {n_failed}/{total} failed") + print("=" * 64) + + if n_failed > 0: + print("\nFailed iterations:") + for r in results: + if not r["passed"]: + reasons = (r["i"]["failure_reasons"] + + r["q"]["failure_reasons"]) + print(f" #{r['iteration']}: {', '.join(reasons)}") + + i_snrs = [r["i"]["snr_db"] for r in results] + q_snrs = [r["q"]["snr_db"] for r in results] + print(f"\nI channel SNR: min={min(i_snrs):.1f} " + f"max={max(i_snrs):.1f} mean={np.mean(i_snrs):.1f} dB") + print(f"Q channel SNR: min={min(q_snrs):.1f} " + f"max={max(q_snrs):.1f} mean={np.mean(q_snrs):.1f} dB") + + sys.exit(0 if n_failed == 0 else 1) + + finally: + cleanup() + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + +def main(): + parser = argparse.ArgumentParser( + description="Transmit PTT signal integrity test using Analog Discovery 2" + ) + parser.add_argument( + "-n", "--iterations", type=int, default=100, + help="number of PTT test cycles (default: 100)") + parser.add_argument( + "--settle-time", type=float, default=0.5, + help="seconds to wait after PTT engage before capture (default: 0.5)") + parser.add_argument( + "--acquire-time", type=float, default=0.1, + help="scope acquisition duration in seconds (default: 0.1)") + parser.add_argument( + "--interval", type=float, default=0.5, + help="seconds to wait between iterations (default: 0.5)") + parser.add_argument( + "--sample-rate", type=float, default=100000, + help="scope sample rate in Hz (default: 100000)") + parser.add_argument( + "--min-snr", type=float, default=20.0, + help="minimum SNR in dB to pass spectral purity check (default: 20.0)") + parser.add_argument( + "--min-rms", type=float, default=0.005, + help="minimum RMS amplitude in V to pass (default: 0.005)") + parser.add_argument( + "--output-dir", type=str, default=".", + help="directory for saving failure data (default: current dir)") + parser.add_argument( + "--save-all", action="store_true", + help="save waveform data for all iterations, not just failures") + parser.add_argument( + "--capture-flag", action="store_true", + help="also capture AD2 DIO 1-4 (Teensy pins 28-31, the Flag() bus) " + "in parallel with the scope; saved into the .npz as 'dio' uint8") + + args = parser.parse_args() + run_test(args) + + +if __name__ == "__main__": + main() diff --git a/code/tools/README.md b/code/tools/README.md new file mode 100644 index 0000000..9025cb7 --- /dev/null +++ b/code/tools/README.md @@ -0,0 +1,479 @@ +# Phoenix SDR Bench Tools + +Host-side Python tools for testing and diagnosing the radio. None of them are +part of the firmware build; they drive the radio over its USB serial ports and +read it back through test instruments on the bench. + +| Tool | What it is for | Hardware needed | +|---|---|---| +| [`filter_hil/`](filter_hil/README.md) | Receive filter rate-independence test suite | AD2 + radio | +| [`tx_filter_hil/`](tx_filter_hil/README.md) | Transmit filter rate-independence test suite | AD2 + radio | +| [`receive_chain_test.py`](#receive_chain_testpy) | Check the demodulated audio for a clean, uninterrupted tone | AD2 + radio + signal generator | +| [`../test/transmit/transmit_test.py`](#transmit_testpy) | Check the exciter I/Q outputs across repeated PTT cycles | AD2 + radio | +| [`flag_timing.py`](#flag_timingpy) | Measure firmware execution timing from `Flag()` pin transitions | AD2 + radio | +| [`plot_flag_timing.py`](#plot_flag_timingpy) | Plot distributions from a `flag_timing.py` capture | none | +| [`set_radio_time.py`](#set_radio_timepy) | Set the radio's clock from the PC | radio | +| [`Set-RadioTime.ps1`](#set-radiotimeps1) | The same, for Windows without Python | radio | +| [`serial_diag.py`](#serial_diagpy) | Interactive CAT control + live diagnostic monitor | radio | +| [`usb_audio_test.py`](#usb_audio_testpy) | Send a test tone into the radio's USB audio input | radio | +| [`siglent_capture.py`](#siglent_capturepy) | Bare two-channel capture from a networked SIGLENT scope | SIGLENT scope | +| [`extract_filter_prototypes.py`](#extract_filter_prototypespy) | Recover analog specs from the old frozen filter tables | none | + +"AD2" is a Digilent Analog Discovery 2. + +## Setup + +Everything runs from a virtual environment in this directory. It is not +versioned — create it once: + +```bash +cd code/tools +python3 -m venv venv +./venv/bin/pip install numpy scipy matplotlib pyserial sounddevice pyvisa pyvisa-py +``` + +The HIL suites and the project Skills invoke `code/tools/venv/bin/python` +explicitly, so use that interpreter rather than activating the environment. + +Per-tool dependencies, if you would rather install selectively: + +| Package | Needed by | +|---|---| +| `numpy` | everything except `serial_diag.py`'s CAT-only mode | +| `matplotlib` | the plotting tools, both HIL suites, `receive_chain_test.py`, `transmit_test.py` | +| `scipy` | `extract_filter_prototypes.py` | +| `pyserial` | anything that talks CAT: `serial_diag.py`, both HIL suites | +| `sounddevice` | `usb_audio_test.py`, and the audio commands in `serial_diag.py` | +| `pyvisa`, `pyvisa-py` | `siglent_capture.py` | + +### The Digilent WaveForms SDK + +The AD2 tools bind `libdwf` through `ctypes`, so the WaveForms runtime must be +installed system-wide (`libdwf.so` on Linux, the `dwf` framework on macOS, the +`dwf` DLL on Windows). It is not a pip package. If a tool exits with +"libdwf.so not found", install WaveForms from Digilent rather than looking for +a Python package. + +### Serial ports + +With the Teensy configured for **Dual Serial** the radio presents two ports: + +| Port | Teensy name | Purpose | Baud | +|---|---|---|---| +| `/dev/ttyACM0`, `COM3` | `Serial` / `SerialUSB` | Diagnostic output | 115200 | +| `/dev/ttyACM1`, `COM4` | `SerialUSB1` | CAT commands | 38400 | + +With the **serial+midi+audio** USB type there is only one port, carrying both; +`serial_diag.py --port` covers that case. + +On Linux, add yourself to the `dialout` group once: + +```bash +sudo usermod -a -G dialout $USER # log out and back in +``` + +### Outputs + +PNGs and CSVs written into this directory are gitignored, as are the +`results/` directories of the two HIL suites. Everything needed to regenerate +a HIL report lives in its JSON, so commit a run artifact only when you +deliberately want it as a reference. + +--- + +## Hardware-in-the-loop filter test suites + +Two full test suites, each with its own README. They verify on the real radio +that the DSP filters land on their labelled frequencies at **every** supported +sample rate — the regression they exist to catch scales every corner by +`176400/192000`, i.e. −8.125 %. + +- **[`filter_hil/`](filter_hil/README.md)** — receive chain. An AD2 injects a + quadrature tone into the I/Q inputs and reads demodulated audio off the + speaker output. Requires **AGC off**; the suite refuses to run otherwise. +- **[`tx_filter_hil/`](tx_filter_hil/README.md)** — transmit chain. An AD2 + drives the microphone input and captures both exciter outputs synchronously, + giving the two-sided spectrum and with it opposite-sideband suppression. Keys + the radio continuously for minutes at a time, so fit a dummy load. + +Both take the same shape of command line: + +```bash +cd code/tools +./venv/bin/python filter_hil/filter_hil_test.py +./venv/bin/python tx_filter_hil/tx_filter_hil_test.py + +# check arguments without touching hardware +./venv/bin/python filter_hil/filter_hil_test.py --dry-run + +# redraw figures from a previous run +./venv/bin/python filter_hil/plot_filter_hil.py filter_hil/results/filter_hil_*.json + +# self-tests for the measurement maths, no hardware +./venv/bin/python filter_hil/test_filter_hil.py +./venv/bin/python tx_filter_hil/test_tx_filter_hil.py +``` + +Exit codes for both: `0` pass, `1` fail, `2` error (no hardware, or preflight +refused), `3` aborted. + +Read the suite's own README before running one — the wiring, the preflight +conditions, and the failure table are all there. Background and results are in +`wiki/firmware/filter-hil-test.md` and `wiki/firmware/tx-filter-hil-test.md`. + +--- + +## `receive_chain_test.py` + +An end-to-end integrity check on the receive chain: an external signal +generator supplies the RF, the AD2 samples the demodulated audio, and the tool +asserts that the recovered tone is at the right frequency and amplitude and is +free of interruptions and discontinuities. It writes a PNG for eyeballing and +prints a pass/fail summary, optionally with a machine-parseable JSON line. + +```bash +./venv/bin/python receive_chain_test.py # defaults: 1 kHz, 234 mV RMS +./venv/bin/python receive_chain_test.py --json --quiet # for scripting +./venv/bin/python receive_chain_test.py --expected-tone 1500 --plot rx.png +``` + +Wiring: AD2 scope Ch1 on the SDR audio output; the signal generator drives the +antenna input. Exit codes are 0 pass, 1 fail, 2 the AD2 could not be reached. +The tolerances are all flags (`--freq-tol`, `--rms-tol`, `--min-snr`, +`--max-env-cv`, …). Requires `numpy`, `matplotlib` and the WaveForms runtime. +Driven by the `receive-test` Skill. + +--- + +## `transmit_test.py` + +The transmit counterpart, and the one tool that does **not** live in this +directory — it is `code/test/transmit/transmit_test.py`, and its captures land +in whatever directory you run it from (`--output-dir`, default `.`), which is +why everything under `code/test/transmit/` except the script itself is +gitignored. It engages PTT through the AD2 repeatedly, +captures the exciter I/Q outputs each time, and looks for the intermittent +failures where a PTT cycle produces a dead channel, a discontinuity or a +distorted waveform. + +```bash +cd ../test/transmit +python3 transmit_test.py -n 5 # quick smoke test +python3 transmit_test.py -n 100 # full run +``` + +Wiring: AD2 DIO-0 controls PTT (low = transmit), W1 drives the microphone input +with a 500 Hz 100 mV sine, and scope Ch1/Ch2 read I and Q. Each iteration +reports RMS, SNR and dominant frequency; failures are saved to `failures/` as +`.npz` plus a PNG. Exit code 0 if every iteration passed. Driven by the +`transmit-test` Skill. + +--- + +## `flag_timing.py` + +Measures how long firmware code takes to run. `Flag(val)` in `Globals.cpp` +writes a 4-bit value across Teensy pins 28–31; this tool captures those pins on +the AD2's digital inputs, decodes them back into flag values, and reports how +long the code spent in each one. + +Wiring (overridable with `--dio-map`): + +``` +Teensy 28 -> AD2 DIO1 (flag bit 3, MSB) +Teensy 29 -> AD2 DIO2 (flag bit 2) +Teensy 30 -> AD2 DIO3 (flag bit 1) +Teensy 31 -> AD2 DIO4 (flag bit 0, LSB) +``` + +Output is a single JSON document on **stdout**; progress goes to stderr. On +error, stdout still holds JSON — `{"error": "..."}` — so a caller can parse it +uniformly. Exit code is non-zero on any error. + +```bash +# 100 ms capture, streamed over USB +./venv/bin/python flag_timing.py --duration 0.1 --mode record > profile.json + +# time from Flag(2) to the next Flag(3), triggered on entry to Flag(2) +./venv/bin/python flag_timing.py --duration 0.5 --trigger flag --trigger-flag 2 \ + --measure 2 3 > profile.json +``` + +Key options: + +| Option | Default | Notes | +|---|---|---| +| `--sample-rate` | 10 MHz | Rounded to the nearest AD2 clock divider | +| `--duration` | — | Seconds; overrides `--buffer-size` | +| `--buffer-size` | 8192 | Clamped to the device maximum | +| `--mode` | `auto` | `single` uses the on-board buffer (~8K samples, fastest); `record` streams over USB for 1 s+ captures | +| `--debounce-us` | 2.0 | `Flag()` writes its four pins sequentially, so brief intermediate values appear during a transition. Discards segments shorter than this | +| `--max-lost-frac` | 0.001 | Record mode: fail if USB dropped more than this fraction of samples | +| `--trigger` | `none` | `change` on any pin transition, `flag` on a specific value | +| `--measure FROM TO` | — | Adds a `measurement` block: intervals from `Flag(FROM)` to the next `Flag(TO)` | +| `--dio-map` | `28:1,29:2,30:3,31:4` | Teensy pin to AD2 DIO line | + +The JSON contains `metadata`, `transitions`, `segments`, a `summary` with +per-flag statistics and transition counts, and `measurement` when `--measure` +was given. `--include-raw` adds the decoded sample array (large). + +The `timing-measurement` Skill wraps the whole workflow: instrument the +firmware, flash it, capture, plot. + +## `plot_flag_timing.py` + +Turns a `flag_timing.py` JSON into PNGs. No hardware. + +For each flag value with enough events it writes a two-panel figure — a +duration histogram with mean/median/p95/p99 marked, which makes bimodal +distributions obvious, and a duration-vs-iteration scatter, which reveals drift +or clustering of slow events. It also writes a timeline strip of the whole +capture coloured by flag. + +```bash +./venv/bin/python plot_flag_timing.py profile.json + +./venv/bin/python plot_flag_timing.py profile.json --out-dir docs/ --prefix baseline \ + --flag-labels 1=DrawDisplay-other,2=SignalProcessing,3=DrawSpectrumPane +``` + +Options: `--out-dir` (defaults to beside the JSON), `--prefix`, `--flag-labels`, +`--min-count` (skip flags with fewer events, default 2), `--no-timeline`, +`--quiet`. PNG paths are printed to stdout. + +--- + +## `set_radio_time.py` + +Sets the radio's clock from the PC's. Sends a PJRC-standard time packet — `'T'` ++ 10-digit timestamp + newline — which the firmware uses to set both the +coin-cell-backed hardware RTC and the software clock behind the display. + +```bash +./venv/bin/python set_radio_time.py # display reads local time +./venv/bin/python set_radio_time.py --utc # display reads UTC +./venv/bin/python set_radio_time.py --list # show candidate ports +./venv/bin/python set_radio_time.py --port COM5 # choose the port yourself +./venv/bin/python set_radio_time.py --offset -08:00 # override the local offset +``` + +It needs only `pyserial`, so it also runs against a bare +`python3 -m pip install pyserial` on Windows and macOS — the venv above is a +convenience, not a requirement. The port is found by USB vendor ID (0x16C0, +PJRC); with Dual Serial both ports work and it picks the lower-numbered one. + +### Why there is a `--utc` switch + +The radio applies **no time-zone offset of its own**. The timestamp goes +straight into TimeLib and the display reads `hour()`/`minute()`/`second()` back +out of it, so the radio shows the *UTC decomposition of whatever number it is +given*. `MY_TIMEZONE` in `Config.h` is only a label — `"EST: "` is pasted in +front of the digits as a string and shifts nothing. + +So the timestamp has to be pre-shifted by whatever the display is meant to read: + +| `MY_TIMEZONE` is | Run | Sends | +|---|---|---| +| a local zone, e.g. `"EST: "` | `set_radio_time.py` | epoch + local UTC offset | +| `"UTC: "` | `set_radio_time.py --utc` | a true UTC epoch | + +This clock is cosmetic — the display is its only consumer. FT8 timing comes from +the PC's clock, so WSJT-X is unaffected by what is set here. + +### Confirmation, and the lack of it + +On **Dual Serial** the radio echoes `Time set: ` and the script prints it. +On **serial+midi+audio** there is one CDC port shared with CAT, so the firmware +suppresses that echo rather than injecting it into a CAT client's response +stream; the script says so and the display is the check. On that USB type, +WSJT-X or rigctld holding the only port will also block the script from opening +it — close them first. + +--- + +## `Set-RadioTime.ps1` + +The Windows counterpart of `set_radio_time.py`, for operators who would rather +not install Python. Same packet, same behaviour, no modules beyond what ships +with Windows PowerShell 5.1. + +```powershell +.\Set-RadioTime.ps1 # display reads local time +.\Set-RadioTime.ps1 -Utc # display reads UTC +.\Set-RadioTime.ps1 -List # show candidate ports +.\Set-RadioTime.ps1 -Port COM5 # choose the port yourself +.\Set-RadioTime.ps1 -Offset -08:00 # override the local offset +``` + +If PowerShell refuses to run it because of the execution policy: + +```powershell +Unblock-File .\Set-RadioTime.ps1 +# or, for this session only: +powershell -ExecutionPolicy Bypass -File .\Set-RadioTime.ps1 +``` + +Read the `--utc` discussion above — it applies identically. + +--- + +## `serial_diag.py` + +Interactive CAT control of the radio with the diagnostic stream displayed live +in the same window, plus USB audio tone generation so a transmit test needs +only this one tool. + +```bash +# list ports +./venv/bin/python serial_diag.py --list + +# dual-serial firmware: separate diagnostic and CAT ports +./venv/bin/python serial_diag.py --diag /dev/ttyACM0 --cat /dev/ttyACM1 + +# serial+midi+audio firmware: one port for both +./venv/bin/python serial_diag.py --port /dev/ttyACM0 + +# monitor only, or control only +./venv/bin/python serial_diag.py --diag /dev/ttyACM0 +./venv/bin/python serial_diag.py --cat /dev/ttyACM1 +``` + +Baud rates default to 115200 for diagnostics and 38400 for CAT +(`--diag-baud`, `--cat-baud`, `--baud` for single-port mode). + +### Interactive commands + +| Command | Description | +|---|---| +| `tx` | Key the transmitter and start the test tone | +| `rx` | Unkey and stop the tone | +| `tone ` | Set tone frequency (default 1000) | +| `monitor` | Toggle RX audio monitoring, showing RMS level | +| `devices` | List host audio devices | +| `audio ` | Select audio device by index | +| `usb` | Switch to USB audio mode (PC audio input) — **`UM` CAT command, not in this firmware** | +| `ssb` | Switch to SSB / microphone mode — **`UM` CAT command, not in this firmware** | +| `lsb` / `usbsb` | Select lower / upper sideband | +| `cw` | Switch to CW mode | +| `freq ` | Set frequency, e.g. `freq 14074` | +| `id` | Query radio ID | +| `if` | Query full radio status | +| `stats` | Show the last USB_RX statistics block | +| `cat ` | Send a raw CAT command, e.g. `cat FA;` | +| `help` | Command help | +| `quit` / `exit` | Exit (auto-unkeys TX) | + +The audio commands need `sounddevice`; without it the tool still runs and says +so in the help text. + +`usb` and `ssb` send `UM1;`/`UM0;`, which only exist on the unmerged `usb_audio` +branch. On this branch the radio answers `?;` and the tool now says so rather +than reporting success. Every other command above maps to a handler that is +present in `CAT.cpp`. + +Note that an accepted write frequently produces **no** reply — `TX_write` and +`RX_write` both return an empty string — so silence means success and `?;` is +the only failure signal. `tx` and `rx` therefore take about half a second to +return, waiting out the response timeout. + +### Diagnostic output + +Whatever the firmware prints on the diagnostic port is shown with a host +timestamp. Two line formats are additionally parsed and accumulated for the +`stats` command: + +``` +[14:32:15.123] USB_RX: RUNNING reads=94 underruns=0 zeros=0 | buf=2048/2052/2056 | ratio=1.0000/1.0001/1.0002 | rms=0.1234 +[14:32:15.123] USB_TX: cb=48 samples=6144 zeros=0(0%) overruns=0 | buf=2048/2052/2056 | samp/cb=128/128 | rms=0.1234 +``` + +`USB_RX` is the ASRC consumer side, `USB_TX` the PC-to-radio USB callback side. +Lines with `underruns > 0` are highlighted red; `WARMUP` lines yellow. + +| Field | Meaning | Expected | +|---|---|---| +| `state` | ASRC state | `RUNNING`; `WARMUP` while initialising | +| `reads` | Successful read operations | Incrementing | +| `underruns` / `overruns` | Buffer underflow / overflow | 0 | +| `zeros` | Blocks with near-zero signal | Low while transmitting | +| `buf=min/avg/max` | Ring buffer level, samples | ~2048 (half of 4096) | +| `ratio=min/avg/max` | ASRC resampling ratio | ~1.0000, limits at 0.97/1.03 | +| `rms` | Signal RMS | Non-zero while transmitting | + +**No current firmware emits these lines.** They came from +`usb_audio_48k.cpp` behind a `USB_AUDIO_RX_DIAGNOSTICS` `#define`; that file was +replaced by `MainBoard_AudioIO.cpp` and neither the macro nor the instrumentation +survives in the tree. The parser is documented here because it is what the tool +still expects — restore an equivalent one-per-second print in the audio path and +`stats` works again. Everything else in the tool (CAT control, tone generation, +RX monitoring, raw line display) is unaffected. + +Typical USB-audio TX investigation: start the tool, `usb`, `if` to confirm +state, run the transmitting application (WSJT-X or similar), and watch for +`underruns` above zero, `buf` falling below 1024, `ratio` pinned at a limit, or +`rms` stuck at zero. `stats` prints the accumulated totals. + +If nothing appears: check that the instrumentation exists in the firmware you +flashed, that you are on the diagnostic port rather than the CAT port, and that +the radio is actually in USB transmit. If CAT does not respond: check the port +and the 38400 baud rate, and try `id`. + +## `usb_audio_test.py` + +Sends a sine wave to a host audio output — normally the Teensy's USB audio +device — to exercise the PC-to-radio audio path on its own. + +```bash +./venv/bin/python usb_audio_test.py -l # list output devices +./venv/bin/python usb_audio_test.py -d 5 # device index 5, 1 kHz +./venv/bin/python usb_audio_test.py -f 800 -a 0.5 # 800 Hz at 50 % +./venv/bin/python usb_audio_test.py -t 10 -s # 10 s, stereo +``` + +Options: `-d/--device`, `-l/--list`, `-f/--frequency` (1000), `-a/--amplitude` +(0.3), `-r/--rate` (48000), `-t/--duration` (continuous until Ctrl+C), +`-s/--stereo`. Requires `sounddevice`. + +--- + +## `siglent_capture.py` + +Pulls the current traces off a networked SIGLENT oscilloscope over VISA/LAN +without changing any of its settings — useful when the scope is already set up +by hand and you want the data on the host. + +```bash +./venv/bin/python siglent_capture.py +``` + +Prints point count, time span, voltage range and Vpp for each channel, and +writes `channel1_data.csv` / `channel2_data.csv`. The scope address is the +`SCOPE_IP` constant at the top of the file — edit it for your bench. Requires +`pyvisa` and `pyvisa-py`. + +For AD2 captures there is no equivalent standalone script: use the `ad2.py` +module inside whichever HIL suite matches the measurement +(`filter_hil.ad2.Ad2` for single-channel scope plus quadrature AWG, +`tx_filter_hil.ad2.TxAd2` for synchronous two-channel I/Q). + +--- + +## `extract_filter_prototypes.py` + +A one-shot developer tool, not a bench instrument, and it needs no hardware. + +The receive chain used to ship coefficient tables designed offline at a single +sample rate (24 ksps audio, i.e. 192 ksps / 8), so running at any other rate +scaled every corner by `actual_rate / 24000`. Those tables are now generated at +run time from an analog spec instead. This script is what recovered those +specs: it reads the reference tables in `code/test/reference_filters.cpp` and +prints the C literals belonging in `InitializeReceiveAudioFilterCoeffs()` and +`InitializeTransmitFilterCoeffs()`. + +```bash +./venv/bin/python extract_filter_prototypes.py +``` + +Its output is pasted into `DSP_FIR.cpp`; it is not part of the build. Re-run it +if a reference table ever changes. Requires `numpy` and `scipy`. See +`wiki/firmware/runtime-filter-design.md` for the background. diff --git a/code/tools/Set-RadioTime.ps1 b/code/tools/Set-RadioTime.ps1 new file mode 100644 index 0000000..9ea5dbb --- /dev/null +++ b/code/tools/Set-RadioTime.ps1 @@ -0,0 +1,266 @@ +<# +.SYNOPSIS + Set the Phoenix radio's clock over USB serial. + +.DESCRIPTION + Sends a PJRC-standard time packet - 'T' + 10-digit timestamp + newline - to + the radio, which sets both the coin-cell-backed hardware RTC and the software + clock that drives the front-panel display. + + WHAT THE RADIO DOES WITH THE NUMBER + + The firmware feeds the timestamp straight to TimeLib and the display reads + hour()/minute()/second() back out of it. Nothing applies a time-zone offset. + The MY_TIMEZONE setting in Config.h is only a label - "EST: " and friends are + pasted in front of the digits as a string, and changing it does not shift the + clock. + + So the radio shows the UTC decomposition of whatever number it is given. To + make the display read local wall-clock time, the timestamp has to be shifted + by the local UTC offset before it is sent. That is what this script does by + default. Use -Utc to send a true UTC timestamp instead, which is what you + want if MY_TIMEZONE is set to "UTC: ". + + Either way this clock is cosmetic: it drives the display and nothing else. + FT8 timing comes from the PC's clock, not the radio's, so WSJT-X is + unaffected by what you set here. + + This is the Windows counterpart of set_radio_time.py, for people who would + rather not install Python. It needs no modules beyond what ships with + Windows PowerShell 5.1. + +.PARAMETER Port + Serial port to use, e.g. COM5. Autodetected if omitted. + +.PARAMETER Utc + Send a true UTC timestamp. Use if MY_TIMEZONE is set to "UTC: ". + +.PARAMETER Offset + Override the local UTC offset, e.g. +05:30 or -08:00. + +.PARAMETER List + List candidate ports and exit. + +.EXAMPLE + .\Set-RadioTime.ps1 + Sets the clock so the display reads local wall-clock time. + +.EXAMPLE + .\Set-RadioTime.ps1 -Utc + Sets the clock so the display reads UTC. + +.EXAMPLE + .\Set-RadioTime.ps1 -Port COM5 + Uses COM5 rather than autodetecting. + +.NOTES + If PowerShell refuses to run this because of the execution policy, either + unblock the file: + Unblock-File .\Set-RadioTime.ps1 + or run it for this session only: + powershell -ExecutionPolicy Bypass -File .\Set-RadioTime.ps1 +#> + +[CmdletBinding()] +param( + [string]$Port, + [switch]$Utc, + [string]$Offset, + [switch]$List +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +$TeensyVid = 'VID_16C0' # PJRC +$PacketDigits = 10 # the firmware accepts exactly 10, nothing else + +function Stop-WithError { + param([string]$Message, [string]$Hint) + Write-Host "error: $Message" -ForegroundColor Red + if ($Hint) { Write-Host " $Hint" -ForegroundColor DarkGray } + exit 1 +} + +function Get-PortSortKey { + # Natural sort, so COM9 comes before COM10. + param([string]$Name) + if ($Name -match '(\d+)') { return [int]$Matches[1] } + return [int]::MaxValue +} + +function Get-TeensyPort { + <# + With Dual Serial the radio presents two ports: the lower-numbered one is + Serial, which is the port the firmware's own time-sync reader watches. + With the serial+midi+audio USB type there is only one, shared with CAT - + the CAT reader recognises the time packet there, so either way the first + port works. + #> + $found = @() + try { + # Match inside the ForEach-Object rather than relying on $Matches set by a + # Where-Object in a different scope, which is not reliably visible here. + $found = @(Get-CimInstance -ClassName Win32_PnPEntity -ErrorAction Stop | + Where-Object { $_.PNPDeviceID -like "*$TeensyVid*" } | + ForEach-Object { + if ($_.Name -match '\(COM(\d+)\)') { + [pscustomobject]@{ + Device = "COM$($Matches[1])" + Description = $_.Name + } + } + }) + } catch { + # Not Windows, or WMI unavailable - fall back to bare port names below. + } + return @($found | Sort-Object { Get-PortSortKey $_.Device }) +} + +function Get-AnyPort { + $names = @() + try { $names = @([System.IO.Ports.SerialPort]::GetPortNames()) } catch { } + return @($names | Sort-Object { Get-PortSortKey $_ } | + ForEach-Object { [pscustomobject]@{ Device = $_; Description = 'serial port' } }) +} + +function Format-Offset { + # Render an offset as UTC+HH:MM. Custom TimeSpan format strings drop the sign + # entirely, so a negative offset would otherwise read as "+04:00". + param([int]$Seconds) + if ($Seconds -eq 0) { return 'UTC' } + $sign = if ($Seconds -gt 0) { '+' } else { '-' } + $magnitude = [Math]::Abs($Seconds) + # [int] rounds - and rounds to even - so a half-hour zone like +05:30 would + # come out as +06:00. Truncate explicitly. + $hours = [Math]::Floor($magnitude / 3600) + $minutes = [Math]::Floor(($magnitude % 3600) / 60) + return 'UTC{0}{1:00}:{2:00}' -f $sign, $hours, $minutes +} + +function ConvertFrom-OffsetString { + # Accept +HH:MM, -HH:MM, +HH, or a bare number of hours. + param([string]$Text) + if ($Text.Trim() -notmatch '^([+-]?)(\d{1,2})(?::?([0-5]\d))?$') { + Stop-WithError "cannot read time-zone offset '$Text'" 'use a form like +05:30, -08:00 or +1' + } + $sign = if ($Matches[1] -eq '-') { -1 } else { 1 } + $hours = [int]$Matches[2] + # An optional group that did not participate is simply absent from $Matches, + # so test for the key rather than indexing it under Set-StrictMode. + $minutes = if ($Matches.ContainsKey(3)) { [int]$Matches[3] } else { 0 } + if ($hours -gt 14) { Stop-WithError "time-zone offset '$Text' is out of range" } + return $sign * ($hours * 3600 + $minutes * 60) +} + +# ---------------------------------------------------------------- list and exit +if ($List) { + $teensy = @(Get-TeensyPort) + if ($teensy.Count -gt 0) { + Write-Host 'Teensy ports:' + $teensy | ForEach-Object { Write-Host " $($_.Device) ($($_.Description))" } + } else { + Write-Host 'no Teensy ports found' + } + $every = @(Get-AnyPort) + if ($every.Count -gt 0) { + Write-Host 'all serial ports:' + $every | ForEach-Object { Write-Host " $($_.Device)" } + } + exit 0 +} + +if ($Utc -and $Offset) { + Stop-WithError '-Utc and -Offset contradict each other' 'pass one or the other' +} + +# ------------------------------------------------------------------ pick a port +if ($Port) { + $device = $Port +} else { + $teensy = @(Get-TeensyPort) + if ($teensy.Count -eq 0) { + $every = @(Get-AnyPort) + if ($every.Count -eq 0) { + Stop-WithError 'no Teensy found' 'no serial ports at all - check the USB cable and that the radio is on' + } + $names = ($every | ForEach-Object { $_.Device }) -join ', ' + Stop-WithError 'no Teensy found' "ports seen, none of them a Teensy: $names`n pass one explicitly with -Port if you know which it is" + } + if ($teensy.Count -gt 1) { + Write-Host "found $($teensy.Count) Teensy ports, using the first:" + $teensy | ForEach-Object { Write-Host " $($_.Device) ($($_.Description))" } + } + $device = $teensy[0].Device +} + +# ----------------------------------------------------------------- open and set +$serial = New-Object System.IO.Ports.SerialPort $device, 115200, 'None', 8, 'One' +$serial.ReadTimeout = 300 +$serial.WriteTimeout = 1000 + +try { + $serial.Open() +} catch { + Stop-WithError "cannot open ${device}: $($_.Exception.Message)" ` + ("if the radio is on the serial+midi+audio USB type, WSJT-X or rigctld may be holding`n" + + ' the only port - close it and try again') +} + +try { + Start-Sleep -Milliseconds 300 + $serial.DiscardInBuffer() # drop any boot chatter + + # Transmit on a second boundary so the radio's seconds line up with the PC's + # rather than landing mid-tick. + $epoch = [DateTimeOffset]::UtcNow.ToUnixTimeSeconds() + 1 + $sendAt = [DateTimeOffset]::FromUnixTimeSeconds($epoch) + + if ($Utc) { + $offsetSeconds = 0 + } elseif ($Offset) { + $offsetSeconds = ConvertFrom-OffsetString $Offset + } else { + $offsetSeconds = [int][TimeZoneInfo]::Local.GetUtcOffset($sendAt.UtcDateTime).TotalSeconds + } + + $stamp = $epoch + $offsetSeconds + if ("$stamp".Length -ne $PacketDigits) { + Stop-WithError "timestamp $stamp is not $PacketDigits digits" ` + "the firmware accepts exactly 10 - check the PC's clock" + } + + while ([DateTimeOffset]::UtcNow.ToUnixTimeSeconds() -lt $epoch) { + Start-Sleep -Milliseconds 1 + } + $serial.Write("T$stamp`n") + + $shown = [DateTimeOffset]::FromUnixTimeSeconds($stamp).UtcDateTime + $zone = Format-Offset $offsetSeconds + Write-Host "sent T$stamp on $device" + Write-Host ("radio should now display {0:yyyy-MM-dd HH:mm:ss} ($zone)" -f $shown) + + # Read whatever comes back for about a second. + $reply = '' + $deadline = (Get-Date).AddSeconds(1) + while ((Get-Date) -lt $deadline) { + if ($serial.BytesToRead -gt 0) { + $reply += $serial.ReadExisting() + $deadline = (Get-Date).AddMilliseconds(250) + } else { + Start-Sleep -Milliseconds 20 + } + } + + if ($reply -match 'Time set') { + Write-Host "radio confirmed: $($reply.Trim())" + } elseif ($reply.Trim()) { + Write-Host "radio said: $($reply.Trim())" + } else { + Write-Host ("no confirmation - expected on the serial+midi+audio USB type, where the`n" + + 'confirmation is suppressed to keep it out of the CAT stream. Check the display.') + } +} finally { + if ($serial.IsOpen) { $serial.Close() } + $serial.Dispose() +} diff --git a/code/tools/extract_filter_prototypes.py b/code/tools/extract_filter_prototypes.py new file mode 100644 index 0000000..a20301c --- /dev/null +++ b/code/tools/extract_filter_prototypes.py @@ -0,0 +1,278 @@ +#!/usr/bin/env python3 +"""Recover the analog design specs behind the Phoenix frozen filter tables. + +The receive chain used to ship several coefficient tables that had been designed +offline at a single sample rate (24 ksps audio, i.e. 192 ksps ADC / 8). Running +the radio at any other rate scaled every corner and centre frequency by +``actual_rate / 24000``. Those tables are now generated at run time from an +analog spec instead, so they land on the same frequencies at any sample rate. + +This script is what produced those specs. It reads the reference tables in +``code/test/reference_filters.cpp`` (verbatim copies of the tables that used to +live in ``DSP_FIR.cpp``) and prints the C literals that belong in +``InitializeReceiveAudioFilterCoeffs()`` and ``InitializeTransmitFilterCoeffs()``. + +It is a developer tool, run once. Its output is pasted into DSP_FIR.cpp - it is +not part of the build. Re-run it if a reference table ever changes. + +Usage: + python3 code/tools/extract_filter_prototypes.py + +Requires numpy and scipy. +""" + +import os +import re +import sys + +import numpy as np + +try: + import scipy.signal as sig +except ImportError: # pragma: no cover - developer tool + sys.exit("scipy is required: pip install scipy") + + +REPO = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +REFERENCE_FILE = os.path.join(REPO, "code", "test", "reference_filters.cpp") + +# The audio sample rate the frozen tables were designed at: 192000 / DF, DF = 8. +DESIGN_FS_HZ = 24000.0 + +# Labelled centre frequencies of the 14 equaliser cells, in Hz. These are the +# values shown in the UI and printed in the original table comments. +EQ_BAND_FC_HZ = [198.425, 250.0, 314.98, 400.0, 500.0, 630.0, 793.0, + 1000.0, 1259.0, 1587.0, 2000.0, 2500.0, 3150.0, 4000.0] + +# Labelled cutoffs of the five CW audio filters, in Hz. Only used to annotate +# the output - the number the generator actually needs is the ripple edge. +CW_LABEL_HZ = [840.0, 1080.0, 1320.0, 1800.0, 2000.0] + +EQ_SECTIONS = 4 # biquads per equaliser cell +CW_ORDER = 12 # poles in each CW audio lowpass + + +def read_table(source, name): + """Return the floats of a `float32_t [N] = { ... };` definition.""" + match = re.search(r"float32_t\s+" + name + r"\s*\[\d+\]\s*=[^{]*\{(.*?)\}\s*;", + source, re.S) + if match is None: + raise KeyError("no table named %s in %s" % (name, REFERENCE_FILE)) + body = re.sub(r"//.*", "", match.group(1)) + return np.array([float(v) for v in + re.findall(r"[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?", body)]) + + +def arm_to_sos(coeffs): + """Convert ARM biquad coefficients {b0,b1,b2,-a1,-a2} to scipy sos rows.""" + coeffs = np.asarray(coeffs).reshape(-1, 5) + sos = np.zeros((coeffs.shape[0], 6)) + sos[:, 0:3] = coeffs[:, 0:3] + sos[:, 3] = 1.0 + sos[:, 4] = -coeffs[:, 3] + sos[:, 5] = -coeffs[:, 4] + return sos + + +def ripple_edge_hz(coeffs, fs_hz): + """Find the ripple edge of a Chebyshev type I lowpass. + + The tables are normalised so DC sits at 0 dB and the passband ripples above + it. The ripple edge is therefore the highest frequency at which the + response is still at or above the DC level; past it the filter rolls off + monotonically. That frequency is exactly the `Wn` a Chebyshev designer + takes as its argument. + """ + freq, resp = sig.sosfreqz(arm_to_sos(coeffs), worN=1000000, fs=fs_hz) + db = 20.0 * np.log10(np.abs(resp) + 1e-30) + at_or_above_dc = np.where(db >= db[0])[0] + return freq[at_or_above_dc[-1]], db[:at_or_above_dc[-1]].max() - db[0] + + +def analog_bandpass_sections(coeffs, fs_hz, fc_hz): + """Recover the analog (wn, Q) of each biquad in a bandpass cascade. + + Each frozen equaliser biquad has b1 = 0 and b2 = -b0, so its zeros sit at + z = +/-1. That is the bilinear image of the analog bandpass + ``(wn/Q)s / (s^2 + (wn/Q)s + wn^2)``, which means the design survives an + inverse bilinear transform exactly. + + wn is returned as a ratio of the *prewarped* centre frequency. Rebuilding + from that ratio pins the digital peak on fc at whatever sample rate the + radio is running, which is the whole point of the exercise. + """ + prewarped_fc = 2.0 * fs_hz * np.tan(np.pi * fc_hz / fs_hz) + sections = [] + for b0, _b1, _b2, neg_a1, neg_a2 in np.asarray(coeffs).reshape(-1, 5): + pole = np.roots([1.0, -neg_a1, -neg_a2])[0] + analog_pole = (2.0 * fs_hz) * (pole - 1.0) / (pole + 1.0) + wn = abs(analog_pole) + sections.append((wn / prewarped_fc, wn / (2.0 * abs(analog_pole.real)))) + return sections + + +def rebuild_bandpass(sections, fc_hz, fs_hz, gain): + """Mirror of CalcBandpassCascadeCoeffs, used here to check the round trip.""" + prewarped_fc = 2.0 * fs_hz * np.tan(np.pi * fc_hz / fs_hz) + k = 2.0 * fs_hz + out = [] + for wn_ratio, q in sections: + wn = wn_ratio * prewarped_fc + denom = k * k + k * wn / q + wn * wn + b0 = (k * wn / q) / denom + out.append([-b0 * gain, 0.0, b0 * gain, + -2.0 * (wn * wn - k * k) / denom, + -(k * k - k * wn / q + wn * wn) / denom]) + return np.array(out).ravel() + + +def rebuild_chebyshev(order, ripple_db, edge_hz, fs_hz): + """Mirror of CalcChebyshevILowpassCoeffs, used here to check the round trip.""" + eps = np.sqrt(10.0 ** (ripple_db / 10.0) - 1.0) + v0 = np.arcsinh(1.0 / eps) / order + wc = 2.0 * fs_hz * np.tan(np.pi * edge_hz / fs_hz) + k = 2.0 * fs_hz + out = [] + for i in range(order // 2): + theta = np.pi * (2 * i + 1) / (2 * order) + real = -np.sinh(v0) * np.sin(theta) * wc + imag = np.cosh(v0) * np.cos(theta) * wc + wn = np.hypot(real, imag) + q = wn / (2.0 * abs(real)) + denom = k * k + k * wn / q + wn * wn + b0 = wn * wn / denom + out.append([b0, 2.0 * b0, b0, + -2.0 * (wn * wn - k * k) / denom, + -(k * k - k * wn / q + wn * wn) / denom]) + out = np.array(out) + dc = abs(sig.sosfreqz(arm_to_sos(out.ravel()), worN=[0], fs=fs_hz)[1][0]) + out[:, 0:3] /= dc ** (1.0 / len(out)) + return out.ravel() + + +def max_error_db(reference, generated, fs_hz, flo_hz, fhi_hz): + """Worst-case magnitude difference between two biquad cascades, in dB.""" + freq, ref = sig.sosfreqz(arm_to_sos(reference), worN=50000, fs=fs_hz) + _, gen = sig.sosfreqz(arm_to_sos(generated), worN=50000, fs=fs_hz) + band = (freq >= flo_hz) & (freq <= fhi_hz) + ref_db = 20.0 * np.log10(np.abs(ref) + 1e-30) + gen_db = 20.0 * np.log10(np.abs(gen) + 1e-30) + return np.max(np.abs(ref_db[band] - gen_db[band])) + + +def corner_hz(coeffs_or_taps, fs_hz, level_db, is_fir=False): + """Frequency at which the response first drops below `level_db`.""" + if is_fir: + freq, resp = sig.freqz(coeffs_or_taps, worN=400000, fs=fs_hz) + else: + freq, resp = sig.sosfreqz(arm_to_sos(coeffs_or_taps), worN=400000, fs=fs_hz) + db = 20.0 * np.log10(np.abs(resp) + 1e-30) + db -= db[0] + below = np.where(db < level_db)[0] + return freq[below[0]] if below.size else float("nan") + + +def main(): + with open(REFERENCE_FILE) as handle: + source = handle.read() + + print("Analog design specs recovered from %s" % os.path.relpath(REFERENCE_FILE, REPO)) + print("Design sample rate: %.0f Hz\n" % DESIGN_FS_HZ) + + # ------------------------------------------------------------------ + # CW audio lowpass filters: Chebyshev type I, 12 poles + # ------------------------------------------------------------------ + print("=" * 72) + print("CW audio lowpass filters (Chebyshev type I, %d poles)" % CW_ORDER) + print("=" * 72) + edges, ripples = [], [] + for index, label in enumerate(CW_LABEL_HZ, start=1): + table = read_table(source, "CW_AudioFilterCoeffs%d_ref" % index) + edge, ripple = ripple_edge_hz(table, DESIGN_FS_HZ) + edges.append(edge) + ripples.append(ripple) + rebuilt = rebuild_chebyshev(CW_ORDER, ripple, edge, DESIGN_FS_HZ) + error = max_error_db(table, rebuilt, DESIGN_FS_HZ, 0.0, label * 3.0) + print(" %6.0f Hz label: ripple edge %8.2f Hz, ripple %.4f dB, " + "round trip %.4f dB, -6 dB at %7.1f Hz" + % (label, edge, ripple, error, corner_hz(table, DESIGN_FS_HZ, -6.0))) + + print("\n Passband ripple across all five filters: %.4f .. %.4f dB" + % (min(ripples), max(ripples))) + print("\n /* C literal for DSP_FIR.cpp */") + print(" static const float32_t CW_AUDIO_RIPPLE_EDGE_HZ[CW_AUDIO_FILTER_COUNT] = {") + print(" " + ", ".join("%.1ff" % e for e in edges)) + print(" };") + + # ------------------------------------------------------------------ + # Equaliser cells: 4 stagger-tuned analog bandpass sections + # ------------------------------------------------------------------ + print("\n" + "=" * 72) + print("Equaliser cells (%d analog bandpass sections each)" % EQ_SECTIONS) + print("=" * 72) + protos, gains, worst = [], [], 0.0 + for index, fc in enumerate(EQ_BAND_FC_HZ, start=1): + table = read_table(source, "EQ_Band%dCoeffs_ref" % index) + sections = analog_bandpass_sections(table, DESIGN_FS_HZ, fc) + protos.append(sections) + + # Per-section gain that puts the cascade peak at unity, matching the + # normalisation of the frozen tables. + unity = rebuild_bandpass(sections, fc, DESIGN_FS_HZ, 1.0) + _, resp = sig.sosfreqz(arm_to_sos(unity), worN=200000, fs=DESIGN_FS_HZ) + gain = (1.0 / np.max(np.abs(resp))) ** (1.0 / EQ_SECTIONS) + gains.append(gain) + + rebuilt = rebuild_bandpass(sections, fc, DESIGN_FS_HZ, gain) + error = max_error_db(table, rebuilt, DESIGN_FS_HZ, fc * 0.3, fc * 3.0) + worst = max(worst, error) + print(" band %2d fc %8.2f Hz gain %.6f round trip %.2e dB" + % (index, fc, gain, error)) + + print("\n Worst round trip error over all %d cells: %.2e dB" % (len(protos), worst)) + print("\n /* C literals for DSP_FIR.cpp */") + print(" static const float32_t EQ_BAND_FC_HZ[EQUALIZER_CELL_COUNT] = {") + for row in range(0, len(EQ_BAND_FC_HZ), 5): + chunk = EQ_BAND_FC_HZ[row:row + 5] + print(" " + ", ".join("%.3ff" % f for f in chunk) + ",") + print(" };") + print(" static const float32_t EQ_BAND_GAIN[EQUALIZER_CELL_COUNT] = {") + for row in range(0, len(gains), 4): + chunk = gains[row:row + 4] + print(" " + ", ".join("%.9ff" % g for g in chunk) + ",") + print(" };") + print(" static const BandpassProtoSection EQ_BAND_PROTO[EQUALIZER_CELL_COUNT]" + "[EQ_PROTO_SECTIONS] = {") + for index, sections in enumerate(protos, start=1): + body = ", ".join("{%.9ff, %.9ff}" % (r, q) for r, q in sections) + print(" {%s}, /* band %d */" % (body, index)) + print(" };") + + # ------------------------------------------------------------------ + # FIR stages: report the corners the Kaiser designs have to reproduce + # ------------------------------------------------------------------ + print("\n" + "=" * 72) + print("FIR stages (targets for CalcFIRCoeffs)") + print("=" * 72) + fir_specs = [ + ("CW_Filter_Coeffs2_ref", DESIGN_FS_HZ, "CW decode FIR"), + ("FIR_int3_12ksps_48tap_2k7_ref", DESIGN_FS_HZ, "TX audio bandwidth (interp by 2)"), + ("coeffs12K_8K_LPF_FIR_ref", DESIGN_FS_HZ, "TX decimate by 2, 24k -> 12k"), + ] + for name, fs_hz, description in fir_specs: + taps = read_table(source, name) + print(" %s (%d taps, %s)" % (description, len(taps), name)) + print(" DC gain %.6f" % taps.sum()) + for level in (-3.0, -6.0, -60.0): + hz = corner_hz(taps, fs_hz, level, is_fir=True) + print(" %5.0f dB at %8.1f Hz (%.4f * Fs)" % (level, hz, hz / fs_hz)) + print("\n CalcFIRCoeffs treats its fc argument as the -6 dB point, so pass the") + print(" -6 dB figure above rather than the -3 dB one when matching a reference.") + print("\n Note: coeffs12K_8K_LPF_FIR feeds a decimate-by-2 stage, so its stopband") + print(" must sit below 0.25 * Fs. The reference table does not - it is flat well") + print(" past that - which is why the replacement is a genuine lowpass rather than") + print(" a reproduction of the original response.") + + +if __name__ == "__main__": + main() diff --git a/code/tools/filter_hil/.gitignore b/code/tools/filter_hil/.gitignore new file mode 100644 index 0000000..c783b74 --- /dev/null +++ b/code/tools/filter_hil/.gitignore @@ -0,0 +1,8 @@ +# Run outputs: JSON, Markdown and figures, all timestamped per run. +# Everything needed to regenerate a report is in its JSON, so the artifacts +# themselves are not worth versioning. Commit one deliberately if a particular +# run is worth keeping as a reference. +results/ + +__pycache__/ +*.pyc diff --git a/code/tools/filter_hil/README.md b/code/tools/filter_hil/README.md new file mode 100644 index 0000000..8140f0f --- /dev/null +++ b/code/tools/filter_hil/README.md @@ -0,0 +1,192 @@ +# Filter rate-independence test, hardware in the loop + +Verifies on the real radio that the receive DSP filters land on their labelled +frequencies at every supported sample rate. An Analog Discovery 2 injects a +quadrature tone into the I/Q receive inputs and reads the demodulated audio back +off the speaker output; the suite sweeps, measures, and compares the two rates. + +## Wiring + +``` +AD2 W1 ------> radio I receive input (order does not matter, see below) +AD2 W2 ------> radio Q receive input +AD2 Ch1 <------ speaker output +AD2 GND ------- radio ground (shared return is required) + +/dev/ttyACM1 ... CAT control, 38400 baud +/dev/ttyACM0 ... diagnostic port, 115200 baud +``` + +**W1 and W2 can be either way round.** The suite works out which is which by +trying both quadrature senses and seeing which one the SSB filter passes, then +compensates in software. Nothing needs rewiring. + +**Check how the speaker output is referenced before connecting Ch1.** If the +audio amplifier is bridged, neither terminal sits at ground and tying the scope's +`1-` to chassis shorts half the output stage. Connect Ch1 differentially across +the speaker terminals unless the output is known to be single-ended. + +## Before running + +- **AGC must be off.** It compresses the amplitude differences the suite + measures, so every filter skirt would read flat. There is no CAT command for + it; set it from the radio's menu. The suite refuses to run otherwise. +- **Firmware must have the `SR`, `CF`, `EQ` and `FL` CAT commands.** They were + added alongside this suite. `printf 'SR;' > /dev/ttyACM1` should answer rather + than returning `?;`. +- **Do not touch the front panel while it runs.** Menu interaction triggers a + settings save, which would make the test configuration permanent. + +## Running + +```bash +cd code/tools +./venv/bin/python filter_hil/filter_hil_test.py +``` + +The defaults are the values that were found to work on this bench: AF volume 30, +5 V scope range, up to 1 V of drive, and a 12 dB SNR floor. Takes roughly ten +minutes for both rates. Results land in +`filter_hil/results/filter_hil_.{json,md}` plus PNGs. + +Useful variations: + +```bash +# Just the CW filters, one rate, verbose +./venv/bin/python filter_hil/filter_hil_test.py --tests iq,level,map,ref,cw \ + --rates 192000 -v + +# Faster, coarser pass +./venv/bin/python filter_hil/filter_hil_test.py --grid-points 21 --eq-points 7 + +# Include the AM DC blocker (needs the MD4 -> AM CAT fix) +./venv/bin/python filter_hil/filter_hil_test.py --tests iq,level,map,ref,cw,eq,ssb,am + +# Check arguments and the report path without touching hardware +./venv/bin/python filter_hil/filter_hil_test.py --dry-run + +# Redraw figures from a previous run, no hardware +./venv/bin/python filter_hil/plot_filter_hil.py filter_hil/results/filter_hil_*.json +``` + +Exit codes: `0` pass, `1` fail, `2` error (no hardware, or preflight refused), +`3` aborted. + +## How it works + +The receive chain shifts **twice** before decimating: by Fs/4 (`FreqShiftFs4`) +and then by the fine tune plus any CW sidetone (`FreqShiftF`). So the injection +that demodulates to zero audio sits at + +``` +centre = |Fs/4 + fineTune| +``` + +and a wanted audio frequency is `centre +/- f`. Worked example from this bench, +at 176.4 ksps with the radio tuned to a fine tune of -12250 Hz: + +| Fs/4 | fine tune | centre | inject for 1 kHz | +|---|---|---|---| +| 44100 | -12250 | 31850 | 32850 | +| 48000 (at 192 ksps) | -12250 | 35750 | 36750 | + +**The fine tune is the part that is easy to forget and impossible to work +around.** It is whatever the operator last tuned to and is routinely several +kilohertz, so leaving it out puts every injection far outside the passband: the +radio stays silent, and no amount of extra drive helps. If the tone on the +radio's spectrum display is not sitting under the blue fine-tune bar, this is +why. + +Recomputing Fs/4 per rate is the crux of the whole exercise, and the suite +measures the relationship rather than assuming it (test `map`). That test also +reports how far the real demodulation centre sits from nominal - about +-180 ppm on this radio, which is the Teensy's fractional I2S clock, not an +error. + +Every response is the **difference between two captures at the same injected +frequency** — filter engaged and bypassed. Everything the two have in common +cancels exactly: the AWG's amplitude flatness, the codec front end, the +decimation rolloff, the SSB mask, the volume setting, the DAC and the speaker +amplifier. That is what makes an absolute-level measurement on a speaker output +good enough to characterise a filter. + +| Filter | Measured as | +|---|---| +| CW audio filters | `level(CF=k) - level(CF=5)` | +| Equaliser cells | one cell at 100, the rest at 0, against the flat reference | +| SSB convolution filter | `level(FW=x) - level(FW=widest)` | +| AM DC blocker | envelope level at `f_mod`, against 300 Hz | + +## Reading the result + +**The primary criterion is rate invariance, not absolute accuracy.** A corner +measured at 192 ksps must land at the same frequency at 176.4 ksps. The bug this +suite exists to catch moves it by **-8.125 %** (`176400/192000`); the tolerance is +1.5 %, so there is a factor of five between correct and broken. Absolute accuracy +against the labelled frequency is checked too, but more loosely, because a smooth +tilt anywhere in the analog path can bias it without saying anything about the +firmware. + +Look at `_cw_overlay.png` first. Both rates should lie on top of each other and +well clear of the dotted line marking where the old frozen tables would have put +them. + +**The SSB filter is the control.** It has always derived its coefficients from +the true sample rate, so it was never affected by the bug. If it shows a shift, +the rig or the analysis is wrong, not the firmware. + +Some equaliser cells are marked *edge limited*, meaning the SSB filter rather +than the cell is shaping what was measured. Cells 0 and 1 (198 and 250 Hz) sit at +or below the 200 Hz low cut, and cell 13 (4000 Hz) sits in the decimation skirt, +whose corner is a fraction of the sample rate and is *meant* to move with it. The +suite opens the SSB filter up before sweeping the cells so the top ones are +measurable at all, and marks a cell edge limited by comparing it against the +passband actually in use. Their absolute tolerance is relaxed; their rate +invariance is not, since the same skirt applies at both rates. + +## When it fails + +| Symptom | Likely cause | +|---|---| +| Preflight aborts on AGC | AGC is on. Turn it off in the radio's menu. | +| `iq_order` reports negative SNR for all four combinations, and the speaker output measures a couple of hundred mV RMS with the AWG silent | AGC is on and running the gain up on a quiet band, burying the injected tone 25-30 dB under the hiss. Confirm with `PD;` — if the tone is visible in the radio's own spectrum but not in the audio, the DSP is receiving it and the problem is downstream gain. | +| `iq_order` finds no audio either way | No shared ground, radio muted, W1/W2 not connected - or the fine tune was not accounted for (see "How it works") | +| Everything reads as noise and the tone on the radio's display is nowhere near the blue fine-tune bar | The injection is not allowing for `fineTuneFreq_Hz` | +| `iq_order` rejects the wrong side by only a few dB | The tone is not reaching both I and Q. Check both W1 and W2; the suite reports each channel's contribution as a phase margin. | +| `mapping` offset is wrong | The firmware did not reconfigure the Fs/4 shift for the new rate. Everything downstream is meaningless; that rate is skipped. | +| Everything reads -8.125 % | The frozen coefficient tables are back | +| SSB control also shifts | The rig or the analysis is wrong, not the firmware | +| Reference sweep is flat | AGC or a limiter is active despite the preflight check | +| Audio clips or the noise floor is hundreds of mV | AF volume too high. It rises very steeply: 54 clipped a 5 V range on this radio, 30 gives ~30 mV of noise | +| A corner comes back as "not measured" | The crossing is below the rig's dynamic range. Measured through a receiver the tone vanishes into the noise about 5 dB under the passband, which is why the SSB edge is called at -3 dB rather than -6 dB | +| Points marked invalid | Check `lost`/`corrupted` in the JSON: the scope rate may be too high, or the drive too low or clipping | + +Do not edit the test in response to a failure — a failure means the radio's +filters are not where they should be, or the rig is not connected as documented. + +## Files + +| File | Contents | +|---|---| +| `ad2.py` | ctypes wrapper for libdwf: quadrature AWG, record-mode capture | +| `radio.py` | CAT and diagnostic serial, `ED;` parsing, state save/restore | +| `measure.py` | tone metrology, corner and peak finding | +| `bandtable.py` | design constants mirrored from the firmware | +| `tests.py` | the individual tests and the cross-rate comparison | +| `report.py` | JSON, stdout summary, Markdown report | +| `filter_hil_test.py` | CLI entry point and sequencing | +| `plot_filter_hil.py` | JSON in, PNGs out; runs without hardware | +| `test_filter_hil.py` | self-tests for the measurement maths, no hardware | + +Run the self-tests after changing anything in `measure.py` or `tests.py`: + +```bash +./venv/bin/python filter_hil/test_filter_hil.py +``` + +They include a check that the comparison **fails** when handed a simulated +-8.125 % shift, which is what stops the suite quietly passing everything. + +`bandtable.py` mirrors constants from `DSP_FIR.cpp` and `Globals.cpp` by hand. +Nothing detects a firmware value edited without updating it, so re-check that +file when the filter design constants change. diff --git a/code/tools/filter_hil/__init__.py b/code/tools/filter_hil/__init__.py new file mode 100644 index 0000000..d35a23d --- /dev/null +++ b/code/tools/filter_hil/__init__.py @@ -0,0 +1,10 @@ +"""Hardware-in-the-loop verification of the Phoenix receive DSP filters. + +Injects known quadrature signals into the radio's I/Q receive inputs with an +Analog Discovery 2, measures the demodulated audio, and checks that each filter +lands on its labelled frequency at both supported sample rates. + +See README.md for the wiring and how to run it. +""" + +__all__ = ["ad2", "radio", "measure", "bandtable", "tests", "report"] diff --git a/code/tools/filter_hil/ad2.py b/code/tools/filter_hil/ad2.py new file mode 100644 index 0000000..b7e0dc9 --- /dev/null +++ b/code/tools/filter_hil/ad2.py @@ -0,0 +1,423 @@ +"""Analog Discovery 2 control for the filter HIL suite. + +Wraps the WaveForms SDK (libdwf) through ctypes. There is no pydwf on this +machine and the SDK's own Python support is a constants module plus sample +scripts, so the binding is hand-written; the argtypes table and the record-mode +capture loop are lifted from ``code/tools/receive_chain_test.py``. + +Two capabilities matter here: + +* **Quadrature output.** W1 and W2 drive the radio's I and Q receive inputs. The + two channels must be phase-locked and started atomically, or the phase between + them is undefined and the radio sees a signal that is not analytic. Nothing + else in this repo has driven the AD2's second AWG channel, let alone in + quadrature, so this part has no prior art to copy. + +* **Streaming capture.** Scope Ch1 reads the demodulated audio. Record mode is + used rather than single-shot because the AD2's on-board buffer is only a few + thousand samples; the loop below accounts for lost and corrupted samples so a + capture that dropped data can be discarded rather than silently analysed. + +The device is left driving the radio's ADC inputs if the process dies, so +:class:`Ad2` registers cleanup on ``__exit__``, on SIGINT and at interpreter +exit. +""" + +from __future__ import annotations + +import atexit +import ctypes +import signal +import sys +import time +from dataclasses import dataclass +from datetime import datetime, timezone +from typing import Callable, Optional + +import numpy as np + +# --- SDK constants --------------------------------------------------------- +# Mirrored from /usr/share/digilent/waveforms/samples/py/dwfconstants.py rather +# than imported, so the suite does not depend on the SDK's sample directory +# being present at its default path. + +HDWF_NONE = 0 + +ACQMODE_SINGLE = 0 +ACQMODE_RECORD = 3 + +DWF_STATE_READY = 0 +DWF_STATE_CONFIG = 4 +DWF_STATE_PREFILL = 5 +DWF_STATE_ARMED = 1 +DWF_STATE_RUNNING = 3 +DWF_STATE_DONE = 2 + +ANALOG_OUT_NODE_CARRIER = 0 +ANALOG_OUT_NODE_FM = 1 +ANALOG_OUT_NODE_AM = 2 + +FUNC_DC = 0 +FUNC_SINE = 1 + +DEFAULT_DWF_PATH = "libdwf.so" + + +class DwfError(RuntimeError): + """A WaveForms SDK call failed.""" + + +def load_dwf(path: str = DEFAULT_DWF_PATH) -> ctypes.CDLL: + """Load libdwf for the current platform.""" + if sys.platform.startswith("win"): + return ctypes.cdll.dwf + if sys.platform.startswith("darwin"): + return ctypes.cdll.LoadLibrary("/Library/Frameworks/dwf.framework/dwf") + try: + return ctypes.cdll.LoadLibrary(path) + except OSError as exc: + raise DwfError( + f"could not load {path}. Install the Digilent WaveForms SDK " + f"(the library normally lands in /usr/lib)." + ) from exc + + +def last_error(dwf: ctypes.CDLL) -> str: + """Return the SDK's description of the most recent failure.""" + buf = ctypes.create_string_buffer(512) + dwf.FDwfGetLastErrorMsg(buf) + return buf.value.decode(errors="replace").strip() + + +def dwf_version(dwf: ctypes.CDLL) -> str: + """Return the SDK version string.""" + buf = ctypes.create_string_buffer(32) + dwf.FDwfGetVersion(buf) + return buf.value.decode(errors="replace") + + +def bind_argtypes(dwf: ctypes.CDLL) -> None: + """Declare argument types so 64-bit pointers are not truncated.""" + c_int, c_double, c_byte, c_uint = ( + ctypes.c_int, + ctypes.c_double, + ctypes.c_byte, + ctypes.c_uint, + ) + p_int = ctypes.POINTER(c_int) + p_byte = ctypes.POINTER(c_byte) + p_double = ctypes.POINTER(c_double) + + # Device + dwf.FDwfDeviceOpen.argtypes = [c_int, p_int] + dwf.FDwfDeviceAutoConfigureSet.argtypes = [c_int, c_int] + dwf.FDwfDeviceCloseAll.argtypes = [] + dwf.FDwfGetLastErrorMsg.argtypes = [ctypes.c_char_p] + dwf.FDwfGetVersion.argtypes = [ctypes.c_char_p] + + # Scope + dwf.FDwfAnalogInReset.argtypes = [c_int] + dwf.FDwfAnalogInChannelEnableSet.argtypes = [c_int, c_int, c_int] + dwf.FDwfAnalogInChannelRangeSet.argtypes = [c_int, c_int, c_double] + dwf.FDwfAnalogInChannelOffsetSet.argtypes = [c_int, c_int, c_double] + dwf.FDwfAnalogInAcquisitionModeSet.argtypes = [c_int, c_int] + dwf.FDwfAnalogInFrequencySet.argtypes = [c_int, c_double] + dwf.FDwfAnalogInRecordLengthSet.argtypes = [c_int, c_double] + dwf.FDwfAnalogInConfigure.argtypes = [c_int, c_int, c_int] + dwf.FDwfAnalogInStatus.argtypes = [c_int, c_int, p_byte] + dwf.FDwfAnalogInStatusRecord.argtypes = [c_int, p_int, p_int, p_int] + # void_p rather than POINTER(c_double): the buffer is filled at an offset via + # byref(buf, n), which carries the array's type and a stricter declaration + # would reject it. + dwf.FDwfAnalogInStatusData.argtypes = [c_int, c_int, ctypes.c_void_p, c_int] + + # AWG. None of these appear elsewhere in the repo. + dwf.FDwfAnalogOutReset.argtypes = [c_int, c_int] + dwf.FDwfAnalogOutNodeEnableSet.argtypes = [c_int, c_int, c_int, c_int] + dwf.FDwfAnalogOutNodeFunctionSet.argtypes = [c_int, c_int, c_int, ctypes.c_ubyte] + dwf.FDwfAnalogOutNodeFrequencySet.argtypes = [c_int, c_int, c_int, c_double] + dwf.FDwfAnalogOutNodeAmplitudeSet.argtypes = [c_int, c_int, c_int, c_double] + dwf.FDwfAnalogOutNodeOffsetSet.argtypes = [c_int, c_int, c_int, c_double] + dwf.FDwfAnalogOutNodePhaseSet.argtypes = [c_int, c_int, c_int, c_double] + dwf.FDwfAnalogOutMasterSet.argtypes = [c_int, c_int, c_int] + dwf.FDwfAnalogOutRunSet.argtypes = [c_int, c_int, c_double] + dwf.FDwfAnalogOutRepeatSet.argtypes = [c_int, c_int, c_int] + dwf.FDwfAnalogOutConfigure.argtypes = [c_int, c_int, c_int] + + +@dataclass(frozen=True) +class Ad2Config: + """Scope and AWG settings that stay fixed for a whole run.""" + + scope_rate_hz: float = 96_000.0 + capture_s: float = 0.25 + scope_range_v: float = 2.0 + scope_offset_v: float = 0.0 + awg_offset_v: float = 0.0 + frontend_settle_s: float = 2.0 + dwf_path: str = DEFAULT_DWF_PATH + + +@dataclass +class Capture: + """One block of scope samples.""" + + samples: np.ndarray + sample_rate_hz: float + lost: int + corrupted: int + t_utc: str + + @property + def clean(self) -> bool: + """True when no samples were dropped or flagged corrupt.""" + return self.lost == 0 and self.corrupted == 0 + + +class Ad2: + """Open AD2, drive W1/W2 in quadrature, capture Ch1. + + Use as a context manager; the AWG is always silenced on the way out. + """ + + def __init__(self, cfg: Ad2Config, log: Callable[[str], None] = print) -> None: + self.cfg = cfg + self.log = log + self.dwf: Optional[ctypes.CDLL] = None + self.hdwf = ctypes.c_int(HDWF_NONE) + self._scope_configured = False + self._awg_running = False + self._prev_sigint = None + self.version = "" + + # -- lifecycle --------------------------------------------------------- + + def __enter__(self) -> "Ad2": + self.open() + return self + + def __exit__(self, *exc) -> None: + self.close() + + def open(self) -> None: + """Open the first available device and put it in manual-configure mode.""" + self.dwf = load_dwf(self.cfg.dwf_path) + bind_argtypes(self.dwf) + self.version = dwf_version(self.dwf) + self.log(f"WaveForms SDK {self.version}") + + if self.dwf.FDwfDeviceOpen(ctypes.c_int(-1), ctypes.byref(self.hdwf)) != 1 \ + or self.hdwf.value == HDWF_NONE: + raise DwfError(f"could not open an Analog Discovery: {last_error(self.dwf)}") + + # Manual configure: settings are applied when we say so, not on every set. + self.dwf.FDwfDeviceAutoConfigureSet(self.hdwf, ctypes.c_int(0)) + + atexit.register(self._emergency_stop) + self._prev_sigint = signal.getsignal(signal.SIGINT) + signal.signal(signal.SIGINT, self._on_sigint) + + def close(self) -> None: + """Silence the AWG and release the device.""" + if self.dwf is None: + return + try: + self.awg_off() + finally: + self.dwf.FDwfDeviceCloseAll() + self.hdwf = ctypes.c_int(HDWF_NONE) + self.dwf = None + atexit.unregister(self._emergency_stop) + if self._prev_sigint is not None: + signal.signal(signal.SIGINT, self._prev_sigint) + self._prev_sigint = None + + def _emergency_stop(self) -> None: + """Last-ditch AWG silence; safe to call more than once.""" + if self.dwf is None or self.hdwf.value == HDWF_NONE: + return + try: + self.dwf.FDwfAnalogOutReset(self.hdwf, ctypes.c_int(-1)) + self.dwf.FDwfDeviceCloseAll() + except Exception: + pass + + def _on_sigint(self, signum, frame): + self.log("\nInterrupted - silencing the AWG.") + self._emergency_stop() + raise KeyboardInterrupt + + # -- scope ------------------------------------------------------------- + + def configure_scope(self) -> None: + """Configure Ch1 for record mode. + + The analog frontend needs a couple of seconds to settle after the range + and offset are set. That cost is paid here, once, rather than on every + capture - a sweep makes hundreds of captures and would otherwise spend + most of its time waiting. + """ + assert self.dwf is not None + d, h = self.dwf, self.hdwf + c_int, c_double = ctypes.c_int, ctypes.c_double + + d.FDwfAnalogInReset(h) + d.FDwfAnalogInChannelEnableSet(h, c_int(0), c_int(1)) + d.FDwfAnalogInChannelRangeSet(h, c_int(0), c_double(self.cfg.scope_range_v)) + d.FDwfAnalogInChannelOffsetSet(h, c_int(0), c_double(self.cfg.scope_offset_v)) + d.FDwfAnalogInAcquisitionModeSet(h, c_int(ACQMODE_RECORD)) + d.FDwfAnalogInFrequencySet(h, c_double(self.cfg.scope_rate_hz)) + d.FDwfAnalogInRecordLengthSet(h, c_double(self.cfg.capture_s)) + d.FDwfAnalogInConfigure(h, c_int(1), c_int(0)) # apply, do not start + + self.log(f"Scope: Ch1 @ {self.cfg.scope_rate_hz/1000:.1f} kHz, " + f"{self.cfg.capture_s*1000:.0f} ms, range {self.cfg.scope_range_v} V") + self.log(f"Waiting {self.cfg.frontend_settle_s:.1f} s for the analog frontend to settle...") + time.sleep(self.cfg.frontend_settle_s) + self._scope_configured = True + + def capture(self) -> Capture: + """Re-arm and stream one block from Ch1.""" + assert self.dwf is not None + if not self._scope_configured: + self.configure_scope() + + d, h = self.dwf, self.hdwf + c_int, c_double = ctypes.c_int, ctypes.c_double + + n_samples = int(round(self.cfg.scope_rate_hz * self.cfg.capture_s)) + buf = (ctypes.c_double * n_samples)() + sts = ctypes.c_byte() + avail, lost, corrupted = c_int(), c_int(), c_int() + total_lost = total_corrupted = 0 + + d.FDwfAnalogInConfigure(h, c_int(0), c_int(1)) # start + + got = 0 + deadline = time.monotonic() + self.cfg.capture_s * 5 + 5.0 + while got < n_samples: + if time.monotonic() > deadline: + raise DwfError("timed out waiting for the scope acquisition") + + if d.FDwfAnalogInStatus(h, c_int(1), ctypes.byref(sts)) != 1: + raise DwfError(f"FDwfAnalogInStatus failed: {last_error(d)}") + + if got == 0 and sts.value in (DWF_STATE_CONFIG, DWF_STATE_PREFILL, DWF_STATE_ARMED): + continue + + d.FDwfAnalogInStatusRecord(h, ctypes.byref(avail), ctypes.byref(lost), + ctypes.byref(corrupted)) + # Advance past lost samples so the dropout leaves a hole rather than + # shifting everything after it in time. + got += lost.value + total_lost += lost.value + total_corrupted += corrupted.value + + if avail.value == 0: + continue + + take = min(avail.value, n_samples - got) + d.FDwfAnalogInStatusData( + h, c_int(0), + ctypes.byref(buf, ctypes.sizeof(ctypes.c_double) * got), + c_int(take), + ) + got += take + + return Capture( + samples=np.frombuffer(buf, dtype=np.float64).copy(), + sample_rate_hz=self.cfg.scope_rate_hz, + lost=total_lost, + corrupted=total_corrupted, + t_utc=datetime.now(timezone.utc).isoformat(timespec="seconds"), + ) + + def capture_after(self, settle_s: float) -> Capture: + """Wait for the radio's DSP to settle on the new stimulus, then capture.""" + time.sleep(settle_s) + return self.capture() + + # -- AWG --------------------------------------------------------------- + + def set_quadrature(self, f_hz: float, amplitude_v: float, phase_sign: int) -> None: + """Drive W1/W2 with a phase-locked quadrature pair. + + W1 sits at 0 degrees and W2 leads or lags by 90, which is what makes the + pair analytic: the radio sees a single-sided tone at +f_hz or -f_hz + rather than a real cosine with both images. Which sign corresponds to + which physical wiring is discovered at run time, so the caller passes + ``phase_sign`` rather than assuming. + + ``FDwfAnalogOutMasterSet`` slaves W2 to W1's timebase, and configuring + channel -1 starts both atomically; doing them separately leaves the + phase between the channels undefined. + """ + assert self.dwf is not None + d, h = self.dwf, self.hdwf + c_int, c_double = ctypes.c_int, ctypes.c_double + node = c_int(ANALOG_OUT_NODE_CARRIER) + phase_deg = 90.0 * (1 if phase_sign >= 0 else -1) + + for ch, phase in ((0, 0.0), (1, phase_deg)): + c = c_int(ch) + d.FDwfAnalogOutNodeEnableSet(h, c, node, c_int(1)) + d.FDwfAnalogOutNodeFunctionSet(h, c, node, ctypes.c_ubyte(FUNC_SINE)) + d.FDwfAnalogOutNodeFrequencySet(h, c, node, c_double(f_hz)) + d.FDwfAnalogOutNodeAmplitudeSet(h, c, node, c_double(amplitude_v)) + d.FDwfAnalogOutNodeOffsetSet(h, c, node, c_double(self.cfg.awg_offset_v)) + d.FDwfAnalogOutNodePhaseSet(h, c, node, c_double(phase)) + d.FDwfAnalogOutRunSet(h, c, c_double(0.0)) # run continuously + d.FDwfAnalogOutRepeatSet(h, c, c_int(0)) + + # Slave channel 2 to channel 1 so they share a timebase. + d.FDwfAnalogOutMasterSet(h, c_int(1), c_int(0)) + # -1 = all channels, 1 = start. Note 3 is "apply to a channel that is + # already running" and silently leaves a stopped channel stopped. + d.FDwfAnalogOutConfigure(h, c_int(-1), c_int(1)) + self._awg_running = True + + def set_am_quadrature(self, carrier_hz: float, amplitude_v: float, phase_sign: int, + mod_hz: float, depth_pct: float) -> None: + """Quadrature carrier with amplitude modulation on both channels. + + Used to exercise the AM demodulator's DC blocker, whose corner is only + reachable by varying the envelope rather than the carrier. + """ + assert self.dwf is not None + d, h = self.dwf, self.hdwf + c_int, c_double = ctypes.c_int, ctypes.c_double + carrier = c_int(ANALOG_OUT_NODE_CARRIER) + am = c_int(ANALOG_OUT_NODE_AM) + phase_deg = 90.0 * (1 if phase_sign >= 0 else -1) + + for ch, phase in ((0, 0.0), (1, phase_deg)): + c = c_int(ch) + d.FDwfAnalogOutNodeEnableSet(h, c, carrier, c_int(1)) + d.FDwfAnalogOutNodeFunctionSet(h, c, carrier, ctypes.c_ubyte(FUNC_SINE)) + d.FDwfAnalogOutNodeFrequencySet(h, c, carrier, c_double(carrier_hz)) + d.FDwfAnalogOutNodeAmplitudeSet(h, c, carrier, c_double(amplitude_v)) + d.FDwfAnalogOutNodeOffsetSet(h, c, carrier, c_double(self.cfg.awg_offset_v)) + d.FDwfAnalogOutNodePhaseSet(h, c, carrier, c_double(phase)) + + # The modulation must be in phase on both channels - only the + # carrier is in quadrature - or the envelope itself rotates. + d.FDwfAnalogOutNodeEnableSet(h, c, am, c_int(1)) + d.FDwfAnalogOutNodeFunctionSet(h, c, am, ctypes.c_ubyte(FUNC_SINE)) + d.FDwfAnalogOutNodeFrequencySet(h, c, am, c_double(mod_hz)) + d.FDwfAnalogOutNodeAmplitudeSet(h, c, am, c_double(depth_pct)) + d.FDwfAnalogOutNodeOffsetSet(h, c, am, c_double(0.0)) + d.FDwfAnalogOutNodePhaseSet(h, c, am, c_double(0.0)) + + d.FDwfAnalogOutRunSet(h, c, c_double(0.0)) + d.FDwfAnalogOutRepeatSet(h, c, c_int(0)) + + d.FDwfAnalogOutMasterSet(h, c_int(1), c_int(0)) + d.FDwfAnalogOutConfigure(h, c_int(-1), c_int(1)) + self._awg_running = True + + def awg_off(self) -> None: + """Stop driving the radio's inputs.""" + if self.dwf is None or self.hdwf.value == HDWF_NONE: + return + self.dwf.FDwfAnalogOutReset(self.hdwf, ctypes.c_int(-1)) + self._awg_running = False diff --git a/code/tools/filter_hil/bandtable.py b/code/tools/filter_hil/bandtable.py new file mode 100644 index 0000000..d72a8dd --- /dev/null +++ b/code/tools/filter_hil/bandtable.py @@ -0,0 +1,107 @@ +"""Design constants mirrored from the firmware. + +The suite needs to know what the firmware is aiming at in order to say whether it +got there. These values are copied by hand from the sources named against each +block; ``test_filter_hil.py`` asserts the shapes still line up, but nothing can +detect a value that was edited in the firmware and not here. Re-check this file +whenever the corresponding firmware constants change. +""" + +from __future__ import annotations + +from dataclasses import dataclass + +# --- Sample rates ---------------------------------------------------------- +# Globals.cpp SR[] and the SAMPLE_RATE_* macros in SDT.h. Only these two are +# reachable from the front panel menu or the SR CAT command. +SAMPLE_RATES_HZ = (192000, 176400) + +#: Combined decimation of the receive chain: DF1 * DF2 in ReceiveFilterConfig. +DECIMATION_FACTOR = 8 + +#: The ratio the frozen-table bug used to scale every corner by. +LEGACY_RATE_RATIO = 176400.0 / 192000.0 # 0.91875 +LEGACY_DELTA_PCT = 100.0 * (LEGACY_RATE_RATIO - 1.0) # -8.125 + + +def audio_rate_hz(sample_rate_hz: float) -> float: + """Audio sample rate after the receive chain's decimate-by-8.""" + return sample_rate_hz / DECIMATION_FACTOR + + +def fs_over_4_hz(sample_rate_hz: float) -> float: + """The FreqShiftFs4 offset: an input tone at Fs/4 demodulates to DC.""" + return sample_rate_hz / 4.0 + + +# --- CW audio filters ------------------------------------------------------ +# DSP_FIR.cpp CW_AUDIO_RIPPLE_EDGE_HZ and the CW_AUDIO_FILTER_* macros. +# The nominal figures are what the filters are labelled with in the UI; the +# ripple edge is the Chebyshev design parameter and sits a few percent lower. +CW_FILTER_NOMINAL_HZ = (840.0, 1080.0, 1320.0, 1800.0, 2000.0) +CW_FILTER_RIPPLE_EDGE_HZ = (807.1, 1038.0, 1269.0, 1731.5, 1963.2) +CW_FILTER_ORDER = 12 +CW_FILTER_RIPPLE_DB = 0.02 +#: ED.CWFilterIndex value that bypasses the filter. +CW_FILTER_OFF = 5 + + +# --- Equaliser ------------------------------------------------------------- +# DSP_FIR.cpp EQ_BAND_FC_HZ. Q values are derived from EQ_BAND_PROTO: the +# cascade's -3 dB bandwidth, not any single section's. +EQ_CELL_COUNT = 14 +EQ_CENTRE_HZ = (198.425, 250.0, 314.98, 400.0, 500.0, 630.0, 793.0, + 1000.0, 1259.0, 1587.0, 2000.0, 2500.0, 3150.0, 4000.0) +#: -3 dB bandwidth of each cell at 24 ksps, measured from the shipped tables. +EQ_BANDWIDTH_HZ = (49.4, 59.6, 76.0, 98.0, 118.5, 159.7, 189.0, + 243.0, 300.8, 362.3, 476.3, 598.3, 789.9, 1043.5) + +#: Cells whose measured shape is distorted by something other than the cell. +#: 0 and 1 sit at or below the 200 Hz SSB low cut; 13 sits in the decimation +#: skirt, whose corner is a fraction of Fs and so is meant to move with the rate. +EQ_EDGE_LIMITED_CELLS = (0, 1, 13) + + +def eq_q(index: int) -> float: + """Nominal Q of an equaliser cell.""" + return EQ_CENTRE_HZ[index] / EQ_BANDWIDTH_HZ[index] + + +# --- AM DC blocker --------------------------------------------------------- +# ReceiveFilterConfig::amDCBlockCorner_Hz in SDT.h. +AM_DC_BLOCKER_CORNER_HZ = 38.0 + + +# --- Bands ----------------------------------------------------------------- +# Globals.cpp bands[], ITU region 2. Only the fields the suite uses. + +@dataclass(frozen=True) +class Band: + index: int + name: str + mode: int # ModulationType: 0=USB 1=LSB 2=AM 3=SAM + hi_cut_hz: int + lo_cut_hz: int + + +BANDS: tuple[Band, ...] = ( + Band(0, "160M", 1, -200, -3000), + Band(1, "80M", 1, -200, -3000), + Band(2, "60M", 0, 3000, 200), + Band(3, "40M", 1, -200, -3000), + Band(4, "30M", 0, 3000, 200), + Band(5, "20M", 0, 3000, 200), + Band(6, "17M", 0, 3000, 200), + Band(7, "15M", 0, 3000, 200), + Band(8, "12M", 0, 3000, 200), + Band(9, "10M", 0, 3000, 200), + Band(10, "6M", 0, 3000, 200), + Band(11, "4M", 0, 3000, 200), +) + + +def band(index: int) -> Band: + """Look up a band by its ED.currentBand index.""" + if 0 <= index < len(BANDS): + return BANDS[index] + raise IndexError(f"band index {index} is outside the {len(BANDS)}-band table") diff --git a/code/tools/filter_hil/filter_hil_test.py b/code/tools/filter_hil/filter_hil_test.py new file mode 100644 index 0000000..0ddc6f0 --- /dev/null +++ b/code/tools/filter_hil/filter_hil_test.py @@ -0,0 +1,490 @@ +#!/usr/bin/env python3 +"""Verify the Phoenix receive filters hold their frequencies across sample rates. + +Injects a quadrature tone into the radio's I/Q receive inputs with an Analog +Discovery 2, reads the demodulated audio back off the speaker output, and +measures where each filter actually sits - at every sample rate under test. + + W1, W2 -> the radio's I and Q receive inputs (order is auto-detected) + Scope Ch1 -> the speaker output + /dev/ttyACM1 -> CAT control at 38400 + /dev/ttyACM0 -> diagnostic port at 115200 (needed for the ED settings dump) + +Exit codes: 0 pass, 1 fail, 2 error (no hardware, or preflight refused to run), +3 aborted (radio state may be dirty). + +See README.md for wiring detail and how to read the output. +""" + +from __future__ import annotations + +import argparse +import os +import sys +import time + +import numpy as np + +# Allow running as a script from anywhere, not only as a package module. +if __package__ in (None, ""): + sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + from filter_hil import bandtable as bt + from filter_hil import report as report_mod + from filter_hil import tests as T + from filter_hil.ad2 import Ad2, Ad2Config, DwfError + from filter_hil.measure import geom_grid + from filter_hil.radio import (CatError, EdSnapshot, Radio, RadioStateGuard, + MOD_AM, MOD_NAMES) +else: + from . import bandtable as bt + from . import report as report_mod + from . import tests as T + from .ad2 import Ad2, Ad2Config, DwfError + from .measure import geom_grid + from .radio import (CatError, EdSnapshot, Radio, RadioStateGuard, + MOD_AM, MOD_NAMES) + +REPO_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +ALL_TESTS = ("iq", "level", "map", "ref", "cw", "eq", "ssb", "am") +DEFAULT_TESTS = ("iq", "level", "map", "ref", "cw", "eq", "ssb") + + +def build_parser() -> argparse.ArgumentParser: + p = argparse.ArgumentParser( + description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + + g = p.add_argument_group("selection") + g.add_argument("--rates", default="192000,176400", + help="sample rates to test, in order (default: %(default)s)") + g.add_argument("--tests", default=",".join(DEFAULT_TESTS), + help=f"tests to run, from {','.join(ALL_TESTS)} (default: %(default)s)") + g.add_argument("--cw-filters", default="0,1,2,3,4", + help="CW filter indices to measure (default: %(default)s)") + g.add_argument("--eq-cells", default="all", + help="equaliser cells to measure, or 'all' (default: %(default)s)") + g.add_argument("--fw-widths", default="1800,2400,2800,3000", + help="SSB filter widths to check, Hz (default: %(default)s)") + + g = p.add_argument_group("serial") + g.add_argument("--cat-port", default="/dev/ttyACM1") + g.add_argument("--diag-port", default="/dev/ttyACM0") + g.add_argument("--cat-baud", type=int, default=38400) + g.add_argument("--diag-baud", type=int, default=115200) + g.add_argument("--cat-timeout", type=float, default=0.5) + + g = p.add_argument_group("analog discovery") + g.add_argument("--scope-rate", type=float, default=96000.0, + help="scope sample rate, Hz. Record mode gets unreliable " + "above ~250 kHz (default: %(default)s)") + g.add_argument("--capture", type=float, default=0.25, + help="seconds per capture (default: %(default)s)") + g.add_argument("--scope-range", type=float, default=5.0, + help="scope input range, volts. The speaker output needs " + "headroom for the receiver noise (default: %(default)s)") + g.add_argument("--awg-offset", type=float, default=0.0) + g.add_argument("--force-phase", type=int, choices=(1, -1), default=None, + help="skip quadrature detection and force this sense") + g.add_argument("--force-sideband", type=int, choices=(1, -1), default=None, + help="force the sideband: +1 takes audio from Fs/4 + f (USB), " + "-1 from Fs/4 - f (LSB). Normally detected.") + + g = p.add_argument_group("drive level") + g.add_argument("--start-amplitude", type=float, default=0.010, + help="initial AWG amplitude, volts peak (default: %(default)s)") + g.add_argument("--max-amplitude", type=float, default=1.0, + help="never drive the radio harder than this, volts peak. " + "Measured on the bench the recovered tone sits only " + "15-20 dB over the receiver's own noise even here, so " + "lowering it costs dynamic range (default: %(default)s)") + g.add_argument("--amp-step-db", type=float, default=3.0) + g.add_argument("--min-snr", type=float, default=12.0, + help="a point below this is not used in fits. The rig is " + "limited by the receiver noise, not the scope " + "(default: %(default)s)") + g.add_argument("--max-thd", type=float, default=-40.0) + g.add_argument("--min-image-rejection", type=float, default=15.0) + g.add_argument("--volume", type=int, default=30, + help="AF volume percent for the run. The audio output rises " + "very steeply with this: 54 clipped a 5 V scope range " + "outright (default: %(default)s)") + + g = p.add_argument_group("timing") + g.add_argument("--settle", type=float, default=0.20, + help="seconds after changing the stimulus (default: %(default)s)") + g.add_argument("--rate-settle", type=float, default=2.0, + help="seconds after a sample rate change (default: %(default)s)") + g.add_argument("--eq-points", type=int, default=9) + g.add_argument("--grid-points", type=int, default=31) + g.add_argument("--cw-tol-hz", type=float, default=5.0) + + g = p.add_argument_group("tolerances") + g.add_argument("--rate-tol-pct", type=float, default=1.5, + help="primary criterion: how far a frequency may move between " + "rates (default: %(default)s)") + g.add_argument("--nominal-tol-pct", type=float, default=4.0, + help="secondary: distance from the labelled frequency " + "(default: %(default)s)") + g.add_argument("--am-depth", type=float, default=50.0) + + g = p.add_argument_group("output") + g.add_argument("--out-dir", default=None, + help="default: results/ next to this script") + g.add_argument("--prefix", default="filter_hil") + g.add_argument("--json", default=None) + g.add_argument("--markdown", default=None) + g.add_argument("--no-plots", action="store_true") + g.add_argument("-v", "--verbose", action="store_true") + g.add_argument("-q", "--quiet", action="store_true") + + g = p.add_argument_group("safety") + g.add_argument("--allow-agc-on", action="store_true", + help="run even with AGC engaged. It compresses the very " + "differences being measured; results will be unreliable") + g.add_argument("--no-restore", action="store_true", + help="leave the radio in the test configuration") + g.add_argument("--dry-run", action="store_true", + help="validate arguments and the report path without hardware") + return p + + +def _int_list(text: str, upper: int) -> list: + if text.strip().lower() == "all": + return list(range(upper)) + return [int(x) for x in text.split(",") if x.strip()] + + +def run(args, argv) -> int: + started = time.monotonic() + quiet = args.quiet + + def log(msg: str = "") -> None: + if not quiet: + print(msg, file=sys.stderr) + + out_dir = args.out_dir or os.path.join(os.path.dirname(os.path.abspath(__file__)), + "results") + stamp = time.strftime("%Y%m%d_%H%M%S") + json_path = args.json or os.path.join(out_dir, f"{args.prefix}_{stamp}.json") + md_path = args.markdown or os.path.join(out_dir, f"{args.prefix}_{stamp}.md") + + rates = [int(r) for r in args.rates.split(",") if r.strip()] + selected = [t.strip() for t in args.tests.split(",") if t.strip()] + cw_indices = _int_list(args.cw_filters, len(bt.CW_FILTER_NOMINAL_HZ)) + eq_cells = _int_list(args.eq_cells, bt.EQ_CELL_COUNT) + fw_widths = [int(x) for x in args.fw_widths.split(",") if x.strip()] + + for r in rates: + if r not in bt.SAMPLE_RATES_HZ: + print(f"error: {r} is not a CAT-selectable sample rate " + f"(choose from {bt.SAMPLE_RATES_HZ})", file=sys.stderr) + return 2 + + if args.scope_rate > 250000: + log("WARNING: scope rates above 250 kHz drop samples in record mode.") + + config = {k: v for k, v in vars(args).items()} + config["resolved"] = {"json": json_path, "markdown": md_path, + "rates": rates, "tests": selected} + + if args.dry_run: + doc = report_mod.build_document( + provenance=report_mod.collect_provenance(argv, REPO_ROOT), + config=config, rig={}, baseline={}, final={}, state_restored=True, + residual_diff={}, per_rate={}, comparison={}, checks=[], + duration_s=time.monotonic() - started, warnings=["dry run: no hardware touched"]) + report_mod.write_json(doc, json_path) + report_mod.write_markdown(doc, md_path) + print(f"Dry run OK. Wrote {json_path} and {md_path}") + return 0 + + warnings: list[str] = [] + per_rate: dict = {} + all_checks: list = [] + rig: dict = {} + baseline_summary: dict = {} + final_summary: dict = {} + residual: dict = {} + restored = False + + cfg = Ad2Config(scope_rate_hz=args.scope_rate, capture_s=args.capture, + scope_range_v=args.scope_range, awg_offset_v=args.awg_offset) + + try: + with Ad2(cfg, log=log) as ad2, Radio( + args.cat_port, args.diag_port, args.cat_baud, args.diag_baud, + args.cat_timeout, log=log) as radio: + + ad2.configure_scope() + + log("\n== Preflight ==") + pre, ed = T.run_preflight(radio, ad2, args.allow_agc_on, log) + all_checks += pre.checks + baseline_summary = dict(pre.data["ed"]) + baseline_summary["id"] = pre.data["id"] + + if not ed.agc_off: + if not args.allow_agc_on: + print("\nerror: AGC is on. It compresses the amplitude " + "differences this suite measures, so every filter skirt " + "would read flat. Turn AGC off in the radio's menu, or " + "pass --allow-agc-on to proceed anyway.", file=sys.stderr) + return 2 + warnings.append("AGC was ON - every measurement here is unreliable") + + if ed.sample_rate_hz not in bt.SAMPLE_RATES_HZ: + print(f"error: radio reports sample rate {ed.sample_rate_hz}, which " + f"this suite cannot restore. Set it from the menu first.", + file=sys.stderr) + return 2 + + with RadioStateGuard(radio, ed, log=log) as guard: + if args.no_restore: + guard.restored = True # registered restores will be skipped + + # Register undo before changing anything. + guard.on_restore("sample rate", + lambda r=ed.sample_rate_hz: radio.set_sample_rate( + r, args.rate_settle)) + guard.on_restore("CW filter", + lambda v=ed.cw_filter_index: radio.set_cw_filter(v)) + guard.on_restore("equaliser", + lambda v=list(ed.equalizer_rec): radio.set_eq_all(v)) + guard.on_restore("noise reduction", + lambda v=ed.nr_option: radio.set_nr(v)) + guard.on_restore("notch", lambda v=ed.notch_on: radio.set_notch(v)) + guard.on_restore("volume", + lambda v=ed.audio_volume: radio.set_volume_pct(v)) + mod0 = ed.modulation[ed.active_vfo] + guard.on_restore("modulation", lambda m=mod0: radio.set_modulation(m)) + + # A quiet, unprocessed baseline for measurement. + radio.set_nr(0) + radio.set_notch(0) + if args.volume is not None: + radio.set_volume_pct(args.volume) + + try: + baseline_hi = radio.get_filter_hi_hz() + except CatError: + baseline_hi = max(fw_widths) + warnings.append("could not read the filter bandwidth back " + "(FW;); it will be restored to " + f"{baseline_hi} Hz") + guard.on_restore("filter bandwidth", + lambda v=baseline_hi: radio.set_filter_hi_hz(v)) + + # The fine tune shifts the demodulation centre away from Fs/4, + # often by kilohertz. Without it every injection misses the + # passband entirely. + plan = T.InjectionPlan(rate_hz=ed.sample_rate_hz, + fine_tune_hz=ed.active_fine_tune_hz, + amplitude_v=args.start_amplitude) + log(f"Demodulation centre: |Fs/4 {bt.fs_over_4_hz(ed.sample_rate_hz):.0f} " + f"{ed.active_fine_tune_hz:+.0f} fine tune| = {plan.centre_hz:.0f} Hz") + + # -- rig characterisation, once, at the starting rate ------ + phase_sign = args.force_phase or 1 + sideband_sign = args.force_sideband or 1 + if "iq" in selected: + log("\n== Detecting the wiring order and sideband ==") + res, phase_sign, sideband_sign = T.detect_iq_order( + ad2, plan, args.settle, args.min_image_rejection, + args.force_phase, args.max_amplitude, log) + all_checks += res.checks + rig.update(res.data) + if not res.checks[0].passed: + log("Cannot proceed without a usable quadrature sense.") + return 1 + plan.phase_sign = phase_sign + plan.sideband_sign = sideband_sign + + amplitude = args.start_amplitude + if "level" in selected: + log("\n== Choosing a drive level ==") + res, amplitude = T.autolevel( + ad2, plan, args.settle, args.start_amplitude, + args.max_amplitude, args.amp_step_db, args.min_snr, + args.max_thd, log) + all_checks += res.checks + if not res.checks[0].passed: + warnings.append(res.checks[0].message) + plan.amplitude_v = amplitude + + rig.update({ + "drive_amplitude_v": amplitude, + "scope_rate_hz": args.scope_rate, + "capture_s": args.capture, + "scope_range_v": args.scope_range, + }) + + grid = geom_grid(120.0, 4400.0, args.grid_points) + + # -- per rate ---------------------------------------------- + for rate in rates: + log(f"\n===== {rate} sps =====") + if rate != radio.get_sample_rate(): + radio.set_sample_rate(rate, args.rate_settle) + plan.rate_hz = rate + plan.fine_tune_hz = radio.dump_ed().active_fine_tune_hz + plan.sidetone_hz = 0.0 + plan.mapping_correction_hz = 0.0 + + bucket: dict = { + "rate_hz": rate, + "fs_over_4_hz": bt.fs_over_4_hz(rate), + "audio_rate_hz": bt.audio_rate_hz(rate), + } + + inj = T.Injector(ad2, plan, args.settle, args.min_snr, args.max_thd) + + if "map" in selected: + log("-- Fs/4 mapping --") + res = T.calibrate_mapping(ad2, plan, args.settle, log) + all_checks += res.checks + bucket["mapping"] = res.data + if not all(c.passed for c in res.checks): + log("Mapping failed; skipping the rest of this rate.") + bucket["skipped"] = "mapping_failed" + per_rate[str(rate)] = bucket + continue + + reference = None + if "ref" in selected: + log("-- Reference sweep --") + reference = T.reference_sweep(inj, grid, log) + all_checks += reference.checks + bucket["reference_sweep"] = reference.data + + if "ssb" in selected: + log("-- SSB filter (control) --") + res = T.test_ssb_filter(radio, inj, fw_widths, baseline_hi, log) + all_checks += res.checks + bucket["ssb_filter"] = res.data + + if "eq" in selected and reference is not None: + log("-- Equaliser cells --") + res = T.test_equalizer_cells(radio, inj, reference, + eq_cells, args.eq_points, + baseline_hi, log) + all_checks += res.checks + bucket["equalizer_cells"] = res.data + + if "cw" in selected: + log("-- CW audio filters --") + radio.enter_cw() + time.sleep(0.5) + # Bypass the filter under test before calibrating, or the + # mapping probes are measured through it and the ones + # outside its passband come back as noise. + radio.set_cw_filter(bt.CW_FILTER_OFF) + plan.sidetone_hz = radio.sidetone_shift_hz(ed, in_cw=True) + plan.mapping_correction_hz = 0.0 + cw_map = T.calibrate_mapping(ad2, plan, args.settle, log) + bucket["cw_mapping"] = cw_map.data + if all(c.passed for c in cw_map.checks): + res = T.test_cw_filters(radio, inj, cw_indices, + args.cw_tol_hz, baseline_hi, + log) + all_checks += res.checks + bucket["cw_filters"] = res.data + else: + all_checks += cw_map.checks + log("CW mapping failed; skipping the CW filters.") + radio.set_modulation(mod0) + time.sleep(0.5) + plan.sidetone_hz = 0.0 + plan.mapping_correction_hz = 0.0 + + if "am" in selected: + if ed.modulation[ed.active_vfo] == MOD_AM or True: + log("-- AM DC blocker --") + radio.set_modulation(MOD_AM) + time.sleep(0.5) + am_plan = T.InjectionPlan( + rate_hz=rate, fine_tune_hz=plan.fine_tune_hz, + phase_sign=plan.phase_sign, + sideband_sign=plan.sideband_sign, + amplitude_v=plan.amplitude_v) + res = T.test_am_dc_blocker( + ad2, am_plan, args.settle, args.am_depth, + args.min_snr, log) + all_checks += res.checks + bucket["am_dc_blocker"] = res.data + radio.set_modulation(mod0) + time.sleep(0.5) + + per_rate[str(rate)] = bucket + + # -- cross-rate comparison --------------------------------- + log("\n== Comparing rates ==") + comparison, cmp_checks = T.compare_rates( + per_rate, args.rate_tol_pct, args.nominal_tol_pct) + all_checks += cmp_checks + + ad2.awg_off() + + restored = guard.restored and not args.no_restore + if not args.no_restore: + residual = guard.verify() + try: + final_summary = radio.dump_ed().summary() + except CatError: + final_summary = {} + if guard.failures: + warnings += guard.failures + else: + warnings.append("--no-restore: the radio was left in the test " + "configuration") + + except DwfError as exc: + print(f"error: {exc}", file=sys.stderr) + return 2 + except CatError as exc: + print(f"error: {exc}", file=sys.stderr) + return 2 + except KeyboardInterrupt: + print("\naborted - the AWG has been silenced, but the radio may still be " + "in the test configuration", file=sys.stderr) + return 3 + + doc = report_mod.build_document( + provenance=report_mod.collect_provenance(argv, REPO_ROOT, + dwf_version=cfg and ""), + config=config, rig=rig, baseline=baseline_summary, final=final_summary, + state_restored=restored, residual_diff=residual, per_rate=per_rate, + comparison=comparison, checks=all_checks, + duration_s=time.monotonic() - started, warnings=warnings) + + report_mod.write_json(doc, json_path) + doc["artifacts"]["json"] = json_path + + png_paths: list = [] + if not args.no_plots: + try: + if __package__ in (None, ""): + from filter_hil.plot_filter_hil import render_all + else: + from .plot_filter_hil import render_all + png_paths = render_all(doc, out_dir, f"{args.prefix}_{stamp}") + doc["artifacts"]["png"] = png_paths + except Exception as exc: + warnings.append(f"could not render plots: {exc}") + doc["warnings"] = warnings + + report_mod.write_markdown(doc, md_path, png_paths) + doc["artifacts"]["markdown"] = md_path + report_mod.write_json(doc, json_path) + + report_mod.print_summary(doc) + return 0 if doc["summary"]["overall"] == "PASS" else 1 + + +def main() -> int: + argv = sys.argv[1:] + args = build_parser().parse_args(argv) + return run(args, ["filter_hil_test.py"] + argv) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/code/tools/filter_hil/measure.py b/code/tools/filter_hil/measure.py new file mode 100644 index 0000000..c505618 --- /dev/null +++ b/code/tools/filter_hil/measure.py @@ -0,0 +1,368 @@ +"""Tone metrology and curve-feature extraction for the filter HIL suite. + +The suite measures filter responses by injecting a tone and reading the level of +that tone out of the demodulated audio. Everything here is about doing that +accurately enough to compare two sample rates: the shift being hunted is 8.125 % +in frequency, and the tolerance is 1.5 %, so amplitude estimates need to be good +to a small fraction of a decibel and frequency estimates to a fraction of a bin. + +The FFT approach is lifted from ``code/tools/receive_chain_test.py`` - Hann +window with coherent-gain correction, plus parabolic interpolation for sub-bin +peak location. Peak picking in the time domain, which some of the older tools +use, is not good enough here: a sine sampled at 6 points per cycle can read over +a decibel low depending on where the samples land. +""" + +from __future__ import annotations + +import math +from dataclasses import dataclass, field +from typing import Callable, Sequence + +import numpy as np + +from .ad2 import Capture + +# Levels below this are the float noise of the measurement, not signal. +FLOOR_DBV = -140.0 + + +def _to_db(x: float) -> float: + return 20.0 * math.log10(max(float(x), 1e-15)) + + +def spectrum_dbv(samples: np.ndarray, fs_hz: float) -> tuple[np.ndarray, np.ndarray]: + """Return (freqs_hz, amplitude) of a real signal. + + Amplitude is in volts peak, corrected for the Hann window's coherent gain, + so a 1 V amplitude sine reads 1.0 at its own frequency. + """ + n = len(samples) + if n < 16: + return np.zeros(0), np.zeros(0) + ac = samples - np.mean(samples) + window = np.hanning(n) + coherent_gain = window.sum() / n + spec = np.fft.rfft(ac * window) / (n * coherent_gain) * 2.0 + freqs = np.fft.rfftfreq(n, d=1.0 / fs_hz) + return freqs, np.abs(spec) + + +def parabolic_peak(mag: np.ndarray, idx: int) -> float: + """Sub-bin offset of a peak, by fitting a parabola to its three points.""" + if idx <= 0 or idx >= len(mag) - 1: + return 0.0 + a, b, c = mag[idx - 1], mag[idx], mag[idx + 1] + denom = a - 2.0 * b + c + if denom == 0.0: + return 0.0 + return float(0.5 * (a - c) / denom) + + +def correlate_amplitude(samples: np.ndarray, fs_hz: float, f_hz: float) -> float: + """Amplitude of a known-frequency component, by windowed correlation. + + Reading the tallest FFT bin costs up to 1.4 dB when the tone falls between + bins - Hann's scalloping loss. That cancels when two captures are compared at + the same frequency, which is how this suite mostly works, but not when an + absolute level is wanted. Correlating against a complex exponential at the + measured frequency has no such error. + """ + n = len(samples) + if n < 16: + return 0.0 + ac = samples - np.mean(samples) + window = np.hanning(n) + phase = 2.0 * np.pi * f_hz * np.arange(n) / fs_hz + ref = np.exp(-1j * phase) + return float(2.0 * np.abs(np.sum(ac * window * ref)) / window.sum()) + + +def band_amplitude(freqs: np.ndarray, mag: np.ndarray, f0_hz: float, + bw_hz: float) -> tuple[float, float]: + """Peak amplitude within +/- bw_hz of f0_hz, and its interpolated frequency. + + A window rather than a single bin, because the radio's audio frequency can + differ from the requested one by a few Hz (the Fs/4 mapping is measured, not + assumed) and because a Hann window spreads a tone over several bins. + """ + if freqs.size == 0: + return 0.0, f0_hz + sel = np.where(np.abs(freqs - f0_hz) <= bw_hz)[0] + if sel.size == 0: + return 0.0, f0_hz + local = int(sel[np.argmax(mag[sel])]) + delta = parabolic_peak(mag, local) + df = freqs[1] - freqs[0] + return float(mag[local]), float((local + delta) * df) + + +@dataclass +class ToneMeasurement: + """One tone level read out of one capture.""" + + f_target_hz: float + f_measured_hz: float + amplitude_v: float + level_dbv: float + rms_v: float + peak_v: float + dc_v: float + snr_db: float + thd_db: float + clipped: bool + lost: int + corrupted: int + valid: bool + reason: str = "" + + +def measure_tone(cap: Capture, f_expect_hz: float, *, scope_range_v: float, + clip_margin: float = 0.90, search_bw_hz: float = 60.0, + n_harmonics: int = 5, min_snr_db: float = 20.0, + max_thd_db: float = -30.0, + thd_invalidates: bool = False) -> ToneMeasurement: + """Measure one tone, and decide whether the measurement can be trusted. + + A point is marked invalid when the capture dropped samples, when the input + clipped, or when the tone is buried. Invalid points are excluded from curve + fits rather than dragging them off. + + ``thd_db`` is always reported but by default does **not** invalidate a + point. Measured through a receiver, the harmonic bins contain the receiver's + own noise as much as any real distortion, so at the 15-20 dB SNR this rig + achieves the figure tracks the noise floor rather than the linearity - and + a little distortion at 2f does not corrupt the level measured at f anyway. + Auto-levelling passes ``thd_invalidates=True`` because there it genuinely is + the signal that the drive has gone too far. + """ + fs = cap.sample_rate_hz + samples = cap.samples + freqs, mag = spectrum_dbv(samples, fs) + + # Locate the tone from the spectrum, then read its amplitude by correlating + # at that frequency - the FFT bin alone is up to 1.4 dB low off-bin. + _, f_measured = band_amplitude(freqs, mag, f_expect_hz, search_bw_hz) + amplitude = correlate_amplitude(samples, fs, f_measured) + dc = float(np.mean(samples)) + ac = samples - dc + rms = float(np.sqrt(np.mean(ac ** 2))) + peak = float(np.max(np.abs(samples))) if samples.size else 0.0 + + # Noise = everything above 20 Hz that is not the tone or its harmonics. + df = freqs[1] - freqs[0] if freqs.size > 1 else 1.0 + mask = freqs > 20.0 + for k in range(1, n_harmonics + 1): + fk = f_measured * k + if fk < fs / 2: + mask &= np.abs(freqs - fk) > max(search_bw_hz, 3 * df) + noise_power = float(np.sum(mag[mask] ** 2)) + tone_power = amplitude ** 2 + snr = 10.0 * math.log10(tone_power / noise_power) if noise_power > 0 and tone_power > 0 else -99.0 + + # Harmonic distortion, relative to the fundamental. + harm_power = 0.0 + for k in range(2, n_harmonics + 1): + fk = f_measured * k + if fk < fs / 2: + hk, _ = band_amplitude(freqs, mag, fk, max(search_bw_hz, 3 * df)) + harm_power += hk ** 2 + thd = 10.0 * math.log10(harm_power / tone_power) if tone_power > 0 and harm_power > 0 else -99.0 + + clipped = peak >= clip_margin * scope_range_v + + reasons = [] + if cap.lost or cap.corrupted: + reasons.append(f"capture dropped {cap.lost} lost / {cap.corrupted} corrupted samples") + if clipped: + reasons.append(f"peak {peak:.3f} V exceeds {clip_margin:.0%} of the {scope_range_v} V range") + if snr < min_snr_db: + reasons.append(f"SNR {snr:.1f} dB below {min_snr_db:.1f} dB") + if thd_invalidates and thd > max_thd_db: + reasons.append(f"THD {thd:.1f} dB above {max_thd_db:.1f} dB") + + return ToneMeasurement( + f_target_hz=f_expect_hz, + f_measured_hz=f_measured, + amplitude_v=amplitude, + level_dbv=_to_db(amplitude), + rms_v=rms, + peak_v=peak, + dc_v=dc, + snr_db=snr, + thd_db=thd, + clipped=clipped, + lost=cap.lost, + corrupted=cap.corrupted, + valid=not reasons, + reason="; ".join(reasons), + ) + + +def dominant_tone(cap: Capture, f_min_hz: float = 50.0, + f_max_hz: float | None = None) -> tuple[float, float]: + """Frequency and amplitude of the strongest component in a band. + + Used by the Fs/4 mapping calibration, which has to find where the audio + actually landed rather than look where it was expected. + """ + freqs, mag = spectrum_dbv(cap.samples, cap.sample_rate_hz) + if freqs.size == 0: + return 0.0, 0.0 + hi = f_max_hz if f_max_hz is not None else cap.sample_rate_hz / 2 + sel = np.where((freqs >= f_min_hz) & (freqs <= hi))[0] + if sel.size == 0: + return 0.0, 0.0 + idx = int(sel[np.argmax(mag[sel])]) + df = freqs[1] - freqs[0] + return float((idx + parabolic_peak(mag, idx)) * df), float(mag[idx]) + + +# --- grids and curve features --------------------------------------------- + +def geom_grid(f_lo_hz: float, f_hi_hz: float, n: int) -> np.ndarray: + """Geometrically spaced frequencies - constant fractional resolution.""" + return np.geomspace(f_lo_hz, f_hi_hz, n) + + +def peak_from_three(freqs: Sequence[float], levels_db: Sequence[float]) -> float: + """Interpolated peak of a resonance, fitted in (log f, dB). + + A bandpass response is close to parabolic in log-frequency near its peak, so + fitting the three highest points there locates the centre far better than + taking the largest sample - which would quantise to the probe grid. + """ + f = np.asarray(freqs, dtype=float) + y = np.asarray(levels_db, dtype=float) + if f.size < 3: + return float(f[int(np.argmax(y))]) if f.size else float("nan") + + i = int(np.argmax(y)) + i = max(1, min(i, f.size - 2)) + x = np.log(f[i - 1:i + 2]) + yy = y[i - 1:i + 2] + denom = yy[0] - 2.0 * yy[1] + yy[2] + if denom == 0.0: + return float(f[i]) + delta = 0.5 * (yy[0] - yy[2]) / denom + # Guard against a fit that runs away when the three points are nearly flat. + if not np.isfinite(delta) or abs(delta) > 1.0: + return float(f[i]) + step = x[1] - x[0] + return float(np.exp(x[1] + delta * step)) + + +def interpolate_crossing(f_lo: float, db_lo: float, f_hi: float, db_hi: float, + target_db: float) -> float: + """Linear interpolation for where a response crosses a level.""" + if db_hi == db_lo: + return f_lo + return f_lo + (target_db - db_lo) * (f_hi - f_lo) / (db_hi - db_lo) + + +def find_crossing(probe: Callable[[float], float], target_db: float, + f_lo_hz: float, f_hi_hz: float, tol_hz: float = 5.0, + max_iter: int = 12) -> tuple[float, list[tuple[float, float]]]: + """Bisect a monotonically falling response for where it crosses target_db. + + Returns the crossing frequency and every (frequency, level) pair probed, so + the report can show how the number was arrived at. + + The caller must supply a bracket where the response is above the target at + f_lo and below it at f_hi; returns NaN if that does not hold, rather than + converging on nonsense. + """ + trace: list[tuple[float, float]] = [] + + def sample(f: float) -> float: + db = probe(f) + trace.append((f, db)) + return db + + lo, hi = float(f_lo_hz), float(f_hi_hz) + db_lo = sample(lo) + db_hi = sample(hi) + + # A probe can come back NaN because the tone dropped below the noise, which + # is what the far side of a filter skirt looks like. Bisect towards it as if + # it were deep in the stopband, but never interpolate through it - the + # crossing is worked out at the end from the finite probes only. + def below(db: float) -> bool: + return (not np.isfinite(db)) or db <= target_db + + if np.isfinite(db_lo) and db_lo < target_db: + return float("nan"), trace + if np.isfinite(db_hi) and db_hi > target_db: + return float("nan"), trace + + for _ in range(max_iter): + if hi - lo <= tol_hz: + break + mid = 0.5 * (lo + hi) + if below(sample(mid)): + hi = mid + else: + lo = mid + + finite = sorted((f, db) for f, db in trace if np.isfinite(db)) + for (f0, d0), (f1, d1) in zip(finite, finite[1:]): + if d0 >= target_db >= d1: + return interpolate_crossing(f0, d0, f1, d1, target_db), trace + return float("nan"), trace + + +def bandwidth_3db(freqs: Sequence[float], levels_db: Sequence[float]) -> tuple[float, float, float]: + """(-3 dB low edge, high edge, Q) of a sampled bandpass response. + + Interpolates between grid points on each side of the peak. Returns NaNs when + the sweep does not actually straddle the -3 dB level on both sides. + """ + f = np.asarray(freqs, dtype=float) + y = np.asarray(levels_db, dtype=float) + if f.size < 3: + return float("nan"), float("nan"), float("nan") + + order = np.argsort(f) + f, y = f[order], y[order] + i = int(np.argmax(y)) + target = y[i] - 3.0 + + lo = float("nan") + for j in range(i, 0, -1): + if y[j - 1] <= target <= y[j]: + lo = interpolate_crossing(f[j - 1], y[j - 1], f[j], y[j], target) + break + + hi = float("nan") + for j in range(i, f.size - 1): + if y[j + 1] <= target <= y[j]: + hi = interpolate_crossing(f[j], y[j], f[j + 1], y[j + 1], target) + break + + if not (np.isfinite(lo) and np.isfinite(hi)) or hi <= lo: + return lo, hi, float("nan") + centre = peak_from_three(f, y) + return lo, hi, float(centre / (hi - lo)) + + +def stats(values: Sequence[float], unit: str = "hz") -> dict: + """Summary statistics, keyed the way flag_timing.py keys them.""" + arr = np.asarray([v for v in values if np.isfinite(v)], dtype=float) + if arr.size == 0: + return {"count": 0} + return { + "count": int(arr.size), + f"min_{unit}": float(np.min(arr)), + f"max_{unit}": float(np.max(arr)), + f"mean_{unit}": float(np.mean(arr)), + f"median_{unit}": float(np.median(arr)), + f"p95_{unit}": float(np.percentile(arr, 95)), + f"stddev_{unit}": float(np.std(arr)), + } + + +def pct_delta(reference: float, other: float) -> float: + """Percentage change from reference to other.""" + if not np.isfinite(reference) or reference == 0.0 or not np.isfinite(other): + return float("nan") + return 100.0 * (other - reference) / reference diff --git a/code/tools/filter_hil/plot_filter_hil.py b/code/tools/filter_hil/plot_filter_hil.py new file mode 100644 index 0000000..729221a --- /dev/null +++ b/code/tools/filter_hil/plot_filter_hil.py @@ -0,0 +1,370 @@ +#!/usr/bin/env python3 +"""Render figures from a filter HIL results file. + +Takes the JSON written by ``filter_hil_test.py`` and produces the PNGs the +Markdown report embeds. Kept separate from the measurement so figures can be +regenerated - restyled, re-cropped, argued about - long after the rig has been +packed away, which is the same split as flag_timing.py and plot_flag_timing.py. + + python3 plot_filter_hil.py results/filter_hil_20260728_101500.json +""" + +from __future__ import annotations + +import argparse +import json +import os +import sys + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import numpy as np + +if __package__ in (None, ""): + sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + from filter_hil import bandtable as bt +else: + from . import bandtable as bt + +DPI = 110 +RATE_STYLE = {0: dict(ls="-", lw=1.8), 1: dict(ls="--", lw=1.3)} + + +def _footer(fig, doc: dict) -> None: + """Stamp provenance under every figure so a stray PNG is still traceable.""" + p = doc.get("provenance", {}) + rig = doc.get("rig", {}) + bits = [ + doc.get("generated_utc", ""), + f"commit {p.get('git_commit', '?')}" + ("+dirty" if p.get("git_dirty") else ""), + rig.get("wiring", ""), + f"drive {rig.get('drive_amplitude_v', 0)*1000:.0f} mV", + ] + fig.text(0.5, 0.012, " | ".join(b for b in bits if b), ha="center", fontsize=7, + bbox=dict(boxstyle="round", facecolor="wheat", alpha=0.5)) + + +def _rates(doc: dict) -> list: + return sorted(doc.get("rates", {}), key=lambda r: -int(r)) + + +def _save(fig, out_dir: str, name: str, paths: list) -> None: + os.makedirs(out_dir, exist_ok=True) + path = os.path.join(out_dir, name) + fig.savefig(path, dpi=DPI, bbox_inches="tight") + plt.close(fig) + paths.append(path) + print(path) + + +def plot_cw_overlay(doc: dict, out_dir: str, prefix: str, paths: list) -> None: + """Both rates on one axis, with the shift the old firmware would have shown. + + This is the figure to look at first: if the solid and dashed curves for a + given filter lie on top of each other and well away from the dotted + prediction, the filters are tracking the sample rate correctly. + """ + rates = _rates(doc) + have = [r for r in rates if doc["rates"][r].get("cw_filters")] + if not have: + return + + fig, ax = plt.subplots(figsize=(11, 6.5)) + colors = plt.cm.viridis(np.linspace(0, 0.85, len(bt.CW_FILTER_NOMINAL_HZ))) + + for ri, rate in enumerate(have): + for f in doc["rates"][rate]["cw_filters"]["filters"]: + k = f["index"] + # Merge the bisection probes into the coarse sweep. A 12 pole + # Chebyshev falls from 0 to -40 dB between adjacent coarse points, + # so without them the plot shows a flat line and a cliff; the + # bisection is exactly where the interesting detail was measured. + pts = [(p["f_audio_hz"], p["resp_db"]) for p in f["points"] + if p["resp_db"] is not None] + pts += [(t[0], t[1]) for t in f.get("bisection_trace", []) + if t[1] is not None] + if not pts: + continue + pts = sorted(set(pts)) + x, y = zip(*sorted(pts)) + ax.semilogx(x, y, color=colors[k], **RATE_STYLE.get(ri, RATE_STYLE[1]), + label=f"{f['nominal_hz']:.0f} Hz @ {int(rate)//1000}k") + + # Where the corners would sit if the coefficient tables were still frozen. + if len(have) > 1: + base = have[0] + for f in doc["rates"][base]["cw_filters"]["filters"]: + c = f.get("corner_3db_hz") + if c: + ax.axvline(c * bt.LEGACY_RATE_RATIO, color="red", ls=":", lw=1.0, alpha=0.6) + ax.plot([], [], color="red", ls=":", lw=1.0, + label=f"where the old frozen tables would put them " + f"({bt.LEGACY_DELTA_PCT:.2f}%)") + + ax.axhline(-3.0, color="k", lw=0.8, alpha=0.5) + ax.set_xlabel("audio frequency (Hz)") + ax.set_ylabel("filter response (dB)") + ax.set_ylim(-45, 6) + ax.set_xlim(200, 5000) + ax.grid(alpha=0.3, which="both") + ax.legend(fontsize=7, ncol=2, loc="lower left") + solid = f"{int(have[0])//1000}k solid" + dashed = f", {int(have[1])//1000}k dashed" if len(have) > 1 else "" + ax.set_title(f"CW audio filters at both sample rates ({solid}{dashed})") + _footer(fig, doc) + _save(fig, out_dir, f"{prefix}_cw_overlay.png", paths) + + +def plot_eq_centres(doc: dict, out_dir: str, prefix: str, paths: list) -> None: + """Measured versus labelled centre, and the error per cell.""" + rates = _rates(doc) + have = [r for r in rates if doc["rates"][r].get("equalizer_cells")] + if not have: + return + + fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(11, 8)) + + for ri, rate in enumerate(have): + cells = doc["rates"][rate]["equalizer_cells"]["cells"] + nom = [c["nominal_hz"] for c in cells if c["peak_hz"]] + meas = [c["peak_hz"] for c in cells if c["peak_hz"]] + ax1.loglog(nom, meas, "o" if ri == 0 else "s", ms=5, + label=f"{int(rate)//1000}k sps", alpha=0.8) + err = [100.0 * (m - n) / n for n, m in zip(nom, meas)] + idx = [c["index"] for c in cells if c["peak_hz"]] + ax2.plot(idx, err, "o-" if ri == 0 else "s--", ms=4, + label=f"{int(rate)//1000}k sps", alpha=0.85) + + lim = [150, 5000] + ax1.plot(lim, lim, "k-", lw=0.8, alpha=0.5, label="ideal") + ax1.set_xlabel("labelled centre (Hz)") + ax1.set_ylabel("measured peak (Hz)") + ax1.set_title("Equaliser cell centres") + ax1.grid(alpha=0.3, which="both") + ax1.legend(fontsize=8) + + tol = doc.get("config", {}).get("nominal_tol_pct", 4.0) + ax2.axhspan(-tol, tol, color="green", alpha=0.12, + label=f"nominal tolerance +/-{tol:.0f}%") + ax2.axhline(bt.LEGACY_DELTA_PCT, color="red", ls=":", lw=1.2, + label=f"old frozen-table shift ({bt.LEGACY_DELTA_PCT:.2f}%)") + ax2.axhline(0.0, color="k", lw=0.8) + ax2.set_xlabel("equaliser cell") + ax2.set_ylabel("error vs labelled (%)") + ax2.set_xticks(range(bt.EQ_CELL_COUNT)) + ax2.grid(alpha=0.3) + ax2.legend(fontsize=8) + + _footer(fig, doc) + plt.tight_layout(rect=[0, 0.035, 1, 1]) + _save(fig, out_dir, f"{prefix}_eq_centres.png", paths) + + +def plot_eq_cells(doc: dict, out_dir: str, prefix: str, paths: list) -> None: + """The response of every cell, per rate.""" + for rate in _rates(doc): + cells = doc["rates"][rate].get("equalizer_cells", {}).get("cells") + if not cells: + continue + fig, ax = plt.subplots(figsize=(11, 6)) + colors = plt.cm.turbo(np.linspace(0, 1, bt.EQ_CELL_COUNT)) + for c in cells: + pts = [(p["f_audio_hz"], p["level_dbv"]) for p in c["points"] + if p.get("level_dbv") is not None and p.get("valid")] + if len(pts) < 2: + continue + x, y = zip(*sorted(pts)) + y = np.asarray(y) - max(y) + ax.semilogx(x, y, color=colors[c["index"]], lw=1.4) + if c["peak_hz"]: + ax.axvline(c["nominal_hz"], color=colors[c["index"]], lw=0.6, alpha=0.4) + ax.set_xlabel("audio frequency (Hz)") + ax.set_ylabel("normalised response (dB)") + ax.set_ylim(-25, 3) + ax.grid(alpha=0.3, which="both") + ax.set_title(f"Equaliser cells at {int(rate)//1000} ksps " + f"(vertical lines are the labelled centres)") + _footer(fig, doc) + _save(fig, out_dir, f"{prefix}_eq_cells_{rate}.png", paths) + + +def plot_ssb_control(doc: dict, out_dir: str, prefix: str, paths: list) -> None: + """The control chart: commanded bandwidth against measured edge.""" + rates = _rates(doc) + have = [r for r in rates if doc["rates"][r].get("ssb_filter")] + if not have: + return + + fig, ax = plt.subplots(figsize=(9, 6)) + for ri, rate in enumerate(have): + rows = doc["rates"][rate]["ssb_filter"]["settings"] + x = [r["fw_hz"] for r in rows if r["hi_edge_6db_hz"]] + y = [r["hi_edge_6db_hz"] for r in rows if r["hi_edge_6db_hz"]] + ax.plot(x, y, "o-" if ri == 0 else "s--", ms=6, + label=f"{int(rate)//1000}k sps") + lo, hi = 1500, 3400 + ax.plot([lo, hi], [lo, hi], "k-", lw=0.8, alpha=0.5, label="ideal") + ax.set_xlabel("commanded bandwidth, FW (Hz)") + ax.set_ylabel("measured -6 dB edge (Hz)") + ax.set_title("SSB convolution filter - the control\n" + "This filter always derived its coefficients from the true sample " + "rate,\nso a shift here means the rig or the analysis is wrong, " + "not the firmware") + ax.grid(alpha=0.3) + ax.legend(fontsize=8) + _footer(fig, doc) + plt.tight_layout(rect=[0, 0.04, 1, 1]) + _save(fig, out_dir, f"{prefix}_ssb_control.png", paths) + + +def plot_am(doc: dict, out_dir: str, prefix: str, paths: list) -> None: + """AM DC blocker envelope response.""" + rates = _rates(doc) + have = [r for r in rates if doc["rates"][r].get("am_dc_blocker")] + if not have: + return + fig, ax = plt.subplots(figsize=(9, 5.5)) + for ri, rate in enumerate(have): + d = doc["rates"][rate]["am_dc_blocker"] + pts = [(p["f_mod_hz"], p["resp_db"]) for p in d["points"] + if p["resp_db"] is not None] + if not pts: + continue + x, y = zip(*sorted(pts)) + ax.semilogx(x, y, "o-" if ri == 0 else "s--", ms=4, + label=f"{int(rate)//1000}k sps " + f"(-3 dB at {d.get('corner_3db_hz', float('nan')):.1f} Hz)") + ax.axhline(-3.0, color="k", lw=0.8, alpha=0.6) + ax.axvline(bt.AM_DC_BLOCKER_CORNER_HZ, color="green", ls="--", lw=1.0, + label=f"design corner {bt.AM_DC_BLOCKER_CORNER_HZ:.0f} Hz") + ax.set_xlabel("modulation frequency (Hz)") + ax.set_ylabel("envelope response (dB)") + ax.set_title("AM demodulator DC blocker") + ax.grid(alpha=0.3, which="both") + ax.legend(fontsize=8) + _footer(fig, doc) + _save(fig, out_dir, f"{prefix}_am_dc_blocker.png", paths) + + +def plot_summary(doc: dict, out_dir: str, prefix: str, paths: list) -> None: + """Every cross-rate result on one chart, against the two reference lines.""" + comp = doc.get("comparison", {}) + rows = [] + for group, key, label in (("cw_filters", "corner_3db_hz", "CW"), + ("eq_cells", "peak_hz", "EQ"), + ("ssb_filter", "hi_edge_6db_hz", "SSB")): + for r in comp.get(group, []): + if r.get("delta_pct") is not None: + rows.append((f"{label} {r['nominal_hz']:.0f}", r["delta_pct"], + r["verdict"])) + if not rows: + return + + labels, deltas, verdicts = zip(*rows) + fig, ax = plt.subplots(figsize=(10, max(5, 0.28 * len(rows) + 2))) + y = np.arange(len(rows)) + colors = ["tab:green" if v == "PASS" else "tab:red" for v in verdicts] + ax.barh(y, deltas, color=colors, alpha=0.85) + # A row that measured exactly zero would otherwise draw no bar at all and + # read as missing data rather than as the best possible result. + ax.scatter(deltas, y, s=14, color=colors, zorder=3) + + tol = doc.get("config", {}).get("rate_tol_pct", 1.5) + ax.axvspan(-tol, tol, color="green", alpha=0.12, label=f"tolerance +/-{tol}%") + ax.axvline(0.0, color="k", lw=1.0) + ax.axvline(bt.LEGACY_DELTA_PCT, color="red", ls=":", lw=1.4, + label=f"old frozen-table shift ({bt.LEGACY_DELTA_PCT:.3f}%)") + + ax.set_yticks(y) + ax.set_yticklabels(labels, fontsize=7) + ax.invert_yaxis() + ax.set_xlabel("frequency change between sample rates (%)") + s = doc["summary"] + ax.set_title(f"Rate independence: {s['overall']} " + f"({s['passed']} passed, {s['failed']} failed, {s['skipped']} skipped)") + ax.grid(alpha=0.3, axis="x") + ax.legend(fontsize=8, loc="lower right") + _footer(fig, doc) + plt.tight_layout(rect=[0, 0.04, 1, 1]) + _save(fig, out_dir, f"{prefix}_summary.png", paths) + + +def plot_iq_detect(doc: dict, out_dir: str, prefix: str, paths: list) -> None: + """The two quadrature trials, for when the wiring detection misbehaves.""" + trials = doc.get("rig", {}).get("trials") + if not trials: + return + fig, ax = plt.subplots(figsize=(9, 4.5)) + names, levels, colors = [], [], [] + chosen_phase = doc["rig"].get("phase_sign") + chosen_side = doc["rig"].get("sideband_sign") + for key, t in sorted(trials.items()): + ph, side = t.get("phase_sign", 0), t.get("sideband_sign", 0) + names.append(f"W2 {ph*90:+d}\n{'above' if side > 0 else 'below'}") + levels.append(t.get("level_dbv") or -140.0) + colors.append("tab:green" if (ph == chosen_phase and side == chosen_side) + else "tab:blue") + ax.bar(names, levels, color=colors, alpha=0.85) + ax.set_xlabel("W2 phase / side of the demodulation centre") + ax.set_ylabel("recovered audio level (dBV)") + rej = doc["rig"].get("image_rejection_db") + ax.set_title(f"I/Q wiring detection\n{doc['rig'].get('wiring', '')}" + + (f" - image rejection {rej:.1f} dB" if rej else "")) + ax.grid(alpha=0.3, axis="y") + _footer(fig, doc) + plt.tight_layout(rect=[0, 0.06, 1, 1]) + _save(fig, out_dir, f"{prefix}_iq_detect.png", paths) + + +RENDERERS = { + "summary": plot_summary, + "cw": plot_cw_overlay, + "eq": lambda *a: (plot_eq_centres(*a), plot_eq_cells(*a)), + "ssb": plot_ssb_control, + "am": plot_am, + "iq": plot_iq_detect, +} + + +def render_all(doc: dict, out_dir: str, prefix: str, + only: list | None = None) -> list: + """Render every figure the document supports; returns the PNG paths.""" + paths: list = [] + for name, fn in RENDERERS.items(): + if only and name not in only: + continue + try: + fn(doc, out_dir, prefix, paths) + except Exception as exc: + print(f"warning: could not render {name}: {exc}", file=sys.stderr) + return paths + + +def main() -> int: + p = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + p.add_argument("json_file") + p.add_argument("--out-dir", default=None) + p.add_argument("--prefix", default=None) + p.add_argument("--only", default=None, + help=f"comma-separated subset of {','.join(RENDERERS)}") + args = p.parse_args() + + with open(args.json_file) as fh: + doc = json.load(fh) + + out_dir = args.out_dir or os.path.dirname(os.path.abspath(args.json_file)) + prefix = args.prefix or os.path.splitext(os.path.basename(args.json_file))[0] + only = [x.strip() for x in args.only.split(",")] if args.only else None + + paths = render_all(doc, out_dir, prefix, only) + if not paths: + print("no figures rendered - does the results file contain any measurements?", + file=sys.stderr) + return 1 + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/code/tools/filter_hil/radio.py b/code/tools/filter_hil/radio.py new file mode 100644 index 0000000..3b08f2e --- /dev/null +++ b/code/tools/filter_hil/radio.py @@ -0,0 +1,584 @@ +"""CAT and diagnostic control of the Phoenix radio for the filter HIL suite. + +The radio exposes two USB CDC ports: CAT on the second interface at 38400, and a +diagnostic port on the first at 115200. Commands are terminated with ``;`` in +both directions, with no line ending. + +Two things about the CAT protocol shape this module: + +* **Many writes return nothing.** ``CAT.cpp`` suppresses empty responses, so + waiting for a reply after ``AG``/``MD``/``NR``/``FW``/``SR``/``CF``/``EQ``/``FL`` + costs the full read timeout every time. A sweep issues hundreds of these, so + :data:`SILENT_WRITES` tells :meth:`Radio.cat` to skip the read entirely. + +* **Most radio state is not readable over CAT at all.** AGC, the equaliser and + the sample rate are only visible in the ``ED;`` dump, which the firmware + prints to the *diagnostic* port as plain ``Serial.print`` text. That text is + not a protocol, so :class:`EdSnapshot` parses defensively and keeps the raw + text for the report. + +The suite mutates persisted radio settings, so :class:`RadioStateGuard` records +how to put each one back and runs those restores on the way out, on SIGINT and +at interpreter exit. +""" + +from __future__ import annotations + +import atexit +import re +import time +from dataclasses import dataclass, field +from typing import Callable, Optional, Sequence + +import serial + +CAT_BAUD = 38400 +DIAG_BAUD = 115200 +CAT_PORT = "/dev/ttyACM1" +DIAG_PORT = "/dev/ttyACM0" + +#: Commands whose write form produces no reply. Waiting on these wastes the +#: whole read timeout per command. +SILENT_WRITES = {"AG", "MD", "NR", "NT", "FW", "FL", "SR", "CF", "EQ", "DB", "KS", "MG", "VX", "AI"} + +#: Commands that take no parameter and yet are *writes*, not reads. +#: +#: :meth:`Radio.send` normally infers the form from the length - a bare ``"XX;"`` +#: is a read - and that inference is right for everything in +#: :data:`SILENT_WRITES`, whose read forms all answer. ``TX;`` and ``RX;`` break +#: it: they are three characters long, they are writes, and ``CAT.cpp`` suppresses +#: their empty responses, so treating them as reads costs the whole read timeout +#: on every key and unkey. +SILENT_SHORT_WRITES = {"TX", "RX"} + +#: CW sidetone offsets, from Globals.cpp. In CW receive the audio is shifted by +#: the selected offset, so the injection frequency must include it. +CW_TONE_OFFSETS_HZ = (400.0, 562.5, 656.5, 750.0, 843.75) + +#: SR command parameter -> sample rate in Hz. +SR_CAT_ARG = {176400: 0, 192000: 1} +#: ED.sampleRate index -> sample rate in Hz (SDT.h SAMPLE_RATE_* macros). +SR_ED_INDEX = {12: 176400, 13: 192000} + +#: ModulationType enum from SDT.h. +MOD_USB, MOD_LSB, MOD_AM, MOD_SAM = 0, 1, 2, 3 +MOD_NAMES = {MOD_USB: "USB", MOD_LSB: "LSB", MOD_AM: "AM", MOD_SAM: "SAM"} +#: MD command parameter for each modulation. +MOD_TO_MD = {MOD_LSB: 1, MOD_USB: 2, MOD_AM: 4, MOD_SAM: 5} + +EQUALIZER_CELL_COUNT = 14 + +ED_BEGIN = "=== ED Struct Contents ===" +ED_END = "=== End ED Struct ===" + + +class CatError(RuntimeError): + """A CAT command failed or returned an error response.""" + + +def _as_int(text: str, default: int = -1) -> int: + try: + return int(float(text.strip())) + except (ValueError, AttributeError): + return default + + +def _as_float(text: str, default: float = 0.0) -> float: + try: + return float(text.strip()) + except (ValueError, AttributeError): + return default + + +@dataclass +class EdSnapshot: + """Parsed contents of the firmware's ``ED;`` settings dump.""" + + raw: str = "" + fields: dict = field(default_factory=dict) + agc: int = -1 + sample_rate_hz: int = -1 + audio_volume: int = -1 + cw_filter_index: int = -1 + cw_tone_index: int = -1 + nr_option: int = -1 + notch_on: int = -1 + active_vfo: int = 0 + modulation: list = field(default_factory=lambda: [-1, -1]) + current_band: list = field(default_factory=lambda: [-1, -1]) + equalizer_rec: list = field(default_factory=list) + fine_tune_hz: list = field(default_factory=lambda: [0.0, 0.0]) + equalizer_xmt: list = field(default_factory=list) + mic_gain_db: int = -99 + power_out_ssb: list = field(default_factory=list) + pa_100w: int = -1 + + @classmethod + def parse(cls, lines: Sequence[str]) -> "EdSnapshot": + """Build a snapshot from the diagnostic port's dump lines. + + Keys on ``name:`` prefixes and ignores anything else, because the + diagnostic port interleaves ``Debug()`` output with the dump. + """ + fields: dict[str, str] = {} + for line in lines: + if ":" not in line: + continue + key, _, value = line.partition(":") + key = key.strip() + if key and re.fullmatch(r"[A-Za-z_][A-Za-z0-9_\[\]]*", key): + fields[key] = value.strip() + + missing = [k for k in ("agc", "sampleRate", "CWFilterIndex", "equalizerRec") + if k not in fields] + if missing: + raise CatError( + f"ED dump did not contain {', '.join(missing)}. " + f"Got {len(fields)} fields; is the diagnostic port right?" + ) + + eq = [_as_int(v) for v in fields.get("equalizerRec", "").split(",") if v.strip()] + eq_xmt = [_as_int(v) for v in fields.get("equalizerXmt", "").split(",") if v.strip()] + power_ssb = [_as_float(v) for v in fields.get("powerOutSSB", "").split(",") if v.strip()] + sr_index = _as_int(fields.get("sampleRate", "")) + + return cls( + raw="\n".join(lines), + fields=fields, + agc=_as_int(fields.get("agc", "")), + sample_rate_hz=SR_ED_INDEX.get(sr_index, -1), + audio_volume=_as_int(fields.get("audioVolume", "")), + cw_filter_index=_as_int(fields.get("CWFilterIndex", "")), + cw_tone_index=_as_int(fields.get("CWToneIndex", "")), + nr_option=_as_int(fields.get("nrOptionSelect", "")), + notch_on=_as_int(fields.get("ANR_notchOn", "")), + active_vfo=_as_int(fields.get("activeVFO", ""), 0), + modulation=[_as_int(fields.get("modulation[0]", "")), + _as_int(fields.get("modulation[1]", ""))], + current_band=[_as_int(fields.get("currentBand[0]", "")), + _as_int(fields.get("currentBand[1]", ""))], + equalizer_rec=eq, + fine_tune_hz=[_as_float(fields.get("fineTuneFreq_Hz[0]", ""), 0.0), + _as_float(fields.get("fineTuneFreq_Hz[1]", ""), 0.0)], + equalizer_xmt=eq_xmt, + mic_gain_db=_as_int(fields.get("currentMicGain", ""), -99), + power_out_ssb=power_ssb, + pa_100w=_as_int(fields.get("PA100Wactive", "")), + ) + + def summary(self) -> dict: + """The fields the suite and the report care about.""" + return { + "agc": self.agc, + "sample_rate_hz": self.sample_rate_hz, + "audio_volume": self.audio_volume, + "cw_filter_index": self.cw_filter_index, + "cw_tone_index": self.cw_tone_index, + "nr_option": self.nr_option, + "notch_on": self.notch_on, + "active_vfo": self.active_vfo, + "modulation": list(self.modulation), + "current_band": list(self.current_band), + "equalizer_rec": list(self.equalizer_rec), + "fine_tune_hz": list(self.fine_tune_hz), + "equalizer_xmt": list(self.equalizer_xmt), + "mic_gain_db": self.mic_gain_db, + "power_out_ssb": list(self.power_out_ssb), + "pa_100w": self.pa_100w, + } + + def diff(self, other: "EdSnapshot") -> dict: + """Fields that changed between two snapshots.""" + a, b = self.summary(), other.summary() + return {k: {"before": a[k], "after": b[k]} for k in a if a[k] != b[k]} + + @property + def active_fine_tune_hz(self) -> float: + """Fine tune offset applied by the receive chain, in Hz. + + ReceiveProcessing shifts by Fs/4 and then again by this, so it moves the + frequency an injected tone has to sit at. It is whatever the operator + last tuned to and is often several kHz. + """ + return self.fine_tune_hz[self.active_vfo] + + @property + def modulation_name(self) -> str: + return MOD_NAMES.get(self.modulation[self.active_vfo], "?") + + @property + def active_modulation(self) -> int: + return self.modulation[self.active_vfo] + + @property + def active_power_ssb(self) -> float: + """SSB power setting for the band in use, in watts. + + ``TXGain`` derives the transmit DSP gain from this, so it scales the + amplitude of the exciter I/Q output. It has to stay put for the duration + of a run or every level measured moves with it. + """ + band = self.current_band[self.active_vfo] + if 0 <= band < len(self.power_out_ssb): + return self.power_out_ssb[band] + return float("nan") + + @property + def agc_off(self) -> bool: + """AGCOff is 0 in the AGCMode enum.""" + return self.agc == 0 + + +class Radio: + """Serial control of the radio under test.""" + + def __init__(self, cat_port: str = CAT_PORT, diag_port: Optional[str] = DIAG_PORT, + cat_baud: int = CAT_BAUD, diag_baud: int = DIAG_BAUD, + timeout_s: float = 0.5, log: Callable[[str], None] = print) -> None: + self.cat_port_name = cat_port + self.diag_port_name = diag_port + self.cat_baud = cat_baud + self.diag_baud = diag_baud + self.timeout_s = timeout_s + self.log = log + self.cat: Optional[serial.Serial] = None + self.diag: Optional[serial.Serial] = None + self.round_trips = 0 + self.wait_s = 0.0 + + def __enter__(self) -> "Radio": + self.open() + return self + + def __exit__(self, *exc) -> None: + self.close() + + def open(self) -> None: + try: + self.cat = serial.Serial(self.cat_port_name, self.cat_baud, timeout=self.timeout_s) + except serial.SerialException as exc: + raise CatError(f"could not open the CAT port {self.cat_port_name}: {exc}") from exc + if self.diag_port_name: + try: + self.diag = serial.Serial(self.diag_port_name, self.diag_baud, + timeout=self.timeout_s) + except serial.SerialException as exc: + self.log(f"WARNING: could not open the diagnostic port " + f"{self.diag_port_name}: {exc}") + self.diag = None + time.sleep(0.2) + self.drain_diag() + + def close(self) -> None: + for port in (self.cat, self.diag): + if port is not None and port.is_open: + port.close() + self.cat = self.diag = None + + # -- CAT --------------------------------------------------------------- + + def send(self, cmd: str, expect_reply: Optional[bool] = None) -> Optional[str]: + """Send one CAT command, optionally reading its reply. + + ``expect_reply`` defaults to False for the write forms of commands the + firmware answers with an empty string; see :data:`SILENT_WRITES`. + """ + if self.cat is None: + raise CatError("CAT port is not open") + if not cmd.endswith(";"): + cmd += ";" + + if expect_reply is None: + name = cmd[:2].upper() + if name in SILENT_SHORT_WRITES: + expect_reply = False + else: + is_read = len(cmd) == 3 # "XX;" + expect_reply = is_read or name not in SILENT_WRITES + + self.cat.reset_input_buffer() + self.cat.write(cmd.encode("ascii")) + self.cat.flush() + self.round_trips += 1 + + if not expect_reply: + return None + + started = time.monotonic() + out = [] + deadline = started + self.timeout_s + while time.monotonic() < deadline: + if self.cat.in_waiting: + ch = self.cat.read(1).decode("ascii", errors="replace") + out.append(ch) + if ch == ";": + break + else: + time.sleep(0.002) + self.wait_s += time.monotonic() - started + + reply = "".join(out) + return reply or None + + def expect(self, cmd: str) -> str: + """Send a command that must answer, and reject an error response.""" + reply = self.send(cmd, expect_reply=True) + if reply is None: + raise CatError(f"{cmd!r} produced no reply") + if reply == "?;": + raise CatError(f"{cmd!r} was rejected by the radio") + return reply + + # -- diagnostic port --------------------------------------------------- + + def drain_diag(self) -> None: + if self.diag is not None: + self.diag.reset_input_buffer() + + def read_diag_until(self, sentinel: str, timeout_s: float = 3.0) -> list[str]: + """Collect diagnostic lines until a sentinel appears.""" + if self.diag is None: + raise CatError("the diagnostic port is not open; it is needed to read the ED dump") + lines: list[str] = [] + deadline = time.monotonic() + timeout_s + while time.monotonic() < deadline: + raw = self.diag.readline() + if not raw: + continue + line = raw.decode("ascii", errors="replace").rstrip("\r\n") + lines.append(line) + if sentinel in line: + return lines + raise CatError(f"timed out waiting for {sentinel!r} on the diagnostic port") + + def dump_ed(self, timeout_s: float = 3.0) -> EdSnapshot: + """Ask for the settings dump and parse it off the diagnostic port.""" + self.drain_diag() + self.send("ED;", expect_reply=True) + lines = self.read_diag_until(ED_END, timeout_s) + # Discard anything printed before the dump started. + for i, line in enumerate(lines): + if ED_BEGIN in line: + lines = lines[i + 1:] + break + return EdSnapshot.parse(lines) + + def dump_psd(self, timeout_s: float = 5.0) -> list[float]: + """Read the 512-bin spectrum the firmware prints to the diagnostic port.""" + if self.diag is None: + raise CatError("the diagnostic port is not open; it is needed to read the PSD") + self.drain_diag() + self.send("PD;", expect_reply=True) + values: list[float] = [] + deadline = time.monotonic() + timeout_s + while time.monotonic() < deadline and len(values) < 512: + raw = self.diag.readline() + if not raw: + continue + line = raw.decode("ascii", errors="replace").strip() + if "," in line: + _, _, val = line.partition(",") + try: + values.append(float(val)) + except ValueError: + pass + return values + + # -- radio settings ---------------------------------------------------- + + def get_sample_rate(self) -> int: + reply = self.expect("SR;") + idx = int(reply[2]) + for rate, arg in SR_CAT_ARG.items(): + if arg == idx: + return rate + raise CatError(f"unrecognised SR reply {reply!r}") + + def set_sample_rate(self, rate_hz: int, settle_s: float = 2.0) -> None: + """Switch sample rate and confirm the radio took it. + + ChangeSampleRate() reconfigures the I2S clock and rebuilds the whole DSP + chain, so the settle is not optional. + """ + if rate_hz not in SR_CAT_ARG: + raise CatError(f"{rate_hz} is not a CAT-selectable sample rate") + self.send(f"SR{SR_CAT_ARG[rate_hz]};", expect_reply=False) + time.sleep(settle_s) + actual = self.get_sample_rate() + if actual != rate_hz: + raise CatError(f"asked for {rate_hz} sps but the radio reports {actual}") + + def get_cw_filter(self) -> int: + return int(self.expect("CF;")[2]) + + def set_cw_filter(self, index: int) -> None: + self.send(f"CF{index};", expect_reply=False) + + def get_eq_cell(self, index: int) -> int: + return int(self.expect(f"EQ{index:02d};")[4:7]) + + def set_eq_cell(self, index: int, value: int) -> None: + self.send(f"EQ{index:02d}{value:03d};", expect_reply=False) + + def set_eq_all(self, values: Sequence[int]) -> None: + for i, v in enumerate(values): + self.set_eq_cell(i, int(v)) + + def set_eq_solo(self, index: int, level: int = 100) -> None: + """Leave one equaliser cell up and the rest at zero. + + The cells are summed in parallel with alternating signs, so zeroing the + others isolates this one exactly rather than approximately. + """ + for i in range(EQUALIZER_CELL_COUNT): + self.set_eq_cell(i, level if i == index else 0) + + def set_volume_pct(self, pct: int) -> None: + """Set AF volume. The AG parameter is 0-255 scaled from 0-100 percent.""" + self.send(f"AG0{int(round(pct * 255 / 100)):03d};", expect_reply=False) + + def get_filter_hi_hz(self) -> int: + return int(self.expect("FW;")[2:6]) + + def set_filter_hi_hz(self, hz: int) -> None: + self.send(f"FW{int(hz):04d};", expect_reply=False) + + def get_filter_lo_hz(self) -> int: + return int(self.expect("FL;")[2:6]) + + def set_filter_lo_hz(self, hz: int) -> None: + self.send(f"FL{int(hz):04d};", expect_reply=False) + + def set_nr(self, value: int) -> None: + self.send(f"NR{value};", expect_reply=False) + + def set_notch(self, value: int) -> None: + self.send(f"NT{value};", expect_reply=False) + + def get_mode(self) -> str: + return self.expect("MD;") + + def enter_cw(self) -> None: + self.send("MD3;", expect_reply=False) + + def set_modulation(self, mod: int) -> None: + """Select a demodulator, and leave CW receive if that is where we are.""" + if mod not in MOD_TO_MD: + raise CatError(f"no MD command for modulation {mod}") + self.send(f"MD{MOD_TO_MD[mod]};", expect_reply=False) + + # -- transmit ----------------------------------------------------------- + + def ptt_press(self, settle_s: float = 0.5) -> None: + """Key the transmitter. + + ``TX;`` is only honoured from ``SSB_RECEIVE`` or ``CW_RECEIVE``; from any + other state ``TX_write`` falls through its switch and does nothing at + all, silently. Callers that need to know whether the radio actually keyed + have to look at the exciter output, not at the CAT reply. + """ + self.send("TX;", expect_reply=False) + time.sleep(settle_s) + + def ptt_release(self, settle_s: float = 0.3) -> None: + """Unkey. Safe to call when already receiving.""" + self.send("RX;", expect_reply=False) + time.sleep(settle_s) + + def get_mic_gain_pct(self) -> int: + """Mic gain as the 0-100 scale the MG command uses.""" + return int(self.expect("MG;")[2:5]) + + def set_mic_gain_pct(self, pct: int) -> None: + """Set mic gain on the MG 0-100 scale, which maps to -40..+30 dB.""" + self.send(f"MG{int(round(max(0, min(100, pct)))):03d};", expect_reply=False) + + @staticmethod + def mic_gain_pct_from_db(db: float) -> int: + """Invert the MG command's -40..+30 dB mapping.""" + return int(round((float(db) + 40.0) * 100.0 / 70.0)) + + @staticmethod + def mic_gain_db_from_pct(pct: float) -> int: + """The dB value the firmware will store for an MG parameter. + + ``MG_write`` truncates to an integer number of dB, so a percentage does + not round-trip exactly; this reproduces what the radio will end up with. + """ + return int((float(pct) * 70.0 / 100.0) - 40.0) + + def get_power_w(self) -> float: + """Requested output power, watts. Mode dependent in the firmware.""" + return float(self.expect("PC;")[2:5]) + + def set_power_w(self, watts: float) -> None: + self.send(f"PC{int(round(watts)):03d};", expect_reply=True) + + def sidetone_shift_hz(self, ed: EdSnapshot, in_cw: bool) -> float: + """Audio offset applied in CW receive, in Hz. + + In CW the chain shifts by the selected sidetone offset so the beat note + lands where the operator expects, which moves the injection frequency by + the same amount. + """ + if not in_cw: + return 0.0 + idx = ed.cw_tone_index + if 0 <= idx < len(CW_TONE_OFFSETS_HZ): + return CW_TONE_OFFSETS_HZ[idx] + return CW_TONE_OFFSETS_HZ[3] + + +class RadioStateGuard: + """Undo everything the suite changed, however it exits. + + Restores run last-registered-first, so a setting changed twice ends up back + at the value it had before the first change. A restore that raises is logged + and the rest still run; whatever could not be put back shows up in the final + ED diff. + """ + + def __init__(self, radio: Radio, baseline: EdSnapshot, + log: Callable[[str], None] = print) -> None: + self.radio = radio + self.baseline = baseline + self.log = log + self._restores: list[tuple[str, Callable[[], None]]] = [] + self.restored = False + self.residual_diff: dict = {} + self.failures: list[str] = [] + + def __enter__(self) -> "RadioStateGuard": + atexit.register(self.restore) + return self + + def __exit__(self, *exc) -> None: + self.restore() + atexit.unregister(self.restore) + + def on_restore(self, label: str, fn: Callable[[], None]) -> None: + """Register how to undo a change, before making it.""" + self._restores.append((label, fn)) + + def restore(self) -> None: + """Run every registered restore, newest first. Safe to call twice.""" + if self.restored: + return + self.restored = True + for label, fn in reversed(self._restores): + try: + fn() + except Exception as exc: # keep going; a stuck radio is worse + self.failures.append(f"{label}: {exc}") + self.log(f"WARNING: could not restore {label}: {exc}") + self._restores.clear() + + def verify(self) -> dict: + """Re-read the radio and report anything that did not go back.""" + try: + final = self.radio.dump_ed() + except Exception as exc: + self.residual_diff = {"error": str(exc)} + return self.residual_diff + self.residual_diff = self.baseline.diff(final) + return self.residual_diff diff --git a/code/tools/filter_hil/report.py b/code/tools/filter_hil/report.py new file mode 100644 index 0000000..37bfe1f --- /dev/null +++ b/code/tools/filter_hil/report.py @@ -0,0 +1,358 @@ +"""Result assembly and rendering for the filter HIL suite. + +Three tiers, matching the convention the repo's other tools already follow: +a human summary on stdout, a machine-readable JSON document, and a Markdown +report that stitches the numbers together with the generated figures. + +The JSON keeps every raw sweep point, so the report and all its plots can be +regenerated later without the hardware. +""" + +from __future__ import annotations + +import json +import math +import os +import platform +import subprocess +import sys +import time +from datetime import datetime, timezone +from typing import Optional, Sequence + +import numpy as np + +from . import bandtable as bt + +SCHEMA = "phoenix.filter_hil/1" + + +def _run(cmd: Sequence[str], cwd: Optional[str] = None) -> str: + try: + return subprocess.run(cmd, cwd=cwd, capture_output=True, text=True, + timeout=10).stdout.strip() + except Exception: + return "" + + +def collect_provenance(argv: Sequence[str], repo_root: str, + dwf_version: str = "") -> dict: + """Record what was tested and with what, so a result can be traced back.""" + commit = _run(["git", "rev-parse", "--short", "HEAD"], repo_root) + dirty = bool(_run(["git", "status", "--porcelain"], repo_root)) + + build_info = "" + path = os.path.join(repo_root, "code", "src", "PhoenixSketch", "BuildInfo.h") + try: + with open(path) as fh: + for line in fh: + if "GIT_COMMIT_HASH" in line or "BUILD_TIMESTAMP" in line: + build_info += line.strip() + " " + except OSError: + pass + + versions = {"python": platform.python_version()} + for mod in ("numpy", "scipy", "matplotlib", "serial"): + try: + versions[mod] = __import__(mod).__version__ + except Exception: + versions[mod] = "not installed" + + return { + "git_commit": commit, + "git_dirty": dirty, + "build_info": build_info.strip(), + "dwf_version": dwf_version, + "versions": versions, + "command_line": " ".join(argv), + "host": platform.node(), + } + + +def build_document(*, provenance: dict, config: dict, rig: dict, + baseline: dict, final: dict, state_restored: bool, + residual_diff: dict, per_rate: dict, comparison: dict, + checks: Sequence, duration_s: float, + warnings: Sequence[str]) -> dict: + """Assemble the full result document.""" + check_dicts = [c.as_dict() if hasattr(c, "as_dict") else c for c in checks] + + groups: dict[str, str] = {} + for c in check_dicts: + g = c["group"] + if c["skipped"]: + groups.setdefault(g, "SKIPPED") + elif not c["passed"]: + groups[g] = "FAIL" + elif groups.get(g) in (None, "SKIPPED"): + groups[g] = "PASS" + + passed = sum(1 for c in check_dicts if c["passed"] and not c["skipped"]) + failed = sum(1 for c in check_dicts if not c["passed"] and not c["skipped"]) + skipped = sum(1 for c in check_dicts if c["skipped"]) + + overall = "PASS" if failed == 0 and passed > 0 else "FAIL" if failed else "PARTIAL" + + return { + "schema": SCHEMA, + "generated_utc": datetime.now(timezone.utc).isoformat(timespec="seconds"), + "duration_s": round(duration_s, 1), + "provenance": provenance, + "config": config, + "rig": rig, + "radio_baseline": baseline, + "radio_final": final, + "state_restored": state_restored, + "state_residual_diff": residual_diff, + "rates": per_rate, + "comparison": comparison, + "checks": check_dicts, + "warnings": list(warnings), + "summary": { + "overall": overall, + "passed": passed, + "failed": failed, + "skipped": skipped, + "groups": groups, + }, + "artifacts": {}, + } + + +def _jsonable(o): + """Convert numpy scalars, which json does not recognise. + + Comparisons on numpy floats produce numpy bools, and those leak into the + pass/fail fields from every ``a <= b`` written against a fitted value. + """ + if isinstance(o, np.generic): + item = o.item() + return None if isinstance(item, float) and not math.isfinite(item) else item + if isinstance(o, np.ndarray): + return o.tolist() + if isinstance(o, float) and not math.isfinite(o): + return None + raise TypeError(f"cannot serialise {type(o).__name__}") + + +def write_json(doc: dict, path: str) -> str: + os.makedirs(os.path.dirname(os.path.abspath(path)), exist_ok=True) + with open(path, "w") as fh: + json.dump(doc, fh, indent=1, default=_jsonable) + return path + + +# --- stdout ---------------------------------------------------------------- + +def print_summary(doc: dict, stream=sys.stdout) -> None: + """Human-readable result, in the shape the other tools use.""" + s = doc["summary"] + w = stream.write + + w(f"\n[{s['overall']}] Receive filter rate-independence, " + f"{doc['duration_s']:.0f} s\n") + + for warning in doc.get("warnings", []): + w(f" WARNING: {warning}\n") + + rig = doc.get("rig", {}) + if rig: + w(f" Wiring : {rig.get('wiring', '?')}\n") + if rig.get("image_rejection_db") is not None: + w(f" Image rejection : {rig['image_rejection_db']:.1f} dB\n") + if rig.get("drive_amplitude_v") is not None: + w(f" Drive level : {rig['drive_amplitude_v']*1000:.1f} mV\n") + + comp = doc.get("comparison", {}) + rates = sorted(doc.get("rates", {}), key=lambda r: -int(r)) + + def table(title: str, rows: list, key: str) -> None: + if not rows: + return + w(f"\n {title}\n") + head = " {:>10}".format("nominal") + for r in rates: + head += " {:>11}".format(f"{int(r)//1000}k") + head += " {:>9} {:>7}".format("delta", "verdict") + w(head + "\n") + for row in rows: + line = " {:>10.1f}".format(row["nominal_hz"]) + for r in rates: + v = row.get(key, {}).get(str(r)) + line += " {:>11}".format(f"{v:.1f}" if v is not None else "-") + d = row.get("delta_pct") + line += " {:>8}%".format(f"{d:+.2f}" if d is not None else "-") + line += " {:>7}".format(row["verdict"]) + if row.get("legacy_consistent"): + line += " <- matches the old frozen-table shift" + w(line + "\n") + + table("CW audio filters (-3 dB corner, Hz)", comp.get("cw_filters", []), "corner_3db_hz") + table("Equaliser cells (peak, Hz)", comp.get("eq_cells", []), "peak_hz") + table("SSB filter [control] (-6 dB edge, Hz)", comp.get("ssb_filter", []), "hi_edge_6db_hz") + + w("\n Checks:\n") + for c in doc["checks"]: + mark = "SKIP" if c["skipped"] else ("OK " if c["passed"] else "BAD ") + w(f" [{mark}] {c['id']:<32} {c['message']}\n") + + w(f"\n {s['passed']} passed, {s['failed']} failed, {s['skipped']} skipped\n") + if not doc.get("state_restored"): + w(" WARNING: radio state was NOT fully restored\n") + if doc.get("state_residual_diff"): + w(f" Radio settings that did not return to baseline: " + f"{', '.join(doc['state_residual_diff'])}\n") + for name, path in doc.get("artifacts", {}).items(): + if isinstance(path, str): + w(f" {name.capitalize():<9}: {path}\n") + elif isinstance(path, list) and path: + w(f" {name.capitalize():<9}: {len(path)} files in " + f"{os.path.dirname(path[0])}\n") + w("\n") + + +# --- Markdown -------------------------------------------------------------- + +def _md_table(headers: Sequence[str], rows: Sequence[Sequence]) -> str: + out = ["| " + " | ".join(headers) + " |", + "|" + "|".join("---" for _ in headers) + "|"] + for r in rows: + out.append("| " + " | ".join(str(c) for c in r) + " |") + return "\n".join(out) + "\n" + + +def write_markdown(doc: dict, path: str, png_paths: Sequence[str] = ()) -> str: + """Render the report a human reads.""" + s = doc["summary"] + rates = sorted(doc.get("rates", {}), key=lambda r: -int(r)) + md: list[str] = [] + a = md.append + + a(f"# Receive filter rate-independence, hardware in the loop\n") + a(f"**{s['overall']}** - {s['passed']} passed, {s['failed']} failed, " + f"{s['skipped']} skipped, in {doc['duration_s']:.0f} s.\n") + a(f"Generated {doc['generated_utc']}.\n") + + for warning in doc.get("warnings", []): + a(f"> **Warning:** {warning}\n") + + a("\n## What this shows\n") + a("Each filter's characteristic frequency is measured on the real radio at " + "every sample rate under test, by injecting a quadrature tone into the I/Q " + "receive inputs and reading the demodulated audio back off the speaker " + "output.\n") + a(f"\nThese filters used to carry frozen coefficient tables, designed offline " + f"for one audio rate. Run at any other rate, every corner and centre " + f"frequency scaled by the ratio of the rates - **{bt.LEGACY_DELTA_PCT:.3f}%** " + f"between 176.4 and 192 ksps. They are now generated from an analog design " + f"spec on each rate change, so the measured frequencies should not move. " + f"A result column reading close to {bt.LEGACY_DELTA_PCT:.3f}% means the " + f"frozen tables are back.\n") + a("\nResponses are measured as the difference between two captures at the same " + "injected frequency - filter engaged and bypassed - so the AWG, the codec, " + "the decimation rolloff, the volume setting and the speaker amplifier all " + "cancel out.\n") + + a("\n## Rig\n") + rig = doc.get("rig", {}) + a(_md_table(["Property", "Value"], [ + ["Wiring (detected)", rig.get("wiring", "?")], + ["Image rejection", f"{rig.get('image_rejection_db', float('nan')):.1f} dB"], + ["Drive amplitude", f"{rig.get('drive_amplitude_v', 0)*1000:.1f} mV"], + ["Scope rate", f"{rig.get('scope_rate_hz', 0)/1000:.1f} kHz"], + ["Capture length", f"{rig.get('capture_s', 0)*1000:.0f} ms"], + ["WaveForms SDK", doc["provenance"].get("dwf_version", "?")], + ])) + + a("\n## Firmware under test\n") + p = doc["provenance"] + a(_md_table(["Property", "Value"], [ + ["Git commit", f"`{p.get('git_commit', '?')}`" + + (" (working tree dirty)" if p.get("git_dirty") else "")], + ["BuildInfo.h", f"`{p.get('build_info', '?')}`"], + ["Radio ID", doc.get("radio_baseline", {}).get("id", "?")], + ])) + + a("\n## Radio state\n") + base = doc.get("radio_baseline", {}) + a(_md_table(["Setting", "At start"], [ + ["Sample rate", f"{base.get('sample_rate_hz', '?')} sps"], + ["Band", base.get("current_band", ["?"])[base.get("active_vfo", 0)]], + ["Modulation", base.get("modulation", ["?"])[base.get("active_vfo", 0)]], + ["AGC", "off" if base.get("agc") == 0 else f"mode {base.get('agc')}"], + ["Volume", base.get("audio_volume", "?")], + ["CW filter", base.get("cw_filter_index", "?")], + ])) + a(f"\nState restored afterwards: **{'yes' if doc.get('state_restored') else 'NO'}**") + if doc.get("state_residual_diff"): + a(f" - these did not return to baseline: `{doc['state_residual_diff']}`") + a("\n") + + a("\n## Headline result\n") + for title, key, rows in ( + ("CW audio filters (-3 dB corner)", "corner_3db_hz", + doc["comparison"].get("cw_filters", [])), + ("Equaliser cells (peak)", "peak_hz", + doc["comparison"].get("eq_cells", [])), + ("SSB convolution filter (-6 dB edge) - control", "hi_edge_6db_hz", + doc["comparison"].get("ssb_filter", []))): + if not rows: + continue + a(f"\n### {title}\n") + headers = ["Nominal Hz"] + [f"{int(r)//1000}k" for r in rates] + \ + ["Delta %", "If still broken", "Verdict"] + table_rows = [] + for row in rows: + cells = [f"{row['nominal_hz']:.1f}"] + for r in rates: + v = row.get(key, {}).get(str(r)) + cells.append(f"{v:.1f}" if v is not None else "-") + d = row.get("delta_pct") + cells.append(f"{d:+.2f}" if d is not None else "-") + cells.append(f"{row['legacy_predicted_delta_pct']:.3f}") + cells.append(f"**{row['verdict']}**") + table_rows.append(cells) + a(_md_table(headers, table_rows)) + + if doc["comparison"].get("ssb_filter"): + a("\nThe SSB filter is the control. It has always derived its coefficients " + "from the true sample rate, so it was never affected by the bug being " + "hunted. If it shows a shift, the rig or the analysis is wrong rather " + "than the firmware.\n") + + if png_paths: + a("\n## Figures\n") + for png in png_paths: + name = os.path.basename(png) + a(f"\n### {name}\n\n![{name}]({name})\n") + + a("\n## All checks\n") + a(_md_table(["Check", "Result", "Value", "Limit", "Notes"], [ + [f"`{c['id']}`", + "SKIP" if c["skipped"] else ("PASS" if c["passed"] else "**FAIL**"), + f"{c['value']:.3f} {c['units']}" if c["value"] is not None else "-", + f"{c['limit']:.3f}" if c["limit"] is not None else "-", + c["message"]] + for c in doc["checks"]])) + + a("\n## Caveats\n") + a("- Equaliser cells 0, 1 and 13 are marked edge limited. The first two sit " + "at or below the SSB filter's low cut and the last sits in the decimation " + "skirt, whose corner is a fraction of the sample rate and is *meant* to " + "move with it. Their absolute accuracy is checked loosely; their rate " + "invariance is not, since the same skirt applies at both rates.\n") + a("- Absolute frequencies can be biased by a smooth tilt anywhere in the " + "analog path. The rate comparison cannot: it divides that tilt out.\n") + a("- Do not touch the front panel during a run. It triggers a settings save " + "and would persist the test configuration.\n") + + a("\n## Reproduce\n") + a(f"```bash\n{p.get('command_line', '')}\n```\n") + a("\nRegenerate the figures from the saved results without the hardware:\n") + a(f"```bash\npython3 plot_filter_hil.py " + f"{os.path.basename(doc.get('artifacts', {}).get('json', 'results.json'))}\n```\n") + + os.makedirs(os.path.dirname(os.path.abspath(path)), exist_ok=True) + with open(path, "w") as fh: + fh.write("\n".join(md)) + return path diff --git a/code/tools/filter_hil/test_filter_hil.py b/code/tools/filter_hil/test_filter_hil.py new file mode 100644 index 0000000..cee281d --- /dev/null +++ b/code/tools/filter_hil/test_filter_hil.py @@ -0,0 +1,412 @@ +#!/usr/bin/env python3 +"""Self-tests for the filter HIL suite. No hardware required. + +These check the parts that would silently give wrong answers on the bench: the +tone metrology, the curve-feature extraction, the ED dump parser, and - most +importantly - that the cross-rate comparison actually fails when handed the +frequency shift it exists to catch. + + python3 -m pytest test_filter_hil.py # or just run it directly +""" + +from __future__ import annotations + +import math +import os +import sys +import tempfile + +import numpy as np + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from filter_hil import bandtable as bt +from filter_hil import report as report_mod +from filter_hil import tests as T +from filter_hil.ad2 import Capture +from filter_hil.measure import (bandwidth_3db, find_crossing, geom_grid, + measure_tone, dominant_tone, parabolic_peak, + pct_delta, peak_from_three, spectrum_dbv) +from filter_hil.radio import EdSnapshot + +FS = 96000.0 +N = int(FS * 0.25) + + +def _tone(f_hz: float, amplitude: float = 0.5, noise: float = 0.0, + fs: float = FS, n: int = N) -> Capture: + t = np.arange(n) / fs + x = amplitude * np.cos(2 * np.pi * f_hz * t) + if noise: + rng = np.random.default_rng(1234) + x = x + rng.normal(0.0, noise, n) + return Capture(samples=x, sample_rate_hz=fs, lost=0, corrupted=0, t_utc="") + + +def check(cond: bool, label: str) -> None: + if not cond: + raise AssertionError(label) + print(f" ok {label}") + + +# --- metrology ------------------------------------------------------------- + +def test_measure_tone_recovers_amplitude_and_frequency(): + print("measure_tone") + for f in (137.0, 1000.0, 2750.5, 4000.0): + m = measure_tone(_tone(f, 0.4), f, scope_range_v=2.0) + check(abs(m.amplitude_v - 0.4) < 0.004, + f"amplitude at {f} Hz: {m.amplitude_v:.4f} (want 0.4)") + check(abs(m.f_measured_hz - f) < 1.0, + f"frequency at {f} Hz: {m.f_measured_hz:.2f}") + + +def test_measure_tone_is_accurate_in_db(): + """The whole suite compares levels in dB, so small errors matter.""" + print("measure_tone dB accuracy") + ref = measure_tone(_tone(1000.0, 0.5), 1000.0, scope_range_v=2.0) + for atten_db in (-1.0, -3.0, -6.0, -20.0, -40.0): + amp = 0.5 * 10 ** (atten_db / 20.0) + m = measure_tone(_tone(1000.0, amp), 1000.0, scope_range_v=2.0) + got = m.level_dbv - ref.level_dbv + check(abs(got - atten_db) < 0.05, + f"{atten_db:+.0f} dB reads {got:+.3f} dB") + + +def test_measure_tone_flags_bad_captures(): + print("measure_tone validity") + cap = _tone(1000.0, 0.5) + cap.lost = 12 + check(not measure_tone(cap, 1000.0, scope_range_v=2.0).valid, + "a capture with lost samples is marked invalid") + + clipped = measure_tone(_tone(1000.0, 1.95), 1000.0, scope_range_v=2.0) + check(not clipped.valid and clipped.clipped, "clipping is detected") + + buried = measure_tone(_tone(1000.0, 0.001, noise=0.5), 1000.0, + scope_range_v=2.0, min_snr_db=20.0) + check(not buried.valid, "a tone below the noise is marked invalid") + + +def test_dominant_tone_finds_an_unknown_frequency(): + print("dominant_tone") + f, _ = dominant_tone(_tone(1234.5, 0.3)) + check(abs(f - 1234.5) < 1.0, f"found {f:.2f} Hz (want 1234.5)") + + +def test_parabolic_peak_beats_bin_quantisation(): + print("parabolic_peak") + # A tone deliberately placed between bins. + f = 1000.0 + 0.5 * (FS / N) + freqs, mag = spectrum_dbv(_tone(f, 0.5).samples, FS) + idx = int(np.argmax(mag)) + coarse = freqs[idx] + fine = (idx + parabolic_peak(mag, idx)) * (freqs[1] - freqs[0]) + check(abs(fine - f) < abs(coarse - f), + f"interpolated {fine:.3f} beats bin centre {coarse:.3f} (true {f:.3f})") + + +# --- curve features -------------------------------------------------------- + +def _lowpass_db(f_hz: float, corner_hz: float, order: int = 12) -> float: + """Magnitude of an ideal Butterworth-ish lowpass, in dB.""" + return -10.0 * math.log10(1.0 + (f_hz / corner_hz) ** (2 * order)) + + +def test_find_crossing_locates_a_known_corner(): + print("find_crossing") + for corner in (840.0, 1320.0, 2000.0): + got, trace = find_crossing(lambda f, c=corner: _lowpass_db(f, c), + -3.0, corner * 0.6, corner * 1.45, tol_hz=1.0) + check(abs(got - corner) < 5.0, + f"-3 dB of a {corner:.0f} Hz lowpass found at {got:.1f} Hz") + check(len(trace) >= 3, "the bisection trace was recorded") + + +def test_find_crossing_rejects_a_bad_bracket(): + print("find_crossing bracketing") + got, _ = find_crossing(lambda f: 0.0, -3.0, 100.0, 200.0) + check(math.isnan(got), "a response that never crosses returns NaN") + + +def test_peak_and_bandwidth_of_a_resonance(): + print("peak_from_three / bandwidth_3db") + fc, q = 1000.0, 4.0 + f = geom_grid(fc * 0.6, fc * 1.6, 25) + + def resp(x): + return -10.0 * np.log10(1.0 + (q * (x / fc - fc / x)) ** 2) + + y = resp(f) + peak = peak_from_three(f, y) + check(abs(peak - fc) / fc < 0.01, f"peak found at {peak:.1f} Hz (want {fc:.0f})") + + lo, hi, q_meas = bandwidth_3db(f, y) + check(abs(q_meas - q) / q < 0.10, f"Q measured {q_meas:.2f} (want {q:.1f})") + + +# --- ED parsing ------------------------------------------------------------ + +ED_FIXTURE = """agc: 0 +fineTuneFreq_Hz[0]: -12250 +fineTuneFreq_Hz[1]: 0 +audioVolume: 55 +rfGainAllBands_dB: 0 +nrOptionSelect: 0 +ANR_notchOn: 0 +spectrum_zoom: 1 +sampleRate: 13 +CWFilterIndex: 5 +CWToneIndex: 3 +activeVFO: 0 +modulation[0]: 0 +modulation[1]: 0 +currentBand[0]: 5 +currentBand[1]: 5 +equalizerRec: 100,100,100,100,100,100,100,100,100,100,100,100,100,100 +equalizerXmt: 100,100,100,100,100,100,100,100,100,100,100,100,100,100""" + + +def test_ed_snapshot_parses_the_dump(): + print("EdSnapshot.parse") + ed = EdSnapshot.parse(ED_FIXTURE.splitlines()) + check(ed.agc == 0 and ed.agc_off, "AGC parsed as off") + check(ed.sample_rate_hz == 192000, f"sample rate {ed.sample_rate_hz}") + check(ed.cw_filter_index == 5, "CW filter index") + check(ed.cw_tone_index == 3, "CW tone index") + check(len(ed.equalizer_rec) == 14, "all 14 equaliser cells") + check(ed.modulation_name == "USB", f"modulation {ed.modulation_name}") + check(ed.active_fine_tune_hz == -12250.0, + f"fine tune {ed.active_fine_tune_hz:+.0f} Hz") + + +def test_ed_snapshot_survives_interleaved_debug_output(): + print("EdSnapshot.parse with noise") + noisy = ["Debug: something happened", "USB_RX: 1234 5678"] + \ + ED_FIXTURE.splitlines() + ["Debug: more chatter"] + ed = EdSnapshot.parse(noisy) + check(ed.sample_rate_hz == 192000, "parsed despite interleaved Debug lines") + + +def test_ed_snapshot_reports_what_is_missing(): + print("EdSnapshot.parse failure") + try: + EdSnapshot.parse(["audioVolume: 55"]) + except Exception as exc: + check("agc" in str(exc), f"names the missing field: {exc}") + else: + raise AssertionError("parsing an incomplete dump should raise") + + +# --- the comparison, which is the point of the whole suite ----------------- + +def _synthetic_rates(shift: float) -> dict: + """Build a results structure with 176.4k features scaled by `shift`.""" + out = {} + for rate in (192000, 176400): + s = 1.0 if rate == 192000 else shift + out[str(rate)] = { + "rate_hz": rate, + "cw_filters": {"filters": [ + {"index": k, "nominal_hz": f, "corner_3db_hz": f * 1.012 * s, + "points": [], "bisection_trace": []} + for k, f in enumerate(bt.CW_FILTER_NOMINAL_HZ)]}, + "equalizer_cells": {"cells": [ + {"index": i, "nominal_hz": f, "peak_hz": f * s, "q": bt.eq_q(i), + "q_expected": bt.eq_q(i), + "edge_limited": i in bt.EQ_EDGE_LIMITED_CELLS, "points": []} + for i, f in enumerate(bt.EQ_CENTRE_HZ)]}, + "ssb_filter": {"settings": [ + {"fw_hz": w, "hi_edge_6db_hz": float(w), "bisection_trace": []} + for w in (1800, 2400, 2800, 3000)]}, + } + return out + + +def test_comparison_passes_a_healthy_radio(): + print("compare_rates on a good build") + comp, checks = T.compare_rates(_synthetic_rates(1.0), 1.5, 4.0) + rate_checks = [c for c in checks if c.id.endswith("rate_invariance")] + check(len(rate_checks) == 5 + 14 + 4, f"{len(rate_checks)} rate checks generated") + check(all(c.passed for c in rate_checks), "all rate-invariance checks pass") + check(all(r["verdict"] == "PASS" for r in comp["cw_filters"]), + "every CW filter passes") + + +def test_comparison_catches_the_legacy_shift(): + """The suite must fail on the bug it exists to detect.""" + print("compare_rates on the old frozen-table behaviour") + comp, checks = T.compare_rates(_synthetic_rates(bt.LEGACY_RATE_RATIO), 1.5, 4.0) + + cw = [c for c in checks if c.id.startswith("cw.") and c.id.endswith("rate_invariance")] + eq = [c for c in checks if c.id.startswith("eq.") and c.id.endswith("rate_invariance")] + check(not any(c.passed for c in cw), "every CW filter fails") + check(not any(c.passed for c in eq), "every EQ cell fails") + + check(all(r["legacy_consistent"] for r in comp["cw_filters"]), + "the shift is recognised as the known frozen-table bug") + for row in comp["cw_filters"]: + check(abs(row["delta_pct"] - bt.LEGACY_DELTA_PCT) < 0.01, + f"CW {row['nominal_hz']:.0f} Hz delta {row['delta_pct']:.3f}%") + check(any("frozen coefficient tables" in c.message for c in cw), + "the failure message explains what it matched") + + +def test_comparison_tolerance_has_margin_over_the_bug(): + """A 1.5% tolerance against an 8.125% bug is a 5x margin.""" + print("tolerance margin") + margin = abs(bt.LEGACY_DELTA_PCT) / 1.5 + check(margin > 4.0, f"margin between tolerance and bug is {margin:.1f}x") + + # A shift a quarter the size of the bug must still fail. + comp, checks = T.compare_rates(_synthetic_rates(1.0 - 0.02), 1.5, 4.0) + cw = [c for c in checks if c.id.startswith("cw.") and c.id.endswith("rate_invariance")] + check(not any(c.passed for c in cw), "a 2% shift still fails") + + +def test_comparison_handles_missing_measurements(): + print("compare_rates with gaps") + data = _synthetic_rates(1.0) + data["176400"]["cw_filters"]["filters"][2]["corner_3db_hz"] = None + comp, checks = T.compare_rates(data, 1.5, 4.0) + skipped = [c for c in checks if c.skipped] + check(len(skipped) >= 1, "an unmeasured filter is skipped, not failed") + check(comp["cw_filters"][2]["verdict"] == "SKIP", "verdict is SKIP") + + +# --- report and plotting --------------------------------------------------- + +def _doc(shift: float) -> dict: + per_rate = _synthetic_rates(shift) + comp, checks = T.compare_rates(per_rate, 1.5, 4.0) + return report_mod.build_document( + provenance={"git_commit": "abc1234", "git_dirty": False, + "build_info": "test", "dwf_version": "3.24.4", + "versions": {}, "command_line": "test", "host": "test"}, + config={"rate_tol_pct": 1.5, "nominal_tol_pct": 4.0}, + rig={"wiring": "W1 -> I (codec left), W2 -> Q (codec right)", + "image_rejection_db": 34.2, "drive_amplitude_v": 0.03, + "scope_rate_hz": FS, "capture_s": 0.25, "scope_range_v": 2.0, + "trials": {"1": {"level_dbv": -20.0}, "-1": {"level_dbv": -54.0}}}, + baseline={"agc": 0, "sample_rate_hz": 192000, "audio_volume": 55, + "cw_filter_index": 5, "active_vfo": 0, "modulation": [0, 0], + "current_band": [5, 5], "id": "ID020;"}, + final={}, state_restored=True, residual_diff={}, per_rate=per_rate, + comparison=comp, checks=checks, duration_s=531.0, warnings=[]) + + +def test_report_renders_both_outcomes(): + print("report rendering") + for shift, want in ((1.0, "PASS"), (bt.LEGACY_RATE_RATIO, "FAIL")): + doc = _doc(shift) + check(doc["summary"]["overall"] == want, + f"shift {shift:.5f} gives overall {doc['summary']['overall']}") + with tempfile.TemporaryDirectory() as tmp: + j = report_mod.write_json(doc, os.path.join(tmp, "r.json")) + m = report_mod.write_markdown(doc, os.path.join(tmp, "r.md")) + check(os.path.getsize(j) > 500, "JSON written") + text = open(m).read() + check(want in text, f"Markdown states {want}") + check("frozen" in text.lower(), "Markdown explains the bug being hunted") + + +def test_plots_render_from_a_document(): + print("plot rendering") + from filter_hil.plot_filter_hil import render_all + doc = _doc(bt.LEGACY_RATE_RATIO) + with tempfile.TemporaryDirectory() as tmp: + paths = render_all(doc, tmp, "t") + check(len(paths) >= 4, f"{len(paths)} figures rendered") + for p in paths: + check(os.path.getsize(p) > 3000, f"{os.path.basename(p)} is non-trivial") + + +# --- design constants ------------------------------------------------------ + +def test_bandtable_matches_firmware_shapes(): + print("bandtable consistency") + check(len(bt.CW_FILTER_NOMINAL_HZ) == len(bt.CW_FILTER_RIPPLE_EDGE_HZ), + "one ripple edge per CW filter") + check(len(bt.EQ_CENTRE_HZ) == bt.EQ_CELL_COUNT, "14 equaliser centres") + check(len(bt.EQ_BANDWIDTH_HZ) == bt.EQ_CELL_COUNT, "14 equaliser bandwidths") + check(all(e < n for e, n in zip(bt.CW_FILTER_RIPPLE_EDGE_HZ, + bt.CW_FILTER_NOMINAL_HZ)), + "every ripple edge sits below its labelled cutoff") + check(abs(bt.LEGACY_DELTA_PCT + 8.125) < 1e-9, + f"legacy shift is {bt.LEGACY_DELTA_PCT:.4f}%") + check(bt.fs_over_4_hz(192000) == 48000 and bt.fs_over_4_hz(176400) == 44100, + "Fs/4 for both rates") + + +def test_injection_plan_includes_fine_tune(): + """The demodulation centre is |Fs/4 + fineTune|, not Fs/4. + + Measured on the bench: with Fs/4 = 44100 and fineTune = -12250, injecting + 32350/32850/33350 Hz produced 500/1000/1500 Hz of audio. + """ + print("InjectionPlan fine tune") + p = T.InjectionPlan(rate_hz=176400, fine_tune_hz=-12250.0, sideband_sign=+1) + check(abs(p.centre_hz - 31850.0) < 1e-6, f"centre {p.centre_hz:.0f} Hz") + for f_audio, want in ((500.0, 32350.0), (1000.0, 32850.0), (1500.0, 33350.0)): + got = p.inject_hz(f_audio) + check(abs(got - want) < 1e-6, f"{f_audio:.0f} Hz audio <- {got:.0f} Hz") + + zero = T.InjectionPlan(rate_hz=176400, fine_tune_hz=0.0) + check(abs(zero.centre_hz - 44100.0) < 1e-6, + "with no fine tune the centre is Fs/4") + + +def test_injection_plan_recomputes_per_rate(): + """The crux: the same audio frequency needs a different injection per rate.""" + print("InjectionPlan") + a = T.InjectionPlan(rate_hz=192000) + b = T.InjectionPlan(rate_hz=176400) + check(abs(a.inject_hz(1000.0) - 49000.0) < 1e-6, + f"192k: 1 kHz audio <- {a.inject_hz(1000.0):.1f} Hz") + check(abs(b.inject_hz(1000.0) - 45100.0) < 1e-6, + f"176.4k: 1 kHz audio <- {b.inject_hz(1000.0):.1f} Hz") + + cw = T.InjectionPlan(rate_hz=192000, sidetone_hz=750.0) + check(abs(cw.inject_hz(1000.0) - 49750.0) < 1e-6, + "the CW sidetone offset shifts the injection") + + +def test_injection_plan_handles_lower_sideband(): + """On an LSB band the passband is negative, so audio comes from Fs/4 - f.""" + print("InjectionPlan sideband") + usb = T.InjectionPlan(rate_hz=192000, sideband_sign=+1) + lsb = T.InjectionPlan(rate_hz=192000, sideband_sign=-1) + check(abs(usb.inject_hz(1000.0) - 49000.0) < 1e-6, + f"USB: {usb.inject_hz(1000.0):.0f} Hz") + check(abs(lsb.inject_hz(1000.0) - 47000.0) < 1e-6, + f"LSB: {lsb.inject_hz(1000.0):.0f} Hz") + + lsb176 = T.InjectionPlan(rate_hz=176400, sideband_sign=-1) + check(abs(lsb176.inject_hz(1000.0) - 43100.0) < 1e-6, + f"LSB at 176.4k: {lsb176.inject_hz(1000.0):.0f} Hz") + + cw_lsb = T.InjectionPlan(rate_hz=192000, sideband_sign=-1, sidetone_hz=750.0) + check(abs(cw_lsb.inject_hz(1000.0) - 46250.0) < 1e-6, + "the sidetone also flips with the sideband") + + +def main() -> int: + fns = [v for k, v in sorted(globals().items()) if k.startswith("test_")] + failed = [] + for fn in fns: + try: + fn() + except AssertionError as exc: + print(f" FAIL {fn.__name__}: {exc}") + failed.append(fn.__name__) + except Exception as exc: + print(f" ERROR {fn.__name__}: {type(exc).__name__}: {exc}") + failed.append(fn.__name__) + print(f"\n{len(fns) - len(failed)}/{len(fns)} passed") + for name in failed: + print(f" failed: {name}") + return 1 if failed else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/code/tools/filter_hil/tests.py b/code/tools/filter_hil/tests.py new file mode 100644 index 0000000..864e4e7 --- /dev/null +++ b/code/tools/filter_hil/tests.py @@ -0,0 +1,933 @@ +"""The individual hardware tests. + +Every filter response here is measured as the *difference* between two captures +taken at the same injected frequency, one with the filter under test engaged and +one with it bypassed or flat. Everything the two captures have in common - the +AWG's amplitude flatness, the codec front end, the decimation rolloff, the SSB +mask, the volume setting, the DAC and the speaker amplifier - cancels exactly, +leaving only the filter. Absolute levels are never compared across rates. + +The pass criterion that matters is **rate invariance**: a corner or centre +measured at 192 ksps must land at the same frequency when measured at +176.4 ksps. The bug this suite exists to catch moves them by 8.125 %, and the +tolerance is 1.5 %, so there is a factor of five between "correct" and "broken". +Absolute agreement with the labelled frequency is checked too, but more loosely, +because a smooth tilt in the analog path can bias it without saying anything +about the firmware. +""" + +from __future__ import annotations + +import math +import time +from dataclasses import dataclass, field +from typing import Callable, Iterable, Optional, Sequence + +import numpy as np + +from . import bandtable as bt +from .ad2 import Ad2 +from .measure import (ToneMeasurement, bandwidth_3db, find_crossing, geom_grid, + measure_tone, dominant_tone, peak_from_three, pct_delta) +from .radio import EdSnapshot, Radio, RadioStateGuard + + +@dataclass +class Check: + """One pass/fail assertion, flat enough to drop straight into a report.""" + + id: str + group: str + description: str + value: Optional[float] + limit: Optional[float] + units: str + passed: bool + skipped: bool = False + message: str = "" + + def as_dict(self) -> dict: + return { + "id": self.id, "group": self.group, "description": self.description, + "value": _clean(self.value), "limit": _clean(self.limit), "units": self.units, + "passed": self.passed, "skipped": self.skipped, "message": self.message, + } + + +@dataclass +class TestResult: + name: str + checks: list = field(default_factory=list) + data: dict = field(default_factory=dict) + skipped: bool = False + reason: str = "" + + +def _clean(x): + """JSON has no NaN; represent unmeasurable values as null.""" + if x is None: + return None + if isinstance(x, (int, bool)): + return x + return float(x) if np.isfinite(x) else None + + +@dataclass +class InjectionPlan: + """How to turn a wanted audio frequency into an AWG frequency. + + ``ReceiveProcessing`` shifts twice before decimating: by Fs/4 + (``FreqShiftFs4``, DSP.cpp) and then by the fine tune plus any CW sidetone + (``FreqShiftF``). So the tone that demodulates to zero audio sits at + ``|Fs/4 + fineTune|``, and everything else is measured either side of it. + + Fs/4 is 48 kHz at 192 ksps but 44.1 kHz at 176.4 ksps; recomputing it per + rate is the whole point of the exercise. The fine tune is whatever the + operator last tuned to - routinely several kHz - and leaving it out puts + every injection outside the passband, so the radio stays silent and no + amount of extra drive helps. + + ``sideband_sign`` says which side of that centre the passband lies on, and + ``phase_sign`` says which AWG channel drives I. Both are discovered by + experiment rather than derived from the radio's reported mode: getting + either wrong produces silence rather than a subtly wrong answer, so trying + all four combinations is both cheap and safer than modelling the chain. + """ + + rate_hz: int + fine_tune_hz: float = 0.0 + sidetone_hz: float = 0.0 + mapping_correction_hz: float = 0.0 + phase_sign: int = 1 + sideband_sign: int = 1 + amplitude_v: float = 0.03 + + @property + def fs_over_4_hz(self) -> float: + return bt.fs_over_4_hz(self.rate_hz) + + @property + def centre_hz(self) -> float: + """Injection frequency that demodulates to DC. + + ReceiveProcessing shifts by Fs/4 (`FreqShiftFs4`) and then again by the + fine tune (`FreqShiftF`), so the tone that lands at zero audio sits at + |Fs/4 + fineTune| - **not** at Fs/4. The fine tune is whatever the + operator last tuned to and is routinely several kHz, so ignoring it puts + every injection far outside the passband and nothing is heard at all. + """ + return abs(self.fs_over_4_hz + self.fine_tune_hz) + + def inject_hz(self, f_audio_hz: float) -> float: + offset = self.sideband_sign * (f_audio_hz + self.sidetone_hz) + return self.centre_hz + offset + self.mapping_correction_hz + + +class Injector: + """Drives one audio frequency and reads its level back.""" + + def __init__(self, ad2: Ad2, plan: InjectionPlan, settle_s: float, + min_snr_db: float, max_thd_db: float) -> None: + self.ad2 = ad2 + self.plan = plan + self.settle_s = settle_s + self.min_snr_db = min_snr_db + self.max_thd_db = max_thd_db + + def point(self, f_audio_hz: float) -> ToneMeasurement: + f_in = self.plan.inject_hz(f_audio_hz) + self.ad2.set_quadrature(f_in, self.plan.amplitude_v, self.plan.phase_sign) + cap = self.ad2.capture_after(self.settle_s) + return measure_tone(cap, f_audio_hz, + scope_range_v=self.ad2.cfg.scope_range_v, + min_snr_db=self.min_snr_db, + max_thd_db=self.max_thd_db) + + def sweep(self, freqs_hz: Iterable[float]) -> list[ToneMeasurement]: + return [self.point(float(f)) for f in freqs_hz] + + +def _point_dict(f_audio: float, plan: InjectionPlan, m: ToneMeasurement, + ref_dbv: Optional[float] = None) -> dict: + d = { + "f_audio_hz": round(f_audio, 3), + "f_inject_hz": round(plan.inject_hz(f_audio), 3), + "f_measured_hz": _clean(m.f_measured_hz), + "level_dbv": _clean(m.level_dbv), + "snr_db": _clean(m.snr_db), + "thd_db": _clean(m.thd_db), + "clipped": m.clipped, + "valid": m.valid, + } + if ref_dbv is not None: + d["ref_dbv"] = _clean(ref_dbv) + d["resp_db"] = _clean(m.level_dbv - ref_dbv) + if m.reason: + d["reason"] = m.reason + return d + + +# =========================================================================== +# T0 preflight +# =========================================================================== + +def run_preflight(radio: Radio, ad2: Ad2, allow_agc_on: bool, + log: Callable[[str], None]) -> tuple[TestResult, EdSnapshot]: + """Confirm the rig answers and the radio is in a measurable state.""" + checks: list[Check] = [] + + ident = radio.expect("ID;") + checks.append(Check("rig.cat", "rig", "Radio answers on the CAT port", + None, None, "", True, message=f"ID reply {ident}")) + + ed = radio.dump_ed() + log(f"Radio: rate {ed.sample_rate_hz} sps, band {ed.current_band[ed.active_vfo]}, " + f"mode {ed.modulation_name}, AGC {'off' if ed.agc_off else 'ON'}, " + f"volume {ed.audio_volume}") + + # AGC would compress the very amplitude differences the suite measures, + # flattening every filter skirt into a straight line. There is no CAT + # command for it, so this can only be checked, not fixed. + agc_ok = ed.agc_off + checks.append(Check( + "rig.agc_off", "rig", "AGC is off so amplitude sweeps are meaningful", + float(ed.agc), 0.0, "mode", agc_ok or allow_agc_on, skipped=False, + message=("AGC is off" if agc_ok else + f"AGC mode is {ed.agc}; it will flatten every filter skirt. " + f"Turn it off in the radio's menu." + + (" Continuing because --allow-agc-on was given; RESULTS ARE UNRELIABLE." + if allow_agc_on else "")))) + + checks.append(Check( + "rig.sample_rate_known", "rig", "Radio reports a CAT-selectable sample rate", + float(ed.sample_rate_hz), None, "hz", ed.sample_rate_hz in bt.SAMPLE_RATES_HZ, + message=f"{ed.sample_rate_hz} sps")) + + return TestResult("preflight", checks, {"ed": ed.summary(), "id": ident}), ed + + +# =========================================================================== +# T1 I/Q wiring order +# =========================================================================== + +def detect_iq_order(ad2: Ad2, plan: InjectionPlan, settle_s: float, + min_rejection_db: float, forced_sign: Optional[int], + amplitude_v: float, + log: Callable[[str], None]) -> tuple[TestResult, int, int]: + """Find the quadrature sense and the sideband, by trying all four. + + Two independent unknowns: + + * **Which AWG channel drives I.** Swapping I and Q conjugates the baseband + signal, so a tone that lands at +1 kHz with one wiring lands at -1 kHz with + the other. + * **Which side of Fs/4 the passband sits on.** An upper-sideband band takes + audio from ``Fs/4 + f``, a lower-sideband band from ``Fs/4 - f``. + + Either one wrong puts the tone outside the SSB convolution filter, which + rejects it hard - discriminating against the unwanted sideband is that + filter's entire job. So the right combination stands out unmistakably, and + the wrong ones fail loudly rather than quietly reading a bit low. + + Nothing needs rewiring: the suite compensates in software. + """ + probe_hz = 1000.0 + # Detection runs at the approved ceiling rather than the auto-level floor: + # picking the right combination is a relative comparison, and at 10 mV the + # tone is under the receiver's own noise so all four look alike. The level is + # brought back down by autolevel immediately afterwards. + plan.amplitude_v = amplitude_v + trials: dict[str, dict] = {} + best_key, best_amp, best = None, -1.0, None + second_amp = -1.0 + + phase_candidates = (forced_sign,) if forced_sign is not None else (+1, -1) + + for phase in phase_candidates: + for side in (+1, -1): + plan.phase_sign, plan.sideband_sign = phase, side + f_in = plan.inject_hz(probe_hz) + ad2.set_quadrature(f_in, plan.amplitude_v, phase) + cap = ad2.capture_after(settle_s) + m = measure_tone(cap, probe_hz, scope_range_v=ad2.cfg.scope_range_v, + min_snr_db=0.0, max_thd_db=99.0) + key = f"phase{phase:+d}_side{side:+d}" + trials[key] = {"phase_sign": phase, "sideband_sign": side, + **_point_dict(probe_hz, plan, m)} + log(f" W2 {phase*90:+d} deg, {'USB' if side > 0 else 'LSB'} side: " + f"{m.level_dbv:7.1f} dBV at {m.f_measured_hz:7.1f} Hz, " + f"SNR {m.snr_db:5.1f} dB (inject {f_in:.0f} Hz)") + if m.amplitude_v > best_amp: + second_amp, best_amp = best_amp, m.amplitude_v + best_key, best = key, m + elif m.amplitude_v > second_amp: + second_amp = m.amplitude_v + + phase_sign = trials[best_key]["phase_sign"] + sideband_sign = trials[best_key]["sideband_sign"] + plan.phase_sign, plan.sideband_sign = phase_sign, sideband_sign + + # The number that has to be unambiguous is the *sideband*: which side of the + # demodulation centre to inject. Compare like with like - same phase sense, + # opposite side - because that is the choice being made. + # + # The phase sense is a much weaker effect and is deliberately not gated on. + # Imperfect quadrature (an amplitude imbalance between W1 and W2 at the + # radio's inputs is normal) leaves an image at the mirror frequency, but the + # SSB convolution filter rejects that image anyway, so both phase senses + # produce a usable tone and only the amplitude differs. Requiring them to + # differ would fail a perfectly good rig. + other_side = trials.get(f"phase{phase_sign:+d}_side{-sideband_sign:+d}") + other_amp = other_side["level_dbv"] if other_side else None + rejection = (best.level_dbv - other_amp) if other_amp is not None else 99.0 + + phase_margin = 99.0 + other_phase = trials.get(f"phase{-phase_sign:+d}_side{sideband_sign:+d}") + if other_phase and other_phase["level_dbv"] is not None: + phase_margin = best.level_dbv - other_phase["level_dbv"] + + wiring = ("W1 -> I (codec left), W2 -> Q (codec right)" if phase_sign > 0 + else "W1 -> Q (codec right), W2 -> I (codec left)") + sideband = ("above the demodulation centre" if sideband_sign > 0 + else "below the demodulation centre") + + passed = rejection >= min_rejection_db and best.snr_db > 6.0 + if best.snr_db <= 6.0: + msg = ("no audio from any combination - check that the AD2 ground is " + "shared with the radio, that W1 and W2 are connected to the I/Q " + "inputs, and that the radio is unmuted") + elif rejection < min_rejection_db: + msg = (f"only {rejection:.1f} dB between injecting above and below the " + f"demodulation centre; the SSB filter should reject the wrong " + f"side much harder than that") + else: + msg = (f"inject {sideband}; {wiring} (phase margin {phase_margin:+.1f} dB); " + f"wrong side rejected by {rejection:.1f} dB") + + check = Check("rig.sideband", "rig", + "The wrong side of the demodulation centre is clearly rejected", + rejection, min_rejection_db, "db", passed, message=msg) + + data = { + "phase_sign": phase_sign, + "sideband_sign": sideband_sign, + "detect_amplitude_v": amplitude_v, + "wiring": wiring, + "sideband": sideband, + "image_rejection_db": _clean(rejection), + "phase_margin_db": _clean(phase_margin), + "forced": forced_sign is not None, + "trials": trials, + } + return TestResult("iq_order", [check], data), phase_sign, sideband_sign + + +# =========================================================================== +# T2 drive level +# =========================================================================== + +def autolevel(ad2: Ad2, plan: InjectionPlan, settle_s: float, start_v: float, + max_v: float, step_db: float, min_snr_db: float, max_thd_db: float, + log: Callable[[str], None]) -> tuple[TestResult, float]: + """Find the smallest drive that gives a clean measurement. + + Steps up only, and never past ``max_v``: the tolerance of these inputs is + not documented, so the suite starts quiet and stops as soon as the signal is + good enough rather than reaching for the largest usable level. + """ + probe_hz = 1000.0 + amplitude = start_v + trials = [] + chosen = None + + while amplitude <= max_v * 1.0001: + plan.amplitude_v = amplitude + ad2.set_quadrature(plan.inject_hz(probe_hz), amplitude, plan.phase_sign) + cap = ad2.capture_after(settle_s) + m = measure_tone(cap, probe_hz, scope_range_v=ad2.cfg.scope_range_v, + min_snr_db=min_snr_db, max_thd_db=max_thd_db, + thd_invalidates=True) + trials.append({"amplitude_v": round(amplitude, 6), **_point_dict(probe_hz, plan, m)}) + log(f" {amplitude*1000:6.1f} mV -> {m.level_dbv:6.1f} dBV, " + f"SNR {m.snr_db:5.1f} dB, THD {m.thd_db:6.1f} dB, peak {m.peak_v:.3f} V") + + if m.snr_db >= min_snr_db and m.thd_db <= max_thd_db and not m.clipped: + chosen = amplitude + break + amplitude *= 10.0 ** (step_db / 20.0) + + if chosen is None: + chosen = min(amplitude, max_v) + plan.amplitude_v = chosen + msg = (f"never reached {min_snr_db:.0f} dB SNR below {max_v*1000:.0f} mV; " + f"raise --max-amplitude or the radio's volume") + passed = False + else: + plan.amplitude_v = chosen + msg = f"{chosen*1000:.1f} mV" + passed = True + + check = Check("rig.drive_level", "rig", + "A drive level giving adequate SNR without clipping", + chosen * 1000.0, max_v * 1000.0, "mv", passed, message=msg) + return TestResult("autolevel", [check], {"amplitude_v": chosen, "trials": trials}), chosen + + +# =========================================================================== +# T3 Fs/4 mapping +# =========================================================================== + +#: How far the measured demodulation centre may sit from its nominal position. +#: Generous on purpose: the Teensy synthesises its I2S clock with a fractional +#: divider, so the true sample rate is a few tens of ppm off nominal and the +#: centre moves with it. The residual is folded into `mapping_correction_hz` +#: rather than treated as an error. What this check exists to catch is the gross +#: case - a chain that did not reconfigure its frequency shift for the new rate, +#: which would land kilohertz away, not tens of hertz. +MAPPING_OFFSET_TOL_HZ = 150.0 + + +def calibrate_mapping(ad2: Ad2, plan: InjectionPlan, settle_s: float, + log: Callable[[str], None]) -> TestResult: + """Confirm - and trim - the input-to-audio frequency relationship. + + Fits ``f_audio = slope * f_inject + offset`` over three probes. The offset + must come out at -(Fs/4) plus any sidetone shift; if the firmware failed to + reconfigure the frequency shift for the new rate, this is where it shows, + and nothing measured afterwards would mean anything. + """ + probes = (400.0, 800.0, 1400.0) + f_in, f_out = [], [] + for f_audio in probes: + fi = plan.inject_hz(f_audio) + ad2.set_quadrature(fi, plan.amplitude_v, plan.phase_sign) + cap = ad2.capture_after(settle_s) + f_meas, _ = dominant_tone(cap, f_min_hz=100.0) + f_in.append(fi) + f_out.append(f_meas) + log(f" inject {fi:9.1f} Hz -> audio {f_meas:7.1f} Hz (wanted {f_audio:.1f})") + + slope, offset = np.polyfit(np.asarray(f_in), np.asarray(f_out), 1) + residuals = [abs(o - (slope * i + offset)) for i, o in zip(f_in, f_out)] + + # On a lower-sideband band the audio frequency falls as the injected one + # rises, so the fitted slope is -1 and the offset has the opposite sign. + s = plan.sideband_sign + expected_slope = float(s) + expected_offset = -s * (plan.centre_hz + plan.mapping_correction_hz) \ + - plan.sidetone_hz + offset_err = offset - expected_offset + + checks = [ + Check("map.slope", "mapping", + "Audio frequency tracks the injected frequency one for one", + float(slope), expected_slope, "ratio", + abs(slope - expected_slope) <= 2e-3, + message=f"slope {slope:+.5f} (expected {expected_slope:+.0f})"), + Check("map.offset", "mapping", + f"Demodulation centre is |Fs/4 + fineTune| = {plan.centre_hz:.0f} Hz " + f"(Fs/4 {plan.fs_over_4_hz:.0f}, fine tune {plan.fine_tune_hz:+.0f})", + float(offset), float(expected_offset), "hz", + abs(offset_err) <= MAPPING_OFFSET_TOL_HZ, + message=(f"measured offset {offset:.1f} Hz, expected " + f"{expected_offset:.1f} Hz ({offset_err:+.1f} Hz, " + f"{1e6*offset_err/plan.fs_over_4_hz:+.0f} ppm of Fs/4)")), + Check("map.residual", "mapping", "Per-probe fit residual is small", + float(max(residuals)), 5.0, "hz", max(residuals) <= 5.0, + message=f"worst residual {max(residuals):.2f} Hz"), + ] + + # Fold the error back in so later injections land where they are asked to. + # inject_hz adds the correction directly, so it carries the sideband sign. + correction = plan.mapping_correction_hz - s * offset_err + data = { + "slope": _clean(slope), + "offset_hz": _clean(offset), + "expected_offset_hz": _clean(expected_offset), + "centre_hz": _clean(plan.centre_hz), + "fine_tune_hz": _clean(plan.fine_tune_hz), + "residual_hz": _clean(max(residuals)), + "correction_hz": _clean(correction), + "offset_error_hz": _clean(offset_err), + "offset_error_ppm": _clean(1e6 * offset_err / plan.fs_over_4_hz), + "sidetone_hz": plan.sidetone_hz, + "probes": [{"f_audio_hz": a, "f_inject_hz": i, "f_measured_hz": o} + for a, i, o in zip(probes, f_in, f_out)], + } + if all(c.passed for c in checks): + plan.mapping_correction_hz = correction + + return TestResult("mapping", checks, data) + + +# =========================================================================== +# T4 reference sweep +# =========================================================================== + +def reference_sweep(inj: Injector, grid_hz: np.ndarray, + log: Callable[[str], None]) -> TestResult: + """The common-path denominator every filter response divides by.""" + points = [] + levels = {} + for f in grid_hz: + m = inj.point(float(f)) + points.append(_point_dict(float(f), inj.plan, m)) + levels[float(f)] = m.level_dbv + + valid = [p for p in points if p["valid"]] + in_band = [p for p in points if 300.0 <= p["f_audio_hz"] <= 2500.0] + in_band_valid = [p for p in in_band if p["valid"]] + frac = len(in_band_valid) / len(in_band) if in_band else 0.0 + + db = [p["level_dbv"] for p in in_band if p["level_dbv"] is not None] + dyn = (max(db) - min(db)) if db else 0.0 + + # A passband that is flat to within a decibel across two octaves is not a + # passband, it is a compressor. Most likely AGC is on after all. + # Compare two in-band frequencies; a point outside the SSB passband would + # report the filter skirt as an analog tilt. + tilt = 0.0 + in_band_levels = {p["f_audio_hz"]: p["level_dbv"] for p in in_band_valid + if p["level_dbv"] is not None} + if len(in_band_levels) >= 2: + lo = min(in_band_levels, key=lambda k: abs(k - 500.0)) + hi = max(in_band_levels) + tilt = in_band_levels[hi] - in_band_levels[lo] + + checks = [ + Check("ref.coverage", "reference", + "Most of the passband gives a usable measurement", + 100.0 * frac, 95.0, "percent", frac >= 0.95, + message=f"{len(in_band_valid)}/{len(in_band)} points valid in 300-2500 Hz"), + ] + + log(f" {len(valid)}/{len(points)} points valid, in-band dynamic range " + f"{dyn:.1f} dB, 1k->4k tilt {tilt:+.1f} dB") + + return TestResult("reference_sweep", checks, { + "points": points, + "analog_tilt_db": _clean(tilt), + "in_band_dynamic_range_db": _clean(dyn), + }) + + +def _ref_lookup(reference: TestResult) -> dict: + return {p["f_audio_hz"]: p["level_dbv"] for p in reference.data["points"] + if p["level_dbv"] is not None} + + +# =========================================================================== +# T5 CW audio filters +# =========================================================================== + +def test_cw_filters(radio: Radio, inj: Injector, indices: Sequence[int], + tol_hz: float, passband_hi_hz: float, + log: Callable[[str], None]) -> TestResult: + """Measure each CW filter's -3 dB corner, ripple and stopband. + + Every probe is a pair: the same injected frequency captured with the filter + bypassed (``CF5``) and engaged. ``CWAudioFilter`` is a plain series stage, so + the difference is exactly the Chebyshev response and nothing else. + """ + filters = [] + checks: list[Check] = [] + + for k in indices: + nominal = bt.CW_FILTER_NOMINAL_HZ[k] + log(f" CW filter {k} ({nominal:.0f} Hz)") + + cache: dict[float, float] = {} + + def response_db(f_hz: float, _k=k, _cache=cache) -> float: + """Filter magnitude at f_hz, as engaged-minus-bypassed.""" + key = round(f_hz, 2) + if key in _cache: + return _cache[key] + radio.set_cw_filter(bt.CW_FILTER_OFF) + off = inj.point(f_hz) + radio.set_cw_filter(_k) + on = inj.point(f_hz) + val = on.level_dbv - off.level_dbv if (on.valid and off.valid) else float("nan") + _cache[key] = val + return val + + # Coarse shape first, so the report has a curve and not just a number. + coarse_f = geom_grid(nominal * 0.45, nominal * 1.6, 13) + coarse_db = [response_db(float(f)) for f in coarse_f] + + corner, trace = find_crossing(response_db, -3.0, + nominal * 0.6, nominal * 1.45, tol_hz) + + passband = [d for f, d in zip(coarse_f, coarse_db) + if 0.2 * nominal <= f <= 0.7 * nominal and np.isfinite(d)] + ripple = (max(passband) - min(passband)) if len(passband) >= 2 else float("nan") + # Probe the stopband where the CW filter is the only thing attenuating. + # 1.5x the cutoff would sit on the SSB filter's own skirt for the wider + # CW settings, and would measure that instead. + stop_hz = min(nominal * 1.5, 0.85 * passband_hi_hz) + stop = response_db(stop_hz) if stop_hz > nominal * 1.15 else float("nan") + + filters.append({ + "index": k, + "nominal_hz": nominal, + "corner_3db_hz": _clean(corner), + "passband_ripple_db": _clean(ripple), + "stopband_atten_db": _clean(stop), + "stopband_probe_hz": _clean(stop_hz), + "points": [{"f_audio_hz": round(float(f), 2), "resp_db": _clean(d)} + for f, d in zip(coarse_f, coarse_db)], + "bisection_trace": [[round(f, 2), _clean(d)] for f, d in trace], + }) + log(f" -3 dB at {corner:.1f} Hz, ripple {ripple:.2f} dB, " + f"stopband {stop:.1f} dB") + + checks.append(Check( + f"cw.{k}.shape_ripple", "cw", + f"{nominal:.0f} Hz CW filter passband is flat", + _clean(ripple), 1.0, "db", + bool(np.isfinite(ripple) and ripple <= 1.0), + message=f"{ripple:.2f} dB peak to peak" if np.isfinite(ripple) else "not measured")) + checks.append(Check( + f"cw.{k}.stopband", "cw", + f"{nominal:.0f} Hz CW filter attenuates above its cutoff", + _clean(stop), -25.0, "db", + bool(np.isfinite(stop) and stop <= -25.0), + skipped=not np.isfinite(stop), + message=(f"{stop:.1f} dB at {stop_hz:.0f} Hz" if np.isfinite(stop) + else f"no room between the {nominal:.0f} Hz cutoff and the " + f"{passband_hi_hz:.0f} Hz SSB passband to probe a stopband"))) + + radio.set_cw_filter(bt.CW_FILTER_OFF) + return TestResult("cw_filters", checks, {"filters": filters}) + + +# =========================================================================== +# T6 equaliser cells +# =========================================================================== + +def test_equalizer_cells(radio: Radio, inj: Injector, reference: TestResult, + cells: Sequence[int], n_points: int, + passband_hi_hz: float, + log: Callable[[str], None]) -> TestResult: + """Locate each equaliser cell's peak and bandwidth. + + A cell is isolated by setting it to 100 and the other thirteen to 0. The + cells are summed in parallel, so this leaves exactly one of them - no + approximation. + + The SSB filter is opened up first. At its normal 3 kHz the top two cells + (3150 and 4000 Hz) sit on or beyond the skirt and their shape is set by the + SSB filter rather than by the cell, so they cannot be measured at all. + """ + results = [] + checks: list[Check] = [] + + wanted_hi = max(bt.EQ_CENTRE_HZ[b] * 1.45 for b in cells) if cells else passband_hi_hz + widened_hi = passband_hi_hz + if wanted_hi > passband_hi_hz: + widened_hi = float(min(wanted_hi, 5500.0)) + radio.set_filter_hi_hz(int(widened_hi)) + time.sleep(0.5) + log(f" opened the SSB filter to {widened_hi:.0f} Hz so the top cells " + f"are not measured through its skirt") + + for b in cells: + fc = bt.EQ_CENTRE_HZ[b] + radio.set_eq_solo(b) + probe = geom_grid(fc * 0.72, fc * 1.4, n_points) + + freqs, resp, points = [], [], [] + for f in probe: + m = inj.point(float(f)) + points.append(_point_dict(float(f), inj.plan, m)) + if m.valid: + freqs.append(float(f)) + resp.append(m.level_dbv) + + if len(freqs) >= 3: + peak = peak_from_three(freqs, resp) + lo, hi, q = bandwidth_3db(freqs, resp) + else: + peak = lo = hi = q = float("nan") + + # A cell is edge limited when the SSB filter, not the cell, decides its + # shape. That depends on the filter width in use, so it is judged + # against the actual passband rather than a fixed list of cells. + edge_limited = (b in bt.EQ_EDGE_LIMITED_CELLS + or fc > 0.85 * widened_hi) + results.append({ + "index": b, + "nominal_hz": fc, + "peak_hz": _clean(peak), + "bw_3db_hz": _clean(hi - lo if np.isfinite(hi) and np.isfinite(lo) else float("nan")), + "q": _clean(q), + "q_expected": _clean(bt.eq_q(b)), + "edge_limited": edge_limited, + "points": points, + }) + log(f" cell {b:2d} ({fc:7.1f} Hz): peak {peak:7.1f} Hz, Q {q:5.2f}" + + (" [edge limited]" if edge_limited else "")) + + if np.isfinite(q) and not edge_limited: + q_err = abs(q - bt.eq_q(b)) / bt.eq_q(b) + checks.append(Check( + f"eq.{b}.q", "eq", f"{fc:.0f} Hz cell has the designed shape", + 100.0 * q_err, 25.0, "percent", q_err <= 0.25, + message=f"Q {q:.2f} vs {bt.eq_q(b):.2f} expected")) + + radio.set_eq_all([100] * bt.EQ_CELL_COUNT) + if widened_hi != passband_hi_hz: + radio.set_filter_hi_hz(int(passband_hi_hz)) + time.sleep(0.3) + return TestResult("equalizer_cells", checks, + {"cells": results, "passband_hi_hz": widened_hi}) + + +# =========================================================================== +# T7 SSB convolution filter - the control +# =========================================================================== + +#: Level at which the SSB filter edge is called. See test_ssb_filter. +SSB_EDGE_DB = -3.0 + + +def test_ssb_filter(radio: Radio, inj: Injector, widths_hz: Sequence[int], + baseline_hi_hz: int, log: Callable[[str], None]) -> TestResult: + """Check the SSB filter edge follows the commanded bandwidth. + + This filter derives its coefficients from the true sample rate and always + did, so it was never affected by the frozen-table bug. That makes it the + control: if it shows a shift between rates, the rig or the analysis is + wrong, not the firmware. + """ + settings = [] + checks: list[Check] = [] + widest = max(widths_hz) + + for width in [w for w in widths_hz if w != widest]: + cache: dict[float, float] = {} + + def response_db(f_hz: float, _w=width, _cache=cache) -> float: + key = round(f_hz, 2) + if key in _cache: + return _cache[key] + radio.set_filter_hi_hz(widest) + ref = inj.point(f_hz) + radio.set_filter_hi_hz(_w) + cur = inj.point(f_hz) + val = cur.level_dbv - ref.level_dbv if (cur.valid and ref.valid) else float("nan") + _cache[key] = val + return val + + # -3 dB rather than -6: measured through a receiver, the tone drops + # into the noise about 5 dB below the passband, so a -6 dB crossing is + # outside the dynamic range this rig has at the filter edge. + edge, trace = find_crossing(response_db, SSB_EDGE_DB, + width * 0.75, min(width * 1.25, 4200.0), 10.0) + settings.append({ + "fw_hz": width, + "hi_edge_6db_hz": _clean(edge), + "bisection_trace": [[round(f, 2), _clean(d)] for f, d in trace], + }) + log(f" FW {width} Hz -> {SSB_EDGE_DB:.0f} dB edge at {edge:.1f} Hz") + + if np.isfinite(edge): + checks.append(Check( + f"ssb.{width}.edge", "ssb", + f"SSB filter edge follows FW{width}", + float(edge), float(width), "hz", abs(edge - width) <= 200.0, + message=f"{SSB_EDGE_DB:.0f} dB edge at {edge:.1f} Hz for a " + f"commanded {width} Hz")) + + radio.set_filter_hi_hz(baseline_hi_hz) + return TestResult("ssb_filter", checks, {"settings": settings}) + + +# =========================================================================== +# T8 AM DC blocker +# =========================================================================== + +def test_am_dc_blocker(ad2: Ad2, plan: InjectionPlan, settle_s: float, + depth_pct: float, min_snr_db: float, + log: Callable[[str], None]) -> TestResult: + """Measure the AM demodulator's DC blocker corner. + + The blocker acts on the recovered envelope, so it can only be probed by + modulating the carrier and sweeping the modulation frequency - the carrier + itself sits at DC after demodulation. + """ + carrier = plan.inject_hz(0.0) + mods = geom_grid(10.0, 300.0, 12) + + def envelope_db(f_mod: float) -> float: + ad2.set_am_quadrature(carrier, plan.amplitude_v, plan.phase_sign, + f_mod, depth_pct) + cap = ad2.capture_after(settle_s) + m = measure_tone(cap, f_mod, scope_range_v=ad2.cfg.scope_range_v, + search_bw_hz=max(6.0, f_mod * 0.25), + min_snr_db=min_snr_db, max_thd_db=99.0) + return m.level_dbv if m.valid else float("nan") + + ref = envelope_db(300.0) + points = [] + for f in mods: + db = envelope_db(float(f)) + points.append({"f_mod_hz": round(float(f), 2), "resp_db": _clean(db - ref)}) + + corner, trace = find_crossing(lambda f: envelope_db(f) - ref, -3.0, + 120.0, 12.0, 1.0) + log(f" DC blocker -3 dB at {corner:.1f} Hz (design {bt.AM_DC_BLOCKER_CORNER_HZ:.0f} Hz)") + + checks = [Check( + "am.corner_nominal", "am", "AM DC blocker sits at its design corner", + _clean(corner), bt.AM_DC_BLOCKER_CORNER_HZ, "hz", + bool(np.isfinite(corner) and abs(corner - bt.AM_DC_BLOCKER_CORNER_HZ) <= 6.0), + message=f"{corner:.1f} Hz" if np.isfinite(corner) else "not measured")] + + return TestResult("am_dc_blocker", checks, { + "corner_3db_hz": _clean(corner), + "depth_pct": depth_pct, + "points": points, + "bisection_trace": [[round(f, 2), _clean(d)] for f, d in trace], + }) + + +# =========================================================================== +# Cross-rate comparison - the headline result +# =========================================================================== + +def _compare_feature(label: str, group: str, key: str, per_rate: dict, + extract: Callable[[dict], list], nominal_of: Callable[[dict], float], + id_of: Callable[[dict], str], rate_tol_pct: float, + nominal_tol_pct: float, + relaxed: Callable[[dict], bool] = lambda _: False, + relaxed_tol_pct: float = 8.0) -> tuple[list, list]: + """Compare one measured feature across sample rates.""" + rates = sorted(per_rate) + if len(rates) < 2: + return [], [] + + base_rate = max(rates) # 192000 is the historical reference + other_rates = [r for r in rates if r != base_rate] + + by_rate = {r: {id_of(item): item for item in extract(per_rate[r])} for r in rates} + rows, checks = [], [] + + for ident in by_rate[base_rate]: + base_item = by_rate[base_rate][ident] + base_val = base_item.get(key) + nominal = nominal_of(base_item) + measured = {str(base_rate): base_val} + worst_delta = 0.0 + measurable = base_val is not None + + for r in other_rates: + item = by_rate.get(r, {}).get(ident) + val = item.get(key) if item else None + measured[str(r)] = val + if val is None or base_val is None: + measurable = False + continue + d = pct_delta(base_val, val) + if abs(d) > abs(worst_delta): + worst_delta = d + + tol = relaxed_tol_pct if relaxed(base_item) else nominal_tol_pct + nominal_err = (pct_delta(nominal, base_val) + if base_val is not None and nominal else float("nan")) + + legacy_consistent = (measurable and + abs(worst_delta - bt.LEGACY_DELTA_PCT) < 2.0) + + rows.append({ + "id": ident, + "nominal_hz": nominal, + key: measured, + "delta_pct": _clean(worst_delta) if measurable else None, + "legacy_predicted_delta_pct": bt.LEGACY_DELTA_PCT, + "legacy_consistent": legacy_consistent, + "nominal_error_pct": _clean(nominal_err), + "verdict": ("PASS" if measurable and abs(worst_delta) <= rate_tol_pct + else "SKIP" if not measurable else "FAIL"), + }) + + msg = (f"{base_val:.1f} Hz at {base_rate} sps vs " + f"{measured.get(str(other_rates[0])):.1f} Hz at {other_rates[0]} sps" + if measurable else "not measured at both rates") + if legacy_consistent: + msg += (f" - this matches the {bt.LEGACY_DELTA_PCT:.3f}% shift the " + f"frozen coefficient tables used to produce") + + checks.append(Check( + f"{group}.{ident}.rate_invariance", group, + f"{label} {nominal:.0f} Hz holds across sample rates", + _clean(worst_delta) if measurable else None, rate_tol_pct, "percent", + measurable and abs(worst_delta) <= rate_tol_pct, + skipped=not measurable, message=msg)) + + if measurable: + checks.append(Check( + f"{group}.{ident}.nominal", group, + f"{label} {nominal:.0f} Hz is near its labelled frequency", + _clean(nominal_err), tol, "percent", + bool(np.isfinite(nominal_err) and abs(nominal_err) <= tol), + message=f"measured {base_val:.1f} Hz for a labelled {nominal:.0f} Hz")) + + return rows, checks + + +def compare_rates(per_rate: dict, rate_tol_pct: float, + nominal_tol_pct: float) -> tuple[dict, list]: + """Roll every per-rate measurement up into the cross-rate verdict.""" + comparison: dict = {} + checks: list[Check] = [] + + rows, cw_checks = _compare_feature( + "CW filter", "cw", "corner_3db_hz", per_rate, + extract=lambda d: d.get("cw_filters", {}).get("filters", []), + nominal_of=lambda i: i["nominal_hz"], + id_of=lambda i: str(i["index"]), + rate_tol_pct=rate_tol_pct, nominal_tol_pct=nominal_tol_pct) + comparison["cw_filters"] = rows + checks += cw_checks + + rows, eq_checks = _compare_feature( + "EQ cell", "eq", "peak_hz", per_rate, + extract=lambda d: d.get("equalizer_cells", {}).get("cells", []), + nominal_of=lambda i: i["nominal_hz"], + id_of=lambda i: str(i["index"]), + rate_tol_pct=rate_tol_pct, nominal_tol_pct=nominal_tol_pct, + relaxed=lambda i: bool(i.get("edge_limited"))) + comparison["eq_cells"] = rows + checks += eq_checks + + rows, ssb_checks = _compare_feature( + "SSB filter", "ssb", "hi_edge_6db_hz", per_rate, + extract=lambda d: d.get("ssb_filter", {}).get("settings", []), + nominal_of=lambda i: float(i["fw_hz"]), + id_of=lambda i: str(i["fw_hz"]), + rate_tol_pct=rate_tol_pct, nominal_tol_pct=nominal_tol_pct) + comparison["ssb_filter"] = rows + checks += ssb_checks + + am = {r: per_rate[r].get("am_dc_blocker") for r in per_rate} + if all(v and v.get("corner_3db_hz") for v in am.values()) and len(am) > 1: + rates = sorted(am) + base = max(rates) + other = [r for r in rates if r != base][0] + delta = pct_delta(am[base]["corner_3db_hz"], am[other]["corner_3db_hz"]) + comparison["am_dc_blocker"] = { + "nominal_hz": bt.AM_DC_BLOCKER_CORNER_HZ, + "corner_3db_hz": {str(r): am[r]["corner_3db_hz"] for r in rates}, + "delta_pct": _clean(delta), + "legacy_predicted_delta_pct": bt.LEGACY_DELTA_PCT, + "verdict": "PASS" if abs(delta) <= 3.0 else "FAIL", + } + checks.append(Check( + "am.corner.rate_invariance", "am", + "AM DC blocker corner holds across sample rates", + _clean(delta), 3.0, "percent", abs(delta) <= 3.0, + message=f"{am[base]['corner_3db_hz']:.1f} Hz vs " + f"{am[other]['corner_3db_hz']:.1f} Hz")) + + return comparison, checks diff --git a/code/tools/flag_timing.py b/code/tools/flag_timing.py new file mode 100644 index 0000000..dc4500b --- /dev/null +++ b/code/tools/flag_timing.py @@ -0,0 +1,668 @@ +#!/usr/bin/env python3 +""" +Measure timing of code execution flow by capturing the Flag(uint8_t) signal +output on Teensy pins 28-31 via an Analog Discovery 2 (AD2) digital input. + +Flag value encoding (set inside Globals.cpp::Flag(val)): + pin 31 -> bit 0 (LSB) + pin 30 -> bit 1 + pin 29 -> bit 2 + pin 28 -> bit 3 (MSB) +so Flag(val) writes the 4-bit value `val` (0..15) across the four pins. + +Default physical wiring (Teensy pin -> AD2 DIO line): + 28 -> DIO1, 29 -> DIO2, 30 -> DIO3, 31 -> DIO4 +The DIO mapping is overridable on the command line. + +Output is a single JSON document on stdout, intended for ingestion by a +Claude Code Skill. All progress / diagnostic text goes to stderr (suppressed +with --quiet). The exit code is 0 on success, non-zero on any error; in the +error case stdout contains a JSON object with {"error": "..."} so the caller +can parse it uniformly. + +Top-level JSON shape: + { + "metadata": { sample_rate_hz, sample_period_s, buffer_size, + duration_s, trigger, debounce_us, pin_mapping, ... }, + "transitions": [ {index, time_s, from_flag, to_flag}, ... ], + "segments": [ {flag, start_time_s, end_time_s, duration_s}, ... ], + "summary": { flag_segment_stats: { "": {count, min_s, ...} }, + transition_counts: { "->": N, ... } }, + "measurement": (only if --measure FROM TO given) { + from_flag, to_flag, count, intervals_s, + min_s, max_s, mean_s, median_s, stddev_s } + } +""" + +import argparse +import ctypes +import json +import sys +import time + +import numpy as np + +# ----- Pin / bit mapping --------------------------------------------------- + +# Teensy pin -> Flag bit position. Fixed by the Flag() implementation. +TEENSY_PIN_TO_BIT = {28: 3, 29: 2, 30: 1, 31: 0} + +# Teensy pin -> AD2 DIO line (default; overridable via --dio-map). +DEFAULT_TEENSY_TO_DIO = {28: 1, 29: 2, 30: 3, 31: 4} + + +# ----- DWF library binding ------------------------------------------------- + +def _load_dwf(): + if sys.platform.startswith("win"): + return ctypes.cdll.dwf + if sys.platform.startswith("darwin"): + return ctypes.cdll.LoadLibrary("/Library/Frameworks/dwf.framework/dwf") + return ctypes.cdll.LoadLibrary("libdwf.so") + + +def _bind_dwf_argtypes(dwf): + """Declare argtypes for the DWF entrypoints we use.""" + c_int = ctypes.c_int + c_uint = ctypes.c_uint + c_double = ctypes.c_double + c_byte = ctypes.c_byte + + dwf.FDwfDeviceOpen.argtypes = [c_int, ctypes.POINTER(c_int)] + dwf.FDwfDeviceCloseAll.argtypes = [] + dwf.FDwfGetLastErrorMsg.argtypes = [ctypes.c_char_p] + + dwf.FDwfDigitalInReset.argtypes = [c_int] + dwf.FDwfDigitalInInternalClockInfo.argtypes = [c_int, ctypes.POINTER(c_double)] + dwf.FDwfDigitalInDividerSet.argtypes = [c_int, c_uint] + dwf.FDwfDigitalInBufferSizeSet.argtypes = [c_int, c_int] + dwf.FDwfDigitalInBufferSizeInfo.argtypes = [c_int, ctypes.POINTER(c_int)] + dwf.FDwfDigitalInSampleFormatSet.argtypes = [c_int, c_int] + dwf.FDwfDigitalInAcquisitionModeSet.argtypes = [c_int, c_int] + dwf.FDwfDigitalInTriggerSourceSet.argtypes = [c_int, c_byte] + dwf.FDwfDigitalInTriggerPositionSet.argtypes = [c_int, c_uint] + dwf.FDwfDigitalInTriggerSet.argtypes = [c_int, c_uint, c_uint, c_uint, c_uint] + dwf.FDwfDigitalInConfigure.argtypes = [c_int, c_int, c_int] + dwf.FDwfDigitalInStatus.argtypes = [c_int, c_int, ctypes.POINTER(c_byte)] + dwf.FDwfDigitalInStatusData.argtypes = [c_int, ctypes.c_void_p, c_int] + dwf.FDwfDigitalInStatusRecord.argtypes = [ + c_int, + ctypes.POINTER(c_int), + ctypes.POINTER(c_int), + ctypes.POINTER(c_int), + ] + + +# ----- Acquisition --------------------------------------------------------- + +# DWF constants we need +TRIG_SRC_NONE = 0 +TRIG_SRC_DETECTOR_DIGITAL_IN = 3 +ACQMODE_SINGLE = 0 +ACQMODE_RECORD = 3 +STATE_DONE = 2 + + +def _dwf_last_error(dwf): + buf = ctypes.create_string_buffer(512) + dwf.FDwfGetLastErrorMsg(buf) + return buf.value.decode("utf-8", errors="replace") + + +def acquire(sample_rate_hz, buffer_size, trigger, trigger_pattern_mask, + trigger_pattern_value, trigger_change_mask, trigger_position_frac, + mode, log): + """Capture digital samples from the AD2 and return them as a uint16 array. + + `mode` is one of "auto", "single", "record". In "auto" the path is chosen + based on whether the requested capture fits in the device's on-board + buffer. Single-shot is preferred for short windows (less overhead); + record mode streams over USB so it supports arbitrary-length captures. + + Returns (samples, actual_sample_rate_hz, extras), where extras is a dict + with keys: mode, lost_samples, corrupt_samples, device_buffer_size. + Each sample's bits correspond to DIO0..DIO15 (bit 0 = DIO0). + """ + dwf = _load_dwf() + _bind_dwf_argtypes(dwf) + + hdwf = ctypes.c_int() + log(f"Opening AD2 device...") + if dwf.FDwfDeviceOpen(-1, ctypes.byref(hdwf)) != 1 or hdwf.value == 0: + raise RuntimeError(f"Failed to open AD2: {_dwf_last_error(dwf)}") + + try: + dwf.FDwfDigitalInReset(hdwf) + + # Internal clock is typically 100 MHz; compute divider for requested rate. + clk = ctypes.c_double() + dwf.FDwfDigitalInInternalClockInfo(hdwf, ctypes.byref(clk)) + internal_clock_hz = clk.value + divider = max(1, int(round(internal_clock_hz / sample_rate_hz))) + actual_rate = internal_clock_hz / divider + log(f"Internal clock: {internal_clock_hz/1e6:.3f} MHz, " + f"divider={divider}, actual sample rate {actual_rate/1e6:.6f} MHz") + + dwf.FDwfDigitalInDividerSet(hdwf, ctypes.c_uint(divider)) + + # 16-bit samples cover DIO0..DIO15 in one word. + dwf.FDwfDigitalInSampleFormatSet(hdwf, 16) + + # Device-reported max buffer size determines single-vs-record choice. + max_buf = ctypes.c_int() + dwf.FDwfDigitalInBufferSizeInfo(hdwf, ctypes.byref(max_buf)) + device_max = max_buf.value + + if mode == "auto": + mode = "single" if buffer_size <= device_max else "record" + log(f"Auto-selected acquisition mode: {mode} " + f"(requested {buffer_size} samples, device max {device_max}).") + elif mode == "single" and buffer_size > device_max: + log(f"Forced single mode but requested buffer {buffer_size} > " + f"device max {device_max}; clamping to {device_max}.") + buffer_size = device_max + + if mode == "single": + dwf.FDwfDigitalInBufferSizeSet(hdwf, buffer_size) + dwf.FDwfDigitalInAcquisitionModeSet(hdwf, ACQMODE_SINGLE) + else: + # Record mode: set mode FIRST, then query the device max again + # (some firmwares report different maxima per acquisition mode), + # then size the on-device ring buffer to the largest available + # for USB headroom. Total capture length is set via + # TriggerPositionSet. + dwf.FDwfDigitalInAcquisitionModeSet(hdwf, ACQMODE_RECORD) + dwf.FDwfDigitalInBufferSizeInfo(hdwf, ctypes.byref(max_buf)) + device_max = max_buf.value + dwf.FDwfDigitalInBufferSizeSet(hdwf, device_max) + + # Trigger configuration. + if trigger == "none": + dwf.FDwfDigitalInTriggerSourceSet(hdwf, ctypes.c_byte(TRIG_SRC_NONE)) + if mode == "record": + # In record mode, TriggerPositionSet specifies total samples + # to acquire (not a buffer offset like in single mode). + dwf.FDwfDigitalInTriggerPositionSet( + hdwf, ctypes.c_uint(buffer_size)) + else: + dwf.FDwfDigitalInTriggerSourceSet( + hdwf, ctypes.c_byte(TRIG_SRC_DETECTOR_DIGITAL_IN)) + if mode == "single": + # Pre-trigger position measured in samples from the start of + # the buffer; default is mid-buffer so we see context either + # side of the trigger event. + pre_trig_samples = int(buffer_size * trigger_position_frac) + dwf.FDwfDigitalInTriggerPositionSet( + hdwf, ctypes.c_uint(buffer_size - pre_trig_samples)) + else: + # Record mode: TriggerPositionSet is total samples after trigger. + dwf.FDwfDigitalInTriggerPositionSet( + hdwf, ctypes.c_uint(buffer_size)) + + fs_low = trigger_pattern_mask & ~trigger_pattern_value + fs_high = trigger_pattern_mask & trigger_pattern_value + fs_rise = trigger_change_mask + fs_fall = trigger_change_mask + dwf.FDwfDigitalInTriggerSet( + hdwf, + ctypes.c_uint(fs_low), + ctypes.c_uint(fs_high), + ctypes.c_uint(fs_rise), + ctypes.c_uint(fs_fall), + ) + log(f"Trigger configured: mode={trigger}, " + f"low=0x{fs_low:04x}, high=0x{fs_high:04x}, " + f"rise=0x{fs_rise:04x}, fall=0x{fs_fall:04x}") + + # Give analog/digital front end a moment to settle. + time.sleep(0.5) + + log(f"Starting {mode}-mode acquisition for {buffer_size} samples " + f"({buffer_size/actual_rate*1e3:.3f} ms)...") + dwf.FDwfDigitalInConfigure(hdwf, 0, 1) + + extras = { + "mode": mode, + "lost_samples": 0, + "corrupt_samples": 0, + "device_buffer_size": device_max, + } + + if mode == "single": + sts = ctypes.c_byte() + deadline = time.time() + 30.0 + while True: + dwf.FDwfDigitalInStatus(hdwf, 1, ctypes.byref(sts)) + if sts.value == STATE_DONE: + break + if time.time() > deadline: + raise RuntimeError( + "Timed out waiting for acquisition to complete " + "(trigger may never have fired)") + time.sleep(0.005) + + log("Acquisition done; reading samples.") + raw = (ctypes.c_uint16 * buffer_size)() + dwf.FDwfDigitalInStatusData(hdwf, raw, buffer_size * 2) + samples = np.frombuffer(raw, dtype=np.uint16).copy() + return samples, actual_rate, extras + + # ---- Record (streaming) mode ---------------------------------------- + # Preallocate the destination numpy buffer and read DWF chunks + # directly into it via pointer arithmetic. This avoids per-iteration + # ctypes allocation and an extra memcpy, both of which cost enough + # to overflow the AD2's small on-device ring buffer at >=500 kHz. + samples = np.empty(buffer_size, dtype=np.uint16) + samples_base = samples.ctypes.data + idx = 0 + c_available = ctypes.c_int() + c_lost = ctypes.c_int() + c_corrupt = ctypes.c_int() + sts = ctypes.c_byte() + # Allow up to 3x expected duration plus 10 s slack for trigger wait. + expected_s = buffer_size / actual_rate + deadline = time.time() + max(30.0, expected_s * 3 + 10.0) + last_log = time.time() + + while idx < buffer_size: + dwf.FDwfDigitalInStatus(hdwf, 1, ctypes.byref(sts)) + dwf.FDwfDigitalInStatusRecord( + hdwf, ctypes.byref(c_available), + ctypes.byref(c_lost), ctypes.byref(c_corrupt)) + extras["lost_samples"] += c_lost.value + extras["corrupt_samples"] += c_corrupt.value + + n = c_available.value + if n > 0: + n = min(n, buffer_size - idx) + dst = ctypes.c_void_p(samples_base + idx * 2) + dwf.FDwfDigitalInStatusData(hdwf, dst, n * 2) + idx += n + # When draining backlog, loop again immediately without + # sleeping so we don't fall behind. + if n >= 256: + continue + + if sts.value == STATE_DONE and c_available.value == 0: + break + + now = time.time() + if now - last_log > 1.0: + log(f"Record progress: {idx}/{buffer_size} samples " + f"({idx/buffer_size*100:.1f}%), " + f"lost={extras['lost_samples']}, " + f"corrupt={extras['corrupt_samples']}") + last_log = now + if now > deadline: + raise RuntimeError( + f"Timed out in record mode after {idx}/{buffer_size} " + f"samples (trigger may never have fired, or USB throughput " + f"is insufficient at {actual_rate/1e6:.3f} MHz)") + # Short sleep only when ring is mostly empty; long enough to let + # the device accumulate a useful chunk, short enough to stay + # well below the ring-buffer overflow time. + time.sleep(0.0002) + + log(f"Record done; captured {idx} samples, " + f"lost={extras['lost_samples']}, corrupt={extras['corrupt_samples']}.") + return samples[:idx], actual_rate, extras + finally: + dwf.FDwfDeviceCloseAll() + + +# ----- Analysis ------------------------------------------------------------ + +def decode_flag_values(samples, teensy_to_dio): + """Map 16-bit DIO samples down to the 4-bit Flag value at each sample.""" + flag = np.zeros(samples.shape, dtype=np.uint8) + for teensy_pin, bit in TEENSY_PIN_TO_BIT.items(): + dio = teensy_to_dio[teensy_pin] + bit_vals = ((samples >> dio) & 1).astype(np.uint8) + flag |= bit_vals << bit + return flag + + +def find_segments(flag_values): + """Return contiguous-run segments as (start_idx, end_idx_exclusive, flag). + + A segment covers samples [start, end). end == start + length. + """ + if flag_values.size == 0: + return [] + change_idx = np.flatnonzero(np.diff(flag_values.astype(np.int16)) != 0) + 1 + starts = np.concatenate(([0], change_idx)) + ends = np.concatenate((change_idx, [flag_values.size])) + return [(int(s), int(e), int(flag_values[s])) for s, e in zip(starts, ends)] + + +def debounce_segments(segments, min_samples): + """Drop transient segments shorter than min_samples by merging them into + their predecessor. This collapses the brief intermediate states produced + by Flag()'s four sequential digitalWrite() calls. + """ + if min_samples <= 1 or not segments: + return segments + out = [] + for seg in segments: + start, end, flag = seg + length = end - start + if length < min_samples and out: + # Extend the previous segment over this transient. + ps, pe, pf = out[-1] + out[-1] = (ps, end, pf) + else: + out.append(seg) + # Merge any now-adjacent runs that share the same flag value. + merged = [] + for seg in out: + if merged and merged[-1][2] == seg[2]: + ps, _, pf = merged[-1] + merged[-1] = (ps, seg[1], pf) + else: + merged.append(seg) + return merged + + +def build_transitions(segments, sample_period_s): + transitions = [] + for prev, curr in zip(segments, segments[1:]): + idx = curr[0] + transitions.append({ + "index": idx, + "time_s": idx * sample_period_s, + "from_flag": prev[2], + "to_flag": curr[2], + }) + return transitions + + +def build_segment_dicts(segments, sample_period_s): + out = [] + for start, end, flag in segments: + out.append({ + "flag": flag, + "start_index": start, + "end_index": end, + "start_time_s": start * sample_period_s, + "end_time_s": end * sample_period_s, + "duration_s": (end - start) * sample_period_s, + }) + return out + + +def stats(values): + if not values: + return {"count": 0} + arr = np.asarray(values, dtype=np.float64) + n = arr.size + return { + "count": int(n), + "min_s": float(arr.min()), + "max_s": float(arr.max()), + "mean_s": float(arr.mean()), + "median_s": float(np.median(arr)), + "p95_s": float(np.percentile(arr, 95)), + "p99_s": float(np.percentile(arr, 99)), + "stddev_s": float(arr.std(ddof=0)) if n > 1 else 0.0, + "total_s": float(arr.sum()), + } + + +def summarize(segments, transitions, sample_period_s): + flag_durations = {} + for start, end, flag in segments: + flag_durations.setdefault(flag, []).append((end - start) * sample_period_s) + + transition_counts = {} + for t in transitions: + key = f"{t['from_flag']}->{t['to_flag']}" + transition_counts[key] = transition_counts.get(key, 0) + 1 + + return { + "flag_segment_stats": { + str(flag): stats(durs) for flag, durs in sorted(flag_durations.items()) + }, + "transition_counts": dict(sorted(transition_counts.items())), + } + + +def compute_measurement(segments, from_flag, to_flag, sample_period_s): + """Time from the *start* of each `from_flag` segment to the *start* of the + next `to_flag` segment. This is the natural way to read 'how long did the + code between Flag(FROM) and Flag(TO) take?' + """ + intervals = [] + i = 0 + while i < len(segments): + if segments[i][2] != from_flag: + i += 1 + continue + from_start = segments[i][0] + # Look for the next segment whose flag is to_flag. + j = i + 1 + while j < len(segments) and segments[j][2] != to_flag: + j += 1 + if j < len(segments): + to_start = segments[j][0] + intervals.append((to_start - from_start) * sample_period_s) + i = j + else: + break + return { + "from_flag": from_flag, + "to_flag": to_flag, + "intervals_s": [float(x) for x in intervals], + **stats(intervals), + } + + +# ----- CLI ----------------------------------------------------------------- + +def parse_dio_map(arg): + """Parse "28:1,29:2,30:3,31:4" -> {28: 1, ...}.""" + out = {} + for item in arg.split(","): + item = item.strip() + if not item: + continue + pin_str, dio_str = item.split(":") + out[int(pin_str)] = int(dio_str) + for pin in TEENSY_PIN_TO_BIT: + if pin not in out: + raise argparse.ArgumentTypeError( + f"--dio-map must include Teensy pin {pin}") + return out + + +def build_parser(): + p = argparse.ArgumentParser( + description="Capture Flag() pin signals on AD2 and report timing.") + p.add_argument("--sample-rate", type=float, default=10e6, + help="Target sample rate in Hz (default 10 MHz). " + "Actual rate is the nearest integer divider of the " + "AD2 internal clock (typically 100 MHz).") + p.add_argument("--duration", type=float, default=None, + help="Record duration in seconds. If set, overrides " + "--buffer-size: buffer_size = sample_rate * duration.") + p.add_argument("--buffer-size", type=int, default=8192, + help="Number of samples to capture (default 8192). " + "Clamped to device maximum.") + p.add_argument("--debounce-us", type=float, default=2.0, + help="Discard transient flag segments shorter than this " + "duration in microseconds. Useful because Flag() " + "writes its four pins sequentially, producing brief " + "intermediate values during the transition (~1us " + "total on Teensy 4.1). Default 2us covers the " + "transient at sample rates from 500kHz to 10MHz. " + "Set to 0 to disable.") + p.add_argument("--mode", default="auto", + choices=["auto", "single", "record"], + help="Acquisition mode. 'auto' (default) picks single-shot " + "if the request fits in the AD2's on-board buffer, " + "otherwise switches to record (USB streaming) mode " + "for arbitrary-length captures. 'single' is fastest " + "for short windows but capped at the device buffer " + "(~8K samples). 'record' streams over USB and " + "supports 1+ second captures, but watch for " + "lost_samples in the output.") + p.add_argument("--max-lost-frac", type=float, default=0.001, + help="In record mode, fail (exit non-zero) if the " + "fraction of lost samples exceeds this threshold " + "(default 0.001 = 0.1%%). Lost samples mean USB " + "couldn't keep up; the resulting timing is suspect.") + p.add_argument("--trigger", default="none", + choices=["none", "change", "flag"], + help="Trigger mode. 'none' captures immediately. " + "'change' triggers on any transition of the four " + "flag pins. 'flag' triggers when the four pins " + "match --trigger-flag.") + p.add_argument("--trigger-flag", type=int, default=None, + help="With --trigger=flag, the 4-bit flag value (0-15) " + "to trigger on.") + p.add_argument("--trigger-position", type=float, default=0.1, + help="Fraction of the buffer to capture BEFORE the " + "trigger event (0.0..1.0, default 0.1).") + p.add_argument("--measure", nargs=2, metavar=("FROM", "TO"), type=int, + default=None, + help="Report intervals from Flag(FROM) start to the next " + "Flag(TO) start. Adds a 'measurement' key to the JSON.") + p.add_argument("--dio-map", type=parse_dio_map, + default=DEFAULT_TEENSY_TO_DIO, + help="Teensy-pin:AD2-DIO mapping, comma-separated. " + "Default: 28:1,29:2,30:3,31:4") + p.add_argument("--include-raw", action="store_true", + help="Include the raw decoded flag-value array in the " + "JSON output (large; off by default).") + p.add_argument("--quiet", action="store_true", + help="Suppress progress messages on stderr.") + return p + + +def main(argv=None): + args = build_parser().parse_args(argv) + + def log(msg): + if not args.quiet: + print(msg, file=sys.stderr, flush=True) + + try: + # Resolve buffer size. + if args.duration is not None: + buffer_size = max(2, int(round(args.sample_rate * args.duration))) + else: + buffer_size = args.buffer_size + + # Build trigger masks from the DIO map. + flag_dio_mask = 0 + for pin, dio in args.dio_map.items(): + flag_dio_mask |= (1 << dio) + + if args.trigger == "none": + trigger = "none" + pattern_mask = 0 + pattern_value = 0 + change_mask = 0 + elif args.trigger == "change": + trigger = "change" + pattern_mask = 0 + pattern_value = 0 + change_mask = flag_dio_mask + elif args.trigger == "flag": + if args.trigger_flag is None or not 0 <= args.trigger_flag <= 15: + raise ValueError( + "--trigger=flag requires --trigger-flag in 0..15") + trigger = f"flag={args.trigger_flag}" + pattern_mask = flag_dio_mask + pattern_value = 0 + for pin, bit in TEENSY_PIN_TO_BIT.items(): + if (args.trigger_flag >> bit) & 1: + pattern_value |= (1 << args.dio_map[pin]) + change_mask = 0 # level trigger + else: + raise ValueError(f"Unknown trigger mode: {args.trigger}") + + samples, actual_rate, extras = acquire( + sample_rate_hz=args.sample_rate, + buffer_size=buffer_size, + trigger=trigger, + trigger_pattern_mask=pattern_mask, + trigger_pattern_value=pattern_value, + trigger_change_mask=change_mask, + trigger_position_frac=args.trigger_position, + mode=args.mode, + log=log, + ) + sample_period_s = 1.0 / actual_rate + + lost_frac = (extras["lost_samples"] / samples.size + if samples.size else 0.0) + if extras["lost_samples"] or extras["corrupt_samples"]: + log(f"WARNING: lost={extras['lost_samples']} " + f"corrupt={extras['corrupt_samples']} " + f"({lost_frac*100:.3f}% lost). " + f"Timing may be inaccurate.") + + flag_values = decode_flag_values(samples, args.dio_map) + raw_segments = find_segments(flag_values) + debounce_samples = int(round(args.debounce_us * 1e-6 * actual_rate)) + segments = debounce_segments(raw_segments, debounce_samples) + log(f"Decoded {len(raw_segments)} raw segments, " + f"{len(segments)} after debounce ({debounce_samples} samples).") + + transitions = build_transitions(segments, sample_period_s) + summary = summarize(segments, transitions, sample_period_s) + + output = { + "metadata": { + "sample_rate_hz": actual_rate, + "sample_period_s": sample_period_s, + "buffer_size": int(samples.size), + "duration_s": samples.size * sample_period_s, + "trigger": trigger, + "trigger_position_frac": args.trigger_position + if trigger != "none" else None, + "debounce_us": args.debounce_us, + "debounce_samples": debounce_samples, + "acquisition_mode": extras["mode"], + "lost_samples": extras["lost_samples"], + "corrupt_samples": extras["corrupt_samples"], + "lost_fraction": lost_frac, + "device_buffer_size": extras["device_buffer_size"], + "pin_mapping": { + str(pin): {"bit": TEENSY_PIN_TO_BIT[pin], + "dio": args.dio_map[pin]} + for pin in sorted(TEENSY_PIN_TO_BIT) + }, + }, + "transitions": transitions, + "segments": build_segment_dicts(segments, sample_period_s), + "summary": summary, + } + + if args.measure is not None: + from_flag, to_flag = args.measure + output["measurement"] = compute_measurement( + segments, from_flag, to_flag, sample_period_s) + + if args.include_raw: + output["raw_flag_values"] = flag_values.tolist() + + json.dump(output, sys.stdout, separators=(",", ":")) + sys.stdout.write("\n") + + if lost_frac > args.max_lost_frac: + log(f"ERROR: lost sample fraction {lost_frac*100:.3f}% exceeds " + f"--max-lost-frac {args.max_lost_frac*100:.3f}%.") + return 2 + return 0 + + except Exception as exc: + err = {"error": str(exc), "error_type": type(exc).__name__} + json.dump(err, sys.stdout) + sys.stdout.write("\n") + log(f"ERROR: {exc}") + return 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/code/tools/plot_flag_timing.py b/code/tools/plot_flag_timing.py new file mode 100644 index 0000000..6085c0b --- /dev/null +++ b/code/tools/plot_flag_timing.py @@ -0,0 +1,244 @@ +#!/usr/bin/env python3 +"""Plot per-flag duration distributions from flag_timing.py JSON output. + +For each flag value with enough events, produces a 2-panel PNG: + top: histogram of segment durations (with mean / median / p95 / p99 + marked as vertical lines) — makes bimodal distributions obvious. + bottom: scatter of duration vs. iteration index — reveals drift or + clustering of slow events over the capture window. + +Also writes a single timeline strip showing the full capture, colored by +flag, useful for spotting where slow events sit in real time. + +Usage: + plot_flag_timing.py PROFILE.json + plot_flag_timing.py PROFILE.json --out-dir docs/ --prefix baseline \\ + --flag-labels 1=DrawDisplay-other,2=SignalProcessing,3=DrawSpectrumPane + +Outputs are written next to the JSON by default. PNG paths are printed to +stdout unless --quiet. +""" + +import argparse +import json +import os +import sys + +import warnings + +import numpy as np +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +# tight_layout occasionally complains about in-axes legends and grid spec +# height ratios used here; the layout still renders correctly. +warnings.filterwarnings( + "ignore", message=".*not compatible with tight_layout.*") + + +# Distinct colors for flag values 0..15. Picked to remain readable when +# adjacent in the timeline strip. +FLAG_COLORS = { + 0: "#cccccc", 1: "#1f77b4", 2: "#ff7f0e", 3: "#2ca02c", + 4: "#d62728", 5: "#9467bd", 6: "#8c564b", 7: "#e377c2", + 8: "#7f7f7f", 9: "#bcbd22", 10: "#17becf", + 11: "#aec7e8", 12: "#ffbb78", 13: "#98df8a", + 14: "#ff9896", 15: "#c5b0d5", +} + + +def parse_labels(arg): + out = {} + if not arg: + return out + for item in arg.split(","): + item = item.strip() + if "=" not in item: + continue + k, v = item.split("=", 1) + out[int(k.strip())] = v.strip() + return out + + +def label_for(flag, labels): + name = labels.get(flag) + return f"Flag {flag} ({name})" if name else f"Flag {flag}" + + +def plot_flag(flag, flag_segments, stats, label, out_path): + """Two-panel figure: duration histogram + per-iteration scatter.""" + durations_us = np.array( + [s["duration_s"] * 1e6 for s in flag_segments], dtype=np.float64) + times_ms = np.array( + [s["start_time_s"] * 1e3 for s in flag_segments], dtype=np.float64) + + fig, (ax_hist, ax_scat) = plt.subplots( + 2, 1, figsize=(9, 6.5), + gridspec_kw={"height_ratios": [1.3, 1.0], "hspace": 0.35}, + ) + + color = FLAG_COLORS.get(flag, "#444444") + + # ---- Histogram ------------------------------------------------------ + # Auto bin count: sqrt rule, capped, with a floor. + nbins = int(np.clip(np.sqrt(durations_us.size) * 2.5, 12, 80)) + ax_hist.hist(durations_us, bins=nbins, color=color, alpha=0.75, + edgecolor="black", linewidth=0.4) + + markers = [ + ("median_s", "median", "#222222", "--"), + ("mean_s", "mean", "#222222", "-"), + ("p95_s", "p95", "#b00000", ":"), + ("p99_s", "p99", "#b00000", "-."), + ] + for key, mlabel, mcolor, style in markers: + v = stats[key] * 1e6 + ax_hist.axvline(v, color=mcolor, linestyle=style, linewidth=1.2, + label=f"{mlabel} {_fmt_us(v)}") + + ax_hist.set_xlabel("Segment duration (µs)") + ax_hist.set_ylabel("Count") + ax_hist.set_title( + f"{label} — distribution (n={stats['count']}, " + f"range {_fmt_us(stats['min_s']*1e6)}–{_fmt_us(stats['max_s']*1e6)})" + ) + ax_hist.grid(True, alpha=0.3) + ax_hist.legend(loc="upper right", fontsize=8, framealpha=0.85) + + # ---- Per-iteration scatter ------------------------------------------ + ax_scat.scatter(times_ms, durations_us, s=18, color=color, + alpha=0.7, edgecolor="black", linewidth=0.3) + ax_scat.axhline(stats["median_s"] * 1e6, color="#222222", + linestyle="--", linewidth=1, label="median") + ax_scat.axhline(stats["p95_s"] * 1e6, color="#b00000", + linestyle=":", linewidth=1, label="p95") + ax_scat.set_xlabel("Time in capture (ms)") + ax_scat.set_ylabel("Duration (µs)") + ax_scat.set_title(f"{label} — duration over time") + ax_scat.grid(True, alpha=0.3) + ax_scat.legend(loc="upper right", fontsize=8, framealpha=0.85) + + plt.tight_layout() + fig.savefig(out_path, dpi=120) + plt.close(fig) + + +def plot_timeline(segments, duration_s, labels, out_path): + """Stacked timeline: one horizontal row per flag value, each row showing + that flag's segments as filled bars over the capture window. Readable + even when some flags have short segments that would be invisible in a + single-row strip. + """ + flags_present = sorted({s["flag"] for s in segments}) + n_rows = len(flags_present) + row_for_flag = {f: i for i, f in enumerate(flags_present)} + + fig_height = max(2.0, 0.6 * n_rows + 1.2) + fig, ax = plt.subplots(figsize=(12, fig_height)) + + for s in segments: + row = row_for_flag[s["flag"]] + ax.barh( + row, + s["duration_s"] * 1000, + left=s["start_time_s"] * 1000, + height=0.75, + color=FLAG_COLORS.get(s["flag"], "#444444"), + edgecolor="none", + ) + + ax.set_xlim(0, duration_s * 1000) + ax.set_ylim(-0.6, n_rows - 0.4) + ax.set_yticks(range(n_rows)) + ax.set_yticklabels([label_for(f, labels) for f in flags_present], + fontsize=9) + ax.invert_yaxis() # flag 0 at top, increasing flag value downward + ax.set_xlabel("Time in capture (ms)") + ax.set_title(f"Flag timeline — {duration_s*1000:.0f} ms capture " + f"(one row per flag)") + ax.grid(True, axis="x", alpha=0.3) + plt.tight_layout() + fig.savefig(out_path, dpi=120) + plt.close(fig) + + +def _fmt_us(v): + """Format microseconds with a reasonable precision.""" + if v >= 1000: + return f"{v/1000:.2f} ms" + if v >= 100: + return f"{v:.0f} µs" + if v >= 10: + return f"{v:.1f} µs" + return f"{v:.2f} µs" + + +def main(argv=None): + p = argparse.ArgumentParser( + description=__doc__.splitlines()[0], + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + p.add_argument("input", help="Path to JSON file produced by flag_timing.py") + p.add_argument("--out-dir", default=None, + help="Directory for output PNGs (default: same as input).") + p.add_argument("--prefix", default=None, + help="Filename prefix for output PNGs (default: input " + "basename without extension).") + p.add_argument("--flag-labels", default="", + help="Comma-separated 'flag=name' pairs for prettier " + "titles and legends, e.g. " + "'1=DrawDisplay-other,3=DrawSpectrumPane'.") + p.add_argument("--min-count", type=int, default=2, + help="Skip per-flag plots when the flag has fewer than " + "this many segments (default 2).") + p.add_argument("--no-timeline", action="store_true", + help="Skip the timeline strip plot.") + p.add_argument("--quiet", action="store_true", + help="Suppress 'wrote ...' messages on stdout.") + args = p.parse_args(argv) + + with open(args.input) as f: + data = json.load(f) + if "error" in data: + print(f"Input JSON contains an error: {data['error']}", + file=sys.stderr) + return 1 + + labels = parse_labels(args.flag_labels) + out_dir = (args.out_dir + or os.path.dirname(os.path.abspath(args.input)) + or ".") + prefix = (args.prefix + or os.path.splitext(os.path.basename(args.input))[0]) + os.makedirs(out_dir, exist_ok=True) + + segments = data.get("segments", []) + stats_by_flag = data.get("summary", {}).get("flag_segment_stats", {}) + duration_s = data.get("metadata", {}).get("duration_s", 0.0) + + written = [] + for flag_str, stats in stats_by_flag.items(): + if stats.get("count", 0) < args.min_count: + continue + flag = int(flag_str) + flag_segs = [s for s in segments if s["flag"] == flag] + if len(flag_segs) < args.min_count: + continue + out_path = os.path.join(out_dir, f"{prefix}_flag{flag}.png") + plot_flag(flag, flag_segs, stats, label_for(flag, labels), out_path) + written.append(out_path) + + if not args.no_timeline and segments: + out_path = os.path.join(out_dir, f"{prefix}_timeline.png") + plot_timeline(segments, duration_s, labels, out_path) + written.append(out_path) + + if not args.quiet: + for w in written: + print(w) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/code/tools/receive_chain_test.py b/code/tools/receive_chain_test.py new file mode 100755 index 0000000..e085237 --- /dev/null +++ b/code/tools/receive_chain_test.py @@ -0,0 +1,553 @@ +#!/usr/bin/env python3 +""" +Receive-chain integrity test using an Analog Discovery 2. + +Samples the SDR's demodulated audio output on AD2 oscilloscope channel 1 +and checks that the recovered tone is at the expected frequency (1 kHz), +expected amplitude (~234 mV RMS), and free of interruptions or +discontinuities. The RF input to the SDR is supplied by an external signal +generator (not the AD2). Writes a PNG plot for human verification and +prints a pass/fail summary plus a machine-parseable JSON line. + +Wiring +------ + AD2 Scope Ch1 <- SDR audio output + External signal generator -> SDR antenna / ADC input + +Exit codes +---------- + 0 PASS - all checks passed + 1 FAIL - one or more checks failed + 2 ERROR - AD2 not reachable / DWF call failed +""" + +import argparse +import ctypes +import json +import os +import sys +import time +from dataclasses import dataclass, asdict +from typing import Optional + +import numpy as np +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +# --- DWF library binding --------------------------------------------------- + +def _load_dwf(): + if sys.platform.startswith("win"): + return ctypes.cdll.dwf + if sys.platform.startswith("darwin"): + return ctypes.cdll.LoadLibrary("/Library/Frameworks/dwf.framework/dwf") + return ctypes.cdll.LoadLibrary("libdwf.so") + + +# DWF constants (mirrors dwfconstants.py - kept inline so this script has no +# extra import dependency beyond libdwf.so + numpy + matplotlib). +HDWF_NONE = 0 +ACQMODE_RECORD = 3 +TRIG_SRC_NONE = 0 +DWF_STATE_CONFIG = 4 +DWF_STATE_PREFILL = 5 +DWF_STATE_ARMED = 1 +DWF_STATE_DONE = 2 + + +def _dwf_last_error(dwf) -> str: + buf = ctypes.create_string_buffer(512) + dwf.FDwfGetLastErrorMsg(buf) + return buf.value.decode("utf-8", errors="replace") + + +def _bind_argtypes(dwf): + c_int = ctypes.c_int + c_double = ctypes.c_double + c_byte = ctypes.c_byte + + dwf.FDwfDeviceOpen.argtypes = [c_int, ctypes.POINTER(c_int)] + dwf.FDwfDeviceCloseAll.argtypes = [] + dwf.FDwfDeviceAutoConfigureSet.argtypes = [c_int, c_int] + dwf.FDwfGetLastErrorMsg.argtypes = [ctypes.c_char_p] + + dwf.FDwfAnalogInReset.argtypes = [c_int] + dwf.FDwfAnalogInChannelEnableSet.argtypes = [c_int, c_int, c_int] + dwf.FDwfAnalogInChannelRangeSet.argtypes = [c_int, c_int, c_double] + dwf.FDwfAnalogInChannelOffsetSet.argtypes = [c_int, c_int, c_double] + dwf.FDwfAnalogInAcquisitionModeSet.argtypes = [c_int, c_int] + dwf.FDwfAnalogInFrequencySet.argtypes = [c_int, c_double] + dwf.FDwfAnalogInRecordLengthSet.argtypes = [c_int, c_double] + dwf.FDwfAnalogInConfigure.argtypes = [c_int, c_int, c_int] + dwf.FDwfAnalogInStatus.argtypes = [c_int, c_int, ctypes.POINTER(c_byte)] + dwf.FDwfAnalogInStatusRecord.argtypes = [ + c_int, + ctypes.POINTER(c_int), + ctypes.POINTER(c_int), + ctypes.POINTER(c_int), + ] + dwf.FDwfAnalogInStatusData.argtypes = [c_int, c_int, ctypes.c_void_p, c_int] + + +# --- Capture --------------------------------------------------------------- + +def record_channel1( + dwf, + hdwf, + sample_rate_hz: float, + record_len_s: float, + range_v: float, + log, +): + """Capture scope channel 1 in record (streaming) mode and return samples. + + Returns + ------- + (samples: np.ndarray, lost: int, corrupted: int) + """ + n_samples = int(round(sample_rate_hz * record_len_s)) + buf = (ctypes.c_double * n_samples)() + sts = ctypes.c_byte() + avail = ctypes.c_int() + lost = ctypes.c_int() + corrupted = ctypes.c_int() + total_lost = 0 + total_corrupted = 0 + + dwf.FDwfAnalogInReset(hdwf) + dwf.FDwfAnalogInChannelEnableSet(hdwf, ctypes.c_int(0), ctypes.c_int(1)) + dwf.FDwfAnalogInChannelRangeSet(hdwf, ctypes.c_int(0), ctypes.c_double(range_v)) + dwf.FDwfAnalogInChannelOffsetSet(hdwf, ctypes.c_int(0), ctypes.c_double(0.0)) + dwf.FDwfAnalogInAcquisitionModeSet(hdwf, ctypes.c_int(ACQMODE_RECORD)) + dwf.FDwfAnalogInFrequencySet(hdwf, ctypes.c_double(sample_rate_hz)) + dwf.FDwfAnalogInRecordLengthSet(hdwf, ctypes.c_double(record_len_s)) + + # Arm but don't start. + dwf.FDwfAnalogInConfigure(hdwf, ctypes.c_int(1), ctypes.c_int(0)) + + # Wait for analog frontend offset to settle. + log("Waiting 2.0 s for analog frontend to settle...") + time.sleep(2.0) + + log(f"Starting acquisition ({n_samples} samples @ {sample_rate_hz:.0f} Hz, {record_len_s*1000:.1f} ms)...") + dwf.FDwfAnalogInConfigure(hdwf, ctypes.c_int(0), ctypes.c_int(1)) + + c_samples = 0 + deadline = time.monotonic() + record_len_s * 5 + 5.0 # generous timeout + + while c_samples < n_samples: + if time.monotonic() > deadline: + raise RuntimeError("Timed out waiting for acquisition") + + if dwf.FDwfAnalogInStatus(hdwf, ctypes.c_int(1), ctypes.byref(sts)) != 1: + raise RuntimeError(f"FDwfAnalogInStatus failed: {_dwf_last_error(dwf)}") + + if c_samples == 0 and sts.value in (DWF_STATE_CONFIG, DWF_STATE_PREFILL, DWF_STATE_ARMED): + continue + + dwf.FDwfAnalogInStatusRecord(hdwf, ctypes.byref(avail), ctypes.byref(lost), ctypes.byref(corrupted)) + c_samples += lost.value + total_lost += lost.value + total_corrupted += corrupted.value + + if avail.value == 0: + continue + + take = avail.value + if c_samples + take > n_samples: + take = n_samples - c_samples + + dwf.FDwfAnalogInStatusData( + hdwf, + ctypes.c_int(0), + ctypes.byref(buf, ctypes.sizeof(ctypes.c_double) * c_samples), + ctypes.c_int(take), + ) + c_samples += take + + samples = np.frombuffer(buf, dtype=np.float64).copy() + return samples, total_lost, total_corrupted + + +# --- Analysis -------------------------------------------------------------- + +@dataclass +class Analysis: + sample_rate_hz: float + n_samples: int + duration_s: float + rms_v: float + peak_v: float + dc_offset_v: float + dominant_freq_hz: float + snr_db: float + tone_fraction: float # fraction of total AC power at the dominant bin (±2 bins) + envelope_mean_v: float + envelope_min_v: float + envelope_max_v: float + envelope_cv: float # coefficient of variation: stddev/mean + max_window_dropout: float # smallest windowed RMS / median windowed RMS + max_sample_jump_v: float # largest |x[n]-x[n-1]| in volts + expected_jump_v: float # 2*pi*f*A/Fs - theoretical max for a clean sine + + +def analyze(samples: np.ndarray, sample_rate_hz: float, expected_freq_hz: float, expected_rms_v: float) -> Analysis: + n = samples.size + duration_s = n / sample_rate_hz + dc = float(np.mean(samples)) + ac = samples - dc + rms = float(np.sqrt(np.mean(ac * ac))) + peak = float(np.max(np.abs(ac))) + + # FFT-based dominant-frequency detection. + # Use a Hann window for low spectral leakage; correct amplitude scaling for the window. + window = np.hanning(n) + win_gain = window.mean() # coherent gain + spectrum = np.fft.rfft(ac * window) / (n * win_gain) * 2.0 + freqs = np.fft.rfftfreq(n, d=1.0 / sample_rate_hz) + mag = np.abs(spectrum) + + # Ignore the DC bin and anything below 50 Hz (mains/leakage). + mask = freqs >= 50.0 + if not np.any(mask): + dominant_freq = 0.0 + tone_power = 0.0 + else: + idx_in_mask = int(np.argmax(mag[mask])) + dominant_idx = int(np.flatnonzero(mask)[0]) + idx_in_mask + # Parabolic interpolation around the peak for sub-bin frequency precision. + if 1 <= dominant_idx < mag.size - 1: + a, b, c = mag[dominant_idx - 1], mag[dominant_idx], mag[dominant_idx + 1] + denom = (a - 2 * b + c) + delta = 0.5 * (a - c) / denom if denom != 0 else 0.0 + else: + delta = 0.0 + bin_hz = sample_rate_hz / n + dominant_freq = (dominant_idx + delta) * bin_hz + + # Power at the tone (±2 bins) vs total AC power. + lo = max(dominant_idx - 2, 0) + hi = min(dominant_idx + 3, mag.size) + tone_power = float(np.sum(mag[lo:hi] ** 2)) + + total_power = float(np.sum(mag ** 2)) + tone_fraction = tone_power / total_power if total_power > 0 else 0.0 + # SNR: tone power vs everything else in the AC band. + other_power = max(total_power - tone_power, 1e-30) + snr_db = 10.0 * np.log10(tone_power / other_power) if tone_power > 0 else -120.0 + + # Envelope via analytic-signal magnitude (no scipy dependency: build the + # analytic signal via FFT directly). + X = np.fft.fft(ac) + H = np.zeros(n) + if n % 2 == 0: + H[0] = 1.0 + H[n // 2] = 1.0 + H[1:n // 2] = 2.0 + else: + H[0] = 1.0 + H[1:(n + 1) // 2] = 2.0 + analytic = np.fft.ifft(X * H) + envelope = np.abs(analytic) + + # Trim the first and last ~one cycle to skip Hilbert edge effects. + trim = max(1, int(round(sample_rate_hz / max(expected_freq_hz, 1.0)))) + env_core = envelope[trim:-trim] if envelope.size > 2 * trim else envelope + env_mean = float(np.mean(env_core)) + env_std = float(np.std(env_core)) + env_min = float(np.min(env_core)) + env_max = float(np.max(env_core)) + env_cv = env_std / env_mean if env_mean > 0 else float("inf") + + # Windowed RMS to spot dropouts: split into ~10 ms windows and look for + # the minimum vs the median - a clean tone should be flat. + win_len = max(1, int(round(0.010 * sample_rate_hz))) + n_windows = ac.size // win_len + if n_windows >= 3: + windows = ac[: n_windows * win_len].reshape(n_windows, win_len) + win_rms = np.sqrt(np.mean(windows * windows, axis=1)) + median_rms = float(np.median(win_rms)) + min_rms = float(np.min(win_rms)) + max_window_dropout = (min_rms / median_rms) if median_rms > 0 else 0.0 + else: + max_window_dropout = 1.0 + + # Sample-to-sample slew: for an ideal sine A*sin(2*pi*f*t), the maximum + # per-sample step is 2*pi*f*A/Fs. A glitch (zero pop, missing chunk) + # produces a jump much larger than that. + diffs = np.abs(np.diff(ac)) + max_sample_jump = float(np.max(diffs)) if diffs.size > 0 else 0.0 + # Use measured peak (not expected) so the bound holds even when the tone + # is the wrong amplitude. + expected_jump = 2.0 * np.pi * max(expected_freq_hz, 1.0) * peak / sample_rate_hz + + return Analysis( + sample_rate_hz=sample_rate_hz, + n_samples=n, + duration_s=duration_s, + rms_v=rms, + peak_v=peak, + dc_offset_v=dc, + dominant_freq_hz=dominant_freq, + snr_db=snr_db, + tone_fraction=tone_fraction, + envelope_mean_v=env_mean, + envelope_min_v=env_min, + envelope_max_v=env_max, + envelope_cv=env_cv, + max_window_dropout=max_window_dropout, + max_sample_jump_v=max_sample_jump, + expected_jump_v=expected_jump, + ) + + +# --- Pass/fail ------------------------------------------------------------- + +@dataclass +class PassFail: + passed: bool + checks: dict + + +def evaluate(a: Analysis, expected_freq_hz: float, freq_tol_hz: float, + expected_rms_v: float, rms_tol_frac: float, + min_snr_db: float, max_env_cv: float, + min_window_ratio: float, jump_margin: float) -> PassFail: + checks = {} + + freq_err = abs(a.dominant_freq_hz - expected_freq_hz) + checks["frequency"] = { + "value_hz": a.dominant_freq_hz, + "expected_hz": expected_freq_hz, + "tolerance_hz": freq_tol_hz, + "error_hz": freq_err, + "pass": freq_err <= freq_tol_hz, + } + + rms_err_frac = abs(a.rms_v - expected_rms_v) / expected_rms_v if expected_rms_v else float("inf") + checks["amplitude_rms"] = { + "value_v": a.rms_v, + "expected_v": expected_rms_v, + "tolerance_frac": rms_tol_frac, + "error_frac": rms_err_frac, + "pass": rms_err_frac <= rms_tol_frac, + } + + checks["snr"] = { + "value_db": a.snr_db, + "min_db": min_snr_db, + "pass": a.snr_db >= min_snr_db, + } + + checks["envelope_stability"] = { + "cv": a.envelope_cv, + "max_cv": max_env_cv, + "min_v": a.envelope_min_v, + "max_v": a.envelope_max_v, + "pass": a.envelope_cv <= max_env_cv, + } + + checks["window_dropout"] = { + "min_over_median": a.max_window_dropout, + "min_required": min_window_ratio, + "pass": a.max_window_dropout >= min_window_ratio, + } + + jump_threshold = a.expected_jump_v * jump_margin + checks["sample_jump"] = { + "max_jump_v": a.max_sample_jump_v, + "expected_max_v": a.expected_jump_v, + "threshold_v": jump_threshold, + "pass": a.max_sample_jump_v <= jump_threshold, + } + + passed = all(c["pass"] for c in checks.values()) + return PassFail(passed=passed, checks=checks) + + +# --- Plotting -------------------------------------------------------------- + +def write_plot(samples: np.ndarray, sample_rate_hz: float, expected_freq_hz: float, + analysis: Analysis, verdict: PassFail, png_path: str): + n = samples.size + t_ms = np.arange(n) / sample_rate_hz * 1000.0 + + fig, (ax_time, ax_freq) = plt.subplots(2, 1, figsize=(11, 7)) + + ax_time.plot(t_ms, samples, linewidth=0.6, color="C0", label="Audio output") + ax_time.set_xlabel("Time (ms)") + ax_time.set_ylabel("Voltage (V)") + ax_time.set_title( + f"SDR audio output | RMS={analysis.rms_v*1000:.1f} mV, " + f"dominant={analysis.dominant_freq_hz:.1f} Hz, SNR={analysis.snr_db:.1f} dB " + f"[{ 'PASS' if verdict.passed else 'FAIL' }]" + ) + ax_time.grid(True, alpha=0.3) + # Highlight a couple of cycles for sanity-checking the waveform shape. + if expected_freq_hz > 0: + cycle_ms = 1000.0 / expected_freq_hz + ax_time.set_xlim(0, min(5 * cycle_ms, t_ms[-1])) + ax_time.legend(loc="upper right", fontsize=8) + + # FFT plot (magnitude in dBV). + ac = samples - np.mean(samples) + window = np.hanning(n) + win_gain = window.mean() + spec = np.fft.rfft(ac * window) / (n * win_gain) * 2.0 + freqs = np.fft.rfftfreq(n, d=1.0 / sample_rate_hz) + mag_db = 20 * np.log10(np.maximum(np.abs(spec), 1e-9)) + ax_freq.plot(freqs, mag_db, linewidth=0.6, color="C1") + ax_freq.axvline(expected_freq_hz, color="green", linestyle="--", linewidth=0.8, + label=f"expected {expected_freq_hz:.0f} Hz") + ax_freq.axvline(analysis.dominant_freq_hz, color="red", linestyle=":", linewidth=0.8, + label=f"measured {analysis.dominant_freq_hz:.1f} Hz") + ax_freq.set_xlabel("Frequency (Hz)") + ax_freq.set_ylabel("Magnitude (dBV)") + ax_freq.set_xlim(0, min(10 * expected_freq_hz, sample_rate_hz / 2)) + ax_freq.set_ylim(top=10, bottom=-100) + ax_freq.grid(True, alpha=0.3) + ax_freq.legend(loc="upper right", fontsize=8) + + fig.tight_layout() + fig.savefig(png_path, dpi=110) + plt.close(fig) + + +# --- Main ------------------------------------------------------------------ + +def main(): + p = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + p.add_argument("--sample-rate", type=float, default=200_000.0, + help="Scope sample rate (Hz). Default: 200000") + p.add_argument("--duration", type=float, default=0.200, + help="Capture duration in seconds. Must be >= 0.1. Default: 0.200") + p.add_argument("--scope-range", type=float, default=2.0, + help="Scope input range in volts (default: 2.0)") + + p.add_argument("--expected-tone", type=float, default=1000.0, + help="Expected demodulated tone frequency (Hz). Default: 1000") + p.add_argument("--expected-rms", type=float, default=0.234, + help="Expected RMS amplitude (V). Default: 0.234") + p.add_argument("--freq-tol", type=float, default=20.0, + help="Frequency tolerance (Hz). Default: 20") + p.add_argument("--rms-tol", type=float, default=0.25, + help="Fractional RMS tolerance. Default: 0.25 (+/-25 percent)") + p.add_argument("--min-snr", type=float, default=30.0, + help="Minimum tone SNR (dB). Default: 30") + p.add_argument("--max-env-cv", type=float, default=0.10, + help="Maximum envelope coefficient of variation. Default: 0.10") + p.add_argument("--min-window-ratio", type=float, default=0.70, + help="Min windowed RMS / median windowed RMS. Default: 0.70") + p.add_argument("--jump-margin", type=float, default=3.0, + help="Max sample-to-sample jump vs theoretical. Default: 3.0") + + p.add_argument("--plot", default=None, + help="Path to output PNG (default: receive_chain_.png next to script)") + p.add_argument("--json", action="store_true", help="Also emit a JSON document on stdout") + p.add_argument("--quiet", action="store_true", help="Suppress progress output") + args = p.parse_args() + + if args.duration < 0.100: + print(f"--duration must be >= 0.1 s (got {args.duration})", file=sys.stderr) + return 2 + + def log(msg): + if not args.quiet: + print(msg, file=sys.stderr, flush=True) + + if args.plot is None: + here = os.path.dirname(os.path.abspath(__file__)) + ts = time.strftime("%Y%m%d_%H%M%S") + args.plot = os.path.join(here, f"receive_chain_{ts}.png") + + try: + dwf = _load_dwf() + except OSError as e: + print(f"libdwf.so not loadable: {e}. Install the Digilent WaveForms SDK.", file=sys.stderr) + return 2 + + _bind_argtypes(dwf) + + hdwf = ctypes.c_int() + log("Opening AD2...") + if dwf.FDwfDeviceOpen(ctypes.c_int(-1), ctypes.byref(hdwf)) != 1 or hdwf.value == HDWF_NONE: + print(f"Failed to open AD2: {_dwf_last_error(dwf)}", file=sys.stderr) + return 2 + + try: + # Manual configure so AnalogIn applies only when we ask. + dwf.FDwfDeviceAutoConfigureSet(hdwf, ctypes.c_int(0)) + + samples, lost, corrupted = record_channel1( + dwf, hdwf, + sample_rate_hz=args.sample_rate, + record_len_s=args.duration, + range_v=args.scope_range, + log=log, + ) + if lost: + log(f"WARNING: {lost} samples lost during capture") + if corrupted: + log(f"WARNING: {corrupted} samples flagged corrupted during capture") + + analysis = analyze(samples, args.sample_rate, args.expected_tone, args.expected_rms) + verdict = evaluate( + analysis, + expected_freq_hz=args.expected_tone, + freq_tol_hz=args.freq_tol, + expected_rms_v=args.expected_rms, + rms_tol_frac=args.rms_tol, + min_snr_db=args.min_snr, + max_env_cv=args.max_env_cv, + min_window_ratio=args.min_window_ratio, + jump_margin=args.jump_margin, + ) + + write_plot(samples, args.sample_rate, args.expected_tone, analysis, verdict, args.plot) + + # Human-readable summary on stdout. + status = "PASS" if verdict.passed else "FAIL" + print(f"[{status}] Receive chain test") + print(f" Samples: {analysis.n_samples} ({analysis.duration_s*1000:.1f} ms @ {analysis.sample_rate_hz:.0f} Hz)") + print(f" Tone freq: {analysis.dominant_freq_hz:.2f} Hz (expected {args.expected_tone:.0f} ± {args.freq_tol:.0f} Hz)") + print(f" RMS amplitude: {analysis.rms_v*1000:.1f} mV (expected {args.expected_rms*1000:.0f} mV ± {args.rms_tol*100:.0f}%)") + print(f" SNR: {analysis.snr_db:.1f} dB (min {args.min_snr:.1f} dB)") + print(f" Envelope CV: {analysis.envelope_cv:.4f} (max {args.max_env_cv:.3f})") + print(f" Window dropout: {analysis.max_window_dropout:.3f} (min {args.min_window_ratio:.3f})") + print(f" Max sample jump:{analysis.max_sample_jump_v*1000:.2f} mV (theoretical {analysis.expected_jump_v*1000:.2f} mV)") + if lost or corrupted: + print(f" Capture issues: lost={lost} corrupted={corrupted}") + print(f" Plot: {args.plot}") + for name, chk in verdict.checks.items(): + mark = "OK " if chk["pass"] else "BAD" + print(f" [{mark}] {name}") + + if args.json: + doc = { + "passed": verdict.passed, + "analysis": asdict(analysis), + "checks": verdict.checks, + "capture": { + "lost_samples": lost, + "corrupted_samples": corrupted, + "sample_rate_hz": args.sample_rate, + "duration_s": args.duration, + }, + "plot": args.plot, + } + print(json.dumps(doc)) + + return 0 if verdict.passed else 1 + + finally: + try: + dwf.FDwfAnalogInReset(hdwf) + except Exception: + pass + dwf.FDwfDeviceCloseAll() + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/code/tools/serial_diag.py b/code/tools/serial_diag.py new file mode 100755 index 0000000..021d789 --- /dev/null +++ b/code/tools/serial_diag.py @@ -0,0 +1,915 @@ +#!/usr/bin/env python3 +""" +Phoenix SDR Serial Diagnostics Tool + +Monitors diagnostic output while allowing CAT control of the radio. +Supports USB audio for transmitting test tones and receiving audio. + +Supports two modes: + 1. Single-port mode (serial+midi+audio USB): One port for both diagnostics and CAT + python serial_diag.py --port /dev/ttyACM0 + + 2. Dual-port mode (Dual Serial USB): Separate ports for diagnostics and CAT + python serial_diag.py --diag /dev/ttyACM0 --cat /dev/ttyACM1 + +Commands (type at the prompt): + tx - Key transmitter and start 1kHz tone via USB audio + rx - Unkey transmitter and stop tone + tone - Set tone frequency (default 1000 Hz) + monitor - Start/stop RX audio monitoring (shows RMS level) + devices - List available audio devices + audio - Select audio device by index + usb - Switch to USB audio mode (PC audio input) + ssb - Switch to SSB/microphone mode + lsb - Switch to LSB sideband + usbsb - Switch to USB sideband + cw - Switch to CW mode + freq 14074 - Set frequency in kHz + id - Query radio ID + if - Query radio status + stats - Show USB_RX statistics + cat - Send raw CAT command (e.g., 'cat FA;') + help - Show this help + quit - Exit program + +Requirements for audio: + sudo apt install python3-numpy python3-sounddevice + # or: pip install numpy sounddevice +""" + +import argparse +import serial +import threading +import sys +import time +import re +from datetime import datetime + +# Optional audio support +try: + import numpy as np + import sounddevice as sd + AUDIO_AVAILABLE = True +except ImportError: + AUDIO_AVAILABLE = False + np = None + sd = None + + +class PhoenixDiagnostics: + def __init__(self, diag_port=None, cat_port=None, shared_port=None, + diag_baud=115200, cat_baud=38400, shared_baud=115200): + self.diag_port = diag_port + self.cat_port = cat_port + self.shared_port = shared_port + self.diag_baud = diag_baud + self.cat_baud = cat_baud + self.shared_baud = shared_baud + self.diag_serial = None + self.cat_serial = None + self.shared_serial = None + self.running = False + self.diag_thread = None + self.tx_active = False + + # For single-port mode: coordinate CAT commands with reader thread + self.serial_lock = threading.Lock() + self.cat_response_queue = [] + self.waiting_for_cat_response = False + + # Statistics + self.last_usb_rx_stats = {} + self.stats_count = 0 + self.last_usb_tx_stats = {} + self.tx_stats_count = 0 + + # Audio settings + self.audio_device = None # None = default, or device index + self.tone_freq = 1000 # Hz + self.sample_rate = 48000 # Must match Teensy USB audio + self.audio_stream = None + self.audio_phase = 0.0 + self.tone_active = False + self.monitor_active = False + self.monitor_thread = None + self.rx_rms_history = [] + + def connect(self): + """Connect to serial port(s).""" + try: + # Single-port mode + if self.shared_port: + print(f"Connecting to {self.shared_port} at {self.shared_baud} baud (single-port mode)...") + self.shared_serial = serial.Serial( + self.shared_port, + self.shared_baud, + timeout=0.1 + ) + print(f" Connected (diagnostics and CAT on same port)") + return True + + # Dual-port mode + if self.diag_port: + print(f"Connecting to diagnostic port {self.diag_port} at {self.diag_baud} baud...") + self.diag_serial = serial.Serial( + self.diag_port, + self.diag_baud, + timeout=0.1 + ) + print(f" Connected to diagnostic port") + + if self.cat_port: + print(f"Connecting to CAT port {self.cat_port} at {self.cat_baud} baud...") + self.cat_serial = serial.Serial( + self.cat_port, + self.cat_baud, + timeout=0.5 + ) + print(f" Connected to CAT port") + + return True + + except serial.SerialException as e: + print(f"Error connecting to serial port: {e}") + return False + + def disconnect(self): + """Disconnect from serial port(s).""" + self.running = False + if self.diag_thread: + self.diag_thread.join(timeout=1.0) + if self.shared_serial: + self.shared_serial.close() + if self.diag_serial: + self.diag_serial.close() + if self.cat_serial: + self.cat_serial.close() + + def start_diag_monitor(self): + """Start the diagnostic monitoring thread.""" + self.running = True + self.diag_thread = threading.Thread(target=self._diag_reader, daemon=True) + self.diag_thread.start() + + def _diag_reader(self): + """Background thread to read diagnostic output.""" + buffer = "" + ser = self.shared_serial if self.shared_serial else self.diag_serial + + while self.running: + try: + if ser and ser.in_waiting: + with self.serial_lock: + data = ser.read(ser.in_waiting) + buffer += data.decode('utf-8', errors='replace') + + # Process complete lines + while '\n' in buffer: + line, buffer = buffer.split('\n', 1) + line = line.strip() + if line: + self._process_diag_line(line) + + # In single-port mode, check for CAT responses (end with ;) + # CAT responses don't have newlines, so check buffer for semicolons + # Drain them whether or not a command is outstanding: anything + # arriving unsolicited (AI mode, a late reply) would otherwise sit + # in the buffer and be handed back as the response to the *next* + # command sent. + if self.shared_serial: + while ';' in buffer: + # Extract CAT response up to and including semicolon + idx = buffer.index(';') + response = buffer[:idx + 1] + buffer = buffer[idx + 1:] + # Check if this looks like a CAT response (not diagnostic) + if not response.startswith(('USB_', '[', 'DEBUG', 'INFO', 'WARN', 'ERR')): + if self.waiting_for_cat_response: + self.cat_response_queue.append(response) + else: + time.sleep(0.01) + except Exception as e: + if self.running: + print(f"\nDiagnostic read error: {e}") + time.sleep(0.1) + + def _process_diag_line(self, line): + """Process and display a diagnostic line.""" + if not line: + return + + timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3] + + # Parse USB_RX diagnostic lines (ASRC consumer side) + if line.startswith("USB_RX:"): + self._parse_usb_rx_stats(line) + # Color code based on content + if "underruns=" in line: + match = re.search(r'underruns=(\d+)', line) + if match and int(match.group(1)) > 0: + # Highlight underruns in red + print(f"\033[91m[{timestamp}] {line}\033[0m") + return + if "WARMUP" in line: + # Highlight warmup in yellow + print(f"\033[93m[{timestamp}] {line}\033[0m") + return + # Normal RX line in cyan + print(f"\033[96m[{timestamp}] {line}\033[0m") + return + + # Parse USB_TX diagnostic lines (USB receive callback side) + if line.startswith("USB_TX:"): + self._parse_usb_tx_stats(line) + # Color code based on content + # Highlight high zero percentage in red (problem indicator) + match = re.search(r'zeros=\d+\(([\d.]+)%\)', line) + if match: + zero_pct = float(match.group(1)) + if zero_pct > 10.0: # More than 10% zeros is concerning + print(f"\033[91m[{timestamp}] {line}\033[0m") + return + # Highlight overruns in red + match = re.search(r'overruns=(\d+)', line) + if match and int(match.group(1)) > 0: + print(f"\033[91m[{timestamp}] {line}\033[0m") + return + # Normal TX line in green + print(f"\033[92m[{timestamp}] {line}\033[0m") + return + + # Default: print with timestamp + print(f"[{timestamp}] {line}") + + def _parse_usb_rx_stats(self, line): + """Parse USB_RX statistics from diagnostic line.""" + # Format: USB_RX: RUNNING reads=X underruns=Y zeros=Z | buf=min/avg/max | ratio=min/avg/max | rms=X + try: + stats = {} + + # Extract state + if "RUNNING" in line: + stats['state'] = 'RUNNING' + elif "WARMUP" in line: + stats['state'] = 'WARMUP' + + # Extract numeric values + patterns = [ + (r'reads=(\d+)', 'reads'), + (r'underruns=(\d+)', 'underruns'), + (r'zeros=(\d+)', 'zeros'), + (r'buf=(\d+)/(\d+)/(\d+)', 'buf_min', 'buf_avg', 'buf_max'), + (r'ratio=([\d.]+)/([\d.]+)/([\d.]+)', 'ratio_min', 'ratio_avg', 'ratio_max'), + (r'rms=([\d.]+)', 'rms'), + ] + + for pattern in patterns: + if len(pattern) == 2: + match = re.search(pattern[0], line) + if match: + stats[pattern[1]] = float(match.group(1)) if '.' in match.group(1) else int(match.group(1)) + else: + match = re.search(pattern[0], line) + if match: + for i, name in enumerate(pattern[1:]): + val = match.group(i + 1) + stats[name] = float(val) if '.' in val else int(val) + + self.last_usb_rx_stats = stats + self.stats_count += 1 + + except Exception as e: + pass # Ignore parsing errors + + def _parse_usb_tx_stats(self, line): + """Parse USB_TX statistics from diagnostic line.""" + # Format: USB_TX: cb=N samples=N zeros=N(X%) overruns=N | buf=min/avg/max | samp/cb=min/max | rms=X.XXXX + try: + stats = {} + + # Extract numeric values + patterns = [ + (r'cb=(\d+)', 'callbacks'), + (r'samples=(\d+)', 'samples'), + (r'zeros=(\d+)', 'zeros'), + (r'zeros=\d+\(([\d.]+)%\)', 'zeros_pct'), + (r'overruns=(\d+)', 'overruns'), + (r'buf=(\d+)/(\d+)/(\d+)', 'buf_min', 'buf_avg', 'buf_max'), + (r'samp/cb=(\d+)/(\d+)', 'samp_cb_min', 'samp_cb_max'), + (r'rms=([\d.]+)', 'rms'), + ] + + for pattern in patterns: + if len(pattern) == 2: + match = re.search(pattern[0], line) + if match: + val = match.group(1) + stats[pattern[1]] = float(val) if '.' in val else int(val) + else: + match = re.search(pattern[0], line) + if match: + for i, name in enumerate(pattern[1:]): + val = match.group(i + 1) + stats[name] = float(val) if '.' in val else int(val) + + self.last_usb_tx_stats = stats + self.tx_stats_count += 1 + + except Exception as e: + pass # Ignore parsing errors + + @staticmethod + def rejected(response): + """True if the radio rejected a CAT command. + + command_parser() in CAT.cpp answers "?;" for an unrecognised keyword or + a wrong-length parameter block. Note that an *accepted* write often + answers nothing at all - TX_write and RX_write both return an empty + string - so an empty response means success, not failure, and the + absence of "?;" is the only positive signal available. + """ + return response is not None and response.strip().startswith('?') + + def send_cat(self, command): + """Send a CAT command and return the response.""" + # Determine which serial port to use + if self.shared_serial: + ser = self.shared_serial + elif self.cat_serial: + ser = self.cat_serial + else: + print("No CAT port connected") + return None + + # Ensure command ends with semicolon + if not command.endswith(';'): + command += ';' + + try: + if self.shared_serial: + # Single-port mode: coordinate with reader thread + self.cat_response_queue.clear() + self.waiting_for_cat_response = True + + with self.serial_lock: + ser.write(command.encode('ascii')) + ser.flush() + + # Wait for response from queue + start_time = time.time() + while time.time() - start_time < 0.5: + if self.cat_response_queue: + response = self.cat_response_queue.pop(0) + self.waiting_for_cat_response = False + return response.strip() if response else None + time.sleep(0.01) + + self.waiting_for_cat_response = False + return None + else: + # Dual-port mode: read directly + ser.reset_input_buffer() + ser.write(command.encode('ascii')) + ser.flush() + + # Read response (wait for semicolon or timeout) + response = "" + start_time = time.time() + while time.time() - start_time < 0.5: + if ser.in_waiting: + char = ser.read(1).decode('ascii', errors='replace') + response += char + if char == ';': + break + else: + time.sleep(0.01) + + return response.strip() if response else None + + except Exception as e: + print(f"CAT command error: {e}") + return None + + # ==================== Audio Methods ==================== + + def find_teensy_audio_device(self): + """Find the Teensy USB audio device.""" + if not AUDIO_AVAILABLE: + return None + + devices = sd.query_devices() + for i, dev in enumerate(devices): + name = dev['name'].lower() + if 'teensy' in name and dev['max_output_channels'] >= 2: + return i + return None + + def list_audio_devices(self): + """List available audio devices.""" + if not AUDIO_AVAILABLE: + print("Audio not available. Install: pip install numpy sounddevice") + return + + print("\nAvailable audio devices:") + devices = sd.query_devices() + for i, dev in enumerate(devices): + marker = "" + if self.audio_device == i: + marker = " [SELECTED]" + elif self.audio_device is None and i == sd.default.device[1]: + marker = " [DEFAULT OUTPUT]" + + out_ch = dev['max_output_channels'] + in_ch = dev['max_input_channels'] + if out_ch > 0 or in_ch > 0: + print(f" {i}: {dev['name']} (out={out_ch}, in={in_ch}){marker}") + + teensy = self.find_teensy_audio_device() + if teensy is not None: + print(f"\nTeensy detected at device {teensy}") + print() + + def set_audio_device(self, device_idx): + """Set the audio device by index.""" + if not AUDIO_AVAILABLE: + print("Audio not available. Install: pip install numpy sounddevice") + return False + + try: + device_idx = int(device_idx) + dev = sd.query_devices(device_idx) + self.audio_device = device_idx + print(f"Audio device set to {device_idx}: {dev['name']}") + return True + except Exception as e: + print(f"Invalid device index: {e}") + return False + + def _tone_callback(self, outdata, frames, time_info, status): + """Callback for audio output stream - generates sine wave.""" + if status: + print(f"Audio status: {status}") + + if not self.tone_active: + outdata.fill(0) + return + + # Generate sine wave + t = (np.arange(frames) + self.audio_phase) / self.sample_rate + tone = np.sin(2 * np.pi * self.tone_freq * t).astype(np.float32) + + # Stereo: same tone on both channels (I and Q) + # For USB mode, this produces a carrier at the tone frequency offset + outdata[:, 0] = tone * 0.1 # Left channel (I) - 10% amplitude + outdata[:, 1] = tone * 0.1 # Right channel (Q) - 10% amplitude + + self.audio_phase += frames + + def start_tone(self): + """Start outputting a tone via USB audio.""" + if not AUDIO_AVAILABLE: + print("Audio not available. Install: pip install numpy sounddevice") + return False + + if self.audio_stream is not None: + self.stop_tone() + + try: + device = self.audio_device + if device is None: + device = self.find_teensy_audio_device() + if device is not None: + print(f"Auto-selected Teensy audio device {device}") + + self.audio_phase = 0.0 + self.tone_active = True + self.audio_stream = sd.OutputStream( + device=device, + samplerate=self.sample_rate, + channels=2, + dtype='float32', + callback=self._tone_callback, + blocksize=1024 + ) + self.audio_stream.start() + print(f"Tone started: {self.tone_freq} Hz at {self.sample_rate} Hz sample rate") + return True + except Exception as e: + print(f"Failed to start tone: {e}") + self.tone_active = False + return False + + def stop_tone(self): + """Stop the audio tone.""" + self.tone_active = False + if self.audio_stream is not None: + try: + self.audio_stream.stop() + self.audio_stream.close() + except Exception: + pass + self.audio_stream = None + print("Tone stopped") + + def _monitor_callback(self, indata, frames, time_info, status): + """Callback for audio input stream - monitors RX audio.""" + if status: + print(f"Audio input status: {status}") + + # Calculate RMS of input + rms_l = np.sqrt(np.mean(indata[:, 0] ** 2)) + rms_r = np.sqrt(np.mean(indata[:, 1] ** 2)) + rms = (rms_l + rms_r) / 2 + + self.rx_rms_history.append(rms) + if len(self.rx_rms_history) > 50: + self.rx_rms_history.pop(0) + + def _monitor_display_thread(self): + """Thread to display RX audio levels.""" + while self.monitor_active: + if self.rx_rms_history: + rms = self.rx_rms_history[-1] + avg_rms = sum(self.rx_rms_history) / len(self.rx_rms_history) + + # Create a simple bar graph + bar_len = int(rms * 50) + bar = '=' * min(bar_len, 50) + + # Print on same line + sys.stdout.write(f"\rRX RMS: {rms:.4f} (avg: {avg_rms:.4f}) [{bar:<50}]") + sys.stdout.flush() + + time.sleep(0.1) + print() # New line when stopping + + def start_monitor(self): + """Start monitoring RX audio from USB.""" + if not AUDIO_AVAILABLE: + print("Audio not available. Install: pip install numpy sounddevice") + return False + + if self.monitor_active: + self.stop_monitor() + return True + + try: + device = self.audio_device + if device is None: + device = self.find_teensy_audio_device() + if device is not None: + print(f"Auto-selected Teensy audio device {device}") + + self.rx_rms_history = [] + self.monitor_active = True + + self.input_stream = sd.InputStream( + device=device, + samplerate=self.sample_rate, + channels=2, + dtype='float32', + callback=self._monitor_callback, + blocksize=1024 + ) + self.input_stream.start() + + self.monitor_thread = threading.Thread(target=self._monitor_display_thread, daemon=True) + self.monitor_thread.start() + + print("RX monitor started (press Enter to stop)") + return True + except Exception as e: + print(f"Failed to start monitor: {e}") + self.monitor_active = False + return False + + def stop_monitor(self): + """Stop monitoring RX audio.""" + self.monitor_active = False + if hasattr(self, 'input_stream') and self.input_stream is not None: + try: + self.input_stream.stop() + self.input_stream.close() + except Exception: + pass + self.input_stream = None + if self.monitor_thread: + self.monitor_thread.join(timeout=0.5) + self.monitor_thread = None + print("RX monitor stopped") + + # ==================== Command Handlers ==================== + + def cmd_tx(self): + """Key the transmitter and start tone.""" + # "TX;", not "TX1;". CAT.cpp declares TX with set_len 3, so the parser + # only accepts a semicolon in position 2; "TX1;" is answered "?;" and + # the radio stays in receive. + response = self.send_cat("TX") + if self.rejected(response): + print(f"TX refused by radio ({response}) - still in receive") + return + self.tx_active = True + print("TX ON") + if AUDIO_AVAILABLE: + self.start_tone() + + def cmd_rx(self): + """Unkey the transmitter and stop tone.""" + if AUDIO_AVAILABLE and self.tone_active: + self.stop_tone() + response = self.send_cat("RX") + if self.rejected(response): + # Do not clear tx_active: the radio may still be keyed, and the + # quit path relies on this flag to unkey it. + print(f"RX refused by radio ({response}) - may still be transmitting") + return + self.tx_active = False + print("TX OFF") + + def _set_mode(self, command, description): + """Send a mode/audio-routing command and report honestly.""" + response = self.send_cat(command) + if self.rejected(response): + print(f"{description}: refused by radio ({response}) - " + f"'{command};' not supported by this firmware") + return False + print(description) + return True + + def cmd_usb(self): + """Switch to USB audio mode (PC audio input instead of microphone).""" + self._set_mode("UM1", "Audio: USB (PC input)") + + def cmd_ssb(self): + """Switch to SSB/microphone mode.""" + self._set_mode("UM0", "Audio: SSB (microphone)") + + def cmd_lsb(self): + """Switch to LSB sideband.""" + self._set_mode("MD1", "Sideband: LSB") + + def cmd_usb_sideband(self): + """Switch to USB sideband.""" + self._set_mode("MD2", "Sideband: USB") + + def cmd_cw(self): + """Switch to CW mode.""" + self._set_mode("MD3", "Mode: CW") + + def cmd_freq(self, freq_khz): + """Set frequency in kHz.""" + try: + freq_hz = int(float(freq_khz) * 1000) + except ValueError: + print(f"Invalid frequency: {freq_khz}") + return + self._set_mode(f"FA{freq_hz:011d}", f"Frequency: {freq_khz} kHz") + + def cmd_id(self): + """Query radio ID.""" + response = self.send_cat("ID") + print(f"Radio ID: {response}") + + def cmd_if(self): + """Query radio status.""" + response = self.send_cat("IF") + if response: + print(f"Status: {response}") + # Parse IF response + # IF[freq11][step5][rit5][rit_on][xit_on][mem2][rx_tx][mode][vr][scan][split][tone][tone_num][shift]; + if response.startswith("IF") and len(response) >= 38: + freq = int(response[2:13]) + mode_num = response[29:30] + modes = {'1': 'LSB', '2': 'USB', '3': 'CW', '4': 'FM', '5': 'AM'} + mode = modes.get(mode_num, f'?({mode_num})') + tx = response[28:29] + print(f" Frequency: {freq/1000:.3f} kHz") + print(f" Mode: {mode}") + print(f" TX: {'ON' if tx == '1' else 'OFF'}") + + def cmd_stats(self): + """Show current USB statistics.""" + print("\n=== USB Audio Statistics ===") + + # TX stats (PC -> Radio for transmission) + if self.last_usb_tx_stats: + print("\nUSB_TX (PC -> Radio, for RF transmission):") + for key, value in self.last_usb_tx_stats.items(): + print(f" {key}: {value}") + print(f" Total reports: {self.tx_stats_count}") + else: + print("\nUSB_TX: No statistics received yet") + + # RX stats (ASRC consumer side) + if self.last_usb_rx_stats: + print("\nUSB_RX (ASRC consumer):") + for key, value in self.last_usb_rx_stats.items(): + print(f" {key}: {value}") + print(f" Total reports: {self.stats_count}") + else: + print("\nUSB_RX: No statistics received yet") + print() + + def print_help(self): + """Print command help.""" + audio_status = "available" if AUDIO_AVAILABLE else "NOT INSTALLED" + print(f""" +Commands: + tx - Key transmitter (PTT on) and start 1kHz tone + rx - Unkey transmitter (PTT off) and stop tone + tone - Set tone frequency (default 1000, current: {self.tone_freq}) + monitor - Toggle RX audio monitoring (shows RMS level) + devices - List available audio devices + audio - Select audio device by index + + usb - Switch to USB audio mode (PC audio input) + ssb - Switch to SSB/microphone mode + lsb - Switch to LSB sideband + usbsb - Switch to USB sideband + cw - Switch to CW mode + freq - Set frequency (e.g., 'freq 14074') + id - Query radio ID + if - Query radio status + stats - Show last USB_RX statistics + cat - Send raw CAT command (e.g., 'cat FA;') + help - Show this help + quit/exit - Exit program + +Audio support: {audio_status} +Diagnostic output is displayed continuously with timestamps. +Lines containing 'underruns' > 0 are highlighted in red. +Lines containing 'WARMUP' are highlighted in yellow. +""") + + def run_interactive(self): + """Run interactive command loop.""" + self.print_help() + print("\nReady. Type 'help' for commands.\n") + + try: + while True: + try: + cmd = input("\033[94mphoenix>\033[0m ").strip() + except EOFError: + break + + if not cmd: + continue + + parts = cmd.lower().split(maxsplit=1) + command = parts[0] + args = parts[1] if len(parts) > 1 else "" + + if command in ('quit', 'exit', 'q'): + if self.tx_active: + self.cmd_rx() # Safety: ensure TX off + if self.monitor_active: + self.stop_monitor() + break + elif command == 'tx': + self.cmd_tx() + elif command == 'rx': + self.cmd_rx() + elif command == 'tone': + if args: + try: + self.tone_freq = int(args) + print(f"Tone frequency set to {self.tone_freq} Hz") + # If tone is active, restart it with new frequency + if self.tone_active: + self.stop_tone() + self.start_tone() + except ValueError: + print(f"Invalid frequency: {args}") + else: + print(f"Current tone frequency: {self.tone_freq} Hz") + elif command == 'monitor': + if self.monitor_active: + self.stop_monitor() + else: + self.start_monitor() + elif command == 'devices': + self.list_audio_devices() + elif command == 'audio' and args: + self.set_audio_device(args) + elif command == 'usb': + self.cmd_usb() + elif command == 'ssb': + self.cmd_ssb() + elif command == 'lsb': + self.cmd_lsb() + elif command == 'usbsb': + self.cmd_usb_sideband() + elif command == 'cw': + self.cmd_cw() + elif command == 'freq' and args: + self.cmd_freq(args) + elif command == 'id': + self.cmd_id() + elif command == 'if': + self.cmd_if() + elif command == 'stats': + self.cmd_stats() + elif command == 'cat' and args: + response = self.send_cat(args.upper()) + print(f"Response: {response}") + elif command == 'help': + self.print_help() + else: + print(f"Unknown command: {cmd}. Type 'help' for commands.") + + except KeyboardInterrupt: + print("\n") + finally: + # Clean up audio + if self.monitor_active: + self.stop_monitor() + if self.tone_active: + self.stop_tone() + if self.tx_active: + print("Turning off TX...") + self.cmd_rx() + + +def find_serial_ports(): + """List available serial ports.""" + import serial.tools.list_ports + ports = serial.tools.list_ports.comports() + return [(p.device, p.description) for p in ports] + + +def main(): + parser = argparse.ArgumentParser( + description='Phoenix SDR Serial Diagnostics Tool', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__ + ) + parser.add_argument('--port', '-p', + help='Single serial port for both diagnostics and CAT (serial+midi+audio mode)') + parser.add_argument('--diag', '-d', + help='Diagnostic serial port (dual-port mode)') + parser.add_argument('--cat', '-c', + help='CAT control serial port (dual-port mode)') + parser.add_argument('--baud', '-b', type=int, default=115200, + help='Baud rate for single-port mode (default: 115200)') + parser.add_argument('--diag-baud', type=int, default=115200, + help='Diagnostic port baud rate (default: 115200)') + parser.add_argument('--cat-baud', type=int, default=38400, + help='CAT port baud rate (default: 38400)') + parser.add_argument('--list', '-l', action='store_true', + help='List available serial ports and exit') + + args = parser.parse_args() + + if args.list: + print("\nAvailable serial ports:") + ports = find_serial_ports() + if ports: + for device, description in ports: + print(f" {device}: {description}") + else: + print(" No serial ports found") + print() + return 0 + + if not args.port and not args.diag and not args.cat: + print("Error: Specify --port for single-port mode, or --diag/--cat for dual-port mode") + print("Use --list to see available ports") + return 1 + + if args.port and (args.diag or args.cat): + print("Error: Cannot use --port with --diag or --cat") + print("Use --port alone for single-port mode, or --diag/--cat for dual-port mode") + return 1 + + # Create diagnostics instance + diag = PhoenixDiagnostics( + diag_port=args.diag, + cat_port=args.cat, + shared_port=args.port, + diag_baud=args.diag_baud, + cat_baud=args.cat_baud, + shared_baud=args.baud + ) + + # Connect to serial ports + if not diag.connect(): + return 1 + + try: + # Start diagnostic monitoring (for single-port or dual-port with diag) + if args.port or args.diag: + diag.start_diag_monitor() + + # Run interactive command loop + diag.run_interactive() + + finally: + diag.disconnect() + + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/code/tools/set_radio_time.py b/code/tools/set_radio_time.py new file mode 100644 index 0000000..9dbc61c --- /dev/null +++ b/code/tools/set_radio_time.py @@ -0,0 +1,293 @@ +#!/usr/bin/env python3 +"""Set the Phoenix radio's clock over USB serial. + +Sends a PJRC-standard time packet - 'T' + 10-digit timestamp + newline - to the +radio, which sets both the coin-cell-backed hardware RTC and the software clock +that drives the front-panel display. + +WHAT THE RADIO DOES WITH THE NUMBER +----------------------------------- +The firmware feeds the timestamp straight to TimeLib and the display reads +hour()/minute()/second() back out of it. Nothing applies a time-zone offset. The +MY_TIMEZONE setting in Config.h is only a label - "EST: " and friends are pasted +in front of the digits as a string, and changing it does not shift the clock. + +So the radio shows the *UTC decomposition of whatever number it is given*. To +make the display read local wall-clock time, the timestamp has to be shifted by +the local UTC offset before it is sent. That is what this script does by +default. Pass --utc to send a true UTC timestamp instead, which is what you want +if MY_TIMEZONE is set to "UTC: ". + +Either way this clock is cosmetic: it drives the display and nothing else. FT8 +timing comes from the PC's clock, not the radio's, so WSJT-X is unaffected by +what you set here. + +USAGE +----- + python3 set_radio_time.py # display shows local time + python3 set_radio_time.py --utc # display shows UTC + python3 set_radio_time.py --list # show candidate ports + python3 set_radio_time.py --port COM5 # pick the port yourself + python3 set_radio_time.py --offset -08:00 # override the local offset + +Requires pyserial: python3 -m pip install pyserial +""" + +import argparse +import re +import sys +import time +from datetime import datetime, timezone + +TEENSY_VID = 0x16C0 # PJRC +PACKET_DIGITS = 10 # the firmware accepts exactly 10, nothing else +SETTLE_S = 0.3 # let the CDC port come up before writing + + +def fail(message, hint=None): + print(f"error: {message}", file=sys.stderr) + if hint: + print(f" {hint}", file=sys.stderr) + sys.exit(1) + + +def import_serial(): + try: + import serial + import serial.tools.list_ports as list_ports + except ImportError: + fail("pyserial is not installed", + "install it with: python3 -m pip install pyserial") + return serial, list_ports + + +def port_sort_key(device): + """Natural sort, so COM9 comes before COM10 and ttyACM2 before ttyACM10.""" + return [int(part) if part.isdigit() else part + for part in re.split(r"(\d+)", device)] + + +def find_ports(list_ports): + """Teensy ports, most likely first. + + With Dual Serial the radio presents two: the lower-numbered one is Serial, + which is the port the firmware's own time-sync reader watches. With the + serial+midi+audio USB type there is only one, shared with CAT - the CAT + reader recognises the time packet there, so either way the first port works. + """ + candidates = [p for p in list_ports.comports() if p.vid == TEENSY_VID] + return sorted(candidates, key=lambda p: port_sort_key(p.device)) + + +def describe(port): + label = port.description or "serial port" + return f"{port.device} ({label})" + + +def plausible_ports(list_ports): + """Ports worth showing a user. + + Motherboards enumerate dozens of legacy /dev/ttyS* that are never a radio, so + prefer USB devices and only fall back to the full list if there are none. + """ + every = sorted(list_ports.comports(), key=lambda p: port_sort_key(p.device)) + usb = [p for p in every if p.vid is not None] + return usb or every + + +def local_offset_seconds(at): + """Seconds east of UTC at the given moment, from the OS time-zone database.""" + offset = datetime.fromtimestamp(at).astimezone().utcoffset() + if offset is None: # no zone info available at all + return 0 + return int(offset.total_seconds()) + + +def format_offset(seconds): + """Render an offset as UTC+HH:MM. timedelta's own repr turns a negative + offset into '-1 day, 20:00:00', which is not what anyone wants to read.""" + if seconds == 0: + return "UTC" + sign = "+" if seconds > 0 else "-" + magnitude = abs(seconds) + return f"UTC{sign}{magnitude // 3600:02d}:{magnitude % 3600 // 60:02d}" + + +def parse_offset(text): + """Accept +HH:MM, -HH:MM, +HH, or a bare number of hours.""" + match = re.fullmatch(r"([+-]?)(\d{1,2})(?::?([0-5]\d))?", text.strip()) + if not match: + fail(f"cannot read time-zone offset {text!r}", + "use a form like +05:30, -08:00 or +1") + sign = -1 if match.group(1) == "-" else 1 + hours = int(match.group(2)) + minutes = int(match.group(3) or 0) + if hours > 14: + fail(f"time-zone offset {text!r} is out of range") + return sign * (hours * 3600 + minutes * 60) + + +def choose_port(args, list_ports): + if args.port: + return args.port + + found = find_ports(list_ports) + if not found: + every = plausible_ports(list_ports) + hint = ("no serial ports at all - check the USB cable and that the radio is on" + if not every else + "ports seen, none of them a Teensy:\n " + + "\n ".join(describe(p) for p in every) + + "\n pass one explicitly with --port if you know which it is") + fail("no Teensy found", hint) + + if len(found) > 1: + print(f"found {len(found)} Teensy ports, using the first:") + for p in found: + print(f" {describe(p)}") + return found[0].device + + +def open_port(serial, device): + try: + return serial.Serial(device, 115200, timeout=0.3) + except PermissionError: + fail(f"permission denied opening {device}", + "on Linux: sudo usermod -a -G dialout $USER (then log out and back in)") + except Exception as exc: # noqa: BLE001 - report anything + # Distinguish "there is no such port" from "something else has it", since + # the fix is completely different. + text = str(exc).lower() + missing = ("no such file" in text or "cannot find" in text + or getattr(exc, "errno", None) == 2) + if missing: + fail(f"no such port: {device}", "run with --list to see what is connected") + fail(f"cannot open {device}: {exc}", + "something else may already have the port. On the serial+midi+audio USB " + "type\n there is only one, so close WSJT-X or rigctld and try again") + + +def read_reply(handle, seconds=1.0): + deadline, buffer = time.time() + seconds, b"" + while time.time() < deadline: + waiting = handle.in_waiting + if waiting: + buffer += handle.read(waiting) + deadline = time.time() + 0.25 # keep reading while it is talking + else: + time.sleep(0.02) + return buffer + + +def glue_negative_offset(argv): + """Let "--offset -08:00" work as well as "--offset=-08:00". + + argparse reads any token starting with '-' as another option, so a western + hemisphere offset - which is most of them - would otherwise be rejected. + Splice the two tokens together before argparse sees them. + """ + out = [] + index = 0 + while index < len(argv): + token = argv[index] + if token == "--offset" and index + 1 < len(argv) \ + and re.fullmatch(r"[+-]?\d{1,2}(?::?\d\d)?", argv[index + 1]): + out.append(f"--offset={argv[index + 1]}") + index += 2 + continue + out.append(token) + index += 1 + return out + + +def main(): + parser = argparse.ArgumentParser( + description="Set the Phoenix radio's clock over USB serial.", + epilog="The radio applies no time-zone offset of its own, so by default " + "this sends a timestamp shifted into local time to make the " + "display read local wall-clock time.") + parser.add_argument("--port", metavar="DEV", + help="serial port to use (e.g. COM5, /dev/ttyACM0)") + parser.add_argument("--utc", action="store_true", + help="send a true UTC timestamp - use if MY_TIMEZONE is \"UTC: \"") + parser.add_argument("--offset", metavar="TZ", + help="override the local UTC offset, e.g. +05:30") + parser.add_argument("--list", action="store_true", + help="list candidate ports and exit") + args = parser.parse_args(glue_negative_offset(sys.argv[1:])) + + serial, list_ports = import_serial() + + if args.list: + found = find_ports(list_ports) + if found: + print("Teensy ports:") + for p in found: + print(f" {describe(p)}") + else: + print("no Teensy ports found") + every = plausible_ports(list_ports) + others = [p for p in every if p.vid != TEENSY_VID] + if others: + print("other serial ports:") + for p in others: + print(f" {describe(p)}") + return 0 + + if args.utc and args.offset: + fail("--utc and --offset contradict each other", "pass one or the other") + + # Validate the offset before touching hardware - no point opening a port only + # to reject the command line. + manual_offset = parse_offset(args.offset) if args.offset else None + + device = choose_port(args, list_ports) + handle = open_port(serial, device) + + try: + time.sleep(SETTLE_S) + handle.reset_input_buffer() # drop any boot chatter + + # Transmit on a second boundary so the radio's seconds line up with the + # PC's rather than landing mid-tick. + send_at = int(time.time()) + 1 + + if args.utc: + offset = 0 + elif manual_offset is not None: + offset = manual_offset + else: + offset = local_offset_seconds(send_at) + + stamp = send_at + offset + if len(str(stamp)) != PACKET_DIGITS: + fail(f"timestamp {stamp} is not {PACKET_DIGITS} digits", + "the firmware accepts exactly 10 - check the PC's clock") + + while time.time() < send_at: + time.sleep(0.001) + handle.write(f"T{stamp}\n".encode("ascii")) + handle.flush() + + shown = datetime.fromtimestamp(stamp, timezone.utc) + zone = format_offset(offset) + print(f"sent T{stamp} on {device}") + print(f"radio should now display {shown:%Y-%m-%d %H:%M:%S} ({zone})") + + reply = read_reply(handle) + if b"Time set" in reply: + print("radio confirmed:", reply.decode("ascii", "replace").strip()) + elif reply: + print("radio said:", reply.decode("ascii", "replace").strip()) + else: + print("no confirmation - expected on the serial+midi+audio USB type, " + "where the\nconfirmation is suppressed to keep it out of the CAT " + "stream. Check the display.") + finally: + handle.close() + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/code/tools/siglent_capture.py b/code/tools/siglent_capture.py new file mode 100644 index 0000000..0bba33a --- /dev/null +++ b/code/tools/siglent_capture.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +""" +Capture trace data from SIGLENT oscilloscope using pyvisa. +Retrieves waveform data from channels 1 and 2 without modifying settings. +""" + +import pyvisa +import numpy as np +import sys + +SCOPE_IP = "192.168.86.101" + +# Global scope connection +scope = None + +def connect_scope(): + """Connect to the oscilloscope.""" + global scope + resource_str = f'TCPIP0::{SCOPE_IP}::INSTR' + rm = pyvisa.ResourceManager() + scope = rm.open_resource(resource_str) + scope.timeout = 20000 + scope.chunk_size = 1024 * 1024 + scope.write("CHDR OFF") # Turn off headers for clean numeric responses + return scope + +def close_scope(): + """Close the oscilloscope connection.""" + global scope + if scope: + scope.close() + scope = None + +def get_channel_data(channel): + """ + Retrieve waveform data from specified channel. + Returns tuple of (time_array, voltage_array) or (None, None) on error. + """ + ch = f"C{channel}" + + try: + # Get vertical scale and offset (CHDR OFF gives clean numeric values) + vdiv = float(scope.query(f"{ch}:VDIV?")) + voffset = float(scope.query(f"{ch}:OFFSET?")) + + # Get time base + tdiv = float(scope.query("TDIV?")) + + # Request waveform data + scope.write(f"{ch}:WF? DAT2") + raw_data = scope.read_raw() + + # Strip the header (Standard for Siglent binary blocks) + # The header format is #N followed by N digits of length, then data + header_start = raw_data.find(b'#') + if header_start == -1: + print(f"Could not find waveform header in response") + return None, None + + # The byte after '#' tells you how many digits are in the length field + length_digits = int(raw_data[header_start+1:header_start+2]) + data_start = header_start + 2 + length_digits + + # Convert binary bytes to integers (signed 8-bit) + samples = np.frombuffer(raw_data[data_start:-1], dtype=np.int8) + + # Convert to Voltage using the manual's formula + # Voltage = code * (vdiv / 25) - voffset + voltages = samples * (vdiv / 25) - voffset + + # Create time array + num_points = len(voltages) + total_time = 14 * tdiv # 14 divisions on SIGLENT scopes + times = np.linspace(-total_time/2, total_time/2, num_points) + + return times, voltages + + except Exception as e: + print(f"Failed to get data for channel {channel}: {e}") + return None, None + +def main(): + try: + # Connect to scope + connect_scope() + + # Identify the scope + idn = scope.query("*IDN?") + print(f"Connected to: {idn}") + print() + + # Get channel 1 data + print("Retrieving Channel 1 data...") + time1, volt1 = get_channel_data(1) + + # Get channel 2 data + print("Retrieving Channel 2 data...") + time2, volt2 = get_channel_data(2) + + # Print summary + print() + print("=" * 50) + + if time1 is not None and volt1 is not None: + print(f"Channel 1: {len(volt1)} points") + print(f" Time range: {time1[0]*1e6:.2f} µs to {time1[-1]*1e6:.2f} µs") + print(f" Voltage range: {volt1.min():.3f} V to {volt1.max():.3f} V") + print(f" Vpp: {volt1.max() - volt1.min():.3f} V") + else: + print("Channel 1: No data retrieved") + + print() + + if time2 is not None and volt2 is not None: + print(f"Channel 2: {len(volt2)} points") + print(f" Time range: {time2[0]*1e6:.2f} µs to {time2[-1]*1e6:.2f} µs") + print(f" Voltage range: {volt2.min():.3f} V to {volt2.max():.3f} V") + print(f" Vpp: {volt2.max() - volt2.min():.3f} V") + else: + print("Channel 2: No data retrieved") + + # Save data to CSV files + if time1 is not None and volt1 is not None: + filename = "channel1_data.csv" + np.savetxt(filename, np.column_stack((time1, volt1)), + delimiter=',', header='time_s,voltage_v', comments='') + print(f"\nChannel 1 data saved to {filename}") + + if time2 is not None and volt2 is not None: + filename = "channel2_data.csv" + np.savetxt(filename, np.column_stack((time2, volt2)), + delimiter=',', header='time_s,voltage_v', comments='') + print(f"Channel 2 data saved to {filename}") + + return time1, volt1, time2, volt2 + + except Exception as e: + print(f"Failed to connect to oscilloscope: {e}") + sys.exit(1) + + finally: + close_scope() + +if __name__ == "__main__": + main() diff --git a/code/tools/tx_filter_hil/.gitignore b/code/tools/tx_filter_hil/.gitignore new file mode 100644 index 0000000..c783b74 --- /dev/null +++ b/code/tools/tx_filter_hil/.gitignore @@ -0,0 +1,8 @@ +# Run outputs: JSON, Markdown and figures, all timestamped per run. +# Everything needed to regenerate a report is in its JSON, so the artifacts +# themselves are not worth versioning. Commit one deliberately if a particular +# run is worth keeping as a reference. +results/ + +__pycache__/ +*.pyc diff --git a/code/tools/tx_filter_hil/README.md b/code/tools/tx_filter_hil/README.md new file mode 100644 index 0000000..17a1e19 --- /dev/null +++ b/code/tools/tx_filter_hil/README.md @@ -0,0 +1,265 @@ +# Transmit filter rate-independence test, hardware in the loop + +Verifies on the real radio that the transmit DSP filters land on their designed +frequencies at every supported sample rate. An Analog Discovery 2 drives the +microphone input with a tone and captures the exciter's I and Q outputs +*together*; the suite sweeps, measures, and compares the two rates. + +Companion to `../filter_hil/`, which does the same job for the receive chain. +The two share the CAT plumbing and the scalar curve fitting; the measurement +itself is different in kind, and so is what it can and cannot prove. + +## Wiring + +``` +AD2 W1 ------> radio microphone input (Teensy audio hat MIC) +AD2 Ch1 <------ exciter I output (order does not matter, see below) +AD2 Ch2 <------ exciter Q output +AD2 GND ------- radio ground (shared return is required) + +/dev/ttyACM1 ... CAT control, 38400 baud +/dev/ttyACM0 ... diagnostic port, 115200 baud +``` + +**Ch1 and Ch2 can be either way round.** The suite works out which is which and +compensates in software. Nothing needs rewiring. + +**No PTT wiring is needed.** The radio is keyed over CAT with `TX;` and unkeyed +with `RX;`. + +**The exciter outputs sit on a DC bias near +1.6 V.** That is why the scope +offset defaults to 1.6 V; the AD2's range is peak to peak about that offset, so +the usable window is 1.6 ± 2.5 V on the default 5 V range. + +## Before running + +- **The radio transmits continuously for the whole sweep**, several minutes per + sample rate, at 100 % duty. Run it with the exciter I/Q feeding the scope only, + or with a dummy load fitted. The suite reports total key-down time. +- **Leave the power setting alone.** `TXGain` derives the exciter drive from the + requested output power, so changing it mid-run moves every level measured. The + suite reads it, reports it, and does not touch it. +- **The radio must be in SSB.** `TX;` only keys from `SSB_RECEIVE` or + `CW_RECEIVE`, and a CW key-down transmits a carrier from the sidetone + oscillator rather than processed microphone audio, so it exercises none of + these filters. The suite forces USB (or LSB with `--modulation lsb`) and + restores the original modulation afterwards. +- **Do not touch the front panel while it runs.** Menu interaction triggers a + settings save, which would make the test configuration permanent. + +AGC is irrelevant here — it is a receive-path control — so unlike the receive +suite there is nothing to switch off first. + +## Running + +```bash +cd code/tools +./venv/bin/python tx_filter_hil/tx_filter_hil_test.py +``` + +Results land in `tx_filter_hil/results/tx_filter_hil_.{json,md}` plus +PNGs. + +Useful variations: + +```bash +# Passband only, one rate, verbose +./venv/bin/python tx_filter_hil/tx_filter_hil_test.py \ + --tests wiring,level,passband --rates 192000 -v + +# Faster, coarser pass +./venv/bin/python tx_filter_hil/tx_filter_hil_test.py \ + --passband-points 25 --alias-points 9 + +# Measure on the lower sideband instead +./venv/bin/python tx_filter_hil/tx_filter_hil_test.py --modulation lsb + +# Raise the radio's mic gain for the run (restored afterwards) +./venv/bin/python tx_filter_hil/tx_filter_hil_test.py --mic-gain 20 + +# Check arguments and the report path without touching hardware +./venv/bin/python tx_filter_hil/tx_filter_hil_test.py --dry-run + +# Redraw figures from a previous run, no hardware +./venv/bin/python tx_filter_hil/plot_tx_filter_hil.py \ + tx_filter_hil/results/tx_filter_hil_*.json +``` + +Exit codes: `0` pass, `1` fail, `2` error (no hardware, or preflight refused), +`3` aborted. + +## How it works + +### The transmit chain + +From `TransmitProcessing` in `DSP.cpp`: + +| Stage | Rate in → out | Corner specified as | +|---|---|---| +| `TXDecimateBy4` | Fs → Fs/4 | fraction of Fs | +| `TXDecimateBy2` | Fs/4 → Fs/8 | fraction of Fs | +| `BandEQ(TX)` | Fs/8 | **hertz** — 14 cells, 198 Hz to 4 kHz | +| `TXGain` | — | power-dependent scalar | +| `TXDecimateBy2Again` | Fs/8 → Fs/16 | **hertz** — `TX_DECIMATE3_FC_HZ` 3500 | +| `HilbertTransform` | Fs/16 | fixed 100-tap table | +| `TXInterpolateBy2Again` | Fs/16 → Fs/8 | **hertz** — `TX_AUDIO_LPF_FC_HZ` 3039.6 | +| `TXInterpolateBy2` | Fs/8 → Fs/4 | fraction of Fs | +| `TXInterpolateBy4` | Fs/4 → Fs | fraction of Fs | + +The three specified in hertz have to be regenerated on every rate change. The +rest are anti-alias and anti-image filters whose corners are fractions of Fs, and +scaling with the rate is exactly what those should do. + +### Why both scope channels at once + +The exciter output is a complex baseband signal: a 1 kHz microphone tone comes +out as a complex exponential at ±1 kHz, one real sine on each of I and Q, 90° +apart. Reconstructing `I + jQ` from a synchronous capture gives the **two-sided** +spectrum, and with it: + +- the **magnitude response** at `+f`, which is the transmit audio response, and +- the level at `-f`, which is the **opposite-sideband suppression** — the + headline specification of an SSB transmitter. + +Both come out of the same capture, at no extra cost. Two separate single-channel +captures would have no defined phase relationship between them, and suppression +could not be measured at all. + +### Resolving the wiring, and why it takes two captures + +Two unknowns: which scope input is on I, and which side of DC the wanted energy +sits on. Unlike the receive rig they cannot be separated by trying combinations +and seeing which one produces a signal — every combination produces a perfectly +good tone. All that changes is which side of DC it lands on, and one capture +cannot tell "Ch1 on I, upper sideband" from "Ch1 on Q, lower sideband". + +What separates them is the radio's own sideband switch. `SidebandSelection` +inverts I for USB and leaves LSB alone, so commanding USB conjugates the +transmitted signal and moves the tone across DC. Swapping the scope probes +conjugates it too — but nobody rewires the bench between two captures, so the +*change* between LSB and USB isolates the radio's contribution from the wiring's. + +### Scope sample rate + +100 kHz by default, and deliberately **not** a divisor of the radio's 192 kHz +output rate. The exciter DAC leaves residual images near its own sample rate; at +96 ksps an image at `192000 - f` aliases to exactly `-f`, straight onto the mirror +frequency the suppression reading uses, and would cap the measurable suppression. +At 100 ksps the same image lands at `8000 + f`, clear of everything measured. + +## Reading the result + +**The primary criterion is rate invariance.** A corner measured at 192 ksps must +land in the same place at 176.4 ksps. + +The tolerance is **2.5 %**, looser than the receive suite's 1.5 %, and the reason +matters. Both generated transmit stages are 48-tap Kaiser-Bessel windowed sincs, +and a 48-tap design does not scale exactly when its normalised cutoff changes — +the taps are quantised to the same 48 positions at both rates, so the realised +corner lands slightly differently. Evaluating the two tap sets directly gives a +cascade −3 dB corner of 2726 Hz at 24 ksps and 2759 Hz at 22.05 ksps: **+1.2 % on +a correct radio.** `TransmitChain176k.AudioBandwidthHoldsAcrossRates` allows 2 % +for the same reason. The bug this suite exists to catch is still **−8.125 %** +(`176400/192000`), so there is better than a factor of three between correct and +broken. A tolerance tighter than the design's own reproducibility would cry wolf. + +Look at `_summary.png` first: three bars, all of which should sit inside the green +band and nowhere near the dotted −8.125 % line. Then `_passband.png`, where the +two rates' curves should lie on top of each other. + +### What is measured, and what each result is worth + +| Group | Measures | Weight | +|---|---|---| +| `rig` | Wiring order, sideband, quadrature, drive level | Gate: nothing else means anything if this fails | +| `passband` | Composite transmit response; −3 dB high and low corners, ripple | **The result.** High corner is `TXInterpolateBy2Again`; low corner is the equaliser bank's lowest cell | +| `corner` | The cross-rate comparison of those corners | **The headline** | +| `sideband` | Opposite-sideband suppression across the passband | Floor, not rate invariance — see below | +| `alias` | Out-of-band rejection, and fold-back when the audio rate halves | Catches a regression of the old flat decimator table | +| `carrier` | DC residue left by `ED.DCOffsetI/Q` carrier nulling | Diagnostic; a large residue raises every other noise floor | + +## What this measurement cannot do + +Three honest limits, all of which the generated report repeats. + +**Nothing in the transmit chain can be bypassed over CAT.** There is no command +for the transmit equaliser (`ED.equalizerXmt`), and the two generated FIR stages +are unconditional. So every response here is a **composite** of the whole path, +microphone input to exciter output, including the codec's front end. The receive +suite's trick — subtract two captures with a filter engaged and bypassed, so the +analog path cancels exactly — is not available. This costs absolute accuracy, +which is why the absolute tolerances are loose. It costs the rate comparison +nothing: no part of the analog path changes when the sample rate does, so it +divides out of a comparison between rates just as cleanly. + +**Sideband suppression is checked against a floor, not for rate invariance.** The +Hilbert table is not regenerated per rate, and that is correct — a Hilbert +transformer's usable band is a fraction of its sample rate, so one fixed table is +the same design at any rate and its band edges are *meant* to move with Fs. +Requiring the suppression curve to hold still in hertz would fail correct +firmware. What is measured is the Hilbert accuracy, the per-band I/Q amplitude and +phase correction, and any gain difference between the two exciter outputs, lumped +together — from the exciter's terminals they are not separable. + +**A clean fold-back result does not on its own vindicate the decimator.** +`BandEQ` runs *before* `TXDecimateBy2Again` and its highest cell is at 4 kHz, so +it already attenuates an 8 kHz input substantially. A clean result proves nothing +folds into the transmitted audio, which is what matters operationally, but +`TransmitChain176k.DecimatorStopsBeforeTheFoldPoint` is what proves the +decimator's own stopband — it evaluates the tap set at the fold point directly. + +**The transmit equaliser cells are not measured individually**, and deliberately +so. `DSP_FFT.cpp` sets `S_Xmt[i].pCoeffs` and `S_Rec[i].pCoeffs` to the *same* +array, so the transmit cells carry byte-for-byte the coefficients the receive +suite already sweeps. Adding a CAT command to solo them would re-verify one table +through a second biquad instance. They are still exercised here, as part of the +composite passband — the low corner is theirs. + +## When it fails + +| Symptom | Likely cause | +|---|---| +| `rig.sideband_flip` fails: the tone did not change sides between LSB and USB | Only one of Ch1/Ch2 is connected, the radio did not change modulation, or it is not actually transmitting | +| `rig.suppression` reads near 0 dB | The captured pair is real, not complex: one channel missing, or both probes on the same output. A real signal's spectrum is symmetric about DC | +| No tone at all | No shared ground, W1 not on the mic input, the radio did not key (check it is in SSB, not AM/SAM/CW), or the mic gain is at the bottom of its range | +| `rig.drive_level` never reaches the SNR target | Raise `--max-amplitude`, or the radio's mic gain with `--mic-gain 20` | +| Everything reads distorted at any drive | The microphone preamplifier is clipping. Lower `--mic-gain`; the input expects millivolts | +| Levels drift through the run | Something changed the power setting, and with it `TXGain`. Do not touch the front panel | +| Points marked invalid, `clipped` true | Scope range too small or the offset wrong for the exciter's DC bias. Check `--scope-offset` against the reported DC | +| Everything reads −8.125 % | The frozen coefficient tables are back | +| High corner moves 1–2 % | Expected. See the tolerance discussion above | +| Out-of-band rejection reads exactly the noise floor | That is a pass, and the report says so: the true rejection is greater than the rig can see | +| Sideband suppression differs between rates at the band edges | Expected: the Hilbert band scales with Fs by design | + +Do not edit the test in response to a failure — a failure means the radio's +filters are not where they should be, or the rig is not connected as documented. +In particular do not widen `--rate-tol-pct` to make a run pass. + +## Files + +| File | Contents | +|---|---| +| `ad2.py` | Two-channel synchronous record capture, single-channel AWG. Shares the ctypes binding with `filter_hil.ad2` | +| `bandtable.py` | Transmit design constants mirrored from `DSP_FIR.cpp` and `DSP.cpp` | +| `measure.py` | Complex-spectrum metrology: wanted and image levels, suppression, carrier, spurs, corner extraction | +| `tests.py` | The individual tests and the cross-rate comparison | +| `report.py` | Stdout summary and Markdown; document assembly shared with `filter_hil.report` | +| `tx_filter_hil_test.py` | CLI entry point, PTT-safe sequencing, state restore | +| `plot_tx_filter_hil.py` | JSON in, PNGs out; runs without hardware | +| `test_tx_filter_hil.py` | Self-tests for the measurement maths, no hardware | + +Run the self-tests after changing anything in `measure.py` or `tests.py`: + +```bash +./venv/bin/python tx_filter_hil/test_tx_filter_hil.py +``` + +They include a check that the comparison **fails** when handed a simulated +−8.125 % shift, and that it names it as that specific regression rather than as +generic drift. That is what stops the suite quietly passing everything. + +`bandtable.py` mirrors constants from `DSP_FIR.cpp` and `DSP.cpp` by hand. +Nothing detects a firmware value edited without updating it, so re-check that +file when the transmit filter design constants change. `TX_AUDIO_CORNER_3DB_HZ` +and `TX_STOPBAND_*` in particular were derived by evaluating the generated tap +sets, and their derivation is recorded in the comments beside them. diff --git a/code/tools/tx_filter_hil/__init__.py b/code/tools/tx_filter_hil/__init__.py new file mode 100644 index 0000000..b4aae78 --- /dev/null +++ b/code/tools/tx_filter_hil/__init__.py @@ -0,0 +1,8 @@ +"""Hardware-in-the-loop measurement of the Phoenix transmit DSP filters. + +Companion to :mod:`filter_hil`, which does the same job for the receive chain. +The two suites share the CAT plumbing in ``filter_hil.radio`` and the scalar +curve-fitting helpers in ``filter_hil.measure``; everything else differs, because +the transmit chain is measured the other way round - one real tone in at the +microphone, a complex I/Q pair out at the exciter. +""" diff --git a/code/tools/tx_filter_hil/ad2.py b/code/tools/tx_filter_hil/ad2.py new file mode 100644 index 0000000..ddcc8f4 --- /dev/null +++ b/code/tools/tx_filter_hil/ad2.py @@ -0,0 +1,341 @@ +"""Analog Discovery 2 control for the transmit filter HIL suite. + +The receive suite's :mod:`filter_hil.ad2` drives two AWG channels in quadrature +and reads one scope channel. The transmit rig is the mirror image: **one** AWG +channel into the microphone input, and **both** scope channels reading the +exciter's I and Q outputs at the same instant. + +Capturing both channels synchronously is the whole point. The measurement of +interest is the complex signal ``I + jQ``, and its sideband - which side of DC +the transmitted energy sits on - is carried entirely in the phase between the two +channels. Two separate single-channel captures would have no defined phase +relationship, so opposite-sideband suppression could not be measured at all. + +The ctypes binding, the SDK constants and the record-mode idiom are shared with +:mod:`filter_hil.ad2` rather than duplicated; only the configuration and the +capture loop are different. +""" + +from __future__ import annotations + +import atexit +import ctypes +import signal +import time +from dataclasses import dataclass +from datetime import datetime, timezone +from typing import Callable, Optional + +import numpy as np + +from filter_hil.ad2 import (ACQMODE_RECORD, ANALOG_OUT_NODE_CARRIER, + DEFAULT_DWF_PATH, DWF_STATE_ARMED, DWF_STATE_CONFIG, + DWF_STATE_PREFILL, FUNC_SINE, HDWF_NONE, DwfError, + bind_argtypes, dwf_version, last_error, load_dwf) + + +@dataclass(frozen=True) +class TxAd2Config: + """Scope and AWG settings that stay fixed for a whole run. + + ``scope_rate_hz`` deliberately defaults to something that is **not** a + divisor of the radio's 192 kHz output rate. The exciter DAC leaves residual + images around its own sample rate, and at 96 ksps an image at ``192000 - f`` + aliases to exactly ``-f``: straight onto the mirror frequency the sideband + suppression measurement reads. At 100 ksps the same image lands at + ``8000 + f``, harmlessly away from anything being measured. + + ``scope_offset_v`` centres the input window on the exciter output's DC bias, + which sits near +1.6 V on this hardware. Getting it wrong does not clip + quietly - it clips at one extreme of the range and the tone measurement goes + with it. + """ + + scope_rate_hz: float = 100_000.0 + capture_s: float = 0.25 + scope_range_v: float = 5.0 + scope_offset_v: float = 1.6 + awg_offset_v: float = 0.0 + frontend_settle_s: float = 2.0 + dwf_path: str = DEFAULT_DWF_PATH + + +@dataclass +class IqCapture: + """One synchronous block of both scope channels. + + The channels are named for the scope inputs, not for I and Q: which physical + output landed on which input is discovered at run time and is not known when + the capture is taken. + """ + + ch1: np.ndarray + ch2: np.ndarray + sample_rate_hz: float + lost: int + corrupted: int + t_utc: str + + @property + def clean(self) -> bool: + """True when no samples were dropped or flagged corrupt.""" + return self.lost == 0 and self.corrupted == 0 + + def analytic(self, swap: bool = False) -> np.ndarray: + """The complex signal the transmit chain produced, DC removed. + + ``swap`` exchanges the two channels, which conjugates the result and so + mirrors the spectrum about DC. That is exactly the ambiguity introduced by + not knowing which scope input is on I, which is why it is a parameter + here rather than a wiring requirement. + + The DC of each channel is subtracted because the firmware deliberately + puts one there: ``PlayIQData`` adds ``ED.DCOffsetI``/``DCOffsetQ`` to null + the transmitter's carrier. It is a real and interesting quantity, but it + is not part of any filter's response, so it is measured separately by + :meth:`dc` and taken out here. + """ + a = self.ch2 if swap else self.ch1 + b = self.ch1 if swap else self.ch2 + return (a - np.mean(a)) + 1j * (b - np.mean(b)) + + def dc(self) -> tuple[float, float]: + """Mean level of each channel, volts. Carrier nulling lives here.""" + return float(np.mean(self.ch1)), float(np.mean(self.ch2)) + + def peak(self) -> float: + """Largest absolute sample on either channel, volts.""" + if self.ch1.size == 0: + return 0.0 + return float(max(np.max(np.abs(self.ch1)), np.max(np.abs(self.ch2)))) + + def excursion(self, centre_v: float) -> float: + """Largest departure from centre_v on either channel, volts. + + This, not :meth:`peak`, is what decides whether the input clipped. The + AD2's range is peak to peak and sits centred on the configured offset, so + a signal riding on the exciter's +1.6 V bias runs out of window at + ``offset +/- range/2`` - nowhere near ``range`` from zero. + """ + if self.ch1.size == 0: + return 0.0 + return float(max(np.max(np.abs(self.ch1 - centre_v)), + np.max(np.abs(self.ch2 - centre_v)))) + + +class TxAd2: + """Open AD2, drive W1 into the mic input, capture Ch1 and Ch2 together. + + Use as a context manager; the AWG is always silenced on the way out. Unlike + the receive rig this device is not connected to anything that could be + damaged by a stuck output, but a tone left running into the microphone would + be transmitted by the next person to key the radio, so the same cleanup + handlers are installed. + """ + + def __init__(self, cfg: TxAd2Config, log: Callable[[str], None] = print) -> None: + self.cfg = cfg + self.log = log + self.dwf: Optional[ctypes.CDLL] = None + self.hdwf = ctypes.c_int(HDWF_NONE) + self._scope_configured = False + self._prev_sigint = None + self.version = "" + self.captures = 0 + self.dirty_captures = 0 + + # -- lifecycle --------------------------------------------------------- + + def __enter__(self) -> "TxAd2": + self.open() + return self + + def __exit__(self, *exc) -> None: + self.close() + + def open(self) -> None: + """Open the first available device and put it in manual-configure mode.""" + self.dwf = load_dwf(self.cfg.dwf_path) + bind_argtypes(self.dwf) + self.version = dwf_version(self.dwf) + self.log(f"WaveForms SDK {self.version}") + + if self.dwf.FDwfDeviceOpen(ctypes.c_int(-1), ctypes.byref(self.hdwf)) != 1 \ + or self.hdwf.value == HDWF_NONE: + raise DwfError(f"could not open an Analog Discovery: {last_error(self.dwf)}") + + self.dwf.FDwfDeviceAutoConfigureSet(self.hdwf, ctypes.c_int(0)) + + atexit.register(self._emergency_stop) + self._prev_sigint = signal.getsignal(signal.SIGINT) + signal.signal(signal.SIGINT, self._on_sigint) + + def close(self) -> None: + """Silence the AWG and release the device.""" + if self.dwf is None: + return + try: + self.awg_off() + finally: + self.dwf.FDwfDeviceCloseAll() + self.hdwf = ctypes.c_int(HDWF_NONE) + self.dwf = None + atexit.unregister(self._emergency_stop) + if self._prev_sigint is not None: + signal.signal(signal.SIGINT, self._prev_sigint) + self._prev_sigint = None + + def _emergency_stop(self) -> None: + """Last-ditch AWG silence; safe to call more than once.""" + if self.dwf is None or self.hdwf.value == HDWF_NONE: + return + try: + self.dwf.FDwfAnalogOutReset(self.hdwf, ctypes.c_int(-1)) + self.dwf.FDwfDeviceCloseAll() + except Exception: + pass + + def _on_sigint(self, signum, frame): + self.log("\nInterrupted - silencing the AWG.") + self._emergency_stop() + raise KeyboardInterrupt + + # -- scope ------------------------------------------------------------- + + def configure_scope(self) -> None: + """Configure Ch1 and Ch2 for synchronous record-mode capture. + + Both channels take the same range and offset. They are measuring two + halves of one quadrature pair, and a gain difference between them would + appear as an amplitude imbalance - which is indistinguishable from poor + sideband suppression in the radio. + """ + assert self.dwf is not None + d, h = self.dwf, self.hdwf + c_int, c_double = ctypes.c_int, ctypes.c_double + + d.FDwfAnalogInReset(h) + for ch in (0, 1): + c = c_int(ch) + d.FDwfAnalogInChannelEnableSet(h, c, c_int(1)) + d.FDwfAnalogInChannelRangeSet(h, c, c_double(self.cfg.scope_range_v)) + d.FDwfAnalogInChannelOffsetSet(h, c, c_double(self.cfg.scope_offset_v)) + d.FDwfAnalogInAcquisitionModeSet(h, c_int(ACQMODE_RECORD)) + d.FDwfAnalogInFrequencySet(h, c_double(self.cfg.scope_rate_hz)) + d.FDwfAnalogInRecordLengthSet(h, c_double(self.cfg.capture_s)) + d.FDwfAnalogInConfigure(h, c_int(1), c_int(0)) # apply, do not start + + self.log(f"Scope: Ch1+Ch2 @ {self.cfg.scope_rate_hz/1000:.1f} kHz, " + f"{self.cfg.capture_s*1000:.0f} ms, range {self.cfg.scope_range_v} V, " + f"offset {self.cfg.scope_offset_v:+.2f} V") + self.log(f"Waiting {self.cfg.frontend_settle_s:.1f} s for the analog frontend " + f"to settle...") + time.sleep(self.cfg.frontend_settle_s) + self._scope_configured = True + + def capture(self) -> IqCapture: + """Re-arm and stream one block from both channels. + + Both channels are read out at every status poll, with the same sample + offset and the same count, so the two arrays stay sample-aligned. Lost + samples advance the write position on both channels together: a dropout + has to leave a hole rather than shift one channel in time relative to the + other, which would look like a phase error and corrupt every sideband + measurement in the run. + """ + assert self.dwf is not None + if not self._scope_configured: + self.configure_scope() + + d, h = self.dwf, self.hdwf + c_int, c_double = ctypes.c_int, ctypes.c_double + + n_samples = int(round(self.cfg.scope_rate_hz * self.cfg.capture_s)) + buf1 = (ctypes.c_double * n_samples)() + buf2 = (ctypes.c_double * n_samples)() + sts = ctypes.c_byte() + avail, lost, corrupted = c_int(), c_int(), c_int() + total_lost = total_corrupted = 0 + + d.FDwfAnalogInConfigure(h, c_int(0), c_int(1)) # start + + got = 0 + deadline = time.monotonic() + self.cfg.capture_s * 5 + 5.0 + while got < n_samples: + if time.monotonic() > deadline: + raise DwfError("timed out waiting for the scope acquisition") + + if d.FDwfAnalogInStatus(h, c_int(1), ctypes.byref(sts)) != 1: + raise DwfError(f"FDwfAnalogInStatus failed: {last_error(d)}") + + if got == 0 and sts.value in (DWF_STATE_CONFIG, DWF_STATE_PREFILL, + DWF_STATE_ARMED): + continue + + d.FDwfAnalogInStatusRecord(h, ctypes.byref(avail), ctypes.byref(lost), + ctypes.byref(corrupted)) + got += lost.value + total_lost += lost.value + total_corrupted += corrupted.value + + if avail.value == 0: + continue + + take = min(avail.value, n_samples - got) + if take <= 0: + break + offset = ctypes.sizeof(ctypes.c_double) * got + d.FDwfAnalogInStatusData(h, c_int(0), ctypes.byref(buf1, offset), c_int(take)) + d.FDwfAnalogInStatusData(h, c_int(1), ctypes.byref(buf2, offset), c_int(take)) + got += take + + self.captures += 1 + if total_lost or total_corrupted: + self.dirty_captures += 1 + + return IqCapture( + ch1=np.frombuffer(buf1, dtype=np.float64).copy(), + ch2=np.frombuffer(buf2, dtype=np.float64).copy(), + sample_rate_hz=self.cfg.scope_rate_hz, + lost=total_lost, + corrupted=total_corrupted, + t_utc=datetime.now(timezone.utc).isoformat(timespec="seconds"), + ) + + def capture_after(self, settle_s: float) -> IqCapture: + """Wait for the transmit chain to settle on the new tone, then capture.""" + time.sleep(settle_s) + return self.capture() + + # -- AWG --------------------------------------------------------------- + + def set_tone(self, f_hz: float, amplitude_v: float) -> None: + """Drive W1 with a sine into the microphone input. + + Only W1 is used. The transmit chain is fed from the microphone's left + channel alone - ``TransmitProcessing`` overwrites Q with a copy of I + immediately after the equaliser - so a second channel would contribute + nothing. + """ + assert self.dwf is not None + d, h = self.dwf, self.hdwf + c_int, c_double = ctypes.c_int, ctypes.c_double + ch, node = c_int(0), c_int(ANALOG_OUT_NODE_CARRIER) + + d.FDwfAnalogOutNodeEnableSet(h, ch, node, c_int(1)) + d.FDwfAnalogOutNodeFunctionSet(h, ch, node, ctypes.c_ubyte(FUNC_SINE)) + d.FDwfAnalogOutNodeFrequencySet(h, ch, node, c_double(f_hz)) + d.FDwfAnalogOutNodeAmplitudeSet(h, ch, node, c_double(amplitude_v)) + d.FDwfAnalogOutNodeOffsetSet(h, ch, node, c_double(self.cfg.awg_offset_v)) + d.FDwfAnalogOutNodePhaseSet(h, ch, node, c_double(0.0)) + d.FDwfAnalogOutRunSet(h, ch, c_double(0.0)) # run continuously + d.FDwfAnalogOutRepeatSet(h, ch, c_int(0)) + # 1 = start. Configure mode 3 applies to an already-running channel and + # would silently leave a stopped one stopped. + d.FDwfAnalogOutConfigure(h, ch, c_int(1)) + + def awg_off(self) -> None: + """Stop driving the microphone input.""" + if self.dwf is None or self.hdwf.value == HDWF_NONE: + return + self.dwf.FDwfAnalogOutReset(self.hdwf, ctypes.c_int(-1)) diff --git a/code/tools/tx_filter_hil/bandtable.py b/code/tools/tx_filter_hil/bandtable.py new file mode 100644 index 0000000..d465435 --- /dev/null +++ b/code/tools/tx_filter_hil/bandtable.py @@ -0,0 +1,198 @@ +"""Transmit-chain design constants mirrored from the firmware. + +Copied by hand from the sources named against each block. ``test_tx_filter_hil.py`` +checks the internal consistency of what is here, but nothing can detect a value +edited in the firmware and not here, so re-check this file whenever the transmit +filter design constants change. + +The transmit chain, from ``TransmitProcessing`` in ``DSP.cpp``: + + mic -> TXDecimateBy4 Fs -> Fs/4 anti-alias, fraction of Fs + -> TXDecimateBy2 Fs/4 -> Fs/8 anti-alias, fraction of Fs + -> BandEQ(TX) Fs/8 14 bandpass cells, Hz-specified + -> TXGain power-dependent scalar + -> Q := I chain is mono from here + -> TXDecimateBy2Again Fs/8 -> Fs/16 TX_DECIMATE3_FC_HZ, Hz-specified + -> HilbertTransform Fs/16 fixed 100-tap table + -> TXInterpolateBy2Again Fs/16 -> Fs/8 TX_AUDIO_LPF_FC_HZ, Hz-specified + -> ApplyIQCorrection, SidebandSelection + -> TXInterpolateBy2 Fs/8 -> Fs/4 anti-image, fraction of Fs + -> TXInterpolateBy4 Fs/4 -> Fs anti-image, fraction of Fs + -> exciter I/Q DAC + +Three of those stages are specified in **hertz** and so have to be regenerated +when the sample rate changes: the equaliser cells, ``TX_DECIMATE3_FC_HZ`` and +``TX_AUDIO_LPF_FC_HZ``. Everything else is specified as a fraction of Fs and is +*meant* to scale with the rate. That distinction is what this suite tests. +""" + +from __future__ import annotations + +# --- Sample rates ---------------------------------------------------------- +# Globals.cpp SR[] and the SAMPLE_RATE_* macros in SDT.h. Only these two are +# reachable from the front panel menu or the SR CAT command. +SAMPLE_RATES_HZ = (192000, 176400) + +#: ReceiveFilterConfig::DF. The transmit chain decimates to the same audio rate +#: the receive chain uses, and BandEQ runs there. +AUDIO_DECIMATION = 8 + +#: Further decimation into the Hilbert stage (TXDecimateBy2Again). +HILBERT_DECIMATION = 16 + +#: The ratio the frozen-table bug used to scale every Hz-specified corner by. +LEGACY_RATE_RATIO = 176400.0 / 192000.0 # 0.91875 +LEGACY_DELTA_PCT = 100.0 * (LEGACY_RATE_RATIO - 1.0) # -8.125 + + +def audio_rate_hz(sample_rate_hz: float) -> float: + """Rate the equaliser and the transmit audio filters run at.""" + return sample_rate_hz / AUDIO_DECIMATION + + +def hilbert_rate_hz(sample_rate_hz: float) -> float: + """Rate the Hilbert transform runs at: 12 ksps at 192 ksps.""" + return sample_rate_hz / HILBERT_DECIMATION + + +def fold_frequency_hz(sample_rate_hz: float) -> float: + """Input frequency that maps to DC when TXDecimateBy2Again folds. + + ``TXDecimateBy2Again`` halves the audio rate, so its output Nyquist is + ``audio_rate/4`` and an audio-rate component at ``f`` above that folds back + to ``|audio_rate/2 - f|``. This returns that ``audio_rate/2``: 12 kHz at + 192 ksps, 11.025 kHz at 176.4 ksps. + """ + return audio_rate_hz(sample_rate_hz) / 2.0 + + +def nyquist_after_fold_hz(sample_rate_hz: float) -> float: + """Highest frequency that survives the decimation without folding. + + 6 kHz at 192 ksps, 5.5125 kHz at 176.4 ksps. ``TransmitChain176k. + DecimatorStopsBeforeTheFoldPoint`` requires the decimator to be 60 dB down + here. + """ + return audio_rate_hz(sample_rate_hz) / 4.0 + + +def alias_of_hz(f_in_hz: float, sample_rate_hz: float) -> float: + """Where an input at f_in_hz lands after the decimate-by-2 folds it. + + Returns f_in_hz itself when it is below the fold point - nothing happens to + it there. + """ + fold = fold_frequency_hz(sample_rate_hz) + if f_in_hz <= fold / 2.0: + return float(f_in_hz) + return float(abs(fold - f_in_hz)) + + +# --- Transmit audio bandwidth ---------------------------------------------- +# DSP_FIR.cpp. CalcFIRCoeffs takes its fc argument as the -6 dB point, so these +# are not the -3 dB figures the stages are described by. + +#: -6 dB corner of TXInterpolateBy2Again's filter (FIR_int3_12ksps_48tap_2k7). +#: This is the stage that sets the transmitted audio bandwidth. +TX_AUDIO_LPF_FC_HZ = 3039.6 + +#: -6 dB corner of TXDecimateBy2Again's filter (coeffs12K_8K_LPF_FIR). Its job +#: is to stop anything folding when the rate halves; it sits above the audio +#: bandwidth so it costs no wanted signal. +TX_DECIMATE3_FC_HZ = 3500.0 + +#: Taps in each of the two generated transmit FIR stages. +GENERATED_FIR_TAPS = 48 + +#: -3 dB corner of the transmit audio path, measured offline through the real +#: stage functions by ``TransmitChain176k.AudioBandwidthHoldsAcrossRates`` in +#: code/test/TransmitChain_test.cpp, which asserts 2760 +/- 150 Hz. +#: +#: That measurement covers TXDecimateBy2Again, the Hilbert transform and +#: TXInterpolateBy2Again only. On real hardware the equaliser bank is also in +#: the path and cannot be taken out over CAT, so the measured corner can sit a +#: little below this. The absolute tolerance is loose for that reason; the rate +#: comparison is not, because the equaliser is regenerated per rate too. +TX_AUDIO_CORNER_3DB_HZ = 2760.0 + +#: How far the -3 dB corner moves between the two rates on a *correct* radio. +#: +#: Not zero, and this is the one number in this file that is easy to get wrong. +#: Both stages are 48-tap Kaiser-Bessel windowed sincs, and a 48-tap design does +#: not scale exactly when its normalised cutoff changes: the tap set is quantised +#: to the same 48 positions at both rates, so the realised corner lands in a +#: slightly different place. Evaluating the two generated tap sets directly +#: (Kaiser beta from a 90 dB stopband, cutoffs 3500 and 3039.6 Hz) gives a +#: cascade -3 dB corner of 2726 Hz at 24 ksps and 2759 Hz at 22.05 ksps: +1.2 %. +#: +#: ``TransmitChain176k.AudioBandwidthHoldsAcrossRates`` allows 2 % for the same +#: reason. A rate tolerance tighter than this is a tolerance on the design's own +#: reproducibility, not on the firmware, and would cry wolf. The bug being hunted +#: is still -8.125 %, so there is better than a factor of three in hand. +TX_AUDIO_CORNER_RATE_SPREAD_PCT = 1.2 + +#: Where the transmit audio filters are genuinely in their stopband. +#: +#: From the same tap-set evaluation, the cascade reaches -30 dB at 3.68 kHz, +#: -40 dB at 3.84 kHz and -52 dB by 4.0 kHz, beyond which it falls off a cliff +#: (better than 90 dB above 4.5 kHz). Below this frequency the response is on the +#: transition skirt, where demanding tens of decibels of rejection would be +#: demanding the wrong thing - at 3.45 kHz the cascade is only 20 dB down, and +#: correctly so. +TX_STOPBAND_FROM_HZ = 4000.0 + +#: Cascade attenuation predicted at TX_STOPBAND_FROM_HZ, worse rate. The +#: out-of-band check is set well inside this so it has margin against a +#: regression without running into the rig's own noise floor. +TX_STOPBAND_PREDICTED_DB = 52.0 + +#: Nominal -3 dB low corner of the transmit audio path. +#: +#: Nothing in the chain is a deliberate high pass. What rolls the bottom off is +#: the equaliser bank: ``BandEQ`` replaces the audio with the sum of 14 bandpass +#: cells, and the lowest sits at 198.4 Hz, so there is no reconstruction below +#: it. The microphone input's own AC coupling is in series with that and cannot +#: be separated, so this figure is a sanity bound rather than a specification. +TX_AUDIO_LOW_CORNER_HZ = 200.0 + + +# --- Equaliser ------------------------------------------------------------- +# DSP_FIR.cpp EQ_BAND_FC_HZ. The transmit and receive equalisers share one set +# of coefficient tables - DSP_FFT.cpp sets S_Xmt[i].pCoeffs and S_Rec[i].pCoeffs +# to the same array - and both run at the audio rate. The cells are summed with +# alternating signs, which reconstructs a roughly flat response from the lowest +# centre to the highest when every cell is at 100. +EQ_CELL_COUNT = 14 +EQ_CENTRE_HZ = (198.425, 250.0, 314.98, 400.0, 500.0, 630.0, 793.0, + 1000.0, 1259.0, 1587.0, 2000.0, 2500.0, 3150.0, 4000.0) + + +# --- Hilbert transform ----------------------------------------------------- +# DSP_FIR.cpp FIR_Hilbert_coeffs_45 / _neg_45, 100 taps, labelled "12K SPS +# BW 5400". This table is *not* regenerated per rate, and that is correct: a +# Hilbert transformer's usable band is a fraction of its sample rate, so a fixed +# table is the same design at any rate. Its band edges therefore move with Fs by +# design - which is why the sideband suppression checks below are expressed +# against a floor rather than against rate invariance in hertz. +HILBERT_TAPS = 100 +HILBERT_NOMINAL_RATE_HZ = 12000.0 +HILBERT_NOMINAL_BW_HZ = 5400.0 + + +def hilbert_band_hz(sample_rate_hz: float) -> tuple[float, float]: + """Approximate band over which the Hilbert pair holds quadrature. + + Scaled from the table's nominal 5.4 kHz bandwidth at 12 ksps. A Hilbert + transformer is symmetric about the quarter-rate point, so the lower edge sits + as far above DC as the upper edge sits below Nyquist. + """ + fs = hilbert_rate_hz(sample_rate_hz) + half_bw = 0.5 * HILBERT_NOMINAL_BW_HZ * fs / HILBERT_NOMINAL_RATE_HZ + centre = fs / 4.0 + return centre - half_bw, centre + half_bw + + +# --- Modulation ------------------------------------------------------------ +# ModulationType in SDT.h. SidebandSelection() inverts I for USB and leaves LSB +# alone, so these two are the only modulations the transmit chain distinguishes. +MOD_USB, MOD_LSB = 0, 1 diff --git a/code/tools/tx_filter_hil/measure.py b/code/tools/tx_filter_hil/measure.py new file mode 100644 index 0000000..8ad7bf5 --- /dev/null +++ b/code/tools/tx_filter_hil/measure.py @@ -0,0 +1,364 @@ +"""Metrology for the transmit filter HIL suite. + +The receive suite measures a real audio signal, where a tone at ``f`` and one at +``-f`` are the same thing. The transmit suite measures the complex pair ``I + jQ`` +coming out of the exciter, where they are not: a single-sideband transmitter is +*supposed* to put all its energy on one side of DC, and how much leaks onto the +other side is the headline specification of the whole chain. + +So everything here works on the two-sided spectrum, and every level carries a +sign. ``+f`` and ``-f`` are called *wanted* and *image*; which one is which +depends on the selected sideband and on which scope input landed on I, both of +which are discovered at run time. + +Scalar curve fitting that does not care about the signal being complex - grids, +crossings, percentage deltas - is imported from :mod:`filter_hil.measure` rather +than reimplemented, so both suites share one set of well-exercised helpers. +""" + +from __future__ import annotations + +import math +from dataclasses import dataclass +from typing import Optional, Sequence + +import numpy as np + +from filter_hil.measure import (geom_grid, interpolate_crossing, # noqa: F401 + parabolic_peak, pct_delta, stats) + +from .ad2 import IqCapture + +#: Levels below this are the float noise of the measurement, not signal. +FLOOR_DBV = -140.0 + + +def to_db(x: float) -> float: + """Amplitude ratio to decibels, floored so a silent bin does not diverge.""" + return 20.0 * math.log10(max(float(x), 1e-15)) + + +# --- spectra --------------------------------------------------------------- + +def complex_spectrum(z: np.ndarray, fs_hz: float) -> tuple[np.ndarray, np.ndarray]: + """Two-sided spectrum of a complex signal, in volts peak. + + Returns ``(freqs_hz, amplitude)`` with the frequencies sorted ascending from + ``-fs/2``, so negative frequencies are addressable directly rather than + through a wrapped index. + + Scaled so that ``A * exp(2j*pi*f*t)`` reads ``A`` at ``f``. Note the absence + of the factor of two that :func:`filter_hil.measure.spectrum_dbv` applies: a + real cosine splits its amplitude between two conjugate lines and needs them + put back together, a complex exponential has only the one line. + """ + n = len(z) + if n < 16: + return np.zeros(0), np.zeros(0) + ac = z - np.mean(z) + window = np.hanning(n) + coherent_gain = window.sum() / n + spec = np.fft.fftshift(np.fft.fft(ac * window)) / (n * coherent_gain) + freqs = np.fft.fftshift(np.fft.fftfreq(n, d=1.0 / fs_hz)) + return freqs, np.abs(spec) + + +def correlate_complex(z: np.ndarray, fs_hz: float, f_hz: float) -> float: + """Amplitude of a known-frequency component of a complex signal. + + Reading the tallest FFT bin costs up to 1.4 dB when the component falls + between bins. That cancels when two captures are compared at the same + frequency, but not when a ratio between two *different* frequencies is + wanted - which is exactly what sideband suppression is. So the wanted and the + image are both read this way. + + ``f_hz`` is signed. + """ + n = len(z) + if n < 16: + return 0.0 + ac = z - np.mean(z) + window = np.hanning(n) + ref = np.exp(-2j * np.pi * f_hz * np.arange(n) / fs_hz) + return float(np.abs(np.sum(ac * window * ref)) / window.sum()) + + +def locate_line(freqs: np.ndarray, mag: np.ndarray, f0_hz: float, + bw_hz: float) -> tuple[float, float]: + """Interpolated frequency and amplitude of the strongest line near f0_hz. + + A window rather than a single bin: the radio's audio frequency differs from + the requested one by tens of ppm - the Teensy synthesises its I2S clock with a + fractional divider - and a Hann window spreads a line over several bins. + """ + if freqs.size == 0: + return float(f0_hz), 0.0 + sel = np.where(np.abs(freqs - f0_hz) <= bw_hz)[0] + if sel.size == 0: + return float(f0_hz), 0.0 + local = int(sel[np.argmax(mag[sel])]) + delta = parabolic_peak(mag, local) + df = freqs[1] - freqs[0] + return float(freqs[local] + delta * df), float(mag[local]) + + +def dominant_line(cap: IqCapture, swap: bool, f_min_hz: float = 100.0, + f_max_hz: Optional[float] = None) -> tuple[float, float]: + """Signed frequency and amplitude of the strongest line in a capture. + + Used by the wiring detection, which has to find where the transmitted energy + landed rather than look where it was expected. ``f_min_hz`` excludes the + carrier-nulling residue around DC, which is real signal but not the tone. + """ + freqs, mag = complex_spectrum(cap.analytic(swap), cap.sample_rate_hz) + if freqs.size == 0: + return 0.0, 0.0 + hi = f_max_hz if f_max_hz is not None else cap.sample_rate_hz / 2.0 + sel = np.where((np.abs(freqs) >= f_min_hz) & (np.abs(freqs) <= hi))[0] + if sel.size == 0: + return 0.0, 0.0 + idx = int(sel[np.argmax(mag[sel])]) + df = freqs[1] - freqs[0] + return float(freqs[idx] + parabolic_peak(mag, idx) * df), float(mag[idx]) + + +# --- one measured point ---------------------------------------------------- + +@dataclass +class IqMeasurement: + """One tone measured out of one synchronous I/Q capture.""" + + f_target_hz: float # audio frequency asked of the AWG + f_measured_hz: float # signed frequency the energy actually landed on + wanted_v: float # amplitude on the wanted side of DC + image_v: float # amplitude on the other side + level_dbv: float # wanted, in dBV + suppression_db: float # wanted over image, positive is good + carrier_dbc: float # DC residue relative to the wanted tone + thd_db: float # harmonics of the wanted tone, relative to it + snr_db: float + dc_ch1_v: float + dc_ch2_v: float + peak_v: float + clipped: bool + lost: int + corrupted: int + valid: bool + reason: str = "" + + +def measure_iq_tone(cap: IqCapture, f_audio_hz: float, *, swap: bool, + sideband_sign: int, scope_range_v: float, + scope_offset_v: float = 0.0, clip_margin: float = 0.90, + search_bw_hz: float = 60.0, n_harmonics: int = 5, + min_snr_db: float = 20.0, max_thd_db: float = -30.0, + thd_invalidates: bool = False) -> IqMeasurement: + """Measure the transmitted tone, its image, and whether to trust the result. + + ``sideband_sign`` says which side of DC the wanted energy is on once ``swap`` + has been applied; both come from the wiring detection. The image is read at + the exact mirror frequency of where the wanted line was *measured*, not at + the mirror of where it was asked for, so a few tens of ppm of clock error do + not bleed the skirt of the wanted line into the image reading. + + A point is invalid when the capture dropped samples, when the scope input + clipped, or when the tone is buried. Invalid points are excluded from fits + rather than dragging them off. + + ``thd_db`` is reported but by default does not invalidate a point: a little + distortion at 2f does not corrupt the level measured at f. Auto-levelling + passes ``thd_invalidates=True``, because there it is the signal that the + microphone input has been driven too hard. + """ + fs = cap.sample_rate_hz + z = cap.analytic(swap) + freqs, mag = complex_spectrum(z, fs) + + sign = 1 if sideband_sign >= 0 else -1 + f_measured, _ = locate_line(freqs, mag, sign * abs(f_audio_hz), search_bw_hz) + + wanted = correlate_complex(z, fs, f_measured) + image = correlate_complex(z, fs, -f_measured) + + dc1, dc2 = cap.dc() + # The exciter's DC bias is a property of the analog output stage; what the + # firmware controls is the *difference* the carrier-nulling offsets add on + # top of the scope's own centring. Reported relative to the tone, which is + # how carrier suppression is specified. + carrier_v = math.hypot(dc1 - scope_offset_v, dc2 - scope_offset_v) + peak = cap.peak() + + # Noise: everything outside the wanted line, its image, its harmonics and the + # region around DC. The DC exclusion has to be generous - the carrier residue + # is not a single bin once the Hann window has spread it. + df = float(freqs[1] - freqs[0]) if freqs.size > 1 else 1.0 + guard = max(search_bw_hz, 3 * df) + mask = np.abs(freqs) > max(30.0, 3 * df) + mask &= np.abs(freqs - f_measured) > guard + mask &= np.abs(freqs + f_measured) > guard + for k in range(2, n_harmonics + 1): + for fk in (k * f_measured, -k * f_measured): + if abs(fk) < fs / 2: + mask &= np.abs(freqs - fk) > guard + noise_power = float(np.sum(mag[mask] ** 2)) + tone_power = wanted ** 2 + snr = (10.0 * math.log10(tone_power / noise_power) + if noise_power > 0 and tone_power > 0 else -99.0) + + # Harmonic distortion. Harmonics of a single-sideband tone land on the same + # side of DC as the tone itself, so only that side is summed. + harm_power = 0.0 + for k in range(2, n_harmonics + 1): + fk = k * f_measured + if abs(fk) < fs / 2: + _, hk = locate_line(freqs, mag, fk, guard) + harm_power += hk ** 2 + thd = (10.0 * math.log10(harm_power / tone_power) + if tone_power > 0 and harm_power > 0 else -99.0) + + suppression = to_db(wanted) - to_db(image) + carrier_dbc = to_db(carrier_v) - to_db(wanted) + + # The AD2's range is peak to peak and centred on the configured offset, so + # the window is offset +/- range/2 and the clip test is against half the + # range, measured from the window centre rather than from zero. + excursion = cap.excursion(scope_offset_v) + clipped = excursion >= clip_margin * 0.5 * scope_range_v + + reasons = [] + if cap.lost or cap.corrupted: + reasons.append(f"capture dropped {cap.lost} lost / {cap.corrupted} " + f"corrupted samples") + if clipped: + reasons.append(f"excursion {excursion:.3f} V from the {scope_offset_v:+.2f} V " + f"centre exceeds {clip_margin:.0%} of the " + f"{0.5*scope_range_v:.2f} V half-range") + if snr < min_snr_db: + reasons.append(f"SNR {snr:.1f} dB below {min_snr_db:.1f} dB") + if thd_invalidates and thd > max_thd_db: + reasons.append(f"THD {thd:.1f} dB above {max_thd_db:.1f} dB") + + return IqMeasurement( + f_target_hz=float(f_audio_hz), + f_measured_hz=float(f_measured), + wanted_v=wanted, + image_v=image, + level_dbv=to_db(wanted), + suppression_db=suppression, + carrier_dbc=carrier_dbc, + thd_db=thd, + snr_db=snr, + dc_ch1_v=dc1, + dc_ch2_v=dc2, + peak_v=peak, + clipped=clipped, + lost=cap.lost, + corrupted=cap.corrupted, + valid=not reasons, + reason="; ".join(reasons), + ) + + +def spur_level_dbc(cap: IqCapture, swap: bool, f_spur_hz: float, + reference_v: float, search_bw_hz: float = 60.0) -> float: + """Level at a spurious frequency, relative to a passband reference. + + Both signs of ``f_spur_hz`` are examined and the larger returned. A fold-back + product's sideband is not predictable: the decimator folds it before the + Hilbert transform decides which side of DC things end up on, so an alias can + emerge on either side. Looking only at the wanted side would under-report it. + """ + z = cap.analytic(swap) + freqs, mag = complex_spectrum(z, cap.sample_rate_hz) + if freqs.size == 0 or reference_v <= 0.0: + return float("nan") + _, hi_pos = locate_line(freqs, mag, abs(f_spur_hz), search_bw_hz) + _, hi_neg = locate_line(freqs, mag, -abs(f_spur_hz), search_bw_hz) + return to_db(max(hi_pos, hi_neg)) - to_db(reference_v) + + +# --- curve features ------------------------------------------------------- + +def passband_reference_db(freqs: Sequence[float], levels_db: Sequence[float], + f_lo_hz: float, f_hi_hz: float) -> float: + """Passband level of a sweep: the median inside a known-flat window. + + A median rather than a mean or a maximum. The transmit passband is the sum of + 14 equaliser cells and is not perfectly smooth, and a single noisy point near + the top would drag a maximum up and move every corner derived from it. + """ + f = np.asarray(freqs, dtype=float) + y = np.asarray(levels_db, dtype=float) + sel = np.where((f >= f_lo_hz) & (f <= f_hi_hz) & np.isfinite(y))[0] + if sel.size == 0: + return float("nan") + return float(np.median(y[sel])) + + +def corner_from_sweep(freqs: Sequence[float], levels_db: Sequence[float], + target_db: float, *, side: str, + from_hz: float) -> float: + """Frequency at which a sweep crosses target_db, walking away from from_hz. + + ``side='high'`` walks upwards from ``from_hz`` and returns the first crossing; + ``side='low'`` walks downwards. Interpolates linearly in (Hz, dB) between the + two points that straddle the crossing. + + Walking outwards from inside the passband rather than scanning the whole + sweep matters: the response comes back up out of the stopband in places - the + equaliser's reconstruction is not monotonic far from the passband, and fold-back + products land wherever they land - so a global search can return a crossing + on the far side of a stopband ripple. + """ + f = np.asarray(freqs, dtype=float) + y = np.asarray(levels_db, dtype=float) + keep = np.isfinite(f) & np.isfinite(y) + f, y = f[keep], y[keep] + if f.size < 2: + return float("nan") + order = np.argsort(f) + f, y = f[order], y[order] + + start = int(np.argmin(np.abs(f - from_hz))) + if side == "high": + indices = range(start, f.size - 1) + step = 1 + elif side == "low": + indices = range(start, 0, -1) + step = -1 + else: + raise ValueError(f"side must be 'high' or 'low', not {side!r}") + + for i in indices: + j = i + step + if y[i] >= target_db >= y[j]: + return interpolate_crossing(f[i], y[i], f[j], y[j], target_db) + return float("nan") + + +def sweep_ripple_db(freqs: Sequence[float], levels_db: Sequence[float], + f_lo_hz: float, f_hi_hz: float) -> float: + """Peak-to-peak variation of a sweep inside a window.""" + f = np.asarray(freqs, dtype=float) + y = np.asarray(levels_db, dtype=float) + sel = np.where((f >= f_lo_hz) & (f <= f_hi_hz) & np.isfinite(y))[0] + if sel.size < 2: + return float("nan") + return float(np.max(y[sel]) - np.min(y[sel])) + + +def worst_in_band(freqs: Sequence[float], values_db: Sequence[float], + f_lo_hz: float, f_hi_hz: float, + best: bool = False) -> tuple[float, float]: + """The (frequency, value) of the worst - or best - point inside a window. + + Used for sideband suppression, where the number that matters is the worst + case across the passband rather than an average of it. + """ + f = np.asarray(freqs, dtype=float) + y = np.asarray(values_db, dtype=float) + sel = np.where((f >= f_lo_hz) & (f <= f_hi_hz) & np.isfinite(y))[0] + if sel.size == 0: + return float("nan"), float("nan") + idx = int(sel[np.argmax(y[sel])]) if best else int(sel[np.argmin(y[sel])]) + return float(f[idx]), float(y[idx]) diff --git a/code/tools/tx_filter_hil/plot_tx_filter_hil.py b/code/tools/tx_filter_hil/plot_tx_filter_hil.py new file mode 100644 index 0000000..944f4b8 --- /dev/null +++ b/code/tools/tx_filter_hil/plot_tx_filter_hil.py @@ -0,0 +1,317 @@ +#!/usr/bin/env python3 +"""Figures for the transmit filter HIL suite. JSON in, PNGs out. + +Runs without hardware, so a result saved months ago can be redrawn after the +plotting changes: + + python3 plot_tx_filter_hil.py results/tx_filter_hil_20260729_120000.json + +Every figure overlays the sample rates on one set of axes. That is deliberate: +the question these plots answer is whether two curves lie on top of each other, +and side-by-side panels make that the reader's job instead of the plot's. +""" + +from __future__ import annotations + +import json +import os +import sys +from typing import Sequence + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 +import numpy as np # noqa: E402 + +if __package__ in (None, ""): + sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + from tx_filter_hil import bandtable as bt +else: + from . import bandtable as bt + +#: One colour per rate, assigned in descending rate order so 192k is always +#: the same colour across every figure and every run. +RATE_COLOURS = ("#1f77b4", "#d62728", "#2ca02c", "#ff7f0e") + + +def _rates(doc: dict) -> list: + return sorted(doc.get("rates", {}), key=lambda r: -int(r)) + + +def _colour(i: int) -> str: + return RATE_COLOURS[i % len(RATE_COLOURS)] + + +def _label(rate: str) -> str: + return f"{int(rate)/1000:.1f} ksps" + + +def _finish(fig, path: str) -> str: + fig.tight_layout() + os.makedirs(os.path.dirname(os.path.abspath(path)), exist_ok=True) + fig.savefig(path, dpi=130) + plt.close(fig) + return path + + +def _valid_xy(points: Sequence[dict], key: str) -> tuple[np.ndarray, np.ndarray]: + xs, ys = [], [] + for p in points: + y = p.get(key) + if y is not None and p.get("valid", True): + xs.append(p["f_audio_hz"]) + ys.append(y) + return np.asarray(xs, dtype=float), np.asarray(ys, dtype=float) + + +# --- figures --------------------------------------------------------------- + +def plot_passband(doc: dict, path: str) -> str: + """The headline figure: normalised transmit response at every rate. + + Normalised to each rate's own passband reference, because the absolute level + depends on the transmit gain and says nothing about the filters. The dotted + line marks where the high corner would sit if the coefficient tables were + frozen again - the two solid curves should be nowhere near it. + """ + fig, ax = plt.subplots(figsize=(9, 5.5)) + rates = _rates(doc) + + for i, r in enumerate(rates): + pb = doc["rates"][r].get("passband", {}) + if not pb: + continue + f, level = _valid_xy(pb.get("points", []), "level_dbv") + ref = pb.get("reference_dbv") + if f.size == 0 or ref is None: + continue + ax.semilogx(f, level - ref, "o-", ms=3, lw=1.3, color=_colour(i), + label=f"{_label(r)} (-3 dB at " + f"{pb.get('corner_hi_3db_hz', float('nan')):.0f} Hz)") + + base = doc["rates"].get(rates[0], {}).get("passband", {}) if rates else {} + corner = base.get("corner_hi_3db_hz") + if corner: + ax.axvline(corner, color=_colour(0), ls=":", lw=1, alpha=0.6) + broken = corner * bt.LEGACY_RATE_RATIO + ax.axvline(broken, color="k", ls=":", lw=1.4, + label=f"where frozen tables would put it ({broken:.0f} Hz, " + f"{bt.LEGACY_DELTA_PCT:.2f}%)") + + ax.axhline(-3.0, color="grey", ls="--", lw=0.8) + ax.text(105, -2.7, "-3 dB", color="grey", fontsize=8) + window = base.get("passband_window_hz") + if window: + ax.axvspan(window[0], window[1], color="grey", alpha=0.08) + ax.text(np.sqrt(window[0] * window[1]), 2.0, "reference window", + ha="center", fontsize=8, color="grey") + + ax.set_xlabel("microphone frequency (Hz)") + ax.set_ylabel("transmit response (dB, normalised to passband)") + ax.set_title("Transmit audio passband, exciter I/Q output") + ax.set_ylim(-45, 5) + ax.grid(True, which="both", alpha=0.25) + ax.legend(fontsize=8, loc="lower left") + return _finish(fig, path) + + +def plot_sideband(doc: dict, path: str) -> str: + """Opposite-sideband suppression against frequency. + + Checked against a floor rather than for rate invariance: the Hilbert table is + not regenerated per rate and its usable band is *meant* to scale with Fs, so + the two curves are expected to differ slightly at the edges. + """ + fig, ax = plt.subplots(figsize=(9, 5)) + rates = _rates(doc) + floor = None + + for i, r in enumerate(rates): + sb = doc["rates"][r].get("sideband_suppression", {}) + pts = sb.get("points", []) + if not pts: + continue + f = np.asarray([p["f_audio_hz"] for p in pts], dtype=float) + y = np.asarray([p["suppression_db"] if p["suppression_db"] is not None + else np.nan for p in pts], dtype=float) + ax.semilogx(f, y, "o-", ms=3, lw=1.3, color=_colour(i), + label=f"{_label(r)} (worst " + f"{sb.get('worst_db', float('nan')):.1f} dB)") + band = sb.get("hilbert_band_hz") + if band: + ax.axvline(band[0], color=_colour(i), ls=":", lw=0.9, alpha=0.5) + + for c in doc.get("checks", []): + if c["id"] == "sideband.worst" and c["limit"] is not None: + floor = -c["limit"] if c["limit"] < 0 else c["limit"] + if floor is not None: + ax.axhline(floor, color="k", ls="--", lw=1.0, + label=f"required floor ({floor:.0f} dB)") + + ax.set_xlabel("microphone frequency (Hz)") + ax.set_ylabel("wanted over image (dB)") + ax.set_title("Opposite-sideband suppression\n" + "dotted verticals: lower edge of the Hilbert transform's band, " + "which scales with Fs by design") + ax.grid(True, which="both", alpha=0.25) + ax.legend(fontsize=8, loc="lower right") + return _finish(fig, path) + + +def plot_alias(doc: dict, path: str) -> str: + """Out-of-band rejection and any fold-back products. + + The fold point moves with the sample rate - it is a quarter of the audio + rate - so the two rates are probed over the same input frequencies but their + products land in different places. Both are drawn against the input + frequency, with the fold point marked per rate. + """ + fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(9, 7), sharex=True) + rates = _rates(doc) + drew_fold = False + + # The fold point and the noise floor go in the legend rather than as text on + # the axes: they are per-rate, and two rates' annotations land close enough + # together to overprint each other. + for i, r in enumerate(rates): + al = doc["rates"][r].get("alias", {}) + pts = al.get("points", []) + if not pts: + continue + f = np.asarray([p["f_audio_hz"] for p in pts], dtype=float) + direct = np.asarray([p["direct_dbc"] if p["direct_dbc"] is not None + else np.nan for p in pts], dtype=float) + nyq = al.get("nyquist_after_fold_hz") + floor = al.get("noise_floor_dbc") + + tag = _label(r) + if nyq: + tag += f", fold {nyq:.0f} Hz" + if floor is not None: + tag += f", floor {floor:.0f} dBc" + + if np.any(np.isfinite(direct)): + ax1.plot(f, direct, "o-", ms=3, lw=1.3, color=_colour(i), label=tag) + + fold = np.asarray([p["fold_dbc"] if p.get("fold_dbc") is not None + else np.nan for p in pts], dtype=float) + if np.any(np.isfinite(fold)): + ax2.plot(f, fold, "s-", ms=3, lw=1.3, color=_colour(i), label=tag) + drew_fold = True + + if nyq: + for ax in (ax1, ax2): + ax.axvline(nyq, color=_colour(i), ls=":", lw=1.1, alpha=0.7) + # A curve sitting on the floor means "nothing measurable", not "exactly + # this much", so the floor has to be visible to read the plot honestly. + if floor is not None: + for ax in (ax1, ax2): + ax.axhline(floor, color=_colour(i), ls="-.", lw=0.9, alpha=0.55) + + # One limit line per axis, however many rates contributed a check. + for ax, suffix in ((ax1, "alias.direct_rejection"), (ax2, "alias.fold_back")): + limit = next((c["limit"] for c in doc.get("checks", []) + if c["id"].endswith(suffix) and c["limit"] is not None), None) + if limit is not None: + ax.axhline(limit, color="k", ls="--", lw=1.0, + label=f"limit ({limit:.0f} dBc)") + + ax1.set_ylabel("direct level (dBc)") + ax1.set_title("Microphone audio above the transmit passband\n" + "top: what comes straight through, below the fold point. " + "bottom: what folds back, above it") + ax1.grid(True, alpha=0.25) + ax1.legend(fontsize=7, loc="lower left") + + ax2.set_xlabel("microphone frequency (Hz)") + ax2.set_ylabel("fold-back product (dBc)") + ax2.grid(True, alpha=0.25) + if drew_fold: + ax2.legend(fontsize=7, loc="lower left") + else: + ax2.text(0.5, 0.5, "no fold-back product was measurable", + transform=ax2.transAxes, ha="center", fontsize=10, color="grey") + return _finish(fig, path) + + +def plot_summary(doc: dict, path: str) -> str: + """One panel per compared corner: the rate-invariance result at a glance.""" + rows = doc.get("comparison", {}).get("corners", []) + if not rows: + rows = [] + fig, ax = plt.subplots(figsize=(9, max(2.5, 0.9 * len(rows) + 1.8))) + + if not rows: + ax.text(0.5, 0.5, "no cross-rate comparison in this result", + transform=ax.transAxes, ha="center", fontsize=11, color="grey") + ax.axis("off") + return _finish(fig, path) + + labels = [r["label"] for r in rows] + deltas = [r["delta_pct"] if r["delta_pct"] is not None else np.nan + for r in rows] + y = np.arange(len(rows)) + colours = ["#2ca02c" if r["verdict"] == "PASS" + else "#999999" if r["verdict"] == "SKIP" else "#d62728" + for r in rows] + + ax.barh(y, deltas, color=colours, height=0.55) + tol = None + for c in doc.get("checks", []): + if c["id"].endswith(".rate_invariance") and c["limit"] is not None: + tol = c["limit"] + break + if tol: + ax.axvspan(-tol, tol, color="#2ca02c", alpha=0.12) + ax.axvline(tol, color="#2ca02c", lw=0.9) + ax.axvline(-tol, color="#2ca02c", lw=0.9, + label=f"tolerance +/-{tol:.1f}%") + ax.axvline(bt.LEGACY_DELTA_PCT, color="k", ls=":", lw=1.5, + label=f"frozen-table signature ({bt.LEGACY_DELTA_PCT:.3f}%)") + ax.axvline(0.0, color="grey", lw=0.8) + + ax.set_yticks(y) + ax.set_yticklabels(labels, fontsize=9) + ax.invert_yaxis() + ax.set_xlabel("change between sample rates (%)") + ax.set_title(f"Transmit filter rate invariance - " + f"{doc['summary']['overall']}") + ax.grid(True, axis="x", alpha=0.25) + ax.legend(fontsize=8, loc="lower right") + return _finish(fig, path) + + +def render_all(doc: dict, out_dir: str, prefix: str) -> list: + """Render every figure the document supports. Missing data is skipped.""" + made = [] + figures = ( + ("passband", plot_passband), + ("sideband", plot_sideband), + ("alias", plot_alias), + ("summary", plot_summary), + ) + for name, fn in figures: + path = os.path.join(out_dir, f"{prefix}_{name}.png") + try: + made.append(fn(doc, path)) + except Exception as exc: # a missing test should not lose the others + print(f"warning: could not render {name}: {exc}", file=sys.stderr) + return made + + +def main() -> int: + if len(sys.argv) < 2: + print(__doc__, file=sys.stderr) + return 2 + for json_path in sys.argv[1:]: + with open(json_path) as fh: + doc = json.load(fh) + out_dir = os.path.dirname(os.path.abspath(json_path)) + prefix = os.path.splitext(os.path.basename(json_path))[0] + for png in render_all(doc, out_dir, prefix): + print(png) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/code/tools/tx_filter_hil/report.py b/code/tools/tx_filter_hil/report.py new file mode 100644 index 0000000..a72a4ab --- /dev/null +++ b/code/tools/tx_filter_hil/report.py @@ -0,0 +1,321 @@ +"""Result assembly and rendering for the transmit filter HIL suite. + +Three tiers, matching the convention the repo's other tools follow: a human +summary on stdout, a machine-readable JSON document, and a Markdown report that +stitches the numbers together with the generated figures. + +The document assembly, provenance collection and JSON encoding are shared with +:mod:`filter_hil.report` - they say nothing about which chain was measured. The +stdout summary and the Markdown are written here, because what a reader needs to +be told about a transmit result is different. +""" + +from __future__ import annotations + +import os +import sys +from typing import Sequence + +from filter_hil.report import (_jsonable, _md_table, build_document, # noqa: F401 + collect_provenance, write_json) + +from . import bandtable as bt + +SCHEMA = "phoenix.tx_filter_hil/1" + + +def build_tx_document(**kwargs) -> dict: + """Assemble the result document, stamped with this suite's schema.""" + doc = build_document(**kwargs) + doc["schema"] = SCHEMA + return doc + + +# --- stdout ---------------------------------------------------------------- + +def print_summary(doc: dict, stream=sys.stdout) -> None: + """Human-readable result, in the shape the other tools use.""" + s = doc["summary"] + w = stream.write + + w(f"\n[{s['overall']}] Transmit filter rate-independence, " + f"{doc['duration_s']:.0f} s\n") + + for warning in doc.get("warnings", []): + w(f" WARNING: {warning}\n") + + rig = doc.get("rig", {}) + if rig: + w(f" Wiring : {rig.get('wiring', '?')}\n") + if rig.get("suppression_at_1k_db") is not None: + w(f" Suppression @1k : {rig['suppression_at_1k_db']:.1f} dB\n") + if rig.get("drive_amplitude_v") is not None: + w(f" Mic drive : {rig['drive_amplitude_v']*1000:.1f} mV\n") + if rig.get("key_down_s") is not None: + w(f" Key-down time : {rig['key_down_s']:.0f} s\n") + + comp = doc.get("comparison", {}) + rates = sorted(doc.get("rates", {}), key=lambda r: -int(r)) + + rows = comp.get("corners", []) + if rows: + w("\n Transmit audio corners (Hz)\n") + head = " {:<34}{:>9}".format("feature", "nominal") + for r in rates: + head += " {:>10}".format(f"{int(r)//1000}k") + head += " {:>9} {:>8}".format("delta", "verdict") + w(head + "\n") + for row in rows: + nom = row.get("nominal_hz") + line = " {:<34}{:>9}".format(row["label"][:34], + f"{nom:.0f}" if nom else "-") + for r in rates: + v = row.get("value_hz", {}).get(str(r)) + line += " {:>10}".format(f"{v:.1f}" if v is not None else "-") + d = row.get("delta_pct") + line += " {:>8}%".format(f"{d:+.2f}" if d is not None else "-") + line += " {:>8}".format(row["verdict"]) + if row.get("legacy_consistent"): + line += " <- matches the old frozen-table shift" + w(line + "\n") + + def per_rate_line(title: str, block: dict, key: str, unit: str) -> None: + if not block: + return + values = block.get(key, {}) + cells = " ".join(f"{int(r)//1000}k {values.get(str(r)):.1f} {unit}" + if values.get(str(r)) is not None else f"{int(r)//1000}k -" + for r in rates) + w(f" {title:<16}: {cells}\n") + + w("\n") + per_rate_line("Sideband worst", comp.get("sideband_suppression", {}), + "worst_db", "dB") + per_rate_line("Fold-back worst", comp.get("fold_back", {}), "worst_dbc", "dBc") + per_rate_line("Carrier worst", comp.get("carrier", {}), "worst_dbc", "dBc") + + w("\n Checks:\n") + for c in doc["checks"]: + mark = "SKIP" if c["skipped"] else ("OK " if c["passed"] else "BAD ") + w(f" [{mark}] {c['id']:<34} {c['message']}\n") + + w(f"\n {s['passed']} passed, {s['failed']} failed, {s['skipped']} skipped\n") + if not doc.get("state_restored"): + w(" WARNING: radio state was NOT fully restored\n") + if doc.get("state_residual_diff"): + w(f" Radio settings that did not return to baseline: " + f"{', '.join(doc['state_residual_diff'])}\n") + for name, path in doc.get("artifacts", {}).items(): + if isinstance(path, str): + w(f" {name.capitalize():<9}: {path}\n") + elif isinstance(path, list) and path: + w(f" {name.capitalize():<9}: {len(path)} files in " + f"{os.path.dirname(path[0])}\n") + w("\n") + + +# --- Markdown -------------------------------------------------------------- + +def write_markdown(doc: dict, path: str, png_paths: Sequence[str] = ()) -> str: + """Render the report a human reads.""" + s = doc["summary"] + rates = sorted(doc.get("rates", {}), key=lambda r: -int(r)) + md: list[str] = [] + a = md.append + + a("# Transmit filter rate-independence, hardware in the loop\n") + a(f"**{s['overall']}** - {s['passed']} passed, {s['failed']} failed, " + f"{s['skipped']} skipped, in {doc['duration_s']:.0f} s.\n") + a(f"Generated {doc['generated_utc']}.\n") + + for warning in doc.get("warnings", []): + a(f"> **Warning:** {warning}\n") + + a("\n## What this shows\n") + a("A tone is injected into the radio's microphone input and the exciter's I " + "and Q outputs are captured together, at every sample rate under test. " + "Because both outputs are sampled synchronously, the complex signal " + "`I + jQ` can be reconstructed, and with it the thing a single-sideband " + "transmitter is actually judged on: how much energy landed on the wrong " + "side of DC.\n") + a("\nThree stages of the transmit chain are specified in hertz and so have to " + "be regenerated whenever the sample rate changes - the equaliser cells, " + "`TX_DECIMATE3_FC_HZ` and `TX_AUDIO_LPF_FC_HZ`. Everything else is " + "specified as a fraction of Fs and is *meant* to scale with the rate. " + f"These filters used to carry frozen tables designed for one audio rate; " + f"run at another, every corner scaled by the ratio of the rates - " + f"**{bt.LEGACY_DELTA_PCT:.3f}%** between 176.4 and 192 ksps. A result " + f"column close to that figure means the frozen tables are back.\n") + a("\nUnlike the receive suite, nothing here can be bypassed over CAT: there " + "is no command for the transmit equaliser, and the two generated FIR " + "stages are unconditional. So every response below is a **composite** of " + "the whole path, microphone input to exciter output, including the codec's " + "own front end. That costs absolute accuracy, which is why the absolute " + "checks are loose. It costs the rate comparison nothing, because no part " + "of the analog path changes when the sample rate does.\n") + + a("\n## Rig\n") + rig = doc.get("rig", {}) + rig_rows = [ + ["Wiring (detected)", rig.get("wiring", "?")], + ["Suppression at 1 kHz", + f"{rig.get('suppression_at_1k_db', float('nan')):.1f} dB"], + ["Mic drive amplitude", f"{rig.get('drive_amplitude_v', 0)*1000:.1f} mV"], + ["Scope rate", f"{rig.get('scope_rate_hz', 0)/1000:.1f} kHz"], + ["Scope range / offset", + f"{rig.get('scope_range_v', 0):.1f} V pp / " + f"{rig.get('scope_offset_v', 0):+.2f} V"], + ["Capture length", f"{rig.get('capture_s', 0)*1000:.0f} ms"], + ["WaveForms SDK", doc["provenance"].get("dwf_version", "?")], + ] + if rig.get("key_down_s") is not None: + rig_rows.append(["Total key-down time", f"{rig['key_down_s']:.0f} s"]) + a(_md_table(["Property", "Value"], rig_rows)) + a("\nThe scope sample rate is deliberately not a divisor of the radio's " + "192 kHz output rate. The exciter DAC leaves residual images near its own " + "sample rate, and at 96 ksps an image at `192000 - f` would alias to " + "exactly `-f` - straight onto the mirror frequency the sideband " + "suppression reading uses.\n") + + a("\n## Firmware under test\n") + p = doc["provenance"] + a(_md_table(["Property", "Value"], [ + ["Git commit", f"`{p.get('git_commit', '?')}`" + + (" (working tree dirty)" if p.get("git_dirty") else "")], + ["BuildInfo.h", f"`{p.get('build_info', '?')}`"], + ["Radio ID", doc.get("radio_baseline", {}).get("id", "?")], + ])) + + a("\n## Radio state\n") + base = doc.get("radio_baseline", {}) + a(_md_table(["Setting", "At start"], [ + ["Sample rate", f"{base.get('sample_rate_hz', '?')} sps"], + ["Band", base.get("current_band", ["?"])[base.get("active_vfo", 0)]], + ["Modulation", base.get("modulation", ["?"])[base.get("active_vfo", 0)]], + ["Mic gain", f"{base.get('mic_gain_db', '?')} dB"], + ["Transmit equaliser", str(base.get("equalizer_xmt", "?"))], + ["PA 100 W active", base.get("pa_100w", "?")], + ])) + a(f"\nState restored afterwards: **{'yes' if doc.get('state_restored') else 'NO'}**") + if doc.get("state_residual_diff"): + a(f" - these did not return to baseline: `{doc['state_residual_diff']}`") + a("\n") + + a("\n## Headline result\n") + rows = doc.get("comparison", {}).get("corners", []) + if rows: + headers = ["Feature", "Nominal Hz"] + [f"{int(r)//1000}k" for r in rates] + \ + ["Delta %", "If still broken", "Verdict"] + table_rows = [] + for row in rows: + nom = row.get("nominal_hz") + cells = [row["label"], f"{nom:.0f}" if nom else "-"] + for r in rates: + v = row.get("value_hz", {}).get(str(r)) + cells.append(f"{v:.1f}" if v is not None else "-") + d = row.get("delta_pct") + cells.append(f"{d:+.2f}" if d is not None else "-") + cells.append(f"{row['legacy_predicted_delta_pct']:.3f}") + cells.append(f"**{row['verdict']}**") + table_rows.append(cells) + a(_md_table(headers, table_rows)) + a("\nThe high corner is the one that carries the result. It is set by " + "`TXInterpolateBy2Again`'s filter, the stage that limits the " + "transmitted audio bandwidth, and it is regenerated per rate. The low " + "corner is set by the equaliser bank's lowest cell at 198 Hz, with the " + "microphone input's AC coupling in series, so it is a weaker but still " + "useful witness.\n") + + a("\n## Per-rate detail\n") + for r in rates: + bucket = doc["rates"][r] + a(f"\n### {int(r)} sps\n") + if bucket.get("skipped"): + a(f"\nSkipped: `{bucket['skipped']}`\n") + continue + pb = bucket.get("passband", {}) + sb = bucket.get("sideband_suppression", {}) + al = bucket.get("alias", {}) + ca = bucket.get("carrier", {}) + detail = [ + ["Audio rate", f"{bucket.get('audio_rate_hz', 0):.1f} Hz"], + ["Hilbert rate", f"{bucket.get('hilbert_rate_hz', 0):.1f} Hz"], + ["Passband reference", f"{pb.get('reference_dbv', float('nan')):.1f} dBV"], + ["Passband ripple", f"{pb.get('ripple_db', float('nan')):.2f} dB"], + ["-3 dB corners", + f"{pb.get('corner_lo_3db_hz', float('nan')):.0f} Hz to " + f"{pb.get('corner_hi_3db_hz', float('nan')):.0f} Hz"], + ] + if sb.get("worst_db") is not None: + detail.append(["Sideband suppression, worst", + f"{sb['worst_db']:.1f} dB at {sb['worst_at_hz']:.0f} Hz"]) + if al: + detail.append(["Fold point (audio rate / 4)", + f"{al.get('nyquist_after_fold_hz', float('nan')):.0f} Hz"]) + if al.get("noise_floor_dbc") is not None: + detail.append(["Rig noise floor", + f"{al['noise_floor_dbc']:.1f} dBc"]) + if al.get("worst_direct_dbc") is not None: + detail.append([ + "Out-of-band rejection, worst", + f"{al['worst_direct_dbc']:.1f} dBc" + + (" (at the noise floor)" + if al.get("worst_direct_floor_limited") else "")]) + if al.get("worst_fold_dbc") is not None: + detail.append([ + "Fold-back product, worst", + f"{al['worst_fold_dbc']:.1f} dBc from " + f"{al.get('worst_fold_at_hz', float('nan')):.0f} Hz" + + (" (at the noise floor, so nothing measurable folded)" + if al.get("worst_fold_floor_limited") else "")]) + if ca.get("worst_dbc") is not None: + detail.append(["Carrier residue, worst", f"{ca['worst_dbc']:.1f} dBc"]) + a(_md_table(["Measurement", "Value"], detail)) + + if png_paths: + a("\n## Figures\n") + for png in png_paths: + name = os.path.basename(png) + a(f"\n### {name}\n\n![{name}]({name})\n") + + a("\n## All checks\n") + a(_md_table(["Check", "Result", "Value", "Limit", "Notes"], [ + [f"`{c['id']}`", + "SKIP" if c["skipped"] else ("PASS" if c["passed"] else "**FAIL**"), + f"{c['value']:.3f} {c['units']}" if c["value"] is not None else "-", + f"{c['limit']:.3f}" if c["limit"] is not None else "-", + c["message"]] + for c in doc["checks"]])) + + a("\n## Caveats\n") + a("- **Sideband suppression is checked against a floor, not for rate " + "invariance.** The Hilbert table is not regenerated per rate, and that is " + "correct: a Hilbert transformer's usable band is a fraction of its sample " + "rate, so one fixed table is the same design at any rate and its edges are " + "*meant* to move with Fs.\n") + a("- **A clean fold-back result does not on its own vindicate the " + "decimator.** The equaliser bank runs before `TXDecimateBy2Again` and its " + "highest cell is at 4 kHz, so it already attenuates an 8 kHz input " + "substantially. The result proves nothing folds into the transmitted " + "audio, which is what matters operationally; " + "`TransmitChain176k.DecimatorStopsBeforeTheFoldPoint` is what proves the " + "decimator's own stopband, by evaluating its taps at the fold point.\n") + a("- Absolute corner frequencies carry the whole analog path, including the " + "codec front end and the equaliser bank, neither of which can be removed " + "over CAT. The rate comparison divides all of it out.\n") + a("- The transmit DSP gain scales with the requested output power " + "(`TXGain`), so the power setting must not change during a run. The suite " + "reads it at the start and reports it.\n") + a("- Do not touch the front panel during a run. It triggers a settings save " + "and would persist the test configuration.\n") + + a("\n## Reproduce\n") + a(f"```bash\n{p.get('command_line', '')}\n```\n") + a("\nRegenerate the figures from the saved results without the hardware:\n") + a(f"```bash\npython3 plot_tx_filter_hil.py " + f"{os.path.basename(doc.get('artifacts', {}).get('json', 'results.json'))}\n```\n") + + os.makedirs(os.path.dirname(os.path.abspath(path)), exist_ok=True) + with open(path, "w") as fh: + fh.write("\n".join(md)) + return path diff --git a/code/tools/tx_filter_hil/test_tx_filter_hil.py b/code/tools/tx_filter_hil/test_tx_filter_hil.py new file mode 100644 index 0000000..2dc669a --- /dev/null +++ b/code/tools/tx_filter_hil/test_tx_filter_hil.py @@ -0,0 +1,551 @@ +#!/usr/bin/env python3 +"""Self-tests for the transmit HIL measurement maths. No hardware needed. + + python3 test_tx_filter_hil.py + +These exist because the suite's job is to fail when the radio is wrong, and a +measurement bug that biases everything the same way would let it pass silently +instead. The load-bearing case is :class:`TestComparisonCatchesTheBug`, which +feeds the comparison a simulated -8.125 % shift and requires a FAIL: if that ever +passes, the suite has stopped being able to detect the thing it was written for. + +Synthetic captures are built from known signals, so every measured quantity has +an answer that can be asserted rather than eyeballed. +""" + +from __future__ import annotations + +import math +import time +import os +import sys +import unittest + +import numpy as np + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from filter_hil.radio import Radio # noqa: E402 +from tx_filter_hil import bandtable as bt # noqa: E402 +from tx_filter_hil.ad2 import IqCapture # noqa: E402 +from tx_filter_hil.measure import (complex_spectrum, corner_from_sweep, # noqa: E402 + correlate_complex, dominant_line, + measure_iq_tone, passband_reference_db, + spur_level_dbc, sweep_ripple_db, to_db, + worst_in_band) +from tx_filter_hil.tests import PASSBAND_HI_HZ, PASSBAND_LO_HZ, compare_rates # noqa: E402 + +FS = 100_000.0 +N = 25_000 # 0.25 s, matching the default capture length + + +def make_capture(f_hz: float, amplitude_v: float = 0.5, *, + image_db: float = -60.0, dc_v: float = 1.6, + noise_v: float = 0.0, harmonic_db: float = -90.0, + swap_wires: bool = False, extra=None) -> IqCapture: + """Synthesise a capture of a single-sideband exciter output. + + ``f_hz`` is signed: the side of DC the wanted energy sits on. ``image_db`` + puts a conjugate line at the mirror frequency, which is what finite sideband + suppression looks like. ``extra`` is a list of ``(freq_hz, amplitude_v)`` + pairs for spurious products. + """ + t = np.arange(N) / FS + z = amplitude_v * np.exp(2j * np.pi * f_hz * t) + z += amplitude_v * 10.0 ** (image_db / 20.0) * np.exp(-2j * np.pi * f_hz * t) + z += amplitude_v * 10.0 ** (harmonic_db / 20.0) * np.exp(2j * np.pi * 2 * f_hz * t) + for f_extra, a_extra in (extra or []): + z += a_extra * np.exp(2j * np.pi * f_extra * t) + + i = np.real(z) + dc_v + q = np.imag(z) + dc_v + if noise_v: + rng = np.random.default_rng(12345) + i = i + rng.normal(0.0, noise_v, N) + q = q + rng.normal(0.0, noise_v, N) + + ch1, ch2 = (q, i) if swap_wires else (i, q) + return IqCapture(ch1=ch1, ch2=ch2, sample_rate_hz=FS, lost=0, corrupted=0, + t_utc="1970-01-01T00:00:00+00:00") + + +class TestBandtable(unittest.TestCase): + """The mirrored firmware constants have to be self-consistent.""" + + def test_legacy_shift_is_the_rate_ratio(self): + self.assertAlmostEqual(bt.LEGACY_DELTA_PCT, -8.125, places=3) + + def test_audio_and_hilbert_rates(self): + # DSP.cpp: dec4 then dec2 reaches the audio rate; dec2again halves again. + self.assertAlmostEqual(bt.audio_rate_hz(192000), 24000.0) + self.assertAlmostEqual(bt.hilbert_rate_hz(192000), 12000.0) + self.assertAlmostEqual(bt.audio_rate_hz(176400), 22050.0) + self.assertAlmostEqual(bt.hilbert_rate_hz(176400), 11025.0) + + def test_fold_point_scales_with_the_rate(self): + self.assertAlmostEqual(bt.nyquist_after_fold_hz(192000), 6000.0) + self.assertAlmostEqual(bt.nyquist_after_fold_hz(176400), 5512.5) + + def test_alias_maps_above_the_fold_point_and_leaves_below_alone(self): + # At 192 ksps the audio rate is 24 k and dec2again folds about 12 k, so + # 8 kHz reappears at 4 kHz and 3 kHz is untouched. + self.assertAlmostEqual(bt.alias_of_hz(8000.0, 192000), 4000.0) + self.assertAlmostEqual(bt.alias_of_hz(3000.0, 192000), 3000.0) + self.assertAlmostEqual(bt.alias_of_hz(8000.0, 176400), 3025.0) + + def test_equaliser_table_matches_the_firmware_shape(self): + self.assertEqual(len(bt.EQ_CENTRE_HZ), bt.EQ_CELL_COUNT) + self.assertEqual(bt.EQ_CENTRE_HZ[0], 198.425) + self.assertEqual(bt.EQ_CENTRE_HZ[-1], 4000.0) + + def test_nominal_corner_is_inside_the_offline_assertion(self): + # TransmitChain176k.AudioBandwidthHoldsAcrossRates asserts 2760 +/- 150. + self.assertLess(abs(bt.TX_AUDIO_CORNER_3DB_HZ - 2760.0), 150.0) + + def test_hilbert_band_scales_with_the_rate(self): + lo_192, hi_192 = bt.hilbert_band_hz(192000) + lo_176, hi_176 = bt.hilbert_band_hz(176400) + self.assertLess(lo_192, hi_192) + # The band is a fraction of Fs, so it shrinks with the rate by design. + self.assertAlmostEqual(hi_176 / hi_192, bt.LEGACY_RATE_RATIO, places=4) + + +class FakeSerial: + """Just enough pyserial to let Radio.send run without a radio.""" + + def __init__(self, reply: bytes = b""): + self.written = [] + self._reply = bytearray(reply) + self.is_open = True + + def reset_input_buffer(self): + pass + + def write(self, data): + self.written.append(data) + + def flush(self): + pass + + @property + def in_waiting(self): + return len(self._reply) + + def read(self, n=1): + out, self._reply = bytes(self._reply[:n]), self._reply[n:] + return out + + def close(self): + self.is_open = False + + +class TestCatCommandForms(unittest.TestCase): + """The transmit controls have to match CAT.cpp's declared command lengths. + + ``command_parser`` matches on exact length, so a command one character out is + silently rejected with ``?;`` rather than misbehaving visibly. + """ + + def _radio(self, reply: bytes = b"") -> Radio: + r = Radio(timeout_s=0.02, log=lambda *_: None) + r.cat = FakeSerial(reply) + return r + + def test_ptt_sends_the_bare_command_and_does_not_wait(self): + # TX; and RX; are three characters and are *writes*: CAT.cpp suppresses + # their empty responses, so waiting for a reply costs the whole read + # timeout on every key and unkey. That inference is length-based + # everywhere else, which gets these two backwards without a special case. + r = self._radio() + started = time.monotonic() + r.ptt_press(settle_s=0.0) + r.ptt_release(settle_s=0.0) + self.assertEqual(r.cat.written, [b"TX;", b"RX;"]) + self.assertLess(time.monotonic() - started, 0.01, + "PTT must not block on a reply that never comes") + + def test_read_forms_still_wait_for_their_reply(self): + r = self._radio(b"MG071;") + self.assertEqual(r.get_mic_gain_pct(), 71) + self.assertEqual(r.cat.written, [b"MG;"]) + + def test_mic_gain_command_length_matches_cat(self): + r = self._radio() + r.set_mic_gain_pct(71) + self.assertEqual(r.cat.written, [b"MG071;"]) # MG set_len is 3+3 + self.assertEqual(len(r.cat.written[0]), 6) + + def test_mic_gain_is_clamped_to_the_command_range(self): + r = self._radio() + r.set_mic_gain_pct(150) + r.set_mic_gain_pct(-20) + self.assertEqual(r.cat.written, [b"MG100;", b"MG000;"]) + + def test_mic_gain_db_mapping_round_trips_as_the_firmware_does(self): + # MG_write truncates to an integer number of dB, so the round trip is + # lossy and the restore has to expect the truncated value back. + self.assertEqual(Radio.mic_gain_pct_from_db(10), 71) + self.assertEqual(Radio.mic_gain_db_from_pct(71), 9) + for db in (-40, -20, 0, 10, 30): + back = Radio.mic_gain_db_from_pct(Radio.mic_gain_pct_from_db(db)) + self.assertLessEqual(abs(back - db), 1) + + def test_power_command_length_matches_cat(self): + r = self._radio(b"PC005;") + r.set_power_w(5) + self.assertEqual(r.cat.written, [b"PC005;"]) # PC set_len is 3+3 + + +class TestComplexSpectrum(unittest.TestCase): + """A complex exponential must read its own amplitude, on its own side.""" + + def test_amplitude_is_not_halved(self): + # The real-signal convention doubles the FFT to recombine two conjugate + # lines. A complex exponential has one line and must not be doubled. + t = np.arange(N) / FS + z = 0.4 * np.exp(2j * np.pi * 1000.0 * t) + freqs, mag = complex_spectrum(z, FS) + idx = int(np.argmax(mag)) + self.assertAlmostEqual(freqs[idx], 1000.0, delta=FS / N) + self.assertAlmostEqual(mag[idx], 0.4, delta=0.01) + + def test_negative_frequencies_are_addressable(self): + t = np.arange(N) / FS + z = 0.4 * np.exp(-2j * np.pi * 1500.0 * t) + freqs, mag = complex_spectrum(z, FS) + idx = int(np.argmax(mag)) + self.assertLess(freqs[idx], 0.0) + self.assertAlmostEqual(freqs[idx], -1500.0, delta=FS / N) + + def test_frequencies_are_sorted(self): + freqs, _ = complex_spectrum(np.ones(1024, dtype=complex), FS) + self.assertTrue(np.all(np.diff(freqs) > 0)) + + def test_correlation_beats_bin_picking_off_bin(self): + # Deliberately between bins, where a Hann-windowed bin reads low. + f = 1000.0 + 0.5 * FS / N + t = np.arange(N) / FS + z = 0.4 * np.exp(2j * np.pi * f * t) + _, mag = complex_spectrum(z, FS) + self.assertLess(np.max(mag), 0.4) # scalloping loss + self.assertAlmostEqual(correlate_complex(z, FS, f), 0.4, delta=0.002) + + +class TestMeasureIqTone(unittest.TestCase): + """One synthetic capture, every reported quantity checked.""" + + def test_reads_level_and_suppression(self): + cap = make_capture(-1000.0, amplitude_v=0.5, image_db=-42.0) + m = measure_iq_tone(cap, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6) + self.assertTrue(m.valid, m.reason) + self.assertAlmostEqual(m.wanted_v, 0.5, delta=0.01) + self.assertAlmostEqual(m.level_dbv, to_db(0.5), delta=0.2) + self.assertAlmostEqual(m.suppression_db, 42.0, delta=1.0) + self.assertAlmostEqual(m.f_measured_hz, -1000.0, delta=5.0) + + def test_swapping_the_probes_mirrors_the_spectrum(self): + # The same signal wired the other way round must give the same answer + # once the swap is declared. This is the whole basis for not caring which + # probe went on which output. + wired = make_capture(-1000.0, amplitude_v=0.5, image_db=-42.0) + swapped = make_capture(-1000.0, amplitude_v=0.5, image_db=-42.0, + swap_wires=True) + a = measure_iq_tone(wired, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6) + b = measure_iq_tone(swapped, 1000.0, swap=True, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6) + self.assertAlmostEqual(a.level_dbv, b.level_dbv, delta=0.05) + self.assertAlmostEqual(a.suppression_db, b.suppression_db, delta=0.5) + + def test_undeclared_swap_reads_the_image_as_the_tone(self): + # And it must matter: reading with the wrong swap picks up the -42 dB + # image instead of the tone. This is what the wiring detection prevents. + swapped = make_capture(-1000.0, amplitude_v=0.5, image_db=-42.0, + swap_wires=True) + wrong = measure_iq_tone(swapped, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6) + self.assertLess(wrong.suppression_db, -30.0) + + def test_a_real_signal_reads_no_suppression(self): + # Both probes on the same output, or one probe missing: the captured pair + # is real, its spectrum is symmetric, and suppression collapses to 0 dB. + # This is the rig fault detect_wiring's suppression check exists to catch. + t = np.arange(N) / FS + real = 0.5 * np.cos(2 * np.pi * 1000.0 * t) + 1.6 + cap = IqCapture(ch1=real, ch2=real.copy(), sample_rate_hz=FS, lost=0, + corrupted=0, t_utc="1970-01-01T00:00:00+00:00") + m = measure_iq_tone(cap, 1000.0, swap=False, sideband_sign=1, + scope_range_v=5.0, scope_offset_v=1.6) + self.assertLess(abs(m.suppression_db), 1.0) + + def test_carrier_residue_is_measured_against_the_scope_offset(self): + # 100 mV of DC above the 1.6 V centring, on both channels, against a + # 0.5 V tone: hypot(0.1, 0.1) / 0.5. + cap = make_capture(-1000.0, amplitude_v=0.5, dc_v=1.7) + m = measure_iq_tone(cap, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6) + expected = to_db(math.hypot(0.1, 0.1)) - to_db(0.5) + self.assertAlmostEqual(m.carrier_dbc, expected, delta=0.3) + + def test_dc_does_not_leak_into_the_tone_measurement(self): + # A big DC bias must not change the measured level at all: analytic() + # removes each channel's mean before anything else happens. + quiet = make_capture(-1000.0, amplitude_v=0.5, dc_v=0.0) + biased = make_capture(-1000.0, amplitude_v=0.5, dc_v=2.0) + a = measure_iq_tone(quiet, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=0.0) + b = measure_iq_tone(biased, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=2.0) + self.assertAlmostEqual(a.level_dbv, b.level_dbv, delta=0.01) + + def test_clipping_is_judged_against_the_half_range(self): + # The AD2's range is peak to peak about the offset, so a 2.4 V amplitude + # on a 5 V range (+/-2.5 V) is 96% of the window and must be rejected - + # even though 2.4 is well under 5. + cap = make_capture(-1000.0, amplitude_v=2.4, dc_v=1.6) + m = measure_iq_tone(cap, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6) + self.assertTrue(m.clipped) + self.assertFalse(m.valid) + self.assertIn("half-range", m.reason) + + def test_comfortable_amplitude_is_not_called_clipped(self): + cap = make_capture(-1000.0, amplitude_v=0.5, dc_v=1.6) + m = measure_iq_tone(cap, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6) + self.assertFalse(m.clipped) + + def test_dropped_samples_invalidate_a_point(self): + cap = make_capture(-1000.0) + cap.lost = 40 + m = measure_iq_tone(cap, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6) + self.assertFalse(m.valid) + self.assertIn("lost", m.reason) + + def test_buried_tone_invalidates_a_point(self): + cap = make_capture(-1000.0, amplitude_v=0.002, noise_v=0.05) + m = measure_iq_tone(cap, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6, + min_snr_db=25.0) + self.assertFalse(m.valid) + self.assertIn("SNR", m.reason) + + def test_harmonics_are_reported_as_thd(self): + cap = make_capture(-1000.0, amplitude_v=0.5, harmonic_db=-35.0) + m = measure_iq_tone(cap, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6) + self.assertAlmostEqual(m.thd_db, -35.0, delta=2.0) + # Reported but not fatal by default; fatal when auto-levelling. + self.assertTrue(m.valid) + strict = measure_iq_tone(cap, 1000.0, swap=False, sideband_sign=-1, + scope_range_v=5.0, scope_offset_v=1.6, + max_thd_db=-40.0, thd_invalidates=True) + self.assertFalse(strict.valid) + self.assertIn("THD", strict.reason) + + +class TestDominantLine(unittest.TestCase): + """The wiring detection depends entirely on getting this sign right.""" + + def test_finds_the_side_the_energy_is_on(self): + f, amp = dominant_line(make_capture(+1000.0, amplitude_v=0.5), + swap=False, f_min_hz=500.0, f_max_hz=1500.0) + self.assertGreater(f, 0.0) + self.assertAlmostEqual(amp, 0.5, delta=0.02) + + f, _ = dominant_line(make_capture(-1000.0, amplitude_v=0.5), + swap=False, f_min_hz=500.0, f_max_hz=1500.0) + self.assertLess(f, 0.0) + + def test_swap_flips_the_reported_side(self): + cap = make_capture(+1000.0, amplitude_v=0.5) + a, _ = dominant_line(cap, swap=False, f_min_hz=500.0, f_max_hz=1500.0) + b, _ = dominant_line(cap, swap=True, f_min_hz=500.0, f_max_hz=1500.0) + self.assertGreater(a, 0.0) + self.assertLess(b, 0.0) + + def test_carrier_residue_does_not_win(self): + # A large DC term must not be mistaken for the tone; f_min_hz excludes it. + cap = make_capture(-1000.0, amplitude_v=0.05, dc_v=2.0) + f, _ = dominant_line(cap, swap=False, f_min_hz=500.0, f_max_hz=1500.0) + self.assertAlmostEqual(f, -1000.0, delta=10.0) + + +class TestSpurLevel(unittest.TestCase): + """Fold-back products can emerge on either side of DC.""" + + def test_finds_a_spur_on_the_unwanted_side(self): + # A 4 kHz product on the *positive* side while the tone is negative: the + # decimator folds before the Hilbert transform picks a side, so this is a + # realistic case and looking only at the wanted side would miss it. + cap = make_capture(-8000.0, amplitude_v=0.01, + extra=[(+4000.0, 0.5 * 10 ** (-45.0 / 20.0))]) + dbc = spur_level_dbc(cap, swap=False, f_spur_hz=4000.0, reference_v=0.5) + self.assertAlmostEqual(dbc, -45.0, delta=1.5) + + def test_finds_a_spur_on_the_wanted_side_too(self): + cap = make_capture(-8000.0, amplitude_v=0.01, + extra=[(-4000.0, 0.5 * 10 ** (-45.0 / 20.0))]) + dbc = spur_level_dbc(cap, swap=False, f_spur_hz=4000.0, reference_v=0.5) + self.assertAlmostEqual(dbc, -45.0, delta=1.5) + + def test_reports_far_down_when_there_is_no_spur(self): + cap = make_capture(-8000.0, amplitude_v=0.01) + dbc = spur_level_dbc(cap, swap=False, f_spur_hz=4000.0, reference_v=0.5) + self.assertLess(dbc, -60.0) + + +class TestCurveFeatures(unittest.TestCase): + """Corner extraction on a synthetic response with a known answer.""" + + @staticmethod + def _response(corner_hz: float, freqs): + """First-order-ish lowpass with a 200 Hz first-order highpass below.""" + f = np.asarray(freqs, dtype=float) + lp = -10.0 * np.log10(1.0 + (f / corner_hz) ** 8) # steep, like a FIR + hp = -10.0 * np.log10(1.0 + (200.0 / f) ** 4) + return lp + hp + + def test_finds_the_high_corner(self): + f = np.geomspace(100.0, 4400.0, 41) + y = self._response(2760.0, f) + ref = passband_reference_db(f, y, PASSBAND_LO_HZ, PASSBAND_HI_HZ) + corner = corner_from_sweep(f, y, ref - 3.0, side="high", from_hz=1000.0) + self.assertAlmostEqual(corner, 2760.0, delta=90.0) + + def test_finds_the_low_corner(self): + f = np.geomspace(100.0, 4400.0, 61) + y = self._response(2760.0, f) + ref = passband_reference_db(f, y, PASSBAND_LO_HZ, PASSBAND_HI_HZ) + corner = corner_from_sweep(f, y, ref - 3.0, side="low", from_hz=1000.0) + self.assertAlmostEqual(corner, 200.0, delta=25.0) + + def test_walks_outwards_past_a_stopband_ripple(self): + # The equaliser's reconstruction is not monotonic far out, so a response + # that comes back up above the target must not be reported as the corner. + f = np.array([500.0, 1000.0, 2000.0, 2800.0, 3200.0, 3600.0, 4000.0]) + y = np.array([0.0, 0.0, -1.0, -3.0, -20.0, -2.5, -30.0]) + corner = corner_from_sweep(f, y, -3.0, side="high", from_hz=1000.0) + self.assertAlmostEqual(corner, 2800.0, delta=1.0) + + def test_returns_nan_when_the_sweep_never_crosses(self): + f = np.geomspace(100.0, 1000.0, 20) + y = np.zeros_like(f) + self.assertTrue(math.isnan( + corner_from_sweep(f, y, -3.0, side="high", from_hz=500.0))) + + def test_reference_ignores_one_wild_point(self): + # A median, so a single bad reading cannot move every derived corner. + f = np.array([500.0, 800.0, 1000.0, 1400.0, 1800.0]) + y = np.array([-20.0, -20.0, -20.0, +5.0, -20.0]) + self.assertAlmostEqual( + passband_reference_db(f, y, PASSBAND_LO_HZ, PASSBAND_HI_HZ), + -20.0, delta=0.01) + + def test_ripple_and_worst_in_band(self): + f = np.array([500.0, 1000.0, 1500.0, 1800.0]) + y = np.array([-1.0, 0.0, -0.5, -1.5]) + self.assertAlmostEqual(sweep_ripple_db(f, y, 500.0, 1800.0), 1.5, delta=0.01) + + supp = np.array([40.0, 35.0, 38.0, 42.0]) + f_worst, worst = worst_in_band(f, supp, 500.0, 1800.0) + self.assertAlmostEqual(worst, 35.0) + self.assertAlmostEqual(f_worst, 1000.0) + f_best, best = worst_in_band(f, supp, 500.0, 1800.0, best=True) + self.assertAlmostEqual(best, 42.0) + self.assertAlmostEqual(f_best, 1800.0) + + +def _per_rate(corner_192: float, corner_176: float, + lo_192: float = 200.0, lo_176: float = 200.0) -> dict: + """Minimal per-rate structure carrying just the compared corners.""" + return { + "192000": {"rate_hz": 192000, + "passband": {"corner_hi_3db_hz": corner_192, + "corner_hi_6db_hz": corner_192 * 1.1, + "corner_lo_3db_hz": lo_192}}, + "176400": {"rate_hz": 176400, + "passband": {"corner_hi_3db_hz": corner_176, + "corner_hi_6db_hz": corner_176 * 1.1, + "corner_lo_3db_hz": lo_176}}, + } + + +class TestComparisonCatchesTheBug(unittest.TestCase): + """The load-bearing tests. If these pass wrongly, the suite is useless.""" + + def test_identical_corners_pass(self): + _, checks = compare_rates(_per_rate(2760.0, 2760.0), 1.5, 8.0) + invariance = [c for c in checks if c.id.endswith(".rate_invariance")] + self.assertTrue(invariance) + self.assertTrue(all(c.passed for c in invariance), + [c.message for c in invariance if not c.passed]) + + def test_a_frozen_table_shift_fails(self): + # This is the regression the whole suite exists to catch: every corner + # scaled by 176400/192000. + shifted = _per_rate(2760.0, 2760.0 * bt.LEGACY_RATE_RATIO, + lo_176=200.0 * bt.LEGACY_RATE_RATIO) + comparison, checks = compare_rates(shifted, 1.5, 8.0) + invariance = [c for c in checks if c.id.endswith(".rate_invariance")] + self.assertTrue(all(not c.passed for c in invariance), + "a -8.125% shift must fail every rate-invariance check") + # And it must be recognised as that specific regression, not just as + # some generic drift, because that is what makes the report actionable. + hi = next(r for r in comparison["corners"] if r["id"] == "hi_3db") + self.assertTrue(hi["legacy_consistent"]) + self.assertEqual(hi["verdict"], "FAIL") + self.assertAlmostEqual(hi["delta_pct"], bt.LEGACY_DELTA_PCT, delta=0.01) + + def test_a_shift_just_inside_tolerance_passes(self): + _, checks = compare_rates(_per_rate(2760.0, 2760.0 * 1.01), 1.5, 8.0) + hi = next(c for c in checks if c.id == "corner.hi_3db.rate_invariance") + self.assertTrue(hi.passed) + + def test_a_shift_just_outside_tolerance_fails(self): + _, checks = compare_rates(_per_rate(2760.0, 2760.0 * 1.03), 1.5, 8.0) + hi = next(c for c in checks if c.id == "corner.hi_3db.rate_invariance") + self.assertFalse(hi.passed) + # A 3% drift is not the frozen-table signature and must not be labelled it. + self.assertNotIn("frozen coefficient tables", hi.message) + + def test_an_unmeasurable_corner_skips_rather_than_passes(self): + data = _per_rate(2760.0, 2760.0) + data["176400"]["passband"]["corner_hi_3db_hz"] = None + comparison, checks = compare_rates(data, 1.5, 8.0) + hi = next(c for c in checks if c.id == "corner.hi_3db.rate_invariance") + self.assertTrue(hi.skipped) + self.assertFalse(hi.passed) + row = next(r for r in comparison["corners"] if r["id"] == "hi_3db") + self.assertEqual(row["verdict"], "SKIP") + + def test_a_single_rate_produces_no_comparison(self): + one = {"192000": _per_rate(2760.0, 2760.0)["192000"]} + comparison, checks = compare_rates(one, 1.5, 8.0) + self.assertEqual(comparison["corners"], []) + self.assertEqual(checks, []) + + def test_absolute_accuracy_is_checked_on_the_high_corner(self): + # Both rates agree, but at the wrong frequency: rate invariance passes and + # the nominal check has to be the one that objects. + _, checks = compare_rates(_per_rate(2200.0, 2200.0), 1.5, 8.0) + nominal = next(c for c in checks if c.id == "corner.hi_3db.nominal") + self.assertFalse(nominal.passed) + invariance = next(c for c in checks + if c.id == "corner.hi_3db.rate_invariance") + self.assertTrue(invariance.passed) + + def test_checks_serialise_without_nan(self): + # NaN is not valid JSON and numpy bools are not serialisable; the report + # writer relies on Check.as_dict having already dealt with both. + _, checks = compare_rates(_per_rate(2760.0, float("nan")), 1.5, 8.0) + for c in checks: + d = c.as_dict() + self.assertIsInstance(d["passed"], bool) + self.assertTrue(d["value"] is None or math.isfinite(d["value"])) + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/code/tools/tx_filter_hil/tests.py b/code/tools/tx_filter_hil/tests.py new file mode 100644 index 0000000..9768ea9 --- /dev/null +++ b/code/tools/tx_filter_hil/tests.py @@ -0,0 +1,902 @@ +"""The individual transmit hardware tests. + +The transmit chain is measured differently from the receive chain, and the +difference is worth stating plainly because it changes what the results mean. + +In the receive suite every response is the *difference* between two captures with +a filter engaged and bypassed, so the whole analog path cancels. Nothing in the +transmit chain can be bypassed over CAT: there is no command for the transmit +equaliser, and the two generated FIR stages either side of the Hilbert transform +are unconditional. So what is measured here is the **composite** response of the +whole chain, microphone input to exciter output, including the codec's own +front end. + +That is not the handicap it sounds like, because the criterion that matters is +rate invariance. Nothing in the analog path changes when the sample rate changes, +so it divides out of a comparison between rates just as cleanly as it would out +of a bypass difference. What the composite measurement does cost is absolute +accuracy, and every absolute check below is given a loose tolerance for that +reason. + +The bug being hunted is the same one: filters whose corners are specified in +hertz but whose coefficients were frozen for one audio rate. Run at another rate +every corner scaled by the ratio of the rates, **-8.125 %** between 176.4 and +192 ksps. The tolerance is 1.5 %, so there is a factor of five between correct +and broken. +""" + +from __future__ import annotations + +import math +import time +from dataclasses import dataclass, field +from typing import Callable, Iterable, Optional, Sequence + +import numpy as np + +from filter_hil.radio import MOD_LSB, MOD_NAMES, MOD_USB, CatError, EdSnapshot, Radio + +from . import bandtable as bt +from .ad2 import IqCapture, TxAd2 +from .measure import (IqMeasurement, corner_from_sweep, dominant_line, geom_grid, + measure_iq_tone, passband_reference_db, pct_delta, + spur_level_dbc, sweep_ripple_db, to_db, worst_in_band) + +#: Window inside which the transmit passband is taken to be flat. Above the +#: lowest equaliser cell at 198 Hz and well below the 2.76 kHz corner. +PASSBAND_LO_HZ = 500.0 +PASSBAND_HI_HZ = 1800.0 + + +@dataclass +class Check: + """One pass/fail assertion, flat enough to drop straight into a report.""" + + id: str + group: str + description: str + value: Optional[float] + limit: Optional[float] + units: str + passed: bool + skipped: bool = False + message: str = "" + + def as_dict(self) -> dict: + return { + "id": self.id, "group": self.group, "description": self.description, + "value": clean(self.value), "limit": clean(self.limit), + "units": self.units, "passed": bool(self.passed), + "skipped": bool(self.skipped), "message": self.message, + } + + +@dataclass +class TestResult: + name: str + checks: list = field(default_factory=list) + data: dict = field(default_factory=dict) + skipped: bool = False + reason: str = "" + + +def clean(x): + """JSON has no NaN; represent unmeasurable values as null.""" + if x is None: + return None + if isinstance(x, (bool, np.bool_)): + return bool(x) + if isinstance(x, (int, np.integer)): + return int(x) + return float(x) if np.isfinite(x) else None + + +@dataclass +class TxPlan: + """How the rig is wired and driven, as discovered at run time. + + ``swap`` says whether scope Ch1 is on Q rather than I, and ``sideband_sign`` + which side of DC the wanted energy lands on once that swap is applied. Both + are found by experiment rather than assumed, because both depend on how the + bench happens to be wired today and neither is knowable from the firmware. + """ + + rate_hz: int + modulation: int = MOD_USB + swap: bool = False + sideband_sign: int = 1 + amplitude_v: float = 0.05 + + @property + def audio_rate_hz(self) -> float: + return bt.audio_rate_hz(self.rate_hz) + + @property + def fold_hz(self) -> float: + return bt.fold_frequency_hz(self.rate_hz) + + +class Injector: + """Drives one microphone frequency and reads the exciter output back.""" + + def __init__(self, ad2: TxAd2, plan: TxPlan, settle_s: float, + min_snr_db: float, max_thd_db: float) -> None: + self.ad2 = ad2 + self.plan = plan + self.settle_s = settle_s + self.min_snr_db = min_snr_db + self.max_thd_db = max_thd_db + + def capture_at(self, f_audio_hz: float) -> IqCapture: + """Drive the microphone at one frequency and return the raw capture.""" + self.ad2.set_tone(f_audio_hz, self.plan.amplitude_v) + return self.ad2.capture_after(self.settle_s) + + def point(self, f_audio_hz: float) -> tuple[IqMeasurement, IqCapture]: + cap = self.capture_at(f_audio_hz) + m = measure_iq_tone(cap, f_audio_hz, swap=self.plan.swap, + sideband_sign=self.plan.sideband_sign, + scope_range_v=self.ad2.cfg.scope_range_v, + scope_offset_v=self.ad2.cfg.scope_offset_v, + min_snr_db=self.min_snr_db, + max_thd_db=self.max_thd_db) + return m, cap + + def sweep(self, freqs_hz: Iterable[float]) -> list[tuple[IqMeasurement, IqCapture]]: + return [self.point(float(f)) for f in freqs_hz] + + +def point_dict(m: IqMeasurement) -> dict: + """One measured point, in the shape the report and the plots consume.""" + d = { + "f_audio_hz": round(m.f_target_hz, 3), + "f_measured_hz": clean(m.f_measured_hz), + "level_dbv": clean(m.level_dbv), + "suppression_db": clean(m.suppression_db), + "carrier_dbc": clean(m.carrier_dbc), + "snr_db": clean(m.snr_db), + "thd_db": clean(m.thd_db), + "clipped": m.clipped, + "valid": m.valid, + } + if m.reason: + d["reason"] = m.reason + return d + + +# =========================================================================== +# T0 preflight +# =========================================================================== + +def run_preflight(radio: Radio, log: Callable[[str], None]) -> tuple[TestResult, EdSnapshot]: + """Confirm the radio answers and is in a state that can be keyed.""" + checks: list[Check] = [] + + ident = radio.expect("ID;") + checks.append(Check("rig.cat", "rig", "Radio answers on the CAT port", + None, None, "", True, message=f"ID reply {ident}")) + + ed = radio.dump_ed() + log(f"Radio: rate {ed.sample_rate_hz} sps, band {ed.current_band[ed.active_vfo]}, " + f"mode {ed.modulation_name}, mic gain {ed.mic_gain_db} dB, " + f"SSB power {ed.active_power_ssb:.0f} W") + + # TX_write only dispatches PTT_PRESSED from SSB_RECEIVE and KEY_PRESSED from + # CW_RECEIVE. A CW key-down transmits a carrier from the sidetone oscillator, + # not processed microphone audio, so it exercises none of the filters here. + # AM and SAM reach the same SSB transmit state but SidebandSelection only + # special-cases USB, so the sideband would be whatever LSB gives - measurable + # but confusing. The run forces USB or LSB either way. + ssb = ed.active_modulation in (MOD_USB, MOD_LSB) + checks.append(Check( + "rig.ssb_mode", "rig", "Radio is on a sideband mode the transmit chain " + "processes microphone audio in", + float(ed.active_modulation), None, "modulation", True, + message=(f"{ed.modulation_name}" if ssb else + f"{ed.modulation_name}; the run will switch to USB and switch " + f"back afterwards"))) + + checks.append(Check( + "rig.sample_rate_known", "rig", + "Radio reports a CAT-selectable sample rate", + float(ed.sample_rate_hz), None, "hz", + ed.sample_rate_hz in bt.SAMPLE_RATES_HZ, + message=f"{ed.sample_rate_hz} sps")) + + return TestResult("preflight", checks, {"ed": ed.summary(), "id": ident}), ed + + +# =========================================================================== +# T1 wiring and sideband +# =========================================================================== + +def detect_wiring(ad2: TxAd2, radio: Radio, plan: TxPlan, settle_s: float, + min_suppression_db: float, amplitude_v: float, + modulation: int, + log: Callable[[str], None]) -> tuple[TestResult, bool, int]: + """Find which scope input is on I, and which side of DC the sideband is on. + + Two unknowns, and unlike the receive rig they cannot be separated by trying + combinations and seeing which one produces a signal - every combination + produces a perfectly good tone. All that changes is which side of DC it lands + on, and one capture cannot tell "Ch1 is on I, upper sideband" from "Ch1 is on + Q, lower sideband". + + What separates them is the radio's own sideband switch. ``SidebandSelection`` + inverts I for USB and leaves LSB alone, so commanding USB conjugates the + transmitted signal and moves the tone to the other side of DC. Exchanging the + scope inputs conjugates it too - but the operator is not going to rewire the + bench between two captures, so the *change* between USB and LSB isolates the + radio's contribution from the wiring's. + + So: capture in LSB, capture in USB. The tone must swap sides. Which sign LSB + produced then says which input is on I. The radio is left on ``modulation``, + which is the sideband the rest of the run measures on. + """ + probe_hz = 1000.0 + # Detection runs at the approved ceiling: picking a side is a comparison + # between two strong lines, and a tone buried in noise gives an ambiguous + # sign. Auto-levelling brings the drive back down immediately afterwards. + plan.amplitude_v = amplitude_v + trials: dict[str, dict] = {} + + for mod in (MOD_LSB, MOD_USB): + radio.set_modulation(mod) + time.sleep(0.5) + ad2.set_tone(probe_hz, amplitude_v) + cap = ad2.capture_after(settle_s) + # Read the raw capture without applying a swap: the swap is what is being + # determined, and dominant_line only needs to know where the energy is. + f_signed, amp = dominant_line(cap, swap=False, + f_min_hz=probe_hz * 0.5, + f_max_hz=probe_hz * 1.5) + name = MOD_NAMES[mod] + trials[name] = { + "modulation": mod, + "f_signed_hz": clean(f_signed), + "amplitude_v": clean(amp), + "level_dbv": clean(to_db(amp)), + "sign": int(np.sign(f_signed)) if amp > 0 else 0, + } + log(f" {name}: {to_db(amp):7.1f} dBV at {f_signed:+8.1f} Hz " + f"(Ch1 taken as I)") + + lsb, usb = trials["LSB"], trials["USB"] + flipped = (lsb["sign"] != 0 and usb["sign"] != 0 + and lsb["sign"] != usb["sign"]) + + # LSB leaves I alone, so with Ch1 genuinely on I the analytic signal is + # I + jQ as built by the chain and the tone sits on the positive side. + swap = lsb["sign"] < 0 + wiring = ("Ch1 -> I, Ch2 -> Q" if not swap else + "Ch1 -> Q, Ch2 -> I (compensated in software)") + + # Settle on the sideband the run will use, and take the wanted side from a + # capture with the resolved swap in place rather than predicting it. + # SidebandSelection's inversion says USB should come out on the negative side + # once Ch1 is on I, but an inverting stage anywhere in the exciter's analog + # output would undo that without being a fault, so the sign is measured. + plan.swap = swap + plan.modulation = modulation + radio.set_modulation(modulation) + time.sleep(0.5) + ad2.set_tone(probe_hz, amplitude_v) + cap = ad2.capture_after(settle_s) + f_resolved, _ = dominant_line(cap, swap=swap, f_min_hz=probe_hz * 0.5, + f_max_hz=probe_hz * 1.5) + plan.sideband_sign = -1 if f_resolved < 0 else 1 + + # The same capture gives the suppression figure, which is the number that says + # whether both channels are really connected and in quadrature. + m = measure_iq_tone(cap, probe_hz, swap=plan.swap, + sideband_sign=plan.sideband_sign, + scope_range_v=ad2.cfg.scope_range_v, + scope_offset_v=ad2.cfg.scope_offset_v, + min_snr_db=0.0, max_thd_db=99.0) + expected_sign = -1 if modulation == MOD_USB else 1 + mod_name = MOD_NAMES[modulation] + log(f" resolved: {wiring}, wanted side " + f"{'+' if plan.sideband_sign > 0 else '-'}f in {mod_name}" + + ("" if plan.sideband_sign == expected_sign + else " (opposite to the firmware's convention - an inverting stage " + "somewhere in the exciter output)") + + f", suppression {m.suppression_db:.1f} dB") + + checks = [Check( + "rig.sideband_flip", "rig", + "Commanding the other sideband moves the transmitted tone across DC", + None, None, "", flipped, + message=("the tone changed sides between LSB and USB, so the wiring " + "order is unambiguous" if flipped else + "the tone did not change sides between LSB and USB. Either only " + "one of Ch1/Ch2 is connected, or the radio did not change " + "modulation, or it is not actually transmitting"))] + + # A single connected channel gives a real signal, whose spectrum is symmetric + # about DC: suppression near 0 dB. That is the failure this catches, and it is + # the one thing about the rig the sign test alone cannot see. + checks.append(Check( + "rig.suppression", "rig", + "Both exciter outputs are connected and in quadrature", + clean(m.suppression_db), min_suppression_db, + "db", bool(m.suppression_db >= min_suppression_db), + message=(f"{m.suppression_db:.1f} dB of opposite-sideband suppression at " + f"{probe_hz:.0f} Hz" if m.suppression_db >= min_suppression_db else + f"only {m.suppression_db:.1f} dB between the two sides of DC. A " + f"real signal - one channel missing, or both probes on the same " + f"output - reads close to 0 dB"))) + + data = { + "swap": swap, + "wiring": wiring, + "sideband_sign": plan.sideband_sign, + "sideband_sign_expected": expected_sign, + "sideband_sign_as_expected": plan.sideband_sign == expected_sign, + "sideband_flipped": flipped, + "measured_on": mod_name, + "suppression_at_1k_db": clean(m.suppression_db), + "detect_amplitude_v": amplitude_v, + "dc_ch1_v": clean(m.dc_ch1_v), + "dc_ch2_v": clean(m.dc_ch2_v), + "trials": trials, + } + return TestResult("wiring", checks, data), swap, plan.sideband_sign + + +# =========================================================================== +# T2 drive level +# =========================================================================== + +def autolevel(ad2: TxAd2, plan: TxPlan, settle_s: float, start_v: float, + max_v: float, step_db: float, min_snr_db: float, max_thd_db: float, + log: Callable[[str], None]) -> tuple[TestResult, float]: + """Find the smallest microphone drive that gives a clean measurement. + + Steps up only, and never past ``max_v``. The microphone input is a + millivolt-level port with a preamplifier in front of it, so the useful window + is narrow: too little and the tone sits in the codec's noise, too much and the + preamplifier clips and the harmonics contaminate the fold-back test. + + Distortion is what stops the search, not just noise. Unlike the receive rig - + where the harmonic bins hold receiver noise as much as any real distortion - + the transmit measurement is taken straight off a DAC and its THD figure is + trustworthy, so it is used as the ceiling. + """ + probe_hz = 1000.0 + amplitude = start_v + trials = [] + chosen = None + + while amplitude <= max_v * 1.0001: + plan.amplitude_v = amplitude + ad2.set_tone(probe_hz, amplitude) + cap = ad2.capture_after(settle_s) + m = measure_iq_tone(cap, probe_hz, swap=plan.swap, + sideband_sign=plan.sideband_sign, + scope_range_v=ad2.cfg.scope_range_v, + scope_offset_v=ad2.cfg.scope_offset_v, + min_snr_db=min_snr_db, max_thd_db=max_thd_db, + thd_invalidates=True) + trials.append({"amplitude_v": round(amplitude, 6), **point_dict(m)}) + log(f" {amplitude*1000:6.1f} mV -> {m.level_dbv:6.1f} dBV, " + f"SNR {m.snr_db:5.1f} dB, THD {m.thd_db:6.1f} dB, " + f"suppression {m.suppression_db:5.1f} dB, peak {m.peak_v:.3f} V") + + if m.snr_db >= min_snr_db and m.thd_db <= max_thd_db and not m.clipped: + chosen = amplitude + break + amplitude *= 10.0 ** (step_db / 20.0) + + if chosen is None: + chosen = min(amplitude, max_v) + msg = (f"never reached {min_snr_db:.0f} dB SNR at under {max_thd_db:.0f} dB " + f"THD below {max_v*1000:.0f} mV; raise --max-amplitude, or the " + f"radio's mic gain with --mic-gain") + passed = False + else: + msg = f"{chosen*1000:.1f} mV" + passed = True + plan.amplitude_v = chosen + + check = Check("rig.drive_level", "rig", + "A microphone drive giving adequate SNR without distorting", + chosen * 1000.0, max_v * 1000.0, "mv", passed, message=msg) + return TestResult("autolevel", [check], {"amplitude_v": chosen, + "trials": trials}), chosen + + +# =========================================================================== +# T3 passband +# =========================================================================== + +def test_passband(inj: Injector, grid_hz: np.ndarray, nominal_tol_pct: float, + log: Callable[[str], None]) -> TestResult: + """Sweep the transmit audio response and extract its corners. + + This is the headline measurement. The high corner is set by + ``TXInterpolateBy2Again``'s filter, specified as 3039.6 Hz at -6 dB and + landing near 2.76 kHz at -3 dB, which is one of the two stages regenerated per + sample rate. The low corner is set by the equaliser bank, whose lowest cell + sits at 198 Hz and which is regenerated too. + + Both are measured as composites, with the codec's own response and the + microphone input's AC coupling in series and no way to divide them out. The + absolute checks are loose for that reason. The rate comparison in + :func:`compare_rates` is not, and is where the answer actually comes from. + """ + points = [] + freqs, levels, suppression, carrier = [], [], [], [] + + for f in grid_hz: + m, _ = inj.point(float(f)) + points.append(point_dict(m)) + if m.valid: + freqs.append(float(f)) + levels.append(m.level_dbv) + suppression.append(m.suppression_db) + carrier.append(m.carrier_dbc) + + ref_db = passband_reference_db(freqs, levels, PASSBAND_LO_HZ, PASSBAND_HI_HZ) + ripple = sweep_ripple_db(freqs, levels, PASSBAND_LO_HZ, PASSBAND_HI_HZ) + mid = 0.5 * (PASSBAND_LO_HZ + PASSBAND_HI_HZ) + + hi_3db = corner_from_sweep(freqs, levels, ref_db - 3.0, side="high", from_hz=mid) + hi_6db = corner_from_sweep(freqs, levels, ref_db - 6.0, side="high", from_hz=mid) + lo_3db = corner_from_sweep(freqs, levels, ref_db - 3.0, side="low", from_hz=mid) + + log(f" passband reference {ref_db:.1f} dBV, ripple {ripple:.2f} dB") + log(f" -3 dB corners: {lo_3db:.1f} Hz low, {hi_3db:.1f} Hz high " + f"(-6 dB at {hi_6db:.1f} Hz)") + + checks: list[Check] = [] + valid_in_band = [p for p in points + if PASSBAND_LO_HZ <= p["f_audio_hz"] <= PASSBAND_HI_HZ + and p["valid"]] + in_band = [p for p in points + if PASSBAND_LO_HZ <= p["f_audio_hz"] <= PASSBAND_HI_HZ] + frac = len(valid_in_band) / len(in_band) if in_band else 0.0 + checks.append(Check( + "passband.coverage", "passband", + "Most of the passband gives a usable measurement", + 100.0 * frac, 95.0, "percent", frac >= 0.95, + message=f"{len(valid_in_band)}/{len(in_band)} points valid between " + f"{PASSBAND_LO_HZ:.0f} and {PASSBAND_HI_HZ:.0f} Hz")) + + # A passband flat to a small fraction of a decibel across an octave and a + # half is not a passband, it is a limiter. The equaliser's reconstruction + # ripples by a few tenths of a decibel, so some variation is expected. + checks.append(Check( + "passband.ripple", "passband", + "Transmit passband is flat, but not suspiciously flat", + clean(ripple), 3.0, "db", + bool(np.isfinite(ripple) and ripple <= 3.0), + message=(f"{ripple:.2f} dB peak to peak" if np.isfinite(ripple) + else "not measured"))) + + nominal_hi = bt.TX_AUDIO_CORNER_3DB_HZ + hi_err = pct_delta(nominal_hi, hi_3db) + checks.append(Check( + "passband.hi_corner_nominal", "passband", + f"High corner is near the {nominal_hi:.0f} Hz the offline stage " + f"measurement gives", + clean(hi_err), nominal_tol_pct, "percent", + bool(np.isfinite(hi_err) and abs(hi_err) <= nominal_tol_pct), + skipped=not np.isfinite(hi_3db), + message=(f"{hi_3db:.1f} Hz measured against {nominal_hi:.0f} Hz " + f"({hi_err:+.1f}%); the equaliser bank is in series and cannot " + f"be taken out over CAT" if np.isfinite(hi_3db) + else "no -3 dB crossing inside the sweep"))) + + nominal_lo = bt.TX_AUDIO_LOW_CORNER_HZ + checks.append(Check( + "passband.lo_corner_sane", "passband", + f"Low corner is somewhere near the {nominal_lo:.0f} Hz lowest " + f"equaliser cell", + clean(lo_3db), None, "hz", + bool(np.isfinite(lo_3db) and 100.0 <= lo_3db <= 400.0), + skipped=not np.isfinite(lo_3db), + message=(f"{lo_3db:.1f} Hz; the microphone input's AC coupling is in " + f"series with the equaliser here, so this is a sanity bound " + f"rather than a specification" if np.isfinite(lo_3db) + else "no -3 dB crossing below the passband inside the sweep"))) + + return TestResult("passband", checks, { + "points": points, + "reference_dbv": clean(ref_db), + "ripple_db": clean(ripple), + "corner_lo_3db_hz": clean(lo_3db), + "corner_hi_3db_hz": clean(hi_3db), + "corner_hi_6db_hz": clean(hi_6db), + "passband_window_hz": [PASSBAND_LO_HZ, PASSBAND_HI_HZ], + "suppression_points": [{"f_audio_hz": round(f, 2), "suppression_db": clean(s)} + for f, s in zip(freqs, suppression)], + "carrier_points": [{"f_audio_hz": round(f, 2), "carrier_dbc": clean(c)} + for f, c in zip(freqs, carrier)], + }) + + +# =========================================================================== +# T4 sideband suppression +# =========================================================================== + +def test_sideband_suppression(passband: TestResult, rate_hz: int, + min_suppression_db: float, + log: Callable[[str], None]) -> TestResult: + """Judge the opposite-sideband suppression measured during the sweep. + + No extra captures: suppression comes free with every point of the passband + sweep, because both sides of DC are present in the same complex spectrum. + + What this measures is the Hilbert transform's quadrature accuracy, the per-band + I/Q amplitude and phase correction, and any gain difference between the two + exciter outputs - lumped together, because from the exciter's terminals they + are not separable. + + Unlike everything else here, this is checked against a **floor** rather than + for rate invariance. The Hilbert table is not regenerated per rate, and that + is correct: a Hilbert transformer's usable band is a fraction of its sample + rate, so one fixed table is the same design at any rate and its edges are + *meant* to move with Fs. Requiring the suppression curve to hold still in + hertz would fail correct firmware. + """ + pts = passband.data.get("suppression_points", []) + freqs = [p["f_audio_hz"] for p in pts] + supp = [p["suppression_db"] for p in pts] + + f_worst, worst = worst_in_band(freqs, supp, PASSBAND_LO_HZ, + bt.TX_AUDIO_CORNER_3DB_HZ) + f_best, best = worst_in_band(freqs, supp, PASSBAND_LO_HZ, + bt.TX_AUDIO_CORNER_3DB_HZ, best=True) + log(f" worst {worst:.1f} dB at {f_worst:.0f} Hz, " + f"best {best:.1f} dB at {f_best:.0f} Hz") + + checks = [Check( + "sideband.worst", "sideband", + "Opposite sideband is suppressed across the transmit passband", + clean(worst), min_suppression_db, "db", + bool(np.isfinite(worst) and worst >= min_suppression_db), + skipped=not np.isfinite(worst), + message=(f"worst case {worst:.1f} dB at {f_worst:.0f} Hz" + if np.isfinite(worst) else "not measured"))] + + return TestResult("sideband_suppression", checks, { + "worst_db": clean(worst), + "worst_at_hz": clean(f_worst), + "best_db": clean(best), + "best_at_hz": clean(f_best), + "hilbert_band_hz": list(bt.hilbert_band_hz(rate_hz)), + "points": pts, + }) + + +# =========================================================================== +# T5 out-of-band rejection and fold-back +# =========================================================================== + +#: How close to the measured noise floor a spur reading may sit before it is +#: reported as floor limited rather than as a real level. +FLOOR_MARGIN_DB = 3.0 + + +def measure_noise_floor_dbc(ad2: TxAd2, plan: TxPlan, settle_s: float, + reference_v: float, probe_hz: Sequence[float]) -> float: + """Spur level the rig reads with nothing driving the microphone. + + Measured exactly the way a spur is measured - the same windowed peak search + over the same width - so the two are directly comparable. Without this a + reading of "-33 dBc" is ambiguous: it could be a real product or it could be + the floor, and the difference decides whether a pass means anything. + """ + ad2.set_tone(1000.0, 0.0) + cap = ad2.capture_after(settle_s) + levels = [spur_level_dbc(cap, plan.swap, f, reference_v) for f in probe_hz] + finite = [v for v in levels if np.isfinite(v)] + return max(finite) if finite else float("nan") + + +def test_alias(inj: Injector, plan: TxPlan, reference_v: float, + grid_hz: np.ndarray, min_rejection_db: float, + max_fold_dbc: float, log: Callable[[str], None]) -> TestResult: + """Drive the microphone above the passband and look for what comes through. + + Two different things happen depending on where the probe sits, and they are + checked over different frequency ranges rather than lumped together: + + * **Direct rejection**, between the stopband boundary and the fold point. + Here the tone can still reach the output at its own frequency and must be + attenuated. Below :data:`bandtable.TX_STOPBAND_FROM_HZ` it is on the + transition skirt - the cascade is only about 20 dB down at 3.45 kHz, and + correctly so - which is why the sweep starts where the stopband starts. + * **Fold-back**, above the fold point. ``TXDecimateBy2Again`` halves the + audio rate, so a tone above a quarter of that rate cannot appear at its own + frequency at all: it can only reappear folded, at 192 ksps a microphone + tone at 8 kHz landing on 4 kHz. This is the failure ``TX_DECIMATE3_FC_HZ`` + was added to fix - the table it replaced was flat well past the fold point. + The fold frequencies scale with the sample rate, so where to look changes + per rate. + + Both are read against the rig's own noise floor, measured with the microphone + silent, and reported as floor limited when they sit on it. + + One honest caveat, which the report repeats: the equaliser bank runs *before* + the decimator and its highest cell is at 4 kHz, so it attenuates an 8 kHz + input substantially on its own. A clean result here therefore proves nothing + folds back into the transmitted audio - which is what matters operationally - + but it does not by itself prove the decimator's own stopband is intact. The + offline test ``TransmitChain176k.DecimatorStopsBeforeTheFoldPoint`` covers + that directly, by evaluating the tap set at the fold point. + """ + points = [] + checks: list[Check] = [] + fold = plan.fold_hz + nyquist = bt.nyquist_after_fold_hz(plan.rate_hz) + + floor_dbc = measure_noise_floor_dbc( + inj.ad2, plan, inj.settle_s, reference_v, + [0.35 * nyquist, 0.6 * nyquist, 0.85 * nyquist]) + log(f" noise floor {floor_dbc:.1f} dBc with the microphone silent") + + worst_direct = -999.0 + worst_direct_at = float("nan") + worst_fold = -999.0 + worst_fold_at = float("nan") + + for f in grid_hz: + f = float(f) + m, cap = inj.point(f) + + # Above the fold point there is nothing at f to measure: the stream after + # the decimation does not reach that far. Only the folded product exists. + folds = f > nyquist + direct_dbc = (m.level_dbv - to_db(reference_v)) if not folds else float("nan") + + f_alias = bt.alias_of_hz(f, plan.rate_hz) + fold_dbc = (spur_level_dbc(cap, plan.swap, f_alias, reference_v) + if folds and abs(f_alias - f) > 100.0 else float("nan")) + + points.append({ + "f_audio_hz": round(f, 2), + "region": "fold" if folds else "direct", + "direct_dbc": clean(direct_dbc), + "f_alias_hz": clean(f_alias) if folds else None, + "fold_dbc": clean(fold_dbc), + "snr_db": clean(m.snr_db), + "clipped": m.clipped, + }) + if folds: + log(f" {f:7.0f} Hz -> folds to {f_alias:6.0f} Hz at " + f"{fold_dbc:7.1f} dBc") + else: + log(f" {f:7.0f} Hz -> direct {direct_dbc:7.1f} dBc") + + if np.isfinite(direct_dbc) and direct_dbc > worst_direct: + worst_direct, worst_direct_at = direct_dbc, f + if np.isfinite(fold_dbc) and fold_dbc > worst_fold: + worst_fold, worst_fold_at = fold_dbc, f + + def floor_limited(value: float) -> bool: + return bool(np.isfinite(floor_dbc) and np.isfinite(value) + and value <= floor_dbc + FLOOR_MARGIN_DB) + + if worst_direct > -998.0: + limited = floor_limited(worst_direct) + checks.append(Check( + "alias.direct_rejection", "alias", + f"Microphone audio between {bt.TX_STOPBAND_FROM_HZ:.0f} Hz and the " + f"{nyquist:.0f} Hz fold point is not transmitted", + clean(worst_direct), -min_rejection_db, "dbc", + bool(worst_direct <= -min_rejection_db), + message=f"worst {worst_direct:.1f} dBc at {worst_direct_at:.0f} Hz " + f"(limit {-min_rejection_db:.0f} dBc" + + (f", at the {floor_dbc:.1f} dBc noise floor, so the true " + f"rejection is greater" if limited else "") + + f"). The design predicts about " + f"{bt.TX_STOPBAND_PREDICTED_DB:.0f} dB here")) + else: + checks.append(Check( + "alias.direct_rejection", "alias", + "Microphone audio above the transmit passband is not transmitted", + None, -min_rejection_db, "dbc", True, skipped=True, + message=f"no probe frequency fell between " + f"{bt.TX_STOPBAND_FROM_HZ:.0f} Hz and the {nyquist:.0f} Hz " + f"fold point")) + + if worst_fold > -998.0: + limited = floor_limited(worst_fold) + checks.append(Check( + "alias.fold_back", "alias", + f"Nothing folds back into the passband when the audio rate halves " + f"about {fold/2:.0f} Hz", + clean(worst_fold), max_fold_dbc, "dbc", + bool(worst_fold <= max_fold_dbc), + message=f"worst fold-back product {worst_fold:.1f} dBc, from a " + f"{worst_fold_at:.0f} Hz input landing at " + f"{bt.alias_of_hz(worst_fold_at, plan.rate_hz):.0f} Hz " + f"(limit {max_fold_dbc:.0f} dBc" + + (f", at the {floor_dbc:.1f} dBc noise floor, so nothing " + f"measurable folded" if limited else "") + ")")) + else: + checks.append(Check( + "alias.fold_back", "alias", + "Nothing folds back into the passband when the audio rate halves", + None, max_fold_dbc, "dbc", True, skipped=True, + message=f"no probe frequency above the {nyquist:.0f} Hz fold point " + f"produced a measurable product")) + + return TestResult("alias", checks, { + "points": points, + "reference_v": clean(reference_v), + "noise_floor_dbc": clean(floor_dbc), + "fold_hz": clean(fold), + "nyquist_after_fold_hz": clean(nyquist), + "stopband_from_hz": bt.TX_STOPBAND_FROM_HZ, + "worst_direct_dbc": clean(worst_direct) if worst_direct > -998.0 else None, + "worst_direct_at_hz": clean(worst_direct_at), + "worst_direct_floor_limited": floor_limited(worst_direct), + "worst_fold_dbc": clean(worst_fold) if worst_fold > -998.0 else None, + "worst_fold_at_hz": clean(worst_fold_at), + "worst_fold_floor_limited": floor_limited(worst_fold), + }) + + +# =========================================================================== +# T6 carrier leakage +# =========================================================================== + +def test_carrier(passband: TestResult, max_carrier_dbc: float, + log: Callable[[str], None]) -> TestResult: + """Judge the DC sitting on the exciter outputs. + + ``PlayIQData`` adds ``ED.DCOffsetI`` and ``DCOffsetQ`` to every block to null + the transmitter's carrier, so DC on these outputs is deliberate and its + residual is what the carrier calibration achieved. Nothing about it is + sample-rate dependent, so this is reported as a diagnostic and checked only + against a generous ceiling - a large residue here would raise the noise floor + of every other measurement in the run. + """ + pts = passband.data.get("carrier_points", []) + values = [p["carrier_dbc"] for p in pts if p["carrier_dbc"] is not None] + worst = max(values) if values else float("nan") + median = float(np.median(values)) if values else float("nan") + log(f" carrier residue {median:.1f} dBc median, {worst:.1f} dBc worst") + + checks = [Check( + "carrier.residue", "carrier", + "Carrier nulling leaves the exciter outputs close to their bias", + clean(worst), max_carrier_dbc, "dbc", + bool(np.isfinite(worst) and worst <= max_carrier_dbc), + skipped=not np.isfinite(worst), + message=(f"worst {worst:.1f} dBc, median {median:.1f} dBc relative to the " + f"transmitted tone" if np.isfinite(worst) else "not measured"))] + + return TestResult("carrier", checks, { + "worst_dbc": clean(worst), + "median_dbc": clean(median), + "points": pts, + }) + + +# =========================================================================== +# Cross-rate comparison - the headline result +# =========================================================================== + +def _compare_scalar(label: str, group: str, ident: str, per_rate: dict, + extract: Callable[[dict], Optional[float]], + nominal_hz: Optional[float], rate_tol_pct: float, + nominal_tol_pct: float) -> tuple[Optional[dict], list]: + """Compare one scalar frequency across sample rates.""" + rates = sorted(per_rate) + if len(rates) < 2: + return None, [] + + base_rate = max(rates) # 192000 is the historical reference + other_rates = [r for r in rates if r != base_rate] + + measured = {r: extract(per_rate[r]) for r in rates} + base_val = measured[base_rate] + worst_delta = 0.0 + measurable = base_val is not None + + for r in other_rates: + val = measured[r] + if val is None or base_val is None: + measurable = False + continue + d = pct_delta(base_val, val) + if abs(d) > abs(worst_delta): + worst_delta = d + + legacy_consistent = (measurable + and abs(worst_delta - bt.LEGACY_DELTA_PCT) < 2.0) + nominal_err = (pct_delta(nominal_hz, base_val) + if base_val is not None and nominal_hz else float("nan")) + + row = { + "id": ident, + "label": label, + "nominal_hz": nominal_hz, + "value_hz": {str(r): clean(measured[r]) for r in rates}, + "delta_pct": clean(worst_delta) if measurable else None, + "legacy_predicted_delta_pct": bt.LEGACY_DELTA_PCT, + "legacy_consistent": legacy_consistent, + "nominal_error_pct": clean(nominal_err), + "verdict": ("PASS" if measurable and abs(worst_delta) <= rate_tol_pct + else "SKIP" if not measurable else "FAIL"), + } + + msg = (f"{base_val:.1f} Hz at {base_rate} sps vs " + f"{measured[other_rates[0]]:.1f} Hz at {other_rates[0]} sps" + if measurable else "not measured at both rates") + if legacy_consistent: + msg += (f" - this matches the {bt.LEGACY_DELTA_PCT:.3f}% shift the frozen " + f"coefficient tables used to produce") + + checks = [Check( + f"{group}.{ident}.rate_invariance", group, + f"{label} holds across sample rates", + clean(worst_delta) if measurable else None, rate_tol_pct, "percent", + bool(measurable and abs(worst_delta) <= rate_tol_pct), + skipped=not measurable, message=msg)] + + if measurable and nominal_hz: + checks.append(Check( + f"{group}.{ident}.nominal", group, + f"{label} is near its expected {nominal_hz:.0f} Hz", + clean(nominal_err), nominal_tol_pct, "percent", + bool(np.isfinite(nominal_err) and abs(nominal_err) <= nominal_tol_pct), + message=f"measured {base_val:.1f} Hz against {nominal_hz:.0f} Hz")) + + return row, checks + + +def compare_rates(per_rate: dict, rate_tol_pct: float, + nominal_tol_pct: float) -> tuple[dict, list]: + """Roll every per-rate measurement up into the cross-rate verdict.""" + comparison: dict = {"corners": []} + checks: list[Check] = [] + + for ident, label, key, nominal in ( + ("hi_3db", "Transmit audio high corner (-3 dB)", + "corner_hi_3db_hz", bt.TX_AUDIO_CORNER_3DB_HZ), + ("hi_6db", "Transmit audio high corner (-6 dB)", + "corner_hi_6db_hz", None), + ("lo_3db", "Transmit audio low corner (-3 dB)", + "corner_lo_3db_hz", bt.TX_AUDIO_LOW_CORNER_HZ)): + row, row_checks = _compare_scalar( + label, "corner", ident, per_rate, + extract=lambda d, k=key: d.get("passband", {}).get(k), + nominal_hz=nominal, rate_tol_pct=rate_tol_pct, + # The low corner has the microphone input's AC coupling in series and + # the -6 dB corner has no independently measured reference, so only + # the -3 dB high corner is judged on absolute accuracy at full + # strength. + nominal_tol_pct=nominal_tol_pct if ident == "hi_3db" else 25.0) + if row is not None: + comparison["corners"].append(row) + checks += row_checks + + # Sideband suppression is not compared for rate invariance in hertz - the + # Hilbert table is meant to scale with Fs - but a large change in the worst + # case between rates still says something went wrong, so it is reported. + supp = {r: per_rate[r].get("sideband_suppression", {}).get("worst_db") + for r in per_rate} + if len([v for v in supp.values() if v is not None]) > 1: + rates = sorted(supp) + base = max(rates) + other = [r for r in rates if r != base][0] + comparison["sideband_suppression"] = { + "worst_db": {str(r): clean(supp[r]) for r in rates}, + "delta_db": clean(supp[other] - supp[base]), + } + + fold = {r: per_rate[r].get("alias", {}).get("worst_fold_dbc") for r in per_rate} + if any(v is not None for v in fold.values()): + comparison["fold_back"] = {"worst_dbc": {str(r): clean(fold[r]) + for r in sorted(fold)}} + + carrier = {r: per_rate[r].get("carrier", {}).get("worst_dbc") for r in per_rate} + if any(v is not None for v in carrier.values()): + comparison["carrier"] = {"worst_dbc": {str(r): clean(carrier[r]) + for r in sorted(carrier)}} + + return comparison, checks diff --git a/code/tools/tx_filter_hil/tx_filter_hil_test.py b/code/tools/tx_filter_hil/tx_filter_hil_test.py new file mode 100644 index 0000000..9130a5d --- /dev/null +++ b/code/tools/tx_filter_hil/tx_filter_hil_test.py @@ -0,0 +1,520 @@ +#!/usr/bin/env python3 +"""Verify the Phoenix transmit filters hold their frequencies across sample rates. + +Injects a tone into the radio's microphone input with an Analog Discovery 2, +captures the exciter's I and Q outputs synchronously, and measures where the +transmit audio filters actually sit - at every sample rate under test. + + W1 -> the radio's microphone input + Scope Ch1 -> exciter I output (order is auto-detected) + Scope Ch2 -> exciter Q output + /dev/ttyACM1 -> CAT control at 38400 + /dev/ttyACM0 -> diagnostic port at 115200 (needed for the ED settings dump) + +The radio is keyed over CAT for the duration of each sweep. Nothing here limits +RF output, so run it with the exciter feeding the scope only, or with a dummy +load fitted. + +Exit codes: 0 pass, 1 fail, 2 error (no hardware, or preflight refused to run), +3 aborted (radio may be left keyed - the suite unkeys on the way out, but check). + +See README.md for wiring detail and how to read the output. +""" + +from __future__ import annotations + +import argparse +import os +import sys +import time + +import numpy as np + +# Allow running as a script from anywhere, not only as a package module. The +# parent directory has to be on the path either way: this suite imports the CAT +# plumbing and the scalar curve fitting from the sibling filter_hil package. +_TOOLS_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +if _TOOLS_DIR not in sys.path: + sys.path.insert(0, _TOOLS_DIR) + +if __package__ in (None, ""): + from tx_filter_hil import bandtable as bt + from tx_filter_hil import report as report_mod + from tx_filter_hil import tests as T + from tx_filter_hil.ad2 import DwfError, TxAd2, TxAd2Config + from tx_filter_hil.measure import geom_grid +else: + from . import bandtable as bt + from . import report as report_mod + from . import tests as T + from .ad2 import DwfError, TxAd2, TxAd2Config + from .measure import geom_grid + +from filter_hil.radio import (MOD_LSB, MOD_USB, CatError, Radio, # noqa: E402 + RadioStateGuard) + +REPO_ROOT = os.path.dirname(os.path.dirname(_TOOLS_DIR)) +ALL_TESTS = ("wiring", "level", "passband", "sideband", "alias", "carrier") +DEFAULT_TESTS = ALL_TESTS + + +def build_parser() -> argparse.ArgumentParser: + p = argparse.ArgumentParser( + description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + + g = p.add_argument_group("selection") + g.add_argument("--rates", default="192000,176400", + help="sample rates to test, in order (default: %(default)s)") + g.add_argument("--tests", default=",".join(DEFAULT_TESTS), + help=f"tests to run, from {','.join(ALL_TESTS)} " + f"(default: %(default)s)") + g.add_argument("--modulation", choices=("usb", "lsb"), default="usb", + help="sideband to transmit on for the run (default: %(default)s)") + + g = p.add_argument_group("serial") + g.add_argument("--cat-port", default="/dev/ttyACM1") + g.add_argument("--diag-port", default="/dev/ttyACM0") + g.add_argument("--cat-baud", type=int, default=38400) + g.add_argument("--diag-baud", type=int, default=115200) + g.add_argument("--cat-timeout", type=float, default=0.5) + + g = p.add_argument_group("analog discovery") + g.add_argument("--scope-rate", type=float, default=100000.0, + help="scope sample rate, Hz. Deliberately not a divisor of the " + "radio's 192 kHz output rate, so DAC images do not alias " + "onto the measured tone (default: %(default)s)") + g.add_argument("--capture", type=float, default=0.25, + help="seconds per capture (default: %(default)s)") + g.add_argument("--scope-range", type=float, default=5.0, + help="scope input range, volts peak to peak (default: %(default)s)") + g.add_argument("--scope-offset", type=float, default=1.6, + help="scope input offset, volts. The exciter outputs sit on a " + "DC bias near this (default: %(default)s)") + g.add_argument("--awg-offset", type=float, default=0.0) + g.add_argument("--force-swap", choices=("yes", "no"), default=None, + help="skip wiring detection and force whether Ch1 is on Q") + g.add_argument("--force-sideband", type=int, choices=(1, -1), default=None, + help="force which side of DC the wanted energy is on") + + g = p.add_argument_group("drive level") + g.add_argument("--start-amplitude", type=float, default=0.005, + help="initial AWG amplitude into the mic input, volts peak " + "(default: %(default)s)") + g.add_argument("--max-amplitude", type=float, default=0.25, + help="never drive the microphone input harder than this, volts " + "peak. It is a millivolt-level port with a preamplifier " + "in front of it (default: %(default)s)") + g.add_argument("--amp-step-db", type=float, default=3.0) + g.add_argument("--min-snr", type=float, default=25.0, + help="a point below this is not used in fits (default: %(default)s)") + g.add_argument("--max-thd", type=float, default=-30.0, + help="stop raising the drive once distortion passes this " + "(default: %(default)s)") + g.add_argument("--mic-gain", type=float, default=None, + help="set the radio's mic gain to this many dB for the run, " + "-40 to +30. Default: leave it alone") + + g = p.add_argument_group("timing") + g.add_argument("--settle", type=float, default=0.25, + help="seconds after changing the tone (default: %(default)s)") + g.add_argument("--rate-settle", type=float, default=2.0, + help="seconds after a sample rate change (default: %(default)s)") + g.add_argument("--ptt-settle", type=float, default=1.0, + help="seconds after keying before the first capture " + "(default: %(default)s)") + g.add_argument("--passband-points", type=int, default=41, + help="points in the passband sweep, 100 Hz to 4 kHz " + "(default: %(default)s)") + g.add_argument("--alias-points", type=int, default=17, + help="points in the out-of-band sweep (default: %(default)s)") + + g = p.add_argument_group("tolerances") + g.add_argument("--rate-tol-pct", type=float, default=2.5, + help="primary criterion: how far a corner may move between " + "rates. Looser than the receive suite's 1.5 because both " + "generated transmit stages are 48-tap Kaiser designs, " + "which do not scale exactly: evaluating the tap sets " + "directly gives 1.2%% of movement on a correct radio, and " + "the firmware's own offline test allows 2%%. The bug being " + "hunted is -8.125%% (default: %(default)s)") + g.add_argument("--nominal-tol-pct", type=float, default=8.0, + help="secondary: distance from the offline stage measurement. " + "Loose because the equaliser bank and the codec front end " + "are in series and cannot be removed (default: %(default)s)") + g.add_argument("--min-suppression", type=float, default=25.0, + help="required opposite-sideband suppression across the " + "passband, dB (default: %(default)s)") + g.add_argument("--min-oob-rejection", type=float, default=30.0, + help="required rejection of microphone audio between the " + "stopband boundary and the fold point, dB. The design " + "predicts about 52 dB there, so this leaves margin " + "against a regression while staying clear of the rig's " + "own noise floor (default: %(default)s)") + g.add_argument("--max-fold-dbc", type=float, default=-50.0, + help="loudest fold-back product allowed, dBc (default: %(default)s)") + g.add_argument("--max-carrier-dbc", type=float, default=-20.0, + help="loudest carrier residue allowed, dBc (default: %(default)s)") + + g = p.add_argument_group("output") + g.add_argument("--out-dir", default=None, + help="default: results/ next to this script") + g.add_argument("--prefix", default="tx_filter_hil") + g.add_argument("--json", default=None) + g.add_argument("--markdown", default=None) + g.add_argument("--no-plots", action="store_true") + g.add_argument("-v", "--verbose", action="store_true") + g.add_argument("-q", "--quiet", action="store_true") + + g = p.add_argument_group("safety") + g.add_argument("--no-restore", action="store_true", + help="leave the radio in the test configuration") + g.add_argument("--dry-run", action="store_true", + help="validate arguments and the report path without hardware") + return p + + +def run(args, argv) -> int: + started = time.monotonic() + quiet = args.quiet + + def log(msg: str = "") -> None: + if not quiet: + print(msg, file=sys.stderr) + + out_dir = args.out_dir or os.path.join(os.path.dirname(os.path.abspath(__file__)), + "results") + stamp = time.strftime("%Y%m%d_%H%M%S") + json_path = args.json or os.path.join(out_dir, f"{args.prefix}_{stamp}.json") + md_path = args.markdown or os.path.join(out_dir, f"{args.prefix}_{stamp}.md") + + rates = [int(r) for r in args.rates.split(",") if r.strip()] + selected = [t.strip() for t in args.tests.split(",") if t.strip()] + modulation = MOD_USB if args.modulation == "usb" else MOD_LSB + + for r in rates: + if r not in bt.SAMPLE_RATES_HZ: + print(f"error: {r} is not a CAT-selectable sample rate " + f"(choose from {bt.SAMPLE_RATES_HZ})", file=sys.stderr) + return 2 + unknown = [t for t in selected if t not in ALL_TESTS] + if unknown: + print(f"error: unknown test(s) {', '.join(unknown)}; choose from " + f"{', '.join(ALL_TESTS)}", file=sys.stderr) + return 2 + if args.mic_gain is not None and not -40.0 <= args.mic_gain <= 30.0: + print(f"error: --mic-gain {args.mic_gain} is outside the -40 to +30 dB " + f"the MG command covers", file=sys.stderr) + return 2 + + if args.scope_rate > 250000: + log("WARNING: scope rates above 250 kHz drop samples in record mode.") + if abs(192000.0 % args.scope_rate) < 1.0 or abs(176400.0 % args.scope_rate) < 1.0: + log(f"WARNING: {args.scope_rate:.0f} Hz divides one of the radio's output " + f"rates. Exciter DAC images will alias onto the measured tone and " + f"limit the sideband suppression that can be read.") + + config = {k: v for k, v in vars(args).items()} + config["resolved"] = {"json": json_path, "markdown": md_path, + "rates": rates, "tests": selected} + + if args.dry_run: + doc = report_mod.build_tx_document( + provenance=report_mod.collect_provenance(argv, REPO_ROOT), + config=config, rig={}, baseline={}, final={}, state_restored=True, + residual_diff={}, per_rate={}, comparison={}, checks=[], + duration_s=time.monotonic() - started, + warnings=["dry run: no hardware touched"]) + report_mod.write_json(doc, json_path) + report_mod.write_markdown(doc, md_path) + print(f"Dry run OK. Wrote {json_path} and {md_path}") + return 0 + + warnings: list[str] = [] + per_rate: dict = {} + all_checks: list = [] + rig: dict = {} + baseline_summary: dict = {} + final_summary: dict = {} + residual: dict = {} + restored = False + key_down_s = 0.0 + + cfg = TxAd2Config(scope_rate_hz=args.scope_rate, capture_s=args.capture, + scope_range_v=args.scope_range, + scope_offset_v=args.scope_offset, + awg_offset_v=args.awg_offset) + + try: + with TxAd2(cfg, log=log) as ad2, Radio( + args.cat_port, args.diag_port, args.cat_baud, args.diag_baud, + args.cat_timeout, log=log) as radio: + + ad2.configure_scope() + + log("\n== Preflight ==") + pre, ed = T.run_preflight(radio, log) + all_checks += pre.checks + baseline_summary = dict(pre.data["ed"]) + baseline_summary["id"] = pre.data["id"] + + if ed.sample_rate_hz not in bt.SAMPLE_RATES_HZ: + print(f"error: radio reports sample rate {ed.sample_rate_hz}, which " + f"this suite cannot restore. Set it from the menu first.", + file=sys.stderr) + return 2 + + keyed = False + key_down_start = 0.0 + + def key() -> None: + nonlocal keyed, key_down_start + if not keyed: + radio.ptt_press(args.ptt_settle) + key_down_start = time.monotonic() + keyed = True + + def unkey() -> None: + """Drop PTT and account for the time spent transmitting.""" + nonlocal keyed, key_down_s + if keyed: + key_down_s += time.monotonic() - key_down_start + keyed = False + radio.ptt_release() + + with RadioStateGuard(radio, ed, log=log) as guard: + if args.no_restore: + guard.restored = True # registered restores will be skipped + + guard.on_restore("sample rate", + lambda r=ed.sample_rate_hz: radio.set_sample_rate( + r, args.rate_settle)) + mod0 = ed.active_modulation + guard.on_restore("modulation", lambda m=mod0: radio.set_modulation(m)) + if args.mic_gain is not None: + guard.on_restore( + "mic gain", + lambda v=ed.mic_gain_db: radio.set_mic_gain_pct( + Radio.mic_gain_pct_from_db(v))) + radio.set_mic_gain_pct(Radio.mic_gain_pct_from_db(args.mic_gain)) + log(f"Mic gain set to {args.mic_gain:.0f} dB " + f"(was {ed.mic_gain_db} dB)") + + # Registered last so it runs *first*: RadioStateGuard replays its + # restores newest to oldest, and every restore above assumes the + # radio is receiving. Changing the sample rate mid-transmission in + # particular reconfigures the I2S clock under a running chain. + guard.on_restore("transmit off", unkey) + + # TXGain scales the exciter output by a factor derived from the + # requested power, so a power change mid-run would move every + # level measured. It is read, reported and left alone. + power_w = ed.active_power_ssb + log(f"Requested SSB power {power_w:.0f} W - left untouched; " + f"TXGain derives the exciter drive from it") + + radio.set_modulation(modulation) + time.sleep(0.5) + + passband_grid = geom_grid(100.0, 4400.0, args.passband_points) + + # -- rig characterisation, once, at the starting rate ------ + key() + swap = (args.force_swap == "yes") if args.force_swap else False + sideband_sign = args.force_sideband or 1 + plan = T.TxPlan(rate_hz=ed.sample_rate_hz, modulation=modulation, + swap=swap, sideband_sign=sideband_sign, + amplitude_v=args.start_amplitude) + + if "wiring" in selected: + log("\n== Detecting the wiring order and sideband ==") + res, swap, sideband_sign = T.detect_wiring( + ad2, radio, plan, args.settle, args.min_suppression, + args.max_amplitude, modulation, log) + all_checks += res.checks + rig.update(res.data) + fatal = next((c for c in res.checks + if c.id == "rig.suppression"), None) + if fatal is not None and not fatal.passed: + log("Cannot proceed without both exciter outputs " + "connected in quadrature.") + ad2.awg_off() + return 1 + plan.swap, plan.sideband_sign = swap, sideband_sign + plan.modulation = modulation + + amplitude = args.start_amplitude + if "level" in selected: + log("\n== Choosing a microphone drive level ==") + res, amplitude = T.autolevel( + ad2, plan, args.settle, args.start_amplitude, + args.max_amplitude, args.amp_step_db, args.min_snr, + args.max_thd, log) + all_checks += res.checks + if not res.checks[0].passed: + warnings.append(res.checks[0].message) + plan.amplitude_v = amplitude + + rig.update({ + "drive_amplitude_v": amplitude, + "scope_rate_hz": args.scope_rate, + "capture_s": args.capture, + "scope_range_v": args.scope_range, + "scope_offset_v": args.scope_offset, + "power_out_ssb_w": power_w, + "mic_gain_db": (args.mic_gain if args.mic_gain is not None + else ed.mic_gain_db), + "modulation": args.modulation, + }) + + # -- per rate ---------------------------------------------- + for rate in rates: + log(f"\n===== {rate} sps =====") + if rate != radio.get_sample_rate(): + # ChangeSampleRate() reconfigures the I2S clock and + # rebuilds every filter. Doing that mid-transmission is + # not something the firmware is asked to survive, so drop + # PTT around it. + unkey() + radio.set_sample_rate(rate, args.rate_settle) + plan.rate_hz = rate + key() + + bucket: dict = { + "rate_hz": rate, + "audio_rate_hz": bt.audio_rate_hz(rate), + "hilbert_rate_hz": bt.hilbert_rate_hz(rate), + "fold_hz": bt.fold_frequency_hz(rate), + } + inj = T.Injector(ad2, plan, args.settle, args.min_snr, + args.max_thd) + + passband = None + if "passband" in selected: + log("-- Transmit audio passband --") + passband = T.test_passband(inj, passband_grid, + args.nominal_tol_pct, log) + all_checks += passband.checks + bucket["passband"] = passband.data + + if "sideband" in selected and passband is not None: + log("-- Opposite-sideband suppression --") + res = T.test_sideband_suppression( + passband, rate, args.min_suppression, log) + all_checks += res.checks + bucket["sideband_suppression"] = res.data + + if "carrier" in selected and passband is not None: + log("-- Carrier leakage --") + res = T.test_carrier(passband, args.max_carrier_dbc, log) + all_checks += res.checks + bucket["carrier"] = res.data + + if "alias" in selected: + if passband is None: + log("-- Out-of-band and fold-back: skipped, needs the " + "passband reference --") + warnings.append("the alias test needs the passband " + "sweep for its reference level") + else: + log("-- Out-of-band rejection and fold-back --") + ref_dbv = passband.data.get("reference_dbv") + if ref_dbv is None: + warnings.append(f"no passband reference at {rate} " + f"sps; alias test skipped") + else: + ref_v = 10.0 ** (ref_dbv / 20.0) + # From where the stopband actually starts - below + # that the response is on the transition skirt and + # is meant to be only partly attenuated - up to + # just under the audio Nyquist, above which the + # codec's own decimation rather than the transmit + # chain decides what happens. + top = 0.92 * bt.audio_rate_hz(rate) / 2.0 + alias_grid = np.linspace( + bt.TX_STOPBAND_FROM_HZ, top, + args.alias_points) + res = T.test_alias( + inj, plan, ref_v, alias_grid, + args.min_oob_rejection, args.max_fold_dbc, log) + all_checks += res.checks + bucket["alias"] = res.data + + per_rate[str(rate)] = bucket + + # -- cross-rate comparison --------------------------------- + log("\n== Comparing rates ==") + comparison, cmp_checks = T.compare_rates( + per_rate, args.rate_tol_pct, args.nominal_tol_pct) + all_checks += cmp_checks + + ad2.awg_off() + unkey() + + restored = guard.restored and not args.no_restore + rig["key_down_s"] = key_down_s + log(f"\nTotal key-down time: {key_down_s:.0f} s") + + if not args.no_restore: + residual = guard.verify() + try: + final_summary = radio.dump_ed().summary() + except CatError: + final_summary = {} + if guard.failures: + warnings += guard.failures + else: + warnings.append("--no-restore: the radio was left in the test " + "configuration") + + except DwfError as exc: + print(f"error: {exc}", file=sys.stderr) + return 2 + except CatError as exc: + print(f"error: {exc}", file=sys.stderr) + return 2 + except KeyboardInterrupt: + print("\naborted - the AWG has been silenced and PTT dropped, but check " + "that the radio is receiving", file=sys.stderr) + return 3 + + doc = report_mod.build_tx_document( + provenance=report_mod.collect_provenance(argv, REPO_ROOT, + dwf_version=ad2.version), + config=config, rig=rig, baseline=baseline_summary, final=final_summary, + state_restored=restored, residual_diff=residual, per_rate=per_rate, + comparison=comparison, checks=all_checks, + duration_s=time.monotonic() - started, warnings=warnings) + + report_mod.write_json(doc, json_path) + doc["artifacts"]["json"] = json_path + + png_paths: list = [] + if not args.no_plots: + try: + if __package__ in (None, ""): + from tx_filter_hil.plot_tx_filter_hil import render_all + else: + from .plot_tx_filter_hil import render_all + png_paths = render_all(doc, out_dir, f"{args.prefix}_{stamp}") + doc["artifacts"]["png"] = png_paths + except Exception as exc: + warnings.append(f"could not render plots: {exc}") + doc["warnings"] = warnings + + report_mod.write_markdown(doc, md_path, png_paths) + doc["artifacts"]["markdown"] = md_path + report_mod.write_json(doc, json_path) + + report_mod.print_summary(doc) + return 0 if doc["summary"]["overall"] == "PASS" else 1 + + +def main() -> int: + argv = sys.argv[1:] + args = build_parser().parse_args(argv) + return run(args, ["tx_filter_hil_test.py"] + argv) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/code/tools/usb_audio_test.py b/code/tools/usb_audio_test.py new file mode 100755 index 0000000..d43c824 --- /dev/null +++ b/code/tools/usb_audio_test.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python3 +""" +USB Audio Test - 1 kHz Sine Wave Generator + +Outputs a 1 kHz sine wave to a USB audio device for testing the +PC to Teensy USB audio path. + +Requirements: + pip install sounddevice numpy + +Usage: + python usb_audio_test.py # List devices and use default + python usb_audio_test.py -d 5 # Use device index 5 + python usb_audio_test.py -l # List devices only + python usb_audio_test.py -f 800 # Use 800 Hz instead of 1000 Hz + python usb_audio_test.py -a 0.5 # Set amplitude to 0.5 (50%) +""" + +import argparse +import sys +import time +import numpy as np + +try: + import sounddevice as sd +except ImportError: + print("Error: sounddevice not installed. Run: pip install sounddevice") + sys.exit(1) + + +def list_devices(): + """List all available audio devices.""" + print("\nAvailable audio devices:") + print("-" * 60) + devices = sd.query_devices() + for i, dev in enumerate(devices): + # Show output devices (max_output_channels > 0) + if dev['max_output_channels'] > 0: + marker = " <-- default" if i == sd.default.device[1] else "" + print(f" [{i:2d}] {dev['name'][:45]:<45} (out: {dev['max_output_channels']}ch){marker}") + print("-" * 60) + + +def generate_sine_wave(frequency, sample_rate, duration): + """Generate a sine wave.""" + t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False) + return np.sin(2 * np.pi * frequency * t).astype(np.float32) + + +def main(): + parser = argparse.ArgumentParser( + description="Output a sine wave to USB audio device for testing" + ) + parser.add_argument( + "-d", "--device", type=int, default=None, + help="Audio device index (use -l to list devices)" + ) + parser.add_argument( + "-l", "--list", action="store_true", + help="List available audio devices and exit" + ) + parser.add_argument( + "-f", "--frequency", type=float, default=1000.0, + help="Sine wave frequency in Hz (default: 1000)" + ) + parser.add_argument( + "-a", "--amplitude", type=float, default=0.3, + help="Amplitude 0.0-1.0 (default: 0.3)" + ) + parser.add_argument( + "-r", "--rate", type=int, default=48000, + help="Sample rate in Hz (default: 48000)" + ) + parser.add_argument( + "-t", "--duration", type=float, default=None, + help="Duration in seconds (default: continuous until Ctrl+C)" + ) + parser.add_argument( + "-s", "--stereo", action="store_true", + help="Output stereo (same signal on both channels)" + ) + + args = parser.parse_args() + + # List devices if requested + if args.list: + list_devices() + return 0 + + # Show available devices + list_devices() + + # Select device + device = args.device + if device is not None: + try: + dev_info = sd.query_devices(device) + print(f"\nUsing device [{device}]: {dev_info['name']}") + except Exception as e: + print(f"Error: Invalid device index {device}: {e}") + return 1 + else: + print(f"\nUsing default output device") + + # Parameters + sample_rate = args.rate + frequency = args.frequency + amplitude = max(0.0, min(1.0, args.amplitude)) + channels = 2 if args.stereo else 1 + + print(f"\nGenerating {frequency} Hz sine wave:") + print(f" Sample rate: {sample_rate} Hz") + print(f" Amplitude: {amplitude:.1%}") + print(f" Channels: {channels}") + print(f" Duration: {'continuous' if args.duration is None else f'{args.duration}s'}") + print("\nPress Ctrl+C to stop\n") + + # Generate one second of audio to loop + chunk_duration = 1.0 # seconds + samples = generate_sine_wave(frequency, sample_rate, chunk_duration) + samples = samples * amplitude + + # Make stereo if requested + if channels == 2: + samples = np.column_stack((samples, samples)) + + try: + if args.duration is not None: + # Play for specified duration + full_samples = generate_sine_wave(frequency, sample_rate, args.duration) + full_samples = full_samples * amplitude + if channels == 2: + full_samples = np.column_stack((full_samples, full_samples)) + + sd.play(full_samples, samplerate=sample_rate, device=device) + sd.wait() + else: + # Continuous playback using stream + stream = sd.OutputStream( + samplerate=sample_rate, + channels=channels, + device=device, + dtype=np.float32 + ) + + with stream: + print("Playing... (Ctrl+C to stop)") + sample_idx = 0 + chunk_size = 1024 + + while True: + # Generate chunk + t = np.arange(sample_idx, sample_idx + chunk_size) / sample_rate + chunk = np.sin(2 * np.pi * frequency * t).astype(np.float32) + chunk = chunk * amplitude + + if channels == 2: + chunk = np.column_stack((chunk, chunk)) + + stream.write(chunk) + sample_idx += chunk_size + + except KeyboardInterrupt: + print("\nStopped.") + except Exception as e: + print(f"\nError: {e}") + return 1 + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/hooks/install.sh b/hooks/install.sh new file mode 100755 index 0000000..922a6fe --- /dev/null +++ b/hooks/install.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# +# One-time setup for a fresh clone. Safe to re-run. +# +# Git does not install hooks on clone and has no way to make it happen +# automatically, so this has to be run by hand once per working copy: +# +# ./hooks/install.sh +# + +set -e + +cd "$(git rev-parse --show-toplevel)" + +# Point git at the versioned hooks directory instead of .git/hooks. +# +# Note this *replaces* .git/hooks wholesale rather than adding to it - any +# hooks you have installed there yourself will stop running. This repository +# ships only pre-commit, so move anything of your own into hooks/ alongside it. +if [ -n "$(ls -A .git/hooks 2>/dev/null | grep -v '\.sample$')" ]; then + echo "Note: .git/hooks still contains:" + ls -A .git/hooks | grep -v '\.sample$' | sed 's/^/ /' + echo " These will no longer run. Move any you want to keep into hooks/." +fi + +git config core.hooksPath hooks +echo "core.hooksPath -> hooks" + +# BuildInfo.h is restamped by the pre-commit hook on every commit, so every +# branch touches it and merges between branches would conflict on it. The +# .gitattributes entry marks it merge=ours, which needs this driver defined to +# take effect. "true" is the shell builtin: it succeeds without doing anything, +# which leaves the file as-is - correct here, because the next commit restamps +# it regardless of which side won. +git config merge.ours.driver true +echo "merge.ours.driver -> true" + +echo +echo "Done. The pre-commit hook now stamps code/src/PhoenixSketch/BuildInfo.h" +echo "with the parent commit and stages it, so the working tree stays clean." diff --git a/hooks/pre-commit b/hooks/pre-commit new file mode 100755 index 0000000..9b79479 --- /dev/null +++ b/hooks/pre-commit @@ -0,0 +1,75 @@ +#!/bin/bash +# +# Pre-commit hook to stamp BuildInfo.h and include it in the commit. +# +# This replaces an earlier post-commit hook that wrote the file after the commit +# was made. That version left BuildInfo.h permanently modified in the working +# tree, so `git status` was never clean and the stale stamp got swept into +# whatever was committed next. +# +# Note what the hash means here. A commit cannot contain its own hash: the hash +# is computed from the tree, and the tree includes this file. So the stamp names +# the commit this work was based on - the parent - not the commit being created. +# Firmware built from a checkout therefore reports the commit *before* the one +# it was built from. +# +# The timestamp is the only part that is exact. + +set -e + +BUILD_INFO_FILE="code/src/PhoenixSketch/BuildInfo.h" + +# Leave replayed commits alone. Rebase, merge and cherry-pick re-create commits +# whose parents are not what the working tree was developed against, so a stamp +# written here would be wrong and would also collide on every conflict. +if [ -d "$(git rev-parse --git-path rebase-merge)" ] || + [ -d "$(git rev-parse --git-path rebase-apply)" ] || + [ -f "$(git rev-parse --git-path MERGE_HEAD)" ] || + [ -f "$(git rev-parse --git-path CHERRY_PICK_HEAD)" ]; then + exit 0 +fi + +# Work out which commit is the parent of the one being created. +# +# Normally that is HEAD. During `git commit --amend` it is not: HEAD is still the +# commit being replaced, so stamping it would name a commit that is about to stop +# existing. There is no environment variable for this, so read the arguments of +# the git process that invoked us. +PARENT_REF=HEAD +if grep -qe '--amend' "/proc/$PPID/cmdline" 2>/dev/null || + ps -o args= -p "$PPID" 2>/dev/null | grep -qe '--amend'; then + PARENT_REF=HEAD^ +fi + +# On a root commit, and when amending one, there is no parent to name. +GIT_HASH=$(git rev-parse --short "$PARENT_REF" 2>/dev/null || echo "unknown") +BUILD_TIME=$(date '+%Y-%m-%d %H:%M:%S') + +cat > "$BUILD_INFO_FILE" <`. + +### Query +When the human asks a question: +1. Read `index.md` first to locate relevant pages, then drill in. +2. Synthesize an answer with citations to wiki pages (and underlying sources). +3. **Offer to file good answers back into the wiki** — a comparison, analysis, or + newly-discovered connection is a candidate for a new page so explorations compound. +4. If a page was created/updated, append a `log.md` entry. + +### Lint +When asked to health-check the wiki, look for: +- Contradictions between pages; stale claims newer sources superseded. +- Orphan pages (no inbound links); important concepts mentioned but lacking a page. +- Missing cross-references; data gaps fillable by a source or web search. +- Suggest new questions to investigate and new sources to find. +Append a `log.md` entry: `## [YYYY-MM-DD] lint | `. + +--- + +## index.md and log.md + +**index.md** is content-oriented — a catalog of every page with a link and one-line +summary, grouped by category (firmware / theory / roadmap / sources). Updated on +every ingest and whenever pages are created/renamed. + +**log.md** is chronological and append-only. Each entry starts with a consistent +prefix so it's greppable: + +``` +## [YYYY-MM-DD] | +``` + +where `` ∈ `ingest | query | lint | decision`. Quick history: +`grep "^## \[" log.md | tail -5`. + +--- + +## House rules +- Never modify anything in `raw/`. It is the source of truth. +- Prefer integrating knowledge into existing pages over creating near-duplicates. +- Keep pages focused; split when a page tries to cover two distinct things. +- Cite sources on factual claims so the human can trace provenance. +- This schema co-evolves — when a convention proves awkward, propose updating this file. diff --git a/wiki/firmware/.gitkeep b/wiki/firmware/.gitkeep new file mode 100644 index 0000000..926e96c --- /dev/null +++ b/wiki/firmware/.gitkeep @@ -0,0 +1 @@ +# Firmware pages: modules, architecture, state machines, DSP, design decisions, heritage. diff --git a/wiki/firmware/audio-io.md b/wiki/firmware/audio-io.md new file mode 100644 index 0000000..4bb4d56 --- /dev/null +++ b/wiki/firmware/audio-io.md @@ -0,0 +1,127 @@ +--- +title: Audio I/O (MainBoard_AudioIO — OpenAudio quad-I2S graph) +type: module +status: draft +created: 2026-06-15 +updated: 2026-07-30 +tags: [audio, i2s, openaudio, codec, queues, mixers, sidetone, mode-routing, sample-rate] +source_refs: [sources/t41-ep-schematics] +related: ["[[digital-mode]]", "[[overview]]", "[[hardware-platform]]", "[[dsp-chain]]", "[[mode-state-machine]]", "[[main-loop]]", "[[cw-processing]]", "[[real-time-constraints]]", "[[iq-imbalance-correction]]", "[[sample-rate-switching]]"] +--- + +# Audio I/O (MainBoard_AudioIO) + +**Files:** `MainBoard_AudioIO.cpp` / `.h`. This module is the **bridge between the physical +audio converters and the DSP chain**: it owns the OpenAudio (chipaudette's float-capable fork +of the Teensy Audio library) graph, routes the four audio streams by radio mode, and exposes +the converted samples to [[dsp-chain]] through ring-buffer queues. The *hardware* behind it +(the SGTL5000, PCM1808, PCM5102 and the I²S pin routing) is documented in [[hardware-platform]]; +this page is the *software* graph that drives it. + +## Four streams over quad I²S + +Audio is a **4-channel I²S in / 4-channel I²S out** interface (`AudioInputI2SQuad i2s_quadIn`, +`AudioOutputI2SQuad i2s_quadOut`, `MainBoard_AudioIO.cpp:121,140`). The channel map +(`:78-115`): + +| | ch 0 / 1 | ch 2 / 3 | +|---|---|---| +| **`i2s_quadIn`** | mic L/R (SGTL5000 / Audio Board) | **RX I/Q** (PCM1808) | +| **`i2s_quadOut`** | **TX I/Q** → exciter (SGTL5000) | speaker L/R (PCM5102) | + +Throughout the module the **`*_Ex` suffix = the exciter / transmit path** (mic-in and TX-I/Q-out +on the SGTL5000); the un-suffixed names are the **receive path** (RX-I/Q-in and speaker-out). + +## The graph + +``` +i2s_quadIn ─0/1─► modeSelectInEx{L,R} ─► Q_in_{L,R}_Ex (mic / TX-cal in) + ─2/3─► modeSelectIn{L,R} ─► Q_in_{L,R} (RX I/Q in) +transmitIQcal_oscillator ─► modeSelectInEx ch1 (TX I/Q cal tone) + +Q_out_{L,R}_Ex ─► modeSelectOutEx{L,R} ─► i2s_quadOut 0/1 (TX I/Q out) +Q_out_{L,R} ─► modeSelectOut{L,R} ─► i2s_quadOut 2/3 (speaker out) +sidetone_oscillator ─► modeSelectOut ch2 (CW sidetone) +``` +(`patchCord1…22`, `:141-162`.) The building blocks: +- **4 input mixers** + **4 `AudioRecordQueue`** (`Q_in_*`) capture samples for the DSP. +- **4 `AudioPlayQueue`** (`Q_out_*`) + **4 output mixers** play DSP results back out. +- **`sidetone_oscillator`** (CW monitor) and **`transmitIQcal_oscillator`** (calibration tone, + [[iq-imbalance-correction]]). + +### Mixers are routing switches +The `AudioMixer4`s aren't for mixing levels — they're **on/off selectors**: `SelectMixerChannel` +sets the chosen channel to gain 1 and the rest to 0; `MuteMixerChannels` zeroes all +(`:198-220`). Channel assignments: + +| Mixer | ch0 | ch1 | ch2 | +|---|---|---|---| +| `modeSelectIn{L,R}` (RX in) | RX I/Q | — | — | +| `modeSelectInEx{L,R}` (TX in) | microphone | TX-I/Q **cal** oscillator | — | +| `modeSelectOut{L,R}` (speaker) | RX DSP audio | TX-I/Q monitor | **sidetone** | +| `modeSelectOutEx{L,R}` (TX out) | TX I/Q | — | — | + +## Mode-based routing — `UpdateAudioIOState()` (`:280`) + +Called on mode transitions (from the [[hardware-state-machine]] / `UpdateRFHardwareState` +path); it reconfigures the graph on the **current [[mode-state-machine]] state** and +**short-circuits if the state is unchanged** (`previousAudioIOState`, `:281`) to avoid audio +glitches: + +| ModeSm state(s) | Input queues | Routing | +|---|---|---| +| **SSB/CW receive** (+ several CAL states) | RX I/Q on, mic off | in→RX I/Q (ch0); speaker→RX DSP audio (ch0); TX paths muted | +| **SSB_TRANSMIT** | mic + RX I/Q on | in→mic; out→TX I/Q; speaker muted | +| **CALIBRATE_OFFSET/TX_IQ_MARK** | cal-osc + RX I/Q on | in→cal oscillator (ch1); out→TX I/Q; speaker muted | +| **CW_TRANSMIT_\*_MARK** | RX I/Q + mic off | speaker→**sidetone** (ch2) only; all I/Q paths muted | + +Note CW transmit carries **no RF I/Q through the audio path** — the CW carrier is keyed in +hardware (`CWon`/`CWoff`, [[rf-board]]); the audio side only generates the **sidetone** for +operator monitoring ([[cw-processing]]). + +## Hand-off to the DSP chain + +The record/play queues are the **ISR ↔ main-loop boundary**: the I²S interrupt fills/drains +them, and [[dsp-chain]] reads/writes them from the main loop ([[real-time-constraints]]): +- **RX in:** `Q_in_{L,R}.readBuffer()/freeBuffer()` (`DSP.cpp:134-145`); `available()` gates a + full block, `clear()` drops backlog on overrun (`DSP.cpp:164-165`). +- **Mic in:** `Q_in_{L,R}_Ex` (`DSP.cpp:988-1005`). +- **Speaker out:** `Q_out_{L,R}.getBuffer()` (`DSP.cpp:730`); **TX I/Q out:** `Q_out_{L,R}_Ex` + (`DSP.cpp:1061`). + +## Initialization & rate + +`InitializeAudio()` (`:446`): `SetI2SFreq(SR[SampleRate].rate)`, allocate +`AudioMemory(500)` + `AudioMemory_F32(10)`, configure the codecs, and set the sidetone +oscillator amplitude/frequency (`:452-475`). `SetI2SFreq()` (`:565`) computes the SAI1 PLL +divider chain (`n1`, `n2`, fractional `C`) for the requested rate. +`WarmUpAudioIO()` clears the I²S/codec power-on glitch that otherwise corrupts the first PTT. + +### Changing the rate at run time + +This module owns the rate switch. **`ChangeSampleRate(uint8_t newRate)`** (`:519`) is the entry +point for the "Sample Rate" menu and the `SR` CAT command — full sequence, and why each step is +ordered where it is, on [[sample-rate-switching]]. In outline: compensate `centerFreq_Hz` for +the change in the Fs/4 IF offset → `AudioNoInterrupts()` → `SetI2SFreq()` → +`InitializeSignalProcessing()` → retune the oscillators → flush the four input queues → +`AudioInterrupts()` → reprogram the Si5351 outside the critical section. + +**`UpdateSampleRateDependentOscillators()`** (`:503`) is the piece that belongs to this module +specifically. The sidetone and TX-IQ-cal tones are OpenAudio synthesized oscillators whose +`frequency()` argument is scaled by `AUDIO_SAMPLE_RATE_EXACT / SR[SampleRate].rate`, so they +shift audibly if the rate changes without them being retuned. + +## Codec control objects +- **`sgtl5000_teensy`** (`AudioControlSGTL5000_Extended`) — the **real SGTL5000** on the Teensy + Audio Board: `inputSelect(MIC)`, `micGain(ED.currentMicGain)` (`:320`, + `UpdateTransmitAudioGain`), line levels. +- **`pcm5102_mainBoard`** (`AudioControlSGTL5000`) — *named* for the **PCM5102 speaker DAC** but + **mistyped**: the PCM5102 is a control-less I²S part with no I²C, so its `.enable()/ + .inputSelect()` calls are **no-ops**. See the discrepancy note in [[hardware-platform]] — a + code-clarity fix, not a bug. + +## Open questions +- Whether the `transmitIQcal_oscillator` **amplitude** is set per-calibration or fixed. *(The + frequency half of this is resolved: a fixed nominal **800 Hz**, rescaled on every rate change + by `UpdateSampleRateDependentOscillators()` `:505`.)* +- Exact `AudioMemory` headroom vs. the worst-case quad-stream block backlog. diff --git a/wiki/firmware/built-in-test.md b/wiki/firmware/built-in-test.md new file mode 100644 index 0000000..dae5c4a --- /dev/null +++ b/wiki/firmware/built-in-test.md @@ -0,0 +1,53 @@ +--- +title: Built-In Test (BIT) — I²C hardware presence +type: module +status: draft +created: 2026-06-09 +updated: 2026-06-09 +tags: [bit, self-test, i2c, diagnostics, startup, hardware] +source_refs: [] +related: ["[[overview]]", "[[rf-board]]", "[[filter-boards]]", "[[front-panel]]", "[[ui-state-machine]]", "[[main-loop]]", "[[persistent-config]]", "[[i2c-bus-map]]", "[[hardware-platform]]"] +--- + +# Built-In Test (BIT) — I²C hardware presence + +Phoenix runs a lightweight **built-in self-test** at startup that probes each expected I²C +device and records whether it responded. It's a *presence/connectivity* check — "is each board +actually there and talking?" — surfaced on a diagnostic screen so a missing ribbon cable or +dead board is obvious. + +## What it records — `struct BIT` (`SDT.h:334`) +One global `bit_results` (`Globals.cpp:69`) of booleans, one per I²C subsystem: + +| Field | Device | +|---|---| +| `RF_I2C_present` | RF board MCP23017 ([[rf-board]]) | +| `RF_Si5351_present` | Si5351 VFO clock generator | +| `BPF_I2C_present` | BPF board MCP23017 ([[filter-boards]]) | +| `V12_LPF_I2C_present` | LPF board MCP23017 | +| `V12_LPF_AD7991_present` | LPF board AD7991 power ADC | +| `FRONT_PANEL_I2C_present` | front-panel MCP23017(s) ([[front-panel]]) | +| `AD7991_I2C_ADDR` | detected AD7991 address (uint8) | + +## How it's populated +Not a separate test pass — each board's **`Initialize*` routine sets its flag** as a side +effect of trying to bring up its I²C device, e.g. `BPFBoard.cpp:30/41` set +`BPF_I2C_present` true/false on success/failure, `LPFBoard.cpp:251/734-748` set the LPF MCP and +AD7991 flags, `FrontPanel.cpp:282-292` the front-panel flag. So BIT reflects the result of the +normal hardware bring-up (the same `ENOI2C` failures the init functions return). + +## How it's shown — `DrawBIT()` (`MainBoard_Display.cpp:77`) +The **"I2C Status Report"** screen (the UISm `BIT` state, [[ui-state-machine]], +[[display-subsystem]]) lists each subsystem present/absent, including the detected AD7991 +address. Reached via the `BIT` menu action, which dispatches `iBITDISPLAY` from [[main-loop]] → +`UISm_EventId_BIT` (`Loop.cpp:1354`). + +## Scope / limits +- It's a **connectivity** test (does the device ACK on I²C), not a functional/parametric test — + it doesn't verify the Si5351 actually produces the right frequency or that relays switch. +- Runs once at startup; the screen reflects that snapshot. + +## Open questions +- Is BIT re-runnable on demand, or only the startup snapshot? +- Could it be extended to functional checks (VFO lock, relay readback, power-sensor sanity)? + — a possible roadmap item. diff --git a/wiki/firmware/calibration-state-machines.md b/wiki/firmware/calibration-state-machines.md new file mode 100644 index 0000000..ea48cf8 --- /dev/null +++ b/wiki/firmware/calibration-state-machines.md @@ -0,0 +1,83 @@ +--- +title: Calibration Sub-State-Machines (the 4 generated cal SMs) +type: module +status: draft +created: 2026-06-09 +updated: 2026-06-09 +tags: [state-machine, calibration, statesmith, iq, carrier, power, sweep] +source_refs: [] +related: ["[[overview]]", "[[hardware-state-machine]]", "[[state-machine-architecture]]", "[[iq-imbalance-correction]]", "[[tx-carrier-null]]", "[[tune-frequency-control]]", "[[persistent-config]]"] +--- + +# Calibration Sub-State-Machines (the 4 generated cal SMs) + +The four **StateSmith-generated** calibration machines, each wrapped by a hand-written partial +in [[hardware-state-machine]] and entered from ModeSm's `CALIBRATION_STATES`: + +| SM | File | Optimizes | `ED` output | +|---|---|---|---| +| `ReceiveIQCalSm` | `ReceiveIQCalSm.cpp` | RX sideband separation | `IQAmp/PhaseCorrectionFactor` | +| `TransmitIQCalSm` | `TransmitIQCalSm.cpp` | TX sideband separation | `IQXAmp/XPhaseCorrectionFactor` | +| `TransmitCarrierCalSm` | `TransmitCarrierCalSm.cpp` | carrier suppression (dBc) | `DCOffsetI/Q` | +| `PowerCalSm` | `PowerCalSm.cpp` | PA power curve fit | `PowerCal_*` | + +All persist per-band results to [[persistent-config]] and auto-advance through the bands. The +underlying theory: [[iq-imbalance-correction]] (the two I/Q ones), [[tx-carrier-null]], +[[tune-frequency-control]] (the power tanh model). + +## Three of them are the *same* machine + +`ReceiveIQCalSm`, `TransmitIQCalSm`, and `TransmitCarrierCalSm` have **identical** state and +event sets — they are one "step-a-parameter, measure, keep-the-best" sweep instantiated for +three different metrics/parameters. + +**States:** `STANDBY · BAND_ADJUST · FIND_MINIMUM · ADJUST · WAIT · READ` (+ `ROOT`). +**Events:** `DO · AUTO · AUTO_COMPLETE · FIND_MINIMUM · MIN_EXIT · NEXT_POINT · READ_DELTA`. + +Flow (cross-referenced with the partial code in [[iq-imbalance-correction]]): +``` +STANDBY ──AUTO──▶ BAND_ADJUST // set up the current band's hardware + ▲ │ FIND_MINIMUM + │ AUTO_COMPLETE ▼ + │ FIND_MINIMUM ──▶ ADJUST ──READ_DELTA──▶ WAIT ──(settle)──▶ READ + │ ▲ │ + │ └──────────── NEXT_POINT ────────────────┘ + └──────────────── MIN_EXIT ◀── (band done) ───────────────────────────────── +``` +- **ADJUST** sets the next parameter value (amplitude/phase or DC-offset step). +- **WAIT** lets the signal settle (`acquisitionDuration_ms`, ~60 ms) before measuring. +- **READ** reads the metric (sideband separation / dBc) from the RX PSD and keeps the value if + it beats the running best (`maxSBS`/`maxDBC`). `NEXT_POINT` loops to the next step; when the + multi-pass coarse→medium→fine sweep is exhausted the band's optimum is written to `ED`. +- **BAND_ADJUST** ↔ `MIN_EXIT` advances to the next band; `AUTO_COMPLETE` ends the run. + +This is the narrowing **coordinate-descent sweep** documented in detail (the amp/phase passes) +in [[iq-imbalance-correction]]; the carrier version sweeps `DCOffsetI`/`DCOffsetQ` instead. + +## PowerCalSm is different — curve fitting, not minimum-finding + +Power calibration **records multiple (attenuation, power) data points** and fits the saturating +tanh PA model ([[tune-frequency-control]]), so its states reflect data-point collection rather +than a single-minimum sweep: + +**States:** `POWERPOINT1 · POWERPOINT2 · POWERPOINT3 · SSBPOINT · ACQUISITION · +MEASUREMENTCOMPLETE · READ_AND_ADJUST · POWERCOMPLETE` (+ `ROOT`). +**Events:** `DO · AUTO · RECORD_DATA_POINT · NEXT_POINT · CURVE_COMPLETE · RESET`. + +- The `POWERPOINT1/2/3` (and `SSBPOINT`) states drive the PA to set attenuations and + `RECORD_DATA_POINT` captures the measured output power at each. +- `ACQUISITION` → `MEASUREMENTCOMPLETE` gate the settle/measure. +- `READ_AND_ADJUST` / `POWERCOMPLETE` finish a band; `CURVE_COMPLETE` triggers the + Gauss-Newton tanh fit (`FitPowerCurve` in [[tune-frequency-control]]) yielding the per-band + `Psat`/`k`. + +## Generated-code rule +All four are StateSmith output — edit the `.drawio` and regenerate, never the `.cpp` +([[state-machine-architecture]]). Diagrams: `PowerCalSm.drawio`, `ReceiveIQCalSm.drawio`, +`TransmitCarrierCalSm.drawio`, `TransmitIQCalSm.drawio`. + +## Open questions +- The exact `Vars` each SM carries (acquisition duration, counters) — only partially traced. +- Whether the three identical SMs are generated from one shared diagram or three copies (DRY + opportunity if the latter). +- `PowerCalSm` SSB vs CW point handling (`SSBPOINT` vs the three `POWERPOINT`s). diff --git a/wiki/firmware/cat-control.md b/wiki/firmware/cat-control.md new file mode 100644 index 0000000..1bb5f76 --- /dev/null +++ b/wiki/firmware/cat-control.md @@ -0,0 +1,247 @@ +--- +title: CAT Control (Kenwood emulation) +type: module +status: draft +created: 2026-06-08 +updated: 2026-07-31 +tags: [cat, kenwood, ts-480, ts-2000, serial, rig-control, usb] +source_refs: [] +related: ["[[digital-mode]]", "[[overview]]", "[[main-loop]]", "[[mode-state-machine]]", "[[tune-frequency-control]]", "[[persistent-config]]", "[[sample-rate-switching]]", "[[filter-hil-test]]", "[[audio-equalizer]]", "[[cw-processing]]", "[[tx-filter-hil-test]]"] +--- + +# CAT Control (Kenwood emulation) + +**Files:** `CAT.cpp` (~28 KB), `CAT.h`. Computer-Aided Transceiver control so standard +logging/contest/digital software (WSJT-X, fldigi, hamlib, N1MM…) can drive the radio. + +## Transport +- **Port:** `SerialUSB1` — the *second* USB serial interface (requires Arduino "USB Type = + Dual Serial"). The first port is the debug/console serial. +- **Baud:** 38400. +- **Framing:** ASCII commands terminated by `;`. Polled each pass by `CheckForCATSerialEvents()` + from [[main-loop]], which buffers until the terminator then parses. + +## Protocol ⚠️ TS-480 vs TS-2000 +The implemented dialect is the **Kenwood** 2-letter command set. The two source docs +**disagree on which radio**: `CAT.cpp:21` says *"Kenwood TS-480 CAT Interface (partial)"* (and +`code/docs/ts_480_pc.pdf` is the reference), but `CAT.h` says *"Kenwood TS-2000 protocol"*. The +two share most commands so it works either way, but the docs should be reconciled — logged in +[[documentation-todos]]. + +## Architecture: a command-dispatch table + +The core is a static table of `valid_command` entries (`NUM_SUPPORTED_COMMANDS = 32`, +`CAT.cpp:104-136`): +```c +typedef struct { + char name[3]; // 2-letter command + NUL + int set_len, read_len; // expected payload lengths + char* (*write_function)(char*); // "set" handler + char* (*read_function)(char*); // "query" handler +} valid_command; +``` +`command_parser()` matches the incoming 2-letter code against the table and dispatches to the +**write** (set) or **read** (query) handler based on the command length — a query is just the +bare command (e.g. `FA;`), a set carries a payload (`FA00014200000;`). Read handlers format +`ED`/hardware state into a Kenwood response string; write handlers apply the change. + +> ⚠️ **Adding a command? `set_len` and `read_len` must differ.** `command_parser` tests the +> **write form first**, so a command declaring `set_len == read_len` has an **unreachable read +> handler** — it becomes silently write-only. This is not hypothetical: it is exactly the bug +> that made `FW;` unreadable for as long as `FW` has existed (see below). + +## Implemented commands (32) + +| Group | Commands | +|---|---| +| Frequency / VFO | `FA`/`FB` (VFO A/B freq), `FR`/`FT` (RX/TX VFO select), `FW` (filter high cut) | +| Mode / status | `MD` (mode), `IF` (transceiver status string), `ID` (radio id) | +| Band | `BU`/`BD` (band up/down) | +| Gain / audio | `AG` (AF gain), `MG` (mic gain), `PC` (power control) | +| Digital mode | `DG` (enter/leave), `DR` (receive level 000-100), `DS` (TX path counters, read-only) | +| DSP | `NR` (noise reduction), `NT` (notch), `VX` (VOX) | +| Keyer | `KS` (keyer speed / WPM) | +| PTT | `TX` (transmit), `RX` (receive) | +| Misc | `AI` (auto-info), `PS` (power on/off), `PD`, `DB` | +| **Custom (non-Kenwood)** | `ED` (dump the `ED` config), `PR` (dump the `hardwareRegister`), **`SR`**, **`CF`**, **`EQ`**, **`FL`** | + +`ED` and `PR` are Phoenix extensions explicitly marked "NOT a Kenwood keyword" — handy debug +dumps of [[persistent-config]] and the [[filter-boards]] `hardwareRegister`. + +### DSP-settings commands (added 2026-07, `CAT.cpp:132-135`) + +Added so [[filter-hil-test]] could drive settings that were previously **touchscreen-only**. + +| Cmd | Set | Read | Meaning | +|---|---|---|---| +| `SR` | `SRn;` | `SR;` | Sample rate: `0` = 176.4 ksps, `1` = 192 ksps ([[sample-rate-switching]]). **Rejected while transmitting** — it reconfigures the I²S clock and rebuilds the whole DSP chain (`CAT.cpp:804-827`). | +| `CF` | `CFn;` | `CF;` | Receive CW audio filter index 0–5 ([[cw-processing]]). | +| `EQ` | `EQbbvvv;` | `EQbb;` | Receive equaliser cell `bb` = 00–13, level `vvv` = 000–100 ([[audio-equalizer]]). Note set/read lengths differ by design. | +| `FL` | `FL####;` | `FL;` | DSP filter **low** cut — the mirror of `FW`'s high cut. | + +⚠️ **Still no CAT command for AGC mode.** That is the one setting [[filter-hil-test]] needs and +cannot have, so the suite refuses to run rather than setting it. + +There is also **no command for the transmit equaliser** (`ED.equalizerXmt`) to mirror `EQ`'s +receive cells. [[tx-filter-hil-test]] works around it rather than adding one, because +`S_Xmt[i].pCoeffs` and `S_Rec[i].pCoeffs` point at the *same* coefficient array +(`DSP_FFT.cpp:402-403`) — so soloing the transmit cells would re-verify tables `EQ` already +exposes ([[audio-equalizer]]). + +### Digital-mode commands (added 2026-07-31) + +Three non-Kenwood additions for [[digital-mode]]: + +- **`DG`** — `DG1;` enters digital mode, `DG0;` leaves, `DG;` reads. Entering forces + 176.4 ksps and starts the USB audio link; leaving restores the previous rate. Accepted only + from a receive state, and rejected outright in builds without a USB audio interface. +- **`DR`** — `DR000;`–`DR100;` set the level applied to the receive audio sent to the host, + `DR;` reads it back zero-padded. Default 25 (−12 dB). Needed because nothing else regulates + that level: with AGC off the AGC stage applies a fixed gain of 20, so a strong signal + otherwise clips. +- **`DS`** — read-only, returns `DS,,,,;` for the + transmit path. Added to diagnose transmit spurs and immediately found the record queue pinned + at 208 of its 209-block ceiling. Counters reset on entering digital mode. + +**`MD` is deliberately inert on digital mode.** WSJT-X sends `MD2;` to force USB on startup and +before every transmission, so treating a modulation change as a request to leave digital mode +would make the mode impossible to hold. Only `DG0;` or the front panel leaves it. + +**`SR` is refused while in digital mode**, because that mode pins the sample rate. + +### ⚠️ `TX` and `RX` are silent *writes* in both their forms + +A trap for any CAT client, not just the test suites. Almost every command distinguishes its read +form from its write form by **length** — a bare `XX;` is a read. `TX` and `RX` break that: a bare +`TX;` is a **write**, and their handlers return `empty_string_p`, whose empty response +`command_parser` suppresses. So a client that infers "3 characters ⇒ read ⇒ wait for a +reply" **blocks for its full read timeout on every key and unkey**, waiting for something that is +never coming. `filter_hil/radio.py` carries a `SILENT_SHORT_WRITES` set for exactly this pair. + +### The `TX` parameter is optional (fixed 2026-07-30) + +`ts_480_pc.pdf` p.21 defines the set form as `TX P1;` — P1 is `0` (normal/MIC), `1` (DTS via the +ANI input) or `2` (TX Tune) — and states that **"if no P1 parameter is specified, P1=0 is used"**. +All four of `TX;`, `TX0;`, `TX1;` and `TX2;` are therefore legal ways to key. Phoenix originally +accepted only `TX;`, because the table entry was `{ "TX", 3, 0, ... }` and `command_parser` +dispatches purely on where the semicolon falls. + +That was a real interoperability bug, not a pedantic one. **Hamlib** — the layer WSJT-X, fldigi and +Pat all drive the radio through — picks the form from the PTT type: `TX;` for `RIG_PTT_ON`, `TX0;` +for `RIG_PTT_ON_MIC`, `TX1;` for `RIG_PTT_ON_DATA`, and `RX;` to unkey. Which one a given user +sends depends on their backend and data-mode settings, so the radio keyed for some clients and +silently refused for others. + +Both entries now read `{ "TX", 3+1, 3, TX_write, TX_write }` (and likewise for `RX`, which also +accepts the TS-2000-style `RX0;`/`RX1;`). The idiom for an **optional parameter** is to put the +*write* function in both slots: `set_len` covers the parameterised form, `read_len` the bare one. +There is deliberately no `TX_read` — adding one would make `TX;` read instead of key, breaking +Hamlib's `RIG_PTT_ON` and both HIL suites, which send `TX;`/`RX;` (`filter_hil/radio.py:480`). +`TX_write` ignores P1, so every form keys identically; Phoenix has neither a separate data input +nor a tune mode to distinguish them. + +> When [[usb-audio]] (#13) resumes, note that `TX1;` is Hamlib's standard "transmit from the data +> port" signal — which may remove the need for the non-Kenwood `UM;` command on the `usb_audio` +> branch. + +The same change closed a latent defect in `command_parser`: it evaluated +`command[ set_len - 1 ]` and `command[ read_len - 1 ]` unconditionally, and nine entries carry a +`0` in one of those fields, so the expression became `command[-1]` — an out-of-bounds read off the +front of `catCommand[128]`. It never crashed, but `ID;`, `IF;`, `PD;`, `ED;` and `PR;` reached +their read handlers only because the preceding byte happened not to be `';'`. Both tests are now +guarded with `> 0`. + +⚠️ **Test the dispatcher, not just the handler.** `CAT_test.cpp` already asserted that TX accepted +`TX;`, `TX0;` and `TX1;` — but it called `TX_write()` directly, and `TX_write` ignores its +argument. The tests passed for the entire life of the bug. The regression tests added alongside +the fix go through `command_parser()`. + +`PC` (power) is the opposite case worth noting alongside it: `PC_write` *does* answer, echoing +`PC%03d;`, so it is one of the few writes that is not silent. + +## Three fixes to pre-existing commands + +All three affected CAT users on earlier releases: + +- ⚠️ **`MD` inverted the receive filter.** `MD_write` set `bands[].mode` but never + `ED.modulation[]`. `Demodulate()` switches on the *latter*, while `InitFilterMask()` *compares + the two* and treats a difference as a deliberate departure from the band default — by + **mirroring the passband**. So `MD` did not merely fail to change the demodulator; it flipped + the sideband of the receive filter. (Same normalization the display had to learn — see + `EffectivePassbandEdges_Hz` in [[display-subsystem]].) +- **`MD1`/`MD2` could not escape CW.** They now dispatch `TO_SSB_MODE` when in CW receive. That + transition previously existed **only on the front-panel button**, so CAT could enter CW mode + and never leave it ([[mode-state-machine]]). +- **`FW` was write-only.** It declared `set_len == read_len`, making `FW;` unreachable per the + parser rule above. Also `MD4` now selects **AM**, which was previously unreachable (`MD5` + gives SAM). + +## How commands apply +CAT does **not** have a private path to the hardware — it feeds the **same channels as the +front panel**: +- **Event dispatch:** writes enqueue `InterruptType` events into the [[main-loop]] FIFO — e.g. + a frequency set raises `iUPDATE_TUNE` (`CAT.cpp:221`), band up/down raise `iBUTTON_PRESSED` + (`CAT.cpp:174,183`). So CAT tuning flows through [[tune-frequency-control]] exactly like the + encoder. +- **Direct `ED` writes:** simple settings write straight to [[persistent-config]] (e.g. + `KS_write` → `ED.currentWPM`, `CAT.cpp:475`). +- **PTT:** `TX_write` dispatches into [[mode-state-machine]] (switches on `modeSM.state_id`), + so CAT PTT obeys the same TX interlocks/keying as physical PTT. ⚠️ It only dispatches from + `SSB_RECEIVE` (→ `PTT_PRESSED`) or `CW_RECEIVE` (→ `KEY_PRESSED`); from any **other** state it + falls through its `switch` and does nothing at all, silently. A client cannot learn from the CAT + reply whether the radio actually keyed — it has to observe the hardware. + +Read handlers serialize state back: `IF_read` builds the long TS-480 status string (VFO freq, +mode, RX/TX, etc.); `FA_read`/`MD_read`/`KS_read`/… each return one field. + +## Open questions +- Reconcile TS-480 (`CAT.cpp`) vs TS-2000 (`CAT.h`) and verify the `IF` status-string field + layout against `code/docs/ts_480_pc.pdf`. **`TX`/`RX` were checked against p.21 on 2026-07-30** + (see above); the rest of the table has not been audited against the spec, and `TX`/`RX` were + wrong, so assume others may be too. +- A CAT command for **AGC mode** — the remaining gap for [[filter-hil-test]], which currently + has to demand the operator set it by hand. +- `SR` is interlocked against transmit, but the **menu path is not** ([[sample-rate-switching]]). + Whether that asymmetry is deliberate. +- The set/read-length constraint is a parser property enforced only by convention. Nothing + fails at build time if a new command violates it — a static assertion over the table would + catch the next `FW`. +- Which `unsupported_cmd` stubs exist and how the radio replies to unknown commands (the `?` + error response?). +- Whether `AI` (auto-information) actually pushes unsolicited updates or is a no-op. + + +## Sideband selection: `bands[].mode` is a band default, not the current mode + +Fixed 2026-07-31, after `MD2;` was observed tuning a 40 m receiver to LSB. + +The receive sideband is not stored anywhere directly. It is the **sign** of +`bands[].FLoCut_Hz`/`FHiCut_Hz` - stored in the convention of the band's default +modulation, negative below the carrier for an LSB-default band - **mirrored by +`InitFilterMask()` (`DSP_FIR.cpp:1167`) iff `ED.modulation[activeVFO]` differs from +`bands[].mode`**. That mirroring is the only mechanism that produces the opposite +sideband. + +So the two fields are not two copies of the same thing: + +| field | meaning | written by | +|---|---|---| +| `ED.modulation[activeVFO]` | the **current** modulation - what `Demodulate()` switches on and the display shows | front-panel DEMODULATION button, `SetModulation()`. Persisted. | +| `bands[].mode` | the band **default** - the fixed reference the mirroring is measured against | nothing at run time. Rebuilt from the table in `Globals.cpp` each boot; not persisted. | + +`SetModulation()` used to write both. Making the default agree with the newly +requested modulation switches the mirroring *off*, so the band-default passband +comes back: on 40 m, `MD2;` (select USB) tuned the radio to LSB, while the display +- which reads `ED.modulation[]` - went on saying USB. `MD_read` and `IF_read` read +the same field and so announced the band default rather than the mode in use, +which is how the fault was initially misdiagnosed at the bench. + +`FL_read`/`FW_read`/`FW_write`/`FilterSetSSB` (`DSP_FFT.cpp:515`) and `VolumeScale` +(`DSP.cpp:225`) legitimately keep using `bands[].mode`: they manipulate the +*stored* cutoffs, which are in the band-default convention. Leave them. + +**Method note.** `CAT_test.cpp` had a test named `MD_write_SetsModulationNotJustBandMode` +asserting that `bands[].mode` was written - it encoded the defect as the contract and +passed for its whole life. It is now `MD_write_SetsModulationAndLeavesTheBandDefault`, +and the new tests assert the **effective passband** rather than field values, which is +the only formulation that could have caught this. diff --git a/wiki/firmware/code-heritage.md b/wiki/firmware/code-heritage.md new file mode 100644 index 0000000..975c314 --- /dev/null +++ b/wiki/firmware/code-heritage.md @@ -0,0 +1,65 @@ +--- +title: Code Heritage & Multi-Author History +type: decision +status: draft +created: 2026-06-08 +updated: 2026-06-08 +tags: [history, heritage, licensing, contributors] +source_refs: [] +related: ["[[overview]]"] +--- + +# Code Heritage & Multi-Author History + +Phoenix is not a from-scratch codebase — it is the latest fork in a long amateur-radio +lineage. Understanding the heritage explains stylistic inconsistencies, duplicated idioms, +and the mix of generated and hand-written code. + +## Lineage + +> "This code base is originally derived from the **Teensy Convolution SDR**, copyright +> Frank Dziock DD4WH, substantially modified by the contributors listed below." +> — `code/src/PhoenixSketch/Contributors.txt` + +Origin: + +The "Convolution SDR" name reflects the original DSP approach: filtering by FFT +convolution. Much of the spectrum/FFT machinery in [[dsp-chain]] traces back to this root. + +The intermediate ancestor is the **T41-EP** ("Experimenter's Platform") SDR, documented in +the Al Peter (AC8GY) & Jack Purdum (W8TEE) book — a theory source worth ingesting into the +`theory/` area when available (see [[theory-overview]]; no e-copy currently exists, so the +theory pages are reconstructed from code + DSP fundamentals). + +## Known contributors + +From `Contributors.txt`: + +- Oliver King, KI3P *(current Phoenix maintainer)* +- Jack Purdum, W8TEE *(T41-EP book co-author)* +- Al Peter, AC8GY *(T41-EP book co-author)* +- Greg Raven, KF5N +- John Melton, G0ORX +- Jerry Kaidor, KF6VB +- WMXZ +- Frank Dziock, DD4WH *(original Teensy Convolution SDR author)* +- Michael Wild +- David Martin, VK3KQT +- Joerg Uthoff, DB2OO +- Harry Brash, GM3RVL +- Tom Metty, AJ8X + +## Licensing + +Phoenix is **GPL v3** (or later). Every source file carries the standard GPLv3 header +referencing `Contributors.txt`. + +## Implications for the wiki + +- **Style heterogeneity** is expected — code reflects many hands across many years. +- The **Phoenix** rework (KI3P-led) introduced the StateSmith-generated state machines and + the board-abstraction layer ([[rf-board]], [[filter-boards]]), which are newer than the + DSP core. +- When a design decision looks idiosyncratic, check whether it is inherited from the + Convolution SDR / T41-EP era versus a deliberate Phoenix choice. Record such findings as + `decision` pages. diff --git a/wiki/firmware/cw-processing.md b/wiki/firmware/cw-processing.md new file mode 100644 index 0000000..ccd414e --- /dev/null +++ b/wiki/firmware/cw-processing.md @@ -0,0 +1,135 @@ +--- +title: CW Processing (audio filter + Morse decoder) +type: module +status: draft +created: 2026-06-09 +updated: 2026-07-29 +tags: [cw, morse, decoder, goertzel, sidetone, audio-filter, adaptive, chebyshev, sample-rate] +source_refs: [] +related: ["[[overview]]", "[[dsp-chain]]", "[[mode-state-machine]]", "[[tune-frequency-control]]", "[[rf-board]]", "[[display-subsystem]]", "[[persistent-config]]", "[[audio-io]]", "[[runtime-filter-design]]", "[[filter-hil-test]]", "[[cat-control]]"] +--- + +# CW Processing (audio filter + Morse decoder) + +**Files:** `DSP_CWProcessing.cpp` (~24 KB), `DSP_CWProcessing.h`. + +## Where this fits in the CW path +CW (Morse) spans the whole radio; this module is the **receive-side audio** half: + +- **Transmit** — the iambic/straight keyer is in [[mode-state-machine]]; it keys the CW VFO via + `CWon`/`CWoff` on the [[rf-board]] at the tone-offset frequency from [[tune-frequency-control]] + (`GetCWTXFreq`). Sidetone is generated here (below). +- **Receive** — *this module*: a narrow **CW audio filter** for SNR, plus an **adaptive Morse + decoder** that turns the received tone into text. Invoked from `ReceiveProcessing` only in the + `CW_RECEIVE` state (`DSP.cpp:935`, [[dsp-chain]]): `DoCWReceiveProcessing()` then + `CWAudioFilter()`. + +## CW audio filter — `CWAudioFilter()` + +A narrow lowpass on the demodulated audio, selected by `ED.CWFilterIndex` +([[persistent-config]]) from five biquad cascades (`arm_biquad_cascade_df2T_f32` over +`S1_CW_AudioFilter1..5`, the cascades defined in `ReceiveFilterConfig`): + +| `CWFilterIndex` | 0 | 1 | 2 | 3 | 4 | 5 | +|---|---|---|---|---|---|---| +| nominal cutoff | 840 Hz | 1080 Hz | 1320 Hz | 1800 Hz | 2000 Hz | Off | +| ripple edge (design param) | 807.1 | 1038.0 | 1269.0 | 1731.5 | 1963.2 | — | + +Each is a **12-pole Chebyshev type I** with **0.02 dB** passband ripple. A Chebyshev is specified +by its *ripple edge*, which sits a few percent below the nominal cutoff — hence the second row +(`CW_AUDIO_RIPPLE_EDGE_HZ[]`, `DSP_FIR.cpp:1242-1244`). + +⚠️ **Generated per sample rate, not stored.** These were frozen tables designed for 24 ksps +audio; run at 176.4 ksps the "2.0 kHz" filter actually cut at **1.84 kHz**. They are now +regenerated by `CalcChebyshevILowpassCoeffs()` on every rate change — see +[[runtime-filter-design]], and [[filter-hil-test]] for the bench measurement (every corner holds +to within 0.3 % across the rate change). + +Also selectable over CAT: **`CFn;`** / `CF;` ([[cat-control]]). + +Narrowing the audio passband around the CW tone dramatically improves SNR against adjacent +signals — the receive counterpart to picking a CW filter on an analog rig. + +## Tone detection — `DoCWReceiveProcessing()` + +Decides mark (tone present) vs. space using a **hybrid** of two detectors and feeds the +envelope to the decoder: +- **Correlation** against an internally generated reference sine (`aveCorrResult`). +- **Goertzel magnitude** at the configured CW tone `CWToneOffsetsHz[ED.CWToneIndex]` + (`goertzel_mag`). +- Combined: `combinedCoeff = 10 * aveCorrResult * 100 * goertzelMagnitude` (`DSP_CWProcessing.cpp:109`), + thresholded into the 0/1 audio value passed to `DoCWDecoding`. + +### Goertzel algorithm *(general DSP)* +`goertzel_mag(N, f, fs, data)` computes the energy at a **single** frequency far more cheaply +than a full FFT — an IIR recurrence tuned to bin `f`, ideal for "is the CW tone present?" +detection. + +## Adaptive Morse decoder — `DoCWDecoding()` + +A timing state machine (`MorseStates`) that converts the mark/space envelope into characters, +**adapting to the operator's sending speed** rather than assuming a fixed WPM. + +### Standard Morse timing *(general DSP, also in the code comments)* +`dit = 1 unit, dah = 3, inter-element = 1, inter-letter = 3, inter-word = 7`; +`ditLength = 1200 / WPM` via `SetDitLength()`. dah-vs-dit and letter/word boundaries are +distinguished by comparing measured durations against (adaptive) multiples of `ditLength` +(e.g. inter-element gap > `1.95·ditLength` ends a character, > `4.5·ditLength` is a word gap). + +### Adaptive timing +Rather than trust a fixed threshold, the decoder builds **histograms** of observed mark +durations (`DoSignalHistogram`) and gap durations (`DoGapHistogram`, `HISTOGRAM_ELEMENTS = 750` +ms-resolution bins), and uses `JackClusteredArrayMax` to find the dominant dit/dah/space +clusters. A running `thresholdGeometricMean` separates dit from dah and tracks speed changes; +`ADAPTIVE_SCALE_FACTOR = 0.8` ages old observations. `IsCWDecodeLocked()` reports whether the +timing statistics have converged. Fastest supported speed: `LOWEST_ATOM_TIME = 20 ms` (≈60 WPM). + +### Decoding via a flat Morse tree +Characters are looked up by walking a **binary tree stored as a flat string** +(`bigMorseCodeTree`, `DSP_CWProcessing.cpp:49` — `"-EISH5--4--V…"`, the classic pre-order Morse +layout). Starting at index 0 with a jump of `DECODER_BUFFER_SIZE = 128`, each element halves the +jump and branches (`DSP_CWProcessing.cpp:289-307`): +``` +dit: currentDecoderIndex += 1; // left child +dah: currentDecoderIndex += currentDashJump; // right child +both: currentDashJump >>= 1; // (applied per element) +``` +At the end of a character it emits `bigMorseCodeTree[currentDecoderIndex]` and resets. Decoded +text accumulates in a buffer; `GetMorseCharacterBuffer()` / `IsMorseCharacterBufferUpdated()` +let the [[display-subsystem]] refresh only when new characters arrive. Decoding is gated by +`ED.decoderFlag`. + +## Decoder input filter +Separate from the operator-selectable filters above: a 64-tap FIR ahead of the tone detector +(`CW_Filter_Coeffs2`), also regenerated per rate. ⚠️ Its constant is `CW_DECODE_FIR_FC_HZ = +1749.1` Hz, which is a **−6 dB** corner because that is what `CalcFIRCoeffs` takes as its +argument — the filter is nominally described by its **−3 dB** point of **1560 Hz** +(`DSP_FIR.cpp:1280-1283`). The two numbers describe the same filter; do not read them as a +contradiction. + +## Sidetone (transmit) +`InitializeCWProcessing()` also precomputes the **correlator reference sine** into `sinBuffer` +at the configured CW tone. The *audible* sidetone is separate — it comes from +`sidetone_oscillator` in [[audio-io]], whose frequency is rescaled on every sample-rate change +(`UpdateSampleRateDependentOscillators()`). Volume is `ED.sidetoneVolume`, which ranges **0–500 +in steps of 1** and carries an `UpdateSidetoneOscillator` post-update callback so a menu change +reaches the running oscillator ([[display-subsystem]]). + +> ⚠️ **Stale comment, correct code.** `DSP_CWProcessing.cpp:64` says +> `// phs = 2 * PI * freqSideTone / 24000`, but the line below it actually divides by +> `SR[SampleRate].rate / RXfilters->DF` (`:65-66`) — the live audio rate. The reference sine is +> therefore already correct at 176.4 ksps; only the comment is frozen at 24 kHz. An earlier +> revision of this page quoted that comment as if it were the code. → [[documentation-todos]] + +## Open questions / discrepancies +- **Filter-width mismatch:** the header doc says "very narrow filter (50–500 Hz typical)" but + the five filters cut at **840–2000 Hz**. Reconcile (audio passband vs. RF bandwidth?). + → [[documentation-todos]] +- The empirical scaling in `combinedCoeff` (`10 × … × 100 ×`) and the correlation-vs-Goertzel + weighting — document the tuning rationale. + +## Resolved +- **Which sample rate the decoder/Goertzel run at.** The **audio** rate, + `SR[SampleRate].rate / RXfilters->DF` — 24 kHz at 192 ksps, 22.05 kHz at 176.4 ksps + (`DSP_CWProcessing.cpp:65-66`). The "12 kHz the sidetone phase implies" that prompted this + question came from the stale comment above, not from the code. *(resolved 2026-07-29)* diff --git a/wiki/firmware/digital-mode.md b/wiki/firmware/digital-mode.md new file mode 100644 index 0000000..b6aa1ee --- /dev/null +++ b/wiki/firmware/digital-mode.md @@ -0,0 +1,342 @@ +--- +title: Digital Mode (USB Audio) +type: module +status: draft +created: 2026-07-30 +updated: 2026-07-31 +tags: [digital-mode, usb-audio, ft8, wsjtx, 176k, sample-rate, mode-state-machine, cat, verified-on-hardware] +source_refs: [] +related: ["[[mode-state-machine]]", "[[sample-rate-switching]]", "[[audio-io]]", "[[dsp-chain]]", "[[cat-control]]", "[[usb-audio]]", "[[runtime-filter-design]]", "[[hardware-state-machine]]"] +--- + +# Digital Mode (USB Audio) + +A third operating mode alongside SSB and CW, for FT8/JS8/PSK31 and anything else driven +from a PC. In receive the demodulated audio is streamed to the host over USB audio (and +still to the speaker); in transmit the audio source is the host instead of the microphone. + +## The rate coincidence that makes it simple + +Teensy USB audio is a fixed **44.1 kHz** endpoint. Phoenix's DSP runs at 176.4 or 192 ksps. +At **176.4 ksps** everything lines up exactly: + +| quantity | at 176.4 ksps | at 192 ksps | +|---|---|---| +| receive audio tap after `FIR_int1` (Fs/4) | **44,100 Hz** | 48,000 Hz | +| DSP block rate (Fs / 2048) | 86.1328 Hz | 93.75 Hz | +| samples/s at that tap (512 per block) | **44,100** — exact | 48,000 | +| AudioStream graph clock (Fs / 128) | **1378.125 Hz = 4 × 344.53** | 1500 Hz | + +So the demodulated audio *is already* at 44.1 kHz, one DSP block *is already* 512 samples, +and the audio library's graph clock is *exactly* 4× the USB audio block rate. Nothing is +resampled and no Teensy core file is modified. + +**Two clocks, do not conflate them.** 176.4 ksps is the radio's ADC/DSP rate (what the SR +menu and `SR0;` select). 44.1 kHz is the demodulated *audio* rate and what the USB endpoint +declares to the PC. The second is not an independent choice — it is what Fs/4 equals at the +first. + +Because of this, **entering digital mode forces 176.4 ksps** and leaving restores the +previous rate. See [[sample-rate-switching]]. + +## State machine + +`ModeSm.drawio` gained a `DIGITAL_STATES` composite inside `NORMAL_STATES`, containing +`DIGITAL_RECEIVE` (initial) and `DIGITAL_TRANSMIT`, plus a `TO_DIGITAL_MODE` event. + +| From | Event | Guard | To | +|---|---|---|---| +| `SSB_RECEIVE` | `TO_DIGITAL_MODE` | — | `DIGITAL_STATES` | +| `CW_RECEIVE` | `TO_DIGITAL_MODE` | — | `DIGITAL_STATES` | +| `DIGITAL_RECEIVE` | `TO_SSB_MODE` | — | `SSB_RECEIVE` | +| `DIGITAL_RECEIVE` | `TO_CW_MODE` | — | `CW_RECEIVE` | +| `DIGITAL_RECEIVE` | `PTT_PRESSED` | `IsTxAllowed()` | `DIGITAL_TRANSMIT` | +| `DIGITAL_TRANSMIT` | `PTT_RELEASED` | — | `DIGITAL_RECEIVE` | + +The sample-rate switch lives on the **composite's** enter/exit actions +(`EnterDigitalMode()` / `ExitDigitalMode()` in `Mode.cpp`), not on the leaf states. That is +what makes the rate restore on *every* way out, including the calibration events dispatched +at the `NORMAL_STATES` level — no extra wiring needed. It also means a PTT round trip does +not re-run the entry action and clobber the saved rate. + +**Gotcha worth remembering.** Because those actions run as the composite's entry/exit, they +execute while `modeSM.state_id` is still `DIGITAL_STATES` — the leaf has not been entered +yet. `ChangeSampleRate()` ends in `UpdateTuneState()`, so `DIGITAL_STATES` has to appear in +the receive group of both `UpdateTuneState()` and `UpdateRFHardwareState()` +(`HardwareSm.cpp`). Without it they fall through to `default:` and call `HandleTuneState()` +with a stale tune state, reprogramming the VFO wrongly on every entry and exit. +`ModeSm.DigitalModeTransitionsHandleTheCompositeState` pins this. + +## USB transport: pacing, not reimplementation + +`USBAudio.cpp` keeps the **stock Teensy `AudioInputUSB` / `AudioOutputUSB`** — the same +classes OpenAudio's `USB_Audio_F32.h` wraps — and with them all the core descriptor, DMA, +ISR and isochronous-feedback code. No USB protocol code is written here. + +What does *not* work is putting them in the `AudioConnection` graph directly: the graph is +clocked by the I2S DMA at Fs/128, but these objects must be updated at 44100/128 = 344.53 Hz. +Overfed 4:1, `AudioOutputUSB` only holds two blocks and discards the rest, and +`AudioInputUSB`'s feedback loop is calibrated for the nominal rate. + +The fix is a 4:1 pacer, exact at 176.4 ksps: + +- `update_all()` skips any `AudioStream` whose protected `active` flag is false + (`AudioStream.cpp:445`). Trivial subclasses expose `deactivate()` to clear it. +- `USBAudioInit()`, called from `InitializeAudio()`, takes the six objects off the graph + clock. This must happen at **startup**, not at mode entry — until it does, `update_all()` + is running them 4× too fast and `AudioInputUSB` asks the host for samples faster than we + can consume them. +- `USBAudioPacer` is the only object left in `update_all()`. It runs in the audio ISR and + drives the six manually on every fourth call. +- `AudioConnection::connect()` sets `active = true` on both ends + (`AudioStream.cpp:318,321`), so `deactivate()` has to run *after* the static + `AudioConnection`s are constructed — hence a function, not constructors. + +No ring buffer is needed: `AudioPlayQueue::MAX_BUFFERS` is 80 and +`AudioRecordQueue::max_buffers` is 209 on Teensy 4, so the stock queues absorb the DSP +delivering four blocks at once every 11.6 ms. The play queues are capped at 24 blocks and +prefilled to half depth (see "Fault 1" below - 8 with no prefill left no underrun margin and +dropped audio constantly), and set `NON_STALLING` so `getBuffer()` never blocks the main +loop. The record queues have no cap of their own, so `USBAudioReadTx()` trims them. + +Two library quirks found the hard way: `AudioPlayQueue::stop()` is declared in the header +but **never defined** in Audio 1.3, and Teensy's CMSIS declares `arm_float_to_q15`'s source +pointer non-const. + +## DSP taps + +**Receive** — `InterpolateReceiveData()` in `DSP.cpp`, between the two interpolation stages, +where the block is 512 samples at exactly Fs/4. Deliberately *before* `AdjustVolume()`, so +the level sent to the PC is independent of the front-panel volume knob - which also means +nothing regulates it, hence `ED.digitalRxLevel` (see "Fault 2" below). The scaling is done +into scratch, not in place: the caller still runs the second interpolation stage over that +same buffer to feed the speaker. + +**Transmit** — `ReadUSBTransmitBuffer()` replaces `ReadMicrophoneBuffer()` + +`TXDecimateBy4()`, entering the chain one stage down at `TXDecimateBy2()` (which hardcodes +512 samples in). Everything downstream — `BandEQ`, `TXGain`, Hilbert, IQ correction, +`SidebandSelection`, `PlayIQData` — is untouched, so sideband selection, IQ calibration and +carrier nulling work exactly as they do for SSB. + +**The pacing decision that matters.** `ReadUSBTransmitBuffer()` still gates on +`Q_in_L_Ex`/`Q_in_R_Ex` availability and drains those microphone blocks, discarding the +samples. They are used purely as a clock: they fill from the I2S DMA at exactly the rate the +transmit DAC drains, so `TransmitProcessing()` stays locked to the I2S clock. Letting the +*host's* USB clock pace the DSP loop is what starved the transmit output queue in the earlier +abandoned attempt (see [[usb-audio]]). On a host underrun the function emits silence rather +than failing, so the output queue is never left unfed. + +Two persisted levels, both 0–100 and both in the Microphone menu: +`ED.digitalDriveLevel` ("USB drive", CAT: none) is the software analogue of microphone gain +on transmit; `ED.digitalRxLevel` ("USB RX level", CAT `DR`) attenuates the receive audio sent +to the host, default 25 = −12 dB. + +## Control surfaces + +- **Front panel**: the MODE button now cycles **SSB → CW → DIGITAL → SSB**. The DIGITAL leg + is compiled in only when `AUDIO_INTERFACE` is defined; without it the original SSB ↔ CW + toggle is unchanged. +- **CAT `DG`**: `DG1;` enters, `DG0;` leaves, `DG;` reads. Non-Kenwood. Rejected outright in + builds without a USB audio interface. +- **CAT `DR`**: `DR000;`–`DR100;` set the receive level, `DR;` reads it back zero-padded. +- **`MD` is deliberately inert on the mode.** WSJT-X sends `MD2;` to force USB on startup and + before every transmission; if `SetModulation()` treated that as a request to leave digital + mode the mode would be impossible to hold. Only `DG0;` or the front panel leaves it. `MD3;` + (a genuine mode change to CW) *is* honoured. +- **`MD_read` / `IF_read`** report the plain sideband (1/2) in digital mode, so hamlib sees a + sane mode rather than an unknown one. +- **`TX;` / `RX;`** key and unkey digital transmit — this is how WSJT-X keys the rig. +- **`SR`** is refused in digital mode, because the mode pins the rate. + +## Build configuration + +Digital mode requires **`usb=serialmidiaudio`** (Serial + MIDI + Audio). Teensyduino has no +stock "Dual Serial + Audio" type, so this build has only one CDC port: + +- CAT moves from `SerialUSB1` to the primary `Serial`. `CATSerial` in `SDT.h` is the alias + that hides this; `CAT.cpp` refers only to `CATSerial`. +- `Debug()` compiles to nothing when `AUDIO_INTERFACE` is defined, or its output would + corrupt the CAT stream. +- **CAT clients must be pointed at the first CDC port** in this configuration. + +`code/.vscode/arduino.json` carries the setting, and the `flash-radio` skill reads it. + +## Receive, verified on the bench (2026-07-31) + +Injected carrier at 7075 kHz, dial 7074 kHz, USB — a 1 kHz audio tone. Captured +from the ALSA device with `arecord -D hw:2,0 -f S16_LE -r 44100 -c 2`. + +**Enumeration.** `Teensy MIDI/Audio` (16c0:048a); `/proc/asound/cardN/stream0` +reports 44100 Hz S16_LE stereo on both directions, playback endpoint `ASYNC` with +sync endpoint 0x86 — the isochronous feedback path the design relies on is live. +Capture length is byte-exact (12 s = 2,116,844 B), so nothing is lost at the ALSA +layer. + +**CAT.** `DG1;`/`DG0;`/`DG;` work; `SR;` returns `SR0;` (176.4 ksps) in digital +mode; `MD;`, `FA;`, `IF;` all consistent. CAT is on `/dev/ttyACM0` — the only CDC +port in this build. + +**Results, in the order the faults were found and fixed:** + +| | first capture | + queue fix | + level fix | +|---|---|---|---| +| dropouts (20 s) | 147 runs, 903 ms, **7.55 %** | 1 run, 2.9 ms, 0.015 % | **0 runs, 0.000 %** | +| tone | 993.35 Hz (smeared) | 999.5894 Hz | 999.5676 Hz | +| peak level | −0.2 dBFS | −0.2 dBFS | **−12.3 dBFS** | +| 2nd harmonic | — | −58.8 dB | **−64.5 dB** | + +**No pitch error.** The −0.43 Hz offset on a 1 kHz tone is 0.06 ppm of the +7.075 MHz carrier, i.e. signal-generator versus radio calibration. Tone frequency +measured over the first and last 5 s of a 20 s capture differed by 0.009 Hz, below +the measurement floor. **The 4:1 pacer holds exact rate** — this is the headline +result, since a pacer divisor error would show as a 4× or 25 % frequency ratio. + +### Fault 1: play-queue underrun + +Every zero run in the first capture was an exact multiple of `AUDIO_BLOCK_SAMPLES` +(128/256/384/512), spaced about 133 ms apart. That is +`AudioOutputUSB::update()` substituting a silence block when its input queue is +empty — so an empty play queue is heard as clean digital silence, not as a glitch, +which makes it easy to misread as a dead signal. + +Cause: the queue was capped at 8 blocks and **never prefilled**, so it lived at a +depth of 0–4 blocks. The DSP inherently swings it by 4 blocks every 11.6 ms (four +blocks delivered at once, one consumed every 2.9 ms), leaving no underrun margin +at all; anything that delayed the main loop drained it. The ~133 ms spacing points +at display refreshes as the trigger. + +Fix: depth 8 → 24 blocks, prefilled to half. ~35 ms of margin each way for ~35 ms +of added latency, which is nothing to an FT8 decoder. See `USB_PLAY_QUEUE_BLOCKS`. + +### Fault 2: no headroom + +The stream sat at 98 % of full scale with ~0.15 dB of headroom. This is **not** AGC +action — `ED.agc` was already `AGCOff`, and in that mode the AGC stage +(`DSP.cpp:322`) just applies `fixed_gain = 20.0`, a compile-time constant +(`SDT.h:639`). So the USB level is `RF input × DSP chain gain × 20`, with nothing +regulating it: a stronger signal clips, a weaker one is quiet. Turning AGC *on* +would lower the level but also compress, which digital-mode decoders do not want. + +Fix: `ED.digitalRxLevel` (0–100, default 25 = −12 dB), applied in +`USBAudioWriteRx()` into scratch — not in place, because the caller still has to +run the second interpolation stage over that buffer to feed the speaker. +Adjustable from the Microphone menu ("USB RX level") and over CAT as `DR`. +Measured effect: peak −0.2 → −12.3 dBFS and 2nd harmonic −58.8 → −64.5 dB, so the +chain *was* mildly clipping. + +### Also fixed: CAT sideband selection + +Found while setting up this test and fixed as its own change — `MD2;` selected the +wrong sideband. Pre-existing, in shared SSB/CW code. See [[cat-control]]. + +## Transmit, verified on the bench (2026-07-31) + +AD2 scope probes on the exciter I/Q outputs, 5 W, tone fed into the USB sink. + +**Sideband generation is correct.** USB gives phase(Q)-phase(I) = -89.99 deg with ++41.0 dB image rejection; LSB gives +90.12 deg and -41.2 dB. The sign flips, which +is the direct refutation of the abandoned branch's failure mode - that produced +*double* sideband. Amplitude imbalance -0.16 dB, and both channels are continuous +across every DSP block (the branch's signature was one channel valid for only +~9.5 ms of each 11.6 ms block). Two-tone IMD3 -51 dB, IMD5 -69 dB. + +**Amplitude response** (constant-amplitude sweep, one key-down): peak at 800 Hz, +-3 dB at ~2243 Hz, 1.9 dB spread over 200-1200 Hz and 2.8 dB over 200-2200 Hz, +then -5.9 dB at 2600, -10.8 at 3000, -17.0 at 3200. + +This is the intended SSB passband, not a fault. It is the cascade of +`coeffs12K_8K_LPF_FIR` (decimate-by-2 into the Hilbert, -6 dB at 3500 Hz) and +`FIR_int3_12ksps_48tap_2k7` (the TX audio bandwidth filter, -6 dB at 3039.6 / +-3 dB at 2759 Hz); cascading them explains why the measured -3 dB sits below +`FIR_int3`'s own figure. It is **not** the Hilbert transform - computed from its +actual coefficient tables it is within 0.01 dB and 0.1 deg from 200 Hz up, and +running it at 11.025 kHz rather than its design 12 kHz changes nothing - and not +the equaliser, which is flat. + +*Practical consequence:* place FT8 audio in the **500-1500 Hz** region. At 2400 Hz +you are down 4 dB, at 3000 Hz more than 10 dB. + +### The record queue was exhausting the audio pool + +Transmit showed a 0.53 dB envelope modulation at **344.53 Hz**, which is exactly +44100/128 - the AUDIO_BLOCK_SAMPLES rate. Varying `aplay`'s ALSA period size over +128/256/512/1024 left it at 344.53 Hz throughout (a host-side cause would have +tracked 344/172/86/43 Hz), so the radio was making it. + +The `DS` CAT counters found the cause, and it was not the block joins I first +suspected - underruns and trims were both zero in steady state. It was +`depthMax = 208`: the transmit record queue is `begin()`-ed for the whole of +digital mode but only drained in `DIGITAL_TRANSMIT`, so while receiving it filled +to `AudioRecordQueue`'s 209-block ceiling and held **~418 of the 500 audio +blocks** between its two channels. Everything else in the graph was starved of +blocks, and the resulting glitches appeared at the rate the pacer was applying the +allocation pressure. + +Fixed by bounding the queue in the pacer rather than only in `USBAudioReadTx()`. +Measured effect: + +| | before | after | +|---|---|---| +| envelope ripple (folded) | 0.53 dB | **0.06 dB** | +| sidebands at +/-344 Hz | -27 / -29 dBc | **-74.5 / -75.1 dBc** | +| "sidebands" at +/-86 Hz | -16 / -15 dBc | -26.5 / -33.8 dBc | + +The +/-86 Hz row is carrier skirt, not a sideband - both figures were measured too close in. +See the correction below; at proper resolution the after figure is -93 dBc. + +| broadband floor | -65 dBc | **-84.6 dBc** | +| queue depth min/max | 11 / 208 | **12 / 12** | +| underruns, trims | 0, 197 | **0, 0** | + +47 dB better at the block rate and 20 dB better broadband. Worth remembering as a +general lesson: an unbounded `AudioRecordQueue` does not fail loudly, it quietly +starves every other node in the audio graph. + +### The queue fix helped receive as much as transmit + +Re-measured with the same 1 kHz carrier at the same level, before and after: + +| | before | after (60 s) | +|---|---|---| +| dropouts | 0 | 0 | +| 2nd harmonic | -64.5 dB | **-82.0 dB** | +| noise floor | -119.3 dB | **-135.4 dB** | +| L vs R | differed during settling | identical throughout | + +17.5 dB less distortion and 16 dB lower noise floor on receive, from a fix made for +transmit. Holding ~418 of the 500 audio blocks was causing allocation failures in +the receive path too - never enough to show as a dropout, but enough to raise the +floor and generate harmonics. No drift over 60 s, consistent with the 10-minute +receive measurement. + +### Correction: there are no +/-86 Hz sidebands + +An earlier version of this page reported residual sidebands at the DSP block rate +at -27 dBc. That was a resolution artifact. Those captures were 40.96 ms, giving +24.4 Hz bins, which puts +/-86 Hz only **3.5 bins** from the carrier - inside its +skirt. Repeating with 170 ms captures (5.88 Hz bins, 14.6 bins out) gives +**-93 dBc**. + +What the transmit envelope actually contained before the fix was not a modulation +at all but **discrete ringing transients** at irregular intervals, flat between +them. Impulsive events give broadband spectra, which is why the carrier was smeared +into a pedestal spanning +/-600 Hz at -40 to -60 dBc; probing that pedestal at ++/-86 Hz sampled it at an arbitrary point. Nothing was ever special about 86 Hz. +The 344.53 Hz figure *was* real - that was measured on a 683 ms capture with 1.5 Hz +bins and confirmed by the ALSA-period test. + +After the fix the transmit carrier skirt is -93 dBc at +/-86 Hz and the floor is +-95 dBc; the only spurs above -85 dBc are carrier/DC leakage and the 2nd harmonic. + +**Lesson worth keeping:** before believing a close-in spur, check how many FFT bins +away it is. Anything within ~5 bins is carrier skirt until proven otherwise. + +## Still unverified / open + +- **End-to-end FT8** through WSJT-X over hamlib. +- **Long-run clock drift on transmit.** Receive was measured over 10 minutes with + zero drift events (|drift| < ~5 ppm); transmit has not been run that long. +- **Single- vs dual-VFO.** All bench work so far is on one radio; the abandoned + branch's transmit failure was hardware-dependent (`DIRECT_COUPLED_TX`). +- `digitalDriveLevel` has a menu entry but no CAT command, so it could not be + swept during the IMD test. diff --git a/wiki/firmware/display-subsystem.md b/wiki/firmware/display-subsystem.md new file mode 100644 index 0000000..53aff4d --- /dev/null +++ b/wiki/firmware/display-subsystem.md @@ -0,0 +1,124 @@ +--- +title: Display Subsystem (RA8875, panes, menus, calibration screens) +type: module +status: draft +created: 2026-06-08 +updated: 2026-07-29 +tags: [display, ra8875, ui, spectrum, waterfall, menus, panes, stale-flags, sample-rate] +source_refs: [] +related: ["[[overview]]", "[[ui-state-machine]]", "[[dsp-chain]]", "[[zoom-fft]]", "[[hardware-state-machine]]", "[[persistent-config]]", "[[spectrum-refresh-floor]]", "[[rapid-tune-mute-freeze]]", "[[sample-rate-switching]]", "[[cat-control]]"] +--- + +# Display Subsystem (RA8875) + +The largest UI area by code volume. Renders to an **RA8875**-driven TFT (800×480). **Read-only** +w.r.t. global state by design — it draws what other modules compute, never mutating `ED` or DSP +state. + +## Files +- `MainBoard_Display.cpp` / `.h` — core: the `Pane` model, `DrawDisplay()` router, the + `VariableParameter` editor, menu structures +- `MainBoard_DisplayHome.cpp` (~66 KB) — the home screen and its panes +- `MainBoard_DisplayMenus.cpp` — main/secondary menu rendering +- `MainBoard_DisplayDFE.cpp` — Direct Frequency Entry pad ([[ui-state-machine]]) +- `MainBoard_DisplayEqualizer.cpp` — 14-band TX/RX equalizer screen ([[audio-equalizer]]) +- Calibration screens: `MainBoard_DisplayCalibration_Frequency/Power/RXIQ/TXIQ.cpp` +- Fonts: `FreeSansBold18pt7b.h`, `FreeSansBold24pt7b.h` + +## The pane model — dirty-flag rendering + +The efficiency mechanism that keeps drawing inside the ~10 ms loop budget +([[real-time-constraints]]). Each screen region is a `Pane` (`MainBoard_Display.h:32`): +```c +struct Pane { int x,y,w,h; void (*DrawFunction)(void); bool stale; }; +``` +A pane redraws **only when its `stale` flag is set**; modules flip `stale = true` when the +underlying data changes (e.g. `PaneVFOA.stale = 1` on a VFO switch). The home screen iterates +its `WindowPanes[NUMBER_OF_PANES]` array and redraws just the dirty panes, then clears the flags. + +### The home screen panes (`MainBoard_DisplayHome.cpp:80-92`) +13 panes (the `.ino`'s "12-pane layout" is approximate): + +| Pane | Rect (x,y,w,h) | Shows | +|---|---|---| +| VFO A | 5,5,280,50 | active VFO A frequency | +| VFO B | 300,5,220,40 | VFO B frequency | +| Freq/Band/Mod | 5,60,310,30 | band + modulation | +| **Spectrum** | 5,95,520,345 | main spectrum + waterfall | +| State of Health | 5,445,260,30 | status indicators | +| Time | 270,445,260,30 | RTC clock | +| SWR | 535,15,150,40 | SWR (TX) | +| TX/RX Status | 710,20,60,30 | T/R indicator | +| S-meter | 515,60,260,50 | signal strength | +| Audio Spectrum | 535,115,260,150 | demod audio spectrum | +| Settings | 535,270,260,170 | live settings summary | +| Name Badge | 535,445,260,30 | callsign/name | +| SAM Offset | 320,60,180,30 | synchronous-AM carrier offset ([[synchronous-am-detection]]) | + +## Screen routing — `DrawDisplay()` (`MainBoard_Display.cpp:244`) + +The top-level render dispatch is a `switch` on **`uiSM.state_id`** — i.e. [[ui-state-machine]] +chooses the screen, the display draws it: + +``` +SPLASH→DrawSplash · HOME→DrawHome · MAIN_MENU→DrawMainMenu · SECONDARY_MENU→DrawSecondaryMenu +UPDATE→DrawHome + DrawParameter (variable edit overlay) +EQUALIZER→DrawEqualizerAdjustment · FREQ_ENTRY→DrawFrequencyEntryPad · BIT→DrawBIT +CALIBRATE_{FREQUENCY,RX_IQ,TX_IQ,POWER}→DrawCalibrate* +``` +Each non-home screen defines **its own pane set** (e.g. the frequency-cal screen has freq-plot / +factor / error / instructions panes). So "panes" is a per-screen concept; the table above is the +home screen specifically. + +## Spectrum / waterfall +The main spectrum pane is fed by the **zoom FFT** display path ([[zoom-fft]], `psdnew` → pixel +columns); the audio-spectrum pane by the channel-filter FFT in [[dsp-chain]] (`audioYPixel`). +Refresh period is `≈ NCHUNKS × T_loop` — see [[spectrum-refresh-floor]] (governed by `NCHUNKS` +and per-frame draw cost, not `SPECTRUM_REFRESH_MS`; shipped at 18.8 fps) and +[[real-time-constraints]]. `DrawBandWidthIndicatorBar()` draws the blue filter-bandwidth bar + +cyan tuned-frequency marker over the trace; the bar-stamping math is factored into +`StampTuningBar()` so it can be reused. While a tune encoder is spun fast, +[[rapid-tune-mute-freeze]] hijacks `DrawSpectrumPane()` to freeze the sweep (and, for Fine Tune, +keep only the bar moving via a cheap L2→L1 blit of a held bar-less backdrop). + +### The filter bar draws on the *effective* passband +`EffectivePassbandEdges_Hz()` (`MainBoard_DisplayHome.cpp:457`) exists because the stored +`FLoCut_Hz`/`FHiCut_Hz` follow the sign convention of the **band's default mode** +(`bands[].mode`), which is not necessarily the current `ED.modulation`: the front-panel +DEMODULATION toggle changes the modulation without converting the stored cuts. `InitFilterMask()` +applies the same normalization, so display code that positions the markers must too — otherwise +a USB-over-an-LSB-band bar draws on the **wrong sideband**, and an AM-over-SSB marker lands on +the wrong edge. The AM/SAM case is made symmetric about the carrier. This is the display-side +counterpart of the `MD` CAT bug described in [[cat-control]]: same normalization rule, two +places that had to learn it. + +### Rate-dependent axes +Three things that used to assume 192 ksps now derive from `SR[SampleRate].rate` +([[sample-rate-switching]]): +- **Spectrum frequency ticks** are positioned by `FreqToBin()` at round frequencies + (`:550-571`) rather than from a fixed pixel table with a non-round step, so labels stay + aligned with the trace at any rate; the clear strip was widened so old ticks are wiped on + zoom/tune changes. +- **Audio-spectrum span** is `Fs/32` (`:1301-1303`) — 6.0 kHz at 192 ksps, 5.5 kHz at 176.4 ksps + — not a hard-coded 0–6000 Hz. +- **Settings pane** gained a `"Rate:"` row (`:1654`); Key Type moved down one. + +## Parameter editing & menus +- **`VariableParameter`** (`MainBoard_Display.h:103`) — a type-safe editor (union over i8/i16/ + i32/i64/f32/bool/KeyTypeId with per-type min/max/step). Drives the `UPDATE` state: the encoder + adjusts a bounded `ED` field, `DrawParameter()` overlays the value on the home screen. +- **Menus** — `PrimaryMenuOption primaryMenu[9]` (`MainBoard_DisplayMenus.cpp:602`, + `MainBoard_Display.h:371`) and nested `SecondaryMenuOption`s. A secondary option is either a + `variableOption` (→ UPDATE editor) or a function pointer (→ runs an action, e.g. start a + calibration). This is the data model behind the [[ui-state-machine]] menu stack. It grew + 8 → 9 with the **"Sample Rate"** menu (`:580-611`, [[sample-rate-switching]]). +- A secondary option may also carry a **`postUpdateFunc`**, run after the value changes — e.g. + "Sidetone volume" calls `UpdateSidetoneOscillator` so the change is applied to the running + oscillator rather than only stored. + +## Open questions +- Waterfall scroll/colour-map implementation and how `psdnew` bins map to pixel columns. +- Touch input: does the RA8875 touchscreen drive any UI, or is navigation encoder/button-only? + *(Partly answered: AGC mode is touchscreen-only — see [[filter-hil-test]], which cannot set + it over CAT.)* +- The full `primaryMenu[9]` contents (top-level menu items). diff --git a/wiki/firmware/dsp-chain.md b/wiki/firmware/dsp-chain.md new file mode 100644 index 0000000..2b76194 --- /dev/null +++ b/wiki/firmware/dsp-chain.md @@ -0,0 +1,90 @@ +--- +title: DSP Chain (Audio, FFT, FIR, Noise, CW) +type: module +status: draft +created: 2026-06-08 +updated: 2026-07-30 +tags: [dsp, fft, fir, agc, noise-reduction, cw, openaudio, sample-rate] +source_refs: [] +related: ["[[digital-mode]]", "[[overview]]", "[[real-time-constraints]]", "[[mode-state-machine]]", "[[display-subsystem]]", "[[code-heritage]]", "[[audio-io]]", "[[runtime-filter-design]]", "[[sample-rate-switching]]", "[[tx-filter-hil-test]]"] +--- + +# DSP Chain (Audio, FFT, FIR, Noise, CW) + +The signal-processing core, built on the **OpenAudio_ArduinoLibrary** for real-time +48/96/192 kHz audio. This is the part of the codebase with the deepest lineage back to the +Teensy Convolution SDR ([[code-heritage]]). + +## Files +- `DSP.cpp` (~40 KB) / `DSP.h` — top-level audio routing, AGC, filter coordination +- `DSP_FFT.cpp` (~45 KB) / `DSP_FFT.h` — spectrum analysis (feeds the display waterfall); + `DSP_FFT_stub.cpp` for host-side test builds +- `DSP_FIR.cpp` (~51 KB) — FIR filter coefficient management (bandpass/decimation) +- `DSP_Noise.cpp` (~31 KB) / `DSP_Noise.h` — noise reduction +- `DSP_CWProcessing.cpp` (~24 KB) / `DSP_CWProcessing.h` — CW audio filtering / Morse decode → [[cw-processing]] +- `MainBoard_AudioIO.cpp` / `.h` — audio codec interface (I²S in/out) + +## Role +- **RX** (`ReceiveProcessing`, exact order `DSP.cpp:784-952`): read I/Q → RF gain → + [[iq-imbalance-correction|I/Q correction]] → fine-tune freq shift → **decimate ÷8** → + volume-scale → **convolution channel filter** ([[fast-convolution-filtering]]) → **AGC** + ([[agc-design]]) → **demodulate** ([[ssb-phasing-method]]) → band EQ → **noise reduction** + ([[noise-reduction]]) → optional auto-notch → CW processing (if CW) → **interpolate ×8** → + volume → play. Note AGC precedes demod (acts on the complex envelope); NR follows it. + The [[zoom-fft]] taps the raw I/Q separately for the band display. +- **TX**: mic/key → decimate → **Hilbert ±45° pair** (SSB I/Q gen) / CW tone → sideband + select → interpolate → codec → quadrature mixer. See [[ssb-phasing-method]]. +- Mode routing is directed by [[mode-state-machine]]. + +Filter configuration structs (`ReceiveFilterConfig`, `TransmitFilterConfig`, +`DecimationFilter`, `AGCConfig`) live in `SDT.h` → see [[persistent-config]]. + +## Rebuilding the chain + +`InitializeSignalProcessing()` (`DSP.cpp:758-762`) builds all four filter configurations — the +three `ReceiveFilterConfig` instances (`RXfilters` at the user's zoom, `RXTXfilters`, +`TXIQfilters`) plus `TXfilters`. It runs at boot **and on every sample-rate change** +([[sample-rate-switching]]), which is what regenerates the Hz-specified coefficients +([[runtime-filter-design]]). + +That the three receive instances share code but not state matters: two bugs found in 2026-07 +were exactly a failure of that separation — the AM DC blocker's state was a **file-scope static +shared across all three**, and `ApplyEQBandFilter` scrubbed the *receive* instance's state even +when called on the transmit path. + +⚠️ **Transmit audio changed in V1.4.0 even at 192 ksps.** The decimate-by-2 feeding the Hilbert +stage had a stopband that did not exist (flat to 0.425·Fs where ÷2 needs 0.25·Fs), folding +6–9.5 kHz back into the transmitted audio. See [[runtime-filter-design]], and +[[tx-filter-hil-test]] for the bench measurement of the fold-back. + +Two ordering details of `TransmitProcessing()` (`DSP.cpp:1124-1155`) that matter to anyone +measuring the transmit chain: + +- **`BandEQ` runs before `TXDecimateBy2Again`** (`:1137` vs `:1140`), so the equaliser bank — whose + top cell is 4 kHz — attenuates high-frequency microphone input *before* the stage whose stopband + prevents fold-back. That makes an end-to-end fold-back test weaker evidence about the decimator + than it looks ([[tx-filter-hil-test]]). +- **`Q := I` right after `TXGain`** (`arm_copy_f32(data.I, data.Q, 256)`, `:1139`), so from there + the chain is mono and only the microphone's **left** channel ever reaches the exciter. The + Hilbert pair rebuilds the quadrature relationship downstream ([[ssb-phasing-method]]). +- **`TXGain` scales the exciter output by the requested power** (`:1101-1119`), via + `CalculateSSBTXGain` on `ED.powerOutSSB[band]`. Any measurement of exciter amplitude is + therefore only comparable at a fixed power setting. + +## Related theory +- [[iq-quadrature-sampling]] — complex baseband, the foundation +- [[ssb-phasing-method]] — Hilbert ±45° TX pair + frequency-domain RX sideband selection +- [[fast-convolution-filtering]] — the FFT overlap-save channel filter (Convolution-SDR core) +- [[multirate-decimation]] — ÷8 RX / ÷16 TX rate changes +- [[runtime-filter-design]] — which stages are specified in Hz (regenerated per rate) vs as a + fraction of Fs (left alone), and why prewarping is what makes that work +- [[filter-hil-test]] — bench verification of the above on the real radio +- [[iq-imbalance-correction]], [[agc-design]], [[noise-reduction]], [[zoom-fft]] +- [[synchronous-am-detection]] — SAM (PLL carrier recovery) vs envelope AM +- [[audio-equalizer]] — 14-band parallel filterbank (RX + TX) + +## To flesh out +- [ ] Block diagram of the actual RX and TX chains with sample rates per stage. +- [ ] Which NR algorithm(s) are implemented (spectral subtraction? LMS?). +- [ ] FFT size, windowing, and the [[spectrum-refresh-floor]] timing relationship. +- [ ] AGC attack/decay design. diff --git a/wiki/firmware/filter-boards.md b/wiki/firmware/filter-boards.md new file mode 100644 index 0000000..8372b91 --- /dev/null +++ b/wiki/firmware/filter-boards.md @@ -0,0 +1,139 @@ +--- +title: Filter Boards (BPF / LPF), RF Back-End & Power Sensing +type: module +status: draft +created: 2026-06-08 +updated: 2026-06-08 +tags: [filters, bpf, lpf, relays, ad7991, swr, power-sensing, mcp23017, antenna, pa] +source_refs: [sources/t41-ep-schematics] +related: ["[[overview]]", "[[filter-board-electronics]]", "[[rf-board]]", "[[hardware-state-machine]]", "[[tune-frequency-control]]", "[[persistent-config]]", "[[hardware-platform]]", "[[i2c-bus-map]]", "[[t41-ep-schematics]]"] +--- + +# Filter Boards (BPF / LPF), RF Back-End & Power Sensing + +**Files:** +- `BPFBoard.cpp` / `BPFBoard.h` — receive **band-pass filter** bank (front-end selectivity) +- `LPFBoard.cpp` / `LPFBoard.h` — the RF **back-end board**: low-pass filters *plus* BPF path + routing, transverter, 100 W PA, antenna switching, and SWR/power metering +- `LPFBoard_AD7991.cpp` / `.h` — driver for the AD7991 4-channel I²C ADC (power sensing) + +Despite the name, the **LPF board is the main RF back-end** — it does far more than low-pass +filtering. Both boards are clean hardware-abstraction modules (mockable, like [[rf-board]]), +driven by `HandleTuneState()`/`HandleRFHardwareStateChange()` in [[hardware-state-machine]]. + +## The shared `hardwareRegister` model + +All three RF boards write into **one global 64-bit `hardwareRegister`** (`Globals.cpp:112`), +each owning a bitfield (`SDT.h:69-83`): + +| Bits | Field | Board | +|---|---|---| +| LPFBAND0..3 | LPF band (BCD) | LPF | +| ANT0..1 | antenna select | LPF | +| XVTR | transverter enable | LPF | +| PA100W | 100 W PA select | LPF | +| TXBPF / RXBPF | BPF in TX / RX path | LPF | +| RXTX | T/R state | — | +| CW / MODE / CAL | keying / mode / cal feedback | RF | +| CWVFO / RXVFO | VFO enables | RF | +| BPFBAND0..3 (bit 28+) | BPF band | BPF | + +Setting a field calls `buffer_add()` (`Globals.cpp:246`), which queues the register to be +flushed to the **MCP23017 I²C GPIO expanders** that drive the relays. `UpdateMCPRegisters()` +writes the cached GPIOA/GPIOB bytes out. Each board exposes `Get*MCPRegisters()` test hooks. + +## BPF — band-pass (RX selectivity) + +`SelectBPFBand(band)` narrows the receive front end to the active band. Bands **0–10 plus +15 = BYPASS**. The band→relay control word uses a **byte-swap encoding** (`BPF_WORD` macro, +`BPFBoard.h:48`): compute `1 << band`, swap the two bytes, with a special case folding the +bypass pattern `0x0080 → 0x0008`. The header carries the full band↔word table +(`BPFBoard.h:29-41`) — worth keeping as the canonical reference. + +## LPF — harmonic suppression + back-end routing + +- `SelectLPFBand(band)` (bands 0–10) switches the TX harmonic-suppression low-pass via + `BandToBCD(band)` — the relay driver wants a **4-bit BCD** band code. +- **BPF path routing:** `TXSelectBPF`/`TXBypassBPF`, `RXSelectBPF`/`RXBypassBPF` route the + TX/RX signal through or around the BPF bank. +- **Transverter:** `SelectXVTR`/`BypassXVTR` route to an external VHF/UHF transverter (also + used during calibration to send the signal away from the T/R switch, `HardwareSm.cpp:355`). +- **100 W PA:** `Select100WPA`/`Bypass100WPA` (driven by `ED.PA100Wactive`). +- **Antenna:** `SelectAntenna(0–3)` relay matrix; per-band choice in `ED.antennaSelection` + ([[persistent-config]]). + +### Band-code → relay decode (what the firmware writes) +The firmware never addresses relays directly — it writes the encoded `hardwareRegister` bits to +the MCP23017 (U15, 0x25) and dedicated decoder logic on the control board does the rest +(`LPFBoard.cpp:78-84`, [[i2c-bus-map]]). The bit assignments the code drives: + +- **LPF band** — **GPIOB[0:3]** = 4-bit BCD (`SDT.h:95-106`): 60 m=0000, 160 m=0001, 80 m=0010, + 40 m=0011, 30 m=0100, 20 m=0101, 17 m=0110, 15 m=0111, 12 m=1000, 10 m=1001, 6 m=1010, NF=1111. +- **Antenna** — **GPIOB[4:5]** (2-bit). +- **100 W PA route** — **GPIOB[7]**. +- **BPF path routing** — **GPIOA[0:1]** (TXBPF/RXBPF). + +How those bits are physically decoded (CD74HC4514 / 74HC237 decoders, ULN2803 inverting +drivers, the on-board HF41F relays, and the external per-band 7-element LPF board with its +inductor values) is documented in **[[filter-board-electronics]]**. + +## SWR & power sensing — `PerformSWRBridgeReading()` (`LPFBoard.cpp:589`) + +Reads a directional coupler to compute **forward power, reflected power, and SWR**. There are +**two `#ifdef`-selected front ends with *different* detector hardware and therefore different +math** — a distinction worth getting right: + +**Digital (default, `#else` branch, `LPFBoard.cpp:625-648`).** The coupler feeds **two AD8307 +*log* power detectors** (U14 forward, U19 reflected) whose outputs go to the **AD7991** 12-bit +I²C ADC (**CH0 = forward, CH1 = reflected**), referenced by the on-board **REF3440 4.096 V** +on the ADC's Vin3/Vref pin (schematic-confirmed, [[t41-ep-schematics]]). Because an AD8307 is +**logarithmic**, the code converts mV → dBm → W with the **AD8307 transfer law** (≈25 mV/dB +slope, −84 dBm intercept), plus per-band cal and fixed coupler/pad offsets: +``` +mV = counts · VREF_MV / 4096 +P_dBm = mV / (25 + SWR_*_SlopeAdj[band]) − 84 + SWR_*_Offset[band] + PAD_ATTEN + COUPLER_ATTEN +P_W = 10^(P_dBm/10) / 1000 +|Γ| = sqrt(Pr/Pf); SWR = (1+|Γ|)/(1−|Γ|) +``` + +**Analog (`#ifdef USE_ANALOG_SWR`, `LPFBoard.cpp:591-621`).** A *different* board option: **linear +diode detectors** on Teensy ADC pins 26 (FWD) / 27 (REV). Being linear, this path uses the +square-law `P = (V·10)² / 50` (20 dB coupler ⇒ ×10 V; P = V²/50 Ω). This is **not** used with +the AD8307 hardware and is disabled by default (`USE_ANALOG_SWR` commented out in `Config.h`). + +Guard rails (both): no forward power ⇒ SWR = 1; `|Γ|` clamped < 0.999. Forward/reflected use +**different smoothing constants**. Results cached and read via +`ReadSWR()`/`ReadForwardPower()`/`ReadReflectedPower()`; `ReadSWRLastUpdateMs()` lets the +display detect TX activity. + +## How it ties together +- **Band changes:** `HandleTuneState()` calls `SelectLPFBand` + `SelectBPFBand` + + `SelectAntenna` + the PA select **before** reprogramming the VFO ([[rf-board]]) — so filters + settle before RF appears. See [[hardware-state-machine]]. +- **Power metering** feeds the front-panel power/SWR display and the **power calibration** + routine (`PowerCalSm`), which fits the tanh PA model in [[tune-frequency-control]]. + +## Physical hardware +The three boards this module drives — the BPF/exciter-filter board (MASWSS0179 switches, +MCP23017 U35 0x24), the LPF/100 W PA control board (decoders, ULN2803s, HF41F relays, PA/XVTR +control), the external per-band LPF filter board, and the AD8307/AD7991/REF3440 SWR-sensing +front end — are documented in **[[filter-board-electronics]]** (schematic-traced, +[[t41-ep-schematics]]). See also the platform-level [[hardware-platform]]. + +## Open questions +- ~~Full LPF band↔BCD table and the band-code → CD74HC4514/74HC237 → relay mapping.~~ + **Resolved (2026-06-15, owner net trace):** BCD table (above) + full decode chain in + [[filter-board-electronics]] (GPIOB[0:3]→U12 4514→U9/U10 ULN2803→external relays via J24/J25; + antenna GPIOB[4:5]→U2 74HC237→U4→K4-K7; PA GPIOB[7]→U4→K2/K3; BPF routing GPIOA[0:1]→U5/U6). + The external filter board is ingested too: **one dedicated 7-element LPF per band** (2 relays + each, band-named control nets, Yn = band BCD n). *Remaining (minor):* tabulate the exact + per-band L/C → cutoff frequency. +- ~~⚠ AD8307 (log) vs linear power math.~~ — **RESOLVED, not a bug (2026-06-14, net trace + + schematic owner confirmation).** The **default digital path correctly applies the AD8307 log + law** (mV/25 − 84 → dBm → W, `LPFBoard.cpp:640-643`). The linear `(V·10)²/50` is the *other* + branch (`USE_ANALOG_SWR`), which targets linear **diode** detectors on Teensy pins 26/27 and + is off by default. The earlier flag came from a **wiki error** that attributed the analog-path + formula to the digital path; now corrected. AD8307 OUT (U14 fwd / U19 rev) → AD7991 CH0/CH1; + REF3440 → Vin3/Vref reference (see [[filter-board-electronics]]). → [[t41-ep-schematics]] +- The AD7991 `REGISTER_SETUP` channel-select bits vs. the "CH0+CH1" comment (the setup byte + has the channel nibble = 0; confirm how per-channel reads are configured). diff --git a/wiki/firmware/filter-hil-test.md b/wiki/firmware/filter-hil-test.md new file mode 100644 index 0000000..d52975b --- /dev/null +++ b/wiki/firmware/filter-hil-test.md @@ -0,0 +1,151 @@ +--- +title: Filter Hardware-in-the-Loop Test +type: decision +status: draft +created: 2026-07-29 +updated: 2026-07-29 +tags: [test, verification, hil, analog-discovery, filters, sample-rate, cat, agc] +source_refs: [] +related: ["[[tx-filter-hil-test]]", "[[runtime-filter-design]]", "[[sample-rate-switching]]", "[[cat-control]]", "[[dsp-chain]]", "[[agc-design]]", "[[tune-frequency-control]]", "[[iq-quadrature-sampling]]"] +--- + +# Filter Hardware-in-the-Loop Test + +`code/tools/filter_hil/` — a Python suite that measures the receive DSP filters **on the actual +radio** and checks they land on their labelled frequencies at both sample rates. It exists +because [[runtime-filter-design]] was otherwise only verified in simulation. + +Full operating instructions live in `code/tools/filter_hil/README.md`. This page records the +parts worth knowing without reading it: the method, the two traps, and the result. + +> **Companion suite:** [[tx-filter-hil-test]] does the same job for the transmit chain. Different +> wiring, and a different method — nothing in the transmit chain can be bypassed over CAT, so it +> measures composite responses rather than differences. The two share this suite's CAT plumbing +> (`filter_hil/radio.py`) and its scalar curve fitting (`filter_hil/measure.py`). + +## Rig + +An Analog Discovery 2 drives `W1`/`W2` into the radio's I/Q receive inputs as a quadrature pair +and reads the demodulated audio back off the speaker with `Ch1`. CAT on `/dev/ttyACM1`, +diagnostics on `/dev/ttyACM0`. W1/W2 order does not matter — the suite tries both quadrature +senses and keeps whichever the SSB filter passes. + +## The method: differential measurement + +Every response is the **difference between two captures at the same injected frequency**, one +with the filter engaged and one with it bypassed: + +| Filter | Measured as | +|---|---| +| CW audio filters | `level(CF=k) − level(CF=5)` | +| Equaliser cells | one cell at 100, the rest at 0, against the flat reference | +| SSB convolution filter | `level(FW=x) − level(FW=widest)` | +| AM DC blocker | envelope level at `f_mod`, against 300 Hz | + +Everything the two captures have in common cancels exactly — AWG amplitude flatness, the codec +front end, the decimation rolloff, the SSB mask, the AF volume setting, the DAC, the speaker +amplifier. **That is what makes an absolute-level measurement taken off a speaker terminal good +enough to characterise a filter.** + +The **SSB filter is the control**: it always derived its coefficients from the true sample rate, +so it was never subject to the bug. If it shifts, the rig or the analysis is wrong, not the +firmware. + +## Trap 1: the injection frequency + +⚠️ The single most expensive thing to get wrong. `ReceiveProcessing` shifts **twice** before +decimating — by Fs/4 (`FreqShiftFs4`) and then by the fine tune plus any CW sidetone +(`FreqShiftF`). The tone that demodulates to DC therefore sits at: + +``` +centre = |Fs/4 + fineTuneFreq_Hz| +``` + +and a wanted audio frequency `f` is at `centre ± f`. Worked example from the bench, fine tune +−12250 Hz: + +| Fs | Fs/4 | fine tune | centre | inject for 1 kHz | +|---|---|---|---|---| +| 176.4 ksps | 44100 | −12250 | 31850 | 32850 | +| 192 ksps | 48000 | −12250 | 35750 | 36750 | + +`fineTuneFreq_Hz` is whatever the operator last tuned to and is routinely **several kilohertz** — +far wider than any passband being measured. Omitting it produces **silence at any drive level**, +which is indistinguishable from a dead rig. See [[tune-frequency-control]] for the shift +arithmetic. + +The suite does not assume the relationship; test `map` **measures** it. That test also reports +how far the real demodulation centre sits from nominal — about **−180 ppm** on this radio, which +is the Teensy's fractional I²S clock, not an error. + +## Trap 2: AGC must be off + +⚠️ [[agc-design]]'s look-ahead AGC compresses exactly the amplitude differences the suite +measures, so every filter skirt reads flat. Worse, on a quiet band it runs the gain up and +buries the injected tone 25–30 dB under the hiss — which presents as `iq_order` reporting +negative SNR for *all four* quadrature combinations, and a couple of hundred mV RMS on the +speaker with the AWG silent. + +There is **no CAT command for AGC**; it must be set from the touchscreen menu. The suite +refuses to run otherwise. (Diagnostic: if `PD;` shows the tone in the radio's own spectrum but +the audio does not, the DSP is receiving it and the problem is downstream gain.) + +## The pass criterion + +**Rate invariance, not absolute accuracy.** A corner measured at 192 ksps must land at the same +frequency at 176.4 ksps. The bug moves it by **−8.125 %**; the tolerance is **1.5 %** — a factor +of five between correct and broken. That figure is affordable *because these are IIR designs*, +whose corners are placed by a continuous prewarped parameter rather than quantised onto a tap +grid; the FIR transmit stages cannot hold better than ≈1.2 % and need a looser bound. See +[[runtime-filter-design]]. Absolute accuracy against the labelled frequency is checked +more loosely, because a smooth tilt anywhere in the analog path biases it without saying +anything about the firmware. + +Some equaliser cells are marked *edge limited*, where the SSB filter rather than the cell shapes +what was measured: cells 0 and 1 (198, 250 Hz) sit at or below the 200 Hz low cut, and cell 13 +(4000 Hz) sits in the decimation skirt — whose corner is a fraction of Fs and is *meant* to move +with it. Their absolute tolerance is relaxed; their rate invariance is not. + +## Result + +Measured on the bench (`results/filter_hil_20260728_204015.json`): **95 checks passed, 0 failed**, +against 8.125 % from the frozen tables. + +| Group | Worst \|Δ\| across the rate change | +|---|---| +| CW audio filters (5) | **0.033 %** (median 0.017 %) | +| Equaliser cells, excluding edge limited (11) | **0.160 %** | +| Equaliser cells, edge limited (0, 1, 13) | 0.711 %, 0.367 %, 0.206 % | +| SSB filter — the control (3 widths) | **0.093 %** | + +The three worst cells are precisely the three the suite marks *edge limited*, which is the expected +result rather than a blemish: cells 0 and 1 (198, 250 Hz) sit at or below the SSB low cut and cell +13 (4000 Hz) sits in the decimation skirt, so what was measured there is partly the SSB filter, not +the cell. + +⚠️ An earlier revision of this page summarised the whole result as "within 0.3 %" and the SSB +control as "0.04 %". The first is true only once the edge-limited cells are set aside; the second +was simply wrong. Other pages quoting **0.3 %** for the receive filters' rate invariance are +consistent with the 0.160 % figure above and need no change. + +## The suite tests itself + +`test_filter_hil.py` covers the measurement maths without hardware, **including a check that the +comparison fails when handed a simulated −8.125 % shift**. Without that, a suite that quietly +passed everything would look identical to a working radio. + +## Coupling to the firmware + +- It needed CAT access to settings that were previously touchscreen-only — which is why the + `SR`, `CF`, `EQ` and `FL` commands were added ([[cat-control]]). +- ⚠️ `bandtable.py` **mirrors design constants from `DSP_FIR.cpp` and `Globals.cpp` by hand**. + Nothing detects a firmware value edited without updating it. Re-check that file whenever the + filter design constants change. +- Do not touch the front panel while it runs — menu interaction triggers a settings save, which + would make the test configuration permanent in [[persistent-config]]. + +## Open questions +- AGC-off is enforced by refusal rather than by control. A CAT command for AGC mode would let + the suite set and restore it like everything else it touches. +- The −180 ppm I²S clock offset is measured and tolerated; it has not been checked against the + Teensy's spec or across temperature. diff --git a/wiki/firmware/front-panel.md b/wiki/firmware/front-panel.md new file mode 100644 index 0000000..3c80877 --- /dev/null +++ b/wiki/firmware/front-panel.md @@ -0,0 +1,95 @@ +--- +title: Front Panel (encoders, buttons, LEDs) +type: module +status: draft +created: 2026-06-08 +updated: 2026-06-08 +tags: [front-panel, encoders, buttons, leds, mcp23017, i2c, interrupts, real-time, rotary] +source_refs: [] +related: ["[[overview]]", "[[main-loop]]", "[[ui-state-machine]]", "[[mode-state-machine]]", "[[tune-frequency-control]]", "[[real-time-constraints]]", "[[hardware-platform]]", "[[i2c-bus-map]]", "[[rapid-tune-mute-freeze]]"] +--- + +# Front Panel (encoders, buttons, LEDs) + +**Files:** `FrontPanel.cpp` / `.h`, `FrontPanel_Rotary.cpp` / `.h`. + +Reads the physical controls and turns them into the `InterruptType` events that the +[[main-loop]] FIFO dispatches to [[mode-state-machine]] / [[ui-state-machine]]. This page also +documents the **`encoder-i2c-speed`** branch's two-tier servicing design (the reason this +module was reworked). + +## Hardware: two MCP23017 expanders on I²C (`Wire1`) + +| Device | Inputs/outputs | INT pin | +|---|---|---| +| `mcp1` | 16 front-panel switches (pins 0–15) → buttons 0–15 | `INT_PIN_1` | +| `mcp2` | 6 switches (buttons 16–21), the 4 rotary encoders, 2 LEDs | `INT_PIN_2` | + +Both MCP23017 INT lines are open-drain, active-LOW, wired to Teensy GPIO interrupts (FALLING). + +## The four encoders + +Quadrature encoders handled by **`Rotary_V12`** (`FrontPanel_Rotary.h`), a Ben Buxton-style +state machine adapted for MCP23017 pins, with per-encoder direction reversal and a `BOURN_ENCODERS` +build flag (Bourns parts have A/B swapped). `process()` returns accumulated steps +(interrupt-safe, resets on read). + +| Encoder | Events emitted | Consumer | +|---|---|---| +| volume | `iVOLUME_INCREASE/DECREASE` | AGC/volume | +| filter | `iFILTER_INCREASE/DECREASE` | filter bandwidth | +| centre tune | `iCENTERTUNE_INCREASE/DECREASE` | coarse VFO ([[tune-frequency-control]]) | +| fine tune | `iFINETUNE_INCREASE/DECREASE` | fine software-mixer tune | + +Buttons set `iBUTTON_PRESSED` (with debounce); `GetButton()` returns the id (0–21) for +`HandleButtonPress` in [[main-loop]], routed per UI state ([[ui-state-machine]]). LEDs are +driven by `FrontPanelSetLed(led, state)` → `mcp2.digitalWrite`. + +## Two-tier servicing (the `encoder-i2c-speed` design) + +The problem: MCP23017 reads are **blocking I²C** transfers. Doing them in a high-priority GPIO +ISR would stall audio; doing them only in the main loop ties encoder responsiveness to the +display/DSP cadence (10 ms+ when busy) — so fast tuning felt laggy and dropped steps. The fix +splits the work across two priority levels: + +1. **GPIO ISR — flag only.** `fpInterrupt1ISR`/`fpInterrupt2ISR` (`FrontPanel.cpp:238-250`) + are deliberately minimal: they set `interrupted1`/`interrupted2 = true` and return. **No + I²C in the ISR.** +2. **1 ms timer — deferred I²C drain.** An `IntervalTimer fpServiceTimer` runs + `ServiceFrontPanel()` every 1 ms at **NVIC priority 240** — *below* the OpenAudio update ISR + at **208** (higher number = lower priority on Cortex-M), so encoder/button I²C **can never + delay audio servicing** (`FrontPanel.cpp:340-344`). It performs the actual `interrupt1()` / + `interrupt2()` reads when a flag is set **or the INT pin still reads LOW**. + +Two robustness details: +- **Level recovery:** the MCP INT line stays asserted (LOW) until its GPIO is read, so + `ServiceFrontPanel` also checks `digitalRead(INT_PIN) == 0` — recovering any edge the ISR + missed while the line was already low (`FrontPanel.cpp:261-267`). +- **Single-read optimization:** `interrupt2()` calls `readGPIOAB()` once to grab both ports in + one I²C transaction ("save an I2C instruction for speed", `FrontPanel.cpp:133`) before + decoding all four encoders. + +> Caveat in the code: all Teensy `IntervalTimer`s share the `IRQ_PIT` vector, so the +> `priority(240)` applies to every IntervalTimer, not just this one (`FrontPanel.cpp:340-342`). + +`CheckForFrontPanelInterrupts()` (`FrontPanel.cpp:353`) is the **legacy main-loop poll** — it +polls the INT pins and calls the same `interrupt1()/interrupt2()` drains. It still runs from +[[main-loop]] as a backstop; the level-check makes the two paths idempotent (whoever reads the +GPIO first clears the INT line). + +## Why it matters +This decoupling is the whole point of the `encoder-i2c-speed` branch (commit *"Speed up +encoder handling…"*): tuning latency/step-loss is now bounded by the 1 ms tick rather than the +main-loop budget, while audio integrity is preserved by the priority ordering. Relates to +[[real-time-constraints]] and the [[spectrum-refresh-floor]] finding (both about not coupling +responsiveness to the slow display path). + +The flip side: encoders are now responsive enough that a *fast* spin enqueues a tune event on +nearly every loop, which surfaced audio glitches and a jerky spectrum sweep. The optional +[[rapid-tune-mute-freeze]] feature detects that condition and masks both. + +## Open questions +- Per-button id → physical-label map (0–21 across the two expanders). +- Debounce timing constants and whether long-press is detected here or in [[main-loop]]. +- Whether the legacy `CheckForFrontPanelInterrupts()` main-loop call is now redundant given the + timer, and any measured latency improvement from the branch. diff --git a/wiki/firmware/hardware-state-machine.md b/wiki/firmware/hardware-state-machine.md new file mode 100644 index 0000000..2a252e0 --- /dev/null +++ b/wiki/firmware/hardware-state-machine.md @@ -0,0 +1,117 @@ +--- +title: Hardware & Calibration Coordinator (HardwareSm) +type: module +status: draft +created: 2026-06-08 +updated: 2026-07-31 +tags: [hardware, coordinator, relays, tr-switching, calibration, vfo, statesmith] +source_refs: [] +related: ["[[overview]]", "[[state-machine-architecture]]", "[[mode-state-machine]]", "[[tune-frequency-control]]", "[[rf-board]]", "[[filter-boards]]", "[[iq-imbalance-correction]]", "[[persistent-config]]"] +--- + +# Hardware & Calibration Coordinator (HardwareSm) + +**Files:** `HardwareSm.cpp` (~30 KB) + `HardwareSm.h`, with four calibration partials: +`HardwareSm_PowerCalibration.cpp`, `_ReceiveIQCalibration.cpp`, +`_TransmitCarrierCalibration.cpp`, `_TransmitIQCalibration.cpp`. + +> ⚠️ **Not StateSmith-generated.** Unlike ModeSm/UISm, `HardwareSm.cpp` is **hand-written** +> (no `HardwareSm.drawio`, no generated banner). It is a coordinator built around two +> hand-coded state enums, not a StateSmith machine. The four *calibration sub-machines* it +> drives **are** generated (see below). + +HardwareSm is the **bridge between logical mode and physical hardware**. [[mode-state-machine]] +decides *what* mode the radio is in; HardwareSm translates that into *which relays, signal +paths, filters, and VFO frequencies* — a deliberately **many-to-one** mapping. + +## Two state variables + +```c +enum RFHardwareState { RFCWMark, RFCWSpace, RFReceive, RFTransmit, + RFCalReceiveIQ, RFCalTransmitIQ, RFCalTransmitIQSingleVFO, RFInvalid }; +enum TuneState { TuneReceive, TuneSSBTX, TuneCWTX, + TuneCalReceiveIQ, TuneCalTransmitIQ, TuneInvalid }; +``` + +Both are derived from `modeSM.state_id` by a `switch`. (These `TuneState` values are the real +home of the "TuneReceive/SSBTX/CWTX" that `CLAUDE.md`/`.ino` wrongly attribute to a +"TuneSm" — see [[tune-frequency-control]].) + +## 1. RF hardware state — `UpdateRFHardwareState()` (`HardwareSm.cpp:531`) + +Maps mode → RF board state, then `HandleRFHardwareStateChange()` does the physical switching +(relays, TX/RX path, PA select) with **settling delays** (relay ~6 ms, PIN-diode switching). + +| RFHardwareState | ModeSm states that map to it | +|---|---| +| `RFReceive` | SSB_RECEIVE, CW_RECEIVE, DIGITAL_RECEIVE, **DIGITAL_STATES**, CALIBRATE_FREQUENCY, CALIBRATE_OFFSET_SPACE, CALIBRATE_TX_IQ_SPACE | +| `RFTransmit` | SSB_TRANSMIT, DIGITAL_TRANSMIT, CALIBRATE_OFFSET_MARK | +| `RFCWMark` (key down) | CW_TRANSMIT_MARK/DIT_MARK/DAH_MARK, CALIBRATE_POWER_MARK | +| `RFCWSpace` (key up) | CW_TRANSMIT_SPACE/KEYER_SPACE/KEYER_WAIT, CALIBRATE_POWER_SPACE | +| `RFCalReceiveIQ` | CALIBRATE_RX_IQ | +| `RFCalTransmitIQ` / `…SingleVFO` | CALIBRATE_TX_IQ_MARK (dual-VFO vs. external-analyzer) | + +Key points: +- **CW QSK** uses the distinct `RFCWMark`/`RFCWSpace` pair so key-down/key-up toggles the TX + path quickly without a full T/R relay cycle. +- **Calibration reuses the normal TX/RX hardware** — the cal MARK/SPACE mode states fold onto + the same RFReceive/RFTransmit/RFCWMark states. +- A `previousRadioState` guard skips the (slow) relay work when the RF state is unchanged but + still calls `UpdateTuneState()` (frequency may have moved). `ForceUpdateRFHardwareState()` + bypasses the guard when a non-mode parameter (e.g. PA selection) changes + (`HardwareSm.cpp:598`). + +## 2. Tune state — `UpdateTuneState()` → `HandleTuneState()` (`HardwareSm.cpp:639,715`) + +Maps mode → `TuneState`, then `HandleTuneState()` programs **band-dependent hardware** in +order — PA (100 W vs bypass), `SelectLPFBand`, `SelectBPFBand`, `SelectAntenna`, +`UpdateFIRFilterMask` — and finally the **VFO frequency** via the [[rf-board]], using the math +in [[tune-frequency-control]]. The per-state frequency formulas and the SSB-TX 3rd-harmonic +monitor trick are documented there. Calibration tune states place the VFOs specially (e.g. +`TuneForReceiveIQCalibration` puts the test tone Fs/4 from the LO, `HardwareSm.cpp:605`). + +[[digital-mode]] adds no tune state of its own: `DIGITAL_RECEIVE` → `TuneReceive` and +`DIGITAL_TRANSMIT` → `TuneSSBTX`, since digital transmit *is* an SSB transmission with the +audio arriving over USB. What it does add is the **composite** `DIGITAL_STATES` in the receive +group of both this function and `UpdateRFHardwareState()`. `EnterDigitalMode()`/ +`ExitDigitalMode()` are the composite's entry/exit actions and call `ChangeSampleRate()`, which +ends in `UpdateTuneState()` while `state_id` is still the composite — the leaf has not been +entered yet. Without those cases it falls to `default:` and reprograms the VFO from a stale tune +state on every entry and exit (`HardwareSm.cpp:727-741`). + +## 3. Calibration orchestration + +Four routines, each a hand-written **partial that wraps a StateSmith-generated sub-machine** +(state maps documented in [[calibration-state-machines]]): + +| Partial file | Sub-machine (generated) | Calibrates | Theory | +|---|---|---|---| +| `HardwareSm_PowerCalibration.cpp` | `PowerCalSm` | PA output power curve | tanh fit, [[tune-frequency-control]] | +| `HardwareSm_ReceiveIQCalibration.cpp` | `ReceiveIQCalSm` | RX I/Q balance | [[iq-imbalance-correction]] | +| `HardwareSm_TransmitIQCalibration.cpp` | `TransmitIQCalSm` | TX I/Q balance | [[iq-imbalance-correction]] | +| `HardwareSm_TransmitCarrierCalibration.cpp` | `TransmitCarrierCalSm` | TX carrier null (LO leakage) | (distinct from image) | + +Each partial: starts its sub-SM (`PowerCalSm_start`, …), dispatches events to step it +(`…_EventId_AUTO`, `NEXT_POINT`, `RECORD_DATA_POINT`, `RESET`, …), and bridges results back +into the RF/tune state and the `ED` calibration arrays ([[persistent-config]]). The +**power-cal** routine records (attenuation, power) points and fits the tanh PA model +(`CalculatePowerCurveFit` → `FitPowerCurve` in `Tune.cpp`); the **IQ** routines run the +sideband-separation sweep documented in [[iq-imbalance-correction]]. + +Calibration is **entered** when [[mode-state-machine]] takes a `CALIBRATE_*` event into its +`CALIBRATION_STATES` branch; the sub-SMs are **driven** from [[main-loop]] (front-panel cal +actions, `Loop.cpp:720-795`) and from these partials. + +## Invocation +`UpdateRFHardwareState()` is called by `UpdateHardwareState()` (`Mode.cpp:24`) on every ModeSm +state entry, and directly from [[main-loop]] on frequency/band/mode changes +(`Loop.cpp:438-578`). This is the single funnel through which all hardware reconfiguration +flows. + +## Open questions +- ~~Full state map of each generated cal sub-SM~~ → done in [[calibration-state-machines]] + (`PowerCalSm` POWERPOINT1/READ_AND_ADJUST/ + POWERCOMPLETE, etc.) — only partially traced. +- `RFCalTransmitIQSingleVFO` external-analyzer flow vs. the dual-VFO self-cal path. +- Exact relay/PIN-diode settling delays and their T/R timing budget vs. [[real-time-constraints]]. +- Whether a `TX carrier-null` theory page should be split out of [[iq-imbalance-correction]]. diff --git a/wiki/firmware/main-loop.md b/wiki/firmware/main-loop.md new file mode 100644 index 0000000..a0ff819 --- /dev/null +++ b/wiki/firmware/main-loop.md @@ -0,0 +1,75 @@ +--- +title: Main Loop & Event Dispatch (Loop.cpp) +type: module +status: draft +created: 2026-06-08 +updated: 2026-06-08 +tags: [loop, events, interrupts, real-time, cw-keyer] +source_refs: [] +related: ["[[overview]]", "[[mode-state-machine]]", "[[ui-state-machine]]", "[[front-panel]]", "[[real-time-constraints]]", "[[cat-control]]", "[[tune-frequency-control]]", "[[rapid-tune-mute-freeze]]"] +--- + +# Main Loop & Event Dispatch (Loop.cpp) + +**Files:** `Loop.cpp` (~62 KB), `Loop.h`. The heart of the firmware's control flow: it +owns `loop()`, the interrupt event FIFO, and the CW-key/PTT input plumbing. + +## `loop()` execution sequence + +`loop()` is marked `FASTRUN` (placed in RAM for speed) and must complete each pass in +**~10 ms** to avoid audio buffer overflow ([[real-time-constraints]]). Per-iteration order +(from `Loop.h`): + +1. Shutdown check (power-off request → [[persistent-config]] save, then `ShutdownTeensy()`) +2. CW key debounce +3. Poll front panel (encoders + buttons) → [[front-panel]] +4. Poll CAT serial → [[cat-control]] +5. Consume queued interrupt events → dispatch to [[mode-state-machine]] / [[ui-state-machine]] +6. Update hardware (VFO, filters, attenuators) +7. Run DSP → [[dsp-chain]] +8. Refresh display (spectrum rate-limited) → [[display-subsystem]] + +## Event-driven input: the interrupt FIFO + +Interrupt handlers don't act directly — they **enqueue** an `InterruptType` into a 16-slot +FIFO that the main loop drains. This decouples ISR timing from processing. + +API (in `Loop.h`): +- `SetInterrupt(i)` — append event (drops oldest if full) +- `PrependInterrupt(i)` — push to front; used by the **iambic keyer paddle-memory** feature +- `GetInterrupt()` — peek head without consuming +- `ConsumeInterrupt()` — pop + dispatch +- `GetInterruptFifoSize()` — depth, for overflow diagnostics + +### `InterruptType` events +PTT (`iPTT_PRESSED/RELEASED`), CW keys (`iKEY1_PRESSED/RELEASED`, `iKEY2_PRESSED`), +encoders (volume / filter / center-tune / fine-tune ± ), buttons (`iBUTTON_PRESSED`), +VFO/mode/power changes, tune update requests, equalizer, BIT display, and the five +calibration triggers (`iCALIBRATE_POWER/FREQUENCY/RX_IQ/TX_IQ`, `iCALIBRATE_EXIT`) that +drive the [[hardware-state-machine]]. + +The four HOME-state center/fine tune cases in `ConsumeInterrupt()` also call +`NoteTuneActivity()`, the entry point for the [[rapid-tune-mute-freeze]] detector (which then +mutes audio and freezes/decouples the spectrum while a tune knob is spun fast). + +## CW key / PTT handling + +`SetupCWKeyInterrupts()` configures KEY1, KEY2, PTT with pull-ups and attaches handlers +(KEY1 on CHANGE, KEY2 on FALLING, PTT on CHANGE). Keyer behavior is configurable: +- `SetKeyType(KeyTypeId_Straight | KeyTypeId_Keyer)` — straight key vs. iambic keyer +- `SetKey1Dit()` / `SetKey1Dah()` — paddle assignment (`ED.keyerFlip`) for handedness + +Precise dit/dah timing comes from the **1 ms `tick1ms()` timer** (in `PhoenixSketch.ino`), +which feeds DO events to ModeSm. + +## Other responsibilities + +- `CheckForSerialTimeSync()` — accepts a PJRC `T` packet on USB serial to set the + Teensy RTC + TimeLib clock. +- `ShutdownTeensy()` — graceful power-off: persists state to LittleFS + SD, signals the + ATTiny power-management circuit, then lets power be cut. + +## Open questions / TODO +- Document the exact hardware-update step (what gets pushed each pass vs. only on change). +- Confirm the exact hardware-update step; spectrum-refresh timing is documented in + [[spectrum-refresh-floor]] (redraw ≈ `NCHUNKS × T_loop`). diff --git a/wiki/firmware/mode-state-machine.md b/wiki/firmware/mode-state-machine.md new file mode 100644 index 0000000..31135a8 --- /dev/null +++ b/wiki/firmware/mode-state-machine.md @@ -0,0 +1,138 @@ +--- +title: Mode State Machine (ModeSm) +type: module +status: draft +created: 2026-06-08 +updated: 2026-07-30 +tags: [state-machine, ssb, cw, transmit, keyer, iambic, calibration, statesmith] +source_refs: [] +related: ["[[digital-mode]]", "[[overview]]", "[[state-machine-architecture]]", "[[tune-frequency-control]]", "[[main-loop]]", "[[hardware-state-machine]]", "[[ssb-phasing-method]]", "[[rf-board]]", "[[audio-io]]", "[[cat-control]]"] +--- + +# Mode State Machine (ModeSm) + +**Files:** `ModeSm.cpp` (~69 KB, **generated**), `ModeSm.h`, source diagram +`ModeSm.drawio`; hand-written actions/guards in `Mode.cpp` / `Mode.h`. The largest state +machine in the project. StateSmith algorithm: *Balanced2*. Do **not** hand-edit the `.cpp` — +edit `ModeSm.drawio` and regenerate ([[state-machine-architecture]]). + +> ⚠️ The `PhoenixSketch.ino` header lists ModeSm's states as "SSB_RECEIVE, SSB_TRANSMIT, +> CW_RECEIVE, CW_TRANSMIT, TUNE". That is **out of date**: there is **no `TUNE` state**, and +> CW transmit is actually six sub-states. The authoritative list is `ModeSm.h` (below). + +## Role +Owns the radio's **operating mode and TX/RX switching**, the **CW keyer**, and the entry +into **calibration**. State entry/exit actions reconfigure hardware via +`UpdateHardwareState()` → `UpdateRFHardwareState()` + `UpdateAudioIOState()` (`Mode.cpp:23`), +so every mode change deterministically reprograms the [[rf-board]] and audio I/O. + +## State hierarchy (`ModeSm.h:43-65`) + +``` +ROOT +├── NORMAL_STATES +│ ├── SSB_RECEIVE ← default operating state +│ ├── SSB_TRANSMIT +│ ├── CW_RECEIVE +│ ├── CW_TRANSMIT_MARK ┐ straight key (carrier on/off) +│ ├── CW_TRANSMIT_SPACE ┘ +│ ├── CW_TRANSMIT_DIT_MARK ┐ +│ ├── CW_TRANSMIT_DAH_MARK │ iambic keyer +│ ├── CW_TRANSMIT_KEYER_SPACE │ (auto-timed elements) +│ └── CW_TRANSMIT_KEYER_WAIT ┘ +└── CALIBRATION_STATES + ├── CALIBRATE_FREQUENCY + ├── CALIBRATE_OFFSET_MARK / CALIBRATE_OFFSET_SPACE + ├── CALIBRATE_POWER_MARK / CALIBRATE_POWER_SPACE + ├── CALIBRATE_RX_IQ + └── CALIBRATE_TX_IQ_MARK / CALIBRATE_TX_IQ_SPACE +``` + +`MARK` = transmitter/carrier keyed on, `SPACE` = off — the calibration MARK/SPACE pairs let +the routine toggle a TX tone for measurement. + +## Events (`ModeSm.h:18-36`) and where they originate + +All dispatched from [[main-loop]] (`ModeSm_dispatch_event(&modeSM, …)`): + +| Event | Source | Meaning | +|---|---|---| +| `DO` | **1 ms timer** `TimerInterrupt()` (`Loop.cpp:355`) | keyer/timeout tick | +| `PTT_PRESSED` / `PTT_RELEASED` | PTT handler (`Loop.cpp:1318/1322`) | SSB TX key | +| `KEY_PRESSED` / `KEY_RELEASED` | straight-key handler (`Loop.cpp:1332/1340`) | straight-key | +| `DIT_PRESSED` / `DAH_PRESSED` | paddle decode (`Loop.cpp:920-930`) | iambic paddles | +| `TO_SSB_MODE` / `TO_CW_MODE` | mode toggle (`Loop.cpp:479/484`) | SSB↔CW | +| `CALIBRATE_FREQUENCY/RX_IQ/TX_IQ/POWER` | cal triggers (`Loop.cpp:1359-1379`) | enter cal | +| `CALIBRATE_EXIT` | (`Loop.cpp:1388`) | leave cal | +| `OFFSET_START` / `OFFSET_END` | freq-cal offset (`Loop.cpp:857/872`) | offset measurement | + +## Normal-mode transition map (`ModeSm.cpp:330-458`) + +- **SSB_RECEIVE** → `PTT_PRESSED` ⇒ SSB_TRANSMIT; `TO_CW_MODE` ⇒ CW_RECEIVE. +- **SSB_TRANSMIT** → `PTT_RELEASED` ⇒ SSB_RECEIVE. +- **CW_RECEIVE** → `KEY_PRESSED` ⇒ CW_TRANSMIT_MARK (straight key); `DIT_PRESSED` ⇒ + CW_TRANSMIT_DIT_MARK; `DAH_PRESSED` ⇒ CW_TRANSMIT_DAH_MARK (keyer); `TO_SSB_MODE` ⇒ + SSB_RECEIVE. + +> ⚠️ **`TO_SSB_MODE` used to be dispatched only from the front-panel button** +> (`Loop.cpp:479/484`). CAT's `MD` command changed `bands[].mode` without dispatching it, so a +> CAT client could put the radio into CW and **never get it out**. `MD1`/`MD2` now dispatch +> `TO_SSB_MODE` when in CW receive — see [[cat-control]]. The general lesson: a mode change that +> does not go through this state machine is not a mode change. +- Transmit transitions are guarded by **`IsTxAllowed()`** = current band is a `HAM_BAND` + (`Mode.cpp:39`) — the safety interlock that blocks TX out of band. + +### Straight-key CW (semi-break-in) +`CW_TRANSMIT_MARK` (carrier on) →`KEY_RELEASED`→ `CW_TRANSMIT_SPACE` (carrier off). SPACE +runs a `DO` countdown against `waitDuration_ms` (= `CW_TRANSMIT_SPACE_TIMEOUT_MS`, +`Globals.cpp:547`); a new `KEY_PRESSED` returns to MARK, otherwise it times out back to +CW_RECEIVE. On entering SPACE, `ModeCWTransmitSpaceEnter()` re-checks the key lines and +re-queues a press if still held (`Mode.cpp:28`). + +### Iambic keyer (auto-timed) +Driven by the `DO` tick incrementing `markCount_ms` / `spaceCount_ms` (`ModeSm_Vars`): + +| State | `DO` action | Transition | +|---|---|---| +| `CW_TRANSMIT_DIT_MARK` | `markCount_ms++` | `≥ ditDuration_ms` ⇒ KEYER_SPACE | +| `CW_TRANSMIT_DAH_MARK` | `markCount_ms++` | `≥ 3·ditDuration_ms` ⇒ KEYER_SPACE | +| `CW_TRANSMIT_KEYER_SPACE` | `spaceCount_ms++` | `≥ ditDuration_ms` ⇒ KEYER_WAIT | +| `CW_TRANSMIT_KEYER_WAIT` | timeout | `DIT_PRESSED`⇒DIT_MARK, `DAH_PRESSED`⇒DAH_MARK | + +This is standard Morse timing — **dit = 1 unit, dah = 3 units, inter-element space = 1 unit** +— with `ditDuration_ms = 60000/(50·WPM) = 1200/WPM` (`Globals.cpp:131`, the PARIS formula), +`WPM = ED.currentWPM` (also settable over CAT, `CAT.cpp:475`). + +### Iambic paddle memory +Because element timing runs to completion, a paddle squeezed *during* an element must be +remembered. [[main-loop]] handles this (`Loop.cpp:914-947`): in CW_RECEIVE / KEYER_WAIT a +paddle press is dispatched immediately; in DIT_MARK / DAH_MARK / KEYER_SPACE it is +**re-queued to the front of the FIFO** (`PrependInterrupt`) so it fires the instant the keyer +reaches KEYER_WAIT — classic iambic dot/dash memory. `ED.keyerFlip` swaps which physical +paddle (KEY1/KEY2) is dit vs. dah (`Loop.cpp:919-930`). + +## Calibration branch +The four `CALIBRATE_*` events are handled by the `NORMAL_STATES` ancestor from **any** normal +state (`ModeSm.cpp:339-342` etc.), transitioning into `CALIBRATION_STATES`; `CALIBRATE_EXIT` +returns. ModeSm here owns the **TX keying/sequencing** for calibration (the MARK/SPACE +toggling, `PTT_PRESSED` advancing within e.g. `CALIBRATE_POWER_SPACE`), while the actual +measurement/optimization algorithms run in the dedicated sub-machines — +[[hardware-state-machine]] (PowerCalSm, ReceiveIQCalSm, TransmitCarrierCalSm, +TransmitIQCalSm) and the IRR sweep documented in [[iq-imbalance-correction]]. + +## Interactions +- **Button lockout:** `HandleButtonPress()` ignores all front-panel buttons while ModeSm is + in any TX/keyed state or `CALIBRATE_*_MARK` (`Loop.cpp:395-403`). +- **RX CW decode:** in `CW_RECEIVE` the RX chain runs the CW audio filter + adaptive Morse + decoder — see [[cw-processing]]. +- **RX DSP:** the RX chain checks `modeSM.state_id == CW_RECEIVE` to switch in CW audio + processing (`DSP.cpp:935`, see [[dsp-chain]]). +- **VFO setup** for each mode is delegated to `HandleTuneState()` in + [[hardware-state-machine]] (which uses [[tune-frequency-control]] math) via the hardware + update. + +## Open questions +- Exact `OFFSET_START`/`OFFSET_END` flow in frequency calibration (only partially traced). +- Whether `CW_TRANSMIT_KEYER_WAIT` timing out to CW_RECEIVE uses `waitDuration_ms` too. +- Update the stale `PhoenixSketch.ino` state list (TUNE/CW_TRANSMIT) — tracked in + [[documentation-todos]]. diff --git a/wiki/firmware/overview.md b/wiki/firmware/overview.md new file mode 100644 index 0000000..d5a5f38 --- /dev/null +++ b/wiki/firmware/overview.md @@ -0,0 +1,131 @@ +--- +title: Firmware Architecture Overview +type: overview +status: draft +created: 2026-06-08 +updated: 2026-07-31 +tags: [architecture, state-machines, dsp, teensy] +source_refs: [] +related: ["[[main-loop]]", "[[mode-state-machine]]", "[[digital-mode]]", "[[ui-state-machine]]", "[[tune-frequency-control]]", "[[hardware-state-machine]]", "[[rf-board]]", "[[filter-boards]]", "[[dsp-chain]]", "[[display-subsystem]]", "[[front-panel]]", "[[cat-control]]", "[[persistent-config]]", "[[code-heritage]]", "[[hardware-platform]]", "[[i2c-bus-map]]", "[[sample-rate-switching]]", "[[runtime-filter-design]]"] +--- + +# Firmware Architecture Overview + +Phoenix is the firmware for a **Teensy 4.1-based amateur radio transceiver** (the T41-EP +SDR). It is a complete software-defined radio: RF hardware control, real-time DSP, a +touchscreen UI, and CAT computer control, all running on a single ARM Cortex-M7. + +The canonical hand-written architecture note lives in the source at +`code/src/PhoenixSketch/PhoenixSketch.ino` (header comment). This page is the wiki's +navigable summary; module pages drill into each subsystem. + +## Design philosophy + +The codebase is organized around five recurring principles (stated in the `.ino` header): + +1. **Separation of concerns** — hardware control, signal processing, UI, and display are + isolated modules with clear interfaces. +2. **State-machine control** — all hardware state changes flow through state machines, so + behavior is deterministic and predictable. See [[state-machine-architecture]]. +3. **Real-time constraints** — the main loop must complete within ~10 ms to avoid audio + buffer overflows; display work is rate-limited. See [[real-time-constraints]]. +4. **Read-only display** — display code reads global state but never mutates it. +5. **Hardware abstraction** — board interfaces (RF/LPF/BPF/Main) present clean APIs so + hardware can be mocked in unit tests. + +## Layered structure + +``` + Front panel (encoders, buttons, PTT, CW key) CAT (USB serial) + │ │ + interrupt events (FIFO) command parser + │ │ + ┌────────────────▼────────────────────────────────────▼──────────┐ + │ Main Loop (Loop.cpp) │ + │ poll input · dispatch events · update HW · run DSP · draw │ + └───┬───────────────┬───────────────┬───────────────┬────────────┘ + │ │ │ │ + State machines RF / filter DSP chain Display + ModeSm UISm hardware (OpenAudio) (RA8875) + HardwareSm(+cal) RFBoard/si5351 DSP_FFT/FIR/ MainBoard_Display* + LPFBoard BPFBoard Noise/CW + │ + Persistent config (ED struct in SDT.h · Storage · ParamSave) + Tuning math: Tune.cpp (frequency/power functions, not a state machine) +``` + +## State machines + +Phoenix is unusually state-machine-heavy: **six StateSmith-generated** machines (each with a +`.drawio` source) plus a **hand-written** hardware coordinator. + +| Machine | File | Generated? | Role | +|---|---|---|---| +| ModeSm | `ModeSm.cpp/h` | ✔ StateSmith | Operating mode: SSB/CW/DIGITAL × RX/TX, iambic keyer, calibration entry | +| UISm | `UISm.cpp/h` | ✔ StateSmith | Screen/menu navigation (SPLASH→HOME→menus) | +| PowerCalSm | `PowerCalSm.cpp/h` | ✔ StateSmith | Power-amplifier calibration sub-routine | +| ReceiveIQCalSm | `ReceiveIQCalSm.cpp/h` | ✔ StateSmith | RX I/Q balance calibration | +| TransmitCarrierCalSm | `TransmitCarrierCalSm.cpp/h` | ✔ StateSmith | TX carrier-null calibration | +| TransmitIQCalSm | `TransmitIQCalSm.cpp/h` | ✔ StateSmith | TX I/Q balance calibration | +| **HardwareSm** | `HardwareSm.cpp/h` | ✘ hand-written | Maps mode→RF/tune hardware state; drives the 4 cal sub-machines | + +> Two `CLAUDE.md`/`.ino` myths corrected here: there is **no "TuneSm"** (`Tune.cpp` is a +> function library, [[tune-frequency-control]]; the `TuneReceive/SSBTX/CWTX` states live in +> the hand-written HardwareSm), and **HardwareSm itself is not StateSmith-generated**. + +See [[mode-state-machine]], [[ui-state-machine]], [[tune-frequency-control]], +[[hardware-state-machine]]. + +## Execution flow + +- **`setup()`** (in `Globals.cpp`) — initialize display, audio, RF/filter boards, and + front panel; load settings from persistent storage; start the state machines; arm a + 1 ms timer for state-machine DO events. +- **`loop()`** (in [[main-loop]], `Loop.cpp`) — runs continuously, ~10 ms/iteration: + shutdown check → CW key debounce → poll front panel → poll CAT → consume queued events → + update hardware → run DSP → refresh display (spectrum rate-limited). +- **`tick1ms()`** (in `PhoenixSketch.ino`) — 1 ms interrupt dispatching DO events to + ModeSm (CW keyer timing) and UISm (menu timeouts). + +Input is **event-driven**: interrupt handlers enqueue `InterruptType` events into a 16-slot +FIFO that the main loop drains via `ConsumeInterrupt()`. See [[main-loop]] for the event +list and queue semantics. + +## Module map + +**Hardware control** — [[rf-board]] (Si5351 VFO, TX/RX switching, attenuators), +[[filter-boards]] (LPF/BPF relay banks, AD7991 power sensing), [[front-panel]] +(encoders/buttons). + +**Signal processing** — [[dsp-chain]] (DSP.cpp routing/AGC, DSP_FFT spectrum, DSP_FIR +filters, DSP_Noise NR, DSP_CWProcessing), plus MainBoard_AudioIO codec interface and +`USBAudio.cpp`, the 4:1-paced USB audio transport used by [[digital-mode]]. + +**User interface** — [[display-subsystem]] (RA8875 12-pane layout, home/menus/calibration +screens), [[ui-state-machine]]. + +**Radio control** — [[mode-state-machine]], [[tune-frequency-control]], [[cat-control]] +(Kenwood TS-480-style emulation). + +**Configuration & persistence** — [[persistent-config]] (the `ED` EEPROM-data struct in +`SDT.h`, `Storage.cpp`, `ParamSave.cpp`, `Config.h`). + +## Hardware target + +- **MCU**: Teensy 4.1 (ARM Cortex-M7, 600 MHz) +- **RF**: Si5351 clock generator for quadrature VFO; relay-switched BPF/LPF banks +- **Audio**: real-time via the OpenAudio_ArduinoLibrary; raw rate **192 kHz** default or + **176.4 kHz**, selectable at run time and persisted ([[sample-rate-switching]]) +- **Display**: RA8875-driven TFT +- **Front panel I/O**: MCP23017 I²C GPIO expanders; rotary encoders + +## Heritage + +Phoenix descends from Frank Dziock DD4WH's **Teensy Convolution SDR**, heavily reworked by +the T41-EP community. See [[code-heritage]] for the lineage and the multi-author history. + +## Testing + +Unit tests use **Google Test + CMake** under `code/test/`, with Arduino, Si5351, GPIO, and +audio interfaces mocked so logic and state transitions run on a host machine. See +`wiki/CLAUDE.md` for how the wiki tracks design decisions discovered while testing. diff --git a/wiki/firmware/persistent-config.md b/wiki/firmware/persistent-config.md new file mode 100644 index 0000000..fb2d6fb --- /dev/null +++ b/wiki/firmware/persistent-config.md @@ -0,0 +1,95 @@ +--- +title: Persistent Configuration (ED struct, Storage, ParamSave) +type: module +status: draft +created: 2026-06-08 +updated: 2026-07-31 +tags: [config, ed-struct, littlefs, sdcard, json, persistence, globals, bands, sample-rate] +source_refs: [] +related: ["[[overview]]", "[[main-loop]]", "[[tune-frequency-control]]", "[[hardware-state-machine]]", "[[iq-imbalance-correction]]", "[[dsp-chain]]", "[[sample-rate-switching]]"] +--- + +# Persistent Configuration + +How the radio's operating state and calibration survive power cycles. The data backbone every +other module reads from. + +## `ED` — the single source of truth + +`ED` is one global instance of `struct config_t` (`SDT.h:264-331`). It holds **all runtime +operating configuration and calibration**, with sensible inline defaults. Field groups: + +| Group | Fields (selected) | +|---|---| +| Audio / DSP | `agc`, `audioVolume`, `rfGainAllBands_dB`, `nrOptionSelect`, `ANR_notchOn`, `currentMicGain`, **`sampleRate`**, `digitalDriveLevel`, `digitalRxLevel` | +| Tuning | `activeVFO`, `currentBand[2]`, `centerFreq_Hz[2]`, `fineTuneFreq_Hz[2]`, `stepFineTune`, `freqIncrement`, `freqCorrectionFactor`, `lastFrequencies[band][3]` | +| Modulation/CW | `modulation[2]`, `keyType`, `currentWPM`, `keyerFlip`, `CWToneIndex`, `CWFilterIndex`, `sidetoneVolume`, `decoderFlag` | +| Spectrum/display | `spectrum_zoom`, `spectrumScale`, `spectrumNoiseFloor[band]`, `spectrumFloorAuto`, `dbm_calibration[band]` (S-meter) | +| Equalizer | `equalizerRec[14]`, `equalizerXmt[14]` | +| Power / PA | `powerOutCW[band]`, `powerOutSSB[band]`, `PA100Wactive`, `PowerCal_20W/100W_Psat_mW[band]`, `…_kindex[band]`, `…_threshold_W`, `…_DSP_Gain_correction_dB` | +| Calibration | `IQAmp/PhaseCorrectionFactor[band]` (RX), `IQXAmp/XPhaseCorrectionFactor[band]` (TX), `DCOffsetI/Q[band]` (carrier null), `XAttenCW[band]`, `RAtten[band]`, `SWR_F/R_SlopeAdj/Offset[band]` | +| Routing | `antennaSelection[band]` | + +Many fields are **per-band arrays** (`NUMBER_OF_BANDS = 13`). The calibration arrays are +written by the routines in [[hardware-state-machine]] / [[iq-imbalance-correction]] and the +power-cal tanh fit in [[tune-frequency-control]]; the tuning fields by +[[tune-frequency-control]]; the DSP fields by [[dsp-chain]]. + +> **Naming gotcha:** `ED` stands for "EEPROM Data" and the `.ino` says settings are saved to +> "EEPROM" — but the Teensy 4.1 has no true EEPROM and the implementation actually uses +> **LittleFS + SD card JSON** (below). The name is historical. Logged in [[documentation-todos]]. + +## Supporting definitions +- **`Config.h`** — compile-time constants: pin assignments, `NUMBER_OF_BANDS`, default WPM / + band / frequencies, feature flags. (Compile-time config vs. `ED`'s runtime config.) +- **`Globals.cpp`** — definitions of everything declared `extern` in `SDT.h`: `ED` itself, + `SampleRate`, the `hardwareRegister`, the state-machine instances (`modeSM`, `uiSM`, …), the + `SR[]` sample-rate table, and the `bands[]` table. Also `ComputeDitDuration` etc. + +> **`SampleRate` is a reference, not a copy.** `uint8_t& SampleRate = ED.sampleRate;` +> (`Globals.cpp:106-109`, declared `SDT.h:735`). This is how a value that hundreds of +> `SR[SampleRate].rate` call sites read as a plain global got moved into `ED` — and hence into +> the saved JSON (`Storage.cpp:69`, restored `:278`/`:504`) — without touching any of them. +> Because `InitializeStorage()` runs *before* `InitializeSignalProcessing()` and +> `InitializeAudio()` (`Globals.cpp:528-533`), the restored rate is simply in force by the time +> the DSP chain is built; there is no separate "apply saved rate" step. +> See [[sample-rate-switching]]. +- **`bands[]`** — per-band static data (edges `fBandLow/High_Hz`, filter cuts + `FLoCut/FHiCut_Hz`, type `HAM_BAND`/etc., name). Read constantly by tuning, filtering, and + the TX interlock (`IsTxAllowed`). + +## Persistence — `Storage.cpp` (LittleFS + SD, JSON) + +Not a raw struct dump — `ED` is serialized **field-by-field as JSON** via **ArduinoJson** +(`doc["agc"] = ED.agc; …`, `Storage.cpp:56+`), which is robust to struct-layout changes (fields +are matched by name, not offset). Backends: +- **`LittleFS_Program myfs`** — ~1 MB of the Teensy **program flash** (primary store). +- **`SD` card** (`BUILTIN_SDCARD`) — optional secondary/portable copy. + +Public API (`Storage.h`): +- `InitializeStorage()` — mount LittleFS + (if present) SD. +- `SaveDataToStorage(bool savetosd)` — serialize `ED` → LittleFS, and to SD when `savetosd`. +- `RestoreDataFromStorage()` / `RestoreDataFromSDCard()` — deserialize back into `ED`. +- `PrintEDToSerial()` — dump for debugging. + +`ED` is restored at startup and saved on graceful shutdown (`ShutdownTeensy()` in +[[main-loop]]) and on demand (e.g. after calibration). + +## `ParamSave.cpp` — calibration scratch (not the main store) + +A small **RAM** backup area, distinct from `Storage`: 5 variable slots + 3 array slots +(≤256 bytes each, `ParamSave.h:26-28`). `SaveVariable`/`RestoreVariable`, +`SaveArray`/`RestoreArray`. Used to **stash an `ED` field before twiddling it during +calibration** so it can be rolled back if the user cancels — a transient undo buffer, not +persistent storage. + +## Built-In Test +`struct BIT` (`SDT.h:334`) holds built-in-test results, surfaced by the `iBITDISPLAY` event +([[main-loop]]) and the UISm `BIT` screen ([[ui-state-machine]]). + +## Open questions +- Full JSON schema vs. struct (is every `ED` field persisted, or a subset?). +- Versioning/migration: what happens when the JSON on flash predates a new `ED` field + (ArduinoJson leaves it at the default — confirm and document). +- LittleFS-vs-SD precedence on restore, and corruption/again handling. +- Rename note: should `ED`/"EEPROM" terminology be updated in source to reflect LittleFS. diff --git a/wiki/firmware/rapid-tune-mute-freeze.md b/wiki/firmware/rapid-tune-mute-freeze.md new file mode 100644 index 0000000..739fb40 --- /dev/null +++ b/wiki/firmware/rapid-tune-mute-freeze.md @@ -0,0 +1,121 @@ +--- +title: Rapid-Tune Audio Mute & Spectrum Freeze +type: decision +status: draft +created: 2026-06-16 +updated: 2026-06-16 +tags: [tuning, encoders, spectrum, waterfall, audio, mute, real-time, display, compile-option] +source_refs: [] +related: ["[[front-panel]]", "[[tune-frequency-control]]", "[[main-loop]]", "[[display-subsystem]]", "[[spectrum-refresh-floor]]", "[[dsp-chain]]", "[[real-time-constraints]]"] +--- + +# Rapid-Tune Audio Mute & Spectrum Freeze + +A feature on the `encoder-i2c-speed` branch that hides the artifacts produced when the +**Center Tune** or **Fine Tune** encoders are spun *fast*. Guarded by a compile-time option; +when enabled it **mutes the output audio** and **freezes/decouples the spectrum redraw** for the +duration of a fast spin, then resumes automatically. + +## Why it exists +The two-tier encoder servicing in [[front-panel]] (the whole point of the `encoder-i2c-speed` +branch) made the encoders so responsive that a fast spin now enqueues a tune event on nearly +every `loop()` iteration. Each consumed Center-Tune event reprograms the Si5351 VFO and +re-centers the spectrum ([[tune-frequency-control]]), so at speed the operator heard **glitchy +audio** and saw a **jerky, half-drawn spectrum sweep**. This feature masks both without changing +the underlying per-event tuning (we still reprogram the VFO every event — we just hide the +side-effects). + +## Compile-time option (`Config.h`) +```c +#define MUTE_ON_RAPID_TUNE // comment out to disable the whole feature +#define RAPID_TUNE_ENGAGE_MS 60 // inter-event gap below this = "spinning" +#define RAPID_TUNE_RELEASE_MS 180 // no tune event for this long = "done spinning" +``` +(`Config.h:51-53`.) With the define removed, all the detection/mute/freeze hooks compile out to +no-ops and the behavior is exactly as before. + +## Detection — `Loop.cpp` +The detector is driven from **event consumption**, not the ISR. Each of the four HOME-state tune +cases in `ConsumeInterrupt()` calls `NoteTuneActivity(fineTune)` — `false` for the two +`iCENTERTUNE_*` cases, `true` for the two `iFINETUNE_*` cases (`Loop.cpp:1123-1146`). + +- **`NoteTuneActivity(bool fineTune)`** (`Loop.cpp:372`) — if the gap since the previous tune + event is `< RAPID_TUNE_ENGAGE_MS`, latch `rapidTuning = true`; also records which encoder + drove it (`lastTuneWasFine`). +- **`IsRapidTuning()`** (`Loop.cpp:381`) — returns the latch, auto-clearing it once no tune + event has arrived for `RAPID_TUNE_RELEASE_MS`. The idle subtraction is done in **`uint32_t`** + so it wraps like the Teensy `millis()` (the host test mock returns a wider type — without the + cast the latch cleared immediately under test). +- **`IsRapidCenterTuning()`** (`Loop.cpp:390`) = `IsRapidTuning() && !lastTuneWasFine`. +- **`IsRapidFineTuning()`** (`Loop.cpp:396`) = `IsRapidTuning() && lastTuneWasFine`. + +Detection keys off consumption timing because one event is consumed per `loop()` while the FIFO +backs up during a spin (the loop runs every few ms), which is more than fast enough to measure +the gap. Declared in `Loop.h`; consumed by [[dsp-chain]] (mute) and [[display-subsystem]] +(freeze). + +## Audio mute — `DSP.cpp` +`AdjustVolume()` (`DSP.cpp:721`), the final output-gain stage before `PlayBuffer()`, scales the +block by `0.0f` instead of the volume amplification while `IsRapidTuning()` is true +(`DSP.cpp:727`) — for **both** encoders. The spectrum PSD is computed upstream of this stage, so +muting the audio does **not** blank the spectrum trace. + +## Spectrum behavior — `MainBoard_DisplayHome.cpp` +The two encoders are treated differently because they affect the spectrum differently +([[tune-frequency-control]]): **Center Tune reprograms the VFO and re-centers** the spectrum, +while **Fine Tune leaves the center fixed** and only slides the tuning marker (`AdjustFineTune()` +never touches `centerFreq_Hz` or calls `UpdateRFHardwareState`). + +### Center Tune → full freeze +`DrawSpectrumPane()` early-returns while `IsRapidCenterTuning()`, holding the last published +trace + waterfall on screen and marking the pane stale so it gets one clean repaint on release +(`MainBoard_DisplayHome.cpp:857`). + +### Fine Tune → frozen trace, *moving* tuning bar +The trace/waterfall are held frozen, but the **blue filter-bandwidth bar + cyan center marker** +keep tracking so the operator can see where they are tuning within the held spectrum +(`MainBoard_DisplayHome.cpp:868`). To make this responsive (the first attempt — throttled to the +50 ms refresh and repainting the whole ~512-line trace each update — was visibly laggy), the +redraw is **decoupled from `SPECTRUM_REFRESH_MS`** and made cheap: + +1. **`StampTuningBar()`** (`MainBoard_DisplayHome.cpp:448`) — refactored out of + `DrawBandWidthIndicatorBar()`; draws the filter highlight (`FILTER_WIN`) + cyan `drawFastVLine` + marker at the current `GetTXRXFreq()` on whatever layer is selected, with no clear/layer + switch. +2. **`BuildFrozenBackdrop()`** (`MainBoard_DisplayHome.cpp:802`) — once per fine-tune episode, + paints a clean **bar-less** trace onto the **L2** back-buffer from `pixelold[]` (the + per-column y values of the last completed sweep). +3. **`RedrawFrozenSpectrumWithBar()`** (`MainBoard_DisplayHome.cpp:822`) — per update, one + hardware **`BTE_move` (L2→L1)** restores the clean trace (erasing the previous bar), then + `StampTuningBar()` stamps the new bar on L1. + +The pane redraws on **frequency change**, not on the refresh timer — each update is a single blit +plus a bar stamp, so the bar tracks the knob with no perceptible lag. A consequence of the +blit-then-stamp order is that the moving filter-highlight box is drawn **on top of** the frozen +trace (the trace is hidden inside the passband box while fine-tuning), rather than the normal +trace-over-highlight compositing. + +### Release +When the latch clears, `PaneSpectrum.stale` (set throughout the freeze) forces a clean overlay +repaint and normal `ShowSpectrum()` sweeping resumes; the held L2 backdrop is dropped +(`fineFreezeBackdropReady = false`, `MainBoard_DisplayHome.cpp:859,878`). + +## Relationship to the refresh-rate work +This is the deliberate **inverse** of [[spectrum-refresh-floor]]: there the goal was to *speed up* +the sweep; here we intentionally *pause* it during a transient (fast tuning) and replace it with a +cheap marker overlay. Both share the lesson that the expensive parts are the per-frame `drawLine`s +and the `BTE` busy-wait — which is exactly why the fine-tune fast path avoids repainting the trace +and does a single blit instead. + +## Tests +`code/test/Loop_test.cpp` (host build, `#ifdef MUTE_ON_RAPID_TUNE`) covers engage on fast events, +release after idle, slow tuning not engaging, center-vs-fine classification, and switching +encoders mid-spin (6 cases). The display fast-path is exercised on hardware, not unit-tested. + +## Open questions +- Bench-tune the thresholds (`RAPID_TUNE_ENGAGE_MS` / `RAPID_TUNE_RELEASE_MS`) against real + encoder feel, and the perceived smoothness of the fine-tune bar at high spin rates. +- Whether muting audio during *Fine* tune is desirable (Fine tune is exactly when you zero-beat a + signal); currently both encoders mute. +- Optional: composite the fine-tune bar **behind** the trace (trace-over-highlight) without + giving up the single-blit cost. diff --git a/wiki/firmware/real-time-constraints.md b/wiki/firmware/real-time-constraints.md new file mode 100644 index 0000000..96875d5 --- /dev/null +++ b/wiki/firmware/real-time-constraints.md @@ -0,0 +1,38 @@ +--- +title: Real-Time Constraints & Timing Budget +type: concept +status: draft +created: 2026-06-08 +updated: 2026-06-09 +tags: [real-time, timing, audio-buffers, loop-budget, spectrum] +source_refs: [] +related: ["[[overview]]", "[[main-loop]]", "[[dsp-chain]]", "[[display-subsystem]]"] +--- + +# Real-Time Constraints & Timing Budget + +Phoenix is a soft-real-time system: missing the audio deadline produces audible glitches. +The timing rules (from the `.ino` header) that constrain the whole design: + +- **Main loop**: each `loop()` pass must complete in **~10 ms** or the audio buffers + overflow. `loop()` is `FASTRUN` (RAM-resident) for speed. See [[main-loop]]. +- **Spectrum refresh**: the redraw period is `≈ NCHUNKS × T_loop` (the trace is drawn one + chunk per `loop()`), so `SPECTRUM_REFRESH_MS` is a weak lever and can even *backfire* via + beating. Cutting the per-frame draw cost let `NCHUNKS` drop from 8 → 5 (11.7 → 18.8 fps, + shipped 2026-05-30). Full analysis: [[spectrum-refresh-floor]]. +- **Display updates**: pane-based with **stale flags** so only changed regions redraw + ([[display-subsystem]]). +- **CW keyer**: the **1 ms `tick1ms()`** timer guarantees precise dit/dah timing + independent of loop jitter ([[mode-state-machine]]). +- **State-machine transitions**: deterministic and low-latency by construction + ([[state-machine-architecture]]). + +## Why it matters for changes +Any new work in the loop path (DSP, display, CAT, front-panel polling) spends part of the +10 ms budget. The `encoder-i2c-speed` branch exists because I²C polling of the front panel +can eat into this budget — see [[front-panel]] (the encoder-i2c-speed servicing design). + +## To flesh out +- [ ] Measure the actual per-stage time budget (there is a `timing-measurement` skill). +- [ ] Document audio buffer depth and the exact overflow threshold. +- [ ] Reconcile the 200 ms `.ino` figure with the measured spectrum floor. diff --git a/wiki/firmware/rf-board.md b/wiki/firmware/rf-board.md new file mode 100644 index 0000000..0f5322a --- /dev/null +++ b/wiki/firmware/rf-board.md @@ -0,0 +1,115 @@ +--- +title: RF Board & Si5351 Quadrature VFO (RFBoard) +type: module +status: draft +created: 2026-06-08 +updated: 2026-06-16 +tags: [rf, si5351, vfo, quadrature, attenuator, tr-switch, hardware-abstraction] +source_refs: [sources/t41-ep-schematics] +related: ["[[overview]]", "[[rf-board-electronics]]", "[[tune-frequency-control]]", "[[hardware-state-machine]]", "[[filter-boards]]", "[[ssb-phasing-method]]", "[[iq-quadrature-sampling]]", "[[iq-imbalance-correction]]", "[[hardware-platform]]", "[[i2c-bus-map]]", "[[t41-ep-schematics]]"] +--- + +# RF Board & Si5351 Quadrature VFO (RFBoard) + +**Files:** `RFBoard.cpp` (~36 KB), `RFBoard.h`, plus a vendored/modified Etherkit Si5351 +driver `RFBoard_si5351.cpp` (~49 KB) / `.h`. + +The hardware-abstraction layer for the RF board: a clean, mockable API (used heavily in the +unit tests) over the **Si5351 clock generator** (the quadrature LO), **step attenuators**, +**TX/RX switching**, **modulation routing**, and the **calibration loopback**. All hardware +reconfiguration is funneled through here by `HandleTuneState()`/`HandleRFHardwareStateChange()` +in [[hardware-state-machine]], using the frequency math from [[tune-frequency-control]]. + +## Three VFOs on one Si5351 + +| VFO | Si5351 outputs | PLL | Purpose | +|---|---|---|---| +| **RX** | CLK0 + CLK1 (`CLK0RX`/`CLK90RX`) | PLLA | quadrature LO for RX I/Q | +| **TX** | CLK4 + CLK5 (`CLK0TX`/`CLK90TX`) | PLLB | quadrature LO for SSB TX | +| **CW** | CLK6 (`CLKCW`); CLK2 single-VFO | — | single-output CW carrier | + +RX on **PLLA** and TX on **PLLB** lets the two run at independent frequencies simultaneously +(`RFBoard.cpp:388,403`) — needed for the dual-VFO TX-spectrum monitor trick +([[tune-frequency-control]]). On single-VFO boards `SetTXVFOFrequency` just falls back to +`SetRXVFOFrequency` (`RFBoard.cpp:535`), gated by `HasDualVFOs()`. + +The `HasDualVFOs()` fallback is the firmware accommodation for **older (pre-V12.8) single-Si5351 +boards**, where one shared quadrature pair (CLK0/CLK1) served both RX and TX mixers (CW still on +CLK2). The chip-level board-revision detail lives in [[rf-board-electronics]]. + +## Quadrature generation — the heart of it + +SSB by the phasing method ([[ssb-phasing-method]]) needs an LO in **two copies 90° apart**. +Phoenix produces them from two Si5351 clocks on the **same PLL**, by two different techniques +depending on frequency (`SetRXVFOFrequency`, `RFBoard.cpp:483`): + +- **≥ ~3.2 MHz (multisynth divider ≤ 126):** set both clocks to the same frequency, then write + the **phase-offset register** of CLK90 equal to the multisynth divider value. The phase + register counts in VCO half-periods, so "phase = divider" is a quarter-cycle = **90°** + (`set_phase(CLK90RX, rxmultiple)`, `RFBoard.cpp:501`). A `pll_reset` aligns the outputs. +- **< 3.2 MHz (divider > 126):** the phase register can't reach 90°, so Phoenix uses the + **TJ-Labs timed-delay technique** (`RFBoard.cpp:506-523`): set both clocks **4 Hz low**, + align them, set CLK0 to the target, wait a precise delay (~58.5 ms — a quarter of the 4 Hz + beat period), then set CLK90 to the target. The accumulated beat is exactly 90°. Interrupts + are disabled (`cli()/sei()`) so the delay is accurate; source: + (cited in code). + +Two important implementation details: +- **`EvenDivisor()`** forces an even integer multisynth divider — required for clean, + glitch-free phase alignment. +- **PLL-only retune optimization:** while a frequency change stays within the same divider + ("multiple") range, only the PLL is re-programmed, not the multisynth/phase — minimizing I²C + traffic per encoder detent (`RFBoard.cpp:492-495`). The expensive full re-setup only happens + when crossing a divider boundary. + +## Frequency units +The VFO frequency is carried in **Hz × 100 (centi-Hz, 0.01 Hz resolution)**: +`SetRXVFOFrequency` takes `frequency_cHz` documented in the `.cpp` as "(Hz × 100)" +(`RFBoard.cpp:481`), matching the Etherkit `SI5351_FREQ_MULT = 100` and `HandleTuneState`'s +`centerFreq*100`. The `_cHz` suffix names this correctly — these are centi-Hz. (Earlier code +used a `_dHz`/"decihertz" naming, which was a misnomer; all uses have since been renamed to +`cHz`.) The rename merged onto `encoder-i2c-speed` on 2026-06-16, so source and wiki now +agree (0 `_dHz` / 46 `_cHz` occurrences in `code/src/PhoenixSketch/`). + +`SetFrequencyCorrectionFactor()` applies the crystal ppb correction (from frequency +calibration, [[hardware-state-machine]]) via the Si5351 `set_correction`. + +## Other hardware controls +- **Step attenuators** — independent TX and RX, **0–31.5 dB in 0.5 dB steps**, clamped/rounded + (`SetRXAttenuation`/`SetTXAttenuation`). `SetAttenuator` writes `round(2·atten_dB) & 0x3F` + (the GPIO value is the **attenuation in dB × 2**) to `writeGPIOA` (RX) / `writeGPIOB` (TX) + (`RFBoard.cpp:276,67-68,102-103`) on an **MCP23017** GPIO expander; `GetRFMCPRegisters` exposes + the register for tests. Used for RX gain and TX power setting ([[tune-frequency-control]] power + cal). The GPIO-bit → PE4312 wiring and per-revision designators are in [[rf-board-electronics]]. +- **VFO output power / enable** — `SetRXVFOPower` etc. select Si5351 drive (2/4/6/8 mA); + `Enable/DisableRXVFOOutput` toggle the CLK outputs. +- **TX/RX switching** — `SelectTXMode`/`SelectRXMode` drive the T/R relays. +- **Modulation routing** — `SelectTXSSBModulation`/`SelectTXCWModulation`. +- **CW keying** — `CWon`/`CWoff` key the CW carrier between Morse elements (driven by + [[mode-state-machine]]'s keyer states via [[hardware-state-machine]]). +- **Calibration loopback** — `EnableCalFeedback` routes TX output back into the RX input for + I/Q calibration ([[iq-imbalance-correction]]); `DisableCalFeedback` restores normal routing. + +## Physical hardware +The chip-level electronics this module drives — the dual-Si5351 LO (and the single-Si5351 board +revisions), the PE4312 attenuators with their GPIO-bit → pin table and per-revision designators, +the ADT/PSA/MAR/MASWSS mixer front end, and the I/Q baseband op-amps — are documented in +**[[rf-board-electronics]]** (schematic-traced against `T41-RF-board-V012`, +[[t41-ep-schematics]]). See also the platform-level [[hardware-platform]]. + +## Testability +The header exposes `getRXTXState`, `getCWState`, `getCalFeedbackState`, `getModulationState`, +`GetRFMCPRegisters`, `ResetVFOState`, `SetDualVFOs` — explicit hooks so the unit tests can +assert hardware state without a physical board (the abstraction pattern CLAUDE.md cites as the +template for new hardware modules). + +## Open questions +- The Si5351 driver is a modified Etherkit library — document the local modifications vs. + upstream (the `set_freq_manual` + manual phase path). +- Exact `EvenDivisor` policy and the divider-boundary frequencies where full re-setup occurs. +- ~~Which physical attenuator part sits behind the MCP23017.~~ **Resolved:** PE4312 digital + step attenuators on the T41_Attenuator_Daughter board ([[t41-ep-schematics]], 2026-06-14). +- ~~Which MCP23017 (U21) port bits map to the PE4312 parallel inputs.~~ **Resolved (2026-06-14/15):** + GPIOA→RX attenuator, GPIOB→TX attenuator, low 6 bits = attenuation word (0.5 dB LSB); table + + per-revision designators above. The **upper bits GPA6/7 and GPB6/7 are unused / not connected** + (owner-confirmed 2026-06-15) — each bank carries only the 6-bit attenuation word. diff --git a/wiki/firmware/runtime-filter-design.md b/wiki/firmware/runtime-filter-design.md new file mode 100644 index 0000000..f2c9b44 --- /dev/null +++ b/wiki/firmware/runtime-filter-design.md @@ -0,0 +1,179 @@ +--- +title: Run-Time Filter Design (rate-independent coefficients) +type: decision +status: draft +created: 2026-07-29 +updated: 2026-07-29 +tags: [dsp, filters, chebyshev, bilinear, prewarp, equalizer, cw, sample-rate, iir, fir] +source_refs: [] +related: ["[[sample-rate-switching]]", "[[dsp-chain]]", "[[cw-processing]]", "[[audio-equalizer]]", "[[multirate-decimation]]", "[[filter-hil-test]]", "[[tx-filter-hil-test]]", "[[ssb-phasing-method]]", "[[theory-overview]]"] +--- + +# Run-Time Filter Design (rate-independent coefficients) + +Several audio-rate filter stages shipped as **coefficient tables designed offline for one +sample rate** — 24 ksps, i.e. 192 ksps at the ADC decimated by 8. They are now **generated from +an analog design spec on every rate change**, which is what makes +[[sample-rate-switching]] possible without every labelled frequency moving. + +## The bug this fixes + +A frozen digital coefficient table encodes frequencies as *fractions of Fs*. Run the same table +at a different Fs and every corner scales with it: + +``` +176400 / 192000 = 0.91875 +``` + +So at 176.4 ksps: + +| Filter | Labelled | Actually was | +|---|---|---| +| CW audio filter | 2.0 kHz | **1.84 kHz** | +| Equaliser top cell | 4000 Hz | **3675 Hz** | + +An 8.125 % error on every CW corner and every equaliser centre — not subtle, and exactly the +kind of thing a user would report as "the 2 kHz filter sounds narrow". + +## Recovering the prototypes rather than guessing them + +The point of pride in this change is that **the filter families are unchanged**: what was a +12-pole Chebyshev is still a 12-pole Chebyshev. The design constants were *recovered* from the +shipped tables, not re-invented: + +- **CW audio filters.** The tables measure **0.0200 dB** of passband ripple, and `cheby1(12, + 0.02)` fits them to **0.013 dB RMSE**. That identifies them as Chebyshev type I, whose natural + design parameter is the ripple edge — hence `CW_AUDIO_RIPPLE_EDGE_HZ[] = {807.1, 1038.0, + 1269.0, 1731.5, 1963.2}` (`DSP_FIR.cpp:1242-1244`), sitting a few percent below the nominal + 840/1080/1320/1800/2000 Hz labels. +- **Equaliser cells.** Every biquad has `b1 = 0` and `b2 = −b0`, which puts its zeros at + `z = ±1`. That is precisely the bilinear image of an **analog bandpass**, so an *inverse* + bilinear transform recovers the analog prototype exactly — four bandpass sections per cell, + stored as (frequency-ratio, Q) pairs in `EQ_BAND_PROTO[14][4]` (`DSP_FIR.cpp:1263-1278`). + +`code/tools/extract_filter_prototypes.py` performs that recovery and prints the C literals. It +reads the original tables, which are **kept verbatim as test fixtures** in +`code/test/reference_filters.cpp` — so the thing the generator is checked against is the thing +it replaced. + +## Prewarping is the load-bearing part + +Designing in the analog domain and bilinear-transforming is not by itself enough. The bilinear +transform **compresses the analog frequency axis** as it wraps it onto the unit circle, so a +section designed at ω lands slightly below ω once discretised — and by a rate-dependent amount. +`PrewarpRadians()` (`DSP_FIR.cpp:998`) cancels that: + +``` +ω_prewarped = 2·Fs·tan(π·f / Fs) +``` + +**This is what makes the result rate-independent rather than merely re-derived.** Without it the +corners would still drift with Fs, just by less. + +## The generators + +| Function | `DSP_FIR.cpp` | Produces | +|---|---|---| +| `PrewarpRadians` | `:998` | prewarped analog frequency | +| `BilinearBiquad` | `:968` | one analog 2nd-order section → one ARM biquad | +| `CalcChebyshevILowpassCoeffs` | `:1024` | Chebyshev I lowpass as a biquad cascade; poles on the s-plane ellipse, normalised to unity DC gain | +| `CalcBandpassCascadeCoeffs` | `:1086` | an equaliser cell from its 4-section analog prototype | +| `NormalizeFIRDCGain` | `:1310` | unity-DC-gain scaling for the generated FIRs | + +Two entry points call them: + +- **`InitializeReceiveAudioFilterCoeffs(audioFs_Hz)`** (`:1330`) — the 5 CW audio lowpasses, the + 14 equaliser cells, and the CW decoder input FIR. Called from the top of `InitializeFilters()` + (`DSP_FFT.cpp:342`), so it runs at startup *and* on every rate change, before the ARM instances + are bound. +- **`InitializeTransmitFilterCoeffs(audioFs_Hz)`** (`:1369`) — the two stages either side of the + Hilbert transform. Called from `InitializeTransmitFilters()` (`DSP_FFT.cpp:447`). + +Note the argument in both cases is `SR[SampleRate].rate / RXfilters.DF` — the **audio** rate, +not the raw rate. A decimating FIR filters at its input rate and an interpolating one at its +output rate; for both transmit stages that rate is the audio rate, not the 12 ksps the Hilbert +transform between them runs at (`DSP_FIR.cpp:1363-1365`). + +## ⚠️ The FIR stages are only rate-independent to ≈1.2 %, the IIR ones to 0.3 % + +The two generated **transmit** stages are 48-tap Kaiser-Bessel windowed sincs, and a 48-tap FIR +**does not scale exactly** when its normalised cutoff changes. The taps are quantised to the same +48 positions at both rates, so the realised corner lands in a slightly different place even though +the design specification is identical. Evaluating the generated tap sets directly (cascade of +`TX_DECIMATE3_FC_HZ` and `TX_AUDIO_LPF_FC_HZ`): + +| Audio rate | Cascade −3 dB | −6 dB | +|---|---|---| +| 24 ksps (192 ksps) | **2726 Hz** | 2952 Hz | +| 22.05 ksps (176.4 ksps) | **2759 Hz** | 2969 Hz | + +**= +1.2 %, on correct firmware.** `TransmitChain176k.AudioBandwidthHoldsAcrossRates` allows 2 % +for exactly this reason, and it is why [[tx-filter-hil-test]] uses a 2.5 % tolerance where +[[filter-hil-test]] uses 1.5 %. + +The receive filters do not share this limitation: they are **IIR** cascades bilinear-transformed +from prewarped analog prototypes, so the corner is placed by a continuous parameter rather than +quantised onto a tap grid — which is why they measure to within 0.3 % on the bench. The prewarping +described above is what buys that. + +The practical consequence: **rate invariance is not a single number across the whole firmware.** +A tolerance tight enough for the IIR stages will fail the FIR ones. Both are still an order of +magnitude clear of the 8.125 % the frozen tables produced. + +The same tap-set evaluation gives the transmit cascade's stopband profile — −21.6 dB at 3.5 kHz, +**−52 dB at 4 kHz**, better than −90 dB above 4.5 kHz — which is what fixes where an out-of-band +rejection test can legitimately be gated. See [[tx-filter-hil-test]]. + +## Deliberately *not* generated + +The decimation, interpolation, Hilbert and [[zoom-fft]] filters are left alone. Their corners +are specified **as a fraction of Fs**, and scaling with Fs is exactly what an anti-alias or +anti-image filter *should* do (`DSP_FIR.cpp:1322-1326`). Regenerating them would be a no-op at +best. + +This resolves the asymmetry [[multirate-decimation]] describes: the split is not "RX runtime / +TX fixed", it is **"specified in Hz → must be generated" vs "specified as a fraction of Fs → +already correct"**. + +## Three bugs found while in there + +- ⚠️ **The transmit decimate-by-2 feeding the Hilbert stage had no usable stopband.** Its table + was flat to **0.425·Fs** where a decimate-by-2 needs everything below **0.25·Fs** gone, so + **6–9.5 kHz folded back into the transmit audio unattenuated**. Replaced with a real lowpass at + 3.5 kHz (`TX_DECIMATE3_FC_HZ`, `DSP_FIR.cpp:1296`), which sits above the 2.76 kHz the audio + bandwidth filter passes and so costs no wanted signal. **Transmitted audio therefore differs + from previous releases even at 192 ksps** — the one user-visible behaviour change in this work + that is not a rate-change effect. [[tx-filter-hil-test]] measures the fold-back directly on the + bench, with the caveat that `BandEQ` runs before this stage and attenuates high inputs on its + own. +- **The AM DC blocker** had a fixed pole at 0.99 and, worse, its state was a **file-scope static + shared across all three `ReceiveFilterConfig` instances**. +- **`ApplyEQBandFilter` scrubbed the receive instance's state even on the transmit path.** + +## Verification + +`code/test/FilterDesign_test.cpp` (683 lines) does two things: + +1. **Fidelity** — measures each generated filter against the reference table it replaces: + **CW audio within 0.05 dB, equaliser cells within 0.01 dB**. +2. **Rate independence** — checks every corner holds across both rates, where the frozen tables + moved it by 8.125 %. + +Both are simulation. The on-the-bench measurements are: + +- **Receive** — [[filter-hil-test]] found **95 checks passed, 0 failed**, every CW corner and + equaliser centre holding to **within 0.3 %** across the rate change. +- **Transmit** — [[tx-filter-hil-test]] measures the composite transmit passband corners, + opposite-sideband suppression, and the fold-back the `TX_DECIMATE3_FC_HZ` fix addressed. + Written and self-verified; **not yet run on the bench**. + +## Open questions +- The equaliser prototypes are stored to 9 decimal places as recovered floats. Nobody has + identified what the *original* analog design was (a specific filterbank standard?), which + would let the table be replaced by a formula. See [[audio-equalizer]]. +- Whether the AM DC blocker's pole should itself be rate-derived now that it is per-instance — + it was made per-instance but the fixed 0.99 was not obviously revisited. +- `CW_DECODE_FIR_FC_HZ` (1749.1 Hz) is a **−6 dB** corner because that is what `CalcFIRCoeffs` + takes, while the filter is nominally described by its −3 dB point of 1560 Hz + (`DSP_FIR.cpp:1280-1283`). Worth a note on [[cw-processing]] so the two numbers are not read + as a contradiction. diff --git a/wiki/firmware/sample-rate-switching.md b/wiki/firmware/sample-rate-switching.md new file mode 100644 index 0000000..4f6f22d --- /dev/null +++ b/wiki/firmware/sample-rate-switching.md @@ -0,0 +1,122 @@ +--- +title: Runtime Sample-Rate Switching (192 / 176.4 ksps) +type: decision +status: draft +created: 2026-07-29 +updated: 2026-07-30 +tags: [sample-rate, dsp, i2s, menu, cat, persistent-config, 176k, 192k] +source_refs: [] +related: ["[[digital-mode]]", "[[runtime-filter-design]]", "[[multirate-decimation]]", "[[audio-io]]", "[[persistent-config]]", "[[tune-frequency-control]]", "[[cat-control]]", "[[ui-state-machine]]", "[[display-subsystem]]", "[[zoom-fft]]", "[[theory-overview]]"] +--- + +# Runtime Sample-Rate Switching (192 / 176.4 ksps) + +The raw ADC/DAC rate is now **selectable at run time and persisted**, where it used to be a +compile-time constant in all but name. Two rates are offered: **192 ksps** (the historical +rate) and **176.4 ksps**. Landed on `rx-dsp-176k-stage-test`, merged for V1.4.0. + +This page covers the *mechanism*. The filters that had to be made rate-independent before it +could work are in [[runtime-filter-design]]; the bench verification is in +[[filter-hil-test]]. + +## What changed, in one line + +`SampleRate` used to be a plain `uint8_t` written once at startup. It is now a **reference into +the persisted config**: + +```c +// Globals.cpp:106-109 +uint8_t& SampleRate = ED.sampleRate; +``` + +with `ED.sampleRate` defaulting to `SAMPLE_RATE_192K` (`SDT.h:287`) and declared `extern uint8_t& +SampleRate` (`SDT.h:735`). Every one of the many `SR[SampleRate].rate` call sites keeps working +unmodified while the value moves into [[persistent-config]] and gets serialized to JSON +(`Storage.cpp:69`, restored at `:278` and `:504`). + +This supersedes the wiki's earlier claim that `SampleRate` is "set once and **never reassigned** +anywhere in the firmware" — see [[multirate-decimation]], corrected 2026-07-29. + +## `ChangeSampleRate()` — the switch itself + +`MainBoard_AudioIO.cpp:519`. Order matters throughout: + +1. **Bail if unchanged** (`:520`) — the whole operation is expensive and audibly disruptive. +2. **Compensate the tuning, before `SampleRate` is updated** (`:530-532`). The RX VFO is + programmed to `centerFreq_Hz` and the receive DSP shifts by +Fs/4, so the received frequency + is `centerFreq_Hz − Fs/4`. Changing Fs moves that by `ΔFs/4` — 3.9 kHz between these two + rates — so `centerFreq_Hz` is shifted by the same amount to hold the dial frequency + constant. Applied to **both VFOs** so a later VFO switch is also correct. This must be + computed while `SR[SampleRate]` still names the *old* rate. +3. **`AudioNoInterrupts()`** (`:534`), then assign `SampleRate`. +4. **`SetI2SFreq()`** (`:537`) reprograms the SAI1 PLL divider chain for the new rate. +5. **`InitializeSignalProcessing()`** (`:541`) rebuilds the entire DSP chain — all three + `ReceiveFilterConfig` instances plus the transmit one (`DSP.cpp:758-762`), which is what + regenerates the rate-dependent coefficients ([[runtime-filter-design]]) and re-derives AGC + and CW parameters. +6. **`UpdateSampleRateDependentOscillators()`** (`:503`) retunes the sidetone and the TX-IQ-cal + tone. Both are OpenAudio synthesized oscillators whose `frequency()` argument is scaled by + `AUDIO_SAMPLE_RATE_EXACT / SR[SampleRate].rate`, so without this they shift audibly. +7. **Flush the four input queues** (`:545-548`) so samples captured at the old rate are not + processed at the new one, then `AudioInterrupts()`. +8. **`UpdateTuneState()`** (`:554`) reprograms the Si5351 for the compensated centre frequency. + Deliberately *outside* the interrupts-disabled window, because it does I²C transactions. + +### The leak that had to be fixed first +`InitializeDecimationFilter` `malloc`s its coefficient and state buffers. At boot-only +initialization nobody noticed it never freed; called repeatedly on rate changes it would leak +every time. It now frees the previous allocation first — a prerequisite for step 5 being +callable more than once. + +## Ways to reach it + +| Path | Where | Notes | +|---|---|---| +| Front panel | new **"Sample Rate"** primary menu, `MainBoard_DisplayMenus.cpp:580-611` | Two options, "192 ksps" / "176.4 ksps". `primaryMenu[]` grew 8 → **9** entries (`:602`, `MainBoard_Display.h:371`). | +| CAT | `SR0;` = 176.4k, `SR1;` = 192k; `SR;` reads back | `CAT.cpp:801-838`. **Rejected while transmitting** — see [[cat-control]]. | +| Boot | automatic | `InitializeStorage()` runs before `InitializeSignalProcessing()`/`InitializeAudio()` (`Globals.cpp:528-533`), so the restored rate is simply in force by the time the DSP is built. There is no "apply saved rate" step. | + +## Display paths that assumed 192 kHz + +Three places had the old rate baked in and were rewritten to derive from `SR[SampleRate].rate`: + +- **Spectrum frequency ticks.** Previously a fixed pixel table with a non-round frequency step. + Ticks are now positioned by `FreqToBin()` at *round* frequencies + (`MainBoard_DisplayHome.cpp:550-571`), so labels stay aligned with the trace at any rate. The + clear strip was widened so old ticks are wiped on zoom/tune changes. +- **Audio spectrum axis.** Span is now `SR[SampleRate].rate / 32` (`:1301-1303`) rather than a + hard-coded 0–6000 Hz — 6.0 kHz at 192 ksps, 5.5 kHz at 176.4 ksps. Without this, tone + frequencies read wrong at the new rate. +- **Settings pane** gained a `"Rate:"` row (`:1654`); Key Type moved down one. + +See [[display-subsystem]]. [[zoom-fft]]'s bin widths are likewise rate-dependent and its +"375 Hz base bin" figure is now a 192-ksps-only number. + +## Simulator + +The OpenAudio mock was made rate-aware: test-tone carrier at Fs/4, sample pacing and SDL output +rate derived from the current rate, and SDL audio re-initialized when the rate changes +(`code/test/OpenAudio_ArduinoLibrary_mock.cpp`, `RadioSimulator_main.cpp`). + +## The 176.4 ksps rate + +What is verifiable from the code: 176400 = 44100 × 4, so after the `÷8` RX decimation +([[multirate-decimation]]) the audio rate is **22.05 ksps** rather than the 24 ksps of the +192 ksps path — i.e. it lands on the 44.1 kHz family instead of the 48 kHz one. Both rates are +marked `// OK` in the `SR[]` table (`Globals.cpp:79-98`); most of the other 16 entries are +marked `NOT OK` and are not offered by the menu. + +⚠️ **The motivation is not recorded anywhere in the tree** — not in the commit message +(`9c8bb16`), not in `code/docs/RX_DSP_Chain_Parameters.md`. Host-side resampling +([[usb-audio]]) is the obvious guess but is a guess; see Open questions. + +## Open questions +- **Why 176.4 ksps was added.** Owner question — the tree does not say. If it is USB-audio + resampling, that connection belongs on [[usb-audio]]. +- Whether a rate change during CW keying or with the AGC hung can produce an audible artefact + beyond the intended brief mute — `ChangeSampleRate` is only interlocked against *transmit* + over CAT, not over the menu. +- Whether `ED.sampleRate` restored from a config written by an older firmware (no `sampleRate` + key) reliably falls back to 192 ksps. The `doc["sampleRate"] | ED.sampleRate` idiom + (`Storage.cpp:278`) says yes, but it has not been tested against a real V1.3 config file. +- Group delay and loop-budget impact at 176.4 ksps versus 192 ksps ([[real-time-constraints]]). diff --git a/wiki/firmware/spectrum-refresh-floor.md b/wiki/firmware/spectrum-refresh-floor.md new file mode 100644 index 0000000..45fcf12 --- /dev/null +++ b/wiki/firmware/spectrum-refresh-floor.md @@ -0,0 +1,83 @@ +--- +title: Spectrum Refresh Rate Floor & Optimization +type: decision +status: draft +created: 2026-06-09 +updated: 2026-06-09 +tags: [spectrum, waterfall, display, refresh-rate, nchunks, real-time, performance] +source_refs: [] +related: ["[[real-time-constraints]]", "[[zoom-fft]]", "[[display-subsystem]]", "[[dsp-chain]]", "[[main-loop]]", "[[rapid-tune-mute-freeze]]"] +--- + +# Spectrum Refresh Rate Floor & Optimization + +A recorded investigation (2026-05) into why the spectrum/waterfall couldn't be sped up by +tweaking `SPECTRUM_REFRESH_MS`, and what actually moved the frame rate. Source: the full study +in `code/docs/refresh_rate_study/` (`Spectrum_Refresh_Rate_Study.md`, +`Frame_Rate_Optimization_Plan.md`). + +## The floor — why `SPECTRUM_REFRESH_MS` is a weak lever +`ShowSpectrum()` draws the trace in `NCHUNKS` column-groups, **one chunk per `loop()`**, and +each `loop()` is paced by the audio/DSP block rate (`T_loop ≈ 10.67 ms`, +[[real-time-constraints]]). So the realized redraw period is always +**`≈ NCHUNKS × T_loop`** — an integer multiple of the loop period. + +- At the original `NCHUNKS = 8`: floor ≈ `8 × 10.67 ≈ 85 ms` (**11.7 fps**). +- `SPECTRUM_REFRESH_MS` only re-arms the redraw on a free-running grid; **below the floor it + can't help**, and the realized rate is **non-monotonic** — beating between that grid and the + loop cadence made 65–72 ms collapse to ~149 ms (6.7 fps), *worse* than 100 ms. (Pre-ship sweet + spot was 75–90 ms; 80 ms was used.) + +## What actually moved it — cut the fixed per-frame draw cost +`NCHUNKS` only *spreads* a **fixed ~57 ms/frame draw cost** across loops; you can't safely lower +it until that cost is cut, because each `loop()` must still finish its audio block in 10.67 ms. +Lowering `NCHUNKS` below 8 on the original code **broke the receiver** (IQ-queue overflow, SNR +negative). The dominant costs were the full-frame BTE completion blit (~13.8 ms busy-wait), the +bandwidth-bar `fillRect`, the 512 `drawLine`s, and Pass-2 (audio-spectrum bars + S-meter). + +## Outcome as developed (2026-05-30): 11.7 → 18.8 fps +On branch `refresh_rate_update`, final config in `MainBoard_DisplayHome.cpp`: +`NCHUNKS = 5`, `SPECTRUM_REFRESH_MS = 50`, `AUDIO_SPECTRUM_DECIMATE = 2`, `WATERFALL_DECIMATE = 2`. +Three changes made `NCHUNKS = 5` safe: +1. **Generalized chunk arithmetic** to rounded boundaries so any `NCHUNKS` (incl. non-divisors of + 512 like 5/6/7) sums to 512. +2. **Throttled Pass-2** (audio-spectrum bars + S-meter, ~13 ms) to every 2nd frame. +3. **Throttled the waterfall scroll BTE** to every 2nd frame (phase-offset from the audio pass). + +Trade-off: audio-spectrum, S-meter, and waterfall update at ~9.4 fps (half the trace rate), and +trace cadence is jittery (~43–63 ms). Reviewed live and approved. (Smoother 15.6 fps alternative: +`NCHUNKS = 6`, `WATERFALL_DECIMATE = 1`. Full revert: `NCHUNKS = 8`, both decimates = 1.) + +## ⚠️ What actually shipped is 15.6 fps, not 18.8 + +`NCHUNKS` is **6** in the tree today (`MainBoard_DisplayHome.cpp:430`), so the shipped spectrum rate +is ≈ `6 × 10.67 ≈ 64 ms` = **15.6 fps** — the "smoother alternative" noted above, but with +`WATERFALL_DECIMATE` left at 2 rather than the 1 that alternative specified. + +It was changed back from 5 to 6 in `f56c8c7`, which is the commit that also bumped +`VERSION` to `"Phx V1.3"` — i.e. the V1.3 release stamp. That commit's subject is +*"Add serial time sync over USB Serial port 0"*, and a near-identical commit (`b63f090`) carries +the same subject on the same day, so the change rode in on what looks like a rebase artefact. + +**Whether the 5 → 6 revert was a deliberate choice at release time or accidental is not +recoverable from the history** — the wiki previously recorded 18.8 fps as the shipped figure, which +was wrong either way. Worth asking the owner: if it was accidental, `NCHUNKS = 5` is a one-line +change to recover 18.8 fps; if deliberate, `WATERFALL_DECIMATE` should probably go back to 1 to +match the alternative as characterised. + +## Ruled out / remaining headroom +- **Teensy framebuffer + `writeRect`** — ruled out: the RA8875 is on **SPI**, so a full-frame + push is ~40 ms (*slower* than the current chip-accelerated `drawLine` path). A test froze the + panel. +- **`NCHUNKS < 5`** — not reachable without a faster display bus or drawing *less* (e.g. 256 + bins). +- **Real next unlock:** make the BTE blits async (drop the `while(tft.readStatus())` busy-wait) + — but PJRC `RA8875::BTE_move` busy-waits internally, so this needs library surgery (high risk). + Hardware vertical-scroll registers for the waterfall would enable `NCHUNKS ≈ 4` (~23 fps). + +## Rule of thumb +> When asked to speed up the spectrum/waterfall, target **`NCHUNKS` and the per-frame draw +> cost**, not `SPECTRUM_REFRESH_MS` — and warn that lowering the refresh define can *backfire* +> via beating, and that lowering `NCHUNKS` without first cutting draw cost breaks the receiver. + +See [[real-time-constraints]] for the loop budget and [[zoom-fft]] for how the PSD is produced. diff --git a/wiki/firmware/state-machine-architecture.md b/wiki/firmware/state-machine-architecture.md new file mode 100644 index 0000000..f8590f1 --- /dev/null +++ b/wiki/firmware/state-machine-architecture.md @@ -0,0 +1,51 @@ +--- +title: State-Machine Architecture (StateSmith) +type: concept +status: draft +created: 2026-06-08 +updated: 2026-06-09 +tags: [state-machine, statesmith, drawio, codegen, architecture] +source_refs: [] +related: ["[[overview]]", "[[mode-state-machine]]", "[[ui-state-machine]]", "[[tune-frequency-control]]", "[[hardware-state-machine]]"] +--- + +# State-Machine Architecture (StateSmith) + +Phoenix routes **all hardware state changes through state machines** so behavior is +deterministic and testable. This page is the shared "how the SM layer works" reference; the +individual machines have their own pages. + +## Generation pipeline +Most machines are **generated by StateSmith** from `.drawio` UML state diagrams: + +``` +edit *.drawio ──StateSmith──▶ Sm.cpp / Sm.h (do NOT hand-edit the .cpp) +``` + +**Rule:** to change generated behavior, edit the diagram and regenerate — never patch the +generated `.cpp`. (CLAUDE.md: "Modifying state machines: update `.drawio` diagrams and +regenerate with StateSmith.") + +**Six** machines are StateSmith-generated (each has a `.drawio`); **HardwareSm is +hand-written** (no diagram). There is **no separate "TuneSm"** (a `CLAUDE.md`/`.ino` myth) — +per-mode VFO selection is the hand-written `HandleTuneState()` *inside* HardwareSm, using the +math in [[tune-frequency-control]]. + +## The machines +| Page | File | Generated | +|---|---|---| +| [[mode-state-machine]] | `ModeSm` | ✔ | +| [[ui-state-machine]] | `UISm` | ✔ | +| [[hardware-state-machine]] — PowerCalSm, ReceiveIQCalSm, TransmitCarrierCalSm, TransmitIQCalSm | (4 sub-SMs) | ✔ | +| [[hardware-state-machine]] — HardwareSm coordinator | `HardwareSm` | ✘ hand-written | + +## Event model +States advance on two kinds of input: +- **Discrete events** — `InterruptType` values dispatched by [[main-loop]] from the FIFO. +- **DO events** — periodic ticks from the 1 ms timer (`tick1ms()`), used for keyer timing + (ModeSm) and menu timeouts (UISm). + +## To flesh out +- [ ] Where the `.drawio` sources live and the exact StateSmith invocation/version. +- [ ] The generated-code conventions (event enums, dispatch function shape). +- [ ] How SM unit tests are structured in `code/test/`. diff --git a/wiki/firmware/tune-frequency-control.md b/wiki/firmware/tune-frequency-control.md new file mode 100644 index 0000000..57e2085 --- /dev/null +++ b/wiki/firmware/tune-frequency-control.md @@ -0,0 +1,137 @@ +--- +title: Frequency Control & Tuning Math (Tune.cpp) +type: module +status: draft +created: 2026-06-08 +updated: 2026-07-29 +tags: [tuning, vfo, frequency, fs-over-4, cw-offset, fast-tune, power-calibration, sample-rate] +source_refs: [] +related: ["[[overview]]", "[[hardware-state-machine]]", "[[rf-board]]", "[[mode-state-machine]]", "[[iq-quadrature-sampling]]", "[[dsp-chain]]", "[[rapid-tune-mute-freeze]]", "[[sample-rate-switching]]", "[[filter-hil-test]]"] +--- + +# Frequency Control & Tuning Math (Tune.cpp) + +**Files:** `Tune.cpp` (~15 KB), `Tune.h`. + +> ⚠️ **Myth-buster.** `CLAUDE.md` and `PhoenixSketch.ino` describe a "TuneSm" frequency-control +> **state machine** in `Tune.cpp` with states `TuneReceive / TuneSSBTX / TuneCWTX`. That is +> wrong on both counts: **`Tune.cpp` contains no state machine** — it is a library of pure +> functions — and the `TuneState` enum that *does* have those values lives in **`HardwareSm.cpp`** +> (`static TuneState tuneState`, dispatched by `HandleTuneState()`), see +> [[hardware-state-machine]]. This page documents the real `Tune.cpp`. (Logged in +> [[documentation-todos]].) + +`Tune.cpp` does two unrelated jobs: **frequency/tuning math** and **PA power-calibration +math**. They share a file but not a concept. + +## Two-stage tuning architecture + +Phoenix tunes in two stages — a coarse **hardware** step and a fine **software** step: + +1. **Coarse:** the Si5351 hardware VFO ([[rf-board]]) is parked at the band-center frequency. + `HandleTuneState(TuneReceive)` sets the RX VFO to `centerFreq_Hz` (`HardwareSm.cpp:651-654`). +2. **Fine:** a digital software mixer shifts within the captured passband. The displayed/operating + frequency is + + ``` + RXTX_freq = centerFreq_Hz − fineTuneFreq_Hz − SampleRate/4 (GetTXRXFreq, Tune.cpp:121) + ``` + + The fine-tune and the **−SampleRate/4** term are applied in the DSP, not the Si5351 — the + hardware LO stays put while you tune across the spectrum. `FreqShiftF()` in [[dsp-chain]] + performs the digital shift. + +### Why the −Fs/4 quarter-shift *(general DSP)* +Direct-conversion receivers have a **DC hole**: LO leakage, 1/f noise, and ADC DC offset all +pile up at 0 Hz, right where the signal of interest would sit. Phoenix offsets the digital +spectrum by **Fs/4** so the operating frequency lands a quarter-band away from DC, clear of +that junk, then shifts it back in software. The complex baseband ([[iq-quadrature-sampling]]) +makes the negative-frequency placement meaningful. (Fs/4 is also the cheapest possible +digital mix — multiplies are just ±1, ±j.) + +**Fs/4 is 48 kHz at 192 ksps and 44.1 kHz at 176.4 ksps** ([[sample-rate-switching]]), and this +has two consequences: + +- **Changing the rate moves the dial** unless compensated. `ChangeSampleRate()` shifts + `ED.centerFreq_Hz` for **both VFOs** by `Δ(Fs/4)` — 3.9 kHz between the two rates — before it + updates `SampleRate`, so `centerFreq_Hz − Fs/4` is held constant and the operator stays on + frequency (`MainBoard_AudioIO.cpp:523-532`). +- ⚠️ **Anything injecting a signal into the receive path must allow for the fine tune as well.** + `ReceiveProcessing` shifts *twice* — by Fs/4 (`FreqShiftFs4`) and then by the fine tune + (`FreqShiftF`) — so the input frequency that demodulates to DC is `|Fs/4 + fineTuneFreq_Hz|`, + not Fs/4. `fineTuneFreq_Hz` is routinely several kHz, far wider than any passband, so omitting + it produces **silence rather than a small error**. This is the single most expensive trap in + [[filter-hil-test]]. + +## The frequency functions + +| Function | Returns | Notes | +|---|---|---| +| `GetTXRXFreq(vfo)` | Hz | `centerFreq − fineTune − Fs/4` for a VFO (`Tune.cpp:121`) | +| `GetTXRXFreq_cHz()` | **centi-Hz** (×100) | same, active VFO, in Si5351 resolution units (`Tune.cpp:110`) | +| `GetCWTXFreq_cHz()` | centi-Hz | TXRX ± CW tone offset; **LSB subtracts, USB adds** (`Tune.cpp:132`) | +| `ResetTuning()` | — | fold `fineTune` into `centerFreq`, zero `fineTune` (recenter, same freq) (`Tune.cpp:146`) | +| `GetBand(freq)` | band idx or −1 | linear search of `bands[]` (`Tune.cpp:159`) | + +Frequencies are carried in **centi-Hz (Hz×100)** internally for Si5351 tuning resolution. The +`_cHz` suffix and source docstrings now name this correctly; an earlier `_dHz`/"deci-Hz" naming +was a misnomer (×100 is **centi**-Hz) and was renamed across the source on 2026-06-16. See +[[rf-board]] and [[documentation-todos]]. + +## Fine-tune control & limits — `AdjustFineTune()` (`Tune.cpp:37`) + +Each tuning-encoder detent adds `ED.stepFineTune × filter_change` to `fineTuneFreq_Hz`. Then it +clamps the result so you can't tune outside what's usable: +- **Visible-window limit:** fine tune must stay within the on-screen span, which shrinks with + zoom — `±SampleRate/2` at zoom 0, `±(SampleRate / 2^zoom)/2` otherwise (`Tune.cpp:64-74`). + See [[zoom-fft]]. +- **Band-edge margin:** keeps the passband a filter-bandwidth away from the band edge, using + the mode's `FLoCut_Hz`/`FHiCut_Hz` (`Tune.cpp:77-94`). +- **Fast tune** (`#ifdef FAST_TUNE`): if the encoder is spun quickly (`FT_trig = 4` steps each + under `FT_on_ms = 100` ms apart) the step jumps to `FT_step = 1000` Hz for rapid QSY, and + reverts after a `FT_cancel_ms = 500` ms pause (`Tune.cpp:20-57`). + +`AdjustBand()` in [[main-loop]] re-derives the band from the new frequency, keeping the last +valid band if you tune outside the ham bands (so demod keeps working). + +Note `AdjustFineTune()` only moves `fineTuneFreq_Hz` — it never touches `centerFreq_Hz` or +reprograms the Si5351, so a fine-tune spin leaves the spectrum **center fixed** and only slides +the on-screen marker. [[rapid-tune-mute-freeze]] relies on exactly this distinction: it fully +freezes the spectrum for Center Tune (which re-centers) but for Fine Tune holds the trace and +just redraws the moving tuning bar. + +## Per-mode VFO selection lives in HardwareSm +The actual "which formula → which VFO register" dispatch is `HandleTuneState()` +(`HardwareSm.cpp:639`), which also selects LPF/BPF band, antenna, PA, and refreshes the FIR +mask before programming the VFO. Highlights: +- `TuneReceive` → RX VFO = `centerFreq` (fine tune done in DSP). +- `TuneSSBTX` → TX VFO = `GetTXRXFreq_cHz()`; on dual-VFO radios the RX VFO is set to + **freq/3** to watch the 3rd harmonic for the TX spectrum display (fundamental too strong) + (`HardwareSm.cpp:662-666`). +- `TuneCWTX` → CW VFO = `GetCWTXFreq_cHz()` (tone offset applied). +- `TuneCalReceiveIQ` / `TuneCalTransmitIQ` → calibration-specific VFO placement (TX-IQ offsets + the TX VFO from RX so the image sits far from DC). See [[hardware-state-machine]], + [[iq-imbalance-correction]]. + +## PA power-calibration math (also in this file) +Unrelated to tuning but physically co-located. The PA output is modeled as a saturating +**tanh** curve (`Tune.cpp:168-204`): + +``` +Pout = Psat · tanh( k · 10^(−A/10) ) A = attenuation in dB +``` + +- `attenToPower_mW` / `powerToAtten_dB` — forward/inverse of the model. +- `CalculateCWAttenuation(P)` / `CalculateSSBTXGain(P)` — pick attenuation (CW) or gain (SSB) + for a requested power, and select the 20 W vs 100 W PA at `PowerCal_20W_to_100W_threshold_W`. +- `FitPowerCurve` / `fitTanhModel` — a **Gauss-Newton least-squares** fit of `(Psat, k)` from + measured (attenuation, power) points, used by the power-calibration routine. + +These back `PowerCalSm` in [[hardware-state-machine]]; the per-band `Psat`/`k` coefficients +live in the `ED` struct ([[persistent-config]]). *(Candidate for its own +power-calibration theory page.)* + +## Open questions +- Confirm the exact DSP site of the fine-tune software mix (`FreqShiftF`) and how `−Fs/4` + composes with it. +- The SSB-TX 3rd-harmonic-monitor trick — document the dual-VFO display path that consumes it. diff --git a/wiki/firmware/tx-filter-hil-test.md b/wiki/firmware/tx-filter-hil-test.md new file mode 100644 index 0000000..8f4395b --- /dev/null +++ b/wiki/firmware/tx-filter-hil-test.md @@ -0,0 +1,229 @@ +--- +title: Transmit Filter Hardware-in-the-Loop Test +type: decision +status: draft +created: 2026-07-29 +updated: 2026-07-29 +tags: [test, verification, hil, analog-discovery, filters, sample-rate, cat, transmit, ssb, hilbert] +source_refs: [] +related: ["[[filter-hil-test]]", "[[runtime-filter-design]]", "[[sample-rate-switching]]", "[[cat-control]]", "[[dsp-chain]]", "[[ssb-phasing-method]]", "[[audio-equalizer]]", "[[multirate-decimation]]", "[[iq-imbalance-correction]]", "[[tx-carrier-null]]", "[[audio-io]]"] +--- + +# Transmit Filter Hardware-in-the-Loop Test + +`code/tools/tx_filter_hil/` — the transmit counterpart to [[filter-hil-test]]. It measures the +**transmit** DSP filters on the actual radio and checks they hold their designed frequencies at +both sample rates, closing the other half of the gap [[runtime-filter-design]] left: the two +generated transmit stages were previously verified only in simulation. + +Full operating instructions live in `code/tools/tx_filter_hil/README.md`. This page records the +method, the quantitative findings, and — importantly — **what this measurement cannot prove**. + +## Rig + +An Analog Discovery 2 drives `W1` into the microphone input and reads the exciter's **I and Q +outputs on `Ch1` and `Ch2` simultaneously**. CAT on `/dev/ttyACM1`, diagnostics on +`/dev/ttyACM0`. No PTT wiring: the radio is keyed over CAT with `TX;`/`RX;` ([[cat-control]]). + +Ch1/Ch2 order does not matter — the suite detects it (see below). The exciter outputs sit on a +DC bias near **+1.6 V**, so the scope offset is centred there; the AD2's range is peak-to-peak +about that offset, giving a ±2.5 V window on the default 5 V range. + +## The method: complex baseband, not a differential measurement + +The exciter output *is* a complex baseband signal — a 1 kHz microphone tone emerges as a complex +exponential at ±1 kHz, one real sine on each of I and Q, 90° apart ([[iq-quadrature-sampling]]). +Capturing both channels synchronously reconstructs `I + jQ` and so gives the **two-sided** +spectrum, from which one sweep yields: + +- the level at `+f` — the transmit audio response, and +- the level at `-f` — the **opposite-sideband suppression**, the headline specification of an SSB + transmitter ([[ssb-phasing-method]]). + +Both come out of the same capture. Two separate single-channel captures would have no defined +phase relationship, so suppression could not be measured at all. + +⚠️ **The receive suite's differential trick is not available here.** [[filter-hil-test]] measures +every response as the difference between two captures with a filter engaged and bypassed, so the +whole analog path cancels exactly. Nothing in the transmit chain can be bypassed over CAT: there +is no command for `ED.equalizerXmt`, and the two generated FIR stages are unconditional. Every +transmit response is therefore a **composite** of the whole path, microphone input to exciter +output, including the codec front end and the equaliser bank. + +That costs absolute accuracy — hence the loose absolute tolerances — but it costs the rate +comparison **nothing**: no part of the analog path changes when the sample rate does, so it +divides out of a between-rates comparison just as cleanly as a bypass difference would. + +## Resolving the wiring takes two captures, not four + +The receive suite brute-forces its two unknowns by trying all four combinations and keeping +whichever the SSB filter passes. That does not work here, because **every combination produces a +perfectly good tone**; all that changes is which side of DC it lands on. One capture cannot +distinguish "Ch1 on I, upper sideband" from "Ch1 on Q, lower sideband" — swapping the probes and +switching sideband both conjugate the signal. + +What separates them is the radio's own sideband switch. `SidebandSelection()` negates I for USB +and leaves LSB alone (`DSP_FFT.cpp:864-869`), so commanding USB conjugates the transmitted signal +and moves the tone across DC. Nobody rewires the bench between two captures, so **the change +between LSB and USB isolates the radio's contribution from the wiring's**. Which sign LSB +produced then says which input is on I. + +The suite measures the resolved sideband rather than predicting it, because an inverting stage +anywhere in the exciter's analog output would flip it without being a fault. + +## Scope sample rate: 100 kHz, not 96 + +⚠️ A measurement trap specific to this rig. The exciter DAC leaves residual images near its own +192 kHz output rate. Sampling at 96 ksps, an image at `192000 − f` aliases to **exactly `−f`** — +straight onto the mirror frequency the suppression reading uses — and would cap the measurable +suppression at whatever the DAC's image rejection happens to be. At 100 ksps the same image lands +at `8000 + f`, clear of everything measured. Any scope rate that divides 192000 or 176400 has the +same problem; the suite warns if one is given. + +## The tolerance had to be 2.5 %, not 1.5 % + +⚠️ **This is the finding most likely to be misread as a fault.** The transmit corners move +**≈ +1.2 % between rates on correct firmware**, and no tightening of the test can remove it. + +Both generated transmit stages are 48-tap Kaiser-Bessel windowed sincs (`CalcFIRCoeffs`, +`DSP_FIR.cpp:756`). A 48-tap design **does not scale exactly** when its normalised cutoff +changes: the taps are quantised to the same 48 positions at both rates, so the realised corner +lands in a slightly different place even though the design specification is identical. Evaluating +the two generated tap sets directly gives a cascade −3 dB corner of: + +| Audio rate | Cascade −3 dB | −6 dB | +|---|---|---| +| 24 ksps (192 ksps) | **2726 Hz** | 2952 Hz | +| 22.05 ksps (176.4 ksps) | **2759 Hz** | 2969 Hz | + += **+1.2 %**. `TransmitChain176k.AudioBandwidthHoldsAcrossRates` allows 2 % for the same reason. +The bug being hunted is still **−8.125 %**, so 2.5 % leaves better than a factor of three between +correct and broken. **A tolerance tighter than the design's own reproducibility is a tolerance on +the design, not on the firmware, and would cry wolf.** Do not set this to 1.5 % to match the +receive suite. + +This does not apply to the receive filters, which are IIR designs generated from prewarped analog +prototypes — those genuinely hold to 0.3 % on the bench. + +## The transmit stopband profile + +Also from evaluating the generated tap sets (cascade of `TX_DECIMATE3_FC_HZ` 3500 Hz and +`TX_AUDIO_LPF_FC_HZ` 3039.6 Hz, both −6 dB corners, at 24 ksps): + +| Frequency | Cascade | +|---|---| +| 2760 Hz | −3.4 dB | +| 3000 Hz | −6.8 dB | +| 3500 Hz | −21.6 dB | +| 4000 Hz | **−52 dB** | +| 4500 Hz and above | better than −90 dB | + +This matters for how the out-of-band test is gated. An earlier draft demanded 30 dB of rejection +at 3450 Hz, where the cascade is only ~20 dB down **and correctly so** — that is the transition +skirt, not the stopband. The stopband boundary is therefore taken as **4 kHz** +(`bandtable.TX_STOPBAND_FROM_HZ`), above the highest equaliser cell and where the cascade is +comfortably past 50 dB. + +## The alias test has two regions, not one + +`TXDecimateBy2Again` halves the audio rate, so its output Nyquist is `audio_rate/4` — 6 kHz at +192 ksps, 5512 Hz at 176.4 ksps. Above that point a microphone tone **cannot appear at its own +frequency at all**; it can only reappear folded, at `|audio_rate/2 − f|`. So an 8 kHz input +resurfaces at 4 kHz (192 ksps) or 3025 Hz (176.4 ksps). The two regions are checked separately: + +| Probe region | What is measured | +|---|---| +| 4 kHz → fold point | direct rejection: the tone at its own frequency | +| fold point → audio Nyquist | fold-back: the product at `\|audio_rate/2 − f\|` | + +This is the failure [[runtime-filter-design]] fixed — the table `TX_DECIMATE3_FC_HZ` replaced was +flat to 0.425·Fs, so 6–9.5 kHz folded into the transmitted audio unattenuated. The fold +frequencies scale with the rate, so where to look changes per rate; see +[[multirate-decimation]]. + +Both readings are taken against the **rig's own noise floor**, measured with the microphone +silent using the identical windowed peak search. Without that, "−33 dBc" is ambiguous between a +real product and the floor — and the difference decides whether a pass means anything. Results +sitting on the floor are reported as floor-limited, i.e. the true rejection is greater than the +rig can see. + +## What this cannot prove + +Three limits, all repeated in the generated report so a passing run is not over-read: + +1. ⚠️ **A clean fold-back result does not on its own vindicate the decimator.** `BandEQ` runs + *before* `TXDecimateBy2Again` (`DSP.cpp:1137` vs `:1140`) and its highest cell is 4 kHz, so it + already attenuates an 8 kHz input substantially. A clean result proves nothing folds into the + transmitted audio — which is what matters operationally — but + `TransmitChain176k.DecimatorStopsBeforeTheFoldPoint` is what proves that stage's own stopband, + by evaluating the tap set at the fold point directly. +2. **Sideband suppression is checked against a floor, not for rate invariance.** The Hilbert table + is deliberately not regenerated per rate, and that is correct — a Hilbert transformer's usable + band is a fraction of its sample rate, so one fixed table is the same design at any rate and + its band edges are *meant* to move with Fs. Requiring the suppression curve to hold still in + hertz would fail correct firmware. What is measured lumps together the Hilbert accuracy, the + per-band [[iq-imbalance-correction]], and any gain difference between the two exciter outputs; + from the exciter's terminals those are not separable. +3. **The transmit equaliser cells are not measured individually, deliberately.** `DSP_FFT.cpp:402-403` + points `S_Xmt[i].pCoeffs` and `S_Rec[i].pCoeffs` at the *same* array, so the transmit cells + carry byte-for-byte the coefficients [[filter-hil-test]] already sweeps on the receive side. + Adding a CAT command to solo them would re-verify one table through a second biquad instance, + whose only independent state is `pState`. They are still exercised here as part of the + composite passband — **the low corner is theirs**, since nothing in the chain is a deliberate + high pass and what rolls the bottom off is the 198 Hz lowest cell ([[audio-equalizer]]). + +## Operating constraints + +- **The radio transmits continuously for the whole sweep**, several minutes per rate at 100 % + duty. Run with the exciter I/Q feeding the scope only, or into a dummy load. The suite reports + total key-down time. +- ⚠️ **The power setting must not change during a run.** `TXGain` (`DSP.cpp:1101`) derives the + exciter drive from `ED.powerOutSSB[band]` via `CalculateSSBTXGain`, so changing it moves every + level measured. The suite reads it, reports it, and does not touch it. +- **Must be in SSB.** `TX_write` only dispatches PTT from `SSB_RECEIVE` or `CW_RECEIVE` + ([[mode-state-machine]]), and a CW key-down transmits a sidetone-oscillator carrier rather than + processed microphone audio — exercising none of these filters. The suite forces USB (or LSB) and + restores the original modulation. +- **PTT is dropped around every sample-rate change.** `SR_write` returns `?;` unless the radio is + receiving, precisely because `ChangeSampleRate()` reconfigures the I²S clock and rebuilds the + DSP chain (`CAT.cpp:814-827`). The state guard registers "transmit off" **last** so it runs + *first* on the way out, since every other restore assumes the radio is receiving. +- Only the microphone's **left** channel matters: `TransmitProcessing` overwrites Q with a copy of + I immediately after the equaliser (`DSP.cpp:1139`), so a second AWG channel would contribute + nothing ([[audio-io]]). +- Unlike [[filter-hil-test]], **AGC is irrelevant** — it is a receive-path control. + +## The suite tests itself + +`test_tx_filter_hil.py` — 48 hardware-free tests covering the complex-spectrum metrology, the +clip test (which must judge against the AD2's **half**-range about the offset, not the full range +from zero), the wiring-swap symmetry, and the corner extraction. **Including a check that the +comparison fails when handed a simulated −8.125 % shift, and that it names it as that specific +regression** rather than as generic drift. + +The whole pipeline was additionally validated against a simulated radio whose response is the +replicated `CalcFIRCoeffs` cascade: correct firmware → PASS at +1.23 %, frozen tables → FAIL on +all three corners. That is what produced the +1.2 % figure above and drove the tolerance choice. + +## Coupling to the firmware + +- Needs no new CAT commands — `TX`/`RX`/`MG`/`PC`/`MD`/`SR`/`ED` already suffice, which is why + this suite (unlike [[filter-hil-test]]) required no firmware change. +- ⚠️ `bandtable.py` **mirrors design constants from `DSP_FIR.cpp` and `DSP.cpp` by hand**, and + `TX_AUDIO_CORNER_3DB_HZ` / `TX_STOPBAND_*` were derived by evaluating the generated tap sets. + Nothing detects a firmware value edited without updating it. +- It shares `filter_hil.radio` (CAT plumbing, `ED;` parsing, state guard) and the scalar curve + fitting in `filter_hil.measure` with the receive suite; the PTT, mic-gain and power helpers were + added there. + +## Open questions +- **Not yet run on the bench.** The suite is verified against simulation and self-tests; the + measured result is still to come. `--scope-offset` defaults to 1.6 V from the older + `transmit_test.py`, which assumed the exciter loaded by the RF board — the bias may differ with + it disconnected, showing up as `clipped` points. +- The composite low corner mixes the 198 Hz equaliser cell with the microphone input's AC + coupling and they cannot be separated over CAT. A CAT command for `equalizerXmt` would let the + cells be zeroed, isolating the analog contribution — the one case where that command would earn + its keep. +- Whether the +1.2 % tap-quantisation spread could be removed by asking `CalcFIRCoeffs` for more + taps on the transmit stages, or whether it is small enough not to care about. diff --git a/wiki/firmware/ui-state-machine.md b/wiki/firmware/ui-state-machine.md new file mode 100644 index 0000000..88145e1 --- /dev/null +++ b/wiki/firmware/ui-state-machine.md @@ -0,0 +1,112 @@ +--- +title: UI State Machine (UISm) +type: module +status: draft +created: 2026-06-08 +updated: 2026-07-29 +tags: [state-machine, ui, menus, screens, splash, statesmith] +source_refs: [] +related: ["[[overview]]", "[[state-machine-architecture]]", "[[display-subsystem]]", "[[front-panel]]", "[[main-loop]]", "[[mode-state-machine]]", "[[sample-rate-switching]]"] +--- + +# UI State Machine (UISm) + +**Files:** `UISm.cpp` (~33 KB, **generated**), `UISm.h`, source diagram `UISm.drawio`. +StateSmith algorithm *Balanced2*. Do **not** hand-edit the `.cpp` — edit `UISm.drawio` and +regenerate ([[state-machine-architecture]]). + +## Role +UISm owns **which screen is shown and how menus navigate**. It decides *what* to display; the +[[display-subsystem]] (`MainBoard_Display*`) owns *how* to draw it, reading global state +read-only. UISm and [[mode-state-machine]] are siblings driven from the same [[main-loop]] +event stream — notably both receive the `CALIBRATE_*` events (UISm shows the cal screen, +ModeSm sequences the cal hardware). + +## States (`UISm.h:35-50`) + +13 states under `ROOT`: + +| State | Screen | Renderer | +|---|---|---| +| `SPLASH` | startup splash (timed) | — | +| `HOME` | main operating screen (spectrum, S-meter, VFO) | `MainBoard_DisplayHome` | +| `MAIN_MENU` | top-level menu | `MainBoard_DisplayMenus` | +| `SECONDARY_MENU` | sub-menu | `MainBoard_DisplayMenus` | +| `UPDATE` | parameter-adjust editor | (per-parameter) | +| `FREQ_ENTRY` | **Direct Frequency Entry (DFE)** | `MainBoard_DisplayDFE` | +| `EQUALIZER` | 14-band TX/RX EQ editor | `MainBoard_DisplayEqualizer` | +| `BIT` | Built-In Test results | — | +| `CALIBRATE_FREQUENCY` | frequency cal screen | `MainBoard_DisplayCalibration_Frequency` | +| `CALIBRATE_POWER` | power cal screen | `…_Power` | +| `CALIBRATE_RX_IQ` | RX I/Q cal screen | `…_RXIQ` | +| `CALIBRATE_TX_IQ` | TX I/Q cal screen | `…_TXIQ` | + +> Resolves the [[display-subsystem]] open question: **DFE = Direct Frequency Entry** (the +> `UISm_EventId_DFE` → `FREQ_ENTRY` state, `MainBoard_DisplayDFE`). + +## Events (`UISm.h:15-28`) and sources +All dispatched from [[main-loop]] (`UISm_dispatch_event(&uiSM, …)`): + +| Event | Source | +|---|---| +| `DO` | 1 ms `TimerInterrupt()` (`Loop.cpp:356`) — splash timeout | +| `MENU` / `SELECT` / `HOME` | button presses in `HandleButtonPress` (`Loop.cpp:419/413/425…`) | +| `DFE` | button (`Loop.cpp:564`) | +| `EQUALIZER`, `BIT`, `CALIBRATE_FREQUENCY/POWER/RX_IQ/TX_IQ` | menu actions (`Loop.cpp:1350-1386`) | + +## Transition map (verified from `UISm.cpp`) + +``` +SPLASH ──[DO: splashCount_ms ≥ splashDuration_ms]──▶ HOME + +HOME ──MENU──▶ MAIN_MENU ──SELECT──▶ SECONDARY_MENU ──SELECT──▶ UPDATE ──SELECT──▶ HOME + │ (HOME event from MAIN_MENU / SECONDARY_MENU / UPDATE returns to HOME) + │ + ├─DFE───────────▶ FREQ_ENTRY ─┐ + ├─EQUALIZER─────▶ EQUALIZER ─┤ + ├─BIT───────────▶ BIT ─┼─ each returns to HOME on the HOME event + ├─CALIBRATE_FREQUENCY ▶ … ────┤ + ├─CALIBRATE_POWER ▶ … ────┤ + ├─CALIBRATE_RX_IQ ▶ … ────┤ + └─CALIBRATE_TX_IQ ▶ … ────┘ +``` + +Two distinct shapes: +- **Menu drill-down** — a 3-level stack `HOME → MAIN_MENU → SECONDARY_MENU → UPDATE`, each + level entered by `SELECT`; `UPDATE`'s `SELECT` commits and returns to `HOME`. `HOME` event + pops straight back to `HOME` from any level. +- **Tool screens** — DFE, EQUALIZER, BIT and the four CALIBRATE screens hang directly off + `HOME` and are leaf states that only respond to `HOME` (return). They take no part in the + menu stack. + +## State variables (`UISm.h:63-73`) +- `splashDuration_ms` / `splashCount_ms` — splash timing (the `DO` tick counts up to the + duration, then → HOME). +- `mainMenuSelection` / `mainMenuLength`, `secondMenuSelection` / `secondMenuLength` — menu + cursor position and item count (the encoder moves the selection; `SELECT` descends). +- `clearScreen` — set true on `UPDATE` entry to force a full redraw. +- `uiUp` — opaque pointer to the current UI context (back-navigation target). + +## Interactions +- **Button routing** is state-aware: `HandleButtonPress` switches on `uiSM.state_id` + (`Loop.cpp:406,1003`) so the same physical button means different things per screen, and is + ignored entirely while [[mode-state-machine]] is transmitting (`Loop.cpp:395-403`). +- **Calibration** is dual-dispatched: the `CALIBRATE_*` event drives UISm (screen) **and** + ModeSm (into `CALIBRATION_STATES`, hardware) — see [[mode-state-machine]], + [[hardware-state-machine]]. + +## Menu content is data, not states +The structural states above are fixed; the menu *contents* live in +`MainBoard_DisplayMenus.cpp` as `PrimaryMenuOption primaryMenu[9]` with nested +`SecondaryMenuOption` arrays ([[display-subsystem]]). Adding a menu therefore does **not** touch +UISm or the `.drawio` diagram — the **"Sample Rate"** menu ([[sample-rate-switching]]) grew the +array from 8 to 9 entries and required no state-machine regeneration. Worth knowing before +reaching for StateSmith. + +## Open questions +- How encoder rotation maps to `mainMenuSelection`/`secondMenuSelection` movement (selection + is updated outside UISm, in the front-panel/menu code). +- What `uiUp` actually points at and how deep back-navigation works. +- `mainMenuLength`/`secondMenuLength` are UISm state variables while the arrays they describe + live in the display module. Nothing links the two at compile time, so a menu added without + updating the length would silently truncate — check how they are kept in step. diff --git a/wiki/hardware/filter-board-electronics.md b/wiki/hardware/filter-board-electronics.md new file mode 100644 index 0000000..d4d8a6c --- /dev/null +++ b/wiki/hardware/filter-board-electronics.md @@ -0,0 +1,83 @@ +--- +title: Filter Boards — Electronics (BPF / LPF / PA back-end, decoders, SWR sensing) +type: hardware +status: draft +created: 2026-06-16 +updated: 2026-06-16 +tags: [hardware, bpf, lpf, relays, decoders, ad8307, ad7991, swr, mcp23017, pa, antenna] +source_refs: [sources/t41-ep-schematics] +related: ["[[hardware-platform]]", "[[i2c-bus-map]]", "[[filter-boards]]", "[[rf-board-electronics]]", "[[t41-ep-schematics]]"] +--- + +# Filter Boards — Electronics + +The *physical* RF back-end boards that the [[filter-boards]] firmware module (`BPFBoard.cpp`, +`LPFBoard.cpp`, `LPFBoard_AD7991.cpp`) drives. This page owns the **electronics** — chips, +decoders, relays, and the schematic-traced decode chain; the firmware page owns the **code** +(the shared `hardwareRegister` model, the band-encoding macros, the SWR/power math). Three +separate physical boards back this one module ([[t41-ep-schematics]]). + +## BPF / exciter-filter board (`T41-exciter-filter-board`) +- **~22× MASWSS0179** RF switches + **SN74LVC1G04** inverters select the per-band band-pass + **L-C filter banks** (RX/TX image rejection). +- Band select via **MCP23017 (U35, 0x24)** ([[i2c-bus-map]]). +- Sits between exciter/receiver and the PA (J2 FROM EXCITE, J1 TO PA, J5 TO RECEIVE, J6 FROM LPF). + +## LPF / 100 W PA control board (`K9HZ_100W_11band_LPF-Control`) +**MCP23017 (U15, 0x25)** GPIO bits are decoded by dedicated logic — the firmware never +addresses relays directly, it just writes the encoded `hardwareRegister` bits ([[filter-boards]]): + +- **LPF band select** — **GPIOB[0:3]** (4-bit BCD) → **U12 CD74HC4514** 4→16 decoder (inputs + A0–A3 = pins 2,3,21,22): one of Y0–Y15 goes **HIGH**. Those 16 lines pass through the + **inverting** relay drivers **U9 + U10 (2× ULN2803)**, so every output is **HIGH except the + selected band's, which is pulled LOW**. The band-LPF relays are on an **external board** + reached via **J24 (LPF CTRL HI) / J25 (LPF CTRL LOW)**; a relay engages when its control pin + is driven **LOW**. **NF = 0b1111** (Y15) is the *No-Filter* bypass. The BCD codes + (`SDT.h:95-106`): 60 m=0000, 160 m=0001, 80 m=0010, 40 m=0011, 30 m=0100, 20 m=0101, + 17 m=0110, 15 m=0111, 12 m=1000, 10 m=1001, 6 m=1010, NF=1111. +- **Antenna select** — **GPIOB[4:5]** (2-bit) → **U2 74HC237** 3→8 decoder → **U4 ULN2803** → + **relays K4–K7** (on-board) → antenna ports ANT-1…4. +- **100 W PA route** — **GPIOB[7]** drives a spare **U4** channel directly → **relays K2/K3**, + switching the optional 100 W amplifier into the TX path. +- **BPF path routing** — **GPIOA[0:1]** (TXBPF/RXBPF) → **U5/U6** route the RX vs TX signal + through the external band-pass filter (between J15 and J18). + +So the on-board **HF41F relays K2–K7 are *not* the band LPFs** — K2/K3 = 100 W PA, K4–K7 = +antenna. The per-band LPF relays live on a separate external filter board (below). Also on this +board: 20 W and 100 W PA paths, transverter out, **KEY OUT**; PA control via +**IRF630 / L7808 / TC4428**. + +## External LPF filter board (`K9HZ_100W_11band_LPF-Filter`) +Receives the decoded band lines on **J26/J27** (LPF CTRL LOW/HI ← the control board's J24/J25) +as **band-named control nets** `B160M, B80M, B60M, B40M, B30M, B20M, B17M, B15M, B12M, B10M, +B6M` and `BNF`. Each net drives **2 of the 24 HF41F relays** (input + output switch), so there +is **one dedicated low-pass filter per band** — *not* shared band-groups. Each filter is a +**7th-order** LC ladder: **3 series inductors** (symmetric, outer pair equal + distinct middle) +plus shunt capacitors; **33 inductors total** (3 × 11 filtered bands; **BNF** has no inductors — +a straight-through bypass). Inductances descend with frequency, **5.21 µH / 4.73 µH** (160 m) +down to **0.188 µH / 0.170 µH** (6 m). + +The full band-select path therefore closes as: +``` +band BCD (GPIOB[0:3]) → U12 CD74HC4514 Yn (n = BCD) → U9/U10 ULN2803 (invert) + → J24/J25 → J27/J26 → B net → 2× HF41F relays → that band's 7-element LPF +``` +i.e. **decoder output Yn directly selects the band whose BCD = n** (Y0=60 m … Y10=6 m, Y15=NF). +*(Per-band exact L/C → cutoff table not yet tabulated; assignment by descending inductance vs. +band frequency.)* + +## Power / SWR sensing hardware +A directional-coupler transformer feeds **2× AD8307** *log* power detectors (**U14 = forward, +U19 = reflected**), read by **1× AD7991** 12-bit I²C ADC (**U20, 0x28/0x29**; **CH0 = forward, +CH1 = reflected**) against a **REF3440 4.096 V** reference on the ADC's Vin3/Vref pin +(schematic-confirmed, net-traced 2026-06-14). Because the AD8307 is **logarithmic**, the +default firmware applies the AD8307 transfer law (≈25 mV/dB, −84 dBm intercept) — the +conversion math lives in [[filter-boards]]. + +An optional **`USE_ANALOG_SWR`** build instead uses **linear diode detectors** on Teensy ADC +pins 26 (FWD) / 27 (REV) — different hardware, different (square-law) math, off by default. + +## Open questions +- Per-band exact L/C → cutoff frequency table for the external LPF board. +- AD7991 `REGISTER_SETUP` channel-select bits vs. the "CH0+CH1" comment (a firmware detail — + see [[filter-boards]]). diff --git a/wiki/hardware/hardware-platform.md b/wiki/hardware/hardware-platform.md new file mode 100644 index 0000000..3692105 --- /dev/null +++ b/wiki/hardware/hardware-platform.md @@ -0,0 +1,168 @@ +--- +title: Hardware Platform (T41-EP) +type: hardware +status: stable +created: 2026-06-14 +updated: 2026-07-29 +tags: [hardware, teensy, t41-ep, board-stack, codec, i2c, platform, sample-rate] +source_refs: [sources/t41-ep-schematics] +related: ["[[overview]]", "[[i2c-bus-map]]", "[[rf-board-electronics]]", "[[filter-board-electronics]]", "[[rf-board]]", "[[filter-boards]]", "[[front-panel]]", "[[display-subsystem]]", "[[hardware-state-machine]]", "[[audio-io]]", "[[sample-rate-switching]]", "[[filter-hil-test]]"] +--- + +# Hardware Platform (T41-EP) + +The physical radio Phoenix runs on: a **Teensy 4.1**-based **T41-EP** software-defined HF +transceiver built as a stack of interconnected boards. This page is the entry point for the +`hardware/` area — the *electronics the firmware drives*. For the **code** that drives each +board, follow the firmware module links; this page describes the silicon and how it is wired. + +> Source note: confirmed against the **KiCad schematics** ([[t41-ep-schematics]], V012-era) +> as of 2026-06-14, plus the firmware hardware-abstraction code (`Config.h`, board drivers, +> `MainBoard_AudioIO.cpp`). Chip part numbers and connectors are schematic-confirmed; a few +> pin-level wiring claims remain *(infer)* until nets are fully traced. + +## Compute core — Teensy 4.1 +- **MCU:** NXP i.MX RT1062, **ARM Cortex-M7 @ 600 MHz**, single-precision hardware FPU + DSP + extensions (used heavily by the CMSIS-DSP FIR/FFT routines — see [[multirate-decimation]], + [[fast-convolution-filtering]]). +- **Memory used by Phoenix:** tightly-coupled RAM for DSP buffers; `DMAMEM` region for audio + DMA buffers (the cold-boot uninitialized-`DMAMEM` class of bug is noted in + [[fast-convolution-filtering]] and [[noise-reduction]]). +- **Storage:** on-chip program flash hosts a **LittleFS** filesystem (~1 MB) for the JSON + config; an optional **SD card** (Teensy 4.1 built-in socket) mirrors it. See + [[persistent-config]] — there is **no true EEPROM** despite the historical `EEPROMData` name. +- **USB:** dual serial (Arduino "Dual Serial"): one port for debug, `SerialUSB1` for + **CAT control** ([[cat-control]]). +- **Three I²C buses** (Wire/Wire1/Wire2) fan out to the peripheral boards — see [[i2c-bus-map]]. + +## The board stack +(Reference designators from the [[t41-ep-schematics]].) + +| Board | Key chips | Role | Firmware | +|---|---|---|---| +| **Main board** (`V012`) | Teensy 4.1 (U8), PCM1808 ADC (U6), PCM5102 DAC (U5), ATtiny85 (U4) + SUP90P06 P-FETs (soft power) | Compute, RX I/Q digitizing, speaker audio, all I/O fan-out, off-board RA8875 drive | [[display-subsystem]], audio (below) | +| **Teensy Audio Board** | **SGTL5000** codec (U7) | Mic input + TX I/Q output path (the *only* SGTL5000) | audio (below) | +| **RF board** (`V012`) | Dual-Si5351 + PE4312 daughterboards, ADT1-1/ADT2-1T mixer xfmrs, PSA-8A+/MAR-3SM+ MMICs, AD8599/OPA2209/MC33078 I/Q amps, MCP23017 (U21, 0x27) | Quadrature LO + mixer, T/R switching, RX/TX attenuators, cal loopback | [[rf-board]] | +| **BPF / exciter-filter board** | ~22× MASWSS0179 RF switches, MCP23017 (U35, 0x24) | Switched per-band band-pass filter banks (RX/TX image rejection) | [[filter-boards]] | +| **LPF / 100 W PA control board** | HF41F relays + ULN2803, CD74HC4514/74HC237 decoders, 2× AD8307 + AD7991 (U20, 0x28/0x29), MCP23017 (U15, 0x25) | Band-LPF decode + PA/XVTR/antenna routing (4 ANT ports), SWR/power sensing (filters on a separate board) | [[filter-boards]] | +| **Front panel** | 2× MCP23017 (0x20/0x21) | Encoders, buttons, LEDs | [[front-panel]] | + +The firmware treats each board through a clean driver module (the "hardware abstraction" +principle, [[overview]]), which is what lets the unit tests mock the hardware. + +## Audio front/back end +Audio I/O is a **4-channel (quad) I²S** interface via the OpenAudio (Teensy Audio fork) +graph (`MainBoard_AudioIO.cpp` — the software side is [[audio-io]]). There is **one physical SGTL5000** (on the Teensy Audio Board, +U7); the main board does its own conversion with a **PCM1808** ADC (U6) and **PCM5102** DAC +(U5). Three converters, three jobs (schematic-confirmed, [[t41-ep-schematics]]): +- **SGTL5000** (Audio Board, `sgtl5000_teensy`, I²C addr **LOW**) — **double-duty**: microphone + **in** (SSB voice) *and* exciter **TX I/Q out** (`MainBoard_AudioIO.cpp:450-457`). +- **PCM1808** (U6, main board) — **RX I/Q in** (ADC). +- **PCM5102** (U5, main board) — **speaker audio out** (DAC). + +> ⚠ **Code-naming quirk (not a missing chip).** `MainBoard_AudioIO.cpp` declares a control +> object **`pcm5102_mainBoard` typed `AudioControlSGTL5000`** (addr HIGH) and the header says +> "two SGTL5000 codecs." In fact that object represents the **PCM5102 speaker DAC**, *not* a +> second SGTL5000 — there is only one SGTL5000 on the whole radio. The PCM5102 (and PCM1808) +> are **control-less I²S parts** with no I²C, so the `AudioControlSGTL5000` `.enable()/ +> .inputSelect()` calls on this object are effectively **no-ops**; the I²S *data* path is what +> carries speaker audio. So: harmless mistype/comment, worth a code clarity fix, not a bug. +> → [[t41-ep-schematics]] + +The quad-channel map: + +``` +i2s_quadIn ch0/1 = mic L/R (Audio Board) ch2/3 = RX I/Q (PCM1808) +i2s_quadOut ch0/1 = TX I/Q (Audio Board) ch2/3 = speaker L/R (PCM5102) +``` + +I²S sample rate is set by `SetI2SFreq()`, which computes the SAI1 PLL divider chain +(`n1`, `n2`, fractional `C`) for an arbitrary requested rate. Phoenix offers **192 kHz** +(default) and **176.4 kHz**, switchable at run time and persisted +([[sample-rate-switching]], [[multirate-decimation]], [[zoom-fft]]). The three converters share +clocks, so the rate change applies to all of them at once. Mode-based mixer routing in +`UpdateAudioIOState()` connects mic→DSP→TX-I/Q on transmit and RX-I/Q→DSP→speaker on receive. + +The generated clock is not exact: [[filter-hil-test]] measures the real demodulation centre +**≈ −180 ppm** from nominal, which is the Teensy's fractional I²S clock rather than an error. + +**I²S pin routing (Teensy quad-I2S, schematic-confirmed 2026-06-15).** The three clocks are +**shared** by all three converters (U5 PCM5102, U6 PCM1808, U7 SGTL5000 adapter): + +| Signal | Teensy pin | Net | To | +|---|---|---|---| +| MCLK (master clock) | GPIO23 | `CLK` | U5, U6, U7 | +| LRCLK (word clock) | GPIO20 | `LRCK` | U5, U6, U7 | +| BCLK (bit clock) | GPIO21 | `BCK` | U5, U6, U7 | +| Data out → speaker DAC | GPIO32 | `DAUDIO_OUT` | U5 (PCM5102) | +| Data in ← RX-I/Q ADC | (Teensy I²S in) | `ADC_IN` | from U6 (PCM1808) | + +`DAUDIO_OUT` (GPIO32) is the Teensy quad-I2S **OUT1B** feeding the PCM5102; `ADC_IN` carries the +PCM1808's RX I/Q into the Teensy. The **SGTL5000 adapter (U7)** uses the standard Teensy +audio-shield data pins — **OUT1A (GPIO7)** for TX I/Q and the mic data-in line — sharing the +same three clocks *(inferred from the Teensy quad-I2S assignment; not separately net-labelled)*. + +## RF signal chain (physical) +Antenna → **LPF (harmonic) + BPF (image) filter banks** → **RF board**: the Si5351 supplies a +**quadrature LO** that, with the codec, forms the I/Q mixer; T/R relays and attenuators set +direction and level. On TX the path adds the **PA / XVTR / antenna** back-end with **AD7991** +SWR/forward-power sensing. The [[hardware-state-machine]] sequences all of this (RX components +disabled before TX enabled, with relay/PIN-diode settling delays). Detailed per-board behaviour +lives in [[rf-board]] and [[filter-boards]] (the firmware modules) with the chip-level +schematic detail in [[rf-board-electronics]] and [[filter-board-electronics]]; the DSP side is +[[iq-quadrature-sampling]] / [[ssb-phasing-method]]. + +## Power control & graceful shutdown (ATtiny85, U4) +The main board's **ATtiny85 (U4)** is a dedicated **soft-power controller** — it gates the +main power **FET** (the SUP90P06 P-MOSFETs) and runs a 3-state machine so the Teensy can save +state before power is cut. It is *not* an I²C device or sensor; it talks to the Teensy over a +**two-wire handshake**. Firmware: `code/src/ATTiny85_On_Off/ATTiny85_On_Off.ino` (separate +sketch from PhoenixSketch); Teensy side in `Loop.cpp`. + +| ATtiny pin | Dir | Net | Function | +|---|---|---|---| +| PB3 (pin 2) | in (ext. pulldown) | PANEL_SWITCH | front-panel ON/OFF button (HIGH = pressed) | +| PB4 (pin 3) | out | FET_SWITCH | power FET gate: **HIGH = radio on**, LOW = off | +| PB1 (pin 6) | out → Teensy | START_SHUTDOWN | tells Teensy to run shutdown code (`BEGIN_TEENSY_SHUTDOWN` on the Teensy) | +| PB2 (pin 7) | in ← Teensy | SHUTDOWN_COMPLETE | Teensy raises this when shutdown is finished | + +**Sequence:** *OFF* → button press turns the FET on (boots Teensy), 3 s debounce → *ON* → +button press asserts START_SHUTDOWN → *SHUTDOWN* (power still on) while the Teensy saves +parameters, then the Teensy asserts SHUTDOWN_COMPLETE → ATtiny drops the FET → *OFF*. The +Teensy polls the request each loop (`Loop.cpp:1499 if (digitalRead(BEGIN_TEENSY_SHUTDOWN)) +ShutdownTeensy()`); `ShutdownTeensy()` (`Loop.cpp:1414`) saves state then +`digitalWrite(SHUTDOWN_COMPLETE,1)`. The CAT **PS** command (`CAT.cpp:670`) invokes the same +graceful shutdown in software. So the firmware **depends** on the ATtiny for orderly power-down +(it is what makes "save settings on power-off" work — see [[persistent-config]], [[main-loop]]). + +## Power & options (from `Config.h`) +- Optional **100 W PA** (`PA100Wactive`) vs barefoot; optional **transverter (XVTR)** path. +- Optional **analog SWR** on Teensy ADC pins 26 (FWD) / 27 (REV) instead of the default + AD7991 digital SWR (`USE_ANALOG_SWR`, `Config.h`). +- Single- vs **dual-VFO** Si5351 hardware (`SI5351_DUAL_VFO_ADDR 0x61`) — see [[rf-board]]. + +## Open questions +- Power rails/current budget and PA bias details (IRF630/L7808/TC4428 on the LPF board). + +_(The PE4312↔MCP23017 mapping, the LPF band-code→relay decode, the U21 upper bits, and the +I²S/MCLK routing have all been traced — see Resolved below and the module pages.)_ + +## Resolved by the schematic ([[t41-ep-schematics]], 2026-06-14/15) +- **I²S routing** — shared clocks MCLK=GPIO23 (`CLK`), LRCLK=GPIO20 (`LRCK`), BCLK=GPIO21 + (`BCK`) to all three converters; `DAUDIO_OUT`=GPIO32 → PCM5102; `ADC_IN` ← PCM1808; SGTL5000 + on the standard audio-shield data pins. See the audio section. +- **RF attenuators** — MCP23017 U21 GPIOA→RX / GPIOB→TX PE4312s, low 6 bits = 0.5 dB-LSB word; + **upper bits GPA6/7, GPB6/7 unused/NC**. Designators are revision-dependent. → [[rf-board-electronics]] +- **LPF band select** — GPIOB[0:3] BCD → U12 CD74HC4514 (Yn = BCD) → ULN2803 → external filter + board: **one dedicated 7-element LPF per band** + NF bypass. → [[filter-board-electronics]] +- **ATtiny85 (U4) = soft-power controller** with a Teensy graceful-shutdown handshake (not an + I²C/sensor device) — see the dedicated section above. +- **One SGTL5000, not two** — RX path is PCM1808 + PCM5102; the code's second "SGTL5000" is a + naming artifact (see discrepancy box above). +- **RA8875 is off-board** — main-board J7 "Display" + J8 "Display Voltage" feed an external + display module, which is why no RA8875 symbol appears. +- **Attenuators = 2× PE4312** digital step attenuators (31.5 dB / 0.5 dB) → the 31.5 in + `Set{RX,TX}Attenuation`. **Dual Si5351** confirmed. → [[rf-board-electronics]] +- **Power/SWR = 2 AD8307 log detectors (U14 fwd, U19 rev) → AD7991 CH0/CH1**, ref = REF3440 on + Vin3/Vref. Net-traced 2026-06-14; the default firmware log conversion is **correct** (no bug + — the linear formula belongs to the unused analog-diode path). → [[filter-board-electronics]] diff --git a/wiki/hardware/i2c-bus-map.md b/wiki/hardware/i2c-bus-map.md new file mode 100644 index 0000000..a7534cb --- /dev/null +++ b/wiki/hardware/i2c-bus-map.md @@ -0,0 +1,61 @@ +--- +title: I²C Bus Map & Addresses +type: hardware +status: stable +created: 2026-06-14 +updated: 2026-06-15 +tags: [hardware, i2c, wire, mcp23017, si5351, ad7991, addresses, bus-topology] +source_refs: [sources/t41-ep-schematics] +related: ["[[hardware-platform]]", "[[rf-board]]", "[[filter-boards]]", "[[front-panel]]", "[[built-in-test]]", "[[hardware-state-machine]]"] +--- + +# I²C Bus Map & Addresses + +The Teensy 4.1 exposes **three independent I²C buses** (`Wire`, `Wire1`, `Wire2`). Phoenix +deliberately spreads its peripherals across all three to isolate timing-critical traffic and +to keep the front-panel bus fast. Addresses are defined in `Config.h:62-72`; bus assignments +are made where each driver calls `begin_I2C(...)`. The three buses are confirmed on the main +board schematic as the net pairs **`SDA/SCL` (Wire), `SDA1/SCL1` (Wire1), `SDA2/SCL2` +(Wire2)** leaving the Teensy ([[t41-ep-schematics]]). + +## Bus topology + +| Bus | Devices | Addr | Purpose | Driver (`begin_I2C`) | +|---|---|---|---|---| +| **Wire** (Wire0, "main") | Si5351 (VFO) | `0x60` | Quadrature LO clock generator | `RFBoard_si5351.cpp:80` (`Wire.begin()`) | +| | Si5351 #2 (dual-VFO HW) | `0x61` | 2nd clock gen on split-VFO boards | `RFBoard_si5351.cpp` | +| | RF-board MCP23017 | `0x27` | RX/TX attenuators + switching | `RFBoard.cpp:88` (default `Wire`) | +| | SGTL5000 (Audio Board) | LOW | The radio's *only* SGTL5000: mic-in + TX-I/Q codec control | `MainBoard_AudioIO.cpp:450` | +| **Wire1** | Front-panel MCP23017 #1 | `0x20` | Encoders / buttons / LEDs | `FrontPanel.cpp:285` | +| | Front-panel MCP23017 #2 | `0x21` | Encoders / buttons / LEDs | `FrontPanel.cpp:290` | +| **Wire2** | BPF-board MCP23017 | `0x24` | Band-pass filter relay bank | `BPFBoard.cpp:29` | +| | LPF-board MCP23017 | `0x25` | Low-pass filter + back-end relays | `LPFBoard.cpp:238` | +| | AD7991 4-ch ADC | `0x28` or `0x29` | SWR / forward & reverse power | `LPFBoard.cpp:747,754` | + +## Why three buses + +- **Wire1 is front-panel-only, run at 400 kHz.** Because the two panel MCP23017s are the + *only* devices on `Wire1`, the driver raises the clock to **400 kHz** (`FrontPanel.cpp:300`) + with no contention. This is central to the `encoder-i2c-speed` work — fast, dedicated bus + + a two-tier ISR/1 ms-timer servicing model keeps encoder reads snappy. See [[front-panel]]. +- **Wire2 carries the RF back-end** (BPF/LPF/AD7991) — band-switching relay writes and + SWR/power reads that happen on tune/T-R changes, kept off the audio-codec/VFO bus. +- **Wire (Wire0) is the "main" bus** shared by the VFO clock gen, the RF-board attenuators, and + both audio codecs. + +## Address quirks +- **AD7991 dual address.** The part ships with one of two fixed addresses depending on the + ordering code, so the driver **probes `0x28` then `0x29`** (`LPFBoard.cpp:747-754`, + `Config.h:70-72`). Not user-configurable. +- **Only one SGTL5000.** There is a single SGTL5000 (Audio Board, addr LOW). The firmware also + declares a `pcm5102_mainBoard` codec object at addr **HIGH** (`MainBoard_AudioIO.cpp:163`), + but **no SGTL5000 is populated there** — the main-board RX/speaker path is PCM1808/PCM5102, + which are control-less I²S parts (not on any I²C bus). Those `setAddress(HIGH)/.enable()` calls + are no-ops. See [[hardware-platform]] (audio) / [[t41-ep-schematics]]. +- **Dual-VFO Si5351.** `SI5351_DUAL_VFO_ADDR 0x61` is only populated on split-VFO hardware + (`HasDualVFOs()`), enabling independent RX/TX clock generation — see [[rf-board]]. + +## Startup presence check +The **built-in test** ([[built-in-test]]) probes the expected I²C devices at boot and flags +any that fail to ACK, surfacing a missing/misaddressed board on the status screen. This bus +map is the reference for what *should* be present on each bus. diff --git a/wiki/hardware/rf-board-electronics.md b/wiki/hardware/rf-board-electronics.md new file mode 100644 index 0000000..3d652ec --- /dev/null +++ b/wiki/hardware/rf-board-electronics.md @@ -0,0 +1,87 @@ +--- +title: RF Board — Electronics (Si5351 LO, PE4312 attenuators, mixer front end) +type: hardware +status: draft +created: 2026-06-16 +updated: 2026-06-16 +tags: [hardware, rf, si5351, pe4312, attenuator, mixer, mcp23017, board-revisions] +source_refs: [sources/t41-ep-schematics] +related: ["[[hardware-platform]]", "[[i2c-bus-map]]", "[[rf-board]]", "[[filter-board-electronics]]", "[[t41-ep-schematics]]"] +--- + +# RF Board — Electronics + +The *physical* RF board: the silicon, part numbers, and schematic-traced wiring that the +[[rf-board]] firmware module (`RFBoard.cpp`) drives. This page owns the **electronics**; the +firmware page owns the **API and algorithms** (quadrature generation, the PLL-only retune +optimization, the unit-test hooks). Confirmed against `T41-RF-board-V012` + daughterboards +([[t41-ep-schematics]]). + +## Local oscillator — Si5351 quadrature VFO +- The **T41_DualClock_Daughter** board carries **2× Si5351A-B-GM** off a shared **25 MHz** + reference (TCXO). On these newer (V12.8-era) boards the two chips provide **independent RX and + TX quadrature LOs** plus a CW carrier — the "three VFOs" the firmware addresses: + + | VFO | Si5351 outputs | PLL | Purpose | + |---|---|---|---| + | **RX** | CLK0 + CLK1 (`CLK0RX`/`CLK90RX`) | PLLA | quadrature LO for RX I/Q | + | **TX** | CLK4 + CLK5 (`CLK0TX`/`CLK90TX`) | PLLB | quadrature LO for SSB TX | + | **CW** | CLK6 (`CLKCW`); CLK2 single-VFO | — | single-output CW carrier | + + RX on **PLLA** and TX on **PLLB** lets the two run at independent frequencies simultaneously + (needed for the dual-VFO TX-spectrum monitor trick). Dual-VFO hardware is selected in firmware + by `SI5351_DUAL_VFO_ADDR 0x61` / `HasDualVFOs()`. + +### Board-revision history ⚠️ +RF board revisions **prior to 12.8** carried a **single** Si5351 with only **one** set of +quadrature VFO outputs. On those boards the single quadrature pair (**CLK0/CLK1**) was +**shared** between the RX and TX mixers — the RX and TX LO could **not** run at independent +frequencies. They still provided the separate **CW carrier on CLK2**. The firmware's +`HasDualVFOs()` fallback (`SetTXVFOFrequency → SetRXVFOFrequency`) exists precisely to +accommodate these single-VFO boards. The dual-Si5351 arrangement above is V12.8-and-later only. + +## Step attenuators — 2× PE4312 +Two **PE4312** 6-bit digital step attenuators (**31.5 dB in 0.5 dB steps**), one per chain, +driven in parallel by the **MCP23017 (U21, 0x27)** ([[i2c-bus-map]]). The **electrical mapping +is revision-independent and matches the (unchanged) firmware**: **GPIOA → RX attenuator**, +**GPIOB → TX attenuator**; the low 6 bits = the attenuation word wired to the PE4312 control +pins: + +| GPIO bit | Weight | PE4312 pin | Ctrl | +|---|---|---|---| +| 0 | 0.5 dB | 20 | C0.5 | +| 1 | 1 dB | 19 | C1 | +| 2 | 2 dB | 17 | C2 | +| 3 | 4 dB | 16 | C4 | +| 4 | 8 dB | 15 | C8 | +| 5 | 16 dB | 1 | C16 | + +(PE4312 pin 18 = GND, hence the gap.) The GPIO value is the **attenuation in dB × 2** — the +firmware writes `round(2·atten_dB) & 0x3F` (`SetAttenuator`, [[rf-board]]). The **upper bits +GPA6/7 and GPB6/7 are unused / not connected** (owner-confirmed 2026-06-15) — each bank carries +only the 6-bit attenuation word. + +### Reference designators differ by board revision +(Wiring/firmware unchanged — a packaging-convenience change. A bare "U3" is ambiguous across +revisions — always state the revision. Owner-clarified 2026-06-14.) + +| Revision | RX atten | TX atten | Packaging | +|---|---|---|---| +| **V12.8** (current; the `raw/` schematic) | **U11** | **U3** | PE4312 on removable daughterboards (chip = `U1` in the daughter sheet; U12 = dual-clock LO daughter) | +| **prior revisions** | **U3** | **U12** | PE4312 placed directly on the RF board | + +## Mixer / RF front end +- **Mixer transformers:** **ADT1-1 / ADT2-1T**. +- **Gain blocks:** **PSA-8A+** and **MAR-3SM+** MMICs. +- **RF switches:** **MASWSS0179** (T/R + cal loopback). +- **I/Q routing:** **74CBTLV3253** analog muxes. + +## I/Q baseband amplifiers +**AD8599, OPA2209, MC33078, LM358B** op-amps buffer/scale the I and Q channels to/from the +main-board converters: **J1 IQ_Out → PCM1808** (RX I/Q in), **J5 IQ_In ← SGTL5000 TX I/Q** +(see [[hardware-platform]] for the converter map). + +## Open questions +- PA bias / supply rails feeding the front-end gain blocks. +- Exact divider-boundary frequencies where the firmware does a full multisynth/phase re-setup + vs. PLL-only retune (a firmware concern — see [[rf-board]]). diff --git a/wiki/index.md b/wiki/index.md new file mode 100644 index 0000000..a18796c --- /dev/null +++ b/wiki/index.md @@ -0,0 +1,108 @@ +--- +title: Phoenix Wiki Index +type: index +status: stub +created: 2026-06-08 +updated: 2026-07-31 +--- + + + + + + +# Phoenix Wiki — Index + +Catalog of every page in the wiki, grouped by category. The LLM updates this on every +ingest. To answer a query, read this first to locate relevant pages, then drill in. + +See [[CLAUDE]] for the maintenance schema and [[log]] for the chronological record. + +## Firmware +_Modules, architecture, state machines, DSP chains, design decisions, code heritage._ + +**Architecture** +- [[overview]] — top-level firmware architecture: layers, execution flow, module map. +- [[state-machine-architecture]] — how the StateSmith-generated SM layer works. +- [[real-time-constraints]] — the ~10 ms loop budget and timing rules. +- [[spectrum-refresh-floor]] — why refresh ≈ NCHUNKS×T_loop; the 11.7→18.8 fps optimization. *(draft)* +- [[rapid-tune-mute-freeze]] — `MUTE_ON_RAPID_TUNE`: mute audio + freeze spectrum on fast tuning; Fine Tune keeps only the blue bar moving. *(draft)* +- [[code-heritage]] — lineage from DD4WH Teensy Convolution SDR; contributor list; GPLv3. + +**Sample rate & filter design** _(V1.4.0)_ +- [[sample-rate-switching]] — 192 / 176.4 ksps selectable at run time and persisted; `ChangeSampleRate()`, the Fs/4 dial compensation, menu + `SR` CAT paths. *(draft)* +- [[runtime-filter-design]] — Hz-specified filters regenerated per rate from recovered analog prototypes; why prewarping is the load-bearing part; the TX decimate-by-2 aliasing fix. *(draft)* +- [[filter-hil-test]] — bench measurement of the above on the real radio; the `|Fs/4 + fineTune|` injection trap and the AGC-off requirement. *(draft)* +- [[tx-filter-hil-test]] — the transmit counterpart: synchronous I/Q capture off the exciter gives passband *and* sideband suppression from one sweep; why the tolerance has to be 2.5 % not 1.5 %. *(draft)* + +**State machines** +- [[mode-state-machine]] — ModeSm: SSB/CW × RX/TX, iambic keyer, calibration entry (generated). *(draft)* +- [[digital-mode]] — DIGITAL (USB audio) mode for FT8/WSJT-X: DIGITAL_STATES composite, forced 176.4 ksps, 4:1 USB pacer. RX and TX verified on the bench. *(draft)* +- [[ui-state-machine]] — UISm: splash→home→menu stack + tool screens (DFE/EQ/BIT/cal) (generated). *(draft)* +- [[tune-frequency-control]] — Tune.cpp: frequency math (Fs/4 shift, fine tune, CW offset) + PA power-cal math. Not a state machine. *(draft)* +- [[hardware-state-machine]] — HardwareSm (hand-written) maps mode→RF/tune hardware; drives 4 cal sub-machines. *(draft)* +- [[calibration-state-machines]] — the 4 generated cal SMs: 3 identical minimize-sweeps + PowerCalSm curve-fit. *(draft)* +- [[built-in-test]] — startup I²C presence self-test (BIT struct → status screen). *(draft)* + +**Hardware-abstraction modules** _(the code; physical electronics live under Hardware below)_ +- [[rf-board]] — `RFBoard.cpp` API: Si5351 3-VFO quadrature LO (phase-reg vs <3.2 MHz timed-delay), attenuators, T/R, cal loopback → electronics in [[rf-board-electronics]]. *(draft)* +- [[filter-boards]] — `BPFBoard`/`LPFBoard` API: BPF + LPF/RF-back-end relays via shared hardwareRegister; AD7991 SWR/power math → electronics in [[filter-board-electronics]]. *(draft)* +- [[front-panel]] — 2×MCP23017 encoders/buttons/LEDs; two-tier ISR+1ms-timer I²C servicing (encoder-i2c-speed branch). *(draft)* + +**Signal processing & UI** +- [[dsp-chain]] — DSP.cpp/FFT/FIR/Noise/CW on OpenAudio; the Convolution-SDR core. +- [[audio-io]] — MainBoard_AudioIO: OpenAudio quad-I²S graph, mode-based mixer routing, RX/TX/mic/speaker queues, sidetone. *(draft)* +- [[cw-processing]] — CW audio filter + adaptive Morse decoder (Goertzel + timing histograms + Morse tree). *(draft)* +- [[display-subsystem]] — RA8875 dirty-flag pane model (13 home panes), DrawDisplay router on UISm state. *(draft)* + +**Control flow & config** +- [[main-loop]] — Loop.cpp: `loop()` sequence + interrupt FIFO + CW key/PTT handling. +- [[cat-control]] — CAT.cpp: Kenwood (TS-480) emulation, **29**-command dispatch table on SerialUSB1; custom ED/PR dumps + SR/CF/EQ/FL DSP settings; the `MD` sideband-mirroring fix. *(draft)* +- [[persistent-config]] — the `ED` struct (single source of truth) → JSON on LittleFS+SD; Config.h/Globals/ParamSave. *(draft)* + +## Theory +_DSP/SDR concepts, calibration, domain "why it works". Constructed from code + DSP +fundamentals (no copy of the Purdum & Peter book). Code claims cited `file:line`._ + +- [[theory-overview]] — the DSP/SDR theory spine; signal path end to end, key numbers. +- [[iq-quadrature-sampling]] — complex baseband; sign-of-frequency; image problem. *(draft)* +- [[ssb-phasing-method]] — SSB by phasing: ±45° Hilbert TX pair + freq-domain RX. *(draft)* +- [[fast-convolution-filtering]] — FFT overlap-save channel filter; the Convolution-SDR core. *(draft)* +- [[multirate-decimation]] — ÷8 RX / ÷16 TX polyphase rate changes; tap-count tradeoff; Hz-specified vs Fs-fraction stages. *(draft)* +- [[iq-imbalance-correction]] — per-band amp/phase correction & 3-pass calibration sweep. *(draft)* +- [[agc-design]] — wdsp look-ahead AGC: ring-buffer attack, hang state machine. *(draft)* +- [[noise-reduction]] — Kim / MMSE-spectral / LMS-notch NR. *(draft)* +- [[synchronous-am-detection]] — SAM: PLL carrier recovery for fade-robust AM. *(draft)* +- [[audio-equalizer]] — 14-band parallel filterbank (RX + TX audio); centre-frequency table; cells generated per rate. *(draft)* +- [[tx-carrier-null]] — LO-leakage suppression via per-band DC offset (distinct from image). *(draft)* +- [[zoom-fft]] — spectrum-display zoom via IIR decimation (raw 192 kHz → 375 Hz base bin; rate-dependent). *(draft)* + +## Hardware +_The physical T41-EP platform the firmware drives: boards, chips, buses, power. Distinct from +the firmware/ module pages (which describe the code). Derived from `Config.h` + board drivers._ + +- [[hardware-platform]] — T41-EP platform overview: Teensy 4.1, board stack, single-SGTL5000 + + PCM1808/PCM5102 audio, RF chain, power/PA/XVTR options. *(stable)* +- [[i2c-bus-map]] — the three I²C buses (Wire/Wire1/Wire2), every device + address, and why + the front panel gets its own 400 kHz bus. *(stable)* +- [[rf-board-electronics]] — RF board silicon: dual/single Si5351 LO + revisions, PE4312 + attenuators (GPIO-bit→pin table, designators), ADT/PSA/MAR mixer front end, I/Q amps. *(draft)* +- [[filter-board-electronics]] — BPF/LPF/PA back-end chips: MASWSS switches, CD74HC4514/74HC237 + decoders + ULN2803/HF41F relays, external per-band LPF board, AD8307/AD7991 SWR sensing. *(draft)* + +## Roadmap +_Plans for future development, proposals, open questions._ + +- [[documentation-todos]] — running list of wiki pages to write + code/comment discrepancies + and possible bugs found while documenting (incl. a ⚠ possible NR channel-routing bug). +- [[development-backlog]] — software-dev tasks mirroring the open GitHub issues (index). + - [[transmit-spectrum]] (#10) — see the TX spectrum; largely built, needs verify. + - [[manual-notch]] (#11) — 3-way notch (off/auto/manual); manual mode is new work. + - [[usb-audio]] (#13) — bi-directional USB audio; **implemented and bench-verified** as [[digital-mode]]. *(superseded)* + - [[openaudio-library]] (#14) — change OpenAudio for audio quality; foundational. + +## Sources +_One summary page per ingested raw source._ + +- [[t41-ep-schematics]] — the seven KiCad board schematics (main/RF/attenuator/dual-clock/BPF/ + LPF-control/LPF-filter); the first physical-hardware source. *(draft)* diff --git a/wiki/llm-wiki.md b/wiki/llm-wiki.md new file mode 100644 index 0000000..6b0cef3 --- /dev/null +++ b/wiki/llm-wiki.md @@ -0,0 +1,75 @@ +# LLM Wiki + +A pattern for building personal knowledge bases using LLMs. + +This is an idea file, it is designed to be copy pasted to your own LLM Agent (e.g. OpenAI Codex, Claude Code, OpenCode / Pi, or etc.). Its goal is to communicate the high level idea, but your agent will build out the specifics in collaboration with you. + +## The core idea + +Most people's experience with LLMs and documents looks like RAG: you upload a collection of files, the LLM retrieves relevant chunks at query time, and generates an answer. This works, but the LLM is rediscovering knowledge from scratch on every question. There's no accumulation. Ask a subtle question that requires synthesizing five documents, and the LLM has to find and piece together the relevant fragments every time. Nothing is built up. NotebookLM, ChatGPT file uploads, and most RAG systems work this way. + +The idea here is different. Instead of just retrieving from raw documents at query time, the LLM **incrementally builds and maintains a persistent wiki** — a structured, interlinked collection of markdown files that sits between you and the raw sources. When you add a new source, the LLM doesn't just index it for later retrieval. It reads it, extracts the key information, and integrates it into the existing wiki — updating entity pages, revising topic summaries, noting where new data contradicts old claims, strengthening or challenging the evolving synthesis. The knowledge is compiled once and then *kept current*, not re-derived on every query. + +This is the key difference: **the wiki is a persistent, compounding artifact.** The cross-references are already there. The contradictions have already been flagged. The synthesis already reflects everything you've read. The wiki keeps getting richer with every source you add and every question you ask. + +You never (or rarely) write the wiki yourself — the LLM writes and maintains all of it. You're in charge of sourcing, exploration, and asking the right questions. The LLM does all the grunt work — the summarizing, cross-referencing, filing, and bookkeeping that makes a knowledge base actually useful over time. In practice, I have the LLM agent open on one side and Obsidian open on the other. The LLM makes edits based on our conversation, and I browse the results in real time — following links, checking the graph view, reading the updated pages. Obsidian is the IDE; the LLM is the programmer; the wiki is the codebase. + +This can apply to a lot of different contexts. A few examples: + +- **Personal**: tracking your own goals, health, psychology, self-improvement — filing journal entries, articles, podcast notes, and building up a structured picture of yourself over time. +- **Research**: going deep on a topic over weeks or months — reading papers, articles, reports, and incrementally building a comprehensive wiki with an evolving thesis. +- **Reading a book**: filing each chapter as you go, building out pages for characters, themes, plot threads, and how they connect. By the end you have a rich companion wiki. Think of fan wikis like [Tolkien Gateway](https://tolkiengateway.net/wiki/Main_Page) — thousands of interlinked pages covering characters, places, events, languages, built by a community of volunteers over years. You could build something like that personally as you read, with the LLM doing all the cross-referencing and maintenance. +- **Business/team**: an internal wiki maintained by LLMs, fed by Slack threads, meeting transcripts, project documents, customer calls. Possibly with humans in the loop reviewing updates. The wiki stays current because the LLM does the maintenance that no one on the team wants to do. +- **Competitive analysis, due diligence, trip planning, course notes, hobby deep-dives** — anything where you're accumulating knowledge over time and want it organized rather than scattered. + +## Architecture + +There are three layers: + +**Raw sources** — your curated collection of source documents. Articles, papers, images, data files. These are immutable — the LLM reads from them but never modifies them. This is your source of truth. + +**The wiki** — a directory of LLM-generated markdown files. Summaries, entity pages, concept pages, comparisons, an overview, a synthesis. The LLM owns this layer entirely. It creates pages, updates them when new sources arrive, maintains cross-references, and keeps everything consistent. You read it; the LLM writes it. + +**The schema** — a document (e.g. CLAUDE.md for Claude Code or AGENTS.md for Codex) that tells the LLM how the wiki is structured, what the conventions are, and what workflows to follow when ingesting sources, answering questions, or maintaining the wiki. This is the key configuration file — it's what makes the LLM a disciplined wiki maintainer rather than a generic chatbot. You and the LLM co-evolve this over time as you figure out what works for your domain. + +## Operations + +**Ingest.** You drop a new source into the raw collection and tell the LLM to process it. An example flow: the LLM reads the source, discusses key takeaways with you, writes a summary page in the wiki, updates the index, updates relevant entity and concept pages across the wiki, and appends an entry to the log. A single source might touch 10-15 wiki pages. Personally I prefer to ingest sources one at a time and stay involved — I read the summaries, check the updates, and guide the LLM on what to emphasize. But you could also batch-ingest many sources at once with less supervision. It's up to you to develop the workflow that fits your style and document it in the schema for future sessions. + +**Query.** You ask questions against the wiki. The LLM searches for relevant pages, reads them, and synthesizes an answer with citations. Answers can take different forms depending on the question — a markdown page, a comparison table, a slide deck (Marp), a chart (matplotlib), a canvas. The important insight: **good answers can be filed back into the wiki as new pages.** A comparison you asked for, an analysis, a connection you discovered — these are valuable and shouldn't disappear into chat history. This way your explorations compound in the knowledge base just like ingested sources do. + +**Lint.** Periodically, ask the LLM to health-check the wiki. Look for: contradictions between pages, stale claims that newer sources have superseded, orphan pages with no inbound links, important concepts mentioned but lacking their own page, missing cross-references, data gaps that could be filled with a web search. The LLM is good at suggesting new questions to investigate and new sources to look for. This keeps the wiki healthy as it grows. + +## Indexing and logging + +Two special files help the LLM (and you) navigate the wiki as it grows. They serve different purposes: + +**index.md** is content-oriented. It's a catalog of everything in the wiki — each page listed with a link, a one-line summary, and optionally metadata like date or source count. Organized by category (entities, concepts, sources, etc.). The LLM updates it on every ingest. When answering a query, the LLM reads the index first to find relevant pages, then drills into them. This works surprisingly well at moderate scale (~100 sources, ~hundreds of pages) and avoids the need for embedding-based RAG infrastructure. + +**log.md** is chronological. It's an append-only record of what happened and when — ingests, queries, lint passes. A useful tip: if each entry starts with a consistent prefix (e.g. `## [2026-04-02] ingest | Article Title`), the log becomes parseable with simple unix tools — `grep "^## \[" log.md | tail -5` gives you the last 5 entries. The log gives you a timeline of the wiki's evolution and helps the LLM understand what's been done recently. + +## Optional: CLI tools + +At some point you may want to build small tools that help the LLM operate on the wiki more efficiently. A search engine over the wiki pages is the most obvious one — at small scale the index file is enough, but as the wiki grows you want proper search. [qmd](https://github.com/tobi/qmd) is a good option: it's a local search engine for markdown files with hybrid BM25/vector search and LLM re-ranking, all on-device. It has both a CLI (so the LLM can shell out to it) and an MCP server (so the LLM can use it as a native tool). You could also build something simpler yourself — the LLM can help you vibe-code a naive search script as the need arises. + +## Tips and tricks + +- **Obsidian Web Clipper** is a browser extension that converts web articles to markdown. Very useful for quickly getting sources into your raw collection. +- **Download images locally.** In Obsidian Settings → Files and links, set "Attachment folder path" to a fixed directory (e.g. `raw/assets/`). Then in Settings → Hotkeys, search for "Download" to find "Download attachments for current file" and bind it to a hotkey (e.g. Ctrl+Shift+D). After clipping an article, hit the hotkey and all images get downloaded to local disk. This is optional but useful — it lets the LLM view and reference images directly instead of relying on URLs that may break. Note that LLMs can't natively read markdown with inline images in one pass — the workaround is to have the LLM read the text first, then view some or all of the referenced images separately to gain additional context. It's a bit clunky but works well enough. +- **Obsidian's graph view** is the best way to see the shape of your wiki — what's connected to what, which pages are hubs, which are orphans. +- **Marp** is a markdown-based slide deck format. Obsidian has a plugin for it. Useful for generating presentations directly from wiki content. +- **Dataview** is an Obsidian plugin that runs queries over page frontmatter. If your LLM adds YAML frontmatter to wiki pages (tags, dates, source counts), Dataview can generate dynamic tables and lists. +- The wiki is just a git repo of markdown files. You get version history, branching, and collaboration for free. + +## Why this works + +The tedious part of maintaining a knowledge base is not the reading or the thinking — it's the bookkeeping. Updating cross-references, keeping summaries current, noting when new data contradicts old claims, maintaining consistency across dozens of pages. Humans abandon wikis because the maintenance burden grows faster than the value. LLMs don't get bored, don't forget to update a cross-reference, and can touch 15 files in one pass. The wiki stays maintained because the cost of maintenance is near zero. + +The human's job is to curate sources, direct the analysis, ask good questions, and think about what it all means. The LLM's job is everything else. + +The idea is related in spirit to Vannevar Bush's Memex (1945) — a personal, curated knowledge store with associative trails between documents. Bush's vision was closer to this than to what the web became: private, actively curated, with the connections between documents as valuable as the documents themselves. The part he couldn't solve was who does the maintenance. The LLM handles that. + + +## Note + +This document is intentionally abstract. It describes the idea, not a specific implementation. The exact directory structure, the schema conventions, the page formats, the tooling — all of that will depend on your domain, your preferences, and your LLM of choice. Everything mentioned above is optional and modular — pick what's useful, ignore what isn't. For example: your sources might be text-only, so you don't need image handling at all. Your wiki might be small enough that the index file is all you need, no search engine required. You might not care about slide decks and just want markdown pages. You might want a completely different set of output formats. The right way to use this is to share it with your LLM agent and work together to instantiate a version that fits your needs. The document's only job is to communicate the pattern. Your LLM can figure out the rest. diff --git a/wiki/log.md b/wiki/log.md new file mode 100644 index 0000000..ae1a20c --- /dev/null +++ b/wiki/log.md @@ -0,0 +1,1104 @@ +# Phoenix Wiki — Log + +Append-only chronological record. Each entry: `## [YYYY-MM-DD] | ` +where `` ∈ `ingest | query | lint | decision`. + +Last 5 entries: `grep "^## \[" log.md | tail -5` + +## [2026-06-08] decision | Wiki initialized +Created the Phoenix wiki skeleton (schema, index, log, and empty category folders: +firmware/, theory/, roadmap/, sources/, raw/). No sources ingested yet — schema-first +setup per the LLM Wiki pattern. Categories chosen: firmware, theory, roadmap. + +## [2026-06-08] decision | Seeded firmware architecture map +Built out the firmware/ category from a survey of code/src/PhoenixSketch/ (source tree + +the PhoenixSketch.ino architecture header, Loop.h, SDT.h struct list, Contributors.txt). +Created 14 pages: +- overview (draft) — layered architecture, execution flow, full module map, SM table. +- code-heritage (draft) — DD4WH Teensy Convolution SDR lineage, 13-person contributor list, + GPLv3. +- main-loop (draft) — loop() sequence, the 16-slot InterruptType FIFO, CW key/PTT plumbing. +- state-machine-architecture, real-time-constraints (concept stubs). +- Module stubs: mode/ui/tune/hardware state machines, rf-board, filter-boards, dsp-chain, + display-subsystem, front-panel, cat-control, persistent-config. +All cross-linked; index.md firmware section populated. Discovered the real architecture is +much richer than CLAUDE.md states: 7 StateSmith machines (not 3), board-abstraction layer +(RF/BPF/LPF/Main), large display subsystem, AD7991 power sensing. Linked the existing +[[spectrum-refresh-floor]] memory finding into real-time-constraints + dsp-chain. +Stubs carry explicit "To flesh out" checklists; theory pages (ssb-generation, +fft-convolution-filtering, agc-design, noise-reduction-algorithms) referenced but not yet +written. No raw source ingested — this is a code-survey seeding, not an ingest. + +## [2026-06-08] decision | Seeded DSP/SDR theory spine +Built the theory/ category from a code survey of DSP.cpp, DSP_FFT.cpp, and the SDT.h filter +structs. Confirmed and grounded (with file:line citations) the radio's defining DSP choices: +- I/O at 192 kHz, 2048-sample blocks; RX decimates ÷8 → 24 kHz, TX ÷16 → 12 kHz. +- SSB by the **phasing method**: TX uses a ±45° 100-tap Hilbert FIR pair + (FIR_Hilbert_coeffs_45/_neg_45, DSP_FFT.cpp:851) + 1-line SidebandSelection sign flip; RX + does sideband selection in the **frequency-domain convolution mask**, so Demodulate() just + copies the real part for USB/LSB (DSP.cpp:629). NOT Weaver, NOT filter method. +- Channel filter = **FFT overlap-save fast convolution** (ConvolutionFilter, DSP_FFT.cpp:685; + m_NumTaps = FFT_LENGTH/2+1 = 257) — the "Convolution SDR" namesake. Captured the + static-DMAMEM cold-boot NaN hazard in the overlap buffers. +- Three NR algorithms (Kim / spectral / LMS-Xanr); wdsp-derived AGC (tau_attack 1ms / decay 250ms). +Created 9 pages: theory/overview + draft pages iq-quadrature-sampling, ssb-phasing-method, +fast-convolution-filtering; stubs multirate-decimation, iq-imbalance-correction, agc-design, +noise-reduction, zoom-fft. Convention adopted: code facts cited file:line, general DSP marked +"(general DSP)". Updated firmware/dsp-chain related-theory links and index.md theory section. +Established for the record: no electronic copy of the Purdum & Peter T41 book exists for this +project — theory is reconstructed from code + DSP fundamentals, not sourced from the book. + +## [2026-06-08] decision | Promoted 3 theory stubs to drafts (IQ cal, multirate, NR) +Took iq-imbalance-correction, multirate-decimation, noise-reduction from stub → draft by +reading the implementations: +- IQ imbalance: ApplyIQCorrection (DSP.cpp:206) is a simplified single-axis model — scale I + only, then IQPhaseCorrection (DSP.cpp:186) cross-mixes a fraction of one channel into the + other (small-angle shear). Per-band factors in ED (SDT.h:302-305). Calibration + (HardwareSm_ReceiveIQCalibration.cpp) injects a CW tone, measures sideband separation + = psdnew[384]-psdnew[128], and runs a 3-pass coarse/medium/fine coordinate sweep + (amp on even iters, phase on odd), re-centering each pass on the prior optimum. Added IRR + vs amp/phase-error table. Carrier-null flagged as a distinct problem. +- Multirate: InitializeDecimationFilter (DSP_FIR.cpp:1284) sizes taps by the harris formula + N≈A_stop/(22·Δf). Added worked single-÷8 (~132 taps) vs two-stage (~27+~33 taps) cost + comparison showing why staging wins. Noted TX uses fixed 48-tap coeff sets while RX + designs taps at runtime. +- NR: three families — Kim1_NR (256-pt FFT spectral subtraction, Hann, VAD-limited bins, + ×30 post-scale), SpectralNoiseReduction (decision-directed MMSE / Ephraim-Malah; code + cites Romanin 2009, Schmitt 2002, Gerkmann-Hendriks 2002), and Xanr (64-tap leaky-NLMS ALE + that is both NR and auto-notch via prediction-vs-residual). Tied the NaN-latch / DMAMEM + cold-boot robustness back to [[fast-convolution-filtering]]. +Each page logs open questions (e.g. the "48 kHz" tone-offset comment vs the 6 kHz bins; the +DSP.cpp:687 Q→I 2× scale; NR sample-rate comment discrepancy). agc-design and zoom-fft remain +stubs. Updated index.md status markers. + +## [2026-06-08] decision | Added roadmap/documentation-todos +Created roadmap/documentation-todos.md as the central planning surface for doc gaps and +code/comment discrepancies found while writing the wiki. Seeded it with the open questions +from the three theory drafts, the firmware/theory stub backlog, and pages-referenced-but-not- +written. Flagged one ⚠ possible bug: DSP.cpp:687 `arm_scale_f32(data->Q, 2, data->I, …)` after +the LMS NR call may be a Q/I channel mix-up. Linked from index.md roadmap section. + +## [2026-06-08] decision | Completed theory spine (agc-design, zoom-fft drafts) +Promoted the last two theory stubs to drafts: +- agc-design: confirmed it's the wdsp (NR0V) look-ahead AGC ported via DD4WH — variable names + match exactly. Documented the ring-buffer delay-line that lets attack clamp peaks with zero + overshoot, complex-envelope magnitude (pmode=1), fast/hang/normal-decay state machine + (DSP.cpp:368+), pop_ratio transient handling, and the 5 user modes (Off/Long/Slow/Med/Fast) + with their hangtime/tau_decay (DSP.cpp:243-270). max_gain from per-band AGC_thresh. +- zoom-fft: corrected the earlier stub's error — the band-spectrum zoom FFT (ZoomFFTExe → + psdnew) runs on the RAW 192 kHz I/Q, not the 24 kHz baseband; base bin width is 375 Hz, not + 46.875 Hz (that's the separate audio-passband FFT in ConvolutionFilter). Documented the + IIR-biquad-then-decimate path (IIR chosen because phase doesn't matter for a magnitude PSD), + zoomMultiplierCoeff amplitude compensation, and the ring-buffer accumulation for zoom>=8 that + slows effective refresh — tying back to [[spectrum-refresh-floor]]. +All 9 theory spine pages are now drafts. Added new discrepancies to roadmap/documentation-todos: +Config.h ZOOM 3 vs ED.spectrum_zoom=1 default; AGC soft-knee curve; n_tau vs MAX_N_TAU. + +## [2026-06-08] decision | Investigated suspected NR bug (DSP.cpp:687) — false alarm, fixed wiki errors +Ran down the ⚠ possible bug flagged in roadmap/documentation-todos: the +`arm_scale_f32(data->Q, 2, data->I, …)` after the LMS NR call. VERDICT: not a bug. +- Xanr (DSP_Noise.cpp:302) reads data->I, writes its result to data->Q, never modifies I. +- Downstream InterpolateReceiveData (DSP.cpp:700) reads data->I as source. +- So line 687 correctly propagates the denoised Q back into I (with a 2× makeup gain, cf the + ×30 for Kim). The commented-out `//arm_scale_f32(data->I,1.5,data->I,…)` is the abandoned + buggy in-place variant. The notch block (DSP.cpp:930-933) uses the same Xanr→copy(Q,I) + pattern. Downgraded to a clarity nit (document the "Xanr outputs to Q" gotcha). +Investigation also exposed errors in MY earlier theory drafts, now fixed: +- Real RX order is ConvolutionFilter → AGC → Demodulate → BandEQ → NoiseReduction + (DSP.cpp:911-927). I had written "NR runs before AGC" in agc-design and noise-reduction — + WRONG. AGC actually runs BEFORE demodulation, on the complex SSB-filtered baseband, using + sqrt(I²+Q²) envelope; NR runs AFTER demod+EQ on the audio. Corrected both pages + the + dsp-chain RX sketch (which was also mis-ordered). +- Resolved two open questions in noise-reduction: the Q→I scale (not a typo) and auto-notch + location (Xanr(&data,1) at DSP.cpp:930, gated by ED.ANR_notchOn). Marked resolved in roadmap. +Lesson: verify chain ORDER against ReceiveProcessing directly, not the DSP.h header doc +(whose summary listing "AGC → filter → demodulate → noise reduction" is itself loosely +ordered). + +## [2026-06-08] decision | Promoted mode-state-machine to full draft +Read ModeSm.h (state/event enums), Mode.cpp (actions/guards), and the dispatch sites + keyer +handling in Loop.cpp to document ModeSm accurately. Key facts: +- 20 states under ROOT split into NORMAL_STATES (SSB RX/TX, CW_RECEIVE, straight-key + MARK/SPACE, iambic DIT_MARK/DAH_MARK/KEYER_SPACE/KEYER_WAIT) and CALIBRATION_STATES + (frequency, offset MARK/SPACE, power MARK/SPACE, RX_IQ, TX_IQ MARK/SPACE). 16 events. +- Keyer timing: DO event from the 1 ms TimerInterrupt (Loop.cpp:355) increments + markCount/spaceCount; dit=ditDuration_ms, dah=3×, inter-element space=1×; + ditDuration_ms = 1200/WPM (Globals.cpp:131). Standard PARIS timing. +- Iambic paddle memory implemented in Loop.cpp:914-947 by PrependInterrupt-ing a paddle press + to the FIFO head during an active element; keyerFlip swaps dit/dah. +- TX guarded by IsTxAllowed() = HAM_BAND only (Mode.cpp:39). Buttons locked out during TX + (Loop.cpp:395-403). Mode changes run UpdateHardwareState → RF + audio reconfigure. +Found a stale-source-comment discrepancy: PhoenixSketch.ino lists ModeSm states as +"...CW_TRANSMIT, TUNE" — there is no TUNE state and CW transmit is six sub-states. Logged to +roadmap/documentation-todos. Located the StateSmith source diagrams (ModeSm.drawio et al.). +First firmware state-machine stub fully promoted; ui/tune/hardware SM stubs remain. + +## [2026-06-08] decision | Retired "tune-state-machine" myth → tune-frequency-control +Reading Tune.cpp/Tune.h revealed there is NO TuneSm state machine: Tune.cpp is a pure-function +library (frequency math + PA power-cal math). The TuneReceive/TuneSSBTX/TuneCWTX "states" the +CLAUDE.md/.ino describe actually live in HardwareSm.cpp as a TuneState enum dispatched by +HandleTuneState(). Renamed the stub firmware/tune-state-machine.md → tune-frequency-control.md +and rewrote it as a module page: +- Two-stage tuning: hardware Si5351 VFO = coarse band-center; digital software mixer = fine + tune; effective freq = centerFreq − fineTune − Fs/4 (GetTXRXFreq, Tune.cpp:121). Documented + the −Fs/4 quarter-shift rationale (dodge the DC hole / 1-f / LO leakage; cheapest mix). +- Functions: GetTXRXFreq(_dHz), GetCWTXFreq_dHz (LSB−/USB+ tone offset), ResetTuning, GetBand; + deci-Hertz units for Si5351 resolution. AdjustFineTune limits (zoom window, band edge) + + FAST_TUNE acceleration (4 quick steps → 1000 Hz step). +- HandleTuneState (HardwareSm.cpp:639) is the real per-mode VFO dispatcher: sets PA/LPF/BPF/ + antenna/FIR mask then programs the VFO; SSB-TX dual-VFO sets RX to freq/3 to watch the 3rd + harmonic for the TX spectrum display. +- PA power-cal math (also in Tune.cpp): tanh model Pout=Psat·tanh(k·10^(−A/10)), + attenToPower/powerToAtten, CalculateCWAttenuation/CalculateSSBTXGain, Gauss-Newton + fitTanhModel/FitPowerCurve — backs PowerCalSm. +Updated ALL inbound links (overview, state-machine-architecture, rf-board, filter-boards, +mode-state-machine, index) — overview SM table now correctly says SEVEN generated machines, no +TuneSm. Logged the TuneSm myth to roadmap stale-source-comments. Verified no dangling +[[tune-state-machine]] links remain. + +## [2026-06-08] decision | Promoted hardware-state-machine to draft; corrected SM count +Read HardwareSm.h/.cpp + the 4 cal partials. Two structural corrections to the wiki: +- HardwareSm is HAND-WRITTEN, not StateSmith-generated (no HardwareSm.drawio, no banner). + Only SIX machines are generated: ModeSm, UISm, PowerCalSm, ReceiveIQCalSm, + TransmitCarrierCalSm, TransmitIQCalSm. Fixed the overview SM table ("6 generated + 1 + hand-written coordinator") and state-machine-architecture accordingly. +- HardwareSm is the mode→hardware bridge built on two hand-coded enums: + RFHardwareState (RFReceive/RFTransmit/RFCWMark/RFCWSpace/RFCalReceiveIQ/RFCalTransmitIQ[ + SingleVFO]) and TuneState. UpdateRFHardwareState (HardwareSm.cpp:531) maps modeSM.state_id + → RF state (many-to-one) then HandleRFHardwareStateChange does relay/path switching w/ + ~6 ms settling; UpdateTuneState → HandleTuneState programs PA/LPF/BPF/antenna/FIR + VFO. + CW QSK uses the RFCWMark/RFCWSpace pair to avoid full T/R cycling; calibration reuses the + normal TX/RX hardware states. previousRadioState guard + ForceUpdateRFHardwareState. +- Calibration orchestration: 4 hand-written partials each wrap a generated sub-SM, dispatching + events (PowerCalSm_EventId_AUTO/NEXT_POINT/RECORD_DATA_POINT…) and bridging results into ED. + Power-cal fits the tanh PA model (Tune.cpp); IQ uses the sideband-sep sweep. +Single funnel: UpdateRFHardwareState called from Mode.cpp:24 (every ModeSm entry) + Loop.cpp +on freq/band/mode changes. Logged the "HardwareSm is generated" myth to roadmap. Firmware SM +pages now all drafts except ui-state-machine. + +## [2026-06-08] decision | Promoted ui-state-machine to draft (SM set complete) +Read UISm.h + the UISm.cpp dispatch/transitions + Loop.cpp dispatch sites. UISm = 13-state +screen/menu navigator (generated, UISm.drawio): +- SPLASH →[DO, splashCount≥splashDuration]→ HOME. +- Menu drill-down stack: HOME →MENU→ MAIN_MENU →SELECT→ SECONDARY_MENU →SELECT→ UPDATE + →SELECT→ HOME; HOME event pops to HOME from any level. +- Tool screens hanging off HOME (leaf, return on HOME): FREQ_ENTRY, EQUALIZER, BIT, and the 4 + CALIBRATE_* screens. +- Events DO/MENU/SELECT/HOME/DFE/EQUALIZER/BIT/CALIBRATE_* all from Loop.cpp; button routing + is state-aware (HandleButtonPress switches on uiSM.state_id) and locked out during TX. +- CALIBRATE_* is dual-dispatched to UISm (screen) AND ModeSm (hardware) — the sibling SMs. +Resolved the display-subsystem "what is DFE?" question: DFE = Direct Frequency Entry +(FREQ_ENTRY state, MainBoard_DisplayDFE). Updated display-subsystem + index + roadmap. +All 7 firmware state-machine pages (Mode, UI, Hardware coordinator, + the architecture/tune +pages) are now drafts; remaining firmware stubs are the board/IO modules (rf-board, +filter-boards, front-panel, cat-control, persistent-config, display-subsystem) and the 4 +generated cal sub-SM internal state maps. + +## [2026-06-08] decision | Promoted rf-board to draft (Si5351 quadrature VFO) +Read RFBoard.h (API) + RFBoard.cpp/RFBoard_si5351.cpp (impl). Documented the RF hardware- +abstraction layer: +- Three VFOs on one Si5351: RX = CLK0/CLK1 on PLLA, TX = CLK4/CLK5 on PLLB (independent freqs), + CW = CLK6 (or CLK2 single-VFO). Single-VFO boards fall back SetTXVFO→SetRXVFO. +- Quadrature 90° generation, two regimes (SetRXVFOFrequency, RFBoard.cpp:483): ≥3.2 MHz uses + the phase-offset register = multisynth divider ("multiple") for a digital 90° delay; <3.2 MHz + uses the TJ-Labs timed-delay trick (set clocks 4 Hz low, wait ~58.5 ms = quarter beat, cli/sei + for timing). EvenDivisor forces even dividers; PLL-only retune within a multiple range + minimizes I2C per encoder step. +- Attenuators (TX/RX, 0-31.5 dB / 0.5 dB via MCP23017 I2C), VFO drive/enable, T/R relays, + SSB/CW modulation routing, CW keying (CWon/CWoff), and EnableCalFeedback loopback for IQ cal. +- Frequency correction (ppb) from freq calibration. +Found a units discrepancy: RFBoard.h docstrings say VFO freq is "decihertz (Hz×10)" but the +real unit is Hz×100 (centi-Hz) per RFBoard.cpp:481 + SI5351_FREQ_MULT=100 + HandleTuneState +*100; the _dHz suffix is itself a centi-/deci- misnomer. Logged to roadmap units section. +Updated index/roadmap. Remaining firmware module stubs: filter-boards, front-panel, cat-control, +persistent-config, display-subsystem panes. + +## [2026-06-08] decision | Promoted filter-boards to draft (BPF/LPF/back-end + SWR) +Read BPFBoard.h, LPFBoard.h, LPFBoard_AD7991.h + the SWR math in LPFBoard.cpp. Key findings: +- The "LPF board" is really the RF BACK-END: LPF harmonic suppression + BPF path routing + + transverter (XVTR) + 100W PA select + antenna matrix (0-3) + SWR/power metering. BPF board + is just RX front-end selectivity. +- Documented the shared 64-bit `hardwareRegister` model (Globals.cpp:112, bit map SDT.h:69-83): + all three RF boards write bitfields into one register, flushed to MCP23017 GPIO expanders via + buffer_add()/UpdateMCPRegisters(). This is a cross-cutting architectural detail. +- BPF band→relay uses a byte-swap encoding (BPF_WORD macro, full table in BPFBoard.h); bands + 0-10 + 15=BYPASS. LPF uses BandToBCD (4-bit BCD), bands 0-10. +- SWR/power (PerformSWRBridgeReading): AD7991 CH0=fwd/CH1=refl (4.096V ref) or analog pins + 26/27. Math: counts→V, P=(V·10)²/50 (20 dB coupler), |Γ|=√(Pr/Pf), SWR=(1+|Γ|)/(1−|Γ|), with + guard rails. Feeds the display meter + PowerCalSm. +Open Qs logged: full LPF band↔BCD table, coupler 20 dB assumption / per-band power cal, and the +AD7991 REGISTER_SETUP channel-nibble=0 vs the CH0+CH1 comment. Updated index/roadmap. +Remaining firmware module stubs: front-panel, cat-control, persistent-config, display panes. + +## [2026-06-08] decision | Promoted front-panel to draft (documents encoder-i2c-speed design) +Read FrontPanel.h/.cpp + FrontPanel_Rotary.h. Front panel = 2×MCP23017 on Wire1: mcp1 = 16 +button switches, mcp2 = 6 switches + 4 rotary encoders + 2 LEDs. Encoders are Rotary_V12 (Ben +Buxton state machine adapted for MCP23017, per-encoder reversal, BOURN A/B-swap flag) → emit +iVOLUME/iFILTER/iCENTERTUNE/iFINETUNE ± events; buttons → iBUTTON_PRESSED + GetButton(). +Documented the encoder-i2c-speed two-tier design (commit 6977fa7): +- GPIO ISR (fpInterrupt1/2ISR) sets a flag only — NO blocking I2C in the high-priority ISR. +- 1 ms IntervalTimer fpServiceTimer runs ServiceFrontPanel at NVIC priority 240, BELOW the + OpenAudio update ISR (208), so encoder/button I2C can never delay audio. It does the deferred + interrupt1()/interrupt2() I2C drain when a flag is set OR the INT pin still reads LOW (level + recovery for missed edges). interrupt2 uses readGPIOAB() single-read optimization. +- Legacy CheckForFrontPanelInterrupts() (main-loop poll) remains as an idempotent backstop. +Rationale: decouples tuning responsiveness from the slow main-loop display/DSP cadence while +preserving audio via priority ordering — ties to real-time-constraints + spectrum-refresh-floor. +Caveat noted: all IntervalTimers share IRQ_PIT so priority(240) is global. Updated index/roadmap. +Remaining firmware module stubs: cat-control, persistent-config, display panes. + +## [2026-06-08] decision | Promoted persistent-config to draft (ED struct + JSON storage) +Read SDT.h config_t/ED (264-331), ParamSave.h, Storage.h/.cpp. ED is one global config_t = the +single source of truth: ~50 fields (many per-band, NUMBER_OF_BANDS=13) spanning audio/DSP, +tuning, modulation/CW, spectrum/display, equalizer, power/PA, calibration (RX/TX IQ, carrier- +null DCOffset, atten, SWR cal), antenna. Documented field groups + which module owns each. +Persistence (Storage.cpp): NOT a raw struct dump — ED is serialized field-by-field as +ArduinoJson and written to LittleFS_Program (~1 MB Teensy program flash) + optional SD +(BUILTIN_SDCARD). API: InitializeStorage / SaveDataToStorage(savetosd) / RestoreDataFromStorage +/ RestoreDataFromSDCard / PrintEDToSerial. Field-named JSON = robust to struct-layout changes. +ParamSave.cpp is a separate small RAM scratch (5 var + 3 array slots ≤256B) = transient undo +buffer for calibration twiddling, not persistence. Config.h = compile-time constants; Globals.cpp +defines the externs (ED, SampleRate, hardwareRegister, SMs, SR[], bands[]). +Discrepancy logged: ED="EEPROM Data" / .ino says "EEPROM" but it's really LittleFS+SD JSON +(Teensy 4.1 has no true EEPROM) — added to roadmap stale-comments. Updated index/roadmap. +Remaining firmware stubs: cat-control, display panes. + +## [2026-06-08] decision | Promoted cat-control to draft (Kenwood CAT command table) +Read CAT.h + CAT.cpp. CAT = Kenwood 2-letter command emulation over SerialUSB1 (2nd USB serial, +Dual Serial USB type) @ 38400 baud, ';'-terminated, polled by CheckForCATSerialEvents from the +main loop. Architecture = a 25-entry valid_command[] dispatch table {name, set_len, read_len, +write_fn, read_fn}; command_parser matches the 2-letter code and dispatches to write (set) vs +read (query) by length. Commands: FA/FB/FR/FT/FW (freq/VFO), MD/IF/ID (mode/status/id), BU/BD +(band), AG/MG/PC (gains/power), NR/NT/VX (DSP), KS (keyer WPM), TX/RX (PTT), AI/PS/PD/DB, plus +two CUSTOM non-Kenwood: ED (dump config) and PR (dump hardwareRegister). Apply paths: CAT feeds +the SAME channels as the front panel — writes enqueue InterruptType events (iUPDATE_TUNE on +freq, iBUTTON_PRESSED on band) AND/OR write ED directly (KS→ED.currentWPM); TX_write dispatches +to ModeSm. Reads serialize ED/hardware state back (IF = full status string). +Discrepancy logged: CAT.cpp says TS-480 but CAT.h says TS-2000 (docs has ts_480_pc.pdf) — added +to roadmap stale-comments. Updated index/roadmap. This was the last self-contained firmware +module stub; only display-pane internals remain. + +## [2026-06-08] decision | Promoted display-subsystem to draft — firmware modules COMPLETE +Read MainBoard_Display.h + DisplayHome.cpp + the DrawDisplay router. Documented: +- Pane model: struct Pane {x,y,w,h, DrawFunction, stale}; dirty-flag rendering — a pane redraws + only when stale=true (set by modules on data change), the efficiency mechanism for the 10ms + budget. Home screen = WindowPanes[NUMBER_OF_PANES] = 13 panes (VFO A/B, Freq/Band/Mod, + Spectrum, StateOfHealth, Time, SWR, TXRXStatus, SMeter, AudioSpectrum, Settings, NameBadge, + SAMOffset) — enumerated with rects. (The .ino "12-pane" is approximate; actually 13.) +- DrawDisplay() (MainBoard_Display.cpp:244) = top-level render router switching on uiSM.state_id + → per-screen draw fns. Confirms the UISm↔display mapping. Each non-home screen has its own + pane set. +- VariableParameter type-safe editor (union i8..f32/bool/KeyTypeId + min/max/step) drives the + UPDATE state; menus = primaryMenu[8] + SecondaryMenuOption (variableOption→editor or func ptr→ + action). Spectrum pane fed by zoom-fft psdnew; audio-spectrum by convolution-filter audioYPixel. +Resolved the "enumerate the 12 panes" open question. Updated index/roadmap. +MILESTONE: all self-contained firmware MODULE stubs are now drafts. Remaining wiki work is +deeper-dive content (4 cal sub-SM state maps) + unwritten theory/feature pages (CW processing, +equalizer, SAM detection, TX carrier-null). + +## [2026-06-09] decision | Consolidated undone doc-work + seeded development backlog from GitHub issues +Two parts. +(1) Recorded remaining documentation work in roadmap/documentation-todos: added a status header +(all firmware module + 9 theory pages are drafts) and a consolidated "Not yet written" list — +CW processing, equalizer, SAM detection, TX carrier-null, BIT, and the 4 generated cal sub-SM +state maps (PowerCalSm/ReceiveIQCalSm/TransmitCarrierCalSm/TransmitIQCalSm) — plus a per-page +"Remaining gaps" list. Removed the now-duplicate "referenced but not yet created" section. +(2) Pulled the 4 open GitHub issues (KI3P/Phoenix, via REST API since gh not installed) and +created the roadmap development backlog: one scoping page per issue + an index. IMPORTANT framing +per the human: these document WHAT NEEDS DOING and current state, NOT solution designs. +- development-backlog.md (index: status/effort/links, two tracks). +- transmit-spectrum.md (#10): found it's LARGELY BUILT — TransmitReceiveProcessing() runs during + SSB_TRANSMIT on dual-VFO (DSP.cpp:55) computing the PSD via ZoomFFTExe, and HandleTuneState + tunes RX VFO to freq/3 to watch the 3rd harmonic. Gaps: verify rendering, CW-TX, single-VFO, UX. +- manual-notch.md (#11): auto-notch scaffolding exists (notch button toggles ANR_notchOn 0↔1, + Xanr engine, display hook, CAT NT) but NO manual mode-2 path. Remaining: 3-way cycle, fixed-freq + notch DSP, spectrum line, filter-knob binding, ED storage/migration. +- usb-audio.md (#13): no USB-audio endpoints wired in MainBoard_AudioIO yet; lots of in-tree + USB_Audio_*.md debug docs = the starting material. Couples to #14. +- openaudio-library.md (#14): foundational OpenAudio change for audio quality; highest blast + radius; sequence with #13. +Two tracks identified: DSP/UI features (#10,#11 — extend partial backends, lower risk) vs +audio-plumbing (#14→#13 — foundational, coupled). Updated index.md roadmap section. + +## [2026-06-09] decision | Wrote cw-processing page (biggest remaining gap) +Read DSP_CWProcessing.h/.cpp. Created firmware/cw-processing.md documenting the RX-side CW: +- CW audio filter (CWAudioFilter): 5 selectable biquad cascades S1_CW_AudioFilter1..5 by + ED.CWFilterIndex (0.8/1.0/1.3/1.8/2.0 kHz) + off. +- Tone detection (DoCWReceiveProcessing): hybrid correlation (reference sine) × Goertzel mag at + CWToneOffsetsHz[CWToneIndex]; combinedCoeff thresholded → mark/space envelope. +- Adaptive Morse decoder (DoCWDecoding): MorseStates timing SM; standard dit/dah/space timing + (ditLength=1200/WPM); adaptive via signal+gap histograms (HISTOGRAM_ELEMENTS=750, + ADAPTIVE_SCALE_FACTOR=0.8) + JackClusteredArrayMax + thresholdGeometricMean; IsCWDecodeLocked. + Decode via flat-array Morse tree (bigMorseCodeTree): dit→index++, dah→index+=jump, jump>>=1; + emit at char end. Output buffer → display (decoderFlag). +- Sidetone (TX) phase precomputed in InitializeCWProcessing. +Contextualized within full CW path (TX keyer=ModeSm, CW VFO=rf-board/tune). Added inbound links +from dsp-chain + mode-state-machine (no longer orphaned). Logged a discrepancy: header says +"50–500 Hz typical" filter but code labels are 0.8–2.0 kHz. Updated index + documentation-todos. +Firmware page count now 17; CW was the largest "not yet written" gap. Remaining new pages: +equalizer, SAM detection, TX carrier-null, BIT, 4 cal sub-SM state maps. + +## [2026-06-09] decision | Wrote audio-equalizer + synchronous-am-detection pages +Two theory/ concept pages from DSP_FFT.cpp (EQ) and DSP.cpp (SAM): +- theory/audio-equalizer.md: 14-band graphic EQ = parallel filterbank. BandEQ/ApplyEQBandFilter + (DSP_FFT.cpp:787): 14 fixed biquad-cascade bands (EQ_Coeffs[14], 4 stages each), separate + RX/TX filter instances (S_Rec/S_Xmt) sharing coeffs, per-band gains ED.equalizerRec/Xmt + (/100, 100=flat); each band filtered→scaled by sign×gain→accumulated into eqSumBuffer→copied + back. Alternating sign (even bands negated) gives flat reconstruction of overlapping bands. + RX after demod (DSP.cpp:924); TX on mic audio. Edited via MainBoard_DisplayEqualizer (UISm + EQUALIZER). Open Qs: band freq/Q table, gain range. +- theory/synchronous-am-detection.md: SAM = DD4WH/wdsp synchronous AM (AMDecodeSAM, DSP.cpp:567). + 2nd-order PLL (phase det atan2 → loop filter g1/g2 from omegaN=200/zeta → NCO phzerror; freq + est omega2 clamped ±pll_fmax=4000Hz) recovers a clean carrier → fade-robust coherent demod, + vs envelope AM (AlphaBetaMag). Fade leveler (tauR/tauI). Carrier offset → GetSAMCarrierOffset + → home-screen SAM-offset pane. Open Qs: zeta/tau values, the ×10 scaling. +Added backlinks (dsp-chain related-theory, display-subsystem panes/files, theory/overview +concept list 8-10, index). documentation-todos: both marked done. Theory now 11 pages. +Remaining new pages: TX carrier-null, BIT, 4 cal sub-SM state maps. + +## [2026-06-09] decision | Wrote tx-carrier-null, built-in-test, calibration-state-machines +Three pages, clearing the last "not yet written" backlog. +- theory/tx-carrier-null.md: per-band DC offset added to TX I/Q before the DAC + (arm_offset_q15, DSP.cpp:1065-1067) cancels LO leakage (DC on baseband → carrier tone after + mixer). TransmitCarrierCalSm sweeps DCOffsetI/Q to maximize dBc. Contrasted the 3 TX cals + (image vs carrier vs power). Distinct from iq-imbalance (image). +- firmware/built-in-test.md: BIT struct (bit_results, Globals.cpp:69) = boolean I2C-presence + flags per subsystem (RF MCP/Si5351, BPF, LPF MCP/AD7991, front panel) set as a side effect of + each board's Initialize* (e.g. BPFBoard.cpp:30/41). DrawBIT "I2C Status Report" screen (UISm + BIT state), reached via iBITDISPLAY (Loop.cpp:1354). Connectivity test only, startup snapshot. +- firmware/calibration-state-machines.md: consolidated the 4 generated cal SMs. KEY FINDING: + ReceiveIQCalSm/TransmitIQCalSm/TransmitCarrierCalSm are STRUCTURALLY IDENTICAL (7 states: + STANDBY/BAND_ADJUST/FIND_MINIMUM/ADJUST/WAIT/READ; 7 events) — one minimize-sweep machine for + three metrics. PowerCalSm differs (POWERPOINT1/2/3, SSBPOINT, ACQUISITION, READ_AND_ADJUST, + POWERCOMPLETE; RECORD_DATA_POINT/CURVE_COMPLETE) because it's curve-fitting, not minimum-finding. + Mapped the WAIT→READ→ADJUST/NEXT_POINT loop + BAND_ADJUST/MIN_EXIT/AUTO_COMPLETE band stepping. +Added backlinks (hardware-state-machine, tx-carrier-null, iq-imbalance-correction; resolved the +HSM "full cal sub-SM state map" open Q). Updated index + documentation-todos. MILESTONE: every +previously-unwritten page is now a draft. Totals ~firmware 19, theory 13, roadmap 6. + +## [2026-06-09] lint | full wiki health-check (38 pages) +First formal lint. Built a link graph (Python) over all pages. Findings + fixes: +- BROKEN LINKS (10 instances): [[spectrum-refresh-floor]] was referenced from 6 pages but had + NO wiki page (only a memory note) → CREATED firmware/spectrum-refresh-floor.md (type:decision). + [[roadmap]] (real-time-constraints) and [[theory]] (code-heritage) pointed at directories, not + pages → re-pointed to [[front-panel]] and [[theory-overview]] respectively. [[tune-state-machine]] + in log.md left as-is (historical record). +- STALENESS (contradiction): the new spectrum page revealed the refresh work SHIPPED 2026-05-30 + (11.7→18.8 fps, NCHUNKS 8→5, REFRESH 80→50) but 4 pages (real-time-constraints, zoom-fft, + display-subsystem, main-loop) still asserted the OLD "~80 ms floor / NCHUNKS=8" framing → + reconciled all 4 to "redraw ≈ NCHUNKS×T_loop, cut draw cost" and defer to the page. +- AMBIGUOUS WIKILINKS: two overview.md files (firmware/ + theory/) made [[overview]] ambiguous + (basename-resolved per schema) → renamed theory/overview.md → theory-overview.md, updated all + 11 theory pages + index (sed). Now 0 duplicate basenames; firmware [[overview]] unambiguous. +- STALE STATUS: dsp-chain, real-time-constraints, state-machine-architecture were status:stub but + had draft-level content → promoted to draft (updated 2026-06-09). +- ORPHANS: none (llm-wiki.md is the meta originating-idea doc, referenced by CLAUDE.md; not a + catalog page). INDEX COVERAGE: complete after adding spectrum-refresh-floor. +RESULT: lint clean — 0 orphans, 0 broken links (excl. log history), 0 missing-from-index, 0 dup +basenames. Totals: firmware 20, theory 12, roadmap 6 = 38 content pages, all draft. + +## [2026-06-14] query | Resolved RX I/Q calibration tone-offset question +Traced the RXIQ cal signal path. CW tone is programmed to `band_center + SR[SampleRate].rate/4` +(`HardwareSm.cpp:613`) = 48 kHz at the default 192 kHz raw rate — the code comment is correct. +The "±6 kHz at 24 kHz" premise was wrong: the measured PSD is the 192 kHz raw, 1×-zoom 512-bin +display FFT (cal forces `spectrum_zoom = 0`, `HardwareSm.cpp:498`) → 375 Hz/bin, bin 256 = LO, +so ±Fs/4 = bins 128/384. Wanted = bin 384, image = bin 128. Also resolved the `×10` metric: +`psdnew` is log10 magnitude (`DSP_FFT.cpp:144,186`), so ×10 = dB. Updated +[[iq-imbalance-correction]] (calibration section + Resolved block) and struck two items from +[[documentation-todos]]. Remaining IQ open question: single-axis vs 2×2 residual / achieved IRR +(needs hardware measurement). + +## [2026-06-14] query | Resolved NR sample-rate comment question +`Kim1_NR` runs at the 24 kHz decimated RX rate (raw 192 kHz ÷ DF1·DF2 = 4·2 = 8, +`SDT.h:409-410`) → 24000/256 = 93.75 Hz/bin. The `46.9Hz [12000Hz/256] @96kHz` comment +(`DSP_Noise.cpp:141,155`) is stale DD4WH heritage text (old 96 kHz input / 12 kHz NR rate); +the code is rate-agnostic — it divides by the live `data->sampleRate_Hz / NR_FFT_L`, so it is +correct despite the comment. Updated [[noise-reduction]] (Kim1_NR section + Resolved note) and +struck the item from [[documentation-todos]]. + +## [2026-06-14] query | Resolved zoom default "mismatch" (false alarm) +`Config.h:78 #define ZOOM 3` is a front-panel **button-ID** macro (the "Front panel button +functions" block, `Config.h:74-96`), dispatched as `case ZOOM:` in `Loop.cpp:457,818` where it +does `ED.spectrum_zoom++`. It is unrelated to the zoom *level*. Power-on zoom is governed solely +by `ED.spectrum_zoom` (default 1 = 2×, `SDT.h:274`; or a restored JSON value, `Storage.cpp`). +No real discrepancy. Updated [[zoom-fft]] (Defaults + Resolved) and struck the item from +[[documentation-todos]]. + +## [2026-06-14] query | Resolved TX fixed-taps vs RX runtime-harris design question +Conclusion: primarily heritage, not a deliberate determinism/latency choice. The fixed 48-tap +TX tables are legacy DD4WH coefficient sets — the arrays are named/commented "RXfilters Dec and +Interpolation" (`DSP_FIR.cpp:174-175`) yet consumed by the TX chain (`DSP_FFT.cpp:425-442`). +RX *decimation* was refactored into the parametrized harris-formula design +(`InitializeDecimationFilter`, `DSP_FIR.cpp:1284-1300`, malloc). The runtime path's only +structural advantage — sample-rate independence via `SR[SampleRate].rate` — is dormant because +`SampleRate` is fixed at SAMPLE_RATE_192K (`Globals.cpp:106`) and never reassigned, so RX +recomputes identical coeffs every boot. Nuance: RX is itself a hybrid — decimation runtime-sized, +interpolation fixed 48/32 taps with runtime coeffs (`DSP_FFT.cpp:401-403`). Updated +[[multirate-decimation]] (new "Why RX designs taps at runtime" subsection + Resolved) and struck +the item from [[documentation-todos]]. + +## [2026-06-14] query | Resolved AGC soft-knee curve + n_tau/MAX_N_TAU questions +Soft-knee: the per-sample gain `mult = (out_target - slope_constant*fmin(0, log10(volts/max_input)))/volts` +(`DSP.cpp:454`) yields a 3-region transfer curve — flat limiting at out_target (volts≥max_input); +linear-in-log soft knee falling slope_constant/decade (min_volts..max_input); constant max_gain +below min_volts. var_gain is the wdsp slope knob: total output rise = out_target·(1−1/var_gain) +≈ +3.5 dB at the default 1.5. n_tau/MAX_N_TAU: MAX_N_TAU=8 is a commented-out worst-case constant +(`SDT.h:615-617`) used only to hand-size the static ring_buffsize=24000·8·0.01+1=1921; operating +n_tau=4 → 96-sample (~4 ms) look-ahead at 24 kHz. Added a "gain law / soft-knee transfer curve" +section + look-ahead/n_tau detail + Resolved block to [[agc-design]]; struck both items from +[[documentation-todos]]. + +## [2026-06-14] decision | Fixed stale source comments to match the wiki (6 findings) +Comment-only edits on branch encoder-i2c-speed (not committed). Corrected the long-standing +code/comment discrepancies the wiki had documented: +- VFO unit: RFBoard.h/Tune.h docstrings "decihertz/deci-Hertz" → "centi-Hz (Hz × 100; _dHz + suffix is a historical misnomer)". Symbol names left unchanged (invasive refactor). +- CAT: CAT.h:25 "TS-2000" → "TS-480" (consistent with CAT.cpp + ts_480_pc.pdf; ID020=TS-480). +- EEPROM myth: PhoenixSketch.ino header + Storage.cpp:675 now say flash/SD (LittleFS+SD JSON), + ED blurb notes "EEPROMData" is a historical name. +- TuneSm myth: PhoenixSketch.ino (philosophy bullet, ASCII diagram, SM list, module list) and + CLAUDE.md ("Frequency Control State" section + lines) → HardwareSm owns the tune state; + Tune.cpp is a pure-function library. +- HardwareSm hand-written: made explicit in PhoenixSketch.ino + HardwareSm.cpp header. +- ModeSm state list: .ino "…CW_TRANSMIT, TUNE" → real states (no TUNE; six CW_TRANSMIT_* + + CALIBRATE_*). +Struck all six from [[documentation-todos]]. Wiki was already correct; this aligns the source. + +## [2026-06-14] decision | Added hardware/ as a 4th wiki subject area +Physical-hardware documentation had no natural home (firmware/ = code, theory/ = DSP why). +Amended wiki/CLAUDE.md: added hardware/ to Scope (4 areas), directory layout, and a `hardware` +type value. Created hardware/hardware-platform.md (T41-EP overview: Teensy 4.1, board stack, +dual-SGTL5000 + PCM1808/PCM5102 audio, RF chain, power/PA/XVTR options) and hardware/i2c-bus-map.md +(Wire/Wire1/Wire2 topology, every device+address from Config.h, why the front panel gets its own +400 kHz bus). Facts derived from Config.h + board drivers (no schematic ingested yet; flagged). +Updated index.md (new Hardware section, count 38→40) and added inbound [[hardware-platform]]/ +[[i2c-bus-map]] links from overview, rf-board, filter-boards, front-panel, built-in-test. + +## [2026-06-14] ingest | T41-EP KiCad schematics (6 boards) +First physical-hardware source. Wrote sources/t41-ep-schematics.md summarizing all six files +(main / RF / attenuator-daughter / dual-clock-LO / BPF-exciter / LPF-100W-PA). Integrated +confirmed facts into [[hardware-platform]], [[i2c-bus-map]], [[rf-board]], [[filter-boards]]. +Key resolutions: ONE physical SGTL5000 (RX path is PCM1808 ADC + PCM5102 DAC) — flagged the +code's vestigial second-"SGTL5000" object as a discrepancy; RA8875 is off-board (J7); RX/TX +attenuators = PE4312 digital step attenuators (31.5dB/0.5dB) on a daughterboard; dual Si5351 +(25 MHz ref) confirmed; three I2C buses confirmed by SDA/SCL, SDA1/SCL1, SDA2/SCL2 nets. +New discrepancy flagged: LPF board uses AD8307 *log* power detectors, but PerformSWRBridgeReading +computes linear P=(V*10)^2/50 — needs reconciling (which detector feeds AD7991). Updated index +(Sources section populated; count 40 pages + 1 source). + +=== orphan/link check === + +## [2026-06-14] decision | Centralized schematic-ingest discrepancies in the tracker +The two new findings from the schematics (AD8307-log-vs-linear power math; phantom second +SGTL5000) and the net-tracing leads were recorded on their pages + log.md during ingest but not +in roadmap/documentation-todos.md (the central tracker). Added a "Hardware (from T41-EP +schematics)" subsection there so they're discoverable from the start-here hub. + +## [2026-06-14] decision | Net-traced AD8307 power chain — resolved the log-vs-linear question (NOT a bug) +Traced the LPF/PA board (K9HZ_100W_11band_LPF-Control) via union-find over wires/pins/labels, +confirmed with the schematic owner: coupler → 2× AD8307 log detectors (U14 forward, U19 +reflected) → AD7991 CH0/CH1; net REF = REF3440 4.096V reference on AD7991 Vin3/Vref (not +"reflected"); only 2 AD8307 placed. Read LPFBoard.cpp:589-649: the DEFAULT digital path already +does the correct AD8307 log conversion (mV/25 − 84 → dBm → W). The linear (V·10)²/50 formula is +the separate USE_ANALOG_SWR branch (linear diode detectors on Teensy pins 26/27, off by default). +So the earlier "possible bug" was a WIKI mis-attribution, now corrected. Updated [[filter-boards]] +(rewrote SWR section into two correct branches + Resolved), [[t41-ep-schematics]], +[[hardware-platform]], and struck the item in [[documentation-todos]]. + +## [2026-06-14] decision | Resolved the "phantom second SGTL5000" (schematic owner) +Audio architecture confirmed: ONE SGTL5000 (Teensy hat, sgtl5000_teensy) doing double-duty +(mic in + TX I/Q out); PCM1808 (U6) = RX I/Q in; PCM5102 (U5) = speaker out. The firmware's +pcm5102_mainBoard object corresponds to the PCM5102 DAC but is mistyped AudioControlSGTL5000 — +harmless because PCM5102/PCM1808 are control-less I2S parts (its .enable()/.inputSelect() calls +are no-ops; the I2S data path carries audio). So it's a code clarity fix (retype/rename, drop +"two SGTL5000s" comment), not a functional bug. Updated [[hardware-platform]], [[t41-ep-schematics]], +and struck the item in [[documentation-todos]]. + +## [2026-06-14] decision | Documented ATtiny85 (U4) soft-power controller — open question resolved +The main-board ATtiny85 is a dedicated power controller (separate sketch +code/src/ATTiny85_On_Off/ATTiny85_On_Off.ino, K9HZ/KI3P). 3-state machine: OFF → button → +FET on (boot Teensy) → ON → button → assert START_SHUTDOWN → SHUTDOWN (power held) while Teensy +saves params → Teensy raises SHUTDOWN_COMPLETE → FET off. Two-wire handshake (not I2C/sensor). +Teensy side: Loop.cpp:1499 polls BEGIN_TEENSY_SHUTDOWN → ShutdownTeensy() (Loop.cpp:1414) saves +state then digitalWrite(SHUTDOWN_COMPLETE,1); CAT 'PS' triggers same path. Firmware depends on +it for orderly power-down (enables save-on-power-off). Added a "Power control & graceful shutdown" +section to [[hardware-platform]], struck the ATtiny item from [[documentation-todos]]. + +## [2026-06-14] decision | Corrected PE4312 designators for board-revision differences +Owner clarified the U3/U12 confusion stems from RF-board revisions: V12.8 puts the PE4312s on +removable daughterboards (RX=U11, TX=U3; U12=dual-clock daughter); PRIOR revisions placed PE4312 +directly on the board (RX=U3, TX=U12). Wiring + firmware unchanged across revisions. Reworked +[[rf-board]] and [[t41-ep-schematics]] to lead with the revision-independent ELECTRICAL mapping +(GPIOA→RX, GPIOB→TX; bit→pin→dB table) and added a per-revision designator table; added a +"multiple revisions" caveat to the source preamble. The raw/ files are the V12.8/"V012" gen. + +## [2026-06-15] decision | Traced LPF/control board band-code → decoder → relay chain (owner) +Full decode chain documented in [[filter-boards]] + [[t41-ep-schematics]]: +- Band LPF: MCP23017 U15(0x25) GPIOB[0:3] (4-bit BCD) → U12 CD74HC4514 4→16 (A0-A3 pins 2,3,21,22) + → inverting U9/U10 ULN2803 → EXTERNAL band-LPF relays via J24/J25 (selected line LOW; NF=Y15 + bypass). BCD table per SDT.h:95-106. +- Antenna: GPIOB[4:5] → U2 74HC237 3→8 → U4 ULN2803 → on-board relays K4-K7 → ANT-1..4. +- 100W PA: GPIOB[7] → spare U4 channel → K2/K3. +- BPF RX/TX routing: GPIOA[0:1] (TXBPF/RXBPF) → U5/U6 → external BPF between J15-J18. +CORRECTION: earlier wiki said on-board K2-K7 were the band-LPF relays; actually K2/K3=PA route, +K4-K7=antenna, and the band-LPF relays are on a separate EXTERNAL board. Fixed in filter-boards +physical-hw bullet + source page. Struck the LPF band-code lead in documentation-todos. (Minor: +owner wrote "CD74HC4515" but schematic value field + active-high behavior = CD74HC4514; used 4514.) + +## [2026-06-15] ingest | LPF filter board (K9HZ_100W_11band_LPF-Filter) — band-LPF loop closed +Added the 7th schematic. 24× HF41F relays = 2 per band; ONE dedicated 7th-order LPF per band +(11 bands) + BNF straight-through bypass (NOT band-groups). Band-named control nets +B160M…B6M,BNF arrive on J26/J27 (←control board J24/J25); each net = 2 relay coils + 1 conn pin. +33 inductors (3/band, symmetric ladder), 5.21/4.73µH (160m) → 0.188/0.170µH (6m); caps 27-2200pF. +Full select loop: GPIOB[0:3] BCD → U12 CD74HC4514 Yn(=BCD) → U9/U10 ULN2803 → J24/J25→J27/J26 → +B → 2 relays → band LPF. Updated [[filter-boards]] (decode chain + resolved open Q), +[[t41-ep-schematics]] (file table + new section, 6→7 files), index.md. Only LPF item left: +tabulate per-band L/C→cutoff (values present in schematic, not yet tabulated). + +## [2026-06-15] decision | U21 upper bits unused; per-band L/C table out of scope +Owner-confirmed: RF-board MCP23017 (U21) upper bits GPA6/7 and GPB6/7 are unused / not connected +— each bank carries only the 6-bit attenuator word. Resolved in [[rf-board]]. Also: per-band LPF +L/C→cutoff tabulation is intentionally out of scope (more detail than the wiki needs) — removed +from the leads list, not a gap. Only remaining hardware net-tracing lead: I²S/MCLK routing. + +## [2026-06-15] decision | Traced I²S routing — last hardware net-trace closed +Owner + main-board schematic: shared I²S clocks MCLK=Teensy GPIO23 (net CLK), LRCLK=GPIO20 (LRCK), +BCLK=GPIO21 (BCK) to U5 PCM5102, U6 PCM1808, U7 SGTL5000 adapter. DAUDIO_OUT=GPIO32 (quad-I2S +OUT1B) → PCM5102 speaker DAC; ADC_IN ← PCM1808 RX I/Q. SGTL5000 uses standard audio-shield data +pins (OUT1A=GPIO7 TX I/Q + mic in), inferred. Documented in [[hardware-platform]] audio section + +Resolved list; cleaned the stale open-questions bullet (PE4312/band-code already resolved). All +schematic net-tracing leads now closed; struck the leads line in [[documentation-todos]]. Only +non-schematic hardware items remain (PA bias/rails; per-band SWR cal = bench). + +## [2026-06-15] lint | full wiki health-check (41 content pages incl. 1 source) +Structural: no duplicate basenames; no orphan content pages; frontmatter complete on all; every +content page linked from index.md. Broken wikilinks only in CLAUDE.md (schema examples +[[page-name]]/[[other-page]]) and log.md (historical [[tune-state-machine]] + stray [[roadmap]]/ +[[theory]] in old entries) — left as-is (doc/history, not navigational). + +Fixed contradictions/stale claims superseded by the schematic ingest: +- "3× AD8307" → "2× AD8307" (U14 fwd/U19 rev) in filter-boards + hardware-platform table; AD7991 + count corrected to 1 (U20 only placed). +- i2c-bus-map listed a phantom 2nd SGTL5000 (main board @ HIGH) + "two codecs" note — removed the + bogus bus row and rewrote the note (one SGTL5000; PCM1808/PCM5102 are control-less, not on I2C). +- tune-frequency-control called the ×100 unit "deci-Hz/deci-Hertz" — corrected to centi-Hz with a + misnomer note, consistent with rf-board. + +Recommendation (not yet actioned): no firmware **module** page exists for MainBoard_AudioIO.cpp +(the OpenAudio quad-I2S graph, mixers/queues, UpdateAudioIOState mode routing, sidetone). The +audio *hardware* is in [[hardware-platform]] but the audio *firmware module* is a content gap — +candidate new page firmware/audio-io. Also: hardware/ pages are now schematic-grounded and +candidates for draft→stable. + +## [2026-06-15] decision | Wrote firmware/audio-io (closed the lint-flagged content gap) +New module page for MainBoard_AudioIO.cpp: OpenAudio quad-I2S graph (i2s_quadIn/Out channel map), +the 4 input mixers + 4 record queues / 4 play queues + 4 output mixers (mixers as on/off +selectors), sidetone + TX-IQ-cal oscillators, UpdateAudioIOState() per-ModeSm-state routing table, +the queue ISR↔main-loop hand-off to DSP (Q_in_*/Q_out_* with DSP.cpp citations), init/AudioMemory/ +SetI2SFreq (48/96/192k), and the codec objects (sgtl5000_teensy real; pcm5102_mainBoard = PCM5102 +DAC, mistyped AudioControlSGTL5000, no-op control — cross-ref hardware-platform). Linked from index ++ inbound from dsp-chain, mode-state-machine, cw-processing, hardware-platform. firmware 20→21. + +## [2026-06-15] decision | Promoted hardware/ pages draft→stable +[[hardware-platform]] and [[i2c-bus-map]] are now schematic-grounded (sourced from +[[t41-ep-schematics]]) and lint-clean, with all open hardware net-traces resolved → promoted to +status: stable (updated 2026-06-15). Index draft markers updated; also corrected a stale index +blurb ("dual-SGTL5000" → single SGTL5000 + PCM1808/PCM5102). The backing source page +[[t41-ep-schematics]] and the firmware module pages [[rf-board]]/[[filter-boards]] remain draft +(other unrelated sections in those still maturing). + +## [2026-06-15] lint | verification pass before human correctness review +Cross-page consistency: AD8307=2 everywhere, AD7991=1×(U20), no stray "two SGTL5000" (only the +quoted code-comment inside the discrepancy box), no stale "deci-" outside misnomer-flagging +context, attenuator designators all revision-qualified. Citation spot-check (all exact): +MainBoard_AudioIO.cpp:121/140/198/280/446/452/488; DSP.cpp:134/730/988/1061; +LPFBoard.cpp:640-642 (AD8307 log→dBm); RFBoard.cpp:276/67/102 (attenuator word→GPIOA). No edits +needed. Flagged for human verification: inferred (non-net-labelled) claims — SGTL5000 data-pin +assignment (OUT1A=GPIO7 + mic-in) and the 74CBTLV3253 I/Q-mux role; and the raw/ schematic = the +"V12.8/V012" revision assumption behind the attenuator designator table. + +## [2026-06-16] decision | rf-board.md owner corrections +Owner proofreading corrections applied to `firmware/rf-board.md`: +1. VFO/LO discussion — added board-revision note that RF boards prior to V12.8 had a single + Si5351 with one quadrature pair (CLK0/CLK1) **shared** between RX and TX mixers (no + independent RX/TX LO), while still providing the CW carrier on CLK2. +2. Frequency units — renamed `_dHz`/decihertz → `_cHz`/centi-Hz throughout the section to match + the firmware rename; dropped the now-resolved "RFBoard.h says decihertz" wrong-unit flag. +3. Attenuators — corrected "GPIO value is simply attenuation ÷ 0.5 dB" to "the attenuation in + dB × 2" (matches `round(2·atten_dB) & 0x3F`). + +## [2026-06-16] decision | split board electronics firmware/ → hardware/ +Owner question surfaced that `firmware/rf-board.md` and `firmware/filter-boards.md` carried +substantial *electronics* content (part numbers, pinout tables, schematic-traced decode chains) +that the wiki schema assigns to `hardware/` (code-vs-electronics split). Resolution: moved that +content into two new pages — +- `hardware/rf-board-electronics.md` (type: hardware): dual/single Si5351 LO + board-revision + history, PE4312 attenuators (GPIO-bit→pin table + per-revision designators), ADT/PSA/MAR/MASWSS + mixer front end, I/Q baseband op-amps. +- `hardware/filter-board-electronics.md` (type: hardware): BPF/exciter board, LPF/PA control + board decode chain (CD74HC4514/74HC237 + ULN2803 + HF41F relays), external per-band 7-element + LPF board with inductor values, AD8307/AD7991/REF3440 SWR-sensing front end. +The two `firmware/` module pages now describe the **code/API** only (functions, the +`hardwareRegister` model, the SWR math, the band-BCD encoding the firmware writes, test hooks) +and point to the electronics pages. Cross-links added both ways; `hardware-platform.md` and +`index.md` updated (hardware page count 2→4, 41→43 content pages). No content lost — moved, not +duplicated. + +## [2026-06-16] lint | full wiki health-check +Structural: 44 content pages (43 + 1 source). **No broken inter-page links** (only schema-example +`[[page-name]]`/`[[other-page]]` in CLAUDE.md and historical entries in log.md, which are +expected/immutable). **No orphans.** **No duplicate basenames** among content pages (`raw/log.md` +shares the `log` basename but is an immutable source, out of namespace). New pages +rf-board-electronics / filter-board-electronics are reciprocally linked and indexed. +Stale-claim scan clean for: 3×AD8307 (correctly 2×), phantom 2nd SGTL5000 (only in the +discrepancy note), attenuator ÷0.5 phrasing (gone). +⚠ **CONTRADICTION FOUND (open):** wiki now says the VFO-frequency symbols were renamed `_dHz`→ +`_cHz` (rf-board.md "Frequency units"; documentation-todos "FULLY RESOLVED"), but the working-tree +source on branch `encoder-i2c-speed` still has **51 `_dHz` occurrences and zero `_cHz`** (RFBoard +.cpp/.h, Tune.cpp/.h, HardwareSm.cpp, MainBoard_DisplayHome.cpp). The docstrings note the misnomer +("centi-Hz … the _dHz suffix is a historical misnomer") but the identifiers are unchanged. Flagged +to owner: either the rename is uncommitted/on another branch, or the wiki overstated it. Awaiting +clarification before reconciling the two pages. tune-frequency-control.md still uses `_dHz`, which +currently *matches* source. + +## [2026-06-16] decision | dHz/cHz contradiction — owner ruling +Owner: the `_dHz`→`_cHz` rename is real but **not on `encoder-i2c-speed`** (uncommitted / other +branch). Resolution: **keep the wiki at `_cHz`** and add a branch-caveat note to rf-board.md +"Frequency units" and the documentation-todos entry, flagging that this working tree still shows +`_dHz` and the pages will reconcile once the rename merges. Lint contradiction closed. + +## [2026-06-16] lint | full wiki health-check (post dHz→cHz merge) +Triggered after the `_dHz`→`_cHz` rename (`65e6bba`) and the doc-fix commit (`c95f932`) were +rebased/merged onto `encoder-i2c-speed`. **Structural:** 44 content pages — no orphans, no broken +inter-page links (only the schema-example `[[page-name]]`/`[[other-page]]` in CLAUDE.md and +historical `[[tune-state-machine]]`/`[[roadmap]]`/`[[theory]]` mentions inside log.md prose, all +expected/immutable). Frontmatter complete on every content page. +**Contradiction RESOLVED (was open from the two 2026-06-16 entries above):** source now shows +**0 `_dHz` / 46 `_cHz`** in `code/src/PhoenixSketch/`, so the rename the wiki described has +landed on this branch. Reconciled the three caveat-bearing pages: +- rf-board.md "Frequency units" — dropped the "not yet present on encoder-i2c-speed" branch note; + now states source & wiki agree. +- tune-frequency-control.md — renamed `GetTXRXFreq_dHz`/`GetCWTXFreq_dHz` → `_cHz` (4 refs) and + rewrote the "historical misnomer" prose to past tense. +- documentation-todos.md — "VFO frequency unit" item marked reconciled; "Stale source comments" + blockquote updated from "not yet committed" → committed & merged (`c95f932`). +`updated:` bumped to 2026-06-16 on all three. No remaining stale `_dHz` identifier claims. +**Suggested next:** promote the now-verified firmware pages from `draft`→`stable` (most are +draft); consider a dedicated power-calibration theory page (flagged in tune-frequency-control). + +## [2026-06-16] decision | rapid-tune audio mute & spectrum freeze (encoder-i2c-speed) +Documented a new `encoder-i2c-speed` feature, compile-gated by `MUTE_ON_RAPID_TUNE` (Config.h): +when a tune encoder is spun fast, mute the output audio and freeze/decouple the spectrum redraw, +resuming automatically. The two-tier encoder speedup ([[front-panel]]) made fast spins enqueue a +tune event almost every loop, which surfaced audio glitches + a jerky sweep; this masks both +without changing per-event tuning. +**New page:** firmware/rapid-tune-mute-freeze.md (`type: decision`). Covers detection in Loop.cpp +(`NoteTuneActivity(bool)`, `IsRapidTuning`/`IsRapidCenterTuning`/`IsRapidFineTuning`; uint32 millis +wrap fix for the host mock), audio mute in `AdjustVolume()` (DSP.cpp), and the display split — +Center Tune fully freezes; Fine Tune holds the trace but keeps the blue filter bar + cyan marker +tracking via a one-time bar-less L2 backdrop (`BuildFrozenBackdrop`) + per-freq-change L2→L1 BTE +blit (`RedrawFrozenSpectrumWithBar`) + `StampTuningBar` (refactored out of +`DrawBandWidthIndicatorBar`). Noted the inverse relationship to [[spectrum-refresh-floor]] (pause +vs speed-up; same draw-cost lesson) and the trace-over-highlight trade-off of the fast path. +**Cross-links added:** front-panel, tune-frequency-control, display-subsystem, main-loop, +spectrum-refresh-floor (all in `related` + inline). **index.md** bumped firmware 21→22 (44 content +pages). Status `draft` — display fast-path is hardware-exercised, not unit-tested; thresholds +(`RAPID_TUNE_ENGAGE_MS=60`/`RAPID_TUNE_RELEASE_MS=180`) pending bench tuning. + +## [2026-07-29] ingest | V1.4RC merge — runtime sample rate, rate-independent filters, HIL suite +Brought the wiki current with the `V1.4RC` merge (`rx-dsp-176k-stage-test` + `fast_encoder`). +The wiki had been written entirely on `fast_encoder` and knew nothing of the sample-rate work, +so this is a content ingest from source rather than from a `raw/` document. + +**Three new pages** (all `type: decision`, `status: draft`): +- **firmware/sample-rate-switching.md** — 192 / 176.4 ksps selectable at run time and persisted. + `SampleRate` is now `uint8_t& = ED.sampleRate` (`Globals.cpp:106-109`), which is how a value + read by hundreds of `SR[SampleRate].rate` call sites moved into the saved JSON untouched. + Covers `ChangeSampleRate()` (`MainBoard_AudioIO.cpp:519`) step by step and why the order + matters — in particular the `centerFreq_Hz` compensation for the change in the Fs/4 IF offset + (3.9 kHz between the rates, applied to both VFOs, computed *before* `SampleRate` is updated), + and the `InitializeDecimationFilter` free-before-malloc that had to land first. Menu (primary + menu 8→9), `SR` CAT command, and the boot path (`InitializeStorage()` precedes + `InitializeSignalProcessing()`, so there is no "apply saved rate" step). +- **firmware/runtime-filter-design.md** — the filters that had to be fixed before any of that + worked. Frozen tables designed for 24 ksps audio scaled by `176400/192000 = 0.91875`, so a + "2.0 kHz" CW filter cut at 1.84 kHz and the 4000 Hz EQ cell peaked at 3675 Hz. Now generated + from analog prototypes *recovered* from the shipped tables (CW: 0.0200 dB ripple fits + `cheby1(12, 0.02)` to 0.013 dB RMSE; EQ: every biquad has `b1=0`, `b2=-b0`, i.e. zeros at + `z=±1`, the bilinear image of an analog bandpass). Prewarping is the load-bearing part. + Recorded the framing that actually predicts behaviour: **Hz-specified → must be regenerated** + vs **fraction-of-Fs → already correct**. Also the three bugs found in passing, of which one is + user-visible: the TX decimate-by-2 was flat to 0.425*Fs, folding 6-9.5 kHz into transmitted + audio, so **TX audio differs from previous releases even at 192 ksps**. +- **firmware/filter-hil-test.md** — the AD2 bench suite. Kept to the durable parts: the + differential (engaged-minus-bypassed) method and why it makes a speaker-terminal measurement + sufficient; the SSB filter as control; the two traps — injection at `|Fs/4 + fineTuneFreq_Hz|` + (omitting the fine tune gives *silence*, not a small error) and AGC-off (no CAT command + exists, so the suite refuses to run); rate-invariance-not-absolute-accuracy as the criterion; + 95 checks passed / 0 failed, corners within 0.3%. + +**Contradiction resolved (house rule: flag, don't overwrite).** theory/multirate-decimation said +the runtime-design path's rate independence was "**dormant** — `SampleRate` is set once and +**never reassigned** anywhere in the firmware". That was true on `fast_encoder` and is now false. +Rewrote the section with a dated correction, kept the heritage explanation for the RX/TX +asymmetry (still valid), and marked the "dormant" clause of the 2026-06-14 *Resolved* entry as +superseded rather than deleting it. Same treatment in roadmap/documentation-todos. + +**Two open questions closed from the new code:** +- audio-equalizer's "tabulate the 14 band centre frequencies" — the generator exposed them as + `EQ_BAND_FC_HZ[]` (`DSP_FIR.cpp:1247-1251`), roughly 1/3-octave / R40. Tabulated. +- cw-processing's "confirm the sample rate the decoder/Goertzel operate at" — the **audio** rate, + `SR[SampleRate].rate / RXfilters->DF`. The "12 kHz the sidetone phase implies" that prompted + the question came from a **stale comment** (`DSP_CWProcessing.cpp:64` still says `/ 24000` + while `:65-66` divides by the live rate). An earlier revision of the page had quoted that + comment as if it were the code; corrected in place and logged as a comment-only source fix. + +**Pages updated:** cat-control (25→29 commands; the new SR/CF/EQ/FL group; the parser rule that +`set_len` must differ from `read_len` or the read handler is unreachable — the bug that made +`FW;` write-only; and the `MD` fix, which did not merely fail to change the demodulator but +**mirrored the receive passband**), multirate-decimation, theory-overview, zoom-fft, +audio-equalizer, cw-processing, dsp-chain, audio-io, persistent-config, display-subsystem (the +`EffectivePassbandEdges_Hz` normalization — display-side counterpart of the same `MD` bug — plus +the three rate-derived axes), ui-state-machine (menu content is data, not states: the new menu +needed no StateSmith regeneration), mode-state-machine (`TO_SSB_MODE` was front-panel-only, so +CAT could enter CW and never leave), tune-frequency-control, iq-imbalance-correction, +hardware-platform (I2S clock is fractional; HIL measures ~-180 ppm), overview, usb-audio, +documentation-todos. index.md: 44→47 content pages (firmware 22→25). + +**Suggested next:** the "why 176.4 ksps" question is unanswered anywhere in the tree — worth +asking the owner, because if the answer is USB-audio resampling (22.05 kHz being an exact 1:2 of +44.1 where 24 kHz needs 147:160) it belongs on roadmap/usb-audio and changes how that feature is +scoped. Also worth a bench follow-up: loop-budget and group delay at 176.4 vs 192 ksps, which +[[real-time-constraints]] currently only characterises at 192. + +--- + +## [2026-07-29] decision | transmit filter HIL suite + the FIR rate-independence limit + +**Trigger:** the human asked for a transmit-side equivalent of the receive filter HIL test +(`code/tools/filter_hil/`), with the AD2's W1 on the microphone input and Ch1/Ch2 on the exciter +I/Q outputs in unknown order. Built `code/tools/tx_filter_hil/` (10 modules, README, and a +`/transmit-filter-test` skill). This entry records what the work *taught*, not the tool inventory. + +**New page:** [[tx-filter-hil-test]]. + +### The load-bearing finding: rate invariance is not one number + +Replicating `CalcFIRCoeffs` in Python and evaluating the generated tap sets directly shows the +two Hz-specified **transmit** stages (`TX_DECIMATE3_FC_HZ` 3500, `TX_AUDIO_LPF_FC_HZ` 3039.6) +give a cascade −3 dB corner of **2726 Hz at 24 ksps but 2759 Hz at 22.05 ksps — +1.2 %**, on +correct firmware. Cause: both are **48-tap** Kaiser windowed sincs, and a fixed tap count cannot +place a corner exactly when the normalised cutoff moves; the taps quantise onto the same 48 +positions at both rates. + +This bounds any rate-invariance tolerance. The receive suite's 1.5 % is affordable only because +those stages are **IIR**, bilinear-transformed from prewarped analog prototypes — a continuous +parameter, hence the measured 0.3 %. Applying 1.5 % to the transmit stages would fail correct +firmware, so the transmit suite uses **2.5 %**; `TransmitChain176k.AudioBandwidthHoldsAcrossRates` +already allowed 2 % for the same reason, which corroborates it. The bug signature is still +−8.125 %, leaving better than 3×. + +Filed into [[runtime-filter-design]] (new section, with the table), and referenced from +[[filter-hil-test]] (qualifying *why* 1.5 % is affordable there) and [[multirate-decimation]]. + +The same evaluation gave the transmit stopband profile — −21.6 dB at 3.5 kHz, **−52 dB at 4 kHz**, +>90 dB above 4.5 kHz. That corrected a mistake in the suite: an early draft demanded 30 dB of +out-of-band rejection at 3450 Hz, which is on the **transition skirt** and only ~20 dB down +*correctly*. The stopband boundary is now taken as 4 kHz. + +### Other findings recorded + +- **`TX;` / `RX;` are parameterless *writes*** — three characters, no reply (handlers return + `empty_string_p`, which `command_parser` suppresses). Any CAT client inferring "3 chars ⇒ read" + blocks for a full read timeout on every key/unkey. → [[cat-control]], with the corollary that + `TX_write` silently does nothing outside `SSB_RECEIVE`/`CW_RECEIVE`, so the CAT reply cannot tell + a client whether the radio keyed. +- **The Hilbert table is correctly *not* regenerated per rate.** Its usable band is a fraction of + Fs, so one fixed table is the same design at any rate and its edges are *meant* to scale. Hence + sideband suppression is checked against a floor, not for rate invariance — requiring it to hold + still in hertz would fail correct firmware. → [[ssb-phasing-method]]. +- **Sideband suppression is directly measurable** from a synchronous I/Q capture (`I + jQ`, ratio + of `+f` to `−f`); and `SidebandSelection()`'s USB inversion doubles as the *only* way to resolve + which scope probe is on I, since swapping probes and switching sideband both conjugate the + signal and one capture cannot distinguish them. → [[ssb-phasing-method]]. +- **`BandEQ` runs before `TXDecimateBy2Again`**, so it attenuates high mic input before the stage + whose stopband prevents fold-back — which makes an end-to-end fold-back test weaker evidence + about the decimator than it appears. Also `Q := I` after `TXGain` (chain is mono from there, + only mic-left matters) and `TXGain` scaling with requested power (exciter amplitude only + comparable at fixed power). → [[dsp-chain]]. +- **The transmit EQ cells are not independently verifiable**, because `S_Xmt[i].pCoeffs` and + `S_Rec[i].pCoeffs` are the *same array* — a transmit instance's only own state is `pState`. So + no `equalizerXmt` CAT command was added, and the cells are exercised via the composite passband + instead, where the ~200 Hz low corner is cell 0's. → [[audio-equalizer]], [[cat-control]]. +- **Measurement trap worth keeping:** the scope rate must not divide the radio's output rate. At + 96 ksps a DAC image at `192000 − f` aliases to exactly `−f`, onto the mirror frequency the + suppression reading uses. 100 kHz is the default for that reason. + +**Pages updated:** runtime-filter-design (new FIR-vs-IIR section + stopband profile + bench +verification split), filter-hil-test (companion box, tolerance qualified), cat-control (TX/RX +write trap, missing `equalizerXmt`, `TX_write` state guard), ssb-phasing-method (Hilbert rationale ++ bench suppression measurement), multirate-decimation (FIR caveat + per-rate fold-point table), +audio-equalizer (testability corollary), dsp-chain (TransmitProcessing ordering). index.md: +47→48 content pages (firmware 25→26). + +**Open / next:** the suite has **not been run on the bench** — everything above is from tap-set +evaluation, self-tests (48, incl. a simulated −8.125 % shift that must FAIL and must be *named*), +and an end-to-end simulation driven by the replicated FIR cascade (correct → PASS at +1.23 %, +frozen → FAIL). Two things to watch on the first real run: `--scope-offset` defaults to 1.6 V from +the older `transmit_test.py`, which assumed the exciter loaded by the RF board, so the bias may +differ with it disconnected; and the composite low corner mixes cell 0 with the mic input's AC +coupling, which is the one case where an `equalizerXmt` command would earn its keep. + +--- + +## [2026-07-29] lint | README version history — two wiki figures corrected + +**Trigger:** asked to audit the top-level README, then to write the missing V1.3 / V1.4.0 release +notes. Sourcing numbers for those notes from the code and from the HIL result JSON turned up two +errors in wiki pages. + +### 1. Shipped spectrum rate is 15.6 fps, not 18.8 + +[[spectrum-refresh-floor]] recorded "**SHIPPED outcome: 11.7 → 18.8 fps**" with `NCHUNKS = 5`. +`NCHUNKS` is **6** in the tree (`MainBoard_DisplayHome.cpp:430`) → ≈64 ms → **15.6 fps**. + +Traced with `git log -L`: 4 → 8 (`53ccfa9`) → 6 (`744d61d`, "15.6 fps") → 5 (`d15b17e`, "18.8 fps") +→ **6** (`f56c8c7`). That last commit is the **V1.3 release stamp** — it also bumped `VERSION` to +`"Phx V1.3"` — but its subject is "Add serial time sync over USB Serial port 0", and `b63f090` +carries an identical subject the same day, so the revert rode in on what looks like a rebase +artefact. Intent is not recoverable from the history; recorded as an open question for the owner, +since if accidental it is a one-line change to recover 18.8 fps. The page now states the shipped +figure and keeps the developed figure as such. + +### 2. HIL result summary was imprecise, and the SSB control figure was wrong + +[[filter-hil-test]] summarised the bench run as "every CW corner and equaliser centre within +**0.3 %**" and the SSB control as "**0.04 %**". Recomputed from +`results/filter_hil_20260728_204015.json` (the 95-pass run): + +| Group | Worst \|Δ\| | +|---|---| +| CW audio filters (5) | 0.033 % | +| EQ cells excluding edge limited (11) | 0.160 % | +| EQ cells edge limited (0, 1, 13) | 0.711 / 0.367 / 0.206 % | +| SSB control (3 widths) | **0.093 %** | + +So "0.3 %" holds *only* once the edge-limited cells are set aside — and pleasingly, the three worst +cells are exactly the three the suite already flags as edge limited, which corroborates that +classification rather than undermining it. The SSB figure was simply wrong. Replaced the prose +summary with the table. + +Deliberately **not** propagated: five other pages quote 0.3 % for receive rate invariance +([[runtime-filter-design]], [[audio-equalizer]], [[cw-processing]], [[multirate-decimation]], +[[tx-filter-hil-test]]). All are consistent with the 0.160 % measurable-cell figure, so they stand; +churning them would add noise. The FIR-vs-IIR contrast in [[runtime-filter-design]] is unaffected — +the TX ≈1.2 % is an exact tap-set evaluation, the RX 0.16 % a measurement, and the gap is real. + +**README changes (not wiki, recorded for traceability):** wrote the missing V1.3 and V1.4.0 release +notes; fixed `code/Contributors.txt` → `code/src/PhoenixSketch/Contributors.txt`; removed the +non-existent `TuneSm` from the architecture section (the tune state is `HandleTuneState` in +`HardwareSm.cpp`); "160m to 6m" → "160m to 4m plus general coverage" (13 bands incl. GEN); +feature list gained all four auto-calibration routines and the selectable sample rate; added +`code/tools` and `wiki/` to File Organization; refreshed the ctest sample output 657 → 740 from a +real run. + +**Open:** the `NCHUNKS` intent question above is the one item needing the owner. + +## [2026-07-30] decision | `TX` must accept its optional parameter (`TX0;`/`TX1;`/`TX2;`) + +Started as a bug in `code/tools/serial_diag.py`, which sent `TX1;` and got `?;`. The first fix +changed the tool to send `TX;`. Checking `code/docs/ts_480_pc.pdf` p.21 showed the firmware was +the wrong side: the set form is `TX P1;`, P1 is 0 (normal/MIC), 1 (DTS via ANI) or 2 (TX Tune), +and **"if no P1 parameter is specified, P1=0 is used"** — so all four forms are legal. + +Not pedantic: Hamlib (WSJT-X, fldigi, Pat) picks the form from the PTT type — `TX;` for +`RIG_PTT_ON`, `TX0;` for `RIG_PTT_ON_MIC`, `TX1;` for `RIG_PTT_ON_DATA` — so Phoenix keyed for +some clients and refused for others depending on the user's data-mode settings. That matches the +owner's recollection of it working on one OS but not another. + +**Decisions:** accept every P1 value and ignore it (Phoenix has neither a data input nor a tune +mode to distinguish); also accept TS-2000-style `RX0;`/`RX1;`, which `CAT_test.cpp` already +exercised. + +**Implementation:** `{ "TX", 3+1, 3, TX_write, TX_write }` and the same shape for `RX`. The idiom +for an optional parameter is the *write* function in both slots — `set_len` the parameterised +form, `read_len` the bare one. No `TX_read`: it would make `TX;` read instead of key, breaking +`RIG_PTT_ON` and both HIL suites. Also guarded `command_parser`'s two length tests with `> 0`, +closing a latent `command[-1]` out-of-bounds read affecting the nine entries with a zero length +field (`ID`, `IF`, `PD`, `ED`, `PR` set_len 0; `BD`, `BU` read_len 0). + +**Method note worth keeping:** `CAT_test.cpp` already asserted TX accepted all three forms — but +called `TX_write()` directly, and `TX_write` ignores its argument. The suite passed for the whole +life of the bug because it never exercised the dispatcher that was rejecting them. New tests go +through `command_parser()`; they were confirmed failing before the fix. 745/745 pass after. + +Updated [[cat-control]]. **Open:** the rest of the command table has never been audited against +the spec, and `TX`/`RX` were wrong, so others may be. Noted on the page. + +## [2026-07-30] feature | DIGITAL (USB audio) mode + +Added a third operating mode alongside SSB and CW, for digital modes over USB audio. Closes the +scoping on [[usb-audio]] (#13); design and code map written up in [[digital-mode]]. + +**The load-bearing insight.** Teensy USB audio is a fixed 44.1 kHz endpoint, and at 176.4 ksps +three things line up exactly: the receive chain's Fs/4 tap *is* 44,100 Hz; one DSP block there +*is* 512 samples (86.1328 blocks/s × 512 = 44,100/s); and the AudioStream graph clock (Fs/128 = +1378.125 Hz) is exactly 4× the USB audio block rate. So the mode forces 176.4 ksps and needs no +resampler and no modified Teensy core file. The rate switch lives on the enter/exit actions of a +`DIGITAL_STATES` composite, which is what makes it restore on every exit path including +calibration. + +**Reused rather than rebuilt.** The stock `AudioInputUSB`/`AudioOutputUSB` (what OpenAudio's +`USB_Audio_F32.h` wraps) are kept, with all the core descriptor/DMA/ISR/feedback code. They +cannot go in the AudioConnection graph — it is clocked by I2S, 4× too fast — so they are taken +off `update_all()` via the protected `AudioStream::active` flag and driven by a 4:1 pacer. +~120 lines of adapter instead of a reimplemented transport. + +**Two corrections recorded.** +1. `code/docs/USB_Audio_TX_Diagnostic_Plan.md:152-158` claims a 0.27 %/s structural sample + deficit at 192 ksps. It is an arithmetic error — 94 blocks/s used where the true rate is + 93.75, and 93.75 × 512 = 48,000 exactly. Noted on [[usb-audio]] so it is not chased again. +2. [[usb-audio]]'s "possible shortcut" reasoned from the Fs/8 audio rate (22.05 kHz, 1:2 to + 44.1). Right instinct, wrong tap point: Fs/4 needs no ratio at all. + +**Bug the new tests caught.** Because `EnterDigitalMode()`/`ExitDigitalMode()` are the +*composite's* actions, they run while `state_id` is still `DIGITAL_STATES` — before the leaf is +entered. `ChangeSampleRate()` ends in `UpdateTuneState()`, which fell through to `default:` and +reprogrammed the VFO from a stale tune state on every entry and exit. Fixed by handling the +composite in `UpdateTuneState()` and `UpdateRFHardwareState()`; pinned by +`ModeSm.DigitalModeTransitionsHandleTheCompositeState`, which asserts against the mock Serial's +captured lines. + +**Build change with a user-visible consequence:** `usb=serialmidiaudio` has only one CDC port, +so CAT moves to the primary `Serial` (new `CATSerial` alias in `SDT.h`) and `Debug()` compiles +out. CAT clients must be repointed. `MD` is deliberately inert on the mode — WSJT-X sends `MD2;` +constantly and would otherwise knock the radio out of digital mode. + +765/765 unit tests pass (745 before, 20 new); both `usb=serialmidiaudio` and `usb=serial2` +firmware builds compile. **Nothing is verified on hardware yet** — see the open items on +[[digital-mode]]. + +## [2026-07-31] bench | Digital mode verified on hardware; two USB-audio faults and a CAT sideband bug fixed + +First hardware run of [[digital-mode]]. Enumerates as `Teensy MIDI/Audio` at 44100 Hz both +directions with the async feedback endpoint live. Injected 7075 kHz carrier, dial 7074 kHz. + +**Headline result: no pitch error.** Tone measured 999.57 Hz; the −0.43 Hz offset is 0.06 ppm +of the carrier, i.e. generator-vs-radio calibration. First and last 5 s of a 20 s capture +differ by 0.009 Hz, below the measurement floor. The 4:1 pacer holds exact rate — a divisor +error would have shown as a 4× or 25 % ratio. + +**Fault 1 — play-queue underrun.** 147 dropouts / 903 ms in 12 s (7.55 %). Every zero run was +an exact multiple of AUDIO_BLOCK_SAMPLES, spaced ~133 ms: `AudioOutputUSB::update()` +substitutes a *silence block* when its input queue is empty, so an empty queue reads as clean +digital silence rather than a glitch. The queue was capped at 8 blocks and never prefilled, so +it lived at depth 0–4 while the DSP inherently swings it by 4 blocks every 11.6 ms — no +underrun margin at all. Display refreshes are the likely trigger. Now 24 blocks prefilled to +half: **0 dropouts in 20 s**. + +**Fault 2 — no headroom.** Stream sat at 98 % FS. This is *not* AGC: `ED.agc` was already +`AGCOff`, and that path applies `fixed_gain = 20.0`, a compile-time constant, so the USB level +is RF input × chain gain × 20 with nothing regulating it. Added `ED.digitalRxLevel` (default +25 = −12 dB, Microphone menu + CAT `DR`), scaled into scratch because the caller still needs +that buffer for the speaker. Peak −0.2 → −12.3 dBFS and 2nd harmonic −58.8 → −64.5 dB, so it +*was* mildly clipping. + +**Pre-existing bug found and fixed: CAT sideband selection.** `MD2;` on 40 m tuned the radio to +LSB. `SetModulation()` wrote `bands[].mode`, which is the band *default* and the reference the +passband mirroring is measured against; making it agree with the request switches the mirroring +off. `MD_read`/`IF_read` read the same field and misreported the mode in use. Details and the +corrected model on [[cat-control]]. Shared SSB/CW code, unrelated to digital mode. + +**Method notes.** (1) A test asserting `bands[].mode` after a mode change was asserting the +bug, and passed for its whole life; the replacement asserts the effective passband. (2) I +diagnosed the sideband from a single `MD;` read and then *wrote* `MD2;` to "fix" it, which +broke a working bench setup mid-test — the read was itself the buggy one. Capturing 2 s of +audio would have answered the question directly and without side effects. + +776/776 unit tests pass. Transmit, end-to-end FT8, and long-run clock drift remain unverified — +see the open list on [[digital-mode]]. + +## [2026-07-31] bench | Transmit verified; record queue was starving the audio pool + +Transmit works: sideband sense flips correctly (USB -89.99 deg / +41.0 dB image, LSB ++90.12 deg / -41.2 dB), imbalance -0.16 dB, IMD3 -51 dB, stable over a 12 s key-down. + +**Amplitude response** answered the "why do two tones differ" question: a real SSB passband, +peak 800 Hz, -3 dB at 2243 Hz, 2.8 dB spread over 200-2200 Hz. It is the cascade of the TX +decimate-by-2 and TX audio bandwidth filters, both by design. Not the Hilbert transform - +computed from its coefficient tables it is flat to 0.01 dB above 200 Hz. + +**The real find:** a 344.53 Hz (= 44100/128) envelope modulation, proven radio-side by varying +the host ALSA period size and watching it not move. New `DS` CAT counters showed underruns and +trims were zero but `depthMax = 208` - the transmit record queue is begun for all of digital +mode yet only drained while transmitting, so it sat at AudioRecordQueue's 209-block ceiling and +held ~418 of the 500 audio blocks. Bounding it in the pacer took +/-344 Hz sidebands from +-27 dBc to -74.5 dBc, the broadband floor from -65 to -84.6 dBc, and envelope ripple from +0.53 dB to 0.06 dB. + +**Method notes.** Two of my own measurements were wrong before they were right. (1) The first +frequency sweep evaluated the DTFT at the *assumed* tone frequency; as the frequency estimate +drifted it walked out of the Hann mainlobe and read as deep notches, inventing a 17 dB ragged +response. Re-analysing identical raw data both ways reproduced the artifact exactly. Save raw +traces. (2) From the same artifact I claimed a 0.6 % transmit pitch shift; zero-crossing +analysis gives 2000.27 Hz for 2000 Hz in, and the I2S clock computes to exactly 176400.0000 Hz, +so there is none. (3) An early "29 ms" dip period was 2.9 ms aliased by a 1 ms-per-character +ASCII plot. + +776/776 unit tests pass. Open: residual +/-86 Hz sidebands at -27 dBc, end-to-end FT8, transmit +long-run drift, and the single-VFO radio. + +## [2026-07-31] bench | The +/-86 Hz sidebands were a resolution artifact; queue fix also improved receive + +Chased the residual +/-86 Hz transmit sidebands reported in the previous entry. They do not +exist. Those captures were 40.96 ms -> 24.4 Hz bins, putting +/-86 Hz only 3.5 bins from the +carrier, i.e. inside its skirt. At 170 ms (5.88 Hz bins, 14.6 bins out) the same measurement +reads -93 dBc rather than -27. + +Plotting the raw envelope showed what was really there before the record-queue fix: discrete +ringing transients at irregular intervals, flat between them - not a modulation. Impulsive +events smear the carrier into a broadband pedestal (+/-600 Hz at -40 to -60 dBc), and probing +that pedestal at +/-86 Hz just sampled it somewhere. The 344.53 Hz result from the previous +entry stands - that was 683 ms / 1.5 Hz bins and independently confirmed by varying the ALSA +period size. + +Also re-ran the receive comparison once the signal generator was back on. The record-queue fix, +made for transmit, improved receive by **17.5 dB in 2nd harmonic (-64.5 -> -82.0 dB) and 16 dB +in noise floor (-119.3 -> -135.4 dB)**, with 0 dropouts in 60 s and L/R bit-identical. Starving +the audio pool was degrading both directions. + +**Method note:** before believing a close-in spur, count the FFT bins. Anything within ~5 bins +of the carrier is skirt until proven otherwise. I asserted a spur at 3.5 bins twice. + +## [2026-07-31] lint | Pre-release consistency pass (wiki + README) + +Checked the wiki and the README release notes against the tree ahead of making the repository +public. 49 pages, no orphans, no broken navigational wikilinks (the four unresolved ones are +historical prose inside this log and the schema examples in [[CLAUDE]]). + +**Found stale and fixed.** [[digital-mode]] was written as a page but not integrated into the +pages whose *code* it changed: + +- [[development-backlog]] still listed #13 as "under active debugging; not yet wired in" and + sequenced it behind [[openaudio-library]] (#14). #13 shipped first and without #14, so the + two-item "audio-plumbing track" no longer exists. +- [[hardware-state-machine]] omitted the DIGITAL states from both switch tables — including the + `DIGITAL_STATES` composite case, which [[digital-mode]] itself calls the load-bearing gotcha. +- [[persistent-config]] was missing `digitalDriveLevel` / `digitalRxLevel`. +- [[overview]] had no `USBAudio.cpp` in the module map and described ModeSm as SSB/CW only. + +**Lesson for the next feature page.** Writing the feature's own page and updating the pages it +*touches* are separate jobs, and the second is the one that gets skipped: the 2026-07-30/31 +commit updated 8 wiki pages, all of them ones that mention digital mode by name, and none of the +four above, which describe code the same commit edited. Diffing the commit's source-file list +against the pages that document those files finds this in a minute. + +**README.** The V1.4.0 release notes predated digital mode entirely — no feature entry, CAT +table still at 29 commands (it is 32), test count at 740 (776), and the build instructions named +Dual Serial without mentioning that digital mode needs Serial + MIDI + Audio and moves CAT to the +first port. Also missing from the bug list: the `bands[].mode` sideband inversion, the optional +`TX;` parameter, and the two digital-mode buffering fixes. + +Verified while checking: both firmware configurations compile clean (`usb=serial2` and +`usb=serialmidiaudio`, 600 MHz, o1lto), and 779/779 unit tests pass — 776 committed plus 3 +uncommitted transmit-chain tests in the working tree. diff --git a/wiki/raw/.gitkeep b/wiki/raw/.gitkeep new file mode 100644 index 0000000..82d22f6 --- /dev/null +++ b/wiki/raw/.gitkeep @@ -0,0 +1 @@ +# Drop immutable source documents here. The LLM reads from raw/ but never edits it. diff --git a/wiki/raw/DualClockLO.kicad_sch b/wiki/raw/DualClockLO.kicad_sch new file mode 100644 index 0000000..9ddcc95 --- /dev/null +++ b/wiki/raw/DualClockLO.kicad_sch @@ -0,0 +1,7407 @@ +(kicad_sch + (version 20250114) + (generator "eeschema") + (generator_version "9.0") + (uuid "19e7ad66-8f4f-49d3-ad58-95c831b9d6b3") + (paper "A4") + (title_block + (title "Si5351A-B-GM Breakout Board") + (date "2025-12-27") + (rev "2") + (company "Oliver King, KI3P") + ) + (lib_symbols + (symbol "+3V3_1" + (power) + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3V3\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+3V3_1_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+3V3_1_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector:Conn_01x03_Pin" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x03_Pin" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x03, script generated" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_locked" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x03_Pin_1_1" + (rectangle + (start 0.8636 2.667) + (end 0 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type outline) + ) + ) + (rectangle + (start 0.8636 0.127) + (end 0 -0.127) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type outline) + ) + ) + (rectangle + (start 0.8636 -2.413) + (end 0 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 1.27 2.54) (xy 0.8636 2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 0) (xy 0.8636 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 -2.54) (xy 0.8636 -2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at 5.08 2.54 180) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 0 180) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -2.54 180) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector:Conn_01x04_Socket" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x04_Socket" + (at 0 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x04, script generated" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_locked" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x04_Socket_1_1" + (polyline + (pts + (xy -1.27 2.54) (xy -0.508 2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy -0.508 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -2.54) (xy -0.508 -2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -5.08) (xy -0.508 -5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 2.032) + (mid -0.5058 2.54) + (end 0 3.048) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -0.508) + (mid -0.5058 0) + (end 0 0.508) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -3.048) + (mid -0.5058 -2.54) + (end 0 -2.032) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -5.588) + (mid -0.5058 -5.08) + (end 0 -4.572) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector:Conn_01x06_Socket" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x06_Socket" + (at 0 -10.16 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x06, script generated" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_locked" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x06_Socket_1_1" + (polyline + (pts + (xy -1.27 5.08) (xy -0.508 5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 2.54) (xy -0.508 2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy -0.508 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -2.54) (xy -0.508 -2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -5.08) (xy -0.508 -5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -7.62) (xy -0.508 -7.62) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 4.572) + (mid -0.5058 5.08) + (end 0 5.588) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 2.032) + (mid -0.5058 2.54) + (end 0 3.048) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -0.508) + (mid -0.5058 0) + (end 0 0.508) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -3.048) + (mid -0.5058 -2.54) + (end 0 -2.032) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -5.588) + (mid -0.5058 -5.08) + (end 0 -4.572) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -8.128) + (mid -0.5058 -7.62) + (end 0 -7.112) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -7.62 0) + (length 3.81) + (name "Pin_6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:C" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "C_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_0_1" + (polyline + (pts + (xy -2.032 0.762) (xy 2.032 0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.032 -0.762) (xy 2.032 -0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "C_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:Crystal" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Y" + (at 0 3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Crystal" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Two pin crystal" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "quartz ceramic resonator oscillator" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Crystal*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Crystal_0_1" + (polyline + (pts + (xy -2.54 0) (xy -1.905 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.905 -1.27) (xy -1.905 1.27) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.143 2.54) + (end 1.143 -2.54) + (stroke + (width 0.3048) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.905 -1.27) (xy 1.905 1.27) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 0) (xy 1.905 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Crystal_1_1" + (pin passive line + (at -3.81 0 0) + (length 1.27) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 1.27) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:L" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "L" + (at -1.27 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "L" + (at 1.905 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Inductor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "inductor choke coil reactor magnetic" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Choke_* *Coil* Inductor_* L_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "L_0_1" + (arc + (start 0 2.54) + (mid 0.6323 1.905) + (end 0 1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 1.27) + (mid 0.6323 0.635) + (end 0 0) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 0) + (mid 0.6323 -0.635) + (end 0 -1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -1.27) + (mid 0.6323 -1.905) + (end 0 -2.54) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "L_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:R" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "R" + (at 2.032 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "R" + (at 0 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -1.778 0 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "R res resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "R_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "R_0_1" + (rectangle + (start -1.016 -2.54) + (end 1.016 2.54) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "R_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Jumper:SolderJumper_2_Bridged" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (property "Reference" "JP" + (at 0 2.032 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Bridged" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Solder Jumper, 2-pole, closed/bridged" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "solder jumper SPST" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SolderJumper*Bridged*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "SolderJumper_2_Bridged_0_1" + (rectangle + (start -0.508 0.508) + (end 0.508 -0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy -0.254 1.016) (xy -0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 -1.016) + (mid -1.2656 0) + (end -0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 -1.016) + (mid -1.2656 0) + (end -0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start 0.254 1.016) + (mid 1.2656 0) + (end 0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0.254 1.016) + (mid 1.2656 0) + (end 0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 0.254 1.016) (xy 0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "SolderJumper_2_Bridged_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Jumper:SolderJumper_2_Open" + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "JP" + (at 0 2.032 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Solder Jumper, 2-pole, open" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "solder jumper SPST" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SolderJumper*Open*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "SolderJumper_2_Open_0_1" + (polyline + (pts + (xy -0.254 1.016) (xy -0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 -1.016) + (mid -1.2656 0) + (end -0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 -1.016) + (mid -1.2656 0) + (end -0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start 0.254 1.016) + (mid 1.2656 0) + (end 0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0.254 1.016) + (mid 1.2656 0) + (end 0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 0.254 1.016) (xy 0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "SolderJumper_2_Open_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Mechanical:MountingHole" + (pin_names + (offset 1.016) + ) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (property "Reference" "H" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MountingHole" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Mounting Hole without connection" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "mounting hole" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "MountingHole*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MountingHole_0_1" + (circle + (center 0 0) + (radius 1.27) + (stroke + (width 1.27) + (type default) + ) + (fill + (type none) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Oscillator:Si5351A-B-GM" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Y" + (at -12.7 21.59 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Si5351A-B-GM" + (at -13.97 -22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_DFN_QFN:QFN-20-1EP_4x4mm_P0.5mm_EP2.7x2.7mm" + (at 0 -30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.silabs.com/documents/public/data-sheets/Si5351-B.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "I2C Programmable Any-Frequency CMOS Clock Generator, QFN-20" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "CMOS Synth Oscillator I2C" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "QFN*1EP*4x4mm*P0.5mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Si5351A-B-GM_1_1" + (rectangle + (start -12.7 20.32) + (end 12.7 -20.32) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (pin input line + (at -15.24 17.78 0) + (length 2.54) + (name "XA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -15.24 12.7 0) + (length 2.54) + (name "XB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -15.24 -2.54 0) + (length 2.54) + (name "A0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -15.24 -5.08 0) + (length 2.54) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -15.24 -7.62 0) + (length 2.54) + (name "SCL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -15.24 -15.24 0) + (length 2.54) + (name "OEB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -15.24 -17.78 0) + (length 2.54) + (name "SSEN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -5.08 22.86 270) + (length 2.54) + (name "VDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -2.54 22.86 270) + (length 2.54) + (name "VDDOA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 22.86 270) + (length 2.54) + (name "VDDOB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -22.86 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "21" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 2.54 22.86 270) + (length 2.54) + (name "VDDOC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 5.08 22.86 270) + (length 2.54) + (name "VDDOD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 15.24 17.78 180) + (length 2.54) + (name "CLK0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 15.24 12.7 180) + (length 2.54) + (name "CLK1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 15.24 7.62 180) + (length 2.54) + (name "CLK2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 15.24 2.54 180) + (length 2.54) + (name "CLK3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 15.24 -2.54 180) + (length 2.54) + (name "CLK4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 15.24 -7.62 180) + (length 2.54) + (name "CLK5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 15.24 -12.7 180) + (length 2.54) + (name "CLK6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 15.24 -17.78 180) + (length 2.54) + (name "CLK7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "SparkFun-Qwiic:qwiic_Logo" + (pin_names + (offset 1.016) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board no) + (property "Reference" "G" + (at 0 3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "qwiic_Logo" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "SparkFun Qwiic I2C" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "qwiic_Logo_0_0" + (polyline + (pts + (xy -5.4327 -0.8446) (xy -5.2808 -0.8039) (xy -5.1544 -0.733) (xy -5.0492 -0.629) (xy -4.9612 -0.4891) + (xy -4.9388 -0.4442) (xy -4.9077 -0.3735) (xy -4.8888 -0.3096) (xy -4.878 -0.2364) (xy -4.8713 -0.1381) + (xy -4.8691 -0.0268) (xy -4.8861 0.154) (xy -4.9313 0.3092) (xy -5.006 0.4432) (xy -5.1118 0.5598) + (xy -5.1427 0.5863) (xy -5.261 0.6623) (xy -5.3915 0.7052) (xy -5.544 0.7187) (xy -5.5765 0.7181) + (xy -5.7259 0.6986) (xy -5.8545 0.6485) (xy -5.9707 0.5648) (xy -6.0239 0.5125) (xy -6.1186 0.3839) + (xy -6.1815 0.2359) (xy -6.2139 0.0648) (xy -6.2171 -0.1327) (xy -6.208 -0.2303) (xy -6.1669 -0.4073) + (xy -6.0959 -0.5571) (xy -5.9957 -0.6791) (xy -5.8667 -0.7722) (xy -5.7097 -0.8355) (xy -5.6837 -0.8418) + (xy -5.5963 -0.8532) (xy -5.5114 -0.8538) (xy -5.4327 -0.8446) + ) + (stroke + (width 0.01) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 1.114 -2.7667) (xy 6.0472 -2.7606) (xy 6.2463 -2.7148) (xy 6.337 -2.6928) (xy 6.6505 -2.5964) + (xy 6.9363 -2.4737) (xy 7.1992 -2.3218) (xy 7.4443 -2.1381) (xy 7.6763 -1.9197) (xy 7.765 -1.8236) + (xy 7.9726 -1.5605) (xy 8.1416 -1.2836) (xy 8.2724 -0.992) (xy 8.3654 -0.6847) (xy 8.4209 -0.3609) + (xy 8.4393 -0.0196) (xy 8.4383 0.0655) (xy 8.4145 0.3752) (xy 8.3579 0.6676) (xy 8.2664 0.9511) + (xy 8.138 1.234) (xy 8.0972 1.3103) (xy 7.9176 1.5925) (xy 7.7084 1.847) (xy 7.4711 2.0726) (xy 7.2073 2.2681) + (xy 6.9187 2.4323) (xy 6.6067 2.5639) (xy 6.273 2.6617) (xy 6.2589 2.6648) (xy 6.2405 2.6684) + (xy 6.2191 2.6716) (xy 6.1933 2.6747) (xy 6.1617 2.6775) (xy 6.1229 2.6801) (xy 6.0753 2.6825) + (xy 6.0178 2.6847) (xy 5.9488 2.6867) (xy 5.8669 2.6886) (xy 5.7707 2.6902) (xy 5.6588 2.6917) + (xy 5.5298 2.693) (xy 5.3823 2.6942) (xy 5.2149 2.6953) (xy 5.0261 2.6962) (xy 4.8146 2.697) (xy 4.579 2.6977) + (xy 4.3178 2.6982) (xy 4.0296 2.6987) (xy 3.7131 2.6991) (xy 3.3667 2.6994) (xy 2.9892 2.6997) + (xy 2.579 2.6999) (xy 2.1348 2.7) (xy 1.6552 2.7001) (xy 1.1388 2.7001) (xy 0.5841 2.7001) (xy -0.0102 2.7001) + (xy -6.1292 2.7001) (xy -6.3505 2.644) (xy -6.4841 2.607) (xy -6.7964 2.4938) (xy -7.0847 2.3484) + (xy -7.3523 2.1691) (xy -7.6022 1.9541) (xy -7.8228 1.7179) (xy -8.0199 1.4516) (xy -8.1801 1.1677) + (xy -8.3036 0.8654) (xy -8.3907 0.5442) (xy -8.4419 0.2033) (xy -8.4512 -0.0999) (xy -8.4229 -0.4124) + (xy -8.358 -0.7268) (xy -8.2573 -1.037) (xy -8.2016 -1.1697) (xy -8.0521 -1.4517) (xy -7.87 -1.7127) + (xy -7.6584 -1.9504) (xy -7.4205 -2.1625) (xy -7.1593 -2.3467) (xy -6.878 -2.5006) (xy -6.5797 -2.6219) + (xy -6.2674 -2.7084) (xy -5.9444 -2.7576) (xy -5.922 -2.759) (xy -5.8567 -2.7613) (xy -5.7613 -2.7635) + (xy -5.6429 -2.7656) (xy -5.5083 -2.7673) (xy -5.3644 -2.7686) (xy -4.8664 -2.772) (xy -4.8664 -2.0042) + (xy -4.8664 -1.2363) (xy -4.988 -1.3553) (xy -5.0139 -1.3798) (xy -5.1784 -1.503) (xy -5.3644 -1.5917) + (xy -5.5706 -1.6453) (xy -5.7956 -1.6632) (xy -6.0087 -1.6503) (xy -6.2442 -1.6015) (xy -6.468 -1.5153) + (xy -6.6423 -1.4122) (xy -6.8101 -1.2696) (xy -6.9545 -1.0983) (xy -7.0706 -0.9035) (xy -7.1159 -0.8066) + (xy -7.1662 -0.6802) (xy -7.2032 -0.5549) (xy -7.2309 -0.4168) (xy -7.2531 -0.2517) (xy -7.2645 -0.0773) + (xy -7.2559 0.1553) (xy -7.2228 0.3848) (xy -7.1667 0.6002) (xy -7.0895 0.7905) (xy -6.9738 0.984) + (xy -6.8224 1.164) (xy -6.645 1.3131) (xy -6.4435 1.4296) (xy -6.2198 1.512) (xy -6.2168 1.5128) + (xy -6.0991 1.5354) (xy -5.9587 1.5479) (xy -5.8081 1.5506) (xy -5.6599 1.5435) (xy -5.5266 1.5269) + (xy -5.4208 1.5009) (xy -5.3121 1.4578) (xy -5.1345 1.3582) (xy -4.9742 1.2256) (xy -4.8664 1.1205) + (xy -4.8664 1.32) (xy -4.8664 1.5195) (xy -4.3428 1.5195) (xy -3.8192 1.5195) (xy -3.8192 1.5092) + (xy -3.651 1.5092) (xy -3.1359 1.5147) (xy -3.0732 1.5153) (xy -2.9054 1.5158) (xy -2.7765 1.5144) + (xy -2.6848 1.5109) (xy -2.6289 1.5054) (xy -2.607 1.4977) (xy -2.6049 1.4928) (xy -2.5923 1.4545) + (xy -2.5697 1.3821) (xy -2.5383 1.2793) (xy -2.4992 1.1497) (xy -2.4535 0.9973) (xy -2.4024 0.8257) + (xy -2.3469 0.6386) (xy -2.2883 0.4399) (xy -2.2626 0.353) (xy -2.2055 0.1609) (xy -2.152 -0.0169) + (xy -2.1032 -0.1766) (xy -2.0604 -0.3147) (xy -2.0246 -0.4277) (xy -1.9968 -0.512) (xy -1.9783 -0.564) + (xy -1.9702 -0.5801) (xy -1.9654 -0.5681) (xy -1.9499 -0.5201) (xy -1.9252 -0.4397) (xy -1.8924 -0.3308) + (xy -1.8529 -0.1975) (xy -1.8079 -0.0439) (xy -1.7584 0.1259) (xy -1.7059 0.308) (xy -1.6754 0.4138) + (xy -1.6217 0.6001) (xy -1.5705 0.7774) (xy -1.5233 0.9405) (xy -1.4815 1.0844) (xy -1.4467 1.2041) + (xy -1.4202 1.2945) (xy -1.4037 1.3504) (xy -1.3525 1.5202) (xy -0.8571 1.5147) (xy -0.3617 1.5092) + (xy -0.2632 1.1704) (xy -0.2457 1.1103) (xy -0.1592 0.8126) (xy -0.0832 0.5516) (xy -0.017 0.325) + (xy 0.04 0.1304) (xy 0.0886 -0.0344) (xy 0.1296 -0.1717) (xy 0.1636 -0.2838) (xy 0.1915 -0.3731) + (xy 0.2138 -0.4419) (xy 0.2315 -0.4925) (xy 0.2451 -0.5272) (xy 0.2555 -0.5482) (xy 0.2633 -0.558) + (xy 0.2693 -0.5588) (xy 0.2742 -0.5529) (xy 0.2787 -0.5426) (xy 0.2801 -0.5389) (xy 0.2928 -0.4995) + (xy 0.3157 -0.4255) (xy 0.3473 -0.3211) (xy 0.3867 -0.1902) (xy 0.4325 -0.0368) (xy 0.4835 0.1352) + (xy 0.5386 0.3216) (xy 0.5966 0.5185) (xy 0.8908 1.5195) (xy 1.3899 1.5195) (xy 1.4919 1.5192) + (xy 1.6201 1.518) (xy 1.7294 1.5159) (xy 1.8144 1.5132) (xy 1.8695 1.5099) (xy 1.8891 1.5062) + (xy 1.8878 1.5017) (xy 1.8751 1.465) (xy 1.8498 1.3939) (xy 1.8129 1.2913) (xy 1.7656 1.1601) + (xy 1.7087 1.0033) (xy 1.6435 0.8236) (xy 1.5709 0.6241) (xy 1.4919 0.4076) (xy 1.4078 0.1771) + (xy 1.3194 -0.0646) (xy 0.7498 -1.6222) (xy 2.0329 -1.6222) (xy 2.0329 -0.0513) (xy 2.0329 1.5195) + (xy 2.5462 1.5195) (xy 3.0595 1.5195) (xy 3.0595 -0.0513) (xy 3.0595 -1.6222) (xy 3.2649 -1.6222) + (xy 3.2649 -0.0513) (xy 3.2649 1.5195) (xy 3.7782 1.5195) (xy 4.2916 1.5195) (xy 4.2916 -0.0513) + (xy 4.2916 -0.0616) (xy 4.5072 -0.0616) (xy 4.51 0.109) (xy 4.5206 0.2597) (xy 4.5412 0.3904) + (xy 4.5742 0.5118) (xy 4.6219 0.6344) (xy 4.6865 0.7688) (xy 4.7189 0.8272) (xy 4.8331 0.9884) + (xy 4.9744 1.1395) (xy 5.1327 1.2705) (xy 5.2977 1.3713) (xy 5.3343 1.3892) (xy 5.5052 1.4608) + (xy 5.6736 1.5089) (xy 5.8531 1.5366) (xy 6.0574 1.547) (xy 6.3141 1.5503) (xy 6.3197 1.1242) + (xy 6.3252 0.6981) (xy 6.1657 0.6977) (xy 6.0758 0.6938) (xy 5.9577 0.6711) (xy 5.8554 0.6239) + (xy 5.7556 0.5473) (xy 5.6613 0.4359) (xy 5.592 0.2991) (xy 5.5481 0.1445) (xy 5.53 -0.0204) (xy 5.5379 -0.188) + (xy 5.572 -0.3512) (xy 5.6325 -0.5023) (xy 5.7197 -0.634) (xy 5.7811 -0.6969) (xy 5.8788 -0.7612) + (xy 5.9969 -0.8003) (xy 6.1437 -0.8177) (xy 6.3252 -0.8264) (xy 6.3197 -1.2397) (xy 6.3141 -1.653) + (xy 6.119 -1.6559) (xy 6.0236 -1.6559) (xy 5.821 -1.6423) (xy 5.6365 -1.6074) (xy 5.4566 -1.5482) + (xy 5.2677 -1.4615) (xy 5.1266 -1.3784) (xy 4.9456 -1.2329) (xy 4.7938 -1.0591) (xy 4.6732 -0.8591) + (xy 4.6423 -0.7948) (xy 4.5921 -0.6805) (xy 4.5558 -0.5768) (xy 4.5314 -0.4734) (xy 4.5165 -0.3599) + (xy 4.5092 -0.2261) (xy 4.5072 -0.0616) (xy 4.2916 -0.0616) (xy 4.2916 -1.6222) (xy 3.7782 -1.6222) + (xy 3.2649 -1.6222) (xy 3.0595 -1.6222) (xy 2.5462 -1.6222) (xy 2.0329 -1.6222) (xy 0.7498 -1.6222) + (xy 0.2363 -1.6221) (xy -0.2772 -1.6221) (xy -0.5736 -0.6568) (xy -0.583 -0.626) (xy -0.6413 -0.4378) + (xy -0.696 -0.2633) (xy -0.746 -0.106) (xy -0.7901 0.0304) (xy -0.8272 0.1421) (xy -0.8559 0.2255) + (xy -0.8751 0.277) (xy -0.8836 0.2929) (xy -0.8838 0.2926) (xy -0.8932 0.2679) (xy -0.9134 0.208) + (xy -0.9431 0.1169) (xy -0.9811 -0.0016) (xy -1.0262 -0.1436) (xy -1.0771 -0.3054) (xy -1.1326 -0.483) + (xy -1.1916 -0.6725) (xy -1.4859 -1.6222) (xy -2.0006 -1.6218) (xy -2.5153 -1.6215) (xy -3.0831 -0.0561) + (xy -3.651 1.5092) (xy -3.8192 1.5092) (xy -3.8192 -0.6267) (xy -3.8192 -2.7729) (xy 1.114 -2.7667) + ) + (stroke + (width 0.01) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:ECS-TX053-S3" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 1.27 11.43 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ECS-TX053-S3" + (at 2.54 8.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 -16.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ecsxtal.com/store/pdf/ECS-TXO53-S3.pdf" + (at 1.27 -19.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "HCMOS temperature compensated oscillator" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "TXCO" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Oscillator*SMD*Fox*FT5H*5.0x3.2mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "ECS-TX053-S3_0_1" + (rectangle + (start -5.08 5.08) + (end 5.08 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (polyline + (pts + (xy 0.635 2.54) (xy 1.27 2.54) (xy 1.27 3.81) (xy 1.905 3.81) (xy 1.905 2.54) (xy 2.54 2.54) (xy 2.54 3.81) + (xy 3.175 3.81) (xy 3.175 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "ECS-TX053-S3_1_1" + (pin power_in line + (at -2.54 7.62 270) + (length 2.54) + (name "VDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -2.54 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 3.81 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 7.62 0 180) + (length 2.54) + (name "OUT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+3V3" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3V3\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+3V3_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+3V3_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (hide yes) + (name "+3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:GND" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "GND_1_1" + (pin power_in line + (at 0 0 270) + (length 0) + (hide yes) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + ) + (text_box "Optional: TCXO upgrade" + (exclude_from_sim no) + (at 127 44.45 0) + (size 26.67 48.26) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "0f9d4e2e-7e7b-4d50-af6d-ddc3115bbf6d") + ) + (junction + (at 213.36 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "17e20bc6-d548-4285-9cde-8a0192198dba") + ) + (junction + (at 233.68 130.81) + (diameter 0) + (color 0 0 0 0) + (uuid "3df4e8c5-8593-4e2b-b882-1a69eeb97673") + ) + (junction + (at 163.83 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "5216df29-b1c8-4010-a229-e80db6d9cf3b") + ) + (junction + (at 217.17 53.34) + (diameter 0) + (color 0 0 0 0) + (uuid "679c6fc6-7afa-445a-9d3f-1cea30b37a5f") + ) + (junction + (at 236.22 125.73) + (diameter 0) + (color 0 0 0 0) + (uuid "7da5093a-7697-4886-a820-d5f11f31395b") + ) + (junction + (at 234.95 128.27) + (diameter 0) + (color 0 0 0 0) + (uuid "869f7270-e36e-4297-b33c-a23beaf060e2") + ) + (junction + (at 171.45 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "9b11f462-b577-46ac-98c0-e5a1bcca0eee") + ) + (junction + (at 137.16 80.01) + (diameter 0) + (color 0 0 0 0) + (uuid "a0883646-6a07-4fea-afc5-91c558b77c9d") + ) + (junction + (at 237.49 123.19) + (diameter 0) + (color 0 0 0 0) + (uuid "abcd5381-baf8-4154-b0ff-7d446a5c3fb8") + ) + (junction + (at 162.56 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "af8859fe-7d4d-4272-9fe0-f977b8055e29") + ) + (junction + (at 201.93 50.8) + (diameter 0) + (color 0 0 0 0) + (uuid "b65fe484-8bb7-409c-8ed4-03f7fa5dda16") + ) + (junction + (at 207.01 64.77) + (diameter 0) + (color 0 0 0 0) + (uuid "bacfcee0-3846-4961-a5d0-8315d12a8bab") + ) + (junction + (at 133.35 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "db54e23b-4aa4-4276-a115-6a25f27b2ef2") + ) + (junction + (at 181.61 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "e553f287-d5ce-46dc-b3c6-ca4113d82c3c") + ) + (wire + (pts + (xy 234.95 128.27) (xy 241.3 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "00c4cd26-984b-40fd-9491-209058b72b75") + ) + (wire + (pts + (xy 227.33 128.27) (xy 234.95 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0151e5b8-b1bc-447c-9089-d925fb0583d5") + ) + (wire + (pts + (xy 222.25 80.01) (xy 241.3 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "023db356-cdcd-431a-81d4-9917190225be") + ) + (wire + (pts + (xy 222.25 90.17) (xy 243.84 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0503e07b-8bf8-4a43-b59d-e688a59aec88") + ) + (wire + (pts + (xy 173.99 110.49) (xy 191.77 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0b780d59-f317-425e-8540-443c793f5333") + ) + (wire + (pts + (xy 243.84 85.09) (xy 246.38 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "10857c87-e547-4b7d-b0a3-a42f853f9062") + ) + (wire + (pts + (xy 171.45 90.17) (xy 172.72 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "10ce371c-74d3-44c1-beb9-6c106e5d8522") + ) + (wire + (pts + (xy 198.12 54.61) (xy 198.12 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1ca897fa-d13e-4f53-a473-821a4addb8bc") + ) + (wire + (pts + (xy 223.52 66.04) (xy 220.98 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1e45f013-6404-40c5-8780-3fe72d17a8ac") + ) + (wire + (pts + (xy 242.57 85.09) (xy 242.57 82.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1f05286b-5e63-4602-852f-464ad3a68363") + ) + (wire + (pts + (xy 175.26 72.39) (xy 175.26 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "23375962-c3b0-4203-8769-455c49d69459") + ) + (wire + (pts + (xy 243.84 78.74) (xy 246.38 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2ac3e12a-14b6-421a-9c8f-bfd80f989eb3") + ) + (wire + (pts + (xy 232.41 123.19) (xy 237.49 123.19) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2d114cf7-fa9f-4275-9c58-60b17e4f5f09") + ) + (wire + (pts + (xy 237.49 143.51) (xy 236.22 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "30f2361f-b4b4-4125-822e-fa102f1987ff") + ) + (wire + (pts + (xy 242.57 82.55) (xy 246.38 82.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "330640a0-ed37-4ac4-83de-9dcdef00712b") + ) + (wire + (pts + (xy 190.5 90.17) (xy 190.5 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "36285f63-8c1b-4a63-92fe-d8fcadff8327") + ) + (wire + (pts + (xy 201.93 50.8) (xy 201.93 69.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "38c951c7-b2df-45c9-ad23-711d9654686c") + ) + (wire + (pts + (xy 232.41 125.73) (xy 236.22 125.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3d5f2b8c-e224-45c6-82c7-a2c9463138fb") + ) + (wire + (pts + (xy 180.34 90.17) (xy 181.61 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "406ca6d4-adc8-4dcd-970d-52d1fbc43f33") + ) + (wire + (pts + (xy 212.09 66.04) (xy 213.36 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "44f469cd-1d07-420a-917b-75de760da225") + ) + (wire + (pts + (xy 245.11 99.06) (xy 245.11 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45d590d2-cb46-45ed-bd9b-40051439c2d3") + ) + (wire + (pts + (xy 207.01 53.34) (xy 207.01 64.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "49ea8b93-e04e-4371-a1ff-76b76285ee8a") + ) + (wire + (pts + (xy 198.12 50.8) (xy 201.93 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59434862-f4f3-4b12-bf6a-f6c2567cebc9") + ) + (wire + (pts + (xy 254 104.14) (xy 261.62 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59bd5697-50fc-4854-bb71-f2eaa0e3a231") + ) + (wire + (pts + (xy 209.55 50.8) (xy 201.93 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e081206-9f63-4ac6-b503-532e4fe4cd23") + ) + (wire + (pts + (xy 252.73 106.68) (xy 261.62 106.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5fd573af-fe32-438c-bbe2-9ba9ec1bd764") + ) + (wire + (pts + (xy 181.61 95.25) (xy 181.61 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5fe30b13-9ad1-4be1-9831-9c3366548484") + ) + (wire + (pts + (xy 162.56 72.39) (xy 175.26 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "609a6ad8-f75d-42f9-9bb5-0c95d4e72b91") + ) + (wire + (pts + (xy 156.21 100.33) (xy 191.77 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62f1a2df-da57-419a-ac5f-e2c6bc352e8f") + ) + (wire + (pts + (xy 233.68 148.59) (xy 233.68 130.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "63d7968e-39b7-4847-b683-5f70def71eed") + ) + (wire + (pts + (xy 135.89 58.42) (xy 133.35 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "69498b2c-797f-44a8-8b4c-892bb4800e44") + ) + (wire + (pts + (xy 245.11 99.06) (xy 261.62 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6a2fd90b-a7e7-4cc7-98f5-56764512eff0") + ) + (wire + (pts + (xy 137.16 80.01) (xy 137.16 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6aa780f1-f923-4ed2-9618-1c60e91127fd") + ) + (wire + (pts + (xy 147.32 58.42) (xy 147.32 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6e462e5e-b021-4aea-96ea-5d23fad6e666") + ) + (wire + (pts + (xy 162.56 80.01) (xy 191.77 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6e967797-6ed4-4dad-b6b9-52b25d3cc5c9") + ) + (wire + (pts + (xy 250.19 90.17) (xy 261.62 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6fd651e0-d1d5-4923-9433-e91ebe50e54a") + ) + (wire + (pts + (xy 156.21 97.79) (xy 156.21 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "71d66149-8ca4-4a37-b1c7-892889704963") + ) + (wire + (pts + (xy 256.54 101.6) (xy 261.62 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "73db7e7f-46de-42db-a278-9287b7659c1e") + ) + (wire + (pts + (xy 163.83 97.79) (xy 191.77 97.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "78d52bcb-4382-49c1-a45d-73ac927c9196") + ) + (wire + (pts + (xy 222.25 74.93) (xy 246.38 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7d1d4688-644b-48d1-b674-89d847268457") + ) + (wire + (pts + (xy 237.49 146.05) (xy 234.95 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e8978c3-7d60-4d0a-a1d0-cfb2f9b41568") + ) + (wire + (pts + (xy 207.01 121.92) (xy 207.01 115.57) + ) + (stroke + (width 0) + (type default) + ) + (uuid "81ebc64b-df11-44ab-a6f0-cc0cd9b83942") + ) + (wire + (pts + (xy 147.32 58.42) (xy 143.51 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "856d1300-44b3-44f4-bc06-bad0e2e73faf") + ) + (wire + (pts + (xy 182.88 90.17) (xy 181.61 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8594ee71-d03b-4900-b9cd-11c9fe6a320a") + ) + (wire + (pts + (xy 248.92 96.52) (xy 248.92 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "869249c6-1de9-4aaa-bb8e-a64e6c88e43d") + ) + (wire + (pts + (xy 234.95 128.27) (xy 234.95 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "88648de4-cfbb-44f9-9d2a-59767947e5c1") + ) + (wire + (pts + (xy 173.99 107.95) (xy 191.77 107.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8990ea9d-8387-4616-beb1-9deb88f6a0ed") + ) + (wire + (pts + (xy 252.73 95.25) (xy 252.73 106.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "89d878a6-ed67-4137-8ae2-48f39013277f") + ) + (wire + (pts + (xy 191.77 95.25) (xy 181.61 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8a68065d-f04b-4c22-8703-5d5e1e659d56") + ) + (wire + (pts + (xy 222.25 100.33) (xy 254 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8b275aa8-3dde-481c-ac15-ecac1fc39b41") + ) + (wire + (pts + (xy 243.84 90.17) (xy 243.84 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c9cef12-bff9-4412-86b5-05fd4e7f5a86") + ) + (wire + (pts + (xy 248.92 96.52) (xy 261.62 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8e70e43d-e8e1-4067-8799-6f91c299f45b") + ) + (wire + (pts + (xy 237.49 123.19) (xy 237.49 140.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "923b6d1a-9622-4db8-ac0d-70247a7fcd59") + ) + (wire + (pts + (xy 212.09 69.85) (xy 212.09 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "961eb9e8-6774-4167-85b6-67aa6c544d49") + ) + (wire + (pts + (xy 209.55 69.85) (xy 209.55 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "979e9fdc-2b31-4f2e-9ddc-85c698424e8b") + ) + (wire + (pts + (xy 227.33 130.81) (xy 233.68 130.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "993e0c95-1cbc-4e11-9805-ff8faf1a4682") + ) + (wire + (pts + (xy 139.7 80.01) (xy 137.16 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9a70304c-79f3-4eeb-81ec-ce5a67e0645b") + ) + (wire + (pts + (xy 222.25 110.49) (xy 248.92 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9af0b5b8-afad-4ac3-a520-d49d3485c979") + ) + (wire + (pts + (xy 175.26 74.93) (xy 191.77 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9b6ce8e3-ebeb-4012-8ee1-6520ad4b20a9") + ) + (wire + (pts + (xy 254 100.33) (xy 254 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9c022d39-275e-49dc-8700-e054f9022bd0") + ) + (wire + (pts + (xy 204.47 64.77) (xy 207.01 64.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a2282c2e-4e4c-4743-a52e-84ff789ee553") + ) + (wire + (pts + (xy 137.16 80.01) (xy 133.35 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ad939f9d-03ee-4aeb-a487-e4c5fa4e4388") + ) + (wire + (pts + (xy 246.38 78.74) (xy 246.38 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b18c530b-e297-4976-ad5f-eda4e635684e") + ) + (wire + (pts + (xy 222.25 85.09) (xy 242.57 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b19d0b63-ac34-4fb7-9581-a54bdc74f5f6") + ) + (wire + (pts + (xy 236.22 125.73) (xy 241.3 125.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b7072125-9a74-4792-95a8-9a9a3ef7d958") + ) + (wire + (pts + (xy 246.38 87.63) (xy 246.38 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b9ee2751-f9a9-49e1-8240-108e70057419") + ) + (wire + (pts + (xy 237.49 123.19) (xy 241.3 123.19) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bae9875c-77c5-4a41-8360-ca173414cde7") + ) + (wire + (pts + (xy 233.68 130.81) (xy 241.3 130.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bbbb1a9d-fdcc-441b-af6a-4033a7b62a29") + ) + (wire + (pts + (xy 236.22 125.73) (xy 236.22 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bd06f778-fedd-4255-8432-2ef3ab5ea7f9") + ) + (wire + (pts + (xy 252.73 95.25) (xy 222.25 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bf4a1250-b4e2-431c-812b-8781b2db8189") + ) + (wire + (pts + (xy 241.3 77.47) (xy 246.38 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c66dde7f-d88e-498a-bd2e-8f57c7bc0b7d") + ) + (wire + (pts + (xy 133.35 58.42) (xy 133.35 64.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c735ea03-cffe-45c5-9d68-120d003e995e") + ) + (wire + (pts + (xy 207.01 64.77) (xy 207.01 69.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ca53ba41-8134-4f82-bc63-80a22ccf1664") + ) + (wire + (pts + (xy 156.21 90.17) (xy 163.83 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d0953656-2266-40ef-a20b-534e013c7b1b") + ) + (wire + (pts + (xy 222.25 105.41) (xy 245.11 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d33e1975-05d3-4c07-af07-11b554692745") + ) + (wire + (pts + (xy 163.83 90.17) (xy 171.45 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d80c1bc4-2f3b-4bb2-ab6e-b0804e0cc8c4") + ) + (wire + (pts + (xy 151.13 72.39) (xy 162.56 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc95ea74-9047-49c5-88c6-56d8d8bce950") + ) + (wire + (pts + (xy 171.45 86.36) (xy 171.45 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "df0002e5-47fd-42ff-87de-28e102337eab") + ) + (wire + (pts + (xy 261.62 90.17) (xy 261.62 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3fd611f-a6cf-4929-ad12-4d1b03b7d721") + ) + (wire + (pts + (xy 204.47 64.77) (xy 204.47 69.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e54e8d97-3030-4a04-8bf8-ce9a990f2870") + ) + (wire + (pts + (xy 227.33 53.34) (xy 224.79 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e85ce047-7d99-4e34-9553-8a5ed2b3d95f") + ) + (wire + (pts + (xy 237.49 148.59) (xy 233.68 148.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ed314070-11a2-4540-b76e-b048963babff") + ) + (wire + (pts + (xy 241.3 80.01) (xy 241.3 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f64025d6-a983-4e42-9d9e-2678a491781f") + ) + (wire + (pts + (xy 207.01 53.34) (xy 217.17 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fa52877e-a377-4597-aed7-e8a54d13f377") + ) + (label "6{slash}CW" + (at 236.22 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "1f52284d-59cd-40cb-9b9f-49a438728250") + ) + (label "SDA" + (at 186.69 97.79 180) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "52b00868-b714-45fa-8a3b-58a7f78f423a") + ) + (label "SCL" + (at 186.69 100.33 180) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "610c6f0f-a457-405d-b21c-c639cb621928") + ) + (label "CLK7" + (at 236.22 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "61395719-fd85-44a7-b506-422e12036a42") + ) + (label "CLK3" + (at 236.22 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "63adc0f0-122b-42f3-8432-2e1fcc5d4344") + ) + (label "1{slash}RX90" + (at 236.22 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "68c89c88-b3c0-4ada-bc75-deeca6c07d03") + ) + (label "SCL" + (at 232.41 123.19 180) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "a11478d3-398b-416a-ae8d-049ecd5e7181") + ) + (label "4{slash}TX90" + (at 236.22 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "b687e55d-fb17-4445-9103-5ef0b7ebc318") + ) + (label "SDA" + (at 232.41 125.73 180) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "c47be903-605f-42c7-9e44-cee5bdfa23f0") + ) + (label "0{slash}RX0" + (at 236.22 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "c87cd84f-236b-4eb3-892a-cb593694b1e6") + ) + (label "CLK2" + (at 236.22 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "e68ee8ea-97df-4d20-b18b-e8eb17647e6f") + ) + (label "5{slash}TX0" + (at 236.22 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ee931b26-6761-454f-8f1e-8ed8205538c3") + ) + (symbol + (lib_id "Connector:Conn_01x03_Pin") + (at 168.91 110.49 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "00a67419-9b03-41e0-9c86-950ab86c0248") + (property "Reference" "J5" + (at 169.545 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "OEBSSEN" + (at 169.545 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" + (at 168.91 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 168.91 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x03, script generated" + (at 168.91 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 168.91 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "9d6933bd-a6e1-45f7-beb2-acf055c4d754") + ) + (pin "2" + (uuid "f3926fa7-bf7e-4ee1-8bb5-b3d219c115e6") + ) + (pin "1" + (uuid "6d8c9e83-e975-418b-871a-7c5623d109e5") + ) + (instances + (project "" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "J5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 198.12 62.23 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0e202de0-097a-4724-852d-71529d84aa6b") + (property "Reference" "#PWR09" + (at 198.12 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 197.612 65.786 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 198.12 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 198.12 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 198.12 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "63d01126-3b62-40de-8570-77a149b2a0d9") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR09") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 217.17 49.53 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "127c2012-f3d2-4773-ac00-a2bfb7640d64") + (property "Reference" "L3" + (at 215.9 52.07 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FB" + (at 220.472 48.514 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_0603_1608Metric" + (at 217.17 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 217.17 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 217.17 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "BMC-Q1JY0500H" + (at 217.17 49.53 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1002" + (at 217.17 49.53 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fabb9c8d-c451-45cc-bddc-cf10f10254fc") + ) + (pin "2" + (uuid "5411dad1-d319-4cdc-97b8-5612259624b9") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "L3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 147.32 62.23 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2110d63b-aafd-4f65-9e11-2b8db7c2be38") + (property "Reference" "#PWR03" + (at 147.32 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 150.622 63.5 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 147.32 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 147.32 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1a4aa641-d308-4c06-b33f-7748d7946678") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR03") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x06_Socket") + (at 251.46 80.01 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "2f49b0b9-acf5-41bb-9b12-535a2ddb2be8") + (property "Reference" "J3" + (at 252.1712 80.0678 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "pin header" + (at 252.1712 82.4921 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical" + (at 251.46 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 251.46 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x06, script generated" + (at 251.46 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 251.46 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "06afaeb9-0af4-4198-9ca6-a7b370db2f2f") + ) + (pin "2" + (uuid "94307d88-b808-40b0-85ca-30316b3efb86") + ) + (pin "4" + (uuid "e8197cef-e4ec-40fb-863e-3e0f1ddd5a7d") + ) + (pin "1" + (uuid "1cfa852e-a6ec-4421-937a-35459a129bdf") + ) + (pin "5" + (uuid "f1f34091-a07c-4040-ad39-2f73bfb32061") + ) + (pin "6" + (uuid "d331c513-5a87-4901-95de-e4fc2372b300") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "J3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x04_Socket") + (at 246.38 128.27 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (uuid "2f4b0cb2-c792-4eb4-8753-b8fdc80b3d9a") + (property "Reference" "J1" + (at 247.65 128.2701 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "qwiic" + (at 247.65 125.7301 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_JST:JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_Horizontal" + (at 246.38 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 246.38 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x04, script generated" + (at 246.38 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "SM04B-SRSS-TB(LF)(SN)" + (at 246.38 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C160404" + (at 246.38 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "7a4d43f6-6b04-4332-99e7-b457cd59c86d") + ) + (pin "2" + (uuid "a6bf3976-da78-4c6a-ba0d-5dc103ac23ea") + ) + (pin "1" + (uuid "583a0915-835f-434c-b76b-6412789d3c84") + ) + (pin "4" + (uuid "ffb6fb46-9a87-42d6-8be2-4056fce90a32") + ) + (instances + (project "" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "J1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x06_Socket") + (at 266.7 99.06 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "3090fb91-eabc-4e6f-9aca-bdeda3bb7944") + (property "Reference" "J4" + (at 267.4112 99.1178 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "pin header" + (at 267.4112 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical" + (at 266.7 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 266.7 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x06, script generated" + (at 266.7 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 266.7 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "72accef9-4cb4-4b8e-a652-b1f5d984fce4") + ) + (pin "2" + (uuid "c7b6d4ce-6c53-4b32-a968-72baf3031ca0") + ) + (pin "4" + (uuid "9858335a-298c-4bf7-9c5f-2956390c42b4") + ) + (pin "1" + (uuid "539ba32c-3105-4192-9e09-989111bcfd67") + ) + (pin "5" + (uuid "0bbe397c-01b1-4627-b6dd-b7dcc2701247") + ) + (pin "6" + (uuid "0ce93399-ab10-47d2-905f-0b163feb1fb6") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "J4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 133.35 50.8 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "33f8b809-490c-4e54-b455-2f8889b87e09") + (property "Reference" "#PWR01" + (at 133.35 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 132.08 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 133.35 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 133.35 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 133.35 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ba656479-06c8-41d3-bfb3-5b6122af23b9") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR01") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "SparkFun-Qwiic:qwiic_Logo") + (at 262.89 127 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "37148de2-dabd-43b9-88ce-59b4eed6ae04") + (property "Reference" "G1" + (at 262.89 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "qwiic_Logo" + (at 262.89 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "SparkFun-Qwiic:qwiic_4mm" + (at 262.89 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 262.89 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 262.89 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 262.89 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (instances + (project "" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "G1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:ECS-TX053-S3") + (at 135.89 72.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "37631619-0402-40b0-bc09-6bec8f1e9ba1") + (property "Reference" "Y1" + (at 130.0481 71.1779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "ECS-TX053-S3" + (at 142.24 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "T41_Library:Oscillator_ECS_TXO53_S3" + (at 135.89 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ecsxtal.com/store/pdf/ECS-TXO53-S3.pdf" + (at 137.16 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 135.89 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ECS-TXO53-S3-33-250-BN-TR " + (at 135.89 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C18457614" + (at 135.89 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "9" + (uuid "84dc0b68-a667-42ff-becd-37013e34b337") + ) + (pin "6" + (uuid "a6e08c8b-9fe4-4540-9aa6-07b423e3c8b6") + ) + (pin "4" + (uuid "974c53c7-3fcb-47ec-8bb1-abec5e2081d3") + ) + (pin "1" + (uuid "94cc80fe-eee5-47c2-a050-d8bd90a6097a") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "Y1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_name "+3V3_1") + (lib_id "power:+3V3") + (at 201.93 43.18 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3797f140-f1dc-4425-9b7c-16a7c32240ab") + (property "Reference" "#PWR012" + (at 201.93 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 200.66 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 201.93 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 201.93 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3V3\"" + (at 201.93 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "008e598b-a2a2-4bc3-9461-325b4c5afe25") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR012") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 213.36 62.23 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "44c02379-2f1b-4932-a068-35c0992cd458") + (property "Reference" "L4" + (at 212.09 64.77 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FB" + (at 216.662 61.214 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_0603_1608Metric" + (at 213.36 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 213.36 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 213.36 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "BMC-Q1JY0500H" + (at 213.36 62.23 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1002" + (at 213.36 62.23 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "56906309-38aa-4df3-bd89-2af27d5e203a") + ) + (pin "2" + (uuid "49371860-6db7-44aa-a57c-b85b06ca30a7") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "L4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 198.12 58.42 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "44c483ca-501a-4f25-8f0f-294b4dbebc86") + (property "Reference" "C4" + (at 200.152 60.198 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 195.58 53.086 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" + (at 197.1548 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 198.12 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 198.12 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CC0603KRX7R9BB104" + (at 198.12 58.42 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C14663" + (at 198.12 58.42 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1342bbb7-3a84-4615-b7c1-50ca8d8a16ac") + ) + (pin "1" + (uuid "334aae2f-a346-4105-9658-cb0b22d4bdea") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "C4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:Crystal") + (at 162.56 76.2 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "4557afa9-8e8b-4f9f-ae3d-00d6dc75b77d") + (property "Reference" "Y2" + (at 160.02 81.3958 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "25MHz" + (at 160.02 83.82 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Crystal:Crystal_SMD_HC49-SD_HandSoldering" + (at 162.56 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 162.56 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 162.56 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 162.56 76.2 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "38ad646a-25ed-4dbc-8e21-ae268e2cba90") + ) + (pin "1" + (uuid "c22892e1-1251-4991-b09a-bbb683bd618b") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "Y2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 173.99 113.03 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "45f1d082-e6c6-494a-9fd0-39f7a5e1b0fd") + (property "Reference" "#PWR019" + (at 173.99 119.38 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 173.99 117.348 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 173.99 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 173.99 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 173.99 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1b191770-2e30-4382-8c3a-4ba74f3abee8") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR019") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 171.45 86.36 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4d94fd05-327b-4b06-834a-cd12fbc1b914") + (property "Reference" "#PWR016" + (at 171.45 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 170.18 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 171.45 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 171.45 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 171.45 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0c65c691-dbe3-4a77-abc2-4fa170f1810c") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR016") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 139.7 58.42 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "50c11615-2854-4218-8b4c-a5683716f1ca") + (property "Reference" "C1" + (at 140.97 60.96 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 142.24 57.15 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" + (at 143.51 57.4548 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CC0603KRX7R9BB104" + (at 139.7 58.42 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C14663" + (at 139.7 58.42 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "52f05744-a1f2-4c63-a6dc-05501cf4a655") + ) + (pin "1" + (uuid "c3269aa4-e7f8-457a-a889-d5e78f71e426") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "C1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 207.01 121.92 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "541cc438-fc98-4610-93d3-642026da5eff") + (property "Reference" "#PWR011" + (at 207.01 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 207.01 125.984 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 207.01 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 207.01 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 207.01 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "830aac35-630e-4a1b-b1ae-344abfbdb86a") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR011") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 147.32 72.39 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "568903b7-fe1e-44b4-bedf-04c827fc34c8") + (property "Reference" "C2" + (at 152.4 71.12 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 151.13 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" + (at 143.51 71.4248 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 147.32 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CC0603KRX7R9BB104" + (at 147.32 72.39 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C14663" + (at 147.32 72.39 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c16d0241-bfe1-44f1-91ac-e2350c055427") + ) + (pin "1" + (uuid "91c353dc-ce2c-48ba-b061-ea1dd0afc6ad") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "C2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Oscillator:Si5351A-B-GM") + (at 207.01 92.71 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5a31cbf9-cc57-466b-80d5-194db3ffd271") + (property "Reference" "Y3" + (at 209.1533 115.57 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Si5351A-B-GM" + (at 209.1533 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_DFN_QFN:QFN-20-1EP_4x4mm_P0.5mm_EP2.7x2.7mm" + (at 207.01 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.silabs.com/documents/public/data-sheets/Si5351-B.pdf" + (at 207.01 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "I2C Programmable Any-Frequency CMOS Clock Generator, QFN-20" + (at 207.01 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "SI5351A-B-GM" + (at 207.01 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C22413806" + (at 207.01 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "9" + (uuid "2fdbc577-6404-4ce1-b8cd-cdbaa32ef948") + ) + (pin "17" + (uuid "8a4adcd4-b41f-4ae8-8776-257c52027fac") + ) + (pin "15" + (uuid "7e06e70d-24db-4de0-ba75-08ad7a4954ad") + ) + (pin "4" + (uuid "6ae224f2-487d-4c7c-b191-c71d7d388f8e") + ) + (pin "13" + (uuid "25c769b3-0ec3-4f38-9a61-38ab41070ca9") + ) + (pin "14" + (uuid "39e6fbf1-060a-43d4-b9d3-49c4b88ca935") + ) + (pin "10" + (uuid "ddaa480e-a0e4-4471-bf28-368f71685611") + ) + (pin "12" + (uuid "3b50b02b-fe0d-4520-959d-5d081c2a7b11") + ) + (pin "8" + (uuid "ba307d9f-5fa0-4809-938c-e52980372902") + ) + (pin "19" + (uuid "fc80dec2-3853-4f24-9014-c1e422ff78bb") + ) + (pin "5" + (uuid "972f5f4c-420c-4c84-ab06-e987565d49db") + ) + (pin "3" + (uuid "39ec5620-815e-4fe2-b963-b01716345eb1") + ) + (pin "2" + (uuid "678e8dea-0e31-4b99-a763-a4905ba6ffde") + ) + (pin "1" + (uuid "5fafe6ff-c9d7-4142-9f33-ab555d61496c") + ) + (pin "11" + (uuid "245a9aec-14ae-42b0-a751-3a3d66e541fd") + ) + (pin "16" + (uuid "2e5269fb-959c-4e71-afce-050fdd554730") + ) + (pin "20" + (uuid "267ddee4-1657-4ca0-8e69-313cf60e483f") + ) + (pin "18" + (uuid "9ee5f592-b479-4aa2-94a6-817f392e049a") + ) + (pin "7" + (uuid "2330229e-511f-4751-800e-729d6a5e42f9") + ) + (pin "6" + (uuid "a7cd8228-e4bd-410f-a1fc-0986d18b23f3") + ) + (pin "21" + (uuid "fb675f27-a42a-49d8-aef6-b58ae5fd3a21") + ) + (instances + (project "" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "Y3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 227.33 130.81 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7b498988-e194-4672-8deb-d567ff5679e5") + (property "Reference" "#PWR018" + (at 227.33 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 227.584 134.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 227.33 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 227.33 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 227.33 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6b8723df-1486-43f8-b60d-3b9bbf8b466e") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR018") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 250.19 90.17 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "81093c07-c1fb-41a6-9d6a-b4ec627ab9fb") + (property "Reference" "#PWR014" + (at 250.19 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 249.682 93.726 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 250.19 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 250.19 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 250.19 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f8a13bcd-0265-4c5e-bf1e-94a2f2cbd85f") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR014") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 163.83 93.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "81981280-7d2b-4556-8fe7-05c7571e8a9a") + (property "Reference" "R1" + (at 165.608 92.7678 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2k2" + (at 165.608 95.1921 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_0603_1608Metric" + (at 162.052 93.98 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 163.83 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 163.83 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C4190" + (at 163.83 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CRGP0603F2K2" + (at 163.83 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8ffb8d54-c279-458c-b860-e0433ec5b1b2") + ) + (pin "1" + (uuid "90428c18-4c0e-435b-8ae9-9e05026aa71f") + ) + (instances + (project "" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "R1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 220.98 53.34 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8b5f14b0-6cf5-4e36-8142-e4f696ff4147") + (property "Reference" "C3" + (at 222.758 51.308 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 215.646 55.88 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" + (at 224.79 54.3052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 220.98 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 220.98 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CC0603KRX7R9BB104" + (at 220.98 53.34 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C14663" + (at 220.98 53.34 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "39db63ca-04bc-4178-b28d-bf413605539f") + ) + (pin "1" + (uuid "567193eb-4df0-4d35-b929-186a9554e2ba") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "C3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 217.17 45.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9300d262-9b6b-4c0a-b896-85e4dffbf311") + (property "Reference" "#PWR04" + (at 217.17 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 215.9 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 217.17 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 217.17 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 217.17 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c76bd4b2-5c4d-42ca-891d-0d7b44097990") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR04") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Bridged") + (at 176.53 90.17 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "9555e490-beb1-46dd-b1d1-98c2cfd2b8b4") + (property "Reference" "JP1" + (at 176.784 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "GND select" + (at 176.53 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm" + (at 176.53 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 176.53 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Solder Jumper, 2-pole, closed/bridged" + (at 176.53 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 176.53 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "22443693-2bd3-4c58-81d8-2d9d6bfb4c08") + ) + (pin "1" + (uuid "67af122f-6c32-4cf2-b971-c1d93376a9bb") + ) + (instances + (project "" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "JP1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 186.69 90.17 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "a5a3cfdb-a813-4d3e-81ea-3159bde6dc6c") + (property "Reference" "JP2" + (at 186.69 87.884 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 186.69 87.5609 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 186.69 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 186.69 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 186.69 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 186.69 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a8bea2cd-7dc6-4153-b708-ad35dab6544e") + ) + (pin "1" + (uuid "b4366125-df1d-4fa7-9de9-d88f936df0d4") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "JP2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole") + (at 140.97 143.51 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "a8364ac0-144a-4502-8b34-9a3ba33aa94e") + (property "Reference" "H1" + (at 143.51 142.2399 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "MountingHole" + (at 143.51 144.7799 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_2.2mm_M2_DIN965" + (at 140.97 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 140.97 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Mounting Hole without connection" + (at 140.97 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 140.97 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (instances + (project "" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "H1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x04_Socket") + (at 242.57 143.51 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "ad865a42-2b12-4cd4-a403-674392f12114") + (property "Reference" "J2" + (at 243.84 143.5099 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "pin header" + (at 243.84 146.0499 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical" + (at 242.57 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 242.57 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x04, script generated" + (at 242.57 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 242.57 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "9730a17f-f925-4c09-9a9b-1827d88ab4de") + ) + (pin "2" + (uuid "ac7c2f02-79ea-45a1-9a59-c90d0d912cdc") + ) + (pin "4" + (uuid "008b748d-dab7-4818-9327-ca783a2f1c1a") + ) + (pin "1" + (uuid "5051b9a7-ce43-4c46-ae62-736660e53037") + ) + (instances + (project "" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "J2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 223.52 66.04 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ae38f728-6e75-4b53-9a3e-1443e82c5f0e") + (property "Reference" "#PWR06" + (at 223.52 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 223.012 69.596 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 223.52 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 223.52 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 223.52 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d31cf47c-5489-4f8a-b39e-8c7d602d268a") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR06") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 227.33 128.27 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b3a87475-ec5c-4bbf-b029-6870e1caa4bc") + (property "Reference" "#PWR017" + (at 227.33 132.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 226.06 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 227.33 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 227.33 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 227.33 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "bdebc789-4cd4-4b2e-b3b9-d176c922ff60") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR017") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 190.5 91.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "bcc18e01-d4e7-4cce-ad6b-49221c80082d") + (property "Reference" "#PWR08" + (at 190.5 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 193.04 92.71 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "" + (at 190.5 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 190.5 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 190.5 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "80b9a61a-9ad3-4c2a-898e-31d9fa9b78e4") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR08") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 243.84 78.74 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "be34bfd1-e30d-4c99-bed1-0fbcd5392009") + (property "Reference" "#PWR07" + (at 243.84 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 243.332 82.296 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 243.84 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 243.84 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "12aa67eb-bd30-4bd0-bf83-78a026095539") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR07") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 256.54 101.6 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "bfee5028-7ef8-4ddf-922c-d926fccf81b1") + (property "Reference" "#PWR015" + (at 256.54 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 256.032 105.156 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 256.54 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 256.54 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 256.54 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2cc40e9a-50a2-48f7-a54c-1dcca13d2f38") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR015") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 137.16 81.28 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c6a6f1b5-afc6-4f81-b691-3aaafd04bb4c") + (property "Reference" "#PWR02" + (at 137.16 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 134.62 82.55 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 137.16 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 137.16 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 137.16 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1c67ea37-35a1-4038-bafb-09b2d39729ec") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR02") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 201.93 46.99 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c98bbaf2-95f8-42a9-b52d-97c8709ec2bf") + (property "Reference" "L2" + (at 200.66 49.53 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FB" + (at 204.47 49.53 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_0603_1608Metric" + (at 201.93 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 201.93 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 201.93 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "BMC-Q1JY0500H" + (at 201.93 46.99 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1002" + (at 201.93 46.99 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a9beecc5-2ab8-41a2-8b63-ff1960bfa090") + ) + (pin "2" + (uuid "ea2b6393-b131-4e69-83b7-0ddc311997c0") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "L2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 133.35 54.61 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "cd07894c-45b1-49aa-9251-17f3c93b252b") + (property "Reference" "L1" + (at 134.62 53.34 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FB" + (at 130.81 52.07 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_0603_1608Metric" + (at 133.35 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 133.35 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 133.35 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "BMC-Q1JY0500H" + (at 133.35 54.61 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1002" + (at 133.35 54.61 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8323743c-40a3-4af2-8bec-6b7cc62cb45d") + ) + (pin "2" + (uuid "8a2e65f7-22c4-46a6-830f-df15b43b2c85") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "L1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 227.33 53.34 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dbab8ddd-c63f-4d09-a911-68dd42f704a2") + (property "Reference" "#PWR010" + (at 227.33 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 226.822 56.896 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 227.33 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 227.33 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 227.33 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b5265ff8-bb44-4904-9563-e2316dea4bf7") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR010") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 213.36 58.42 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e93546d0-2c1c-4bc3-a9fe-8e9bf4fde275") + (property "Reference" "#PWR05" + (at 213.36 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 212.09 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 213.36 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 213.36 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 213.36 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "706d3404-9c45-414c-8fee-ddbd87fa727d") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR05") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 246.38 90.17 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "efc6eaa5-c33b-4b5e-9363-a19015b13a82") + (property "Reference" "#PWR013" + (at 246.38 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 245.872 93.726 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 246.38 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 246.38 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 246.38 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b7a05d9a-912f-4637-822e-d8f45b3d382c") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "#PWR013") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 217.17 66.04 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f1e40c34-40b2-4d6f-9a55-3510feaa516f") + (property "Reference" "C5" + (at 218.948 64.008 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 211.836 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" + (at 220.98 67.0052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 217.17 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 217.17 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CC0603KRX7R9BB104" + (at 217.17 66.04 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C14663" + (at 217.17 66.04 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4c0b82e8-fc0c-4e99-a108-7b5fd0ed7652") + ) + (pin "1" + (uuid "94f6076f-aed7-4a80-b5b8-bd3583e0d665") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "C5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole") + (at 140.97 149.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "f5d3a6f4-199e-43bd-accc-3fdee8434027") + (property "Reference" "H2" + (at 143.51 148.5899 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "MountingHole" + (at 143.51 151.1299 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_2.2mm_M2_DIN965" + (at 140.97 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 140.97 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Mounting Hole without connection" + (at 140.97 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 140.97 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "H2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 156.21 93.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "fbf86804-66f1-49f0-b484-375fced4ed00") + (property "Reference" "R2" + (at 157.988 92.7678 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2k2" + (at 157.988 95.1921 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_0603_1608Metric" + (at 154.432 93.98 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 156.21 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 156.21 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C4190" + (at 156.21 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CRGP0603F2K2" + (at 156.21 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "14454623-bab1-43d1-b15a-b998c2e0df90") + ) + (pin "1" + (uuid "3b06cda5-6974-4a23-9938-87d6825d714c") + ) + (instances + (project "DualClockLO" + (path "/19e7ad66-8f4f-49d3-ad58-95c831b9d6b3" + (reference "R2") + (unit 1) + ) + ) + ) + ) + (sheet_instances + (path "/" + (page "1") + ) + ) + (embedded_fonts no) +) diff --git a/wiki/raw/K9HZ_100W_11band_LPF-Control.kicad_sch b/wiki/raw/K9HZ_100W_11band_LPF-Control.kicad_sch new file mode 100644 index 0000000..9b25c08 --- /dev/null +++ b/wiki/raw/K9HZ_100W_11band_LPF-Control.kicad_sch @@ -0,0 +1,38380 @@ +(kicad_sch + (version 20250114) + (generator "eeschema") + (generator_version "9.0") + (uuid "3c4b9d3b-a516-4fd7-b325-b74c836dee65") + (paper "A3") + (title_block + (title "K9HZ 100W 11 Band LPF: Control board") + (date "2025-07-28") + (rev "V1.2") + (comment 1 "Layout by OG King-KI3P") + (comment 2 "Designed by WJ Schmidt-K9HZ") + ) + (lib_symbols + (symbol "74xGxx:74LVC1G04" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 0 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "74LVC1G04" + (at 5.08 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Single NOT Gate, Low-Voltage CMOS" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Single Gate NOT LVC CMOS" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOT?23* Texas?R-PDSO-G5?DCK* Texas?R-PDSO-N5?DRL* Texas?X2SON*0.8x0.8mm*P0.48mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "74LVC1G04_0_1" + (polyline + (pts + (xy -7.62 6.35) (xy -7.62 -6.35) (xy 5.08 0) (xy -7.62 6.35) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "74LVC1G04_1_1" + (pin input line + (at -15.24 0 0) + (length 7.62) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -5.08 10.16 270) + (length 5.08) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -5.08 -10.16 90) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output inverted + (at 12.7 0 180) + (length 7.62) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "74xx:74HC237" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -7.62 13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + ) + (property "Value" "74HC237" + (at 2.54 -11.43 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/cd74hc237.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "3-to-8 line decoder/multiplexer with address latches, DIP-16/SOIC-16/SSOP-16" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "demux" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "DIP*W7.62mm* SOIC*3.9x9.9mm*P1.27mm* SSOP*5.3x6.2mm*P0.65mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "74HC237_0_1" + (rectangle + (start -7.62 12.7) + (end 7.62 -10.16) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "74HC237_1_1" + (pin input line + (at -10.16 10.16 0) + (length 2.54) + (name "A0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 7.62 0) + (length 2.54) + (name "A1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 5.08 0) + (length 2.54) + (name "A2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 0 0) + (length 2.54) + (name "~{LE}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -5.08 0) + (length 2.54) + (name "~{E1}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -7.62 0) + (length 2.54) + (name "E2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 15.24 270) + (length 2.54) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -12.7 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 10.16 180) + (length 2.54) + (name "Y0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 7.62 180) + (length 2.54) + (name "Y1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 5.08 180) + (length 2.54) + (name "Y2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 2.54 180) + (length 2.54) + (name "Y3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 0 180) + (length 2.54) + (name "Y4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 -2.54 180) + (length 2.54) + (name "Y5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 -5.08 180) + (length 2.54) + (name "Y6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 -7.62 180) + (length 2.54) + (name "Y7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector:Conn_01x05_Socket" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x05_Socket" + (at 0 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x05, script generated" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_locked" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x05_Socket_1_1" + (polyline + (pts + (xy -1.27 5.08) (xy -0.508 5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 2.54) (xy -0.508 2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy -0.508 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -2.54) (xy -0.508 -2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -5.08) (xy -0.508 -5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 4.572) + (mid -0.5058 5.08) + (end 0 5.588) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 2.032) + (mid -0.5058 2.54) + (end 0 3.048) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -0.508) + (mid -0.5058 0) + (end 0 0.508) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -3.048) + (mid -0.5058 -2.54) + (end 0 -2.032) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -5.588) + (mid -0.5058 -5.08) + (end 0 -4.572) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector:Conn_Coaxial" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0.254 3.048 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_Coaxial" + (at 2.921 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "coaxial connector (BNC, SMA, SMB, SMC, Cinch/RCA, LEMO, ...)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "BNC SMA SMB SMC LEMO coaxial connector CINCH RCA MCX MMCX U.FL UMRF" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "*BNC* *SMA* *SMB* *SMC* *Cinch* *LEMO* *UMRF* *MCX* *U.FL*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_Coaxial_0_1" + (polyline + (pts + (xy -2.54 0) (xy -0.508 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.778 0) + (mid 0.222 -1.8079) + (end -1.778 -0.508) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -1.778 0.508) + (mid 0.2221 1.8084) + (end 1.778 0) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 0) + (radius 0.508) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -2.54) (xy 0 -1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Conn_Coaxial_1_1" + (pin passive line + (at -5.08 0 0) + (length 2.54) + (name "In" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -5.08 90) + (length 2.54) + (name "Ext" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector:Screw_Terminal_01x02" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Screw_Terminal_01x02" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic screw terminal, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "screw terminal" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TerminalBlock*:*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Screw_Terminal_01x02_1_1" + (rectangle + (start -1.27 1.27) + (end 1.27 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (polyline + (pts + (xy -0.5334 0.3302) (xy 0.3302 -0.508) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.5334 -2.2098) (xy 0.3302 -3.048) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.3556 0.508) (xy 0.508 -0.3302) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.3556 -2.032) (xy 0.508 -2.8702) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 0) + (radius 0.635) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 -2.54) + (radius 0.635) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector_Audio:AudioJack3_SwitchTR" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 8.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AudioJack3_SwitchTR" + (at 0 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Audio Jack, 3 Poles (Stereo / TRS), Switched TR Poles (Normalling)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "audio jack receptacle stereo headphones phones TRS connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Jack*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "AudioJack3_SwitchTR_0_1" + (rectangle + (start -5.08 -5.08) + (end -6.35 -7.62) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy -1.905 -5.08) (xy -1.27 -5.715) (xy -0.635 -5.08) (xy -0.635 0) (xy 2.54 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -5.08) (xy 0.635 -5.715) (xy 1.27 -5.08) (xy 2.54 -5.08) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.508 -0.254) (xy 0.762 -0.762) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.778 -5.334) (xy 2.032 -5.842) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 2.54 3.81) + (end -5.08 -10.16) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (polyline + (pts + (xy 2.54 2.54) (xy -2.54 2.54) (xy -2.54 -5.08) (xy -3.175 -5.715) (xy -3.81 -5.08) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 -2.54) (xy 0.508 -2.54) (xy 0.508 -0.254) (xy 0.254 -0.762) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 -7.62) (xy 1.778 -7.62) (xy 1.778 -5.334) (xy 1.524 -5.842) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "AudioJack3_SwitchTR_1_1" + (pin passive line + (at 5.08 2.54 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "S" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 0 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "R" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -2.54 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "RN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -5.08 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "T" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -7.62 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "TN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:C" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "C_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_0_1" + (polyline + (pts + (xy -2.032 0.762) (xy 2.032 0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.032 -0.762) (xy 2.032 -0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "C_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:C_Polarized" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Polarized" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Polarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "CP_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_Polarized_0_1" + (rectangle + (start -2.286 0.508) + (end 2.286 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.778 2.286) (xy -0.762 2.286) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 2.794) (xy -1.27 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 2.286 -0.508) + (end -2.286 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "C_Polarized_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:D_Zener" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D_Zener" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Zener diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO-???* *_Diode_* *SingleDiode* D_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "D_Zener_0_1" + (polyline + (pts + (xy -1.27 -1.27) (xy -1.27 1.27) (xy -0.762 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 0) (xy -1.27 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 -1.27) (xy 1.27 1.27) (xy -1.27 0) (xy 1.27 -1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "D_Zener_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "K" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:L" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "L" + (at -1.27 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "L" + (at 1.905 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Inductor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "inductor choke coil reactor magnetic" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Choke_* *Coil* Inductor_* L_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "L_0_1" + (arc + (start 0 2.54) + (mid 0.6323 1.905) + (end 0 1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 1.27) + (mid 0.6323 0.635) + (end 0 0) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 0) + (mid 0.6323 -0.635) + (end 0 -1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -1.27) + (mid 0.6323 -1.905) + (end 0 -2.54) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "L_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:R" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "R" + (at 2.032 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "R" + (at 0 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -1.778 0 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "R res resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "R_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "R_0_1" + (rectangle + (start -1.016 -2.54) + (end 1.016 2.54) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "R_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:R_Potentiometer" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "RV" + (at -4.445 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "R_Potentiometer" + (at -2.54 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Potentiometer" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "resistor variable" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Potentiometer*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "R_Potentiometer_0_1" + (rectangle + (start 1.016 2.54) + (end -1.016 -2.54) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.143 0) (xy 2.286 0.508) (xy 2.286 -0.508) (xy 1.143 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 2.54 0) (xy 1.524 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "R_Potentiometer_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 1.27) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Interface_Expansion:MCP23017_SO" + (pin_names + (offset 1.016) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -11.43 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MCP23017_SO" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-28W_7.5x17.9mm_P1.27mm" + (at 5.08 -25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf" + (at 5.08 -27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "16-bit I/O expander, I2C, interrupts, w pull-ups, SOIC-28" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "I2C parallel port expander" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC*7.5x17.9mm*P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MCP23017_SO_0_1" + (rectangle + (start -12.7 22.86) + (end 12.7 -22.86) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "MCP23017_SO_1_1" + (pin bidirectional line + (at -17.78 20.32 0) + (length 5.08) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 17.78 0) + (length 5.08) + (name "SCK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin tri_state line + (at -17.78 5.08 0) + (length 5.08) + (name "INTB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin tri_state line + (at -17.78 2.54 0) + (length 5.08) + (name "INTA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -2.54 0) + (length 5.08) + (name "~{RESET}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -15.24 0) + (length 5.08) + (name "A2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -17.78 0) + (length 5.08) + (name "A1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -20.32 0) + (length 5.08) + (name "A0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin no_connect line + (at -12.7 15.24 0) + (length 5.08) + (hide yes) + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin no_connect line + (at -12.7 12.7 0) + (length 5.08) + (hide yes) + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 27.94 270) + (length 5.08) + (name "VDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -27.94 90) + (length 5.08) + (name "VSS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 20.32 180) + (length 5.08) + (name "GPB0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 17.78 180) + (length 5.08) + (name "GPB1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 15.24 180) + (length 5.08) + (name "GPB2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 12.7 180) + (length 5.08) + (name "GPB3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 10.16 180) + (length 5.08) + (name "GPB4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 7.62 180) + (length 5.08) + (name "GPB5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 5.08 180) + (length 5.08) + (name "GPB6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 2.54 180) + (length 5.08) + (name "GPB7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -2.54 180) + (length 5.08) + (name "GPA0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "21" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -5.08 180) + (length 5.08) + (name "GPA1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "22" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -7.62 180) + (length 5.08) + (name "GPA2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "23" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -10.16 180) + (length 5.08) + (name "GPA3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "24" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -12.7 180) + (length 5.08) + (name "GPA4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "25" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -15.24 180) + (length 5.08) + (name "GPA5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "26" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -17.78 180) + (length 5.08) + (name "GPA6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "27" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -20.32 180) + (length 5.08) + (name "GPA7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "28" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Jumper:SolderJumper_2_Open" + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "JP" + (at 0 2.032 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Solder Jumper, 2-pole, open" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "solder jumper SPST" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SolderJumper*Open*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "SolderJumper_2_Open_0_1" + (polyline + (pts + (xy -0.254 1.016) (xy -0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 -1.016) + (mid -1.2656 0) + (end -0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 -1.016) + (mid -1.2656 0) + (end -0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start 0.254 1.016) + (mid 1.2656 0) + (end 0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0.254 1.016) + (mid 1.2656 0) + (end 0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 0.254 1.016) (xy 0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "SolderJumper_2_Open_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Mechanical:MountingHole_Pad" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "H" + (at 0 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MountingHole_Pad" + (at 0 4.445 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Mounting Hole with connection" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "mounting hole" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "MountingHole*Pad*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MountingHole_Pad_0_1" + (circle + (center 0 1.27) + (radius 1.27) + (stroke + (width 1.27) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "MountingHole_Pad_1_1" + (pin input line + (at 0 -2.54 90) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "RF_Switch:MASWSS0179" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -7.62 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 3.81 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Macom GaAs RF SPDT switch, DC-2GHz, 0.6/22dB loss/isolation, SOT-26 (SOT-23-6)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "RF SWITCH SPDT" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOT?23*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MASWSS0179_0_1" + (polyline + (pts + (xy -3.175 -3.81) (xy -2.54 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center -3.048 2.54) + (radius 0.2794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.794 2.54) (xy 2.921 5.207) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.905 -3.81) (xy -1.27 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.635 -3.81) (xy 0 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 3.175) (xy 0 3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 1.905) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0.635) (xy 0 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -0.635) (xy 0 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -1.905) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -3.175) (xy 0 -2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 3.048 0) + (radius 0.2794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 3.175 5.207) + (radius 0.2794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 7.62 -7.62) + (end -7.62 6.35) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "MASWSS0179_1_1" + (pin passive line + (at -10.16 2.54 0) + (length 2.54) + (name "RFC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -2.54 0) + (length 2.54) + (name "V1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -5.08 0) + (length 2.54) + (name "V2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 2.54 -10.16 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 10.16 5.08 180) + (length 2.54) + (name "RF1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 10.16 0 180) + (length 2.54) + (name "RF2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Regulator_Linear:L7808" + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "L7808" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.635 -3.81 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "http://www.st.com/content/ccc/resource/technical/document/datasheet/41/4f/b3/b0/12/d4/47/88/CD00000444.pdf/files/CD00000444.pdf/jcr:content/translations/en.CD00000444.pdf" + (at 0 -1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Positive 1.5A 35V Linear Regulator, Fixed Output 8V, TO-220/TO-263/TO-252" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Voltage Regulator 1.5A Positive" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?252* TO?263* TO?220*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "L7808_0_1" + (rectangle + (start -5.08 1.905) + (end 5.08 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "L7808_1_1" + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "IN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "OUT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Regulator_Linear:LM1117T-3.3" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM1117T-3.3" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Horizontal_TabDown" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm1117.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "800mA Low-Dropout Linear Regulator, 3.3V fixed output, TO-220" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "linear regulator ldo fixed positive" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?220*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LM1117T-3.3_0_1" + (rectangle + (start -5.08 -5.08) + (end 5.08 1.905) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "LM1117T-3.3_1_1" + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "VI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Regulator_Linear:LM7805_TO220" + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM7805_TO220" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 0 5.715 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" + (at 0 -1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Positive 1A 35V Linear Regulator, Fixed Output 5V, TO-220" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Voltage Regulator 1A Positive" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?220*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LM7805_TO220_0_1" + (rectangle + (start -5.08 1.905) + (end 5.08 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "LM7805_TO220_1_1" + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "VI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Relay:Relay_SPDT" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "K" + (at 11.43 3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Relay_SPDT" + (at 11.43 1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 11.43 -1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Monostable Relay SPDT, EN50005" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Single Pole Relay SPDT" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Relay?SPDT*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Relay_SPDT_0_0" + (polyline + (pts + (xy 7.62 5.08) (xy 7.62 2.54) (xy 6.985 3.175) (xy 7.62 3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Relay_SPDT_0_1" + (rectangle + (start -10.16 5.08) + (end 10.16 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (rectangle + (start -8.255 1.905) + (end -1.905 -1.905) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -7.62 -1.905) (xy -2.54 1.905) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -5.08 5.08) (xy -5.08 1.905) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -5.08 -5.08) (xy -5.08 -1.905) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.905 0) (xy -1.27 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.635 0) (xy 0 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.635 0) (xy 1.27 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.905 0) (xy 2.54 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 5.08) (xy 2.54 2.54) (xy 3.175 3.175) (xy 2.54 3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 3.175 0) (xy 3.81 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 5.08 -2.54) (xy 3.175 3.81) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 5.08 -2.54) (xy 5.08 -5.08) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Relay_SPDT_1_1" + (pin passive line + (at -5.08 7.62 270) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -7.62 90) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 7.62 270) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -7.62 90) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 7.62 270) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:6_pin_transformer" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "L" + (at 0 10.795 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "6_pin_transformer" + (at 0.635 -5.715 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Transformer*Coilcraft*CST2010*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "6_pin_transformer_0_1" + (arc + (start -5.08 7.6255) + (mid -3.81 8.89) + (end -2.54 7.6255) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center -3.81 7.62) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center -3.81 0) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start -2.54 -0.0055) + (mid -3.81 -1.27) + (end -5.08 -0.0055) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -2.54 5.715) + (end 2.54 1.905) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.54 5.08) (xy -5.08 7.62) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.54 2.54) (xy -5.08 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -2.54 7.6255) + (mid -1.27 8.89) + (end 0 7.6255) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -0.0055) + (mid -1.27 -1.27) + (end -2.54 -0.0055) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 7.6255) + (mid 1.27 8.89) + (end 2.54 7.6255) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 2.54 -0.0055) + (mid 1.27 -1.27) + (end 0 -0.0055) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 2.54 7.6255) + (mid 3.81 8.89) + (end 5.08 7.6255) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 5.08 -0.0055) + (mid 3.81 -1.27) + (end 2.54 -0.0055) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 5.08 3.81) (xy 2.54 3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "6_pin_transformer_1_1" + (pin passive line + (at -7.62 7.62 0) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -7.62 3.81 0) + (length 2.54) + (name "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -7.62 0 0) + (length 2.54) + (name "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 7.62 180) + (length 2.54) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 3.81 180) + (length 2.54) + (name "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 0 180) + (length 2.54) + (name "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:AD7991YRJZ" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -0.635 10.795 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AD7991YRJZ" + (at 0 8.255 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-23-8" + (at 3.175 -24.765 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7991_7995_7999.pdf" + (at 1.27 -6.985 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "I2C-Compatible, 4-input, 12-Bit Analog-to-Digital Converter, SOT-23" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "ADC I2C 8-bit Alert" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "MSOP*3x3mm*P0.65mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "AD7991YRJZ_0_1" + (rectangle + (start -7.62 6.35) + (end 7.62 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "AD7991YRJZ_1_1" + (pin open_collector line + (at -10.16 5.08 0) + (length 2.54) + (name "Vin0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 2.54 0) + (length 2.54) + (name "Vin1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 0 0) + (length 2.54) + (name "Vin2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -2.54 0) + (length 2.54) + (name "Vin3/Vref" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 10.16 5.08 180) + (length 2.54) + (name "Vdd" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 10.16 2.54 180) + (length 2.54) + (name "SCL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 10.16 0 180) + (length 2.54) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 10.16 -2.54 180) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:AD8307" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 8.89 0.635 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AD8307" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 3.175 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 3.81 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "DC to 500 MHz, 95 dB Logarithmic Amplifier, SOIC-8" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "RF LOG POWER DETECTOR" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "MSOP*3x3mm*P0.65mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "AD8307_0_1" + (rectangle + (start -6.35 6.35) + (end 6.985 -7.62) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "AD8307_1_1" + (pin input line + (at -3.81 8.89 270) + (length 2.54) + (name "INP" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -3.81 -10.16 90) + (length 2.54) + (name "INM" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -1.27 8.89 270) + (length 2.54) + (name "VPS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -1.27 -10.16 90) + (length 2.54) + (name "COM" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 1.27 8.89 270) + (length 2.54) + (name "ENB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 1.27 -10.16 90) + (length 2.54) + (name "OFS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 3.81 8.89 270) + (length 2.54) + (name "INT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 3.81 -10.16 90) + (length 2.54) + (name "OUT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:CD74HC4514M96" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -8.89 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "CD74HC4514M96" + (at 1.27 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-24W_7.5x15.4mm_P1.27mm" + (at 22.86 -25.4 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/cd74hc4514.pdf" + (at -2.54 37.465 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "High-Speed CMOS Logic 16-Channel Analog Multiplexer/Demultiplexer, SOIC-24" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "multiplexer demultiplexer mux demux" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC*W*7.5x15.4mm*P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "CD74HC4514M96_0_1" + (rectangle + (start -8.89 21.59) + (end 8.89 -24.13) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "CD74HC4514M96_1_1" + (pin passive line + (at -12.7 12.7 0) + (length 3.81) + (name "~{LE}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 2.54 0) + (length 3.81) + (name "A0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 0 0) + (length 3.81) + (name "A1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -2.54 0) + (length 3.81) + (name "A2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "21" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -5.08 0) + (length 3.81) + (name "A3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "22" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -15.24 0) + (length 3.81) + (name "~{E}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "23" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 25.4 270) + (length 3.81) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "24" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -27.94 90) + (length 3.81) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 17.78 180) + (length 3.81) + (name "Y0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 15.24 180) + (length 3.81) + (name "Y1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 12.7 180) + (length 3.81) + (name "Y2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 10.16 180) + (length 3.81) + (name "Y3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 7.62 180) + (length 3.81) + (name "Y4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 5.08 180) + (length 3.81) + (name "Y5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 2.54 180) + (length 3.81) + (name "Y6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 0 180) + (length 3.81) + (name "Y7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -2.54 180) + (length 3.81) + (name "Y8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -5.08 180) + (length 3.81) + (name "Y9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -7.62 180) + (length 3.81) + (name "Y10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -10.16 180) + (length 3.81) + (name "Y11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -12.7 180) + (length 3.81) + (name "Y12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -15.24 180) + (length 3.81) + (name "Y13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -17.78 180) + (length 3.81) + (name "Y14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -20.32 180) + (length 3.81) + (name "Y15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:IDC_2x5" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 1.27 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "IDC_2x5" + (at 1.27 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, double row, 02x05, top/bottom pin numbering scheme (row 1: 1...pins_per_row, row2: pins_per_row+1 ... num_pins), script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_2x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "IDC_2x5_1_1" + (rectangle + (start -1.27 6.35) + (end 3.81 -6.35) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (rectangle + (start -1.27 5.207) + (end 0 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 2.667) + (end 0 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 1.27) + (end 0 -1.27) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -2.413) + (end 0 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -4.953) + (end 0 -5.207) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 5.207) + (end 2.54 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 2.667) + (end 2.54 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 0.127) + (end 2.54 -0.127) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 -2.413) + (end 2.54 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 -4.953) + (end 2.54 -5.207) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 5.08 180) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 2.54 180) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 0 180) + (length 3.81) + (name "Pin_6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 -2.54 180) + (length 3.81) + (name "Pin_8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 -5.08 180) + (length 3.81) + (name "Pin_10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:IRF630" + (pin_names + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" + (at 5.08 1.905 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "IRF630" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 5.08 -1.905 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.st.com/resource/en/datasheet/cd00000701.pdf" + (at 5.08 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "150A Id, 40V Vds, 3.4mOhm Rds, N-Channel MOSFET, DirectFET MT" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "N-Channel MOSFET" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "DirectFET*MT*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "IRF630_0_1" + (polyline + (pts + (xy 0.254 1.905) (xy 0.254 -1.905) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.254 0) (xy -2.54 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 2.286) (xy 0.762 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 0.508) (xy 0.762 -0.508) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 -1.27) (xy 0.762 -2.286) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 -1.778) (xy 3.302 -1.778) (xy 3.302 1.778) (xy 0.762 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.016 0) (xy 2.032 0.381) (xy 2.032 -0.381) (xy 1.016 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center 1.651 0) + (radius 2.794) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 2.54) (xy 2.54 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 2.54 1.778) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center 2.54 -1.778) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 2.54 -2.54) (xy 2.54 0) (xy 0.762 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.794 0.508) (xy 2.921 0.381) (xy 3.683 0.381) (xy 3.81 0.254) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 3.302 0.381) (xy 2.921 -0.254) (xy 3.683 -0.254) (xy 3.302 0.381) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "IRF630_1_1" + (pin input line + (at -5.08 0 0) + (length 2.54) + (name "G" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 5.08 270) + (length 2.54) + (name "D" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 -5.08 90) + (length 2.54) + (name "S" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:REF3440IDBVR" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 1.27 8.89 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "REF3440IDBVR" + (at 1.27 6.35 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" + (at -5.715 -21.59 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/ref3440.pdf" + (at 10.795 -24.765 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Description" "Voltage Reference, SOT-23-6" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOT?23*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "REF3440IDBVR_0_1" + (rectangle + (start -7.62 5.08) + (end 7.62 -7.62) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "REF3440IDBVR_1_1" + (pin input line + (at -10.16 0 0) + (length 2.54) + (name "ENABLE" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -2.54 -10.16 90) + (length 2.54) + (name "GNDS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 7.62 270) + (length 2.54) + (name "VIN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -10.16 90) + (length 2.54) + (name "GNDF" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 0 180) + (length 2.54) + (name "OUT_F" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 10.16 -2.54 180) + (length 2.54) + (name "OUT_S" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:TC4428" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -8.89 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "TC4428" + (at 6.35 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 0 -20.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://ww1.microchip.com/downloads/en/DeviceDoc/20001422G.pdf" + (at 0 -22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "1.5A Dual High-Speed Power MOSFET Drivers" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "MOSFET IGBT driver" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "DIP*W7.62mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "TC4428_0_1" + (rectangle + (start -10.16 5.08) + (end 10.16 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "TC4428_1_1" + (pin input line + (at -12.7 0 0) + (length 2.54) + (name "IN_A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -2.54 0) + (length 2.54) + (name "IN_B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.715 7.62 270) + (length 2.54) + (hide yes) + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.715 -7.62 90) + (length 2.54) + (hide yes) + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 7.62 270) + (length 2.54) + (name "VDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 12.7 0 180) + (length 2.54) + (name "~{OUT_A}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -2.54 180) + (length 2.54) + (name "OUT_B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:ULN2803C" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 0 13.335 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ULN2803C" + (at 0 11.43 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-20W_7.5x12.8mm_P1.27mm" + (at 1.27 -16.51 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/uln2803c.pdf" + (at 3.81 -21.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Darlington Transistor Arrays, SOIC18/DIP18" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Darlington transistor array" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "DIP*W7.62mm* SOIC*7.5x11.6mm*P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "ULN2803C_0_1" + (rectangle + (start -7.62 10.16) + (end 7.62 -17.78) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (polyline + (pts + (xy -4.572 5.08) (xy -3.556 5.08) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.556 6.096) (xy -3.556 4.064) (xy -2.032 5.08) (xy -3.556 6.096) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center -1.778 5.08) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.524 5.08) (xy 4.064 5.08) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center -1.27 2.54) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center -1.27 0) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center -1.27 -2.286) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center -0.508 5.08) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy -0.508 5.08) (xy -0.508 7.62) (xy 2.286 7.62) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 6.731) (xy -1.016 6.731) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 5.969) (xy -1.016 5.969) (xy -0.508 6.731) (xy 0 5.969) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "ULN2803C_1_1" + (pin input line + (at -10.16 5.08 0) + (length 2.54) + (name "I1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 2.54 0) + (length 2.54) + (name "I2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 0 0) + (length 2.54) + (name "I3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -2.54 0) + (length 2.54) + (name "I4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -5.08 0) + (length 2.54) + (name "I5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -7.62 0) + (length 2.54) + (name "I6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -10.16 0) + (length 2.54) + (name "I7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -12.7 0) + (length 2.54) + (name "I8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -10.16 -15.24 0) + (length 2.54) + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -20.32 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 10.16 7.62 180) + (length 2.54) + (name "COM" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin open_collector line + (at 10.16 5.08 180) + (length 2.54) + (name "O1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin open_collector line + (at 10.16 2.54 180) + (length 2.54) + (name "O2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin open_collector line + (at 10.16 0 180) + (length 2.54) + (name "O3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin open_collector line + (at 10.16 -2.54 180) + (length 2.54) + (name "O4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin open_collector line + (at 10.16 -5.08 180) + (length 2.54) + (name "O5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin open_collector line + (at 10.16 -7.62 180) + (length 2.54) + (name "O6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin open_collector line + (at 10.16 -10.16 180) + (length 2.54) + (name "O7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin open_collector line + (at 10.16 -12.7 180) + (length 2.54) + (name "O8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 10.16 -15.24 180) + (length 2.54) + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Transistor_FET:2N7000" + (pin_names + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" + (at 5.08 1.905 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2N7000" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" + (at 5.08 -1.905 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.vishay.com/docs/70226/70226.pdf" + (at 5.08 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "0.2A Id, 200V Vds, N-Channel MOSFET, 2.6V Logic Level, TO-92" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "N-Channel MOSFET Logic-Level" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?92*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "2N7000_0_1" + (polyline + (pts + (xy 0.254 1.905) (xy 0.254 -1.905) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.254 0) (xy -2.54 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 2.286) (xy 0.762 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 0.508) (xy 0.762 -0.508) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 -1.27) (xy 0.762 -2.286) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 -1.778) (xy 3.302 -1.778) (xy 3.302 1.778) (xy 0.762 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.016 0) (xy 2.032 0.381) (xy 2.032 -0.381) (xy 1.016 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center 1.651 0) + (radius 2.794) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 2.54) (xy 2.54 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 2.54 1.778) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center 2.54 -1.778) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 2.54 -2.54) (xy 2.54 0) (xy 0.762 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.794 0.508) (xy 2.921 0.381) (xy 3.683 0.381) (xy 3.81 0.254) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 3.302 0.381) (xy 2.921 -0.254) (xy 3.683 -0.254) (xy 3.302 0.381) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "2N7000_1_1" + (pin input line + (at -5.08 0 0) + (length 2.54) + (name "G" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 5.08 270) + (length 2.54) + (name "D" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 -5.08 90) + (length 2.54) + (name "S" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+12P" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR01" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12P" + (at 0 4.1331 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+12P\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+12P_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+12P_1_1" + (pin power_out line + (at 0 0 90) + (length 0) + (hide yes) + (name "+12P" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+12V" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+12V\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+12V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+12V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (hide yes) + (name "+12V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+3V3" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3V3\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+3V3_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+3V3_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (hide yes) + (name "+3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+5V" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+5V\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+5V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+5V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (hide yes) + (name "+5V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+8V" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+8V" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+8V\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+8V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+8V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (hide yes) + (name "+8V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:GND" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "GND_1_1" + (pin power_in line + (at 0 0 270) + (length 0) + (hide yes) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + ) + (rectangle + (start 175.26 137.16) + (end 182.88 142.24) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid 03ddcc05-a15f-41f0-9156-6ea51b7cb51e) + ) + (circle + (center 355.6 156.21) + (radius 2.8398) + (stroke + (width 0) + (type default) + (color 255 0 0 1) + ) + (fill + (type color) + (color 255 0 0 1) + ) + (uuid 0bd32620-05f3-4a6c-8a18-2c97890d1d26) + ) + (circle + (center 63.5 208.28) + (radius 4.5791) + (stroke + (width 0) + (type dash) + ) + (fill + (type none) + ) + (uuid 0dc2056e-c919-4c32-81fc-9f3e4c6660b5) + ) + (rectangle + (start 283.21 152.4) + (end 323.85 171.45) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid 0f12da5c-4cbc-4bc7-a836-2345474f6691) + ) + (circle + (center 398.78 156.21) + (radius 2.8398) + (stroke + (width 0) + (type default) + (color 255 0 0 1) + ) + (fill + (type color) + (color 255 0 0 1) + ) + (uuid 1295542d-ed6d-4ff5-bf0a-21fc6a0cd5dc) + ) + (arc + (start 367.03 151.13) + (mid 370.84 147.4555) + (end 374.65 151.13) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid 1d69cc14-213e-4816-b23d-22d1b2310a83) + ) + (circle + (center 398.78 163.83) + (radius 2.8398) + (stroke + (width 0) + (type default) + (color 255 0 0 1) + ) + (fill + (type color) + (color 255 0 0 1) + ) + (uuid 272d2899-bac6-4da2-93d4-4e97236de730) + ) + (arc + (start 386.08 147.32) + (mid 388.7838 148.4262) + (end 389.89 151.13) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid 325dc2b8-7d3f-48e3-b7cc-60e36539016a) + ) + (circle + (center 355.6 148.59) + (radius 2.8398) + (stroke + (width 0) + (type default) + (color 255 0 0 1) + ) + (fill + (type color) + (color 255 0 0 1) + ) + (uuid 3acc870f-71fe-40ae-a07e-964a59549ce0) + ) + (circle + (center 398.78 148.59) + (radius 2.8398) + (stroke + (width 0) + (type default) + (color 255 0 0 1) + ) + (fill + (type color) + (color 255 0 0 1) + ) + (uuid 3cddf0e9-806d-4912-a712-a311541de65c) + ) + (rectangle + (start 124.46 36.83) + (end 129.54 44.45) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid 44fd1739-639c-4a9b-aae3-720eda0725ab) + ) + (rectangle + (start 217.17 135.89) + (end 280.67 158.75) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid 600708f3-c4e5-4f61-9035-7798d7362aab) + ) + (rectangle + (start 217.17 160.02) + (end 270.51 248.92) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid 79502eb0-d11d-42c1-85a0-70c64f1ed742) + ) + (rectangle + (start 54.61 62.23) + (end 59.69 69.85) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid 8782288d-d492-434c-9f7b-f09ac8da21e5) + ) + (circle + (center 370.84 160.02) + (radius 1.7961) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid 87ba7071-fda6-41a8-b31f-66a076e0867a) + ) + (circle + (center 60.96 240.03) + (radius 5.08) + (stroke + (width 0) + (type dash) + ) + (fill + (type none) + ) + (uuid a5e29514-9291-4469-bc73-7e1ed1f5c047) + ) + (circle + (center 78.74 232.41) + (radius 2.8398) + (stroke + (width 0) + (type dash) + ) + (fill + (type none) + ) + (uuid aa6fe243-ed39-47b7-aa9e-e6e80a276d16) + ) + (circle + (center 370.84 152.4) + (radius 1.7961) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid c5e201e5-a780-4589-b621-8f3a3d2a0551) + ) + (rectangle + (start 283.21 182.88) + (end 323.85 252.73) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid d0045844-b449-476d-b610-30bc174f2ace) + ) + (circle + (center 355.6 163.83) + (radius 2.8398) + (stroke + (width 0) + (type default) + (color 255 0 0 1) + ) + (fill + (type color) + (color 255 0 0 1) + ) + (uuid d52d1ab3-a70f-460c-a526-85e9fa7bb1e3) + ) + (arc + (start 389.89 161.29) + (mid 388.7829 163.9929) + (end 386.08 165.1) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid de993dbb-38b6-44d0-9404-3163f83e3b63) + ) + (rectangle + (start 217.17 250.19) + (end 280.67 274.32) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid e1a9c544-56d7-4ca1-8ab4-5dffbd66ec9f) + ) + (rectangle + (start 344.17 138.43) + (end 407.67 181.61) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid e654ede3-43bc-4cbc-a51f-89ce2166a201) + ) + (arc + (start 374.65 161.29) + (mid 370.84 164.9645) + (end 367.03 161.29) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (uuid e682989c-9cea-4aaf-921d-159ca8159ad3) + ) + (text "Choose a readout method:\nA) Digitize and read via I2C\nB) Analog voltages out through J21" + (exclude_from_sim no) + (at 285.75 180.34 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "087add68-49fe-40f7-9096-41209797a3e6") + ) + (text "Transmit/\nReceive \nSwitch" + (exclude_from_sim no) + (at 308.61 93.98 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "0e9dcc61-4ea0-4e9f-8a71-8c4011365361") + ) + (text "REF" + (exclude_from_sim no) + (at 397.51 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "14c79130-51c6-48ff-95e0-39799614499c") + ) + (text "20W: N = 10\n100W: N = 20\n26 dB attenuation:\n R17,R22 = 498 Ohms\n R16,R18,R24,R25 = 55.2 Ohms" + (exclude_from_sim no) + (at 365.76 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "14de90df-eae9-43ec-8b57-2eccc8428541") + ) + (text "LPF" + (exclude_from_sim no) + (at 180.34 140.97 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "1559a6fd-60c8-423c-8c45-3ea43339fe1e") + ) + (text "6" + (exclude_from_sim no) + (at 354.33 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "16f1c975-a505-4215-bc8b-f3fc38d601a2") + ) + (text "Choose a power detection option.\n1) Logarithmic-amplifier based detection\n2) Diode based detection" + (exclude_from_sim no) + (at 219.71 281.94 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "1829357b-0e0a-4b2d-8cfc-c320f4bc1cc4") + ) + (text "FWD" + (exclude_from_sim no) + (at 353.06 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "1c2f3ec0-eba5-4e1e-aadd-8bb70ae151a9") + ) + (text "↓" + (exclude_from_sim no) + (at 63.5 21.59 0) + (effects + (font + (size 8 8) + (thickness 1.6) + (bold yes) + (color 255 0 0 1) + ) + (justify left bottom) + ) + (uuid "23442aad-4d22-4f77-9a55-62c4ea2ed44a") + ) + (text "1" + (exclude_from_sim no) + (at 354.33 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "25049519-59c7-4527-97cb-66aaab110cab") + ) + (text "Option B: Detected power analog out" + (exclude_from_sim no) + (at 284.48 154.94 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "2593ba1c-0007-4827-a874-75eedf852667") + ) + (text "→" + (exclude_from_sim no) + (at 203.2 24.13 90) + (effects + (font + (size 8 8) + (thickness 1.6) + (bold yes) + (color 0 255 0 1) + ) + (justify left bottom) + ) + (uuid "26fce53f-3e6d-423b-a98a-6928f2ad1c30") + ) + (text "I2C address\nselect" + (exclude_from_sim no) + (at 34.29 278.13 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "3736a516-c72e-4715-8093-c616cd678f02") + ) + (text "4" + (exclude_from_sim no) + (at 398.78 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3c7d5e97-0812-447f-b3ed-40b9692c2860") + ) + (text "RX SIGNAL \nPATH" + (exclude_from_sim no) + (at 189.23 72.39 0) + (effects + (font + (size 4 4) + (bold yes) + (color 0 255 0 1) + ) + (justify left bottom) + ) + (uuid "3d9ea206-35e4-4bfc-a418-863fd098cd15") + ) + (text "TX SIGNAL\nPATH" + (exclude_from_sim no) + (at 76.2 137.16 0) + (effects + (font + (size 4 4) + (bold yes) + (color 255 0 0 1) + ) + (justify left bottom) + ) + (uuid "418fd642-a301-40ba-9fcf-4eec3ca806b9") + ) + (text "RF out" + (exclude_from_sim no) + (at 396.24 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "48e77abf-3337-4c7e-bb43-1cecd8a82046") + ) + (text "3" + (exclude_from_sim no) + (at 354.33 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "4d2d3a1e-1acd-4e2b-98ed-accec8612987") + ) + (text "XVTR RF OUT" + (exclude_from_sim no) + (at 92.71 80.01 0) + (effects + (font + (size 4 4) + (bold yes) + ) + (justify left bottom) + ) + (uuid "4d35a2fb-9d46-4cf1-8882-c1235adb944e") + ) + (text "→" + (exclude_from_sim no) + (at 64.77 85.09 0) + (effects + (font + (size 8 8) + (thickness 1.6) + (bold yes) + (color 255 0 0 1) + ) + (justify left bottom) + ) + (uuid "4e620c9c-29a6-4a2c-9a0b-0cbeaa0db6c4") + ) + (text "LFP band\nselect" + (exclude_from_sim no) + (at 49.53 207.01 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "50633e4b-a2fd-42c6-be1e-0c7576bb5c93") + ) + (text "BN43-202" + (exclude_from_sim no) + (at 200.66 217.17 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "52c68944-c118-4990-b9a1-95cac35e5798") + ) + (text "TX RF IN" + (exclude_from_sim no) + (at 33.02 20.32 0) + (effects + (font + (size 4 4) + (bold yes) + ) + (justify left bottom) + ) + (uuid "57848370-7115-4b63-a62d-dbdc405017e6") + ) + (text "↑\nor↓" + (exclude_from_sim no) + (at 154.94 120.65 0) + (effects + (font + (size 4 4) + (thickness 0.6) + (bold yes) + (color 255 0 0 1) + ) + (justify left bottom) + ) + (uuid "60ab5b84-403d-470b-a541-b0199dca2987") + ) + (text "GND" + (exclude_from_sim no) + (at 402.59 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "632ce9c6-294d-482f-a6e1-2c67193f59fe") + ) + (text "SWR measurement" + (exclude_from_sim no) + (at 219.71 134.62 0) + (effects + (font + (size 3 3) + (thickness 0.6) + (bold yes) + ) + (justify left bottom) + ) + (uuid "633212ec-9b19-4ab3-bd74-81758a539a63") + ) + (text "→" + (exclude_from_sim no) + (at 311.15 72.39 90) + (effects + (font + (size 8 8) + (thickness 2.4) + (bold yes) + (color 255 0 0 1) + ) + (justify left bottom) + ) + (uuid "6ac290ed-1a58-43cf-a39b-9707c4fdd7c6") + ) + (text "ANTENNAS" + (exclude_from_sim no) + (at 344.17 21.59 0) + (effects + (font + (size 4 4) + (bold yes) + ) + (justify left bottom) + ) + (uuid "71de9df8-9b3f-427a-a392-3e5a10c490af") + ) + (text "↑or↑" + (exclude_from_sim no) + (at 133.35 43.18 0) + (effects + (font + (size 4 4) + (thickness 0.6) + (bold yes) + (color 0 255 0 1) + ) + (justify left bottom) + ) + (uuid "7261d763-27eb-4fb3-9b5b-3dff0f0493f6") + ) + (text "←" + (exclude_from_sim no) + (at 184.15 63.5 0) + (effects + (font + (size 8 8) + (thickness 1.6) + (bold yes) + (color 0 255 0 1) + ) + (justify left bottom) + ) + (uuid "733c0c34-c7bc-41cb-bcc1-7a3685bdc8ce") + ) + (text "↓" + (exclude_from_sim no) + (at 196.85 182.88 0) + (effects + (font + (size 8 8) + (thickness 1.6) + (bold yes) + (color 255 0 0 1) + ) + (justify left bottom) + ) + (uuid "75cc0b3d-77f4-4097-89f5-cbaec41d388f") + ) + (text "N turns" + (exclude_from_sim no) + (at 386.08 149.86 0) + (effects + (font + (size 1.27 1.27) + (color 255 153 0 1) + ) + (justify right bottom) + ) + (uuid "7744e593-68bc-42f2-8372-cd7e41f287de") + ) + (text "↓or↓" + (exclude_from_sim no) + (at 109.22 50.8 0) + (effects + (font + (size 4 4) + (thickness 0.6) + (bold yes) + (color 255 0 0 1) + ) + (justify left bottom) + ) + (uuid "7a59d871-153d-4e79-a5b5-b1298c95b258") + ) + (text "2" + (exclude_from_sim no) + (at 398.78 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "82f48984-1782-4ab4-a446-37afc3d5bbf7") + ) + (text "1.8 MHZ HPF" + (exclude_from_sim no) + (at 228.6 99.06 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "855e2861-a416-4f77-bdf3-fad83fbea586") + ) + (text "Power supply" + (exclude_from_sim no) + (at 353.06 190.5 0) + (effects + (font + (size 3 3) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "9c49fdee-ad63-4e9c-9522-d37f414513ab") + ) + (text "N/C" + (exclude_from_sim no) + (at 346.71 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "a0304b97-be2f-4838-8e7e-dcd58ed5482b") + ) + (text "ATTN" + (exclude_from_sim no) + (at 58.42 68.58 90) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a1b867dc-5df9-444e-beee-40ef76c43cd4") + ) + (text "PAD: Set for \n20W or 200W" + (exclude_from_sim no) + (at 220.98 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "a366eedd-00bd-49ea-b5aa-2818db4e80cf") + ) + (text "N turns" + (exclude_from_sim no) + (at 386.08 163.83 0) + (effects + (font + (size 1.27 1.27) + (color 255 0 255 1) + ) + (justify right bottom) + ) + (uuid "a840ee5a-8e0f-4b5f-a8b3-4a60c9bf6fd7") + ) + (text "→" + (exclude_from_sim no) + (at 123.19 133.35 0) + (effects + (font + (size 8 8) + (thickness 1.6) + (bold yes) + (color 255 0 0 1) + ) + (justify left bottom) + ) + (uuid "ae26249b-0547-423e-91b0-cf15d1d325e2") + ) + (text "RX RF OUT" + (exclude_from_sim no) + (at 204.47 20.32 0) + (effects + (font + (size 4 4) + (bold yes) + ) + (justify left bottom) + ) + (uuid "b61661f0-0c86-4553-b35b-47cd6cf6894c") + ) + (text "Option 2: Diode detector option (part 1/2)" + (exclude_from_sim no) + (at 223.52 138.43 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "b8fcb0d2-c21d-4443-96e1-80ce2ea07f58") + ) + (text "BPF" + (exclude_from_sim no) + (at 128.27 43.18 90) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "ba47f912-8e46-44d2-8116-ad475a905a8c") + ) + (text "Option 2: Diode detector option (part 2/2)" + (exclude_from_sim no) + (at 224.79 273.05 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "c14f3b54-e315-4be1-a3ce-e2f2596ced73") + ) + (text "5" + (exclude_from_sim no) + (at 398.78 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "c1a6f7bb-13fb-44df-9d82-2b648e5eaa85") + ) + (text "Control signal breakout and drivers" + (exclude_from_sim no) + (at 13.97 157.48 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "c50e7520-7695-48b5-831f-7bf288784a95") + ) + (text "Option A: Digitize detected power" + (exclude_from_sim no) + (at 284.48 185.42 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "cc7148cf-00a8-4517-8feb-8373c3d46c43") + ) + (text "TX path\nselect" + (exclude_from_sim no) + (at 66.04 240.03 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "d9935f66-fe67-451d-8e7f-4e585f5919c2") + ) + (text "Antenna select" + (exclude_from_sim no) + (at 71.12 228.6 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "e22cb3e4-e6bb-4f7e-957f-df425856974f") + ) + (text "Option 1: Log-amp detector option" + (exclude_from_sim no) + (at 223.52 162.56 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "effb771f-bc96-4420-a617-bad735271db8") + ) + (text "RF in" + (exclude_from_sim no) + (at 353.06 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "f7ed411b-0ebf-42ef-a135-8be1113a2733") + ) + (text "BN43-202 winding guide and pad values" + (exclude_from_sim no) + (at 397.51 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "fbd673d1-4820-4b83-9ad0-e9820046d276") + ) + (text_box "Board mounting holes" + (exclude_from_sim no) + (at 383.54 55.88 0) + (size 22.86 17.78) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left top) + ) + (uuid "f8dff638-d9c8-4d77-a669-507378d79194") + ) + (junction + (at 356.87 128.27) + (diameter 0) + (color 0 0 0 0) + (uuid "005a00ea-13c5-4e67-b255-f2522c758f92") + ) + (junction + (at 78.74 233.68) + (diameter 0) + (color 0 0 0 0) + (uuid "03d39f31-f2df-4ebf-bdf7-8bc2e5e8bf4f") + ) + (junction + (at 279.4 210.82) + (diameter 0) + (color 0 0 0 0) + (uuid "0948af34-d0c9-4131-b0fc-4a1e4a7127d3") + ) + (junction + (at 132.08 191.77) + (diameter 0) + (color 0 0 0 0) + (uuid "0c59c2bc-f152-4cf0-ab0f-838fe6772889") + ) + (junction + (at 267.97 86.36) + (diameter 0) + (color 0 0 0 0) + (uuid "0cf4c120-ab1e-49fc-b02f-421496be0314") + ) + (junction + (at 255.27 214.63) + (diameter 0) + (color 0 0 0 0) + (uuid "0d470313-c131-4cd9-95bb-30985923c8f0") + ) + (junction + (at 222.25 143.51) + (diameter 0) + (color 0 0 0 0) + (uuid "0e5d7bf9-3194-4e7a-9a56-572c071c4198") + ) + (junction + (at 316.23 99.06) + (diameter 0) + (color 0 0 0 0) + (uuid "16448ae8-bfa7-460e-91df-84fa2726fd20") + ) + (junction + (at 255.27 168.91) + (diameter 0) + (color 0 0 0 0) + (uuid "187b622e-2b4e-4542-a671-f5015e77f40c") + ) + (junction + (at 356.87 238.76) + (diameter 0) + (color 0 0 0 0) + (uuid "1a0ad7e0-cd03-41d1-99c0-f0e026900171") + ) + (junction + (at 308.61 101.6) + (diameter 0) + (color 0 0 0 0) + (uuid "1bc45510-ab5f-4955-b2a1-477686960d48") + ) + (junction + (at 243.84 86.36) + (diameter 0) + (color 0 0 0 0) + (uuid "1c532f58-bd07-4c2b-b1bf-4b245f88c264") + ) + (junction + (at 370.84 246.38) + (diameter 0) + (color 0 0 0 0) + (uuid "1cc9848f-5d60-4168-8afd-aaf544c924aa") + ) + (junction + (at 162.56 163.83) + (diameter 0) + (color 0 0 0 0) + (uuid "1dc9f0c5-fb91-48ed-8a0b-9566ba2a87bf") + ) + (junction + (at 62.23 182.88) + (diameter 0) + (color 0 0 0 0) + (uuid "20a2a0a1-97ae-4b9f-9d4b-f4a47604648b") + ) + (junction + (at 347.98 128.27) + (diameter 0) + (color 0 0 0 0) + (uuid "22310034-baa9-42cf-8e21-2521729e5b6b") + ) + (junction + (at 21.59 234.95) + (diameter 0) + (color 0 0 0 0) + (uuid "227b1029-dcdd-4c7c-a6e9-78b67397c905") + ) + (junction + (at 381 207.01) + (diameter 0) + (color 0 0 0 0) + (uuid "2282b5dd-135f-4b5f-95aa-49c014082d1e") + ) + (junction + (at 267.97 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "26525595-5752-4576-9714-f9834857b72d") + ) + (junction + (at 43.18 213.36) + (diameter 0) + (color 0 0 0 0) + (uuid "293e8449-8c40-4a8f-8c8d-a224c5ce3952") + ) + (junction + (at 347.98 120.65) + (diameter 0) + (color 0 0 0 0) + (uuid "2a96a380-db17-4746-b8cd-67c93c1fddd5") + ) + (junction + (at 302.26 83.82) + (diameter 0) + (color 0 0 0 0) + (uuid "2ae2ebc9-b454-472a-a51d-eff49a76cb0e") + ) + (junction + (at 127 24.13) + (diameter 0) + (color 0 0 0 0) + (uuid "2b4b5d02-6b20-456c-9a4d-1ecaee5014d9") + ) + (junction + (at 132.08 154.94) + (diameter 0) + (color 0 0 0 0) + (uuid "2f3144ba-1533-4192-82a2-7ee4beecf73c") + ) + (junction + (at 355.6 199.39) + (diameter 0) + (color 0 0 0 0) + (uuid "31b5f7dc-43cb-4314-9d2f-26536be978bb") + ) + (junction + (at 170.18 222.25) + (diameter 0) + (color 0 0 0 0) + (uuid "31ea1b95-8a32-4687-bea9-5efe8409c5fd") + ) + (junction + (at 375.92 207.01) + (diameter 0) + (color 0 0 0 0) + (uuid "342b961a-4573-488a-ac10-f5f670da32f4") + ) + (junction + (at 375.92 246.38) + (diameter 0) + (color 0 0 0 0) + (uuid "34dfcdc1-fae0-41aa-bdfc-3ff584fe47fe") + ) + (junction + (at 77.47 231.14) + (diameter 0) + (color 0 0 0 0) + (uuid "35c8df4f-acc9-4633-b273-e42c7af815dc") + ) + (junction + (at 63.5 187.96) + (diameter 0) + (color 0 0 0 0) + (uuid "38e01a8e-5c36-4a77-b83f-6571193c9ecb") + ) + (junction + (at 229.87 172.72) + (diameter 0) + (color 0 0 0 0) + (uuid "3c23cf98-6a75-4083-a1c3-093d8f15c052") + ) + (junction + (at 284.48 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "40f7384f-83a9-4b2f-84ea-e4efa993ac29") + ) + (junction + (at 238.76 256.54) + (diameter 0) + (color 0 0 0 0) + (uuid "42ca05e8-6671-4811-96f9-8deaf190a6cc") + ) + (junction + (at 237.49 143.51) + (diameter 0) + (color 0 0 0 0) + (uuid "45d83a9f-22fc-4d9a-9282-31c543a0f31d") + ) + (junction + (at 254 243.84) + (diameter 0) + (color 0 0 0 0) + (uuid "45e5771e-ea8c-453e-9a83-2300edb17efa") + ) + (junction + (at 163.83 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "472f29c9-eee7-46df-b10c-4c2e7b0afe22") + ) + (junction + (at 328.93 199.39) + (diameter 0) + (color 0 0 0 0) + (uuid "4a2c4310-53a1-41a6-8970-e417691b2f21") + ) + (junction + (at 166.37 120.65) + (diameter 0) + (color 0 0 0 0) + (uuid "4bbeffc3-d4a7-41aa-87c5-f4d9a6ede428") + ) + (junction + (at 281.94 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "4d29cc78-3674-47b2-988f-14f4907f458c") + ) + (junction + (at 222.25 172.72) + (diameter 0) + (color 0 0 0 0) + (uuid "4f7b48e9-845d-40b6-a613-55f8331c9176") + ) + (junction + (at 351.79 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "581ad681-0e65-4ba7-972b-884d8dfbf654") + ) + (junction + (at 121.92 224.79) + (diameter 0) + (color 0 0 0 0) + (uuid "589d1fc3-78df-4b6f-a6df-315a3373ec80") + ) + (junction + (at 115.57 274.32) + (diameter 0) + (color 0 0 0 0) + (uuid "5f152757-2193-49c4-8740-dd9f70928007") + ) + (junction + (at 85.09 241.3) + (diameter 0) + (color 0 0 0 0) + (uuid "5fce7c5a-01df-48d8-8a9c-5c42f11b5b9a") + ) + (junction + (at 212.09 215.9) + (diameter 0) + (color 0 0 0 0) + (uuid "61a53499-f11b-44d1-807f-7e146b10a4bb") + ) + (junction + (at 250.19 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "64d78268-2e22-4580-bcd6-f9e68a0dfa70") + ) + (junction + (at 393.7 199.39) + (diameter 0) + (color 0 0 0 0) + (uuid "66947dd7-05e7-4a60-9a28-261c30a47f39") + ) + (junction + (at 110.49 217.17) + (diameter 0) + (color 0 0 0 0) + (uuid "67583876-05fc-4a3f-b8b5-7ed289326a58") + ) + (junction + (at 279.4 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "67c52bc5-6bfb-467a-8cd8-39f9ca3863f6") + ) + (junction + (at 227.33 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "6d8d6948-ea27-44de-accd-ef47a4d94588") + ) + (junction + (at 191.77 134.62) + (diameter 0) + (color 0 0 0 0) + (uuid "6dad17f0-9899-427d-9756-2edb70ac5c50") + ) + (junction + (at 344.17 80.01) + (diameter 0) + (color 0 0 0 0) + (uuid "71e9dbb0-98f4-4166-b596-54f49cb68723") + ) + (junction + (at 81.28 40.64) + (diameter 0) + (color 0 0 0 0) + (uuid "7365c40b-222a-4378-8b8d-56a7dd3edaab") + ) + (junction + (at 284.48 105.41) + (diameter 0) + (color 0 0 0 0) + (uuid "77803efd-de1c-48c8-b3fa-f1501d061c79") + ) + (junction + (at 64.77 193.04) + (diameter 0) + (color 0 0 0 0) + (uuid "7aa83067-1928-47da-a5f7-8e8caa453f58") + ) + (junction + (at 302.26 81.28) + (diameter 0) + (color 0 0 0 0) + (uuid "82bc9318-0dab-4128-807c-e0397044ad97") + ) + (junction + (at 82.55 217.17) + (diameter 0) + (color 0 0 0 0) + (uuid "853b2fe6-5abb-47fc-b4f3-3ce11a0e909a") + ) + (junction + (at 229.87 220.98) + (diameter 0) + (color 0 0 0 0) + (uuid "872ce871-0569-4348-9279-2516d0505ff5") + ) + (junction + (at 222.25 177.8) + (diameter 0) + (color 0 0 0 0) + (uuid "87a2633d-a092-4954-a87d-fe9ed5d19e2e") + ) + (junction + (at 237.49 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "88a7b9d6-a37d-4f98-9d14-a08ae15fef9f") + ) + (junction + (at 238.76 266.7) + (diameter 0) + (color 0 0 0 0) + (uuid "88df601b-bf9a-4c56-8b24-8f3127289f51") + ) + (junction + (at 255.27 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "89af1293-7086-4c15-b8c9-58fdee300e25") + ) + (junction + (at 110.49 181.61) + (diameter 0) + (color 0 0 0 0) + (uuid "8bc2044c-80c1-4f0a-a5a9-a611805fc7c7") + ) + (junction + (at 302.26 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "8c0e28ae-d7ec-4cc5-829e-88496c6ae4e2") + ) + (junction + (at 125.73 248.92) + (diameter 0) + (color 0 0 0 0) + (uuid "8cdd83b2-8b7c-40ac-afa4-e4def67ec327") + ) + (junction + (at 346.71 220.98) + (diameter 0) + (color 0 0 0 0) + (uuid "8f1c539d-8461-4f09-80de-2f3b568e348f") + ) + (junction + (at 147.32 262.89) + (diameter 0) + (color 0 0 0 0) + (uuid "8f4bf319-380e-4f91-8cb2-764c4cec7b9a") + ) + (junction + (at 231.14 153.67) + (diameter 0) + (color 0 0 0 0) + (uuid "8f9720a1-b68d-43ec-964e-62a42f0c1c09") + ) + (junction + (at 138.43 256.54) + (diameter 0) + (color 0 0 0 0) + (uuid "8fc6ac00-2687-4167-9adb-824aa13ce40c") + ) + (junction + (at 355.6 220.98) + (diameter 0) + (color 0 0 0 0) + (uuid "90e19af9-998a-45c2-86b4-12e5db518e8f") + ) + (junction + (at 21.59 261.62) + (diameter 0) + (color 0 0 0 0) + (uuid "921b9c7d-85fc-4251-a0c3-d57326150da0") + ) + (junction + (at 125.73 246.38) + (diameter 0) + (color 0 0 0 0) + (uuid "9236e46e-9db3-4bb3-b86c-151ce1176cbb") + ) + (junction + (at 127 62.23) + (diameter 0) + (color 0 0 0 0) + (uuid "966674fb-d1b4-4003-aa8c-92b16f58dd10") + ) + (junction + (at 393.7 238.76) + (diameter 0) + (color 0 0 0 0) + (uuid "9da3c1ba-eac7-4376-9594-28a475f4f8f2") + ) + (junction + (at 41.91 40.64) + (diameter 0) + (color 0 0 0 0) + (uuid "9de01915-4b3b-4094-a50e-1f5b8ea0ee10") + ) + (junction + (at 292.1 234.95) + (diameter 0) + (color 0 0 0 0) + (uuid "a14fd65c-ee92-44bd-9851-80d4686523af") + ) + (junction + (at 237.49 215.9) + (diameter 0) + (color 0 0 0 0) + (uuid "a264c602-e897-4eed-8c85-8556b15bc71c") + ) + (junction + (at 237.49 172.72) + (diameter 0) + (color 0 0 0 0) + (uuid "a2e53079-6f2f-4f05-b485-662bcc33e3c9") + ) + (junction + (at 364.49 228.6) + (diameter 0) + (color 0 0 0 0) + (uuid "a3744ad0-f546-4bf5-8e07-7d583992ceaa") + ) + (junction + (at 33.02 269.24) + (diameter 0) + (color 0 0 0 0) + (uuid "a38311ad-4e88-42fc-bf94-b08aceb903f2") + ) + (junction + (at 148.59 220.98) + (diameter 0) + (color 0 0 0 0) + (uuid "a535c922-f4c9-428a-bf60-31e4ddd4403b") + ) + (junction + (at 328.93 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "a5d0cb1d-f4dd-4f89-af90-6d07bd28e2b7") + ) + (junction + (at 16.51 251.46) + (diameter 0) + (color 0 0 0 0) + (uuid "a6042d77-2b60-4cfb-8b82-a180fb63a5f6") + ) + (junction + (at 387.35 67.31) + (diameter 0) + (color 0 0 0 0) + (uuid "a67df88d-d11f-4e82-aa0d-ed61571a7363") + ) + (junction + (at 375.92 228.6) + (diameter 0) + (color 0 0 0 0) + (uuid "a9547518-2ad0-4c96-b811-9d8a807f3aad") + ) + (junction + (at 234.95 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "af5bd88f-c6da-4e03-9970-02b514437476") + ) + (junction + (at 267.97 83.82) + (diameter 0) + (color 0 0 0 0) + (uuid "b2038b79-43fa-4197-8961-d5ba02e9c997") + ) + (junction + (at 375.92 238.76) + (diameter 0) + (color 0 0 0 0) + (uuid "b25e2f3b-07ea-4205-8784-c0feaac82a66") + ) + (junction + (at 364.49 207.01) + (diameter 0) + (color 0 0 0 0) + (uuid "b5a9d625-fdd8-4711-b5d0-8e8348df7b83") + ) + (junction + (at 273.05 193.04) + (diameter 0) + (color 0 0 0 0) + (uuid "b8474560-6419-4e0a-a96f-0f6d0ee62a0d") + ) + (junction + (at 163.83 207.01) + (diameter 0) + (color 0 0 0 0) + (uuid "b96eb459-14d3-4920-8813-f743a0d7eb92") + ) + (junction + (at 33.02 86.36) + (diameter 0) + (color 0 0 0 0) + (uuid "ba145605-3e07-4e95-8aa4-b736dce3ad5e") + ) + (junction + (at 43.18 269.24) + (diameter 0) + (color 0 0 0 0) + (uuid "badf1476-eaf9-4617-b4d8-571b4a9e8d70") + ) + (junction + (at 375.92 199.39) + (diameter 0) + (color 0 0 0 0) + (uuid "bbc897e7-99ca-4788-b042-6f88ff8bfc7a") + ) + (junction + (at 302.26 116.84) + (diameter 0) + (color 0 0 0 0) + (uuid "bc20d93b-f602-4741-8af4-43487482ac14") + ) + (junction + (at 237.49 153.67) + (diameter 0) + (color 0 0 0 0) + (uuid "bca2d6df-0701-406d-98b1-5ed0ae9d9db0") + ) + (junction + (at 33.02 273.05) + (diameter 0) + (color 0 0 0 0) + (uuid "bdbf44e0-336d-409f-a572-f0d48f9021e2") + ) + (junction + (at 295.91 193.04) + (diameter 0) + (color 0 0 0 0) + (uuid "bdc694ba-1b18-4740-9097-5b55aa970044") + ) + (junction + (at 375.92 220.98) + (diameter 0) + (color 0 0 0 0) + (uuid "be539c41-737a-4c59-9812-ab6834420d74") + ) + (junction + (at 226.06 198.12) + (diameter 0) + (color 0 0 0 0) + (uuid "c0ec30fa-bc7e-4abf-a5ce-597620daa995") + ) + (junction + (at 306.07 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "c20fd360-5205-4817-bec9-51aefd088b79") + ) + (junction + (at 255.27 212.09) + (diameter 0) + (color 0 0 0 0) + (uuid "c23583f7-24dd-41c0-8fc7-38e987edbcc9") + ) + (junction + (at 67.31 163.83) + (diameter 0) + (color 0 0 0 0) + (uuid "c356211d-ce2f-40cc-aa42-243445769886") + ) + (junction + (at 66.04 198.12) + (diameter 0) + (color 0 0 0 0) + (uuid "c701e64b-3c60-4f2d-99d1-57d7b5f5b63f") + ) + (junction + (at 254 200.66) + (diameter 0) + (color 0 0 0 0) + (uuid "c88e3aab-818d-44bb-90fd-50dada106730") + ) + (junction + (at 185.42 40.64) + (diameter 0) + (color 0 0 0 0) + (uuid "c9254f81-6205-4c10-b7fb-d63f6dc3de9a") + ) + (junction + (at 252.73 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "ca88ded0-f621-4bdb-be9a-0d7e16315044") + ) + (junction + (at 232.41 266.7) + (diameter 0) + (color 0 0 0 0) + (uuid "d0433aca-162c-418f-945f-6f02d3ab815d") + ) + (junction + (at 349.25 199.39) + (diameter 0) + (color 0 0 0 0) + (uuid "d0521bec-f403-43d7-9be8-af7066122567") + ) + (junction + (at 302.26 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "d0c441aa-7573-4274-a41a-9c6909abc079") + ) + (junction + (at 260.35 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "d16e8720-6e3b-4d5c-8213-1bcfb46446fd") + ) + (junction + (at 281.94 213.36) + (diameter 0) + (color 0 0 0 0) + (uuid "d3502b86-f9bf-4564-b331-2df69f2c9258") + ) + (junction + (at 182.88 222.25) + (diameter 0) + (color 0 0 0 0) + (uuid "d6dc19a3-11ad-4454-b857-56f4b8444468") + ) + (junction + (at 332.74 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "d8056910-0c55-4a30-8728-b8788f3a805f") + ) + (junction + (at 302.26 86.36) + (diameter 0) + (color 0 0 0 0) + (uuid "d87fec93-3161-448f-beac-757c182e1dd2") + ) + (junction + (at 226.06 241.3) + (diameter 0) + (color 0 0 0 0) + (uuid "d8f8c94c-32b3-419a-830e-18a12334d2f4") + ) + (junction + (at 222.25 215.9) + (diameter 0) + (color 0 0 0 0) + (uuid "d9f8da13-fde4-470f-90ca-7ef4a9a1868d") + ) + (junction + (at 162.56 199.39) + (diameter 0) + (color 0 0 0 0) + (uuid "da161f7f-d062-4593-a89d-f0a770b83b9a") + ) + (junction + (at 223.52 256.54) + (diameter 0) + (color 0 0 0 0) + (uuid "dd03d349-13c9-4cb1-b871-9eac30cf7c73") + ) + (junction + (at 304.8 247.65) + (diameter 0) + (color 0 0 0 0) + (uuid "dd847913-8900-4804-8e38-3faf5152fedf") + ) + (junction + (at 187.96 54.61) + (diameter 0) + (color 0 0 0 0) + (uuid "e0bf4393-95ca-441b-ab77-d40cb8865275") + ) + (junction + (at 302.26 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "e1ec33e9-4174-4555-95e0-f87becba1e7b") + ) + (junction + (at 309.88 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "e42000c8-33fa-49ea-b923-55c0262cefbf") + ) + (junction + (at 287.02 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "e72265d4-26f8-4bed-a749-0bb7c2db3c91") + ) + (junction + (at 212.09 172.72) + (diameter 0) + (color 0 0 0 0) + (uuid "e75b6417-3b85-4411-a4c7-50e631c9fe07") + ) + (junction + (at 15.24 251.46) + (diameter 0) + (color 0 0 0 0) + (uuid "e773ce18-bdbf-4a41-94d7-995f0044b134") + ) + (junction + (at 121.92 189.23) + (diameter 0) + (color 0 0 0 0) + (uuid "ea865d1a-ac35-440a-a57c-4e3091bc00d5") + ) + (junction + (at 229.87 177.8) + (diameter 0) + (color 0 0 0 0) + (uuid "ef8c6408-683c-4399-a296-00e26eed22a2") + ) + (junction + (at 287.02 234.95) + (diameter 0) + (color 0 0 0 0) + (uuid "f09b10b7-6d14-4818-beee-2b06d3f72f2f") + ) + (junction + (at 365.76 246.38) + (diameter 0) + (color 0 0 0 0) + (uuid "f1929b62-8865-400c-9d57-387bd872ad57") + ) + (junction + (at 346.71 199.39) + (diameter 0) + (color 0 0 0 0) + (uuid "f29510ee-6aff-46d4-be07-9f2902a0603b") + ) + (junction + (at 303.53 226.06) + (diameter 0) + (color 0 0 0 0) + (uuid "f36dd7ec-93c7-408b-b77b-5c926826f278") + ) + (junction + (at 303.53 247.65) + (diameter 0) + (color 0 0 0 0) + (uuid "f45d48a2-1767-437a-9328-3c699a982736") + ) + (junction + (at 229.87 215.9) + (diameter 0) + (color 0 0 0 0) + (uuid "f4aa4f7b-e8c0-47a4-901e-984dc1262bd7") + ) + (junction + (at 359.41 100.33) + (diameter 0) + (color 0 0 0 0) + (uuid "f5d01e67-45ff-46f6-b099-3e9c141ef4a7") + ) + (junction + (at 222.25 220.98) + (diameter 0) + (color 0 0 0 0) + (uuid "f65a5c4d-d06c-42d4-a878-63aec83c73af") + ) + (junction + (at 111.76 260.35) + (diameter 0) + (color 0 0 0 0) + (uuid "f6b8a82c-e942-474c-9c37-0a7ea18840e1") + ) + (junction + (at 77.47 54.61) + (diameter 0) + (color 0 0 0 0) + (uuid "f75e7b0c-8211-49cb-ad43-7fd7252e7720") + ) + (junction + (at 273.05 236.22) + (diameter 0) + (color 0 0 0 0) + (uuid "faf0510a-f6c5-495c-b3ea-9eb06fd6e61e") + ) + (junction + (at 330.2 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "fb2fcc74-e68c-4110-a166-bc5d1eb8512c") + ) + (junction + (at 22.86 259.08) + (diameter 0) + (color 0 0 0 0) + (uuid "fcbdbc89-3b78-4fc8-8bf0-142d3ddb9028") + ) + (junction + (at 24.13 256.54) + (diameter 0) + (color 0 0 0 0) + (uuid "fda4c7fa-ef5a-4d51-8461-3d8f63a92a92") + ) + (junction + (at 175.26 222.25) + (diameter 0) + (color 0 0 0 0) + (uuid "ffe0f409-cf93-4a4a-a28d-25ae7e317a12") + ) + (no_connect + (at 107.95 246.38) + (uuid "0fc31141-06c5-4c9e-8a40-594e9a4f1e39") + ) + (no_connect + (at 336.55 44.45) + (uuid "23c4f441-5b26-4d39-a6ca-7c404eb74936") + ) + (no_connect + (at 128.27 251.46) + (uuid "23e01862-3c6a-4679-9f45-2a844c632042") + ) + (no_connect + (at 25.4 236.22) + (uuid "261a6bc5-a620-4cc3-96a2-835ff0b109d2") + ) + (no_connect + (at 25.4 238.76) + (uuid "2edb1fb5-cce5-4097-8117-1ce5af4eff8d") + ) + (no_connect + (at 313.69 44.45) + (uuid "3fce46e7-0b92-443e-9ac5-b325793d7dc3") + ) + (no_connect + (at 290.83 44.45) + (uuid "46dc77d5-d45a-47e0-92c2-29239aa40f0b") + ) + (no_connect + (at 95.25 201.93) + (uuid "4863d20e-51f7-4c3b-bdcd-a904356ee6eb") + ) + (no_connect + (at 60.96 259.08) + (uuid "4b52d153-ec87-4ff6-99d4-f9cd0ac9a401") + ) + (no_connect + (at 60.96 254) + (uuid "4b63f750-37c2-4fb3-9868-2abbf4cc1e80") + ) + (no_connect + (at 148.59 248.92) + (uuid "4c1ede6d-29c1-492c-93e4-6432aae54b04") + ) + (no_connect + (at 132.08 184.15) + (uuid "5026baf1-94c3-4161-ab95-bc9425866c30") + ) + (no_connect + (at 111.76 219.71) + (uuid "5592af51-25a8-48c0-a156-6075b1725486") + ) + (no_connect + (at 60.96 248.92) + (uuid "59a610a5-6445-486f-ad97-fe80d025fe21") + ) + (no_connect + (at 259.08 215.9) + (uuid "5cbac685-89ef-4f73-ba7b-1d1bcf9cf9ef") + ) + (no_connect + (at 95.25 199.39) + (uuid "60e51604-30bf-455f-8417-53c005c80aa3") + ) + (no_connect + (at 107.95 241.3) + (uuid "64db2a65-a7db-4c0f-8e3a-df3293b8950d") + ) + (no_connect + (at 132.08 179.07) + (uuid "696b375f-e360-44ad-8af9-23c8112e15e8") + ) + (no_connect + (at 148.59 246.38) + (uuid "6d25f42e-7eb2-46f6-9de5-60a93be20216") + ) + (no_connect + (at 102.87 279.4) + (uuid "88706ed6-c326-450b-b08f-30c38125251b") + ) + (no_connect + (at 267.97 44.45) + (uuid "893dab90-84fe-452c-8c34-61d7cabc4887") + ) + (no_connect + (at 132.08 217.17) + (uuid "8e5c0541-1484-46c3-a425-fe7f874c393a") + ) + (no_connect + (at 132.08 181.61) + (uuid "9138d306-8a54-46ed-848c-e93e6e3f8f05") + ) + (no_connect + (at 107.95 243.84) + (uuid "96b58035-75a2-4b6f-8351-c61760f85219") + ) + (no_connect + (at 208.28 198.12) + (uuid "a115a8ae-cf7d-4ff1-965a-a0f4265718f3") + ) + (no_connect + (at 256.54 234.95) + (uuid "a1e208b1-1d24-4fee-a984-ef48e3acefea") + ) + (no_connect + (at 95.25 204.47) + (uuid "a6dea6cb-2b87-41a2-91e9-8f34167617b1") + ) + (no_connect + (at 148.59 243.84) + (uuid "abf4e703-1623-4db1-b88b-ea6f17e0b285") + ) + (no_connect + (at 259.08 172.72) + (uuid "b186bf72-a81a-4bf7-94ea-da07723f089d") + ) + (no_connect + (at 356.87 123.19) + (uuid "b263f0fb-77ca-4519-9aee-6389a3c69f16") + ) + (no_connect + (at 107.95 248.92) + (uuid "b35aca06-4e74-42d6-a0b8-d643f0586789") + ) + (no_connect + (at 132.08 219.71) + (uuid "bb4d5b23-b1c4-448d-8d48-b5974e71440e") + ) + (no_connect + (at 111.76 184.15) + (uuid "bd5f6d6d-4adf-4713-87a8-b73c0ae30f51") + ) + (no_connect + (at 132.08 214.63) + (uuid "c4c599bb-d56c-40ef-8ad9-e8c3323d399a") + ) + (no_connect + (at 356.87 125.73) + (uuid "d497604a-7a45-4ae0-b922-558450672e08") + ) + (no_connect + (at 95.25 207.01) + (uuid "dde1f40c-bf8b-4119-837a-db1a50e1ae23") + ) + (no_connect + (at 148.59 251.46) + (uuid "e0986ca1-6f99-4c8a-a8ab-8a8295b51dc2") + ) + (no_connect + (at 356.87 118.11) + (uuid "e505bf4c-052d-4f34-a803-22d09cfbdf58") + ) + (no_connect + (at 60.96 256.54) + (uuid "e7a42c22-e381-4409-a9e3-956b4e2968b1") + ) + (no_connect + (at 256.54 191.77) + (uuid "e83f85d6-f870-405b-8a8a-f91e32b0f11c") + ) + (no_connect + (at 60.96 261.62) + (uuid "eba1e594-fd84-41e4-aa13-09d0841cc634") + ) + (no_connect + (at 60.96 251.46) + (uuid "f3a1c634-088e-4809-ad24-2f1e95af8167") + ) + (wire + (pts + (xy 284.48 109.22) (xy 284.48 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "005db2bf-87bc-4285-865d-0f38023572f4") + ) + (wire + (pts + (xy 165.1 45.72) (xy 167.64 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "005f408b-ab2e-4626-b500-2d1d31fbbc7e") + ) + (wire + (pts + (xy 370.84 246.38) (xy 375.92 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0081ed23-696e-4032-b40a-7247b7be5f80") + ) + (wire + (pts + (xy 107.95 233.68) (xy 128.27 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "01eaa468-a422-4d9a-9efe-21715552050f") + ) + (wire + (pts + (xy 161.29 166.37) (xy 162.56 166.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "021cd585-4a02-4c81-97f0-b17a433adb1a") + ) + (wire + (pts + (xy 287.02 72.39) (xy 284.48 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "02cbe64a-6516-4f43-987a-54d290ea8c4f") + ) + (wire + (pts + (xy 304.8 213.36) (xy 306.07 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "02d64ba1-15a1-41a3-a81b-6ac5edebc5fb") + ) + (wire + (pts + (xy 82.55 241.3) (xy 85.09 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "03f28ac0-8e91-4696-a420-c5315e7d0337") + ) + (wire + (pts + (xy 295.91 193.04) (xy 304.8 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "045c732c-5965-47f9-8a20-416c7d924aaa") + ) + (wire + (pts + (xy 127 62.23) (xy 151.13 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "049a8314-a116-4375-a1d4-6025e0c4f2f1") + ) + (wire + (pts + (xy 176.53 269.24) (xy 175.26 269.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "04a5b123-5d58-40b9-bde0-cd9c7dff4d48") + ) + (wire + (pts + (xy 115.57 273.05) (xy 115.57 274.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0574d696-ee8c-4a3d-b8b2-286033b14743") + ) + (wire + (pts + (xy 328.93 209.55) (xy 328.93 212.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "058c6725-ace2-48db-b8f1-cf1a29f2f5a2") + ) + (wire + (pts + (xy 81.28 34.29) (xy 81.28 40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "061489da-9446-4997-9109-0834b05f44ea") + ) + (wire + (pts + (xy 43.18 270.51) (xy 43.18 269.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0631d35a-4065-4f06-af71-7269e836a6ad") + ) + (wire + (pts + (xy 132.08 204.47) (xy 148.59 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0708f46a-43ab-4b17-b4bc-2ab1def53b37") + ) + (wire + (pts + (xy 185.42 72.39) (xy 227.33 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "078d7a04-d2e5-4739-8a31-65ffccf0de7c") + ) + (wire + (pts + (xy 180.34 31.75) (xy 187.96 31.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "07b74df4-8161-41c8-97bc-50b38c435f8c") + ) + (polyline + (pts + (xy 173.99 107.95) (xy 180.34 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "080aaa6c-af94-421f-a543-bcf996c814bb") + ) + (wire + (pts + (xy 302.26 116.84) (xy 308.61 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "08b429e2-e85c-48c0-8e30-14b99b75ddf8") + ) + (wire + (pts + (xy 303.53 245.11) (xy 303.53 247.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0912e16a-8356-4d71-b509-3febd690887a") + ) + (wire + (pts + (xy 162.56 201.93) (xy 161.29 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0953fff2-b9e5-4036-84d4-f74430039132") + ) + (polyline + (pts + (xy 325.12 182.88) (xy 325.12 252.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0972fce0-9e6e-411a-b748-bc0061a9da1d") + ) + (wire + (pts + (xy 175.26 222.25) (xy 175.26 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "097f027c-bfb9-4dd8-9447-ff47c78596a9") + ) + (wire + (pts + (xy 97.79 176.53) (xy 97.79 166.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "099fbf97-49c5-4041-8123-3a5e42f54002") + ) + (wire + (pts + (xy 276.86 100.33) (xy 279.4 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "09c4f90c-963c-4078-8be2-e55249a9ea17") + ) + (wire + (pts + (xy 110.49 224.79) (xy 121.92 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0a2dc3d9-aef0-4749-bb45-c260e799a855") + ) + (wire + (pts + (xy 194.31 109.22) (xy 194.31 118.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0ac62cc5-0b7c-4b82-93bb-f64de2168e46") + ) + (wire + (pts + (xy 97.79 46.99) (xy 97.79 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0b36ac40-dfe0-4f8d-99f5-a8a0739305c8") + ) + (wire + (pts + (xy 151.13 273.05) (xy 151.13 274.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0bf35fa4-9c62-46f7-afb8-68b6f137e8df") + ) + (wire + (pts + (xy 347.98 129.54) (xy 347.98 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0bfaa6a9-dc55-4d87-a357-6a985672d812") + ) + (polyline + (pts + (xy 195.58 284.48) (xy 12.7 284.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0c2f0258-1d9c-427d-afec-0127e3e097da") + ) + (wire + (pts + (xy 143.51 273.05) (xy 143.51 276.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0cb09f72-9660-420b-8026-2ab88ca482d0") + ) + (wire + (pts + (xy 222.25 220.98) (xy 222.25 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0d1be201-8ffe-4780-b7c3-24dd8f3da6e3") + ) + (polyline + (pts + (xy 389.89 152.4) (xy 397.51 148.59) + ) + (stroke + (width 1) + (type default) + (color 0 0 255 1) + ) + (uuid "0d7ece74-8178-4071-baf7-35770ede2a4b") + ) + (wire + (pts + (xy 250.19 72.39) (xy 252.73 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0d89a7f0-762c-4cc3-9a24-eeed8255679d") + ) + (wire + (pts + (xy 375.92 246.38) (xy 393.7 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0dc1ab9c-6a05-48d2-b47e-37f6052d6f26") + ) + (wire + (pts + (xy 256.54 171.45) (xy 255.27 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0dcc2c22-6346-42d8-94cf-360009971bfd") + ) + (wire + (pts + (xy 132.08 171.45) (xy 148.59 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0e06b220-e1e1-4ddb-9536-785763220f5c") + ) + (wire + (pts + (xy 60.96 231.14) (xy 77.47 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0e6ee964-7b92-4b00-a6c5-7ad24caab29c") + ) + (wire + (pts + (xy 234.95 72.39) (xy 237.49 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0ef78b8e-3da5-4c3e-a4b7-7f7c3e5c330e") + ) + (wire + (pts + (xy 158.75 24.13) (xy 160.02 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0f3aa16e-e052-47bf-9bd8-d65521941987") + ) + (wire + (pts + (xy 41.91 40.64) (xy 41.91 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0f9e88bf-b835-476f-8c55-c28feb267031") + ) + (wire + (pts + (xy 125.73 256.54) (xy 125.73 248.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "104cfd38-4a4b-4ab8-9ba3-cbbcc64e18b3") + ) + (wire + (pts + (xy 110.49 179.07) (xy 110.49 181.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "106a273c-215d-43aa-8cc4-4f32db7fbe6a") + ) + (wire + (pts + (xy 287.02 99.06) (xy 287.02 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "10b59e6f-770c-4e0f-b812-737c70d64aba") + ) + (wire + (pts + (xy 133.35 271.78) (xy 133.35 260.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "10dc838a-8486-4225-9d75-c8be8936c4a8") + ) + (wire + (pts + (xy 255.27 214.63) (xy 254 214.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "11112496-bcca-4741-bf3b-5ef1c3996a75") + ) + (wire + (pts + (xy 74.93 238.76) (xy 74.93 260.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "112e9758-bae7-4fcd-a837-9f659b215765") + ) + (wire + (pts + (xy 162.56 163.83) (xy 162.56 166.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "11817dbb-3131-494c-be8b-e94b44aee02f") + ) + (wire + (pts + (xy 349.25 199.39) (xy 355.6 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "11841be0-37ec-492f-ba4b-9b7c05efe8fb") + ) + (wire + (pts + (xy 234.95 256.54) (xy 238.76 256.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "118e2184-fa64-44e3-a2dc-fd89b4d080c5") + ) + (wire + (pts + (xy 157.48 269.24) (xy 162.56 269.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1271ea93-7e76-4228-b49d-e913fca36df3") + ) + (wire + (pts + (xy 270.51 149.86) (xy 273.05 149.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "12f23a53-7f29-41ba-8bec-53c5cf166ef6") + ) + (wire + (pts + (xy 96.52 173.99) (xy 96.52 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "13532b57-61b8-4b74-80ef-f256229bfcc5") + ) + (wire + (pts + (xy 247.65 72.39) (xy 250.19 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "13f9be4b-5d3a-4180-a39f-43bccce89762") + ) + (wire + (pts + (xy 85.09 31.75) (xy 77.47 31.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "144fa93f-23cd-4cba-b5ef-0dcf76519bb1") + ) + (wire + (pts + (xy 40.64 198.12) (xy 53.34 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1450dfbe-4593-47e1-995c-948f2076accf") + ) + (wire + (pts + (xy 161.29 204.47) (xy 163.83 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "14635f88-30a6-48a1-bf31-c51f22875b68") + ) + (polyline + (pts + (xy 182.88 139.7) (xy 185.42 139.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "14d95441-d34d-4625-8385-fed18d113398") + ) + (wire + (pts + (xy 303.53 226.06) (xy 303.53 227.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "152b6ef2-8450-43eb-a538-23730d55d349") + ) + (wire + (pts + (xy 101.6 189.23) (xy 101.6 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "15a8a2a4-dfa5-4ce0-be53-386ed15a2132") + ) + (polyline + (pts + (xy 127 44.45) (xy 127 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "15bfb03d-4724-4dfd-9934-c8faff11660b") + ) + (wire + (pts + (xy 64.77 191.77) (xy 69.85 191.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "15f1f3d8-3a77-4b82-ae95-0104bcd66eff") + ) + (wire + (pts + (xy 133.35 260.35) (xy 111.76 260.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "169d6939-a378-4587-9b7f-c26e08aaf160") + ) + (wire + (pts + (xy 175.26 274.32) (xy 176.53 274.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "17255f4d-1bb4-40c1-b0ce-a8c482cb71c1") + ) + (wire + (pts + (xy 33.02 267.97) (xy 33.02 269.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "17eeede9-865d-4410-a4c0-7452ace8a7fb") + ) + (wire + (pts + (xy 364.49 207.01) (xy 375.92 207.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "18afb770-36f2-4a12-bb17-ebf77ad7896b") + ) + (wire + (pts + (xy 254 191.77) (xy 254 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "190110c8-6e86-4337-8cfc-a88c6a6fe860") + ) + (wire + (pts + (xy 226.06 198.12) (xy 226.06 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "196005b3-4be5-40f0-850d-ae0da9252f92") + ) + (wire + (pts + (xy 60.96 233.68) (xy 78.74 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "19df1fff-7d6c-48b2-8be0-5a1dede372a4") + ) + (wire + (pts + (xy 232.41 266.7) (xy 238.76 266.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1ae7f82f-53a5-438e-a181-8ed29e6c641d") + ) + (wire + (pts + (xy 364.49 228.6) (xy 375.92 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1b13ae43-cd73-46fe-a75a-f51bb320ed5d") + ) + (wire + (pts + (xy 107.95 40.64) (xy 107.95 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1b3e9b5e-45a6-4620-9392-9ce5ab03234c") + ) + (wire + (pts + (xy 139.7 134.62) (xy 191.77 134.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1b567db4-fb3a-4cb7-a4a5-66312bc3d20a") + ) + (wire + (pts + (xy 102.87 199.39) (xy 111.76 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1bb64502-f07b-41a2-8acd-e4abdeff7ec0") + ) + (wire + (pts + (xy 154.94 120.65) (xy 166.37 120.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c07757d-f5a0-4ca1-821f-bae7807c9335") + ) + (wire + (pts + (xy 309.88 41.91) (xy 309.88 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c2ed9a7-356b-48ac-8d04-edc812aae196") + ) + (wire + (pts + (xy 132.08 173.99) (xy 148.59 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c3bc748-7b31-4ed1-bc8c-f63122a35ceb") + ) + (wire + (pts + (xy 226.06 241.3) (xy 229.87 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c4f1f82-b476-4381-85fe-4c220398d47f") + ) + (wire + (pts + (xy 62.23 182.88) (xy 66.04 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1ca7f4eb-9ad7-46a8-a3f1-2398ee3b2917") + ) + (wire + (pts + (xy 63.5 163.83) (xy 67.31 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1cbba31b-9c0b-4ccb-8bb5-3ef95d1efba6") + ) + (wire + (pts + (xy 102.87 176.53) (xy 111.76 176.53) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1ce6421f-7885-4c37-a04e-7b05f6fabb52") + ) + (wire + (pts + (xy 128.27 243.84) (xy 125.73 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1cece350-d206-4f28-9b77-20e988a81c64") + ) + (wire + (pts + (xy 347.98 119.38) (xy 347.98 120.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1d2b7530-dece-4234-ad50-87a28572892a") + ) + (wire + (pts + (xy 295.91 116.84) (xy 302.26 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1d2be19f-8d41-4dd2-afbb-9ad75cfe943d") + ) + (wire + (pts + (xy 60.96 246.38) (xy 72.39 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1e0a096a-0072-4ad1-88ea-e44a59eb4e9a") + ) + (wire + (pts + (xy 162.56 163.83) (xy 161.29 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1f6a3c2a-b42a-4874-80f8-96a6632e3680") + ) + (wire + (pts + (xy 151.13 262.89) (xy 147.32 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "204d5587-b800-45fe-baa8-4538e1a6a058") + ) + (wire + (pts + (xy 133.35 276.86) (xy 133.35 283.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "209119d6-c24a-4171-abb3-9f5127ebb61d") + ) + (wire + (pts + (xy 190.5 222.25) (xy 190.5 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "20b631f9-16af-43ed-abf8-44784e221541") + ) + (wire + (pts + (xy 212.09 215.9) (xy 222.25 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2100a656-d15c-40b6-8c60-459b4bc13e03") + ) + (wire + (pts + (xy 148.59 236.22) (xy 182.88 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "21e94a3b-3ebf-485a-a752-665f99cc60fb") + ) + (polyline + (pts + (xy 142.24 27.94) (xy 158.75 27.94) + ) + (stroke + (width 1) + (type default) + (color 0 255 0 1) + ) + (uuid "2224d4de-2c92-4093-b32d-867d5d6c6299") + ) + (wire + (pts + (xy 375.92 207.01) (xy 381 207.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "226a7db6-5c00-4fdc-9449-42e31d23a3dc") + ) + (wire + (pts + (xy 132.08 191.77) (xy 134.62 191.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "228df5da-a641-4c57-8fac-a14a3e3bc1c5") + ) + (wire + (pts + (xy 283.21 109.22) (xy 284.48 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "23669c87-c695-40a2-a31d-99e098addb56") + ) + (wire + (pts + (xy 132.08 154.94) (xy 132.08 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "24031fd7-e9df-4e63-8423-2aeaad5bed24") + ) + (wire + (pts + (xy 316.23 99.06) (xy 331.47 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "25f345ce-44b6-4a15-abe3-210d691a45de") + ) + (wire + (pts + (xy 161.29 209.55) (xy 162.56 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2653279a-25ea-4595-bd5b-c97042882c0f") + ) + (wire + (pts + (xy 97.79 166.37) (xy 111.76 166.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2749baf0-de0a-420d-998f-ee36da363485") + ) + (wire + (pts + (xy 356.87 99.06) (xy 359.41 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "28712815-be42-4891-b106-fe9054fd2c16") + ) + (wire + (pts + (xy 175.26 231.14) (xy 175.26 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2877b80d-0e5e-4efb-b842-7554522ae2ad") + ) + (wire + (pts + (xy 127 62.23) (xy 127 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "28a9b25b-18ad-4721-a4d3-f49ebe02f739") + ) + (wire + (pts + (xy 287.02 242.57) (xy 287.02 247.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "28d0f70e-e860-4377-8be6-0a9c764aeff1") + ) + (wire + (pts + (xy 132.08 176.53) (xy 162.56 176.53) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2917531a-3b11-418b-8e74-ffbe9ba6cb12") + ) + (wire + (pts + (xy 151.13 274.32) (xy 162.56 274.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "29eec32f-1ebf-49a8-9cad-b3f2365bca4b") + ) + (wire + (pts + (xy 154.94 115.57) (xy 160.02 115.57) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b0a5ea2-138d-49a6-9a36-5a6087b26b99") + ) + (wire + (pts + (xy 279.4 215.9) (xy 284.48 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b3dd0cd-c3ce-46e1-9ac1-8fa764b0c33e") + ) + (wire + (pts + (xy 251.46 234.95) (xy 251.46 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b6570c6-31c1-4799-8d4b-d6c06587367b") + ) + (wire + (pts + (xy 287.02 63.5) (xy 302.26 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2c4e6786-ee01-45c4-b6c9-abc226a47d70") + ) + (polyline + (pts + (xy 273.05 74.93) (xy 364.49 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2cc49511-8b18-478d-8b97-254ed2cb38dd") + ) + (wire + (pts + (xy 238.76 256.54) (xy 238.76 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2d3cfa5b-dc13-4c7f-be60-220e8b7ab0f3") + ) + (wire + (pts + (xy 148.59 231.14) (xy 167.64 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2e2353d6-d181-4683-b90a-73a6a0011e58") + ) + (wire + (pts + (xy 95.25 209.55) (xy 95.25 212.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2f17d8d9-90e0-424a-ab80-3e98fbc907ba") + ) + (wire + (pts + (xy 222.25 153.67) (xy 231.14 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2f26f8bf-ed74-4152-85f4-7a1ddba1f3ae") + ) + (polyline + (pts + (xy 127 104.14) (xy 123.19 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2fe3ae6a-0c30-4612-88ec-59c659b39387") + ) + (wire + (pts + (xy 204.47 194.31) (xy 204.47 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2fe41b43-15ba-424d-9afb-fdd3ceae9c9c") + ) + (wire + (pts + (xy 64.77 193.04) (xy 64.77 191.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3080ee5e-532e-44d5-bd8b-f9470e9549ba") + ) + (wire + (pts + (xy 359.41 101.6) (xy 356.87 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "30a32632-5bb9-4947-b5e9-18fdd8a68278") + ) + (wire + (pts + (xy 223.52 256.54) (xy 212.09 256.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "31a0deae-c666-4837-b5cb-a25019367650") + ) + (wire + (pts + (xy 302.26 88.9) (xy 302.26 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "31ee9f69-e79d-4cb9-9d91-2b94a5ce910a") + ) + (wire + (pts + (xy 267.97 88.9) (xy 267.97 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "32189eb2-bdf3-4b8d-b0a1-1685e90d775d") + ) + (polyline + (pts + (xy 313.69 110.49) (xy 313.69 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "322b73d9-4764-4dca-b58d-b87f8baa8881") + ) + (wire + (pts + (xy 223.52 256.54) (xy 227.33 256.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "322ffb8c-060f-4713-99a0-d5f4febd168b") + ) + (wire + (pts + (xy 251.46 191.77) (xy 251.46 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3271b488-2fa3-42e4-9c2c-8e7ed01dcca9") + ) + (wire + (pts + (xy 100.33 179.07) (xy 100.33 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "32db777e-27c6-43cf-83ff-0e280d9e8366") + ) + (wire + (pts + (xy 332.74 63.5) (xy 355.6 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3359861c-3b09-4ff1-9cbf-c26096d554ed") + ) + (wire + (pts + (xy 308.61 101.6) (xy 308.61 106.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3390d434-51f2-4516-8d12-6377a984c3f8") + ) + (wire + (pts + (xy 300.99 83.82) (xy 302.26 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "33fde0b2-0694-41e4-bb0d-272346bed140") + ) + (wire + (pts + (xy 33.02 273.05) (xy 33.02 278.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "340e3188-5bf9-4694-af9c-dd3ccac5a842") + ) + (polyline + (pts + (xy 12.7 284.48) (xy 12.7 149.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "34200e31-79b8-4a5d-933c-e5956161cdbf") + ) + (wire + (pts + (xy 161.29 207.01) (xy 163.83 207.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3479e58a-7496-4b0a-96a8-a5ee9ce9c41d") + ) + (wire + (pts + (xy 170.18 215.9) (xy 170.18 222.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "350560d8-81b4-48c2-b4d2-eaf1be06c8e1") + ) + (wire + (pts + (xy 254 214.63) (xy 254 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "35690e4f-1602-4a33-9b95-766f6e060c62") + ) + (wire + (pts + (xy 259.08 191.77) (xy 259.08 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "35be254c-2334-41b1-b44d-d51c3bb98a2e") + ) + (wire + (pts + (xy 323.85 124.46) (xy 330.2 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "35d2931c-89be-4bd1-987a-19eb0eaaccee") + ) + (wire + (pts + (xy 105.41 57.15) (xy 107.95 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3610864a-bbed-4991-9583-e59e7388b092") + ) + (wire + (pts + (xy 154.94 104.14) (xy 152.4 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3674a12e-de44-4ac9-89e6-d2897a5655f6") + ) + (wire + (pts + (xy 266.7 143.51) (xy 266.7 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3699fd22-d9f2-467f-95bc-ff6442032d97") + ) + (wire + (pts + (xy 312.42 52.07) (xy 313.69 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "36ac4d8c-ba28-4ac3-a556-9738b8f0001f") + ) + (polyline + (pts + (xy 209.55 181.61) (xy 209.55 127) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "37ec2961-5a6e-4d35-b74b-481be99b9361") + ) + (wire + (pts + (xy 82.55 218.44) (xy 82.55 217.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3831ed1f-1d64-4b10-afad-1f4ef21465c5") + ) + (wire + (pts + (xy 176.53 115.57) (xy 166.37 115.57) + ) + (stroke + (width 0) + (type default) + ) + (uuid "38efdc62-55a9-4112-b8d8-7ced73ec13a5") + ) + (wire + (pts + (xy 149.86 29.21) (xy 149.86 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3910cc18-0cca-4224-aef3-5c8709a2e529") + ) + (wire + (pts + (xy 185.42 59.69) (xy 180.34 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "395e44d0-7908-4958-9c07-73c8b4b864a7") + ) + (wire + (pts + (xy 229.87 232.41) (xy 229.87 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3acb8132-dcb3-489a-9216-abe36e9c3b64") + ) + (wire + (pts + (xy 185.42 34.29) (xy 185.42 40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3b2891cd-d6ea-4c48-8108-d6daf1d79c2d") + ) + (wire + (pts + (xy 267.97 86.36) (xy 267.97 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3b5008b6-0d4e-4843-8adb-250a048cbd15") + ) + (wire + (pts + (xy 281.94 99.06) (xy 281.94 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3baa77cd-09cc-4502-a742-9bda084c818e") + ) + (wire + (pts + (xy 120.65 62.23) (xy 127 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3bd570a6-d33e-480f-af50-254092b90576") + ) + (wire + (pts + (xy 95.25 173.99) (xy 96.52 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3c966553-8c61-4e9e-bd93-1670291aee83") + ) + (wire + (pts + (xy 297.18 167.64) (xy 281.94 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3cb1f219-f1ba-43de-8cb8-6ff27f5c49e6") + ) + (wire + (pts + (xy 132.08 166.37) (xy 148.59 166.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3dc5f1b4-1a50-45cb-b02c-28f612eb5587") + ) + (wire + (pts + (xy 92.71 96.52) (xy 118.11 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3df06616-f27f-4aea-8466-4316eb43efbd") + ) + (wire + (pts + (xy 309.88 63.5) (xy 332.74 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3e777949-f979-4eb0-966f-97f9aeabadea") + ) + (wire + (pts + (xy 356.87 246.38) (xy 365.76 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3efcac46-5009-4046-854c-ef078bff744e") + ) + (wire + (pts + (xy 99.06 194.31) (xy 99.06 207.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f6ae90a-7911-4abd-8f1b-ef397f5e46cd") + ) + (wire + (pts + (xy 161.29 171.45) (xy 163.83 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f81d0b5-7b47-42fc-9419-6f2d9da1a810") + ) + (wire + (pts + (xy 295.91 114.3) (xy 295.91 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f820c64-6eb9-493f-9150-4c256f2a5b02") + ) + (wire + (pts + (xy 173.99 128.27) (xy 176.53 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f8694b6-3383-4dd5-aa93-6a8615ed60ff") + ) + (wire + (pts + (xy 300.99 88.9) (xy 302.26 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f8fff71-9b17-4f22-a1de-762abda00696") + ) + (wire + (pts + (xy 97.79 44.45) (xy 95.25 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f90158e-3d5f-46d5-885f-c6ac1209ed24") + ) + (wire + (pts + (xy 83.82 59.69) (xy 85.09 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3fde2c28-f8dc-47a8-933f-5b5062a9fe37") + ) + (wire + (pts + (xy 283.21 66.04) (xy 306.07 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3fe9059a-1ff7-4b5a-a886-0d94b6e7e5b9") + ) + (wire + (pts + (xy 223.52 266.7) (xy 232.41 266.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3fe91076-37b5-43b4-af49-8696985fe287") + ) + (wire + (pts + (xy 260.35 67.31) (xy 260.35 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "400d912e-1be3-44c4-bfab-e8c907be8453") + ) + (polyline + (pts + (xy 142.24 27.94) (xy 142.24 38.1) + ) + (stroke + (width 1) + (type default) + (color 0 255 0 1) + ) + (uuid "404d93ac-0175-49a5-aa12-facf3c19b6a1") + ) + (wire + (pts + (xy 284.48 72.39) (xy 284.48 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "40eb6ef9-fc09-47b1-9450-e32109d93dbf") + ) + (wire + (pts + (xy 245.11 215.9) (xy 251.46 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "410229bc-5757-408a-a245-eec480581c7f") + ) + (wire + (pts + (xy 81.28 40.64) (xy 81.28 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "411b6a7b-0c76-49ab-87a3-293a0cf9b18d") + ) + (wire + (pts + (xy 180.34 26.67) (xy 185.42 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4204d60e-3f60-4068-9da6-b9328fac2787") + ) + (wire + (pts + (xy 267.97 83.82) (xy 269.24 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "42750042-6db9-443c-a93d-257b31c21767") + ) + (wire + (pts + (xy 125.73 243.84) (xy 125.73 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "429f9eec-68e5-462e-b778-7c71d5f1858b") + ) + (wire + (pts + (xy 328.93 199.39) (xy 328.93 207.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "42edfb34-4f0c-43ce-af9c-118a7f0e48bd") + ) + (wire + (pts + (xy 289.56 99.06) (xy 289.56 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "433b3d86-127d-4470-94ad-d26a6ee8df04") + ) + (wire + (pts + (xy 287.02 247.65) (xy 303.53 247.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4376b3ef-3061-4e99-840b-5c44a7254daa") + ) + (wire + (pts + (xy 132.08 209.55) (xy 148.59 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4405d8dc-4d96-4e31-922e-3a7837f3c53b") + ) + (wire + (pts + (xy 95.25 191.77) (xy 100.33 191.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "44b19161-ac37-418e-aacf-ab3aaf324bbe") + ) + (wire + (pts + (xy 222.25 172.72) (xy 222.25 177.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "44c526be-aac0-4bc1-80de-7d0416d964db") + ) + (wire + (pts + (xy 306.07 52.07) (xy 306.07 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45489fc1-77d9-4446-a009-738b0e82a8f2") + ) + (wire + (pts + (xy 165.1 251.46) (xy 165.1 252.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45752ec3-8ef1-424a-8f07-ba0cd3b028e2") + ) + (wire + (pts + (xy 148.59 241.3) (xy 165.1 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45a03eba-2392-48d3-a5de-81f04f8b37c2") + ) + (wire + (pts + (xy 67.31 163.83) (xy 82.55 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45b80f80-4be2-4a65-9540-f8f07db80da3") + ) + (wire + (pts + (xy 302.26 102.87) (xy 302.26 106.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "460e5439-c2b9-4950-8020-c61a68504f48") + ) + (wire + (pts + (xy 237.49 153.67) (xy 266.7 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "461231db-eeb9-4f88-a0d3-4813b9d41f4e") + ) + (wire + (pts + (xy 148.59 220.98) (xy 148.59 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "463cebea-e5f9-4178-9bca-943238aa0255") + ) + (polyline + (pts + (xy 372.11 153.67) (xy 389.89 154.94) + ) + (stroke + (width 0.5) + (type default) + (color 255 153 0 1) + ) + (uuid "46512e2e-f15c-428f-9cb0-628015e5a1cf") + ) + (wire + (pts + (xy 143.51 262.89) (xy 147.32 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4665f6bc-c5e2-428d-88ee-2cd056ec8fdf") + ) + (polyline + (pts + (xy 407.67 182.88) (xy 407.67 252.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "467d52dc-f13c-4092-b0b4-35eb04ce4128") + ) + (wire + (pts + (xy 243.84 86.36) (xy 250.19 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "473981de-8194-4a0c-986f-1e09cb3e4f57") + ) + (wire + (pts + (xy 99.06 207.01) (xy 111.76 207.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "47d68bef-7bb8-4217-a049-8b48280aee77") + ) + (polyline + (pts + (xy 389.89 160.02) (xy 397.51 163.83) + ) + (stroke + (width 1) + (type default) + (color 0 255 0 1) + ) + (uuid "4812e811-7f0d-4caf-b6f7-48a7a0796f12") + ) + (wire + (pts + (xy 138.43 256.54) (xy 125.73 256.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "489eaa04-5cc3-42ba-9cf6-02d5571432b6") + ) + (wire + (pts + (xy 161.29 173.99) (xy 162.56 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4919cffd-90d2-4d39-b412-d4e706c3dfdc") + ) + (wire + (pts + (xy 204.47 213.36) (xy 204.47 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "493a21da-78c1-474c-999f-1e7eda28b1c9") + ) + (wire + (pts + (xy 76.2 78.74) (xy 78.74 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4afa2e7d-dca0-4003-bc8d-f56416c2d4a0") + ) + (wire + (pts + (xy 163.83 204.47) (xy 163.83 207.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4ba38bae-2d98-4131-a4ef-5f529d9fd9af") + ) + (polyline + (pts + (xy 173.99 100.33) (xy 180.34 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4bba887f-46ea-4081-b9ba-0aea52f81f5e") + ) + (wire + (pts + (xy 266.7 256.54) (xy 266.7 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4cb80a9b-e2c2-47b7-ae81-16097b273a62") + ) + (wire + (pts + (xy 229.87 172.72) (xy 229.87 177.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4cce3c87-9734-41e6-b5e9-b87b135b240a") + ) + (wire + (pts + (xy 100.33 204.47) (xy 111.76 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d02ee12-6565-4d28-8564-3c88085f254b") + ) + (wire + (pts + (xy 151.13 265.43) (xy 151.13 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d186091-2d38-444b-8c40-7f5a8a33fb36") + ) + (wire + (pts + (xy 295.91 105.41) (xy 295.91 106.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d33c134-83fa-4f39-ba4b-0ec7c93ce197") + ) + (wire + (pts + (xy 60.96 223.52) (xy 63.5 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d9f156e-c860-4d69-ba43-bb3aa015896c") + ) + (wire + (pts + (xy 328.93 41.91) (xy 332.74 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4def4b93-572a-46cf-bc2c-3b9b8bcf5e8d") + ) + (polyline + (pts + (xy 370.84 147.32) (xy 386.08 147.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4df92ac1-7a39-450d-adf2-8f7449cb723e") + ) + (wire + (pts + (xy 355.6 228.6) (xy 364.49 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4e1fbefd-94bf-4d81-b2d9-4b4e9b2882b5") + ) + (wire + (pts + (xy 304.8 162.56) (xy 309.88 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4e283e18-3572-4c91-9ed4-e638bfea1096") + ) + (wire + (pts + (xy 229.87 172.72) (xy 237.49 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4e8524d4-723e-45c9-9391-b3c3d937df60") + ) + (wire + (pts + (xy 304.8 247.65) (xy 306.07 247.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4e97a38e-d7da-4e76-a21e-5661e2b2c601") + ) + (wire + (pts + (xy 256.54 214.63) (xy 255.27 214.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4ed91723-8b07-4446-a16c-600512f5c500") + ) + (wire + (pts + (xy 227.33 67.31) (xy 227.33 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4f129140-f7ee-43f2-9b80-be29cd449f99") + ) + (polyline + (pts + (xy 118.11 129.54) (xy 125.73 129.54) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "4f1371be-016a-4cda-857c-69d78d664884") + ) + (wire + (pts + (xy 355.6 207.01) (xy 364.49 207.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4faa49ea-d1df-466e-81fb-a28bfa580f04") + ) + (wire + (pts + (xy 60.96 198.12) (xy 66.04 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4fbb0d20-a3a5-4e66-ad2d-e62d74025865") + ) + (wire + (pts + (xy 21.59 220.98) (xy 25.4 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "500dc673-8733-47a7-b9f4-3b2ed9bd9aab") + ) + (wire + (pts + (xy 102.87 184.15) (xy 102.87 176.53) + ) + (stroke + (width 0) + (type default) + ) + (uuid "503924cb-3ad8-412e-976e-78940b6141ba") + ) + (polyline + (pts + (xy 116.84 52.07) (xy 116.84 58.42) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "50e722c6-11b7-45d4-a28f-9ae729656d58") + ) + (wire + (pts + (xy 237.49 143.51) (xy 237.49 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5107b046-5ea4-4fe6-bc72-1bd9c63e8535") + ) + (wire + (pts + (xy 229.87 215.9) (xy 237.49 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5126ea90-426d-488b-b38e-c79672e1f4e3") + ) + (wire + (pts + (xy 273.05 193.04) (xy 273.05 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "515883b6-9e3a-4e04-8b2d-e52202f1c144") + ) + (wire + (pts + (xy 389.89 62.23) (xy 387.35 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5283baad-a4a4-40ec-b8e4-b0d665a18c75") + ) + (wire + (pts + (xy 85.09 241.3) (xy 87.63 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "52c418b5-b145-40f6-aa67-ba10baa6e879") + ) + (wire + (pts + (xy 74.93 59.69) (xy 76.2 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "53a7cd7c-ccbc-4975-a8b0-38d201747701") + ) + (wire + (pts + (xy 222.25 241.3) (xy 226.06 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "545190c6-b33b-41de-b035-59a764a595c6") + ) + (polyline + (pts + (xy 195.58 149.86) (xy 195.58 284.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "54787d5c-825f-4747-9b9c-13f973a1db18") + ) + (wire + (pts + (xy 346.71 220.98) (xy 355.6 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "55afefe0-11bc-4451-b582-5de0afc905cc") + ) + (polyline + (pts + (xy 99.06 101.6) (xy 118.11 101.6) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "55d6556a-ef12-4585-a36d-cf517da3155c") + ) + (wire + (pts + (xy 346.71 238.76) (xy 356.87 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "566e6aeb-c7ad-4c04-ad60-355393d16d96") + ) + (wire + (pts + (xy 165.1 241.3) (xy 165.1 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5674405c-3ca4-46ae-b8b3-b9864e74dcc8") + ) + (wire + (pts + (xy 194.31 139.7) (xy 193.04 139.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5683176b-30cd-4110-bb07-957deededb0e") + ) + (wire + (pts + (xy 363.22 100.33) (xy 359.41 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "56f23462-7289-43c4-8b5b-708a13942eab") + ) + (wire + (pts + (xy 269.24 81.28) (xy 267.97 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "586678fc-1fc1-437c-9e55-4df9cd4cd72c") + ) + (wire + (pts + (xy 132.08 191.77) (xy 132.08 196.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5870826d-4abe-4c60-b15f-a8679698e4c9") + ) + (wire + (pts + (xy 287.02 234.95) (xy 284.48 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "58891225-0ded-4b70-81cc-2fa36d6ce470") + ) + (wire + (pts + (xy 238.76 256.54) (xy 266.7 256.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5962c37d-1dd1-4a21-a1f8-9738f9b266aa") + ) + (wire + (pts + (xy 40.64 182.88) (xy 53.34 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5994d0d9-0e75-48fd-b2c5-e4f0cca43a6a") + ) + (wire + (pts + (xy 110.49 181.61) (xy 111.76 181.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59f9a438-a993-42ef-bcd0-31685edfb250") + ) + (wire + (pts + (xy 284.48 105.41) (xy 295.91 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5bce381b-1c2d-44e4-b13a-30e971ba23c7") + ) + (wire + (pts + (xy 15.24 259.08) (xy 15.24 251.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5bdbed19-81bc-4d06-838b-677ef2aa2f6f") + ) + (wire + (pts + (xy 365.76 246.38) (xy 370.84 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5c99e1ad-f2a6-42a4-819e-ff4566d46af6") + ) + (wire + (pts + (xy 237.49 215.9) (xy 237.49 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5ca646c6-57cf-4377-8d10-34cd2d4a1401") + ) + (wire + (pts + (xy 300.99 81.28) (xy 302.26 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5cc6fac4-09c5-4a3c-bc97-bc2432afac01") + ) + (wire + (pts + (xy 128.27 246.38) (xy 125.73 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d271cc0-b7bd-4f37-bdd8-75c242f1fc32") + ) + (wire + (pts + (xy 328.93 66.04) (xy 351.79 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d413ddb-ebe4-41c7-be24-7b27eb1c18d5") + ) + (wire + (pts + (xy 212.09 172.72) (xy 212.09 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d468cd5-492e-492e-8efe-675e5e32602c") + ) + (wire + (pts + (xy 238.76 266.7) (xy 266.7 266.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d4aad73-b4db-4f98-9220-62e251be4ea7") + ) + (wire + (pts + (xy 372.11 220.98) (xy 375.92 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d584502-dd0c-4070-8253-e8656408c03d") + ) + (wire + (pts + (xy 306.07 247.65) (xy 306.07 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e19676c-4cfb-4e20-943e-5be246c804de") + ) + (wire + (pts + (xy 226.06 241.3) (xy 226.06 242.57) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e217520-b4f4-4733-8040-7a38dd9bb43b") + ) + (wire + (pts + (xy 60.96 193.04) (xy 64.77 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e8230f0-e68e-475d-8b1b-540df7c7fadb") + ) + (wire + (pts + (xy 116.84 279.4) (xy 115.57 279.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e9bf59c-9cd8-4ea1-b90a-a9769bcadfe5") + ) + (wire + (pts + (xy 306.07 218.44) (xy 304.8 218.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5f3970dd-6b6d-4776-b64c-6f80fa2fa75a") + ) + (wire + (pts + (xy 337.82 129.54) (xy 347.98 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5f95f598-238c-403a-91ea-1ff73a71f873") + ) + (wire + (pts + (xy 237.49 72.39) (xy 240.03 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5fb42a85-437b-4069-aae1-c1a222f6d8e7") + ) + (wire + (pts + (xy 175.26 276.86) (xy 176.53 276.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "602782c5-6b60-4123-9422-5e198eaa6914") + ) + (wire + (pts + (xy 148.59 220.98) (xy 151.13 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "60b91abe-c2c8-4e6b-95ae-5c53fb1d11ea") + ) + (wire + (pts + (xy 107.95 29.21) (xy 107.95 33.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "610745dc-198a-4738-979d-5b21e8cb6f1d") + ) + (polyline + (pts + (xy 273.05 129.54) (xy 273.05 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "611f5def-55a5-442e-8090-054a747e9ffd") + ) + (wire + (pts + (xy 69.85 217.17) (xy 69.85 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "61ec9658-8c0b-4260-aee7-c7bfa8d2c185") + ) + (wire + (pts + (xy 143.51 276.86) (xy 162.56 276.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62ea250b-1978-41f7-9b8f-4c17c279caab") + ) + (polyline + (pts + (xy 364.49 74.93) (xy 364.49 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "635b0ab1-86c8-49b6-9c46-0a8e4bd0f62a") + ) + (wire + (pts + (xy 85.09 246.38) (xy 87.63 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "643a4cb1-007c-4822-a9a4-d95a7a9e687e") + ) + (wire + (pts + (xy 297.18 162.56) (xy 279.4 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "648efa80-c1d8-4afc-aa5f-fcad59de147f") + ) + (wire + (pts + (xy 151.13 57.15) (xy 149.86 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "64b32d6e-b6fd-4903-a76d-482ac1d74bd1") + ) + (wire + (pts + (xy 267.97 91.44) (xy 269.24 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "64fbd8b8-296b-48ef-9726-78ab934bb9c1") + ) + (wire + (pts + (xy 303.53 247.65) (xy 304.8 247.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "667e2ff5-1f2b-4177-b02f-7c9de9b87679") + ) + (wire + (pts + (xy 176.53 271.78) (xy 175.26 271.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "669e6087-7df9-4008-bad9-f1497c214b50") + ) + (wire + (pts + (xy 287.02 41.91) (xy 287.02 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "66d3f55a-16fa-4c45-8266-c20d7c6d8311") + ) + (wire + (pts + (xy 293.37 234.95) (xy 292.1 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "67126fcf-1934-4327-984a-afc5be88a399") + ) + (wire + (pts + (xy 287.02 102.87) (xy 302.26 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "67aeaaa0-ca09-4748-bb0e-5db708c663df") + ) + (wire + (pts + (xy 349.25 199.39) (xy 346.71 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "67d8755b-5834-485b-acf5-85412601402b") + ) + (wire + (pts + (xy 222.25 172.72) (xy 212.09 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6888cfff-42ec-4c4f-86fc-1d52b8f00ead") + ) + (wire + (pts + (xy 157.48 271.78) (xy 162.56 271.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6901c518-f02e-4d8c-a807-e3ac0673401a") + ) + (wire + (pts + (xy 105.41 24.13) (xy 107.95 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "699afad9-18b1-4bfc-af54-fa07fd65de11") + ) + (wire + (pts + (xy 234.95 67.31) (xy 234.95 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "69ab3137-32de-40fe-98ce-6faad629d78b") + ) + (polyline + (pts + (xy 370.84 160.02) (xy 356.87 163.83) + ) + (stroke + (width 1) + (type default) + (color 0 255 0 1) + ) + (uuid "69ef1b76-aecf-42a5-925f-213aa81e1667") + ) + (polyline + (pts + (xy 356.87 163.83) (xy 370.84 153.67) + ) + (stroke + (width 0.5) + (type default) + (color 255 153 0 1) + ) + (uuid "6a259d8f-a039-46d2-ae03-9eacc09a712a") + ) + (wire + (pts + (xy 102.87 186.69) (xy 102.87 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6ae273f5-52cf-4ba1-b08d-d544c1afded3") + ) + (wire + (pts + (xy 387.35 67.31) (xy 389.89 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6b91a574-6b68-4529-852c-af6d8c032ef2") + ) + (wire + (pts + (xy 78.74 261.62) (xy 78.74 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6b9a4c52-eefc-4528-939c-e9b74e4c1cec") + ) + (wire + (pts + (xy 302.26 81.28) (xy 302.26 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6bd0a7bb-d5af-4ba7-9da5-883552670e12") + ) + (wire + (pts + (xy 81.28 52.07) (xy 85.09 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6c4aa989-5bac-478d-b23a-a5b017bbbd4a") + ) + (wire + (pts + (xy 83.82 248.92) (xy 87.63 248.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6c4ccf1b-787f-4373-aa9e-576115b04b14") + ) + (wire + (pts + (xy 128.27 118.11) (xy 139.7 118.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6c9e7d17-f967-4ddb-a8e2-b4ebe06fe8fb") + ) + (wire + (pts + (xy 256.54 172.72) (xy 256.54 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6ca64f1a-be68-4ec3-8f52-291b8aad1fa9") + ) + (polyline + (pts + (xy 116.84 27.94) (xy 116.84 45.72) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "6ddf7502-ae69-40ec-abba-1e3e285fd433") + ) + (wire + (pts + (xy 302.26 63.5) (xy 302.26 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6e00f2ab-cca2-4829-9f7e-62b77f242568") + ) + (wire + (pts + (xy 182.88 222.25) (xy 175.26 222.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6e31312c-acb2-4799-a3dd-c643f32cc2e2") + ) + (polyline + (pts + (xy 356.87 148.59) (xy 370.84 158.75) + ) + (stroke + (width 0.5) + (type default) + (color 255 0 255 1) + ) + (uuid "6e450be5-6272-417e-a8c4-9aab3cb54547") + ) + (wire + (pts + (xy 190.5 231.14) (xy 190.5 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6e6cb42a-643e-4ebf-b212-2d95f7a28ee8") + ) + (wire + (pts + (xy 328.93 52.07) (xy 328.93 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f2074d4-2b00-43ee-a4fd-83ac590ca6b6") + ) + (wire + (pts + (xy 132.08 168.91) (xy 148.59 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f602eb0-5388-4f53-9eaa-668280b34663") + ) + (wire + (pts + (xy 25.4 267.97) (xy 24.13 267.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f811050-93c8-4e43-bce4-5b85f21f8387") + ) + (wire + (pts + (xy 289.56 73.66) (xy 289.56 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "70371f5d-eb88-4896-943a-78a4213d6c7e") + ) + (wire + (pts + (xy 283.21 41.91) (xy 287.02 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7066e4f7-9a97-44c2-b5cc-cdcc5e1102f7") + ) + (wire + (pts + (xy 187.96 54.61) (xy 180.34 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7078cbd1-506b-4274-aa76-30f0375cb670") + ) + (wire + (pts + (xy 78.74 233.68) (xy 87.63 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "71188d20-e534-4529-ac8d-c8fcccd50885") + ) + (wire + (pts + (xy 289.56 52.07) (xy 290.83 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "71373e1f-7860-415c-83a9-9be7976260c8") + ) + (wire + (pts + (xy 100.33 273.05) (xy 115.57 273.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "72274241-0740-4e01-a54e-d551c777769c") + ) + (wire + (pts + (xy 60.96 238.76) (xy 74.93 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "723026d7-a9fe-4bab-88ef-3a3d78ef8f69") + ) + (wire + (pts + (xy 284.48 99.06) (xy 284.48 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "72367cd3-149c-413d-81d1-a9ce574d2f42") + ) + (wire + (pts + (xy 60.96 187.96) (xy 63.5 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "726b7b98-8d41-4ff2-b22f-ac75ca8eb30d") + ) + (wire + (pts + (xy 60.96 220.98) (xy 62.23 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "726ff31b-f859-409c-8c08-ed3b66ea21ea") + ) + (wire + (pts + (xy 293.37 237.49) (xy 292.1 237.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "72bfa4ad-1de8-46db-b154-865b054d05f1") + ) + (wire + (pts + (xy 355.6 220.98) (xy 356.87 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "735a1471-5f0a-49ee-9157-b2675c90ef77") + ) + (polyline + (pts + (xy 151.13 59.69) (xy 142.24 59.69) + ) + (stroke + (width 1) + (type default) + (color 0 255 0 1) + ) + (uuid "737acc2e-3424-4bbc-8f40-04c3d3f95f07") + ) + (wire + (pts + (xy 95.25 186.69) (xy 102.87 186.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "738bba8b-89b3-49dd-9eca-fd28ffaedc36") + ) + (wire + (pts + (xy 182.88 231.14) (xy 182.88 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "73a5f76c-946a-4195-9b8d-f2ab5715df37") + ) + (wire + (pts + (xy 351.79 66.04) (xy 359.41 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "73d6fb28-72ef-464c-ac07-e8e4dc676762") + ) + (wire + (pts + (xy 260.35 72.39) (xy 279.4 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "748e4973-139b-4853-99ed-7fd393b07fc0") + ) + (wire + (pts + (xy 289.56 100.33) (xy 308.61 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74baa529-9eb9-44ec-bc2b-3fed7bd9c557") + ) + (wire + (pts + (xy 332.74 41.91) (xy 332.74 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74fe486e-ec30-4601-875c-93d3905e97d4") + ) + (wire + (pts + (xy 66.04 186.69) (xy 69.85 186.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "751706d5-12f1-41d6-9045-e4201241874d") + ) + (wire + (pts + (xy 127 24.13) (xy 151.13 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75194573-c469-428a-a350-cd779b8bce18") + ) + (wire + (pts + (xy 132.08 201.93) (xy 148.59 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "752c911f-37c4-4635-800c-2f63573bb827") + ) + (wire + (pts + (xy 267.97 81.28) (xy 267.97 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75beea2f-2bba-452a-bda6-b17e2ca643db") + ) + (wire + (pts + (xy 16.51 234.95) (xy 21.59 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75ebf06b-818e-437f-ae96-e7d5c819ac27") + ) + (wire + (pts + (xy 306.07 41.91) (xy 309.88 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75f3c624-1b79-4f75-8944-2dab55a96fc9") + ) + (wire + (pts + (xy 95.25 176.53) (xy 97.79 176.53) + ) + (stroke + (width 0) + (type default) + ) + (uuid "76018015-9676-4f71-80cf-8e12538b4dc2") + ) + (wire + (pts + (xy 160.02 29.21) (xy 149.86 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "76f03833-f845-4c23-bc1f-a615da1cd1fb") + ) + (wire + (pts + (xy 375.92 220.98) (xy 387.35 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7719cf79-6feb-45ed-9d98-07c4487cfc66") + ) + (wire + (pts + (xy 161.29 168.91) (xy 163.83 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "77388019-6163-4ffd-8bc8-8a14f1ab9c05") + ) + (wire + (pts + (xy 341.63 199.39) (xy 346.71 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "77b4c887-79a7-4523-a963-e0ede3b67769") + ) + (wire + (pts + (xy 223.52 256.54) (xy 223.52 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7812ad08-f831-4398-9a9b-c5c1215f2ad3") + ) + (wire + (pts + (xy 67.31 176.53) (xy 67.31 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "78b70322-438c-4619-8809-16fe519ea1e9") + ) + (wire + (pts + (xy 292.1 234.95) (xy 287.02 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "792d9127-548c-44b1-bc01-9bb2a5d0ec19") + ) + (wire + (pts + (xy 101.6 173.99) (xy 111.76 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7962ec12-1aec-42eb-82e7-c507028abf67") + ) + (wire + (pts + (xy 115.57 24.13) (xy 127 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "796a7c15-6748-42ee-a77b-7ce07f04a047") + ) + (wire + (pts + (xy 304.8 167.64) (xy 309.88 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "79982279-c2e3-44c6-9a3f-68bc06566269") + ) + (wire + (pts + (xy 332.74 80.01) (xy 344.17 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7af7fa52-5c30-4a7d-8f05-bc4730374a01") + ) + (wire + (pts + (xy 273.05 213.36) (xy 281.94 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7c8c781b-b961-412f-980f-c7557a8c542f") + ) + (wire + (pts + (xy 281.94 167.64) (xy 281.94 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ca30baa-945c-4f72-80f1-a30ad34c2245") + ) + (polyline + (pts + (xy 307.34 69.85) (xy 307.34 86.36) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "7d7f599c-d4bd-4885-b27e-db7130d60001") + ) + (wire + (pts + (xy 175.26 215.9) (xy 170.18 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7dbe1da6-e019-4a7e-9bfb-3846c5d3d99e") + ) + (wire + (pts + (xy 66.04 198.12) (xy 66.04 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e0ba9ad-282e-4780-b0a6-e8e925b4bcfb") + ) + (wire + (pts + (xy 185.42 59.69) (xy 185.42 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e685828-fc30-4bcf-ad2e-e6454d59e24d") + ) + (wire + (pts + (xy 182.88 222.25) (xy 182.88 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e9c1091-e2c6-4d24-a332-3f7ffbdaece4") + ) + (wire + (pts + (xy 110.49 217.17) (xy 110.49 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f6be57a-0334-4c46-aad1-2433238d49e6") + ) + (wire + (pts + (xy 85.09 241.3) (xy 85.09 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "803e0fc2-1b62-4c27-b88e-d9fd83c013c5") + ) + (wire + (pts + (xy 355.6 199.39) (xy 356.87 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "806a8999-3873-4690-939c-46d0ca97f350") + ) + (wire + (pts + (xy 300.99 86.36) (xy 302.26 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8070cba6-814b-46b9-972f-2bed35bb65d8") + ) + (wire + (pts + (xy 273.05 157.48) (xy 273.05 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "809224c2-9213-40b3-ac9a-125bb48cb7bc") + ) + (wire + (pts + (xy 83.82 26.67) (xy 85.09 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "80a84206-dcbf-429b-a910-c029a699704d") + ) + (wire + (pts + (xy 39.37 213.36) (xy 43.18 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "80d148eb-2c22-471e-a938-319eb7368d3e") + ) + (wire + (pts + (xy 33.02 100.33) (xy 50.8 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "81477e28-605a-4b69-bf80-18fc81d3232c") + ) + (wire + (pts + (xy 83.82 91.44) (xy 85.09 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "821bcd80-324c-4618-9c50-4a0ef7d99ee7") + ) + (polyline + (pts + (xy 85.09 69.85) (xy 67.31 69.85) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "84c7c5ed-6a52-4698-b0af-62fd44bc5f50") + ) + (wire + (pts + (xy 64.77 226.06) (xy 64.77 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "85cde928-38bd-48c4-b8c5-bc22081440db") + ) + (polyline + (pts + (xy 127 31.75) (xy 127 36.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "874825f7-14ae-416a-a63d-49c100ee11ae") + ) + (polyline + (pts + (xy 173.99 139.7) (xy 175.26 139.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "878298f1-dace-4e43-902f-ed624425beaf") + ) + (wire + (pts + (xy 63.5 187.96) (xy 64.77 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "88179145-9eca-4e23-a367-7dd1eb707957") + ) + (polyline + (pts + (xy 367.03 151.13) (xy 367.03 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "88238528-5ea8-43ea-9152-27885b465c25") + ) + (wire + (pts + (xy 107.95 236.22) (xy 128.27 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "89abdde3-8346-448f-8245-a898a2b49c0b") + ) + (wire + (pts + (xy 123.19 91.44) (xy 123.19 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8a837137-bde8-4230-ad26-9edeeef1afc8") + ) + (wire + (pts + (xy 99.06 168.91) (xy 111.76 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8b41e15f-4e8d-4695-88ce-a5c2de5932e5") + ) + (wire + (pts + (xy 95.25 196.85) (xy 97.79 196.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8b5b1411-84af-4646-8c33-e87595faa280") + ) + (wire + (pts + (xy 232.41 40.64) (xy 234.95 40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8b640500-8105-4c86-93f5-267520661909") + ) + (wire + (pts + (xy 245.11 172.72) (xy 251.46 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c2fd42e-089e-4813-b5be-c434b8603262") + ) + (wire + (pts + (xy 284.48 234.95) (xy 284.48 218.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c317d7d-d692-4040-a910-c254f420a386") + ) + (wire + (pts + (xy 252.73 67.31) (xy 252.73 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8cc80a9d-6ef4-4b58-a4c1-ad598dcf9953") + ) + (wire + (pts + (xy 60.96 226.06) (xy 64.77 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8d622ed7-8a09-48d6-9f80-ef2079e67175") + ) + (wire + (pts + (xy 106.68 82.55) (xy 106.68 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8d8058e8-b73e-4533-9a80-b019c23d876a") + ) + (wire + (pts + (xy 33.02 269.24) (xy 43.18 269.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8dceb4e4-e45e-4c29-8e2c-eb50149ce8ca") + ) + (wire + (pts + (xy 302.26 116.84) (xy 302.26 118.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8e56d517-76b0-4f37-9196-d4c0b12f6bc7") + ) + (wire + (pts + (xy 85.09 236.22) (xy 85.09 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8e903221-2477-475f-86ec-9917e1463468") + ) + (wire + (pts + (xy 204.47 40.64) (xy 185.42 40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8ef58f4a-862d-46af-a228-2ef0ecbdfdfb") + ) + (wire + (pts + (xy 72.39 283.21) (xy 72.39 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8f089280-47ba-4c00-b070-7cbdcb7db226") + ) + (wire + (pts + (xy 289.56 72.39) (xy 287.02 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8f125e8d-e33a-4d03-99a3-0b33b755ba6e") + ) + (wire + (pts + (xy 344.17 80.01) (xy 344.17 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8f9a62f6-dfe2-496e-a071-d8106a7702c5") + ) + (wire + (pts + (xy 306.07 66.04) (xy 328.93 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8fe123e2-a3c8-42a2-9417-7286bfab00aa") + ) + (polyline + (pts + (xy 57.15 59.69) (xy 68.58 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8ffdb2f2-7122-418b-91fb-a867e9f0b236") + ) + (wire + (pts + (xy 139.7 157.48) (xy 139.7 154.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "902ebb79-923e-41e2-b6b1-a23929528b12") + ) + (wire + (pts + (xy 82.55 217.17) (xy 69.85 217.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "907b8634-9f9d-4100-a08d-f40d93e76e8c") + ) + (polyline + (pts + (xy 105.41 27.94) (xy 116.84 27.94) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "909a2777-1b47-4a34-a432-9905c0284467") + ) + (wire + (pts + (xy 270.51 262.89) (xy 273.05 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "909f1fa8-c3b3-48d9-9e3c-5414dcdf387c") + ) + (wire + (pts + (xy 109.22 82.55) (xy 106.68 82.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "90b11655-9dad-46d3-903b-6c7bbdd1da74") + ) + (polyline + (pts + (xy 203.2 148.59) (xy 203.2 175.26) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "91454aaa-4d2a-460c-87b7-209e7ee3bf13") + ) + (wire + (pts + (xy 77.47 269.24) (xy 77.47 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "914d218a-75f0-47bd-a6d1-a2a1d8be3ca9") + ) + (wire + (pts + (xy 148.59 238.76) (xy 190.5 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "91673951-6812-4777-bf8b-c17e0f3a5788") + ) + (wire + (pts + (xy 69.85 176.53) (xy 67.31 176.53) + ) + (stroke + (width 0) + (type default) + ) + (uuid "91b0a5c0-9533-4f4c-b785-7bc03db824f1") + ) + (wire + (pts + (xy 346.71 199.39) (xy 346.71 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "91cc2cbb-0fa7-43f7-a6eb-79e0e3681a43") + ) + (polyline + (pts + (xy 209.55 127) (xy 264.16 127) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "9217aad4-9186-4aaf-b2f6-3af91cfb374d") + ) + (polyline + (pts + (xy 364.49 110.49) (xy 313.69 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "921e39d9-1e6d-44d3-bb82-5a971a575f11") + ) + (wire + (pts + (xy 95.25 184.15) (xy 102.87 184.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "92261000-2cd2-4265-8469-603247ce1c3f") + ) + (wire + (pts + (xy 237.49 86.36) (xy 243.84 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9263e414-18f1-40b8-85a7-963216988d59") + ) + (wire + (pts + (xy 162.56 199.39) (xy 162.56 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "93ff2acf-78d1-4f5c-8428-b539b2409606") + ) + (polyline + (pts + (xy 180.34 104.14) (xy 191.77 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "943e7f70-8d67-43fa-89a5-19ba0bf38570") + ) + (wire + (pts + (xy 212.09 172.72) (xy 212.09 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "94c1f1a1-7ef1-471e-b985-6c292898be73") + ) + (wire + (pts + (xy 43.18 212.09) (xy 43.18 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "94f5fe6d-a091-4c56-a6ba-8703cc2b651b") + ) + (polyline + (pts + (xy 142.24 44.45) (xy 142.24 59.69) + ) + (stroke + (width 1) + (type default) + (color 0 255 0 1) + ) + (uuid "9580db4d-acf4-4e94-b66a-a81a04d75e9e") + ) + (wire + (pts + (xy 229.87 215.9) (xy 229.87 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "95beb42a-c10e-4be8-9d51-d469923ab08c") + ) + (wire + (pts + (xy 62.23 93.98) (xy 63.5 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "97196674-6ee3-44f9-92e1-079fda2e9ac7") + ) + (wire + (pts + (xy 229.87 220.98) (xy 229.87 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "977c7e5b-0b22-4be2-81ff-243499b46c8a") + ) + (wire + (pts + (xy 25.4 273.05) (xy 22.86 273.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "97954f08-250e-4be3-a710-a92ef21984b3") + ) + (wire + (pts + (xy 267.97 86.36) (xy 269.24 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "98029c40-d41a-480e-bab7-d75b11f2e64d") + ) + (wire + (pts + (xy 170.18 222.25) (xy 167.64 222.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9810f478-ed29-449e-abeb-8743a5106bcb") + ) + (polyline + (pts + (xy 123.19 99.06) (xy 123.19 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "986563bd-e7b4-4934-8493-be37ccc0aeab") + ) + (wire + (pts + (xy 74.93 260.35) (xy 111.76 260.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9867f95e-1ac5-43ab-b71f-b266ebfb4b71") + ) + (wire + (pts + (xy 212.09 213.36) (xy 212.09 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "989255b8-944f-4fdf-b0bf-cd526308364b") + ) + (wire + (pts + (xy 125.73 246.38) (xy 125.73 248.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "98953a30-2756-4674-8552-d753b0b6c173") + ) + (wire + (pts + (xy 190.5 222.25) (xy 182.88 222.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "98ff9e1d-fcf2-4e62-839a-13eb797d3916") + ) + (wire + (pts + (xy 109.22 82.55) (xy 109.22 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9931277a-43ac-40bf-b2ea-9478113b711d") + ) + (wire + (pts + (xy 62.23 182.88) (xy 62.23 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "99c4871d-6de9-4709-99c7-19fcd7862c9f") + ) + (polyline + (pts + (xy 372.11 151.13) (xy 389.89 152.4) + ) + (stroke + (width 0.5) + (type default) + (color 255 153 0 1) + ) + (uuid "9a5cca66-0b47-4b16-8259-b870aa3316aa") + ) + (wire + (pts + (xy 115.57 271.78) (xy 133.35 271.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9a7cdb82-57c9-4eb8-85c6-6d1b49b2f293") + ) + (wire + (pts + (xy 83.82 96.52) (xy 85.09 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9ae3f48c-a021-49a4-b219-1a001a6de887") + ) + (wire + (pts + (xy 191.77 134.62) (xy 191.77 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9b84732d-7f71-4c48-b21f-a66b168f2df8") + ) + (wire + (pts + (xy 273.05 251.46) (xy 273.05 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9b9bebb0-b4aa-476a-9641-d2d34d93d9a4") + ) + (wire + (pts + (xy 254 171.45) (xy 254 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9c05b11d-2213-4583-bca7-32ac4d38d49f") + ) + (wire + (pts + (xy 256.54 215.9) (xy 256.54 214.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9c6b9742-813c-4b0e-9f91-9e7fd5ce45d4") + ) + (wire + (pts + (xy 347.98 128.27) (xy 356.87 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9d14c0a2-efa0-4c23-adef-0eff0510b54d") + ) + (polyline + (pts + (xy 173.99 107.95) (xy 173.99 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9d14dcf3-0385-4735-ae18-4a0b3295c678") + ) + (wire + (pts + (xy 21.59 243.84) (xy 25.4 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9d5c4bd7-81a4-4f28-8c38-e5a0def61858") + ) + (wire + (pts + (xy 100.33 191.77) (xy 100.33 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9d789884-3736-4360-a099-8b5e40665586") + ) + (polyline + (pts + (xy 370.84 152.4) (xy 356.87 148.59) + ) + (stroke + (width 1) + (type default) + (color 0 0 255 1) + ) + (uuid "9daae050-e8ab-451b-b5eb-a419733db16a") + ) + (wire + (pts + (xy 60.96 243.84) (xy 73.66 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9dc95a43-ce85-4213-95e0-6cc7d1f3777d") + ) + (wire + (pts + (xy 13.97 251.46) (xy 15.24 251.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9e56065b-c23b-4224-a652-3d2bf9debdc0") + ) + (wire + (pts + (xy 50.8 100.33) (xy 50.8 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f245d3c-6d5d-4106-8a94-61bda618e87e") + ) + (wire + (pts + (xy 222.25 189.23) (xy 222.25 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f2de9c9-c796-4a69-8b4c-2acd2fce76cc") + ) + (wire + (pts + (xy 66.04 182.88) (xy 66.04 186.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f6ee202-5bb4-400e-911c-a968716c8e4f") + ) + (wire + (pts + (xy 180.34 34.29) (xy 185.42 34.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f7df9e2-931f-491b-9beb-3fc3e4fe8314") + ) + (wire + (pts + (xy 21.59 278.13) (xy 21.59 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a0398997-097b-4ef4-8af1-4e94c3976c68") + ) + (wire + (pts + (xy 226.06 198.12) (xy 229.87 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a06b8871-1d2c-46cd-a8e0-404d07612fbc") + ) + (polyline + (pts + (xy 12.7 149.86) (xy 195.58 149.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a09edd56-65a3-4a43-9487-f1710b6516c7") + ) + (wire + (pts + (xy 222.25 198.12) (xy 226.06 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a2441812-8e8b-409a-b10c-38588195731e") + ) + (wire + (pts + (xy 21.59 261.62) (xy 25.4 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a295c155-bb29-4bc2-aff9-e10aadf69fb0") + ) + (wire + (pts + (xy 139.7 128.27) (xy 139.7 134.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a3092a66-a243-4b78-8412-434da4123aa6") + ) + (wire + (pts + (xy 302.26 99.06) (xy 316.23 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a32ebbd3-2d10-451a-9c13-02f46f26a9c9") + ) + (wire + (pts + (xy 237.49 72.39) (xy 237.49 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a3477a7c-0a99-4a32-934a-4d0f880d60ae") + ) + (wire + (pts + (xy 132.08 207.01) (xy 148.59 207.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a3f4ecf8-ae74-46c1-9a15-02865892dc9e") + ) + (wire + (pts + (xy 95.25 181.61) (xy 101.6 181.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a436d6dc-44bd-4654-9ad0-4fb37198ffed") + ) + (wire + (pts + (xy 259.08 234.95) (xy 259.08 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a43e84e7-c409-41fc-905b-abfa6a73044e") + ) + (wire + (pts + (xy 95.25 179.07) (xy 100.33 179.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a4ff42f2-e17d-4627-bfa4-13567560e28c") + ) + (polyline + (pts + (xy 222.25 62.23) (xy 262.89 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a5e66c87-7149-4b40-a64c-e4e4f05e6b41") + ) + (wire + (pts + (xy 372.11 199.39) (xy 375.92 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a60ea8e8-0c96-4d3d-ae93-a78aee86a073") + ) + (polyline + (pts + (xy 389.89 161.29) (xy 397.51 156.21) + ) + (stroke + (width 0.5) + (type default) + (color 255 0 255 1) + ) + (uuid "a6753832-1c84-49a6-8934-99cffcd7a7d0") + ) + (wire + (pts + (xy 212.09 143.51) (xy 222.25 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a6a8ba36-c7f5-403f-9249-6a9ca4164fd3") + ) + (wire + (pts + (xy 231.14 153.67) (xy 237.49 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a9e7245d-2e3d-449f-8696-88618f0be619") + ) + (wire + (pts + (xy 302.26 63.5) (xy 309.88 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aa3660ab-e4ed-40af-a33e-076d05a4046b") + ) + (wire + (pts + (xy 229.87 177.8) (xy 229.87 181.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aa422a12-0b88-4ba3-9edd-0c978c323c1b") + ) + (wire + (pts + (xy 194.31 134.62) (xy 191.77 134.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aa555c75-eb92-4ff9-8c43-b6cbab4a07f8") + ) + (wire + (pts + (xy 26.67 86.36) (xy 33.02 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aa79a95c-b59a-46f3-8c33-4c4f91131025") + ) + (wire + (pts + (xy 22.86 259.08) (xy 25.4 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aaab4366-07f3-4525-a4d4-4eedaa3ec665") + ) + (wire + (pts + (xy 283.21 52.07) (xy 283.21 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aad8df6b-ee9e-4755-86f8-0f2816689e7d") + ) + (wire + (pts + (xy 125.73 248.92) (xy 128.27 248.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aaeea02d-0143-41fa-8956-04198a538449") + ) + (wire + (pts + (xy 77.47 31.75) (xy 77.47 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aaf31c6b-da44-4467-9d38-1c361a122b2d") + ) + (polyline + (pts + (xy 162.56 104.14) (xy 173.99 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ab1549b2-e88a-43b4-9373-4abec5936ae2") + ) + (wire + (pts + (xy 63.5 166.37) (xy 63.5 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "abb26fb1-8505-48f9-b181-755ced097f90") + ) + (wire + (pts + (xy 125.73 88.9) (xy 125.73 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ac0c52d4-beb2-4a4d-9743-a9cb0d283a86") + ) + (polyline + (pts + (xy 57.15 62.23) (xy 57.15 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ac7b4942-7796-43b3-9d0e-1345d350b2d1") + ) + (wire + (pts + (xy 387.35 62.23) (xy 387.35 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "acce0606-21e0-4c19-b35d-800176c0942a") + ) + (wire + (pts + (xy 132.08 269.24) (xy 132.08 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ad3bea0b-778e-4048-bafb-b36f0266b544") + ) + (wire + (pts + (xy 175.26 222.25) (xy 170.18 222.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ad3c1190-3f50-4ec5-8aa1-1f0a31ab7240") + ) + (wire + (pts + (xy 337.82 119.38) (xy 347.98 119.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "adb7f264-8006-4431-bf01-13e056d331e9") + ) + (wire + (pts + (xy 250.19 72.39) (xy 250.19 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "adf1b66e-ae00-4882-b60d-3583a87eb99b") + ) + (wire + (pts + (xy 87.63 236.22) (xy 85.09 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ae3b4b08-0db4-4ccd-b535-add5c41e71c3") + ) + (polyline + (pts + (xy 374.65 151.13) (xy 374.65 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aea1a33c-e7a6-4d8b-b51c-c39cf46de89d") + ) + (wire + (pts + (xy 15.24 251.46) (xy 16.51 251.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aea874ed-d4c6-47b2-ab52-af3cf2ea3db8") + ) + (wire + (pts + (xy 107.95 231.14) (xy 128.27 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aef0fe6b-a5e7-4aea-a20b-55601e2d779c") + ) + (wire + (pts + (xy 302.26 99.06) (xy 302.26 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "af6c0f39-14bb-4679-8981-a9b3303c507b") + ) + (wire + (pts + (xy 302.26 86.36) (xy 302.26 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "af79ab68-f9d6-4e04-8247-a98b14cde529") + ) + (wire + (pts + (xy 193.04 26.67) (xy 194.31 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "af88d0f1-b46a-4666-9c74-dd79d503d128") + ) + (wire + (pts + (xy 234.95 54.61) (xy 187.96 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "afb32af2-46a4-4a32-92e7-fe21579bed95") + ) + (polyline + (pts + (xy 325.12 182.88) (xy 407.67 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "afe750da-2b3e-45bf-aabe-8200a5421e16") + ) + (wire + (pts + (xy 60.96 86.36) (xy 63.5 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b025d751-9f0d-47ed-b6a4-32713c9f85c9") + ) + (wire + (pts + (xy 375.92 238.76) (xy 393.7 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b07e87f9-3814-4923-93ec-a2a89edc9081") + ) + (wire + (pts + (xy 304.8 193.04) (xy 304.8 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b09b4146-e8bc-4a4b-abd9-385472fdf5cf") + ) + (wire + (pts + (xy 229.87 189.23) (xy 229.87 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0b03454-cf5a-4494-b0a4-5595b5bdc436") + ) + (wire + (pts + (xy 212.09 256.54) (xy 212.09 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0e84ce1-21fe-4183-b5eb-c1963134fad2") + ) + (wire + (pts + (xy 273.05 210.82) (xy 279.4 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0f582ea-28d6-47ce-bf5b-bf7cda0ef36a") + ) + (wire + (pts + (xy 66.04 194.31) (xy 69.85 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b25197a2-41cb-43c9-a217-f0123b87408c") + ) + (wire + (pts + (xy 375.92 199.39) (xy 393.7 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b2fc057d-93b4-448c-a4cc-fd8f29fe2195") + ) + (polyline + (pts + (xy 407.67 252.73) (xy 325.12 252.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b34bd3c7-b3a4-4c5b-acde-59f2a714c488") + ) + (wire + (pts + (xy 281.94 72.39) (xy 281.94 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b34c761d-10f9-43cf-a738-93b08d42460f") + ) + (wire + (pts + (xy 176.53 279.4) (xy 175.26 279.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b484c007-c066-4e52-b21f-3b25add2caa1") + ) + (wire + (pts + (xy 100.33 171.45) (xy 111.76 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b4c47b93-7c10-48f1-9da3-a6dfa5510e17") + ) + (wire + (pts + (xy 101.6 201.93) (xy 111.76 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b4e1a201-bffe-4370-a042-9ac7a6e7cfbf") + ) + (wire + (pts + (xy 332.74 82.55) (xy 332.74 80.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b50216c0-89cb-401d-ae9e-7d454a8f74dc") + ) + (polyline + (pts + (xy 105.41 58.42) (xy 116.84 58.42) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "b57ea0f5-02e6-45ec-b47b-d052c7c239b0") + ) + (wire + (pts + (xy 287.02 72.39) (xy 287.02 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b5b6f0a0-238c-4808-9873-806a55816f1a") + ) + (wire + (pts + (xy 40.64 193.04) (xy 53.34 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b5d005ac-c698-46d9-af0c-331c3c3dbf5b") + ) + (wire + (pts + (xy 13.97 261.62) (xy 13.97 251.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b6b7134f-0d7f-4506-b19b-16767b020901") + ) + (wire + (pts + (xy 273.05 236.22) (xy 273.05 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b6c54134-f97b-4af6-8c4e-70822051c68f") + ) + (wire + (pts + (xy 24.13 256.54) (xy 25.4 256.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b77de244-8835-4c3d-b4fb-b8efaedbbba7") + ) + (wire + (pts + (xy 82.55 241.3) (xy 82.55 242.57) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b7a3a6ee-275a-408b-abff-c4bccd2486bf") + ) + (wire + (pts + (xy 16.51 256.54) (xy 16.51 251.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b7bea89e-e1c3-48e4-90cc-3e04c689a64f") + ) + (wire + (pts + (xy 234.95 40.64) (xy 234.95 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b8806cd2-9b67-462a-90c7-9832e9575fe6") + ) + (wire + (pts + (xy 22.86 273.05) (xy 22.86 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b9631118-2ead-4647-8a79-0bbff3f29b94") + ) + (polyline + (pts + (xy 171.45 148.59) (xy 203.2 148.59) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "ba69e3b7-edbd-4fbd-a9bf-b7092e906f68") + ) + (wire + (pts + (xy 308.61 100.33) (xy 308.61 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "baa1404c-6579-4cb3-a089-e5f1b5e27d9e") + ) + (wire + (pts + (xy 152.4 104.14) (xy 152.4 106.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bae6c4fd-bab8-4f66-88a8-e72e56f0f1b7") + ) + (polyline + (pts + (xy 118.11 101.6) (xy 118.11 129.54) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "bb604b76-5c70-4837-b58d-c787e7bd4ede") + ) + (wire + (pts + (xy 381 207.01) (xy 393.7 207.01) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bb7fb7f7-c38e-415c-8dbc-69bd4dcd4c11") + ) + (wire + (pts + (xy 306.07 215.9) (xy 304.8 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bb836777-6ea2-485a-ad29-d3994148e596") + ) + (wire + (pts + (xy 267.97 88.9) (xy 269.24 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bbbcf587-6d6f-4a6a-af88-facb2358ac5e") + ) + (wire + (pts + (xy 63.5 223.52) (xy 63.5 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bbc050ee-538a-4033-917e-c33d41c1862e") + ) + (wire + (pts + (xy 166.37 115.57) (xy 166.37 120.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bbeb3577-b2cc-44b9-a7a7-31984f5f5ad9") + ) + (wire + (pts + (xy 85.09 34.29) (xy 81.28 34.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bc0e402c-9885-4139-80de-b05ac29f3275") + ) + (wire + (pts + (xy 222.25 232.41) (xy 222.25 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bc810260-3cf1-4dcc-80dd-251e4d07f7cf") + ) + (polyline + (pts + (xy 389.89 151.13) (xy 397.51 156.21) + ) + (stroke + (width 0.5) + (type default) + (color 255 153 0 1) + ) + (uuid "bcf2b7b4-2507-4ccf-b42e-d7511ad1194f") + ) + (wire + (pts + (xy 243.84 86.36) (xy 243.84 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bd6fe6f2-be6a-4811-b862-feff45164d74") + ) + (wire + (pts + (xy 111.76 214.63) (xy 110.49 214.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "be1708b1-38af-4cf6-9e16-2f818aaef7a2") + ) + (wire + (pts + (xy 302.26 83.82) (xy 302.26 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bea62cea-6f68-44ef-9d6b-e34ef53b688f") + ) + (wire + (pts + (xy 110.49 181.61) (xy 110.49 189.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bec3b20b-6372-44ba-8e3c-cd6dd492c659") + ) + (wire + (pts + (xy 222.25 143.51) (xy 222.25 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bf404e45-6405-4508-8682-e87f54cdf388") + ) + (wire + (pts + (xy 25.4 278.13) (xy 21.59 278.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bfacf737-2a0d-43a2-b123-042f33cf499f") + ) + (wire + (pts + (xy 133.35 283.21) (xy 72.39 283.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c07df975-f123-46b4-89ae-d3c987e225a2") + ) + (wire + (pts + (xy 267.97 27.94) (xy 267.97 39.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c24d81be-a9e4-4145-9425-c8cf2684253e") + ) + (wire + (pts + (xy 107.95 238.76) (xy 128.27 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c2524d15-ccc0-45b9-93db-cd5485560587") + ) + (wire + (pts + (xy 64.77 187.96) (xy 64.77 189.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c254ddae-014f-4f4c-9a1c-844ea64f7199") + ) + (wire + (pts + (xy 16.51 251.46) (xy 16.51 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c298249d-1d78-4ecd-9555-0699081a928e") + ) + (wire + (pts + (xy 77.47 269.24) (xy 102.87 269.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c30bf18c-6473-4876-a7ee-f81c433402df") + ) + (wire + (pts + (xy 132.08 199.39) (xy 148.59 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c3542103-a4b8-4448-9d7f-47201abc718a") + ) + (wire + (pts + (xy 33.02 86.36) (xy 33.02 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c3a50468-de12-4675-82d9-fc0574c420d8") + ) + (wire + (pts + (xy 40.64 187.96) (xy 53.34 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4afd1c7-4c73-44b6-b7f6-e4e90341d731") + ) + (wire + (pts + (xy 100.33 274.32) (xy 100.33 273.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4e24fac-6473-4da7-88f2-532e53318226") + ) + (wire + (pts + (xy 96.52 163.83) (xy 111.76 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4e33a18-c29b-4669-952a-5ee70fae31b6") + ) + (wire + (pts + (xy 95.25 171.45) (xy 99.06 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4fb7d8d-b897-4e34-a45b-867971a0a49e") + ) + (wire + (pts + (xy 69.85 40.64) (xy 81.28 40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c5c43a0b-de6f-4b95-a26d-4b2bf1ba990d") + ) + (wire + (pts + (xy 162.56 161.29) (xy 162.56 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c5d23535-d3dc-43bf-ad20-589c5307a160") + ) + (wire + (pts + (xy 233.68 143.51) (xy 237.49 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c60a7b20-ff00-44b1-86a1-fbd62b062513") + ) + (wire + (pts + (xy 351.79 66.04) (xy 351.79 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c6c878ab-86f6-4f2d-9d68-cfa47841cb4f") + ) + (polyline + (pts + (xy 389.89 151.13) (xy 389.89 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c70c51ea-780e-4a10-9b7b-cb06d59276ae") + ) + (wire + (pts + (xy 24.13 267.97) (xy 24.13 256.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c7132a30-6bf5-4338-8179-279041a34e5f") + ) + (wire + (pts + (xy 222.25 143.51) (xy 226.06 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c7840647-15c3-492b-8ed1-00bc13aef8f9") + ) + (wire + (pts + (xy 185.42 52.07) (xy 180.34 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c8ea70b6-b0eb-4cbc-826e-7da03130d3a7") + ) + (wire + (pts + (xy 259.08 236.22) (xy 273.05 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c9834f2f-89b4-4802-861e-0a76b02f1411") + ) + (wire + (pts + (xy 101.6 181.61) (xy 101.6 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c996f030-583a-4392-adf6-f328a25924af") + ) + (wire + (pts + (xy 111.76 241.3) (xy 128.27 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c9ab5ef1-02f4-40d1-9bf2-ab0033c35279") + ) + (wire + (pts + (xy 356.87 238.76) (xy 358.14 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ca9946b3-78e8-4ba2-b92c-c807358e3dd8") + ) + (polyline + (pts + (xy 264.16 86.36) (xy 264.16 127) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "cb776b4a-215c-49d3-a2de-90ebaf520eca") + ) + (polyline + (pts + (xy 372.11 161.29) (xy 389.89 160.02) + ) + (stroke + (width 0.5) + (type default) + (color 255 0 255 1) + ) + (uuid "cba13303-ba20-49df-bddb-f5c9fd1563e0") + ) + (wire + (pts + (xy 115.57 276.86) (xy 133.35 276.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cbda1ef6-c20a-4624-b4c4-088e72079187") + ) + (wire + (pts + (xy 97.79 209.55) (xy 111.76 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cbe4b96e-598f-4e4a-9aef-738dca3b62b3") + ) + (wire + (pts + (xy 64.77 189.23) (xy 69.85 189.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cd6ac1df-fb72-4957-972e-e31cd2d4c1b2") + ) + (wire + (pts + (xy 255.27 212.09) (xy 255.27 214.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cd87a444-b4ba-49fe-9a12-8ae0f46aee9d") + ) + (wire + (pts + (xy 302.26 91.44) (xy 300.99 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cdd2b4ac-719f-4ad2-b769-ecc8128db375") + ) + (wire + (pts + (xy 281.94 213.36) (xy 284.48 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cde1354b-611c-4186-8ff0-8c45b6e71be5") + ) + (wire + (pts + (xy 21.59 233.68) (xy 21.59 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ce621b87-8616-4102-b4b5-a58129d5dbcb") + ) + (wire + (pts + (xy 110.49 217.17) (xy 111.76 217.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ce8b37e5-2a6c-4de9-81f5-f9912eb4c541") + ) + (wire + (pts + (xy 346.71 220.98) (xy 346.71 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cec85af4-f55a-407b-85fa-48cc9497f141") + ) + (polyline + (pts + (xy 222.25 62.23) (xy 222.25 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cf6bed7b-feda-45c6-bbd5-d4adec2be66d") + ) + (wire + (pts + (xy 194.31 118.11) (xy 191.77 118.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cfbf5e27-1c44-4f57-ae99-eb3bf715c312") + ) + (wire + (pts + (xy 156.21 128.27) (xy 154.94 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d0278231-f4ec-41d7-8ba6-c4e2c795728e") + ) + (wire + (pts + (xy 102.87 274.32) (xy 100.33 274.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d0566408-b03d-4054-bca4-e4ef2cfd43a9") + ) + (wire + (pts + (xy 111.76 260.35) (xy 111.76 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d0f8beed-107d-4e9c-ae62-7199e7727489") + ) + (wire + (pts + (xy 290.83 27.94) (xy 290.83 39.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d13b51bd-f631-4a5f-9636-3725a745a6d2") + ) + (wire + (pts + (xy 359.41 99.06) (xy 359.41 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d14b1654-72b1-47c7-be8e-4348594804d4") + ) + (wire + (pts + (xy 313.69 27.94) (xy 313.69 39.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d1f66e29-f42e-47b6-97ae-9b1077a314ea") + ) + (wire + (pts + (xy 73.66 276.86) (xy 73.66 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d20d6f39-0e3f-49c5-927c-b1210ee70b6a") + ) + (polyline + (pts + (xy 119.38 104.14) (xy 127 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d3190236-636e-4f44-b69b-0253273b2523") + ) + (wire + (pts + (xy 292.1 237.49) (xy 292.1 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d36167d0-bc3f-4620-86f7-6c29d8a750b2") + ) + (wire + (pts + (xy 60.96 182.88) (xy 62.23 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d379628f-c5d1-4fc7-8c58-147840cb14df") + ) + (wire + (pts + (xy 237.49 143.51) (xy 266.7 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d3fcd2e5-d270-4cec-9ceb-e172fb5b2757") + ) + (wire + (pts + (xy 148.59 233.68) (xy 175.26 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d4643d21-cd25-4afe-9c4f-34c60996daa3") + ) + (wire + (pts + (xy 123.19 88.9) (xy 125.73 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d4c22d07-c48d-4c8a-acb8-553216b5db2a") + ) + (wire + (pts + (xy 254 200.66) (xy 251.46 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d51b4afa-f760-42cd-93e3-5b9bf653f28e") + ) + (wire + (pts + (xy 359.41 100.33) (xy 359.41 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d55383f7-f861-4048-b3eb-ab9d6ab5979e") + ) + (wire + (pts + (xy 299.72 226.06) (xy 303.53 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d58c5a48-a1ad-47ec-b2a9-732b4ef44c5c") + ) + (wire + (pts + (xy 254 243.84) (xy 251.46 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d6097c85-8045-4ed9-9d9f-a8c7ddba0c1f") + ) + (wire + (pts + (xy 166.37 120.65) (xy 166.37 139.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d673b415-fc79-482a-8f46-0447a61634ab") + ) + (wire + (pts + (xy 279.4 210.82) (xy 284.48 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d74b9cb9-12c1-4837-971c-775d09a8dd00") + ) + (polyline + (pts + (xy 142.24 27.94) (xy 142.24 27.94) + ) + (stroke + (width 1) + (type default) + (color 0 255 0 1) + ) + (uuid "d8597897-fbef-4a4f-ac86-abcb9d89ac11") + ) + (polyline + (pts + (xy 372.11 160.02) (xy 389.89 158.75) + ) + (stroke + (width 0.5) + (type default) + (color 255 0 255 1) + ) + (uuid "d8c89a2f-6eb6-425a-adbc-6b5e85b85707") + ) + (wire + (pts + (xy 60.96 236.22) (xy 76.2 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d9d809ab-906b-45b8-9bcd-08842204fb20") + ) + (wire + (pts + (xy 111.76 179.07) (xy 110.49 179.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "da3ecce2-fb26-45f3-a0c7-e5f21eef465a") + ) + (wire + (pts + (xy 254 234.95) (xy 254 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "da5f21f8-a73d-4707-bc67-e3b572c36f7c") + ) + (wire + (pts + (xy 95.25 212.09) (xy 111.76 212.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "db0393a2-50e3-4668-9500-5888e4480dce") + ) + (wire + (pts + (xy 237.49 172.72) (xy 237.49 176.53) + ) + (stroke + (width 0) + (type default) + ) + (uuid "db32d667-7002-4f9a-b085-07dccd1e3e80") + ) + (wire + (pts + (xy 105.41 29.21) (xy 107.95 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc2e8f47-5b18-4191-9d57-f515033976af") + ) + (wire + (pts + (xy 160.02 115.57) (xy 160.02 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc6344bf-05bd-44ad-8112-669c2ebf6a3d") + ) + (wire + (pts + (xy 158.75 62.23) (xy 160.02 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc6787f4-c5c1-4937-b277-91d92d8bce4e") + ) + (polyline + (pts + (xy 123.19 110.49) (xy 123.19 115.57) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc76133b-e96e-40a0-bd52-b9bb4a992240") + ) + (wire + (pts + (xy 185.42 40.64) (xy 185.42 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd353b9d-da0a-48a8-9885-c43f1eeb4f6b") + ) + (wire + (pts + (xy 99.06 171.45) (xy 99.06 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd907d8a-b805-448c-8705-1959bb4f554a") + ) + (polyline + (pts + (xy 57.15 69.85) (xy 57.15 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dde9e89d-11e9-4b1b-b6c8-e458c5d1af0c") + ) + (wire + (pts + (xy 95.25 189.23) (xy 101.6 189.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "deb7e25c-cde0-4397-8728-2ea8e47c02c1") + ) + (wire + (pts + (xy 255.27 171.45) (xy 254 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "df3a0541-9d32-44d5-943a-cbe7d13a30e2") + ) + (wire + (pts + (xy 115.57 274.32) (xy 118.11 274.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "df5e06d5-382f-46d1-9a29-5dca65ac337f") + ) + (wire + (pts + (xy 115.57 269.24) (xy 132.08 269.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "df921253-df90-421b-a759-986dffda193b") + ) + (wire + (pts + (xy 313.69 234.95) (xy 313.69 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dfd05f2c-1435-45d2-a275-e976bb5076ec") + ) + (wire + (pts + (xy 29.21 40.64) (xy 41.91 40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e01a9879-9d0a-416c-b6f5-01d874b00d1b") + ) + (wire + (pts + (xy 279.4 72.39) (xy 279.4 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e01f7e3a-6ffc-4039-8efc-434e9d379c21") + ) + (wire + (pts + (xy 76.2 236.22) (xy 76.2 271.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e03d781a-0269-4f4d-9a48-8537b8d566a8") + ) + (wire + (pts + (xy 158.75 57.15) (xy 160.02 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e07d9e79-dfe5-4f68-a351-9b90357eb71c") + ) + (wire + (pts + (xy 95.25 44.45) (xy 95.25 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e1561fa4-b8ff-423f-9c69-b63db0d41d78") + ) + (wire + (pts + (xy 281.94 72.39) (xy 279.4 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e1ee7241-a15b-4465-8437-09f3b193c71e") + ) + (polyline + (pts + (xy 262.89 100.33) (xy 222.25 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e2e055b9-c0eb-4250-9e24-7dfeb03b47ae") + ) + (wire + (pts + (xy 73.66 276.86) (xy 102.87 276.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3128dae-9ef7-471c-96d3-b1d065951edd") + ) + (wire + (pts + (xy 255.27 168.91) (xy 255.27 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e355719c-3a75-48e5-afb3-792baf1c03bf") + ) + (wire + (pts + (xy 60.96 228.6) (xy 66.04 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3ec22e8-3b7c-493f-9053-66d730879ab4") + ) + (wire + (pts + (xy 308.61 116.84) (xy 308.61 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3f0b07f-02eb-46d6-9897-d1e94604c75b") + ) + (wire + (pts + (xy 279.4 100.33) (xy 279.4 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e44ec7f7-52e5-4881-8785-d979dd5b9259") + ) + (wire + (pts + (xy 187.96 31.75) (xy 187.96 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e512a03a-d1b3-449f-a4e4-22a240ab3c97") + ) + (wire + (pts + (xy 163.83 168.91) (xy 163.83 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e56cebb8-efd4-4c7b-8a93-83617e2232dc") + ) + (wire + (pts + (xy 330.2 121.92) (xy 330.2 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e59bcf46-6f61-4a31-b5d9-986b00d4fd01") + ) + (wire + (pts + (xy 347.98 120.65) (xy 356.87 120.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e5b5e22b-9d45-464f-8bc9-41b989c29165") + ) + (wire + (pts + (xy 110.49 189.23) (xy 121.92 189.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e6510e06-0040-4fad-9827-fc237abf1fe3") + ) + (wire + (pts + (xy 132.08 212.09) (xy 162.56 212.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e68ab52d-cc24-4c1a-8ede-b1f69889c266") + ) + (wire + (pts + (xy 316.23 129.54) (xy 316.23 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e7560f71-f354-4824-aef3-4e94a74c7288") + ) + (wire + (pts + (xy 77.47 231.14) (xy 87.63 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e77d6499-5164-4a41-addb-f15fbf53e0cf") + ) + (wire + (pts + (xy 41.91 54.61) (xy 77.47 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e837f643-bccc-40a2-b948-b1aa4e8e4588") + ) + (wire + (pts + (xy 74.93 26.67) (xy 76.2 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e85a6a26-8b13-4d61-ac0e-3877aeead834") + ) + (wire + (pts + (xy 222.25 177.8) (xy 222.25 181.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e9b29f86-22b8-4ee7-8397-a7eec84651e4") + ) + (wire + (pts + (xy 29.21 213.36) (xy 31.75 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ea0ac332-7ec5-43bc-b878-16013dc217f4") + ) + (wire + (pts + (xy 21.59 223.52) (xy 25.4 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eb653aac-badf-420c-a6bc-977ec9778d52") + ) + (wire + (pts + (xy 336.55 27.94) (xy 336.55 39.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ebd6e3eb-29fa-46ad-8aa6-f717efd7a1e6") + ) + (polyline + (pts + (xy 119.38 104.14) (xy 123.19 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ebf1648e-efe1-4212-af29-98bbc053752d") + ) + (wire + (pts + (xy 143.51 265.43) (xy 143.51 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ec42d228-3b39-4938-a648-babf7e5e2d6e") + ) + (wire + (pts + (xy 162.56 173.99) (xy 162.56 176.53) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ec8a99d3-9816-4430-a18c-f17d1097fbe5") + ) + (wire + (pts + (xy 259.08 193.04) (xy 273.05 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ece968d7-c378-4fd1-a6b0-db1579b8a346") + ) + (polyline + (pts + (xy 180.34 21.59) (xy 199.39 21.59) + ) + (stroke + (width 1) + (type default) + (color 0 255 0 1) + ) + (uuid "ed0a33ab-0f6c-4e0b-b34c-cf7edac4afa6") + ) + (polyline + (pts + (xy 284.48 59.69) (xy 194.31 59.69) + ) + (stroke + (width 1) + (type default) + (color 0 255 0 1) + ) + (uuid "ed500476-a89e-4827-abf4-18cc38a9ae0a") + ) + (wire + (pts + (xy 355.6 63.5) (xy 355.6 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee05a8fb-242d-4571-9d62-5ca2094c275f") + ) + (polyline + (pts + (xy 262.89 62.23) (xy 262.89 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee7b737b-7fc9-49f8-ba74-5af6a150511b") + ) + (wire + (pts + (xy 33.02 269.24) (xy 33.02 273.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee8134ba-49fb-4abf-829a-32ab1d9a200f") + ) + (polyline + (pts + (xy 313.69 129.54) (xy 273.05 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee9aa040-f5fb-4aa9-b271-7d7fcc7ecd0c") + ) + (polyline + (pts + (xy 307.34 86.36) (xy 264.16 86.36) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "ef0d9b20-6d24-48c2-8ffb-801a3a569b5f") + ) + (wire + (pts + (xy 50.8 88.9) (xy 63.5 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "efd12a0b-9f0b-4b6d-ae46-2af1dee8570f") + ) + (wire + (pts + (xy 76.2 271.78) (xy 102.87 271.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f024fb2c-4e14-4f3c-8ff4-0c40b57014d8") + ) + (wire + (pts + (xy 167.64 222.25) (xy 167.64 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f08a14db-50f3-4dd9-b7f2-1030ac3f5d09") + ) + (wire + (pts + (xy 132.08 163.83) (xy 148.59 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f14c8aa7-fc69-424d-a440-233c94c2abd9") + ) + (wire + (pts + (xy 267.97 83.82) (xy 267.97 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f247a217-55d6-4a5a-8271-e5d3e4fe2175") + ) + (wire + (pts + (xy 302.26 114.3) (xy 302.26 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f259221c-bb9c-4e30-97be-6beaf1c5e269") + ) + (wire + (pts + (xy 335.28 52.07) (xy 336.55 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f2928ada-72df-4ce3-a187-c49bc74e836e") + ) + (wire + (pts + (xy 308.61 101.6) (xy 331.47 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f2ef741a-d24c-44c2-90e1-74584068db41") + ) + (wire + (pts + (xy 97.79 196.85) (xy 97.79 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f3393a56-cd07-4805-83f8-d9d788c09233") + ) + (polyline + (pts + (xy 67.31 69.85) (xy 67.31 80.01) + ) + (stroke + (width 1) + (type default) + (color 255 0 0 1) + ) + (uuid "f36de82a-0557-44b5-8fdb-b424225a555b") + ) + (wire + (pts + (xy 105.41 62.23) (xy 113.03 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f37c40dc-dcdb-4d7b-a447-5ab82cc62478") + ) + (wire + (pts + (xy 279.4 162.56) (xy 279.4 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f3fcfb87-6cbf-4c0a-a22b-7982ba6e40fc") + ) + (wire + (pts + (xy 175.26 218.44) (xy 175.26 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f47d3938-e28f-49df-8662-6c1fcd319bbe") + ) + (wire + (pts + (xy 167.64 45.72) (xy 167.64 46.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f48e4865-ace7-43a0-9a01-6fdce766cdfb") + ) + (wire + (pts + (xy 284.48 72.39) (xy 281.94 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f529b2d2-b61f-47c5-bf74-fc1a5ff29c11") + ) + (wire + (pts + (xy 373.38 238.76) (xy 375.92 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f5323ec0-ea0c-44b7-a5e6-35e7329c8349") + ) + (wire + (pts + (xy 77.47 54.61) (xy 85.09 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f5e2f301-bfd8-494e-8e9e-7194ff47ddb5") + ) + (wire + (pts + (xy 76.2 81.28) (xy 76.2 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f66cb755-d4d6-46c3-9150-2e07f57e414f") + ) + (polyline + (pts + (xy 372.11 152.4) (xy 389.89 153.67) + ) + (stroke + (width 0.5) + (type default) + (color 255 153 0 1) + ) + (uuid "f79c255a-318b-4c38-b728-d05999cb3145") + ) + (polyline + (pts + (xy 370.84 165.1) (xy 386.08 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f8fb5f45-ed67-427f-ba7f-dd5165efafd3") + ) + (wire + (pts + (xy 132.08 261.62) (xy 78.74 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f946f142-a469-4bf7-a7b0-cfa2564acb03") + ) + (wire + (pts + (xy 95.25 194.31) (xy 99.06 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f98b99dd-753b-4540-8d55-65702f2f2aa5") + ) + (wire + (pts + (xy 273.05 262.89) (xy 273.05 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fa0b9045-afcf-415e-8148-49432f7d08ef") + ) + (wire + (pts + (xy 162.56 209.55) (xy 162.56 212.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fb110207-1038-4ebd-a4a2-2f0440df0813") + ) + (wire + (pts + (xy 328.93 199.39) (xy 334.01 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fc82b915-25b2-4566-b655-c717b79dcc82") + ) + (wire + (pts + (xy 92.71 91.44) (xy 101.6 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd02dab1-c8ad-4be7-b54c-aad8af7dec48") + ) + (wire + (pts + (xy 313.69 226.06) (xy 303.53 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fe53bae5-dc3b-49d4-9e03-3bf122f66a12") + ) + (wire + (pts + (xy 355.6 41.91) (xy 351.79 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fe915bd7-1609-4e76-a274-ede22f2eb746") + ) + (wire + (pts + (xy 21.59 234.95) (xy 21.59 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fec168bc-d1ab-4e42-b130-ac79797331d9") + ) + (wire + (pts + (xy 222.25 215.9) (xy 222.25 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff0386a5-b80e-4d1e-b237-8e3c07c9b3d5") + ) + (wire + (pts + (xy 266.7 52.07) (xy 267.97 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff1fdabb-8719-47b1-b83a-023b2989782d") + ) + (wire + (pts + (xy 110.49 214.63) (xy 110.49 217.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff76632f-f99c-4e35-b254-722b23c44ba1") + ) + (polyline + (pts + (xy 372.11 158.75) (xy 389.89 157.48) + ) + (stroke + (width 0.5) + (type default) + (color 255 0 255 1) + ) + (uuid "ffcbbaed-a936-4759-a6d4-b636e2e9a470") + ) + (wire + (pts + (xy 66.04 228.6) (xy 66.04 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ffcbccf9-6ec2-4e7f-9fe9-e09cfcf104b5") + ) + (wire + (pts + (xy 161.29 199.39) (xy 162.56 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ffe560c0-0f1e-4ae4-b8de-09835243a6d8") + ) + (label "160M" + (at 133.35 163.83 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "01e63417-ae8e-4d5a-b99a-c3016a2ab9ef") + ) + (label "RRF12" + (at 158.75 57.15 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "09a8c6d0-78d9-411d-a16f-210a792e8338") + ) + (label "ANT4_SEL" + (at 151.13 238.76 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "0c01614c-2840-478b-a45d-d917c9e39bf2") + ) + (label "RRF15" + (at 83.82 91.44 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "0d44f788-756c-40fd-90bd-169f775f0b7e") + ) + (label "RF30" + (at 234.95 72.39 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "0deee7c1-ec39-40bf-86a0-7788458e0676") + ) + (label "RRF16" + (at 83.82 96.52 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "0eee66cf-1d6c-4c6c-842b-8d41dd13f6ec") + ) + (label "100W_PA_SEL" + (at 151.13 241.3 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "13f6c142-3760-4ee8-99c0-059a0d50864e") + ) + (label "RRF11" + (at 158.75 24.13 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "140bde83-dc94-48dc-b715-4ec9d973b455") + ) + (label "60M" + (at 133.35 168.91 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "16bc82c3-23d9-4017-8b44-68d7528eb85d") + ) + (label "RF27" + (at 336.55 34.29 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "1848cc93-a7c8-4379-92f1-fe1c349d8c71") + ) + (label "40M" + (at 133.35 171.45 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "23b65625-6bad-4cfd-b8e3-8647f3c4c337") + ) + (label "10M" + (at 133.35 207.01 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "28466946-2ab2-4b60-969a-1062aec74ade") + ) + (label "XVTR_SEL" + (at 62.23 236.22 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "2baeeb06-4255-44fb-8b0f-42b500b5fb48") + ) + (label "RF36" + (at 214.63 215.9 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "2be808e5-3d66-4612-aabb-0c29ca83d6be") + ) + (label "RX_BPF_SEL" + (at 234.95 40.64 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "2d92f050-9668-4249-897b-7703987ea863") + ) + (label "REF_V" + (at 176.53 276.86 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "2eb58fd5-14ff-4a4c-8254-ead4af07be21") + ) + (label "BIT3" + (at 40.64 198.12 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "3601ee5d-0a17-4d68-ba78-b41fbbb2c3a3") + ) + (label "FWD_V" + (at 309.88 162.56 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "3967ab74-ed87-4393-9284-12a0a143faa2") + ) + (label "TX" + (at 363.22 100.33 180) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "39a1e2a4-24e2-4af1-ab6e-bdbc38b2b3e9") + ) + (label "ANT2_SEL" + (at 151.13 233.68 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "3f763504-2c6e-4e33-95eb-f14908971770") + ) + (label "RF29" + (at 248.92 72.39 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "47108bdc-01cb-43c9-b892-5ee91089a9ad") + ) + (label "RRF5" + (at 107.95 43.18 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "48c97c63-05d4-44e5-abdc-d50cb937d45c") + ) + (label "RRF33" + (at 181.61 26.67 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "49a07373-5646-4b08-86eb-d679a976dc9c") + ) + (label "BIT2" + (at 40.64 193.04 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "4b2a8c93-7198-484c-9f09-f3ffd3f6c78f") + ) + (label "SDA" + (at 157.48 274.32 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "4e75d2e7-5737-4aee-971e-1aa9040a2913") + ) + (label "30M" + (at 133.35 173.99 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "4e76c0ef-fa20-47c3-bc61-ea3e9715c7aa") + ) + (label "8R ~{TX}" + (at 330.2 99.06 180) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "50ce051a-5a46-408c-951b-bd596d94e303") + ) + (label "RF19" + (at 129.54 118.11 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "550bfb63-f5ab-42ee-b828-8b3cfbbeec7e") + ) + (label "BIT1" + (at 40.64 187.96 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "59dc2d97-74e3-444c-9a19-4fdf04dbb7b4") + ) + (label "RRF10" + (at 106.68 62.23 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "59e117e9-e540-4231-bb6b-d636c6dd6907") + ) + (label "80M" + (at 133.35 166.37 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "5a965bba-f37b-4f02-84d5-33211cb6dc2d") + ) + (label "12M" + (at 133.35 204.47 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "5c3d750b-c2c3-4727-acab-68c83f3a2843") + ) + (label "ANT1_SEL" + (at 266.7 52.07 90) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "5e58185a-a78c-4eee-bf75-fcf5bdf29ca5") + ) + (label "LPF_TO_SWR" + (at 204.47 194.31 90) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "63f4b762-ded1-4dbc-b194-4d9c90e71941") + ) + (label "RRF8" + (at 115.57 24.13 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "66a66563-0bfe-440b-a2d9-e9519ce61ff3") + ) + (label "SCL" + (at 306.07 213.36 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "675d7848-0a1f-4f58-a6dd-bd1707021b36") + ) + (label "RF1" + (at 74.93 26.67 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "67f15c25-b974-4375-85cd-6b2a981e811b") + ) + (label "SWR_TO_PIN_DIODE_TR" + (at 267.97 91.44 270) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "685b0ed9-4c1e-40bb-bf3c-1e2f2bc29072") + ) + (label "RF37" + (at 232.41 215.9 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "6a35be99-2659-48b3-b363-851c1541b6b2") + ) + (label "REF" + (at 273.05 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "6b549eba-9a95-43b5-a2e1-3201b440145c") + ) + (label "RRF6" + (at 83.82 59.69 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "7b796db8-c0d7-4356-84a8-74ab7d46d008") + ) + (label "RRF32" + (at 149.86 57.15 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "7f14aad0-38ef-4a24-b1ad-6fd974f0dc78") + ) + (label "SCL" + (at 21.59 223.52 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "7f446a4d-6bc8-4a46-8858-25e0d29cabf9") + ) + (label "RF28" + (at 261.62 72.39 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "85c43f9c-0e2a-4539-aa4f-820de58188bc") + ) + (label "FWD" + (at 273.05 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "8661c0c5-eb5b-43ab-8858-172ce45e611c") + ) + (label "8T TX" + (at 330.2 101.6 180) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "86e4a156-0c92-4e28-8177-c8fb4c54e280") + ) + (label "6M" + (at 133.35 209.55 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "87d83286-3325-439b-9406-4dee1fb87c1d") + ) + (label "BIT1" + (at 176.53 269.24 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "8e0c8413-db9c-4aa8-a2f6-43c50854c4c4") + ) + (label "RF17" + (at 92.71 91.44 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "8e4134c1-ddc8-4114-a04b-62235ca04e5f") + ) + (label "BIT0" + (at 40.64 182.88 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "985b4a54-e5a2-4b57-b3bf-af06acb469d8") + ) + (label "RF21" + (at 161.29 120.65 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "9a9ef60a-2afc-44e8-910e-ea0aa2c2e6db") + ) + (label "SWR_TO_PIN_DIODE_TR" + (at 204.47 236.22 90) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "9c705c07-7fdf-434b-ad6b-04fb4e29e4ac") + ) + (label "RF35" + (at 213.36 172.72 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "9eef6529-e117-4e3b-bd2c-3e34d21fd127") + ) + (label "SCL" + (at 157.48 276.86 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a269e600-4817-47a1-8c82-1bce0cf34691") + ) + (label "XVTR_SEL" + (at 26.67 86.36 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a5d344f7-5219-4097-a44f-f9855624c6ec") + ) + (label "RRF3" + (at 105.41 24.13 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "a625bfae-4f95-4a03-9f4e-ee83bf7bf6b9") + ) + (label "SDA" + (at 306.07 215.9 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a7a303aa-cff1-4fa7-a20b-1450734ff891") + ) + (label "RRF31" + (at 224.79 72.39 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "a90b15ad-a64f-42ba-bbf4-e746eeeed8b5") + ) + (label "RRF14" + (at 62.23 93.98 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "aa715ef2-81b4-4466-a3ae-37e3d70f719b") + ) + (label "100W_PA_SEL" + (at 194.31 134.62 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "adcfcbdc-5423-4363-8050-374c16372337") + ) + (label "BIT3" + (at 176.53 271.78 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "ae2071fe-7d3a-438d-ad46-cba7498dbe53") + ) + (label "TX_BPF_SEL" + (at 62.23 243.84 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "af515c14-81be-48ba-ba51-473515981baa") + ) + (label "RF7" + (at 74.93 59.69 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "af6c04b1-76d4-4624-837d-95357d100d08") + ) + (label "ANT3_SEL" + (at 312.42 52.07 90) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "b441abbf-3ae6-4dfb-b461-9ad854adfc28") + ) + (label "TX" + (at 176.53 279.4 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "b9637f4c-58bd-4a2b-b181-45fabe97f815") + ) + (label "BIT0" + (at 157.48 269.24 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "baa2457e-78b9-495c-a44a-d9ce7090e714") + ) + (label "FWD_V" + (at 176.53 274.32 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "bad8e555-a21d-4c65-a342-d3fa843d4617") + ) + (label "RRF25" + (at 290.83 34.29 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "bbf3850c-c3ea-4d02-b7db-26803f40ca59") + ) + (label "RF24" + (at 267.97 34.29 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "bfa71d4b-21f8-4df7-be09-55a308743b6e") + ) + (label "RF34" + (at 193.04 26.67 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "c0e8ad23-84b2-42a3-abd3-e81e01503234") + ) + (label "RF23" + (at 289.56 63.5 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "c2e03d51-613e-482c-8a90-8c47ea42b53e") + ) + (label "RRF13" + (at 158.75 62.23 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "c4d763af-1e76-4b80-8257-19df83de125d") + ) + (label "BIT2" + (at 157.48 271.78 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "c4f8d923-618f-494d-a09c-807e0d71c06c") + ) + (label "17M" + (at 133.35 199.39 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "cc2203eb-3d4c-442d-bf94-fec8017b0531") + ) + (label "RF18" + (at 92.71 96.52 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "d606466d-e8ba-497e-857c-d572943e0895") + ) + (label "RF20" + (at 156.21 115.57 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "d8cca2b8-e532-4463-870c-6b893188a112") + ) + (label "20M" + (at 133.35 176.53 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "dbe78347-7889-4eee-8a64-6f98b71d721e") + ) + (label "SDA" + (at 21.59 220.98 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "deb8793e-cc32-48a0-b5bf-bac515234428") + ) + (label "REF_V" + (at 309.88 167.64 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "e55088fa-7a99-4f4b-9965-8326f9f371c5") + ) + (label "RX_BPF_SEL" + (at 62.23 246.38 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "e61576ff-a7ba-4b9c-8ca5-3c1c76c6cf40") + ) + (label "ANT2_SEL" + (at 289.56 52.07 90) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "e8a93fe1-0562-47ae-830b-df9872a2ccd4") + ) + (label "RF38" + (at 232.41 172.72 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "e904916d-9cb0-4c48-8b1c-711fde9776cb") + ) + (label "RRF4" + (at 105.41 29.21 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "eada9091-47ec-4d14-b622-706fbd72d10a") + ) + (label "RRF26" + (at 313.69 34.29 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "ecc7bd6e-11c8-468e-bce5-320d4104dad5") + ) + (label "LPF_TO_SWR" + (at 194.31 139.7 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "ecd1299f-0fcf-4f42-b012-0fc4d0f9af6e") + ) + (label "RF22" + (at 194.31 118.11 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "eded0808-18b1-45bd-8be4-02f6539ce271") + ) + (label "RRF9" + (at 120.65 62.23 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "ee7a0e6a-c7bb-4b29-9e6d-d93612295a7c") + ) + (label "TX_BPF_SEL" + (at 29.21 40.64 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "eed970a8-f90a-4e63-9930-668a90357b55") + ) + (label "TX" + (at 116.84 279.4 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "f24ac578-0196-42d5-b55f-7eafd6e57a41") + ) + (label "TX" + (at 276.86 100.33 180) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "f93b2f1b-bb36-4810-9d5a-47c7fd8f429c") + ) + (label "ANT1_SEL" + (at 151.13 231.14 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "f9d22183-db84-4873-8f36-5437b4ee8184") + ) + (label "15M" + (at 133.35 201.93 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "fb3242e1-331d-4b87-b5da-0f1c3aab57a2") + ) + (label "ANT4_SEL" + (at 335.28 52.07 90) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "fb4a15ca-ee39-4742-a046-e68e49471689") + ) + (label "ANT3_SEL" + (at 151.13 236.22 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "fbe9d07b-bee4-4176-ab01-5e83d1363129") + ) + (label "RRF2" + (at 83.82 26.67 0) + (effects + (font + (size 0.5 0.5) + ) + (justify left bottom) + ) + (uuid "fc33c44c-eaf1-43f8-97a3-3c1c745d707a") + ) + (label "NF" + (at 133.35 212.09 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "fc9463b8-346f-472a-9588-06430d5b8b38") + ) + (symbol + (lib_id "Device:C") + (at 154.94 220.98 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "009cf2e5-c83c-4913-85f8-27a71744bf8f") + (property "Reference" "C12" + (at 154.94 214.63 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 153.67 217.17 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 158.75 220.0148 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 154.94 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 154.94 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 154.94 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 154.94 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c37710eb-7761-4e7d-a486-74249b878735") + ) + (pin "1" + (uuid "bd8a13b4-a53e-4cc1-95fa-1256d7ae60c3") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 69.85 59.69 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "00b8229a-3a0c-4ca4-a163-b75616e86a54") + (property "Reference" "J4" + (at 71.12 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TO ATTN" + (at 67.31 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 69.85 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 69.85 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 69.85 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 69.85 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 69.85 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "16aeda33-13de-47b2-978b-0add96bd3abc") + ) + (pin "2" + (uuid "7eec7998-7026-4c92-930d-70f305c4e433") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 199.39 26.67 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "01309a3a-f5a4-4000-bf91-1bde11bb78cb") + (property "Reference" "J2" + (at 201.9301 25.7511 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TO_RECEIVER" + (at 201.9301 28.1753 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 199.39 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 199.39 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 199.39 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 199.39 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 199.39 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4fa1c93f-eb02-4044-98b0-022817f06152") + ) + (pin "2" + (uuid "0ffd5819-de3e-4dc1-b9c1-0a50a63aea01") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 250.19 82.55 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "02220b1f-db62-4cd7-8143-3c43a768d540") + (property "Reference" "L2" + (at 248.9227 81.3379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "3.3uH" + (at 248.9227 83.7621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 250.19 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 250.19 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 250.19 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "70-ILSB1206ER3R3K" + (at 250.19 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 250.19 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "47631783-eb03-4411-aa18-fac86f9837cb") + ) + (pin "2" + (uuid "6d66dab6-ae8a-4b37-b40e-771d20403821") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:IDC_2x5") + (at 153.67 168.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "03d51a09-b053-42dd-97be-b28b2da76283") + (property "Reference" "J25" + (at 154.94 158.4157 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LPF CTRL LOW" + (at 154.94 160.8399 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 153.67 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 153.67 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "A-2939" + (at 153.67 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "9" + (uuid "59bfd214-c408-4be9-8029-0098c45f2ad2") + ) + (pin "5" + (uuid "f7f480e9-9098-49fe-88cf-cbf90bed68aa") + ) + (pin "2" + (uuid "0945fc60-5379-4134-aa9a-b6f6839d7b95") + ) + (pin "4" + (uuid "b5c32a9e-9971-42a7-ad5c-89e9a0aced96") + ) + (pin "6" + (uuid "7d1442fa-53cd-45f7-8f68-d91c408710ca") + ) + (pin "10" + (uuid "a21e0d74-ea0e-4bc2-9115-541c4534f854") + ) + (pin "7" + (uuid "61d153af-e1fa-472d-a65d-5a005c8701f4") + ) + (pin "3" + (uuid "33c885ee-f99c-435b-80f2-fd0fcca915cb") + ) + (pin "1" + (uuid "1c5cd497-cf9a-40d7-bf08-7d2fbde062cb") + ) + (pin "8" + (uuid "ce37fbf4-703d-4a03-a514-c346785ade7f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J25") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 95.25 57.15 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "04020e32-e6cd-49f5-88e5-daf5f5c2c2af") + (property "Reference" "U7" + (at 95.25 67.6443 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 95.25 65.2201 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 95.25 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 95.25 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 95.25 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 95.25 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 95.25 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "006c2e63-a031-45b5-907f-a12c1ceb70df") + ) + (pin "6" + (uuid "b8264b27-0749-4dbf-8acf-7220a1bc5043") + ) + (pin "4" + (uuid "6daabbb1-290e-4c8f-b162-c129f35620d2") + ) + (pin "1" + (uuid "d116ad1f-c762-48d3-9908-ae8b974184a9") + ) + (pin "2" + (uuid "d57c6ef7-40d6-4a52-9418-23b76de554be") + ) + (pin "3" + (uuid "f141cada-ac2b-4a23-bd44-6d94711e39a7") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Audio:AudioJack3_SwitchTR") + (at 361.95 125.73 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "04582302-d9b5-4de1-979d-20ae5b2bc4ad") + (property "Reference" "J19" + (at 363.855 133.6843 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "KEY OUT" + (at 363.855 131.2601 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:Jack_3.5mm_STX-3081_Horizontal" + (at 361.95 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 361.95 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 361.95 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "490-SJ1-3515N" + (at 361.95 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 361.95 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "RN" + (uuid "828d9958-195b-40be-9aa9-faf70d4e1fa3") + ) + (pin "T" + (uuid "d4225aef-ccc6-4503-8cc6-c0aad463cb9d") + ) + (pin "S" + (uuid "313d3dea-f9b2-441f-b61f-0099b50d9d57") + ) + (pin "R" + (uuid "1592e4b3-e83c-4026-a330-1b0a59c5c42f") + ) + (pin "TN" + (uuid "1d54d0b9-7887-42e3-bc4c-7726fd9516c2") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 147.32 262.89 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0470ee10-92d3-4ab5-b316-3b94ee9ac861") + (property "Reference" "#PWR028" + (at 147.32 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 147.32 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 147.32 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 147.32 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "3b690245-7429-4dee-9825-9879af663fb8") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR028") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 194.31 104.14 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "05dda897-4699-47a1-b9d7-c42f9c9421c8") + (property "Reference" "J10" + (at 195.58 97.79 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FROM 100W PA" + (at 201.93 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 194.31 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 194.31 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 194.31 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 194.31 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 194.31 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "bb5c56b0-1306-4e2c-b6e5-63ce69ab1f0a") + ) + (pin "2" + (uuid "7a14e898-6acf-4a79-95a6-2b6160dab701") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:ULN2803C") + (at 138.43 236.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "05ff3b25-059b-40f7-9603-5efbd3d08849") + (property "Reference" "U4" + (at 138.43 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ULN2803C" + (at 138.43 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-20W_7.5x12.8mm_P1.27mm" + (at 139.7 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/uln2803c.pdf" + (at 142.24 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 138.43 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "7" + (uuid "a8601013-7592-4f83-9de9-9ed7a3bb4837") + ) + (pin "17" + (uuid "0fd1a5d0-c239-4a21-a84d-5498144d78c9") + ) + (pin "8" + (uuid "3130bbe1-c0a9-4e6e-b5ee-a8f16d1437f9") + ) + (pin "15" + (uuid "2417709a-6a54-4feb-81b5-1cb93439b291") + ) + (pin "14" + (uuid "085bf898-846e-4636-a7d6-b4d09b44d752") + ) + (pin "2" + (uuid "b03b59dc-318d-4e3c-a159-76bd3992c135") + ) + (pin "13" + (uuid "7eba586b-4f94-4fb9-8a52-4ee9efd99f20") + ) + (pin "16" + (uuid "7f07c800-4088-457a-8d5c-baa76e0225b7") + ) + (pin "1" + (uuid "f44e233d-793e-43a6-9b21-7260cc52e3e3") + ) + (pin "9" + (uuid "f1250ddc-ad93-4ee7-991e-1a75f02e8e26") + ) + (pin "12" + (uuid "1f622863-4699-4c56-9ce5-a3650c763bd3") + ) + (pin "11" + (uuid "ff92fb61-cd3f-4539-aaf2-6bc37de29be3") + ) + (pin "10" + (uuid "ee2e441d-6c20-45b1-983b-c397f25722e0") + ) + (pin "5" + (uuid "1d47f2f9-72db-42ed-abe1-34e2e7d560f7") + ) + (pin "3" + (uuid "7a8dc2ae-608a-4c43-82b8-af2f0f38fa58") + ) + (pin "4" + (uuid "f9d1da98-9177-4de7-b47e-f804d8876cf0") + ) + (pin "18" + (uuid "e8c9fdcb-25c8-46a3-8d9e-f70fdc08c50d") + ) + (pin "19" + (uuid "16d28390-8940-426d-87af-83532376d3da") + ) + (pin "6" + (uuid "cb94d3bb-ef32-4973-a298-83774d011ad1") + ) + (pin "20" + (uuid "45f5023b-ee5c-48e1-ad7f-c27815b94a77") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:AD8307") + (at 255.27 181.61 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0913b0b9-534d-4ebf-9174-37399c24c55c") + (property "Reference" "U14" + (at 263.017 181.0329 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "AD8307" + (at 263.017 183.4571 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 258.445 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 259.08 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 255.27 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "584-AD8307ARZ-R7" + (at 255.27 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 255.27 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "ac9fe195-fcbb-487f-9bd9-02992b2600e4") + ) + (pin "2" + (uuid "aacc1e4d-6a2f-4885-b1bc-480752f260cf") + ) + (pin "7" + (uuid "ed8752be-53e8-4899-bc99-4973857669db") + ) + (pin "8" + (uuid "3fe98e2f-13b4-4109-8916-76e926980139") + ) + (pin "6" + (uuid "e1fac4cd-f5fe-43f1-b923-e07675e6af95") + ) + (pin "5" + (uuid "f5ac3b30-ec31-4260-b1e5-d9952f660fde") + ) + (pin "4" + (uuid "d78023a3-b930-4c8a-be8e-fda7ae5b4fc2") + ) + (pin "1" + (uuid "4a3ac5a1-5485-47d4-8630-1ee6b646c0d9") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 217.17 40.64 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0917cbda-c893-4f04-94f0-0db6d2147067") + (property "Reference" "U6" + (at 214.63 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 214.63 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 217.17 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 217.17 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 217.17 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 217.17 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 217.17 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "582de3d4-72a6-40d7-b7db-9c00411dc88b") + ) + (pin "4" + (uuid "d9919cae-8b1d-470a-8dd6-d2e38203e63b") + ) + (pin "3" + (uuid "034634c1-4454-426c-abe8-f7cc5d5bea83") + ) + (pin "5" + (uuid "b7c2bb94-71d9-4f14-a557-ea57625c1f9a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:LM7805_TO220") + (at 364.49 199.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0b34f678-0701-46e7-963d-e744618882ac") + (property "Reference" "U11" + (at 364.49 193.3407 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM7805CT" + (at 364.49 195.7649 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 364.49 193.675 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" + (at 364.49 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 364.49 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "926-LM7805CT" + (at 364.49 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 364.49 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "101a8c63-52e6-402c-8a91-90fb746d5948") + ) + (pin "2" + (uuid "b3f5c98f-f65b-4680-b9f6-73df73b61c59") + ) + (pin "1" + (uuid "b627376c-162e-4cef-8b0e-05984d924c55") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:IDC_2x5") + (at 153.67 204.47 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0ba969a8-e177-4c4f-9dd4-218d7bff5b2a") + (property "Reference" "J24" + (at 154.94 193.9757 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LPF CTRL HI" + (at 154.94 196.3999 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 153.67 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 153.67 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "A-2939" + (at 153.67 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "9" + (uuid "77714322-13c9-4d7f-8470-bd02a293870b") + ) + (pin "5" + (uuid "7b04471e-401a-4226-96c1-8982a829491c") + ) + (pin "2" + (uuid "1d9c4c27-3629-46cc-961e-95a33c4fccbe") + ) + (pin "4" + (uuid "c0d32274-3c43-4c93-94c6-71c96bff374d") + ) + (pin "6" + (uuid "f47dba6c-ee25-4256-b438-30a3bd2a6218") + ) + (pin "10" + (uuid "59ee627e-7293-4b9c-a6f2-4e9a015b8826") + ) + (pin "7" + (uuid "96a67314-9d3c-4dd7-becc-37461234fe10") + ) + (pin "3" + (uuid "8bb361ab-3871-4e11-9472-4d0dd5832a9e") + ) + (pin "1" + (uuid "e3534dd8-77b5-418d-8f92-9e37b0eedb08") + ) + (pin "8" + (uuid "552eba44-cfe0-481b-8d54-d7c8670cec6f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 175.26 218.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0cdfd970-a77c-43c4-a748-eb3cbba557cb") + (property "Reference" "#PWR0191" + (at 175.26 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 177.8 219.71 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 175.26 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 175.26 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 175.26 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "503249d6-fc87-46a3-a6f9-d647645953fc") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0191") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 171.45 144.78 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0ded12a4-a684-4de0-9787-0a859abfccb2") + (property "Reference" "#PWR0210" + (at 171.45 151.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 173.99 146.05 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 171.45 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 171.45 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 171.45 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "4734ea2e-0b8d-4b15-9e58-9a77cfe6f2fc") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0210") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 97.79 226.06 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0e0fc69b-b613-481f-b4b2-784057ad3b5a") + (property "Reference" "#PWR0184" + (at 97.79 229.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 97.79 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 97.79 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 97.79 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 97.79 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "665cbd6d-2970-4576-be34-2bd12813bd85") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0184") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 375.92 242.57 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0ebf704e-6619-4e82-b941-00e97a2e124e") + (property "Reference" "C136" + (at 378.841 241.3579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "1uF 50V" + (at 378.841 243.7821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 376.8852 246.38 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 375.92 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 375.92 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "187-CL31B105KBHNNNE" + (at 375.92 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 375.92 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a7812565-85b0-4a6f-a013-9b569e53d498") + ) + (pin "1" + (uuid "4d746b20-6030-4f1e-a6ac-aa2b9a43862b") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C136") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 237.49 184.15 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "10c4bd78-cf5d-427f-8ec4-380fe17476db") + (property "Reference" "#PWR015" + (at 237.49 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 240.03 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 237.49 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 237.49 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 237.49 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "833edb77-3bcb-4601-b2a1-fde4aab73cf4") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR015") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 229.87 237.49 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "11728d7c-918b-49ed-9ebb-94ae4da426cf") + (property "Reference" "L43" + (at 231.1373 236.2779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "22nH" + (at 231.1373 238.7021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 229.87 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 229.87 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 229.87 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 229.87 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 229.87 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8e7d1834-c1c7-4c5b-b2df-d2d0067c06b1") + ) + (pin "2" + (uuid "9aa43eec-24c9-438b-aac4-c7a55b848097") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L43") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 189.23 26.67 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "11ba8e50-02a2-433f-8611-7a93615745e3") + (property "Reference" "C8" + (at 189.23 33.02 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 187.96 30.48 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 193.04 27.6352 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 189.23 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 189.23 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 189.23 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 189.23 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "bc9f7b24-1fb4-44ef-a206-f8f08e83ebb8") + ) + (pin "1" + (uuid "259aab3a-d1a3-4b29-813a-82bffb19bbbe") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 132.08 29.21 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1216a767-f0a1-46c9-96bd-31c2287b523b") + (property "Reference" "#PWR0167" + (at 132.08 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 134.62 30.48 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 132.08 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 132.08 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "a6cf7f93-719c-4055-a6f6-d8e2df86eb1b") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0167") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 123.19 118.11 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "12eb632b-d7fa-47f3-b8c3-f60d7136338f") + (property "Reference" "J8" + (at 130.81 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FROM 20W PA" + (at 137.16 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 123.19 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 123.19 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 123.19 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 123.19 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5d67871e-f574-450e-8bdf-a7cfb611064d") + ) + (pin "2" + (uuid "2e45f489-d965-4893-8759-2c2eb22c1ead") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 273.05 22.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "136f307e-9762-46e0-bf71-234e33dc9baa") + (property "Reference" "#PWR0179" + (at 273.05 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 275.59 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 273.05 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 273.05 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 273.05 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "84d1f542-08c2-4053-9945-330b74022a08") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0179") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:IRF630") + (at 335.28 124.46 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "14cd8dcf-1ccf-432e-8539-bae981cbf8f8") + (property "Reference" "Q1" + (at 340.487 123.2479 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "IRF630" + (at 339.09 127 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 340.36 126.365 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.st.com/resource/en/datasheet/cd00000701.pdf" + (at 340.36 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "" + (at 335.28 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "942-IRF630NPBF" + (at 335.28 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 335.28 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "4f2609a4-6e4a-4b79-8aaa-dacf66dea6e6") + ) + (pin "1" + (uuid "6920876c-0954-447e-ad4d-e1e7bf31c2c8") + ) + (pin "2" + (uuid "8d87fc72-3ba6-4975-8d7b-7f79146cad99") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "Q1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 82.55 218.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "14dbd2f2-d28b-43f8-8bfa-98e3f46c2d56") + (property "Reference" "#PWR037" + (at 82.55 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 85.09 219.71 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 82.55 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 82.55 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 82.55 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "788505e3-ecbe-4f08-80ea-c08511f5d88b") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR037") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 118.11 274.32 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "169518ea-f7e4-41a1-9326-cc0808d158e7") + (property "Reference" "#PWR0209" + (at 118.11 280.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 121.92 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 118.11 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 118.11 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 118.11 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "ddedff9c-65a4-419a-bf77-03bdebad22e9") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0209") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 88.9 91.44 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "17875128-51f8-4302-86cc-0f5d4e8de5c7") + (property "Reference" "C140" + (at 87.63 85.09 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 87.63 87.63 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 92.71 90.4748 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 88.9 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 88.9 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 88.9 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 88.9 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3bea99ff-abc7-4e53-9a8c-260e1b979814") + ) + (pin "1" + (uuid "7dca3ba1-79f9-40b9-857e-eb09513a16ef") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C140") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 302.26 110.49 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1919ff03-529a-4087-901f-6d114a1180e6") + (property "Reference" "C22" + (at 299.72 106.68 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 299.72 116.84 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 301.2948 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 302.26 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 302.26 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 302.26 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 302.26 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6332aa65-fa5c-493d-b562-951d02605c53") + ) + (pin "1" + (uuid "f5f37bd2-701d-4ec2-a607-90cc9d181fd3") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 226.06 220.98 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "193e0b6d-a8e3-4026-aa78-d716857e441d") + (property "Reference" "R22" + (at 226.06 223.52 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "~" + (at 226.06 223.7161 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 226.06 219.202 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 226.06 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "71-RCS1206499RFKEA" + (at 226.06 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 226.06 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d75ad621-443f-4f63-a1ac-8c3941e05846") + ) + (pin "1" + (uuid "e9d95ad6-a38c-4e56-a668-4dca846e83e2") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 229.87 194.31 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "19c1986d-1878-4610-ba1b-900eef89bc4f") + (property "Reference" "L38" + (at 231.1372 193.0979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "22nH" + (at 231.1372 195.5221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 229.87 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 229.87 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 229.87 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 229.87 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 229.87 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7c3209ea-acc7-4e36-9d27-5b646692fbc2") + ) + (pin "2" + (uuid "4c17124c-29a1-4492-999a-6f25a667cc24") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L38") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 154.94 57.15 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1d5d14e4-1791-4ae3-b835-3a65c6d77fdc") + (property "Reference" "C13" + (at 153.67 50.8 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 153.67 53.34 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 158.75 56.1848 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 154.94 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 154.94 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 154.94 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 154.94 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9bbbe6ad-3867-48bf-b30f-1860682cdeee") + ) + (pin "1" + (uuid "518d6f73-757d-4d45-a8c8-186b7947ec1c") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 63.5 170.18 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2083c8e9-2aac-41f8-ac9d-af7c1f54b7e4") + (property "Reference" "C130" + (at 57.2658 168.91 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 59.69 168.91 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 62.5348 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 63.5 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 63.5 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 63.5 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 63.5 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "be803890-f99c-410a-a527-624e089818ea") + ) + (pin "1" + (uuid "fdf14b6b-54af-470c-923c-28a8f74cd393") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C130") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 19.05 259.08 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "20db30e2-41c7-4218-b471-a61590f1c409") + (property "Reference" "R2" + (at 20.32 259.08 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 16.51 259.08 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 19.05 260.858 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 19.05 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 19.05 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" " 71-CRCW12062K20JNEAC" + (at 19.05 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 19.05 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a5a31ce4-033b-4ad6-a5d7-06b033f5a261") + ) + (pin "1" + (uuid "f55bcc54-be82-44ad-8652-d4a5cc7fa40e") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 138.43 256.54 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "21db77e6-0bd2-4a3a-9d8f-52337298a53a") + (property "Reference" "#PWR0190" + (at 138.43 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 140.97 257.81 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 138.43 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 138.43 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 138.43 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "9244ba05-af20-427b-bf2c-5b8896d0ddff") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0190") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 57.15 187.96 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "223641a1-e38e-407e-82ce-8b72135e7925") + (property "Reference" "R9" + (at 53.34 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 57.15 185.2239 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 57.15 189.738 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 57.15 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 57.15 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "667-ERJ-8GEY0R00V" + (at 57.15 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 57.15 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "218ef838-856d-4694-87bd-0637b14a900b") + ) + (pin "1" + (uuid "c7433dd5-22cc-444b-9b2f-de6e8d20cf0f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 223.52 262.89 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "22a9ad09-09b9-45bc-ac46-ed32c785a9be") + (property "Reference" "R28" + (at 228.6803 262.89 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "52R3" + (at 226.2561 262.89 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 221.742 262.89 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 223.52 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 223.52 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "71-CRCW120649R9FKEAC" + (at 223.52 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 223.52 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3f0110a7-2113-4ef2-b2e4-9ac9e7ab0347") + ) + (pin "1" + (uuid "f8c94fea-02cf-4649-859d-5f3de2a7f560") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R28") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 300.99 162.56 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "236c0cdb-dd1c-48b6-aaeb-3b686d26107b") + (property "Reference" "R30" + (at 304.8 160.02 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 300.99 159.8239 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 300.99 164.338 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 300.99 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 300.99 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "667-ERJ-8GEY0R00V" + (at 300.99 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 300.99 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b64923d3-9930-4b4a-a322-1bf28f8b0e00") + ) + (pin "1" + (uuid "70eaee0c-1a4c-48c3-a404-77163aac139a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R30") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 48.26 86.36 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2372493b-d174-4f6c-bf93-df1feab39bce") + (property "Reference" "U22" + (at 50.8 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 50.8 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 48.26 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 48.26 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 48.26 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 48.26 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 48.26 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cdf822b0-0baf-46aa-ada1-72603f7f1a28") + ) + (pin "4" + (uuid "0f8672dc-e6a9-4e5d-bb3c-7fb72c4e794c") + ) + (pin "3" + (uuid "14c3cdee-710a-46ab-b0d8-a53ee8329f5c") + ) + (pin "5" + (uuid "59ab9be2-ae45-44e3-9921-8e39e5fc6239") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 17.78 261.62 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "23edfb98-87b3-4a82-b95e-96619de4141e") + (property "Reference" "R3" + (at 19.05 261.62 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 17.78 264.16 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 17.78 263.398 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 17.78 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 17.78 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" " 71-CRCW12062K20JNEAC" + (at 17.78 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 17.78 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "db5aa2be-c523-46d4-a814-fc4c4ed42d2e") + ) + (pin "1" + (uuid "655f5563-4d6c-4437-ba9b-07cdc7862131") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 222.25 50.8 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "24f5e79e-dc30-4b73-a725-6a9d4b6528f0") + (property "Reference" "#PWR0178" + (at 222.25 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 219.71 52.07 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 222.25 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 222.25 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "e098d928-0a15-49dc-b55c-6aeb20294bc8") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0178") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 241.3 172.72 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "25d6b660-5812-46b3-9467-27bb16d8efa4") + (property "Reference" "C144" + (at 242.57 166.4858 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10nF 50V" + (at 242.57 168.91 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 237.49 171.7548 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 241.3 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 241.3 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "80-C1206C103K5R7210" + (at 241.3 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 241.3 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9892f4af-a3d3-4380-b59d-78f9062c593b") + ) + (pin "1" + (uuid "e7675ffc-13b9-498d-8a20-241fe09db67d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C144") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 132.08 154.94 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "26b01383-c8ff-4bb5-b756-353590fe0713") + (property "Reference" "#PWR039" + (at 132.08 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 128.27 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 132.08 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 132.08 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "ff2a7bf4-68bb-4855-96c0-b95707401a62") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR039") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 57.15 182.88 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "26dc92bc-eb5b-4896-a2ad-ff00e7a6bcbc") + (property "Reference" "R8" + (at 53.34 180.34 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 57.15 180.1439 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 57.15 184.658 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 57.15 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 57.15 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "667-ERJ-8GEY0R00V" + (at 57.15 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 57.15 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "115c1103-3cee-4c7a-9e80-7ffe3f02db3c") + ) + (pin "1" + (uuid "0b415361-032e-46b7-8b5b-a1ff6cf374fd") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 231.14 72.39 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "28434148-834b-4318-8c7c-8c9dbb10db51") + (property "Reference" "C14" + (at 229.87 78.74 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1800pF 50V" + (at 229.87 76.2 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 234.95 73.3552 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 231.14 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 231.14 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "77-VJ1206A182JXACBC" + (at 231.14 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 231.14 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6086f346-d935-4050-8b7a-951f2ae688d3") + ) + (pin "1" + (uuid "bddc2dde-7cae-47bd-902b-eb9aa2b8d4fb") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xx:74HC237") + (at 97.79 241.3 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2ad961af-a649-4841-b53c-04a73f7a9da2") + (property "Reference" "U2" + (at 99.9841 224.4557 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "74HC237" + (at 99.9841 226.8799 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-16_3.9x9.9mm_P1.27mm" + (at 97.79 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/cd74hc237.pdf" + (at 97.79 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 97.79 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "595-CD74HC237NSR" + (at 97.79 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 97.79 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "10" + (uuid "d88951b6-f36d-426a-a505-a069b77ca0f7") + ) + (pin "11" + (uuid "dc968e37-718a-4784-bef7-56328ffc635d") + ) + (pin "12" + (uuid "72db3fcb-f9e3-4e30-99dd-3602464b5278") + ) + (pin "13" + (uuid "2c1abc5c-2d5a-4fbb-a0b4-ce4d9a5d4514") + ) + (pin "14" + (uuid "edd59dd4-a123-4073-81ec-933237157418") + ) + (pin "3" + (uuid "430d2fbd-cd4d-4fc5-baf9-b3bd25dbba20") + ) + (pin "5" + (uuid "6a3f0b9b-ee01-4599-a688-4eed7061ad6d") + ) + (pin "6" + (uuid "38724814-fe1a-466e-80ab-a9b9419a5411") + ) + (pin "2" + (uuid "9dfdc54e-c16c-4ce9-95d2-a97304f84b47") + ) + (pin "1" + (uuid "c0da1630-cb15-42b9-b7b8-8c93093c13e2") + ) + (pin "8" + (uuid "6809cfdc-4e8a-4e98-ac86-220633bb6f13") + ) + (pin "9" + (uuid "19b9c396-3982-4679-a116-cb226aa1bfe2") + ) + (pin "16" + (uuid "d3ab214b-3c9a-4828-85bc-ff2098e7d868") + ) + (pin "4" + (uuid "f5ed603c-6d48-4f9e-9935-6ba96cb3eae5") + ) + (pin "15" + (uuid "584e0fa9-91f1-4052-b019-3615622da42c") + ) + (pin "7" + (uuid "7e3c6857-f82a-43a6-ace1-c3bd64e40851") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 222.25 30.48 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2c90a46d-3d02-4da1-b2e7-3a99e9433a98") + (property "Reference" "#PWR0177" + (at 222.25 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 222.25 26.3469 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 222.25 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 222.25 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "51459822-6012-4232-a08c-60674db39dd5") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0177") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 295.91 110.49 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2ca006e2-974f-44d9-b4d7-d7149dcf549c") + (property "Reference" "C23" + (at 293.37 106.68 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 293.37 116.84 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 294.9448 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 295.91 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 295.91 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 295.91 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 295.91 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c430813c-8c84-4c2a-b9e8-c3e05b111f67") + ) + (pin "1" + (uuid "42c94420-427f-4128-b37b-aca6d022e267") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C23") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 344.17 87.63 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2db88b8a-ce42-4b36-a24c-d94d849d2743") + (property "Reference" "L37" + (at 345.4373 86.4179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FB" + (at 345.4373 88.8421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 344.17 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 344.17 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 344.17 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" " 81-LQM31PN1R5M00L" + (at 344.17 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 344.17 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3d9be698-7285-4546-beae-8240f4591efb") + ) + (pin "2" + (uuid "334afe65-50df-4088-ae2a-778e811caadb") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L37") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 393.7 199.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2e96aa61-2b76-4c7e-9b37-d2f2cded7cf1") + (property "Reference" "#PWR07" + (at 393.7 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 393.7 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 393.7 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 393.7 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 393.7 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "f637daf2-8db2-45ab-8627-1f60db1c2ce6") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR07") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 21.59 233.68 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2f18d44c-c2bb-474a-a488-8ecc18f69e7d") + (property "Reference" "#PWR0161" + (at 21.59 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 25.4 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 21.59 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 21.59 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 21.59 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "b6193082-d62d-4583-8dc2-c03e303ceba8") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0161") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 127 29.21 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "317d7046-9fdb-4a4a-b5cb-73b1b6fe85b8") + (property "Reference" "J15" + (at 124.46 34.29 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TO BPF" + (at 125.73 31.75 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 127 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 127 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 127 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 127 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 127 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "64e628a7-6a5b-4184-b094-d04052c2cfe7") + ) + (pin "2" + (uuid "82566dd3-a7ec-4853-a439-ad07a8ecf2bb") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 52.07 50.8 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "31aab50d-7701-4c3b-9493-1de0a153db85") + (property "Reference" "#PWR0176" + (at 52.07 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 54.61 52.07 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 52.07 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 52.07 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 52.07 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "86e0520b-7bd2-4d8f-9376-ca259f213829") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0176") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 323.85 134.62 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "32731081-4ef8-4495-a3e3-569bf410e47a") + (property "Reference" "#PWR0208" + (at 323.85 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 321.31 137.16 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 323.85 134.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 323.85 134.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 323.85 134.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "c6595626-a308-4bc7-a516-bd04bbdefd9c") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0208") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:REF3440IDBVR") + (at 303.53 234.95 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "32c219c1-e946-474d-9002-8f5993a5e8b3") + (property "Reference" "U17" + (at 313.69 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "REF3440IDBVR" + (at 321.31 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" + (at 309.245 256.54 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/ref3440.pdf" + (at 292.735 259.715 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 303.53 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "595-REF3440IDBVR" + (at 303.53 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 303.53 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "526ff440-0601-44f5-b55f-77b63360be06") + ) + (pin "6" + (uuid "288853b8-b675-46f8-a4c6-6b2d6d79ea0f") + ) + (pin "3" + (uuid "70082855-bd5c-42de-982b-c09ea28db4f8") + ) + (pin "4" + (uuid "8f453b01-eb6b-4cc0-a4e7-5eae05e00847") + ) + (pin "2" + (uuid "8e7f1759-dcfd-4400-bd28-49cb394702ba") + ) + (pin "1" + (uuid "088ab673-2220-4b2a-abd9-0c416304ca22") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Polarized") + (at 375.92 203.2 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "33c47b88-c8a2-4ca4-99f2-684871a74442") + (property "Reference" "C131" + (at 378.841 201.0989 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "220uF 16V" + (at 378.841 203.5231 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_THT:CP_Radial_D10.0mm_P5.00mm" + (at 376.8852 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 375.92 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 375.92 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "667-ECA-1EM221" + (at 375.92 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 375.92 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "33b9ca16-23a4-41b9-a97e-0ac6914fa9ac") + ) + (pin "1" + (uuid "b212a1bd-3cbe-4c6f-a2cc-c74f35a6dec5") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C131") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12P") + (at 328.93 199.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "340a6c6e-aeb4-4c9a-8337-5b9f811f50e7") + (property "Reference" "#PWR01" + (at 328.93 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12P" + (at 328.93 195.2569 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 328.93 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 328.93 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 328.93 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "3c751346-e322-40e9-9744-30c3f19cfa24") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR01") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 43.18 212.09 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "34f201a6-e559-4910-9507-3a580befb5df") + (property "Reference" "#PWR0160" + (at 43.18 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 46.99 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 43.18 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 43.18 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 43.18 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "6d37c2b6-4c29-40c6-bf13-1f26b8291f13") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0160") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Screw_Terminal_01x02") + (at 334.01 207.01 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3568515c-1102-4b5f-96c5-13ea4c49eb81") + (property "Reference" "J20" + (at 336.042 207.0679 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "12-13.8V" + (at 336.042 209.4921 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "TerminalBlock:TerminalBlock_bornier-2_P5.08mm" + (at 334.01 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 334.01 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 334.01 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 334.01 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "A-662" + (at 334.01 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "449350db-85a0-4692-b92c-b12070bbdf5c") + ) + (pin "2" + (uuid "12dae0e0-b5ac-4798-91fe-0371eb4bbf8c") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 256.54 72.39 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "37f71e59-a8bb-4771-a598-ac410c412df6") + (property "Reference" "C16" + (at 255.27 78.74 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1800pF 50V" + (at 255.27 76.2 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 260.35 73.3552 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 256.54 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 256.54 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "77-VJ1206A182JXACBC" + (at 256.54 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 256.54 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "df54d15f-13b1-441b-97ab-1c6c1cab8c49") + ) + (pin "1" + (uuid "b052cdd1-b787-4cd7-869e-c44ebfe875c9") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 139.7 157.48 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "38e475c5-da96-4e4c-b762-0fd0bf27ba1d") + (property "Reference" "#PWR040" + (at 139.7 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 142.24 158.75 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 139.7 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 139.7 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "414fbeac-460a-41be-9793-a1d7c98819fe") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR040") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x05_Socket") + (at 295.91 86.36 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "39380066-825d-450e-8300-5e2b79d46375") + (property "Reference" "J16.1" + (at 292.735 84.8543 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ANTENNA" + (at 290.83 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x05_P2.54mm_Vertical" + (at 295.91 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 295.91 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 295.91 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 295.91 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "A-196" + (at 295.91 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "4" + (uuid "f49239e0-7fe7-4211-b719-0de33efc55b2") + ) + (pin "3" + (uuid "396c234c-ac0b-4935-92c2-4e7d5b875c38") + ) + (pin "1" + (uuid "1832c7a8-7801-45d3-bd37-f9b44a836ad5") + ) + (pin "2" + (uuid "798f9dca-88f4-47cc-87aa-b829b246d44a") + ) + (pin "5" + (uuid "3627a685-5ee7-4261-a819-930c5c7dd4f8") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J16.1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 259.08 168.91 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3964c3c0-65b9-4ada-b2f3-0bfe5430b464") + (property "Reference" "C137" + (at 262.89 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 262.89 165.1 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 262.89 167.9448 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 259.08 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 259.08 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 259.08 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 259.08 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9a6d39ce-fd74-41e8-956a-f80bfcb57447") + ) + (pin "1" + (uuid "5839766e-5524-42fe-a1e6-dd2b7022ab8e") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C137") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 63.5 173.99 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "399c29d3-e7b9-4f43-9709-498715dac2cb") + (property "Reference" "#PWR036" + (at 63.5 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 66.04 175.26 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 63.5 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 63.5 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 63.5 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "8d531c90-4019-4c72-a670-2bec1bd0d83e") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR036") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 57.15 198.12 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3c4be7de-eca8-40d5-a2b4-01336fde2f4e") + (property "Reference" "R11" + (at 53.34 195.58 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 57.15 195.3839 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 57.15 199.898 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 57.15 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 57.15 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "667-ERJ-8GEY0R00V" + (at 57.15 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 57.15 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1e22ccfe-ff25-404f-bf68-7570bb37ced1") + ) + (pin "1" + (uuid "297ef593-7a4f-4edb-aca0-25be2d5545fc") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 152.4 106.68 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3c8670a5-d568-4d81-9d28-f10e744479e9") + (property "Reference" "#PWR0198" + (at 152.4 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 154.94 107.95 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 152.4 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 152.4 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 152.4 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "9f871952-1b3a-4366-9aa6-490cb5b733a7") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0198") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 167.64 227.33 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3d678dd4-22ac-4ab2-8e8e-eba6ec3f8a07") + (property "Reference" "C2" + (at 163.83 227.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 165.1 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 166.6748 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 167.64 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 167.64 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 167.64 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 167.64 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2959fb40-3f5e-48d5-9164-50fc8230b60d") + ) + (pin "1" + (uuid "f8a7090d-ebfd-4b3c-b40d-b850ac5d6454") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 222.25 194.31 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3db41311-1785-4602-8cca-176c20037401") + (property "Reference" "L40" + (at 223.5172 193.0979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "22nH" + (at 223.5172 195.5221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 222.25 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 222.25 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 222.25 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 222.25 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c313a8d1-7c13-48ad-8d4c-83052e4535e0") + ) + (pin "2" + (uuid "70ff6047-4908-438a-a157-58b71ad49b66") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L40") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 80.01 26.67 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3e92e4bb-ecf2-4437-a847-2fb0299fad4b") + (property "Reference" "C1" + (at 78.74 20.32 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 78.74 22.86 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 76.2 25.7048 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 80.01 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 80.01 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 80.01 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 80.01 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3ecd3798-3b26-472b-bc16-2cf0c278cd49") + ) + (pin "1" + (uuid "c9353b09-9ec4-4cbc-ba20-487547e65c58") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Relay:Relay_SPDT") + (at 321.31 46.99 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3edaa41e-4ceb-483f-9b9c-e9eb5bbfcd2e") + (property "Reference" "K6" + (at 327.66 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "HF41F/12-ZS" + (at 330.2 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" + (at 322.58 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 321.31 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 321.31 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 321.31 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 321.31 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "A1" + (uuid "c58f7bc1-6091-410d-9ce6-b1cb2b8956c4") + ) + (pin "12" + (uuid "3d535e6c-c655-4da4-b194-f8c21d58ef6a") + ) + (pin "14" + (uuid "7ed55918-f9fa-4304-9fe4-0c763f9bbf98") + ) + (pin "A2" + (uuid "025142c0-67ff-4a69-a203-332b9a77df82") + ) + (pin "11" + (uuid "cd161ff1-c559-43f2-a6c6-2102be3eda22") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 80.01 59.69 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3f2f7e9b-eb1e-4005-abd8-b3bf3eb30115") + (property "Reference" "C20" + (at 78.74 66.04 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 78.74 63.5 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 83.82 60.6552 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 80.01 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 80.01 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 80.01 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 80.01 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8b8b53cf-7d31-4355-8b12-fa85d5128571") + ) + (pin "1" + (uuid "6c519498-3dd2-40e3-af90-fdc5f0b4ab35") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 262.89 212.09 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3fda2902-8337-435f-9bf9-c48eda402183") + (property "Reference" "#PWR020" + (at 262.89 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 265.43 213.36 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 262.89 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 262.89 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 262.89 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "93745f5a-4d0f-421c-b721-97e84b9e7106") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR020") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 158.75 220.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "40823642-4680-4213-b39d-07ee02700171") + (property "Reference" "#PWR0189" + (at 158.75 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 161.29 222.25 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 158.75 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 158.75 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 158.75 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "5765830b-e31b-47f2-9fad-4843aa74909d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0189") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 251.46 168.91 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "40f6c421-a661-428e-8f18-0ef30f994055") + (property "Reference" "L36" + (at 251.46 164.8927 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "FB" + (at 251.46 167.3169 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 251.46 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 251.46 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 251.46 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" " 81-LQM31PN1R5M00L" + (at 251.46 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 251.46 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "dfbb859c-909b-45e4-a465-6a5beb49dffd") + ) + (pin "2" + (uuid "bdc29cbc-8b63-49fb-b8e1-f8a1fdb1e219") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L36") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 267.97 22.86 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "410ec8b5-c212-4973-8261-c7a0903803c2") + (property "Reference" "J11" + (at 269.24 16.51 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "ANT-1" + (at 270.51 19.05 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 267.97 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 267.97 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 267.97 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 267.97 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 267.97 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2010209c-04ca-4586-a7b5-909540992384") + ) + (pin "2" + (uuid "c5a4da9b-54ed-498b-a2cd-aa48ac87808b") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 187.96 144.78 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "415fa270-98bc-413d-812b-7a6a98a1f6ce") + (property "Reference" "#PWR0211" + (at 187.96 151.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 190.5 146.05 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 187.96 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 187.96 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 187.96 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "fc366dd3-86dc-41bb-91f6-f5bc04fd70e1") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0211") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 281.94 101.6 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "41c5326a-700d-444d-bbf6-eddd3b662e8b") + (property "Reference" "#PWR0205" + (at 281.94 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 279.4 104.14 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 281.94 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 281.94 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "caa788db-883e-423f-bfb2-b643dd4724c0") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0205") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 165.1 247.65 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "42be312e-929f-4543-994a-2843d2142ec5") + (property "Reference" "C11" + (at 171.45 247.65 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 168.91 246.38 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 166.0652 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 165.1 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 165.1 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 165.1 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d1b1c364-e9d5-4a01-b352-3e5727090b97") + ) + (pin "1" + (uuid "3a6b843f-03e9-47f7-9757-a0e202b46dcd") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 287.02 238.76 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "443ffa27-1cd5-4c70-97b8-e493d1bdd8ba") + (property "Reference" "C145" + (at 288.29 242.57 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uF 50V" + (at 290.83 241.3 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 287.9852 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 287.02 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 287.02 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "80-C1206C106K4P" + (at 287.02 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 287.02 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "27bcc349-bfdc-47c2-9a25-354fb2f1d9cb") + ) + (pin "1" + (uuid "5a635948-a268-42ac-b6bb-b2c5d74370a8") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C145") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 237.49 149.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "459f784d-79c2-4056-ad7f-c10e9d245ad8") + (property "Reference" "C149" + (at 243.7242 148.59 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10nF 50V" + (at 241.3 148.59 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 238.4552 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 237.49 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 237.49 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "80-C1206C103K5R7210" + (at 237.49 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 237.49 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1e3ca6d3-b0d4-4d93-a267-a5f2fd302afb") + ) + (pin "1" + (uuid "a9df2dfd-e097-4e6f-a55a-e7f197f65fab") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C149") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 336.55 22.86 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "45f268f3-cc85-4c5b-a505-e8ade2811cb0") + (property "Reference" "J14" + (at 337.82 16.51 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "ANT-4" + (at 339.09 19.05 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 336.55 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 336.55 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 336.55 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 336.55 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 336.55 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "87c30232-e8ca-4384-84ea-21cef4463c83") + ) + (pin "2" + (uuid "2d25bcd0-b159-49d3-9edf-73eb5aac56cc") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 237.49 223.52 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "482171af-b6dd-405d-98ab-bd949d19347f") + (property "Reference" "R21" + (at 242.6503 223.52 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "52R3" + (at 240.2261 223.52 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 235.712 223.52 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 237.49 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 237.49 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "71-CRCW120649R9FKEAC" + (at 237.49 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 237.49 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b2b4ffd1-ad55-4bed-a43f-9b7395d54ea6") + ) + (pin "1" + (uuid "319be5c1-698f-46a3-b279-78232198958d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 20.32 256.54 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4847599b-286b-4c02-a075-bd84996c60db") + (property "Reference" "R1" + (at 21.59 256.54 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 21.59 254 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 20.32 258.318 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 20.32 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 20.32 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" " 71-CRCW12062K20JNEAC" + (at 20.32 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 20.32 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "10068471-5da8-4a64-b045-6b45af9359b3") + ) + (pin "1" + (uuid "2fb3db7f-7db7-4994-9b28-ecd69361cc2f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 173.99 128.27 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "49fa4929-ea42-4dec-bb1f-0fb1654cefde") + (property "Reference" "#PWR0202" + (at 173.99 132.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 170.18 127 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 173.99 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 173.99 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 173.99 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "ca279e8c-248b-4feb-91c5-c0a9c0d8d876") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0202") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 43.18 270.51 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4a4da249-3718-49ed-aad1-56091b115ff0") + (property "Reference" "#PWR0162" + (at 43.18 276.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 45.72 271.78 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 43.18 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 43.18 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 43.18 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "a3c81d69-43e1-43d0-9e8b-faf446b4a66f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0162") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:LM1117T-3.3") + (at 364.49 220.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4a79cb44-9a77-4ad8-81f6-c897fd226c96") + (property "Reference" "U16" + (at 364.49 214.9307 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM1117T-3.3" + (at 364.49 217.3549 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 364.49 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm1117.pdf" + (at 364.49 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 364.49 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "926-LM1117T-3.3/NOPB" + (at 364.49 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 364.49 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "3f9d6572-6bce-432d-9882-9fc9c041015c") + ) + (pin "2" + (uuid "2b0255b9-6b7c-455a-9ef3-564fea18a5b6") + ) + (pin "1" + (uuid "69e849c1-e95c-42e6-981f-53fc83ff3b25") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 226.06 172.72 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4b208f84-dce2-4899-8f5c-f2beac43396c") + (property "Reference" "C147" + (at 227.33 166.4858 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10pF 50V" + (at 227.33 168.91 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 222.25 171.7548 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 226.06 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-KGM31BCG1H102JT" + (at 226.06 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 226.06 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9b291668-b81d-45f7-a746-c8939e3011d0") + ) + (pin "1" + (uuid "5ebaf12f-8c3f-44df-9ba7-77764ddb102a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C147") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 381 207.01 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4bb3ce95-d120-4e18-b66a-dfb07b749b04") + (property "Reference" "#PWR05" + (at 381 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 381 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 381 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 381 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 381 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "3c663e2f-ea81-4805-bdd4-50312c62d084") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR05") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 330.2 118.11 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4c1b1e2e-346b-4191-807f-bed8dad7b75f") + (property "Reference" "R7" + (at 325.0397 118.11 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k" + (at 327.4639 118.11 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 331.978 118.11 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 330.2 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 330.2 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "652-CR1206JW-103ELF" + (at 330.2 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 330.2 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5c4dcfc5-3bc5-4cf3-9b42-91fca08aa652") + ) + (pin "1" + (uuid "24aebcf3-fde4-4ab1-826b-3ea997072bd8") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 29.21 273.05 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4e576422-750c-4805-a94a-b8b0944d1daf") + (property "Reference" "JP2" + (at 29.21 270.4409 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 29.21 270.4409 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 29.21 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 29.21 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 29.21 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 29.21 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 29.21 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "791a88b9-7b34-4440-8c55-9f6897981474") + ) + (pin "1" + (uuid "d144258b-60e9-4887-9a1e-806b77a300ff") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "JP2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 273.05 153.67 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4e642537-2219-44a2-8b08-224bac9f4e89") + (property "Reference" "R26" + (at 278.2103 153.67 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k" + (at 275.7861 153.67 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 271.272 153.67 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 273.05 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 273.05 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "652-CR1206JW-103ELF" + (at 273.05 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 273.05 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "05dccecf-54ae-46e8-afb4-449e601da2f8") + ) + (pin "1" + (uuid "a2949c14-39e8-48ba-9df4-1212b54c3e9b") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R26") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 226.06 215.9 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4eaf0efb-17af-4096-a4f1-bf289375d643") + (property "Reference" "C154" + (at 227.33 209.6658 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10pF 50V" + (at 227.33 212.09 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 222.25 214.9348 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 226.06 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-KGM31BCG1H102JT" + (at 226.06 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 226.06 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4118d6c6-540c-4e7d-82e1-12cbafd6af75") + ) + (pin "1" + (uuid "ff6a1be4-b593-414b-ad03-61537750ce5a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C154") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 290.83 22.86 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4eeedada-ce8b-4ae1-bab7-9e1606d6f068") + (property "Reference" "J12" + (at 292.1 16.51 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "ANT-2" + (at 293.37 19.05 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 290.83 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 290.83 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 290.83 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 290.83 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 290.83 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7fca9250-f87a-4165-869e-64b9a4c29cd2") + ) + (pin "2" + (uuid "7122c39f-37cf-417d-96f4-ebc2edb15949") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Polarized") + (at 393.7 242.57 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4fff41bc-aa63-43fd-9b42-89cbac213387") + (property "Reference" "C134" + (at 396.621 240.4689 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "220uF 16V" + (at 396.621 242.8931 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_THT:CP_Radial_D10.0mm_P5.00mm" + (at 394.6652 246.38 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 393.7 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 393.7 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "667-ECA-1EM221" + (at 393.7 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 393.7 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f26234c3-c727-4fb4-ad45-42cfd8a6d017") + ) + (pin "1" + (uuid "a799a2f9-6ae7-48c6-aaec-adfa90b67e3e") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C134") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 52.07 30.48 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5275cba9-f1e0-4746-8458-96f85c4b061d") + (property "Reference" "#PWR0175" + (at 52.07 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 52.07 26.3469 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 52.07 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 52.07 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 52.07 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "43664dee-f6e2-40b6-932a-7a11314c106f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0175") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 190.5 227.33 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "538d9bcf-4c23-45c0-9c37-b71461f112ed") + (property "Reference" "C5" + (at 186.69 227.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 187.96 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 189.5348 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 190.5 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 190.5 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 190.5 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 190.5 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "dc18ef2e-a444-437a-bf92-c7e522b15df7") + ) + (pin "1" + (uuid "ba28fd1f-d1d0-4136-b426-95c133fd48b6") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 232.41 266.7 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5410a56b-2ae3-4350-8978-1e4429414a00") + (property "Reference" "#PWR023" + (at 232.41 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 236.22 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 232.41 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 232.41 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 232.41 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "8a27814f-95a9-462d-9e79-f3760fee2f4c") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR023") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 57.15 40.64 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "541ea191-4bc3-4dff-bae4-ff5099a3df8e") + (property "Reference" "U5" + (at 59.69 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 59.69 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 57.15 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 57.15 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 57.15 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 57.15 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 57.15 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "06fe2027-7b39-4ffd-9cd6-ab99bca4cc5f") + ) + (pin "4" + (uuid "f942ec6a-38d9-44c5-9be6-c29fc1b0aa84") + ) + (pin "3" + (uuid "f1793e19-c99a-439a-8afe-588f394ff26c") + ) + (pin "5" + (uuid "b49ff8e6-d1af-4f35-8413-6b4155cf9382") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 226.06 242.57 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "561e7b0e-2295-4402-9d75-498e3d6fec1a") + (property "Reference" "#PWR016" + (at 226.06 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 228.6 245.11 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 226.06 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 226.06 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "48c8277e-2cb3-4556-9eab-2bda1012c3ab") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR016") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 256.54 67.31 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5769f591-e475-4e00-8851-22e3a09b2747") + (property "Reference" "C25" + (at 252.73 66.04 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "100pF 50V" + (at 255.27 63.5 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 260.35 66.3448 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 256.54 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 256.54 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "710-885012008043" + (at 256.54 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 256.54 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "269ecfe6-d8c9-4691-97a0-d8f3e82c872a") + ) + (pin "1" + (uuid "a8870a2f-9845-4bb5-9517-17e3fabf69b5") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C25") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 106.68 91.44 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "57c5a781-f24b-4b3b-bbd7-8fbb68ce065c") + (property "Reference" "J6" + (at 114.3 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TO XVTR" + (at 110.49 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 106.68 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 106.68 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 106.68 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 106.68 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 106.68 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e38c8a98-0837-4137-865e-6541607f0d73") + ) + (pin "2" + (uuid "3838473e-a27d-4e40-ae4c-3f21c368aee6") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+8V") + (at 303.53 226.06 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "593d99bf-3433-4658-b267-b8c73ec5c7d7") + (property "Reference" "#PWR030" + (at 303.53 229.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+8V" + (at 303.53 221.9269 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 303.53 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 303.53 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 303.53 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "b66de7e3-969e-42c3-a939-f4d9f2c530dd") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR030") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x05_Socket") + (at 284.48 93.98 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5abca735-d48d-473f-b8fe-82cfaf19ac15") + (property "Reference" "J17.2" + (at 284.48 89.8865 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "TR CTL" + (at 284.48 92.3107 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x05_P2.54mm_Vertical" + (at 284.48 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 284.48 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 284.48 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 284.48 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 284.48 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "4" + (uuid "88974215-479d-4a0f-9013-c095385a0884") + ) + (pin "3" + (uuid "ec3d2248-adbe-4afd-8d53-ed67d03f4660") + ) + (pin "1" + (uuid "766f8ce9-acdd-40e6-abc3-7c257b3faa48") + ) + (pin "2" + (uuid "f14e499d-84dc-4c64-bfae-f0b7f52b0341") + ) + (pin "5" + (uuid "da6ddd86-c0a8-41ad-9cb2-551cc207d3bc") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J17.2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x05_Socket") + (at 284.48 78.74 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5be94003-8141-4a3e-83ac-4ffbf8bfa389") + (property "Reference" "J17.1" + (at 281.94 80.01 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "RECEIVE" + (at 280.67 82.55 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x05_P2.54mm_Vertical" + (at 284.48 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 284.48 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 284.48 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 284.48 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 284.48 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "4" + (uuid "06bfa4c2-4df9-4b88-8fd2-2e772fd49ca7") + ) + (pin "3" + (uuid "fb1cafa7-b3c6-4080-aad1-436d9b6c2103") + ) + (pin "1" + (uuid "01f5fa4d-5212-4d22-96e8-2514a12e7106") + ) + (pin "2" + (uuid "f5f7ca88-c990-418c-993d-9635dd82b287") + ) + (pin "5" + (uuid "119e267f-74d1-441d-819e-4d5f436b1fcb") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J17.1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:ULN2803C") + (at 121.92 168.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5c257567-2533-454d-9f4b-dff669d01be6") + (property "Reference" "U9" + (at 121.92 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ULN2803C" + (at 121.92 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-20W_7.5x12.8mm_P1.27mm" + (at 123.19 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/uln2803c.pdf" + (at 125.73 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 121.92 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "7" + (uuid "d08691d5-f414-467b-ac34-f55012f80bc2") + ) + (pin "17" + (uuid "1af609d6-97a7-4cf8-9a88-d8f0dadb8975") + ) + (pin "8" + (uuid "4f1501be-d39d-42fa-bedb-34a94f745b65") + ) + (pin "15" + (uuid "4d11193c-d836-4fcc-bdea-7ae93cb01029") + ) + (pin "14" + (uuid "a3f6a79c-64e5-4dae-a12b-58c288588be5") + ) + (pin "2" + (uuid "502837cd-43f3-47ac-afdb-548f369dbe82") + ) + (pin "13" + (uuid "a55a1e72-8a1e-4c35-9670-a385111cb387") + ) + (pin "16" + (uuid "858f0b34-f641-417c-9f5e-4506ce014796") + ) + (pin "1" + (uuid "752f626e-64fc-4615-b62a-7351439487b8") + ) + (pin "9" + (uuid "2aceb8e2-bc59-4155-9f97-3ef56533b723") + ) + (pin "12" + (uuid "b5c8a9ab-7b3e-4590-aab0-10b178dbf21a") + ) + (pin "11" + (uuid "b7c97a2b-5976-48f2-8568-4c335b97c51a") + ) + (pin "10" + (uuid "0566b2fe-836e-4263-aa1f-089d6125384f") + ) + (pin "5" + (uuid "de76c0cc-c32f-4da4-817f-566ef9853d8d") + ) + (pin "3" + (uuid "22b9b98e-5f5c-4a53-aba5-a294ede285b4") + ) + (pin "4" + (uuid "9cb8c576-66cf-427e-9182-f01920318cd4") + ) + (pin "18" + (uuid "6e3314de-27f0-4ff7-93d2-4c50c15c2243") + ) + (pin "19" + (uuid "0b9c6ac1-66a4-4774-9b2d-44934930c1dd") + ) + (pin "6" + (uuid "d2d92d3b-1ee8-4f15-8383-5c13407efa5c") + ) + (pin "20" + (uuid "db5b7192-3800-46a6-8466-76cc2642631b") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 375.92 228.6 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5caacca5-f06d-41ae-921a-3b9e5df07eb9") + (property "Reference" "#PWR06" + (at 375.92 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 375.92 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 375.92 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 375.92 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 375.92 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "93fc3007-4899-4ced-b6e4-422ec4752e6a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR06") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 292.1 193.04 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5f9183b6-49ae-4052-8470-edc0a474947f") + (property "Reference" "L39" + (at 292.1 189.0227 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "FB" + (at 292.1 191.4469 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 292.1 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 292.1 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 292.1 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" " 81-LQM31PN1R5M00L" + (at 292.1 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 292.1 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5a9a7ecb-a6c9-4003-9fd0-cf9fbabf077e") + ) + (pin "2" + (uuid "fda3e56c-2667-4cea-a7af-528e7f780892") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L39") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+8V") + (at 393.7 238.76 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5fac8e82-25bf-4c62-b090-7a979ccc9c4b") + (property "Reference" "#PWR010" + (at 393.7 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+8V" + (at 393.7 234.6269 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 393.7 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 393.7 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 393.7 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "0e64944e-5a86-43a9-a40a-e90a4777656c") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR010") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 344.17 106.68 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5febb07b-2636-4d6d-8bfb-0628bde0d495") + (property "Reference" "#PWR032" + (at 344.17 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 340.36 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 344.17 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 344.17 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 344.17 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "caa2d8ec-3090-4f4d-903e-9f4a0faed62a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR032") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 135.89 154.94 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "616aef70-ecba-458d-87a5-2f8946805a59") + (property "Reference" "C128" + (at 142.24 151.13 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 142.24 153.67 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 139.7 153.9748 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 135.89 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 135.89 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 135.89 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 135.89 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6f3d0c2e-0ac8-4f27-bf4d-dce7eac7e866") + ) + (pin "1" + (uuid "51864356-864a-40be-bba9-6d9adc29e986") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C128") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 251.46 212.09 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "6308f1aa-0188-4ff7-bd09-0d38cdf81a67") + (property "Reference" "L41" + (at 251.46 208.0727 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "FB" + (at 251.46 210.4969 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 251.46 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 251.46 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 251.46 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" " 81-LQM31PN1R5M00L" + (at 251.46 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 251.46 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4c0372ef-024a-4194-b328-bce1d8a509c5") + ) + (pin "2" + (uuid "acef6cc1-9334-4676-9f0b-a7400877cc1c") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L41") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:6_pin_transformer") + (at 212.09 205.74 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "65eef4ac-daca-4b6a-b8f6-13089fea049f") + (property "Reference" "L44" + (at 202.565 204.5279 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "6_pin_transformer" + (at 198.12 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:Toroid_6Pin_BinocularCore_13.3mm_14.35mm" + (at 212.09 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 212.09 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 212.09 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 212.09 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 212.09 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "34a4d24f-c7a1-48de-8702-3143e1e763d7") + ) + (pin "4" + (uuid "f0923187-0fe6-4a85-b206-8e4231f121c4") + ) + (pin "6" + (uuid "6591d1c2-c376-4c96-ba13-7997a3c340ff") + ) + (pin "1" + (uuid "61dbac60-f937-4383-8783-50433eeebe6d") + ) + (pin "2" + (uuid "e8238ee1-c60b-47f6-b77b-d6c2308e0368") + ) + (pin "3" + (uuid "757b4cba-bb4a-4330-a46e-01eef82b1e12") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L44") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 238.76 262.89 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "66b81706-f124-495a-94ea-bd24686973eb") + (property "Reference" "C156" + (at 244.9942 261.62 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10nF 50V" + (at 242.57 261.62 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 239.7252 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 238.76 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 238.76 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "80-C1206C103K5R7210" + (at 238.76 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 238.76 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2c68164b-d0e9-4aa6-8c07-55460416f721") + ) + (pin "1" + (uuid "c9ff767f-5c37-4c27-bd45-82c66ef1b128") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C156") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 121.92 224.79 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "66cd22d3-2094-4bf0-be50-d6e28e338d65") + (property "Reference" "#PWR042" + (at 121.92 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 124.46 226.06 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 121.92 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 121.92 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 121.92 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "3e705da3-930c-45e0-9e17-3de9d0248179") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR042") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 241.3 215.9 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "67874294-3f28-4654-bec0-ded85c2985c2") + (property "Reference" "C155" + (at 242.57 209.6658 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10nF 50V" + (at 242.57 212.09 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 237.49 214.9348 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 241.3 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 241.3 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "80-C1206C103K5R7210" + (at 241.3 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 241.3 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5bb7bdf7-d3af-4266-8bd1-a7ff92c7a799") + ) + (pin "1" + (uuid "251276b6-62e6-47d2-9f94-2985ca43121b") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C155") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 247.65 168.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "679ae5ce-5ced-4e62-948f-e52e59210a1b") + (property "Reference" "#PWR012" + (at 247.65 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 247.65 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 247.65 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 247.65 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 247.65 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "800b4c6b-26d4-4b45-b348-15f404fa4b61") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR012") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:L7808") + (at 365.76 238.76 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "690d45e6-c717-4c7a-8d26-bbdeebeac650") + (property "Reference" "U13" + (at 365.76 232.7107 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "L7808" + (at 365.76 235.1349 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 366.395 242.57 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "http://www.st.com/content/ccc/resource/technical/document/datasheet/41/4f/b3/b0/12/d4/47/88/CD00000444.pdf/files/CD00000444.pdf/jcr:content/translations/en.CD00000444.pdf" + (at 365.76 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 365.76 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "511-L7808ACV-DG" + (at 365.76 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 365.76 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "11fd84c6-7299-4c3d-9cf7-f0c359637600") + ) + (pin "3" + (uuid "59e7b796-4098-432e-9e82-a73540fb5a78") + ) + (pin "1" + (uuid "45968b74-f2ad-4604-a538-acfd60a61d37") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 300.99 167.64 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6bb850e0-cb8f-4572-a983-8d726b9c146c") + (property "Reference" "R23" + (at 304.8 165.1 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 300.99 164.9039 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 300.99 169.418 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 300.99 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 300.99 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "667-ERJ-8GEY0R00V" + (at 300.99 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 300.99 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4386bf91-5cfe-4bb1-8752-147402c93997") + ) + (pin "1" + (uuid "29299c46-31c4-410f-8005-c44a08b46124") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R23") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 337.82 199.39 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "6cb19416-29aa-457e-b05d-ef93bf3c873d") + (property "Reference" "L200" + (at 337.82 194.7404 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uH 20%" + (at 337.82 197.1646 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Inductor_SMD:L_Coilcraft_XAL7020-102" + (at 337.82 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 337.82 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 337.82 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "81-1264EY-100MP3" + (at 337.82 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 337.82 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6950363f-771a-4a3b-b147-ba4001fd8035") + ) + (pin "2" + (uuid "8689a10c-ef1f-417a-b5de-c90bc313fd93") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L200") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 199.39 31.75 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6d0a6f13-cbf2-46d2-9995-0ce0b3512ab3") + (property "Reference" "#PWR0165" + (at 199.39 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 201.93 33.02 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 199.39 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 199.39 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 199.39 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "497eb7ff-735e-4f53-ac1b-68800633dee3") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0165") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Transistor_FET:2N7000") + (at 321.31 129.54 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6e6816e5-35c0-4537-bc9f-cfe4faf18a2a") + (property "Reference" "Q2" + (at 326.517 128.3279 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2N7000" + (at 326.517 130.7521 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" + (at 326.39 131.445 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.vishay.com/docs/70226/70226.pdf" + (at 326.39 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "" + (at 321.31 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "512-2N7000D26Z" + (at 321.31 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 321.31 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "322d193c-280c-40fe-bde2-ca8d116e97c2") + ) + (pin "2" + (uuid "de9935db-96be-4c5e-ba66-469b66c8592c") + ) + (pin "3" + (uuid "1c18165b-3abd-429c-8d1f-ca96b562c9bd") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "Q2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 295.91 22.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6fa3c2c3-a5c4-479e-b770-c94c9504261c") + (property "Reference" "#PWR0180" + (at 295.91 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 298.45 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 295.91 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 295.91 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 295.91 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "13a9793f-3f3f-478a-8f51-552e71d99031") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0180") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 167.64 39.37 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7025da18-32fb-4198-9ffd-43dfcb248894") + (property "Reference" "#PWR0166" + (at 167.64 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 170.18 40.64 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 167.64 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 167.64 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 167.64 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "09c4b254-4cf5-4f5d-bb1d-0103bef2be7c") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0166") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 187.96 139.7 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7058378f-4672-415f-8cb2-7a430b889239") + (property "Reference" "J23" + (at 195.58 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FROM LPF" + (at 201.93 142.24 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 187.96 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 187.96 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 187.96 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 187.96 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 187.96 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c3d5af80-19c2-454b-8e66-7ebd90f32ea3") + ) + (pin "2" + (uuid "e2bc324b-67b6-495b-be77-67df2e40144a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J23") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 295.91 226.06 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7138cc0f-c1a8-4de8-ab89-f1317a461de6") + (property "Reference" "C146" + (at 292.1 224.79 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1uF 50V" + (at 294.64 222.25 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 299.72 225.0948 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 295.91 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 295.91 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "187-CL31B105KBHNNNE" + (at 295.91 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 295.91 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "aad00be7-03c8-46e5-854a-be033247d05e") + ) + (pin "1" + (uuid "08684ce2-9f94-4250-9702-7513bccdacb5") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C146") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 160.02 104.14 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "731a5b61-429c-4d65-8f0a-7cf68602e422") + (property "Reference" "J9" + (at 158.75 97.79 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TO 100W PA" + (at 154.94 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 160.02 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 160.02 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 160.02 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 160.02 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 160.02 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9cb00384-3071-4ed1-8219-96984b4de600") + ) + (pin "2" + (uuid "3de3e0bf-5992-4ff0-a11d-a47bf5a0a05d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 69.85 31.75 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7487de4c-9431-4f01-8898-a65dc273f893") + (property "Reference" "#PWR0169" + (at 69.85 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 67.31 33.02 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 69.85 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 69.85 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 69.85 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "41741fc2-6237-4880-9401-8d37c67967f7") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0169") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 116.84 62.23 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7598f7d5-1662-4cca-baef-98fe41f72cce") + (property "Reference" "C17" + (at 116.84 67.31 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 116.84 69.85 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 120.65 61.2648 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 116.84 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 116.84 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 116.84 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 116.84 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f8c76291-b026-4dbc-84ee-9c4b46b8f6bc") + ) + (pin "1" + (uuid "3741a913-6379-4b68-bd10-22c957fe05e7") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 229.87 228.6 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "76cf3948-9f33-44e1-b4a0-9345fcce8bdc") + (property "Reference" "R24" + (at 232.41 228.6 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "~" + (at 232.6061 228.6 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 228.092 228.6 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 229.87 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 229.87 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "755-SFR18EZPF56R0" + (at 229.87 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 229.87 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4bf6f5dc-c68c-4ece-a500-5fed39e79ae0") + ) + (pin "1" + (uuid "f7953ea3-4b81-48b6-af7e-5d1752aa4d12") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 355.6 203.2 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "775e66fc-124b-41b4-b448-542076f4d675") + (property "Reference" "C132" + (at 352.679 201.9879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "1uF 50V" + (at 352.679 204.4121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 354.6348 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 355.6 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 355.6 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "187-CL31B105KBHNNNE" + (at 355.6 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 355.6 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f338a826-3d09-4171-a495-8f30b9618d24") + ) + (pin "1" + (uuid "dc6a60e3-c29f-4d97-9777-cb9a8141ec99") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C132") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 171.45 139.7 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7bae119e-6159-47a7-8ff1-b28a9210b260") + (property "Reference" "J16" + (at 163.83 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TO LPF" + (at 162.56 142.24 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 171.45 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 171.45 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 171.45 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 171.45 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 171.45 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9a1d29c5-e858-4df6-88db-6c15eaa40adb") + ) + (pin "2" + (uuid "41a56bdb-28ad-4c67-87c6-3571129b93df") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 162.56 161.29 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7ca0c347-0190-4afe-b078-29310e4c7916") + (property "Reference" "#PWR0212" + (at 162.56 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 166.37 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 162.56 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 162.56 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 162.56 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "26196441-6c72-4484-be16-d3c1fea8d2de") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0212") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 121.92 189.23 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7cef4d20-c96d-4f5d-9cda-86b7187f245f") + (property "Reference" "#PWR038" + (at 121.92 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 124.46 189.23 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 121.92 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 121.92 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 121.92 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "01de44dd-b9c0-4c99-9615-5b508ffd86a6") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR038") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 143.51 269.24 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7cf5ad85-6f34-4f3f-a834-0afe80591cf6") + (property "Reference" "R14" + (at 148.6703 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "2k2" + (at 146.2461 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 141.732 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 143.51 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 143.51 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" " 71-CRCW12062K20JNEAC" + (at 143.51 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 143.51 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c5b0cfb9-496b-46ed-a9f8-b115c9337de8") + ) + (pin "1" + (uuid "5401a45a-5a65-4e82-afc7-b89df2ea6197") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 341.63 22.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7d798a10-cfe8-478c-a341-9d67f16a080d") + (property "Reference" "#PWR0182" + (at 341.63 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 344.17 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 341.63 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 341.63 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 341.63 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "8131329c-6943-44f1-bf23-7423f78e4ae5") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0182") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 237.49 82.55 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7e6da0ec-cb9b-4590-9c69-971825944d2e") + (property "Reference" "L1" + (at 236.2227 81.3379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "3.3uH" + (at 236.2227 83.7621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 237.49 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 237.49 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 237.49 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "70-ILSB1206ER3R3K" + (at 237.49 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 237.49 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a7453a17-0435-49c7-bb3f-18ad76674b89") + ) + (pin "2" + (uuid "90549b64-80e1-4708-9278-95268323521e") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 254 243.84 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7ebccdf3-84f8-4d1a-a3a1-6fa5e02f2239") + (property "Reference" "#PWR019" + (at 254 250.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 256.54 246.38 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 254 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 254 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 254 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "4d976c6a-d22d-4939-928f-395e59529706") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR019") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+8V") + (at 344.17 80.01 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7ed631ba-1976-48ab-b9f4-90a687acc5ed") + (property "Reference" "#PWR034" + (at 344.17 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+8V" + (at 344.17 75.8769 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 344.17 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 344.17 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 344.17 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "53c7b137-97c2-413b-805e-e85ead3c9d59") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR034") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R_Potentiometer") + (at 266.7 149.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7eec388e-c708-42e6-a4e2-72b055f4d4ce") + (property "Reference" "RV19" + (at 264.922 148.6479 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "22k" + (at 264.922 151.0721 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Potentiometer_THT:Potentiometer_Bourns_3296Y_Vertical" + (at 266.7 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.mouser.com/datasheet/2/54/3296-776415.pdf" + (at 266.7 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 266.7 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "652-3296Y-1-223LF" + (at 266.7 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 266.7 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1da9fc04-d19f-40aa-8ac2-4fbe1061cecc") + ) + (pin "3" + (uuid "890891ab-c31d-42ed-bab0-0ff3d6b42fad") + ) + (pin "2" + (uuid "642af12c-63db-420b-b642-f530ac285192") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "RV19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 359.41 66.04 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "80f94803-d669-4c28-a276-08d09549772d") + (property "Reference" "#PWR0183" + (at 359.41 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 359.41 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 359.41 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 359.41 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 359.41 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "0dc5ab10-e61e-4bfe-b375-dada567d7e16") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0183") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 175.26 227.33 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8116fdcd-32a3-4a36-81b0-61c58a54af84") + (property "Reference" "C3" + (at 171.45 227.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 172.72 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 174.2948 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 175.26 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 175.26 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 175.26 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 175.26 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "bfc1f6e4-d654-4b12-b959-fb3a779da2e6") + ) + (pin "1" + (uuid "b8aa2544-8f55-4083-8645-6088c25b4d9c") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 154.94 62.23 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "816a6554-abf8-4312-b2eb-d60f8d97ee92") + (property "Reference" "C18" + (at 153.67 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 153.67 66.04 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 158.75 63.1952 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 154.94 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 154.94 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 154.94 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 154.94 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "652f775b-feee-434f-9334-680f8482f4d9") + ) + (pin "1" + (uuid "c6a91da6-e5b5-4bbd-9433-efc61a483aca") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 95.25 45.72 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "81f7ee7e-ba36-4f5f-b9fe-5373004417ae") + (property "Reference" "#PWR0173" + (at 95.25 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 92.71 46.99 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 95.25 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 95.25 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 95.25 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "b7903ff9-753f-4a4f-9492-5672ce51d280") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0173") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 237.49 180.34 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "821c4ade-a2fe-4b65-bb8b-b157c1d75a8d") + (property "Reference" "R13" + (at 242.6503 180.34 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "52R3" + (at 240.2261 180.34 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 235.712 180.34 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 237.49 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 237.49 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "71-CRCW120649R9FKEAC" + (at 237.49 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 237.49 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9658baf7-357e-4e30-bcb1-371d074a52d4") + ) + (pin "1" + (uuid "03cdd7bd-c503-4379-9887-f40f69af06ad") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 332.74 86.36 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "835f195f-68d6-4f04-89c4-c8a922749598") + (property "Reference" "C138" + (at 338.9742 85.09 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 336.55 85.09 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 333.7052 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 332.74 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 332.74 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 332.74 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 332.74 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "49a09c29-b5de-47d3-ae99-f1e210146efb") + ) + (pin "1" + (uuid "8d7efd0d-d498-408d-be69-3337c687bfb0") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C138") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 163.83 207.01 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "83b730b7-45eb-4e1d-8f98-84d2a25aa8c7") + (property "Reference" "#PWR0215" + (at 163.83 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 166.37 208.28 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 163.83 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 163.83 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 163.83 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "1f8f9b53-7f95-4213-8444-775a93b1bf59") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0215") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 226.06 177.8 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "84efdc97-533b-4f72-9c5a-1fd13d93dcc3") + (property "Reference" "R17" + (at 226.06 180.34 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "~" + (at 226.06 180.5361 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 226.06 176.022 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 226.06 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "71-RCS1206499RFKEA" + (at 226.06 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 226.06 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4df138e3-72e3-4bce-9bbb-3ffbe9fcaf7b") + ) + (pin "1" + (uuid "6a787f7d-420a-4319-9b92-e1deb65d094b") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R_Potentiometer") + (at 266.7 262.89 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "877bdad3-d4e4-4c0e-a48e-86ab6a76f473") + (property "Reference" "RV27" + (at 264.922 261.6779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "22k" + (at 264.922 264.1021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Potentiometer_THT:Potentiometer_Bourns_3296Y_Vertical" + (at 266.7 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.mouser.com/datasheet/2/54/3296-776415.pdf" + (at 266.7 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 266.7 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "652-3296Y-1-223LF" + (at 266.7 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 266.7 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8c332f5a-3a63-478d-a2d6-231e867f166a") + ) + (pin "3" + (uuid "46032662-4191-4865-a762-e3ed34fc0fa2") + ) + (pin "2" + (uuid "082b2357-2e5d-415d-8f0e-708532000fab") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "RV27") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 292.1 226.06 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "87f9b370-5dd2-4f68-84ed-09a11f919c5d") + (property "Reference" "#PWR031" + (at 292.1 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 289.56 227.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 292.1 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 292.1 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 292.1 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "652ce684-7fea-417d-b5b3-3a2f7f2a6940") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR031") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 170.18 29.21 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "895889ad-2fea-4cc5-8420-3f85c843dedb") + (property "Reference" "U1" + (at 170.18 18.7157 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 170.18 21.1399 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 170.18 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 170.18 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 170.18 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 170.18 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 170.18 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "2cc8d066-9efc-4973-8e3e-784e54bb1641") + ) + (pin "6" + (uuid "518a9435-3cec-4f2b-b60a-1ed39e0bdd88") + ) + (pin "4" + (uuid "48e6cdfd-688f-4def-9a56-3704e36e9b41") + ) + (pin "1" + (uuid "4303d29a-c064-4f5d-a172-4b99adc9cfe1") + ) + (pin "2" + (uuid "0f61488c-f50f-4e0c-baec-45bd0f03711d") + ) + (pin "3" + (uuid "b0488ff5-a012-4609-9c4a-ee3889891f00") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 125.73 91.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8962e1d6-1a34-41bf-8a16-d0142e84a6b3") + (property "Reference" "#PWR0194" + (at 125.73 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 128.27 92.71 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 125.73 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 125.73 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 125.73 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "2def86ef-93ef-4bec-a335-f1fe3b3cc5e9") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0194") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:IDC_2x5") + (at 167.64 274.32 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "8a9c844e-3249-4474-8138-7ab6f28d9f0b") + (property "Reference" "J21" + (at 168.91 263.8257 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Bands" + (at 168.91 266.2499 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 167.64 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 167.64 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 167.64 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 167.64 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "A-2939" + (at 167.64 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "9" + (uuid "c88d6a3a-3409-46ae-b5ea-28cec561de06") + ) + (pin "5" + (uuid "fbc7066b-1191-44ed-a7fd-9fac47fda8ad") + ) + (pin "2" + (uuid "9c1c244f-e2df-4277-9344-9df055ef6ffa") + ) + (pin "4" + (uuid "5ec5dd19-2375-47d6-9e3c-25630610e781") + ) + (pin "6" + (uuid "81c96fdf-4f3c-4111-99ee-26be13dbe640") + ) + (pin "10" + (uuid "d652f46c-ba5b-443a-8cd2-3558907f2dc2") + ) + (pin "7" + (uuid "1bc7bec3-29a8-4dcf-9f30-5093eb15bea8") + ) + (pin "3" + (uuid "8ac02ec9-947e-43e4-ba4c-6c07fd753805") + ) + (pin "1" + (uuid "79627fe3-2a8a-4eb7-b9f7-e1d556edf862") + ) + (pin "8" + (uuid "7465d22c-dccc-49ef-a816-4f0ba5ea529d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 182.88 227.33 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8b1fafca-6c34-4a5a-89a3-c317f6b27bd8") + (property "Reference" "C4" + (at 179.07 227.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 180.34 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 181.9148 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 182.88 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 182.88 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 182.88 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 182.88 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "bc3eca76-c973-492f-b960-8e60fb3f1838") + ) + (pin "1" + (uuid "0401a773-66ef-4db3-88a5-8d8f559a4067") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Relay:Relay_SPDT") + (at 147.32 123.19 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8f0ede3f-e360-45ee-a161-b02b428f3077") + (property "Reference" "K2" + (at 140.97 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "HF41F/12-ZS" + (at 138.43 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" + (at 146.05 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 147.32 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 147.32 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 147.32 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "A1" + (uuid "6270096f-e3a0-46b5-93c9-cc434a490d69") + ) + (pin "12" + (uuid "b4cbddee-5a2d-4be7-917e-afc8db847327") + ) + (pin "14" + (uuid "aa8ca4d4-135b-407e-ac46-7424bfaa0883") + ) + (pin "A2" + (uuid "31df6342-1a7c-446a-a6db-898110b2638c") + ) + (pin "11" + (uuid "f6f76b52-b414-4e3a-932c-74833e878362") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 328.93 212.09 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "90773448-826d-4651-95a9-82f8b925d903") + (property "Reference" "#PWR02" + (at 328.93 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 328.93 217.17 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 328.93 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 328.93 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 328.93 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "c129d444-568f-4a19-be0c-67e8d8c16bcb") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR02") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 111.76 24.13 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "90c75119-63c5-43dd-af7c-61d05359e901") + (property "Reference" "C6" + (at 110.49 17.78 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 110.49 20.32 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 115.57 23.1648 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 111.76 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 111.76 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 111.76 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 111.76 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7cdc20f0-f30f-4b83-9023-a1ac096ba406") + ) + (pin "1" + (uuid "f5740971-983e-4001-acd9-a79c5f28715a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 330.2 114.3 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "90cdd815-4c90-4fa3-bc02-7fd74feb237f") + (property "Reference" "#PWR0207" + (at 330.2 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 334.01 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 330.2 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 330.2 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 330.2 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "ff8320d1-28a9-4a71-9f55-a7deefb7d4ad") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0207") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Relay:Relay_SPDT") + (at 298.45 46.99 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "92c35af9-e424-4a6f-8f7c-2fc1ede0b7b3") + (property "Reference" "K5" + (at 304.8 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "HF41F/12-ZS" + (at 307.34 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" + (at 299.72 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 298.45 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 298.45 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 298.45 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 298.45 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "A1" + (uuid "679c63d6-1bbd-4e04-9bf3-1ff52862e530") + ) + (pin "12" + (uuid "50736f92-b959-4248-8a7e-8c44f1316752") + ) + (pin "14" + (uuid "5e58e390-4912-4ed1-878d-61c0ede0117e") + ) + (pin "A2" + (uuid "75f3de1e-a72e-4cfd-b0fa-8d5b44340f4e") + ) + (pin "11" + (uuid "3db2d162-cf59-4532-9aef-39adb633ff2e") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 355.6 224.79 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "934e9005-55c1-4ede-851f-66b6fd8bb533") + (property "Reference" "C143" + (at 352.679 223.5779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 50V" + (at 352.679 226.0021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 354.6348 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 355.6 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 355.6 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "80-C1206C106K4P" + (at 355.6 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 355.6 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cfdb6d2a-4ca7-4a73-9683-d66c8939507a") + ) + (pin "1" + (uuid "5ab5d145-96a3-4c07-999d-b2f81c56c002") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C143") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 283.21 109.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "93d43097-263a-4638-a6ed-5fa5e1fc0856") + (property "Reference" "#PWR0203" + (at 283.21 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 279.4 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 283.21 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 283.21 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 283.21 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "aca3574e-5e74-45f4-bb34-c3fa428c9e51") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0203") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 279.4 215.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "95a09b4f-276f-48a0-bc23-2839f9b53bc6") + (property "Reference" "#PWR024" + (at 279.4 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 281.94 218.44 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 279.4 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 279.4 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 279.4 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "61c312e3-2d92-4092-ab32-d82694e2d561") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR024") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 165.1 252.73 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "977a0f7b-a1a2-43be-8695-c7a3abdf1295") + (property "Reference" "#PWR0195" + (at 165.1 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 162.56 254 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 165.1 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 165.1 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "274f366e-710a-4630-9910-2226a8e318ab") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0195") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 222.25 185.42 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9832b806-99b1-4e7a-863d-a703ed3a4f4c") + (property "Reference" "R18" + (at 219.71 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "~" + (at 219.5139 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 224.028 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 222.25 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "755-SFR18EZPF56R0" + (at 222.25 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 222.25 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ffe876ee-db82-48b1-86b6-fc09cb75f0f6") + ) + (pin "1" + (uuid "3dca7fef-b4e9-4d6d-bc4f-f10a628adc12") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 356.87 242.57 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9871fae5-f455-4cdb-bed3-4f3353c01fe2") + (property "Reference" "C135" + (at 353.949 241.3579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "1uF 50V" + (at 353.949 243.7821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 355.9048 246.38 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 356.87 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 356.87 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "187-CL31B105KBHNNNE" + (at 356.87 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 356.87 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "962f959e-3a22-418b-873d-a354d122e944") + ) + (pin "1" + (uuid "bb1405ce-35e6-4752-8011-896885b649c8") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C135") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 302.26 118.11 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "9881fb70-c2f0-4ef4-8994-404049ec078c") + (property "Reference" "#PWR0204" + (at 302.26 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 302.26 122.2431 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 302.26 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 302.26 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 302.26 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "325fc954-b662-4219-89b6-d3e445531173") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0204") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Relay:Relay_SPDT") + (at 275.59 46.99 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "98ed2a95-34a5-4fa1-a293-4d912bd600d5") + (property "Reference" "K4" + (at 281.94 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "HF41F/12-ZS" + (at 284.48 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" + (at 276.86 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 275.59 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 275.59 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 275.59 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 275.59 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "A1" + (uuid "cba29de9-b28f-4739-8b08-58431c810dfc") + ) + (pin "12" + (uuid "925f3df5-7ce4-4c12-b0ef-e2604eb878e0") + ) + (pin "14" + (uuid "10c75149-d757-476d-b38b-2b96f27f1979") + ) + (pin "A2" + (uuid "1858da09-17d6-4e9d-a926-72505378a463") + ) + (pin "11" + (uuid "2473f67c-fd8b-4dc7-ab92-0690e64d4325") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 347.98 124.46 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "99279936-8f6e-44e2-b954-8f0609efb529") + (property "Reference" "C19" + (at 354.2142 123.19 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "15nF 50V" + (at 351.79 123.19 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 348.9452 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 347.98 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 347.98 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "77-VJ1206Y153JXAAC" + (at 347.98 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 347.98 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ebff3c45-665d-45a1-85f6-6d7dcfd7656a") + ) + (pin "1" + (uuid "16d7ef2e-eb23-4fc5-bd76-6e16d05cb17d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 231.14 67.31 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "998574ec-4b7f-47c3-a0d7-b240a4785fad") + (property "Reference" "C24" + (at 227.33 66.04 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "100pF 50V" + (at 229.87 63.5 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 234.95 66.3448 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 231.14 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 231.14 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "710-885012008043" + (at 231.14 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 231.14 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "df62dc28-bd89-4b01-a09d-b4cca1b914c5") + ) + (pin "1" + (uuid "b92a9c92-ae2f-4425-a6c8-29d7e6a5192d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Polarized") + (at 375.92 224.79 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9a4d4e49-5595-496c-8782-5c1813b9587b") + (property "Reference" "C142" + (at 378.841 222.6889 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "100uF 6V" + (at 378.841 225.1131 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_THT:CP_Radial_D10.0mm_P5.00mm" + (at 376.8852 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 375.92 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 375.92 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "667-ECA-1EM101" + (at 375.92 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 375.92 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b1418361-b8bd-4ee1-998c-25eae0e408eb") + ) + (pin "1" + (uuid "54040406-6a7a-4393-8a06-3731ef415298") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C142") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 67.31 163.83 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "9b6a0b71-527d-4e7e-a42a-ec634a62ffa9") + (property "Reference" "#PWR035" + (at 67.31 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 67.31 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 67.31 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 67.31 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "d97bb63b-bc2f-44ab-808b-1805046e8f30") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR035") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 78.74 78.74 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9c3a9181-b00e-4791-a87e-8fa182619bfc") + (property "Reference" "#PWR0193" + (at 78.74 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 81.28 80.01 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 78.74 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 78.74 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 78.74 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "50b16208-d460-4bf7-aa43-d143d686e082") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0193") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 262.89 168.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9cc38e6d-55e2-48b9-b2be-88e30f5534c2") + (property "Reference" "#PWR013" + (at 262.89 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 265.43 170.18 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 262.89 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 262.89 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 262.89 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "f5e8158b-0ce9-4d7f-b0da-d9e5864645dc") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR013") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 313.69 22.86 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9d897590-a3bc-470b-b7e3-d2b7e613fa6f") + (property "Reference" "J13" + (at 314.96 16.51 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "ANT-3" + (at 316.23 19.05 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 313.69 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 313.69 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 313.69 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 313.69 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 313.69 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "387f1653-c1ca-44a8-b94c-77d34e95e53b") + ) + (pin "2" + (uuid "24166d6a-eb07-4db4-bdb7-79b2a2434904") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 97.79 254 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9da2b627-2c44-4380-a347-af80bd756c70") + (property "Reference" "#PWR0186" + (at 97.79 260.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 95.25 255.27 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 97.79 254 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 97.79 254 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 97.79 254 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "a2a958b2-60b4-4be9-bc68-c6f3dbb44d51") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0186") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 151.13 269.24 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9e4980d5-e1ec-4aa1-96ce-1eca6ea4950e") + (property "Reference" "R12" + (at 156.2903 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "2k2" + (at 153.8661 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 149.352 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 151.13 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 151.13 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" " 71-CRCW12062K20JNEAC" + (at 151.13 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 151.13 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a2eee8be-7858-4820-bf59-6179d226cce3") + ) + (pin "1" + (uuid "f12917cb-e6cc-42e8-819b-31c2e34752d7") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Relay:Relay_SPDT") + (at 344.17 46.99 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9fd9ac6c-d271-4bd3-8c4b-d5ebd950a273") + (property "Reference" "K7" + (at 350.52 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "HF41F/12-ZS" + (at 353.06 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" + (at 345.44 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 344.17 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 344.17 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 344.17 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 344.17 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "A1" + (uuid "dd7b2aa1-9e99-482a-a517-109e8bc4cc9f") + ) + (pin "12" + (uuid "bb64fa25-cd07-4d6e-9cdc-1fc676d42b60") + ) + (pin "14" + (uuid "f7d86579-4905-4f0a-8be6-0581f6610190") + ) + (pin "A2" + (uuid "f635c1b3-fbc6-4aa1-96bc-8140fde0334a") + ) + (pin "11" + (uuid "61212d00-c23a-47bc-a06a-74ec4d5e35b5") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 243.84 72.39 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a1553a73-42c5-47a9-aca6-159ed9a99148") + (property "Reference" "C15" + (at 242.57 66.04 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1000pF 50V" + (at 242.57 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 247.65 71.4248 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 243.84 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-KGM31BCG1H102JT" + (at 243.84 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 243.84 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8b0292d1-bdeb-4ad0-9933-dc6e19177044") + ) + (pin "1" + (uuid "bb5e6af3-df6a-4341-a325-9d9f231cb751") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 43.18 96.52 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a1bc35da-819e-43ec-9be5-52033299fffe") + (property "Reference" "#PWR0221" + (at 43.18 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 45.72 97.79 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 43.18 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 43.18 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 43.18 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "18cd9427-2030-4ed3-a17d-21f8d3a8b3de") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0221") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:TC4428") + (at 344.17 99.06 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a2f37917-bb4f-4ede-95f9-a9b32bc6893d") + (property "Reference" "U18" + (at 341.9759 89.8357 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TC4428" + (at 341.9759 92.2599 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 344.17 119.38 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://ww1.microchip.com/downloads/en/DeviceDoc/20001422G.pdf" + (at 344.17 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 344.17 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "579-TC4428ACOA713" + (at 344.17 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 344.17 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "734ccbb1-5d31-4bad-b798-199920f1a819") + ) + (pin "4" + (uuid "e169e98d-5883-45d7-856b-e6fc87524110") + ) + (pin "3" + (uuid "b9994737-8bec-4caf-85d9-c7c9442fb12b") + ) + (pin "7" + (uuid "41cb328c-fe2f-4033-9eef-f9011cffbc04") + ) + (pin "6" + (uuid "4de6583a-ba58-44c9-8c3b-269cfe8e37dd") + ) + (pin "1" + (uuid "408e6770-e728-46bc-a305-98b626e2e4ce") + ) + (pin "8" + (uuid "672ed881-4c83-4fcb-b617-126a7a1035bc") + ) + (pin "5" + (uuid "e440b2ff-6595-43c5-b884-c36942988bb1") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 243.84 87.63 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a3420a4b-0720-4454-a1d3-cce04f0e0da0") + (property "Reference" "#PWR0174" + (at 243.84 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 243.84 91.7631 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 243.84 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 243.84 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "13b9d5b8-1430-4f79-9b34-3216cec74fc8") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0174") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 387.35 220.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a349dbe8-af76-4ad3-97d6-c4c08a2932f0") + (property "Reference" "#PWR08" + (at 387.35 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 387.35 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 387.35 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 387.35 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 387.35 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "a610f717-fc21-4d84-aa4c-57ddd4a39054") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR08") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 95.25 29.21 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a366f573-63af-49ac-8b07-1cf76116fdd3") + (property "Reference" "U3" + (at 95.25 18.7157 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 95.25 21.1399 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 95.25 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 95.25 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 95.25 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 95.25 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 95.25 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "da84df70-c962-476f-b1f3-0b87c05d9478") + ) + (pin "6" + (uuid "049da1c1-3487-4276-ad62-9fff522f8282") + ) + (pin "4" + (uuid "19d7e13a-8642-4c10-9bed-2b035a5e7a7d") + ) + (pin "1" + (uuid "1aa1ee31-7426-4851-99fc-c6485c19cc09") + ) + (pin "2" + (uuid "c0f6e662-6a51-4083-aabf-7432b0ace046") + ) + (pin "3" + (uuid "be305495-fde8-40f1-8aa6-34b1796d532f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 29.21 278.13 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a3c2878c-5142-441b-a2af-fdf325c9dbdd") + (property "Reference" "JP3" + (at 29.21 275.5209 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 29.21 275.5209 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 29.21 278.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 29.21 278.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 29.21 278.13 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 29.21 278.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 29.21 278.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5737e4d3-3e82-46cf-a4da-c943b02724fa") + ) + (pin "1" + (uuid "a828af9a-4ecc-4fad-b4bc-d786988b5ed0") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "JP3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 226.06 199.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a3d1b690-6d1a-4ef6-ba7e-1653d76093a0") + (property "Reference" "#PWR014" + (at 226.06 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 228.6 201.93 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 226.06 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 226.06 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "02893be0-7fbd-4f54-a9f2-845effb5e6ab") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR014") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 349.25 199.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a6c6827b-ddc2-4447-acd2-f2107ab84f50") + (property "Reference" "#PWR03" + (at 349.25 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 349.25 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 349.25 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 349.25 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 349.25 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "a52c5e0c-ff4c-4061-82e2-27df88e758f0") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR03") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 308.61 110.49 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a72b49b5-ea37-45a9-bf0e-9747842894f6") + (property "Reference" "C21" + (at 306.07 106.68 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 306.07 116.84 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 307.6448 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 308.61 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 308.61 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 308.61 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 308.61 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9ecec168-623b-4d36-979c-26b4ff50f04b") + ) + (pin "1" + (uuid "8db8395a-103c-4d0f-af4e-14fe780ca646") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 163.83 171.45 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a9683b19-bb37-4a9c-a35c-b038c1c4cdd7") + (property "Reference" "#PWR0213" + (at 163.83 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 166.37 172.72 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 163.83 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 163.83 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 163.83 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "09978372-5817-40db-8286-c92196bf9478") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0213") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 57.15 93.98 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "abeae3c1-95c9-43cd-92cd-ee5978692f4d") + (property "Reference" "J5" + (at 54.61 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FROM ATTN" + (at 62.23 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 57.15 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 57.15 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 57.15 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 57.15 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 57.15 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "94e8a90e-b31b-4400-8711-8410b9b99671") + ) + (pin "2" + (uuid "ada51eff-cacb-4b08-92db-d304169bf958") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 69.85 26.67 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ac19a7dc-4978-4c67-9e6d-37a7104e548d") + (property "Reference" "J3" + (at 71.12 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FROM TX" + (at 67.31 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 69.85 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 69.85 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 69.85 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 69.85 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 69.85 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3edc8efa-c6a6-499a-b6ed-f5f8892fe511") + ) + (pin "2" + (uuid "5c365fe1-3af7-448e-85fd-e2bce9770750") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 69.85 64.77 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ad3b491d-153f-4fa2-8142-93f6d7f4ff71") + (property "Reference" "#PWR0170" + (at 69.85 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 72.39 66.04 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 69.85 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 69.85 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 69.85 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "492c4300-e967-4541-8ced-ab716fdacfee") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0170") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x05_Socket") + (at 274.32 86.36 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ad6ee1b6-cae6-4841-a548-aa809d38b184") + (property "Reference" "J16.2" + (at 275.0312 85.1479 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TRANSMIT" + (at 275.0312 87.5721 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x05_P2.54mm_Vertical" + (at 274.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 274.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 274.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 274.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 274.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "4" + (uuid "08df2393-76a8-4fe4-a6db-1ea040852779") + ) + (pin "3" + (uuid "c666f830-d317-42e5-b8e6-a7bf9566bbfa") + ) + (pin "1" + (uuid "5806dce7-138d-4f19-8049-b31bd93444e4") + ) + (pin "2" + (uuid "43eb7c4e-018b-4734-af20-3e310ade4c23") + ) + (pin "5" + (uuid "3ad4e7bf-8b2b-489d-9fda-9c4312de6ae5") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J16.2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 57.15 193.04 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ad96afb6-dec0-45d9-96f1-f2bffe571256") + (property "Reference" "R10" + (at 53.34 190.5 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 57.15 190.3039 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 57.15 194.818 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 57.15 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 57.15 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "667-ERJ-8GEY0R00V" + (at 57.15 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 57.15 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "32654485-90d1-4e20-9253-94a1630c0dea") + ) + (pin "1" + (uuid "91c5797b-b430-4f32-9784-fb7224006f83") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 156.21 128.27 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ae23fcf2-2f71-4dcb-b017-bf0a0b5a8ed3") + (property "Reference" "#PWR0201" + (at 156.21 132.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 156.21 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 156.21 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 156.21 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 156.21 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "c4287cd9-e4bc-4961-8dc7-3ed7ec38fdab") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0201") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 132.08 53.34 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b2748925-d821-4ccd-a27b-959199284bcd") + (property "Reference" "#PWR0171" + (at 132.08 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 134.62 54.61 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 132.08 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 132.08 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "ccc946c8-2358-4d9a-b55f-aeb8ac1426ad") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0171") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D_Zener") + (at 229.87 143.51 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b4550181-f339-4e6c-ada6-0a8ad88b7fb4") + (property "Reference" "D1" + (at 229.87 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "BAS70H,115" + (at 229.87 140.5199 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Diode_SMD:D_SOD-123F" + (at 229.87 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 229.87 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 229.87 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "771-BAS70H-T/R" + (at 229.87 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 229.87 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ca0c2c5a-97ad-47a7-b186-97d4bed8ecb4") + ) + (pin "1" + (uuid "216f2f99-4038-4b01-9d99-6af847457e65") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "D1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 247.65 212.09 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b5fbe8c1-9781-4709-b331-6654a1205f10") + (property "Reference" "#PWR018" + (at 247.65 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 247.65 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 247.65 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 247.65 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 247.65 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "674d943f-d4c0-4236-a0f4-39a13a56b031") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR018") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 222.25 228.6 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b5fc3161-e356-4fd8-97d3-24176586c2f5") + (property "Reference" "R25" + (at 219.71 228.6 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "~" + (at 219.5139 228.6 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 224.028 228.6 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 222.25 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "755-SFR18EZPF56R0" + (at 222.25 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 222.25 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1cdb7b0e-62aa-4158-a35f-f63f5b66b4a6") + ) + (pin "1" + (uuid "fec35b8f-0c65-4806-908b-4f457dcc6abe") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R25") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 154.94 24.13 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b6629c1f-6da0-475f-b548-7e350b6ef654") + (property "Reference" "C7" + (at 153.67 17.78 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 153.67 20.32 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 158.75 23.1648 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 154.94 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 154.94 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 154.94 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 154.94 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "dd756472-5fad-4c4f-bfa6-19d66d9be886") + ) + (pin "1" + (uuid "75e867e9-860e-4ea1-a84f-3a28a6b7fa12") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 43.18 76.2 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b95c918f-f052-4213-abc6-4a3959aa0d87") + (property "Reference" "#PWR0222" + (at 43.18 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 43.18 72.0669 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 43.18 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 43.18 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 43.18 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "482f9e28-1d3e-4c94-a15d-46c78593cb82") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0222") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 29.21 213.36 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b97744a5-1d3d-4ff2-a909-7e33f45e0f60") + (property "Reference" "#PWR0159" + (at 29.21 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 26.67 214.63 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 29.21 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 29.21 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 29.21 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "e1f4c2ba-eb42-49b0-a9db-f95aef6b3d05") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0159") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:AD7991YRJZ") + (at 294.64 215.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "badc0d9e-ae45-426a-93c4-90e79de02abe") + (property "Reference" "U20" + (at 294.64 205.4057 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AD7991YRJZ" + (at 294.64 207.8299 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-23-8" + (at 297.815 240.665 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD7991_7995_7999.pdf" + (at 295.91 222.885 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 294.64 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "584-AD7991YRJZ0500R7" + (at 294.64 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 294.64 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "7" + (uuid "928867c3-fe4d-4b64-b502-8096dacb700f") + ) + (pin "3" + (uuid "3b647e92-f275-4722-9c13-a6c453f91a63") + ) + (pin "1" + (uuid "3be42aa4-ae51-48e6-af5b-2f5ccc919649") + ) + (pin "8" + (uuid "d82bc560-dd0c-4ddd-b775-6b5b1c7c1f63") + ) + (pin "5" + (uuid "89deb1a7-9da8-44c6-9081-9e8c45558f84") + ) + (pin "2" + (uuid "207350ba-e442-403d-9ce4-5732c7c9481e") + ) + (pin "6" + (uuid "5f2f798d-1bc6-48f5-9962-3fd8f2747011") + ) + (pin "4" + (uuid "4feea47e-aa97-4d83-b916-1c5c920a6604") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:IDC_2x5") + (at 107.95 274.32 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bae9ff6b-a28f-49ad-bd0e-7d8a0d1fedf4") + (property "Reference" "J1" + (at 109.22 263.8257 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LPF ACC Control" + (at 109.22 266.2499 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 107.95 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 107.95 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 107.95 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 107.95 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "A-2939" + (at 107.95 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "9" + (uuid "c7bce505-2302-4648-abc5-2dc8a2c51de4") + ) + (pin "5" + (uuid "070546eb-cff7-48b9-bffa-ba9bd5cc55f7") + ) + (pin "2" + (uuid "2074d324-298d-46c3-ae29-127235403f90") + ) + (pin "4" + (uuid "6c4d54b2-5b69-441e-ba8c-856ca77f464b") + ) + (pin "6" + (uuid "898b760f-5042-4b61-9fac-e303b4d04785") + ) + (pin "10" + (uuid "3eec4526-bf6c-4cef-b069-b7873dd45ea9") + ) + (pin "7" + (uuid "dad91f95-83a6-457d-966a-67c260b4230e") + ) + (pin "3" + (uuid "d27f538f-0bda-4da5-a718-4c074086b786") + ) + (pin "1" + (uuid "9d5c4f49-f37c-4872-9d38-b3010f1d0f49") + ) + (pin "8" + (uuid "7efdb648-c675-4d03-b932-87e3b21f8169") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 251.46 240.03 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bb81483f-9431-4a1c-917f-a61f4afc4b99") + (property "Reference" "C152" + (at 254.381 238.8179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 254.381 241.2421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 252.4252 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 251.46 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 251.46 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 251.46 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 251.46 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "53b86f7c-de87-4658-bebe-cd3aa69cab82") + ) + (pin "1" + (uuid "24f637f2-0366-489f-93ad-7557fdc2c560") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C152") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Interface_Expansion:MCP23017_SO") + (at 43.18 241.3 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "be78c7fa-7acb-4708-bf02-da31ab966ee3") + (property "Reference" "U15" + (at 45.3741 214.2957 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "MCP23017_SO" + (at 45.3741 216.7199 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-28W_7.5x17.9mm_P1.27mm" + (at 48.26 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf" + (at 48.26 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "" + (at 43.18 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "579-MCP23017-E/SO" + (at 43.18 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 43.18 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "7" + (uuid "f75edbfa-c17e-4269-8b87-8631ff9edfd1") + ) + (pin "16" + (uuid "a9446cbb-311a-4721-9a9c-2582eae48c37") + ) + (pin "5" + (uuid "97a967b5-c298-4c4e-ae9c-17cc1f22221e") + ) + (pin "12" + (uuid "e2d931fe-b7fb-4e0d-9600-21abd89946e1") + ) + (pin "9" + (uuid "c27dc888-7ae0-4486-b289-231f16c35d90") + ) + (pin "17" + (uuid "eb5e221d-fdeb-4e51-af22-b705e98c3252") + ) + (pin "23" + (uuid "59dff5f9-d3ea-4034-b753-d2287ce9decd") + ) + (pin "4" + (uuid "8e918c95-e020-4eb0-872e-af9bc0d2925d") + ) + (pin "28" + (uuid "4d1a67b0-02fb-410f-8137-29ced1a864da") + ) + (pin "22" + (uuid "c16912c3-bbd7-4b91-b499-1fee7678bc9e") + ) + (pin "18" + (uuid "af1223aa-21c3-4fdd-9eef-048dd2ecca80") + ) + (pin "8" + (uuid "fe86e42f-5510-4e2d-b1ea-1fc0cb096fac") + ) + (pin "24" + (uuid "a8b6c947-9669-4ece-a2ea-2c8dad04da55") + ) + (pin "15" + (uuid "f74d41cf-314c-43a7-92b2-37d5f159cef9") + ) + (pin "3" + (uuid "f2045a88-7a88-4c59-871a-6173306f264e") + ) + (pin "14" + (uuid "e7aa09e8-d3cc-4329-bd75-d266b0d82194") + ) + (pin "25" + (uuid "8b45ff64-0032-4efc-90ad-c9cb2608aa85") + ) + (pin "6" + (uuid "96b4f2b7-d669-4d2e-8993-8709d29c207d") + ) + (pin "27" + (uuid "bf6a2121-1ce5-4551-9a3b-f4474f31f360") + ) + (pin "20" + (uuid "369ea33e-9947-4df2-8800-c97de90a2fc9") + ) + (pin "21" + (uuid "787a187d-cba5-4b6a-b87c-7a7dc7bc3bc1") + ) + (pin "10" + (uuid "dc23a306-a57c-45a8-830d-1778afcae20c") + ) + (pin "19" + (uuid "3f22b936-20a8-4026-8602-cbce12392251") + ) + (pin "26" + (uuid "b2903759-e321-4765-b1d3-ae6a1c846e5e") + ) + (pin "1" + (uuid "501c1f05-c8bc-4d33-8a8a-cd85b577dc82") + ) + (pin "2" + (uuid "3bae82ca-459b-4f3e-b152-c62d119fd399") + ) + (pin "11" + (uuid "19976dea-4c13-42d6-a528-e04eeb766a46") + ) + (pin "13" + (uuid "4b5b0cb1-1c52-4245-bdcd-9f7e5b82bf2c") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 288.29 193.04 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c280a6ca-63c5-4151-813c-92e4faff29b6") + (property "Reference" "#PWR026" + (at 288.29 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 288.29 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 288.29 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 288.29 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 288.29 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "ca44198e-a341-4053-a351-9467bfe89761") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR026") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 35.56 213.36 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c3234927-c5c0-4625-88b3-01c85abfd99e") + (property "Reference" "C141" + (at 36.83 207.01 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 36.83 209.55 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 31.75 212.3948 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 35.56 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 35.56 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 35.56 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 35.56 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a68e0396-45e7-4265-94a1-860d43f1964d") + ) + (pin "1" + (uuid "56e2ffd5-c7be-4382-a4da-c47af9e78da2") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C141") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 295.91 196.85 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c3e8a35e-20a2-4222-be87-fd54d2f82064") + (property "Reference" "C151" + (at 302.1442 195.58 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 299.72 195.58 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 296.8752 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 295.91 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 295.91 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 295.91 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 295.91 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "585ae1ee-cdd7-4323-86c4-f54ca7f47c4a") + ) + (pin "1" + (uuid "9753a800-ee2b-45a8-a029-8455efe5d2cf") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C151") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D_Zener") + (at 231.14 256.54 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c4ab2b5d-3a8c-42f9-9a57-d110d7c1e2b9") + (property "Reference" "D2" + (at 231.14 251.1257 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "BAS70H,115" + (at 231.14 253.5499 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Diode_SMD:D_SOD-123F" + (at 231.14 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 231.14 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 231.14 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "771-BAS70H-T/R" + (at 231.14 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 231.14 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ad8e443c-7d0e-4c40-a688-4aaf0bafe481") + ) + (pin "1" + (uuid "aa95f698-c10b-44c2-a5e7-5baf89864136") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "D2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 97.79 39.37 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c4f5e6fa-a4f0-43ff-bf37-55e95020933d") + (property "Reference" "#PWR0168" + (at 97.79 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 100.33 40.64 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 97.79 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 97.79 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 97.79 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "d992a626-3977-43ed-a1d4-9057df66b766") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0168") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:ULN2803C") + (at 121.92 204.47 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c5226a2d-89bc-4627-a345-09fae7a7f971") + (property "Reference" "U10" + (at 113.03 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ULN2803C" + (at 121.92 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-20W_7.5x12.8mm_P1.27mm" + (at 123.19 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/uln2803c.pdf" + (at 125.73 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 121.92 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "7" + (uuid "226a56ba-7560-4eb7-bcbb-b29952f7e787") + ) + (pin "17" + (uuid "b77f42dc-df91-417d-b064-1cbdd681b548") + ) + (pin "8" + (uuid "553afd6e-7d5e-45f6-a969-b19b016e11a0") + ) + (pin "15" + (uuid "ea87fc48-b56a-4ebc-ac5e-00196586f6ed") + ) + (pin "14" + (uuid "9bbafb96-345d-494b-a0cd-6476e98a4f21") + ) + (pin "2" + (uuid "6140e660-7666-49c3-a3d5-572c596b663e") + ) + (pin "13" + (uuid "5f5c48a9-f975-4272-8581-2ff6c7f452e5") + ) + (pin "16" + (uuid "8bd4a891-1108-45ae-bee9-30e64bcf5cbf") + ) + (pin "1" + (uuid "96514fd9-b961-4704-af38-6c19de2af63b") + ) + (pin "9" + (uuid "7ab4047f-a49b-4809-a069-8c03cce39cc4") + ) + (pin "12" + (uuid "0826744f-d63a-4d6b-bc35-15b394f148e3") + ) + (pin "11" + (uuid "700b30e8-9e27-442b-9b54-59e7336f5538") + ) + (pin "10" + (uuid "e7aecfa6-ce4a-46e1-8a59-b14705bde073") + ) + (pin "5" + (uuid "17814037-11bf-432b-b58a-d43e481af73e") + ) + (pin "3" + (uuid "019363be-2527-4007-9df5-4cd96891bee2") + ) + (pin "4" + (uuid "28ffb946-a2e2-4695-9e5a-bbf4a05ebc9e") + ) + (pin "18" + (uuid "6d86d450-46fe-451b-8bc7-5f20b3985ad7") + ) + (pin "19" + (uuid "d789b100-d44f-4cd3-8320-b03f64ff8814") + ) + (pin "6" + (uuid "1dd7f4ba-821b-487c-95ff-f759c7e8c6fe") + ) + (pin "20" + (uuid "baa57208-dc1c-461f-bc5f-8dd40251e8d9") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 393.7 203.2 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c52bcf02-fa97-4690-844c-4389556be5fd") + (property "Reference" "C133" + (at 396.621 201.9879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "1uF 50V" + (at 396.621 204.4121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 394.6652 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 393.7 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 393.7 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "187-CL31B105KBHNNNE" + (at 393.7 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 393.7 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b19c0c22-7354-425d-bd22-fd9e092f91d2") + ) + (pin "1" + (uuid "8a242c14-d1b1-4a89-9df4-2303d8fe030e") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C133") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 107.95 36.83 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c5e1218e-ccbe-4d78-87aa-ff945244033b") + (property "Reference" "C10" + (at 114.3 38.1 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 111.76 38.1 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 108.9152 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 107.95 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 107.95 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 107.95 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 107.95 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "36596b07-f5b5-4135-a24c-3a04279b0ffa") + ) + (pin "1" + (uuid "16846492-af96-4b0b-9eae-5c3406adf82d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 165.1 45.72 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "caca3c3f-0943-48d6-98ff-055bc5bb6eaf") + (property "Reference" "#PWR0172" + (at 165.1 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 162.56 46.99 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 165.1 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 165.1 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "99eca6d8-1294-4042-82fc-4c1c26fe861f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0172") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 29.21 267.97 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ce5c5963-165d-4693-87db-1b7426b29de5") + (property "Reference" "JP1" + (at 29.21 265.3609 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 29.21 265.3609 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 29.21 267.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 29.21 267.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 29.21 267.97 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 29.21 267.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 29.21 267.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f6fefdc3-780b-49c2-9416-094dc74b1279") + ) + (pin "1" + (uuid "bd9f3abf-8b6d-4669-81da-e84780363f99") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "JP1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 83.82 248.92 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ce5db429-9b1c-485e-b675-eddac168c1bd") + (property "Reference" "#PWR0187" + (at 83.82 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 81.28 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 83.82 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 83.82 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 83.82 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "b1602d71-81ae-4f6e-8dd7-96956f8d8981") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0187") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 123.19 96.52 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d0e4e6e1-b2df-4ead-bf05-0e07d8e6668e") + (property "Reference" "J7" + (at 128.27 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TO 20W PA" + (at 124.46 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 123.19 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 123.19 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 123.19 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 123.19 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4ba7f07d-5130-41cc-9055-832dccbb3973") + ) + (pin "2" + (uuid "02aabee3-6f6b-4947-9ad3-eeac93a3cb35") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 21.59 240.03 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d163d46f-2a18-4a00-9b30-645889691299") + (property "Reference" "R15" + (at 21.59 240.03 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "2k2" + (at 18.8539 240.03 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 23.368 240.03 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 21.59 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 21.59 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" " 71-CRCW12062K20JNEAC" + (at 21.59 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 21.59 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "108365b1-3e55-40a0-b2c6-3ecf7e0112f8") + ) + (pin "1" + (uuid "cb2a392f-0476-4876-a6e8-832c9692a982") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 387.35 67.31 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d1d807ab-1f31-4840-9867-4e9f576d5b77") + (property "Reference" "#PWR0220" + (at 387.35 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 387.35 71.4431 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 387.35 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 387.35 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 387.35 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "195e3f56-551f-432f-835d-22c787158024") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0220") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 304.8 247.65 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d26cde39-4144-4093-9523-3c1d8ed756e0") + (property "Reference" "#PWR029" + (at 304.8 254 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 307.34 248.92 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 304.8 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 304.8 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 304.8 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "c6b8426d-d2dc-44d0-ab97-6fbc9e4b117e") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR029") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 132.08 191.77 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d2710aca-b6cb-405b-a12d-ccf7cdf23fd2") + (property "Reference" "#PWR043" + (at 132.08 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 128.27 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 132.08 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 132.08 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "be7160c7-dc71-4747-931d-c5eea5b29329") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR043") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:AD8307") + (at 255.27 224.79 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d2e38859-e91a-4216-bd6b-9ec642e2abba") + (property "Reference" "U19" + (at 263.017 224.2129 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "AD8307" + (at 263.017 226.6371 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 258.445 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 259.08 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 255.27 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "584-AD8307ARZ-R7" + (at 255.27 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 255.27 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "8c4ed255-08dc-4ad3-b073-3d9e6ca82baf") + ) + (pin "2" + (uuid "a6927fd3-c59f-4c93-a66f-dbd0d824ac37") + ) + (pin "7" + (uuid "64dbfddc-36d8-40db-9bc0-449e133786ee") + ) + (pin "8" + (uuid "c3ef9061-0dd8-4c83-bd06-08fb882f54d6") + ) + (pin "6" + (uuid "a5a00db8-c573-4df3-9133-6a892b7fcb33") + ) + (pin "5" + (uuid "446bc493-a012-450b-a1c9-160853e4c44c") + ) + (pin "4" + (uuid "bc8cc578-1752-4f6d-a250-b99efd762c9f") + ) + (pin "1" + (uuid "c88a7065-311e-44cf-835a-77303f88aea7") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 295.91 200.66 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d3e5b44f-9be0-41f8-8fb3-0edd218a947c") + (property "Reference" "#PWR027" + (at 295.91 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 298.45 203.2 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 295.91 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 295.91 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 295.91 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "a2fcbd6b-acc6-43ea-9a40-c3784eac8d7f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR027") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 123.19 123.19 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d5370177-59f0-44e7-8c1a-ea1ec1a1a677") + (property "Reference" "#PWR0197" + (at 123.19 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 125.73 124.46 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 123.19 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 123.19 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "ecf40047-47f7-46d2-aa16-fde4c812759d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0197") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole_Pad") + (at 392.43 62.23 270) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d92c0f14-895f-4c24-a61b-f9a6785a530d") + (property "Reference" "H1" + (at 396.24 62.23 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 396.24 63.4421 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_4.3mm_M4_DIN965_Pad" + (at 392.43 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 392.43 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 392.43 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 392.43 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 392.43 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6b005369-59c2-4585-b3ef-905fd441e99a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 127 53.34 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d92ee1a8-eedb-451a-9ac8-39279ba46f63") + (property "Reference" "J18" + (at 134.62 49.53 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FROM BPF" + (at 138.43 46.99 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 127 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 127 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 127 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 127 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 127 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "328abb36-19c3-4bdb-a0b0-3042c42df04f") + ) + (pin "2" + (uuid "51bd0c48-cc43-411d-8d9c-6de8ae4d3759") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 138.43 191.77 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dad0bbf4-9a9f-4d62-8fe2-ab66ff036ca8") + (property "Reference" "C129" + (at 138.43 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 137.16 187.96 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 142.24 190.8048 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 138.43 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 138.43 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 138.43 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 138.43 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e5299f5e-09c7-4182-bdc1-13560bc4c32c") + ) + (pin "1" + (uuid "daf3adeb-b532-499d-98d4-8d8c726e6eed") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C129") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 82.55 242.57 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "db3f16d9-998c-44d1-8cd0-dec663f32a4b") + (property "Reference" "#PWR0185" + (at 82.55 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 80.01 243.84 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 82.55 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 82.55 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 82.55 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "c8b730f3-ff12-407b-b157-8e55b36ef74f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0185") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 273.05 255.27 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dc9fbc81-a09b-429c-9a28-ea7ba69c64f4") + (property "Reference" "R29" + (at 278.2103 255.27 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k" + (at 275.7861 255.27 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 271.272 255.27 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 273.05 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 273.05 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "652-CR1206JW-103ELF" + (at 273.05 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 273.05 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a533d68e-c2c1-4ac0-8f79-546508e49475") + ) + (pin "1" + (uuid "7467022c-47a6-40bb-983c-df90837dc9a0") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R29") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 318.77 22.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dcbf7514-0ae3-428f-a473-651bba0d32ab") + (property "Reference" "#PWR0181" + (at 318.77 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 321.31 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 318.77 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 318.77 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 318.77 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "cee2c9a4-9ec3-4ad2-8375-b3920169e5d8") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0181") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 57.15 99.06 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "decaf8d0-3edc-4fcd-8757-1c9cff802a6b") + (property "Reference" "#PWR0192" + (at 57.15 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 59.69 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 57.15 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 57.15 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 57.15 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "c63f5fff-fa5d-4f44-a11d-e01b69c3082d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0192") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 251.46 196.85 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "df8374ec-5f35-4a04-a1d8-2249b0d0691b") + (property "Reference" "C139" + (at 254.381 195.6379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 254.381 198.0621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 252.4252 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 251.46 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 251.46 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 251.46 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 251.46 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5ac12c7a-b86a-440c-880c-24721ab7eb50") + ) + (pin "1" + (uuid "848737a9-9a47-4e9a-8b79-2c50cdd2396a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C139") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 254 200.66 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e0015bcb-5a69-429d-965f-5a96b55248ce") + (property "Reference" "#PWR011" + (at 254 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 256.54 203.2 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 254 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 254 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 254 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "a2e5571b-3a34-4653-8f2d-29da14373d4f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR011") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:CD74HC4514M96") + (at 82.55 189.23 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e27cc0a3-b63e-4297-b9b4-931297ce782d") + (property "Reference" "U12" + (at 84.7441 163.4957 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "CD74HC4514M96" + (at 84.7441 165.9199 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-24W_7.5x15.4mm_P1.27mm" + (at 105.41 214.63 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/cd74hc4514.pdf" + (at 80.01 151.765 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 82.55 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "595-CD74HC4514M96" + (at 82.55 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 82.55 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "67224f65-4012-48dc-9f0b-2d48054f3013") + ) + (pin "9" + (uuid "95ef6b60-bf72-4fa3-b4a3-fbe96aea96bf") + ) + (pin "14" + (uuid "baff5457-a404-4836-bfc6-7cf5075ebee7") + ) + (pin "24" + (uuid "9ddcb118-ef9f-4fbf-864a-27a0b78eb5eb") + ) + (pin "23" + (uuid "36606119-d158-408c-b5d1-f63493dfa7bf") + ) + (pin "6" + (uuid "3eaea381-81f0-4ff1-8313-cb25c58f152b") + ) + (pin "15" + (uuid "fa55d997-23fb-4107-8e2c-788e5885b481") + ) + (pin "2" + (uuid "b7a161d0-2e0e-4985-9ac2-5383191bf8b4") + ) + (pin "5" + (uuid "645c0f8d-27c2-450f-a403-03a644a4a3ff") + ) + (pin "21" + (uuid "293f47fc-af56-45ca-a69d-e57ba9b9e293") + ) + (pin "20" + (uuid "5f4f0849-4c62-4c5f-8d10-43108259170f") + ) + (pin "19" + (uuid "2621e9fb-59e6-4933-8d7d-fab0bad43699") + ) + (pin "4" + (uuid "379bb53c-ce60-4b8e-a2b0-467165202919") + ) + (pin "18" + (uuid "8b694442-6859-4d67-a11f-d8d4eb21dabf") + ) + (pin "22" + (uuid "acc54f86-0f63-417b-b639-2ecb80dc5807") + ) + (pin "17" + (uuid "a1f4cc7e-1bc9-4b41-83a6-df3573f419d8") + ) + (pin "3" + (uuid "dbc617fb-2e63-43d5-ae83-428ea4fe8699") + ) + (pin "13" + (uuid "011fce33-e483-433e-a7c8-bed1eec6778a") + ) + (pin "10" + (uuid "2f341bdf-54ca-4521-abb6-6f7abcbb78e3") + ) + (pin "8" + (uuid "c1f1c431-0ce5-4771-b50c-f85db79e5f82") + ) + (pin "11" + (uuid "111a9002-9cef-4a37-a23c-c386c54be7e5") + ) + (pin "12" + (uuid "30e97f38-87d2-445e-8947-98cf4e6121ca") + ) + (pin "16" + (uuid "733905be-7bfa-4049-a5c0-983a7a6f25cd") + ) + (pin "7" + (uuid "7892a9ff-b5e2-46bf-bbfe-5479ced7fa78") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 332.74 90.17 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e3406af7-faf3-46bf-a471-c4926d07bf98") + (property "Reference" "#PWR033" + (at 332.74 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 330.2 92.71 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 332.74 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 332.74 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 332.74 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "6c8d7396-8ca7-457d-99c8-2da7fd301bcd") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR033") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 73.66 91.44 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e5d99e8b-05e2-4e0d-81f1-6d1d44f2be23") + (property "Reference" "U21" + (at 73.66 101.9343 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 73.66 99.5101 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 73.66 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 73.66 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 73.66 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 73.66 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 73.66 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "5650a5a8-2b71-458c-a86c-081e320a47ce") + ) + (pin "6" + (uuid "c1c3d9f3-cb6c-43d3-9984-895c2fad50d4") + ) + (pin "4" + (uuid "de24d876-81fa-4e86-bdd3-456754cf310d") + ) + (pin "1" + (uuid "60e842ff-018d-49c4-9fd4-ab5c837b4476") + ) + (pin "2" + (uuid "7c50c88c-e2d1-477c-b67e-525e46c9b359") + ) + (pin "3" + (uuid "0d1f5731-3afb-42e7-9801-03266569ece2") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 142.24 191.77 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e7406775-1d99-46eb-b0b5-1d515ebc789e") + (property "Reference" "#PWR041" + (at 142.24 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 144.78 193.04 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 142.24 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 142.24 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 142.24 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "dd2ff921-b489-4b63-a96d-8c3f4f210bbb") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR041") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 208.28 213.36 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e7b348d6-f4f0-4171-9127-c7243e8c2532") + (property "Reference" "#PWR021" + (at 208.28 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 210.82 215.9 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 208.28 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 208.28 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 208.28 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "19b571fd-c965-499b-8e26-562651015b8d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR021") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 162.56 199.39 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e86edf67-fc51-4b08-8f91-85be21994f8a") + (property "Reference" "#PWR0214" + (at 162.56 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 166.37 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 162.56 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 162.56 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 162.56 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "f6f2b62f-dc9e-481f-a31c-ec5fffc66d62") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0214") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 306.07 218.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "eb10846d-fc8e-44ea-897f-d9cd5322d0df") + (property "Reference" "#PWR025" + (at 306.07 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 308.61 219.71 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 306.07 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 306.07 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 306.07 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "e5e3f37f-7fae-4951-b34b-ebb7b71f0dbf") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR025") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 170.18 57.15 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ecb283fb-92d2-4def-8639-566726e7eec5") + (property "Reference" "U8" + (at 170.18 67.6443 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 170.18 65.2201 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 170.18 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 170.18 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 170.18 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 170.18 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 170.18 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "6656dd5e-8a3d-46cc-a96d-9f0f2e2573b9") + ) + (pin "6" + (uuid "ac687703-2c56-4769-8ac4-c2bc1e8abfee") + ) + (pin "4" + (uuid "4fbce1c0-1a0a-4081-b7bc-2b6592a8cb47") + ) + (pin "1" + (uuid "380b9cf9-142e-44b4-a9e3-6019e1dfd40c") + ) + (pin "2" + (uuid "4d0f16e4-a12b-45e5-aaff-bd222f6ba32a") + ) + (pin "3" + (uuid "53edfe3f-9d7d-4f2a-83f7-6a0e8a313a41") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Relay:Relay_SPDT") + (at 184.15 123.19 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ed6a583c-18f2-485c-80fa-88d81f6663fe") + (property "Reference" "K3" + (at 190.5 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "HF41F/12-ZS" + (at 193.04 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" + (at 185.42 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 184.15 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 184.15 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 184.15 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 184.15 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "A1" + (uuid "26f97252-3284-499d-a6a2-8bd39bbdb793") + ) + (pin "12" + (uuid "077bd44f-7b11-49c6-8cf0-5b31330e1b41") + ) + (pin "14" + (uuid "c9e8494d-3a95-43ca-b03c-c8fb437cc807") + ) + (pin "A2" + (uuid "53a4d0d6-6662-46ab-82a0-d68b5804d6ea") + ) + (pin "11" + (uuid "ecf29c85-b83c-48e6-9a92-af1b7c63614f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 231.14 153.67 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f16439bc-1f3a-4daa-83ff-d91bf4f3c640") + (property "Reference" "#PWR022" + (at 231.14 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 234.95 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 231.14 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 231.14 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 231.14 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "a376e689-9385-4cf7-84da-13979f3e3f1a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR022") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 109.22 83.82 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f1e1011c-3bb0-48bd-a004-1b61087fad53") + (property "Reference" "#PWR0196" + (at 109.22 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 111.76 85.09 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 109.22 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 109.22 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 109.22 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "4adb68e3-e25e-400c-9b1f-c62b5f93c904") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0196") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 222.25 149.86 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f1f608ab-6eab-4cda-9645-6fb5525f26ae") + (property "Reference" "R20" + (at 227.4103 149.86 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "52R3" + (at 224.9861 149.86 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 220.472 149.86 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 222.25 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "71-CRCW120649R9FKEAC" + (at 222.25 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 222.25 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6852c157-32a3-45b0-8949-bfb110b2721d") + ) + (pin "1" + (uuid "9eff437a-fd18-4f4b-998f-11256fb7cc7e") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 176.53 120.65 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f2cad309-0c58-4833-83ee-935a85e173d2") + (property "Reference" "#PWR0200" + (at 176.53 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 173.99 121.92 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 176.53 120.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 176.53 120.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 176.53 120.65 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "39defb52-2838-48aa-986e-91f1c0ebf72a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0200") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 229.87 185.42 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f450aa28-9ab4-484b-8072-b649a47aff2d") + (property "Reference" "R16" + (at 232.41 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "~" + (at 232.6061 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 228.092 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 229.87 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 229.87 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "755-SFR18EZPF56R0" + (at 229.87 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 229.87 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4810c01d-c07c-4a9d-a4c5-3a0b08003bfb") + ) + (pin "1" + (uuid "8cec59f4-83a4-4021-9275-18fcbfb8aa8f") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 356.87 128.27 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f59c58a3-f9d5-463e-b85e-906f215a8b13") + (property "Reference" "#PWR0206" + (at 356.87 134.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 354.33 130.81 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 356.87 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 356.87 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 356.87 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "b4c037b6-5d2f-41e1-b39d-03fde768b0e8") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0206") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 259.08 212.09 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f70e5ad2-ffd4-4099-a7ea-b988e5d74272") + (property "Reference" "C150" + (at 259.08 205.7867 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 259.08 208.2109 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 262.89 211.1248 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 259.08 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 259.08 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 259.08 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 259.08 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6cb6d1fc-e177-4575-b489-6b8de81cfc30") + ) + (pin "1" + (uuid "82522c8b-3bbb-40e7-9990-47dbe290c6c7") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C150") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 222.25 237.49 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f8a91502-0ce7-4613-a34d-9933ad411952") + (property "Reference" "L42" + (at 223.5173 236.2779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "22nH" + (at 223.5173 238.7021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 222.25 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 222.25 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 222.25 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 222.25 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "467a24e4-af84-440e-a1a1-981d7b1c7843") + ) + (pin "2" + (uuid "f20092a1-3aaf-4342-b088-5cc58e0155e7") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L42") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 370.84 246.38 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fa23c43b-8ded-41a0-9416-d1c3c299e85b") + (property "Reference" "#PWR09" + (at 370.84 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 370.84 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 370.84 246.38 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 370.84 246.38 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 370.84 246.38 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "6aa716f5-dd2b-40bb-ab41-fc3c13c72227") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR09") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 162.56 279.4 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fa45d19c-855f-4db9-9edd-c392dc835074") + (property "Reference" "#PWR04" + (at 162.56 285.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 165.1 281.94 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 162.56 279.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 162.56 279.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 162.56 279.4 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "47cc6d20-2099-41ff-ac18-b513d619d541") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR04") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 88.9 96.52 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fa657bbb-ead1-4334-bdef-806f5389dc3a") + (property "Reference" "C148" + (at 90.17 102.87 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 90.17 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 85.09 97.4852 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 88.9 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 88.9 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 88.9 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 88.9 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b8e9b4bf-56b3-4216-940a-e877961f045b") + ) + (pin "1" + (uuid "e5757c7a-8309-4a78-9f63-b1923418739d") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C148") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 199.39 104.14 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fb70c338-df25-43e6-853e-df55fdd03e1b") + (property "Reference" "#PWR0199" + (at 199.39 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 201.93 105.41 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 199.39 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 199.39 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 199.39 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "16974e2e-7f1e-48b9-90fa-c8a907ecf878") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0199") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 237.49 227.33 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fe30a089-92e8-4b09-9ef9-7a6b07164881") + (property "Reference" "#PWR017" + (at 237.49 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 240.03 229.87 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 237.49 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 237.49 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 237.49 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "5ac31f2a-781f-4375-af01-77feaf83a176") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR017") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 148.59 220.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fea1c30b-2c60-4269-9d6a-5e37374a67d4") + (property "Reference" "#PWR0188" + (at 148.59 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 144.78 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 148.59 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 148.59 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "8a81d7c2-1bfd-4751-adfd-9f6ac72ff30a") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0188") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole_Pad") + (at 392.43 67.31 270) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ffd6becb-1bd7-4c58-b7f5-da9cc2d0bca9") + (property "Reference" "H2" + (at 396.24 67.31 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 396.24 68.5221 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_4.3mm_M4_DIN965_Pad" + (at 392.43 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 392.43 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 392.43 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Mouser Part Number" "" + (at 392.43 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 392.43 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5705355d-705b-4bf8-bad1-f0193d5e2e9e") + ) + (instances + (project "K9HZ_100W_11band_LPF-Control" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H2") + (unit 1) + ) + ) + ) + ) + (sheet_instances + (path "/" + (page "1") + ) + ) + (embedded_fonts no) +) diff --git a/wiki/raw/K9HZ_100W_11band_LPF-Filter.kicad_sch b/wiki/raw/K9HZ_100W_11band_LPF-Filter.kicad_sch new file mode 100644 index 0000000..b71e66d --- /dev/null +++ b/wiki/raw/K9HZ_100W_11band_LPF-Filter.kicad_sch @@ -0,0 +1,12182 @@ +(kicad_sch (version 20230121) (generator eeschema) + + (uuid 3c4b9d3b-a516-4fd7-b325-b74c836dee65) + + (paper "A3") + + (title_block + (title "K9HZ 100W 11 Band LPF: Filter board") + (date "2024-01-17") + (rev "V1.00") + (comment 1 "Layout by OG King-KI3P") + (comment 2 "Designed by WJ Schmidt-K9HZ") + ) + + (lib_symbols + (symbol "Connector:Conn_Coaxial" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "J" (at 0.254 3.048 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "Conn_Coaxial" (at 2.921 0 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" " ~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "BNC SMA SMB SMC LEMO coaxial connector CINCH RCA MCX MMCX U.FL UMRF" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "coaxial connector (BNC, SMA, SMB, SMC, Cinch/RCA, LEMO, ...)" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "*BNC* *SMA* *SMB* *SMC* *Cinch* *LEMO* *UMRF* *MCX* *U.FL*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "Conn_Coaxial_0_1" + (arc (start -1.778 -0.508) (mid 0.2311 -1.8066) (end 1.778 0) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -2.54 0) + (xy -0.508 0) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 -2.54) + (xy 0 -1.778) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (circle (center 0 0) (radius 0.508) + (stroke (width 0.2032) (type default)) + (fill (type none)) + ) + (arc (start 1.778 0) (mid 0.2099 1.8101) (end -1.778 0.508) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + ) + (symbol "Conn_Coaxial_1_1" + (pin passive line (at -5.08 0 0) (length 2.54) + (name "In" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 0 -5.08 90) (length 2.54) + (name "Ext" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Device:C" (pin_numbers hide) (pin_names (offset 0.254)) (in_bom yes) (on_board yes) + (property "Reference" "C" (at 0.635 2.54 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "C" (at 0.635 -2.54 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (at 0.9652 -3.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "cap capacitor" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Unpolarized capacitor" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "C_*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "C_0_1" + (polyline + (pts + (xy -2.032 -0.762) + (xy 2.032 -0.762) + ) + (stroke (width 0.508) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -2.032 0.762) + (xy 2.032 0.762) + ) + (stroke (width 0.508) (type default)) + (fill (type none)) + ) + ) + (symbol "C_1_1" + (pin passive line (at 0 3.81 270) (length 2.794) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 0 -3.81 90) (length 2.794) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Device:L_Ferrite" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "L" (at -1.27 0 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "L_Ferrite" (at 2.794 0 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "inductor choke coil reactor magnetic" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Inductor with ferrite core" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Choke_* *Coil* Inductor_* L_*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "L_Ferrite_0_1" + (arc (start 0 -2.54) (mid 0.6323 -1.905) (end 0 -1.27) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (arc (start 0 -1.27) (mid 0.6323 -0.635) (end 0 0) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.016 -2.794) + (xy 1.016 -2.286) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.016 -1.778) + (xy 1.016 -1.27) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.016 -0.762) + (xy 1.016 -0.254) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.016 0.254) + (xy 1.016 0.762) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.016 1.27) + (xy 1.016 1.778) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.016 2.286) + (xy 1.016 2.794) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.524 -2.286) + (xy 1.524 -2.794) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.524 -1.27) + (xy 1.524 -1.778) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.524 -0.254) + (xy 1.524 -0.762) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.524 0.762) + (xy 1.524 0.254) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.524 1.778) + (xy 1.524 1.27) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.524 2.794) + (xy 1.524 2.286) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (arc (start 0 0) (mid 0.6323 0.635) (end 0 1.27) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (arc (start 0 1.27) (mid 0.6323 1.905) (end 0 2.54) + (stroke (width 0) (type default)) + (fill (type none)) + ) + ) + (symbol "L_Ferrite_1_1" + (pin passive line (at 0 3.81 270) (length 1.27) + (name "1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 0 -3.81 90) (length 1.27) + (name "2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Mechanical:MountingHole_Pad" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "H" (at 0 6.35 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "MountingHole_Pad" (at 0 4.445 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "mounting hole" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Mounting Hole with connection" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "MountingHole*Pad*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "MountingHole_Pad_0_1" + (circle (center 0 1.27) (radius 1.27) + (stroke (width 1.27) (type default)) + (fill (type none)) + ) + ) + (symbol "MountingHole_Pad_1_1" + (pin input line (at 0 -2.54 90) (length 2.54) + (name "1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Relay:Relay_SPDT" (in_bom yes) (on_board yes) + (property "Reference" "K" (at 11.43 3.81 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "Relay_SPDT" (at 11.43 1.27 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (at 11.43 -1.27 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "Single Pole Relay SPDT" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Monostable Relay SPDT, EN50005" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Relay?SPDT*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "Relay_SPDT_0_0" + (polyline + (pts + (xy 7.62 5.08) + (xy 7.62 2.54) + (xy 6.985 3.175) + (xy 7.62 3.81) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + ) + (symbol "Relay_SPDT_0_1" + (rectangle (start -10.16 5.08) (end 10.16 -5.08) + (stroke (width 0.254) (type default)) + (fill (type background)) + ) + (rectangle (start -8.255 1.905) (end -1.905 -1.905) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -7.62 -1.905) + (xy -2.54 1.905) + ) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -5.08 -5.08) + (xy -5.08 -1.905) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -5.08 5.08) + (xy -5.08 1.905) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -1.905 0) + (xy -1.27 0) + ) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy -0.635 0) + (xy 0 0) + ) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.635 0) + (xy 1.27 0) + ) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.905 0) + (xy 2.54 0) + ) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 3.175 0) + (xy 3.81 0) + ) + (stroke (width 0.254) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 5.08 -2.54) + (xy 3.175 3.81) + ) + (stroke (width 0.508) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 5.08 -2.54) + (xy 5.08 -5.08) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.54 5.08) + (xy 2.54 2.54) + (xy 3.175 3.175) + (xy 2.54 3.81) + ) + (stroke (width 0) (type default)) + (fill (type outline)) + ) + ) + (symbol "Relay_SPDT_1_1" + (pin passive line (at 5.08 -7.62 90) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "11" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 2.54 7.62 270) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "12" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 7.62 270) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "14" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 7.62 270) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "A1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 -7.62 90) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "A2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "T41_Library:IDC_2x5" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "J" (at 1.27 7.62 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "IDC_2x5" (at 1.27 -7.62 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "connector" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Generic connector, double row, 02x05, top/bottom pin numbering scheme (row 1: 1...pins_per_row, row2: pins_per_row+1 ... num_pins), script generated (kicad-library-utils/schlib/autogen/connector/)" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Connector*:*_2x??_*" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "IDC_2x5_1_1" + (rectangle (start -1.27 -4.953) (end 0 -5.207) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start -1.27 -2.413) (end 0 -2.667) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start -1.27 1.27) (end 0 -1.27) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start -1.27 2.667) (end 0 2.413) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start -1.27 5.207) (end 0 4.953) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start -1.27 6.35) (end 3.81 -6.35) + (stroke (width 0.254) (type default)) + (fill (type background)) + ) + (rectangle (start 3.81 -4.953) (end 2.54 -5.207) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start 3.81 -2.413) (end 2.54 -2.667) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start 3.81 0.127) (end 2.54 -0.127) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start 3.81 2.667) (end 2.54 2.413) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (rectangle (start 3.81 5.207) (end 2.54 4.953) + (stroke (width 0.1524) (type default)) + (fill (type none)) + ) + (pin passive line (at -5.08 5.08 0) (length 3.81) + (name "Pin_1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 -5.08 180) (length 3.81) + (name "Pin_10" (effects (font (size 1.27 1.27)))) + (number "10" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 5.08 180) (length 3.81) + (name "Pin_2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 2.54 0) (length 3.81) + (name "Pin_3" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 2.54 180) (length 3.81) + (name "Pin_4" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 0 0) (length 3.81) + (name "Pin_5" (effects (font (size 1.27 1.27)))) + (number "5" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 0 180) (length 3.81) + (name "Pin_6" (effects (font (size 1.27 1.27)))) + (number "6" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 -2.54 0) (length 3.81) + (name "Pin_7" (effects (font (size 1.27 1.27)))) + (number "7" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 -2.54 180) (length 3.81) + (name "Pin_8" (effects (font (size 1.27 1.27)))) + (number "8" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 -5.08 0) (length 3.81) + (name "Pin_9" (effects (font (size 1.27 1.27)))) + (number "9" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "power:+12V" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "#PWR" (at 0 -3.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 0 3.556 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "global power" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Power symbol creates a global label with name \"+12V\"" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "+12V_0_1" + (polyline + (pts + (xy -0.762 1.27) + (xy 0 2.54) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 0) + (xy 0 2.54) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 2.54) + (xy 0.762 1.27) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + ) + (symbol "+12V_1_1" + (pin power_in line (at 0 0 90) (length 0) hide + (name "+12V" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "power:GND" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "#PWR" (at 0 -6.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 0 -3.81 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "global power" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Power symbol creates a global label with name \"GND\" , ground" (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) + (xy 0 -1.27) + (xy 1.27 -1.27) + (xy 0 -2.54) + (xy -1.27 -1.27) + (xy 0 -1.27) + ) + (stroke (width 0) (type default)) + (fill (type none)) + ) + ) + (symbol "GND_1_1" + (pin power_in line (at 0 0 270) (length 0) hide + (name "GND" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + ) + ) + ) + + (junction (at 44.45 125.73) (diameter 0) (color 0 0 0 0) + (uuid 0158b55c-e289-4de2-8786-6d26b705cac1) + ) + (junction (at 372.11 63.5) (diameter 0) (color 0 0 0 0) + (uuid 01fd322b-07dd-4572-a673-d10e40164113) + ) + (junction (at 336.55 120.65) (diameter 0) (color 0 0 0 0) + (uuid 029f3e87-3998-46c3-814f-b208d383bba8) + ) + (junction (at 237.49 140.97) (diameter 0) (color 0 0 0 0) + (uuid 042ff808-a0fb-4270-b1c9-193895ed178d) + ) + (junction (at 72.39 105.41) (diameter 0) (color 0 0 0 0) + (uuid 05acb327-300a-41b8-a836-a42aa1561d28) + ) + (junction (at 207.01 201.93) (diameter 0) (color 0 0 0 0) + (uuid 0afba483-d331-432e-b4d1-3e48be81e234) + ) + (junction (at 20.32 72.39) (diameter 0) (color 0 0 0 0) + (uuid 0cc3a2f8-daaa-48cc-8127-6e4bbe98f9d6) + ) + (junction (at 74.93 63.5) (diameter 0) (color 0 0 0 0) + (uuid 0d0a1807-4d7c-4318-affa-6c694d337ff1) + ) + (junction (at 232.41 222.25) (diameter 0) (color 0 0 0 0) + (uuid 0dfab62d-5270-41c4-9519-718f28fcab70) + ) + (junction (at 152.4 201.93) (diameter 0) (color 0 0 0 0) + (uuid 0ee0ba92-f585-493e-b424-d7a27015cd02) + ) + (junction (at 336.55 166.37) (diameter 0) (color 0 0 0 0) + (uuid 0f6f4332-1014-4071-a595-093da493f487) + ) + (junction (at 72.39 146.05) (diameter 0) (color 0 0 0 0) + (uuid 11083eaf-4920-4cb2-bb6d-29c0be2fd6dd) + ) + (junction (at 270.51 105.41) (diameter 0) (color 0 0 0 0) + (uuid 12f675ec-fc23-4a2a-bed3-6603e2c7c192) + ) + (junction (at 336.55 105.41) (diameter 0) (color 0 0 0 0) + (uuid 16a889b1-e259-4d00-9d87-cf34a5abcca8) + ) + (junction (at 119.38 176.53) (diameter 0) (color 0 0 0 0) + (uuid 170135e2-118e-4b97-a8fa-b69e4b378e43) + ) + (junction (at 232.41 214.63) (diameter 0) (color 0 0 0 0) + (uuid 1dacb650-0b2a-4750-9aa2-5ec4b990deb9) + ) + (junction (at 306.07 201.93) (diameter 0) (color 0 0 0 0) + (uuid 2088e9cb-31fb-4cb9-855f-4341b72a61a8) + ) + (junction (at 270.51 146.05) (diameter 0) (color 0 0 0 0) + (uuid 2258d2bf-e351-40ce-ba89-c116ddc26010) + ) + (junction (at 138.43 100.33) (diameter 0) (color 0 0 0 0) + (uuid 23c908fb-2580-40e6-803a-6bad35d08569) + ) + (junction (at 382.27 176.53) (diameter 0) (color 0 0 0 0) + (uuid 253c48f7-85c1-4576-b3b6-9ec9a04a2d5b) + ) + (junction (at 44.45 140.97) (diameter 0) (color 0 0 0 0) + (uuid 27ce3651-867a-4d70-9854-6a0f520ab799) + ) + (junction (at 125.73 125.73) (diameter 0) (color 0 0 0 0) + (uuid 28d8a03e-b8c1-47da-af50-1d9b285816ae) + ) + (junction (at 105.41 125.73) (diameter 0) (color 0 0 0 0) + (uuid 293ad913-9fff-4a70-b50f-c8ed82c83ac1) + ) + (junction (at 218.44 176.53) (diameter 0) (color 0 0 0 0) + (uuid 29ebfa89-3a9d-4c56-9699-a853762c118c) + ) + (junction (at 306.07 63.5) (diameter 0) (color 0 0 0 0) + (uuid 2b9d13a0-b20d-42f9-8f07-29347659d1d8) + ) + (junction (at 92.71 151.13) (diameter 0) (color 0 0 0 0) + (uuid 2daac84b-5c0c-4559-9722-9d122fd15f3e) + ) + (junction (at 171.45 146.05) (diameter 0) (color 0 0 0 0) + (uuid 311fca14-d988-40bb-8204-68e2898529f2) + ) + (junction (at 303.53 140.97) (diameter 0) (color 0 0 0 0) + (uuid 31f3f2b8-b901-4170-9a10-24003b7b3134) + ) + (junction (at 105.41 140.97) (diameter 0) (color 0 0 0 0) + (uuid 345b053a-7eca-45d1-89c7-effdd7c0ae3e) + ) + (junction (at 273.05 201.93) (diameter 0) (color 0 0 0 0) + (uuid 3548b9c7-41a4-420b-9aa9-dcae5b68763d) + ) + (junction (at 303.53 105.41) (diameter 0) (color 0 0 0 0) + (uuid 39587065-177f-4b4d-8352-0f15d0d3c6a2) + ) + (junction (at 171.45 125.73) (diameter 0) (color 0 0 0 0) + (uuid 3bcd9eee-55f2-4464-b056-966736c5945b) + ) + (junction (at 173.99 201.93) (diameter 0) (color 0 0 0 0) + (uuid 3d7e0eec-6a3b-4a61-9852-36bcfb5d5c12) + ) + (junction (at 237.49 125.73) (diameter 0) (color 0 0 0 0) + (uuid 3d8461dc-ab10-4341-9e1a-8889d370268d) + ) + (junction (at 86.36 72.39) (diameter 0) (color 0 0 0 0) + (uuid 3f738568-90ae-489b-9390-299320ab2416) + ) + (junction (at 369.57 146.05) (diameter 0) (color 0 0 0 0) + (uuid 404395cb-5716-4222-a7c6-37cc50d1e574) + ) + (junction (at 104.14 146.05) (diameter 0) (color 0 0 0 0) + (uuid 44ccb12d-2a8f-4862-9b2e-c4dcb87a157d) + ) + (junction (at 140.97 201.93) (diameter 0) (color 0 0 0 0) + (uuid 46899a91-a693-4532-b376-3810a868bd1a) + ) + (junction (at 53.34 72.39) (diameter 0) (color 0 0 0 0) + (uuid 47ad1f90-07a3-4ad4-9180-0c04570e2d5d) + ) + (junction (at 72.39 100.33) (diameter 0) (color 0 0 0 0) + (uuid 47f3319e-5822-423b-90ab-56868b73d94c) + ) + (junction (at 201.93 213.36) (diameter 0) (color 0 0 0 0) + (uuid 488408e9-d698-4740-a5bf-91d5d61c4f87) + ) + (junction (at 39.37 161.29) (diameter 0) (color 0 0 0 0) + (uuid 488ed9b4-4332-40ea-9678-8cbac795d096) + ) + (junction (at 105.41 146.05) (diameter 0) (color 0 0 0 0) + (uuid 49d2b785-196d-4ce8-b77d-155373fa2658) + ) + (junction (at 158.75 166.37) (diameter 0) (color 0 0 0 0) + (uuid 4a03dc1c-d7b2-425e-b54b-5796650af65b) + ) + (junction (at 77.47 125.73) (diameter 0) (color 0 0 0 0) + (uuid 4bc22207-de95-4266-a81c-75b4f60c5dc3) + ) + (junction (at 138.43 120.65) (diameter 0) (color 0 0 0 0) + (uuid 4d62aee1-0777-4930-9919-6c5117196ab9) + ) + (junction (at 110.49 125.73) (diameter 0) (color 0 0 0 0) + (uuid 51fdbbcb-dc47-4627-8ace-7bd193e6be27) + ) + (junction (at 369.57 125.73) (diameter 0) (color 0 0 0 0) + (uuid 53f81119-2ca1-4d97-b17c-be6fff5780a8) + ) + (junction (at 138.43 161.29) (diameter 0) (color 0 0 0 0) + (uuid 553b32d3-650b-4a0b-8d0e-497b66badb69) + ) + (junction (at 39.37 120.65) (diameter 0) (color 0 0 0 0) + (uuid 5905f607-11fe-46e2-acb4-767087fc841a) + ) + (junction (at 224.79 105.41) (diameter 0) (color 0 0 0 0) + (uuid 5a166756-9169-465a-b743-80640474bd7f) + ) + (junction (at 92.71 120.65) (diameter 0) (color 0 0 0 0) + (uuid 5b7be1ab-21fc-4a36-831f-78027a25179a) + ) + (junction (at 270.51 140.97) (diameter 0) (color 0 0 0 0) + (uuid 5b97a961-f132-426a-8613-36134b018624) + ) + (junction (at 303.53 166.37) (diameter 0) (color 0 0 0 0) + (uuid 5cb9b2e7-716a-444a-8431-d7b54908f7a7) + ) + (junction (at 336.55 125.73) (diameter 0) (color 0 0 0 0) + (uuid 5cf65b0e-7e52-4b8a-b629-a370a3240f34) + ) + (junction (at 270.51 125.73) (diameter 0) (color 0 0 0 0) + (uuid 5e525b67-e00b-4a64-8ea6-00df3f9e9439) + ) + (junction (at 173.99 63.5) (diameter 0) (color 0 0 0 0) + (uuid 5e84fc72-616b-4291-9ebf-8a6edd201c47) + ) + (junction (at 39.37 140.97) (diameter 0) (color 0 0 0 0) + (uuid 608b6b39-1be3-475b-b33e-16aff8fb8ee1) + ) + (junction (at 171.45 166.37) (diameter 0) (color 0 0 0 0) + (uuid 61964c16-03ad-4cb4-8522-dc1cd7e2069b) + ) + (junction (at 140.97 63.5) (diameter 0) (color 0 0 0 0) + (uuid 61e389d7-d350-426b-a9e8-2ec62b24191b) + ) + (junction (at 125.73 146.05) (diameter 0) (color 0 0 0 0) + (uuid 62a8c542-998a-4322-bd3c-c23fe27d2d22) + ) + (junction (at 369.57 140.97) (diameter 0) (color 0 0 0 0) + (uuid 63d03864-019e-42b9-ad81-f54fd8ed2c01) + ) + (junction (at 39.37 105.41) (diameter 0) (color 0 0 0 0) + (uuid 68876207-8479-4f26-9405-122867dc34db) + ) + (junction (at 158.75 105.41) (diameter 0) (color 0 0 0 0) + (uuid 69886d52-b8d8-45c2-ba85-478468f102d2) + ) + (junction (at 74.93 201.93) (diameter 0) (color 0 0 0 0) + (uuid 6cc1e262-5fc4-464b-96e7-7849c681b13d) + ) + (junction (at 201.93 220.98) (diameter 0) (color 0 0 0 0) + (uuid 6dacb0ad-5ca4-40bb-aabe-604d1d84a60a) + ) + (junction (at 204.47 125.73) (diameter 0) (color 0 0 0 0) + (uuid 71da0d83-1c7f-45b4-b1bd-a9f4b555c84e) + ) + (junction (at 152.4 72.39) (diameter 0) (color 0 0 0 0) + (uuid 745063e2-c8d9-49a8-871a-20eb77e8e1c4) + ) + (junction (at 369.57 105.41) (diameter 0) (color 0 0 0 0) + (uuid 750802ed-74e2-45bf-bf82-df8623f62330) + ) + (junction (at 26.67 105.41) (diameter 0) (color 0 0 0 0) + (uuid 7599b1d7-da3e-42aa-bb96-8a361f326c6b) + ) + (junction (at 119.38 72.39) (diameter 0) (color 0 0 0 0) + (uuid 76337f74-a3d6-4b9a-bb86-43cc4ff00dbc) + ) + (junction (at 107.95 201.93) (diameter 0) (color 0 0 0 0) + (uuid 779d649c-2c59-4478-bc66-49c5798b800e) + ) + (junction (at 284.48 72.39) (diameter 0) (color 0 0 0 0) + (uuid 79b1918a-434a-4c95-a968-06cd23497f8b) + ) + (junction (at 237.49 105.41) (diameter 0) (color 0 0 0 0) + (uuid 79b95822-dba6-414a-906b-3b196c23e316) + ) + (junction (at 152.4 176.53) (diameter 0) (color 0 0 0 0) + (uuid 7b5aa022-4d29-4241-bf5a-68619f7074c6) + ) + (junction (at 323.85 146.05) (diameter 0) (color 0 0 0 0) + (uuid 7e64870b-40e5-4dea-b6e8-aed2771fec65) + ) + (junction (at 138.43 125.73) (diameter 0) (color 0 0 0 0) + (uuid 80a7aa05-8adc-443e-b231-cd66ac16bc0d) + ) + (junction (at 59.69 166.37) (diameter 0) (color 0 0 0 0) + (uuid 84dd9000-f8af-412e-89ad-11d7139e9955) + ) + (junction (at 107.95 63.5) (diameter 0) (color 0 0 0 0) + (uuid 84f9cc7f-01a8-41d4-a6ec-acdb1381c16f) + ) + (junction (at 110.49 140.97) (diameter 0) (color 0 0 0 0) + (uuid 8507b524-58d4-488b-9f69-654e48012d14) + ) + (junction (at 105.41 120.65) (diameter 0) (color 0 0 0 0) + (uuid 85c7c6f0-3422-41e9-8249-d6592da9cbf3) + ) + (junction (at 86.36 176.53) (diameter 0) (color 0 0 0 0) + (uuid 87bce0f4-8522-4d9b-a637-fd6f67dda1e3) + ) + (junction (at 224.79 166.37) (diameter 0) (color 0 0 0 0) + (uuid 87fe183c-ccca-4513-ac41-4f9656b03834) + ) + (junction (at 171.45 100.33) (diameter 0) (color 0 0 0 0) + (uuid 88c6de8d-7599-4941-bc53-69981a18ac00) + ) + (junction (at 204.47 146.05) (diameter 0) (color 0 0 0 0) + (uuid 8d56a59f-ef4f-4f22-922d-c296009472ba) + ) + (junction (at 72.39 161.29) (diameter 0) (color 0 0 0 0) + (uuid 910e3595-77d8-46ca-912b-266f63cf5c88) + ) + (junction (at 224.79 125.73) (diameter 0) (color 0 0 0 0) + (uuid 93b450a3-8254-4282-bd8f-463ff63e8d26) + ) + (junction (at 39.37 166.37) (diameter 0) (color 0 0 0 0) + (uuid 94579200-e31c-4402-a56a-21d1f26f3621) + ) + (junction (at 270.51 166.37) (diameter 0) (color 0 0 0 0) + (uuid 94d62b8d-f9e3-4f6e-86d4-971e1850f208) + ) + (junction (at 224.79 146.05) (diameter 0) (color 0 0 0 0) + (uuid 96012ed8-80b0-48d8-b8bd-255dad5063f9) + ) + (junction (at 303.53 146.05) (diameter 0) (color 0 0 0 0) + (uuid 9737e9c8-ecca-4a84-9e69-4a0102fda03f) + ) + (junction (at 26.67 166.37) (diameter 0) (color 0 0 0 0) + (uuid 997e59fe-e39d-4b4d-8bc4-b25b85df15f4) + ) + (junction (at 207.01 63.5) (diameter 0) (color 0 0 0 0) + (uuid 9c76e8fd-57e5-4c41-a4fb-42b953375860) + ) + (junction (at 77.47 140.97) (diameter 0) (color 0 0 0 0) + (uuid 9d1ae1aa-41d7-4fc1-82e5-5e5d8d2b1eb5) + ) + (junction (at 317.5 176.53) (diameter 0) (color 0 0 0 0) + (uuid 9f5c9d10-9074-4d7c-8450-f042932c53fe) + ) + (junction (at 59.69 105.41) (diameter 0) (color 0 0 0 0) + (uuid 9fb5e9ae-5721-4e5c-aded-25e0f7a15911) + ) + (junction (at 240.03 201.93) (diameter 0) (color 0 0 0 0) + (uuid a0cb0f0b-760c-4a21-a1cf-5ace97de6303) + ) + (junction (at 20.32 176.53) (diameter 0) (color 0 0 0 0) + (uuid a0f7a362-1ee4-4407-8a95-4fe26cbc1926) + ) + (junction (at 72.39 125.73) (diameter 0) (color 0 0 0 0) + (uuid a26b0ad4-edcc-4ae7-9e21-b2e80f2f55d6) + ) + (junction (at 237.49 146.05) (diameter 0) (color 0 0 0 0) + (uuid a456f865-38b8-4322-ad5c-c2e6e9c11f84) + ) + (junction (at 26.67 125.73) (diameter 0) (color 0 0 0 0) + (uuid a69ba24f-8e1e-4e34-82a8-447992d7c5c2) + ) + (junction (at 125.73 166.37) (diameter 0) (color 0 0 0 0) + (uuid a77bd802-1dd5-4bf5-8e21-6cd7c59a26c8) + ) + (junction (at 251.46 72.39) (diameter 0) (color 0 0 0 0) + (uuid aadb5206-cdf6-4621-ae00-305a956c37bd) + ) + (junction (at 240.03 63.5) (diameter 0) (color 0 0 0 0) + (uuid ab1efc7e-4eb0-41a0-b6b1-24d150752f2c) + ) + (junction (at 104.14 120.65) (diameter 0) (color 0 0 0 0) + (uuid ac271bcb-3ec0-44fd-b47d-67e41569b617) + ) + (junction (at 26.67 146.05) (diameter 0) (color 0 0 0 0) + (uuid adafbc5e-c5c7-4fe0-8c09-afe986ea69e3) + ) + (junction (at 237.49 100.33) (diameter 0) (color 0 0 0 0) + (uuid b0aa1e96-5483-46a9-84b8-fa3785ff1c2b) + ) + (junction (at 339.09 201.93) (diameter 0) (color 0 0 0 0) + (uuid b65794fa-10b7-41cc-ac06-eae33d51ac3b) + ) + (junction (at 204.47 166.37) (diameter 0) (color 0 0 0 0) + (uuid b8990c6b-dc1d-4ed1-96c0-dab8d2560aea) + ) + (junction (at 171.45 140.97) (diameter 0) (color 0 0 0 0) + (uuid c0f7f1c9-f063-4543-a6cb-bef8369e0855) + ) + (junction (at 317.5 72.39) (diameter 0) (color 0 0 0 0) + (uuid c10b002c-484b-4523-b3c9-aa4081b08012) + ) + (junction (at 138.43 166.37) (diameter 0) (color 0 0 0 0) + (uuid c24b08a7-e177-410b-bf5a-a8c5bcb0f64d) + ) + (junction (at 185.42 72.39) (diameter 0) (color 0 0 0 0) + (uuid c2d5501e-19aa-4172-a0f5-2493f97f63d4) + ) + (junction (at 59.69 146.05) (diameter 0) (color 0 0 0 0) + (uuid c5cb20bc-c43e-4c5d-bb18-72f0d92fe1bf) + ) + (junction (at 339.09 63.5) (diameter 0) (color 0 0 0 0) + (uuid c6a21b99-bd94-400f-8c82-5664cc2ddbc0) + ) + (junction (at 138.43 140.97) (diameter 0) (color 0 0 0 0) + (uuid c842ee14-f274-4dc0-9870-2ea59796619e) + ) + (junction (at 138.43 146.05) (diameter 0) (color 0 0 0 0) + (uuid c870559f-7983-4fef-b4ca-65fb14403a0c) + ) + (junction (at 237.49 120.65) (diameter 0) (color 0 0 0 0) + (uuid c8bfb41d-e282-491a-9295-6dccae458efd) + ) + (junction (at 72.39 120.65) (diameter 0) (color 0 0 0 0) + (uuid cab2cbd1-277c-4601-a70d-1b980076a31c) + ) + (junction (at 39.37 125.73) (diameter 0) (color 0 0 0 0) + (uuid cc88cc81-793a-4043-9abe-60394bb1205d) + ) + (junction (at 39.37 146.05) (diameter 0) (color 0 0 0 0) + (uuid cc9743a3-e8da-4fb1-a1a2-b228995c7a87) + ) + (junction (at 204.47 140.97) (diameter 0) (color 0 0 0 0) + (uuid cd2dcc2d-7899-4891-8daf-e820dcfb9de8) + ) + (junction (at 105.41 166.37) (diameter 0) (color 0 0 0 0) + (uuid ce9cd4c7-655e-4668-a6e8-567cfbb99fc1) + ) + (junction (at 323.85 125.73) (diameter 0) (color 0 0 0 0) + (uuid ced16030-1d71-4dc5-a3a7-6171164b928d) + ) + (junction (at 113.03 220.98) (diameter 0) (color 0 0 0 0) + (uuid d2101ab8-d83c-4d6f-9b35-118376df4f76) + ) + (junction (at 171.45 105.41) (diameter 0) (color 0 0 0 0) + (uuid d23b5aba-58e0-42c8-b39a-f9a316c4a241) + ) + (junction (at 158.75 63.5) (diameter 0) (color 0 0 0 0) + (uuid d5937ee3-b5cf-4fd0-96f0-1c39ee1a1e11) + ) + (junction (at 350.52 176.53) (diameter 0) (color 0 0 0 0) + (uuid d7583fdc-543a-4049-b6fd-f1565e830d3e) + ) + (junction (at 273.05 63.5) (diameter 0) (color 0 0 0 0) + (uuid d99e4a48-7aa6-4551-9604-84c9a2c014c2) + ) + (junction (at 171.45 161.29) (diameter 0) (color 0 0 0 0) + (uuid d9f14644-49e3-4af7-a70d-eed691b610da) + ) + (junction (at 336.55 146.05) (diameter 0) (color 0 0 0 0) + (uuid dad48236-184f-437d-80e0-c6f4f66e3eb0) + ) + (junction (at 303.53 125.73) (diameter 0) (color 0 0 0 0) + (uuid db67bd35-47a5-4f40-b8fb-f84a2ea164f5) + ) + (junction (at 372.11 201.93) (diameter 0) (color 0 0 0 0) + (uuid dbcbc8a4-8591-4fc8-b414-7b2ef42c246a) + ) + (junction (at 72.39 166.37) (diameter 0) (color 0 0 0 0) + (uuid e155f5b8-3428-4d2b-9289-debacb6f0c8d) + ) + (junction (at 59.69 125.73) (diameter 0) (color 0 0 0 0) + (uuid e178260e-556a-4b31-bd73-806171ceafb2) + ) + (junction (at 53.34 176.53) (diameter 0) (color 0 0 0 0) + (uuid e1b504d8-2108-4366-8034-861f505dcb7a) + ) + (junction (at 251.46 176.53) (diameter 0) (color 0 0 0 0) + (uuid e294d097-1cc9-4ea4-97fb-ff2bfbeb21e5) + ) + (junction (at 336.55 140.97) (diameter 0) (color 0 0 0 0) + (uuid e67f7cf0-fc28-4242-9eb9-1471b66342fa) + ) + (junction (at 350.52 72.39) (diameter 0) (color 0 0 0 0) + (uuid e8cf82e4-8bb3-4a0c-b321-815c8c77a120) + ) + (junction (at 218.44 72.39) (diameter 0) (color 0 0 0 0) + (uuid e9c76bb1-83bc-467a-bdaa-31a29418ba4e) + ) + (junction (at 92.71 125.73) (diameter 0) (color 0 0 0 0) + (uuid e9d6b9f8-b615-4348-8e3d-b14a4a3433f1) + ) + (junction (at 185.42 176.53) (diameter 0) (color 0 0 0 0) + (uuid ebd3097a-993d-4bee-9482-b05d789beb1c) + ) + (junction (at 369.57 166.37) (diameter 0) (color 0 0 0 0) + (uuid ed18d3b4-fb19-4ec1-81b2-35f0be8a40df) + ) + (junction (at 284.48 176.53) (diameter 0) (color 0 0 0 0) + (uuid f00e63f5-0ed3-4582-8e73-1d8f711a88d3) + ) + (junction (at 92.71 146.05) (diameter 0) (color 0 0 0 0) + (uuid f15a64ed-e0eb-4d32-bf93-3177606bdcb9) + ) + (junction (at 382.27 72.39) (diameter 0) (color 0 0 0 0) + (uuid f6f62c49-e3ec-4c83-9771-9779c956f49e) + ) + (junction (at 72.39 140.97) (diameter 0) (color 0 0 0 0) + (uuid f85163f9-b181-49c3-9f5e-9abefe92811c) + ) + (junction (at 125.73 105.41) (diameter 0) (color 0 0 0 0) + (uuid f8610d61-d885-412c-857b-4ad6a73611ff) + ) + (junction (at 204.47 105.41) (diameter 0) (color 0 0 0 0) + (uuid f98515c5-56a3-4bfd-92dc-ffded727f2a5) + ) + (junction (at 105.41 100.33) (diameter 0) (color 0 0 0 0) + (uuid fa4b1f40-83bd-4780-aa9b-87f143a92435) + ) + (junction (at 138.43 105.41) (diameter 0) (color 0 0 0 0) + (uuid fafbb912-e36c-4e7a-a30d-107cfa5aaa66) + ) + (junction (at 237.49 166.37) (diameter 0) (color 0 0 0 0) + (uuid fb09cc1b-274b-4f5a-ae59-751a85c98d9e) + ) + (junction (at 237.49 161.29) (diameter 0) (color 0 0 0 0) + (uuid fe1a49c2-ad0a-4ea0-a4cc-3d690fc080d8) + ) + (junction (at 39.37 100.33) (diameter 0) (color 0 0 0 0) + (uuid feb5543b-dcdf-4bc6-bd81-26b6589ddc53) + ) + + (wire (pts (xy 92.71 125.73) (xy 93.98 125.73)) + (stroke (width 0) (type default)) + (uuid 004fe50e-53b3-4379-982d-3547ae0090a4) + ) + (wire (pts (xy 53.34 72.39) (xy 53.34 74.93)) + (stroke (width 0) (type default)) + (uuid 0063cb17-34e0-405f-a844-f93aa2c24ae7) + ) + (wire (pts (xy 171.45 146.05) (xy 171.45 149.86)) + (stroke (width 0) (type default)) + (uuid 008969de-fa53-4365-9d8e-269a7c978bd6) + ) + (wire (pts (xy 336.55 140.97) (xy 341.63 140.97)) + (stroke (width 0) (type default)) + (uuid 00c39a35-aab3-416b-8d6a-9cf91c8a83a6) + ) + (wire (pts (xy 171.45 100.33) (xy 171.45 105.41)) + (stroke (width 0) (type default)) + (uuid 00d15b2a-2ffe-4b8c-9066-0ac240ffcf02) + ) + (wire (pts (xy 35.56 161.29) (xy 39.37 161.29)) + (stroke (width 0) (type default)) + (uuid 011fc241-ac7d-4243-a74d-a8a7eb0b61a2) + ) + (wire (pts (xy 35.56 105.41) (xy 39.37 105.41)) + (stroke (width 0) (type default)) + (uuid 017388da-1052-4f17-8ead-976900d0c188) + ) + (wire (pts (xy 168.91 69.85) (xy 166.37 69.85)) + (stroke (width 0) (type default)) + (uuid 01896741-e7d6-4ac3-9e0a-bc00ef131531) + ) + (wire (pts (xy 104.14 115.57) (xy 104.14 120.65)) + (stroke (width 0) (type default)) + (uuid 01da4029-daae-45c3-b2e2-9bb2535d1268) + ) + (wire (pts (xy 140.97 201.93) (xy 152.4 201.93)) + (stroke (width 0) (type default)) + (uuid 02148d9d-9d4d-4b28-8767-ccab0fbf904b) + ) + (wire (pts (xy 233.68 146.05) (xy 237.49 146.05)) + (stroke (width 0) (type default)) + (uuid 03e2f3b1-e267-4f89-8b8a-e93cb46fa0f6) + ) + (wire (pts (xy 105.41 125.73) (xy 110.49 125.73)) + (stroke (width 0) (type default)) + (uuid 041d0ba7-4af7-4600-ad8e-37a07ffd4f44) + ) + (wire (pts (xy 72.39 120.65) (xy 72.39 125.73)) + (stroke (width 0) (type default)) + (uuid 0431c909-fce4-45ed-9917-8cc35e581986) + ) + (wire (pts (xy 237.49 166.37) (xy 237.49 176.53)) + (stroke (width 0) (type default)) + (uuid 05d14c60-8c2a-48de-85b9-8be96fbf0ff4) + ) + (wire (pts (xy 191.77 105.41) (xy 193.04 105.41)) + (stroke (width 0) (type default)) + (uuid 06002358-f78b-4819-b30a-7e7c8c5a8d71) + ) + (wire (pts (xy 93.98 120.65) (xy 92.71 120.65)) + (stroke (width 0) (type default)) + (uuid 0612f7a3-fa40-446d-8de2-4466bc44e41d) + ) + (wire (pts (xy 303.53 166.37) (xy 303.53 176.53)) + (stroke (width 0) (type default)) + (uuid 06f0f88e-6a1c-41ac-b740-1eb29cf5b295) + ) + (wire (pts (xy 35.56 125.73) (xy 39.37 125.73)) + (stroke (width 0) (type default)) + (uuid 0743ede8-c189-42c7-93cf-3fb05cceb5f8) + ) + (wire (pts (xy 207.01 191.77) (xy 207.01 201.93)) + (stroke (width 0) (type default)) + (uuid 074ada37-4e6d-4801-8883-15a45b3c5bf1) + ) + (wire (pts (xy 74.93 72.39) (xy 74.93 63.5)) + (stroke (width 0) (type default)) + (uuid 07c28af7-6621-4322-a7a1-adb9d6a9bbab) + ) + (wire (pts (xy 50.8 125.73) (xy 50.8 129.54)) + (stroke (width 0) (type default)) + (uuid 08685622-3025-427e-81c1-f2885dd4f504) + ) + (wire (pts (xy 171.45 87.63) (xy 171.45 100.33)) + (stroke (width 0) (type default)) + (uuid 08c1c0c9-1aa3-44ee-b715-f34b4a0f43fb) + ) + (wire (pts (xy 92.71 151.13) (xy 93.98 151.13)) + (stroke (width 0) (type default)) + (uuid 08d7ec1f-82cf-4641-9d48-cdb45605886e) + ) + (wire (pts (xy 26.67 125.73) (xy 27.94 125.73)) + (stroke (width 0) (type default)) + (uuid 08fd7403-a1cb-4364-93e3-7c4e2be8b5c0) + ) + (wire (pts (xy 92.71 115.57) (xy 92.71 120.65)) + (stroke (width 0) (type default)) + (uuid 092e96f6-7c1c-46da-97af-c65ea6ff5f5d) + ) + (wire (pts (xy 267.97 69.85) (xy 265.43 69.85)) + (stroke (width 0) (type default)) + (uuid 09912858-99c9-48ff-a6f2-5fe0ef551e2a) + ) + (wire (pts (xy 161.29 191.77) (xy 161.29 196.85)) + (stroke (width 0) (type default)) + (uuid 0a46710e-2b24-4872-a26c-beb92ad4f8b8) + ) + (wire (pts (xy 290.83 146.05) (xy 292.1 146.05)) + (stroke (width 0) (type default)) + (uuid 0b106124-1f60-4208-a5ba-26b4d573ea88) + ) + (wire (pts (xy 200.66 125.73) (xy 204.47 125.73)) + (stroke (width 0) (type default)) + (uuid 0b8a3353-febc-47a0-a0a5-5b4e1a09e75e) + ) + (wire (pts (xy 270.51 87.63) (xy 270.51 105.41)) + (stroke (width 0) (type default)) + (uuid 0c697795-350f-4f7d-930d-91f6c386096d) + ) + (wire (pts (xy 59.69 125.73) (xy 60.96 125.73)) + (stroke (width 0) (type default)) + (uuid 0c8bd34a-1f20-4b7e-b717-92f4307390ce) + ) + (wire (pts (xy 93.98 100.33) (xy 92.71 100.33)) + (stroke (width 0) (type default)) + (uuid 0db642e6-6b79-412f-82fd-716ab82d6ccc) + ) + (wire (pts (xy 382.27 72.39) (xy 391.16 72.39)) + (stroke (width 0) (type default)) + (uuid 0e5c91cf-bcee-4043-83d3-388b133a001c) + ) + (wire (pts (xy 336.55 105.41) (xy 336.55 109.22)) + (stroke (width 0) (type default)) + (uuid 0e6f6439-6df3-4c11-a64e-e6fec8a4103b) + ) + (wire (pts (xy 336.55 137.16) (xy 336.55 140.97)) + (stroke (width 0) (type default)) + (uuid 0f7a25a7-d561-4036-ad9e-0af374775d7b) + ) + (wire (pts (xy 207.01 201.93) (xy 240.03 201.93)) + (stroke (width 0) (type default)) + (uuid 0f87e271-482b-49cd-aecc-dc4180da0ead) + ) + (wire (pts (xy 138.43 161.29) (xy 138.43 157.48)) + (stroke (width 0) (type default)) + (uuid 0fddef26-4d26-49ac-8283-7760ad9094e5) + ) + (wire (pts (xy 101.6 151.13) (xy 104.14 151.13)) + (stroke (width 0) (type default)) + (uuid 0fe68802-c4bf-4b59-8866-a9f7796f65f1) + ) + (wire (pts (xy 152.4 72.39) (xy 161.29 72.39)) + (stroke (width 0) (type default)) + (uuid 1022f0b4-dbb8-4272-bd93-75c90e2ae3c5) + ) + (wire (pts (xy 401.32 87.63) (xy 401.32 176.53)) + (stroke (width 0) (type default)) + (uuid 10911429-d053-4cf3-a177-34dfd1b98d87) + ) + (wire (pts (xy 213.36 219.71) (xy 218.44 219.71)) + (stroke (width 0) (type default)) + (uuid 10f80b58-eb22-4c99-b923-ee2440e2f9dc) + ) + (wire (pts (xy 72.39 125.73) (xy 72.39 129.54)) + (stroke (width 0) (type default)) + (uuid 115c20ca-2d96-4d41-8846-f5cb75d9d3b3) + ) + (wire (pts (xy 27.94 100.33) (xy 26.67 100.33)) + (stroke (width 0) (type default)) + (uuid 11dc340e-cc51-42ad-9014-42960c6ac81b) + ) + (wire (pts (xy 134.62 105.41) (xy 138.43 105.41)) + (stroke (width 0) (type default)) + (uuid 12eb6b35-1c55-45a0-8939-f044860d497c) + ) + (wire (pts (xy 226.06 140.97) (xy 224.79 140.97)) + (stroke (width 0) (type default)) + (uuid 133962ed-bb05-421e-b522-f518bfda5db9) + ) + (wire (pts (xy 59.69 166.37) (xy 60.96 166.37)) + (stroke (width 0) (type default)) + (uuid 14883c2d-caa6-42e3-b1bb-021812bb6a22) + ) + (wire (pts (xy 107.95 201.93) (xy 140.97 201.93)) + (stroke (width 0) (type default)) + (uuid 157fcc9c-342b-4b8f-baa8-04357bd1d859) + ) + (wire (pts (xy 369.57 140.97) (xy 369.57 146.05)) + (stroke (width 0) (type default)) + (uuid 15c93a10-8971-4aa9-a2a1-7b4c0beaef22) + ) + (wire (pts (xy 138.43 125.73) (xy 143.51 125.73)) + (stroke (width 0) (type default)) + (uuid 16ca4066-87d3-4648-9df6-ffc7ebb958ab) + ) + (wire (pts (xy 369.57 166.37) (xy 369.57 176.53)) + (stroke (width 0) (type default)) + (uuid 1736757c-0294-4047-95bf-258af490ce6f) + ) + (wire (pts (xy 62.23 92.71) (xy 62.23 87.63)) + (stroke (width 0) (type default)) + (uuid 1798c101-3824-4b07-bd0a-ea4cccff72aa) + ) + (wire (pts (xy 201.93 72.39) (xy 201.93 69.85)) + (stroke (width 0) (type default)) + (uuid 185ee9d6-04b6-4c3c-892d-fc576e8b0745) + ) + (wire (pts (xy 134.62 120.65) (xy 138.43 120.65)) + (stroke (width 0) (type default)) + (uuid 198383f3-2bdf-4843-8510-a9290b84f295) + ) + (wire (pts (xy 171.45 116.84) (xy 171.45 125.73)) + (stroke (width 0) (type default)) + (uuid 1c09aaaa-0700-462d-bad2-5fc1e3eccc0a) + ) + (wire (pts (xy 233.68 120.65) (xy 237.49 120.65)) + (stroke (width 0) (type default)) + (uuid 1c73a7c0-9e41-4698-84e5-cd79c03b570b) + ) + (wire (pts (xy 224.79 125.73) (xy 226.06 125.73)) + (stroke (width 0) (type default)) + (uuid 1cb19355-d6c7-45b8-a714-023d5e07c858) + ) + (wire (pts (xy 116.84 125.73) (xy 116.84 129.54)) + (stroke (width 0) (type default)) + (uuid 1cd5077f-98ec-4181-ada9-c40e8ce94283) + ) + (wire (pts (xy 372.11 191.77) (xy 372.11 201.93)) + (stroke (width 0) (type default)) + (uuid 1d1a00f1-72d1-4737-ab73-269280acb470) + ) + (wire (pts (xy 251.46 72.39) (xy 251.46 74.93)) + (stroke (width 0) (type default)) + (uuid 1da7cbfb-91ad-4242-b7b5-649da6becec6) + ) + (wire (pts (xy 382.27 176.53) (xy 391.16 176.53)) + (stroke (width 0) (type default)) + (uuid 1deafb86-bc8e-4c29-b02a-3de04d87cdee) + ) + (wire (pts (xy 403.86 72.39) (xy 403.86 63.5)) + (stroke (width 0) (type default)) + (uuid 1f5e9c40-c602-4437-a4fb-832b37d4e3dc) + ) + (wire (pts (xy 138.43 87.63) (xy 138.43 100.33)) + (stroke (width 0) (type default)) + (uuid 2048c95c-4e23-41e5-8ee9-7f333b1716e5) + ) + (wire (pts (xy 35.56 120.65) (xy 39.37 120.65)) + (stroke (width 0) (type default)) + (uuid 2081441f-a6c0-4a18-bdaf-0b0fe5b59b96) + ) + (wire (pts (xy 72.39 105.41) (xy 72.39 109.22)) + (stroke (width 0) (type default)) + (uuid 20a2db88-7f46-45fb-b1e7-cdfd19f4062c) + ) + (wire (pts (xy 102.87 72.39) (xy 102.87 69.85)) + (stroke (width 0) (type default)) + (uuid 20a75a12-d706-4f24-b266-fb01c002c1e8) + ) + (wire (pts (xy 369.57 140.97) (xy 374.65 140.97)) + (stroke (width 0) (type default)) + (uuid 20d438c7-ee6d-4d8d-b7d6-0e47308d2a28) + ) + (wire (pts (xy 172.72 54.61) (xy 172.72 53.34)) + (stroke (width 0) (type default)) + (uuid 20df548f-10a7-4555-a972-b124a1a13e70) + ) + (wire (pts (xy 266.7 105.41) (xy 270.51 105.41)) + (stroke (width 0) (type default)) + (uuid 21730ae9-7134-4dc9-8ca3-d0ce4ded8aec) + ) + (wire (pts (xy 227.33 92.71) (xy 227.33 87.63)) + (stroke (width 0) (type default)) + (uuid 21cd5200-f864-4d5d-babc-f2378a9c71c6) + ) + (wire (pts (xy 226.06 161.29) (xy 224.79 161.29)) + (stroke (width 0) (type default)) + (uuid 21dea8f4-5480-4803-8277-69928ad71629) + ) + (wire (pts (xy 27.94 140.97) (xy 26.67 140.97)) + (stroke (width 0) (type default)) + (uuid 2251bcec-a3fb-45b4-afed-f04fb766fea0) + ) + (wire (pts (xy 233.68 125.73) (xy 237.49 125.73)) + (stroke (width 0) (type default)) + (uuid 238be581-a8df-427b-b88a-2081259c30f6) + ) + (wire (pts (xy 240.03 63.5) (xy 240.03 72.39)) + (stroke (width 0) (type default)) + (uuid 2450ebd1-8cb9-45db-9405-d01c9eefd6db) + ) + (wire (pts (xy 356.87 125.73) (xy 358.14 125.73)) + (stroke (width 0) (type default)) + (uuid 24b5c5c2-1acd-4465-952a-547086bb08f6) + ) + (wire (pts (xy 53.34 176.53) (xy 53.34 179.07)) + (stroke (width 0) (type default)) + (uuid 25567786-d235-4004-a548-7da9478b6095) + ) + (wire (pts (xy 104.14 125.73) (xy 104.14 120.65)) + (stroke (width 0) (type default)) + (uuid 25e229d3-45b1-4a09-8313-8ea109596fc2) + ) + (wire (pts (xy 336.55 125.73) (xy 341.63 125.73)) + (stroke (width 0) (type default)) + (uuid 26349c15-6b69-487b-b884-0a9d30b414d4) + ) + (wire (pts (xy 59.69 100.33) (xy 59.69 105.41)) + (stroke (width 0) (type default)) + (uuid 26406bda-4394-40f1-90dd-b79b2d47720a) + ) + (wire (pts (xy 101.6 146.05) (xy 104.14 146.05)) + (stroke (width 0) (type default)) + (uuid 26594166-6721-49a0-adac-ebe88512eb16) + ) + (wire (pts (xy 306.07 201.93) (xy 339.09 201.93)) + (stroke (width 0) (type default)) + (uuid 272bc5d1-140b-4a63-ab05-684e05d6696c) + ) + (wire (pts (xy 110.49 140.97) (xy 116.84 140.97)) + (stroke (width 0) (type default)) + (uuid 27dcf563-564f-445f-895a-8cf18fa50a2f) + ) + (wire (pts (xy 391.16 199.39) (xy 391.16 191.77)) + (stroke (width 0) (type default)) + (uuid 28162bf1-5b30-4013-825c-f7d9b6a739b8) + ) + (wire (pts (xy 237.49 166.37) (xy 237.49 161.29)) + (stroke (width 0) (type default)) + (uuid 29aeee31-164b-4c4f-9769-94048667debd) + ) + (wire (pts (xy 224.79 100.33) (xy 224.79 105.41)) + (stroke (width 0) (type default)) + (uuid 29e42ed1-b033-4917-8724-040c60917930) + ) + (wire (pts (xy 201.93 220.98) (xy 200.66 220.98)) + (stroke (width 0) (type default)) + (uuid 2a188427-de38-45b0-a8de-e8703e8483f1) + ) + (wire (pts (xy 308.61 137.16) (xy 308.61 140.97)) + (stroke (width 0) (type default)) + (uuid 2a59ab87-df86-4501-b567-37fe0582848e) + ) + (wire (pts (xy 306.07 191.77) (xy 306.07 201.93)) + (stroke (width 0) (type default)) + (uuid 2aba32a5-67fe-441f-ad28-351b644e113f) + ) + (wire (pts (xy 303.53 140.97) (xy 308.61 140.97)) + (stroke (width 0) (type default)) + (uuid 2ac3a0dc-dcec-4e5f-99b7-c985a865b7fd) + ) + (wire (pts (xy 93.98 140.97) (xy 92.71 140.97)) + (stroke (width 0) (type default)) + (uuid 2afa1241-8d34-47b5-ac07-9b3455a18584) + ) + (wire (pts (xy 168.91 72.39) (xy 168.91 69.85)) + (stroke (width 0) (type default)) + (uuid 2b362725-caef-4a87-a9ce-eacce879efb4) + ) + (wire (pts (xy 204.47 87.63) (xy 204.47 105.41)) + (stroke (width 0) (type default)) + (uuid 2b861809-2028-46f5-a63d-f232983d986c) + ) + (wire (pts (xy 306.07 63.5) (xy 339.09 63.5)) + (stroke (width 0) (type default)) + (uuid 2be7cef6-f1a2-477e-a80d-1e94a330ffae) + ) + (wire (pts (xy 237.49 125.73) (xy 242.57 125.73)) + (stroke (width 0) (type default)) + (uuid 2c163e7e-ff56-4028-a881-3bfc1d4e7054) + ) + (wire (pts (xy 105.41 140.97) (xy 110.49 140.97)) + (stroke (width 0) (type default)) + (uuid 2c249854-755f-4c8e-b369-40d723899107) + ) + (wire (pts (xy 26.67 100.33) (xy 26.67 105.41)) + (stroke (width 0) (type default)) + (uuid 2c705425-edc0-4583-a9f7-6fd29e18b28c) + ) + (wire (pts (xy 39.37 161.29) (xy 39.37 157.48)) + (stroke (width 0) (type default)) + (uuid 2d0b4405-1d5f-4fd3-b39f-1eef9d9aeba6) + ) + (wire (pts (xy 231.14 227.33) (xy 231.14 224.79)) + (stroke (width 0) (type default)) + (uuid 2d174d63-fd2b-453f-ab5c-d5a8df9bd4f7) + ) + (wire (pts (xy 398.78 191.77) (xy 398.78 193.04)) + (stroke (width 0) (type default)) + (uuid 2d3726b8-df7b-4223-b18a-544e7f50d451) + ) + (wire (pts (xy 391.16 93.98) (xy 391.16 87.63)) + (stroke (width 0) (type default)) + (uuid 2d376c41-9cbb-4bcb-abf0-537a2e699360) + ) + (wire (pts (xy 237.49 146.05) (xy 237.49 149.86)) + (stroke (width 0) (type default)) + (uuid 2ecfd4c7-be5e-4690-a2d2-bf3e24408072) + ) + (wire (pts (xy 303.53 157.48) (xy 303.53 166.37)) + (stroke (width 0) (type default)) + (uuid 2ef4ddff-5421-43a5-abe7-00909c7da70d) + ) + (wire (pts (xy 101.6 125.73) (xy 104.14 125.73)) + (stroke (width 0) (type default)) + (uuid 2f10daa3-b238-4e6a-a1eb-39f4034f4d4b) + ) + (wire (pts (xy 72.39 140.97) (xy 77.47 140.97)) + (stroke (width 0) (type default)) + (uuid 2f38cc7d-da2a-47e7-b895-7d7cdfd36d21) + ) + (wire (pts (xy 125.73 166.37) (xy 127 166.37)) + (stroke (width 0) (type default)) + (uuid 2f6c3281-c0f0-4b98-b22a-8cade07f0c27) + ) + (wire (pts (xy 41.91 72.39) (xy 41.91 63.5)) + (stroke (width 0) (type default)) + (uuid 2fe92672-8389-4a05-b8be-714c3c74f269) + ) + (wire (pts (xy 204.47 140.97) (xy 209.55 140.97)) + (stroke (width 0) (type default)) + (uuid 3006a43e-5412-4b74-8e12-4ec20f53acc0) + ) + (wire (pts (xy 152.4 176.53) (xy 152.4 179.07)) + (stroke (width 0) (type default)) + (uuid 301c9d7a-892d-4cc4-bf3f-eff770be8aa6) + ) + (wire (pts (xy 125.73 100.33) (xy 125.73 105.41)) + (stroke (width 0) (type default)) + (uuid 3048cafa-30f8-43e2-9b92-0a543ff9f34a) + ) + (wire (pts (xy 213.36 224.79) (xy 218.44 224.79)) + (stroke (width 0) (type default)) + (uuid 3055889f-327a-434f-94f0-e863c4117867) + ) + (wire (pts (xy 299.72 166.37) (xy 303.53 166.37)) + (stroke (width 0) (type default)) + (uuid 315853ae-39dd-4505-8f38-0bbbf99ed37d) + ) + (wire (pts (xy 237.49 105.41) (xy 237.49 109.22)) + (stroke (width 0) (type default)) + (uuid 316f0aab-2314-4813-a538-aa27567c89d5) + ) + (wire (pts (xy 226.06 120.65) (xy 224.79 120.65)) + (stroke (width 0) (type default)) + (uuid 317f5282-7e8e-4599-9296-55a06eaaee9b) + ) + (wire (pts (xy 270.51 166.37) (xy 270.51 176.53)) + (stroke (width 0) (type default)) + (uuid 3225c525-a0f8-4908-8e18-9a8a585ea8a2) + ) + (wire (pts (xy 200.66 215.9) (xy 201.93 215.9)) + (stroke (width 0) (type default)) + (uuid 327723b9-a69a-4e7e-8c75-58ffa2cede93) + ) + (wire (pts (xy 290.83 105.41) (xy 292.1 105.41)) + (stroke (width 0) (type default)) + (uuid 33507f84-00de-4f47-9637-bb820f14ab57) + ) + (wire (pts (xy 336.55 140.97) (xy 336.55 146.05)) + (stroke (width 0) (type default)) + (uuid 34ed12af-c575-4c24-b2ce-9624bc7f8f5d) + ) + (wire (pts (xy 105.41 87.63) (xy 105.41 100.33)) + (stroke (width 0) (type default)) + (uuid 354f514c-467c-44df-9e3d-ef28d5843ee4) + ) + (wire (pts (xy 273.05 201.93) (xy 306.07 201.93)) + (stroke (width 0) (type default)) + (uuid 3551d731-d137-40f1-a3af-ec2ca11fe8ec) + ) + (wire (pts (xy 39.37 125.73) (xy 44.45 125.73)) + (stroke (width 0) (type default)) + (uuid 3661309b-316f-4061-9f1f-b4525f829eeb) + ) + (wire (pts (xy 86.36 176.53) (xy 86.36 179.07)) + (stroke (width 0) (type default)) + (uuid 37daab92-7438-4389-ba40-4659dc979bd6) + ) + (wire (pts (xy 104.14 146.05) (xy 105.41 146.05)) + (stroke (width 0) (type default)) + (uuid 3967ac14-a2b6-45d6-8b22-7f8de3bc4ab5) + ) + (wire (pts (xy 134.62 140.97) (xy 138.43 140.97)) + (stroke (width 0) (type default)) + (uuid 3a8edd2a-30e1-4a9c-9493-7a4a1b008a6f) + ) + (wire (pts (xy 101.6 100.33) (xy 105.41 100.33)) + (stroke (width 0) (type default)) + (uuid 3a8f61d3-360a-49bd-90eb-966f971ee0f3) + ) + (wire (pts (xy 107.95 63.5) (xy 140.97 63.5)) + (stroke (width 0) (type default)) + (uuid 3aba8142-3914-4669-8d33-331cf2005cab) + ) + (wire (pts (xy 105.41 116.84) (xy 105.41 120.65)) + (stroke (width 0) (type default)) + (uuid 3bd795d1-c520-4543-8938-139eb10e8ece) + ) + (wire (pts (xy 218.44 72.39) (xy 218.44 74.93)) + (stroke (width 0) (type default)) + (uuid 3cac2168-9e75-44b3-8e7b-d5d9091085ab) + ) + (wire (pts (xy 158.75 166.37) (xy 160.02 166.37)) + (stroke (width 0) (type default)) + (uuid 3e1e550e-6223-4fd0-8ddb-107340245bad) + ) + (wire (pts (xy 275.59 137.16) (xy 275.59 140.97)) + (stroke (width 0) (type default)) + (uuid 3e45ea3b-b9e6-4e14-94cd-f0a3e2257eaf) + ) + (wire (pts (xy 213.36 222.25) (xy 218.44 222.25)) + (stroke (width 0) (type default)) + (uuid 3ed1d873-15a0-4e43-8a15-1f5a6a295b38) + ) + (wire (pts (xy 72.39 87.63) (xy 72.39 100.33)) + (stroke (width 0) (type default)) + (uuid 3f1fcd28-7af5-4f1b-be82-a8073af7badc) + ) + (wire (pts (xy 138.43 120.65) (xy 138.43 125.73)) + (stroke (width 0) (type default)) + (uuid 3f7ccf9e-af94-4b40-9fe6-80eb02995e07) + ) + (wire (pts (xy 160.02 100.33) (xy 158.75 100.33)) + (stroke (width 0) (type default)) + (uuid 3f9a3bf1-d0ee-4e47-a711-eb39e66a1503) + ) + (wire (pts (xy 185.42 176.53) (xy 185.42 179.07)) + (stroke (width 0) (type default)) + (uuid 401ccd32-e8ff-49cd-ad31-9d2c5da0cea7) + ) + (wire (pts (xy 200.66 226.06) (xy 200.66 223.52)) + (stroke (width 0) (type default)) + (uuid 408af3fb-70ec-4dfa-bc40-cd1c936a4e5b) + ) + (wire (pts (xy 92.71 146.05) (xy 93.98 146.05)) + (stroke (width 0) (type default)) + (uuid 40d999c4-bab6-44d2-af49-fac9e2fee89b) + ) + (wire (pts (xy 204.47 137.16) (xy 204.47 140.97)) + (stroke (width 0) (type default)) + (uuid 41248aa8-cdcb-42d1-ada1-660d30fffd23) + ) + (wire (pts (xy 138.43 137.16) (xy 138.43 140.97)) + (stroke (width 0) (type default)) + (uuid 415c6c6e-d066-4edc-9761-2608037eec4b) + ) + (wire (pts (xy 336.55 125.73) (xy 336.55 129.54)) + (stroke (width 0) (type default)) + (uuid 41ab845c-4a9e-4f5d-adca-0d8d6c8bfcbd) + ) + (wire (pts (xy 138.43 166.37) (xy 138.43 176.53)) + (stroke (width 0) (type default)) + (uuid 42d8d9fe-5146-4c74-ade4-85167d78a8bd) + ) + (wire (pts (xy 224.79 140.97) (xy 224.79 146.05)) + (stroke (width 0) (type default)) + (uuid 42e83044-6f1c-4d93-90fa-482a4aca75ea) + ) + (wire (pts (xy 237.49 137.16) (xy 237.49 140.97)) + (stroke (width 0) (type default)) + (uuid 42fdf177-99ac-42ff-b670-9d68b1fb0804) + ) + (wire (pts (xy 140.97 63.5) (xy 158.75 63.5)) + (stroke (width 0) (type default)) + (uuid 438f028d-4be3-4837-b166-464d15120202) + ) + (wire (pts (xy 161.29 92.71) (xy 161.29 87.63)) + (stroke (width 0) (type default)) + (uuid 44acd11a-70d4-4a9a-8a6e-436cfdca29dd) + ) + (wire (pts (xy 77.47 125.73) (xy 83.82 125.73)) + (stroke (width 0) (type default)) + (uuid 44db27a9-0d7a-4d29-8829-2d55bfd5b2c6) + ) + (wire (pts (xy 237.49 140.97) (xy 237.49 146.05)) + (stroke (width 0) (type default)) + (uuid 452d35a3-ae04-472a-9642-b4fb2c9b9638) + ) + (wire (pts (xy 251.46 72.39) (xy 260.35 72.39)) + (stroke (width 0) (type default)) + (uuid 46a67129-86bd-4afe-95d1-90738421ecd6) + ) + (wire (pts (xy 105.41 140.97) (xy 105.41 146.05)) + (stroke (width 0) (type default)) + (uuid 47fd2e9a-f6cc-4f05-89de-ee62bd51ada9) + ) + (wire (pts (xy 224.79 166.37) (xy 226.06 166.37)) + (stroke (width 0) (type default)) + (uuid 49fdb54f-f54d-4348-98c8-1d0e547bc389) + ) + (wire (pts (xy 116.84 140.97) (xy 116.84 137.16)) + (stroke (width 0) (type default)) + (uuid 4a65be0a-7c97-4ec2-95ed-c2e6cebe8f8f) + ) + (wire (pts (xy 171.45 137.16) (xy 171.45 140.97)) + (stroke (width 0) (type default)) + (uuid 4a692156-1817-4729-b29b-5076b7e1c9fb) + ) + (wire (pts (xy 158.75 161.29) (xy 158.75 166.37)) + (stroke (width 0) (type default)) + (uuid 4a6fb786-e015-44d7-9986-1d108d00eb65) + ) + (wire (pts (xy 369.57 157.48) (xy 369.57 166.37)) + (stroke (width 0) (type default)) + (uuid 4a6fe0ee-143a-4fcb-a08e-fbde45fc0992) + ) + (wire (pts (xy 323.85 125.73) (xy 325.12 125.73)) + (stroke (width 0) (type default)) + (uuid 4a88aac5-3910-4762-97b1-38b5cf3c2314) + ) + (wire (pts (xy 138.43 125.73) (xy 138.43 129.54)) + (stroke (width 0) (type default)) + (uuid 4adc19c2-82a5-465c-baa3-f39e1cc3fb63) + ) + (wire (pts (xy 403.86 191.77) (xy 403.86 201.93)) + (stroke (width 0) (type default)) + (uuid 4b0329f7-40ac-4be6-982d-4c3f42bca424) + ) + (wire (pts (xy 27.94 120.65) (xy 26.67 120.65)) + (stroke (width 0) (type default)) + (uuid 4b182bff-08cc-4764-a22b-270ffdc43842) + ) + (wire (pts (xy 39.37 166.37) (xy 39.37 176.53)) + (stroke (width 0) (type default)) + (uuid 4b7103a4-51de-46b0-b4cd-91970c33e81b) + ) + (wire (pts (xy 350.52 176.53) (xy 359.41 176.53)) + (stroke (width 0) (type default)) + (uuid 4c0bf723-61cb-4faf-95b5-1f8ba9478b65) + ) + (wire (pts (xy 270.51 125.73) (xy 275.59 125.73)) + (stroke (width 0) (type default)) + (uuid 4c37d254-a55a-4a26-9704-6ebdc03e42ae) + ) + (wire (pts (xy 26.67 140.97) (xy 26.67 146.05)) + (stroke (width 0) (type default)) + (uuid 4dc2af21-25b7-4364-843e-22da028d2265) + ) + (wire (pts (xy 237.49 116.84) (xy 237.49 120.65)) + (stroke (width 0) (type default)) + (uuid 4e1cd2c4-60be-46f7-a3a3-90c827670678) + ) + (wire (pts (xy 336.55 116.84) (xy 336.55 120.65)) + (stroke (width 0) (type default)) + (uuid 4e95823e-0e00-4625-a8df-cced62733708) + ) + (wire (pts (xy 53.34 176.53) (xy 62.23 176.53)) + (stroke (width 0) (type default)) + (uuid 4eaa352a-e193-47d7-ad9e-4c86faca7658) + ) + (wire (pts (xy 209.55 125.73) (xy 209.55 129.54)) + (stroke (width 0) (type default)) + (uuid 4f32f1f4-cf5a-4bd6-91bd-cdd6fcdf31a1) + ) + (wire (pts (xy 398.78 72.39) (xy 398.78 69.85)) + (stroke (width 0) (type default)) + (uuid 4f484b0c-2edf-4713-8fd9-9b651d401391) + ) + (wire (pts (xy 303.53 116.84) (xy 303.53 125.73)) + (stroke (width 0) (type default)) + (uuid 4fe095ef-a0f0-476a-ba35-cfafe7ecb29a) + ) + (wire (pts (xy 171.45 161.29) (xy 171.45 157.48)) + (stroke (width 0) (type default)) + (uuid 5005616e-a106-4bc9-a709-7e4c741c9de3) + ) + (wire (pts (xy 158.75 105.41) (xy 160.02 105.41)) + (stroke (width 0) (type default)) + (uuid 500656ff-276b-4523-aa54-0683a02331f9) + ) + (wire (pts (xy 299.72 105.41) (xy 303.53 105.41)) + (stroke (width 0) (type default)) + (uuid 50148e31-6b72-42d0-951b-e18e1999b725) + ) + (wire (pts (xy 29.21 93.98) (xy 29.21 87.63)) + (stroke (width 0) (type default)) + (uuid 522625af-59d8-4775-8040-edf1530ddde1) + ) + (wire (pts (xy 59.69 161.29) (xy 59.69 166.37)) + (stroke (width 0) (type default)) + (uuid 525562be-1913-4a58-a1b0-b3ab9d64bf2d) + ) + (wire (pts (xy 323.85 105.41) (xy 325.12 105.41)) + (stroke (width 0) (type default)) + (uuid 527350c5-7194-4e45-b7f6-441f49d4de19) + ) + (wire (pts (xy 303.53 140.97) (xy 303.53 146.05)) + (stroke (width 0) (type default)) + (uuid 5355fae2-e7b7-44dc-aba6-546ab66e36e8) + ) + (wire (pts (xy 201.93 215.9) (xy 201.93 213.36)) + (stroke (width 0) (type default)) + (uuid 537561b8-bd58-4cd6-9ea2-c9803444ee6a) + ) + (wire (pts (xy 105.41 100.33) (xy 105.41 109.22)) + (stroke (width 0) (type default)) + (uuid 542ce18f-5655-4ad5-9204-bde15cbb4925) + ) + (wire (pts (xy 372.11 201.93) (xy 403.86 201.93)) + (stroke (width 0) (type default)) + (uuid 55b0a6d0-eb25-4d28-8049-b5893d5e1a15) + ) + (wire (pts (xy 299.72 146.05) (xy 303.53 146.05)) + (stroke (width 0) (type default)) + (uuid 55b9a91c-f430-4377-8951-b4df3e18fa30) + ) + (wire (pts (xy 237.49 140.97) (xy 242.57 140.97)) + (stroke (width 0) (type default)) + (uuid 562bb2de-502f-4c53-a4cc-599ea1287593) + ) + (wire (pts (xy 270.51 157.48) (xy 270.51 166.37)) + (stroke (width 0) (type default)) + (uuid 563ae52e-a02e-417f-802c-df4708dba488) + ) + (wire (pts (xy 224.79 105.41) (xy 226.06 105.41)) + (stroke (width 0) (type default)) + (uuid 56b8544e-1453-44c7-a30f-43bb87ce9943) + ) + (wire (pts (xy 173.99 201.93) (xy 207.01 201.93)) + (stroke (width 0) (type default)) + (uuid 587f9206-6467-4b07-a628-741cb893362b) + ) + (wire (pts (xy 293.37 198.12) (xy 293.37 191.77)) + (stroke (width 0) (type default)) + (uuid 58d7802a-8906-4c4b-8d4d-53f6f1677f8d) + ) + (wire (pts (xy 26.67 166.37) (xy 27.94 166.37)) + (stroke (width 0) (type default)) + (uuid 58e3da13-5762-4d52-bea1-8e403431ae4d) + ) + (wire (pts (xy 204.47 125.73) (xy 209.55 125.73)) + (stroke (width 0) (type default)) + (uuid 59a111d9-dacd-4b38-ba60-b2fbaa28b796) + ) + (wire (pts (xy 300.99 72.39) (xy 300.99 69.85)) + (stroke (width 0) (type default)) + (uuid 59e6fbd0-0edd-46e9-b371-400bb9c15206) + ) + (wire (pts (xy 266.7 125.73) (xy 270.51 125.73)) + (stroke (width 0) (type default)) + (uuid 5a593778-2cb4-4a5e-b502-3140d30812e9) + ) + (wire (pts (xy 68.58 146.05) (xy 72.39 146.05)) + (stroke (width 0) (type default)) + (uuid 5bc19a55-a89b-4d15-9dba-c6b8335f5900) + ) + (wire (pts (xy 68.58 166.37) (xy 72.39 166.37)) + (stroke (width 0) (type default)) + (uuid 5c007c31-85a7-4911-bf2c-d3493f04ec71) + ) + (wire (pts (xy 119.38 72.39) (xy 119.38 74.93)) + (stroke (width 0) (type default)) + (uuid 5c025834-8de7-4b12-9e75-53f44c173f20) + ) + (wire (pts (xy 20.32 72.39) (xy 29.21 72.39)) + (stroke (width 0) (type default)) + (uuid 5d161f32-e394-4146-ac22-16ca392015d5) + ) + (wire (pts (xy 77.47 137.16) (xy 77.47 140.97)) + (stroke (width 0) (type default)) + (uuid 5d203596-365b-4c1c-989d-12df46699a4a) + ) + (wire (pts (xy 104.14 120.65) (xy 105.41 120.65)) + (stroke (width 0) (type default)) + (uuid 5d2fac3a-623c-4dee-bb19-fa31d3043afb) + ) + (wire (pts (xy 60.96 100.33) (xy 59.69 100.33)) + (stroke (width 0) (type default)) + (uuid 5d332055-c245-4b21-939c-df2fb4c430df) + ) + (wire (pts (xy 185.42 176.53) (xy 194.31 176.53)) + (stroke (width 0) (type default)) + (uuid 5d4cfe5b-ed13-43e6-b159-c8cd555c9b65) + ) + (wire (pts (xy 92.71 100.33) (xy 92.71 101.6)) + (stroke (width 0) (type default)) + (uuid 5fc7e2a9-f2ac-4f04-bfc1-649e066ba4c2) + ) + (wire (pts (xy 105.41 120.65) (xy 105.41 125.73)) + (stroke (width 0) (type default)) + (uuid 602e3051-2e8b-483f-bb91-c096d91b69d3) + ) + (wire (pts (xy 218.44 72.39) (xy 227.33 72.39)) + (stroke (width 0) (type default)) + (uuid 605c377f-0ceb-4381-8b3a-1de8740ae822) + ) + (wire (pts (xy 293.37 93.98) (xy 293.37 87.63)) + (stroke (width 0) (type default)) + (uuid 60eaed85-fd1f-4a5d-ab0d-794399c96e54) + ) + (wire (pts (xy 167.64 100.33) (xy 171.45 100.33)) + (stroke (width 0) (type default)) + (uuid 6145eafc-d1a5-4a4c-90e0-4e37fc35f273) + ) + (wire (pts (xy 29.21 198.12) (xy 29.21 191.77)) + (stroke (width 0) (type default)) + (uuid 6224008a-0a64-45f9-b20f-6528ebf838f8) + ) + (wire (pts (xy 350.52 176.53) (xy 350.52 179.07)) + (stroke (width 0) (type default)) + (uuid 645f8401-d2ef-4043-b028-ed7137473c95) + ) + (wire (pts (xy 138.43 166.37) (xy 138.43 161.29)) + (stroke (width 0) (type default)) + (uuid 65d9cba9-b6ca-422a-a75c-4f3967d70533) + ) + (wire (pts (xy 332.74 146.05) (xy 336.55 146.05)) + (stroke (width 0) (type default)) + (uuid 663bde99-498d-483c-a292-876220284423) + ) + (wire (pts (xy 135.89 69.85) (xy 133.35 69.85)) + (stroke (width 0) (type default)) + (uuid 6674c45b-48aa-4bc8-8542-5ec96c78df3a) + ) + (wire (pts (xy 39.37 140.97) (xy 44.45 140.97)) + (stroke (width 0) (type default)) + (uuid 66c005bb-e464-4f3f-98a8-aef85a52ad32) + ) + (wire (pts (xy 68.58 120.65) (xy 72.39 120.65)) + (stroke (width 0) (type default)) + (uuid 67514d83-b750-4610-8226-1381e7549981) + ) + (wire (pts (xy 273.05 72.39) (xy 273.05 63.5)) + (stroke (width 0) (type default)) + (uuid 6781c889-64a7-4be5-8f1f-9eb8abf6a65f) + ) + (wire (pts (xy 167.64 146.05) (xy 171.45 146.05)) + (stroke (width 0) (type default)) + (uuid 67b4c0e4-9ed3-4c40-bcdf-82d2d08b747a) + ) + (wire (pts (xy 359.41 198.12) (xy 359.41 191.77)) + (stroke (width 0) (type default)) + (uuid 683b3bc8-dcf0-45be-86ff-88e17b7fd171) + ) + (wire (pts (xy 171.45 140.97) (xy 171.45 146.05)) + (stroke (width 0) (type default)) + (uuid 687107c5-f7e9-459b-acb8-95b51b38dc4d) + ) + (wire (pts (xy 336.55 146.05) (xy 336.55 149.86)) + (stroke (width 0) (type default)) + (uuid 688c11f8-25b0-40f6-b504-a29f07b131bb) + ) + (wire (pts (xy 270.51 140.97) (xy 275.59 140.97)) + (stroke (width 0) (type default)) + (uuid 68f7526d-a68d-4ade-944b-383971d19528) + ) + (wire (pts (xy 127 140.97) (xy 125.73 140.97)) + (stroke (width 0) (type default)) + (uuid 69918af2-7972-4567-985e-a9eccf52db5a) + ) + (wire (pts (xy 152.4 176.53) (xy 161.29 176.53)) + (stroke (width 0) (type default)) + (uuid 69cd48c3-5e81-47e1-9b76-558549f01a29) + ) + (wire (pts (xy 369.57 125.73) (xy 369.57 129.54)) + (stroke (width 0) (type default)) + (uuid 6ab8d744-58c2-4ddf-8288-0fedd35b70ee) + ) + (wire (pts (xy 356.87 146.05) (xy 358.14 146.05)) + (stroke (width 0) (type default)) + (uuid 6b4c8490-fa99-427a-bdb9-95ffd1cc4710) + ) + (wire (pts (xy 284.48 72.39) (xy 284.48 74.93)) + (stroke (width 0) (type default)) + (uuid 6b9a0c64-4043-4d2c-b595-cb9907b9392f) + ) + (wire (pts (xy 74.93 201.93) (xy 107.95 201.93)) + (stroke (width 0) (type default)) + (uuid 6b9a9a7e-44d5-4560-9f00-e885fae84e13) + ) + (wire (pts (xy 39.37 140.97) (xy 39.37 146.05)) + (stroke (width 0) (type default)) + (uuid 6bfd10d0-a996-4cf9-b80e-839bc9f6d3a3) + ) + (wire (pts (xy 341.63 125.73) (xy 341.63 129.54)) + (stroke (width 0) (type default)) + (uuid 6c4eac2b-dd0f-4ab7-b086-a220af5318b3) + ) + (wire (pts (xy 233.68 105.41) (xy 237.49 105.41)) + (stroke (width 0) (type default)) + (uuid 6c8e65b4-32e3-4c4e-ac2b-f1ff88d8d513) + ) + (wire (pts (xy 110.49 125.73) (xy 110.49 129.54)) + (stroke (width 0) (type default)) + (uuid 6d1aa6bb-b85b-4bf8-a002-d875b3a8ced5) + ) + (wire (pts (xy 237.49 87.63) (xy 237.49 100.33)) + (stroke (width 0) (type default)) + (uuid 6e2536d2-956b-4d29-ba9a-fd3134262152) + ) + (wire (pts (xy 372.11 72.39) (xy 372.11 63.5)) + (stroke (width 0) (type default)) + (uuid 6edc85b3-7166-4be0-a93a-a35af417a2ff) + ) + (wire (pts (xy 266.7 166.37) (xy 270.51 166.37)) + (stroke (width 0) (type default)) + (uuid 6f6cd27b-6d21-460e-8fdd-e779997acd8a) + ) + (wire (pts (xy 83.82 140.97) (xy 83.82 137.16)) + (stroke (width 0) (type default)) + (uuid 6f7f617f-cbfb-47c0-8825-24f4f040d8f2) + ) + (wire (pts (xy 231.14 214.63) (xy 232.41 214.63)) + (stroke (width 0) (type default)) + (uuid 6f970fd7-24fc-4a67-a6d8-b6b8e163cebb) + ) + (wire (pts (xy 350.52 72.39) (xy 350.52 74.93)) + (stroke (width 0) (type default)) + (uuid 6fd51553-2037-4f2d-ba6d-b3b967de1f26) + ) + (wire (pts (xy 39.37 137.16) (xy 39.37 140.97)) + (stroke (width 0) (type default)) + (uuid 6fe1f429-7763-4b37-be8d-3a17ed99fbc2) + ) + (wire (pts (xy 341.63 137.16) (xy 341.63 140.97)) + (stroke (width 0) (type default)) + (uuid 721764c7-25bf-4907-ada5-2cabdaae276c) + ) + (wire (pts (xy 332.74 166.37) (xy 336.55 166.37)) + (stroke (width 0) (type default)) + (uuid 726749e4-56d7-4d74-89b5-e5808d04cf18) + ) + (wire (pts (xy 356.87 105.41) (xy 358.14 105.41)) + (stroke (width 0) (type default)) + (uuid 72d41015-1e05-4194-a042-e6bb23d5de8d) + ) + (wire (pts (xy 171.45 166.37) (xy 171.45 176.53)) + (stroke (width 0) (type default)) + (uuid 73bf8c73-ba34-44a0-9ee4-e6521e0feeb8) + ) + (wire (pts (xy 72.39 146.05) (xy 72.39 149.86)) + (stroke (width 0) (type default)) + (uuid 745896be-8b14-43f3-a25b-b6a94f590945) + ) + (wire (pts (xy 59.69 140.97) (xy 59.69 146.05)) + (stroke (width 0) (type default)) + (uuid 745eefd8-595c-4fc6-a537-9747975ce79d) + ) + (wire (pts (xy 167.64 161.29) (xy 171.45 161.29)) + (stroke (width 0) (type default)) + (uuid 74813040-d1aa-443c-80f9-77096977d752) + ) + (wire (pts (xy 273.05 191.77) (xy 273.05 201.93)) + (stroke (width 0) (type default)) + (uuid 74e1baf8-aad3-4c3f-a6d8-85d237ed8b65) + ) + (wire (pts (xy 382.27 176.53) (xy 382.27 179.07)) + (stroke (width 0) (type default)) + (uuid 7501a589-1134-4f70-b79e-07bfd51bc615) + ) + (wire (pts (xy 125.73 105.41) (xy 127 105.41)) + (stroke (width 0) (type default)) + (uuid 750a1f6d-6bf5-4e43-b5f0-3978c7586d9d) + ) + (wire (pts (xy 317.5 176.53) (xy 326.39 176.53)) + (stroke (width 0) (type default)) + (uuid 76045f1b-2ee9-4cdb-9626-d55085ada1ee) + ) + (wire (pts (xy 167.64 105.41) (xy 171.45 105.41)) + (stroke (width 0) (type default)) + (uuid 7624e0ad-84cf-4c6e-9614-6cd8b2e7d665) + ) + (wire (pts (xy 127 100.33) (xy 125.73 100.33)) + (stroke (width 0) (type default)) + (uuid 7687d3f3-e587-441e-b430-2465132a9fc3) + ) + (wire (pts (xy 72.39 125.73) (xy 77.47 125.73)) + (stroke (width 0) (type default)) + (uuid 76ba1fb9-af1b-4df0-8343-c0857dbadc58) + ) + (wire (pts (xy 194.31 191.77) (xy 194.31 196.85)) + (stroke (width 0) (type default)) + (uuid 777d293a-ddd6-4d52-b59b-3abf967482b8) + ) + (wire (pts (xy 365.76 125.73) (xy 369.57 125.73)) + (stroke (width 0) (type default)) + (uuid 78e4c67a-8e8e-4ffc-84e5-a2dd732c4ba4) + ) + (wire (pts (xy 173.99 63.5) (xy 173.99 72.39)) + (stroke (width 0) (type default)) + (uuid 7923ec58-9e9e-483e-ae4a-8e952687993e) + ) + (wire (pts (xy 182.88 226.06) (xy 200.66 226.06)) + (stroke (width 0) (type default)) + (uuid 7b2a09c0-8e7c-4c31-bf99-caeb95640be9) + ) + (wire (pts (xy 41.91 201.93) (xy 74.93 201.93)) + (stroke (width 0) (type default)) + (uuid 7d111f5c-67f9-46eb-b2e5-d2eb85e531bf) + ) + (wire (pts (xy 74.93 191.77) (xy 74.93 201.93)) + (stroke (width 0) (type default)) + (uuid 7e4c2834-3068-4000-879c-e301c5dca595) + ) + (wire (pts (xy 317.5 72.39) (xy 326.39 72.39)) + (stroke (width 0) (type default)) + (uuid 7e62fc2b-7fbb-4f51-841f-c70ebd0a9aa7) + ) + (wire (pts (xy 127 161.29) (xy 125.73 161.29)) + (stroke (width 0) (type default)) + (uuid 7f1d268b-864a-4993-b398-a49d9d500eb1) + ) + (wire (pts (xy 158.75 100.33) (xy 158.75 105.41)) + (stroke (width 0) (type default)) + (uuid 7ffe1bfe-54cd-4cf0-a50b-b862ce97f420) + ) + (wire (pts (xy 204.47 146.05) (xy 204.47 149.86)) + (stroke (width 0) (type default)) + (uuid 8014132b-acb4-49e7-ad90-dc67d57394b5) + ) + (wire (pts (xy 72.39 140.97) (xy 72.39 146.05)) + (stroke (width 0) (type default)) + (uuid 8015a6a6-10c3-4707-bf8c-8be7613cf27e) + ) + (wire (pts (xy 125.73 140.97) (xy 125.73 146.05)) + (stroke (width 0) (type default)) + (uuid 802e4c79-dde9-456b-acd6-dcddc0a8e876) + ) + (wire (pts (xy 105.41 146.05) (xy 105.41 149.86)) + (stroke (width 0) (type default)) + (uuid 825c170f-a299-4d67-840b-96efbf641b21) + ) + (wire (pts (xy 69.85 72.39) (xy 69.85 69.85)) + (stroke (width 0) (type default)) + (uuid 82cab987-b2c5-46fe-b7c4-cd7ff901dc69) + ) + (wire (pts (xy 332.74 125.73) (xy 336.55 125.73)) + (stroke (width 0) (type default)) + (uuid 838ad642-ba0b-4d2b-8978-c858fc2c8d20) + ) + (wire (pts (xy 240.03 63.5) (xy 273.05 63.5)) + (stroke (width 0) (type default)) + (uuid 83a9141f-3ebf-4652-afde-882c485527c7) + ) + (wire (pts (xy 119.38 176.53) (xy 128.27 176.53)) + (stroke (width 0) (type default)) + (uuid 84776ec2-45a9-4e92-88e1-c36fb39af6ee) + ) + (wire (pts (xy 200.66 146.05) (xy 204.47 146.05)) + (stroke (width 0) (type default)) + (uuid 85245972-2b61-4775-bf59-66e54d6f4b9a) + ) + (wire (pts (xy 213.36 217.17) (xy 218.44 217.17)) + (stroke (width 0) (type default)) + (uuid 852c111c-a792-4612-8817-cb1b8f693d1a) + ) + (wire (pts (xy 134.62 146.05) (xy 138.43 146.05)) + (stroke (width 0) (type default)) + (uuid 8671a9b4-ca98-4a36-af06-4dfee6da2a9c) + ) + (wire (pts (xy 107.95 63.5) (xy 107.95 72.39)) + (stroke (width 0) (type default)) + (uuid 86b15a33-d996-4b15-bbb5-3ee14aee0357) + ) + (wire (pts (xy 356.87 166.37) (xy 358.14 166.37)) + (stroke (width 0) (type default)) + (uuid 86e33657-0fba-49b0-a821-59eb0bfab53a) + ) + (wire (pts (xy 237.49 120.65) (xy 237.49 125.73)) + (stroke (width 0) (type default)) + (uuid 86e95116-a721-4260-a38e-5a22453da077) + ) + (wire (pts (xy 332.74 140.97) (xy 336.55 140.97)) + (stroke (width 0) (type default)) + (uuid 86ebef98-d2ee-472a-881f-ef2f5d4f5d74) + ) + (wire (pts (xy 191.77 166.37) (xy 193.04 166.37)) + (stroke (width 0) (type default)) + (uuid 86fee1cc-89d5-4212-a3fe-816cb44e4674) + ) + (wire (pts (xy 234.95 72.39) (xy 234.95 69.85)) + (stroke (width 0) (type default)) + (uuid 8753e24f-2470-4bd2-a1cd-4cf517724a60) + ) + (wire (pts (xy 128.27 92.71) (xy 128.27 87.63)) + (stroke (width 0) (type default)) + (uuid 8772e7a6-c5ec-4c54-821c-97d3f18f8c42) + ) + (wire (pts (xy 207.01 63.5) (xy 207.01 72.39)) + (stroke (width 0) (type default)) + (uuid 87c78926-66d7-48d9-8b2b-da4c415d44d8) + ) + (wire (pts (xy 152.4 72.39) (xy 152.4 74.93)) + (stroke (width 0) (type default)) + (uuid 8813d6be-8107-48db-b36b-163879f392a3) + ) + (wire (pts (xy 35.56 166.37) (xy 39.37 166.37)) + (stroke (width 0) (type default)) + (uuid 88fb6693-fda7-4231-a3d2-8aed4f2c75be) + ) + (wire (pts (xy 332.74 105.41) (xy 336.55 105.41)) + (stroke (width 0) (type default)) + (uuid 8913d273-260c-4e7c-abb3-52a3658e6e49) + ) + (wire (pts (xy 369.57 146.05) (xy 369.57 149.86)) + (stroke (width 0) (type default)) + (uuid 8944816b-8473-406d-a131-32275a3900e6) + ) + (wire (pts (xy 157.48 212.09) (xy 166.37 212.09)) + (stroke (width 0) (type default)) + (uuid 89534699-6a4a-497a-b955-61b6fe4b5484) + ) + (wire (pts (xy 339.09 201.93) (xy 372.11 201.93)) + (stroke (width 0) (type default)) + (uuid 89a1f33e-482c-4821-bf3e-7e7d7430cb3b) + ) + (wire (pts (xy 303.53 87.63) (xy 303.53 105.41)) + (stroke (width 0) (type default)) + (uuid 89cc8435-7c1b-408b-a5ec-41e359db0513) + ) + (wire (pts (xy 68.58 125.73) (xy 72.39 125.73)) + (stroke (width 0) (type default)) + (uuid 8af843c4-c10c-49e1-bf5b-a531b46bd671) + ) + (wire (pts (xy 92.71 151.13) (xy 92.71 146.05)) + (stroke (width 0) (type default)) + (uuid 8b1b8128-cd44-43f6-822e-0347c7e0b8bd) + ) + (wire (pts (xy 350.52 72.39) (xy 359.41 72.39)) + (stroke (width 0) (type default)) + (uuid 8bcc53bd-fad3-406a-b6fe-8b5f4121061e) + ) + (wire (pts (xy 171.45 105.41) (xy 171.45 109.22)) + (stroke (width 0) (type default)) + (uuid 8bcc6a42-d818-4d39-bcce-ee3c40c317bd) + ) + (wire (pts (xy 231.14 217.17) (xy 232.41 217.17)) + (stroke (width 0) (type default)) + (uuid 8d148f58-9391-4558-9d70-799775012bb5) + ) + (wire (pts (xy 182.88 220.98) (xy 187.96 220.98)) + (stroke (width 0) (type default)) + (uuid 8d4efc0b-7333-4156-afd5-939412845556) + ) + (wire (pts (xy 251.46 176.53) (xy 251.46 179.07)) + (stroke (width 0) (type default)) + (uuid 8d666cc4-e36e-44bc-880e-be5735674b8a) + ) + (wire (pts (xy 125.73 146.05) (xy 127 146.05)) + (stroke (width 0) (type default)) + (uuid 8dd05fb0-af35-46d6-a3ad-5181b747b1fc) + ) + (wire (pts (xy 158.75 125.73) (xy 160.02 125.73)) + (stroke (width 0) (type default)) + (uuid 8e0f0091-12de-4a01-825f-3cb9c134cd59) + ) + (wire (pts (xy 125.73 125.73) (xy 127 125.73)) + (stroke (width 0) (type default)) + (uuid 8e2899b5-b821-4e33-b720-dc1dc7641bcd) + ) + (wire (pts (xy 218.44 176.53) (xy 227.33 176.53)) + (stroke (width 0) (type default)) + (uuid 8ef7fd9f-62ff-4e2e-80a2-3d6a72a37ece) + ) + (wire (pts (xy 110.49 137.16) (xy 110.49 140.97)) + (stroke (width 0) (type default)) + (uuid 8efb7fa6-a881-4fc2-a848-3950309f40cf) + ) + (wire (pts (xy 138.43 116.84) (xy 138.43 120.65)) + (stroke (width 0) (type default)) + (uuid 8f3e1197-105d-468f-96c5-83783bde0eb6) + ) + (wire (pts (xy 267.97 72.39) (xy 267.97 69.85)) + (stroke (width 0) (type default)) + (uuid 8f4e25b8-668b-4e64-b458-52636ad12051) + ) + (wire (pts (xy 35.56 140.97) (xy 39.37 140.97)) + (stroke (width 0) (type default)) + (uuid 8fc200b5-e30b-4478-92b1-fffb3894eb43) + ) + (wire (pts (xy 284.48 72.39) (xy 293.37 72.39)) + (stroke (width 0) (type default)) + (uuid 90e9e638-ac2a-4b4c-a89e-33df3bf20689) + ) + (wire (pts (xy 224.79 120.65) (xy 224.79 125.73)) + (stroke (width 0) (type default)) + (uuid 90fd55c7-e7a6-4c1f-8708-d97c305e1225) + ) + (wire (pts (xy 101.6 115.57) (xy 104.14 115.57)) + (stroke (width 0) (type default)) + (uuid 916967e3-5d9c-44ec-b1a8-bf7684d06229) + ) + (wire (pts (xy 326.39 93.98) (xy 326.39 87.63)) + (stroke (width 0) (type default)) + (uuid 919028d1-7621-4d94-a2f9-2cc0b4cd600f) + ) + (wire (pts (xy 339.09 63.5) (xy 372.11 63.5)) + (stroke (width 0) (type default)) + (uuid 92083523-9b4d-47e7-a3c1-460ac56381df) + ) + (wire (pts (xy 240.03 201.93) (xy 240.03 191.77)) + (stroke (width 0) (type default)) + (uuid 924a717a-70b5-44aa-87ba-d34517266a1e) + ) + (wire (pts (xy 68.58 140.97) (xy 72.39 140.97)) + (stroke (width 0) (type default)) + (uuid 92554269-b237-4bd9-90b7-4a22b3ed7b7f) + ) + (wire (pts (xy 303.53 125.73) (xy 308.61 125.73)) + (stroke (width 0) (type default)) + (uuid 92c79332-82df-4843-85b5-3c71c8f364c6) + ) + (wire (pts (xy 171.45 166.37) (xy 171.45 161.29)) + (stroke (width 0) (type default)) + (uuid 938c4bbc-af43-4ff6-81ed-b144c48d9f48) + ) + (wire (pts (xy 127 120.65) (xy 125.73 120.65)) + (stroke (width 0) (type default)) + (uuid 93b76e4e-895f-457b-b177-aa0fcfd10d90) + ) + (wire (pts (xy 336.55 157.48) (xy 336.55 166.37)) + (stroke (width 0) (type default)) + (uuid 93b8fbca-a3ee-4e94-85c1-e43e9a7bc553) + ) + (wire (pts (xy 290.83 166.37) (xy 292.1 166.37)) + (stroke (width 0) (type default)) + (uuid 9433cf9f-a84d-424d-9481-43905772fb8d) + ) + (wire (pts (xy 68.58 100.33) (xy 72.39 100.33)) + (stroke (width 0) (type default)) + (uuid 945faa7a-9f84-4c1b-8f4f-b219c85211dc) + ) + (wire (pts (xy 317.5 72.39) (xy 317.5 74.93)) + (stroke (width 0) (type default)) + (uuid 94be267a-be35-49d2-ab7a-63020df2b46b) + ) + (wire (pts (xy 233.68 166.37) (xy 237.49 166.37)) + (stroke (width 0) (type default)) + (uuid 95a50f8f-3e4c-4e9f-89e9-6858d9ec1cb7) + ) + (wire (pts (xy 182.88 223.52) (xy 187.96 223.52)) + (stroke (width 0) (type default)) + (uuid 961509ab-4747-488f-9615-75a66fdc1178) + ) + (wire (pts (xy 284.48 176.53) (xy 293.37 176.53)) + (stroke (width 0) (type default)) + (uuid 96256b2f-85b9-4fc9-93e0-dc0434840e31) + ) + (wire (pts (xy 257.81 105.41) (xy 259.08 105.41)) + (stroke (width 0) (type default)) + (uuid 970a8599-881b-42fe-ada4-1028f79ec8cb) + ) + (wire (pts (xy 273.05 63.5) (xy 306.07 63.5)) + (stroke (width 0) (type default)) + (uuid 974346b2-2a99-4d25-82d9-07e30e1d617b) + ) + (wire (pts (xy 209.55 137.16) (xy 209.55 140.97)) + (stroke (width 0) (type default)) + (uuid 977a5457-e82c-463a-b452-ff1b84356ec3) + ) + (wire (pts (xy 275.59 125.73) (xy 275.59 129.54)) + (stroke (width 0) (type default)) + (uuid 97a935ed-dfc6-4108-aaa9-d69935867022) + ) + (wire (pts (xy 26.67 105.41) (xy 27.94 105.41)) + (stroke (width 0) (type default)) + (uuid 9844ff05-257c-42a2-97cc-3766067fefb5) + ) + (wire (pts (xy 257.81 146.05) (xy 259.08 146.05)) + (stroke (width 0) (type default)) + (uuid 988be366-2a0f-410f-af8e-938a0419685e) + ) + (wire (pts (xy 224.79 161.29) (xy 224.79 166.37)) + (stroke (width 0) (type default)) + (uuid 990a02f3-8c3b-4a9a-912b-5e18be5191d2) + ) + (wire (pts (xy 365.76 166.37) (xy 369.57 166.37)) + (stroke (width 0) (type default)) + (uuid 9937684a-5e1e-40d7-8252-d2e76ecbaa4b) + ) + (wire (pts (xy 339.09 191.77) (xy 339.09 201.93)) + (stroke (width 0) (type default)) + (uuid 9955a133-bf01-4005-8b0c-7803d6d073a1) + ) + (wire (pts (xy 72.39 137.16) (xy 72.39 140.97)) + (stroke (width 0) (type default)) + (uuid 9968484e-d859-4ba4-88e6-828ba1c66ff2) + ) + (wire (pts (xy 369.57 116.84) (xy 369.57 125.73)) + (stroke (width 0) (type default)) + (uuid 9969a141-c23f-432a-9fe3-b1c9eb290454) + ) + (wire (pts (xy 257.81 125.73) (xy 259.08 125.73)) + (stroke (width 0) (type default)) + (uuid 9a9efdcc-0f83-4ad7-87b0-fe0e0e7522b1) + ) + (wire (pts (xy 308.61 125.73) (xy 308.61 129.54)) + (stroke (width 0) (type default)) + (uuid 9ab356a8-20e4-493e-85ea-6d89d56d4eb6) + ) + (wire (pts (xy 227.33 191.77) (xy 227.33 196.85)) + (stroke (width 0) (type default)) + (uuid 9ad9f41c-c9a7-4815-b2f1-2a4d571c3466) + ) + (wire (pts (xy 290.83 125.73) (xy 292.1 125.73)) + (stroke (width 0) (type default)) + (uuid 9c7d716a-c9df-459d-ab78-fb71f5b99e56) + ) + (wire (pts (xy 185.42 72.39) (xy 194.31 72.39)) + (stroke (width 0) (type default)) + (uuid 9cd19384-c012-4255-83a6-4cab3d29a1d0) + ) + (wire (pts (xy 152.4 201.93) (xy 152.4 207.01)) + (stroke (width 0) (type default)) + (uuid 9da98624-9d42-45e6-a009-8ff63043af01) + ) + (wire (pts (xy 72.39 166.37) (xy 72.39 176.53)) + (stroke (width 0) (type default)) + (uuid 9f2c0cdd-6a53-4172-bafe-599cb757b348) + ) + (wire (pts (xy 233.68 161.29) (xy 237.49 161.29)) + (stroke (width 0) (type default)) + (uuid 9ff6c653-6e50-4820-9a8c-9532388f7cca) + ) + (wire (pts (xy 365.76 146.05) (xy 369.57 146.05)) + (stroke (width 0) (type default)) + (uuid a04ee7e7-b4e0-4eb8-a410-b5475d3259a7) + ) + (wire (pts (xy 83.82 125.73) (xy 83.82 129.54)) + (stroke (width 0) (type default)) + (uuid a09f21d9-a49e-4b1a-b859-a17817ebbbb8) + ) + (wire (pts (xy 140.97 63.5) (xy 140.97 72.39)) + (stroke (width 0) (type default)) + (uuid a0dd8fad-d5f6-491c-bbca-2a2d62d85acd) + ) + (wire (pts (xy 44.45 140.97) (xy 50.8 140.97)) + (stroke (width 0) (type default)) + (uuid a1130e83-fdd1-4349-9019-9c86b00222a6) + ) + (wire (pts (xy 77.47 125.73) (xy 77.47 129.54)) + (stroke (width 0) (type default)) + (uuid a13e694a-eab9-41aa-952c-2d81ab04ec94) + ) + (wire (pts (xy 369.57 105.41) (xy 369.57 109.22)) + (stroke (width 0) (type default)) + (uuid a1644031-eb24-4c75-abe3-bb13af8acc3a) + ) + (wire (pts (xy 101.6 140.97) (xy 104.14 140.97)) + (stroke (width 0) (type default)) + (uuid a16dc39c-fea2-4b23-9027-0dff2d3ccb88) + ) + (wire (pts (xy 204.47 105.41) (xy 204.47 109.22)) + (stroke (width 0) (type default)) + (uuid a19212c1-77c1-4920-bc73-cca0b390ed0c) + ) + (wire (pts (xy 325.12 120.65) (xy 323.85 120.65)) + (stroke (width 0) (type default)) + (uuid a21f245e-d9ea-4ab1-8316-45443c8fa6d4) + ) + (wire (pts (xy 257.81 166.37) (xy 259.08 166.37)) + (stroke (width 0) (type default)) + (uuid a2445f60-5a85-4633-b52e-2b54c95f6eea) + ) + (wire (pts (xy 234.95 69.85) (xy 232.41 69.85)) + (stroke (width 0) (type default)) + (uuid a2fc0754-aa13-49e4-a8e3-ad5bfd5e67b0) + ) + (wire (pts (xy 200.66 218.44) (xy 201.93 218.44)) + (stroke (width 0) (type default)) + (uuid a3313cb3-c23c-4f2c-ac76-5536c3d1447b) + ) + (wire (pts (xy 323.85 120.65) (xy 323.85 125.73)) + (stroke (width 0) (type default)) + (uuid a4c21675-4a2e-4754-92c8-81363ceb3221) + ) + (wire (pts (xy 86.36 176.53) (xy 95.25 176.53)) + (stroke (width 0) (type default)) + (uuid a5acc901-8bcd-4608-a8e7-8f48c0560fef) + ) + (wire (pts (xy 41.91 191.77) (xy 41.91 201.93)) + (stroke (width 0) (type default)) + (uuid a5de0274-5098-4919-8d44-db67d5b504ca) + ) + (wire (pts (xy 173.99 63.5) (xy 207.01 63.5)) + (stroke (width 0) (type default)) + (uuid a6131ef6-e535-4c37-948e-c7f9aaeb38eb) + ) + (wire (pts (xy 242.57 125.73) (xy 242.57 129.54)) + (stroke (width 0) (type default)) + (uuid a732d346-2e1b-4ce1-b3c7-f6c99745ba2f) + ) + (wire (pts (xy 232.41 219.71) (xy 232.41 222.25)) + (stroke (width 0) (type default)) + (uuid a78887b0-9e4e-4a60-ac7c-0d42d0d11ca9) + ) + (wire (pts (xy 138.43 100.33) (xy 138.43 105.41)) + (stroke (width 0) (type default)) + (uuid a7b75d9e-8734-48b8-8864-c52b6b60243e) + ) + (wire (pts (xy 299.72 125.73) (xy 303.53 125.73)) + (stroke (width 0) (type default)) + (uuid a7f8c020-9cb2-4975-92f7-0e51d4b7e22e) + ) + (wire (pts (xy 20.32 72.39) (xy 20.32 74.93)) + (stroke (width 0) (type default)) + (uuid a80ac0af-3b54-4fef-a6f3-401de24bf26e) + ) + (wire (pts (xy 359.41 93.98) (xy 359.41 87.63)) + (stroke (width 0) (type default)) + (uuid a931924c-9c65-4d04-bfca-2f33a039a7e3) + ) + (wire (pts (xy 374.65 125.73) (xy 374.65 129.54)) + (stroke (width 0) (type default)) + (uuid a955a05b-1be2-402d-b83a-65dd4393a8ab) + ) + (wire (pts (xy 95.25 92.71) (xy 95.25 87.63)) + (stroke (width 0) (type default)) + (uuid a9d97338-dd33-4587-aa6b-80a1ddee19f6) + ) + (wire (pts (xy 72.39 100.33) (xy 72.39 105.41)) + (stroke (width 0) (type default)) + (uuid a9f69d82-d88a-41f9-8e6e-b35f4e59eff6) + ) + (wire (pts (xy 233.68 140.97) (xy 237.49 140.97)) + (stroke (width 0) (type default)) + (uuid aa91567c-d669-4747-a313-b5d9843e7df0) + ) + (wire (pts (xy 398.78 69.85) (xy 396.24 69.85)) + (stroke (width 0) (type default)) + (uuid abe31de4-0b28-443e-9571-886a6373712c) + ) + (wire (pts (xy 36.83 72.39) (xy 36.83 69.85)) + (stroke (width 0) (type default)) + (uuid accd0ac6-e6d4-446a-91da-0255d60de67e) + ) + (wire (pts (xy 231.14 219.71) (xy 232.41 219.71)) + (stroke (width 0) (type default)) + (uuid ad2b1fb6-6703-406c-8e3c-8865fa8ee5ba) + ) + (wire (pts (xy 201.93 213.36) (xy 200.66 213.36)) + (stroke (width 0) (type default)) + (uuid ad492eee-261c-4a35-a405-4e61bca7780c) + ) + (wire (pts (xy 204.47 116.84) (xy 204.47 125.73)) + (stroke (width 0) (type default)) + (uuid ad4e0d3f-ce92-4e6e-a32d-95a3486dcd6c) + ) + (wire (pts (xy 323.85 146.05) (xy 325.12 146.05)) + (stroke (width 0) (type default)) + (uuid ae2328b8-f8cd-4d46-a5b4-c4c2ddf26531) + ) + (wire (pts (xy 367.03 72.39) (xy 367.03 69.85)) + (stroke (width 0) (type default)) + (uuid af67e99e-1cf4-4985-82fe-2c2f87dcf9f9) + ) + (wire (pts (xy 303.53 125.73) (xy 303.53 129.54)) + (stroke (width 0) (type default)) + (uuid b00da782-1505-41e2-9c52-be15b6a3deb7) + ) + (wire (pts (xy 194.31 92.71) (xy 194.31 87.63)) + (stroke (width 0) (type default)) + (uuid b07983f3-0571-47ae-a11d-f8c34227adde) + ) + (wire (pts (xy 300.99 69.85) (xy 298.45 69.85)) + (stroke (width 0) (type default)) + (uuid b0884c92-27d0-4303-ab71-c7a0b248672d) + ) + (wire (pts (xy 68.58 105.41) (xy 72.39 105.41)) + (stroke (width 0) (type default)) + (uuid b0f22b0d-7146-4ef5-8820-e30963a305b7) + ) + (wire (pts (xy 74.93 63.5) (xy 107.95 63.5)) + (stroke (width 0) (type default)) + (uuid b14b9029-07c3-4655-8738-81aeb4e5d27c) + ) + (wire (pts (xy 213.36 227.33) (xy 231.14 227.33)) + (stroke (width 0) (type default)) + (uuid b1a9e544-b4ef-417a-93f7-fbd33b14a419) + ) + (wire (pts (xy 60.96 161.29) (xy 59.69 161.29)) + (stroke (width 0) (type default)) + (uuid b32b8fbd-1813-4c07-8ca2-ca4c057afe3f) + ) + (wire (pts (xy 166.37 213.36) (xy 166.37 212.09)) + (stroke (width 0) (type default)) + (uuid b368a282-6eae-4084-8bd8-0fb1bccb10d9) + ) + (wire (pts (xy 53.34 72.39) (xy 62.23 72.39)) + (stroke (width 0) (type default)) + (uuid b4cb5910-3690-4e9e-be8b-f7fae56ad65b) + ) + (wire (pts (xy 72.39 116.84) (xy 72.39 120.65)) + (stroke (width 0) (type default)) + (uuid b530eddb-c221-45de-aa7c-8b00b8458412) + ) + (wire (pts (xy 138.43 140.97) (xy 138.43 146.05)) + (stroke (width 0) (type default)) + (uuid b5e7d81f-5a25-4320-8340-ced6075c309a) + ) + (wire (pts (xy 59.69 146.05) (xy 60.96 146.05)) + (stroke (width 0) (type default)) + (uuid b7af118b-3efc-4fa4-a19c-a459c5695586) + ) + (wire (pts (xy 104.14 140.97) (xy 104.14 146.05)) + (stroke (width 0) (type default)) + (uuid b907dba2-77af-445f-b32f-fbb3fdebf637) + ) + (wire (pts (xy 59.69 105.41) (xy 60.96 105.41)) + (stroke (width 0) (type default)) + (uuid ba62b95a-7445-4e52-b34f-1a1ec3417fec) + ) + (wire (pts (xy 77.47 140.97) (xy 83.82 140.97)) + (stroke (width 0) (type default)) + (uuid ba76150f-4fc4-48b2-b746-6e1d2a889b40) + ) + (wire (pts (xy 119.38 176.53) (xy 119.38 179.07)) + (stroke (width 0) (type default)) + (uuid ba8c2387-b605-4565-88b4-06d32f504022) + ) + (wire (pts (xy 27.94 161.29) (xy 26.67 161.29)) + (stroke (width 0) (type default)) + (uuid bb7ca0ec-9f5a-42c0-8609-baafe319c3d6) + ) + (wire (pts (xy 382.27 72.39) (xy 382.27 74.93)) + (stroke (width 0) (type default)) + (uuid bcd7638d-007b-406d-970a-04fb24e100b2) + ) + (wire (pts (xy 204.47 166.37) (xy 204.47 176.53)) + (stroke (width 0) (type default)) + (uuid bcf305b3-c4f7-4ca8-9cc8-c827a7c3cef6) + ) + (wire (pts (xy 86.36 72.39) (xy 95.25 72.39)) + (stroke (width 0) (type default)) + (uuid be1dd712-6200-4715-b5d4-0e25623b117e) + ) + (wire (pts (xy 372.11 63.5) (xy 403.86 63.5)) + (stroke (width 0) (type default)) + (uuid befe406f-7d45-42fc-9a5d-1bda06ace603) + ) + (wire (pts (xy 303.53 146.05) (xy 303.53 149.86)) + (stroke (width 0) (type default)) + (uuid bf4946b2-0041-4190-b257-a645ac760b4d) + ) + (wire (pts (xy 143.51 137.16) (xy 143.51 140.97)) + (stroke (width 0) (type default)) + (uuid bffc26a5-2645-4553-b5ea-b134ac07e1a0) + ) + (wire (pts (xy 138.43 105.41) (xy 138.43 109.22)) + (stroke (width 0) (type default)) + (uuid c0e9d76e-b0bb-45de-bbc0-2d94cd9fe3b4) + ) + (wire (pts (xy 270.51 146.05) (xy 270.51 149.86)) + (stroke (width 0) (type default)) + (uuid c0f365e8-c803-4d7d-ba71-64ebd72b3ae4) + ) + (wire (pts (xy 231.14 222.25) (xy 232.41 222.25)) + (stroke (width 0) (type default)) + (uuid c10abd84-9042-4545-8808-f453843ff39d) + ) + (wire (pts (xy 39.37 116.84) (xy 39.37 120.65)) + (stroke (width 0) (type default)) + (uuid c1ae4458-2de5-404f-98fc-6f544d7d5c56) + ) + (wire (pts (xy 39.37 166.37) (xy 39.37 161.29)) + (stroke (width 0) (type default)) + (uuid c1d861ab-c084-43e8-a7b2-7831426e3bc2) + ) + (wire (pts (xy 303.53 105.41) (xy 303.53 109.22)) + (stroke (width 0) (type default)) + (uuid c1ffc16d-dffc-4c6a-9eac-146f20446cd8) + ) + (wire (pts (xy 105.41 166.37) (xy 105.41 176.53)) + (stroke (width 0) (type default)) + (uuid c2c4f6d1-bbd7-4e03-8382-f20dff331275) + ) + (wire (pts (xy 26.67 120.65) (xy 26.67 125.73)) + (stroke (width 0) (type default)) + (uuid c2dca04e-1ef8-496b-8e68-96e363175414) + ) + (wire (pts (xy 266.7 146.05) (xy 270.51 146.05)) + (stroke (width 0) (type default)) + (uuid c2f34839-0380-45cc-96bb-e364043494f4) + ) + (wire (pts (xy 334.01 69.85) (xy 331.47 69.85)) + (stroke (width 0) (type default)) + (uuid c37c78a3-cd6b-4ba0-84ee-de35df9cc777) + ) + (wire (pts (xy 317.5 176.53) (xy 317.5 179.07)) + (stroke (width 0) (type default)) + (uuid c3c8121e-2a5c-46df-93d4-e5f0f8efc027) + ) + (wire (pts (xy 233.68 100.33) (xy 237.49 100.33)) + (stroke (width 0) (type default)) + (uuid c3daebe9-b14e-4d55-8930-b1ef4744d449) + ) + (wire (pts (xy 92.71 120.65) (xy 92.71 125.73)) + (stroke (width 0) (type default)) + (uuid c3e8b2e1-8141-436c-b369-978c94701b10) + ) + (wire (pts (xy 44.45 137.16) (xy 44.45 140.97)) + (stroke (width 0) (type default)) + (uuid c3feaa96-c97c-435e-a8c3-82a656caf6a8) + ) + (wire (pts (xy 201.93 218.44) (xy 201.93 220.98)) + (stroke (width 0) (type default)) + (uuid c47a56c7-c6c1-4a8d-80d8-be7b6606d8e8) + ) + (wire (pts (xy 339.09 72.39) (xy 339.09 63.5)) + (stroke (width 0) (type default)) + (uuid c4e78ef9-ebc5-4496-a1a8-2c8328a0bf14) + ) + (wire (pts (xy 303.53 137.16) (xy 303.53 140.97)) + (stroke (width 0) (type default)) + (uuid c5036352-d2dc-4540-b2f2-011109f37686) + ) + (wire (pts (xy 270.51 137.16) (xy 270.51 140.97)) + (stroke (width 0) (type default)) + (uuid c528a0ea-67c5-477c-9335-a9d621127483) + ) + (wire (pts (xy 336.55 87.63) (xy 336.55 105.41)) + (stroke (width 0) (type default)) + (uuid c52a1a8b-7731-4dfa-83b4-275f38c6f519) + ) + (wire (pts (xy 35.56 100.33) (xy 39.37 100.33)) + (stroke (width 0) (type default)) + (uuid c5a64b36-75ad-433b-9a0c-1c677362a5cd) + ) + (wire (pts (xy 237.49 161.29) (xy 237.49 157.48)) + (stroke (width 0) (type default)) + (uuid c5affc48-55a4-44d1-ae76-6a45a7c19b93) + ) + (wire (pts (xy 284.48 176.53) (xy 284.48 179.07)) + (stroke (width 0) (type default)) + (uuid c683c40e-d760-4437-bf20-b4008fb3138d) + ) + (wire (pts (xy 204.47 125.73) (xy 204.47 129.54)) + (stroke (width 0) (type default)) + (uuid c6bfcff1-f562-4954-8522-602200acf7b0) + ) + (wire (pts (xy 134.62 161.29) (xy 138.43 161.29)) + (stroke (width 0) (type default)) + (uuid c776b6fb-bd7b-483b-9b18-2758c297ff6a) + ) + (wire (pts (xy 59.69 120.65) (xy 59.69 125.73)) + (stroke (width 0) (type default)) + (uuid c80c4efb-b3e2-4ab2-a46c-212cff27d294) + ) + (wire (pts (xy 26.67 161.29) (xy 26.67 166.37)) + (stroke (width 0) (type default)) + (uuid ca3d34d7-b67a-4534-a2ca-95c901450c96) + ) + (wire (pts (xy 176.53 125.73) (xy 176.53 129.54)) + (stroke (width 0) (type default)) + (uuid ca5763c6-ab59-43bb-8d42-78f70bf75f9a) + ) + (wire (pts (xy 92.71 140.97) (xy 92.71 146.05)) + (stroke (width 0) (type default)) + (uuid cae914b9-e92d-421f-a15c-d450c847b3c0) + ) + (wire (pts (xy 191.77 146.05) (xy 193.04 146.05)) + (stroke (width 0) (type default)) + (uuid cbe121cf-06bc-4f26-a4d2-4194b366d1de) + ) + (wire (pts (xy 226.06 100.33) (xy 224.79 100.33)) + (stroke (width 0) (type default)) + (uuid cccb7116-f4d7-4578-948d-1a78dc8a445d) + ) + (wire (pts (xy 134.62 125.73) (xy 138.43 125.73)) + (stroke (width 0) (type default)) + (uuid ce236dfc-b78e-4841-a9c9-4019c88e03b5) + ) + (wire (pts (xy 332.74 120.65) (xy 336.55 120.65)) + (stroke (width 0) (type default)) + (uuid ce9895ce-678b-4ea0-9273-6b73b1e97563) + ) + (wire (pts (xy 270.51 125.73) (xy 270.51 129.54)) + (stroke (width 0) (type default)) + (uuid ce9f7546-c4cd-4cf2-95e1-50f267582202) + ) + (wire (pts (xy 93.98 115.57) (xy 92.71 115.57)) + (stroke (width 0) (type default)) + (uuid cee5e56d-5d38-4160-9bf8-56ce2352e86c) + ) + (wire (pts (xy 152.4 201.93) (xy 173.99 201.93)) + (stroke (width 0) (type default)) + (uuid cef42e0a-0ea7-44ec-a93d-005e1a85b62e) + ) + (wire (pts (xy 72.39 166.37) (xy 72.39 161.29)) + (stroke (width 0) (type default)) + (uuid cf9295f0-a29c-49ff-86b6-212e34573d76) + ) + (wire (pts (xy 160.02 161.29) (xy 158.75 161.29)) + (stroke (width 0) (type default)) + (uuid d0221a50-403c-4d07-933c-96cd786d3b42) + ) + (wire (pts (xy 237.49 125.73) (xy 237.49 129.54)) + (stroke (width 0) (type default)) + (uuid d0283780-c58a-42d4-9cfb-db0c8eb7516b) + ) + (wire (pts (xy 20.32 176.53) (xy 29.21 176.53)) + (stroke (width 0) (type default)) + (uuid d07a7f27-846a-4bd9-b205-2a6d9e28ae08) + ) + (wire (pts (xy 191.77 125.73) (xy 193.04 125.73)) + (stroke (width 0) (type default)) + (uuid d0873c77-8dea-40e6-9f06-8536e65f19b5) + ) + (wire (pts (xy 336.55 120.65) (xy 336.55 125.73)) + (stroke (width 0) (type default)) + (uuid d14de2e4-2ba3-4a50-b7ef-2f9504fb4c68) + ) + (wire (pts (xy 325.12 140.97) (xy 323.85 140.97)) + (stroke (width 0) (type default)) + (uuid d155f315-31b3-42c2-b481-1d39ab6c111d) + ) + (wire (pts (xy 128.27 191.77) (xy 128.27 196.85)) + (stroke (width 0) (type default)) + (uuid d1c0c303-6d08-48c7-85c4-48940d9d4792) + ) + (wire (pts (xy 369.57 87.63) (xy 369.57 105.41)) + (stroke (width 0) (type default)) + (uuid d1d6d611-3848-41cc-ae1a-2129ed1327c7) + ) + (wire (pts (xy 270.51 105.41) (xy 270.51 109.22)) + (stroke (width 0) (type default)) + (uuid d2999ab5-c2c9-43af-8e82-1ffafbb6fd88) + ) + (wire (pts (xy 39.37 120.65) (xy 39.37 125.73)) + (stroke (width 0) (type default)) + (uuid d2d94966-2d85-4e41-8c7e-fdae26001c45) + ) + (wire (pts (xy 125.73 161.29) (xy 125.73 166.37)) + (stroke (width 0) (type default)) + (uuid d423dbbe-7477-4e4e-8007-8e8fa4998b20) + ) + (wire (pts (xy 336.55 166.37) (xy 336.55 176.53)) + (stroke (width 0) (type default)) + (uuid d48aff6c-c638-4743-949a-d1f3533bcf9e) + ) + (wire (pts (xy 119.38 72.39) (xy 128.27 72.39)) + (stroke (width 0) (type default)) + (uuid d623cead-176f-4844-b6e1-54319d7875b6) + ) + (wire (pts (xy 182.88 218.44) (xy 187.96 218.44)) + (stroke (width 0) (type default)) + (uuid d708607f-43a0-4eb6-a0ed-c897d3332e2d) + ) + (wire (pts (xy 101.6 166.37) (xy 105.41 166.37)) + (stroke (width 0) (type default)) + (uuid d70feac0-f10d-4a51-af87-2506eea65a65) + ) + (wire (pts (xy 69.85 69.85) (xy 67.31 69.85)) + (stroke (width 0) (type default)) + (uuid d7225bbc-6409-4fd5-8a96-45ca64adf2a6) + ) + (wire (pts (xy 95.25 191.77) (xy 95.25 196.85)) + (stroke (width 0) (type default)) + (uuid d757eb11-b48e-4ba8-9bbc-5bb93f255b2f) + ) + (wire (pts (xy 138.43 140.97) (xy 143.51 140.97)) + (stroke (width 0) (type default)) + (uuid d7a30c8e-77ea-4423-a8ce-1a8ab361ba90) + ) + (wire (pts (xy 72.39 161.29) (xy 72.39 157.48)) + (stroke (width 0) (type default)) + (uuid d87c4b6a-3d3d-445b-b3a7-b4d02ed6050b) + ) + (wire (pts (xy 158.75 63.5) (xy 173.99 63.5)) + (stroke (width 0) (type default)) + (uuid d8c2005a-f820-4ec8-bde3-da32fe1eb5ae) + ) + (wire (pts (xy 251.46 176.53) (xy 260.35 176.53)) + (stroke (width 0) (type default)) + (uuid d8fb3693-3828-48f1-ba3d-df36d491ec95) + ) + (wire (pts (xy 213.36 214.63) (xy 218.44 214.63)) + (stroke (width 0) (type default)) + (uuid d9b5e393-0004-41fa-8cf1-d44c6b0593dc) + ) + (wire (pts (xy 172.72 53.34) (xy 163.83 53.34)) + (stroke (width 0) (type default)) + (uuid d9cb8297-fa27-4e48-99c1-f394f5f73887) + ) + (wire (pts (xy 173.99 191.77) (xy 173.99 201.93)) + (stroke (width 0) (type default)) + (uuid da470e7c-0d0f-42ef-87d4-4d80762684c7) + ) + (wire (pts (xy 171.45 125.73) (xy 171.45 129.54)) + (stroke (width 0) (type default)) + (uuid da63adcc-dfb7-439d-b1c3-cf41d7cd28e1) + ) + (wire (pts (xy 334.01 72.39) (xy 334.01 69.85)) + (stroke (width 0) (type default)) + (uuid da8476c1-b71b-4625-93d7-6a8a6c7568af) + ) + (wire (pts (xy 365.76 105.41) (xy 369.57 105.41)) + (stroke (width 0) (type default)) + (uuid daef53ba-f1f7-42c8-8abb-76f1579f51c7) + ) + (wire (pts (xy 104.14 151.13) (xy 104.14 146.05)) + (stroke (width 0) (type default)) + (uuid db0f3ca0-4dd8-4c6d-9402-c3cf719bb641) + ) + (wire (pts (xy 50.8 140.97) (xy 50.8 137.16)) + (stroke (width 0) (type default)) + (uuid dc4e1d4b-ca68-4ae1-8356-f692ffed77de) + ) + (wire (pts (xy 86.36 72.39) (xy 86.36 74.93)) + (stroke (width 0) (type default)) + (uuid dcace56d-e5d3-4213-973b-ddcfd0c5ed97) + ) + (wire (pts (xy 105.41 137.16) (xy 105.41 140.97)) + (stroke (width 0) (type default)) + (uuid dd6492e2-e6be-4320-b169-d0dcaeb5d120) + ) + (wire (pts (xy 113.03 220.98) (xy 115.57 220.98)) + (stroke (width 0) (type default)) + (uuid de026ed2-780e-481b-bd93-d226a17e4d78) + ) + (wire (pts (xy 39.37 125.73) (xy 39.37 129.54)) + (stroke (width 0) (type default)) + (uuid de05749a-a883-4737-b7e4-6f01cb03e3c9) + ) + (wire (pts (xy 39.37 87.63) (xy 39.37 100.33)) + (stroke (width 0) (type default)) + (uuid de3b0842-394d-4fa2-a17c-b7b7a83adcc3) + ) + (wire (pts (xy 204.47 140.97) (xy 204.47 146.05)) + (stroke (width 0) (type default)) + (uuid df347fe7-2f92-481c-969d-bac70b964ddc) + ) + (wire (pts (xy 158.75 58.42) (xy 158.75 63.5)) + (stroke (width 0) (type default)) + (uuid dfd9b8ea-5e29-483e-b934-e5b79f8190d9) + ) + (wire (pts (xy 105.41 157.48) (xy 105.41 166.37)) + (stroke (width 0) (type default)) + (uuid e034dce4-dedf-459f-823a-1064b34702c5) + ) + (wire (pts (xy 204.47 157.48) (xy 204.47 166.37)) + (stroke (width 0) (type default)) + (uuid e1383f55-2ccd-4600-8912-5a5b4d1d12ef) + ) + (wire (pts (xy 26.67 146.05) (xy 27.94 146.05)) + (stroke (width 0) (type default)) + (uuid e1d57ea2-918e-4a81-8af1-1f132dc720da) + ) + (wire (pts (xy 60.96 120.65) (xy 59.69 120.65)) + (stroke (width 0) (type default)) + (uuid e413d38d-3a3b-4696-ae40-a40e686ac753) + ) + (wire (pts (xy 110.49 125.73) (xy 116.84 125.73)) + (stroke (width 0) (type default)) + (uuid e50bce19-1220-4cb1-b33f-d4d5de438e63) + ) + (wire (pts (xy 240.03 201.93) (xy 273.05 201.93)) + (stroke (width 0) (type default)) + (uuid e6463a5f-5426-409c-aa0e-f382d9a91e90) + ) + (wire (pts (xy 306.07 72.39) (xy 306.07 63.5)) + (stroke (width 0) (type default)) + (uuid e66fca08-7983-4d12-8256-f5a5b2b1f141) + ) + (wire (pts (xy 113.03 215.9) (xy 113.03 220.98)) + (stroke (width 0) (type default)) + (uuid e688566d-71b3-4b3e-9120-e2b42367bb32) + ) + (wire (pts (xy 60.96 140.97) (xy 59.69 140.97)) + (stroke (width 0) (type default)) + (uuid e7c7007d-2264-4531-9925-2973bb744e25) + ) + (wire (pts (xy 105.41 125.73) (xy 105.41 129.54)) + (stroke (width 0) (type default)) + (uuid e809faaf-3050-4a79-a402-aa902b422ca8) + ) + (wire (pts (xy 260.35 93.98) (xy 260.35 87.63)) + (stroke (width 0) (type default)) + (uuid e90f4197-5d65-4576-8b6c-d3fe1f345520) + ) + (wire (pts (xy 68.58 161.29) (xy 72.39 161.29)) + (stroke (width 0) (type default)) + (uuid e99a0e23-2802-401e-8986-5f88b5939de4) + ) + (wire (pts (xy 134.62 166.37) (xy 138.43 166.37)) + (stroke (width 0) (type default)) + (uuid e9e62d6d-c270-4abc-bdec-b8ba8e220777) + ) + (wire (pts (xy 92.71 166.37) (xy 93.98 166.37)) + (stroke (width 0) (type default)) + (uuid ea402ee7-a3fe-4807-b8e6-9f27b900fa3c) + ) + (wire (pts (xy 41.91 63.5) (xy 74.93 63.5)) + (stroke (width 0) (type default)) + (uuid ebcc6e70-8716-498e-853c-69aa244b0880) + ) + (wire (pts (xy 107.95 191.77) (xy 107.95 201.93)) + (stroke (width 0) (type default)) + (uuid ec1e9ff9-c9ee-4d13-b7c9-6b8d81188bce) + ) + (wire (pts (xy 20.32 176.53) (xy 20.32 179.07)) + (stroke (width 0) (type default)) + (uuid ecb1332b-5d57-43d2-9cda-92942298ffb6) + ) + (wire (pts (xy 270.51 140.97) (xy 270.51 146.05)) + (stroke (width 0) (type default)) + (uuid ed156344-67cc-4931-8cbe-ea26cc6bc263) + ) + (wire (pts (xy 39.37 146.05) (xy 39.37 149.86)) + (stroke (width 0) (type default)) + (uuid ed257832-340d-4f23-8f12-bd93bedf91db) + ) + (wire (pts (xy 207.01 63.5) (xy 240.03 63.5)) + (stroke (width 0) (type default)) + (uuid ed7bb327-876e-41d3-9abb-5f9504e73eea) + ) + (wire (pts (xy 143.51 125.73) (xy 143.51 129.54)) + (stroke (width 0) (type default)) + (uuid edfc6b26-a1c9-4458-8569-783b63367be9) + ) + (wire (pts (xy 200.66 166.37) (xy 204.47 166.37)) + (stroke (width 0) (type default)) + (uuid ee33804c-02f9-4161-a78a-a38ef0d45552) + ) + (wire (pts (xy 167.64 125.73) (xy 171.45 125.73)) + (stroke (width 0) (type default)) + (uuid ef4661e1-d83c-4f92-9106-9301fc61dea4) + ) + (wire (pts (xy 36.83 69.85) (xy 34.29 69.85)) + (stroke (width 0) (type default)) + (uuid ef64ed70-f792-4c49-a9e0-e65f02d4f884) + ) + (wire (pts (xy 62.23 196.85) (xy 62.23 191.77)) + (stroke (width 0) (type default)) + (uuid f04d8541-f6ae-4853-9449-b3790d1a0bf8) + ) + (wire (pts (xy 44.45 125.73) (xy 50.8 125.73)) + (stroke (width 0) (type default)) + (uuid f092f78c-0290-430d-811b-29ff846b6a5d) + ) + (wire (pts (xy 367.03 69.85) (xy 364.49 69.85)) + (stroke (width 0) (type default)) + (uuid f19626f3-9fb6-4a16-b7bd-b8f5951332cb) + ) + (wire (pts (xy 171.45 125.73) (xy 176.53 125.73)) + (stroke (width 0) (type default)) + (uuid f255e782-2f53-49e3-8bec-19778b75ef48) + ) + (wire (pts (xy 44.45 125.73) (xy 44.45 129.54)) + (stroke (width 0) (type default)) + (uuid f2891858-4208-438a-aaa8-e5abe383aca3) + ) + (wire (pts (xy 260.35 198.12) (xy 260.35 191.77)) + (stroke (width 0) (type default)) + (uuid f2d93ea0-7034-4d3a-baa5-b24722dd7619) + ) + (wire (pts (xy 167.64 166.37) (xy 171.45 166.37)) + (stroke (width 0) (type default)) + (uuid f3254fa5-01b8-4c53-96a8-602f7f03102b) + ) + (wire (pts (xy 374.65 137.16) (xy 374.65 140.97)) + (stroke (width 0) (type default)) + (uuid f3fac14b-afc3-4b11-a2ef-4aae6281129c) + ) + (wire (pts (xy 134.62 100.33) (xy 138.43 100.33)) + (stroke (width 0) (type default)) + (uuid f464c4bb-f281-4c7c-9aa9-ef99b7125f4e) + ) + (wire (pts (xy 237.49 100.33) (xy 237.49 105.41)) + (stroke (width 0) (type default)) + (uuid f480e185-1241-49cb-bdd1-f0e7d4432216) + ) + (wire (pts (xy 270.51 116.84) (xy 270.51 125.73)) + (stroke (width 0) (type default)) + (uuid f575e34a-b0f2-4ac7-986f-8c6c8850f863) + ) + (wire (pts (xy 138.43 146.05) (xy 138.43 149.86)) + (stroke (width 0) (type default)) + (uuid f584d121-44ef-470b-939a-e37236425bd6) + ) + (wire (pts (xy 140.97 191.77) (xy 140.97 201.93)) + (stroke (width 0) (type default)) + (uuid f59bd531-6d79-4af5-bd6b-0fa47b8578cc) + ) + (wire (pts (xy 102.87 69.85) (xy 100.33 69.85)) + (stroke (width 0) (type default)) + (uuid f7023a21-842d-4297-addf-7bce3d650a48) + ) + (wire (pts (xy 323.85 166.37) (xy 325.12 166.37)) + (stroke (width 0) (type default)) + (uuid f71daa2a-6586-4377-9f13-4d194ad520d2) + ) + (wire (pts (xy 182.88 215.9) (xy 187.96 215.9)) + (stroke (width 0) (type default)) + (uuid f733ccae-3fe7-4ff5-b860-c131449d934e) + ) + (wire (pts (xy 158.75 146.05) (xy 160.02 146.05)) + (stroke (width 0) (type default)) + (uuid f9fdbe12-f808-4e9e-837b-2ef908d1a071) + ) + (wire (pts (xy 200.66 105.41) (xy 204.47 105.41)) + (stroke (width 0) (type default)) + (uuid fa4b9756-9190-4062-959e-5a98a46cac4e) + ) + (wire (pts (xy 35.56 146.05) (xy 39.37 146.05)) + (stroke (width 0) (type default)) + (uuid fa525e25-6c37-4967-89a7-b8c2139b1559) + ) + (wire (pts (xy 201.93 69.85) (xy 199.39 69.85)) + (stroke (width 0) (type default)) + (uuid fb5e6ab2-f1f0-4c0c-8ce3-1ac629124fbb) + ) + (wire (pts (xy 326.39 198.12) (xy 326.39 191.77)) + (stroke (width 0) (type default)) + (uuid fb61aae3-9a7e-4626-bd93-13e33adda41e) + ) + (wire (pts (xy 232.41 214.63) (xy 232.41 217.17)) + (stroke (width 0) (type default)) + (uuid fb97bfd0-49a9-41f7-aaf6-3c0bc08363c8) + ) + (wire (pts (xy 101.6 120.65) (xy 104.14 120.65)) + (stroke (width 0) (type default)) + (uuid fba3f36d-e6d8-449b-ab4d-cfed73db3147) + ) + (wire (pts (xy 242.57 137.16) (xy 242.57 140.97)) + (stroke (width 0) (type default)) + (uuid fbb4cfdb-4f34-4dac-9e46-3b5ead5f23b7) + ) + (wire (pts (xy 224.79 146.05) (xy 226.06 146.05)) + (stroke (width 0) (type default)) + (uuid fbe34c02-98d7-47d2-8ffe-0c7ab5ad7489) + ) + (wire (pts (xy 171.45 140.97) (xy 176.53 140.97)) + (stroke (width 0) (type default)) + (uuid fd034814-ec3f-45ea-87cc-92f79eaa8f67) + ) + (wire (pts (xy 115.57 215.9) (xy 113.03 215.9)) + (stroke (width 0) (type default)) + (uuid fd120123-b8cc-4030-af80-ac85b36e4fa8) + ) + (wire (pts (xy 323.85 140.97) (xy 323.85 146.05)) + (stroke (width 0) (type default)) + (uuid fd25b702-7df0-4df1-aed0-780782518ae4) + ) + (wire (pts (xy 39.37 105.41) (xy 39.37 109.22)) + (stroke (width 0) (type default)) + (uuid fd315168-26d1-4e94-86b2-f5a72ae34ffe) + ) + (wire (pts (xy 125.73 120.65) (xy 125.73 125.73)) + (stroke (width 0) (type default)) + (uuid fd8c1ce4-e3c1-4140-98ea-24433a58df03) + ) + (wire (pts (xy 182.88 213.36) (xy 187.96 213.36)) + (stroke (width 0) (type default)) + (uuid fd90630b-9d28-4578-80b6-31452a736e49) + ) + (wire (pts (xy 369.57 137.16) (xy 369.57 140.97)) + (stroke (width 0) (type default)) + (uuid fde1eae2-49de-47ee-822a-fb8b9b9e9335) + ) + (wire (pts (xy 218.44 176.53) (xy 218.44 179.07)) + (stroke (width 0) (type default)) + (uuid fdfdd67d-6476-4f3d-b319-578d0778f59a) + ) + (wire (pts (xy 369.57 125.73) (xy 374.65 125.73)) + (stroke (width 0) (type default)) + (uuid fe0d64b0-54cb-41ef-a65f-00487428deb1) + ) + (wire (pts (xy 185.42 72.39) (xy 185.42 74.93)) + (stroke (width 0) (type default)) + (uuid fe19e33a-e5e3-4296-b78d-b4e38397d778) + ) + (wire (pts (xy 39.37 100.33) (xy 39.37 105.41)) + (stroke (width 0) (type default)) + (uuid fe246516-bee9-4694-8a00-567a7e67fbb2) + ) + (wire (pts (xy 135.89 72.39) (xy 135.89 69.85)) + (stroke (width 0) (type default)) + (uuid ff32292c-e058-4a3e-84fe-aab261ed53e8) + ) + (wire (pts (xy 176.53 137.16) (xy 176.53 140.97)) + (stroke (width 0) (type default)) + (uuid ff4c0ea5-bb58-462e-b0d5-abaf4f1cb229) + ) + + (text_box "Board mounting holes" + (at 107.95 209.55 0) (size 20.32 17.78) + (stroke (width 0) (type default)) + (fill (type none)) + (effects (font (size 1.27 1.27) (thickness 0.254) bold) (justify left top)) + (uuid f8dff638-d9c8-4d77-a669-507378d79194) + ) + + (text "6M [1010]" (at 358.14 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 0da742f3-a183-463a-b4ae-de6ef8a55ba0) + ) + (text "160M [0001]" (at 27.94 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 12c35853-b257-408b-ae64-bb8556d89459) + ) + (text "15M [0111]" (at 259.08 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 1538d694-35f6-43be-b89a-7a8b33870bea) + ) + (text "All toroids wound on T68-6 cores" (at 227.33 58.42 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 2c745c41-e522-44e3-9b07-3f3850b6780f) + ) + (text "10M [1001]" (at 325.12 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 4798234c-a2c0-4b2f-8dde-cb01bbe732b7) + ) + (text "30M [0100]" (at 160.02 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 585893c2-03f8-43db-9a95-6857488cdb80) + ) + (text "20M [0101]" (at 193.04 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 779661dd-40dd-44c5-96d2-88c9bbdc6fd0) + ) + (text "40M [0011]" (at 127 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 783cdea5-0ebc-4f3b-b92f-521abe2ef7a4) + ) + (text "60M [0000]" (at 95.25 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 7c43d198-602b-4aaa-ab35-31e35c8ad5cc) + ) + (text "LPFs" (at 212.09 59.69 0) + (effects (font (size 3 3) (thickness 0.254) bold) (justify left bottom)) + (uuid 9c47a4dd-5258-451c-8c5d-76d4e896ff3a) + ) + (text "17M [0110]" (at 226.06 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid ad3af003-3173-4f02-8473-0d8ae3863ec9) + ) + (text "12M [1000]" (at 292.1 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid aed3a73f-3c77-41af-bb08-c01e027f9e65) + ) + (text "80M [0010]" (at 60.96 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid dfdc5bbe-2bef-4790-8704-6c6e4788232b) + ) + (text "NO FILT [1111]" (at 396.24 200.66 0) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid ea250ff3-8c6c-448e-baf5-6aac326c81a8) + ) + + (label "B10M" (at 326.39 198.12 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 06abb0b5-feba-4364-8de5-6aa730648b24) + ) + (label "RF3" (at 41.91 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 0c100875-6e4c-43b2-8031-ce2004efefaf) + ) + (label "B40M" (at 128.27 92.71 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 0f13fa05-71d2-4f4c-9faa-c807cac1e962) + ) + (label "B17M" (at 227.33 92.71 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 0fdaab1b-18d4-4023-a3fd-d368d1e30c8b) + ) + (label "B15M" (at 213.36 217.17 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 108ba16d-ac5a-428f-942d-1b500060c141) + ) + (label "B6M" (at 359.41 198.12 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 11ad960b-cc65-4df6-8468-8ac274949edf) + ) + (label "RF45" (at 369.57 144.78 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 14c008c6-293a-4ecf-a730-4b47001b38e0) + ) + (label "B160M" (at 29.21 198.12 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 1558e5a2-46d8-422d-8081-7e7a75ef53e7) + ) + (label "RF18" (at 138.43 165.1 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 1582e426-1291-41bd-97cb-3f1d028b61fb) + ) + (label "B40M" (at 128.27 196.85 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 161e97bb-080f-4a81-91c5-143346b16d57) + ) + (label "RF46" (at 369.57 165.1 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 16aab564-d5e1-48e6-aa29-9e50df14d738) + ) + (label "B10M" (at 213.36 222.25 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 193406f9-6ef6-4f03-a65d-94d4967cd5a2) + ) + (label "RF24" (at 207.01 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 1afb1370-ae32-4996-b5b2-f86733f35951) + ) + (label "RF42" (at 336.55 165.1 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 1d72c3a4-2877-47b9-81eb-411465306e3b) + ) + (label "RF21" (at 171.45 146.05 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 1dbf2ba8-717f-46fa-aa1e-11322f19cbd4) + ) + (label "B12M" (at 293.37 198.12 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 224e1135-3d62-44e7-89b9-7a1f453861f0) + ) + (label "RF37" (at 303.53 143.51 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 2649b484-6e56-46ce-9e5c-42042f42ee83) + ) + (label "B20M" (at 194.31 196.85 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 2e928cd7-0a43-4a09-b9c2-7d908b2023ef) + ) + (label "B80M" (at 62.23 196.85 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 31aa38f9-569a-4934-a37e-99829208d8ae) + ) + (label "RF25" (at 204.47 144.78 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 334828f2-d5b0-4b96-b7fe-82a596259073) + ) + (label "B80M" (at 62.23 92.71 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 3be9ac2d-5265-43dc-b19a-4d96d0812f68) + ) + (label "RF14" (at 105.41 168.91 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 3c6beb1c-8191-4c6f-bc92-c1369229126b) + ) + (label "RF10" (at 72.39 163.83 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 3e6dac82-cb0d-473d-b7ba-918ec67b858c) + ) + (label "B30M" (at 161.29 92.71 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 4085795e-9162-4140-a587-11cc95dba205) + ) + (label "RF34" (at 270.51 165.1 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 43a11876-8b58-4dcb-8058-c1e4b980aeed) + ) + (label "RF36" (at 304.8 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 4439ca10-e38f-450d-a7ec-9b1a7590d9f3) + ) + (label "RF30" (at 237.49 163.83 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 4ccfc824-e55b-42d1-969a-75d9c325cac4) + ) + (label "RF31" (at 270.51 102.87 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 4df283f7-96da-4c6a-927d-169c47595f1e) + ) + (label "B12M" (at 213.36 219.71 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 51a20640-15bb-433b-92c5-612af0e369ea) + ) + (label "BNF" (at 391.16 199.39 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 575595aa-71e9-43b8-a063-0151b6e7d7c1) + ) + (label "RF32" (at 271.78 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 5ae4d9a9-e42e-4332-9319-a79e52b81b5e) + ) + (label "B20M" (at 182.88 226.06 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 5b22ef9b-29b9-42b9-a253-22e0f61ee5ac) + ) + (label "RF2" (at 39.37 95.25 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 5f9437e7-1a0f-4250-b05c-b3145fa73ccf) + ) + (label "RF19" (at 171.45 97.79 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 61d97fbe-7c3b-433e-8e89-5af324067696) + ) + (label "RF43" (at 369.57 101.6 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 62637928-b95b-4270-b757-998d85fb71ef) + ) + (label "RF16" (at 142.24 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 66e0074a-4213-4b5b-abb1-92dfe8f03f9b) + ) + (label "RF7" (at 72.39 95.25 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 6b3d02a5-1481-425b-a926-26934af546bc) + ) + (label "B17M" (at 213.36 214.63 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 6e5825bf-2d75-40fe-a5b4-febce13af81c) + ) + (label "B60M" (at 95.25 196.85 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 713c0158-e2cc-4639-b66d-be2de47b47ae) + ) + (label "B60M" (at 95.25 92.71 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 73ec5fe0-6f17-4fd9-88ed-261ea4bd2784) + ) + (label "RF44" (at 370.84 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 740227d9-51f6-493c-bae4-ff45adaf08e9) + ) + (label "B20M" (at 194.31 92.71 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 7947b97d-c361-46e2-86bb-b75aa1eb70cd) + ) + (label "RF29" (at 237.49 143.51 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 7bb1dce4-e338-401f-a433-c5903d9f6320) + ) + (label "B15M" (at 260.35 93.98 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 8305b3bd-489d-4b08-a310-1e3684c9635f) + ) + (label "RF27" (at 237.49 97.79 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 84a0dc26-10b5-4ed9-b7d9-c32e8c0dae79) + ) + (label "B10M" (at 326.39 93.98 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 857dad95-a81a-4d92-8c09-14789b903294) + ) + (label "RF9" (at 72.39 148.59 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 8a5d6b07-c071-437f-ae69-22db1a5dbad9) + ) + (label "B40M" (at 182.88 220.98 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 8ec38b37-0920-4baa-9279-41ca138f5005) + ) + (label "B30M" (at 182.88 223.52 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 8fee411f-b078-4c99-a990-71377a46f5a4) + ) + (label "RF20" (at 173.99 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 9028149f-9ee2-4697-9745-334f8aed70a3) + ) + (label "RF26" (at 204.47 165.1 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 96841058-6c4a-4ef1-a9aa-463ccc30653b) + ) + (label "RF38" (at 303.53 163.83 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 96f3ff64-008f-4d61-85ca-3969002f019c) + ) + (label "RF11" (at 105.41 96.52 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 9b5f58b5-1d31-446d-8b44-45384916130e) + ) + (label "RF47" (at 401.32 130.81 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid 9ccaec64-e33a-4cb0-bef2-0aad8edf6aba) + ) + (label "B30M" (at 161.29 196.85 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid 9d218034-bc06-4b8d-843c-a080436ab9c3) + ) + (label "B6M" (at 359.41 93.98 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid a2ed07f6-dd81-4a90-bdc4-7ffb0cc1a2f1) + ) + (label "BNF" (at 213.36 227.33 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid a545ddfc-d226-462b-8e45-699ae24efa1e) + ) + (label "BNF" (at 391.16 93.98 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid a87d4aa0-558a-45fa-ba4c-fba699063ae6) + ) + (label "RF28" (at 240.03 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid a99633b9-fcbe-4a1d-ae6e-d25e8a16659f) + ) + (label "B60M" (at 182.88 218.44 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid afa17524-c561-4f4d-a58c-142ba41deb44) + ) + (label "RF8" (at 80.01 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid afd3c339-d995-4e4f-98a0-4bc29c3d84b7) + ) + (label "RF23" (at 204.47 100.33 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid b035c746-a185-402c-b50d-c7e96533c635) + ) + (label "RF15" (at 138.43 95.25 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid b530a34c-9c49-45b1-83bf-0992dc36b34f) + ) + (label "RF39" (at 336.55 99.06 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid b539b5a1-bfd0-4dda-8160-84685339d197) + ) + (label "RF4" (at 39.37 148.59 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid b66b989a-3d4c-4539-9825-74b6c07cf60d) + ) + (label "B15M" (at 260.35 198.12 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid c3a1010e-9e99-4cd7-ac79-491ff23f9f04) + ) + (label "RF5" (at 39.37 168.91 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid c4a3594f-a1c0-4185-bca6-7b58eb2ab6c7) + ) + (label "B160M" (at 182.88 213.36 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid c6fcdb3f-1741-4592-8f1e-e308b4127374) + ) + (label "RF33" (at 270.51 144.78 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid c8f400b9-feb3-458c-b595-256c9557d98b) + ) + (label "RF40" (at 337.82 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid d4e20b90-586b-4257-836e-f42c5b0be9dd) + ) + (label "RF1" (at 143.51 63.5 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid d8484de1-c52b-4d0c-b8ec-a1f1120d51dc) + ) + (label "B80M" (at 182.88 215.9 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid d9704b46-0462-4a68-b1fd-931ed141fa70) + ) + (label "RF6" (at 52.07 201.93 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid dab1d065-ff58-4318-b60f-57185f5c5aab) + ) + (label "RF41" (at 336.55 144.78 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid dce6b097-db08-4c4d-a65d-8f4c22069eb0) + ) + (label "B160M" (at 29.21 93.98 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid dec92f59-4778-465b-9515-822e36583b82) + ) + (label "RF35" (at 303.53 102.87 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid e0469e3a-6d82-4416-8ded-070c83c292d3) + ) + (label "B17M" (at 227.33 196.85 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid e167c71c-8369-424f-89a3-5d7eff476a14) + ) + (label "RF17" (at 138.43 148.59 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid e866619a-4ce6-4255-a712-fdadd23db573) + ) + (label "RF12" (at 113.03 125.73 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid edb24bd9-7936-49b4-b850-a2298eb65e4d) + ) + (label "RF22" (at 171.45 163.83 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid f01be92a-2658-4ffb-bf5f-6c1eb3d15fda) + ) + (label "RF13" (at 105.41 144.78 0) (fields_autoplaced) + (effects (font (size 0.8 0.8)) (justify left bottom)) + (uuid f13d6007-0bc0-46fb-a7e6-c8d199b50e34) + ) + (label "B6M" (at 213.36 224.79 0) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid f528ef01-6226-44fd-8fb1-d0b71870e264) + ) + (label "B12M" (at 293.37 93.98 90) (fields_autoplaced) + (effects (font (size 1.27 1.27) bold) (justify left bottom)) + (uuid f882d3f6-1397-489b-88f4-7ad3f90ffbc1) + ) + + (symbol (lib_id "power:+12V") (at 86.36 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 008db23c-7385-40fb-9a3f-9032d83b0149) + (property "Reference" "#PWR073" (at 86.36 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 86.36 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 86.36 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 86.36 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 6597282c-b64e-45ad-8e55-50d32823c47c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR073") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 20.32 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 00a78767-80a4-469a-a349-c2f6ace337e4) + (property "Reference" "#PWR063" (at 20.32 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 20.32 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 20.32 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 20.32 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 8a6dae15-701b-409e-987a-e0ee8e05d6d2)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR063") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 20.32 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 01b37360-2c43-40e2-9545-4665d4943955) + (property "Reference" "#PWR065" (at 20.32 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 20.32 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 20.32 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 20.32 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 96397365-0c71-4130-9f4e-2aecfa2327cd)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR065") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 265.43 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 02418d2e-42da-46fb-97d4-0ead670d2ced) + (property "Reference" "#PWR0123" (at 265.43 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 262.89 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 265.43 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 265.43 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d616f0e9-0bc9-4351-9eee-e913f54d46b3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0123") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 59.69 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 02e22504-d316-4be5-b60f-cd584243df5a) + (property "Reference" "#PWR051" (at 59.69 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 57.15 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 59.69 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 59.69 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid c0f0a6b2-ff46-49df-8a5d-dee1938d8758)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR051") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 251.46 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 04c9fef5-5324-463c-b728-ca582d8261a7) + (property "Reference" "#PWR0117" (at 251.46 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 251.46 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 251.46 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 251.46 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 15e2da65-fa49-40b0-981e-2014c5fc69b6)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0117") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 350.52 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 056ead94-d0d8-4b7d-9d05-38a019f6955c) + (property "Reference" "C126" (at 344.17 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 346.71 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 349.5548 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 350.52 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 350.52 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 350.52 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid f4393aa3-7350-4daf-968d-a7bf3af08251)) + (pin "1" (uuid 93438775-2bc8-4bd3-a65b-91494fb796b2)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C126") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 130.81 105.41 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 07b34094-d4cf-4b49-9fbe-cb6f103a975c) + (property "Reference" "C32" (at 130.81 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "100pF 100V" (at 130.81 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 134.62 106.3752 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 130.81 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C101J1GAULR" (at 130.81 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 130.81 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 395cc4e7-d981-4291-a7dd-0ae11c28673e)) + (pin "1" (uuid 15485603-5a4e-40ae-820f-afc6b4e5b676)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C32") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 364.49 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 08b34741-dc13-4f92-af59-e154604658bd) + (property "Reference" "K18" (at 374.65 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 373.38 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 375.92 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 364.49 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 364.49 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 364.49 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 2da9f285-9db5-4f8c-9c89-c13eab8a1533)) + (pin "12" (uuid fc385ce9-0143-42de-92c2-88b1bd598e86)) + (pin "14" (uuid f8de69f6-8b8c-4592-94a7-59a786b005b5)) + (pin "A2" (uuid deae59b7-28ff-415a-b94b-5556afd8cd4e)) + (pin "11" (uuid 1804c5e7-7181-4542-a8db-f5cdf1ec7f4b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K18") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 105.41 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 08d63b82-1d3c-4e75-a990-e1c27cd3a1a4) + (property "Reference" "L16" (at 106.68 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "1.60uH" (at 104.14 137.16 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 105.41 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 105.41 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 105.41 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 105.41 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 73673eb3-e7e9-4daf-afc9-ae12d579106d)) + (pin "2" (uuid e96eb979-f4b8-4ac6-a606-a99a3640c43e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L16") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 166.37 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 08dbcbd3-cb57-4897-9ba9-6444a874e454) + (property "Reference" "#PWR093" (at 166.37 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 163.83 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 166.37 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 166.37 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid a3b6d02c-4503-4c35-b15d-fa20c2b181ea)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR093") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 242.57 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 0a7d7b98-52e7-4777-ae11-51aa714d142d) + (property "Reference" "C71" (at 243.84 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "39pF 100V" (at 246.38 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 243.5352 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 242.57 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C390J1G" (at 242.57 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 242.57 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 870b1ef5-7308-4f6b-952a-cd6f730a3c73)) + (pin "1" (uuid da550ea2-4471-48a2-9081-65063f261322)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C71") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 130.81 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 0a99d9ba-f52b-4bfb-8d01-79cd43b5ede4) + (property "Reference" "C54" (at 130.81 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 130.81 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 134.62 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 130.81 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 130.81 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 130.81 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid ce10416c-18ed-49f8-b231-6c8d21b62e3e)) + (pin "1" (uuid c696a4c5-633a-44fd-a189-5e42b16fac14)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C54") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 298.45 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 0ae3b64f-d353-4426-8a41-4dfa010919df) + (property "Reference" "K10" (at 308.61 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 307.34 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 309.88 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 298.45 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 298.45 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 298.45 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 1db7e8d8-31f4-495c-9816-1876e362c022)) + (pin "12" (uuid 97e2963e-477b-4164-8939-760650d49066)) + (pin "14" (uuid 1102feca-0c31-4a38-ba75-9f5159c0c704)) + (pin "A2" (uuid 75acdb2c-2ffa-4895-bf5e-b7d2488f6609)) + (pin "11" (uuid 8b03f1f3-a1c9-4910-92a9-419f74925ee0)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K10") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 171.45 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 0c5a870f-21fa-4256-afde-fef0b013b068) + (property "Reference" "L18" (at 172.72 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.843uH" (at 170.18 137.16 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 171.45 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 171.45 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 171.45 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 171.45 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 6c34df85-1e02-400d-820d-b19c0e7784d8)) + (pin "2" (uuid 75fe1f53-55c7-456d-a45f-f935626561f6)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L18") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 172.72 54.61 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 0ded12a4-a684-4de0-9787-0a859abfccb2) + (property "Reference" "#PWR0210" (at 172.72 60.96 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 175.26 55.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 172.72 54.61 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 172.72 54.61 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 4734ea2e-0b8d-4b15-9e58-9a77cfe6f2fc)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0210") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 119.38 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 0df2536b-3053-4989-8440-4ecf48b1932f) + (property "Reference" "#PWR076" (at 119.38 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 119.38 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 119.38 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 119.38 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f755dbcb-9a36-48cb-9533-3c0f53969b97)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR076") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 382.27 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 0e0d6f70-7217-44da-953a-4df634f59150) + (property "Reference" "C158" (at 375.92 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 378.46 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 381.3048 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 382.27 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 382.27 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 382.27 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 85fe4ddc-9b93-413d-8a7a-82b8ceb0b376)) + (pin "1" (uuid 9f7a529d-6e0a-4908-af01-2fde46e94b8e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C158") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 334.01 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 0ec5913d-8935-4d48-966d-e6825bebc042) + (property "Reference" "#PWR0144" (at 334.01 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 331.47 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 334.01 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 334.01 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 4fb1e726-bc5e-44d5-a35f-d4b382f7037c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0144") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 163.83 161.29 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 0f407b9d-97f8-40a5-805f-a81fc6dd53f7) + (property "Reference" "C95" (at 163.83 154.94 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 163.83 157.48 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 167.64 160.3248 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 163.83 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 163.83 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 163.83 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 55f6584f-d0f7-431c-af1e-1a8f1227032e)) + (pin "1" (uuid 9e97ad9e-c4a3-4255-ac0a-e5992102802e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C95") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 328.93 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 0f67de2c-f4a6-42e7-8108-36b05adc68f8) + (property "Reference" "C85" (at 328.93 152.4 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "82pF 100V" (at 328.93 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 332.74 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 328.93 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C820J1G" (at 328.93 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 328.93 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 92acd904-8f9e-4975-b076-388090cd2d2f)) + (pin "1" (uuid c387e979-ed66-44b0-a851-558dca6a9201)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C85") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 26.67 146.05 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 0fa2f78c-25d8-4227-beb7-460798a0aed8) + (property "Reference" "#PWR046" (at 26.67 152.4 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 24.13 148.59 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 26.67 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 26.67 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d37f9160-e02d-421d-a0fc-7fc72e798942)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR046") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 53.34 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 106a7233-33fc-4265-9000-14750dd742f0) + (property "Reference" "C108" (at 46.99 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 49.53 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 52.3748 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 53.34 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 53.34 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 53.34 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid bec29c66-eac5-489f-8f25-33fb54b3d135)) + (pin "1" (uuid 9595ad6f-9e13-4fbd-b832-c7e36f68418b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C108") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 361.95 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 10aab928-fc7f-4e2e-a6c4-ae72e8ad1182) + (property "Reference" "C51" (at 361.95 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "91pF 100V" (at 361.95 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 365.76 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 361.95 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C910J1G" (at 361.95 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 361.95 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 4335ceca-c351-4886-9246-f86a875aebe8)) + (pin "1" (uuid dbf3c276-b288-4cd7-918d-e154ecd164f3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C51") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 382.27 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 10b88d2c-be2e-4f8f-8b1c-1b1125f62ed4) + (property "Reference" "#PWR0156" (at 382.27 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 379.73 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 382.27 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 382.27 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid ac5d1c14-c645-4924-8bef-0471238d9b79)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0156") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 356.87 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 1168ca01-bd2b-48b5-8dd1-bd3f2a45a07e) + (property "Reference" "#PWR0152" (at 356.87 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 354.33 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 356.87 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 356.87 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid bad73b47-bbea-4195-b3d4-681170f381c0)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0152") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 92.71 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 11e0d471-e738-41b4-8c36-03528edd613c) + (property "Reference" "#PWR054" (at 92.71 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 90.17 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 92.71 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 92.71 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid b0ad1de3-854b-43f4-b824-357fd57e8a6e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR054") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 270.51 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 121f4298-0fd1-4d0e-bf8f-66dc40e5837d) + (property "Reference" "L32" (at 272.669 153.67 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.447uH" (at 273.05 156.21 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 270.51 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 270.51 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 270.51 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 270.51 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d66ec830-1602-4db1-bf56-0d50e8ea1453)) + (pin "2" (uuid e239e1f6-dbcc-4be5-8e1f-bc7832d30c80)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L32") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 369.57 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 136d841f-f101-4ec4-a473-4bf0baad1c79) + (property "Reference" "L35" (at 371.729 153.67 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.188uH" (at 372.11 156.21 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 369.57 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 369.57 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 369.57 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 369.57 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 2af00d0a-203d-4d0d-85fb-5d5506b011d2)) + (pin "2" (uuid 7fd54069-f07d-483d-8b41-3af7634e4845)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L35") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 284.48 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 14724bc4-0dce-4f08-b816-abc5b04302a9) + (property "Reference" "C123" (at 278.13 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 280.67 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 283.5148 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 284.48 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 284.48 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 284.48 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid fd95b828-5a45-40da-a2ff-7d9888d138d9)) + (pin "1" (uuid 4bdbdb3a-e5bd-49b1-9011-86b2c3785212)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C123") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 229.87 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 154cafef-26cb-474a-95cf-fa34a12abfba) + (property "Reference" "C105" (at 229.87 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "82pF 100V" (at 229.87 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 233.68 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 229.87 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C820J1G" (at 229.87 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 229.87 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 45761e48-e8bb-41f7-99be-3a2562395b06)) + (pin "1" (uuid ecba6c17-e70c-4b50-8253-6d93733536f8)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C105") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 133.35 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 15f0d950-dab8-4590-95d9-5581c1b21ede) + (property "Reference" "K12" (at 143.51 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 142.24 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 144.78 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 133.35 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 133.35 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 133.35 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 2ad2add1-aec8-4105-9059-1bacd65b26e5)) + (pin "12" (uuid 6adb0e83-b8c5-47e3-898a-61385ef75c74)) + (pin "14" (uuid a11f2c8f-8501-44e7-9a0f-ed232ccded7a)) + (pin "A2" (uuid ad49ca1d-ccc7-47b4-8eda-9ca6328df598)) + (pin "11" (uuid af123e43-2c8e-4010-9e63-39ecaed0e88a)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K12") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 295.91 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 164bebd1-7bba-4ea3-891e-f546a21799fc) + (property "Reference" "C98" (at 295.91 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "120pF 100V" (at 295.91 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 299.72 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 295.91 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "77-VJ1206A121JXBMT" (at 295.91 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 295.91 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 495fe4fa-7efa-4c3e-acd3-675a51baa8bf)) + (pin "1" (uuid b6868228-3573-4a55-a5d9-ec4a23f2dce7)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C98") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 356.87 146.05 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 164cc4e8-edf7-45d8-b0fd-55baea7498a2) + (property "Reference" "#PWR0151" (at 356.87 152.4 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 354.33 148.59 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 356.87 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 356.87 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 3affc1e2-5f5b-486d-80b6-607d7869c10e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0151") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 36.83 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 19bc2472-8f06-46f2-be52-6e1867bbcbf9) + (property "Reference" "#PWR061" (at 36.83 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 34.29 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 36.83 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 36.83 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e45230e7-471e-426e-acd8-722ceeae6dc7)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR061") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 97.79 100.33 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 1ab1c632-65bc-448c-be14-659a36a253d9) + (property "Reference" "C31" (at 97.79 93.98 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "560pF 100V" (at 97.79 96.52 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 101.6 99.3648 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 97.79 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061C561JAT2A" (at 97.79 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 97.79 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 8d3b55f6-9729-4d9f-a32e-ed04071874a8)) + (pin "1" (uuid 03002f27-17d1-444a-a970-92dcbf5615c7)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C31") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 361.95 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 1b19e9ec-807a-4713-bd27-74fd243b4360) + (property "Reference" "C100" (at 361.95 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "60pF 100V" (at 361.95 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 365.76 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 361.95 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C620J1G" (at 361.95 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 361.95 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 7174e99c-f311-4aa6-aec6-a241d6b5097d)) + (pin "1" (uuid 1f638f86-d46c-47a4-b30b-e5f105ab5dfb)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C100") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 64.77 105.41 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 1d3522cf-17d6-45a4-b732-e316cc0aa818) + (property "Reference" "C30" (at 64.77 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "470pF 100V" (at 64.77 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 68.58 106.3752 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 64.77 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C471J1GAC" (at 64.77 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 64.77 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 6e9f2c10-c86d-4bd9-b365-27b2b0211c6e)) + (pin "1" (uuid fa498fa7-47df-4138-9f7b-b85fa8f10703)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C30") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 201.93 213.36 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 1e197a04-58fc-458c-ab7a-98ad9b39dbf9) + (property "Reference" "#PWR0218" (at 201.93 217.17 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 205.74 212.09 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 201.93 213.36 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 201.93 213.36 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 7a9bbbde-5bc5-419a-b406-ff434088532a)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0218") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 86.36 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 1fee7f4f-8eca-4232-96bc-e59a2ee2e3c7) + (property "Reference" "C111" (at 80.01 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 82.55 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 85.3948 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 86.36 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 86.36 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 86.36 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid ed2898a9-cf5f-455d-a8ce-36be196ca9d0)) + (pin "1" (uuid 7b003995-7ae8-4816-b484-67fc1a1e8185)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C111") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 267.97 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 20021598-83fb-4634-b8cd-0c8a23073c19) + (property "Reference" "#PWR0124" (at 267.97 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 265.43 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 267.97 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 267.97 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid c2cc2dff-6a49-4da0-8e55-55f647431878)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0124") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 290.83 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 21294bd9-93c5-4344-a082-148b8bb7f144) + (property "Reference" "#PWR0130" (at 290.83 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 288.29 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 290.83 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 290.83 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 369481fa-e3f0-46d7-b8e5-3c394dd1ba55)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0130") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 171.45 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 21acc9bc-9d64-42a3-8524-b43f1ac6f962) + (property "Reference" "L7" (at 173.609 113.03 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.928uH" (at 173.99 115.57 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 171.45 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 171.45 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 171.45 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 171.45 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 7d0e9408-059a-46c6-98e2-4fb1ba9e59b4)) + (pin "2" (uuid 8d1fcb95-6c26-4995-9931-223aebaca8df)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L7") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 31.75 120.65 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 246e74fd-4129-438c-bed4-dd88108492f1) + (property "Reference" "C45" (at 31.75 114.3 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "2200pF 100V" (at 31.75 116.84 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 35.56 119.6848 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 31.75 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "81-GRM319R72A222JA1D" (at 31.75 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 31.75 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid e8acdd6b-da6c-43a5-af1f-af0e288727cd)) + (pin "1" (uuid 81c7d5ab-45a1-4dc0-926e-3f18cc8ea3ec)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C45") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 113.03 220.98 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 29aa1a78-21d9-42a8-b3e1-5bbb38a08098) + (property "Reference" "#PWR053" (at 113.03 227.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 113.03 225.1131 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 113.03 220.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 113.03 220.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 0656e774-0cb7-41f3-ba01-f21f39574e26)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR053") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 257.81 146.05 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 29cb5d40-1697-418f-9601-ce984e9b4d9f) + (property "Reference" "#PWR0121" (at 257.81 152.4 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 255.27 148.59 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 257.81 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 257.81 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 7a0dd9bc-99bb-4a5c-ab54-837ad848a8f1)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0121") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 199.39 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 29cf916c-c3f6-4311-be53-1f99c9f96b73) + (property "Reference" "K24" (at 209.55 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 213.36 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 210.82 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 199.39 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 199.39 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 199.39 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 50176529-4eb8-48c8-bd67-3e1568145797)) + (pin "12" (uuid e4c8cad9-0105-4f29-bab0-461e10801da9)) + (pin "14" (uuid fcb10574-cc35-4e9b-b16b-9741ec95f728)) + (pin "A2" (uuid b90638ea-e41a-4f4d-b464-b2c828b3fae8)) + (pin "11" (uuid 073122d8-5c86-4109-b73a-2b16322fea20)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K24") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 218.44 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 2a55087b-b2bb-456a-b3fa-d33aa21e7e3a) + (property "Reference" "#PWR0107" (at 218.44 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 218.44 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 218.44 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 218.44 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 32db7334-68bc-4716-ad72-71337e858027)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0107") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 229.87 161.29 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 2a891c0a-ffbf-4703-8a07-913d0de1f296) + (property "Reference" "C90" (at 229.87 154.94 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "82pF 100V" (at 229.87 157.48 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 233.68 160.3248 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 229.87 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C820J1G" (at 229.87 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 229.87 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid b6947ffd-e70d-4b6f-a3a0-5b340f011691)) + (pin "1" (uuid 48369ce2-651b-47ad-9f32-4aaf501965cf)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C90") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 251.46 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 2aa25910-e135-4392-b67a-784e0af4b478) + (property "Reference" "#PWR0116" (at 251.46 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 248.92 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 251.46 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 251.46 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid b429b20d-98e0-4747-a399-23169e2f4df7)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0116") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 152.4 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 2d557d6d-6916-427e-a227-fda34b847aca) + (property "Reference" "#PWR085" (at 152.4 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 152.4 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 152.4 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 152.4 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f778bb72-ae6b-4684-a27a-b74f2b93a4d8)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR085") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 59.69 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 2dfb927b-6fe9-4aa5-a034-b98d75684a55) + (property "Reference" "#PWR049" (at 59.69 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 57.15 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 59.69 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 59.69 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 29f382cc-98d8-43b3-93e0-ef1c0932ec47)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR049") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 39.37 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 2e254cee-cfae-4224-8281-f3d3addfaeab) + (property "Reference" "L3" (at 41.529 111.8179 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "5.21uH" (at 41.529 114.2421 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 39.37 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 39.37 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 39.37 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 39.37 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 9967abcd-fc83-4214-a69c-4e3855381192)) + (pin "2" (uuid 97e079f1-5b2d-4f76-8af9-06004165291f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L3") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 317.5 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 2e4173a4-1960-45cc-a3d5-946ced5bd9b6) + (property "Reference" "#PWR0138" (at 317.5 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 314.96 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 317.5 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 317.5 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e6007dd6-4382-485a-91e4-85be2b3101dc)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0138") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 130.81 140.97 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 2e46ab3e-6bd8-4214-99f3-df61ceba65cb) + (property "Reference" "C73" (at 130.81 134.62 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 130.81 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 134.62 140.0048 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 130.81 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 130.81 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 130.81 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 87cab3b1-96ae-42f2-895c-2bf4e4a26389)) + (pin "1" (uuid 0ce9aec0-9e5f-49a9-9112-44fb59e923c8)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C73") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 398.78 193.04 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 2efe2d3b-bbb3-4947-af80-276955a7bc27) + (property "Reference" "#PWR0164" (at 398.78 199.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 396.24 194.31 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 398.78 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 398.78 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 232aea92-f8cb-41cc-bdec-647b203c0f5c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0164") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 237.49 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 2fb4ef99-6d0f-457e-8bfa-1f44a0df4481) + (property "Reference" "L31" (at 239.649 153.67 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.519uH" (at 240.03 156.21 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 237.49 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 237.49 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 237.49 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 237.49 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 4d5fecd7-ad04-46ee-86c9-2a8e3f7d1cb4)) + (pin "2" (uuid 235042fa-0666-41f9-8b1f-fce363167599)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L31") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 64.77 100.33 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 2fc85ae5-a295-4cbc-9b61-3d51ef9895e6) + (property "Reference" "C26" (at 64.77 93.98 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "390pF 100V" (at 64.77 96.52 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 68.58 99.3648 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 64.77 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C391J1G" (at 64.77 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 64.77 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 54e03f5d-9c91-48ca-b655-2ed7334aa464)) + (pin "1" (uuid 24711fdb-a105-40ca-9b6b-8a47fb3b5a00)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C26") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 229.87 105.41 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 30338bc3-e622-4049-94f7-cf59d597bc48) + (property "Reference" "C35" (at 229.87 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "82pF 100V" (at 229.87 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 233.68 106.3752 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 229.87 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C820J1G" (at 229.87 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 229.87 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid c221e530-ec9b-4f5e-b7d6-9ed7b938b961)) + (pin "1" (uuid 2acfa831-be94-4f84-9b6f-5196d7731fef)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C35") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 262.89 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 3481dd06-0d13-4f4e-b495-9e3e22e837e9) + (property "Reference" "C80" (at 262.89 152.4 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "220pF 100V" (at 262.89 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 266.7 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 262.89 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C221J1GAC" (at 262.89 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 262.89 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid e704edb2-9da4-4975-9c76-646aaa9ed525)) + (pin "1" (uuid ca6aeba3-5e41-4a5a-91c3-c3bae917fba1)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C80") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 323.85 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 34918b86-3bd8-465b-9fe4-51e014817c9c) + (property "Reference" "#PWR0140" (at 323.85 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 321.31 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 323.85 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 323.85 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 9f8abe68-7152-4c23-9b8c-e84079f8204c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0140") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 275.59 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 359c7cb7-c09b-4193-8500-c194644ab78c) + (property "Reference" "C65" (at 276.86 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "33pF 100V" (at 279.4 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 276.5552 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 275.59 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C330J1G" (at 275.59 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 275.59 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 316193c2-d15a-4e0d-934b-3c7361fb99b7)) + (pin "1" (uuid f14e400c-51ae-4e32-89c3-5c9275cc70a5)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C65") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 138.43 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 374ef3ec-1b33-4db0-8d77-2b72a6dc0364) + (property "Reference" "L17" (at 139.7 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "1.22uH" (at 137.16 137.16 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 138.43 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 138.43 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 138.43 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 138.43 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 50365db7-3c61-4579-83e6-74f4ee7a74e9)) + (pin "2" (uuid 29f91f16-57dc-4f85-ba98-2045cedde0af)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L17") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 229.87 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 38a28d07-a50b-4489-8cac-d216d9e05519) + (property "Reference" "C83" (at 229.87 152.4 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 229.87 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 233.68 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 229.87 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 229.87 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 229.87 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 3b17e489-e1fc-483c-9ac6-8fa7736dbb05)) + (pin "1" (uuid f6ab3b6e-ef9e-4324-ade7-44877a51305d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C83") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 168.91 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 3973165c-8be3-40ea-8c04-82e48b807ff4) + (property "Reference" "#PWR094" (at 168.91 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 166.37 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 168.91 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 168.91 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid bc7493fe-32be-489f-b72d-5eb029336e66)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR094") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 257.81 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 3acbc585-20ee-4a0a-a56f-89f7459806b6) + (property "Reference" "#PWR0122" (at 257.81 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 255.27 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 257.81 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 257.81 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 4a466da7-795a-4ed9-8156-271e7ef49d65)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0122") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 382.27 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 3cc9b93e-195a-4608-b111-170f10d4122f) + (property "Reference" "C157" (at 375.92 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 378.46 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 381.3048 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 382.27 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 382.27 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 382.27 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid b33a9063-303f-45a5-8640-9c5ffa402b8d)) + (pin "1" (uuid 2c6226ad-6f70-4bb9-b057-e042ce331770)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C157") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 374.65 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 3eb4418e-42c7-47c3-ac43-fc80a66400c7) + (property "Reference" "C70" (at 375.92 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "14pF 100V" (at 378.46 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 375.6152 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 374.65 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C150J1G" (at 374.65 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 374.65 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid e35a30e3-b39a-409b-94da-4b110251f33f)) + (pin "1" (uuid 8183cbdb-946b-4940-9728-68380ef8ae8b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C70") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 290.83 105.41 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 3fbaed36-28dd-45c0-b207-87d3db235f96) + (property "Reference" "#PWR0129" (at 290.83 111.76 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 288.29 107.95 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 290.83 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 290.83 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f5283e9e-32bc-42a4-9fe4-8d9dbb58fd45)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0129") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 166.37 213.36 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 415fa270-98bc-413d-812b-7a6a98a1f6ce) + (property "Reference" "#PWR0211" (at 166.37 219.71 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 168.91 214.63 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 166.37 213.36 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 166.37 213.36 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid fc366dd3-86dc-41bb-91f6-f5bc04fd70e1)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0211") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 125.73 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 420d2744-1b5e-4497-b4f4-2c3d889c6194) + (property "Reference" "#PWR060" (at 125.73 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 123.19 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 125.73 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 125.73 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 34cd81aa-7532-48fc-b3fe-f10ed3087361)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR060") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 328.93 105.41 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 4291989f-8abe-4f5e-98d3-300b6ce2ed55) + (property "Reference" "C38" (at 328.93 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "100pF 100V" (at 328.93 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 332.74 106.3752 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 328.93 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C101J1GAULR" (at 328.93 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 328.93 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid d8371ed3-8301-4074-9308-6709fbb2e62d)) + (pin "1" (uuid 46a32a55-e76c-46c8-afaf-c0c2759dd520)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C38") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 331.47 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 43dbd100-f782-409d-ab17-b790328358b4) + (property "Reference" "K11" (at 341.63 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 340.36 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 342.9 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 331.47 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 331.47 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 331.47 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid e2ea018b-0f7b-4bec-9158-71219e4bade4)) + (pin "12" (uuid 1619b8b6-09e6-4c98-bf96-a604ea4e8acd)) + (pin "14" (uuid bd5da308-3471-49bf-ab3a-860ba3f4b3df)) + (pin "A2" (uuid cfb8dbc5-e380-4236-8451-3c3612f73195)) + (pin "11" (uuid 1000c30b-ae56-4a5c-be7e-f3f3d3aed60b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K11") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "T41_Library:IDC_2x5") (at 223.52 219.71 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 44078d0e-f005-489d-a23e-897a5efa75e1) + (property "Reference" "J27" (at 224.79 209.2157 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "LPF CTRL HI" (at 224.79 211.6399 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" (at 223.52 219.71 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 223.52 219.71 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 223.52 219.71 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "A-2939" (at 223.52 219.71 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "9" (uuid cdcc73fe-1db7-45ac-a8bf-834ceb6d3209)) + (pin "5" (uuid be375586-e8bc-4252-9f65-c962898d0144)) + (pin "2" (uuid ed7b3962-73c2-4b5b-845b-f8c09419c645)) + (pin "4" (uuid 1de5ee18-e31c-4d8c-b514-3b83b02a70da)) + (pin "6" (uuid acf67c44-2a7b-46b4-ab5d-df98325aac14)) + (pin "10" (uuid 4db61c42-207f-4f86-99f4-128300092f7a)) + (pin "7" (uuid a5b754bd-56fd-4776-897d-05f8f443c780)) + (pin "3" (uuid dc205d09-4fdc-42ea-9fa6-bb6cd8ca9d5d)) + (pin "1" (uuid 2381dfa0-b3bf-4328-9e7b-6d87dc926e40)) + (pin "8" (uuid d39bd3a6-338c-4049-bb0e-abf2c3db609d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J27") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 86.36 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 44803ceb-500a-4311-b9b8-5a6154789be3) + (property "Reference" "#PWR080" (at 86.36 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 83.82 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 86.36 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 86.36 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f839303a-ea74-4cb5-88f4-9359b2f0dc94)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR080") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 224.79 105.41 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 44ab4fdb-db55-40b4-8504-6ba835761764) + (property "Reference" "#PWR0109" (at 224.79 111.76 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 222.25 107.95 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 224.79 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 224.79 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 49034c38-9c1d-4daf-85c1-81e7cda61d48)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0109") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 158.75 146.05 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 44cc8bf4-344b-4d86-a934-fbab1d5b133f) + (property "Reference" "#PWR091" (at 158.75 152.4 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 156.21 148.59 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 158.75 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 158.75 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e4650a13-e468-44ce-b422-e8d0d2c1b00e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR091") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 97.79 140.97 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 45d497c6-0a5c-485d-9ce9-0e2684f3539c) + (property "Reference" "C75" (at 97.79 134.62 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "56pF 100V" (at 97.79 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 101.6 140.0048 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 97.79 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C560J1G" (at 97.79 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 97.79 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid f4df4abf-6ae4-48fe-a642-7d386870fb42)) + (pin "1" (uuid 5f71a58c-a9af-451c-8282-413badd1a48f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C75") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 64.77 120.65 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 46032614-460a-40d7-8799-39d924bcef59) + (property "Reference" "C46" (at 64.77 114.3 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "1200pF 100V" (at 64.77 116.84 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 68.58 119.6848 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 64.77 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061C122JAT2A" (at 64.77 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 64.77 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid f8e589fe-4fb1-45ab-9019-09a82735ebe7)) + (pin "1" (uuid feb97887-4b91-4328-bf71-ec5be4cb420f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C46") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 300.99 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 462d4e45-6e7a-4f4e-8f3b-0d0bf0535497) + (property "Reference" "#PWR0134" (at 300.99 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 298.45 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 300.99 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 300.99 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 8027a4f0-6700-461f-a005-a2d75191f0cd)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0134") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 229.87 120.65 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 47f0bc66-0bc1-4059-96d1-d98c7771c165) + (property "Reference" "C42" (at 229.87 114.3 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 229.87 116.84 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 233.68 119.6848 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 229.87 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 229.87 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 229.87 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 7443942b-8386-48b1-85e9-5b60fa995467)) + (pin "1" (uuid c99433e4-a27a-4613-8019-dbac72fce7ca)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C42") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 262.89 105.41 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 481741cf-bc02-4eac-b715-0718f6db6e18) + (property "Reference" "C36" (at 262.89 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 262.89 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 266.7 106.3752 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 262.89 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 262.89 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 262.89 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 49cadbcd-0b9b-427a-939a-6870cf37facf)) + (pin "1" (uuid 67e2db69-bdd6-4ad7-9272-36a040e1c15d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C36") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 191.77 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 483a5099-918c-4665-9374-3b842f4509ec) + (property "Reference" "#PWR0102" (at 191.77 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 189.23 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 191.77 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 191.77 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 055f4cef-416f-4942-a851-be1b2a097773)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0102") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 290.83 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 493a9a7b-4098-447a-8838-00d5b8985720) + (property "Reference" "#PWR0132" (at 290.83 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 288.29 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 290.83 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 290.83 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d7114940-7167-4e6a-bcdf-e9e0da29ef84)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0132") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 382.27 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 4a5b8eca-96f5-46af-be91-e735aeb74127) + (property "Reference" "#PWR0155" (at 382.27 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 382.27 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 382.27 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 382.27 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid ffd75c05-c7d9-44d5-844a-d6855269b06b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0155") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 39.37 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 4b499858-eb45-4494-9368-a9c9f08b4783) + (property "Reference" "L14" (at 40.64 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "4.73uH" (at 38.1 135.89 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 39.37 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 39.37 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 39.37 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 39.37 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 828d9e17-feef-4190-90d7-e9302a627f39)) + (pin "2" (uuid 22328c8a-f939-4377-90b9-e81b287bdd1a)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L14") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 53.34 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 4ce50d26-21b1-4a13-8b31-9988aa7906a9) + (property "Reference" "#PWR067" (at 53.34 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 53.34 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 53.34 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 53.34 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 9f72f5a5-c7cb-46a3-94bd-a6eafdf62d83)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR067") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 204.47 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 4e40d70c-3b17-4780-9274-5a50da6b06f3) + (property "Reference" "L19" (at 205.74 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.608uH" (at 203.2 138.43 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 204.47 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 204.47 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 204.47 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 204.47 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 190a1d65-81cd-4a2e-b9b2-fba32939fe6a)) + (pin "2" (uuid bb5bf3ef-9c64-44a7-9dc6-d29b20240165)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L19") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 31.75 105.41 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 4e68a03a-5114-482b-ab00-84430d29645d) + (property "Reference" "C29" (at 31.75 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "1500pF 100V" (at 31.75 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 35.56 106.3752 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 31.75 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C152J1GECAUT" (at 31.75 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 31.75 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 1ab3ff0f-5f0a-44af-ab37-aeb4a9ce6c53)) + (pin "1" (uuid 94577ef0-0c12-4b40-ad1f-df6ca2661e4c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C29") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 119.38 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 4f09ca6a-63a2-4091-a08e-eb5a0f2931d8) + (property "Reference" "#PWR077" (at 119.38 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 116.84 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 119.38 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 119.38 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid db150b97-c9c3-462c-886d-f73a2a7f4dc3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR077") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "T41_Library:IDC_2x5") (at 193.04 218.44 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 51bbd339-dfbc-430b-a01b-fddb46073bfe) + (property "Reference" "J26" (at 194.31 207.9457 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "LPF CTRL LOW" (at 194.31 210.3699 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" (at 193.04 218.44 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 193.04 218.44 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 193.04 218.44 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "A-2939" (at 193.04 218.44 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "9" (uuid 35d6f6a9-fd37-4fae-82e7-48fda2402f78)) + (pin "5" (uuid a20d21d8-9004-4eb9-b2b9-cd5c3fce5760)) + (pin "2" (uuid cec9701d-6973-47b1-a63a-7329e92973cd)) + (pin "4" (uuid 1a672316-fc65-444a-8a86-36c83bab6ff9)) + (pin "6" (uuid fe371daa-49af-410a-865c-997cfdd2de41)) + (pin "10" (uuid 22c50ec9-8897-4aea-a479-a12fb4a8d638)) + (pin "7" (uuid 9bfaa217-d16e-4516-b207-ba5d9d84be88)) + (pin "3" (uuid 95f3cb36-edc1-4338-b402-69da3ab9972b)) + (pin "1" (uuid dd2ee6d8-be82-4020-b4ed-cbe12a7e915d)) + (pin "8" (uuid 5ae1b23c-84d0-46bb-9270-9cb54d6f241f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J26") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 152.4 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 5354eefe-6186-4c3b-b2c2-d583d14bbb9f) + (property "Reference" "C115" (at 146.05 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 148.59 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 151.4348 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 152.4 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 152.4 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 152.4 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 5c4ae988-b079-4087-ba95-2ca2b2de920e)) + (pin "1" (uuid 336b08e1-d43f-49d7-b572-2e18816f1553)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C115") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 20.32 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 560fd022-8926-4d37-adcc-4c54f6d15e95) + (property "Reference" "#PWR066" (at 20.32 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 17.78 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 20.32 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 20.32 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 0bed9dcf-e430-449b-97d9-573a41d50722)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR066") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 110.49 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 56ebc141-c049-4701-8a79-0e5e8580404e) + (property "Reference" "C66" (at 111.76 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "68pF 100V" (at 114.3 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 111.4552 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 110.49 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C680J1G" (at 110.49 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 110.49 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid c92e4162-ba15-4323-b1b4-13cf3a8265f5)) + (pin "1" (uuid fc9aaeba-ebb7-4251-9123-82121fd3b28f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C66") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 158.75 105.41 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 57113d25-cb29-4c42-a1b4-c4a28aff7e14) + (property "Reference" "#PWR089" (at 158.75 111.76 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 156.21 107.95 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 158.75 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 158.75 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 4fc08a13-e192-4121-9460-63c0f9de63d5)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR089") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 224.79 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 571369d9-d1c9-4b3e-8331-250f93e1f31a) + (property "Reference" "#PWR0112" (at 224.79 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 222.25 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 224.79 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 224.79 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d1a5850b-8a1e-4bdf-9289-7489af790d12)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0112") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 262.89 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 57b35f5e-a838-4dae-9c83-7f6cabc49414) + (property "Reference" "C97" (at 262.89 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 262.89 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 266.7 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 262.89 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 262.89 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 262.89 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid fb9ed395-8003-4126-9ea5-5de63e1a1898)) + (pin "1" (uuid 2a35d025-87e9-4e2a-ae04-4124ffce9cb3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C97") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 364.49 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 57b4e99f-1812-4a3d-a6b0-b982c2b9ccf9) + (property "Reference" "K29" (at 374.65 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 378.46 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 375.92 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 364.49 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 364.49 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 364.49 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 127629f4-4184-4dc8-b437-04e4f8bf4ca1)) + (pin "12" (uuid 63a869da-21a9-4905-b30e-e283fc56ccb0)) + (pin "14" (uuid 25cd3823-d278-4cb7-a5b6-c2264640f702)) + (pin "A2" (uuid 4ee1a959-2027-4460-95ac-1c5f519ca040)) + (pin "11" (uuid cd701b2e-db7e-4be7-b8a4-d3d63325c1db)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K29") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 31.75 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 58a655f9-28e6-4585-ab39-7f529419a700) + (property "Reference" "C55" (at 31.75 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 31.75 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 35.56 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 31.75 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 31.75 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 31.75 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 46a8c5eb-5f23-42a5-940f-e004572954ae)) + (pin "1" (uuid 26701f87-9ac6-4195-af36-fee218a8727c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C55") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 323.85 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 594d80f1-d7cc-407b-9cf3-9b093d214721) + (property "Reference" "#PWR0142" (at 323.85 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 321.31 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 323.85 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 323.85 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1fe6e4d6-07ba-4e45-81d3-3dc4cbb9a7cc)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0142") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 100.33 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 5955741e-b12f-47b6-bfd4-2be9b139d5eb) + (property "Reference" "K13" (at 110.49 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 109.22 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 111.76 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 100.33 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 100.33 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 100.33 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 1f2d3635-ea9b-4b8f-b538-33f7a4919b59)) + (pin "12" (uuid 1e0f792c-42f8-4b49-94fc-85e4bbeb0b88)) + (pin "14" (uuid 0a79a37b-50b0-4b4e-bd91-91f6f44a9e9c)) + (pin "A2" (uuid bf3bc299-195f-489f-9098-b1c005a6a785)) + (pin "11" (uuid 5dfaec89-721b-4f94-83c4-37dbab7f6c36)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K13") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 102.87 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 59e11b6f-d17b-4ef8-a876-d0c62eebe41c) + (property "Reference" "#PWR075" (at 102.87 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 100.33 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 102.87 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 102.87 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 4cc682ac-384d-400d-8697-9440056d7eca)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR075") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 92.71 101.6 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 5a002c98-ce7e-4b0d-aeca-905be396b44f) + (property "Reference" "#PWR052" (at 92.71 107.95 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 90.17 104.14 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 92.71 101.6 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 92.71 101.6 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 69ed323a-0eb1-4ee2-9608-5e8ce35fc665)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR052") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 196.85 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 5abe35c9-3a5f-4ed2-ad84-6af0e1413b2b) + (property "Reference" "C96" (at 196.85 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "220pF 100V" (at 196.85 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 200.66 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 196.85 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C221J1GAC" (at 196.85 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 196.85 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 73f647fa-08d0-416c-9e6e-b059ee6d83aa)) + (pin "1" (uuid 4fafe073-dea0-41e1-8560-73b3d33df8bc)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C96") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 92.71 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 5c747b7e-73e2-4312-9c27-71dcc52bf15b) + (property "Reference" "#PWR056" (at 92.71 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 90.17 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 92.71 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 92.71 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid cb613585-1ba4-4420-9723-299dbc73db09)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR056") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 396.24 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 5cf27801-fb58-44e3-b953-f5ca8f842026) + (property "Reference" "K33" (at 406.4 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 405.13 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 407.67 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 396.24 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 396.24 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 396.24 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 46f853ca-5683-4636-b15d-7a06ca3daf9c)) + (pin "12" (uuid 4ddb492c-05c0-4373-94e6-b81ae705a170)) + (pin "14" (uuid 2a845f60-f558-4838-80a3-4af834c6b5ba)) + (pin "A2" (uuid d3f7ef0d-5ed1-4a32-950d-5329bf8abd6f)) + (pin "11" (uuid 7bb337eb-783d-48fd-a1fe-a2c357ad3971)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K33") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 20.32 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 5f64c26e-4414-4864-b741-bc55bbc260cb) + (property "Reference" "C107" (at 13.97 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 16.51 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 19.3548 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 20.32 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 20.32 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 20.32 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 5a1ce3ba-0487-4fee-bba5-b47fd3628800)) + (pin "1" (uuid 85b5eb87-8499-4c8d-b796-411f84d402df)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C107") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 237.49 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 5fb181fd-a517-40d7-969b-cf8024fdf828) + (property "Reference" "L9" (at 239.649 113.03 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.519uH" (at 240.03 115.57 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 237.49 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 237.49 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 237.49 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 237.49 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 9ab20bb7-0ff8-49e9-88b8-65272673d43a)) + (pin "2" (uuid 05a72a2e-97e8-4bfb-b2fd-df5d0dbecbde)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L9") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 257.81 105.41 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 61636b1e-9577-490c-b72e-54069fcdfe25) + (property "Reference" "#PWR0119" (at 257.81 111.76 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 255.27 107.95 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 257.81 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 257.81 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 6a08f2da-02fa-4326-b40b-566d151ca8ae)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0119") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 284.48 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 61ec9252-e462-40d9-9e63-7c731df3ceab) + (property "Reference" "#PWR0127" (at 284.48 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 284.48 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 284.48 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 284.48 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid de5dbd84-0dbe-434e-af0f-f05fd13fdf64)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0127") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 290.83 146.05 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 6227e1d6-03fe-463b-bd02-278c0cd5a57a) + (property "Reference" "#PWR0131" (at 290.83 152.4 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 288.29 148.59 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 290.83 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 290.83 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid bbe7c5c0-4530-4a35-ad78-9f58fcfa896c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0131") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 163.83 100.33 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 633ee90c-a200-4ad0-8cf9-16a4fcf6509a) + (property "Reference" "C27" (at 163.83 93.98 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 163.83 96.52 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 167.64 99.3648 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 163.83 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 163.83 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 163.83 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 5683cd58-163e-4aa5-9209-4e78a7a31ab1)) + (pin "1" (uuid b31504cb-1f62-4d4a-b4e2-236db168712d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C27") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 97.79 115.57 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 634d1281-2e9f-4b97-8c74-f611a08a5324) + (property "Reference" "C40" (at 97.79 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "470pF 100V" (at 97.79 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 101.6 114.6048 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 97.79 115.57 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C471J1GAC" (at 97.79 115.57 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 97.79 115.57 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 54061599-7779-43f0-ac44-7d0677386e3f)) + (pin "1" (uuid 4ef02753-59a3-47e3-8e58-94dc231e68b2)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C40") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 270.51 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 64771300-ad1c-46ef-9fa2-b78741e82072) + (property "Reference" "L10" (at 272.669 113.03 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.447uH" (at 273.05 115.57 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 270.51 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 270.51 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 270.51 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 270.51 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 5b4af0e1-bd31-40bd-bda2-f7fa7ad6721e)) + (pin "2" (uuid e05a790f-6f9d-4de5-a2ca-97c30859b4c9)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L10") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 196.85 105.41 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 650c03d4-848b-41d1-9f63-91e92abd104b) + (property "Reference" "C34" (at 196.85 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "220pF 100V" (at 196.85 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 200.66 106.3752 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 196.85 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C221J1GAC" (at 196.85 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 196.85 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 9dcbf31a-f63a-41b6-bc90-ee1975b867df)) + (pin "1" (uuid 14afbc81-ab23-46cf-8174-6456c1be94e1)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C34") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 191.77 105.41 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 68ac2971-d6a6-4530-a52a-b90458285c9b) + (property "Reference" "#PWR099" (at 191.77 111.76 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 189.23 107.95 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 191.77 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 191.77 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 7b6a492a-3754-48b9-b4e6-dfc0545e3d7d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR099") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 130.81 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 68ca82b0-e9ad-4de3-ac67-8fc0310ad649) + (property "Reference" "C103" (at 130.81 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 130.81 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 134.62 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 130.81 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 130.81 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 130.81 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 2b46b677-ab60-4b97-9d67-557d34c5c411)) + (pin "1" (uuid 2d4ae38d-b697-40b0-8779-b90470e192b1)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C103") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 59.69 105.41 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 6bbbc7d5-9394-48ee-a218-13b95b9dc9ec) + (property "Reference" "#PWR048" (at 59.69 111.76 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 57.15 107.95 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 59.69 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 59.69 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1c3de89d-263f-4a21-874e-8f3123737265)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR048") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 130.81 100.33 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 6db9aa11-ac36-4599-93eb-c984865d01e6) + (property "Reference" "C25" (at 130.81 93.98 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 130.81 96.52 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 134.62 99.3648 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 130.81 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 130.81 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 130.81 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 28e5d1e7-9f00-4c62-bcba-a2e390f90bf2)) + (pin "1" (uuid ffbd4905-977e-4da4-b51c-95af0aeabc7a)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C25") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 356.87 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 6e2a0b23-d6f3-46a2-b36b-522c7a4a86f0) + (property "Reference" "#PWR0150" (at 356.87 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 354.33 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 356.87 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 356.87 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 7379883b-5a24-4f02-9a44-020db7899721)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0150") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 69.85 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 6f33ccc5-f87b-420f-933b-4a6de3460622) + (property "Reference" "#PWR069" (at 69.85 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 67.31 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 69.85 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 69.85 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1676b1d5-d61f-47ee-b631-3a9b48de2b3d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR069") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 382.27 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 7132f1da-85c0-4173-ba27-d9de56bbd6e1) + (property "Reference" "#PWR0157" (at 382.27 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 382.27 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 382.27 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 382.27 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid a366cd27-dc7e-447f-9d2b-77438118e2c4)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0157") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 34.29 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 71adcbae-425a-48d3-9f17-d6c16a3bec9e) + (property "Reference" "K21" (at 44.45 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 48.26 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 45.72 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 34.29 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 34.29 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 34.29 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 708c9968-51d1-4b33-9b1b-4b888fa0a53c)) + (pin "12" (uuid ea782da5-176a-429f-94d3-f8dfe4a78273)) + (pin "14" (uuid fe0c1913-7c66-43d8-8d80-90b0477f148a)) + (pin "A2" (uuid 0677cab0-deb4-4801-8acb-c312d2aafda1)) + (pin "11" (uuid 7f6cea1c-a33c-40b6-8c39-0d98e200a18f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K21") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 295.91 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 71f9ad9c-c6cb-40d3-8d1f-855afd430e75) + (property "Reference" "C81" (at 295.91 152.4 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "180pF 100V" (at 295.91 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 299.72 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 295.91 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C181J1G" (at 295.91 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 295.91 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 5d553654-1aeb-490d-a14f-af96fc25ecd0)) + (pin "1" (uuid d15189fa-9f0a-4092-83ab-7bcae0db5fa8)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C81") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 328.93 120.65 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7202945a-02bd-45f5-b1a1-0f70c5ffbae4) + (property "Reference" "C41" (at 328.93 114.3 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "82pF 100V" (at 328.93 116.84 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 332.74 119.6848 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 328.93 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C820J1G" (at 328.93 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 328.93 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid e2d574af-367c-4961-9d18-4a80e64f5268)) + (pin "1" (uuid 72370c17-ce39-4e91-9435-1ce96f896e0c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C41") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 152.4 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 72559e8d-e6ee-40ab-ae6d-3fec3c1b4c68) + (property "Reference" "#PWR088" (at 152.4 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 149.86 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 152.4 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 152.4 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 899b0e65-743f-42de-985e-cde67392ced0)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR088") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 105.41 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7347a074-2f4b-4c69-a7fa-904713f07ff7) + (property "Reference" "L27" (at 107.569 153.67 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "1.76uH" (at 107.95 156.21 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 105.41 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 105.41 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 105.41 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 105.41 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid fce974be-aad1-4725-8595-e9a62c445927)) + (pin "2" (uuid ebf41997-2a49-4407-9495-d2ad0652d414)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L27") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 191.77 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7352c648-1b8b-4e5f-be0e-058a586ef9c2) + (property "Reference" "#PWR0100" (at 191.77 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 189.23 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 191.77 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 191.77 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 68213b86-b622-4f32-be46-fbbcff84775e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0100") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 152.4 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 7356ff4b-7faa-4ae0-ad6d-061270df1380) + (property "Reference" "#PWR087" (at 152.4 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 152.4 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 152.4 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 152.4 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 11e4d54f-753a-437f-a224-4adcbe937092)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR087") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 64.77 140.97 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7512579a-c28e-4083-bd66-c40d932a2b0c) + (property "Reference" "C76" (at 64.77 134.62 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "100pF 100V" (at 64.77 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 68.58 140.0048 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 64.77 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C101J1GAULR" (at 64.77 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 64.77 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid c701a5b9-e0da-407e-9ec9-659e940ee572)) + (pin "1" (uuid 1d9caaf1-fc43-437d-a5c3-55b5145c70d5)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C76") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 224.79 146.05 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7566ce2b-d26d-4124-acc3-5f5f15fa5762) + (property "Reference" "#PWR0111" (at 224.79 152.4 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 222.25 148.59 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 224.79 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 224.79 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 2245db81-05ed-4468-8fda-ea4c5be8e7bb)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0111") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 232.41 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 75af5a94-9d2b-4e94-b428-4b7489cdc189) + (property "Reference" "K25" (at 242.57 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 246.38 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 243.84 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 232.41 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 232.41 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 232.41 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 88b9d32d-1fd5-45a4-97fd-8ca662752dd1)) + (pin "12" (uuid 66c25fa1-208b-42bd-8fa0-299c83ffaa45)) + (pin "14" (uuid ee3a16de-f9e4-4fcd-a995-465146eb927f)) + (pin "A2" (uuid 0072df61-a9b7-4e23-8e20-0a828a9d6fe6)) + (pin "11" (uuid b56a081a-692c-488d-91bf-5d3c688783b7)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K25") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 64.77 161.29 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 76af360c-02f9-4894-82e7-8f53ded070be) + (property "Reference" "C92" (at 64.77 154.94 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "470pF 100V" (at 64.77 157.48 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 68.58 160.3248 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 64.77 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C471J1GAC" (at 64.77 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 64.77 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid ef14ba24-4037-44cd-9eba-b7bcc64e0a3f)) + (pin "1" (uuid 55520e74-0578-4639-a9de-50335d388e85)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C92") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 284.48 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 76e24532-9717-458b-ba48-dbb586f5a419) + (property "Reference" "#PWR0128" (at 284.48 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 281.94 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 284.48 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 284.48 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1adcc736-4e27-479d-a4fe-ab2613ace289)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0128") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 232.41 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 77e44b95-e5a6-483b-8f1a-26ba51cd6d99) + (property "Reference" "K9" (at 242.57 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 241.3 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 243.84 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 232.41 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 232.41 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 232.41 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 28625071-ec09-4324-9b12-7b3c21884163)) + (pin "12" (uuid d8e8bd4b-1869-4516-8fee-a65bff2d28ad)) + (pin "14" (uuid ea2c81ed-da76-4c19-b85f-78ecc022149e)) + (pin "A2" (uuid cdcd65f3-ac41-4e08-9cb1-da067e90dac3)) + (pin "11" (uuid 3d742481-9c66-4900-b386-bfad9f979be0)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K9") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 152.4 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 78860ed9-aff2-4c44-95a2-86d07f7f3f10) + (property "Reference" "#PWR086" (at 152.4 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 149.86 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 152.4 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 152.4 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d9c2a055-f3d2-4543-b164-07a111b07b01)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR086") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 125.73 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7896e59a-79d4-49ca-8721-bd336346c33e) + (property "Reference" "#PWR058" (at 125.73 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 123.19 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 125.73 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 125.73 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 22f01874-ac7a-4fd5-b7f5-0c0839a10ded)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR058") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 53.34 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7c3e284c-fbe5-4851-8ddc-b6f88201fdf6) + (property "Reference" "C109" (at 46.99 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 49.53 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 52.3748 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 53.34 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 53.34 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 53.34 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 1a2bdfca-78ac-43d7-aa0d-d9841c4c5374)) + (pin "1" (uuid b784291e-0b80-413c-84e4-5fe8b9c5fcce)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C109") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 341.63 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7c53c1c0-07b7-4f3b-973e-c6a0302c7424) + (property "Reference" "C69" (at 342.9 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "27pF 100V" (at 345.44 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 342.5952 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 341.63 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C270J1G" (at 341.63 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 341.63 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 0472405d-8bd4-439d-b252-752861f15232)) + (pin "1" (uuid d3ce2764-3131-4cbc-b26d-2ded3ccba7e3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C69") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 67.31 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7c91a705-09d9-486c-8f48-39b942b2da49) + (property "Reference" "#PWR072" (at 67.31 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 64.77 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 67.31 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 67.31 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid c07d321e-5b35-40dd-b981-1cc058158f54)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR072") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 133.35 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 7f7943ac-3c60-4a94-94a2-9f74a6885788) + (property "Reference" "K22" (at 143.51 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 147.32 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 144.78 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 133.35 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 133.35 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 133.35 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid ec40d584-6052-4b30-9d5e-45e3db8e62c2)) + (pin "12" (uuid 4c9dce0d-759e-4073-a1a4-a70df87259e5)) + (pin "14" (uuid 829a0cc6-f0f9-408c-8754-4b218ff1b2c5)) + (pin "A2" (uuid 1aa3b33d-634d-4257-bc52-aaadb17dad57)) + (pin "11" (uuid 5fcd535c-c08b-44b7-a30e-b61191bb3eb8)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K22") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 26.67 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 80849d5b-16d1-4e2b-b54b-a270ecc55949) + (property "Reference" "#PWR045" (at 26.67 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 24.13 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 26.67 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 26.67 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid ad731e95-2406-44fc-a245-ed8a45d1fba3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR045") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 64.77 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 808df3be-d03a-496f-b580-d9c2a573a180) + (property "Reference" "C101" (at 64.77 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "390pF 100V" (at 64.77 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 68.58 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 64.77 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C391J1G" (at 64.77 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 64.77 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid ebbd6928-80af-422a-b5b7-6e1df216cd4c)) + (pin "1" (uuid e2369be1-e825-4fb3-866b-5cfaa0a5ccad)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C101") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 298.45 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8224bfc6-c0d9-444f-971f-31092083109d) + (property "Reference" "#PWR0133" (at 298.45 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 295.91 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 298.45 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 298.45 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 911c44d3-defb-4b13-819d-aa28fde13b8e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0133") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 356.87 105.41 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 831a7a3f-68d9-4880-a2f3-14261f68c57c) + (property "Reference" "#PWR0149" (at 356.87 111.76 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 354.33 107.95 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 356.87 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 356.87 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid c1c6f209-6e67-4465-a9e6-2f6060e84823)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0149") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 143.51 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8361787a-476a-487f-ae02-fcb1e0485747) + (property "Reference" "C58" (at 144.78 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "100pF 100V" (at 147.32 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 144.4752 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 143.51 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C101J1GAULR" (at 143.51 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 143.51 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 63244850-a76a-4a76-bf90-3dd678b5b8b8)) + (pin "1" (uuid a444dfe4-78c4-4d6c-b0f2-365e71cf06e8)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C58") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 251.46 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 836e9a66-9aeb-473d-95c1-d4f526ac6b43) + (property "Reference" "#PWR0115" (at 251.46 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 251.46 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 251.46 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 251.46 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1d52698d-347b-4900-b16b-071605b09741)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0115") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 185.42 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8370823c-82dc-4f30-990f-de148d5af9e4) + (property "Reference" "C116" (at 179.07 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 181.61 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 184.4548 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 185.42 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 185.42 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 185.42 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 6a86544a-efcc-4440-9613-12cc2ff0b352)) + (pin "1" (uuid d2ca587c-1739-48fd-9910-068486816e64)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C116") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 237.49 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8759c416-d0dc-413a-994c-9a8630d2f2a1) + (property "Reference" "L20" (at 238.76 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.471uH" (at 236.22 137.16 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 237.49 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 237.49 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 237.49 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 237.49 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 398ebe52-1035-4923-9968-95d604d2254a)) + (pin "2" (uuid d93d257c-b124-4693-b3ef-94b671787572)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L20") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 350.52 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 879abae2-0b4a-4c4e-ba1a-97e6cf6a036f) + (property "Reference" "#PWR0148" (at 350.52 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 347.98 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 350.52 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 350.52 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 76697df1-d844-4192-b48b-8338ae96231e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0148") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 26.67 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 881eb176-abbe-43b5-8745-45dd26eb74ca) + (property "Reference" "#PWR047" (at 26.67 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 24.13 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 26.67 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 26.67 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 990df348-890e-4e66-aca3-3d8bbb272b11)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR047") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 97.79 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8825a924-9951-49d4-bb35-ff8e93ee7b17) + (property "Reference" "C57" (at 97.79 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "56pF 100V" (at 97.79 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 101.6 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 97.79 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C560J1G" (at 97.79 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 97.79 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid e90c9684-4acc-41fe-a163-0d6e34b7f2d6)) + (pin "1" (uuid 9c3e4172-43cf-42bf-9d0a-5218441622bc)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C57") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 303.53 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 88cdd729-414c-4757-b53c-d56e3dd2f0ab) + (property "Reference" "L33" (at 305.689 153.67 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.337uH" (at 306.07 156.21 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 303.53 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 303.53 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 303.53 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 303.53 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid de3bc30a-5dee-4498-84ae-1ceed6422db8)) + (pin "2" (uuid 46ccf8e3-5178-4dac-a08d-fbc70283f210)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L33") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 328.93 140.97 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 89293ea0-da20-49c1-ac23-523831a73aaa) + (property "Reference" "C72" (at 328.93 134.62 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "82pF 100V" (at 328.93 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 332.74 140.0048 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 328.93 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C820J1G" (at 328.93 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 328.93 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 07fc4461-4e87-4a77-bb04-ea2bb5c93af7)) + (pin "1" (uuid d3e052de-48dd-47d7-b935-470daeb3532d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C72") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 166.37 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8962e2f2-51a8-49d5-88f6-3e6c80e2ff0b) + (property "Reference" "K23" (at 176.53 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 180.34 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 177.8 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 166.37 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 166.37 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 166.37 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 1e70ac32-1fa6-4fb1-a54c-ff0e5e91783f)) + (pin "12" (uuid 9355f94c-59aa-4318-8dc9-6eb333c971fc)) + (pin "14" (uuid 558ffe13-f185-4d7b-a4f0-aaeb71741bbe)) + (pin "A2" (uuid c4cf0a38-18f3-4bec-a71e-2912abbe3b68)) + (pin "11" (uuid 2d670b43-4ac3-4ce6-880d-748da01a45c2)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K23") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 185.42 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 89ef717a-93db-42f7-a13d-fbcd23090f4d) + (property "Reference" "C117" (at 179.07 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 181.61 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 184.4548 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 185.42 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 185.42 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 185.42 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 9385d4f1-b140-4825-912c-2eba1468c49e)) + (pin "1" (uuid c1e33922-994a-439c-ae93-e3cd8a6998a3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C117") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 26.67 105.41 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8ac631cd-7fc6-4134-b3c5-5b61a2c1c645) + (property "Reference" "#PWR044" (at 26.67 111.76 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 24.13 107.95 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 26.67 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 26.67 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e64bb44b-3820-42c7-ad82-3b373fee50f6)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR044") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 100.33 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8b0fe0f8-daa9-45d2-b624-0be9da687e4f) + (property "Reference" "K20" (at 110.49 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 114.3 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 111.76 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 100.33 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 100.33 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 100.33 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 5225390f-648b-4bda-b0bd-355a4784b5af)) + (pin "12" (uuid 211d001c-56df-457a-88b2-04afae803d3d)) + (pin "14" (uuid 32666e10-5db8-4171-a175-7268a80dc39d)) + (pin "A2" (uuid db5b9584-ff01-43fb-989a-c54f2c55f384)) + (pin "11" (uuid bbcddcf4-ff05-4b09-84c2-20fe3f66f413)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K20") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 317.5 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8c91f4a2-b5e7-44cc-ae98-3be4a77153e2) + (property "Reference" "#PWR0136" (at 317.5 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 314.96 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 317.5 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 317.5 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d9261230-ed9b-4951-8ff5-c4c249b3fe50)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0136") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 53.34 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 8db1288d-8a10-4332-909f-eacc1314415b) + (property "Reference" "#PWR070" (at 53.34 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 53.34 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 53.34 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 53.34 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 09237b0e-6b48-4bc8-b231-581f2489a927)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR070") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 86.36 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8e6c5265-62e5-4c2d-ae30-7387a9a7201c) + (property "Reference" "C110" (at 80.01 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 82.55 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 85.3948 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 86.36 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 86.36 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 86.36 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 276c18be-2366-4e4f-9545-fd1703ea70c7)) + (pin "1" (uuid 9eddc554-b099-4ebc-b00f-ec21f8fa1f88)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C110") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 39.37 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 8e7db6d1-3324-4b6d-acb6-902921051153) + (property "Reference" "L25" (at 41.529 152.4579 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "5.21uH" (at 41.529 154.8821 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 39.37 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 39.37 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 39.37 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 39.37 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 4327c0a3-dbf2-4500-9daa-62d6e695845a)) + (pin "2" (uuid e5055cb3-bf2c-4f18-ab59-75984e35a3b5)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L25") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 44.45 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 8f0dc41c-931e-4da8-82e7-e974ba1860b4) + (property "Reference" "C59" (at 45.72 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 48.26 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 45.4152 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 44.45 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 44.45 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 44.45 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid a0df16a8-2c91-4606-907e-844849e5770c)) + (pin "1" (uuid a200e6c6-8733-4f09-a6c8-87d2b6a20f35)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C59") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 303.53 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 91beb536-a3f9-4a2d-a63a-f436fd9a11ad) + (property "Reference" "L22" (at 304.8 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.342uH" (at 302.26 138.43 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 303.53 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 303.53 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 303.53 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 303.53 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d1f8855a-e8af-472d-a096-e4486b22c109)) + (pin "2" (uuid f9d14406-f80b-45b4-9a25-e3f37e2a021c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L22") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 232.41 222.25 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 91f98bee-a85b-4f04-8eff-ac6a763bf7a1) + (property "Reference" "#PWR0216" (at 232.41 228.6 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 234.95 223.52 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 232.41 222.25 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 232.41 222.25 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid eb7bc4c7-d857-47c6-98ba-518928f887cc)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0216") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Mechanical:MountingHole_Pad") (at 118.11 215.9 270) (unit 1) + (in_bom no) (on_board yes) (dnp no) (fields_autoplaced) + (uuid 9261f4c5-839a-4c33-a065-5a90ba320edf) + (property "Reference" "H5" (at 121.92 215.9 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "~" (at 121.92 217.1121 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "MountingHole:MountingHole_4.3mm_M4_DIN965_Pad" (at 118.11 215.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 118.11 215.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 118.11 215.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 118.11 215.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid fd4342f9-9f35-41f8-808f-009640104266)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H5") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 191.77 146.05 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 9383560e-3bfa-48f8-890e-2c8dce2ecff2) + (property "Reference" "#PWR0101" (at 191.77 152.4 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 189.23 148.59 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 191.77 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 191.77 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 9e7efa1f-b9a2-48dc-b176-358ae7b31785)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0101") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 20.32 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 93a02541-e576-426d-b441-d8db55ca06fb) + (property "Reference" "C106" (at 13.97 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 16.51 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 19.3548 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 20.32 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 20.32 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 20.32 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 3e349ee0-ce55-4e4e-abd8-20ca173f805b)) + (pin "1" (uuid aa0583ff-563c-4524-bf58-54b7c463f854)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C106") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 229.87 100.33 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 93c82041-4ec5-4c01-a81d-19d73cf87e4a) + (property "Reference" "C24" (at 229.87 93.98 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "82pF 100V" (at 229.87 96.52 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 233.68 99.3648 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 229.87 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C820J1G" (at 229.87 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 229.87 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 874cf946-90ff-4eef-ba2b-212aeb7991d9)) + (pin "1" (uuid 8d1bb1c3-a61a-4ae6-89eb-2387c24e0cf1)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C24") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 323.85 105.41 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 94363505-7cae-41d6-a61c-6640860c08d4) + (property "Reference" "#PWR0139" (at 323.85 111.76 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 321.31 107.95 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 323.85 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 323.85 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 0ce535ed-8768-49c1-b7d2-2ca4591261e4)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0139") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 64.77 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 95d59a16-43ed-495c-882f-c1b14c436088) + (property "Reference" "C86" (at 64.77 152.4 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "1200pF 100V" (at 64.77 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 68.58 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 64.77 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061C122JAT2A" (at 64.77 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 64.77 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 1951e927-77bb-45f9-b623-50aaeeef868f)) + (pin "1" (uuid 7ea9016c-c338-413e-b24a-927229ed00f4)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C86") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 317.5 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 968e0fce-5a81-41d7-a402-826bc11bcfc1) + (property "Reference" "C125" (at 311.15 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 313.69 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 316.5348 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 317.5 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 317.5 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 317.5 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 9fe0c626-6ad2-438d-9d29-dcaee88060a1)) + (pin "1" (uuid aeed9dd1-29f0-410f-b1fe-f4ff68c26057)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C125") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 72.39 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 971cfd51-4f6c-4c25-ae18-90ef87bb6b35) + (property "Reference" "L15" (at 73.66 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "2.43uH" (at 71.12 137.16 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 72.39 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 72.39 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 72.39 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 72.39 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 87b93bfd-9374-4c65-891c-9c745e6b40e9)) + (pin "2" (uuid 415605dc-c022-47ce-aec4-48f794db215c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L15") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 224.79 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 9784e6ce-89d0-4a65-bfca-53a5ef182887) + (property "Reference" "#PWR0110" (at 224.79 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 222.25 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 224.79 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 224.79 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid a39d2a83-e3c7-4c26-9430-26d39b11ce0c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0110") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 83.82 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 97933539-072f-47c5-a039-b21306d5753a) + (property "Reference" "C62" (at 85.09 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "47pF 100V" (at 87.63 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 84.7852 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 83.82 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C470J1GAC" (at 83.82 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 83.82 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid bbb09ff6-35a1-4405-b125-e5f1396c1efe)) + (pin "1" (uuid 36f97448-7f3f-4e60-81e3-86bc0d12c9d9)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C62") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 176.53 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 97c31759-183c-4473-9da6-b2a5a4a43be2) + (property "Reference" "C68" (at 177.8 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "68pF 100V" (at 180.34 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 177.4952 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 176.53 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C680J1G" (at 176.53 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 176.53 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid a25ba139-7fdb-4f35-9583-6efdd5c84fe7)) + (pin "1" (uuid 92cd5642-7d04-4959-aa45-793e52044655)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C68") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Connector:Conn_Coaxial") (at 157.48 207.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 97d637d8-22dd-41f6-a007-5229b5324d03) + (property "Reference" "J22" (at 160.02 209.55 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "RF interconnect" (at 160.02 207.01 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" (at 157.48 207.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" " ~" (at 157.48 207.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "712-CONSMA001-G" (at 157.48 207.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 157.48 207.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f3c1193c-9a43-4ac9-b31c-df47f33e8f52)) + (pin "2" (uuid b440b922-bfe8-4a83-a75e-7f1daf692577)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J22") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 31.75 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 983e6ed1-9e02-4f83-962e-5fc1b3b4a481) + (property "Reference" "C102" (at 31.75 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 31.75 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 35.56 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 31.75 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 31.75 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 31.75 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 8cc5252b-457d-4f5d-845d-fbad07f504b0)) + (pin "1" (uuid a5cb4ef4-600c-4498-9c8d-ce15a78a838d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C102") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 204.47 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 98483035-2b25-45c8-9ecf-9cb34d290861) + (property "Reference" "L8" (at 206.629 113.03 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.670uH" (at 207.01 115.57 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 204.47 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 204.47 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 204.47 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 204.47 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 3232f365-0aff-47af-a127-dd9330c877b2)) + (pin "2" (uuid 3943b52d-119d-4710-8665-5780eeb72e1b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L8") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 251.46 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 9c5d5163-6de9-4898-bf57-3550dfa2b0c7) + (property "Reference" "C120" (at 245.11 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 247.65 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 250.4948 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 251.46 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 251.46 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 251.46 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid a24b2b23-07a3-4c94-a7fa-846febcae42d)) + (pin "1" (uuid 527b2a03-6029-4225-91db-b4e9cc888e1b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C120") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 59.69 146.05 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 9cbe2e66-d93b-4069-bdf8-d9281c7d074e) + (property "Reference" "#PWR050" (at 59.69 152.4 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 57.15 148.59 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 59.69 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 59.69 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 81332afd-8900-4277-b195-fe4c0a046390)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR050") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 163.83 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 9d128f59-70f7-4141-97fc-d8d379fc0ce9) + (property "Reference" "C47" (at 163.83 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "470pF 100V" (at 163.83 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 167.64 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 163.83 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C471J1GAC" (at 163.83 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 163.83 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid d425d92e-40e8-4789-8840-12a8b07b779b)) + (pin "1" (uuid 57defdaa-a15d-448d-bfa9-9dd2b9cce5f8)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C47") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 31.75 140.97 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 9e51c7a6-a784-4235-8bf7-519518a75da4) + (property "Reference" "C77" (at 31.75 134.62 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 31.75 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 35.56 140.0048 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 31.75 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 31.75 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 31.75 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 8c19028b-c2a2-4eb6-b2ae-d464e7d6e355)) + (pin "1" (uuid 494e5feb-fcee-4f04-ac27-9b31bfb09695)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C77") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 67.31 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid 9f9cd752-e767-42ce-bbea-54fe694c0b14) + (property "Reference" "K14" (at 77.47 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 76.2 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 78.74 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 67.31 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 67.31 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 67.31 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 039d38bb-db6f-4a0d-b030-96ca32571710)) + (pin "12" (uuid ec28bbe5-0a0c-426a-8e1e-ef7d283ca57a)) + (pin "14" (uuid 5db852dc-e37e-484b-8c38-bca8a3649f43)) + (pin "A2" (uuid 7b32681d-15f3-4a04-910d-b39a35f56855)) + (pin "11" (uuid 9bb87fa6-d061-4ffe-9775-295bd885efed)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K14") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Mechanical:MountingHole_Pad") (at 118.11 220.98 270) (unit 1) + (in_bom no) (on_board yes) (dnp no) (fields_autoplaced) + (uuid a09693b5-bc9a-478b-8f96-8eee23b0219a) + (property "Reference" "H6" (at 121.92 220.98 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "~" (at 121.92 222.1921 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "MountingHole:MountingHole_4.3mm_M4_DIN965_Pad" (at 118.11 220.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 118.11 220.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 118.11 220.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 118.11 220.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f3c13bfd-bd47-455c-849e-91c6447355f7)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H6") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 67.31 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid a103dfde-4b1f-48ca-b412-809a797d744a) + (property "Reference" "K19" (at 77.47 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 81.28 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 78.74 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 67.31 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 67.31 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 67.31 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 18138edc-e9d6-4953-b41a-995de9a63793)) + (pin "12" (uuid 92e3e67d-85a9-47ac-a5da-f23cb5bff322)) + (pin "14" (uuid b54070d7-499e-421e-a69d-6d5f4d76e5ec)) + (pin "A2" (uuid 741a62ea-93da-4f8e-9369-3f1720574aac)) + (pin "11" (uuid 9dfbc767-be1f-46fb-8218-35a3898afa57)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K19") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 336.55 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid a14266ab-bce9-4f99-83a4-42b6cabc8f26) + (property "Reference" "L23" (at 337.82 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.305uH" (at 335.28 135.89 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 336.55 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 336.55 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 336.55 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 336.55 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d2a94055-44af-4857-894c-e0147d4d7de0)) + (pin "2" (uuid 25a3e693-25e5-4f3c-b0a7-0cc5c1776e0c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L23") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 317.5 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid a2fb5395-71e9-4ae3-81ed-8ca7784304f0) + (property "Reference" "C124" (at 311.15 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 313.69 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 316.5348 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 317.5 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 317.5 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 317.5 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 5a40d834-6b14-449f-a8c7-1529a3d3c9da)) + (pin "1" (uuid d81e3589-c339-4bb5-9c56-f8576e992c18)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C124") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 204.47 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid a32a0c0c-c562-4715-9620-8eedd3a9bc2c) + (property "Reference" "L30" (at 206.629 153.67 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.670uH" (at 207.01 156.21 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 204.47 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 204.47 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 204.47 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 204.47 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 7cec2fd4-97eb-4a2b-b037-757de6e9257c)) + (pin "2" (uuid 27e3b6d5-781f-4e6e-8143-569a4ffe202e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L30") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 331.47 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid a455684c-fa03-4d2e-9029-de0141f71378) + (property "Reference" "K28" (at 341.63 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 345.44 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 342.9 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 331.47 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 331.47 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 331.47 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid ad2c4737-79dc-4aa2-a04d-71fd50ff6944)) + (pin "12" (uuid 9e84a7cc-8524-462b-9ac8-412832a0cc36)) + (pin "14" (uuid ced1c2ec-4d36-4833-b31f-a3fd67d0fb3a)) + (pin "A2" (uuid 79f565c7-12f5-4d72-aef2-8c038fff6b66)) + (pin "11" (uuid 8b3707d3-b6db-4ca2-9337-b94fd8d6fd80)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K28") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 298.45 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid a4dfb86a-1d9c-42a9-ac8a-aa8a018dcd29) + (property "Reference" "K27" (at 308.61 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 312.42 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 309.88 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 298.45 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 298.45 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 298.45 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid a16ba4b2-0419-4663-9921-981e385623e7)) + (pin "12" (uuid 61662b99-b18f-429a-b316-cc35b67ec84f)) + (pin "14" (uuid 83aa161f-d96c-4575-9294-6bd33029d78b)) + (pin "A2" (uuid b691bb1f-3c9e-4e8b-be6b-711d9206fefb)) + (pin "11" (uuid c370203c-b429-454d-8e3b-fa43a2a5553b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K27") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 257.81 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid a7a4969f-ee3c-4870-95b4-bd7b575a1c31) + (property "Reference" "#PWR0120" (at 257.81 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 255.27 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 257.81 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 257.81 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid fa4d3aaa-26a3-49cb-bf7a-91261aca6de5)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0120") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 364.49 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid a7bbde75-de8d-49c8-a4a9-75e1213cf3a6) + (property "Reference" "#PWR0153" (at 364.49 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 361.95 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 364.49 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 364.49 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid fdcf15fc-ba73-4f3f-91ad-7f70446d1948)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0153") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 295.91 105.41 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid a7c73f5e-f827-4a5f-972f-e4a15f045717) + (property "Reference" "C37" (at 295.91 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "120pF 100V" (at 295.91 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 299.72 106.3752 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 295.91 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "77-VJ1206A121JXBMT" (at 295.91 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 295.91 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid e7b87b42-8552-492f-9238-806a83d87424)) + (pin "1" (uuid 00d851bf-8876-4c13-9888-dffb4c4c7fb0)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C37") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 77.47 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid a8659880-8449-44ac-b958-cfcb9f13ec95) + (property "Reference" "C61" (at 78.74 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 81.28 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 78.4352 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 77.47 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 77.47 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 77.47 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 640105c7-0afd-4f16-8803-0dc4f898f60e)) + (pin "1" (uuid ee4a043c-742b-4549-90e0-841c79b7c6c5)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C61") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 265.43 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid aac37fab-622d-45b6-b09f-2d4e81159d21) + (property "Reference" "K8" (at 275.59 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 274.32 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 276.86 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 265.43 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 265.43 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 265.43 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid af5555cf-7714-4bb4-a91f-20e115cc87fa)) + (pin "12" (uuid 64a97565-369a-4385-8558-86deecfe7fe3)) + (pin "14" (uuid 5cc890a8-73d8-46ac-b196-d0a14b44dabb)) + (pin "A2" (uuid 79bd5ada-543e-4646-825b-3594ff71384d)) + (pin "11" (uuid 455596ad-7564-4075-bd05-eea0e11e62ad)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K8") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 34.29 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid abac9513-7dd6-410e-81ee-6a59da7e54f2) + (property "Reference" "K16" (at 44.45 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 43.18 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 45.72 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 34.29 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 34.29 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 34.29 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 53c98a7a-4d24-418b-a22e-a4a08114f29c)) + (pin "12" (uuid f8e2323f-573e-48f4-8d1b-c0926baae352)) + (pin "14" (uuid f7f7773a-acf9-457f-a270-c63b8df312bf)) + (pin "A2" (uuid c0002e9c-23de-4040-9edf-bd6e3437b9ef)) + (pin "11" (uuid 12794b83-dd3e-4c35-91da-398055e88773)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K16") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 158.75 166.37 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid ac65519b-185e-4fbf-a048-ddf3f3a2280e) + (property "Reference" "#PWR092" (at 158.75 172.72 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 156.21 168.91 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 158.75 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 158.75 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 2e75b80d-6a4b-4dc1-9cb3-3fdb4aed5a87)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR092") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 199.39 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid ac79eb0b-32a4-4848-980b-2d3cb398cf2c) + (property "Reference" "#PWR0103" (at 199.39 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 196.85 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 199.39 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 199.39 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 012653fa-f479-4b30-a76a-2417481bc37f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0103") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 158.75 125.73 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid ad6ffc62-8dfd-4d0f-88f8-cbd0845a1d74) + (property "Reference" "#PWR090" (at 158.75 132.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 156.21 128.27 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 158.75 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 158.75 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid a9542cc5-1610-4956-bd64-513e535745ac)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR090") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 382.27 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid af9dd51b-eb82-4528-84e0-f4a8c4b5d2a6) + (property "Reference" "#PWR0158" (at 382.27 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 379.73 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 382.27 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 382.27 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid fb72872a-4b43-4870-9bb0-fade0942b83b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0158") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 163.83 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid afe91a6f-68cd-43f3-a754-eb02cf1df989) + (property "Reference" "C104" (at 163.83 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 163.83 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 167.64 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 163.83 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 163.83 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 163.83 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 99ba8d47-d539-4a85-ac6c-ba4d3cf9a0cd)) + (pin "1" (uuid 30d9fc37-58f1-4cf4-9132-abcca431bf6d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C104") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 308.61 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid b0181517-0e57-46db-bfba-515ff63ebdd2) + (property "Reference" "C63" (at 309.88 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "27pF 100V" (at 312.42 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 309.5752 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 308.61 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C270J1G" (at 308.61 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 308.61 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 6e155a7b-944e-4e53-9be5-b317b562da5d)) + (pin "1" (uuid 5e26e9cf-d13f-42bd-b767-f9d7576f6f88)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C63") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 31.75 100.33 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid b439b237-fe06-4e5b-bff9-d01d841f5296) + (property "Reference" "C28" (at 31.75 93.98 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 31.75 96.52 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 35.56 99.3648 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 31.75 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 31.75 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 31.75 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 5cc1ec20-5af2-4a7b-9d38-b9eccd92955c)) + (pin "1" (uuid 9c08e113-4834-4b88-b14d-2c237153ab34)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C28") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 369.57 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid b515e3e5-c8d3-466a-8736-ccd0f09439d3) + (property "Reference" "L24" (at 370.84 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.170uH" (at 368.3 135.89 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 369.57 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 369.57 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 369.57 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 369.57 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid acd428be-7f0d-4870-9586-883277ee738e)) + (pin "2" (uuid d2c4f351-ac9b-4e7f-80cb-648dbb7363b3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L24") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 350.52 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid b55cc0e0-99e6-4e9c-bf3d-63d060540a67) + (property "Reference" "#PWR0147" (at 350.52 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 350.52 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 350.52 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 350.52 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 3ee1af44-28ec-4ad4-8a4a-606c6221aa2f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0147") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 218.44 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid b5b0a0f4-0234-4f4b-958f-00f40eff0ecf) + (property "Reference" "C118" (at 212.09 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 214.63 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 217.4748 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 218.44 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 218.44 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 218.44 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 015d0a46-4b7c-43eb-bbfb-2ee890170bb9)) + (pin "1" (uuid 6ac917d5-3f6a-46be-bbb0-7bb78af7d66a)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C118") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 133.35 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid b646683b-c2b5-450d-9a74-b82dc7fbea5d) + (property "Reference" "#PWR084" (at 133.35 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 130.81 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 133.35 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 133.35 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 5f315542-1d79-47bd-b6a3-7dfcfa858a60)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR084") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 138.43 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid b77dfc99-234f-48f9-8e33-b5c9c212f453) + (property "Reference" "L6" (at 140.589 113.03 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "1.34uH" (at 140.97 115.57 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 138.43 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 138.43 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 138.43 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 138.43 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 6b89cc85-84c3-4341-9eb6-5f5beee1227a)) + (pin "2" (uuid 89876b9e-0957-46f5-9107-33b5de917d53)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L6") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 284.48 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid b8e6f2a9-49b2-47ab-82cf-e5c0e26ea990) + (property "Reference" "#PWR0125" (at 284.48 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 284.48 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 284.48 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 284.48 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid c49f1885-1760-4d1d-be7c-2b413f598739)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0125") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 130.81 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid b9600a5d-8cd0-4d83-b6bf-652da225c008) + (property "Reference" "C88" (at 130.81 152.4 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 130.81 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 134.62 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 130.81 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 130.81 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 130.81 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid b82606e3-c108-44c1-be5a-b0922a5af0eb)) + (pin "1" (uuid 4762f821-d94a-4d0d-8923-c56143cd236d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C88") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 119.38 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid b9e69905-a01b-44c3-b33d-6f2256f1ae2c) + (property "Reference" "C112" (at 113.03 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 115.57 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 118.4148 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 119.38 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 119.38 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 119.38 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 5c0046da-31ac-455f-b754-7faaf20a3ab4)) + (pin "1" (uuid 95328eb4-b5b7-48a4-b279-c4c13b5b7d9e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C112") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 232.41 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid ba3a2b02-eab4-4952-8dcc-19958d2df135) + (property "Reference" "#PWR0113" (at 232.41 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 229.87 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 232.41 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 232.41 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 8bc2f8e9-073d-4eb7-a2a0-f4414d54ceb0)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0113") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 350.52 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid ba456bce-c53a-499f-8677-0c6b13ea5a52) + (property "Reference" "#PWR0145" (at 350.52 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 350.52 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 350.52 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 350.52 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 27958e9f-962f-4281-a37f-efae7fe28400)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0145") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 31.75 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid bad7380e-9e8d-4c25-bc64-fa7d6fd69db9) + (property "Reference" "C84" (at 31.75 152.4 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "2200pF 100V" (at 31.75 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 35.56 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 31.75 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "81-GRM319R72A222JA1D" (at 31.75 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 31.75 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 74738982-6687-4c42-a19a-26ee7f8ab3b7)) + (pin "1" (uuid 711832fe-1442-479d-8afb-655a91653c4b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C84") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 116.84 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid baee5989-e61f-4c85-9aad-31da91deb457) + (property "Reference" "C67" (at 118.11 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "60pF 100V" (at 120.65 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 117.8052 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 116.84 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C620J1G" (at 116.84 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 116.84 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 5a570bb8-8fd6-41be-b594-1c2e6b92b70c)) + (pin "1" (uuid b1149a19-ee42-4138-9443-03928899be9c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C67") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 166.37 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid bbe1b1e6-eb8f-46e8-af3c-4cbba5eccb58) + (property "Reference" "K17" (at 176.53 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 175.26 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 177.8 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 166.37 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 166.37 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 166.37 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 64a8e316-98d7-4e29-ada6-6e4b36480135)) + (pin "12" (uuid 82a608c0-eb8f-483d-aae2-91d724374dab)) + (pin "14" (uuid 2a3e1d72-bed6-49e6-b62e-847df6ac061d)) + (pin "A2" (uuid d792e3a7-852a-432c-8fd0-f578ee3414c6)) + (pin "11" (uuid d104a250-9fa9-48e2-8cec-85be135605e3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K17") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 295.91 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid bcab77aa-2238-4986-91df-17753c4bcb66) + (property "Reference" "C50" (at 295.91 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "180pF 100V" (at 295.91 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 299.72 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 295.91 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C181J1G" (at 295.91 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 295.91 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 258034f6-e3e7-4175-b7bd-3c4144bfd95f)) + (pin "1" (uuid aaa4a2c9-d042-4243-bd0c-5314de486de1)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C50") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 317.5 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid bcf446c0-f470-43c2-8e58-e4a4342a9849) + (property "Reference" "#PWR0135" (at 317.5 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 317.5 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 317.5 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 317.5 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid bc4cbbba-e5c3-4e1e-81fd-a7a6bcb260e5)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0135") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 303.53 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid c18d8e88-7878-4428-bae0-1cf707ee64dd) + (property "Reference" "L11" (at 305.689 113.03 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.337uH" (at 306.07 115.57 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 303.53 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 303.53 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 303.53 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 303.53 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f5dce61e-cbfe-4189-8de5-b8904f0a75e4)) + (pin "2" (uuid 9dc15646-b810-4183-b4d6-ae7c42c96898)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L11") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 323.85 146.05 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid c33fb917-100f-49fe-beeb-6554f9f32af8) + (property "Reference" "#PWR0141" (at 323.85 152.4 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 321.31 148.59 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 323.85 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 323.85 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 609dfb4c-39dc-4e74-8404-86c175333e97)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0141") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 201.93 220.98 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid c64d6eaf-d115-44a0-9c55-ab2733af097a) + (property "Reference" "#PWR0217" (at 201.93 227.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 204.47 222.25 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 201.93 220.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 201.93 220.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 699d9916-3d2b-49f8-8315-d8c5b7118329)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0217") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 135.89 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid c751e765-f68d-4f21-a144-507d2bba9466) + (property "Reference" "#PWR078" (at 135.89 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 133.35 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 135.89 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 135.89 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 7bbe694c-6fe6-4b7a-8a80-fb137b1a75fa)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR078") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 34.29 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid c857973e-ec5a-489a-a46f-8243f212794b) + (property "Reference" "#PWR062" (at 34.29 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 31.75 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 34.29 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 34.29 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 2375ec56-757b-463a-b57f-55f2f5fae1e8)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR062") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 396.24 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid c87ecbb1-570b-41c5-837f-cdab8724abff) + (property "Reference" "K32" (at 406.4 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 410.21 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 407.67 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 396.24 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 396.24 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 396.24 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 37ee5e9d-8ffe-45ea-a8fe-b9b9f41ee35c)) + (pin "12" (uuid d763aa7f-1f31-4684-bc26-f2442ffb560e)) + (pin "14" (uuid bc3937f3-32c7-495b-82e8-22f9dfbccdd3)) + (pin "A2" (uuid 3fea5985-a73f-45b1-8520-7afaab71e57e)) + (pin "11" (uuid 165d34d3-dcc5-4ad8-ba77-cda7cf7861b3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K32") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 336.55 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid c8ef9f7e-f621-4416-9fea-8cf31bdf5702) + (property "Reference" "L12" (at 338.709 111.8179 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.335uH" (at 338.709 114.2421 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 336.55 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 336.55 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 336.55 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 336.55 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid aadad873-ac3a-46d9-b2d2-8e4058fc2503)) + (pin "2" (uuid 703db622-a4f3-4d1d-a450-59bd312323c0)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L12") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 218.44 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid c9923484-8f5a-4dcb-8ca2-bb903ba469ec) + (property "Reference" "C119" (at 212.09 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 214.63 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 217.4748 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 218.44 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 218.44 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 218.44 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 5cccfbc9-f8e3-4984-9dfc-2c0fdbc9a6dc)) + (pin "1" (uuid 3187e51b-64b0-4750-80d5-5730c23b4da7)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C119") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 350.52 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid cb0cad00-7cb1-419c-ad01-639c84644d8a) + (property "Reference" "#PWR0146" (at 350.52 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 347.98 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 350.52 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 350.52 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid eb0612b2-e17d-4e9d-863e-993cd97ce051)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0146") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 232.41 214.63 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid cb5f5ff1-0857-4046-880b-1f9f2189b762) + (property "Reference" "#PWR01" (at 232.41 218.44 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 236.22 213.36 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 232.41 214.63 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 232.41 214.63 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid ce3e132d-8ccd-4e6e-93cd-70a5313a0a6e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR01") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 196.85 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid ccb6e392-a788-4439-8b33-d70a692492c4) + (property "Reference" "C48" (at 196.85 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 196.85 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 200.66 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 196.85 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 196.85 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 196.85 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 32eb5308-e81a-40b1-8f10-bc924da1e1b7)) + (pin "1" (uuid a6760f6d-9870-48cd-95a0-303ee99219ae)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C48") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 163.83 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid cf955743-b4b3-4d0f-83de-951511a4976b) + (property "Reference" "C78" (at 163.83 152.4 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "470pF 100V" (at 163.83 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 167.64 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 163.83 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C471J1GAC" (at 163.83 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 163.83 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 6c7c76ce-54ef-41d8-9e6d-b0be7d04ca56)) + (pin "1" (uuid ca58476d-daf4-4148-916a-0a96a0e8e25d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C78") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 86.36 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d07e2023-aa85-4a8b-b847-56b4beea4cf1) + (property "Reference" "#PWR074" (at 86.36 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 83.82 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 86.36 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 86.36 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid bc768013-1a01-4ff9-83ad-c1e8e539f25d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR074") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 369.57 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d333a72b-72cd-4dff-bdad-bb11a33a9d3e) + (property "Reference" "L13" (at 371.729 113.03 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.188uH" (at 372.11 115.57 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 369.57 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 369.57 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 369.57 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 369.57 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid cb1dac32-4f70-4fde-9343-747bdcb74450)) + (pin "2" (uuid 2787b5fc-f23e-493a-af1f-383376b53853)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L13") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 361.95 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d3561090-2d87-4242-bde8-f2be9c30ae0b) + (property "Reference" "C82" (at 361.95 152.4 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "91pF 100V" (at 361.95 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 365.76 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 361.95 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C910J1G" (at 361.95 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 361.95 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 7ad5ed15-938d-46ce-86a3-25cfbc6e9299)) + (pin "1" (uuid d2cc6dab-acce-466e-8d15-b33f978c3f4f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C82") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 251.46 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d413103e-3e3d-4d90-a0fb-00338c87afcc) + (property "Reference" "C121" (at 245.11 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 247.65 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 250.4948 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 251.46 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 251.46 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 251.46 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 787487f9-42ae-4e90-ac8f-fe6781f70759)) + (pin "1" (uuid 0b7f8cad-7f65-4e68-95a0-2212d0114efa)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C121") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 31.75 161.29 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d46cc31e-a469-46bb-a4a6-d3ac903d2991) + (property "Reference" "C91" (at 31.75 154.94 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "1500pF 100V" (at 31.75 157.48 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 35.56 160.3248 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 31.75 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C152J1GECAUT" (at 31.75 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 31.75 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid dbbec1cb-710b-419f-acd6-ef54cdca6918)) + (pin "1" (uuid 898afa73-53a2-4fd8-a001-a4770e8e3da0)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C91") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 336.55 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid d530d1ec-bab9-4264-9321-2fba626b9943) + (property "Reference" "L34" (at 338.709 152.4579 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.335uH" (at 338.709 154.8821 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 336.55 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 336.55 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 336.55 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 336.55 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 7d15cf69-40aa-44b4-abf4-d4314ec4330c)) + (pin "2" (uuid 1ccec293-260b-4209-85fd-dbe39158e768)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L34") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 20.32 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d617fec1-7724-44b5-9020-0992b56fb3f3) + (property "Reference" "#PWR064" (at 20.32 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 17.78 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 20.32 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 20.32 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid b8796b71-81f3-4388-a0f7-133213cb51db)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR064") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 196.85 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d7e1c335-4a47-43e3-9f9d-ec392e43f409) + (property "Reference" "C79" (at 196.85 152.4 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 196.85 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 200.66 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 196.85 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 196.85 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 196.85 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid f238b883-0ef0-404e-a070-2520f666b893)) + (pin "1" (uuid 6bd5e4b8-21f6-4a49-bd6c-a8060a8bac59)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C79") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 185.42 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d7e5123f-32a6-48be-afe5-d30e09794383) + (property "Reference" "#PWR096" (at 185.42 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 182.88 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 185.42 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 185.42 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f9ef1912-506f-460f-b347-3b91aa80162c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR096") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 396.24 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d857e8d2-e564-414a-90d1-5707b9ad3df1) + (property "Reference" "#PWR0163" (at 396.24 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 393.7 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 396.24 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 396.24 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 05c02288-1774-4430-ae81-88790bc965e5)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0163") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 50.8 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d8c2e58e-279b-413a-b86f-90fcf3a58751) + (property "Reference" "C60" (at 52.07 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "47pF 100V" (at 54.61 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 51.7652 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 50.8 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C470J1GAC" (at 50.8 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 50.8 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 82ebd11c-e1c2-4079-81d9-d1458a1fc176)) + (pin "1" (uuid aeec772f-fa7a-405e-bfea-5feaaa33b5da)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C60") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 262.89 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d9524c5a-51ed-4fd1-806b-8f6887e8dcaa) + (property "Reference" "C49" (at 262.89 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "220pF 100V" (at 262.89 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 266.7 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 262.89 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C221J1GAC" (at 262.89 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 262.89 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid c39630f9-0f9f-4cee-a9f5-775de683df97)) + (pin "1" (uuid 710b28c2-8360-4ba6-9092-8d8b4ad62c72)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C49") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 229.87 140.97 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid d9920930-2c55-4c85-ac1c-4a25011e6a44) + (property "Reference" "C74" (at 229.87 134.62 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "100pF 100V" (at 229.87 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 233.68 140.0048 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 229.87 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C101J1GAULR" (at 229.87 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 229.87 140.97 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 9b39a9f7-2466-4eaa-a7dd-0a99cbfdd368)) + (pin "1" (uuid 44336da2-3800-47d5-9ae7-d0967af6d432)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C74") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 163.83 105.41 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid daec01be-9a17-4362-9e5d-ac5a38702a42) + (property "Reference" "C33" (at 163.83 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "150pF 100V" (at 163.83 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 167.64 106.3752 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 163.83 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C151J1G" (at 163.83 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 163.83 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid fe63f520-24e0-4346-8f91-4ff84d9e52a6)) + (pin "1" (uuid 2c3bdc52-f02d-4e24-aa6f-fbaa5dae597f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C33") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 72.39 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid db57f6dc-25f2-41ed-ac7a-9255a09169b4) + (property "Reference" "L4" (at 74.549 113.03 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "2.68uH" (at 74.93 115.57 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 72.39 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 72.39 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 72.39 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 72.39 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f0f98e12-d934-4d82-92fc-ceb89858fa85)) + (pin "2" (uuid 8e15119a-9f1e-4e02-a93f-a4e0dd010d4c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L4") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 270.51 133.35 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid dbcd85f6-5a15-45c1-a276-7a1a681292c3) + (property "Reference" "L21" (at 271.78 140.97 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.406uH" (at 269.24 137.16 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 270.51 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 270.51 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 270.51 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 270.51 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid cb14506f-6346-42fc-ad59-f44322bbe1c6)) + (pin "2" (uuid 6c92627e-3dd1-409b-a621-5b9fef604c01)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L21") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 125.73 146.05 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid dbfc8589-1f3e-4e56-80e2-76fabcc59f3d) + (property "Reference" "#PWR059" (at 125.73 152.4 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 123.19 148.59 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 125.73 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 125.73 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e9e8e617-58a6-4cae-ac9c-e39421ffa602)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR059") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 92.71 151.13 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid dc4fd0a8-81b8-4028-ad77-2aa8a1c9b560) + (property "Reference" "#PWR055" (at 92.71 157.48 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 90.17 153.67 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 92.71 151.13 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 92.71 151.13 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid a8294d8d-a075-4ca2-85ca-bc3797f684bc)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR055") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Connector:Conn_Coaxial") (at 163.83 58.42 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid dd2a8ea5-a155-4a65-8010-f9fddfe90885) + (property "Reference" "J17" (at 166.37 55.88 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "RF interconnect" (at 166.37 58.42 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" (at 163.83 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" " ~" (at 163.83 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "712-CONSMA001-G" (at 163.83 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 163.83 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 133df811-b1cc-48c3-8af1-985bd945f040)) + (pin "2" (uuid 600f1821-0af1-405a-b926-d1409ad1af1f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J17") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 218.44 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid de0b57b3-c7b5-4983-96fc-de95e115fe98) + (property "Reference" "#PWR0108" (at 218.44 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 215.9 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 218.44 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 218.44 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e5eb9095-8c78-4fab-8ca7-c2372bb95827)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0108") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 185.42 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid de1097df-b5d3-492b-9b30-e71820af07d3) + (property "Reference" "#PWR098" (at 185.42 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 182.88 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 185.42 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 185.42 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 425535c1-a738-4eca-bc8b-b3c204778e99)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR098") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 284.48 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid dee7cc32-35b1-47d7-bdad-45f4ce31268c) + (property "Reference" "#PWR0126" (at 284.48 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 281.94 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 284.48 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 284.48 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 7b121e32-6fcd-4cc3-8c37-4ee846b817ac)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0126") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 367.03 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid def4dd1f-29dd-4c30-a12a-bcef8f4e4380) + (property "Reference" "#PWR0154" (at 367.03 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 364.49 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 367.03 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 367.03 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f83f1e38-632b-4376-9ea2-1da0137ee830)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0154") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 251.46 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid df452db3-bda5-4a4b-9395-8b6f91184ddc) + (property "Reference" "#PWR0118" (at 251.46 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 248.92 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 251.46 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 251.46 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 5816395b-c3d0-433a-8ab5-4467d0dfac25)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0118") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 218.44 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid dfc304a7-7b2d-40cb-a129-05bfea4ea935) + (property "Reference" "#PWR0106" (at 218.44 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 215.9 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 218.44 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 218.44 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1cb9afc3-6e4e-418d-a7a1-956ba7b0645c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0106") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 97.79 151.13 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid dfcbc923-70c6-49c2-ba17-78054e7df017) + (property "Reference" "C89" (at 97.79 157.48 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "470pF 100V" (at 97.79 154.94 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 101.6 152.0952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 97.79 151.13 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C471J1GAC" (at 97.79 151.13 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 97.79 151.13 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 97b0fdf7-9397-4425-bd75-fb79a818f527)) + (pin "1" (uuid 65893845-7ba7-4663-ae68-e9ba1fc3ab8b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C89") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 234.95 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid dfdf7c60-6f0f-423a-89c2-0ba0959cf4cb) + (property "Reference" "#PWR0114" (at 234.95 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 232.41 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 234.95 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 234.95 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 8ca8d7bb-177b-48e9-8fc2-c33e60e04735)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0114") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 53.34 186.69 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid e3d2d83e-2290-4e2d-9df1-0b76bbb10c94) + (property "Reference" "#PWR068" (at 53.34 193.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 50.8 187.96 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 53.34 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 53.34 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 8d13b14e-aa2e-4b2e-8c4f-6759221c85e7)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR068") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 100.33 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid e461c453-ebc1-4b57-b1c0-f24bde3002ee) + (property "Reference" "#PWR081" (at 100.33 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 97.79 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 100.33 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 100.33 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 017c9162-e6b1-4768-904a-bb64902adf2b)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR081") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 152.4 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid e4eb8a82-6fac-45e4-85ef-f11f2b4c6d99) + (property "Reference" "C114" (at 146.05 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 148.59 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 151.4348 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 152.4 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 152.4 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 152.4 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 313f76c0-5c85-4e3b-b308-096f1deb04b3)) + (pin "1" (uuid b6e20480-e891-4714-b680-8e3a48e56690)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C114") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 265.43 184.15 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid e5fed47a-138d-4cb8-a0c4-fb2ca86f2b19) + (property "Reference" "K26" (at 275.59 176.53 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 279.4 173.99 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 276.86 182.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 265.43 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 265.43 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 265.43 184.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 666d1c20-8ea6-43a4-b56a-f01965560508)) + (pin "12" (uuid 752440e1-ce8f-4346-9722-33622655c1c4)) + (pin "14" (uuid 61ede4ca-ba05-49fa-aece-0e394b126d9d)) + (pin "A2" (uuid f4efdc68-042c-47f0-bb1a-3c39e77a1618)) + (pin "11" (uuid 5faa0d6c-f763-443e-82f9-d198fa21f0aa)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K26") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 97.79 146.05 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid e9322e90-af5c-4795-b8d6-0c5f031329d3) + (property "Reference" "C87" (at 101.6 147.32 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 97.79 149.86 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 101.6 147.0152 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 97.79 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 97.79 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 97.79 146.05 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid d4f78f10-ef11-466c-ac87-2321a180dabf)) + (pin "1" (uuid f22b12b6-ba7f-475a-b8bd-f2973a057f8e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C87") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 185.42 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid ea3fa168-3287-433a-97da-5a1d6ba5bfa9) + (property "Reference" "#PWR095" (at 185.42 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 185.42 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 185.42 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 185.42 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 52b8cd59-54ce-4e4b-a7de-c8b82ff6a6e7)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR095") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 119.38 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid ebbb1837-c39f-44b0-9553-22dbb0eb7f06) + (property "Reference" "#PWR082" (at 119.38 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 119.38 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 119.38 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 119.38 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 31c46759-eb4c-4d91-a03d-7bf0c1afd0ae)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR082") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 328.93 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid ec0de1d2-fca7-4727-9c00-4094463a4d94) + (property "Reference" "C99" (at 328.93 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "100pF 100V" (at 328.93 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 332.74 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 328.93 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C101J1GAULR" (at 328.93 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 328.93 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid b11746f0-3481-4cda-92d4-50c2745c2f09)) + (pin "1" (uuid 0721d303-2a57-4552-a990-a833511dfdc5)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C99") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 105.41 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid ed2909a6-9999-4c90-bc89-6861845f8f7d) + (property "Reference" "L5" (at 107.569 113.03 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "1.76uH" (at 107.95 115.57 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 105.41 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 105.41 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 105.41 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 105.41 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid bd1bb675-a699-4a32-b483-e8dc3004c22d)) + (pin "2" (uuid 7381be80-da01-4132-a23a-9fedc050d9c7)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L5") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 72.39 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid ee407e69-1875-43c0-bf37-068e22cdedac) + (property "Reference" "L26" (at 74.549 153.67 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "2.68uH" (at 74.93 156.21 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 72.39 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 72.39 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 72.39 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 72.39 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 93205e09-c83f-4972-b72d-4e5ef041116b)) + (pin "2" (uuid 243589ef-32f7-4e8c-87f2-aafc7b4f3b31)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L26") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 218.44 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid eec08273-802a-48a7-9cf0-3f7cd1414dab) + (property "Reference" "#PWR0105" (at 218.44 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 218.44 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 218.44 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 218.44 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 523a722a-97ef-4eda-9766-efeb9bd8d795)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0105") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 229.87 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid eeee2428-5929-4813-ac0c-8891923cf93b) + (property "Reference" "C52" (at 229.87 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "100pF 100V" (at 229.87 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 233.68 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 229.87 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C101J1GAULR" (at 229.87 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 229.87 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid c4344603-6437-4a22-99aa-c86b47161cb7)) + (pin "1" (uuid 0afba514-fedc-4f28-bc48-c6c3847c61cb)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C52") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 97.79 120.65 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid ef0b8c6f-dc2e-453f-b72f-db1cab7b5e8f) + (property "Reference" "C44" (at 100.33 116.84 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 97.79 118.11 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 101.6 119.6848 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 97.79 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 97.79 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 97.79 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 7cd3f156-01a2-40c8-9243-d6ee724896e1)) + (pin "1" (uuid 56ddaf4c-1924-4cc4-9fbb-7c10f594a73c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C44") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 130.81 120.65 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid f004858d-079a-4d65-8579-1639b72b0048) + (property "Reference" "C43" (at 130.81 114.3 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "330pF 100V" (at 130.81 116.84 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 134.62 119.6848 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 130.81 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061A331JAT4A" (at 130.81 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 130.81 120.65 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 3e699ed8-3069-434c-ba87-b3cd508211e8)) + (pin "1" (uuid e253abc2-5a97-4c38-b370-7df7b1557b93)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C43") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 185.42 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid f0cec86f-add4-4474-b9f8-10b60b5b0f8d) + (property "Reference" "#PWR097" (at 185.42 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 185.42 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 185.42 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 185.42 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid b68c619b-c7dc-493f-978a-91cbe870dd42)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR097") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 284.48 78.74 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid f19b3d02-0f7e-4623-b49a-a093a6cf76ec) + (property "Reference" "C122" (at 278.13 78.74 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 280.67 77.47 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 283.5148 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 284.48 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 284.48 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 284.48 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 5fd47a4b-63a9-43d5-bbcd-bd4e1216a80a)) + (pin "1" (uuid a35777d7-0f22-430e-8b3c-9506674f1a7d)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C122") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 361.95 105.41 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid f1d36ff1-d98c-4226-9104-8753d546b48d) + (property "Reference" "C39" (at 361.95 111.76 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "60pF 100V" (at 361.95 109.22 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 365.76 106.3752 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 361.95 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C620J1G" (at 361.95 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 361.95 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 4891de93-c7d5-4a33-a06c-478f776b3ba5)) + (pin "1" (uuid 940416ac-b704-4541-bfcf-cd401eed4405)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C39") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 331.47 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid f2095608-3cf1-4d80-802b-920be9e73f9d) + (property "Reference" "#PWR0143" (at 331.47 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 328.93 71.12 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 331.47 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 331.47 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid dd6d41e0-0051-4f51-96ae-c430546df404)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0143") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 350.52 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid f50cbd34-df22-4c41-9b39-4029ccde200b) + (property "Reference" "C127" (at 344.17 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 346.71 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 349.5548 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 350.52 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 350.52 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 350.52 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 43ac1a48-de16-4fab-8e2c-deb8e68f6805)) + (pin "1" (uuid eb641184-60a7-40ae-9443-12f1b84eda1c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C127") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 119.38 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid f5c0b058-832e-420e-9c7b-1d19510140e4) + (property "Reference" "#PWR083" (at 119.38 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 116.84 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 119.38 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 119.38 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e50bd218-6540-4e20-9735-44bb888d8b1e)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR083") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 97.79 166.37 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid f8433dc7-d953-428e-9b9e-743c0dafa9e8) + (property "Reference" "C93" (at 97.79 172.72 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "560pF 100V" (at 97.79 170.18 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 101.6 167.3352 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 97.79 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12061C561JAT2A" (at 97.79 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 97.79 166.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid cde4218e-601c-4233-b12a-f0f3b9eb435f)) + (pin "1" (uuid b24ef654-5e74-4db1-af62-79da1378fe93)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C93") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 209.55 133.35 0) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid f8adcaf5-8598-4638-b57d-1d085c7654e8) + (property "Reference" "C64" (at 210.82 137.16 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "47pF 100V" (at 213.36 133.35 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 210.5152 129.54 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 209.55 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C470J1GAC" (at 209.55 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 209.55 133.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid a16e3a49-f4af-448a-9858-a21e4b4e9f06)) + (pin "1" (uuid 492f405b-5df8-49e6-b7f9-80080ecb36fa)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C64") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 130.81 161.29 90) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid f9703a93-e278-43a0-b559-de4033d12654) + (property "Reference" "C94" (at 130.81 154.94 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "100pF 100V" (at 130.81 157.48 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 134.62 160.3248 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 130.81 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C101J1GAULR" (at 130.81 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 130.81 161.29 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 433a726d-6338-4468-8caf-4d082e952559)) + (pin "1" (uuid 144b4274-fb01-4abc-a64a-d1f8d69f8c20)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C94") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Relay:Relay_SPDT") (at 199.39 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid f9d149fd-505d-4166-9f74-dea47a2d4761) + (property "Reference" "K15" (at 209.55 86.36 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "HF41F/12-ZS" (at 208.28 88.9 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "T41_Library:Relay_SPDT_HF41F12-ZS" (at 210.82 81.28 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Datasheet" "~" (at 199.39 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 199.39 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 199.39 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "A1" (uuid 507e8ec1-7664-49f4-884b-4599d5f3c854)) + (pin "12" (uuid 5a664b32-8921-425d-bab5-00e74e4c8199)) + (pin "14" (uuid 1c25481a-c1fc-493a-b445-fe63786fbc59)) + (pin "A2" (uuid e9537c82-433d-4221-afe2-3c07fb72ac1c)) + (pin "11" (uuid 9bbb7bee-3d84-4076-aa33-1ef1137e3d7f)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "K15") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 138.43 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid fa11d3c5-e294-49ff-a155-8834629f8072) + (property "Reference" "L28" (at 140.589 153.67 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "1.34uH" (at 140.97 156.21 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 138.43 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 138.43 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 138.43 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 138.43 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 04095c33-ff3f-4ca9-9b2a-9eb4b64d8454)) + (pin "2" (uuid 5e19f3e8-75c9-4cca-9f15-46bf4e40fa7c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L28") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:L_Ferrite") (at 171.45 153.67 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid faa0df3f-2478-4417-8d36-f828bd146d93) + (property "Reference" "L29" (at 173.609 153.67 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "0.928uH" (at 173.99 156.21 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "T41_Library:T68-6-toroid-vertical" (at 171.45 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 171.45 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "" (at 171.45 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 171.45 153.67 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e994f85d-7db3-4251-9ff0-c83d2e0a333f)) + (pin "2" (uuid c7f85740-7ff5-420a-8e9e-7652289bcee6)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L29") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 328.93 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid fb53f3ea-14be-4283-881a-e42c72a75079) + (property "Reference" "C53" (at 328.93 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "82pF 100V" (at 328.93 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 332.74 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 328.93 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C820J1G" (at 328.93 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 328.93 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 99707078-a48f-45b8-bb24-34200288ba5a)) + (pin "1" (uuid 7c57f38b-dedd-474a-b3e2-066c2dfca2a3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C53") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 64.77 125.73 90) (mirror x) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid fc649fbe-5ac5-4b67-86eb-8b43451061d2) + (property "Reference" "C56" (at 64.77 132.08 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "100pF 100V" (at 64.77 129.54 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 68.58 126.6952 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 64.77 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "80-C1206C101J1GAULR" (at 64.77 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 64.77 125.73 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid 178678a4-bc7b-4682-bc58-7feb5481aa28)) + (pin "1" (uuid 1245e675-f8d7-4ed0-a5ec-36dfd1d47262)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C56") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "Device:C") (at 119.38 182.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid fd3abcd6-0a8b-4168-8bee-c7e753a51997) + (property "Reference" "C113" (at 113.03 182.88 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "0.1uF 50V" (at 115.57 181.61 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" (at 118.4148 186.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (at 119.38 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Mouser Part Number" "581-12065F104K4" (at 119.38 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "taydaelectronics.com" "" (at 119.38 182.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "2" (uuid d50d5685-6188-40ff-8549-d42225c36c67)) + (pin "1" (uuid 066d54ec-2cdd-43da-9381-710f34a87922)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C113") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 86.36 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid fd4b5d50-6f04-4bdc-9fa0-4d4e0211dabd) + (property "Reference" "#PWR079" (at 86.36 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 86.36 67.31 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 86.36 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 86.36 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 51e92986-40a4-49ce-9936-68c68c98e7a3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR079") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 125.73 105.41 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid fd6bee65-0d23-49d2-ade7-898a9d25aaa3) + (property "Reference" "#PWR057" (at 125.73 111.76 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 123.19 107.95 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 125.73 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 125.73 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 50b62500-4325-4f05-8af2-1e1c03d5ee13)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR057") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 53.34 82.55 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid fe57a9db-a77e-4c0d-829e-9942f6d74403) + (property "Reference" "#PWR071" (at 53.34 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 50.8 83.82 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 53.34 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 53.34 82.55 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 9976de4f-49a5-4b25-a582-ec5b7a2d608c)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR071") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:+12V") (at 317.5 176.53 0) (unit 1) + (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) + (uuid fecb8d7f-5c0d-4075-b7b1-12274302a633) + (property "Reference" "#PWR0137" (at 317.5 180.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (at 317.5 171.45 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 317.5 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 317.5 176.53 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid af21888a-809a-4a59-897d-f82144004d38)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0137") (unit 1) + ) + ) + ) + ) + + (symbol (lib_id "power:GND") (at 201.93 191.77 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (dnp no) + (uuid ff9cc7bc-2625-4c8e-9478-7c12066a88ce) + (property "Reference" "#PWR0104" (at 201.93 198.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (at 199.39 193.04 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (at 201.93 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (at 201.93 191.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid db2dae64-3d18-4efc-9bbf-4edc9eab4dd3)) + (instances + (project "K9HZ_100W_11band_LPF-Filter" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR0104") (unit 1) + ) + ) + ) + ) + + (sheet_instances + (path "/" (page "1")) + ) +) diff --git a/wiki/raw/T41-RF-board-Attenuator-daughterboard.kicad_sch b/wiki/raw/T41-RF-board-Attenuator-daughterboard.kicad_sch new file mode 100644 index 0000000..0dc3e6b --- /dev/null +++ b/wiki/raw/T41-RF-board-Attenuator-daughterboard.kicad_sch @@ -0,0 +1,3776 @@ +(kicad_sch + (version 20250114) + (generator "eeschema") + (generator_version "9.0") + (uuid "4fb44e34-3372-47df-9694-9168f4fad0b1") + (paper "A4") + (title_block + (title "T41 RF Board Attenuator Daughterboard") + (date "2025-12-27") + (rev "1") + (company "Oliver King, KI3P") + ) + (lib_symbols + (symbol "Connector:Conn_01x06_Socket" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x06_Socket" + (at 0 -10.16 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x06, script generated" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_locked" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x06_Socket_1_1" + (polyline + (pts + (xy -1.27 5.08) (xy -0.508 5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 2.54) (xy -0.508 2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy -0.508 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -2.54) (xy -0.508 -2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -5.08) (xy -0.508 -5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -7.62) (xy -0.508 -7.62) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 4.572) + (mid -0.5058 5.08) + (end 0 5.588) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 2.032) + (mid -0.5058 2.54) + (end 0 3.048) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -0.508) + (mid -0.5058 0) + (end 0 0.508) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -3.048) + (mid -0.5058 -2.54) + (end 0 -2.032) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -5.588) + (mid -0.5058 -5.08) + (end 0 -4.572) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -8.128) + (mid -0.5058 -7.62) + (end 0 -7.112) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -7.62 0) + (length 3.81) + (name "Pin_6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:C" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "C_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_0_1" + (polyline + (pts + (xy -2.032 0.762) (xy 2.032 0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.032 -0.762) (xy 2.032 -0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "C_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:L" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "L" + (at -1.27 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "L" + (at 1.905 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Inductor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "inductor choke coil reactor magnetic" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Choke_* *Coil* Inductor_* L_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "L_0_1" + (arc + (start 0 2.54) + (mid 0.6323 1.905) + (end 0 1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 1.27) + (mid 0.6323 0.635) + (end 0 0) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 0) + (mid 0.6323 -0.635) + (end 0 -1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -1.27) + (mid 0.6323 -1.905) + (end 0 -2.54) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "L_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:R" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "R" + (at 2.032 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "R" + (at 0 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -1.778 0 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "R res resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "R_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "R_0_1" + (rectangle + (start -1.016 -2.54) + (end 1.016 2.54) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "R_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:PE4312" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 0 -0.635 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "PE4312" + (at 0 1.905 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_DFN_QFN:QFN-20-1EP_4x4mm_P0.5mm_EP2.7x2.7mm" + (at 2.54 -21.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.psemi.com/pdf/datasheets/pe4312ds.pdf" + (at 1.27 -19.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "1MHz-4GHz, 6-bit 31.5dB step attenuator, QFN 4x4 20 pin" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "RF attenuator" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOT*23*5*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "PE4312_0_1" + (rectangle + (start -10.16 10.16) + (end 10.16 -10.16) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "PE4312_1_1" + (pin input line + (at -12.7 5.08 0) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 2.54 0) + (length 2.54) + (name "VSS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 0 0) + (length 2.54) + (name "P/S" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -2.54 0) + (length 2.54) + (name "RF2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -5.08 0) + (length 2.54) + (name "C8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -5.08 12.7 270) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -5.08 -12.7 90) + (length 2.54) + (name "C4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -2.54 12.7 270) + (length 2.54) + (name "VDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -2.54 -12.7 90) + (length 2.54) + (name "C2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 0 12.7 270) + (length 2.54) + (name "PUP2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 0 -3.81 180) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "21" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 0 -12.7 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 2.54 12.7 270) + (length 2.54) + (name "PUP1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 2.54 -12.7 90) + (length 2.54) + (name "C1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 5.08 12.7 270) + (length 2.54) + (name "VDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 5.08 -12.7 90) + (length 2.54) + (name "C0.5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 12.7 5.08 180) + (length 2.54) + (name "LE" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 12.7 2.54 180) + (length 2.54) + (name "Clock" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 12.7 0 180) + (length 2.54) + (name "Data" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 12.7 -2.54 180) + (length 2.54) + (name "RF1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 12.7 -5.08 180) + (length 2.54) + (name "C16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+3V3" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3V3\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+3V3_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+3V3_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (hide yes) + (name "+3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:GND" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "GND_1_1" + (pin power_in line + (at 0 0 270) + (length 0) + (hide yes) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + ) + (junction + (at 138.43 68.58) + (diameter 0) + (color 0 0 0 0) + (uuid "423902a0-3106-42c4-bc1c-d580ade806b7") + ) + (junction + (at 133.35 82.55) + (diameter 0) + (color 0 0 0 0) + (uuid "5050f1d4-9443-4f0b-8b8d-4c77cf221d0a") + ) + (junction + (at 149.86 87.63) + (diameter 0) + (color 0 0 0 0) + (uuid "55ce52bb-67d0-4a30-8910-5bd603dfb60a") + ) + (junction + (at 130.81 68.58) + (diameter 0) + (color 0 0 0 0) + (uuid "5fdaeb50-88b8-4211-b56c-78b09e0cd521") + ) + (junction + (at 149.86 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "90912bee-28cc-4602-b300-65d23b5601b4") + ) + (junction + (at 149.86 93.98) + (diameter 0) + (color 0 0 0 0) + (uuid "cc6c5e83-1731-4bd6-a7c6-f9e05716b14d") + ) + (junction + (at 147.32 68.58) + (diameter 0) + (color 0 0 0 0) + (uuid "fef4c8a0-2c5b-4428-8326-4eee0089281f") + ) + (no_connect + (at 123.19 93.98) + (uuid "1729a218-25ab-47b7-86cf-29d20036519b") + ) + (wire + (pts + (xy 99.06 95.25) (xy 99.06 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "07ef6723-f596-46c4-92eb-67272c1edcf5") + ) + (wire + (pts + (xy 148.59 93.98) (xy 149.86 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0cbbef5b-6965-4d57-b9ab-54cb47594054") + ) + (wire + (pts + (xy 148.59 101.6) (xy 148.59 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "106512d7-c37f-4be5-a804-c9957347ea3a") + ) + (wire + (pts + (xy 157.48 69.85) (xy 157.48 68.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "165da60e-75c3-4e89-935f-51cb431c5a8e") + ) + (wire + (pts + (xy 143.51 113.03) (xy 143.51 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "16973b15-b7e0-4633-ba24-d089dae7ceec") + ) + (wire + (pts + (xy 138.43 109.22) (xy 138.43 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1d0a92fc-b50a-4d60-bde4-1dae13ea96f9") + ) + (wire + (pts + (xy 140.97 113.03) (xy 140.97 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "25e1a26f-6109-4dc9-b364-67c350d1cdce") + ) + (wire + (pts + (xy 135.89 74.93) (xy 133.35 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2ffe58da-c46e-43bf-bbb1-fb746cd733d2") + ) + (wire + (pts + (xy 149.86 91.44) (xy 148.59 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3c487a44-2d52-4c91-9a23-27dee6d2a571") + ) + (wire + (pts + (xy 147.32 68.58) (xy 147.32 69.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "402800f3-0b76-4019-b643-ca587e553755") + ) + (wire + (pts + (xy 133.35 82.55) (xy 135.89 82.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "464ca380-bf44-475e-882f-e96bdfc593a9") + ) + (wire + (pts + (xy 130.81 68.58) (xy 130.81 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4703cbe8-1f6c-4725-8d6e-58c14f1dad48") + ) + (wire + (pts + (xy 135.89 100.33) (xy 135.89 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4c1f2fdf-225a-4237-93a8-49a05aaf1d86") + ) + (wire + (pts + (xy 138.43 57.15) (xy 138.43 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d81b670-c395-4a16-8893-354b202f0ddc") + ) + (wire + (pts + (xy 88.9 99.06) (xy 123.19 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "50884d35-0dba-4269-a5ae-46356dad71a3") + ) + (wire + (pts + (xy 111.76 96.52) (xy 111.76 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5576666b-cb11-47f9-be75-aa2917df7762") + ) + (wire + (pts + (xy 147.32 68.58) (xy 138.43 68.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5a3caf8a-3061-4d75-aeec-13d692baaf88") + ) + (wire + (pts + (xy 149.86 87.63) (xy 149.86 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5c4078c9-1d10-4bc9-aee6-a247766e9ec5") + ) + (wire + (pts + (xy 133.35 83.82) (xy 133.35 82.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5ddf5473-f73c-448f-9b52-ea89ab82909c") + ) + (wire + (pts + (xy 99.06 96.52) (xy 88.9 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "66d9e7bf-a034-4ebb-b973-ebcc386c5389") + ) + (wire + (pts + (xy 149.86 87.63) (xy 154.94 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "675531cd-7ee8-4961-9884-fe20d0b04137") + ) + (wire + (pts + (xy 130.81 113.03) (xy 130.81 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6a7f0d02-dfc8-48c4-b673-9d86337ed06f") + ) + (wire + (pts + (xy 96.52 90.17) (xy 96.52 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6caf8b00-241b-4230-a316-e60bea90da68") + ) + (wire + (pts + (xy 161.29 93.98) (xy 168.91 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6d8b24ff-913e-41bb-8356-198adf48c1ea") + ) + (wire + (pts + (xy 96.52 91.44) (xy 88.9 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6e141436-234d-4367-af4b-f3ed39512457") + ) + (wire + (pts + (xy 149.86 83.82) (xy 149.86 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7067955e-ae56-4ff1-be92-ef404fb46f36") + ) + (wire + (pts + (xy 140.97 83.82) (xy 149.86 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "72b874b4-0111-4f05-ba25-d0fd15a23607") + ) + (wire + (pts + (xy 133.35 74.93) (xy 133.35 82.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75897e4d-860a-42d4-b2a3-4881f32986bc") + ) + (wire + (pts + (xy 130.81 68.58) (xy 138.43 68.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75d27aca-f011-408d-af70-6e6be0a114a9") + ) + (wire + (pts + (xy 143.51 113.03) (xy 140.97 113.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7add3fc2-577a-437a-bc2d-266787041b5c") + ) + (wire + (pts + (xy 88.9 101.6) (xy 93.98 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "81a28ee0-6caf-46e0-9e0a-685bf238d548") + ) + (wire + (pts + (xy 149.86 93.98) (xy 149.86 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "82c53e46-6fbc-411c-ad58-8051f770b612") + ) + (wire + (pts + (xy 138.43 68.58) (xy 138.43 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "93611877-f943-49d5-af43-400fc2f641d5") + ) + (wire + (pts + (xy 99.06 95.25) (xy 101.6 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "975bb97d-21ef-4026-ba09-e736a6acd779") + ) + (wire + (pts + (xy 135.89 82.55) (xy 135.89 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "98931f6a-7053-4232-a454-bd0c52453265") + ) + (wire + (pts + (xy 96.52 90.17) (xy 100.33 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9aa6b4c8-d34b-449e-9544-c1b9bd85ce9b") + ) + (wire + (pts + (xy 149.86 93.98) (xy 149.86 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9ac25f8d-57c7-411c-bf46-ab15817462bf") + ) + (wire + (pts + (xy 148.59 99.06) (xy 168.91 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a5d9f05f-1724-4718-abbf-4f48c9cff7e7") + ) + (wire + (pts + (xy 133.35 109.22) (xy 133.35 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a9f2af6e-5930-4abe-bee5-c0fca7655ecb") + ) + (wire + (pts + (xy 127 113.03) (xy 127 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aa303fb0-9fba-4298-b3d7-83499f7c1fad") + ) + (wire + (pts + (xy 88.9 88.9) (xy 93.98 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aab0a7e4-95d4-4cb3-b2a8-9fc281192007") + ) + (wire + (pts + (xy 127 113.03) (xy 130.81 113.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aaf4fc55-d381-458a-9e51-7e73875be045") + ) + (wire + (pts + (xy 120.65 101.6) (xy 123.19 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b268442e-57a5-459e-b4f6-82783d7020dd") + ) + (wire + (pts + (xy 163.83 101.6) (xy 168.91 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b8f9eaf9-0db9-4219-99bc-e10ae2db1fbd") + ) + (wire + (pts + (xy 138.43 64.77) (xy 138.43 68.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bf48d558-b1bc-4e84-a0a5-9b688623c95b") + ) + (wire + (pts + (xy 157.48 68.58) (xy 147.32 68.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bf7f89e5-e91c-4aea-8334-6f65db1d3233") + ) + (wire + (pts + (xy 123.19 68.58) (xy 130.81 68.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4f6a045-2005-4c63-b6b4-665a4d27bc44") + ) + (wire + (pts + (xy 120.65 101.6) (xy 120.65 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d5c0308f-576e-413f-9b6e-37fedd68e732") + ) + (wire + (pts + (xy 135.89 95.25) (xy 133.35 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc90863c-630b-4309-8975-d450c0f834ea") + ) + (wire + (pts + (xy 123.19 91.44) (xy 123.19 68.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd1b6fdc-bdef-4228-ae32-46b5e357f36e") + ) + (wire + (pts + (xy 161.29 91.44) (xy 168.91 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e8dd8bc3-7cc2-403c-b30b-7bbd7149bb28") + ) + (wire + (pts + (xy 111.76 77.47) (xy 111.76 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ea9927ac-7e32-41f9-9c61-1e7219e480ca") + ) + (wire + (pts + (xy 148.59 96.52) (xy 149.86 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eb0fb10d-6ddc-425d-87a9-721c1ea0d51a") + ) + (wire + (pts + (xy 161.29 96.52) (xy 168.91 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ebc6ae42-c0c1-480c-85d0-e182c9f5f632") + ) + (wire + (pts + (xy 88.9 93.98) (xy 104.14 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ec971626-b2a5-4e09-9ca5-96690288b1f5") + ) + (wire + (pts + (xy 161.29 88.9) (xy 168.91 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f13d013d-2c46-4473-85a9-834110f65cde") + ) + (wire + (pts + (xy 123.19 96.52) (xy 111.76 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f9b35432-4e09-4b35-97bb-ecb27084df45") + ) + (wire + (pts + (xy 120.65 113.03) (xy 120.65 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fb92b1f4-e4df-4326-82d4-09ef748ddd50") + ) + (wire + (pts + (xy 111.76 72.39) (xy 114.3 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fc4e0148-368d-4e81-a9fa-6189785f2219") + ) + (label "TC8" + (at 161.29 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "26671497-6dec-4064-b9fc-c8c83ab95ca4") + ) + (label "TC1" + (at 161.29 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "28d47d1f-ed19-4a24-89eb-45ee5c1e8ca1") + ) + (label "TC2" + (at 161.29 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3285096d-7fc9-43e7-a2c9-4b75a906e9cb") + ) + (label "TC4" + (at 143.51 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "4b4f6610-d3cf-45f4-8f82-d98fb60c6e5a") + ) + (label "TC1" + (at 133.35 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "515b9b7a-387d-4d68-a772-eeef2bb0f838") + ) + (label "TC0.5" + (at 127 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "66ffbc6e-db9f-4215-aa29-a97a098fb3fd") + ) + (label "TC16" + (at 93.98 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "688ea866-638c-400a-bfba-4fe69be0c007") + ) + (label "TC2" + (at 138.43 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "81aaeb70-ae50-461f-98d7-a5c7a8c33d2f") + ) + (label "TC4" + (at 161.29 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "a8bfc67f-6194-4934-9a41-e896d8c051f6") + ) + (label "TC0.5" + (at 93.98 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "d592ae0f-8ac0-4923-a099-f599f5afa5db") + ) + (label "TC8" + (at 148.59 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "e74443ce-a31a-4d21-b41d-6744642b7981") + ) + (label "TC16" + (at 120.65 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "f9645601-5307-4329-bf76-4f5586b84543") + ) + (symbol + (lib_id "T41_Library:PE4312") + (at 135.89 96.52 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "087ff44f-f155-4b7e-8f11-e8ee9664d87f") + (property "Reference" "U1" + (at 128.27 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "PE4312" + (at 130.81 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:PE4312-QFN-20" + (at 133.35 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.psemi.com/pdf/datasheets/pe4312ds.pdf" + (at 134.62 115.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 135.89 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C500480" + (at 135.89 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "PE4312C-Z" + (at 135.89 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "11" + (uuid "c788c7d6-432b-4f91-ae83-2bc6d1c7a6bc") + ) + (pin "10" + (uuid "ccc59408-3dc4-4130-98f4-3e8567022487") + ) + (pin "15" + (uuid "43e84e9c-3dfe-489f-9499-5b6c4512d144") + ) + (pin "9" + (uuid "2e50be23-1f43-4745-9af5-7da6d86ed6e0") + ) + (pin "4" + (uuid "7a380943-a5ac-4e5f-ac64-1d6293473c51") + ) + (pin "20" + (uuid "18bd471e-fb17-4ad1-b440-fa014b4eb974") + ) + (pin "7" + (uuid "f89edfba-8d4b-475a-badb-655fa5beedce") + ) + (pin "21" + (uuid "ea1105d7-3d08-41ca-9e7d-2b6565a336fa") + ) + (pin "14" + (uuid "dbfacdd4-9ad7-423f-8bb2-4e3476413fc5") + ) + (pin "6" + (uuid "046c1ce8-0853-4594-915a-09f2e6818cbc") + ) + (pin "16" + (uuid "2446cf9d-0f32-4e91-9b4b-4801a9962772") + ) + (pin "8" + (uuid "0c911d69-99e0-4de0-82e5-61235bdd2820") + ) + (pin "2" + (uuid "28275ac0-0a23-4367-ae30-4364408562a7") + ) + (pin "19" + (uuid "894e71e9-3036-4f17-8b26-096a2bd3623f") + ) + (pin "13" + (uuid "0bb3e25e-2939-4e86-8568-3a6053517e84") + ) + (pin "17" + (uuid "4814ed5b-cb52-44c8-bfaa-3d17e0bbb352") + ) + (pin "3" + (uuid "023a793c-fc83-4f22-8dc9-ac63cd980f04") + ) + (pin "5" + (uuid "fd2a1f95-c330-4f5a-a75f-6161b9abe6ca") + ) + (pin "12" + (uuid "74f102d0-9845-464b-8df0-1b4cf6e7cd9a") + ) + (pin "18" + (uuid "a4e49b54-9c08-4613-8bf9-1f56cac2fbd7") + ) + (pin "1" + (uuid "868446fb-5431-4bba-9ee6-fd40e5667668") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "U1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 135.89 109.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "17234761-b601-4977-a21d-5fc699a782aa") + (property "Reference" "#PWR03" + (at 135.89 115.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 135.89 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 135.89 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 135.89 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 135.89 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "08a6218d-57bd-4be0-9025-01ddbbf7045a") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR03") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 114.3 72.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "22b2053a-cb7f-4f66-8a63-1be6668e88f7") + (property "Reference" "#PWR01" + (at 114.3 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 114.3 76.5231 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 114.3 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 114.3 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 114.3 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f6f88740-cbde-46fc-a12c-420dd1857333") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR01") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 147.32 73.66 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "242d148f-63f3-41df-8766-ef5f2c871a2b") + (property "Reference" "C1" + (at 153.6233 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 151.1991 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" + (at 148.2852 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 147.32 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C14663" + (at 147.32 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CC0603KRX7R9BB104" + (at 147.32 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6dad19f6-e8b6-45da-b425-076f03ae8723") + ) + (pin "1" + (uuid "82d50d11-0304-49d4-a0d4-0a952a13652c") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "C1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 135.89 74.93 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "30a2a334-eff2-4d86-81f6-ba672da1f48f") + (property "Reference" "#PWR07" + (at 135.89 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 135.89 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 135.89 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 135.89 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 135.89 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7e7596e1-abde-4b75-9f89-3b7284bd8bf4") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR07") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 104.14 93.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "47ec0376-7bd0-42c8-bdaa-0a0357b98eba") + (property "Reference" "#PWR010" + (at 104.14 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 107.95 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 104.14 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 104.14 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 104.14 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "91875422-ac71-451a-8663-5caf3faabe69") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR010") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 138.43 60.96 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "49220bed-ed7d-450a-bbef-e8fd2967aadd") + (property "Reference" "L1" + (at 139.0649 59.7478 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "FB" + (at 139.0649 62.1721 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_0603_1608Metric" + (at 138.43 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 138.43 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 138.43 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1002" + (at 138.43 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "BMC-Q1JY0500H" + (at 138.43 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "bd4932bf-e213-4bce-8730-d8294a580713") + ) + (pin "2" + (uuid "fcd4aee2-ef2b-4406-a937-30b88b66be7d") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "L1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 101.6 95.25 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4de756b4-5276-4c95-a45a-5601b0a36e08") + (property "Reference" "#PWR09" + (at 101.6 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 106.172 97.028 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 101.6 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 101.6 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 101.6 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6a243996-578e-4187-b4e5-e20708b41392") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR09") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 120.65 109.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "586b0634-8e4f-4ac3-81d3-56c3e3beb308") + (property "Reference" "R2" + (at 122.428 108.0079 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10k" + (at 122.428 110.4321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_0603_1608Metric" + (at 118.872 109.22 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 120.65 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 120.65 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C25804" + (at 120.65 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CMP0603-FX-1002ELF" + (at 120.65 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "47fa3b2f-19cb-4f7d-88fa-df3f693ebe45") + ) + (pin "1" + (uuid "42bc17b9-f88e-4486-9475-53298a981cd7") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "R2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 100.33 90.17 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5c561e30-72a5-4ff3-b49c-1d4b4169a0b5") + (property "Reference" "#PWR08" + (at 100.33 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 97.536 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 100.33 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 100.33 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 100.33 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4f8459cc-f86e-43f3-a71f-14cbc4ea4f20") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR08") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 111.76 81.28 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5e6e8aa6-318d-4117-9a38-f8ba7b268cdf") + (property "Reference" "R1" + (at 113.538 80.0679 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10k" + (at 113.538 82.4921 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_0603_1608Metric" + (at 109.982 81.28 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 111.76 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 111.76 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C25804" + (at 111.76 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CMP0603-FX-1002ELF" + (at 111.76 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "daee1d60-a3be-4212-865b-50b1885e026a") + ) + (pin "1" + (uuid "015088a0-fb2b-44ff-8102-e7dbc3d1651d") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "R1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 147.32 77.47 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7a31de6f-df16-4584-8c02-e887d1e39de0") + (property "Reference" "#PWR02" + (at 147.32 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 144.78 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 147.32 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 147.32 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "06280043-c24e-405b-b3f6-f9f77a3dcc3c") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR02") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 157.48 73.66 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "96d6742b-6624-4601-89e2-7b7ec5989ee6") + (property "Reference" "C2" + (at 163.7833 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uF 50V" + (at 161.3591 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_0603_1608Metric" + (at 158.4452 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 157.48 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 157.48 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C96446" + (at 157.48 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "GXT188R61C106KE13D" + (at 157.48 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ac04fed0-d60a-4f1b-aa84-4f4d6827fbf0") + ) + (pin "1" + (uuid "162fcb9b-d294-42ac-980b-57cc8f1829e5") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "C2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 154.94 87.63 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a7503e7c-8bf9-4b70-937c-7c7511e20cf2") + (property "Reference" "#PWR05" + (at 154.94 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 154.94 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 154.94 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 154.94 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 154.94 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1b9cd5ed-bade-4bbd-a836-7cfe8450e0c5") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR05") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x06_Socket") + (at 173.99 93.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ad2e8b12-3521-4d07-9089-0774a859c5f0") + (property "Reference" "J2" + (at 175.26 93.9799 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Conn 2" + (at 175.26 96.5199 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical" + (at 173.99 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 173.99 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x06, script generated" + (at 173.99 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 173.99 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "" + (at 173.99 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "adba724e-ac1e-4d56-bbd5-1c7ea317df7a") + ) + (pin "2" + (uuid "0cffefab-34fb-4742-92ff-a06b55f24b1d") + ) + (pin "1" + (uuid "92114573-f66f-46c9-8241-be9cbc68c2fe") + ) + (pin "4" + (uuid "48ac5927-0685-4407-8c78-4e0ce1a1f040") + ) + (pin "5" + (uuid "2809a25f-63c5-42a9-961e-362dfe67a121") + ) + (pin "6" + (uuid "ad9ad35a-f435-47ce-9551-be6fd075646c") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "J2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 163.83 101.6 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b06d4f36-632b-4b09-aad8-10f6b3802ad3") + (property "Reference" "#PWR011" + (at 163.83 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 167.386 103.632 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 163.83 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 163.83 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 163.83 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "925df352-ce81-40cd-a2d9-79e2d73272cf") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR011") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 138.43 55.88 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d12141bc-2ceb-478c-a937-dcf3b7e81c63") + (property "Reference" "#PWR04" + (at 138.43 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 142.24 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 138.43 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 138.43 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 138.43 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "40930842-e1ca-4b85-a4ad-ff869834cee1") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR04") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 157.48 77.47 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e9e14b1b-02d7-410b-a777-0c56c9ffaf3a") + (property "Reference" "#PWR012" + (at 157.48 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 154.94 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 157.48 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 157.48 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 157.48 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8812cb7e-87cd-451f-8d1b-046a72f9d3b8") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR012") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 133.35 95.25 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f2313634-5b6a-4b35-8810-c87eddcaf5d7") + (property "Reference" "#PWR06" + (at 133.35 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 133.35 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 133.35 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 133.35 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 133.35 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "69baf962-1ba6-4bc4-9671-7397faa08dcb") + ) + (instances + (project "T41-RF-board-Attenuator-daughterboard" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "#PWR06") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x06_Socket") + (at 83.82 96.52 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f76c630c-5393-49b8-8420-a24a84779b7f") + (property "Reference" "J1" + (at 84.455 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn 1" + (at 84.455 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_Vertical" + (at 83.82 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 83.82 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x06, script generated" + (at 83.82 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 83.82 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "" + (at 83.82 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "e26bdebc-37fb-4c8a-8123-dae59fc26a62") + ) + (pin "2" + (uuid "a45496fa-629b-4f68-a2f6-6d4811402ace") + ) + (pin "1" + (uuid "d47a085f-f10e-4c29-8138-a9b0ed61aef2") + ) + (pin "4" + (uuid "19ba3a85-602c-4f70-acf9-7416a9fff736") + ) + (pin "5" + (uuid "53556cf0-7ea1-411e-8aa4-515dec0447c8") + ) + (pin "6" + (uuid "44614803-583c-42a9-b10c-317ba84082f9") + ) + (instances + (project "" + (path "/4fb44e34-3372-47df-9694-9168f4fad0b1" + (reference "J1") + (unit 1) + ) + ) + ) + ) + (sheet_instances + (path "/" + (page "1") + ) + ) + (embedded_fonts no) +) diff --git a/wiki/raw/T41-RF-board-V012.kicad_sch b/wiki/raw/T41-RF-board-V012.kicad_sch new file mode 100644 index 0000000..1aeca9f --- /dev/null +++ b/wiki/raw/T41-RF-board-V012.kicad_sch @@ -0,0 +1,40577 @@ +(kicad_sch + (version 20250114) + (generator "eeschema") + (generator_version "9.0") + (uuid "3c4b9d3b-a516-4fd7-b325-b74c836dee65") + (paper "A3") + (title_block + (title "T41 RF Board") + (date "2025-12-31") + (rev "V012.8") + (comment 1 " Additional work by Oliver KI3P") + (comment 2 "By Al Peter-AC8GY, Revised by WJ Schmidt-K9HZ") + (comment 3 "Change log: Added daughterboards") + ) + (lib_symbols + (symbol "74xGxx:74LVC1G04" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 0 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "74LVC1G04" + (at 5.08 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Single NOT Gate, Low-Voltage CMOS" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Single Gate NOT LVC CMOS" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOT?23* Texas?R-PDSO-G5?DCK* Texas?R-PDSO-N5?DRL* Texas?X2SON*0.8x0.8mm*P0.48mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "74LVC1G04_0_1" + (polyline + (pts + (xy -7.62 6.35) (xy -7.62 -6.35) (xy 5.08 0) (xy -7.62 6.35) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "74LVC1G04_1_1" + (pin input line + (at -15.24 0 0) + (length 7.62) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -5.08 10.16 270) + (length 5.08) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -5.08 -10.16 90) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output inverted + (at 12.7 0 180) + (length 7.62) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Amplifier_Operational:MC33078" + (pin_names + (offset 0.127) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "MC33078" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC33078-D.PDF" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Low Noise, Dual Operational Amplifiers, DIP-8/SOIC-8/SSOP-8" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_locked" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "dual opamp" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm* DIP*W7.62mm* TO*99* OnSemi*Micro8* TSSOP*3x3mm*P0.65mm* TSSOP*4.4x3mm*P0.65mm* MSOP*3x3mm*P0.65mm* SSOP*3.9x4.9mm*P0.635mm* LFCSP*2x2mm*P0.5mm* *SIP* SOIC*5.3x6.2mm*P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MC33078_1_1" + (polyline + (pts + (xy -5.08 5.08) (xy 5.08 0) (xy -5.08 -5.08) (xy -5.08 5.08) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (pin input line + (at -7.62 2.54 0) + (length 2.54) + (name "+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -7.62 -2.54 0) + (length 2.54) + (name "-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 7.62 0 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (symbol "MC33078_2_1" + (polyline + (pts + (xy -5.08 5.08) (xy 5.08 0) (xy -5.08 -5.08) (xy -5.08 5.08) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (pin input line + (at -7.62 2.54 0) + (length 2.54) + (name "+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -7.62 -2.54 0) + (length 2.54) + (name "-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 7.62 0 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (symbol "MC33078_3_1" + (pin power_in line + (at -2.54 7.62 270) + (length 3.81) + (name "V+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -2.54 -7.62 90) + (length 3.81) + (name "V-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector:Conn_Coaxial" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0.254 3.048 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_Coaxial" + (at 2.921 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "coaxial connector (BNC, SMA, SMB, SMC, Cinch/RCA, LEMO, ...)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "BNC SMA SMB SMC LEMO coaxial connector CINCH RCA MCX MMCX U.FL UMRF" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "*BNC* *SMA* *SMB* *SMC* *Cinch* *LEMO* *UMRF* *MCX* *U.FL*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_Coaxial_0_1" + (polyline + (pts + (xy -2.54 0) (xy -0.508 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.778 0) + (mid 0.222 -1.8079) + (end -1.778 -0.508) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -1.778 0.508) + (mid 0.2221 1.8084) + (end 1.778 0) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 0) + (radius 0.508) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -2.54) (xy 0 -1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Conn_Coaxial_1_1" + (pin passive line + (at -5.08 0 0) + (length 2.54) + (name "In" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -5.08 90) + (length 2.54) + (name "Ext" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector:Screw_Terminal_01x02" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Screw_Terminal_01x02" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic screw terminal, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "screw terminal" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TerminalBlock*:*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Screw_Terminal_01x02_1_1" + (rectangle + (start -1.27 1.27) + (end 1.27 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (polyline + (pts + (xy -0.5334 0.3302) (xy 0.3302 -0.508) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.5334 -2.2098) (xy 0.3302 -3.048) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.3556 0.508) (xy 0.508 -0.3302) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.3556 -2.032) (xy 0.508 -2.8702) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 0) + (radius 0.635) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 -2.54) + (radius 0.635) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector:TestPoint" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0.762) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "TP" + (at 0 6.858 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "TestPoint" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "test point" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "test point tp" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Pin* Test*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "TestPoint_0_1" + (circle + (center 0 3.302) + (radius 0.762) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "TestPoint_1_1" + (pin passive line + (at 0 0 90) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Connector_Audio:AudioJack3_SwitchTR" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 8.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AudioJack3_SwitchTR" + (at 0 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Audio Jack, 3 Poles (Stereo / TRS), Switched TR Poles (Normalling)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "audio jack receptacle stereo headphones phones TRS connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Jack*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "AudioJack3_SwitchTR_0_1" + (rectangle + (start -5.08 -5.08) + (end -6.35 -7.62) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy -1.905 -5.08) (xy -1.27 -5.715) (xy -0.635 -5.08) (xy -0.635 0) (xy 2.54 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -5.08) (xy 0.635 -5.715) (xy 1.27 -5.08) (xy 2.54 -5.08) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.508 -0.254) (xy 0.762 -0.762) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.778 -5.334) (xy 2.032 -5.842) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 2.54 3.81) + (end -5.08 -10.16) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (polyline + (pts + (xy 2.54 2.54) (xy -2.54 2.54) (xy -2.54 -5.08) (xy -3.175 -5.715) (xy -3.81 -5.08) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 -2.54) (xy 0.508 -2.54) (xy 0.508 -0.254) (xy 0.254 -0.762) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 -7.62) (xy 1.778 -7.62) (xy 1.778 -5.334) (xy 1.524 -5.842) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "AudioJack3_SwitchTR_1_1" + (pin passive line + (at 5.08 2.54 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "S" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 0 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "R" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -2.54 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "RN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -5.08 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "T" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -7.62 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "TN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:C" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "C_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_0_1" + (polyline + (pts + (xy -2.032 0.762) (xy 2.032 0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.032 -0.762) (xy 2.032 -0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "C_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:C_Polarized" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Polarized" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Polarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "CP_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_Polarized_0_1" + (rectangle + (start -2.286 0.508) + (end 2.286 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.778 2.286) (xy -0.762 2.286) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 2.794) (xy -1.27 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 2.286 -0.508) + (end -2.286 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "C_Polarized_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:L" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "L" + (at -1.27 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "L" + (at 1.905 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Inductor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "inductor choke coil reactor magnetic" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Choke_* *Coil* Inductor_* L_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "L_0_1" + (arc + (start 0 2.54) + (mid 0.6323 1.905) + (end 0 1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 1.27) + (mid 0.6323 0.635) + (end 0 0) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 0) + (mid 0.6323 -0.635) + (end 0 -1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -1.27) + (mid 0.6323 -1.905) + (end 0 -2.54) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "L_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Device:R" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "R" + (at 2.032 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "R" + (at 0 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -1.778 0 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "R res resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "R_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "R_0_1" + (rectangle + (start -1.016 -2.54) + (end 1.016 2.54) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "R_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Interface_Expansion:MCP23017_SO" + (pin_names + (offset 1.016) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -11.43 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MCP23017_SO" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-28W_7.5x17.9mm_P1.27mm" + (at 5.08 -25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf" + (at 5.08 -27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "16-bit I/O expander, I2C, interrupts, w pull-ups, SOIC-28" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "I2C parallel port expander" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC*7.5x17.9mm*P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MCP23017_SO_0_1" + (rectangle + (start -12.7 22.86) + (end 12.7 -22.86) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "MCP23017_SO_1_1" + (pin bidirectional line + (at -17.78 20.32 0) + (length 5.08) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 17.78 0) + (length 5.08) + (name "SCK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin tri_state line + (at -17.78 5.08 0) + (length 5.08) + (name "INTB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin tri_state line + (at -17.78 2.54 0) + (length 5.08) + (name "INTA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -2.54 0) + (length 5.08) + (name "~{RESET}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -15.24 0) + (length 5.08) + (name "A2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -17.78 0) + (length 5.08) + (name "A1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -20.32 0) + (length 5.08) + (name "A0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin no_connect line + (at -12.7 15.24 0) + (length 5.08) + (hide yes) + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin no_connect line + (at -12.7 12.7 0) + (length 5.08) + (hide yes) + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 27.94 270) + (length 5.08) + (name "VDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -27.94 90) + (length 5.08) + (name "VSS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 20.32 180) + (length 5.08) + (name "GPB0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 17.78 180) + (length 5.08) + (name "GPB1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 15.24 180) + (length 5.08) + (name "GPB2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 12.7 180) + (length 5.08) + (name "GPB3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 10.16 180) + (length 5.08) + (name "GPB4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 7.62 180) + (length 5.08) + (name "GPB5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 5.08 180) + (length 5.08) + (name "GPB6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 2.54 180) + (length 5.08) + (name "GPB7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -2.54 180) + (length 5.08) + (name "GPA0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "21" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -5.08 180) + (length 5.08) + (name "GPA1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "22" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -7.62 180) + (length 5.08) + (name "GPA2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "23" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -10.16 180) + (length 5.08) + (name "GPA3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "24" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -12.7 180) + (length 5.08) + (name "GPA4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "25" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -15.24 180) + (length 5.08) + (name "GPA5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "26" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -17.78 180) + (length 5.08) + (name "GPA6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "27" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -20.32 180) + (length 5.08) + (name "GPA7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "28" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Jumper:Jumper_2_Open" + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "JP" + (at 0 2.794 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Jumper_2_Open" + (at 0 -2.286 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Jumper, 2-pole, open" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Jumper SPST" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Jumper* TestPoint*2Pads* TestPoint*Bridge*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Jumper_2_Open_0_0" + (circle + (center -2.032 0) + (radius 0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 2.032 0) + (radius 0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Jumper_2_Open_0_1" + (arc + (start -1.524 1.27) + (mid 0 1.778) + (end 1.524 1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Jumper_2_Open_1_1" + (pin passive line + (at -5.08 0 0) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 0 180) + (length 2.54) + (name "B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Jumper:SolderJumper_2_Bridged" + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "JP" + (at 0 2.032 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Bridged" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Solder Jumper, 2-pole, closed/bridged" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "solder jumper SPST" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SolderJumper*Bridged*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "SolderJumper_2_Bridged_0_1" + (rectangle + (start -0.508 0.508) + (end 0.508 -0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy -0.254 1.016) (xy -0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 -1.016) + (mid -1.2656 0) + (end -0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 -1.016) + (mid -1.2656 0) + (end -0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start 0.254 1.016) + (mid 1.2656 0) + (end 0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0.254 1.016) + (mid 1.2656 0) + (end 0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 0.254 1.016) (xy 0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "SolderJumper_2_Bridged_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Jumper:SolderJumper_2_Open" + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "JP" + (at 0 2.032 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Solder Jumper, 2-pole, open" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "solder jumper SPST" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SolderJumper*Open*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "SolderJumper_2_Open_0_1" + (polyline + (pts + (xy -0.254 1.016) (xy -0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 -1.016) + (mid -1.2656 0) + (end -0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 -1.016) + (mid -1.2656 0) + (end -0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start 0.254 1.016) + (mid 1.2656 0) + (end 0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0.254 1.016) + (mid 1.2656 0) + (end 0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 0.254 1.016) (xy 0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "SolderJumper_2_Open_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Mechanical:MountingHole_Pad" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "H" + (at 0 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MountingHole_Pad" + (at 0 4.445 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Mounting Hole with connection" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "mounting hole" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "MountingHole*Pad*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MountingHole_Pad_0_1" + (circle + (center 0 1.27) + (radius 1.27) + (stroke + (width 1.27) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "MountingHole_Pad_1_1" + (pin input line + (at 0 -2.54 90) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "RF_Switch:MASWSS0179" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -7.62 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 3.81 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Macom GaAs RF SPDT switch, DC-2GHz, 0.6/22dB loss/isolation, SOT-26 (SOT-23-6)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "RF SWITCH SPDT" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOT?23*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MASWSS0179_0_1" + (polyline + (pts + (xy -3.175 -3.81) (xy -2.54 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center -3.048 2.54) + (radius 0.2794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.794 2.54) (xy 2.921 5.207) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.905 -3.81) (xy -1.27 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.635 -3.81) (xy 0 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 3.175) (xy 0 3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 1.905) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0.635) (xy 0 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -0.635) (xy 0 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -1.905) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -3.175) (xy 0 -2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 3.048 0) + (radius 0.2794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 3.175 5.207) + (radius 0.2794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 7.62 -7.62) + (end -7.62 6.35) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "MASWSS0179_1_1" + (pin passive line + (at -10.16 2.54 0) + (length 2.54) + (name "RFC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -2.54 0) + (length 2.54) + (name "V1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -5.08 0) + (length 2.54) + (name "V2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 2.54 -10.16 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 10.16 5.08 180) + (length 2.54) + (name "RF1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 10.16 0 180) + (length 2.54) + (name "RF2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Regulator_Linear:LM1117T-3.3" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM1117T-3.3" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Horizontal_TabDown" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm1117.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "800mA Low-Dropout Linear Regulator, 3.3V fixed output, TO-220" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "linear regulator ldo fixed positive" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?220*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LM1117T-3.3_0_1" + (rectangle + (start -5.08 -5.08) + (end 5.08 1.905) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "LM1117T-3.3_1_1" + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "VI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Regulator_Linear:LM317L_SO8" + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM317L_SO8" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/snvs775k/snvs775k.pdf" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "100mA 35V Adjustable Linear Regulator, SO-8" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Adjustable Voltage Regulator 100mA Positive" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC*3.9x4.9mm*P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LM317L_SO8_0_1" + (rectangle + (start -5.08 1.905) + (end 5.08 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "LM317L_SO8_1_1" + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "VI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin no_connect line + (at -5.08 -2.54 0) + (length 2.54) + (hide yes) + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 0 -7.62 90) + (length 2.54) + (name "ADJ" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin no_connect line + (at 5.08 -2.54 180) + (length 2.54) + (hide yes) + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 0 180) + (length 2.54) + (hide yes) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 0 180) + (length 2.54) + (hide yes) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 0 180) + (length 2.54) + (hide yes) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Regulator_Linear:LM7805_TO220" + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM7805_TO220" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 0 5.715 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" + (at 0 -1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Positive 1A 35V Linear Regulator, Fixed Output 5V, TO-220" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Voltage Regulator 1A Positive" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?220*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LM7805_TO220_0_1" + (rectangle + (start -5.08 1.905) + (end 5.08 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "LM7805_TO220_1_1" + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "VI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:74CBTLV3253PWRE4" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 10.795 19.685 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "74CBTLV3253PWRE4" + (at 11.43 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:TSSOP-16-1EP_4.4x5mm_P0.65mm" + (at 1.27 -17.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74cbtlv3253.pdf" + (at 0 -20.955 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Low-Voltage Dual 1-of-4 FET Multiplexer/Demultiplexer" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "DIP?24*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "74CBTLV3253PWRE4_1_0" + (polyline + (pts + (xy 1.27 1.27) (xy -1.27 0) (xy 1.27 -1.27) (xy 1.27 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 0) (xy -1.27 1.27) (xy -1.27 -1.27) (xy 1.27 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin input line + (at -12.7 15.24 0) + (length 5.08) + (name "1~{OE}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 12.7 0) + (length 5.08) + (name "2~{OE}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -12.7 5.08 0) + (length 5.08) + (name "S0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -12.7 2.54 0) + (length 5.08) + (name "S1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -12.7 -5.08 0) + (length 5.08) + (name "1A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -12.7 -7.62 0) + (length 5.08) + (name "2A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 22.86 270) + (length 5.08) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -15.24 90) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 15.24 180) + (length 5.08) + (name "1B1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 12.7 180) + (length 5.08) + (name "1B2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 10.16 180) + (length 5.08) + (name "1B3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 7.62 180) + (length 5.08) + (name "1B4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 0 180) + (length 5.08) + (name "2B1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -2.54 180) + (length 5.08) + (name "2B2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -5.08 180) + (length 5.08) + (name "2B3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -7.62 180) + (length 5.08) + (name "2B4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (symbol "74CBTLV3253PWRE4_1_1" + (rectangle + (start -7.62 17.78) + (end 7.62 -10.16) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:IDC_2x5" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 1.27 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "IDC_2x5" + (at 1.27 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, double row, 02x05, top/bottom pin numbering scheme (row 1: 1...pins_per_row, row2: pins_per_row+1 ... num_pins), script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_2x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "IDC_2x5_1_1" + (rectangle + (start -1.27 6.35) + (end 3.81 -6.35) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (rectangle + (start -1.27 5.207) + (end 0 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 2.667) + (end 0 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 1.27) + (end 0 -1.27) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -2.413) + (end 0 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -4.953) + (end 0 -5.207) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 5.207) + (end 2.54 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 2.667) + (end 2.54 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 0.127) + (end 2.54 -0.127) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 -2.413) + (end 2.54 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 -4.953) + (end 2.54 -5.207) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 5.08 180) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 2.54 180) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 0 180) + (length 3.81) + (name "Pin_6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 -2.54 180) + (length 3.81) + (name "Pin_8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 -5.08 180) + (length 3.81) + (name "Pin_10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:MAR-3SM+" + (pin_names + (offset 0.127) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 5.08 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "MAR-3SM+" + (at 5.08 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0 -9.525 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.minicircuits.com/pdfs/MAR-3SM+.pdf" + (at 1.27 -11.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "DC to 4 GHz, 31 dB gain, 3 dB NF monolithic amplifier" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC*P1.27mm* DIP*W7.62mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MAR-3SM+_1_1" + (polyline + (pts + (xy 5.08 0) (xy -5.08 5.08) (xy -5.08 -5.08) (xy 5.08 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (pin input line + (at -7.62 0 0) + (length 2.54) + (name "IN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -2.54 6.35 270) + (length 2.54) + (name "GND" + (effects + (font + (size 0.508 0.508) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -2.54 -6.35 90) + (length 2.54) + (name "GND" + (effects + (font + (size 0.508 0.508) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 7.62 0 180) + (length 2.54) + (name "OUT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:PSA-8A+" + (pin_names + (offset 0.127) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 5.08 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "PSA-8A+" + (at 5.08 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-363_SC-70-6" + (at 0 -9.525 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.minicircuits.com/pdfs/PSA-8A+.pdf" + (at 1.27 -11.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "DC to 4 GHz, 31 dB gain, 3 dB NF monolithic amplifier" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC*P1.27mm* DIP*W7.62mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "PSA-8A+_1_1" + (polyline + (pts + (xy 5.08 0) (xy -5.08 5.08) (xy -5.08 -5.08) (xy 5.08 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (pin input line + (at -7.62 0 0) + (length 2.54) + (name "IN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -5.08 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 0.508 0.508) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -2.54 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 0.508 0.508) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 0.508 0.508) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 2.54 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 0.508 0.508) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 7.62 0 180) + (length 2.54) + (name "OUT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:T41_Attenuator_Daughter" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -0.762 10.414 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "T41_Attenuator_Daughter" + (at 0.762 13.97 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:T41_Attenuator_Daughter" + (at 3.175 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 3.81 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "MSOP*3x3mm*P0.65mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "T41_Attenuator_Daughter_0_1" + (rectangle + (start -7.62 8.89) + (end 6.35 -8.89) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "T41_Attenuator_Daughter_1_1" + (pin input line + (at -10.16 6.35 0) + (length 2.54) + (name "0.5dB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 3.81 0) + (length 2.54) + (name "RF1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 1.27 0) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -1.27 0) + (length 2.54) + (name "3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -3.81 0) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -6.35 0) + (length 2.54) + (name "16dB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 8.89 6.35 180) + (length 2.54) + (name "1dB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 8.89 3.81 180) + (length 2.54) + (name "2dB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 8.89 1.27 180) + (length 2.54) + (name "4dB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 8.89 -1.27 180) + (length 2.54) + (name "8dB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 8.89 -3.81 180) + (length 2.54) + (name "RF2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 8.89 -6.35 180) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "T41_Library:T41_DualClock_Daughter" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -0.762 10.414 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "T41_DualClock_Daughter" + (at 0.762 13.97 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:T41_DualClock_Daughter" + (at 3.175 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 3.81 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "MSOP*3x3mm*P0.65mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "T41_DualClock_Daughter_0_1" + (rectangle + (start -7.62 8.89) + (end 6.35 -8.89) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "T41_DualClock_Daughter_1_1" + (pin input line + (at -10.16 6.35 0) + (length 2.54) + (name "CLK4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 3.81 0) + (length 2.54) + (name "CLK5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 1.27 0) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -1.27 0) + (length 2.54) + (name "CLK6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -3.81 -11.43 90) + (length 2.54) + (name "SCL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -1.27 -11.43 90) + (length 2.54) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 1.27 -11.43 90) + (length 2.54) + (name "3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 3.81 -11.43 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 8.89 6.35 180) + (length 2.54) + (name "CLK0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 8.89 3.81 180) + (length 2.54) + (name "CLK1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 8.89 1.27 180) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 8.89 -1.27 180) + (length 2.54) + (name "N/C" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Transformer:ADT1-1" + (pin_names + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "TR" + (at 0 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ADT1-1" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "RF_Mini-Circuits:Mini-Circuits_CD542_H2.84mm" + (at 0 -8.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.minicircuits.com/pdfs/ADT1-1+.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "0.15-400MHz 1:1 RF Transformer, Balanced to Balanced, CD542" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Mini-Circuits RF Transformer" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Mini?Circuits*CD542*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "ADT1-1_0_1" + (polyline + (pts + (xy -2.54 5.08) (xy -1.524 5.08) (xy -1.524 3.048) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -1.524 3.048) + (mid -0.7653 2.286) + (end -1.524 1.524) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -1.524 1.524) + (mid -0.7653 0.762) + (end -1.524 0) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -1.524 0) + (mid -0.7653 -0.762) + (end -1.524 -1.524) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -1.524 -1.524) + (mid -0.7653 -2.286) + (end -1.524 -3.048) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.524 -3.048) (xy -1.524 -5.08) (xy -2.54 -5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.524 3.048) (xy 1.524 5.08) (xy 2.54 5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.524 1.524) + (mid 0.7653 2.286) + (end 1.524 3.048) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.524 0) + (mid 0.7653 0.762) + (end 1.524 1.524) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.524 -1.524) + (mid 0.7653 -0.762) + (end 1.524 0) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.524 -3.048) + (mid 0.7653 -2.286) + (end 1.524 -1.524) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 -5.08) (xy 1.524 -5.08) (xy 1.524 -3.048) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "ADT1-1_1_1" + (pin passive line + (at -5.08 5.08 0) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 5.08 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -5.08 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Transformer:ADT2-1T" + (pin_names + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "TR" + (at 0 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ADT2-1T" + (at 0 -6.985 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "RF_Mini-Circuits:Mini-Circuits_CD542_H2.84mm" + (at 0 -8.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.minicircuits.com/pdfs/ADT2-1T+.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "0.40-450MHz 1:2 RF Transformer, Unbalanced to Balanced Center Tap, CD542" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Mini-Circuits RF Transformer" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Mini?Circuits*CD542*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "ADT2-1T_0_1" + (circle + (center -3.81 3.81) + (radius 0.635) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy -2.54 5.08) (xy -1.524 5.08) (xy -1.524 3.048) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -1.524 3.048) + (mid -0.7653 2.286) + (end -1.524 1.524) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -1.524 1.524) + (mid -0.7653 0.762) + (end -1.524 0) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -1.524 0) + (mid -0.7653 -0.762) + (end -1.524 -1.524) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -1.524 -1.524) + (mid -0.7653 -2.286) + (end -1.524 -3.048) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.524 -3.048) (xy -1.524 -5.08) (xy -2.54 -5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.524 3.048) (xy 1.524 5.08) (xy 2.54 5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.524 1.524) + (mid 0.7653 2.286) + (end 1.524 3.048) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.524 0) + (mid 0.7653 0.762) + (end 1.524 1.524) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.524 -1.524) + (mid 0.7653 -0.762) + (end 1.524 0) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.524 -3.048) + (mid 0.7653 -2.286) + (end 1.524 -1.524) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 0) (xy 1.27 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 -5.08) (xy 1.524 -5.08) (xy 1.524 -3.048) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 3.81 3.81) + (radius 0.635) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "ADT2-1T_1_1" + (pin passive line + (at -5.08 5.08 0) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin no_connect line + (at -2.54 0 0) + (length 2.54) + (hide yes) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 5.08 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 0 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -5.08 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Transistor_FET:BS170" + (pin_names + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" + (at 5.08 1.905 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "BS170" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" + (at 5.08 -1.905 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BS170-D.PDF" + (at 5.08 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "0.5A Id, 60V Vds, N-Channel MOSFET, TO-92" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "N-Channel MOSFET" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?92*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "BS170_0_1" + (polyline + (pts + (xy 0.254 1.905) (xy 0.254 -1.905) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.254 0) (xy -2.54 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 2.286) (xy 0.762 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 0.508) (xy 0.762 -0.508) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 -1.27) (xy 0.762 -2.286) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 -1.778) (xy 3.302 -1.778) (xy 3.302 1.778) (xy 0.762 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.016 0) (xy 2.032 0.381) (xy 2.032 -0.381) (xy 1.016 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center 1.651 0) + (radius 2.794) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 2.54) (xy 2.54 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 2.54 1.778) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center 2.54 -1.778) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 2.54 -2.54) (xy 2.54 0) (xy 0.762 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.794 0.508) (xy 2.921 0.381) (xy 3.683 0.381) (xy 3.81 0.254) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 3.302 0.381) (xy 2.921 -0.254) (xy 3.683 -0.254) (xy 3.302 0.381) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "BS170_1_1" + (pin input line + (at -5.08 0 0) + (length 2.54) + (name "G" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 5.08 270) + (length 2.54) + (name "D" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 -5.08 90) + (length 2.54) + (name "S" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+12P" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR01" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12P" + (at 0 4.1331 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+12P\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+12P_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+12P_1_1" + (pin power_out line + (at 0 0 90) + (length 0) + (hide yes) + (name "+12P" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+12V" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+12V\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+12V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+12V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (hide yes) + (name "+12V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+3V3" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3V3\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+3V3_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+3V3_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (hide yes) + (name "+3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+5V" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+5V\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+5V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+5V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (hide yes) + (name "+5V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:GND" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "GND_1_1" + (pin power_in line + (at 0 0 270) + (length 0) + (hide yes) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + ) + (text "RF output" + (exclude_from_sim no) + (at 27.178 198.628 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "031b19c7-f55d-41ff-b2be-6264dc2317fa") + ) + (text "RF input from\nfilter board" + (exclude_from_sim no) + (at 19.304 96.774 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "10515d9c-97bd-4441-bb6f-f8a7492ac8ff") + ) + (text "Amplifier \nbiasing" + (exclude_from_sim no) + (at 158.75 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "15245d86-9b99-427b-b4a9-224f0dd37e94") + ) + (text "IQ out to \nmain board\nRing - Q\nTip - I" + (exclude_from_sim no) + (at 394.97 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3210d3f4-fc6c-4282-9091-35516b10ac05") + ) + (text "CW Mode" + (exclude_from_sim no) + (at 165.1 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "3ec9a43b-1f03-45a1-b375-ad34d73bc17c") + ) + (text "R73 stacked \non top of C73" + (exclude_from_sim no) + (at 168.91 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "4017eba2-9a4d-4511-814a-a8fc2b3e3030") + ) + (text "10T" + (exclude_from_sim no) + (at 60.96 99.06 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "550da594-2a26-4546-8a4b-f0d2b412b343") + ) + (text "RF RECEIVE CHAIN ->" + (exclude_from_sim no) + (at 186.69 20.32 0) + (effects + (font + (size 5 5) + (bold yes) + ) + (justify left bottom) + ) + (uuid "5e25ad68-3ebe-4fcc-a1df-4498b987f797") + ) + (text "Select 5V if needed for large \nsignal operation." + (exclude_from_sim no) + (at 171.45 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7b2f77cd-7952-48f6-be66-55556ab8f6fc") + ) + (text "ADDRESS\nSELECT" + (exclude_from_sim no) + (at 35.56 132.08 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "8adc0f8f-7728-49c5-a834-1d79b0c57bd5") + ) + (text "Tx On/Off: High = Tx on" + (exclude_from_sim no) + (at 269.24 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "bc2b3d92-10db-4bd5-a85b-a4719b7eda70") + ) + (text "SSB Mode" + (exclude_from_sim no) + (at 166.37 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "bdfea11d-eaf9-4f20-85ee-f718b8348de0") + ) + (text "IQ in from \nmain board\nRing - Q\nTip - I" + (exclude_from_sim no) + (at 403.86 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "cec5c257-0a1d-4245-ad22-820106243467") + ) + (text "MiniCircuits ADT2-1T+" + (exclude_from_sim no) + (at 207.01 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "e5e064e8-b689-4236-80f0-c23fba90282f") + ) + (text "MiniCircuits ADT1-1+" + (exclude_from_sim no) + (at 46.99 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "f06c0705-08d4-4d88-aa87-22a5da70c18c") + ) + (text "10T" + (exclude_from_sim no) + (at 49.53 99.06 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "f1a62925-d76f-4e2d-af12-8efeb7156765") + ) + (text "<- RF TRANSMIT CHAIN" + (exclude_from_sim no) + (at 119.38 272.796 0) + (effects + (font + (size 5 5) + (bold yes) + ) + (justify right bottom) + ) + (uuid "fdbcd8f4-3a51-48d9-8697-6fb4dc5c5e94") + ) + (text_box "RF control breakout" + (exclude_from_sim no) + (at 107.95 121.92 0) + (size 68.58 59.69) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left top) + ) + (uuid "0494d2ca-87ad-4721-91a1-22489fd2db57") + ) + (text_box "Auto calibrate switch" + (exclude_from_sim no) + (at 80.01 200.66 0) + (size -53.34 52.07) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify right top) + ) + (uuid "1ae34b8c-0eee-46f9-bda3-f7945c98cdc8") + ) + (text_box "Power supply" + (exclude_from_sim no) + (at 12.7 12.7 0) + (size 119.38 46.99) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left top) + ) + (uuid "1c91b0aa-6cab-42bb-8d4b-b473970c48c9") + ) + (text_box "Mode select" + (exclude_from_sim no) + (at 123.19 184.15 0) + (size 55.88 54.61) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left top) + ) + (uuid "2b121266-0879-4ee6-b087-57d1b5cf8595") + ) + (text_box "Inverting and phasing op-amps" + (exclude_from_sim no) + (at 392.43 151.13 0) + (size -116.84 99.06) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify right top) + ) + (uuid "304d42e8-28b9-4d6f-b430-1fcd4d11bd83") + ) + (text_box "Transmit RF gain control" + (exclude_from_sim no) + (at 80.01 201.93 0) + (size 43.18 34.29) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify right top) + ) + (uuid "44f1cc8b-6df6-4c81-87c2-0e2a984131e6") + ) + (text_box "Input RF amplifier" + (exclude_from_sim no) + (at 128.27 71.12 0) + (size 30.48 50.8) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left top) + ) + (uuid "525764c5-3442-481c-8f80-592a094bd304") + ) + (text_box "Low-pass 200 kHz Anti-aliasing Filter" + (exclude_from_sim no) + (at 300.99 20.32 0) + (size 78.74 101.6) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left top) + ) + (uuid "5d9ccf1a-1086-4ac3-b2a1-eb76e042b9a0") + ) + (text_box "Summing transformer" + (exclude_from_sim no) + (at 179.07 210.82 0) + (size 46.99 68.58) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left top) + ) + (uuid "67da0485-d802-4e9e-a1c5-125851e668cb") + ) + (text_box "I2C options control" + (exclude_from_sim no) + (at 27.94 114.3 0) + (size 80.01 67.31) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left top) + ) + (uuid "6d75db5d-e148-4b22-8515-4c93e4a0906e") + ) + (text_box "RxTx: HIGH = Tx on\nX Mode:\n HIGH = SSB\n LOW = CW\nCW: H = on, L = off" + (exclude_from_sim no) + (at 137.16 162.56 0) + (size 25.4 11.43) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + (uuid "8a160ad4-e6d4-429c-86a7-eec847621646") + ) + (text_box "Quadrature sampling exciter" + (exclude_from_sim no) + (at 275.59 151.13 0) + (size -49.53 99.06) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify right top) + ) + (uuid "937aa864-57d8-4fdc-8356-878c8666801b") + ) + (text_box "Quadrature Sampling Detector" + (exclude_from_sim no) + (at 158.75 20.32 0) + (size 142.24 101.6) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left top) + ) + (uuid "aef8ce6a-ddb5-4951-bc88-5228a591ae34") + ) + (text_box "Receive RF gain control" + (exclude_from_sim no) + (at 77.47 59.69 0) + (size 50.8 54.61) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify right top) + ) + (uuid "c384568c-c3b4-4a7a-9cea-9c71e432b802") + ) + (text_box "Misc. holes" + (exclude_from_sim no) + (at 133.35 29.21 0) + (size 24.13 40.64) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left top) + ) + (uuid "c8731b5d-fc07-469e-9c9f-77c63a7b9c01") + ) + (text_box "CW envelope shaping" + (exclude_from_sim no) + (at 179.07 238.76 0) + (size -55.88 40.64) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify right bottom) + ) + (uuid "f1d7ea5d-783a-496a-bb43-3b9c0d2f52cc") + ) + (text_box "Board mounting holes" + (exclude_from_sim no) + (at 133.35 12.7 0) + (size 24.13 16.51) + (margins 0.9525 0.9525 0.9525 0.9525) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left top) + ) + (uuid "f8dff638-d9c8-4d77-a669-507378d79194") + ) + (junction + (at 153.67 264.16) + (diameter 0) + (color 0 0 0 0) + (uuid "01063aa6-6693-4fd9-b107-7be92ca88bad") + ) + (junction + (at 322.58 92.71) + (diameter 0) + (color 0 0 0 0) + (uuid "0373bdaf-e5c9-4ba7-a87c-2091ff22b5a1") + ) + (junction + (at 290.83 175.26) + (diameter 0) + (color 0 0 0 0) + (uuid "03872264-7a71-4efb-a2cb-80ebd5d35899") + ) + (junction + (at 281.94 96.52) + (diameter 0) + (color 0 0 0 0) + (uuid "048017ee-18ff-4eda-a7d8-c04b9aac9188") + ) + (junction + (at 290.83 210.82) + (diameter 0) + (color 0 0 0 0) + (uuid "048020bf-d31d-498c-b3d0-b01f0531466b") + ) + (junction + (at 389.89 175.26) + (diameter 0) + (color 0 0 0 0) + (uuid "0537966d-7975-454e-bbd8-6829d1deb10b") + ) + (junction + (at 281.94 194.31) + (diameter 0) + (color 0 0 0 0) + (uuid "06e650b0-955f-4ebf-81c3-4fa71a9b03c5") + ) + (junction + (at 185.42 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "071434ac-ce92-41c2-bccd-95bbaa42feb7") + ) + (junction + (at 243.84 172.72) + (diameter 0) + (color 0 0 0 0) + (uuid "0765f964-4187-4585-b56c-1ac68c51316a") + ) + (junction + (at 347.98 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "086f2090-8296-4b12-b991-c3705658f413") + ) + (junction + (at 356.87 175.26) + (diameter 0) + (color 0 0 0 0) + (uuid "0b88acd3-220d-408f-8f3f-d03e8235fe42") + ) + (junction + (at 138.43 257.81) + (diameter 0) + (color 0 0 0 0) + (uuid "0e1e2ccb-b64a-4700-8cf9-d37dcbe62033") + ) + (junction + (at 281.94 210.82) + (diameter 0) + (color 0 0 0 0) + (uuid "0f85c6af-3f1a-4db8-81e3-0f93725abfbc") + ) + (junction + (at 256.54 234.95) + (diameter 0) + (color 0 0 0 0) + (uuid "10123975-4876-4b23-a5f8-e8f88aca7e6e") + ) + (junction + (at 271.78 180.34) + (diameter 0) + (color 0 0 0 0) + (uuid "110424cf-dca6-4ece-980d-0772e8cd339f") + ) + (junction + (at 34.29 45.72) + (diameter 0) + (color 0 0 0 0) + (uuid "11792bda-e0e2-4832-b410-669170592d42") + ) + (junction + (at 340.36 172.72) + (diameter 0) + (color 0 0 0 0) + (uuid "15321b25-061c-4a03-8054-07705184b068") + ) + (junction + (at 168.91 97.79) + (diameter 0) + (color 0 0 0 0) + (uuid "17e47df1-3aae-45fc-affa-9e28487ae3a7") + ) + (junction + (at 355.6 205.74) + (diameter 0) + (color 0 0 0 0) + (uuid "17fbc50c-db1c-4d17-b907-f1e467045892") + ) + (junction + (at 36.83 161.29) + (diameter 0) + (color 0 0 0 0) + (uuid "18998907-ef1f-4b40-b208-88a3510f0d85") + ) + (junction + (at 279.4 92.71) + (diameter 0) + (color 0 0 0 0) + (uuid "1aa95ca0-50e5-4024-901e-a554429c63d5") + ) + (junction + (at 226.06 95.25) + (diameter 0) + (color 0 0 0 0) + (uuid "1acafb46-b66c-4696-b0a0-0c2b411edfba") + ) + (junction + (at 368.3 205.74) + (diameter 0) + (color 0 0 0 0) + (uuid "1c55d127-9a39-4b78-a206-3ded9e8beed9") + ) + (junction + (at 35.56 146.05) + (diameter 0) + (color 0 0 0 0) + (uuid "1c6049f0-c9eb-4c78-abcb-8adcbda96341") + ) + (junction + (at 191.77 81.28) + (diameter 0) + (color 0 0 0 0) + (uuid "1e06e18c-4e73-412f-a614-29cbed11429e") + ) + (junction + (at 322.58 77.47) + (diameter 0) + (color 0 0 0 0) + (uuid "20fb593a-f94f-47d1-9585-2ed71c1e2ab3") + ) + (junction + (at 142.24 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "226281b7-684b-4201-88e8-bfb7139e7095") + ) + (junction + (at 278.13 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "240471e6-9c6d-4afa-832a-cb68d105e76e") + ) + (junction + (at 160.02 259.08) + (diameter 0) + (color 0 0 0 0) + (uuid "24aac518-36ae-4752-ac89-37c9a05ee92c") + ) + (junction + (at 313.69 210.82) + (diameter 0) + (color 0 0 0 0) + (uuid "26add3b2-b437-40ff-8dae-3b3f5e790167") + ) + (junction + (at 177.8 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "27657a07-8632-4dd4-a64e-cb07bf01f96a") + ) + (junction + (at 73.66 31.75) + (diameter 0) + (color 0 0 0 0) + (uuid "2777e675-08bd-4396-92c9-3ea6f6abc8c9") + ) + (junction + (at 220.98 81.28) + (diameter 0) + (color 0 0 0 0) + (uuid "27b1458a-399d-4961-91af-15d3bfcb2a75") + ) + (junction + (at 147.32 81.28) + (diameter 0) + (color 0 0 0 0) + (uuid "283395d1-2fc4-494d-b2d9-040887ad4b08") + ) + (junction + (at 346.71 231.14) + (diameter 0) + (color 0 0 0 0) + (uuid "28a7650e-0688-4363-ba60-28a0d39a8af0") + ) + (junction + (at 80.01 53.34) + (diameter 0) + (color 0 0 0 0) + (uuid "29021509-fd53-44c0-9962-0f2ab58f27ae") + ) + (junction + (at 207.01 73.66) + (diameter 0) + (color 0 0 0 0) + (uuid "299ddf59-1bbc-4688-82b8-efb7a64e3cea") + ) + (junction + (at 287.02 83.82) + (diameter 0) + (color 0 0 0 0) + (uuid "2b516f2d-469c-4634-b81e-a58b577ec3ec") + ) + (junction + (at 179.07 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "2db47d9b-b374-4103-b4ac-6f4608c0f4c2") + ) + (junction + (at 281.94 105.41) + (diameter 0) + (color 0 0 0 0) + (uuid "2fee614e-ecec-4682-bde3-ee3f0d782f8d") + ) + (junction + (at 57.15 170.18) + (diameter 0) + (color 0 0 0 0) + (uuid "34a7f89e-ac9a-4c27-b55a-86d4a9e8a5ea") + ) + (junction + (at 309.88 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "39c6c1f5-fe93-4c0f-837d-541059fda878") + ) + (junction + (at 223.52 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "3a17f246-9c64-4c77-8733-bdcc517f5dbb") + ) + (junction + (at 313.69 231.14) + (diameter 0) + (color 0 0 0 0) + (uuid "3a5c8523-3cbd-4e0f-925d-aeb9704d349e") + ) + (junction + (at 266.7 194.31) + (diameter 0) + (color 0 0 0 0) + (uuid "3abaebd7-a14a-4f9a-aed1-b6c04bb05375") + ) + (junction + (at 138.43 137.16) + (diameter 0) + (color 0 0 0 0) + (uuid "3c03bb1b-6318-48da-956f-f7f4433aa7e6") + ) + (junction + (at 35.56 140.97) + (diameter 0) + (color 0 0 0 0) + (uuid "3c5c160c-0e3d-4571-9cdb-094e700a5937") + ) + (junction + (at 16.51 24.13) + (diameter 0) + (color 0 0 0 0) + (uuid "3d0055fb-4bb5-48c9-8067-743cad7d7323") + ) + (junction + (at 356.87 210.82) + (diameter 0) + (color 0 0 0 0) + (uuid "3d8e08e5-9a38-4074-97b8-d7cb7b3dbabb") + ) + (junction + (at 340.36 243.84) + (diameter 0) + (color 0 0 0 0) + (uuid "3d905acd-1188-4e7b-9461-488a7c1ebde4") + ) + (junction + (at 251.46 41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "3e535f69-7abc-46dc-89c1-f908142ff225") + ) + (junction + (at 341.63 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "413ed92d-a981-4644-b076-92774d246746") + ) + (junction + (at 247.65 245.11) + (diameter 0) + (color 0 0 0 0) + (uuid "43457222-0f82-4892-9530-dd123f2cca50") + ) + (junction + (at 34.29 24.13) + (diameter 0) + (color 0 0 0 0) + (uuid "4355bfe9-1890-4316-9841-027ca797c712") + ) + (junction + (at 280.67 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "4699cabd-6c6d-4eb0-be9e-cddc578d4b98") + ) + (junction + (at 243.84 165.1) + (diameter 0) + (color 0 0 0 0) + (uuid "49aaca96-90d5-4085-950e-a6019b8edd79") + ) + (junction + (at 281.94 175.26) + (diameter 0) + (color 0 0 0 0) + (uuid "4a20ae6d-ae92-46ea-9929-54a957bf89d8") + ) + (junction + (at 355.6 236.22) + (diameter 0) + (color 0 0 0 0) + (uuid "4a81aea4-1a92-4b62-8e6f-93953bb415ae") + ) + (junction + (at 342.9 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "4b713454-f6b8-4fce-8740-812a12506493") + ) + (junction + (at 66.04 248.92) + (diameter 0) + (color 0 0 0 0) + (uuid "4b8930b4-0fb9-482f-8418-82be296c12d2") + ) + (junction + (at 73.66 53.34) + (diameter 0) + (color 0 0 0 0) + (uuid "4b8bf84e-385f-4d06-a486-7b0af18178be") + ) + (junction + (at 328.93 172.72) + (diameter 0) + (color 0 0 0 0) + (uuid "4c1d48d0-f507-41a0-ae36-ac964f2d0999") + ) + (junction + (at 142.24 55.88) + (diameter 0) + (color 0 0 0 0) + (uuid "5ba0ed9e-a461-4dd9-9a62-46bfb0e708e1") + ) + (junction + (at 234.95 180.34) + (diameter 0) + (color 0 0 0 0) + (uuid "5ec73f01-2f7a-493e-804d-94083a873df3") + ) + (junction + (at 138.43 259.08) + (diameter 0) + (color 0 0 0 0) + (uuid "64495609-e1cc-4f57-bc14-13756fb75b67") + ) + (junction + (at 340.36 208.28) + (diameter 0) + (color 0 0 0 0) + (uuid "64e79ae6-14dd-4081-8555-78ada794d410") + ) + (junction + (at 284.48 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "656fad18-b89b-4a9b-812e-e6a96bc32ba5") + ) + (junction + (at 261.62 95.25) + (diameter 0) + (color 0 0 0 0) + (uuid "65c5176e-846c-49e9-8acc-1aaf5055b821") + ) + (junction + (at 297.18 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "66c7e4bb-ee28-434b-9b73-0db993771c29") + ) + (junction + (at 36.83 24.13) + (diameter 0) + (color 0 0 0 0) + (uuid "679850da-4357-4857-8b35-0fa6f3e8020e") + ) + (junction + (at 336.55 243.84) + (diameter 0) + (color 0 0 0 0) + (uuid "68c9de10-d95c-42f8-ae86-f66f256bc592") + ) + (junction + (at 383.54 232.41) + (diameter 0) + (color 0 0 0 0) + (uuid "696ce8e1-26b9-4ab8-9cb5-ffefdd5abf48") + ) + (junction + (at 328.93 208.28) + (diameter 0) + (color 0 0 0 0) + (uuid "6a9a6fb7-4182-4af2-b944-546df19626db") + ) + (junction + (at 262.89 41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "71055a2f-650c-4897-ade6-d58c9c441a73") + ) + (junction + (at 341.63 41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "72719985-c3d5-45bc-a3df-752743b01397") + ) + (junction + (at 248.92 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "74c7992e-7f91-4cfe-88d6-d0fd070e93c8") + ) + (junction + (at 194.31 71.12) + (diameter 0) + (color 0 0 0 0) + (uuid "756298cd-3b30-4048-a19e-0772ac8fc2c1") + ) + (junction + (at 147.32 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "76b2aa19-b190-41b4-beac-4ace6f8be112") + ) + (junction + (at 322.58 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "770fd83f-de8b-4f72-bf7f-ad54bdc481da") + ) + (junction + (at 389.89 193.04) + (diameter 0) + (color 0 0 0 0) + (uuid "799635e5-6068-4a16-895d-fcb7d824ec1f") + ) + (junction + (at 44.45 45.72) + (diameter 0) + (color 0 0 0 0) + (uuid "7a5fa5fd-9aa1-4d87-882c-ee50ed3c36b7") + ) + (junction + (at 356.87 177.8) + (diameter 0) + (color 0 0 0 0) + (uuid "7ab2dfc4-c049-422a-b27c-9e68ee91b47c") + ) + (junction + (at 55.88 167.64) + (diameter 0) + (color 0 0 0 0) + (uuid "7c1fd0d0-1d7c-4bd1-a580-030cc133dae6") + ) + (junction + (at 217.17 270.51) + (diameter 0) + (color 0 0 0 0) + (uuid "7c2ea4ca-6832-4098-b801-93c635aca2e5") + ) + (junction + (at 36.83 167.64) + (diameter 0) + (color 0 0 0 0) + (uuid "7d266659-133e-4786-8d8a-84757c44e8ca") + ) + (junction + (at 313.69 175.26) + (diameter 0) + (color 0 0 0 0) + (uuid "7daba775-9a2b-4550-bfc6-b620038759a4") + ) + (junction + (at 340.36 198.12) + (diameter 0) + (color 0 0 0 0) + (uuid "7f0c078d-1acf-4b9d-a3da-cdc69341feab") + ) + (junction + (at 214.63 220.98) + (diameter 0) + (color 0 0 0 0) + (uuid "81d0f8b5-e4f4-4efe-a348-2b7adc7d9862") + ) + (junction + (at 281.94 158.75) + (diameter 0) + (color 0 0 0 0) + (uuid "82df764d-e9f5-4379-913e-e1f8ac31fed4") + ) + (junction + (at 290.83 194.31) + (diameter 0) + (color 0 0 0 0) + (uuid "830d0b8d-8328-4548-a5ef-9af5cefec5a0") + ) + (junction + (at 160.02 273.05) + (diameter 0) + (color 0 0 0 0) + (uuid "836c9765-434a-4c90-bbd6-c19979f2f64a") + ) + (junction + (at 340.36 194.31) + (diameter 0) + (color 0 0 0 0) + (uuid "83911430-3dfb-42b8-885a-421afa80f16d") + ) + (junction + (at 153.67 273.05) + (diameter 0) + (color 0 0 0 0) + (uuid "85c4e79a-694e-4b4c-b2d1-536a71e7d332") + ) + (junction + (at 191.77 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "86ceff7c-efd3-430d-bb34-2db67a596e53") + ) + (junction + (at 133.35 273.05) + (diameter 0) + (color 0 0 0 0) + (uuid "87ff8e34-04ec-440e-9113-c14163430757") + ) + (junction + (at 115.57 45.72) + (diameter 0) + (color 0 0 0 0) + (uuid "8adfcc33-0f3e-49df-a554-40246d890724") + ) + (junction + (at 250.19 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "8c69767c-568a-44ff-bab0-cd220cf44620") + ) + (junction + (at 368.3 170.18) + (diameter 0) + (color 0 0 0 0) + (uuid "8cd7d867-ebc6-439f-9f61-e04a5833ff62") + ) + (junction + (at 248.92 46.99) + (diameter 0) + (color 0 0 0 0) + (uuid "8d7652f7-dfca-404e-a0e0-03a91eabc93d") + ) + (junction + (at 309.88 92.71) + (diameter 0) + (color 0 0 0 0) + (uuid "8dfe4106-ebee-4519-a9f3-88b1d265d4ab") + ) + (junction + (at 73.66 45.72) + (diameter 0) + (color 0 0 0 0) + (uuid "8e3ccf5e-3272-4e80-a8c9-778ed5501597") + ) + (junction + (at 168.91 226.06) + (diameter 0) + (color 0 0 0 0) + (uuid "9058a99e-b61c-4664-89f3-55f84c4fe93f") + ) + (junction + (at 146.05 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "98d273a6-358d-470a-b6f4-436ec8764499") + ) + (junction + (at 354.33 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "9c71c7a3-3518-4505-965e-e8cec0969f01") + ) + (junction + (at 290.83 158.75) + (diameter 0) + (color 0 0 0 0) + (uuid "9db57ec1-3c1a-4732-9ef3-7787d88adbfd") + ) + (junction + (at 177.8 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "a1f52ea2-7dde-4dbf-b863-5e0abdd30166") + ) + (junction + (at 248.92 95.25) + (diameter 0) + (color 0 0 0 0) + (uuid "a26cf61e-3e9c-4c28-98e8-b4ac542ba56e") + ) + (junction + (at 322.58 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "a2c1f81b-702d-42b7-830d-ccf5b65451d9") + ) + (junction + (at 288.29 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "a574818b-78b1-4133-9a02-278d805cc8d7") + ) + (junction + (at 200.66 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "a5892772-3b9a-49a9-b36d-320304aa531c") + ) + (junction + (at 368.3 182.88) + (diameter 0) + (color 0 0 0 0) + (uuid "a763bcb9-4d76-4922-b74d-2c8b180d0c6a") + ) + (junction + (at 140.97 81.28) + (diameter 0) + (color 0 0 0 0) + (uuid "a84b8d31-7e60-426e-806f-4e28787753e7") + ) + (junction + (at 157.48 199.39) + (diameter 0) + (color 0 0 0 0) + (uuid "a9b250aa-f70c-4a81-abe4-7818cebade76") + ) + (junction + (at 262.89 46.99) + (diameter 0) + (color 0 0 0 0) + (uuid "a9cb3147-ec2d-4e78-91ed-6876490a1c36") + ) + (junction + (at 91.44 24.13) + (diameter 0) + (color 0 0 0 0) + (uuid "ac11f944-2b90-4033-a7b7-aa8467c164c5") + ) + (junction + (at 139.7 55.88) + (diameter 0) + (color 0 0 0 0) + (uuid "ad2ec9b6-3824-4c78-8533-75e7059717f5") + ) + (junction + (at 341.63 213.36) + (diameter 0) + (color 0 0 0 0) + (uuid "ad8d09eb-b4bd-46d1-bbeb-564154929060") + ) + (junction + (at 355.6 243.84) + (diameter 0) + (color 0 0 0 0) + (uuid "af38bda4-54e6-48d9-af66-07c4241bfe4f") + ) + (junction + (at 269.24 200.66) + (diameter 0) + (color 0 0 0 0) + (uuid "b1857c19-8d76-4656-a19b-e2f1b8703e7f") + ) + (junction + (at 368.3 218.44) + (diameter 0) + (color 0 0 0 0) + (uuid "b40c02be-559f-46d1-88ee-2d6781ef8477") + ) + (junction + (at 73.66 24.13) + (diameter 0) + (color 0 0 0 0) + (uuid "b759e0f5-ff9f-4610-871f-58d29b9ba9c3") + ) + (junction + (at 370.84 232.41) + (diameter 0) + (color 0 0 0 0) + (uuid "b8dcc04a-5acb-47c9-a46c-92ce04a072db") + ) + (junction + (at 251.46 234.95) + (diameter 0) + (color 0 0 0 0) + (uuid "b9626a11-b756-4e47-924f-2cbdb8035ef4") + ) + (junction + (at 341.63 231.14) + (diameter 0) + (color 0 0 0 0) + (uuid "badb857f-217b-4892-97c8-f2b605a46bed") + ) + (junction + (at 298.45 234.95) + (diameter 0) + (color 0 0 0 0) + (uuid "be67258f-1b15-45b9-bacb-edbfa33a9b4f") + ) + (junction + (at 248.92 41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "bfe5a80e-2136-4e7e-a47a-b1ffe2fb05c8") + ) + (junction + (at 86.36 220.98) + (diameter 0) + (color 0 0 0 0) + (uuid "c06596cb-e5e1-4c69-b384-db52f299c54a") + ) + (junction + (at 351.79 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "c2c97f7e-4efe-46e7-a2ba-26488ff8c06b") + ) + (junction + (at 356.87 170.18) + (diameter 0) + (color 0 0 0 0) + (uuid "c348fccd-d23d-4eb4-a212-ed51a6b8b185") + ) + (junction + (at 370.84 236.22) + (diameter 0) + (color 0 0 0 0) + (uuid "c6872926-27f6-4218-b172-cd944245843c") + ) + (junction + (at 365.76 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "c6e688d9-5475-42be-afc2-45fee02ea371") + ) + (junction + (at 160.02 266.7) + (diameter 0) + (color 0 0 0 0) + (uuid "c6e8d226-bb25-49d2-a059-e69ad07b5554") + ) + (junction + (at 83.82 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "c729e9f5-d0e5-4e3f-a745-bcc0b902c307") + ) + (junction + (at 209.55 270.51) + (diameter 0) + (color 0 0 0 0) + (uuid "ca44c3c7-e666-4b3f-bc0e-9b698619b873") + ) + (junction + (at 76.2 118.11) + (diameter 0) + (color 0 0 0 0) + (uuid "ca498fbc-9f1a-451f-8d61-06759d487709") + ) + (junction + (at 242.57 228.6) + (diameter 0) + (color 0 0 0 0) + (uuid "ce2ed814-683d-4317-be70-feae92f63d40") + ) + (junction + (at 281.94 114.3) + (diameter 0) + (color 0 0 0 0) + (uuid "ceaf7640-4201-435f-8785-324cddc44461") + ) + (junction + (at 242.57 245.11) + (diameter 0) + (color 0 0 0 0) + (uuid "cf5ac0d0-8e22-4057-ad66-39faf9e02098") + ) + (junction + (at 138.43 24.13) + (diameter 0) + (color 0 0 0 0) + (uuid "d2101ab8-d83c-4d6f-9b35-118376df4f76") + ) + (junction + (at 157.48 148.59) + (diameter 0) + (color 0 0 0 0) + (uuid "d36c9937-431b-4d53-8bf0-e1ea49d2631e") + ) + (junction + (at 54.61 165.1) + (diameter 0) + (color 0 0 0 0) + (uuid "d4bd8c50-0df7-49cb-8490-6b29dbdc0b4b") + ) + (junction + (at 237.49 228.6) + (diameter 0) + (color 0 0 0 0) + (uuid "d550906d-68e8-439c-986a-4f68426534ba") + ) + (junction + (at 130.81 250.19) + (diameter 0) + (color 0 0 0 0) + (uuid "d593513a-5ead-422a-b5d9-94081be98290") + ) + (junction + (at 313.69 234.95) + (diameter 0) + (color 0 0 0 0) + (uuid "d8678e8d-0fb3-4524-bd1d-97dccf260379") + ) + (junction + (at 135.89 111.76) + (diameter 0) + (color 0 0 0 0) + (uuid "d8bac1e0-ed66-4fda-aabb-632b6613b4b0") + ) + (junction + (at 140.97 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "da68f121-a460-412b-b394-991bb0af25c7") + ) + (junction + (at 160.02 255.27) + (diameter 0) + (color 0 0 0 0) + (uuid "db4ee334-6f43-4e80-a4a2-29e9999bc207") + ) + (junction + (at 251.46 245.11) + (diameter 0) + (color 0 0 0 0) + (uuid "db53ee0d-58ba-4d52-8bea-c1f70c045cdd") + ) + (junction + (at 340.36 162.56) + (diameter 0) + (color 0 0 0 0) + (uuid "dc8e712b-9080-409c-89c5-a114c14f1b2e") + ) + (junction + (at 91.44 45.72) + (diameter 0) + (color 0 0 0 0) + (uuid "def83167-1728-492d-a792-65f5c6dfed2a") + ) + (junction + (at 138.43 111.76) + (diameter 0) + (color 0 0 0 0) + (uuid "e0966d2d-2009-4d43-a7a7-cffdf99b039e") + ) + (junction + (at 44.45 53.34) + (diameter 0) + (color 0 0 0 0) + (uuid "e14f62cf-2531-404b-9ef9-fb0c82444f28") + ) + (junction + (at 261.62 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "e25afd58-33d4-44ff-a8c1-8296d45a318f") + ) + (junction + (at 217.17 261.62) + (diameter 0) + (color 0 0 0 0) + (uuid "e3598704-970d-4ebb-88d8-6a102c07de32") + ) + (junction + (at 228.6 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "e3da2186-3def-4160-8e59-cbd2f0f19c63") + ) + (junction + (at 137.16 111.76) + (diameter 0) + (color 0 0 0 0) + (uuid "e40c7cb9-ce73-47b6-bbc9-2168c7cb6600") + ) + (junction + (at 340.36 158.75) + (diameter 0) + (color 0 0 0 0) + (uuid "e6846a08-2aa1-41a5-924f-01c401035c71") + ) + (junction + (at 214.63 231.14) + (diameter 0) + (color 0 0 0 0) + (uuid "e70395ee-3ec2-4e12-b8c8-e936b3da5522") + ) + (junction + (at 340.36 231.14) + (diameter 0) + (color 0 0 0 0) + (uuid "e739a1d3-3293-4ff1-ac79-8553cbb0f47c") + ) + (junction + (at 115.57 24.13) + (diameter 0) + (color 0 0 0 0) + (uuid "e7965570-eff5-4358-8339-4e6f81e6afa3") + ) + (junction + (at 194.31 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "ec5e4175-76c6-48d0-98f4-df6248368286") + ) + (junction + (at 157.48 151.13) + (diameter 0) + (color 0 0 0 0) + (uuid "ed2f32da-86da-4367-b46a-6e6d2f9a355c") + ) + (junction + (at 287.02 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "f1a0080a-b1ff-46c9-a384-5777e315494b") + ) + (junction + (at 33.02 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "f4275241-bed0-4b38-b3f1-e0a028a10882") + ) + (junction + (at 209.55 261.62) + (diameter 0) + (color 0 0 0 0) + (uuid "f634ec82-4856-4248-b66e-6542783a756a") + ) + (junction + (at 248.92 165.1) + (diameter 0) + (color 0 0 0 0) + (uuid "f69b4c7b-1c63-4a47-9041-777c0cfdbb65") + ) + (junction + (at 354.33 41.91) + (diameter 0) + (color 0 0 0 0) + (uuid "f77d542f-9221-4a04-b48b-3e3e7f306803") + ) + (junction + (at 351.79 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "f795f37e-4b86-4c89-86f0-5163efb9f509") + ) + (junction + (at 278.13 57.15) + (diameter 0) + (color 0 0 0 0) + (uuid "f7e4b8dc-bab7-4808-9060-b55591d8287f") + ) + (junction + (at 78.74 31.75) + (diameter 0) + (color 0 0 0 0) + (uuid "f85d0364-e803-4117-b8d5-2b462e491b24") + ) + (junction + (at 264.16 187.96) + (diameter 0) + (color 0 0 0 0) + (uuid "f88e137c-e449-42fa-8995-52ff167f2311") + ) + (junction + (at 168.91 87.63) + (diameter 0) + (color 0 0 0 0) + (uuid "f8e34efc-67f7-4095-aaa6-d84599064aa6") + ) + (junction + (at 285.75 48.26) + (diameter 0) + (color 0 0 0 0) + (uuid "f9c47654-b3d2-41c0-8b25-30a5d61d3bcb") + ) + (junction + (at 234.95 182.88) + (diameter 0) + (color 0 0 0 0) + (uuid "ff161479-7516-4bd2-9664-b279f5a707ac") + ) + (junction + (at 62.23 53.34) + (diameter 0) + (color 0 0 0 0) + (uuid "ff362bcc-2a01-45ba-a240-504191252c9f") + ) + (junction + (at 67.31 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "ffb0fc2e-9bb6-4bf5-af13-f65939bde454") + ) + (no_connect + (at 393.7 190.5) + (uuid "0353eb87-14cd-4712-8f76-a7011d7a47a5") + ) + (no_connect + (at 93.98 144.78) + (uuid "1d37b386-5841-43d2-9551-d49b18b96f4c") + ) + (no_connect + (at 93.98 167.64) + (uuid "210078c3-c9ef-4ba4-9352-3524939fa4f0") + ) + (no_connect + (at 58.42 147.32) + (uuid "2c20692f-dcaf-4d9a-90fd-555b65aa93fc") + ) + (no_connect + (at 195.58 143.51) + (uuid "89a7a28c-d5b0-4c5d-b28d-8fb5b0164908") + ) + (no_connect + (at 393.7 185.42) + (uuid "94220c96-79e4-4dd0-bdec-b1d20e71c7a2") + ) + (no_connect + (at 58.42 144.78) + (uuid "94b9c4a9-a272-4c3d-a05e-e7a0383d7fe4") + ) + (no_connect + (at 393.7 66.04) + (uuid "b263f0fb-77ca-4519-9aee-6389a3c69f16") + ) + (no_connect + (at 93.98 170.18) + (uuid "cc009a51-e416-4f43-b722-03dfe7999d8b") + ) + (no_connect + (at 393.7 71.12) + (uuid "e505bf4c-052d-4f34-a803-22d09cfbdf58") + ) + (no_connect + (at 156.21 156.21) + (uuid "fa059ce6-4e07-4d46-9c0a-6fbcb4c09f18") + ) + (no_connect + (at 93.98 147.32) + (uuid "fb13ed0c-af03-4beb-9d8c-dacb9c38792f") + ) + (wire + (pts + (xy 247.65 90.17) (xy 248.92 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "006a7224-4bd4-4c63-b98c-1886ed74bc19") + ) + (wire + (pts + (xy 342.9 66.04) (xy 342.9 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0096a06c-a31e-4cb5-ade0-bcae12dad58a") + ) + (wire + (pts + (xy 237.49 245.11) (xy 242.57 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "00a5151b-7766-4b46-8c0d-a0d13cdb80df") + ) + (wire + (pts + (xy 139.7 60.96) (xy 142.24 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "01b65bac-a9af-493d-bdb8-ec4cc8b127db") + ) + (wire + (pts + (xy 62.23 233.68) (xy 52.07 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0219796b-9883-43ed-819d-f6d02203592f") + ) + (wire + (pts + (xy 137.16 137.16) (xy 138.43 137.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "025d9743-1c1b-4f54-883c-b9bd06257ee2") + ) + (wire + (pts + (xy 142.24 55.88) (xy 142.24 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "02c35db9-4f17-4e7c-b980-53651ba237a6") + ) + (wire + (pts + (xy 342.9 66.04) (xy 351.79 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "03efc5e9-94af-44c2-8649-38350eba44f6") + ) + (wire + (pts + (xy 209.55 261.62) (xy 203.2 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0432f869-9b2e-4ee2-85d6-b1cab45a8240") + ) + (wire + (pts + (xy 322.58 92.71) (xy 325.12 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "044fbeb5-b321-4bf2-91c4-ce4009509486") + ) + (wire + (pts + (xy 100.33 160.02) (xy 93.98 160.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "04cd1618-937e-48bc-abf4-b7bd00dbf7e3") + ) + (wire + (pts + (xy 77.47 215.9) (xy 92.71 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "04e54bcd-1537-4a35-b50d-3c57141a25b0") + ) + (wire + (pts + (xy 67.31 87.63) (xy 69.85 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0502dd89-54cb-4b47-ab09-0ef705ae7c51") + ) + (wire + (pts + (xy 33.02 102.87) (xy 35.56 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "05c6415f-12dc-41af-ad2f-efb2f322d912") + ) + (wire + (pts + (xy 191.77 81.28) (xy 191.77 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "05d42315-ff22-4f0a-a82f-886f93cfeb19") + ) + (wire + (pts + (xy 33.02 167.64) (xy 36.83 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "06bbea88-427a-4c0d-9b4f-37e1a4be1b7f") + ) + (wire + (pts + (xy 168.91 163.83) (xy 168.91 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "06d427e8-4a26-47da-a973-be17bb992958") + ) + (wire + (pts + (xy 322.58 87.63) (xy 322.58 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "070d8951-1d75-4365-93ec-fdcd8f5acd2e") + ) + (wire + (pts + (xy 318.77 29.21) (xy 322.58 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "07d2aed6-eb1f-4f03-944a-86050a236e25") + ) + (wire + (pts + (xy 289.56 109.22) (xy 289.56 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "08818c20-ca20-47d7-927e-7c4b09fb6e57") + ) + (wire + (pts + (xy 356.87 210.82) (xy 355.6 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "08ec0634-7f5c-4f39-b997-fcaa5812fca0") + ) + (wire + (pts + (xy 237.49 228.6) (xy 234.95 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "098151a9-865e-4f2d-bcd6-8bfaf8d5aec3") + ) + (wire + (pts + (xy 341.63 90.17) (xy 342.9 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "09ea81b5-5cdc-45cc-a482-e99e9a1ae11a") + ) + (wire + (pts + (xy 284.48 83.82) (xy 284.48 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0a4c09cd-1d27-4897-b912-f64adf220df2") + ) + (wire + (pts + (xy 36.83 167.64) (xy 43.18 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0a66c543-0a94-43e1-b0d9-84f590404890") + ) + (wire + (pts + (xy 370.84 223.52) (xy 370.84 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0b108034-79c8-4ad9-b152-d1e16365a977") + ) + (wire + (pts + (xy 290.83 158.75) (xy 281.94 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0bcf8bae-796a-462b-9599-0e94a715479b") + ) + (wire + (pts + (xy 143.51 152.4) (xy 157.48 152.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0befe5c6-4009-40b6-8631-ec2fa74f6155") + ) + (wire + (pts + (xy 281.94 210.82) (xy 281.94 212.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0bf541bb-519e-4634-b07e-8005bb24fa07") + ) + (wire + (pts + (xy 340.36 243.84) (xy 336.55 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0c496ae7-4c77-4fc1-8500-a80d9147c421") + ) + (wire + (pts + (xy 33.02 83.82) (xy 33.02 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0c53c37d-5582-46b0-8e38-99327de9e65a") + ) + (wire + (pts + (xy 261.62 180.34) (xy 271.78 180.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0c8f7c9e-50f9-49f4-844e-14522e66c8ae") + ) + (wire + (pts + (xy 266.7 185.42) (xy 266.7 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0d9eea46-8084-4ad0-aa8a-af14867daf26") + ) + (wire + (pts + (xy 133.35 273.05) (xy 130.81 273.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0e30aeb5-5bdf-4f60-bca8-2dc6ef924cf9") + ) + (wire + (pts + (xy 193.04 130.81) (xy 193.04 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0e8227c0-7b2e-45bd-bd50-8bb9e0ba205e") + ) + (wire + (pts + (xy 147.32 78.74) (xy 147.32 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0ebfb2b9-01f4-437a-9b1e-14e17763ec53") + ) + (wire + (pts + (xy 191.77 101.6) (xy 194.31 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "102e6bc6-2e18-419f-bb56-7352742de593") + ) + (wire + (pts + (xy 66.04 220.98) (xy 62.23 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "10556fa3-462c-4efe-bb7a-aec51fed4dcd") + ) + (wire + (pts + (xy 346.71 223.52) (xy 370.84 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "10c77b1f-dd3e-44c0-860c-64dbc72a168f") + ) + (wire + (pts + (xy 73.66 45.72) (xy 91.44 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "10fe9295-56d4-403d-8cce-bdef49543fd1") + ) + (wire + (pts + (xy 356.87 177.8) (xy 356.87 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "11ae4f16-e7e8-4fb1-b8f1-e5b5e48ce09d") + ) + (wire + (pts + (xy 298.45 243.84) (xy 298.45 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "11e732d6-aa13-4ced-bf71-47a01e32caed") + ) + (wire + (pts + (xy 190.5 93.98) (xy 190.5 123.19) + ) + (stroke + (width 0) + (type default) + ) + (uuid "122f2ee1-449b-4a7e-bb91-0edf336ee2ee") + ) + (wire + (pts + (xy 147.32 102.87) (xy 149.86 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "129d3f0d-49b9-4038-902d-ab8ab37fd31f") + ) + (wire + (pts + (xy 360.68 210.82) (xy 356.87 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "13b7420f-988d-4588-85b5-bd5e71be441d") + ) + (wire + (pts + (xy 347.98 158.75) (xy 340.36 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "13b91251-2815-4556-b990-07b34542eb30") + ) + (wire + (pts + (xy 217.17 260.35) (xy 217.17 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "13c57109-fd0d-4ad7-8c6b-2386941b46ec") + ) + (wire + (pts + (xy 83.82 91.44) (xy 91.44 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "13d4580f-fe6b-4024-8c5e-f26208a455cc") + ) + (wire + (pts + (xy 168.91 63.5) (xy 168.91 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "13df86b9-dc48-4e8b-8f95-23a398c07849") + ) + (wire + (pts + (xy 281.94 158.75) (xy 264.16 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "140cc12d-e919-4c1a-9d67-05c6546571a4") + ) + (wire + (pts + (xy 134.62 90.17) (xy 134.62 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "141a87ba-4485-4471-853c-d564cbf57745") + ) + (wire + (pts + (xy 191.77 220.98) (xy 165.1 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "14c870f8-aab9-46b8-a266-38910aa8ce38") + ) + (wire + (pts + (xy 148.59 55.88) (xy 142.24 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "14e5a28f-d02a-4070-855b-013806e080bb") + ) + (wire + (pts + (xy 43.18 152.4) (xy 36.83 152.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1500cb0e-7789-4cc6-a977-88a41302c6b7") + ) + (wire + (pts + (xy 138.43 259.08) (xy 138.43 264.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "16223034-97b1-4871-8a27-6256c7786c6f") + ) + (wire + (pts + (xy 100.33 165.1) (xy 93.98 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1733dbb6-752b-479d-8566-4fc071749be7") + ) + (wire + (pts + (xy 370.84 236.22) (xy 367.03 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "17c5f9c8-f509-4124-a366-e35fe89ccc44") + ) + (wire + (pts + (xy 36.83 24.13) (xy 54.61 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "17f308f5-d87b-4634-98a7-511bfd319c79") + ) + (wire + (pts + (xy 243.84 22.86) (xy 248.92 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1804f88e-b698-4e0f-bd01-bc9ae29dc09a") + ) + (wire + (pts + (xy 53.34 129.54) (xy 58.42 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "180f0984-8aa2-46d2-af7d-02da39356423") + ) + (wire + (pts + (xy 138.43 250.19) (xy 138.43 257.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "18932e36-3300-473e-a44f-47801bce3f0b") + ) + (wire + (pts + (xy 383.54 247.65) (xy 383.54 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "18ccc016-9b3d-4e77-ba73-9d386a22f88a") + ) + (wire + (pts + (xy 261.62 182.88) (xy 269.24 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1a12ccf3-d47d-4e0e-85b5-b958ef82c978") + ) + (wire + (pts + (xy 168.91 241.3) (xy 168.91 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1a7519c2-4585-4ec2-8531-05c4c8dde9af") + ) + (wire + (pts + (xy 389.89 170.18) (xy 386.08 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1aba7fae-4a0d-48bb-8459-d76b7e1aa8bc") + ) + (wire + (pts + (xy 134.62 158.75) (xy 143.51 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1bd270a3-85a4-4a85-9963-0b9469dec2bf") + ) + (wire + (pts + (xy 46.99 92.71) (xy 46.99 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1bf5b16f-1fd9-4a6c-a257-c1d5d7098b7a") + ) + (wire + (pts + (xy 303.53 194.31) (xy 300.99 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c083c5f-cde4-4867-aa10-13346f02675f") + ) + (wire + (pts + (xy 217.17 270.51) (xy 209.55 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c33bc00-573f-4b3e-b1a0-dbf57b7670db") + ) + (wire + (pts + (xy 92.71 223.52) (xy 86.36 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c53d8b9-c773-41a5-ab76-27e7df784d88") + ) + (wire + (pts + (xy 55.88 167.64) (xy 58.42 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c9394cb-0772-44bf-8072-4334feb9e26e") + ) + (wire + (pts + (xy 355.6 158.75) (xy 368.3 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c9ffef9-a4fd-4896-acc6-8537f549b99e") + ) + (wire + (pts + (xy 281.94 210.82) (xy 269.24 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1cc8afd5-4e35-412f-9c2e-6d51ab6626b8") + ) + (wire + (pts + (xy 248.92 165.1) (xy 248.92 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1cd06bca-213b-488c-ae79-0f85952f2c48") + ) + (wire + (pts + (xy 234.95 182.88) (xy 234.95 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1d912065-fc77-4b17-a56b-97da726d8140") + ) + (wire + (pts + (xy 251.46 234.95) (xy 250.19 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1db8c691-0270-4a0d-a9c2-1399c68df137") + ) + (wire + (pts + (xy 100.33 142.24) (xy 93.98 142.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1dd63bd6-7a17-491f-b6e3-16f4f25cb582") + ) + (wire + (pts + (xy 295.91 234.95) (xy 298.45 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1e2889b7-1664-4225-bc9a-882889a54a67") + ) + (wire + (pts + (xy 336.55 240.03) (xy 336.55 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1e6feb1e-4a29-4872-ab8d-63979905726b") + ) + (wire + (pts + (xy 340.36 208.28) (xy 339.09 208.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1e7eb9e2-5df8-4a94-927c-eb84a94a00ba") + ) + (wire + (pts + (xy 261.62 95.25) (xy 261.62 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "20054d1e-2859-46f1-8793-9861acd21798") + ) + (wire + (pts + (xy 43.18 140.97) (xy 55.88 140.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2043d5ec-c361-41c5-bec8-40a47ee9a0b1") + ) + (wire + (pts + (xy 220.98 81.28) (xy 231.14 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "21e9b771-d811-41ce-9ac2-68507e295485") + ) + (wire + (pts + (xy 297.18 76.2) (xy 297.18 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "21f9fa40-078f-43fb-aa16-80d91bb54516") + ) + (wire + (pts + (xy 389.89 182.88) (xy 389.89 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "22012085-553f-4fdf-8d22-8e4e4395141f") + ) + (wire + (pts + (xy 261.62 41.91) (xy 262.89 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "22ec1a0a-44b5-4d24-85d3-c2528d47e91b") + ) + (wire + (pts + (xy 85.09 86.36) (xy 91.44 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2301b544-0ca3-49a1-8850-c1737d1c923e") + ) + (wire + (pts + (xy 340.36 162.56) (xy 340.36 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "233895fd-96b3-4e23-b437-1b42ee4564cd") + ) + (wire + (pts + (xy 209.55 147.32) (xy 210.82 147.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "236c83a1-c57d-4944-8333-7d041b0d1f8f") + ) + (wire + (pts + (xy 146.05 102.87) (xy 147.32 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "24b5b8ba-4e74-49f3-be6e-c9ab0b76f34a") + ) + (wire + (pts + (xy 157.48 226.06) (xy 156.21 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "24c8f598-7997-4531-8b77-cf0a88750d12") + ) + (wire + (pts + (xy 279.4 92.71) (xy 278.13 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "24d79d48-9c3c-4bbd-b757-5516fe809a5a") + ) + (wire + (pts + (xy 287.02 83.82) (xy 297.18 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "24e7f878-450c-472e-a999-de4af679ef66") + ) + (wire + (pts + (xy 322.58 77.47) (xy 326.39 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "258165c0-4de2-40e6-bd3a-78c456e3fcf9") + ) + (wire + (pts + (xy 370.84 232.41) (xy 370.84 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "25cc7b7c-1960-494a-ac45-2fff047567cf") + ) + (wire + (pts + (xy 389.89 193.04) (xy 389.89 205.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "26721c6c-d8eb-4d36-a4ed-db5e9034f0f2") + ) + (wire + (pts + (xy 303.53 175.26) (xy 300.99 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2680a1a4-7d91-41cd-851a-e3147a01441f") + ) + (wire + (pts + (xy 285.75 60.96) (xy 285.75 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "26b9f782-e4e7-4d25-b7b2-797352540450") + ) + (wire + (pts + (xy 134.62 81.28) (xy 140.97 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "27e94aab-d2d9-417d-9215-58fbaa813b93") + ) + (wire + (pts + (xy 140.97 90.17) (xy 140.97 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "296b5b5a-2893-4d0c-92ca-59abc34351ec") + ) + (wire + (pts + (xy 157.48 151.13) (xy 157.48 148.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "29d30217-88e9-437d-806c-253d4812dee2") + ) + (wire + (pts + (xy 316.23 231.14) (xy 313.69 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "29f80df6-554a-422f-bf8a-7ca8392d6d37") + ) + (wire + (pts + (xy 346.71 243.84) (xy 340.36 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2a4f83da-922b-4322-b69a-89c5122c0dc0") + ) + (wire + (pts + (xy 242.57 228.6) (xy 242.57 229.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2a664902-8494-4a17-a2b3-c1764f2fb1af") + ) + (wire + (pts + (xy 243.84 172.72) (xy 234.95 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b1f86ea-f36f-451c-b634-b1f82d99ce99") + ) + (wire + (pts + (xy 130.81 213.36) (xy 130.81 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b78b2e4-f970-450e-aeb4-7ecf91770ddd") + ) + (wire + (pts + (xy 142.24 60.96) (xy 146.05 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2bdcffd7-16e3-4501-afde-93c3b28c1321") + ) + (wire + (pts + (xy 209.55 226.06) (xy 201.93 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2c0b1b9a-a823-44af-8743-b8923307116b") + ) + (wire + (pts + (xy 35.56 147.32) (xy 35.56 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2c2ab534-c0a3-462f-a7c5-1c1a7fc70558") + ) + (wire + (pts + (xy 293.37 158.75) (xy 290.83 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2c3dd24c-d320-4f72-a45d-080f6f569018") + ) + (wire + (pts + (xy 271.78 180.34) (xy 271.78 203.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2cc95033-2ffd-457a-b460-042b6811a0a7") + ) + (wire + (pts + (xy 283.21 74.93) (xy 284.48 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2cd45b2b-1aa4-4213-9717-a8e274e89409") + ) + (wire + (pts + (xy 355.6 198.12) (xy 355.6 205.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2d409e01-3faf-41ab-af9b-7e94a3e14aa4") + ) + (wire + (pts + (xy 248.92 41.91) (xy 251.46 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2d51710b-f9ab-45b3-bd2c-90b8e066935f") + ) + (wire + (pts + (xy 187.96 162.56) (xy 187.96 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2da946a4-6bc2-4d9f-942b-9dd61b4d1201") + ) + (wire + (pts + (xy 115.57 93.98) (xy 110.49 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2df8cbbd-1619-42d3-a6cd-eb047c7eb708") + ) + (wire + (pts + (xy 168.91 63.5) (xy 177.8 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2e313fba-a3ff-4ee2-8543-3973ddaae715") + ) + (wire + (pts + (xy 85.09 99.06) (xy 91.44 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2f035ef9-65f2-44ce-b886-e20cb2745d8e") + ) + (wire + (pts + (xy 76.2 118.11) (xy 92.71 118.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2f3312cf-e6d4-44cf-9aec-9190e8a5ced5") + ) + (wire + (pts + (xy 384.81 41.91) (xy 354.33 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2f4e9f83-0d7e-45bf-a9a7-0d6129667bb0") + ) + (wire + (pts + (xy 340.36 231.14) (xy 340.36 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2fab48ac-e479-47ed-bcc8-5620c82e5347") + ) + (wire + (pts + (xy 341.63 77.47) (xy 341.63 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2ff18238-8374-466f-92a6-53cb9482a267") + ) + (wire + (pts + (xy 287.02 74.93) (xy 288.29 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2ffcedc1-af80-4864-9dba-1195641ada9e") + ) + (wire + (pts + (xy 217.17 251.46) (xy 217.17 252.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "308776a2-297c-4db9-9752-82499d53952d") + ) + (wire + (pts + (xy 242.57 227.33) (xy 242.57 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "30a4cee6-cd7a-4964-820c-7c1faf3dcf66") + ) + (wire + (pts + (xy 368.3 218.44) (xy 360.68 218.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "30efec83-b177-45ec-8503-d4536b1c22a8") + ) + (wire + (pts + (xy 322.58 29.21) (xy 326.39 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "311624b3-6f3a-4329-8766-bd007640c291") + ) + (wire + (pts + (xy 260.35 95.25) (xy 261.62 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "31705500-6fae-4b83-b2db-9ae3c0219923") + ) + (wire + (pts + (xy 240.03 46.99) (xy 223.52 46.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "31e2bca1-de0d-4d30-b569-a5f30945ba4d") + ) + (wire + (pts + (xy 16.51 24.13) (xy 21.59 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "321668b8-23b9-488a-a1fa-60b69b37d51e") + ) + (wire + (pts + (xy 289.56 114.3) (xy 281.94 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3301bfec-01b0-4c3c-8b98-e97052a60a41") + ) + (wire + (pts + (xy 341.63 107.95) (xy 341.63 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "332568a7-09b7-4f42-83b2-91df7c82d38f") + ) + (wire + (pts + (xy 260.35 90.17) (xy 261.62 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3368a482-c99d-489d-8995-13e66972a36f") + ) + (wire + (pts + (xy 280.67 44.45) (xy 279.4 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "337d5b54-d84c-4880-ad11-a49dc7f49246") + ) + (wire + (pts + (xy 36.83 161.29) (xy 36.83 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "34095e95-cf96-408f-9e03-71f50fc8365a") + ) + (wire + (pts + (xy 214.63 231.14) (xy 201.93 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3413ddf6-5c37-4ea5-8f65-cfafda0cb185") + ) + (wire + (pts + (xy 393.7 168.91) (xy 396.24 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "341a19ec-26b7-4f87-a71b-20c2594599d0") + ) + (wire + (pts + (xy 278.13 55.88) (xy 278.13 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "343c8fb3-c477-4cec-bbe6-ea0a62ac2829") + ) + (wire + (pts + (xy 271.78 175.26) (xy 271.78 180.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "344bb1ae-1a78-427c-b460-6443231e8f76") + ) + (wire + (pts + (xy 309.88 59.69) (xy 309.88 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "34f42a79-368b-47b6-b659-48f94d624fab") + ) + (wire + (pts + (xy 368.3 182.88) (xy 368.3 184.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3504e7c8-bafe-461a-9da0-83916c3a891b") + ) + (wire + (pts + (xy 309.88 107.95) (xy 318.77 107.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "35895844-443e-4ec2-80af-d4684ed5ce92") + ) + (wire + (pts + (xy 34.29 24.13) (xy 34.29 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "358aa415-49bf-4b48-8c90-6ca938c8d283") + ) + (wire + (pts + (xy 393.7 63.5) (xy 384.81 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "35b66c28-8106-4411-ae43-20ad55531bb1") + ) + (wire + (pts + (xy 78.74 102.87) (xy 78.74 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "368a4704-f219-4f11-8bce-53fbb3abe41d") + ) + (wire + (pts + (xy 334.01 29.21) (xy 341.63 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "39187f9a-5dfa-42ac-bbfa-a53c47e736a8") + ) + (wire + (pts + (xy 52.07 170.18) (xy 52.07 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3918ab9e-e2c0-4316-8cad-1347d95ee044") + ) + (wire + (pts + (xy 248.92 71.12) (xy 248.92 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "39c0e261-a2d6-45ca-ba44-3db9b924c01a") + ) + (wire + (pts + (xy 378.46 170.18) (xy 375.92 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3a050a31-f5ad-47ac-bf6f-d2498b742be9") + ) + (wire + (pts + (xy 251.46 243.84) (xy 251.46 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3a118fa4-8db6-4701-b51f-9f1412f7e936") + ) + (wire + (pts + (xy 227.33 203.2) (xy 227.33 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3a557ddf-c839-4804-9720-cffdd8ef6a98") + ) + (wire + (pts + (xy 351.79 74.93) (xy 365.76 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3a63ca0b-445d-4aaf-9f7f-3134b038698d") + ) + (wire + (pts + (xy 194.31 71.12) (xy 200.66 71.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3b46a365-93ca-484a-86f1-d37814302553") + ) + (wire + (pts + (xy 203.2 270.51) (xy 209.55 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3b630958-6bed-458a-90c6-0a9adf7d9f57") + ) + (wire + (pts + (xy 248.92 46.99) (xy 248.92 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3b86b763-1ce6-4443-889f-da44f67df70a") + ) + (wire + (pts + (xy 347.98 74.93) (xy 351.79 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3b947955-27bc-4258-b7a1-0768a41cd971") + ) + (wire + (pts + (xy 139.7 55.88) (xy 142.24 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3bb92591-1f1b-49d9-b882-4a6a75c93a8d") + ) + (wire + (pts + (xy 271.78 203.2) (xy 261.62 203.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3c1b2d04-bc06-42ab-896c-7f27f62994e3") + ) + (wire + (pts + (xy 281.94 104.14) (xy 281.94 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3c1d7c91-133f-4b88-a55b-4e0c34c7505c") + ) + (wire + (pts + (xy 248.92 95.25) (xy 248.92 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3c52deb7-5b26-48cf-ab62-743a7594cf1d") + ) + (wire + (pts + (xy 322.58 100.33) (xy 322.58 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3ca6178e-bc1d-4c11-a890-a20e705a878c") + ) + (wire + (pts + (xy 177.8 255.27) (xy 168.91 255.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3cda9c39-2bdb-4417-8122-da0fb38efb67") + ) + (wire + (pts + (xy 318.77 77.47) (xy 322.58 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3d80e8bd-20db-4696-ba42-8d4190cff770") + ) + (wire + (pts + (xy 223.52 88.9) (xy 219.71 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3d86adc0-9405-47f5-8268-8541acd0d36b") + ) + (wire + (pts + (xy 83.82 96.52) (xy 83.82 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3df862ea-27e2-4b9e-a783-f379cc5b30c5") + ) + (wire + (pts + (xy 220.98 41.91) (xy 220.98 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3e2bb402-7096-463f-ac2b-e38d18f19960") + ) + (wire + (pts + (xy 351.79 66.04) (xy 356.87 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3e886b40-a6c1-4eea-880b-1f63b0e2e492") + ) + (wire + (pts + (xy 91.44 95.25) (xy 91.44 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3ed58a58-fbe9-4c19-b200-fb41ba161827") + ) + (wire + (pts + (xy 381 247.65) (xy 383.54 247.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f503426-2e47-4b2f-baa1-914dac3b403d") + ) + (wire + (pts + (xy 373.38 247.65) (xy 355.6 247.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f70cc38-7050-40a9-bbb8-516c359dbe3d") + ) + (wire + (pts + (xy 162.56 199.39) (xy 157.48 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f83987c-d4bc-42d1-a581-fa7bbf9354b8") + ) + (wire + (pts + (xy 90.17 222.25) (xy 87.63 222.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4011f609-c66e-412b-a288-28453c69746f") + ) + (wire + (pts + (xy 50.8 167.64) (xy 55.88 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "401a7d4a-e768-4951-bbd5-79952fbef755") + ) + (wire + (pts + (xy 214.63 224.79) (xy 214.63 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "406aa19e-1c16-45b8-bd63-0784f25e1114") + ) + (wire + (pts + (xy 35.56 140.97) (xy 35.56 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "40ead758-486c-419d-a27e-9d95fb83bc23") + ) + (wire + (pts + (xy 281.94 83.82) (xy 284.48 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "417af642-f14a-4012-a632-f77108802b04") + ) + (wire + (pts + (xy 193.04 162.56) (xy 193.04 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "41bfa75e-fb2a-4a61-80f8-d2bb576990ea") + ) + (wire + (pts + (xy 355.6 194.31) (xy 368.3 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "433aff84-18ba-410d-a13a-c92197159f39") + ) + (wire + (pts + (xy 269.24 210.82) (xy 269.24 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "43564bcb-170e-4e1d-8f3e-3eb9ae56d2d4") + ) + (wire + (pts + (xy 328.93 165.1) (xy 328.93 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "43569bbb-8efc-404f-8877-1abf30137404") + ) + (wire + (pts + (xy 191.77 104.14) (xy 191.77 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "43c9f61d-14f0-4c7b-af56-c82f218160fd") + ) + (wire + (pts + (xy 285.75 66.04) (xy 278.13 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "43edd344-3468-411e-a8c3-e9a65d4ae387") + ) + (wire + (pts + (xy 289.56 96.52) (xy 281.94 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "448460f5-0dbe-42c9-b19c-d6d376da0038") + ) + (wire + (pts + (xy 41.91 218.44) (xy 40.64 218.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4552cb31-dc05-42e9-9419-f6d39550e042") + ) + (wire + (pts + (xy 261.62 83.82) (xy 261.62 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "46f82a62-1335-44d7-994e-f50927316d45") + ) + (wire + (pts + (xy 62.23 223.52) (xy 62.23 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "485c14ab-2d09-4b06-8dd3-a75084767821") + ) + (wire + (pts + (xy 219.71 101.6) (xy 226.06 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "49b2f91a-d89b-4b85-9446-6e4bd78fc2b7") + ) + (wire + (pts + (xy 100.33 132.08) (xy 93.98 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "49c7c55b-6716-4272-8245-fe4cc782c137") + ) + (wire + (pts + (xy 162.56 205.74) (xy 162.56 208.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4a1e3567-142e-40f4-b3cd-dec0a7f295a7") + ) + (wire + (pts + (xy 264.16 187.96) (xy 264.16 195.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4ac2936a-fe3d-4885-a471-81d0e8fc1ef7") + ) + (wire + (pts + (xy 288.29 74.93) (xy 297.18 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4b25cb88-1dbf-465c-b1a1-fc84e40d9ff4") + ) + (wire + (pts + (xy 139.7 38.1) (xy 137.16 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4c70d2ef-69b6-4181-9bd0-827740f95de5") + ) + (wire + (pts + (xy 313.69 165.1) (xy 313.69 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4dbddf2e-564d-48ae-907c-8a5d337bd24f") + ) + (wire + (pts + (xy 142.24 55.88) (xy 142.24 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4e2be0e9-3b1f-47b8-827e-dfcf6f2afbb6") + ) + (wire + (pts + (xy 256.54 245.11) (xy 251.46 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4e4589b6-5a65-453e-927a-3dbd7cce763e") + ) + (wire + (pts + (xy 76.2 118.11) (xy 76.2 121.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4f07f20e-1f87-47e1-9331-66cd21178af4") + ) + (wire + (pts + (xy 248.92 46.99) (xy 254 46.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4f6ad787-1035-415b-93ba-577b43f0d0ed") + ) + (wire + (pts + (xy 81.28 91.44) (xy 83.82 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "500508ee-03aa-4c53-a762-ab5de467992c") + ) + (wire + (pts + (xy 350.52 41.91) (xy 354.33 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "50c2cc93-c1b2-4c2d-b7d3-786df0139961") + ) + (wire + (pts + (xy 185.42 63.5) (xy 186.69 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "512d87a8-40ef-4412-b4a2-136ff227d159") + ) + (wire + (pts + (xy 313.69 200.66) (xy 313.69 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "51c052e1-90ce-44f8-8db0-5e1870b511db") + ) + (wire + (pts + (xy 242.57 245.11) (xy 242.57 240.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5233a8f1-febf-4a4c-9d8c-4e62abe0b6d7") + ) + (wire + (pts + (xy 248.92 165.1) (xy 243.84 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5267493c-ef79-4758-89a5-ff3e77c4b5a9") + ) + (wire + (pts + (xy 205.74 148.59) (xy 209.55 148.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "52f3befb-7450-4a40-9caf-b92ec99cbf2c") + ) + (wire + (pts + (xy 156.21 153.67) (xy 162.56 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "542de239-179c-4128-88dc-0ca16cc28ba7") + ) + (wire + (pts + (xy 168.91 95.25) (xy 168.91 97.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "545cf554-3060-4090-9e26-b00f0538c399") + ) + (wire + (pts + (xy 237.49 228.6) (xy 242.57 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "54f16bf3-dd72-4305-9384-f03bdd063c20") + ) + (wire + (pts + (xy 78.74 31.75) (xy 91.44 31.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5637f307-16cd-4b39-83c5-1e615318f24f") + ) + (wire + (pts + (xy 135.89 228.6) (xy 130.81 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "56be4719-4ca3-45c0-8f5e-21e6ca41fa65") + ) + (wire + (pts + (xy 67.31 92.71) (xy 67.31 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "56f29e5b-d39e-4d4f-b125-482d963579be") + ) + (wire + (pts + (xy 168.91 266.7) (xy 160.02 266.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "571a81e5-9ecf-4965-9af7-2823cbb38860") + ) + (wire + (pts + (xy 193.04 168.91) (xy 198.12 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "57a3138f-4414-4697-a6b0-e0975401c296") + ) + (wire + (pts + (xy 177.8 62.23) (xy 177.8 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "57a557ef-3099-4f71-aa7f-ec2e27473df8") + ) + (wire + (pts + (xy 115.57 218.44) (xy 111.76 218.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "57c85413-b309-49c5-9070-6e505724f2db") + ) + (wire + (pts + (xy 137.16 151.13) (xy 137.16 144.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5817c8ba-00c2-490f-a50f-9067dd5c08c0") + ) + (wire + (pts + (xy 347.98 74.93) (xy 347.98 76.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "58d4ae0b-7dd6-4c5a-b11f-b0239cd9a1c9") + ) + (wire + (pts + (xy 214.63 220.98) (xy 201.93 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "58fd23bc-3fed-49f2-99d0-4f12dfc925d3") + ) + (wire + (pts + (xy 100.33 154.94) (xy 93.98 154.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59290128-8194-491a-a15e-92fa5dff0175") + ) + (wire + (pts + (xy 157.48 220.98) (xy 156.21 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "592b2e33-899e-47e0-8557-c8e884f98cdd") + ) + (wire + (pts + (xy 340.36 231.14) (xy 341.63 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "599e2ba1-09a9-4c8a-9b2a-a7d8ebcfa755") + ) + (wire + (pts + (xy 368.3 218.44) (xy 368.3 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59b2376d-7a75-4160-8e48-29578d01218e") + ) + (wire + (pts + (xy 248.92 58.42) (xy 248.92 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59d11be4-0439-42f3-a513-ac541f83d273") + ) + (wire + (pts + (xy 261.62 187.96) (xy 264.16 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5ba361f9-fbcf-4ac5-bd8b-91bc12f100a9") + ) + (wire + (pts + (xy 243.84 71.12) (xy 248.92 71.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5c01434a-39ee-4b4d-aa31-4b862635781b") + ) + (wire + (pts + (xy 207.01 63.5) (xy 207.01 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5c18ae76-a766-4a71-ad0a-21b82cec632e") + ) + (wire + (pts + (xy 138.43 110.49) (xy 138.43 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d18a406-06b5-44bb-9a99-c83f5af7f8d1") + ) + (wire + (pts + (xy 219.71 104.14) (xy 223.52 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d2e1f9c-dc64-4377-b938-9519bc7355f6") + ) + (wire + (pts + (xy 21.59 208.28) (xy 21.59 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d3fa86a-4349-4229-b902-b4b2a392e3dd") + ) + (wire + (pts + (xy 368.3 194.31) (xy 368.3 205.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d5a8061-7300-479c-b54b-904f2288eab9") + ) + (wire + (pts + (xy 336.55 231.14) (xy 340.36 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5da835f1-6743-44bd-9c02-1fd591e17cfc") + ) + (wire + (pts + (xy 190.5 190.5) (xy 236.22 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5db625ed-7c99-4da5-b169-a1dd5178dd80") + ) + (wire + (pts + (xy 69.85 215.9) (xy 62.23 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e2d8cc3-9855-46cb-bbd6-a1905d6e4e1a") + ) + (wire + (pts + (xy 21.59 204.47) (xy 22.86 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e3bd365-801e-47d9-bfe4-b3d2e2aeb8ae") + ) + (wire + (pts + (xy 287.02 74.93) (xy 287.02 76.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e83cb40-05ed-48aa-8486-b9b8ecf22f8d") + ) + (wire + (pts + (xy 248.92 22.86) (xy 248.92 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e9171df-10c9-4e6d-9e32-8c6a70eddff2") + ) + (wire + (pts + (xy 194.31 81.28) (xy 191.77 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5f0f3bfe-bc38-438d-a7c5-6f5fc8790eb6") + ) + (wire + (pts + (xy 265.43 35.56) (xy 262.89 35.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5f221f4e-1869-41f0-94c6-49179cd5dc67") + ) + (wire + (pts + (xy 262.89 46.99) (xy 264.16 46.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5f324e79-11f4-4192-b963-2379d08f1634") + ) + (wire + (pts + (xy 153.67 273.05) (xy 148.59 273.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5f49d035-8d85-40ad-9e35-56da4f106d57") + ) + (wire + (pts + (xy 356.87 213.36) (xy 356.87 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5f5521e8-658d-4fdf-a23e-b6cb614811a2") + ) + (wire + (pts + (xy 46.99 87.63) (xy 41.91 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5f5f0d2d-5421-4596-afd1-8fcf048bf127") + ) + (wire + (pts + (xy 341.63 41.91) (xy 342.9 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5fd112a9-4234-41d9-bef5-3fc30eecbe6a") + ) + (wire + (pts + (xy 43.18 135.89) (xy 57.15 135.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "60487a51-0610-47dc-a75f-e330aa6e6f7a") + ) + (wire + (pts + (xy 264.16 158.75) (xy 264.16 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "614074e0-d036-42bf-bccd-6d53c70f7277") + ) + (wire + (pts + (xy 34.29 45.72) (xy 44.45 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "61faa6bb-718b-463a-8bb7-7bca397f7a7b") + ) + (wire + (pts + (xy 393.7 180.34) (xy 393.7 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62aedcc2-eb16-4723-be17-30ed9ce5e253") + ) + (wire + (pts + (xy 109.22 24.13) (xy 115.57 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62f7e01d-20f3-43cc-b577-4bd22f3c2ab4") + ) + (wire + (pts + (xy 129.54 102.87) (xy 130.81 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6407b0a1-9d62-4a4d-b036-9cfdeea764a4") + ) + (wire + (pts + (xy 293.37 194.31) (xy 290.83 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "656badbf-27fd-472a-9087-a2850896bc62") + ) + (wire + (pts + (xy 256.54 234.95) (xy 256.54 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "65a49279-f60f-418e-8e05-88f0a1bb74b2") + ) + (wire + (pts + (xy 234.95 182.88) (xy 234.95 180.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "65ceaf14-ec65-4f79-9d66-bb8305e68db6") + ) + (wire + (pts + (xy 152.4 62.23) (xy 147.32 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "65e17505-7379-4b56-9971-c61abb4c6ece") + ) + (wire + (pts + (xy 115.57 220.98) (xy 111.76 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "666fc372-a0a6-4494-8a06-a8dfe562ac3e") + ) + (wire + (pts + (xy 205.74 153.67) (xy 209.55 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "66778e8a-a6e3-4751-a80c-e0c3cbd508aa") + ) + (wire + (pts + (xy 247.65 95.25) (xy 248.92 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "66b5cf3a-d3e6-4e48-a67d-abadf6d62f37") + ) + (wire + (pts + (xy 78.74 102.87) (xy 76.2 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "673080f3-2c87-47d5-8b42-d476172bc54b") + ) + (wire + (pts + (xy 135.89 111.76) (xy 137.16 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "67ec2a01-20f7-40af-bae4-1b0ebf49c692") + ) + (wire + (pts + (xy 73.66 31.75) (xy 78.74 31.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6867336b-5e3d-4b62-b179-242131ea1833") + ) + (wire + (pts + (xy 261.62 46.99) (xy 262.89 46.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6884ccce-a8a8-42ff-a6f1-ca970e5ca00e") + ) + (wire + (pts + (xy 100.33 137.16) (xy 93.98 137.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "68bc8700-07c6-439e-9c10-1f784a4f2f43") + ) + (wire + (pts + (xy 273.05 83.82) (xy 279.4 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "68cd9282-785b-4e0f-9adb-90c926ed4f14") + ) + (wire + (pts + (xy 340.36 240.03) (xy 340.36 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "68d4a924-025b-47a5-a557-1c9fc4c1e8a0") + ) + (wire + (pts + (xy 156.21 158.75) (xy 162.56 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "695bd752-bcb6-47c6-9fc1-7aec5bdc0d83") + ) + (wire + (pts + (xy 309.88 92.71) (xy 311.15 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "695e80ba-2d46-408a-834c-dd194bbfe14b") + ) + (wire + (pts + (xy 259.08 234.95) (xy 256.54 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6a18e051-8bfd-4f30-91fc-9879929c2bc4") + ) + (wire + (pts + (xy 190.5 176.53) (xy 190.5 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6b181c1c-d63d-401b-a455-4a75b3e9c7fd") + ) + (wire + (pts + (xy 389.89 187.96) (xy 389.89 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6bf0a648-2d56-4f16-b56e-efaa12cf9d6d") + ) + (wire + (pts + (xy 139.7 144.78) (xy 139.7 148.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6d44d147-080f-4b5f-922c-93c0c7de7600") + ) + (wire + (pts + (xy 60.96 102.87) (xy 67.31 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6de4419c-5dd3-41d3-9a61-c7b77287b1bb") + ) + (wire + (pts + (xy 100.33 152.4) (xy 93.98 152.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f7268dc-dcca-411e-a2e6-4064b5f4801d") + ) + (wire + (pts + (xy 147.32 81.28) (xy 147.32 82.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f81a5c7-8225-472c-9e71-065b943aa5cb") + ) + (wire + (pts + (xy 52.07 248.92) (xy 66.04 248.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f9c3c5f-84e3-410b-93e5-3518df01d2f1") + ) + (wire + (pts + (xy 156.21 151.13) (xy 157.48 151.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6fbec33d-0670-4408-b4ed-b31bef456be3") + ) + (wire + (pts + (xy 318.77 44.45) (xy 322.58 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6fc8b9ca-14ad-42de-8469-7f0f5fe13fab") + ) + (wire + (pts + (xy 309.88 92.71) (xy 309.88 107.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6ff40fd5-a81f-4095-9690-020e944daaa2") + ) + (wire + (pts + (xy 327.66 66.04) (xy 326.39 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "70e41fe9-ea67-4f4b-8b5b-bf057f499d49") + ) + (wire + (pts + (xy 110.49 96.52) (xy 118.11 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "70e73789-9cd8-4dcf-aa2c-4498eda1f2b7") + ) + (wire + (pts + (xy 187.96 193.04) (xy 236.22 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "70fb6bef-3e56-4aa9-8656-fa18db0bcfa6") + ) + (wire + (pts + (xy 341.63 213.36) (xy 356.87 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7198ecfe-b89f-48f6-ad66-4cff5442199b") + ) + (wire + (pts + (xy 350.52 90.17) (xy 354.33 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "71f4c6e8-aa20-47f2-a8fa-9b14f0d2a826") + ) + (wire + (pts + (xy 165.1 87.63) (xy 168.91 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "72cd5b80-8618-4b77-89e5-5c4701da00e9") + ) + (wire + (pts + (xy 261.62 95.25) (xy 262.89 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "731eb50a-fd45-4140-871c-1c335862a0c4") + ) + (wire + (pts + (xy 228.6 99.06) (xy 228.6 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74331d8d-ee48-435c-badf-5f2594a4e0ab") + ) + (wire + (pts + (xy 356.87 175.26) (xy 355.6 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7446ebcb-41ce-4149-83f7-4258e323bda2") + ) + (wire + (pts + (xy 78.74 88.9) (xy 91.44 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74b5429a-b946-4b62-b10a-843a541f768e") + ) + (wire + (pts + (xy 264.16 74.93) (xy 267.97 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75286cc9-b4ac-4c9b-88d4-2bc98fc5b694") + ) + (wire + (pts + (xy 309.88 29.21) (xy 311.15 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "755338f6-12d9-4c5b-b302-055baba84c87") + ) + (wire + (pts + (xy 177.8 102.87) (xy 179.07 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75aaa080-364e-429c-a4d2-d9ec568281ed") + ) + (wire + (pts + (xy 100.33 129.54) (xy 93.98 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75c41d09-de17-4e68-826d-5168bc08c1f9") + ) + (wire + (pts + (xy 86.36 213.36) (xy 92.71 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7608a166-6eaa-46d2-9bf8-22cddec9366f") + ) + (wire + (pts + (xy 326.39 59.69) (xy 341.63 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "761ff5e7-446c-4a64-87fe-00ac771c2720") + ) + (wire + (pts + (xy 341.63 59.69) (xy 341.63 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "76552a39-9ca8-4bf1-b32e-d92c3ecb7a5b") + ) + (wire + (pts + (xy 334.01 77.47) (xy 341.63 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "765f00fa-d3b0-4085-a4ba-0b5f2b8fa875") + ) + (wire + (pts + (xy 340.36 198.12) (xy 340.36 208.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "76c58d76-0be4-49b1-984b-3138b480a780") + ) + (wire + (pts + (xy 209.55 148.59) (xy 209.55 147.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "76f73b93-f8c7-48de-b8fd-b9bcd3b8aff7") + ) + (wire + (pts + (xy 393.7 187.96) (xy 389.89 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "77261f5d-f16e-4d50-bf81-c8b93635e9d8") + ) + (wire + (pts + (xy 318.77 92.71) (xy 322.58 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7752cf80-db4d-4735-9b72-bedab494ad46") + ) + (wire + (pts + (xy 237.49 228.6) (xy 237.49 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "775eee06-010c-437a-9c90-03b50528680e") + ) + (wire + (pts + (xy 73.66 24.13) (xy 91.44 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "77be84cf-8dee-4423-9913-601580ac8868") + ) + (wire + (pts + (xy 313.69 243.84) (xy 313.69 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "780c0b1b-2ec2-49cd-a137-23ba974f9454") + ) + (wire + (pts + (xy 290.83 175.26) (xy 281.94 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "780e036d-29d6-4045-8f83-880a4421d276") + ) + (wire + (pts + (xy 41.91 87.63) (xy 41.91 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "79c0723f-c616-4759-93cd-2fe6c78ef6ea") + ) + (wire + (pts + (xy 378.46 205.74) (xy 375.92 205.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "79ec9283-aa45-4612-8401-bcbb1f51fb9b") + ) + (wire + (pts + (xy 313.69 210.82) (xy 311.15 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7a7c43c9-7893-4151-8fd0-6fb49f466abf") + ) + (wire + (pts + (xy 236.22 200.66) (xy 224.79 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ab24cdd-14e1-4185-922b-6ba3d9004722") + ) + (wire + (pts + (xy 355.6 162.56) (xy 356.87 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7baf751b-0d2b-41c4-b4bf-c2ea751236f3") + ) + (wire + (pts + (xy 88.9 95.25) (xy 91.44 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7bcc67e4-7564-4f6e-8a64-27b188faeb98") + ) + (wire + (pts + (xy 273.05 35.56) (xy 280.67 35.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7c89b5b6-6584-4415-b5d0-2c385ea8d68e") + ) + (wire + (pts + (xy 140.97 81.28) (xy 140.97 82.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7d753682-1c16-4b76-8bbc-3d9b4b9ecc62") + ) + (wire + (pts + (xy 313.69 231.14) (xy 313.69 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ee93ece-62f4-4b20-858e-d039611d104f") + ) + (wire + (pts + (xy 157.48 199.39) (xy 157.48 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f44e3a4-cd59-4d24-acc8-376ddac15c9b") + ) + (wire + (pts + (xy 15.24 218.44) (xy 33.02 218.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f78ea27-e76d-4982-b010-a7d334d51f1a") + ) + (wire + (pts + (xy 223.52 104.14) (xy 223.52 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f7d91cc-bf3a-4113-b7fd-a0aa5454b2ed") + ) + (wire + (pts + (xy 321.31 165.1) (xy 313.69 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f8629e9-535c-40c3-b317-1fe821e76055") + ) + (wire + (pts + (xy 138.43 264.16) (xy 143.51 264.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ffae33d-ae04-44a2-9e5b-46e38b71fb15") + ) + (wire + (pts + (xy 359.41 243.84) (xy 355.6 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "80369f2c-7697-4ef4-be6a-ee3f853fe799") + ) + (wire + (pts + (xy 207.01 74.93) (xy 207.01 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "80a9e457-979f-47d1-97cc-122b7f9c8b74") + ) + (wire + (pts + (xy 340.36 158.75) (xy 340.36 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "80f21d59-80c7-4e96-9ab9-5f1470708d11") + ) + (wire + (pts + (xy 236.22 180.34) (xy 234.95 180.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "81180678-f69b-4737-8938-cd8beb104251") + ) + (wire + (pts + (xy 302.26 234.95) (xy 298.45 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "814512f8-38ca-482d-ba1c-d1f2250f54ff") + ) + (wire + (pts + (xy 326.39 107.95) (xy 341.63 107.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8261757c-f86c-4435-8f37-1b82ef24a7b1") + ) + (wire + (pts + (xy 168.91 87.63) (xy 177.8 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8387356f-27fe-4519-9462-7dec4d4541bb") + ) + (wire + (pts + (xy 393.7 60.96) (xy 393.7 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "83fa160e-d55f-4fbd-9f18-0ffd2cc5bbe9") + ) + (wire + (pts + (xy 256.54 243.84) (xy 256.54 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "83feabfd-b5ba-49fa-9226-34558f9bb896") + ) + (wire + (pts + (xy 340.36 194.31) (xy 340.36 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8424d038-1c05-4e91-8960-cfd2546ec06d") + ) + (wire + (pts + (xy 340.36 90.17) (xy 341.63 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "85279c2e-2393-4d12-b9aa-38543196a589") + ) + (wire + (pts + (xy 86.36 220.98) (xy 86.36 218.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "85321f37-cab7-45b2-b490-c0f1f5df1077") + ) + (wire + (pts + (xy 368.3 205.74) (xy 365.76 205.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "857dc339-676a-41ef-9fc2-dd917c55392e") + ) + (wire + (pts + (xy 209.55 269.24) (xy 209.55 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "86086ab3-cbc4-481e-a3b6-2402456a6b1c") + ) + (wire + (pts + (xy 58.42 170.18) (xy 57.15 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8636f9f2-015a-46b9-b235-6723030a1325") + ) + (wire + (pts + (xy 368.3 158.75) (xy 368.3 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "86389e30-e83c-4405-b03f-f600cd5213de") + ) + (wire + (pts + (xy 219.71 96.52) (xy 231.14 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8694c2ca-5385-4b40-9cfe-bf5046838f4a") + ) + (wire + (pts + (xy 177.8 63.5) (xy 185.42 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "86a3a126-3586-44e9-b665-5b2d6df36b0c") + ) + (wire + (pts + (xy 191.77 78.74) (xy 185.42 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "86f438f4-7070-48c2-956b-087a710e270d") + ) + (wire + (pts + (xy 54.61 146.05) (xy 54.61 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "87651b22-9301-4d73-9c95-0fd7495ee1e6") + ) + (wire + (pts + (xy 168.91 241.3) (xy 143.51 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8775af40-7af7-46ae-b4fc-973b86f141ee") + ) + (wire + (pts + (xy 57.15 135.89) (xy 57.15 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "87d13dd2-c257-4af3-a90a-0a4c677669d6") + ) + (wire + (pts + (xy 177.8 95.25) (xy 177.8 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "896a7778-17c8-4e3a-a387-2e9c5cd8eebb") + ) + (wire + (pts + (xy 135.89 241.3) (xy 130.81 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "89847732-ce9f-463d-be2e-106092f875d8") + ) + (wire + (pts + (xy 289.56 101.6) (xy 289.56 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "89b8fa1a-e341-4f89-868e-958e3f6bafff") + ) + (wire + (pts + (xy 100.33 139.7) (xy 93.98 139.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8a1a0662-368e-4f93-8d58-90c110e2fc14") + ) + (wire + (pts + (xy 208.28 151.13) (xy 208.28 149.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8a1a7f56-db7a-400f-a7e9-7d9b448431fc") + ) + (wire + (pts + (xy 293.37 175.26) (xy 290.83 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8a7c491b-1d12-42fc-b2e1-1d2381a97cd9") + ) + (wire + (pts + (xy 157.48 213.36) (xy 130.81 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8b128287-9039-459d-a748-194ea7a4caaf") + ) + (wire + (pts + (xy 66.04 251.46) (xy 66.04 248.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8b6bd04a-675d-4075-ae5a-903c5f791f54") + ) + (wire + (pts + (xy 44.45 45.72) (xy 54.61 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8bea8884-2cea-4378-aab0-964a4f4c4936") + ) + (wire + (pts + (xy 313.69 175.26) (xy 311.15 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c1c4db6-8ae4-4969-90fd-1de0c2f8b666") + ) + (wire + (pts + (xy 194.31 72.39) (xy 194.31 71.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8ceba37c-622e-4b30-8303-71de4e82d02c") + ) + (wire + (pts + (xy 15.24 83.82) (xy 20.32 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8cecf4b4-b169-406d-b42b-0fb321f2196e") + ) + (wire + (pts + (xy 279.4 92.71) (xy 300.99 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8d29ecfc-5ab3-4656-8e7d-117764865422") + ) + (wire + (pts + (xy 135.89 223.52) (xy 127 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8dd5ad18-32d0-4b91-9e79-34c930a9638a") + ) + (wire + (pts + (xy 365.76 66.04) (xy 365.76 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8e64801f-3c2f-454e-8b3a-10df3a858489") + ) + (wire + (pts + (xy 247.65 46.99) (xy 248.92 46.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8e7df8ec-9f30-438b-9d72-36df9492c0f4") + ) + (wire + (pts + (xy 367.03 243.84) (xy 370.84 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8ead4b7b-ba36-41a8-a065-fea8b4ba3bc1") + ) + (wire + (pts + (xy 57.15 170.18) (xy 52.07 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8eccf633-043d-464a-9272-b5b23b7c14fc") + ) + (wire + (pts + (xy 191.77 83.82) (xy 194.31 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "903e43e8-d9e3-4b40-a674-86ba784b7a99") + ) + (wire + (pts + (xy 35.56 135.89) (xy 35.56 140.97) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9083ba14-9d32-4b54-8f82-e1540c4ab987") + ) + (wire + (pts + (xy 54.61 165.1) (xy 58.42 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "911fa678-ac32-4254-9ab2-b5bd4ec5d3c5") + ) + (wire + (pts + (xy 41.91 213.36) (xy 40.64 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "91797355-4c74-4e50-a9ce-d232c7f7c0bb") + ) + (wire + (pts + (xy 224.79 224.79) (xy 214.63 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "91c26636-7322-45ed-9a1e-dd7db908d532") + ) + (wire + (pts + (xy 346.71 243.84) (xy 346.71 240.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "91ec5ab1-62b1-4493-86f3-748375caf4d0") + ) + (wire + (pts + (xy 226.06 95.25) (xy 226.06 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "925db50f-6134-472d-bb4d-0910d95c8810") + ) + (wire + (pts + (xy 143.51 153.67) (xy 143.51 152.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9278ce66-28bc-44f9-ab81-55ce3ee262ff") + ) + (wire + (pts + (xy 111.76 226.06) (xy 113.03 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "93a9d3d5-22a8-4c39-8f6f-c01d3f2f8c1b") + ) + (wire + (pts + (xy 360.68 175.26) (xy 356.87 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "940a6a06-2399-4e85-9ad3-10a048f6d9cd") + ) + (wire + (pts + (xy 248.92 106.68) (xy 248.92 107.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "942831ce-e41b-42a9-b4a3-0b29ff255212") + ) + (wire + (pts + (xy 50.8 152.4) (xy 58.42 152.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "950ff827-7a2c-416b-9bc4-e755252736c9") + ) + (wire + (pts + (xy 285.75 48.26) (xy 285.75 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9511831e-10fb-48a7-8145-8c66cc8d334b") + ) + (wire + (pts + (xy 16.51 34.29) (xy 16.51 36.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "95829f65-8b61-4bc6-8a0b-eb420d3800a1") + ) + (wire + (pts + (xy 262.89 41.91) (xy 264.16 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "95fb10ed-bb09-4a72-b842-9a526a7cc328") + ) + (wire + (pts + (xy 226.06 95.25) (xy 240.03 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "966c62af-b29b-4ae6-a9a3-74d7fc7e036e") + ) + (wire + (pts + (xy 205.74 151.13) (xy 208.28 151.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "967b3111-48e0-4aa7-9ba9-84d1902c1613") + ) + (wire + (pts + (xy 111.76 99.06) (xy 111.76 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "967d5890-f921-44d3-82ec-d8ad342fdd94") + ) + (wire + (pts + (xy 161.29 255.27) (xy 160.02 255.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "96c4211b-b3e9-4f48-af21-f3a92709685e") + ) + (wire + (pts + (xy 262.89 57.15) (xy 262.89 46.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "97e0b68f-0045-44d8-ba0c-0c523a982b02") + ) + (wire + (pts + (xy 29.21 24.13) (xy 34.29 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9819e90e-cea2-4b6a-ae28-990aa2df2312") + ) + (wire + (pts + (xy 356.87 177.8) (xy 356.87 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "989148b6-2125-4a19-87d6-2c7f38678378") + ) + (wire + (pts + (xy 115.57 88.9) (xy 110.49 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "98baf9b6-da58-42a4-acf2-9e70c2ca4861") + ) + (wire + (pts + (xy 191.77 102.87) (xy 191.77 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "98cf9553-6c04-4519-977d-493b01beee49") + ) + (wire + (pts + (xy 16.51 24.13) (xy 16.51 31.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "98d15c59-3399-41a0-b380-af4148b21400") + ) + (wire + (pts + (xy 135.89 231.14) (xy 129.54 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "98d7e782-cf98-4f5a-9a86-69aad693777b") + ) + (wire + (pts + (xy 396.24 168.91) (xy 396.24 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "99cb5f9f-b5bb-4c61-bcbf-86e82be57007") + ) + (wire + (pts + (xy 356.87 162.56) (xy 356.87 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9a43a700-4c21-4c23-9193-7e623f63e4ae") + ) + (wire + (pts + (xy 200.66 63.5) (xy 194.31 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9a9a43a8-adc4-4e48-b4cf-49e3af54e80a") + ) + (wire + (pts + (xy 346.71 231.14) (xy 341.63 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9b104c38-a954-47a3-8254-b0c0e4e29658") + ) + (wire + (pts + (xy 309.88 85.09) (xy 309.88 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9b262045-52be-4cd9-b9eb-a1ae19a841d4") + ) + (wire + (pts + (xy 111.76 223.52) (xy 119.38 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9b5aee08-117e-4860-9486-5b829b086994") + ) + (wire + (pts + (xy 281.94 96.52) (xy 281.94 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9bbed7ba-58ad-4fd7-a63f-c9b856a60a7e") + ) + (wire + (pts + (xy 157.48 152.4) (xy 157.48 151.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9bc6efd1-5e2f-45e3-a888-9cf8e707f359") + ) + (wire + (pts + (xy 129.54 199.39) (xy 129.54 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9c336b00-9d10-4e14-b856-be182dfa58f3") + ) + (wire + (pts + (xy 368.3 182.88) (xy 360.68 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9d06d2a0-7f92-44c3-9d67-dd35b33457ee") + ) + (wire + (pts + (xy 262.89 57.15) (xy 278.13 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9d76dbd5-2f8c-44a8-bfbf-a6570f724e74") + ) + (wire + (pts + (xy 251.46 41.91) (xy 254 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9dbcfdcd-abc0-48c5-ab25-73828570e9ef") + ) + (wire + (pts + (xy 165.1 97.79) (xy 165.1 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9ddd4c0c-3e9f-4f10-b9db-f5ca235e88e4") + ) + (wire + (pts + (xy 284.48 74.93) (xy 287.02 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9dfda32c-2e20-4cb9-9d9f-7625943de829") + ) + (wire + (pts + (xy 340.36 172.72) (xy 339.09 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9e61be7f-8c0f-4d4e-a599-26fb1f53af15") + ) + (wire + (pts + (xy 331.47 172.72) (xy 328.93 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9ea84322-96fd-4459-beef-fea9f1e3c4a6") + ) + (wire + (pts + (xy 340.36 158.75) (xy 311.15 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9eb2b625-a3a4-43ad-975c-453fd59dfb47") + ) + (wire + (pts + (xy 359.41 236.22) (xy 355.6 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9ef5b929-9e48-478b-be87-9d351181d317") + ) + (wire + (pts + (xy 86.36 226.06) (xy 92.71 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f5033f4-8826-491b-9f0b-615d55f3497d") + ) + (wire + (pts + (xy 52.07 233.68) (xy 52.07 248.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a025848a-f24a-45c9-9449-31c0d8710023") + ) + (wire + (pts + (xy 293.37 210.82) (xy 290.83 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a033fd25-1469-4a85-80b7-673f55bc1222") + ) + (wire + (pts + (xy 355.6 243.84) (xy 355.6 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a0742d36-be94-46e5-865c-ea78ef6d47b5") + ) + (wire + (pts + (xy 168.91 86.36) (xy 168.91 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a0928349-97ed-4125-924c-aaff318c8309") + ) + (wire + (pts + (xy 151.13 264.16) (xy 153.67 264.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a0b58f7a-de24-4030-ba01-3b9a29667e6f") + ) + (wire + (pts + (xy 309.88 77.47) (xy 311.15 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a10e33eb-42fe-49f8-9649-76ff59345333") + ) + (wire + (pts + (xy 86.36 223.52) (xy 86.36 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a188c617-3a4d-47ae-8334-7cbb110eddba") + ) + (wire + (pts + (xy 137.16 78.74) (xy 139.7 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a19283a9-c86e-4152-9701-1bf48bcb88ad") + ) + (wire + (pts + (xy 321.31 200.66) (xy 313.69 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a2d4c2f0-66af-425a-ae3b-2e6fe5c833af") + ) + (wire + (pts + (xy 243.84 73.66) (xy 243.84 71.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a2d9067f-4021-45d3-be18-2a04e1972751") + ) + (wire + (pts + (xy 309.88 243.84) (xy 313.69 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a319757e-5133-457e-83ed-4ca6b95007cc") + ) + (wire + (pts + (xy 248.92 86.36) (xy 248.92 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a39fe6c1-310d-40db-8695-9b397d425895") + ) + (wire + (pts + (xy 256.54 234.95) (xy 251.46 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a49c113b-e148-4e91-a4cc-ba7be33236f8") + ) + (wire + (pts + (xy 168.91 259.08) (xy 160.02 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a4c2dcfd-aa59-4d14-acd9-23bedfece0d8") + ) + (wire + (pts + (xy 302.26 243.84) (xy 298.45 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a4fab178-5941-4fc1-8b6c-b6657640a19b") + ) + (wire + (pts + (xy 278.13 48.26) (xy 285.75 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a50874ce-1979-4d23-9374-663cab345c59") + ) + (wire + (pts + (xy 391.16 53.34) (xy 393.7 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a511ceda-daeb-484c-a193-2ef61ccd3a09") + ) + (wire + (pts + (xy 368.3 170.18) (xy 365.76 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a563b53a-2982-4cf4-ae12-0a04e79f326b") + ) + (wire + (pts + (xy 389.89 205.74) (xy 386.08 205.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a8667e05-d790-4dfd-a5ea-6789f164a13b") + ) + (wire + (pts + (xy 384.81 68.58) (xy 393.7 68.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a966872b-cfa2-4963-87ad-812d3f7bf558") + ) + (wire + (pts + (xy 287.02 83.82) (xy 287.02 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a97889ca-c14b-4662-8d7c-2b7dd0c12a34") + ) + (wire + (pts + (xy 115.57 45.72) (xy 120.65 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a9ea7988-4251-418a-8742-d45f4fa56fb3") + ) + (wire + (pts + (xy 347.98 198.12) (xy 340.36 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aa29825f-e9a8-4aaa-b36b-d5437f302d89") + ) + (wire + (pts + (xy 370.84 243.84) (xy 370.84 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ab647954-3f7a-40f9-9a9c-2cb7b0efd331") + ) + (wire + (pts + (xy 168.91 226.06) (xy 165.1 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "abb8c620-cae5-40f1-904b-5feaf9554df7") + ) + (wire + (pts + (xy 157.48 148.59) (xy 156.21 148.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "abde847f-99fa-457f-967b-ad52ca82a797") + ) + (wire + (pts + (xy 140.97 81.28) (xy 147.32 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ac6fb932-0707-474b-8245-470e43db57ff") + ) + (wire + (pts + (xy 384.81 41.91) (xy 384.81 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "acb4fcf5-7ccc-436a-a68d-9fbd1e132e7b") + ) + (wire + (pts + (xy 187.96 91.44) (xy 194.31 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "acfa339e-c5b0-4603-a5f2-aaab1ce0d567") + ) + (wire + (pts + (xy 91.44 96.52) (xy 83.82 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "acff48d7-3763-4a77-b6ce-8e97712e3187") + ) + (wire + (pts + (xy 36.83 173.99) (xy 36.83 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ad30ca54-0dee-4697-80c5-da99cc011c93") + ) + (wire + (pts + (xy 148.59 55.88) (xy 148.59 50.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ad84c957-db93-449f-a695-b7a8fcb35907") + ) + (wire + (pts + (xy 85.09 220.98) (xy 86.36 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ade265ca-c914-480f-a4a5-0b30fbceb6eb") + ) + (wire + (pts + (xy 50.8 161.29) (xy 52.07 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ae2fceb2-4532-476e-836a-ae09e8146645") + ) + (wire + (pts + (xy 100.33 157.48) (xy 93.98 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aebb2711-1484-40ae-909b-7a335cbbbf3b") + ) + (wire + (pts + (xy 209.55 226.06) (xy 209.55 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aefdc0e3-4736-4101-b80d-8fc732c3af31") + ) + (wire + (pts + (xy 279.4 83.82) (xy 279.4 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "af96c816-530c-48d4-b090-cd2fbf8c05ce") + ) + (wire + (pts + (xy 325.12 87.63) (xy 322.58 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "afa48363-706e-47d6-a947-14ac6da1e94c") + ) + (wire + (pts + (xy 285.75 48.26) (xy 288.29 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0995455-c227-4ed0-aa39-dd4c7d37bef2") + ) + (wire + (pts + (xy 160.02 273.05) (xy 160.02 266.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0aad4fb-9326-41da-a0bf-21fef9e46fb0") + ) + (wire + (pts + (xy 134.62 82.55) (xy 134.62 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0ab75f1-c8e4-4c88-85e5-dd94bd63aec7") + ) + (wire + (pts + (xy 278.13 64.77) (xy 278.13 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0aba0a5-f0ac-4465-8df7-11496703db26") + ) + (wire + (pts + (xy 129.54 102.87) (xy 129.54 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0eef2c6-c62d-4f81-a3b4-1dada1b13aed") + ) + (wire + (pts + (xy 280.67 35.56) (xy 280.67 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b10a2261-3e3f-4d73-96b1-30b8ad10ad05") + ) + (wire + (pts + (xy 157.48 102.87) (xy 177.8 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b17628a1-9056-4dfe-b2de-e23986a90068") + ) + (wire + (pts + (xy 200.66 63.5) (xy 207.01 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b18425bb-2943-4a18-8b30-e4423d74bdbd") + ) + (wire + (pts + (xy 248.92 90.17) (xy 250.19 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b1a627a7-5c19-4731-8c71-003d23580685") + ) + (wire + (pts + (xy 266.7 198.12) (xy 261.62 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b1cef88e-6f76-490c-beec-83730923e83d") + ) + (wire + (pts + (xy 308.61 92.71) (xy 309.88 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b2431674-1834-4ed1-8e1e-1d747a59d468") + ) + (wire + (pts + (xy 165.1 97.79) (xy 168.91 97.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b2a0e674-1147-448f-9a9e-1a0f55d772d0") + ) + (wire + (pts + (xy 340.36 41.91) (xy 341.63 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b2cd871a-39c7-4531-8f12-281fc1d67566") + ) + (wire + (pts + (xy 351.79 73.66) (xy 351.79 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b39c11b9-7493-4103-8ba1-47354e59de3c") + ) + (wire + (pts + (xy 251.46 234.95) (xy 251.46 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b41a21ef-ad7a-4594-9bfe-65b7a2400abb") + ) + (wire + (pts + (xy 356.87 170.18) (xy 355.6 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b4204bd5-73d8-4dfa-8e04-73eef27396cf") + ) + (wire + (pts + (xy 243.84 154.94) (xy 237.49 154.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b43eecc5-9f3a-4894-b5e0-87176b2b157d") + ) + (wire + (pts + (xy 234.95 182.88) (xy 236.22 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b531b65b-2d63-48b0-8beb-d4534152f101") + ) + (wire + (pts + (xy 30.48 83.82) (xy 33.02 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b5397dc2-dc7c-4f00-a7e1-cc53fd1b9e54") + ) + (wire + (pts + (xy 248.92 95.25) (xy 252.73 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b6a7aa29-2bb7-4b93-a814-4ef10a7c2f4e") + ) + (wire + (pts + (xy 160.02 255.27) (xy 160.02 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b6b0994b-7c8e-4027-a737-1091baa6f870") + ) + (wire + (pts + (xy 226.06 86.36) (xy 219.71 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b6c9ea99-7d32-4c79-92f5-8458aea005ee") + ) + (wire + (pts + (xy 322.58 44.45) (xy 325.12 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b723fd46-1a23-4f89-80f7-a947356c0091") + ) + (wire + (pts + (xy 60.96 92.71) (xy 67.31 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b7e8f787-97eb-4ebe-be41-b0ea77407ef5") + ) + (wire + (pts + (xy 80.01 53.34) (xy 91.44 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b86e9b24-5028-4164-9a0e-23aeafe360f7") + ) + (wire + (pts + (xy 15.24 218.44) (xy 15.24 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b87593c2-65c9-481f-9b02-f90c73c61227") + ) + (wire + (pts + (xy 147.32 90.17) (xy 147.32 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b8bcb17a-27a5-44c6-a76a-958eb63f6fd8") + ) + (wire + (pts + (xy 147.32 100.33) (xy 147.32 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b909af50-cdd0-48f9-96b8-4753d1e11848") + ) + (wire + (pts + (xy 33.02 213.36) (xy 26.67 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ba483c1a-9353-4bd3-8d7d-d4cc09bf1760") + ) + (wire + (pts + (xy 36.83 24.13) (xy 34.29 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ba638dac-1d8c-4546-98d3-a6fd58f7f535") + ) + (wire + (pts + (xy 130.81 248.92) (xy 130.81 250.19) + ) + (stroke + (width 0) + (type default) + ) + (uuid "baf9e1f6-8cd0-429c-90d5-807ca8486280") + ) + (wire + (pts + (xy 160.02 273.05) (xy 153.67 273.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bb1fdb0d-bbf4-40d7-b343-4a35b5456601") + ) + (wire + (pts + (xy 341.63 29.21) (xy 341.63 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bbead3cd-fc35-426a-b972-2d68035b96c2") + ) + (wire + (pts + (xy 133.35 111.76) (xy 135.89 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bbff88c9-bacf-48c8-987b-7bfb855ba44f") + ) + (wire + (pts + (xy 309.88 44.45) (xy 311.15 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bc45dfef-de83-439d-8f7c-956999fd4d4e") + ) + (wire + (pts + (xy 281.94 175.26) (xy 271.78 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bca9ee47-9281-411a-9503-f123f76d47f8") + ) + (wire + (pts + (xy 250.19 90.17) (xy 252.73 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bcbd8d7c-610a-4ce4-9881-b6cb34027bb1") + ) + (wire + (pts + (xy 248.92 38.1) (xy 248.92 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bd1d4354-c0d2-4afd-ba1b-95e7d352a2e1") + ) + (wire + (pts + (xy 355.6 247.65) (xy 355.6 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bd547afd-d503-4a6c-b4cc-43a9e4f5dde9") + ) + (wire + (pts + (xy 347.98 162.56) (xy 340.36 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bd618681-3ccd-49b0-91a9-cf285d47aa8b") + ) + (wire + (pts + (xy 227.33 203.2) (xy 236.22 203.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bdc0276b-83da-46c2-bc7f-db39f83edf86") + ) + (wire + (pts + (xy 326.39 66.04) (xy 326.39 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bdcb7a09-0971-4f97-9cbf-b07601d9f92c") + ) + (wire + (pts + (xy 340.36 194.31) (xy 311.15 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "be122d0f-e8b1-4167-8875-fa67ab4b1683") + ) + (wire + (pts + (xy 368.3 170.18) (xy 368.3 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "be159c3f-ce90-427b-a886-2fa28416cb88") + ) + (wire + (pts + (xy 53.34 132.08) (xy 58.42 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "be2389d6-7d1d-4fef-a2c9-37ecaa34760f") + ) + (wire + (pts + (xy 90.17 220.98) (xy 90.17 222.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "be2c4331-b4a3-4f92-a2e8-b0e5eaf59920") + ) + (wire + (pts + (xy 193.04 130.81) (xy 198.12 130.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "be7a1ffa-4f21-4470-8e13-80c3e58ded2e") + ) + (wire + (pts + (xy 100.33 162.56) (xy 93.98 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bf179fc3-14be-476d-bdf8-531bf1ad9bac") + ) + (wire + (pts + (xy 269.24 182.88) (xy 269.24 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bfc10ee3-45f3-43fe-be52-4e9d5bf3e21e") + ) + (wire + (pts + (xy 138.43 259.08) (xy 138.43 257.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c03d4e39-2e0e-4498-bf18-d53244a8a03f") + ) + (wire + (pts + (xy 281.94 113.03) (xy 281.94 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c0fcebae-a43e-475f-b13c-938bc9d7ae1c") + ) + (wire + (pts + (xy 384.81 68.58) (xy 384.81 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c14ce2f7-85b0-4b45-a54f-bf5920158e52") + ) + (wire + (pts + (xy 223.52 46.99) (xy 223.52 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c152a008-f083-40b4-b80e-79842d8551dd") + ) + (wire + (pts + (xy 328.93 213.36) (xy 341.63 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c1858afd-e804-40ec-aa72-1257f7894d20") + ) + (wire + (pts + (xy 228.6 90.17) (xy 228.6 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c188f76f-ff52-44c9-8df9-147dae2e156e") + ) + (wire + (pts + (xy 381 232.41) (xy 383.54 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c1febe3b-773b-4507-b2d2-c3a9a647db47") + ) + (wire + (pts + (xy 265.43 83.82) (xy 261.62 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c20710da-f9d6-4175-9229-53d54b40085e") + ) + (wire + (pts + (xy 240.03 41.91) (xy 220.98 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c2b1f398-0967-46ad-bab0-f9dfb89dc359") + ) + (wire + (pts + (xy 203.2 269.24) (xy 203.2 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c38b3223-1a27-47c8-b45e-dcb9326ca386") + ) + (wire + (pts + (xy 323.85 231.14) (xy 326.39 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c3f1871a-8afb-48dd-9c5c-7ec02ffe7dc0") + ) + (wire + (pts + (xy 86.36 218.44) (xy 92.71 218.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c48a4bc7-604b-4cb9-a9bb-253237a24723") + ) + (wire + (pts + (xy 34.29 53.34) (xy 44.45 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c49553e7-fc09-419b-b5ec-ec2170e325dc") + ) + (wire + (pts + (xy 139.7 38.1) (xy 139.7 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4ee4c8d-8f74-4b92-88f3-8a41cc8a4759") + ) + (wire + (pts + (xy 134.62 91.44) (xy 140.97 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c5868fb6-fbb0-404d-a181-ffb70679373c") + ) + (wire + (pts + (xy 393.7 182.88) (xy 389.89 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c60dc552-f03a-4ab4-85da-f90a535a78f0") + ) + (wire + (pts + (xy 187.96 176.53) (xy 187.96 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c61f6508-211b-42e4-9a79-3b5f8e7f1902") + ) + (wire + (pts + (xy 243.84 25.4) (xy 243.84 22.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c658a0d9-31ea-43f0-af21-c53bc22d636b") + ) + (wire + (pts + (xy 153.67 264.16) (xy 153.67 265.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c6ae5922-3682-4455-bb03-890c69e987ff") + ) + (wire + (pts + (xy 251.46 245.11) (xy 247.65 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c6f5ccb2-29b1-4087-b96b-4a7fe2e21891") + ) + (wire + (pts + (xy 328.93 177.8) (xy 356.87 177.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c6fcbe0d-822b-446b-900a-769ba2d75ccb") + ) + (wire + (pts + (xy 322.58 52.07) (xy 322.58 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c75fbbf3-1909-4a9b-88a1-eece96ca5461") + ) + (wire + (pts + (xy 290.83 194.31) (xy 281.94 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c7dfdae6-ccab-4dba-8fdf-0103584c718c") + ) + (wire + (pts + (xy 288.29 48.26) (xy 288.29 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c84cdc60-7d20-44b6-aba2-6b626cb75b43") + ) + (wire + (pts + (xy 264.16 195.58) (xy 261.62 195.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c85da147-17ac-4fa4-92cc-272deaf97078") + ) + (wire + (pts + (xy 115.57 213.36) (xy 111.76 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c8d5e62d-0f6e-4c8a-a265-471ea1f345b4") + ) + (wire + (pts + (xy 266.7 194.31) (xy 266.7 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c9807783-0362-4b14-8582-b71193377934") + ) + (wire + (pts + (xy 247.65 245.11) (xy 242.57 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ca9463e6-92f0-4720-8559-33faa618d242") + ) + (wire + (pts + (xy 227.33 228.6) (xy 214.63 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cb342867-f56f-427f-a337-7a9c097c8893") + ) + (wire + (pts + (xy 358.14 170.18) (xy 356.87 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cb62cf8d-6caa-444d-90d6-36592f454170") + ) + (wire + (pts + (xy 52.07 161.29) (xy 52.07 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cc097896-5ea4-495e-920e-51845896e3a8") + ) + (wire + (pts + (xy 368.3 205.74) (xy 368.3 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cce5a34a-3662-401e-b3e3-126a94745fc9") + ) + (wire + (pts + (xy 115.57 24.13) (xy 120.65 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cd4741b1-1246-4186-84bf-b3d7eec70044") + ) + (wire + (pts + (xy 138.43 137.16) (xy 139.7 137.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cdfc1101-d023-4e07-940a-9efc60b33ae4") + ) + (wire + (pts + (xy 194.31 104.14) (xy 191.77 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cecf03a2-3920-4cad-86e5-497de06d2196") + ) + (wire + (pts + (xy 273.05 234.95) (xy 266.7 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ced5368e-205a-40ed-972b-9f0582daa669") + ) + (wire + (pts + (xy 168.91 215.9) (xy 168.91 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cfb046ff-e352-4663-a079-550119efa9be") + ) + (wire + (pts + (xy 328.93 200.66) (xy 328.93 208.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cfbed0e3-38e9-4a40-a663-7cf5fd0c246f") + ) + (wire + (pts + (xy 308.61 44.45) (xy 309.88 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d0643ac7-d6d6-45fa-8f4f-4afeaa093016") + ) + (wire + (pts + (xy 217.17 269.24) (xy 217.17 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d1d9db6d-42cf-4476-b5e1-c8eb69c07c42") + ) + (wire + (pts + (xy 365.76 66.04) (xy 364.49 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d258d8d6-a15b-4757-bc30-523be8f9466d") + ) + (wire + (pts + (xy 322.58 39.37) (xy 322.58 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d2989142-cdf6-495a-9cb5-570bffc7a873") + ) + (wire + (pts + (xy 280.67 44.45) (xy 300.99 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d46b577c-48b9-4641-9de2-73ad1b444d42") + ) + (wire + (pts + (xy 110.49 99.06) (xy 111.76 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d49f084b-4d9f-4fbf-b04d-b693435eb6ca") + ) + (wire + (pts + (xy 187.96 91.44) (xy 187.96 123.19) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d4dda4f9-bc22-4156-a6cf-e9b64c1e0f5c") + ) + (wire + (pts + (xy 106.68 45.72) (xy 115.57 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d5f1bd3b-5f57-46c3-8a9a-034ff6ac13ee") + ) + (wire + (pts + (xy 219.71 81.28) (xy 220.98 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d6763a20-d16b-42ee-bb03-9f45132dbcb7") + ) + (wire + (pts + (xy 133.35 110.49) (xy 133.35 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d6aa3060-3137-46bc-b51f-3baa3deda373") + ) + (wire + (pts + (xy 52.07 165.1) (xy 54.61 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d76deaf3-40e2-44ed-8617-47254e431a7f") + ) + (wire + (pts + (xy 358.14 205.74) (xy 355.6 205.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d786f128-4766-4922-97f3-8ed774024a08") + ) + (wire + (pts + (xy 135.89 110.49) (xy 135.89 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d79508a5-c12b-4478-b43d-a6c21206f22a") + ) + (wire + (pts + (xy 130.81 251.46) (xy 130.81 250.19) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d7a022cc-0e51-44ba-8053-d181160a1696") + ) + (wire + (pts + (xy 36.83 152.4) (xy 36.83 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d7cb27e5-3e29-415f-904c-9d5a552143f2") + ) + (wire + (pts + (xy 55.88 140.97) (xy 55.88 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d80c9a9f-77a4-478a-ac58-2aa3709ce307") + ) + (wire + (pts + (xy 147.32 62.23) (xy 147.32 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d88c0f3a-ada6-4c1f-8a8e-1032733b2601") + ) + (wire + (pts + (xy 290.83 210.82) (xy 281.94 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d917d145-1f89-4bd3-80b7-c803dd78f70f") + ) + (wire + (pts + (xy 331.47 208.28) (xy 328.93 208.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d9485f5e-177c-4603-806c-4d54d9374f8c") + ) + (wire + (pts + (xy 43.18 102.87) (xy 50.8 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d9808d19-8da9-4905-bfb9-44d02d4cf04b") + ) + (wire + (pts + (xy 26.67 102.87) (xy 33.02 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d9a467e9-5746-48ce-b9e1-005b440def9b") + ) + (wire + (pts + (xy 224.79 200.66) (xy 224.79 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d9b12f66-08a4-4ff7-ba07-14816855c40b") + ) + (wire + (pts + (xy 69.85 87.63) (xy 69.85 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc9c98e7-cc7a-4ddc-8f6e-78e17116c987") + ) + (wire + (pts + (xy 313.69 234.95) (xy 309.88 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd1fba89-b302-4d81-8c8e-2d854e5e1cf5") + ) + (wire + (pts + (xy 92.71 220.98) (xy 90.17 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd2dd666-7cd0-4c1c-9464-ca5d570acba7") + ) + (wire + (pts + (xy 325.12 39.37) (xy 322.58 39.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd6d758b-98e1-4f05-ba5d-edec8f2f3e86") + ) + (wire + (pts + (xy 43.18 161.29) (xy 36.83 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dda85920-a2d2-4ddc-9468-e4d4fcd2adf2") + ) + (wire + (pts + (xy 138.43 24.13) (xy 140.97 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "de026ed2-780e-481b-bd93-d226a17e4d78") + ) + (wire + (pts + (xy 62.23 53.34) (xy 73.66 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "de222f6d-0fc0-4376-9d9d-d783a879d81c") + ) + (wire + (pts + (xy 247.65 41.91) (xy 248.92 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "de315eec-bfcc-45e0-b455-a8e67e3d3884") + ) + (wire + (pts + (xy 100.33 134.62) (xy 93.98 134.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "de93f3fe-6bbd-4e04-88f1-50e94d94e20b") + ) + (wire + (pts + (xy 187.96 130.81) (xy 187.96 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "de9f1471-e0bc-4511-8fbe-d0a5f11996ae") + ) + (wire + (pts + (xy 115.57 215.9) (xy 111.76 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "decdb992-6865-4b98-9bc7-8faa6d041b5c") + ) + (wire + (pts + (xy 160.02 255.27) (xy 153.67 255.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "df4ead64-3ee0-4488-8fc9-c7b5a796e066") + ) + (wire + (pts + (xy 243.84 162.56) (xy 243.84 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e02fcbf7-668c-4260-93d6-300dfca0ea4b") + ) + (wire + (pts + (xy 336.55 231.14) (xy 336.55 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e09bd54c-14e1-4039-a312-9e064cb526b4") + ) + (wire + (pts + (xy 231.14 96.52) (xy 231.14 81.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e13dcb93-f3a3-4d3f-bcb2-594fc8963890") + ) + (wire + (pts + (xy 261.62 90.17) (xy 262.89 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e16c0e7e-768e-44f2-b6d3-abbe48a856f6") + ) + (wire + (pts + (xy 168.91 163.83) (xy 195.58 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e188ec2a-e5f1-4ac8-ad93-241597d283ad") + ) + (wire + (pts + (xy 185.42 62.23) (xy 185.42 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e1ee4e6d-c11e-4e48-9eec-257bffa099ed") + ) + (wire + (pts + (xy 43.18 173.99) (xy 36.83 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e2837bf8-1a1f-4d69-93e8-29abc7bfd773") + ) + (wire + (pts + (xy 318.77 59.69) (xy 309.88 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e2ca4d11-4d7d-4845-9023-02e856091b18") + ) + (wire + (pts + (xy 73.66 53.34) (xy 80.01 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3a47d11-9c10-496e-a3b7-7dc118c8548e") + ) + (wire + (pts + (xy 62.23 31.75) (xy 73.66 31.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3a81afe-567e-4786-a1d6-7b4abae2be81") + ) + (wire + (pts + (xy 373.38 232.41) (xy 370.84 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e47943e4-d6dc-4b6f-a6a6-2ecf172b6249") + ) + (wire + (pts + (xy 91.44 24.13) (xy 101.6 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e5924541-6a75-4152-bc72-6b5c73164481") + ) + (wire + (pts + (xy 190.5 93.98) (xy 194.31 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e5f7ff4e-ecba-44cd-b78d-92d795e41072") + ) + (wire + (pts + (xy 262.89 35.56) (xy 262.89 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e6096ae3-946d-4d45-9b73-e1d8709f91f7") + ) + (wire + (pts + (xy 138.43 19.05) (xy 138.43 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e688566d-71b3-4b3e-9120-e2b42367bb32") + ) + (wire + (pts + (xy 226.06 101.6) (xy 226.06 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e6c42602-79b1-4f12-90d3-c9cdf1e6d884") + ) + (wire + (pts + (xy 50.8 173.99) (xy 52.07 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e6c54e61-e80d-4e07-b7d7-987dc6534ad4") + ) + (wire + (pts + (xy 91.44 45.72) (xy 99.06 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e7f93f18-7a0c-47a6-8391-7dc5e7806892") + ) + (wire + (pts + (xy 219.71 99.06) (xy 228.6 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e805eadd-6162-4504-ad3b-4e57dd04afb2") + ) + (wire + (pts + (xy 207.01 111.76) (xy 207.01 113.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e83d80a3-fe44-431e-8259-6902496fb5ab") + ) + (wire + (pts + (xy 179.07 102.87) (xy 191.77 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e9d0fdbc-2c5e-41db-8cf1-ca286ba413f3") + ) + (wire + (pts + (xy 191.77 81.28) (xy 191.77 78.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ea3b425f-e512-44f0-b8ac-41346c312165") + ) + (wire + (pts + (xy 219.71 83.82) (xy 228.6 83.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eaa4522e-080e-4bb7-8af7-56959dd05f5f") + ) + (wire + (pts + (xy 261.62 105.41) (xy 281.94 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eb6d6577-6aa1-48be-87da-f06e3ab74cdf") + ) + (wire + (pts + (xy 69.85 45.72) (xy 73.66 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ebaf72e5-9309-4f4f-9263-54005cb1de9a") + ) + (wire + (pts + (xy 139.7 148.59) (xy 143.51 148.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ec9aac1b-bb9f-46a1-a03b-a6c29623a2cd") + ) + (wire + (pts + (xy 62.23 53.34) (xy 44.45 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ece426e4-f10e-4207-a72c-07cd1c007a32") + ) + (wire + (pts + (xy 228.6 90.17) (xy 240.03 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ed0360ca-a1bc-48e7-bce1-bdd83b84fae8") + ) + (wire + (pts + (xy 134.62 156.21) (xy 143.51 156.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "edb37245-c1c8-441a-93c8-42ae5987b381") + ) + (wire + (pts + (xy 115.57 91.44) (xy 110.49 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee3228d1-64a8-45e7-a88d-747033b9bff1") + ) + (wire + (pts + (xy 261.62 185.42) (xy 266.7 185.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee4e9ef3-c181-4f19-807e-110ee2b50dc3") + ) + (wire + (pts + (xy 130.81 266.7) (xy 130.81 273.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee8d9d77-0ee8-4749-bf35-ccd2184233d9") + ) + (wire + (pts + (xy 190.5 130.81) (xy 190.5 143.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eef38942-8241-4b1c-b8c9-81a63a4b6e62") + ) + (wire + (pts + (xy 281.94 160.02) (xy 281.94 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ef147794-27cb-4123-aca6-fcba29af5064") + ) + (wire + (pts + (xy 129.54 96.52) (xy 125.73 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f1e1405e-4f4d-42ef-8cd5-f03fba7ab69d") + ) + (wire + (pts + (xy 303.53 210.82) (xy 300.99 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f27c32ef-ac65-4254-a03b-f8e253addff5") + ) + (wire + (pts + (xy 140.97 111.76) (xy 140.97 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f2900bc2-5a0e-4bb5-990d-eadee9de7b33") + ) + (wire + (pts + (xy 298.45 231.14) (xy 298.45 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f2985607-157c-41c2-8ba2-383c684cea12") + ) + (wire + (pts + (xy 217.17 261.62) (xy 209.55 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f2a12f31-1e75-42f2-8637-ebce92ed261b") + ) + (wire + (pts + (xy 341.63 231.14) (xy 341.63 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f2cd26c1-6d88-4722-8d60-ba072a0979fb") + ) + (wire + (pts + (xy 269.24 200.66) (xy 261.62 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f31d82ca-a778-43bd-8ef0-85922125c52f") + ) + (wire + (pts + (xy 355.6 232.41) (xy 355.6 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f3670e29-d97b-4789-a923-302687fb6098") + ) + (wire + (pts + (xy 153.67 260.35) (xy 153.67 264.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f369bf03-7a5a-42ed-8d6f-0afec0dcd38b") + ) + (wire + (pts + (xy 137.16 111.76) (xy 138.43 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f4ea1755-6c64-4138-a685-cf36affc6d27") + ) + (wire + (pts + (xy 342.9 74.93) (xy 347.98 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f612c871-85af-471b-a522-cb9c55e0415e") + ) + (wire + (pts + (xy 143.51 151.13) (xy 137.16 151.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f61c81d1-5600-4ecd-809d-a5ad4f6a4d26") + ) + (wire + (pts + (xy 157.48 148.59) (xy 160.02 148.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f7d7bbe6-23bb-417e-a307-f16d2239c3ab") + ) + (wire + (pts + (xy 175.26 205.74) (xy 175.26 208.28) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f88f2eb4-ea80-4a52-bce2-3ede994d0f22") + ) + (wire + (pts + (xy 353.06 236.22) (xy 355.6 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f895ad5f-60d8-4931-bf01-148234fefbfd") + ) + (wire + (pts + (xy 205.74 156.21) (xy 209.55 156.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f8fee96f-8ce9-4573-bc97-137173c118eb") + ) + (wire + (pts + (xy 354.33 90.17) (xy 384.81 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f97f8f05-4139-41d5-8578-71f21741d05e") + ) + (wire + (pts + (xy 297.18 67.31) (xy 297.18 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f99910f0-d3cf-41f0-8a83-d119f13faf1f") + ) + (wire + (pts + (xy 347.98 194.31) (xy 340.36 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fa215f34-e744-40cb-8f3d-f02154d80fd8") + ) + (wire + (pts + (xy 43.18 146.05) (xy 54.61 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fab07c1f-5b6c-4bfd-94c3-ca72a31810b1") + ) + (wire + (pts + (xy 346.71 231.14) (xy 346.71 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fad0f76e-c37f-4a6e-a62b-5dd37a7cba34") + ) + (wire + (pts + (xy 214.63 228.6) (xy 214.63 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fadf3aae-c724-4ba4-8386-0e9f06027985") + ) + (wire + (pts + (xy 389.89 175.26) (xy 389.89 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fafce94f-7174-4b2c-841b-b2f96b5ee4b4") + ) + (wire + (pts + (xy 309.88 36.83) (xy 309.88 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fbddb59e-b592-4325-8134-135e4c03d07d") + ) + (wire + (pts + (xy 69.85 24.13) (xy 73.66 24.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fc78ba7d-d126-4756-ad49-6c6eaaa98a37") + ) + (wire + (pts + (xy 138.43 111.76) (xy 140.97 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fcb3b153-505b-4ffb-bd39-0525cdd802ad") + ) + (wire + (pts + (xy 195.58 162.56) (xy 195.58 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fcbf79d4-1cdd-44c2-a099-451101bab860") + ) + (wire + (pts + (xy 140.97 19.05) (xy 138.43 19.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd120123-b8cc-4030-af80-ac85b36e4fa8") + ) + (wire + (pts + (xy 336.55 243.84) (xy 336.55 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd2690c4-9fb8-465f-91f0-ffcfeb254223") + ) + (wire + (pts + (xy 115.57 86.36) (xy 110.49 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd45149b-7050-4370-91a3-adfcae3a55fa") + ) + (wire + (pts + (xy 190.5 162.56) (xy 190.5 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd4677eb-92a5-4878-9efa-0e9ec7b1672f") + ) + (wire + (pts + (xy 303.53 158.75) (xy 300.99 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fde0379d-a048-488d-9338-33979e7f46c4") + ) + (wire + (pts + (xy 237.49 240.03) (xy 237.49 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fe0c632b-9531-46a3-9e09-fc7e7943225e") + ) + (wire + (pts + (xy 67.31 102.87) (xy 68.58 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fe94309e-7c11-47e4-a4d3-bd2d03d2a4ce") + ) + (wire + (pts + (xy 281.94 194.31) (xy 266.7 194.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "feb94796-7b12-488d-8414-9a5f5373916b") + ) + (wire + (pts + (xy 147.32 60.96) (xy 146.05 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fef2b9c8-3e67-4038-9451-3c9a159ba96b") + ) + (wire + (pts + (xy 46.99 92.71) (xy 50.8 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff2d9517-e2cb-4e28-9ddf-94ec794e9a7e") + ) + (wire + (pts + (xy 191.77 231.14) (xy 181.61 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff5fcab9-babc-4949-812a-e71e4bed47ce") + ) + (label "TC1" + (at 100.33 132.08 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "0151dac3-4fd4-4426-b5dd-2beb436402e1") + ) + (label "X Mode" + (at 162.56 199.39 180) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "0f9742f9-19d3-49a9-92e8-8e690e505c7f") + ) + (label "RC0.5" + (at 85.09 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "14d56a45-ba66-47d2-a3ee-c6ae779e8c03") + ) + (label "TC4" + (at 115.57 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "1c1c0c57-a5f2-4a5f-99a2-547973a52b26") + ) + (label "SDA" + (at 209.55 153.67 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "1eab2b5c-b1f7-48d6-9ba5-0947ddddc164") + ) + (label "TC8" + (at 115.57 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "25c05216-9334-44c0-a86e-b4e4a2ca29a4") + ) + (label "TX90" + (at 190.5 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "2b3e4fda-2833-49c8-af2f-b309f8b325d3") + ) + (label "TC4" + (at 100.33 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "2d14dc97-f999-44fd-a18c-c95d5e8cdadb") + ) + (label "ExciterEnable" + (at 234.95 196.85 180) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "2ece0263-c172-4bf8-a73a-5a5b3bacc177") + ) + (label "RXTX" + (at 134.62 158.75 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "33ea99d1-cf7c-44d6-8c31-450e611c1931") + ) + (label "RC8" + (at 100.33 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "39d1e1a4-9b52-42fb-a4f0-6719b21f3623") + ) + (label "TC0.5" + (at 86.36 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3f2d18ab-ded6-4f75-89cd-7409dc04ed7f") + ) + (label "RC0.5" + (at 100.33 152.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "46a28b61-564a-4b3b-94ce-72592069f40b") + ) + (label "TX0" + (at 187.96 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "4733d42f-b29f-48ce-a5d6-416afe666c09") + ) + (label "Q_out" + (at 384.81 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "47e58cc9-8a97-4727-92eb-2db25717a15f") + ) + (label "SDA" + (at 53.34 129.54 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "4973552b-e76e-4077-88c0-3c959b10b6d8") + ) + (label "SDA" + (at 137.16 151.13 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "5aa720ef-ba5c-42f0-bc43-991426572f9c") + ) + (label "TC8" + (at 100.33 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "5cc581c0-4a72-4141-aa9a-a8d10b2860c4") + ) + (label "Cal" + (at 66.04 251.46 180) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify right bottom) + ) + (uuid "5f8d8838-129e-43ec-919e-37ad128d7480") + ) + (label "TC1" + (at 115.57 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "60f18817-7a8c-4f97-8121-9df64896082c") + ) + (label "RC1" + (at 115.57 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "62371618-7f32-4616-972d-d11a903b5385") + ) + (label "SCL" + (at 139.7 148.59 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "660a10a5-f9e3-4647-bcac-4a8258b4b68f") + ) + (label "RXTX" + (at 273.05 234.95 180) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify right bottom) + ) + (uuid "6b36d394-170c-42b2-8e11-f09232676f85") + ) + (label "I_out" + (at 384.81 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "72c8c688-48dd-4797-9676-973434bff668") + ) + (label "RC8" + (at 115.57 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "77a15a20-3ffb-4e99-a618-cb30bb55d4f2") + ) + (label "RX0" + (at 190.5 134.62 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7d19b16c-46a9-4ec6-937d-65f99a09e770") + ) + (label "RC16" + (at 85.09 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7e3ec8b4-4767-4edd-b6ee-d5e2f3620057") + ) + (label "CW on{slash}off" + (at 134.62 156.21 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "82b1c4ce-57c0-40a9-9d74-8ff683b05b7b") + ) + (label "RC1" + (at 100.33 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "90b40406-54a6-4093-b9af-71504accb108") + ) + (label "SCL" + (at 53.34 132.08 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "9352a2c3-6cf6-4b8f-a4ad-0e65c3d581c2") + ) + (label "RC2" + (at 115.57 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "9555a3a5-cde8-42a5-af13-4b463df67b33") + ) + (label "RC2" + (at 100.33 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "9d6779fc-48a8-4916-89c1-b502abc34a8b") + ) + (label "RC4" + (at 100.33 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "a7864cca-683e-49ab-82f1-e2b89084961f") + ) + (label "TC16" + (at 86.36 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "a9e44e3d-9b83-42a7-b763-31e02f2c2d01") + ) + (label "RC16" + (at 100.33 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "aa879221-3e3c-47ff-9a0c-d32368519295") + ) + (label "RFIN" + (at 31.75 218.44 180) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "ae685060-ae79-44a3-8d51-6c0d88e5a655") + ) + (label "TC2" + (at 115.57 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ae74c6e0-4916-42d6-9fc4-f2ee4a364baa") + ) + (label "CW" + (at 195.58 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "c4ceda7b-df5c-4774-827b-8c48228225f9") + ) + (label "CW on{slash}off" + (at 177.8 255.27 180) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify right bottom) + ) + (uuid "c74e5d9c-5fbe-43bb-8b0b-d2e553b32ce1") + ) + (label "X Mode" + (at 162.56 153.67 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "d6557b70-2b12-42c8-9d22-ecfffeb8b566") + ) + (label "TC16" + (at 100.33 142.24 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "e1d3054a-56c5-4677-98da-ce1f3d1b26a1") + ) + (label "RC4" + (at 115.57 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "e2b47357-39ce-47b0-bba2-70205b75c507") + ) + (label "Cal" + (at 162.56 158.75 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "e4d3be49-88c1-4fa6-83f2-e8012d1d15b2") + ) + (label "TC2" + (at 100.33 134.62 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ed78916e-8030-4072-9fb6-ee772f607e63") + ) + (label "SCL" + (at 209.55 156.21 0) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "efe412e4-ab5c-4282-b978-13c6554cd1b8") + ) + (label "RX90" + (at 187.96 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "f0700102-db01-4ba8-b079-d10d6ee4fd99") + ) + (label "TC0.5" + (at 100.33 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ff1dcbf5-2ff9-4899-a70f-bfce8ab3cb52") + ) + (symbol + (lib_id "Device:R") + (at 217.17 256.54 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "00246cb7-3861-4c23-97da-6605bb13aeeb") + (property "Reference" "R26" + (at 215.392 255.3279 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 215.392 257.7521 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 215.392 256.54 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 217.17 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 217.17 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 217.17 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 217.17 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8f2ca1cc-646c-4a7e-b037-584872ea311b") + ) + (pin "1" + (uuid "92625b66-e159-4b6e-a862-cd1acf480548") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R26") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 290.83 175.26 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "01a0ef8f-36af-4e18-b875-dced6f3511d3") + (property "Reference" "TP10" + (at 289.433 170.7459 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 289.433 173.1701 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 285.75 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 285.75 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 290.83 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 290.83 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e1c57a93-b845-4c32-b650-88dcc2c01eb0") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 177.8 91.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0290e991-8bb0-4f02-bce8-118aa626a0c8") + (property "Reference" "R20" + (at 179.578 90.2279 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10k" + (at 179.578 92.6521 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 176.022 91.44 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 177.8 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 177.8 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 177.8 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 177.8 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b21e7af0-4f02-41a5-a957-a0ba7ddae737") + ) + (pin "1" + (uuid "ac41632f-dd56-4565-9d90-2ac96cda47e3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 120.65 45.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "034a0cd2-4926-422e-8eb0-b56bd12745b5") + (property "Reference" "TP18" + (at 122.047 41.2059 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 122.047 43.6301 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 125.73 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 125.73 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 120.65 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 120.65 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a543b150-0f31-441d-b84a-f53a041dd9ba") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 297.18 194.31 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "03c5d55e-72b3-4092-9913-f082638efe48") + (property "Reference" "R38" + (at 297.18 189.1497 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "49R9 1%" + (at 297.18 191.5739 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 297.18 196.088 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 297.18 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 297.18 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2984401" + (at 297.18 194.31 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CRCW120649R9FKEAC" + (at 297.18 194.31 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "fb9eb269-6897-42a0-98c0-f5fc13e310fa") + ) + (pin "1" + (uuid "a3e963bc-e460-480a-b529-a7fb802e54cc") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R38") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Audio:AudioJack3_SwitchTR") + (at 398.78 63.5 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "04582302-d9b5-4de1-979d-20ae5b2bc4ad") + (property "Reference" "J1" + (at 400.685 55.5457 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "IQ_Out" + (at 400.685 57.9699 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:Jack_3.5mm_STX-3081_Horizontal" + (at 398.78 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 398.78 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 398.78 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 398.78 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "SJ1-3515N" + (at 398.78 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "RN" + (uuid "828d9958-195b-40be-9aa9-faf70d4e1fa3") + ) + (pin "T" + (uuid "d4225aef-ccc6-4503-8cc6-c0aad463cb9d") + ) + (pin "S" + (uuid "313d3dea-f9b2-441f-b61f-0099b50d9d57") + ) + (pin "R" + (uuid "1592e4b3-e83c-4026-a330-1b0a59c5c42f") + ) + (pin "TN" + (uuid "1d54d0b9-7887-42e3-bc4c-7726fd9516c2") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 147.32 86.36 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "047baf6d-8cca-46c0-8fc8-373fcd683105") + (property "Reference" "R14" + (at 149.098 85.1479 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "36R5" + (at 149.098 87.5721 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 145.542 86.36 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 147.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C205349" + (at 147.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CRCW120636R5FKEA" + (at 147.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8d76923e-7301-4718-95b5-6176164536f9") + ) + (pin "1" + (uuid "891aada7-753f-4b53-bc9f-3bb72743c092") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Polarized") + (at 34.29 49.53 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "048b6365-a59b-49ee-83db-d30c96c3c008") + (property "Reference" "C69" + (at 31.369 47.4289 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "470uF 25V" + (at 31.369 49.8531 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_THT:CP_Radial_D10.0mm_P5.00mm" + (at 33.3248 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 34.29 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 34.29 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 34.29 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" " ECA-1EM471" + (at 34.29 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "16e91181-0588-48e6-9fea-90a2ea27e44b") + ) + (pin "1" + (uuid "e60d59a8-66ca-438a-89c0-beeccc69c54b") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C69") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 39.37 146.05 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "071668b0-ba22-494c-a5a3-d1ac16c4618e") + (property "Reference" "JP17" + (at 39.37 143.4409 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 39.37 143.4409 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 39.37 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 39.37 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 39.37 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 39.37 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "30572bc6-1d41-4467-a670-5d04b2cf8ea9") + ) + (pin "1" + (uuid "520322b2-2ab7-4897-996e-861c0373e93c") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "JP17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 87.63 222.25 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "089a996f-056a-4a83-b10b-03313b7a8230") + (property "Reference" "#PWR063" + (at 87.63 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 90.424 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 87.63 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 87.63 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 87.63 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f0b24cf4-3c56-4df6-a0cf-b4bb9763852e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR063") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 137.16 78.74 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "08c7d01b-39fd-4c0f-a2fa-f519b249987d") + (property "Reference" "#PWR011" + (at 137.16 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 132.334 77.978 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 137.16 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 137.16 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 137.16 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "aed621fa-54f1-4854-b4eb-1a0975bf9c04") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR011") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 248.92 102.87 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0a382700-8107-47e2-b455-b22b25758a43") + (property "Reference" "C28" + (at 251.841 101.6579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10nF 50V" + (at 251.841 104.0821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 247.9548 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 248.92 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 248.92 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1846" + (at 248.92 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C103K5RAC7210" + (at 248.92 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "78663115-aa96-438e-bf2f-528e9bf2f8cc") + ) + (pin "1" + (uuid "02cc780c-7fbd-41e4-a6ca-a0a9dc85de55") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C28") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 365.76 66.04 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0ac4d9c2-305f-4261-a996-efedd4da4cfc") + (property "Reference" "#PWR037" + (at 365.76 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 365.76 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 365.76 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 365.76 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 365.76 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1c10e4a4-42d2-46a2-b1f9-f3601f03a7e4") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR037") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 76.2 238.76 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0acbd015-fe1f-4c27-a891-489b817ab310") + (property "Reference" "#PWR072" + (at 72.39 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 76.2 241.3 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 76.2 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 76.2 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 76.2 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f8d184ad-316f-467c-95c8-30ab3244f7d0") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR072") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 251.46 240.03 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0b71a289-a48d-4f30-a61a-41247aa1cbd4") + (property "Reference" "R48" + (at 249.682 238.8179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "100k" + (at 249.682 241.2421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 253.238 240.03 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 251.46 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 251.46 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17900" + (at 251.46 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CRCW1206100KFKEAC" + (at 251.46 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "950890ff-ce0f-4376-a3a8-14ae4ab44955") + ) + (pin "1" + (uuid "62c48ccc-b042-467b-8290-d883de2ec983") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R48") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 73.66 215.9 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0b76c1f3-ae09-4964-a2c3-b3a138d419a3") + (property "Reference" "C63" + (at 73.66 222.2033 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 73.66 219.7791 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 69.85 216.8652 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 73.66 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 73.66 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 73.66 215.9 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 73.66 215.9 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e3643064-0d7f-4681-9330-fdf86a4d18b5") + ) + (pin "1" + (uuid "b373cbcd-d8f4-4e81-9151-4be97f339935") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C63") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 91.44 49.53 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0b805e27-5453-4732-a757-157994f1ce08") + (property "Reference" "C72" + (at 94.361 48.3179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 94.361 50.7421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 92.4052 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 91.44 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 91.44 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 91.44 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 91.44 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6caec6ee-9f74-4d6d-90c2-c71813dc8df5") + ) + (pin "1" + (uuid "084b5dc4-3c62-49ed-aaba-811e6cdc0966") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C72") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Audio:AudioJack3_SwitchTR") + (at 398.78 182.88 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0b9d605b-8272-4da3-927e-09bf8ecd3f30") + (property "Reference" "J5" + (at 400.685 174.9257 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "IQ_In" + (at 400.685 177.3499 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:Jack_3.5mm_STX-3081_Horizontal" + (at 398.78 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 398.78 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 398.78 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 398.78 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "SJ1-3515N" + (at 398.78 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "RN" + (uuid "d6345e8a-1eb2-4170-88ab-8e4e503170c1") + ) + (pin "T" + (uuid "ffc9355a-3022-4fa3-ae78-4a9e00d686f3") + ) + (pin "S" + (uuid "b81ee287-7387-4942-b8c1-0f5cefe0aecc") + ) + (pin "R" + (uuid "51b31117-fa65-4ae8-9b4d-116b4cd84df8") + ) + (pin "TN" + (uuid "7724f492-5fe4-4100-97c1-8c8955409c14") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 242.57 223.52 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0c4cab63-fe82-48cc-b4ab-8a8ba567bb05") + (property "Reference" "R39" + (at 240.792 222.3079 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10k" + (at 240.792 224.7321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 240.792 223.52 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 242.57 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 242.57 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 242.57 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 242.57 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3eabf04f-8ace-4db5-9921-b2a16a3c219a") + ) + (pin "1" + (uuid "9ac9cdbf-1f38-4d74-878f-070a0285f38b") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R39") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 382.27 205.74 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0d8e08c4-b089-4425-85c1-18e7b61e1f63") + (property "Reference" "R67" + (at 382.27 200.5795 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 382.27 203.0038 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 382.27 207.518 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 382.27 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 382.27 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 382.27 205.74 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 382.27 205.74 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ee801a57-8abc-4b31-850d-ab8d04f3ec0a") + ) + (pin "1" + (uuid "ad279040-e43d-47ee-aa75-0b89c2df7a06") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R67") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 35.56 147.32 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0de05137-a7a7-4098-a1e8-da5fc5f23aaa") + (property "Reference" "#PWR093" + (at 35.56 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 33.02 148.59 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 35.56 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 35.56 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 35.56 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9db35ee6-5bb1-4c08-a50d-34e706a49dbf") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR093") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 383.54 232.41 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0e0dca48-8401-4a25-bbcf-4d807f518ec4") + (property "Reference" "#PWR045" + (at 383.54 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 383.54 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 383.54 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 383.54 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 383.54 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "17d43dc2-4d88-4e2d-b81a-278ecd7a09b7") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR045") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 351.79 158.75 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0e1038ec-402a-4a0c-a2a6-3a6b63463f4f") + (property "Reference" "R25" + (at 351.79 153.5897 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k 1%" + (at 351.79 156.0139 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 351.79 160.528 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 351.79 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 351.79 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 351.79 158.75 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 351.79 158.75 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "acca2d02-3dd5-43c1-bfd5-8339fba9db95") + ) + (pin "1" + (uuid "cfe652a6-c926-4df5-bdb6-b7b7177432ac") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R25") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:LM1117T-3.3") + (at 62.23 45.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "1076a160-2fc8-48a7-87c5-54c02c210b9f") + (property "Reference" "U15" + (at 62.23 39.6707 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM1117T-3.3" + (at 62.23 42.0949 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 62.23 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm1117.pdf" + (at 62.23 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 62.23 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C201726" + (at 62.23 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "LM1117T-3.3/NOPB" + (at 62.23 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "4e856064-f410-4982-8b08-a4d5fd7418dd") + ) + (pin "2" + (uuid "013b6a8a-bec8-487e-8373-236b64df5ff6") + ) + (pin "1" + (uuid "17044a74-bf15-4002-809a-5f98903c2125") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 281.94 114.3 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "108384fb-3537-45bd-b0df-689ad26532a7") + (property "Reference" "#PWR029" + (at 281.94 120.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 281.94 118.4331 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 281.94 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 281.94 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "28dea3a5-5f2e-41b8-9d35-8473f209422d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR029") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 179.07 102.87 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "110a334b-dcf5-4016-b548-43542d9a19ff") + (property "Reference" "TP6" + (at 177.673 107.3841 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 177.673 104.9599 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 173.99 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 173.99 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 179.07 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 179.07 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9fcb286e-5c39-4d74-8149-1b08b0e2d75f") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 208.28 149.86 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1164c150-14ab-4b93-898a-2899f3bef612") + (property "Reference" "#PWR084" + (at 208.28 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 209.55 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 208.28 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 208.28 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 208.28 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4b374cef-95c1-4f4a-acc9-a814fab4bc30") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR084") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 248.92 157.48 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "122e4d81-69a2-4b65-99aa-d77f5fb9a947") + (property "Reference" "#PWR052" + (at 248.92 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 252.73 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 248.92 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 248.92 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 248.92 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "edcb060d-22c3-4ded-b687-3e4d8657c251") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR052") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 243.84 73.66 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "124d1745-51fe-4f71-869e-f96ae7f63337") + (property "Reference" "#PWR025" + (at 243.84 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 243.84 77.7931 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 243.84 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 243.84 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "bb64dc8b-5abe-4881-958f-bc20b273d180") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR025") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 142.24 199.39 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "12d4b9e6-7b80-4785-99d2-49a191cf8b1f") + (property "Reference" "U5" + (at 138.43 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 137.16 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 142.24 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 142.24 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 142.24 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C8207" + (at 142.24 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "SN74LVC1G04DCKR" + (at 142.24 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "04c5b16f-8561-43df-a2b4-6ed495344b9c") + ) + (pin "4" + (uuid "c43b66f8-882d-47ff-9cb0-b1257c5748dd") + ) + (pin "3" + (uuid "17c3bb1c-e6d3-45f7-828f-1a33fbbedaeb") + ) + (pin "5" + (uuid "786c94a6-3f7b-4683-afec-41f3acafad51") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 44.45 49.53 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "14958baa-fb6b-4ad7-a139-c14d848671a6") + (property "Reference" "C70" + (at 47.371 48.3179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 47.371 50.7421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 45.4152 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 44.45 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 44.45 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 44.45 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 44.45 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "66bb862c-7331-4cac-8b17-d29d0d167aef") + ) + (pin "1" + (uuid "41bf3267-286b-4e00-ba14-d50365760fba") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C70") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 271.78 44.45 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1564b91c-b52f-4107-b971-1905bf199be4") + (property "Reference" "U106" + (at 271.78 53.6743 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AD8599" + (at 271.78 51.2501 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 271.78 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD8597_8599.pdf" + (at 271.78 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 271.78 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C207971" + (at 271.78 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "AD8599ARZ-REEL" + (at 271.78 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d4338d04-f2e5-46f5-b9f4-6523cce45fc2") + ) + (pin "3" + (uuid "b5457395-2677-4c18-8688-fb161809ff89") + ) + (pin "7" + (uuid "5c9a58fc-5c2e-4884-8564-dd00f456f463") + ) + (pin "4" + (uuid "7424284b-d874-43b1-a298-41afdf4b582d") + ) + (pin "6" + (uuid "3da680ea-2720-4ce3-be85-fe4005c9d4f1") + ) + (pin "8" + (uuid "3a714538-558b-4865-824b-0c87abcceb17") + ) + (pin "5" + (uuid "8b590559-1f6f-4b77-ab7c-97758f4928c0") + ) + (pin "2" + (uuid "f4a7bf9a-2a7f-4a30-95bd-b12ec74abf51") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U106") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 168.91 196.85 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "15ebd158-167c-4398-ac99-7af57e098e9e") + (property "Reference" "C62" + (at 175.26 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 177.8 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 169.8752 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 168.91 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 168.91 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 168.91 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 168.91 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "179d774c-dc22-46fc-8fd8-8f90bc3a8282") + ) + (pin "1" + (uuid "edebc610-2626-4a87-8484-7b532aa1f05a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C62") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 309.88 86.36 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "17685fda-0056-45c5-a594-d73d9ed8d2cb") + (property "Reference" "#PWR035" + (at 309.88 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 312.42 87.63 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 309.88 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 309.88 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 309.88 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "32c77b3c-e641-4cd4-93a7-1c5719218771") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR035") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 346.71 227.33 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "18059823-6817-46dd-a91e-89ebc6f732e2") + (property "Reference" "R50" + (at 344.932 226.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 344.932 228.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 344.932 227.33 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 346.71 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 346.71 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 346.71 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 346.71 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "38e15ee7-6d06-4aaf-9fa7-ad05a6abe3b5") + ) + (pin "1" + (uuid "a825cde7-aa6e-42b5-8d08-d9ba0d863f13") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R50") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 297.18 158.75 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "18238101-274d-4a8c-a70d-46cb6c00117c") + (property "Reference" "R27" + (at 297.18 153.5897 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "49R9 1%" + (at 297.18 156.0139 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 297.18 160.528 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 297.18 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 297.18 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2984401" + (at 297.18 158.75 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CRCW120649R9FKEAC" + (at 297.18 158.75 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "afcde3ae-c182-49b9-bafe-8a20fa58fec8") + ) + (pin "1" + (uuid "1025f49d-2706-4ed9-a1b4-5bc3636a0b8a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R27") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:IDC_2x5") + (at 148.59 153.67 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "1b978540-a6cb-4754-98fa-d1146e6b35ec") + (property "Reference" "J3" + (at 149.86 143.1757 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "RFControl" + (at 149.86 145.5999 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 148.59 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 148.59 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "9" + (uuid "3ead77d2-8eb9-45a2-825c-6622800127ef") + ) + (pin "5" + (uuid "7b783577-55f5-4be4-ab64-5e4b8a398084") + ) + (pin "2" + (uuid "c75d115e-7bec-4df7-b9cd-c7fdd5b59e68") + ) + (pin "4" + (uuid "f2648471-bb5e-47bb-9c06-8a3a8ef590e0") + ) + (pin "6" + (uuid "28725db9-fa37-4f6c-ae67-7462c140e3f5") + ) + (pin "10" + (uuid "ec187f5b-7416-4808-b58b-43b2d220756e") + ) + (pin "7" + (uuid "233ab9fa-f561-4978-aa9d-ebd3a9b999f6") + ) + (pin "3" + (uuid "203e2052-7937-445c-ad64-4b87fa497199") + ) + (pin "1" + (uuid "e88380c4-95be-4fd1-9b69-3f22904a49bc") + ) + (pin "8" + (uuid "f15e9e1e-04e2-447e-9896-2aa83d70dbc6") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 346.71 90.17 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1c4008fe-fc32-44e1-8e53-626895126a4f") + (property "Reference" "R65" + (at 346.71 85.0097 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 346.71 87.4339 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 346.71 91.948 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 346.71 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 346.71 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 346.71 90.17 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 346.71 90.17 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "af161c98-1fa0-45b5-800d-db3a86c7d303") + ) + (pin "1" + (uuid "d03f6087-a418-456f-9ff4-2914da8bbad3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R65") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 332.74 90.17 0) + (mirror x) + (unit 2) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1db45799-e8c4-4486-b87f-b8d1ea5f60b5") + (property "Reference" "U107" + (at 332.74 99.3943 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "OPA2209" + (at 332.74 96.9701 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 332.74 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/opa2209.pdf" + (at 332.74 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 332.74 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2057330" + (at 332.74 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "OPA2209AIDR" + (at 332.74 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "cb9d96e0-16e2-4c49-ba9e-6fbc7fecf923") + ) + (pin "6" + (uuid "54ee0ecc-e626-4a25-9e4a-e46b92559c5b") + ) + (pin "3" + (uuid "afdd1e38-2469-483d-a93e-a88cd981d04f") + ) + (pin "4" + (uuid "a81a1a81-8f0f-4ad8-a30e-188050bb57af") + ) + (pin "8" + (uuid "504c6d13-f351-4f9d-8cc7-d29f1899f6a6") + ) + (pin "2" + (uuid "40c07fc5-733e-4598-85f0-5c69fca669fc") + ) + (pin "7" + (uuid "f0ff8adc-5fbe-473e-a802-e38e5f9c3da7") + ) + (pin "1" + (uuid "2ef09dcb-ad12-46f7-a336-f426be899085") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U107") + (unit 2) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 165.1 91.44 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1e5ab43d-1e9d-41d2-a920-5d2659d8eb34") + (property "Reference" "C20" + (at 163.83 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 170.18 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 166.0652 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 165.1 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 165.1 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 165.1 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4222d18d-4070-4e3b-b866-9f6869b24960") + ) + (pin "1" + (uuid "66b37322-2faf-416c-95f4-6e2453ac709f") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 297.18 210.82 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "1f0580c7-24e5-4020-93bd-02b041d0a65d") + (property "Reference" "R43" + (at 297.18 205.6597 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "49R9 1%" + (at 297.18 208.0839 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 297.18 212.598 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 297.18 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 297.18 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2984401" + (at 297.18 210.82 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CRCW120649R9FKEAC" + (at 297.18 210.82 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d4df4a00-24ac-46b0-b612-dd9642dbcc35") + ) + (pin "1" + (uuid "dfb4a60a-c777-4777-bf98-376aac298e79") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R43") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 285.75 57.15 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1f82689d-ada3-4731-a445-a8ded8cac1a9") + (property "Reference" "C7" + (at 288.671 55.9379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 288.671 58.3621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 284.7848 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 285.75 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 285.75 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 285.75 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 285.75 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cb093975-758f-4cf3-b1cf-3d6f587c2826") + ) + (pin "1" + (uuid "6bb640d2-f150-4390-a943-055fc2526873") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 361.95 205.74 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "22812166-9c76-4baf-bdcc-32c082aac999") + (property "Reference" "R45" + (at 361.95 200.5797 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "2k2 1%" + (at 361.95 203.0039 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 361.95 207.518 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 361.95 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 361.95 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 361.95 205.74 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 361.95 205.74 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "50b1330e-17db-462c-9d32-6f123011db14") + ) + (pin "1" + (uuid "10a7e716-6794-48fe-b2c8-1f78ede11941") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R45") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 187.96 172.72 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "231fde3c-dafb-4766-ab72-9b60afee568b") + (property "Reference" "R35" + (at 185.42 171.4499 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0" + (at 185.42 173.9899 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 186.182 172.72 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 187.96 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 187.96 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 187.96 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 187.96 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "567848e9-9a5d-4681-8e2c-7193cac9147a") + ) + (pin "1" + (uuid "5b3cf3f9-82bd-4133-8981-51a45f68bdd5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R35") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 21.59 107.95 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "23e178aa-f6c3-4599-afef-c8429007bb46") + (property "Reference" "#PWR02" + (at 21.59 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 21.59 112.0831 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 21.59 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 21.59 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 21.59 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "402478c8-36ef-40de-ae55-5f0333eee9af") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR02") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 306.07 243.84 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "25e299bd-e975-4ef5-ba4a-b03a9383f395") + (property "Reference" "C35" + (at 308.102 248.158 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 296.926 248.412 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 309.88 244.8052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 306.07 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 306.07 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 306.07 243.84 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 306.07 243.84 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "30681797-e167-4397-ae9c-2ef701f52a2c") + ) + (pin "1" + (uuid "c4ae42d2-d9cf-4c33-bee6-d33825965e30") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C35") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 290.83 194.31 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "262ac98d-26f7-49b5-ad76-eaf48a8eba83") + (property "Reference" "TP11" + (at 289.433 189.7959 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 289.433 192.2201 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 285.75 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 285.75 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 290.83 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 290.83 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e68d431d-388f-4028-9001-4c4d13401d19") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 314.96 92.71 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "27b2e266-298b-4934-bfac-99d443a9eadc") + (property "Reference" "R18" + (at 314.96 87.5497 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5k1" + (at 314.96 89.9739 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 314.96 94.488 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 314.96 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 314.96 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C26033" + (at 314.96 92.71 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERJ-8ENF5101V" + (at 314.96 92.71 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a9d83d0a-5c0b-4d44-8ed4-9155708a68c8") + ) + (pin "1" + (uuid "8d39661a-754d-4b7c-8a82-e7172c072b0a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 237.49 154.94 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "298b4a03-8052-4bc6-a5e4-d1afb79e28f6") + (property "Reference" "#PWR065" + (at 237.49 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 236.22 159.258 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 237.49 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 237.49 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 237.49 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "328fcf46-3aa3-4819-9aae-7cab2ac7b2c9") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR065") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 138.43 24.13 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "29aa1a78-21d9-42a8-b3e1-5bbb38a08098") + (property "Reference" "#PWR053" + (at 138.43 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 138.43 28.2631 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 138.43 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 138.43 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 138.43 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0656e774-0cb7-41f3-ba01-f21f39574e26") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR053") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 264.16 74.93 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "29fd8745-d9b0-4e11-9636-fe3862effc42") + (property "Reference" "#PWR032" + (at 264.16 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 264.16 79.0631 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 264.16 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 264.16 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 264.16 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "69bd572f-330b-47c0-9edc-34e0e2c7b168") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR032") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 281.94 100.33 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2a5e64a2-ce75-4c19-8e94-5b9eac801ecf") + (property "Reference" "R21" + (at 283.718 99.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10k" + (at 283.718 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 283.718 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 281.94 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 281.94 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 281.94 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "624bab78-a3fc-4027-aa9e-1ccd02408a2b") + ) + (pin "1" + (uuid "1d1601ad-c933-497a-9eca-7ec47d2a8976") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 161.29 226.06 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2adb8092-d223-4f73-b9d2-115dafcdfabb") + (property "Reference" "C47" + (at 167.64 227.33 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 165.1 229.87 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 157.48 225.0948 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 161.29 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 161.29 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 161.29 226.06 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 161.29 226.06 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "43c6426a-7be8-458d-b98b-60a26f69d19d") + ) + (pin "1" + (uuid "e1aaa6bd-5cf3-40b2-bc28-2e0d3eab93af") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C47") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 168.91 262.89 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board no) + (dnp no) + (uuid "2b7b24b8-bee6-4bd4-921e-3f00839e3468") + (property "Reference" "R73" + (at 171.45 261.9897 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "100k" + (at 171.45 264.414 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 167.132 262.89 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 168.91 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 168.91 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17900" + (at 168.91 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CRCW1206100KFKEAC" + (at 168.91 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "fe1d7a52-5991-4086-bdc4-bfaa9e158bb0") + ) + (pin "1" + (uuid "bf0e3f96-2ee3-4afb-9235-67b6446daa92") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R73") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 278.13 66.04 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2c05b2a7-1a1a-4550-b1cb-78dd213d8c88") + (property "Reference" "#PWR028" + (at 278.13 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 278.13 70.1731 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 278.13 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 278.13 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 278.13 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d25128c5-de6b-4441-972d-f5071684a8b5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR028") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 250.19 90.17 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "2c269965-af34-48bf-a484-1241d7d9c456") + (property "Reference" "TP5" + (at 245.11 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 251.46 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 255.27 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 255.27 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 250.19 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 250.19 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d5cf2bdf-09cc-47a7-905c-24e324448a22") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Screw_Terminal_01x02") + (at 21.59 31.75 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2f68449d-6fb7-407d-9d37-edc228f7c982") + (property "Reference" "J4" + (at 23.622 31.8079 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "12-13.8V" + (at 23.622 34.2321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "TerminalBlock:TerminalBlock_bornier-2_P5.08mm" + (at 21.59 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 21.59 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 21.59 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 21.59 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "bcc03d43-d58f-4337-b104-4f5ceee2fbe0") + ) + (pin "2" + (uuid "098f9cd1-8740-48c5-8581-a3118ff9ef82") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 160.02 273.05 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "302be67a-dff6-4143-9b5a-666f062f3f04") + (property "Reference" "#PWR074" + (at 160.02 279.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 156.21 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 160.02 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 160.02 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 160.02 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "671afcd6-20a3-4d01-9f6e-f5cd713b090f") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR074") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 248.92 210.82 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "304d72fc-224c-4125-b125-9ab7f8e16fec") + (property "Reference" "#PWR054" + (at 248.92 217.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 248.92 214.9531 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 248.92 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 248.92 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 248.92 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b9c54a90-f24e-4cc6-8b4d-7ae0f472fb88") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR054") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 326.39 231.14 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "30b18de9-486a-4de1-94c5-783a6eff3c0c") + (property "Reference" "#PWR043" + (at 326.39 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 326.39 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 326.39 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 326.39 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 326.39 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "38417221-e95a-444b-a158-9a0608ca0087") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR043") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 73.66 49.53 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "318fc588-08c5-4ef9-be94-44a7f4e985c3") + (property "Reference" "C71" + (at 76.581 48.3179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 50V" + (at 76.581 50.7421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 74.6252 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 73.66 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 73.66 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 73.66 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 73.66 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1dc767d0-a614-40b9-b8c8-524781d26b86") + ) + (pin "1" + (uuid "1d70c36f-32c2-40c9-8dd0-a8e4d457e8b9") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C71") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 21.59 102.87 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "31a99f55-9d07-42e7-92b3-b0bc88893cbc") + (property "Reference" "J2" + (at 19.0499 101.9511 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "RF_IN" + (at 29.21 106.426 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 21.59 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 21.59 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 21.59 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 21.59 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CONSMA001-G" + (at 21.59 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5b2b4d0a-3156-4fb1-ac54-6719a74321f1") + ) + (pin "2" + (uuid "db5aa626-0a5b-4ed5-80f1-71864d3ec913") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 346.71 41.91 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "32089dfe-57dd-4cae-b1f9-0f2d9b1505f7") + (property "Reference" "R64" + (at 346.71 36.7497 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 346.71 39.1739 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 346.71 43.688 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 346.71 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 346.71 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 346.71 41.91 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 346.71 41.91 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "db25c0cb-e612-4a6a-823d-4dbde80b48ab") + ) + (pin "1" + (uuid "25fc55c0-1518-4baf-ad45-9b863e3e6655") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R64") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 389.89 193.04 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "331eaf33-7aab-43bf-a853-46f75bae2c51") + (property "Reference" "TP14" + (at 385.191 191.8279 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 385.191 194.2521 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 389.89 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 389.89 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 389.89 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 389.89 193.04 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5b551c89-b9cb-4abf-a15b-4e93e9ea12be") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 289.56 105.41 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "338b06c8-9320-494b-a839-aeb61306a1a3") + (property "Reference" "C23" + (at 292.481 104.1979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 292.481 106.6221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 288.5948 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 289.56 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 289.56 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 289.56 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 289.56 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c57f5763-6233-4319-a2fe-a0b100d99eb6") + ) + (pin "1" + (uuid "cb748b54-b24b-4e5c-9300-9d7017e20a8b") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C23") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 237.49 236.22 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "34824563-2e10-44f5-a18e-b9ee0148de99") + (property "Reference" "C55" + (at 233.68 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 231.14 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 236.5248 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 237.49 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 237.49 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 237.49 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 237.49 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9882d5a3-50a0-4bbd-a5ac-96e476ad9829") + ) + (pin "1" + (uuid "8c9a3e0a-b885-429a-baf1-b656971e5dc3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C55") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 297.18 71.12 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "35295b02-595e-4588-b32e-6d06242597b4") + (property "Reference" "L3" + (at 297.8149 69.9078 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "FB" + (at 297.8149 72.3321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 297.18 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 297.18 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 297.18 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C74486" + (at 297.18 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "HZ1206E601R-10" + (at 297.18 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "18ff0e78-d3db-4f53-9970-91418106c94e") + ) + (pin "2" + (uuid "a4fe015b-ef63-4921-b180-05708c8e5166") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 187.96 127 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "35a5b78b-3a99-4617-ba83-097c71e2fdaf") + (property "Reference" "R42" + (at 182.7997 127 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 185.2239 127 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 189.738 127 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 187.96 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 187.96 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 187.96 127 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 187.96 127 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "0e264eac-5455-4e5b-9f8c-15a09c3b2e33") + ) + (pin "1" + (uuid "3880d028-2813-4bfc-8e2c-f4f9c24723e5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R42") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:T41_Attenuator_Daughter") + (at 102.87 219.71 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "35a95134-2da2-46cd-8da3-6c320b7d18a4") + (property "Reference" "U3" + (at 102.235 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "T41_Attenuator_Daughter" + (at 102.235 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:T41_Attenuator_Daughter" + (at 106.045 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 106.68 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 102.87 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 102.87 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "8" + (uuid "90005322-3635-4dc0-a81b-67953c5493af") + ) + (pin "10" + (uuid "e362fef4-e736-428f-b050-11642afb7a00") + ) + (pin "12" + (uuid "921ad399-bc8f-4d08-aecb-43b67f87d20d") + ) + (pin "9" + (uuid "a4f3910f-4f07-4b80-86f3-1893ae4b2e90") + ) + (pin "7" + (uuid "29a75a1e-c65c-4cf1-8afb-453ceccd9fc6") + ) + (pin "11" + (uuid "5df881a6-19cd-4f4b-bba5-ba5062c0d987") + ) + (pin "6" + (uuid "0940a76d-9ea5-41f9-91f0-31c9cf5498b4") + ) + (pin "5" + (uuid "f0938093-dbf1-4ca6-b8f2-d3e9af43497a") + ) + (pin "4" + (uuid "82d3773b-2e1b-41e3-b3f7-f0ce7999612f") + ) + (pin "3" + (uuid "d26eaeec-cc9b-4a21-9831-506a80472f68") + ) + (pin "2" + (uuid "bc5af7f1-5e44-4d7a-8393-b551743ec031") + ) + (pin "1" + (uuid "4094b7a6-21b1-4b47-9f7d-1fcb10734e46") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 281.94 219.71 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "37bc15b5-5175-46db-ac4c-74597d98d864") + (property "Reference" "#PWR050" + (at 281.94 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 279.4 222.25 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 281.94 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 281.94 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1bbf45d8-e37c-4348-be85-0073ccc704a6") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR050") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 137.16 111.76 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "38681e48-29d8-4cdf-995e-6b40f51009d3") + (property "Reference" "#PWR05" + (at 137.16 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 140.97 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 137.16 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 137.16 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 137.16 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b8b05a3e-c07b-40ae-9d13-eedfd2c69b49") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR05") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 361.95 170.18 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3989d841-2f9e-46f0-9cbf-b57be4d3a7cb") + (property "Reference" "R31" + (at 361.95 165.0197 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "2k2 1%" + (at 361.95 167.4439 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 361.95 171.958 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 361.95 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 361.95 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 361.95 170.18 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 361.95 170.18 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1fce9760-15eb-4edd-8c19-6c6878b2b175") + ) + (pin "1" + (uuid "7f550fb1-9caa-4b44-9b70-0fceaac35059") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R31") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 242.57 219.71 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "39d08bf7-3221-4e89-819d-144b03587437") + (property "Reference" "#PWR056" + (at 242.57 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 246.38 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 242.57 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 242.57 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 242.57 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "da0bc3f7-bb4c-421a-9c7f-0ed417e9866f") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR056") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 307.34 175.26 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3a8ab93c-ee70-4bbb-9764-e4e6ad97b89d") + (property "Reference" "R28" + (at 307.34 170.0995 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 307.34 172.5238 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 307.34 177.038 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 307.34 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 307.34 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 307.34 175.26 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 307.34 175.26 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d7651d80-bd43-47a3-8953-3dd91f4c9ff0") + ) + (pin "1" + (uuid "84302cb3-4288-4758-9f37-fe7b4fff27bf") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R28") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 105.41 24.13 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3ab8583d-be9c-4d25-aaad-051d3aff24ac") + (property "Reference" "L12" + (at 105.41 19.4804 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uH 20%" + (at 105.41 21.9046 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Inductor_SMD:L_Bourns-SRN6028" + (at 105.41 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 105.41 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 105.41 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C5753503" + (at 105.41 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "IFSC2020DEER100M01" + (at 105.41 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "15ebfe7e-59a4-4f5b-8284-2b47bdd1ceb9") + ) + (pin "2" + (uuid "7e349eb3-7b43-4dc4-8628-3d71d7b5e746") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 39.37 140.97 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3c4e6ba0-f85f-4c92-b61c-ce9ed6d42e30") + (property "Reference" "JP16" + (at 39.37 138.3609 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 39.37 138.3609 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 39.37 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 39.37 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 39.37 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 39.37 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "56f3d980-0bab-4c33-994f-6f283e95d54f") + ) + (pin "1" + (uuid "20f2a3dc-27fa-4eda-98a9-1a77e23169a9") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "JP16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 140.97 91.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3dda600c-b8cd-4871-91c6-c6135f5adb03") + (property "Reference" "#PWR010" + (at 140.97 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 143.51 92.71 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 140.97 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 140.97 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 140.97 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "96349534-f937-4d1e-b249-9e06c50c97b3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR010") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 36.83 218.44 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3f20cd71-b0f0-4efe-8aeb-a6f588a7f0f4") + (property "Reference" "C58" + (at 36.83 224.7433 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 36.83 222.3191 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 33.02 219.4052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 36.83 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 36.83 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 36.83 218.44 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 36.83 218.44 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b71e2a2e-72bf-472d-92b9-19b3306243cf") + ) + (pin "1" + (uuid "65905b11-282c-49b7-bc15-e5df170d4722") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C58") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 247.65 245.11 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3faaaccb-603d-4e32-9045-5545af64e1c2") + (property "Reference" "#PWR057" + (at 247.65 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 245.11 247.65 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 247.65 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 247.65 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 247.65 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "833695bb-6609-426c-9f65-4a326a8569fe") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR057") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 243.84 95.25 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "404217e1-602c-4c5f-926c-75e3e15d1c75") + (property "Reference" "C24" + (at 242.6279 98.171 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1uF 50V" + (at 245.0521 98.171 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 240.03 94.2848 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 243.84 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1848" + (at 243.84 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CL31B105KBHNNNE" + (at 243.84 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e611550f-2a13-4cf0-ad64-bf277bf3f595") + ) + (pin "1" + (uuid "cb05cbde-5eff-490e-9b0a-166c5d38e725") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 92.71 121.92 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "411c39fb-3c86-4401-a8d0-232a1bd79d7c") + (property "Reference" "C80" + (at 96.52 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 99.06 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 93.6752 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 92.71 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 92.71 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 92.71 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 92.71 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "67c8d477-fdb1-4206-a1ed-84d121f19c1c") + ) + (pin "1" + (uuid "afd9af37-b989-48d3-8908-a444091c49c3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C80") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 243.84 25.4 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "420c742c-732b-47f9-add5-e9b1eacf6e38") + (property "Reference" "#PWR024" + (at 243.84 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 243.84 29.5331 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 243.84 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 243.84 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "eb4cd4ba-d115-4b11-ab37-f6de356edc9a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR024") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 281.94 179.07 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "42836c31-5386-41b9-9ac8-15a148403709") + (property "Reference" "C38" + (at 285.75 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.2uF 50V" + (at 292.1 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 282.9052 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 281.94 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1857" + (at 281.94 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "12065C204KAT4A" + (at 281.94 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d1056932-948d-410e-895b-495ed38cfd7b") + ) + (pin "1" + (uuid "a749c5b3-1cc0-49d6-9e87-51f29068e678") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C38") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 165.1 255.27 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "433fc47f-07a2-4d94-8619-61d5b0844528") + (property "Reference" "R58" + (at 165.1 250.1097 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "51k" + (at 165.1 252.5339 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 165.1 253.492 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 165.1 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17992" + (at 165.1 255.27 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-5102ELF" + (at 165.1 255.27 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a5308455-9755-4be0-ae29-45770e2fbb2c") + ) + (pin "1" + (uuid "432695e7-d7af-4767-8ac5-f43513b93889") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R58") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 36.83 213.36 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "456d7ee3-11a5-475f-9775-38e22f0c7c37") + (property "Reference" "C53" + (at 36.83 207.0567 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 36.83 209.4809 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 33.02 212.3948 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 36.83 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 36.83 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 36.83 213.36 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 36.83 213.36 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "57b293a8-2c24-4e26-8c55-218537820a0c") + ) + (pin "1" + (uuid "4ef5bc11-a6ac-45be-a4bf-ebcfc4a50d51") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C53") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 177.8 54.61 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "45a11d0b-e9d5-4380-b7a5-4d0c4bc7db3c") + (property "Reference" "#PWR097" + (at 177.8 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 177.8 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 177.8 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 177.8 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 177.8 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3e592da4-aa6b-4e94-b313-b26dee48498a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR097") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 22.86 204.47 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "45a6b2d5-f8c0-4190-87aa-bbdcc720ada2") + (property "Reference" "#PWR069" + (at 22.86 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 25.4 205.74 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 22.86 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 22.86 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 22.86 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1c4ef978-ae1d-4694-85d8-38759b2d19b6") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR069") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 177.8 58.42 90) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "46c1083d-4341-47df-a506-03c8151a80c8") + (property "Reference" "JP1" + (at 180.34 58.42 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 175.1909 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 177.8 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 177.8 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 177.8 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 177.8 58.42 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9bc5e8a0-1c73-478d-ae7b-22d9a381d373") + ) + (pin "1" + (uuid "7b6bb4c6-8842-46e3-84e6-18012b194cc9") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "JP1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 391.16 53.34 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "474c8eca-5856-4d2a-9e39-3e35c451dfd5") + (property "Reference" "#PWR040" + (at 391.16 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 388.62 54.61 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 391.16 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 391.16 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 391.16 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c09d9297-f85b-44a0-854c-72cdb44663d0") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR040") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Bridged") + (at 185.42 58.42 90) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "47f553a9-4995-46c0-a505-982160771050") + (property "Reference" "JP2" + (at 187.96 57.15 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "SolderJumper_2_Bridged" + (at 187.96 59.69 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm" + (at 185.42 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 185.42 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 185.42 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 185.42 58.42 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "605a0e81-f834-42f4-a088-26c412982994") + ) + (pin "1" + (uuid "59db58c7-f020-4027-a3d1-e37e9419409a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "JP2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 248.92 161.29 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "49220bed-ed7d-450a-bbef-e8fd2967aadd") + (property "Reference" "L5" + (at 248.2851 160.0779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "FB" + (at 248.2851 162.5021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 248.92 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 248.92 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 248.92 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C74486" + (at 248.92 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "HZ1206E601R-10" + (at 248.92 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "bd4932bf-e213-4bce-8730-d8294a580713") + ) + (pin "2" + (uuid "fcd4aee2-ef2b-4406-a937-30b88b66be7d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 270.51 92.71 0) + (mirror x) + (unit 2) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "49368002-1d57-4e6d-9665-55799eb56a27") + (property "Reference" "U106" + (at 270.51 101.9343 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AD8599" + (at 270.51 99.5101 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 270.51 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD8597_8599.pdf" + (at 270.51 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 270.51 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C207971" + (at 270.51 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "AD8599ARZ-REEL" + (at 270.51 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "4" + (uuid "c993e129-ae2a-4c33-bc62-0a07923c53da") + ) + (pin "7" + (uuid "313f2947-5847-4e35-9674-65e88c8afdc8") + ) + (pin "2" + (uuid "814b265e-d0c5-4367-8628-2fd8bde3355f") + ) + (pin "8" + (uuid "2d279fa0-ae48-496c-b753-cd938c3eba2d") + ) + (pin "6" + (uuid "d43ed737-c7d6-42e4-b9ee-67858f24700d") + ) + (pin "1" + (uuid "1b579974-943d-4996-bb33-72554f1b7976") + ) + (pin "3" + (uuid "6f3789f9-febb-484a-990a-3dac2c1572ae") + ) + (pin "5" + (uuid "775e9fd1-41e0-4504-943c-b0868fff30ee") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U106") + (unit 2) + ) + ) + ) + ) + (symbol + (lib_id "Transformer:ADT2-1T") + (at 196.85 226.06 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "49c55834-e0db-4ede-b617-b6f9f9557f9a") + (property "Reference" "TR2" + (at 196.85 216.8865 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ADT2-1T" + (at 196.85 219.3107 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "RF_Mini-Circuits:Mini-Circuits_CD542_H2.84mm" + (at 196.85 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.minicircuits.com/pdfs/ADT2-1T+.pdf" + (at 196.85 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 196.85 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C5223988" + (at 196.85 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ADT2-1T+" + (at 196.85 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "e5604437-8dde-452b-ada7-f3869a9af38a") + ) + (pin "2" + (uuid "3440378e-6763-49ac-a78e-86798b6edc35") + ) + (pin "5" + (uuid "3a15d7c5-4802-44c6-b239-0840f9efad7c") + ) + (pin "4" + (uuid "f34bffd1-7fd4-419f-a7d4-1e090952a802") + ) + (pin "1" + (uuid "d088b955-0e20-499d-be93-a1090f4999c1") + ) + (pin "6" + (uuid "c0cc6f01-d131-459a-8abe-6f7a7684e614") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TR2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 335.28 68.58 270) + (unit 3) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4b9045d6-65c7-40f3-8399-d437dd5d9569") + (property "Reference" "U107" + (at 335.28 62.0227 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "OPA2209" + (at 335.28 64.4469 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 335.28 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/opa2209.pdf" + (at 335.28 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 335.28 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2057330" + (at 335.28 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "OPA2209AIDR" + (at 335.28 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "cb9d96e0-16e2-4c49-ba9e-6fbc7fecf924") + ) + (pin "6" + (uuid "54ee0ecc-e626-4a25-9e4a-e46b92559c5c") + ) + (pin "3" + (uuid "afdd1e38-2469-483d-a93e-a88cd981d050") + ) + (pin "4" + (uuid "a81a1a81-8f0f-4ad8-a30e-188050bb57b0") + ) + (pin "8" + (uuid "504c6d13-f351-4f9d-8cc7-d29f1899f6a7") + ) + (pin "2" + (uuid "40c07fc5-733e-4598-85f0-5c69fca669fd") + ) + (pin "7" + (uuid "f0ff8adc-5fbe-473e-a802-e38e5f9c3da8") + ) + (pin "1" + (uuid "2ef09dcb-ad12-46f7-a336-f426be899086") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U107") + (unit 3) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 160.02 262.89 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4bf9d5d2-d20b-489c-a2b1-d0b51ff73486") + (property "Reference" "C73" + (at 165.1 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 161.036 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 160.9852 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 160.02 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 160.02 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 160.02 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 160.02 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "bf219127-dcd4-48ae-9dc1-2ff0f034f87c") + ) + (pin "1" + (uuid "91d7bcc6-6835-403f-b291-dadabeb82252") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C73") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 290.83 210.82 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "4e3ca7f2-d693-4946-a6d8-4da61f0181be") + (property "Reference" "TP13" + (at 289.433 206.3059 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 289.433 208.7301 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 285.75 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 285.75 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 290.83 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 290.83 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d3ecd2d7-0a25-43ef-aab4-7c94cf03f45d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 275.59 77.47 270) + (unit 3) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4f44adae-2efc-4536-86f6-340083ba28c9") + (property "Reference" "U106" + (at 275.59 77.47 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AD8599" + (at 275.59 73.3369 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 275.59 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/AD8597_8599.pdf" + (at 275.59 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 275.59 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C207971" + (at 275.59 77.47 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "AD8599ARZ-REEL" + (at 275.59 77.47 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "232d5daf-2c22-489b-b539-80106e31c68b") + ) + (pin "4" + (uuid "81b1e2bb-0eba-4588-9909-6272509b7400") + ) + (pin "2" + (uuid "b7f1514f-f163-4821-9ad7-c1138639e153") + ) + (pin "1" + (uuid "f42865b0-f16e-4d7a-b635-2ae35520d501") + ) + (pin "5" + (uuid "dd348ca3-570b-4dce-b68d-acd7104a4eab") + ) + (pin "6" + (uuid "95aafcd7-41ba-4302-ab7a-515d4bd6d5fc") + ) + (pin "7" + (uuid "a128b3b6-d94f-4ec2-8163-568394a87091") + ) + (pin "8" + (uuid "087e1470-ed6f-4039-bd9f-a24706f2f7f0") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U106") + (unit 3) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 25.4 24.13 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4f459a12-84fd-46dc-b453-6b18dc23e2b0") + (property "Reference" "L13" + (at 25.4 19.4804 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uH 20%" + (at 25.4 21.9046 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Inductor_SMD:L_Bourns-SRN6028" + (at 25.4 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 25.4 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 25.4 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C5753503" + (at 25.4 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "IFSC2020DEER100M01" + (at 25.4 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f617fe61-c4a7-474e-8ee0-8428701e3b38") + ) + (pin "2" + (uuid "7896ddfa-5df6-45aa-bf45-90ba252b839a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 168.91 97.79 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5037de6e-3937-45be-8578-99c3e391daaf") + (property "Reference" "#PWR023" + (at 168.91 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 171.45 99.06 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 168.91 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 168.91 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 168.91 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "31294c7c-9f06-4dad-b870-7ca329e3e368") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR023") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 297.18 80.01 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "50d5da56-bfbf-4020-ba75-0dd794c1c4c7") + (property "Reference" "C14" + (at 292.862 77.978 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 292.1 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 296.2148 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 297.18 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 297.18 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 297.18 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 297.18 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b1df37e1-1740-46c6-9fa5-e276bcc9a29b") + ) + (pin "1" + (uuid "6d74f691-e9e2-4f4a-8250-0cfd9a0aa989") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 360.68 214.63 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "51e25ed3-0f39-409e-b862-82ee0444b3f0") + (property "Reference" "C57" + (at 365.76 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 365.76 217.17 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 361.6452 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 360.68 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 360.68 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 360.68 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 360.68 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cebd1e00-e366-4fe1-a6b1-64940276aec5") + ) + (pin "1" + (uuid "b83cb78d-2dda-4b4e-a26b-1235002a0f57") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C57") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 335.28 208.28 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "523f2b62-3ab1-47dd-a80c-6c75762487c7") + (property "Reference" "R46" + (at 335.28 203.1197 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k 1%" + (at 335.28 205.5439 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 335.28 210.058 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 335.28 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 335.28 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 335.28 208.28 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 335.28 208.28 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e36b44aa-3646-446d-a3c6-78a69010b453") + ) + (pin "1" + (uuid "04a44d7c-a14a-4fb5-958c-52f5bf6d9990") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R46") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 153.67 269.24 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "53329380-69d8-4201-b11a-d697178ed3af") + (property "Reference" "R59" + (at 158.8303 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1k1" + (at 156.4061 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 155.448 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17889" + (at 153.67 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1101ELF" + (at 153.67 269.24 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a27a8cc1-7e80-4d5a-afac-445197a64a8f") + ) + (pin "1" + (uuid "e05c56c9-5345-4517-a2a7-c0cc9e191777") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R59") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 115.57 24.13 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5373b5cc-b386-4927-8e30-c31b5c0499c7") + (property "Reference" "#PWR06" + (at 115.57 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 115.57 19.05 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 115.57 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 115.57 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 115.57 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f6415a35-2d05-49cd-8520-0947a7e54753") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR06") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 243.84 168.91 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5647f6f7-c2b0-4ef7-a65a-0861c7cd15d2") + (property "Reference" "C30" + (at 242.57 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 245.11 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 244.8052 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 243.84 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 243.84 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 243.84 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3905582f-67e9-4809-862c-2b6cd11e3faa") + ) + (pin "1" + (uuid "7f606ab4-7aa3-4fb5-a6ce-b501385bb6f3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C30") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 66.04 233.68 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "56a96225-9ca5-491e-a183-5347b72a3a02") + (property "Reference" "U10" + (at 72.39 232.41 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 72.39 229.87 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 66.04 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 66.04 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 66.04 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C8207" + (at 66.04 233.68 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "SN74LVC1G04DCKR" + (at 66.04 233.68 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "dc470ea5-614e-4119-a91b-8c778dd4968d") + ) + (pin "4" + (uuid "6285c20b-eda5-4614-b056-f228dc6a2db1") + ) + (pin "3" + (uuid "94bf5b4b-780e-4f0a-936e-b4341da1eea9") + ) + (pin "5" + (uuid "674ff3b5-8d47-48c5-9ced-63aa7cfdaa3a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 306.07 234.95 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "583c0928-f198-44f3-b9a6-278401d36e14") + (property "Reference" "C64" + (at 312.42 236.22 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 309.88 238.76 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 302.26 233.9848 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 306.07 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 306.07 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 306.07 234.95 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 306.07 234.95 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "411f4cb1-d920-4c15-bdfb-259c621c0767") + ) + (pin "1" + (uuid "cacfbdf1-3b33-4d04-bb39-af32bbe612eb") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C64") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 314.96 29.21 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "59048c2d-547a-45d7-977d-dc94e78b37f1") + (property "Reference" "R3" + (at 314.96 24.0497 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5k1" + (at 314.96 26.4739 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 314.96 30.988 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 314.96 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 314.96 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C26033" + (at 314.96 29.21 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERJ-8ENF5101V" + (at 314.96 29.21 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "06cae25a-8548-43c9-a24f-a96e34d58875") + ) + (pin "1" + (uuid "42b2a074-85c5-403e-a1f9-15f0939b03f2") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 330.2 77.47 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "59381521-8881-48b2-b68c-d3e138369b32") + (property "Reference" "R11" + (at 330.2 72.3097 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5k1" + (at 330.2 74.7339 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 330.2 79.248 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 330.2 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 330.2 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C26033" + (at 330.2 77.47 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERJ-8ENF5101V" + (at 330.2 77.47 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "608691a5-35fa-4d03-bcce-e53ceae12d95") + ) + (pin "1" + (uuid "68955591-873b-4832-ae50-4131dbf723f0") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 363.22 236.22 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5974244b-c8bc-47a6-ba4e-e34e89f92389") + (property "Reference" "C65" + (at 369.57 237.49 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 367.03 240.03 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 359.41 235.2548 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 363.22 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 363.22 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 363.22 236.22 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 363.22 236.22 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5399b945-ca00-4231-b8e2-c4ad308ca7a9") + ) + (pin "1" + (uuid "314ec529-e981-43af-944a-36eb82c1e17f") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C65") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 137.16 140.97 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "59ac97ba-6e7f-4b6d-8e66-8fd0becbfdfa") + (property "Reference" "R51" + (at 135.382 139.7579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 135.382 142.1821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 135.382 140.97 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 137.16 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 137.16 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 137.16 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 137.16 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1852b547-6602-4447-9c5b-27a95824b562") + ) + (pin "1" + (uuid "5490030e-d73b-4590-8625-af4d1ec21b7e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R51") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 209.55 265.43 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "59ed83c6-7196-4b03-bbdf-ea1b2db923a1") + (property "Reference" "C40" + (at 212.09 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 209.55 271.78 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 208.5848 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 209.55 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 209.55 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 209.55 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 209.55 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e1872887-7f0f-4d0f-9d8b-75aab6053f47") + ) + (pin "1" + (uuid "1d91fae0-a716-417b-a61c-41689d0dcca6") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C40") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 203.2 265.43 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5a1b9b41-f335-44cd-9ec6-df9a8a7b0aa2") + (property "Reference" "C41" + (at 207.01 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 208.28 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 204.1652 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 203.2 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 203.2 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 203.2 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 203.2 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "65026eae-6e6a-4e9a-ae5b-b4eca5f4b890") + ) + (pin "1" + (uuid "8ecd6dff-b63d-46e0-8706-1813da3f68e4") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C41") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 149.86 57.15 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5be94fa7-52bf-486d-ad99-76c99b440fae") + (property "Reference" "#PWR022" + (at 149.86 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 149.86 61.2831 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 149.86 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 149.86 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 149.86 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1a747916-9efb-4706-b23a-dd4d308d0f11") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR022") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 309.88 33.02 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5c05ddf4-faad-43ab-bfd2-7982d602ee8e") + (property "Reference" "C1" + (at 306.959 31.8079 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 313.69 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 310.8452 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 309.88 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 309.88 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 309.88 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 309.88 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5e56ac1a-4a4f-49e4-a4d8-24381732782c") + ) + (pin "1" + (uuid "6a94eea4-0273-416d-af48-ab5d94630c97") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 217.17 265.43 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5d3473f5-f912-422e-a8d7-8d137d2ac1de") + (property "Reference" "R34" + (at 215.392 264.2179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 215.392 266.6421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 215.392 265.43 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 217.17 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 217.17 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 217.17 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 217.17 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3de71166-87e1-49ab-ad4a-6cf673a9fd5f") + ) + (pin "1" + (uuid "d453e768-8d11-41ef-9039-fda98b196fe1") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R34") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 290.83 158.75 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "5eaba789-d211-4905-a570-b547e774fcbb") + (property "Reference" "TP7" + (at 289.433 154.2359 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 289.433 156.6601 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 285.75 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 285.75 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 290.83 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 290.83 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fe689c32-734e-44c7-8ece-c75a79222de4") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 248.92 107.95 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "60e2636d-bf9a-40b3-9277-30dd3ce11487") + (property "Reference" "#PWR027" + (at 248.92 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 248.92 112.0831 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 248.92 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 248.92 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 248.92 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c3f6625b-52df-477c-b170-b220507e9bd6") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR027") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 46.99 152.4 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "63981f94-2b11-426c-b130-b0c294296eb6") + (property "Reference" "R62" + (at 43.18 151.0142 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 43.18 148.59 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 46.99 154.178 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 46.99 152.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 46.99 152.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 46.99 152.4 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 46.99 152.4 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9ed7d8b2-1f0d-4da0-b353-47516ce53ccb") + ) + (pin "1" + (uuid "72a26628-be46-4b59-987a-0f5df2194b75") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R62") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 194.31 72.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "65493692-6f1c-4501-8b58-fb549b75d927") + (property "Reference" "#PWR019" + (at 194.31 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 194.31 76.5231 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 194.31 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 194.31 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 194.31 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "99d05620-ed10-4e87-8d0e-f7c546258af3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR019") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 133.35 273.05 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "658c270c-f601-4d59-af78-600e7397a959") + (property "Reference" "#PWR075" + (at 133.35 276.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 133.35 267.97 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 133.35 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 133.35 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 133.35 273.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4cf4e1bf-7673-4633-b408-a08a7fad8687") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR075") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 269.24 83.82 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "65db15b4-1c1c-4fe4-845c-0339dd7f0619") + (property "Reference" "R13" + (at 269.24 78.6597 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "2k" + (at 269.24 81.0839 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 269.24 85.598 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 269.24 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 269.24 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17944" + (at 269.24 83.82 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERA-8AEB202V" + (at 269.24 83.82 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "39f9f172-c804-4132-bedf-3cd1f229147d") + ) + (pin "1" + (uuid "d5c29e38-8e0e-498c-aadf-d8eaff5f68c6") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 354.33 90.17 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "6607c6ca-58d6-44a7-a82e-b44704a75838") + (property "Reference" "TP3" + (at 349.25 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 349.25 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 359.41 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 359.41 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 354.33 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 354.33 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d92fa922-255d-4229-b672-afeda031a96e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 185.42 82.55 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "67100718-c1b4-4ccd-b94e-1b0441961186") + (property "Reference" "R12" + (at 187.198 81.3379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10k" + (at 187.198 83.7621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 183.642 82.55 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 185.42 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 185.42 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 185.42 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 185.42 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "04a67c4b-66e9-4dec-817e-88d0a8bd0754") + ) + (pin "1" + (uuid "83b182a3-a847-43e0-bb9b-0ad4b3380e6a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 389.89 175.26 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "68a95678-9ace-47cf-870d-b27122453c7b") + (property "Reference" "TP9" + (at 385.191 174.0479 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 385.191 176.4721 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 389.89 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 389.89 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 389.89 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 389.89 175.26 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "581d902c-25bb-4f26-9e34-afec85d540ae") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 120.65 24.13 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "68d16323-ac90-49ad-9e00-a36496cf6221") + (property "Reference" "TP17" + (at 122.047 19.6159 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 122.047 22.0401 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 125.73 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 125.73 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 120.65 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 120.65 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "72c5dbaf-6c7d-4b83-b667-282a060374ca") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 16.51 36.83 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "696d0972-ac86-4a58-82ee-0f32b337ea7a") + (property "Reference" "#PWR096" + (at 16.51 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 16.51 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 16.51 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 16.51 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 16.51 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "41d36163-486a-4028-97ed-ef4fcbbf29a3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR096") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 217.17 247.65 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "69c49c03-1eaa-4871-9791-b1f5a401889f") + (property "Reference" "L6" + (at 218.4372 246.4379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FB" + (at 218.4372 248.8621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 217.17 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 217.17 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 217.17 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C74486" + (at 217.17 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "HZ1206E601R-10" + (at 217.17 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "aa38118a-b80a-45e0-b00e-939be2e95938") + ) + (pin "2" + (uuid "50aa5db1-69e3-49e2-9cb1-d8e0d2c933f5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 256.54 240.03 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6a398a65-266f-4d93-922f-f1ab531c885b") + (property "Reference" "C56" + (at 261.62 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 262.89 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 257.5052 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 256.54 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 256.54 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 256.54 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 256.54 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e45e9711-e13d-46ae-a7b7-61fc527f3996") + ) + (pin "1" + (uuid "47a5f53b-938c-40fe-8cc8-e7e5ce26d9e9") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C56") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 147.32 189.23 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6b498279-c40c-4a8a-b41a-3fd2be87ca36") + (property "Reference" "#PWR070" + (at 147.32 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 144.78 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 147.32 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 147.32 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "93c4220e-5ffa-4123-beb9-723c229dc310") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR070") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 207.01 113.03 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "6c46f9b0-0a74-4e98-b9c4-2df049b4e39c") + (property "Reference" "#PWR020" + (at 207.01 119.38 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 207.01 117.1631 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 207.01 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 207.01 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 207.01 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c956a8d7-13d4-45b5-b728-7b999f00dac3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR020") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 88.9 95.25 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6c9927b6-f93a-4723-89fa-50bca92b9d96") + (property "Reference" "#PWR015" + (at 88.9 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 85.09 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 88.9 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 88.9 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 88.9 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "18d094cb-2e1b-4eba-934e-a7589a37485c") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR015") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 185.42 86.36 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6d6f43ff-2381-4425-b321-847e2e0e16d0") + (property "Reference" "#PWR021" + (at 185.42 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 187.96 87.63 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 185.42 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 185.42 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 185.42 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7064f4b2-628b-4e1a-bcd1-04301983c849") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR021") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 76.2 177.8 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6ea92218-2db0-45e7-9feb-80976050be33") + (property "Reference" "#PWR090" + (at 76.2 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 78.74 179.07 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 76.2 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 76.2 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 76.2 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6542a505-acca-488b-a15f-15e005b22a35") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR090") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 147.32 264.16 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6efa63bc-86f0-4aeb-b38f-289f21f04c29") + (property "Reference" "R56" + (at 147.32 269.3203 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1k6" + (at 147.32 266.8961 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 147.32 265.938 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 147.32 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17896" + (at 147.32 264.16 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERJ-8ENF1601V" + (at 147.32 264.16 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "54758833-7cba-4cfb-90ec-e94bfff9bee2") + ) + (pin "1" + (uuid "a2a3ab98-2616-4609-af52-5013d78c558f") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R56") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 251.46 41.91 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "6f6953b1-4795-44d1-b2cf-7ab5d2ce88e2") + (property "Reference" "TP1" + (at 246.38 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 252.73 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 256.54 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 256.54 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 251.46 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 251.46 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "550037d8-5d18-4d00-80f7-4da15fa81a63") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 322.58 48.26 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "70307c71-cc1f-47ac-920e-e3974917f3ff") + (property "Reference" "C8" + (at 319.659 47.0479 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "180pF 50V" + (at 319.659 49.4721 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 323.5452 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C527293" + (at 322.58 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C181J5GAC7800" + (at 322.58 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "937963c4-c221-4c56-b669-664dfc8b6725") + ) + (pin "1" + (uuid "b16b56a8-2001-4e54-9ab6-f5f0c07a1afe") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 181.61 231.14 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "73356335-f24e-47bc-a59f-53720bf8c2e6") + (property "Reference" "#PWR061" + (at 181.61 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 179.07 233.68 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 181.61 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 181.61 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 181.61 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0cc48607-0fb3-42c6-9185-2f6815ce5e1a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR061") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 307.34 210.82 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "74386cd2-f4ec-4701-a971-8456a0188dae") + (property "Reference" "R55" + (at 307.34 205.6595 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 307.34 208.0838 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 307.34 212.598 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 307.34 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 307.34 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 307.34 210.82 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 307.34 210.82 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c7368528-480c-4733-a68b-8ab074e7f2dd") + ) + (pin "1" + (uuid "4d9595fa-40b0-4f5d-bdaa-c2cc84408ab5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R55") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 314.96 77.47 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "76f0a876-e43e-45ef-b257-fe7c8bbd6166") + (property "Reference" "R10" + (at 314.96 72.3097 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5k1" + (at 314.96 74.7339 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 314.96 79.248 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 314.96 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 314.96 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C26033" + (at 314.96 77.47 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERJ-8ENF5101V" + (at 314.96 77.47 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f606840f-5ebd-4037-97cc-2415bc3e0fe5") + ) + (pin "1" + (uuid "badaf7be-3f07-4880-abf0-fb2e9338c6a5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 269.24 35.56 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "772ae96c-7a41-4f9f-a8d6-037289b70d16") + (property "Reference" "R1" + (at 269.24 30.3997 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "2k" + (at 269.24 32.8239 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 269.24 37.338 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 269.24 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 269.24 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17944" + (at 269.24 35.56 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERA-8AEB202V" + (at 269.24 35.56 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e38f4725-4e53-409a-8289-588266a2f1af") + ) + (pin "1" + (uuid "e14b5cc1-0f5c-44cd-9488-72422a5871ac") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 365.76 71.12 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "77794d6d-1e82-499b-b278-e8cd404be329") + (property "Reference" "C18" + (at 368.681 72.3321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 360.68 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 364.7948 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 365.76 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 365.76 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 365.76 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 365.76 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "284a6984-340e-4e42-996e-16fd8ff30ebb") + ) + (pin "1" + (uuid "afe2dc41-0d88-4034-b9ec-efdac7abd9f3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 139.7 140.97 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "778b42a1-94fc-440a-8f83-e581868a9b99") + (property "Reference" "R49" + (at 141.478 139.7579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 141.478 142.1821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 141.478 140.97 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 139.7 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 139.7 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f9029038-0298-4ded-9c17-02f9ef707a62") + ) + (pin "1" + (uuid "d9da9ac5-6e94-4d7a-a51c-ef9977795d63") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R49") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 322.58 101.6 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "778e37e2-970f-4038-99ab-7c56df1abece") + (property "Reference" "#PWR036" + (at 322.58 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 325.12 102.87 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 322.58 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 322.58 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "102c6f7b-db59-42eb-bfa5-fd617874c27a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR036") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 52.07 218.44 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "780f732d-b8ac-481a-aa7d-16187ce59c70") + (property "Reference" "U9" + (at 52.07 207.9457 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 52.07 210.3699 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 52.07 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 52.07 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 52.07 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C3304462" + (at 52.07 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "MASWSS0179TR-3000" + (at 52.07 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "5e4e6ded-e6ab-4bed-9f05-ebf48346c76f") + ) + (pin "6" + (uuid "17514c59-5d07-486e-8331-8e66e219a23d") + ) + (pin "4" + (uuid "a5c76704-1e00-46c5-b33e-b95d26341bc6") + ) + (pin "1" + (uuid "200376fc-cef7-4afc-8f0e-b19759b48d85") + ) + (pin "2" + (uuid "63934c35-2071-4bfc-bbbb-117318255e53") + ) + (pin "3" + (uuid "bf34b0bc-c40b-45c0-84fc-8ae0cb917f9e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:T41_DualClock_Daughter") + (at 194.31 152.4 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7a68b1a2-9d33-4520-8453-b79f115dc2ee") + (property "Reference" "U12" + (at 184.15 151.7649 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "T41_DualClock_Daughter" + (at 223.774 162.052 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:T41_DualClock_Daughter" + (at 198.12 149.225 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 200.66 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 194.31 152.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 194.31 152.4 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "7" + (uuid "5e57fa1d-182a-4065-ab37-59d7a3989a6e") + ) + (pin "12" + (uuid "668006cf-3f85-4a02-902c-42a6386b810a") + ) + (pin "4" + (uuid "ced13373-3ef5-4d85-9181-f357d850aecf") + ) + (pin "3" + (uuid "12230f5b-bd00-4d5d-b740-9e30cf56fa23") + ) + (pin "5" + (uuid "a3e30968-cd0a-4b98-a99d-3d70336c2b3b") + ) + (pin "9" + (uuid "40fee890-c06b-49c8-942c-6c764d533f5e") + ) + (pin "6" + (uuid "9666bc91-5781-4755-813b-9cd989ccfb1d") + ) + (pin "2" + (uuid "5370c25c-b509-4f48-83ec-97d455b00468") + ) + (pin "1" + (uuid "ec535947-9a49-44c1-913d-59d3af15cdf4") + ) + (pin "8" + (uuid "c2fa4cd7-a83e-4d69-a65e-5f17b46e4a43") + ) + (pin "11" + (uuid "fcf9a84e-5943-4e9d-877c-e74d98432856") + ) + (pin "10" + (uuid "cf43701c-7abf-4aa9-be59-ba3ebeb584f0") + ) + (instances + (project "" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 281.94 167.64 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7ae7ce53-a224-41ba-b29d-67863bae35ac") + (property "Reference" "#PWR048" + (at 281.94 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 279.4 168.91 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 281.94 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 281.94 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "827135c8-c8b4-43e5-9a10-99b1742f17c1") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR048") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 287.02 85.09 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7b9832cd-6edd-415f-b379-ec98324bedd1") + (property "Reference" "#PWR031" + (at 287.02 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 287.02 89.2231 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 287.02 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 287.02 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 287.02 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "da62d5bc-9d1a-4b87-86b8-7ec62318de10") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR031") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 139.7 60.96 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "7bc44fc1-feee-494b-8a0b-0806d2176844") + (property "Reference" "G3" + (at 135.89 58.42 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "TestPoint" + (at 139.7 63.5 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 139.7 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 139.7 60.96 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "05bd692d-981a-4d6f-ac71-9feb9a34f881") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "G3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 46.99 161.29 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7d254234-688e-4aba-bdce-9a2561933a33") + (property "Reference" "R63" + (at 43.18 159.9042 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 43.18 157.48 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 46.99 163.068 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 46.99 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 46.99 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 46.99 161.29 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 46.99 161.29 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3a75ada1-e2ca-4de2-a086-9dd7b742455b") + ) + (pin "1" + (uuid "25fa9cb2-50e6-46b5-8869-1a1fee72bcea") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R63") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 307.34 194.31 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "80efe2d6-1d0d-45cf-9106-ab29abd59240") + (property "Reference" "R53" + (at 307.34 189.1495 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 307.34 191.5738 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 307.34 196.088 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 307.34 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 307.34 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 307.34 194.31 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 307.34 194.31 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6d52eb2c-553f-4b4a-a300-fef289c5cbe1") + ) + (pin "1" + (uuid "0fc2169e-7709-4ec4-a14f-2dfb56bbf10f") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R53") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 347.98 208.28 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "823890e2-e64d-48b2-b028-f988cd604b67") + (property "Reference" "U8" + (at 347.98 217.5043 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MC33078" + (at 347.98 215.0801 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 347.98 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC33078-D.PDF" + (at 347.98 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 347.98 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2057560" + (at 347.98 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "MC33078DR" + (at 347.98 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6d6edcbf-50bd-407c-af7d-e29b060b6a5d") + ) + (pin "4" + (uuid "044156db-f394-4fe3-8e56-8a68229a60b0") + ) + (pin "7" + (uuid "ddd1dc7f-e48c-4be9-84bb-56f54c65b7f9") + ) + (pin "8" + (uuid "1ddd0488-1a70-4666-b876-c65e3429cb80") + ) + (pin "6" + (uuid "d0f5dd9e-c737-49ff-a5d0-900ccf6ad25f") + ) + (pin "5" + (uuid "278f4a99-f32d-487d-9bed-3db9ca5316d7") + ) + (pin "3" + (uuid "ff85b316-07f1-4aad-9822-c36ed40d351d") + ) + (pin "2" + (uuid "a961f29f-472a-4e1d-b84e-afc975feec88") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 142.24 53.34 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "825f1799-6cf2-46a3-99bb-df719361f44e") + (property "Reference" "G1" + (at 143.51 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 142.24 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 147.32 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 147.32 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 142.24 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 142.24 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f1d22f22-aa28-43a4-807f-085b79c5a730") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "G1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 152.4 62.23 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "8296739c-d7e0-49ac-a4e9-7eca3db4e197") + (property "Reference" "G6" + (at 156.21 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 153.67 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 152.4 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 152.4 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 152.4 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 152.4 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "91f489d0-6caf-4ba5-a5ae-7f1af66fdfac") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "G6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 262.89 234.95 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "83b1fd2b-a6ae-44f7-aaa6-7d40e899bd80") + (property "Reference" "R47" + (at 262.89 229.7897 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k" + (at 262.89 232.2139 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 262.89 233.172 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 262.89 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 262.89 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 262.89 234.95 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 262.89 234.95 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "275a63ad-4b2b-4871-8e2f-dbd3bc8d782c") + ) + (pin "1" + (uuid "387320a6-fc11-4ed9-aa30-85d7631b8a24") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R47") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 256.54 90.17 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "84ab5530-6004-4188-ba08-5031614a63f1") + (property "Reference" "R16" + (at 256.54 85.0097 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "100R" + (at 256.54 87.4339 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 256.54 91.948 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 256.54 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 256.54 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17901" + (at 256.54 90.17 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1000ELF" + (at 256.54 90.17 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2f0e2f17-506f-4063-b205-601343937c8d") + ) + (pin "1" + (uuid "844e5eb6-3c86-4168-95fc-1a39b9306b52") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 351.79 194.31 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "84f380b9-6d6e-45da-b539-2f165369450b") + (property "Reference" "R36" + (at 351.79 189.1497 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k 1%" + (at 351.79 191.5739 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 351.79 196.088 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 351.79 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 351.79 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 351.79 194.31 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 351.79 194.31 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "08b8ed7b-a9f2-463a-a34b-ff9919e40c84") + ) + (pin "1" + (uuid "9d2bf8cd-f160-44a8-8fb4-a33f11222e64") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R36") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 168.91 91.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "85c61aea-7489-4c55-91e0-7fd6ba7adfd1") + (property "Reference" "R19" + (at 170.688 90.2278 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10k" + (at 170.688 92.6521 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 167.132 91.44 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 168.91 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 168.91 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 168.91 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 168.91 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "224e26be-3d05-45ed-a4b5-06cefe6379de") + ) + (pin "1" + (uuid "9cc9f1d7-d64c-4c57-9307-5fe6de67d55a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 372.11 170.18 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "8779f2b8-efdd-4de2-8398-01b97c21e6b5") + (property "Reference" "R30" + (at 372.11 165.0197 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k" + (at 372.11 167.4439 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 372.11 171.958 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 372.11 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 372.11 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 372.11 170.18 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 372.11 170.18 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cfe0319d-3c34-44ad-b47e-be03d65fea5f") + ) + (pin "1" + (uuid "774345a6-883a-46c8-a3de-ebf839082759") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R30") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 368.3 219.71 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "87ff4092-f84c-492b-b7c3-6323a67d1077") + (property "Reference" "#PWR042" + (at 368.3 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 365.76 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 368.3 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 368.3 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 368.3 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3901aac2-df96-4f8d-a40f-d116d9ab6025") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR042") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 168.91 82.55 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "882fd84c-cd57-4b47-9e67-c4dced60dd46") + (property "Reference" "R15" + (at 170.688 81.3378 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10k" + (at 170.688 83.7621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 167.132 82.55 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 168.91 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 168.91 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 168.91 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 168.91 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ff4e4b79-7b59-4314-bac2-6204f0ba90aa") + ) + (pin "1" + (uuid "5a368028-da27-4c16-94b7-a3b2197c2d52") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 243.84 172.72 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8a708bba-01d0-4d70-9eda-c3627f8a2e7e") + (property "Reference" "#PWR051" + (at 243.84 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 246.38 175.26 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 243.84 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 243.84 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8c72eb21-8f73-46db-89db-89ca7a3d25be") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR051") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 243.84 158.75 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8af6b184-51df-43f5-af3b-cd29dcae4d92") + (property "Reference" "C42" + (at 239.522 160.782 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 238.76 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 242.8748 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 243.84 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 243.84 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 243.84 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "10905aa8-a662-4053-9234-7de0e89dd885") + ) + (pin "1" + (uuid "daa9250a-95d1-4309-a5bc-28d549c15696") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C42") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12P") + (at 16.51 24.13 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "8c06f945-636c-41f4-a106-816d1f65239c") + (property "Reference" "#PWR01" + (at 16.51 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12P" + (at 16.51 19.9969 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 16.51 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 16.51 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 16.51 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ebdb8f54-d7ed-476c-b9d5-b36c13138fe1") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR01") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 85.09 220.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8d42d7b8-4b0f-46a7-b4ef-b00cb3889791") + (property "Reference" "#PWR017" + (at 85.09 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 84.074 225.552 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 85.09 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 85.09 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 85.09 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f0a70dbb-1231-4528-b626-2ef77f5b101f") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR017") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 146.05 226.06 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "90331624-cd6e-4236-91d2-c5faecd94478") + (property "Reference" "U7" + (at 146.05 215.5657 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 146.05 217.9899 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 146.05 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 146.05 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 146.05 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C3304462" + (at 146.05 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "MASWSS0179TR-3000" + (at 146.05 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "76ad03e7-99b8-4c59-b8bb-9b9b9d188caa") + ) + (pin "6" + (uuid "1aa1e1a8-bc0d-42b9-89e0-090952557704") + ) + (pin "4" + (uuid "efad0c39-5083-4f7c-a18b-781fb8a83806") + ) + (pin "1" + (uuid "b44c0132-fb3c-40b5-8030-b31de8339784") + ) + (pin "2" + (uuid "e5e88d26-994a-4076-8d62-8c003c1496e9") + ) + (pin "3" + (uuid "fc2a8c4a-cda1-4c9c-bdcb-0cb64fa705a4") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 336.55 236.22 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "90d41470-66d0-4f3a-82f1-78af80c17231") + (property "Reference" "R52" + (at 334.772 235.0078 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1k1" + (at 334.772 237.4321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 334.772 236.22 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 336.55 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 336.55 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17889" + (at 336.55 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1101ELF" + (at 336.55 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b06a1cee-c261-4e24-8eb6-d7d21c63d89f") + ) + (pin "1" + (uuid "b0da9c15-3a39-4680-b363-505dc9138c2a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R52") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole_Pad") + (at 143.51 19.05 270) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "9261f4c5-839a-4c33-a065-5a90ba320edf") + (property "Reference" "H5" + (at 147.32 19.05 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 147.32 20.2621 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_4.3mm_M4_DIN965_Pad" + (at 143.51 19.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 143.51 19.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 143.51 19.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 143.51 19.05 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fd4342f9-9f35-41f8-808f-009640104266") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 322.58 107.95 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "93514470-78fc-41a7-8d07-057272db40dc") + (property "Reference" "C21" + (at 320.04 105.41 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "105pF 50V" + (at 326.39 111.76 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 318.77 106.9848 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1884" + (at 322.58 107.95 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CL31C101JGFNNNE" + (at 322.58 107.95 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9defb383-6384-4519-8ce9-23cc3373ed9c") + ) + (pin "1" + (uuid "f19ec925-1953-4c73-85ef-8c76fcd26803") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 354.33 41.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "97527d4e-4333-4b55-84fe-8158fa000b4c") + (property "Reference" "TP2" + (at 349.25 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 350.52 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 359.41 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 359.41 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 354.33 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 354.33 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "751c8059-f98e-4d59-a660-26005aa28112") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 123.19 223.52 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "976d77a0-c65a-4fe2-b723-1c37d89870b5") + (property "Reference" "C45" + (at 129.54 222.25 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 128.778 220.218 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 119.38 224.4852 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 123.19 223.52 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 123.19 223.52 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e0d02151-00af-4f14-a311-ee1db6c3e8cf") + ) + (pin "1" + (uuid "6ba1a0a2-b5f4-443c-99f1-4f96a5ae665b") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C45") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 148.59 236.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9880f170-d3ab-4ca6-bbe4-50292ebe16d9") + (property "Reference" "#PWR062" + (at 148.59 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 151.13 237.49 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 148.59 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 148.59 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7e0dbc7d-c66f-4e87-be84-1add4a023bbc") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR062") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 194.31 67.31 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "98ede7af-aa06-4d0f-abef-a1d4df9922a2") + (property "Reference" "C6" + (at 191.008 68.834 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 192.786 71.628 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 195.2752 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 194.31 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 194.31 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 194.31 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 194.31 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "dce0aa3b-2b10-4689-b96e-16182e5ecd15") + ) + (pin "1" + (uuid "97d81cbe-c4f1-494d-bebe-6d0c98a71c63") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 306.07 233.68 270) + (unit 3) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "9987df45-436e-46b2-9f34-eaf17a28e025") + (property "Reference" "U6" + (at 306.07 227.1227 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MC33078" + (at 306.07 229.5469 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 306.07 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC33078-D.PDF" + (at 306.07 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 306.07 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2057560" + (at 306.07 233.68 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "MC33078DR" + (at 306.07 233.68 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b08a0fe3-0c2d-49cc-89ed-7b8b972917a9") + ) + (pin "4" + (uuid "044156db-f394-4fe3-8e56-8a68229a60ae") + ) + (pin "7" + (uuid "ddd1dc7f-e48c-4be9-84bb-56f54c65b7f7") + ) + (pin "8" + (uuid "1ddd0488-1a70-4666-b876-c65e3429cb7e") + ) + (pin "6" + (uuid "d0f5dd9e-c737-49ff-a5d0-900ccf6ad25d") + ) + (pin "5" + (uuid "278f4a99-f32d-487d-9bed-3db9ca5316d5") + ) + (pin "3" + (uuid "f82c28e7-e51f-431d-9d44-61e592fc560e") + ) + (pin "2" + (uuid "7060689d-235c-45e2-8cff-1ab4e5227904") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U6") + (unit 3) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 257.81 46.99 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9b74d670-c550-491f-b87e-81fe89937a62") + (property "Reference" "R8" + (at 257.81 52.1503 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "100R" + (at 257.81 49.7261 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 257.81 45.212 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 257.81 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 257.81 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17901" + (at 257.81 46.99 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1000ELF" + (at 257.81 46.99 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ab813df4-d6c3-4875-8715-ae78637746d1") + ) + (pin "1" + (uuid "2add30d0-d142-4865-89e0-f591f06542d5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 46.99 167.64 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9c2427d3-eff3-4403-9a44-d9ec67946f03") + (property "Reference" "R61" + (at 43.18 166.2542 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 43.18 163.83 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 46.99 169.418 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 46.99 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 46.99 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 46.99 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 46.99 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f345ba6f-b63d-47c2-b359-2855c8065d90") + ) + (pin "1" + (uuid "b9c98283-00ad-4e6e-beee-ea4e7d0c2dae") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R61") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 368.3 184.15 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9e396a40-911b-4ef6-a42f-4a0f252488a4") + (property "Reference" "#PWR041" + (at 368.3 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 365.76 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 368.3 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 368.3 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 368.3 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "38932525-d8fa-4c89-90cd-16f60a5540a9") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR041") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 160.02 148.59 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9e9f4c2f-1408-49c2-bceb-31342945a31b") + (property "Reference" "#PWR088" + (at 160.02 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 161.29 147.32 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 160.02 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 160.02 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 160.02 148.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "56266405-db50-4637-93c8-17f2a1ae20e4") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR088") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 278.13 52.07 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "9f42fe2a-7a66-40f0-86e9-005c6119aecf") + (property "Reference" "R7" + (at 279.908 50.8579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10k" + (at 279.908 53.2821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 276.352 52.07 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 278.13 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 278.13 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 278.13 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 278.13 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f7abefc1-6bd5-4859-9cda-d9de06a20cfe") + ) + (pin "1" + (uuid "6d98bd2d-e3fe-42b7-b65f-89dc55f75f02") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 281.94 201.93 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9f43d114-7678-4e98-935c-bb4d3fa6ee09") + (property "Reference" "#PWR016" + (at 281.94 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 279.4 204.47 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 281.94 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 281.94 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8d9afce2-6eb5-4d2d-b513-a401bfb6bfcb") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR016") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 41.91 88.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "9fb9cd67-1687-4a3b-9ae8-7fa5cf5a1d5c") + (property "Reference" "#PWR03" + (at 41.91 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 41.91 93.0331 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 41.91 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 41.91 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 41.91 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "bd3fb9cc-3f94-445d-89c8-9e550d33b4d3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR03") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole_Pad") + (at 143.51 24.13 270) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a09693b5-bc9a-478b-8f96-8eee23b0219a") + (property "Reference" "H6" + (at 147.32 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 147.32 25.3421 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_4.3mm_M4_DIN965_Pad" + (at 143.51 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 143.51 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 143.51 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 143.51 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f3c13bfd-bd47-455c-849e-91c6447355f7") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:74CBTLV3253PWRE4") + (at 207.01 96.52 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a14820aa-4878-44cf-bf0d-2b23291611ca") + (property "Reference" "U1" + (at 209.2041 74.5957 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "74CBTLV3253DR" + (at 208.28 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-16_3.9x9.9mm_P1.27mm" + (at 208.28 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74cbtlv3253.pdf" + (at 207.01 117.475 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 207.01 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C543079" + (at 207.01 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "SN74CBTLV3253DR" + (at 207.01 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "13" + (uuid "14fd973f-3279-4ab0-b1aa-43ac354dcde8") + ) + (pin "8" + (uuid "96023e65-6e05-441e-bbf3-289dd4879c6c") + ) + (pin "5" + (uuid "f2fd7638-c01d-4730-bdfe-4eb9d89d51c5") + ) + (pin "11" + (uuid "3ebd7669-0716-40ce-bfdd-b9b60c9cf178") + ) + (pin "1" + (uuid "a575bd7b-a6f2-423e-ad7e-fe03169cce2a") + ) + (pin "7" + (uuid "9b71c736-a301-46ad-9349-5c38c639bf6b") + ) + (pin "12" + (uuid "39d1326e-cfe2-4ebc-8125-3f05d7e4a942") + ) + (pin "6" + (uuid "ac34b0fc-c14c-4577-9d44-94a8da417086") + ) + (pin "9" + (uuid "cd30be1a-badd-46b9-9292-165dd7652400") + ) + (pin "3" + (uuid "ed179c8d-2bef-4dfe-b5fb-d3c4ad3d76b6") + ) + (pin "10" + (uuid "761ff806-2b78-4064-9def-247f25a4a26d") + ) + (pin "15" + (uuid "fb746ecf-6672-4f96-8703-2e0a7d40b534") + ) + (pin "2" + (uuid "3cc9fd01-3141-415c-b511-e4c3c1c61034") + ) + (pin "14" + (uuid "b5f5127d-b3c6-4c5b-b71d-d1a67efcfb1e") + ) + (pin "4" + (uuid "7a5024ae-ee33-42fd-bf57-f0479bfaccee") + ) + (pin "16" + (uuid "45c49937-5fd1-427f-a3ee-c0fe90854894") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 115.57 45.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a1686572-9323-403b-87cf-f144e61430ee") + (property "Reference" "#PWR07" + (at 115.57 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 115.57 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 115.57 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 115.57 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 115.57 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e3e18a98-c02d-4fe2-8ce3-978058dd97a5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR07") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 322.58 53.34 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a2da90c0-694b-402a-b6cb-9d2e2ed7c3c0") + (property "Reference" "#PWR033" + (at 322.58 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 325.12 54.61 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 322.58 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 322.58 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2a16c874-cf6e-4ca6-839c-78d1bc46ca5b") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR033") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 377.19 232.41 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a3aaa718-66ea-40ed-9d49-f47020194772") + (property "Reference" "L9" + (at 377.19 227.7604 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "FB" + (at 377.19 230.1846 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 377.19 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 377.19 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 377.19 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C74486" + (at 377.19 232.41 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "HZ1206E601R-10" + (at 377.19 232.41 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e16f5191-3423-4293-b5bf-5ece5450f5cd") + ) + (pin "2" + (uuid "c3760f1a-77c5-4a66-ac90-20197a3dbba5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 39.37 102.87 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a3b6f591-80d9-4828-a428-536abbd9460b") + (property "Reference" "C16" + (at 39.37 96.5667 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 39.37 98.9909 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 43.18 101.9048 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 39.37 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 39.37 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 39.37 102.87 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 39.37 102.87 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f5430d7d-8b84-47d5-bd3d-0561112af1ff") + ) + (pin "1" + (uuid "91fc583a-fd4a-4d87-99c0-cf740b20eadf") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 335.28 172.72 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a52f0228-af75-4234-a435-643c3426f459") + (property "Reference" "R32" + (at 335.28 167.5597 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k 1%" + (at 335.28 169.9839 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 335.28 174.498 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 335.28 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 335.28 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 335.28 172.72 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 335.28 172.72 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f1b50435-2004-4a2f-9520-03d924dff3bd") + ) + (pin "1" + (uuid "de05b289-5017-48de-8997-eafb9e180b1a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R32") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 39.37 135.89 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a5a3cfdb-a813-4d3e-81ea-3159bde6dc6c") + (property "Reference" "JP15" + (at 39.37 133.2809 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 39.37 133.2809 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 39.37 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 39.37 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 39.37 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 39.37 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a8bea2cd-7dc6-4153-b708-ad35dab6544e") + ) + (pin "1" + (uuid "b4366125-df1d-4fa7-9de9-d88f936df0d4") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "JP15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 351.79 69.85 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a8c0556f-9078-4853-b810-e4082c013efa") + (property "Reference" "C32" + (at 347.472 67.818 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 346.71 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 350.8248 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 351.79 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 351.79 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 351.79 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 351.79 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f9eebcc9-9be0-460f-8aec-8ca33eba8fc2") + ) + (pin "1" + (uuid "4f4e7766-1311-4b8b-a0c2-fc67acdcd384") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C32") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 353.06 236.22 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a9fd5735-413d-4016-ab27-56cbfc4fd118") + (property "Reference" "#PWR046" + (at 353.06 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 353.06 233.68 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 353.06 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 353.06 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 353.06 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "35a2d64c-8bc5-4dd9-9a24-d1860e84002c") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR046") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:MAR-3SM+") + (at 168.91 208.28 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "aa071f8b-18fe-4607-a8f4-e94cd209e382") + (property "Reference" "U13" + (at 180.2758 207.7822 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MAR-3SM+" + (at 180.2758 205.358 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:Mini-Circuits_WW107" + (at 178.435 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.minicircuits.com/pdfs/MAR-3SM+.pdf" + (at 180.34 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 168.91 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C6937326" + (at 168.91 208.28 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "MAR-3SM+" + (at 168.91 208.28 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0cf57800-7c84-42ea-a3d5-5c3dd43223ea") + ) + (pin "2" + (uuid "ba9d330e-db17-443e-9d57-9d63709fd4e8") + ) + (pin "3" + (uuid "66389677-dd72-4025-b199-9a3b91c22cee") + ) + (pin "4" + (uuid "de56e179-1925-4873-be30-711feb1f2089") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 347.98 76.2 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "aabd23a5-2f80-4e08-bf33-2b20c2f21a8e") + (property "Reference" "#PWR039" + (at 347.98 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 350.52 77.47 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 347.98 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 347.98 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 347.98 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fa4ddaf6-6a05-4a70-80d1-e66747aac5aa") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR039") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 309.88 81.28 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ab3ea4bc-56e0-44c9-ac0e-20e275a3bf54") + (property "Reference" "C11" + (at 306.959 80.0679 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 313.69 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 310.8452 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 309.88 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 309.88 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 309.88 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 309.88 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6536bbc4-fdbe-48c2-bd80-083d7762a875") + ) + (pin "1" + (uuid "46cdc06d-a445-41c8-ba5e-209fe205b973") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 73.66 27.94 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "abbf3a1f-cc73-40d3-9eae-4da5531c2e00") + (property "Reference" "C67" + (at 76.581 26.7279 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 50V" + (at 76.581 29.1521 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 74.6252 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 73.66 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 73.66 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 73.66 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 73.66 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "44329590-9fc4-40fa-8e18-c93b6e6bc50a") + ) + (pin "1" + (uuid "fdb88386-193b-49c4-8922-c987a4bd2893") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C67") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 346.71 236.22 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ac89dd91-a68a-41aa-a750-f6d106de34c1") + (property "Reference" "C59" + (at 349.25 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 346.71 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 345.7448 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 346.71 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 346.71 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 346.71 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 346.71 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "70964bee-c25c-4329-aaab-4f85678a4c9c") + ) + (pin "1" + (uuid "d5c6a368-be23-4492-990d-94cc16bb74ef") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C59") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 190.5 172.72 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "accbf3b8-826d-4502-83fd-44320e406ce7") + (property "Reference" "R37" + (at 193.04 171.4499 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0" + (at 193.04 173.9899 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 192.278 172.72 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 190.5 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 190.5 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 190.5 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 190.5 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "093b1f9d-fa88-47c2-ab6c-f0d3841f0b83") + ) + (pin "1" + (uuid "f80095e8-e90b-4fcc-8120-c555aecc7fa6") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R37") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 46.99 173.99 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ad544b08-0304-411a-b7c1-228755962e6e") + (property "Reference" "R60" + (at 43.18 172.6042 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 43.18 170.18 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 46.99 175.768 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 46.99 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 46.99 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17948" + (at 46.99 173.99 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "RT1206FRE072K2L" + (at 46.99 173.99 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ddd73146-f067-4c01-8e86-c14db7853d26") + ) + (pin "1" + (uuid "ca41527e-a1cf-482c-9b2a-4e1357489a15") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R60") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 55.88 238.76 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ad7316fb-9a55-4356-9737-30a4911dbc6f") + (property "Reference" "#PWR073" + (at 49.53 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 55.88 241.3 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 55.88 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 55.88 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 55.88 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "638f6e1b-4e27-47d1-b67b-c78233889ed0") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR073") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:Jumper_2_Open") + (at 25.4 83.82 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "ad87b898-c7a2-4996-b490-a56a31596238") + (property "Reference" "JP4" + (at 25.4 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "CAL isolation" + (at 25.4 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 25.4 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 25.4 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 25.4 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 25.4 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "14359d47-f314-4b5d-894c-ff86f03ebd66") + ) + (pin "1" + (uuid "b2ddc6e6-c2ad-4405-b631-c52743ed9a78") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "JP4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 198.12 130.81 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ada103f1-5c06-4c85-9857-fd437f036147") + (property "Reference" "#PWR082" + (at 198.12 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 198.12 134.9431 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 198.12 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 198.12 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 198.12 130.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "32002109-d06c-4ff6-9851-5d32bcf465d3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR082") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 162.56 208.28 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ada1b059-3061-4d9a-9d94-4ccdedd32249") + (property "Reference" "#PWR076" + (at 162.56 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 165.1 209.55 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 162.56 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 162.56 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 162.56 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "59cc0f80-fc63-44a4-a0b3-5d525059d0fd") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR076") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 342.9 71.12 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ae144e56-a8ad-4cab-9ab4-9934ac3264a4") + (property "Reference" "C26" + (at 339.979 72.3321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 341.63 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 343.8652 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 342.9 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 342.9 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 342.9 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 342.9 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a40ace44-e1a3-4030-a6a1-49e0f76bb87b") + ) + (pin "1" + (uuid "f145213b-b32d-4f98-b4be-b1f5907c622b") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C26") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 217.17 270.51 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "aec6bf72-14d7-4417-a5b8-fa036611fd55") + (property "Reference" "#PWR060" + (at 217.17 276.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 219.71 271.78 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 217.17 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 217.17 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 217.17 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4e323def-46a4-4017-ad82-204429e3139e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR060") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 102.87 45.72 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b2858ee3-b68b-4fcb-afd3-6bc6da45cd05") + (property "Reference" "L11" + (at 102.87 41.0704 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uH 20%" + (at 102.87 43.4946 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Inductor_SMD:L_Bourns-SRN6028" + (at 102.87 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 102.87 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 102.87 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C5753503" + (at 102.87 45.72 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "IFSC2020DEER100M01" + (at 102.87 45.72 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "320f005b-acba-4c9a-a693-a70f65d917d9") + ) + (pin "2" + (uuid "cbc44ee1-8305-46bd-92aa-ca5e96138556") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:LM317L_SO8") + (at 130.81 259.08 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b3999719-8f92-4f59-b3af-09cc142dd379") + (property "Reference" "U17" + (at 128.143 260.2921 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "LM317L" + (at 128.143 257.8679 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 125.73 259.08 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/snvs775k/snvs775k.pdf" + (at 135.89 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 130.81 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C183332" + (at 130.81 259.08 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "LM317LIDR" + (at 130.81 259.08 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "280bf6e2-1df9-4391-9997-c857d4646040") + ) + (pin "1" + (uuid "2eb24c28-edb2-4c6f-a8a4-724c4cf9941c") + ) + (pin "3" + (uuid "352ec95c-1185-4d16-985d-5ec78e3077ca") + ) + (pin "7" + (uuid "f7d84025-4405-49f4-9f7a-e396576e61e7") + ) + (pin "6" + (uuid "3aaacde0-3ebf-4824-b171-d000c20217cb") + ) + (pin "8" + (uuid "36a5ca6e-06aa-45da-92e0-75980a394e7b") + ) + (pin "4" + (uuid "0cd74e1b-bedf-4b95-bb31-527abf00315e") + ) + (pin "5" + (uuid "0aca1091-d180-4ac5-83ff-d32f1a8bcc07") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 325.12 200.66 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b51501aa-6d98-4196-9b5c-6864c0bfb599") + (property "Reference" "R41" + (at 325.12 195.4997 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k 1%" + (at 325.12 197.9239 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 325.12 202.438 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 325.12 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 325.12 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 325.12 200.66 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 325.12 200.66 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "182f24a0-3bf3-419f-9e09-b07eae4711b1") + ) + (pin "1" + (uuid "f455c366-c090-461b-89a3-c243e0af6b81") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R41") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:T41_Attenuator_Daughter") + (at 101.6 92.71 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b697e643-c7f2-4ea5-8d1f-833c50bce0fc") + (property "Reference" "U11" + (at 100.965 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "T41_Attenuator_Daughter" + (at 100.965 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:T41_Attenuator_Daughter" + (at 104.775 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 105.41 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 101.6 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 101.6 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "8" + (uuid "adbbf6ae-ddf3-4931-83ce-388fe58dde9d") + ) + (pin "10" + (uuid "a29f5c2a-d311-4d8c-b46e-7adddb79b1bc") + ) + (pin "12" + (uuid "3fb24e55-793e-4cdd-b9ff-04ff9891dd33") + ) + (pin "9" + (uuid "6c117822-77b1-419d-96f9-ae607ca0b54e") + ) + (pin "7" + (uuid "d45e98dc-15d5-4723-a59f-b45a7e961aeb") + ) + (pin "11" + (uuid "05e93006-d762-4f56-8c06-10edd4573efe") + ) + (pin "6" + (uuid "3e191061-0231-48fc-a5b7-9cd53b79d504") + ) + (pin "5" + (uuid "e3e339df-b5ad-4997-a50d-7e0bed70775e") + ) + (pin "4" + (uuid "d8e6e8a1-7789-4a9e-bba6-6d7bb7f105d0") + ) + (pin "3" + (uuid "db06c367-5321-432f-9ea3-a22a295a3eeb") + ) + (pin "2" + (uuid "7cfc8c4f-a8e5-4819-a776-d5301c2c99ef") + ) + (pin "1" + (uuid "c50294a9-fe14-4edd-8d59-0ee620de8ffb") + ) + (instances + (project "" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 200.66 67.31 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b80eeb8b-7961-4aeb-8a6a-fb5018fa1137") + (property "Reference" "C3" + (at 195.58 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 195.58 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 199.6948 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 200.66 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 200.66 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 200.66 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 200.66 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d6d4bb3c-8394-4aec-8668-0c4476716a86") + ) + (pin "1" + (uuid "a66dbce3-51a1-4875-b105-8595b6db8caa") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 351.79 162.56 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ba99aafa-7d78-462b-86ef-9951fc4f8595") + (property "Reference" "C33" + (at 346.71 163.83 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2.2nF 50V" + (at 346.71 166.37 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 355.6 163.5252 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 351.79 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 351.79 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C326631" + (at 351.79 162.56 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "GRM3195C1H222JA01D" + (at 351.79 162.56 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "737e0afe-d37d-4d39-9590-8395dd1642e6") + ) + (pin "1" + (uuid "1bed95bd-9e46-4ce4-9c63-8c3b21c9fd66") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C33") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 363.22 243.84 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "baaf9c19-dc40-4360-942f-486284a1fb5a") + (property "Reference" "C36" + (at 366.776 245.872 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 357.378 246.634 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 367.03 244.8052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 363.22 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 363.22 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 363.22 243.84 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 363.22 243.84 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1c8066f2-8d89-4ac9-ab7a-79c198d4b046") + ) + (pin "1" + (uuid "8178fe18-d0c2-4059-a5ae-01f26ab6a0d6") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C36") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 377.19 247.65 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "bb30590d-6263-4f5c-b60d-2d6cd848b059") + (property "Reference" "C61" + (at 383.54 246.38 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 381 243.84 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 373.38 248.6152 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 377.19 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 377.19 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 377.19 247.65 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 377.19 247.65 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "09742436-b1ba-4dbe-9ea3-e05f6e300248") + ) + (pin "1" + (uuid "44a26389-cbc9-4dd8-bd0a-55bcb047bbe3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C61") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 153.67 102.87 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "bbfa32a0-6069-46b1-a4fc-da5700d693fe") + (property "Reference" "C27" + (at 152.4 109.22 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 153.67 106.7491 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 157.48 103.8352 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 153.67 102.87 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 153.67 102.87 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1c3c5d4a-73df-423d-bf0d-c4fe076b4039") + ) + (pin "1" + (uuid "ac322af2-87dd-4401-b29a-6662dcc57d4d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C27") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Transistor_FET:BS170") + (at 245.11 234.95 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "bc3fcd71-3914-495f-b73c-e391b00aa8d3") + (property "Reference" "Q1" + (at 250.19 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "BS170" + (at 251.46 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92" + (at 240.03 236.855 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BS170-D.PDF" + (at 240.03 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "" + (at 245.11 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 245.11 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "BS170" + (at 245.11 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "92be6197-7231-4022-bd29-b530de8506ab") + ) + (pin "2" + (uuid "5b71f57b-35a1-42f9-8548-236c18007272") + ) + (pin "1" + (uuid "50bdd62f-1a1e-4365-9b6d-fa9767b809f4") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "Q1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 307.34 158.75 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bc4c140a-01c5-4bfa-9d2d-49a43a2636c1") + (property "Reference" "R24" + (at 307.34 153.5895 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 307.34 156.0138 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 307.34 160.528 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 307.34 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 307.34 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 307.34 158.75 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 307.34 158.75 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "86d02454-7317-42fc-842a-4492bac7c4ed") + ) + (pin "1" + (uuid "23224ae2-6edc-45ee-b27e-7feb8426d36a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 91.44 27.94 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bc6ef2cb-a847-4253-b06d-215e6d6af04a") + (property "Reference" "C68" + (at 94.361 26.7279 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 94.361 29.1521 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 92.4052 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 91.44 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 91.44 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 91.44 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 91.44 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1911a329-3138-421e-a60a-e1fbbd818077") + ) + (pin "1" + (uuid "77af9959-3811-4475-9b28-0446fbd54778") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C68") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:PSA-8A+") + (at 138.43 102.87 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bc7f1f12-c831-4e95-91ac-3e7b8da5081f") + (property "Reference" "U2" + (at 138.43 93.6457 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "PSA-8A+" + (at 138.43 96.0699 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-363_SC-70-6" + (at 138.43 112.395 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.minicircuits.com/pdfs/PSA-8A+.pdf" + (at 139.7 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 138.43 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C3192212" + (at 138.43 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "PSA-8A+" + (at 138.43 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "76ec0147-dad6-4680-bbe3-0d720d292dff") + ) + (pin "1" + (uuid "48aa3d25-fa85-4678-998d-c0d4ec0df202") + ) + (pin "3" + (uuid "e2ea8b26-df9d-4f30-980a-09b3e01a37bd") + ) + (pin "4" + (uuid "6507b868-3295-4987-ba8b-0444fa4f338b") + ) + (pin "2" + (uuid "684ec6b9-93a0-4392-887b-be82b22b7044") + ) + (pin "6" + (uuid "686d423c-9789-43f9-98a7-a8437a7eeb8d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 257.81 41.91 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bdf38931-802a-45c1-99e2-7ffdd8e8e288") + (property "Reference" "R4" + (at 257.81 36.7497 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "100R" + (at 257.81 39.1739 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 257.81 43.688 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 257.81 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 257.81 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17901" + (at 257.81 41.91 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1000ELF" + (at 257.81 41.91 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f2a1cf3a-50f0-45e0-8612-995fbeb68eec") + ) + (pin "1" + (uuid "9f24fdf7-048b-47bb-90e6-a141d0839fb1") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 134.62 86.36 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "beec07e1-12b2-4f2e-bf96-0c2777e1b478") + (property "Reference" "C13" + (at 133.35 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 134.62 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 135.5852 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 134.62 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 134.62 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 134.62 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 134.62 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7771b5f3-9fe2-49f1-ab71-66b70e829d51") + ) + (pin "1" + (uuid "859325fd-d444-4497-b989-6ffaff314154") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 320.04 231.14 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c05f687b-efc0-4529-b227-1a78c4b0d376") + (property "Reference" "L8" + (at 320.04 226.4904 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "FB" + (at 320.04 228.9146 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 320.04 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 320.04 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 320.04 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C74486" + (at 320.04 231.14 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "HZ1206E601R-10" + (at 320.04 231.14 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "26da0bc5-1ce9-4b71-8302-f23729443e44") + ) + (pin "2" + (uuid "a58ce37e-8878-45f5-94c1-0befb425e9be") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 140.97 275.59 90) + (mirror x) + (unit 3) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c087d2d5-2488-49e1-bb89-43282482635d") + (property "Reference" "U16" + (at 140.97 269.0327 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM358B" + (at 140.97 271.4569 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 140.97 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC33078-D.PDF" + (at 140.97 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 140.97 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1850238" + (at 140.97 275.59 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "LM358BIDR" + (at 140.97 275.59 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "8b2179e2-30d1-40c1-903e-b401af42aa78") + ) + (pin "5" + (uuid "57180fcd-2fb6-4525-9661-537a9bb80fb0") + ) + (pin "2" + (uuid "825b70b2-c176-444b-bb53-ecb4ead45b83") + ) + (pin "7" + (uuid "222ef63a-90bc-44c5-8d63-d5c658bc48e0") + ) + (pin "1" + (uuid "a0c7b821-6e49-4606-8ac7-2234e032ffd1") + ) + (pin "8" + (uuid "fc857c94-c483-431e-af64-014d21709dff") + ) + (pin "3" + (uuid "5dfbe698-0cca-4de9-82f7-a71e9afb5226") + ) + (pin "4" + (uuid "aa0a6938-423f-460f-a09a-613d848653d3") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U16") + (unit 3) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 49.53 228.6 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c15b18a0-9c29-454b-8bea-0ec18a51bf49") + (property "Reference" "#PWR068" + (at 49.53 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 46.99 229.87 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 49.53 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 49.53 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 49.53 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3e1a0894-07ae-4a70-902b-8728a6c4455e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR068") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:LM7805_TO220") + (at 62.23 24.13 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c18341db-0b6a-426c-a143-af24ef423f00") + (property "Reference" "U14" + (at 62.23 18.0807 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM7805CT" + (at 62.23 20.5049 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 62.23 18.415 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" + (at 62.23 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 62.23 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C725349" + (at 62.23 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "LM7805CT" + (at 62.23 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "33a774f5-2bd1-44dc-b1ca-1ff586e7ad73") + ) + (pin "2" + (uuid "3c284809-ec9f-4fda-9b6a-ea325f4881c1") + ) + (pin "1" + (uuid "58463ff0-fbd7-4c76-997c-be6556632ad9") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 382.27 170.18 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c202c6e6-c7c5-44ac-a6f8-669a90224601") + (property "Reference" "R66" + (at 382.27 165.0195 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 382.27 167.4438 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 382.27 171.958 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 382.27 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 382.27 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 382.27 170.18 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 382.27 170.18 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c24128d8-1f1a-488f-8d53-9a8034430732") + ) + (pin "1" + (uuid "fc5fe9cd-c809-4e52-a1e3-91bef146a4d8") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R66") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 214.63 231.14 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "c26db767-1143-4bfc-bc02-6c1b5bb2986d") + (property "Reference" "TP12" + (at 217.932 235.9193 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "TestPoint" + (at 217.932 233.4951 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 214.63 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 214.63 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 214.63 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 214.63 231.14 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "bf7357a9-4842-495f-9752-4a61b034e24a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 190.5 127 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c331f122-088c-4cd0-959b-54b4b4cff0dd") + (property "Reference" "R40" + (at 195.6603 127 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0" + (at 193.2361 127 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 188.722 127 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 190.5 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 190.5 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17888" + (at 190.5 127 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "1206S4J0000TDE" + (at 190.5 127 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4fd9795c-beea-444f-a691-87eed9dee29d") + ) + (pin "1" + (uuid "880f3bbb-57c8-4c95-ac08-58b8a5531720") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R40") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 36.83 24.13 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c44c51e7-8e1c-49a6-9bf6-fecd02692bf4") + (property "Reference" "#PWR012" + (at 36.83 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 36.83 19.05 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 36.83 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 36.83 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 36.83 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7a0eb818-4de2-460d-a2fa-09a18aa86b42") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR012") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 72.39 102.87 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c4a96ea6-41cd-468a-8e4c-741ea4f9b9be") + (property "Reference" "C22" + (at 72.39 96.5667 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 72.39 98.9909 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 76.2 101.9048 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 72.39 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 72.39 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 72.39 102.87 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 72.39 102.87 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d3651ec5-9390-47aa-bc79-496d9a626292") + ) + (pin "1" + (uuid "3da3dcea-3556-451c-ba21-21dc1fc7f6fa") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 321.31 175.26 180) + (unit 2) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c5997762-7ddb-4389-931c-1aa158b5d9ed") + (property "Reference" "U6" + (at 321.31 184.4843 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MC33078" + (at 321.31 182.0601 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 321.31 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC33078-D.PDF" + (at 321.31 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 321.31 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2057560" + (at 321.31 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "MC33078DR" + (at 321.31 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b08a0fe3-0c2d-49cc-89ed-7b8b972917aa") + ) + (pin "4" + (uuid "044156db-f394-4fe3-8e56-8a68229a60af") + ) + (pin "7" + (uuid "ddd1dc7f-e48c-4be9-84bb-56f54c65b7f8") + ) + (pin "8" + (uuid "1ddd0488-1a70-4666-b876-c65e3429cb7f") + ) + (pin "6" + (uuid "d0f5dd9e-c737-49ff-a5d0-900ccf6ad25e") + ) + (pin "5" + (uuid "278f4a99-f32d-487d-9bed-3db9ca5316d6") + ) + (pin "3" + (uuid "f82c28e7-e51f-431d-9d44-61e592fc560f") + ) + (pin "2" + (uuid "7060689d-235c-45e2-8cff-1ab4e5227905") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U6") + (unit 2) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 121.92 96.52 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c59db8d6-776b-4990-81d4-46264caf6960") + (property "Reference" "C29" + (at 121.92 102.8233 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 121.92 100.3991 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 125.73 97.4852 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 121.92 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 121.92 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 121.92 96.52 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 121.92 96.52 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c159a86e-3d32-40d9-8e8c-a8e6cccaf32a") + ) + (pin "1" + (uuid "cd4fe443-eb76-4281-94ac-443122d8b62c") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C29") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 80.01 53.34 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c645da4c-81a4-40c8-bb9e-d5919b1a7835") + (property "Reference" "#PWR09" + (at 80.01 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 80.01 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 80.01 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 80.01 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 80.01 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0aaf0566-a848-4fb4-a8f7-6cb59593bffa") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR09") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 33.02 167.64 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c6679af3-6cd5-4901-ba13-4eeea64bc18c") + (property "Reference" "#PWR089" + (at 33.02 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 33.02 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 33.02 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 33.02 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 33.02 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e57de7ca-9190-4d49-819f-377f924f3e64") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR089") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 21.59 213.36 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c6a5ec2f-799a-483b-996f-795fc1edfc1b") + (property "Reference" "J6" + (at 19.0499 214.2789 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "RF_OUT" + (at 24.384 202.184 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 21.59 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 21.59 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 21.59 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 21.59 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CONSMA001-G" + (at 21.59 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "81347db8-6f53-4284-ae7e-a4af20acb1a2") + ) + (pin "2" + (uuid "8c808be4-0431-4cf9-9435-cdd6a3076da7") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 372.11 205.74 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c73a785d-f6cd-464d-bbb8-8201f0751d32") + (property "Reference" "R44" + (at 372.11 200.5797 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k" + (at 372.11 203.0039 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 372.11 207.518 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 372.11 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 372.11 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 372.11 205.74 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 372.11 205.74 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "06bd2691-05bf-4a08-bcc4-d0be46c05927") + ) + (pin "1" + (uuid "a0648805-9b56-4a94-a1c4-da7128fa7848") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R44") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 322.58 59.69 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c8377519-e405-464b-add7-a151f724c18f") + (property "Reference" "C5" + (at 320.04 57.15 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "105pF 50V" + (at 326.39 63.5 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 318.77 58.7248 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1884" + (at 322.58 59.69 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CL31C101JGFNNNE" + (at 322.58 59.69 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "523cd165-401c-4438-8cea-97d786d854e9") + ) + (pin "1" + (uuid "818d221f-46c6-40b3-a0ca-e77de1da0e41") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 321.31 210.82 180) + (unit 2) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c86df541-0aeb-419e-b075-7ac18a94754d") + (property "Reference" "U8" + (at 321.31 220.0443 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MC33078" + (at 321.31 217.6201 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 321.31 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC33078-D.PDF" + (at 321.31 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 321.31 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2057560" + (at 321.31 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "MC33078DR" + (at 321.31 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b08a0fe3-0c2d-49cc-89ed-7b8b972917ab") + ) + (pin "4" + (uuid "044156db-f394-4fe3-8e56-8a68229a60b1") + ) + (pin "7" + (uuid "a28fc044-9ebd-434a-a3ab-fffad1df3ec6") + ) + (pin "8" + (uuid "1ddd0488-1a70-4666-b876-c65e3429cb81") + ) + (pin "6" + (uuid "510ccc4a-3872-4d65-819f-d4ae0736704a") + ) + (pin "5" + (uuid "3bcd3b4b-4142-42e0-b793-9e5e25d1303f") + ) + (pin "3" + (uuid "f82c28e7-e51f-431d-9d44-61e592fc5610") + ) + (pin "2" + (uuid "7060689d-235c-45e2-8cff-1ab4e5227906") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U8") + (unit 2) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 248.92 59.69 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c906b9be-9c5f-4f33-89bd-77c04ebdeeba") + (property "Reference" "#PWR026" + (at 248.92 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 248.92 63.8231 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 248.92 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 248.92 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 248.92 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "61733c65-000e-487e-8bd7-87222c5e5d5b") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR026") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 248.92 34.29 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c9a08a05-b2b4-4515-bdf7-fca4a65ad8d4") + (property "Reference" "C4" + (at 251.841 35.5021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10nF 50V" + (at 251.841 33.0779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 247.9548 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 248.92 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 248.92 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1846" + (at 248.92 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C103K5RAC7210" + (at 248.92 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a42aacd1-c0a3-4adf-ac11-4c68d9c3b791") + ) + (pin "1" + (uuid "d7a4e42d-20ca-427f-87f2-ad6079619d0d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 190.5 63.5 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c9e9f4a8-3c7a-4e1c-a7cc-27a06d1d978d") + (property "Reference" "L1" + (at 190.5 58.8502 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "FB" + (at 190.5 61.2745 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 190.5 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 190.5 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 190.5 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C74486" + (at 190.5 63.5 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "HZ1206E601R-10" + (at 190.5 63.5 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "20239859-a46a-43be-bf51-487810a0902d") + ) + (pin "2" + (uuid "df28b633-b84c-4c76-8aff-7e7c85ca7527") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 360.68 66.04 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "cb01545b-d846-492d-8a1f-22db74359dbb") + (property "Reference" "L2" + (at 360.68 61.3904 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "FB" + (at 360.68 63.8146 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 360.68 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 360.68 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 360.68 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C74486" + (at 360.68 66.04 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "HZ1206E601R-10" + (at 360.68 66.04 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "23c86226-a809-40d6-a1d5-2daa809baa91") + ) + (pin "2" + (uuid "71410ff8-5172-4eeb-9896-288d697ac914") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 67.31 102.87 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "ccfd5155-b814-4b89-8f85-cde5af9ba7ac") + (property "Reference" "TP4" + (at 65.913 104.9599 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "TestPoint" + (at 67.31 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 72.39 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 72.39 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 67.31 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5d72d88e-6c14-43c6-9679-7dbe18e6cd9d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 146.05 257.81 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "cd64490d-0941-4aa4-8700-7a7a248a68f1") + (property "Reference" "U16" + (at 146.05 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM358B" + (at 146.05 250.19 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 146.05 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC33078-D.PDF" + (at 146.05 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 146.05 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1850238" + (at 146.05 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "LM358BIDR" + (at 146.05 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "8b2179e2-30d1-40c1-903e-b401af42aa79") + ) + (pin "5" + (uuid "57180fcd-2fb6-4525-9661-537a9bb80fb1") + ) + (pin "2" + (uuid "825b70b2-c176-444b-bb53-ecb4ead45b84") + ) + (pin "7" + (uuid "222ef63a-90bc-44c5-8d63-d5c658bc48e1") + ) + (pin "1" + (uuid "a0c7b821-6e49-4606-8ac7-2234e032ffd2") + ) + (pin "8" + (uuid "fc857c94-c483-431e-af64-014d21709e00") + ) + (pin "3" + (uuid "5dfbe698-0cca-4de9-82f7-a71e9afb5227") + ) + (pin "4" + (uuid "aa0a6938-423f-460f-a09a-613d848653d4") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 363.22 234.95 270) + (unit 3) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ce484b45-0c5c-4b7a-88d3-bd3a22291ffa") + (property "Reference" "U8" + (at 363.22 228.3927 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MC33078" + (at 363.22 230.8169 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 363.22 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC33078-D.PDF" + (at 363.22 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 363.22 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2057560" + (at 363.22 234.95 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "MC33078DR" + (at 363.22 234.95 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b08a0fe3-0c2d-49cc-89ed-7b8b972917ac") + ) + (pin "4" + (uuid "a99774a1-8584-4ef0-8a8a-6d70c5613232") + ) + (pin "7" + (uuid "ddd1dc7f-e48c-4be9-84bb-56f54c65b7fa") + ) + (pin "8" + (uuid "a91c9373-f2bd-45cb-9be7-fb98cda4050e") + ) + (pin "6" + (uuid "d0f5dd9e-c737-49ff-a5d0-900ccf6ad260") + ) + (pin "5" + (uuid "278f4a99-f32d-487d-9bed-3db9ca5316d8") + ) + (pin "3" + (uuid "f82c28e7-e51f-431d-9d44-61e592fc5611") + ) + (pin "2" + (uuid "7060689d-235c-45e2-8cff-1ab4e5227907") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U8") + (unit 3) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 360.68 179.07 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "cf507d18-4bb1-4f55-bfd5-016cfd1dc81b") + (property "Reference" "C39" + (at 365.76 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 365.76 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 361.6452 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 360.68 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 360.68 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 360.68 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 360.68 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a46173af-6db6-4980-a7bd-9ca99422ef69") + ) + (pin "1" + (uuid "4c4a2d20-33bf-4b86-8802-23f3d85fd105") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C39") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 304.8 44.45 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "cf56b80d-9932-45c6-80b0-65f58a86b6b1") + (property "Reference" "R5" + (at 304.8 39.2897 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5k1" + (at 304.8 41.7139 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 304.8 46.228 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 304.8 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 304.8 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C26033" + (at 304.8 44.45 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERJ-8ENF5101V" + (at 304.8 44.45 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d8eef05b-7db1-4d70-aa45-e36c9dab7a00") + ) + (pin "1" + (uuid "6931772f-c5ab-41c3-ab18-288b63bc65d5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 396.24 170.18 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d1fce359-88ef-456a-8f7f-aeda00ea4c89") + (property "Reference" "#PWR055" + (at 396.24 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 398.78 171.45 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 396.24 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 396.24 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 396.24 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b19f486e-084b-47f8-91dc-70c0d38c5d2a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR055") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 330.2 29.21 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d220bc8e-e7da-444e-a985-66067e87adf4") + (property "Reference" "R2" + (at 330.2 24.0497 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5k1" + (at 330.2 26.4739 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 330.2 30.988 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 330.2 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 330.2 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C26033" + (at 330.2 29.21 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERJ-8ENF5101V" + (at 330.2 29.21 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6026437a-c463-4dd5-b6e7-03d236b6e393") + ) + (pin "1" + (uuid "23c6f52d-5153-4226-aa17-16d13d196077") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 304.8 92.71 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d50d1298-e07d-4ce9-8890-aba3c44564b9") + (property "Reference" "R17" + (at 304.8 87.5497 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5k1" + (at 304.8 89.9739 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 304.8 94.488 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 304.8 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 304.8 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C26033" + (at 304.8 92.71 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERJ-8ENF5101V" + (at 304.8 92.71 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9f56e144-8f52-4098-8ad7-5e0f6510a0fa") + ) + (pin "1" + (uuid "1ce6ecde-e339-4631-9782-2dbd8755618e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 278.13 60.96 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d6b605de-f379-4cab-a0ff-601a37f31c99") + (property "Reference" "R9" + (at 279.908 59.7479 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10k" + (at 279.908 62.1721 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 276.352 60.96 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 278.13 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 278.13 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 278.13 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 278.13 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2ced29a9-04e9-49ca-8f99-f0297d600346") + ) + (pin "1" + (uuid "0ff6b985-bb52-4e77-ae36-82931f2748a0") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole_Pad") + (at 152.4 57.15 270) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d6cc8226-8999-475a-aacc-a7ee3bb3716c") + (property "Reference" "H1" + (at 156.21 57.15 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 156.21 58.3621 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_3.2mm_M3_Pad" + (at 152.4 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 152.4 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 152.4 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 152.4 57.15 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "858a42ce-e885-49e7-82d0-dce712517983") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 281.94 109.22 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d6eaeb5f-9282-45a2-892e-49c8162a7da1") + (property "Reference" "R23" + (at 283.718 108.0079 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10k" + (at 283.718 110.4321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 283.718 109.22 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 281.94 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 281.94 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 281.94 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a7035397-d318-4d99-a497-3d2f5991ecc5") + ) + (pin "1" + (uuid "29587686-bcc8-4f97-ae26-b06740823c40") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R23") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 148.59 50.8 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "d842fef4-a027-430c-9f28-fee9793190e3") + (property "Reference" "G5" + (at 149.86 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 148.59 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 153.67 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 148.59 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "48f3c58f-1aef-4d01-a2b9-761ea71a8d8d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "G5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 248.92 82.55 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d87bf78f-d0b8-4a18-a61d-31f15b64cb4b") + (property "Reference" "C17" + (at 251.841 83.7621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10nF 50V" + (at 251.841 81.3379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 247.9548 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 248.92 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 248.92 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1846" + (at 248.92 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C103K5RAC7210" + (at 248.92 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2288a02a-22e5-4630-a653-6f0ecccd5232") + ) + (pin "1" + (uuid "3fd1eab0-f79c-4f66-b3d3-cf15177777d7") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 309.88 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d9a20272-5259-43f6-afee-c864e54d25a8") + (property "Reference" "#PWR034" + (at 309.88 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 312.42 39.37 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 309.88 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 309.88 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 309.88 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "913cc275-4e79-4eda-b1b6-1f2db34098ad") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR034") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 81.28 91.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d9f4b443-e813-4985-8db3-c2c0ef016b4b") + (property "Reference" "#PWR014" + (at 81.28 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 81.28 95.5731 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 81.28 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 81.28 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 81.28 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e3da5e5e-7722-465b-afec-543a36074be5") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR014") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 140.97 86.36 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "da9d9f10-e820-4f3e-8019-31a36c3c8d4c") + (property "Reference" "C12" + (at 135.89 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 135.89 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 140.0048 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 140.97 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 140.97 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 140.97 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 140.97 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b1c7534c-1054-478d-a8b8-0833730e3e8b") + ) + (pin "1" + (uuid "d670bb65-4197-40a4-902f-e4b1cf461c0c") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 234.95 176.53 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "daa0a771-8031-4197-9813-0123fb8e8e35") + (property "Reference" "C31" + (at 237.49 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 238.76 177.8 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 235.9152 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 234.95 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 234.95 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 234.95 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 234.95 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "089f36a7-75e2-40cc-b462-ce9132e0fe45") + ) + (pin "1" + (uuid "09b61c0b-02e2-4e2e-ad7f-a247f3ca74d9") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C31") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 214.63 220.98 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "dada0933-3645-4ff8-a106-f85b8e3ebd22") + (property "Reference" "TP8" + (at 217.932 216.2007 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "TestPoint" + (at 217.932 218.6249 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 214.63 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 214.63 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 214.63 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 214.63 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "61e1dae2-1a73-4cf0-b0f2-b0fca1a9ce43") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 138.43 137.16 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dadccb5a-70ed-446c-b44f-3c63a517a5d2") + (property "Reference" "#PWR087" + (at 138.43 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 142.24 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 138.43 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 138.43 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 138.43 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "dfe09d94-cb9d-450a-bfd5-cbc63097115a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR087") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 368.3 214.63 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "db621c88-864c-4856-8718-4a63943f7b2a") + (property "Reference" "C54" + (at 375.92 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10nF 50V" + (at 379.73 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 369.2652 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 368.3 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 368.3 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1846" + (at 368.3 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C103K5RAC7210" + (at 368.3 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ebe5742e-a0a2-4b17-bdc6-b0d31db5a09c") + ) + (pin "1" + (uuid "1bfd555f-a625-47a6-acc2-26885eff493f") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C54") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 281.94 163.83 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dbbfead1-b859-4ff7-9640-24fdb8224fd5") + (property "Reference" "C34" + (at 285.75 161.29 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.2uF 50V" + (at 292.1 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 282.9052 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 281.94 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1857" + (at 281.94 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "12065C204KAT4A" + (at 281.94 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f532ab03-22ab-4df0-9d2b-dd64e314450b") + ) + (pin "1" + (uuid "cf019267-d89f-4d65-a026-24de0494faec") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C34") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 243.84 41.91 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dcf3d7ed-0a34-4fe2-b67a-7a5f225cb230") + (property "Reference" "C2" + (at 242.6279 38.989 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1uF 50V" + (at 245.0521 38.989 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 240.03 42.8752 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 243.84 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1848" + (at 243.84 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CL31B105KBHNNNE" + (at 243.84 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c9783667-af08-4dee-bffe-4f481d837bb2") + ) + (pin "1" + (uuid "2977b2af-ba41-4b0c-8fd4-cb855f82c7ca") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 113.03 226.06 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "def4a76e-7c98-4860-bf6d-7f340e558711") + (property "Reference" "#PWR064" + (at 113.03 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 112.014 230.632 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 113.03 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 113.03 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 113.03 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "95cddf3b-8b8a-476d-b6e1-f4b0330f8ef6") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR064") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 134.62 250.19 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dff7c554-8dcc-4c0a-830a-3baa1fd2eeb4") + (property "Reference" "R57" + (at 134.62 245.0297 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "330R" + (at 134.62 247.4539 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 134.62 248.412 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 134.62 250.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 134.62 250.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17930" + (at 134.62 250.19 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-3300ELF" + (at 134.62 250.19 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1608d832-dbd5-401f-a144-c40dd6526570") + ) + (pin "1" + (uuid "10b36334-9b31-4a64-8da7-f2d89dada818") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R57") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 297.18 175.26 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e05af967-e093-4b0a-ba3e-7015cdfa7ca8") + (property "Reference" "R33" + (at 297.18 170.0997 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "49R9 1%" + (at 297.18 172.5239 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 297.18 177.038 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 297.18 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 297.18 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2984401" + (at 297.18 175.26 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CRCW120649R9FKEAC" + (at 297.18 175.26 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "26d18810-6108-4ba6-a174-3088643c4390") + ) + (pin "1" + (uuid "a91e8241-c74f-4b97-9bb7-450d197b8886") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R33") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 281.94 182.88 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e090b4ac-6b94-4572-8e94-70b8cb0f62bc") + (property "Reference" "#PWR049" + (at 281.94 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 279.4 184.15 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 281.94 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 281.94 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "13638495-f493-4250-8b85-4e2cf066ab22") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR049") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 340.36 236.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e1adddd0-69d7-44da-9f6a-69a3098c21b2") + (property "Reference" "C60" + (at 344.17 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uF 50V" + (at 345.44 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 341.3252 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 340.36 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 340.36 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C13585" + (at 340.36 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C106K4PACTU" + (at 340.36 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3656f2ae-41c7-4a03-ba54-1c190adf8d98") + ) + (pin "1" + (uuid "9f7dacaa-f646-49ee-a967-732ec5665a5e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C60") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 314.96 44.45 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e220e02e-32dc-4eb7-8b63-02caa2bfbede") + (property "Reference" "R6" + (at 314.96 39.2897 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5k1" + (at 314.96 41.7139 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 314.96 46.228 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 314.96 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 314.96 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C26033" + (at 314.96 44.45 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ERJ-8ENF5101V" + (at 314.96 44.45 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a91fc436-b5e3-4641-a193-c39f123edc9a") + ) + (pin "1" + (uuid "24dc465c-cacf-4b22-9fc3-8bfb946efa5c") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 78.74 31.75 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e2d8cdab-7303-40ad-b7cb-d50a49fbb54e") + (property "Reference" "#PWR08" + (at 78.74 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 78.74 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 78.74 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 78.74 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 78.74 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c983237c-14ef-4435-abfb-f6e097cde4d7") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR08") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 217.17 243.84 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e3114bbc-e60d-404f-ab31-b66bcd40332f") + (property "Reference" "#PWR059" + (at 217.17 247.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 220.98 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 217.17 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 217.17 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 217.17 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b0160bbf-6289-44a6-bc50-4b4db4490be1") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR059") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 146.05 60.96 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e5320d15-16ac-447e-8ace-a75a472d3276") + (property "Reference" "#PWR098" + (at 146.05 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 146.05 65.0931 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 146.05 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 146.05 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 146.05 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5ffadab5-e282-4ebc-b96f-48963a02f1ba") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR098") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 147.32 209.55 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e7520ce3-ed83-447d-b463-ba3f313f3814") + (property "Reference" "#PWR071" + (at 147.32 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 144.78 210.82 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 147.32 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 147.32 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d9d8aadd-2002-4298-acdb-165798cffa21") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR071") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Interface_Expansion:MCP23017_SO") + (at 76.2 149.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e8d4f36d-250e-4ece-b6eb-55f5f794fcef") + (property "Reference" "U21" + (at 78.3941 122.8557 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "MCP23017_SO" + (at 78.3941 125.2799 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-28W_7.5x17.9mm_P1.27mm" + (at 81.28 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf" + (at 81.28 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "" + (at 76.2 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C47023" + (at 76.2 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "MCP23017-E/SO" + (at 76.2 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "11" + (uuid "36c0ce86-55e2-4fce-8047-c521f48148a2") + ) + (pin "2" + (uuid "c9849b6d-ab68-4d36-a7f8-8c83139c3970") + ) + (pin "20" + (uuid "2a397fe0-a314-4014-bb48-4b64f6594396") + ) + (pin "8" + (uuid "957b96b4-ea38-49ec-af9e-f23fc16a4e1d") + ) + (pin "6" + (uuid "c695b995-66d4-42be-bce6-cda42d744805") + ) + (pin "14" + (uuid "e64bd861-c2e9-49ab-a62b-7ed8c6865219") + ) + (pin "12" + (uuid "816dc487-c785-4797-a333-41badecf26cd") + ) + (pin "10" + (uuid "49de937c-bcba-4c71-a7a1-3846d8d0cf5d") + ) + (pin "23" + (uuid "7136e7db-c8c6-4ee7-a3d9-6a1d97c35a04") + ) + (pin "1" + (uuid "51ccf59f-fc2c-4328-9e0d-3269a07fba28") + ) + (pin "13" + (uuid "73336566-2f3d-4c0e-9fc4-4d5efc37c78f") + ) + (pin "15" + (uuid "37ea89ea-f137-4726-9df7-c3d7ed8ce1d3") + ) + (pin "19" + (uuid "4aeb791e-6bed-473b-a132-9ffce523e07f") + ) + (pin "24" + (uuid "0a3f2461-ae6c-4188-8be4-285822f3b125") + ) + (pin "4" + (uuid "b0c07c42-5032-402a-bf04-b7072f96ae3d") + ) + (pin "25" + (uuid "22834713-daed-46a1-b445-08997bc7d794") + ) + (pin "9" + (uuid "84be2e88-67f6-46ba-9867-e559ccabc87d") + ) + (pin "27" + (uuid "25e4c289-7707-407b-ae57-447b0df56afc") + ) + (pin "26" + (uuid "49112000-fc19-44e6-8edd-12125b005383") + ) + (pin "21" + (uuid "a8b66304-c3e9-41bc-8199-ff02f56ada97") + ) + (pin "7" + (uuid "9343d10a-f6ea-4e03-b2f1-7d872fb36c22") + ) + (pin "22" + (uuid "bba10463-3099-49f3-9373-4f7914799677") + ) + (pin "16" + (uuid "02160482-504d-4d18-b656-fd26cf864631") + ) + (pin "5" + (uuid "6d322584-086c-4e54-9f85-673d81fa417f") + ) + (pin "28" + (uuid "566e1612-1a8d-45e6-94b7-f78b4ddba647") + ) + (pin "17" + (uuid "4117a529-d0f4-423b-971e-d068024f3148") + ) + (pin "18" + (uuid "52ae4bf3-1589-41b3-82ac-b69addb58f0c") + ) + (pin "3" + (uuid "864b0cb2-d86d-4cac-9d26-1a1614ec23b7") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 287.02 80.01 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e95e9a0a-5932-4561-9cdd-6fbf1887961a") + (property "Reference" "C25" + (at 288.036 77.978 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 281.432 82.804 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 286.0548 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 287.02 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 287.02 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 287.02 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 287.02 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2018c1e7-94da-4486-bdf7-b0731dc2eec6") + ) + (pin "1" + (uuid "d7b45827-a9d9-4d6b-bd6c-4ee65bf07dad") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C25") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 281.94 198.12 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ea5ca553-6c2c-40a0-b0c0-f379e0450739") + (property "Reference" "C44" + (at 285.75 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.2uF 50V" + (at 292.1 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 282.9052 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 281.94 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1857" + (at 281.94 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "12065C204KAT4A" + (at 281.94 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "32e1a030-e7f2-4668-867a-3d4a14a346a4") + ) + (pin "1" + (uuid "f8ba71d2-5405-46a2-8a3a-615a17151da0") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C44") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 161.29 220.98 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "eae97adc-08fe-4d87-83d3-d54ca09a3d79") + (property "Reference" "C43" + (at 167.64 219.71 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.1uF 50V" + (at 165.1 217.17 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 157.48 221.9452 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 161.29 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 161.29 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C24497" + (at 161.29 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C104K5RACTU" + (at 161.29 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5878c8d8-593c-4c85-a02b-c0eb0d9b1023") + ) + (pin "1" + (uuid "2a8786af-be99-419d-b070-ad54465f7433") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C43") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 368.3 179.07 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "eb9275c3-76e9-4a1c-bfc2-2b9443afb621") + (property "Reference" "C37" + (at 375.92 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10nF 50V" + (at 379.73 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 369.2652 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 368.3 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 368.3 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1846" + (at 368.3 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C103K5RAC7210" + (at 368.3 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9c1dc0e7-6b9c-48e2-9956-4be1d28b37ec") + ) + (pin "1" + (uuid "b00cdef1-9064-404e-a5c1-520cf77a307e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C37") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:74CBTLV3253PWRE4") + (at 248.92 195.58 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "eb97c7e1-04f6-4fce-9845-c066b45f3620") + (property "Reference" "U4" + (at 251.1141 173.6557 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "74CBTLV3253DR" + (at 240.03 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-16_3.9x9.9mm_P1.27mm" + (at 250.19 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74cbtlv3253.pdf" + (at 248.92 216.535 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 248.92 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C543079" + (at 248.92 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "SN74CBTLV3253DR" + (at 248.92 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "13" + (uuid "2898c71f-936f-4721-b00d-5a7e6fbc41c0") + ) + (pin "8" + (uuid "e03ac9b6-12d2-4682-bbed-e33078d80265") + ) + (pin "5" + (uuid "5d076366-de60-4ab0-8ff0-3ed4e77582e5") + ) + (pin "11" + (uuid "8cbe3e57-4c61-4a2a-87cc-b39b47bf8aa4") + ) + (pin "1" + (uuid "8b3748c3-062a-4468-a4eb-4403f06183d8") + ) + (pin "7" + (uuid "e399d336-63c2-4130-8520-7932527a4f37") + ) + (pin "12" + (uuid "90e9a52b-15cf-43fb-8f12-2bd83cf234de") + ) + (pin "6" + (uuid "8a86d0c7-138d-4794-9823-f46b256d0d95") + ) + (pin "9" + (uuid "61d74313-f2d6-42c2-8f3b-75197fcc0c44") + ) + (pin "3" + (uuid "2816cf9b-fd15-4f0e-9e59-f464e60b7f7d") + ) + (pin "10" + (uuid "c80181c6-d673-4e29-8e46-5d7623260b2f") + ) + (pin "15" + (uuid "df3b861e-2c54-42db-bd50-af9dc8258b24") + ) + (pin "2" + (uuid "08f697e5-49d3-46ff-aeb3-966a81139421") + ) + (pin "14" + (uuid "3c8e9c97-ceeb-4dfd-8bad-ed055c77bb01") + ) + (pin "4" + (uuid "38fbba16-a1f2-4e70-ae68-078cc3e82d57") + ) + (pin "16" + (uuid "9861c74f-f376-4a5d-a35b-60f1a811c1b7") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 326.39 67.31 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ebf208f8-00bd-4934-9a5e-4bf3ff78c0eb") + (property "Reference" "#PWR038" + (at 326.39 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 328.93 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 326.39 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 326.39 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 326.39 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "35f05dd2-7159-4e34-a427-897221199f22") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR038") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 139.7 241.3 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ec34d6d2-9e4f-43c4-8638-a4b3f2ddc7d1") + (property "Reference" "L10" + (at 139.7 245.9496 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1.5uH" + (at 139.7 243.5254 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 139.7 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C395022" + (at 139.7 241.3 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "LQM31PN1R5M00L" + (at 139.7 241.3 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "df57f313-2fd6-4c80-beb4-acb443c25fa2") + ) + (pin "2" + (uuid "8f5f05ef-886a-41b8-87f5-20cfcf73c58a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 137.16 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "ed5dee6c-9f5c-4874-8b38-e5aa9b1a5923") + (property "Reference" "G4" + (at 138.43 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 137.16 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 142.24 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 142.24 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 137.16 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 137.16 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7a6b5e65-5aba-4351-abe6-147c3e91dd22") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "G4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 351.79 198.12 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "eda242cc-c9c2-41f8-b445-a04b2f8b53b7") + (property "Reference" "C46" + (at 346.71 199.39 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2.2nF 50V" + (at 345.44 201.93 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 355.6 199.0852 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 351.79 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 351.79 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C326631" + (at 351.79 198.12 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "GRM3195C1H222JA01D" + (at 351.79 198.12 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "59801cbb-d824-457d-af42-8bb2bf55a0bc") + ) + (pin "1" + (uuid "c20cac89-1784-4c73-89b5-572ca96b305d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C46") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 281.94 215.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ee0119e5-c026-41f4-9528-5781b696a7d1") + (property "Reference" "C50" + (at 285.75 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "0.2uF 50V" + (at 292.1 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 282.9052 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 281.94 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 281.94 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1857" + (at 281.94 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "12065C204KAT4A" + (at 281.94 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cb04f9a7-1d75-4b11-b011-3e096f12b8d5") + ) + (pin "1" + (uuid "f7f01a35-3d54-4208-982a-0e076a1b5e2d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C50") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 243.84 90.17 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "efb7fcf8-8dd8-411a-a759-9534c411e1fc") + (property "Reference" "C15" + (at 242.6279 87.249 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1uF 50V" + (at 245.0521 87.249 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 240.03 91.1352 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 243.84 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1848" + (at 243.84 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CL31B105KBHNNNE" + (at 243.84 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5b436df4-db7b-47ec-a24b-0db776290256") + ) + (pin "1" + (uuid "3f59cc6e-656f-4d2d-acc7-834a38e1bd91") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 139.7 55.88 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "f0a0dbef-e94b-4cbc-979a-04e93ac10be5") + (property "Reference" "G2" + (at 135.89 53.34 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "TestPoint" + (at 142.24 57.15 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 139.7 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "" + (at 139.7 55.88 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9be1fbaa-503f-47e4-9b27-772fd008c9ef") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "G2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 256.54 95.25 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f0bb27c2-3ef0-49c1-bc1d-2dd84178b812") + (property "Reference" "R22" + (at 256.54 100.4103 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "100R" + (at 256.54 97.9861 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 256.54 93.472 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 256.54 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 256.54 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17901" + (at 256.54 95.25 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1000ELF" + (at 256.54 95.25 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3e9f528c-6507-4ee4-ae25-76c90c3a1f6d") + ) + (pin "1" + (uuid "d26bf84b-6e11-4de2-b679-902bcdbb0006") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 336.55 245.11 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f52996e5-a9f3-4c11-bfa2-ec0a4445f9b8") + (property "Reference" "#PWR047" + (at 336.55 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 334.01 246.38 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 336.55 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 336.55 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 336.55 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "11240f50-9976-4e07-b34c-c35f228c48b8") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR047") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 76.2 118.11 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f6f0ac24-69c8-4f8a-87c1-64a68cf3434b") + (property "Reference" "#PWR092" + (at 76.2 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 72.39 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 76.2 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 76.2 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 76.2 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "416117cc-8670-44a1-ad9e-6d8fc1208c28") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR092") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 175.26 208.28 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f72438df-2fb4-4cc4-a953-a9c0de427a4a") + (property "Reference" "#PWR077" + (at 175.26 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 172.72 209.55 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 175.26 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 175.26 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 175.26 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3e8a95d1-1fbd-46b5-9661-20918a3c6f68") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR077") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 347.98 172.72 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f7325f83-a118-458c-8b74-f04390b81633") + (property "Reference" "U6" + (at 347.98 181.9443 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MC33078" + (at 347.98 179.5201 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 347.98 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/MC33078-D.PDF" + (at 347.98 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 347.98 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2057560" + (at 347.98 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "MC33078DR" + (at 347.98 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b08a0fe3-0c2d-49cc-89ed-7b8b972917ad") + ) + (pin "4" + (uuid "044156db-f394-4fe3-8e56-8a68229a60b2") + ) + (pin "7" + (uuid "ddd1dc7f-e48c-4be9-84bb-56f54c65b7fb") + ) + (pin "8" + (uuid "1ddd0488-1a70-4666-b876-c65e3429cb82") + ) + (pin "6" + (uuid "d0f5dd9e-c737-49ff-a5d0-900ccf6ad261") + ) + (pin "5" + (uuid "278f4a99-f32d-487d-9bed-3db9ca5316d9") + ) + (pin "3" + (uuid "f82c28e7-e51f-431d-9d44-61e592fc5612") + ) + (pin "2" + (uuid "7060689d-235c-45e2-8cff-1ab4e5227908") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Amplifier_Operational:MC33078") + (at 332.74 41.91 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f85b7038-4c50-4954-9ad7-81fcfda25615") + (property "Reference" "U107" + (at 332.74 51.1343 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "OPA2209" + (at 332.74 48.7101 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + (at 332.74 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/opa2209.pdf" + (at 332.74 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 332.74 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2057330" + (at 332.74 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "OPA2209AIDR" + (at 332.74 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "cb9d96e0-16e2-4c49-ba9e-6fbc7fecf925") + ) + (pin "6" + (uuid "54ee0ecc-e626-4a25-9e4a-e46b92559c5d") + ) + (pin "3" + (uuid "afdd1e38-2469-483d-a93e-a88cd981d051") + ) + (pin "4" + (uuid "a81a1a81-8f0f-4ad8-a30e-188050bb57b1") + ) + (pin "8" + (uuid "504c6d13-f351-4f9d-8cc7-d29f1899f6a8") + ) + (pin "2" + (uuid "40c07fc5-733e-4598-85f0-5c69fca669fe") + ) + (pin "7" + (uuid "f0ff8adc-5fbe-473e-a802-e38e5f9c3da9") + ) + (pin "1" + (uuid "2ef09dcb-ad12-46f7-a336-f426be899087") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U107") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 143.51 78.74 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f8e67bcb-6681-4f1d-a2c8-4e014a73bc38") + (property "Reference" "L7" + (at 140.208 76.454 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "FB" + (at 143.51 76.5145 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 143.51 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 143.51 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 143.51 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C74486" + (at 143.51 78.74 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "HZ1206E601R-10" + (at 143.51 78.74 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7478e6b6-0396-4496-8b63-42ba057b802d") + ) + (pin "2" + (uuid "f0eb2769-855e-45ba-9947-8c2e8754a7b1") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 130.81 245.11 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f9a93493-5bee-4f13-b780-3cee86d41197") + (property "Reference" "R54" + (at 125.6497 245.11 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "100R" + (at 128.0739 245.11 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 129.032 245.11 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 130.81 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 130.81 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17901" + (at 130.81 245.11 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1000ELF" + (at 130.81 245.11 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "fcf359c3-f695-4025-a0a6-602f467ac739") + ) + (pin "1" + (uuid "7577b93a-4d48-4fe9-b5e5-5fdb7b217c88") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R54") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Transformer:ADT1-1") + (at 55.88 97.79 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fb0e5f9f-ce13-459f-b823-9fcfa432e308") + (property "Reference" "TR1" + (at 55.88 106.9635 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ADT1-1" + (at 55.88 104.5393 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "RF_Mini-Circuits:Mini-Circuits_CD542_H2.84mm" + (at 55.88 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.minicircuits.com/pdfs/ADT1-1+.pdf" + (at 55.88 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 55.88 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C2683432" + (at 55.88 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "ADT1-1+" + (at 55.88 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "d85dcd14-be97-44b5-997a-2611a93605a0") + ) + (pin "1" + (uuid "d67cf125-1f2e-402e-8c83-50868e658df5") + ) + (pin "3" + (uuid "569690e9-d7b3-4439-89e0-48ea1ca44983") + ) + (pin "4" + (uuid "7fadee16-fddc-43c7-9326-2c41c42e919d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TR1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 111.76 101.6 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fb5cfb45-1841-4469-a7a0-95acb8eb967d") + (property "Reference" "#PWR013" + (at 111.76 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 111.76 105.7331 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 111.76 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 111.76 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 111.76 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0d005e7e-280d-46d9-99ce-c986b8e4a06e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR013") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 92.71 125.73 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fb8563d4-92ba-46b3-a5c8-68c2ba5c389d") + (property "Reference" "#PWR091" + (at 92.71 132.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 95.25 127 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 92.71 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 92.71 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 92.71 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "85a57e60-c9d5-44b4-9717-d8008a0c5bd7") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR091") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 210.82 147.32 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fb8a2b38-3fa2-40ec-8405-143bdd3a6b4e") + (property "Reference" "#PWR083" + (at 210.82 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 213.36 148.59 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 210.82 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 210.82 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "13f24da8-0ae0-445c-97a6-84e5dbe7597e") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR083") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 198.12 168.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fbcf09a2-da86-476a-b4c7-49e47e671b0c") + (property "Reference" "#PWR058" + (at 198.12 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 198.12 173.0431 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 198.12 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 198.12 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 198.12 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "521b8392-4bf5-44f5-945e-4a9e7d2c0940") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR058") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 325.12 165.1 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fbf4f2d6-fe27-44b7-8dc3-25021312e655") + (property "Reference" "R29" + (at 325.12 159.9397 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10k 1%" + (at 325.12 162.3639 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 325.12 166.878 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 325.12 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 325.12 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C17902" + (at 325.12 165.1 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CR1206-FX-1002ELF" + (at 325.12 165.1 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c84b25db-5f98-4d3f-9dd5-8910d99df7dd") + ) + (pin "1" + (uuid "c1f2d2b3-4463-47b6-8d89-52acbafa884f") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R29") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 69.85 88.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fc10910d-fc5d-4497-a5af-5ecefa3a0bd6") + (property "Reference" "#PWR04" + (at 69.85 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 69.85 93.0331 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 69.85 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 69.85 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 69.85 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ce197a7b-f925-4753-a849-4ccdca2afd03") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR04") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 322.58 96.52 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fc56e61b-8ffc-4a76-87f1-79dbcde2a221") + (property "Reference" "C19" + (at 319.659 95.3079 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "180pF 50V" + (at 319.659 97.7321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 323.5452 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C527293" + (at 322.58 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C181J5GAC7800" + (at 322.58 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a3f78a81-42aa-4472-9dd2-f3ce73286662") + ) + (pin "1" + (uuid "43b5f722-6dda-4e7c-99c0-9e293867f5f1") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 295.91 234.95 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fcc70075-2049-4608-b1a9-3654f81a7426") + (property "Reference" "#PWR044" + (at 295.91 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 293.37 236.22 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 295.91 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 295.91 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 295.91 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4ea5b934-891f-44cf-b788-8ca9e8b87661") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR044") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 147.32 96.52 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fcc8166c-1f63-45e0-af28-0b4b752370ec") + (property "Reference" "L4" + (at 148.5873 95.3079 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "1.5uH" + (at 148.5873 97.7321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 147.32 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 147.32 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 147.32 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C395022" + (at 147.32 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "LQM31PN1R5M00L" + (at 147.32 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0425dc9a-b762-40dd-9239-d2a85af03b0c") + ) + (pin "2" + (uuid "65156a50-535f-4dba-8121-a5e9fd81bc6a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 243.84 46.99 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fe164ae0-dcca-4349-802d-5ddc25918d2e") + (property "Reference" "C9" + (at 242.6279 49.911 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1uF 50V" + (at 245.0521 49.911 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 240.03 46.0248 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 243.84 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1848" + (at 243.84 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "CL31B105KBHNNNE" + (at 243.84 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "17fdbba6-8724-43ca-9831-fac3eb20924e") + ) + (pin "1" + (uuid "fe38ca9d-1d24-414f-ab84-5d8ff4a2ad06") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 248.92 54.61 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ff464d46-eb32-4f6a-9f52-c013f7a3040e") + (property "Reference" "C10" + (at 251.841 53.3979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10nF 50V" + (at 251.841 55.8221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 247.9548 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 248.92 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 248.92 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "LCSC" "C1846" + (at 248.92 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PN" "C1206C103K5RAC7210" + (at 248.92 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "882a7e0c-1edb-422e-8b90-257176b645b0") + ) + (pin "1" + (uuid "cebbca19-d6a2-4398-9ecb-e19b92776e61") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 185.42 54.61 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ffb553db-6895-4357-8ca7-4cd85176c9d2") + (property "Reference" "#PWR018" + (at 185.42 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 185.42 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 185.42 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 185.42 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 185.42 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ae287de2-22fd-4678-882f-6f8626a4558d") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR018") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 297.18 66.04 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ffd62074-7491-475d-966d-58c9c2b14db3") + (property "Reference" "#PWR030" + (at 297.18 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 297.18 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 297.18 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 297.18 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 297.18 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a1a53a48-1ed6-45aa-9129-55c276e85a3a") + ) + (instances + (project "T41-RF-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR030") + (unit 1) + ) + ) + ) + ) + (sheet_instances + (path "/" + (page "1") + ) + ) + (embedded_fonts no) +) diff --git a/wiki/raw/T41-exciter-filter-board.kicad_sch b/wiki/raw/T41-exciter-filter-board.kicad_sch new file mode 100644 index 0000000..395a770 --- /dev/null +++ b/wiki/raw/T41-exciter-filter-board.kicad_sch @@ -0,0 +1,39127 @@ +(kicad_sch + (version 20231120) + (generator "eeschema") + (generator_version "8.0") + (uuid "56a77fe5-f7a5-414c-a0f7-d659071572ee") + (paper "A3") + (title_block + (title "T41 Exciter Filter Board") + (date "2024-08-25") + (rev "V 012.06") + (comment 1 " KiCad version by Oliver King KI3P") + (comment 2 "By Al Peter AC8GY & Bill Schmidt K9HZ") + ) + (lib_symbols + (symbol "74xGxx:74LVC1G04" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 0 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "74LVC1G04" + (at 5.08 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Single NOT Gate, Low-Voltage CMOS" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Single Gate NOT LVC CMOS" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOT?23* Texas?R-PDSO-G5?DCK* Texas?R-PDSO-N5?DRL* Texas?X2SON*0.8x0.8mm*P0.48mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "74LVC1G04_0_1" + (polyline + (pts + (xy -7.62 6.35) (xy -7.62 -6.35) (xy 5.08 0) (xy -7.62 6.35) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "74LVC1G04_1_1" + (pin input line + (at -15.24 0 0) + (length 7.62) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -5.08 -10.16 90) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output inverted + (at 12.7 0 180) + (length 7.62) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -5.08 10.16 270) + (length 5.08) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector:Conn_Coaxial" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0.254 3.048 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_Coaxial" + (at 2.921 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "coaxial connector (BNC, SMA, SMB, SMC, Cinch/RCA, LEMO, ...)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "BNC SMA SMB SMC LEMO coaxial connector CINCH RCA MCX MMCX U.FL UMRF" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "*BNC* *SMA* *SMB* *SMC* *Cinch* *LEMO* *UMRF* *MCX* *U.FL*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_Coaxial_0_1" + (arc + (start -1.778 -0.508) + (mid 0.2311 -1.8066) + (end 1.778 0) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.54 0) (xy -0.508 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -2.54) (xy 0 -1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 0) + (radius 0.508) + (stroke + (width 0.2032) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 1.778 0) + (mid 0.2099 1.8101) + (end -1.778 0.508) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Conn_Coaxial_1_1" + (pin passive line + (at -5.08 0 0) + (length 2.54) + (name "In" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -5.08 90) + (length 2.54) + (name "Ext" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector:Screw_Terminal_01x02" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Screw_Terminal_01x02" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic screw terminal, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "screw terminal" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TerminalBlock*:*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Screw_Terminal_01x02_1_1" + (rectangle + (start -1.27 1.27) + (end 1.27 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (circle + (center 0 -2.54) + (radius 0.635) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.5334 -2.2098) (xy 0.3302 -3.048) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.5334 0.3302) (xy 0.3302 -0.508) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.3556 -2.032) (xy 0.508 -2.8702) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.3556 0.508) (xy 0.508 -0.3302) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 0) + (radius 0.635) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector:TestPoint" + (pin_numbers hide) + (pin_names + (offset 0.762) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "TP" + (at 0 6.858 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "TestPoint" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "test point" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "test point tp" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Pin* Test*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "TestPoint_0_1" + (circle + (center 0 3.302) + (radius 0.762) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "TestPoint_1_1" + (pin passive line + (at 0 0 90) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:C" + (pin_numbers hide) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "C_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_0_1" + (polyline + (pts + (xy -2.032 -0.762) (xy 2.032 -0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.032 0.762) (xy 2.032 0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "C_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:C_Polarized" + (pin_numbers hide) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Polarized" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Polarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "CP_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_Polarized_0_1" + (rectangle + (start -2.286 0.508) + (end 2.286 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.778 2.286) (xy -0.762 2.286) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 2.794) (xy -1.27 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 2.286 -0.508) + (end -2.286 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "C_Polarized_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:D_Zener" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D_Zener" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Zener diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO-???* *_Diode_* *SingleDiode* D_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "D_Zener_0_1" + (polyline + (pts + (xy 1.27 0) (xy -1.27 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -1.27) (xy -1.27 1.27) (xy -0.762 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 -1.27) (xy 1.27 1.27) (xy -1.27 0) (xy 1.27 -1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "D_Zener_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "K" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:L" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "L" + (at -1.27 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "L" + (at 1.905 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Inductor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "inductor choke coil reactor magnetic" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Choke_* *Coil* Inductor_* L_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "L_0_1" + (arc + (start 0 -2.54) + (mid 0.6323 -1.905) + (end 0 -1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -1.27) + (mid 0.6323 -0.635) + (end 0 0) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 0) + (mid 0.6323 0.635) + (end 0 1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 1.27) + (mid 0.6323 1.905) + (end 0 2.54) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "L_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:R" + (pin_numbers hide) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "R" + (at 2.032 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "R" + (at 0 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -1.778 0 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "R res resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "R_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "R_0_1" + (rectangle + (start -1.016 -2.54) + (end 1.016 2.54) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "R_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Interface_Expansion:MCP23017_SO" + (pin_names + (offset 1.016) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -11.43 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MCP23017_SO" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:SOIC-28W_7.5x17.9mm_P1.27mm" + (at 5.08 -25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf" + (at 5.08 -27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "16-bit I/O expander, I2C, interrupts, w pull-ups, SOIC-28" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "I2C parallel port expander" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC*7.5x17.9mm*P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MCP23017_SO_0_1" + (rectangle + (start -12.7 22.86) + (end 12.7 -22.86) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "MCP23017_SO_1_1" + (pin bidirectional line + (at 17.78 20.32 180) + (length 5.08) + (name "GPB0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -27.94 90) + (length 5.08) + (name "VSS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin no_connect line + (at -12.7 15.24 0) + (length 5.08) hide + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 17.78 0) + (length 5.08) + (name "SCK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 20.32 0) + (length 5.08) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin no_connect line + (at -12.7 12.7 0) + (length 5.08) hide + (name "NC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -20.32 0) + (length 5.08) + (name "A0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -17.78 0) + (length 5.08) + (name "A1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -15.24 0) + (length 5.08) + (name "A2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -17.78 -2.54 0) + (length 5.08) + (name "~{RESET}" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin tri_state line + (at -17.78 5.08 0) + (length 5.08) + (name "INTB" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 17.78 180) + (length 5.08) + (name "GPB1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin tri_state line + (at -17.78 2.54 0) + (length 5.08) + (name "INTA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -2.54 180) + (length 5.08) + (name "GPA0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "21" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -5.08 180) + (length 5.08) + (name "GPA1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "22" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -7.62 180) + (length 5.08) + (name "GPA2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "23" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -10.16 180) + (length 5.08) + (name "GPA3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "24" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -12.7 180) + (length 5.08) + (name "GPA4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "25" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -15.24 180) + (length 5.08) + (name "GPA5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "26" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -17.78 180) + (length 5.08) + (name "GPA6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "27" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -20.32 180) + (length 5.08) + (name "GPA7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "28" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 15.24 180) + (length 5.08) + (name "GPB2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 12.7 180) + (length 5.08) + (name "GPB3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 10.16 180) + (length 5.08) + (name "GPB4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 7.62 180) + (length 5.08) + (name "GPB5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 5.08 180) + (length 5.08) + (name "GPB6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 2.54 180) + (length 5.08) + (name "GPB7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 27.94 270) + (length 5.08) + (name "VDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Jumper:SolderJumper_2_Open" + (pin_names + (offset 0) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "JP" + (at 0 2.032 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Solder Jumper, 2-pole, open" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "solder jumper SPST" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SolderJumper*Open*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "SolderJumper_2_Open_0_1" + (arc + (start -0.254 1.016) + (mid -1.2656 0) + (end -0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -0.254 1.016) + (mid -1.2656 0) + (end -0.254 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy -0.254 1.016) (xy -0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.254 1.016) (xy 0.254 -1.016) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0.254 -1.016) + (mid 1.2656 0) + (end 0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0.254 -1.016) + (mid 1.2656 0) + (end 0.254 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "SolderJumper_2_Open_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Mechanical:MountingHole_Pad" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "H" + (at 0 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MountingHole_Pad" + (at 0 4.445 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Mounting Hole with connection" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "mounting hole" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "MountingHole*Pad*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MountingHole_Pad_0_1" + (circle + (center 0 1.27) + (radius 1.27) + (stroke + (width 1.27) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "MountingHole_Pad_1_1" + (pin input line + (at 0 -2.54 90) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "RF_Switch:MASWSS0179" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -7.62 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 3.81 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_SMD:SOT-23-6" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Macom GaAs RF SPDT switch, DC-2GHz, 0.6/22dB loss/isolation, SOT-26 (SOT-23-6)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "RF SWITCH SPDT" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOT?23*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MASWSS0179_0_1" + (circle + (center -3.048 2.54) + (radius 0.2794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.175 -3.81) (xy -2.54 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.794 2.54) (xy 2.921 5.207) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.905 -3.81) (xy -1.27 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -0.635 -3.81) (xy 0 -3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -3.175) (xy 0 -2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -1.905) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -0.635) (xy 0 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0.635) (xy 0 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 1.905) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 3.175) (xy 0 3.81) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 3.048 0) + (radius 0.2794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 3.175 5.207) + (radius 0.2794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 7.62 -7.62) + (end -7.62 6.35) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "MASWSS0179_1_1" + (pin passive line + (at 10.16 5.08 180) + (length 2.54) + (name "RF1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 2.54 -10.16 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 10.16 0 180) + (length 2.54) + (name "RF2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -5.08 0) + (length 2.54) + (name "V2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -10.16 2.54 0) + (length 2.54) + (name "RFC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -2.54 0) + (length 2.54) + (name "V1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Regulator_Linear:LM1117T-3.3" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM1117T-3.3" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Horizontal_TabDown" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm1117.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "800mA Low-Dropout Linear Regulator, 3.3V fixed output, TO-220" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "linear regulator ldo fixed positive" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?220*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LM1117T-3.3_0_1" + (rectangle + (start -5.08 -5.08) + (end 5.08 1.905) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "LM1117T-3.3_1_1" + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "VI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "T41_Library:IDC_2x5" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 1.27 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "IDC_2x5" + (at 1.27 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, double row, 02x05, top/bottom pin numbering scheme (row 1: 1...pins_per_row, row2: pins_per_row+1 ... num_pins), script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_2x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "IDC_2x5_1_1" + (rectangle + (start -1.27 -4.953) + (end 0 -5.207) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -2.413) + (end 0 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 1.27) + (end 0 -1.27) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 2.667) + (end 0 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 5.207) + (end 0 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 6.35) + (end 3.81 -6.35) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (rectangle + (start 3.81 -4.953) + (end 2.54 -5.207) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 -2.413) + (end 2.54 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 0.127) + (end 2.54 -0.127) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 2.667) + (end 2.54 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 5.207) + (end 2.54 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 -5.08 180) + (length 3.81) + (name "Pin_10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 5.08 180) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 2.54 180) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 0 180) + (length 3.81) + (name "Pin_6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 -2.54 180) + (length 3.81) + (name "Pin_8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:+12V" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+12V\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+12V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+12V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) hide + (name "+12V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:+3V3" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3V3\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+3V3_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+3V3_1_1" + (pin power_in line + (at 0 0 90) + (length 0) hide + (name "+3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:GND" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "GND_1_1" + (pin power_in line + (at 0 0 270) + (length 0) hide + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + ) + (junction + (at 303.53 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "00d05ef0-cb67-4559-95cf-7470ffc98ea9") + ) + (junction + (at 358.14 101.6) + (diameter 0) + (color 0 0 0 0) + (uuid "01117c16-a013-4465-8539-88db9006c36c") + ) + (junction + (at 158.75 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "018de083-f4a8-42d8-929e-a623ed69b2b3") + ) + (junction + (at 128.27 204.47) + (diameter 0) + (color 0 0 0 0) + (uuid "025d1833-27ee-4486-82ac-af2fe3022921") + ) + (junction + (at 109.22 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "03508898-e767-4d4a-808c-b068bb68bb66") + ) + (junction + (at 104.14 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "044a10e5-b277-43ef-a454-c6676279696f") + ) + (junction + (at 153.67 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "04c975fb-a948-4ce2-bed9-899dff469848") + ) + (junction + (at 158.75 170.18) + (diameter 0) + (color 0 0 0 0) + (uuid "054d5eab-3e72-4f1b-8042-b8c9b01f603f") + ) + (junction + (at 158.75 105.41) + (diameter 0) + (color 0 0 0 0) + (uuid "069968cb-0db4-4474-8c5e-1cc7b934b17c") + ) + (junction + (at 344.17 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "079e94a4-2fe5-4397-aff3-dbfe14e04f51") + ) + (junction + (at 212.09 146.05) + (diameter 0) + (color 0 0 0 0) + (uuid "0835c126-447c-4e20-82e6-299e10fd69ee") + ) + (junction + (at 109.22 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "09ad834e-a214-4759-985a-03e14455401a") + ) + (junction + (at 107.95 138.43) + (diameter 0) + (color 0 0 0 0) + (uuid "0a8a65ff-b26e-47c7-bd44-fc4655003a4b") + ) + (junction + (at 133.35 104.14) + (diameter 0) + (color 0 0 0 0) + (uuid "0aab87d1-53a9-425a-903f-76b632e3773b") + ) + (junction + (at 358.14 71.12) + (diameter 0) + (color 0 0 0 0) + (uuid "0b30293a-5db1-4ed4-964f-3c390a67fcde") + ) + (junction + (at 104.14 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "0cd57385-bef5-4859-9ac4-c3817818b9e6") + ) + (junction + (at 332.74 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "1282bde1-d3a7-4d46-91cc-a8014a5763d7") + ) + (junction + (at 128.27 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "13b8c03d-d458-435d-a641-b03c0ad6008f") + ) + (junction + (at 120.65 204.47) + (diameter 0) + (color 0 0 0 0) + (uuid "1565eb05-23d8-4b1e-950f-adc0d688a798") + ) + (junction + (at 109.22 35.56) + (diameter 0) + (color 0 0 0 0) + (uuid "16e67029-8c41-46f0-8e5a-8da508cd4532") + ) + (junction + (at 107.95 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "1707b8f2-23d8-4ae7-9632-c41f671f318f") + ) + (junction + (at 303.53 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "1a0f0d12-09c0-4b75-b259-356d823a393a") + ) + (junction + (at 144.78 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "1af51435-87bb-4b3e-ae5f-71010c772ca1") + ) + (junction + (at 222.25 262.89) + (diameter 0) + (color 0 0 0 0) + (uuid "1b8a4b1a-6ae3-460e-97bd-8b199ba66300") + ) + (junction + (at 109.22 170.18) + (diameter 0) + (color 0 0 0 0) + (uuid "1d6a844a-0c69-452f-a66f-7258edb93341") + ) + (junction + (at 308.61 43.18) + (diameter 0) + (color 0 0 0 0) + (uuid "1e6ebeeb-2d85-4380-bd9f-8fb3ba3719b8") + ) + (junction + (at 120.65 105.41) + (diameter 0) + (color 0 0 0 0) + (uuid "1f4df4f0-b5b6-4cca-808d-bdac4afb0e89") + ) + (junction + (at 300.99 215.9) + (diameter 0) + (color 0 0 0 0) + (uuid "22255dbb-9e6e-474c-8ff4-d32ed1c63a37") + ) + (junction + (at 133.35 138.43) + (diameter 0) + (color 0 0 0 0) + (uuid "2228a16c-ac22-48b8-9118-49889ebe824b") + ) + (junction + (at 331.47 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "22b6e045-369d-4f6d-996b-2a195e930478") + ) + (junction + (at 212.09 187.96) + (diameter 0) + (color 0 0 0 0) + (uuid "232d6999-a7eb-4459-99a0-55240cb73301") + ) + (junction + (at 158.75 195.58) + (diameter 0) + (color 0 0 0 0) + (uuid "23babaea-dfff-4036-ae14-29c4f0481ed4") + ) + (junction + (at 153.67 138.43) + (diameter 0) + (color 0 0 0 0) + (uuid "2450c44b-4f62-414c-bdb5-87b69926d398") + ) + (junction + (at 104.14 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "24cc05a4-3894-488a-ad40-2b9947098829") + ) + (junction + (at 308.61 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "25a67cdb-0f21-4f0a-b51a-d294629e248a") + ) + (junction + (at 133.35 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "25b69280-859a-4f51-856c-a0e38fb6d0f1") + ) + (junction + (at 327.66 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "25d192af-f199-40d5-9268-1d1f9c443999") + ) + (junction + (at 387.35 245.11) + (diameter 0) + (color 0 0 0 0) + (uuid "26632dd1-cd1e-44c3-a43b-1cd56c248855") + ) + (junction + (at 158.75 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "26a27677-b9b2-4db6-8303-3fb8de26b668") + ) + (junction + (at 109.22 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "26dff520-6965-49ec-add8-9a2a36821d0d") + ) + (junction + (at 109.22 138.43) + (diameter 0) + (color 0 0 0 0) + (uuid "28f26be7-1f89-416a-840b-02a4e505c47b") + ) + (junction + (at 320.04 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "299f09d3-0601-4062-b86f-07610263d790") + ) + (junction + (at 109.22 190.5) + (diameter 0) + (color 0 0 0 0) + (uuid "2a77886a-5761-405a-8f6e-e035da2df6e7") + ) + (junction + (at 133.35 129.54) + (diameter 0) + (color 0 0 0 0) + (uuid "2ace26d2-0b72-4eba-a47b-fc83e355ab74") + ) + (junction + (at 158.75 157.48) + (diameter 0) + (color 0 0 0 0) + (uuid "2d58672c-916c-4fa5-942f-d1fcf30b13fa") + ) + (junction + (at 300.99 224.79) + (diameter 0) + (color 0 0 0 0) + (uuid "2dd21ee4-7818-4226-924a-4aa3cec828e2") + ) + (junction + (at 120.65 224.79) + (diameter 0) + (color 0 0 0 0) + (uuid "2e0c8336-3a1f-4583-b598-28bbc4440ae0") + ) + (junction + (at 353.06 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "2e5b7e5e-2f5e-4e15-8f42-e56605306ccb") + ) + (junction + (at 327.66 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "2f10abbd-3f8b-42d3-83e3-c79b6866841d") + ) + (junction + (at 53.34 222.25) + (diameter 0) + (color 0 0 0 0) + (uuid "30777071-4827-4e57-99d0-bafd956e798e") + ) + (junction + (at 104.14 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "31aaa9d8-736e-4376-8915-dc2e4112478f") + ) + (junction + (at 120.65 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "3359c847-6ff6-48b4-b7b5-f6b79481a04c") + ) + (junction + (at 353.06 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "33bbf278-015f-4ee7-ac17-322edefbc4a9") + ) + (junction + (at 212.09 154.94) + (diameter 0) + (color 0 0 0 0) + (uuid "34c0bdc4-1bd8-44de-a793-9a55a6b96743") + ) + (junction + (at 327.66 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "357d65d9-a952-4774-bf1c-b7dff9401ccf") + ) + (junction + (at 128.27 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "357f09d8-ac8d-4c84-b709-1588d6824469") + ) + (junction + (at 157.48 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "35892413-4448-4e1a-b088-a7fa660833a6") + ) + (junction + (at 358.14 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "35fdbdd1-8e16-4bfe-99a0-9e51dfe21105") + ) + (junction + (at 153.67 190.5) + (diameter 0) + (color 0 0 0 0) + (uuid "3810d3cb-106c-44a5-afcf-4a71fe572b8e") + ) + (junction + (at 332.74 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "381c6cac-256b-472b-aec2-72e4aa16eba1") + ) + (junction + (at 133.35 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "3890840c-5f93-42fa-8242-5f41f18b18ee") + ) + (junction + (at 326.39 165.1) + (diameter 0) + (color 0 0 0 0) + (uuid "398a6bf2-a15f-4ec4-bb55-4755e99c4142") + ) + (junction + (at 144.78 190.5) + (diameter 0) + (color 0 0 0 0) + (uuid "3bb1a145-a78b-418d-b4da-259db62df470") + ) + (junction + (at 167.64 224.79) + (diameter 0) + (color 0 0 0 0) + (uuid "3bf3075b-931c-40a9-b915-9548c8761d52") + ) + (junction + (at 326.39 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "3c9d1b5a-028c-4576-a3a2-238c10204ca6") + ) + (junction + (at 365.76 182.88) + (diameter 0) + (color 0 0 0 0) + (uuid "3d1db416-7496-4ba9-bbe2-354a8b6e724e") + ) + (junction + (at 152.4 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "3f5376b3-ec26-448b-bec2-56f5fef931ad") + ) + (junction + (at 119.38 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "4114e235-2017-448c-9b7c-238e1145e7e0") + ) + (junction + (at 279.4 262.89) + (diameter 0) + (color 0 0 0 0) + (uuid "41b004d8-fb5f-4b9d-ab47-4fe3aae60da5") + ) + (junction + (at 109.22 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "41c1f889-7877-4970-9b43-0ccade240836") + ) + (junction + (at 290.83 210.82) + (diameter 0) + (color 0 0 0 0) + (uuid "43c6fee4-9d66-4d22-a7db-c77295591116") + ) + (junction + (at 365.76 200.66) + (diameter 0) + (color 0 0 0 0) + (uuid "440acbc9-2def-4e0c-b37b-d81223e8a6f3") + ) + (junction + (at 109.22 104.14) + (diameter 0) + (color 0 0 0 0) + (uuid "4454e311-d0aa-424b-a682-7fcabe1eeda2") + ) + (junction + (at 109.22 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "44c2cdde-8d69-483e-8c7d-5fbe891789fb") + ) + (junction + (at 133.35 96.52) + (diameter 0) + (color 0 0 0 0) + (uuid "4937232a-b66d-42e4-915f-b93d3e966f3c") + ) + (junction + (at 53.34 187.96) + (diameter 0) + (color 0 0 0 0) + (uuid "4cb94db8-9fba-46af-9cfc-6234cd610639") + ) + (junction + (at 158.75 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "4cb9ffa3-b6fd-42fb-adac-c0192a3fb9a5") + ) + (junction + (at 132.08 138.43) + (diameter 0) + (color 0 0 0 0) + (uuid "4d9ef20b-ba9c-45ce-9cbb-947dd012a071") + ) + (junction + (at 295.91 201.93) + (diameter 0) + (color 0 0 0 0) + (uuid "4f266234-11ae-4a4f-b8fb-e0091d3bba2e") + ) + (junction + (at 320.04 43.18) + (diameter 0) + (color 0 0 0 0) + (uuid "50eb3d73-4155-40ba-8557-275532144fba") + ) + (junction + (at 267.97 270.51) + (diameter 0) + (color 0 0 0 0) + (uuid "52183d78-0b18-405f-b274-9ef2a19cfe76") + ) + (junction + (at 119.38 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "521ec85d-7f56-498f-8797-6db7f0ca776c") + ) + (junction + (at 212.09 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "526d3516-dda7-4f29-a2cd-5081b93152e2") + ) + (junction + (at 152.4 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "534518b1-aecd-4896-b63e-d9bffce104d3") + ) + (junction + (at 104.14 157.48) + (diameter 0) + (color 0 0 0 0) + (uuid "538941c0-82a0-4c5e-b5d3-4b4af06ef764") + ) + (junction + (at 303.53 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "5394fa7d-bd68-45a0-a236-a3b6218c6a32") + ) + (junction + (at 318.77 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "554db381-68ca-4afa-8706-a7d6b9941887") + ) + (junction + (at 358.14 43.18) + (diameter 0) + (color 0 0 0 0) + (uuid "5b5f2da2-6ba8-47c5-9b61-d77bbb701c0e") + ) + (junction + (at 153.67 157.48) + (diameter 0) + (color 0 0 0 0) + (uuid "5c122f5f-516e-4c55-8565-ea0f7e454c87") + ) + (junction + (at 157.48 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "5d483bdd-c7a0-4938-ad89-1c99df052e14") + ) + (junction + (at 104.14 204.47) + (diameter 0) + (color 0 0 0 0) + (uuid "5d55c780-6fc5-46ee-8e12-15a1d1e4131e") + ) + (junction + (at 308.61 34.29) + (diameter 0) + (color 0 0 0 0) + (uuid "5dbc5335-41c2-41f9-bc0b-8053babfcbe5") + ) + (junction + (at 107.95 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "5f03da33-40a1-42ae-9028-d80b74e0c814") + ) + (junction + (at 104.14 105.41) + (diameter 0) + (color 0 0 0 0) + (uuid "5f978c45-0e91-4c79-ad2d-ee0bbe9d52b4") + ) + (junction + (at 119.38 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "5f99155c-83dc-4718-b230-f70268c908c8") + ) + (junction + (at 358.14 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "60a135e0-65b4-4e8a-99ce-948b8f6acccb") + ) + (junction + (at 260.35 262.89) + (diameter 0) + (color 0 0 0 0) + (uuid "610758c8-52f2-4c9c-8125-3e7637859752") + ) + (junction + (at 356.87 43.18) + (diameter 0) + (color 0 0 0 0) + (uuid "617e99b8-cd76-4994-9d18-56d2be458184") + ) + (junction + (at 128.27 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "61c71038-83e2-4d3f-8dbc-95f7a61b7693") + ) + (junction + (at 133.35 157.48) + (diameter 0) + (color 0 0 0 0) + (uuid "61e89f1f-c2f5-49c7-969a-9a733bf47c90") + ) + (junction + (at 153.67 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "63febd10-a67b-4123-9755-d20d299930a4") + ) + (junction + (at 53.34 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "64d3ee84-c0e5-46bd-8b22-5f780c0fa2c3") + ) + (junction + (at 109.22 96.52) + (diameter 0) + (color 0 0 0 0) + (uuid "675899e3-5d24-4461-98e2-b296f93a42bc") + ) + (junction + (at 158.75 162.56) + (diameter 0) + (color 0 0 0 0) + (uuid "683a07dd-2208-4329-b253-91949af2a02f") + ) + (junction + (at 53.34 27.94) + (diameter 0) + (color 0 0 0 0) + (uuid "6890cf8d-c8a9-4c76-9bcf-9c1bdf06cb69") + ) + (junction + (at 327.66 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "68a96d77-328a-4477-8806-76f5f26cc073") + ) + (junction + (at 158.75 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "68d0bc25-c897-4823-a040-c713aace6849") + ) + (junction + (at 331.47 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "692120ed-6c37-4558-b75e-afaf58bb6982") + ) + (junction + (at 133.35 162.56) + (diameter 0) + (color 0 0 0 0) + (uuid "6a782233-a498-4356-b524-cbea5b81537c") + ) + (junction + (at 128.27 138.43) + (diameter 0) + (color 0 0 0 0) + (uuid "6ac0dfe9-9413-4931-bab9-6c1a6505a700") + ) + (junction + (at 127 157.48) + (diameter 0) + (color 0 0 0 0) + (uuid "6cc45090-0c65-4783-b683-ce03025678fa") + ) + (junction + (at 290.83 201.93) + (diameter 0) + (color 0 0 0 0) + (uuid "6d193e36-1d76-44d8-be3b-f2c17f719d79") + ) + (junction + (at 308.61 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "6df6a760-dbcf-4721-a90c-d20811ee23e6") + ) + (junction + (at 232.41 270.51) + (diameter 0) + (color 0 0 0 0) + (uuid "6f486ac5-2ae9-420f-9367-7f3fb562cc43") + ) + (junction + (at 358.14 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "6fb26177-725f-42f0-83f6-c818e439ff2b") + ) + (junction + (at 358.14 34.29) + (diameter 0) + (color 0 0 0 0) + (uuid "6ff8031e-8636-4ecb-b485-eef544e5217c") + ) + (junction + (at 119.38 190.5) + (diameter 0) + (color 0 0 0 0) + (uuid "7377f9bf-f399-4486-88f1-2df18e51bdc2") + ) + (junction + (at 128.27 105.41) + (diameter 0) + (color 0 0 0 0) + (uuid "74946cc1-5be9-47cb-94ea-e9721669d3fd") + ) + (junction + (at 318.77 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "759fecff-1ae5-4cb8-8fda-346c533b4fdd") + ) + (junction + (at 167.64 252.73) + (diameter 0) + (color 0 0 0 0) + (uuid "7735cfca-619c-4ce6-84c7-bcb274171a36") + ) + (junction + (at 351.79 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "78a846b0-1ebf-4d81-bfa5-40eed6aa183a") + ) + (junction + (at 327.66 43.18) + (diameter 0) + (color 0 0 0 0) + (uuid "78d5d787-6a9b-4952-93a1-8b24a3a15631") + ) + (junction + (at 326.39 224.79) + (diameter 0) + (color 0 0 0 0) + (uuid "7943068d-7b23-4265-822b-900ce74a7d96") + ) + (junction + (at 158.75 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "7c45f38d-0ae6-4c1d-b4b8-fcca62b9e87a") + ) + (junction + (at 127 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "7cca1d75-e911-4c79-85f5-a691c068b259") + ) + (junction + (at 153.67 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "7d4452d5-1abc-4424-925a-154e4ae607ae") + ) + (junction + (at 327.66 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "805fc43b-6edc-40b3-87bf-2ba03ce1c13e") + ) + (junction + (at 157.48 138.43) + (diameter 0) + (color 0 0 0 0) + (uuid "822ee75d-de37-4a4e-a561-37a0d8aefe58") + ) + (junction + (at 158.75 96.52) + (diameter 0) + (color 0 0 0 0) + (uuid "8280e895-19ea-4d3c-b90d-f0ab700aec37") + ) + (junction + (at 307.34 43.18) + (diameter 0) + (color 0 0 0 0) + (uuid "82ef6d3a-dfd8-435f-9f8c-9b0f12bb7993") + ) + (junction + (at 104.14 190.5) + (diameter 0) + (color 0 0 0 0) + (uuid "836883d3-9b99-400a-b3c0-aeb2598478ce") + ) + (junction + (at 353.06 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "84f2326a-59c7-46a6-8bbc-2f7ab081936e") + ) + (junction + (at 109.22 129.54) + (diameter 0) + (color 0 0 0 0) + (uuid "851863a6-d633-4709-84d9-1b3bac7bb88f") + ) + (junction + (at 127 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "8550ede8-0b91-4f66-a37c-bebe3efc798d") + ) + (junction + (at 144.78 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "86d4ed27-12ec-4a64-afd9-3ff5c90a0ecb") + ) + (junction + (at 133.35 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "87290cdf-1efa-47c7-9b8d-fb8bb65cdef1") + ) + (junction + (at 133.35 170.18) + (diameter 0) + (color 0 0 0 0) + (uuid "87f2c592-d14f-4783-b0a4-6afe5faf8745") + ) + (junction + (at 326.39 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "89d1871e-4b18-4b55-b307-05078abd22ab") + ) + (junction + (at 133.35 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "8a880895-d727-4876-8c08-15d573c4c2ac") + ) + (junction + (at 133.35 35.56) + (diameter 0) + (color 0 0 0 0) + (uuid "8bfc2655-f26c-4a00-b740-be15f732c276") + ) + (junction + (at 133.35 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "8c8dd2df-414e-4173-b810-0f840904b559") + ) + (junction + (at 133.35 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "8d077ce6-6a85-4a87-9ed9-75c0082128d3") + ) + (junction + (at 128.27 190.5) + (diameter 0) + (color 0 0 0 0) + (uuid "8f65b8fd-64a2-4606-8373-7247756007d6") + ) + (junction + (at 158.75 129.54) + (diameter 0) + (color 0 0 0 0) + (uuid "907abaea-725c-45b2-bd81-2cede36ec1ba") + ) + (junction + (at 53.34 234.95) + (diameter 0) + (color 0 0 0 0) + (uuid "91c4e8d3-3e6f-4909-8b87-0cf6156e29e8") + ) + (junction + (at 308.61 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "925acb37-1968-444f-aaf3-44b5670567b3") + ) + (junction + (at 128.27 157.48) + (diameter 0) + (color 0 0 0 0) + (uuid "9464d12d-34ae-4d28-a6da-3a9a485f0c91") + ) + (junction + (at 326.39 162.56) + (diameter 0) + (color 0 0 0 0) + (uuid "9507364a-a8f3-447f-9885-ec77503b7fec") + ) + (junction + (at 128.27 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "956c01b5-963c-4b79-bfd8-910b2d017750") + ) + (junction + (at 53.34 121.92) + (diameter 0) + (color 0 0 0 0) + (uuid "96f181b8-702d-46ab-be35-52dee08d92ca") + ) + (junction + (at 133.35 203.2) + (diameter 0) + (color 0 0 0 0) + (uuid "97788d21-89e3-4cab-9e5b-15cf1c4760ce") + ) + (junction + (at 152.4 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "97899fdd-d42d-4b21-bca1-567c30322d9e") + ) + (junction + (at 326.39 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "9884be48-3c17-4e37-af11-2fde5f66afbb") + ) + (junction + (at 144.78 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "98dea15f-be69-4fc2-a5ac-5f942632c144") + ) + (junction + (at 351.79 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "994b4ff6-73cb-46bf-aa76-2e1be205a72c") + ) + (junction + (at 303.53 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "9d36ce55-ddd7-41b7-ab3a-dd0ee946e479") + ) + (junction + (at 133.35 204.47) + (diameter 0) + (color 0 0 0 0) + (uuid "a0fcf7aa-a661-4580-8630-2084b04c5946") + ) + (junction + (at 153.67 105.41) + (diameter 0) + (color 0 0 0 0) + (uuid "a1fa254d-444a-43a9-bd96-04a2b749c44e") + ) + (junction + (at 255.27 26.67) + (diameter 0) + (color 0 0 0 0) + (uuid "a245e728-69e9-40ee-b44b-ba6ff286ddb8") + ) + (junction + (at 250.19 270.51) + (diameter 0) + (color 0 0 0 0) + (uuid "a3aa5de2-d96b-4789-a32e-1068a5e129cd") + ) + (junction + (at 105.41 224.79) + (diameter 0) + (color 0 0 0 0) + (uuid "a3f1e140-385c-4833-a1d0-67c6b9e7e5e1") + ) + (junction + (at 53.34 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "a489f4ca-6ded-4ef0-b7fc-ecf352b82164") + ) + (junction + (at 297.18 162.56) + (diameter 0) + (color 0 0 0 0) + (uuid "a5a091fa-6819-4cfe-b72d-daa237fdf693") + ) + (junction + (at 353.06 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "aaf9c6f3-7967-4522-b4e3-ed57218246b2") + ) + (junction + (at 158.75 204.47) + (diameter 0) + (color 0 0 0 0) + (uuid "abc03691-9cd5-4671-af16-c031d407820a") + ) + (junction + (at 104.14 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "ac47b4b5-699e-42a8-a498-c0a9ac2e664e") + ) + (junction + (at 344.17 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "ad40fcb4-1b81-4bfd-a06a-75156758c7c5") + ) + (junction + (at 153.67 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "adb2d3ff-4355-40d6-9f20-09c01b814e0e") + ) + (junction + (at 144.78 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "add0b94d-509b-48b1-a17b-9c26b3ffaa75") + ) + (junction + (at 109.22 204.47) + (diameter 0) + (color 0 0 0 0) + (uuid "ae2bf112-722b-49e4-a605-970c35e5add8") + ) + (junction + (at 152.4 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "afc89ea9-5cc2-42e2-8270-2ac623eae72d") + ) + (junction + (at 109.22 203.2) + (diameter 0) + (color 0 0 0 0) + (uuid "b0792f84-503d-4f14-9f7e-f295247b0c1a") + ) + (junction + (at 308.61 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "b08badc0-cd83-4c7d-8a91-6c09fd35c613") + ) + (junction + (at 302.26 162.56) + (diameter 0) + (color 0 0 0 0) + (uuid "b0e43ae0-40d4-4ee8-aa80-00ebe768def8") + ) + (junction + (at 133.35 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "b26424e6-3284-482e-bb99-97e0c61498e7") + ) + (junction + (at 358.14 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "b2f9b2ed-ac2f-46d6-b450-320fad47c12b") + ) + (junction + (at 274.32 262.89) + (diameter 0) + (color 0 0 0 0) + (uuid "b3a6bd18-39b3-4448-8de6-169762cb7381") + ) + (junction + (at 132.08 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "b5d47eb4-1195-4835-ab27-9c4de9eecb7a") + ) + (junction + (at 152.4 157.48) + (diameter 0) + (color 0 0 0 0) + (uuid "b6063bec-3d9d-4a8b-8cd4-8d3c567429b2") + ) + (junction + (at 158.75 104.14) + (diameter 0) + (color 0 0 0 0) + (uuid "b678ce79-278c-45a8-90d9-66a7302729c0") + ) + (junction + (at 212.09 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "b78a97c0-ae2e-4cab-91bb-c1fd7b05e197") + ) + (junction + (at 307.34 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "b7a20e72-5a6e-48ec-aa70-3310eb68b50f") + ) + (junction + (at 232.41 262.89) + (diameter 0) + (color 0 0 0 0) + (uuid "b94181c6-43c6-4be4-87c0-70bac1591e7e") + ) + (junction + (at 119.38 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "ba111105-1686-458b-87a1-d025b6580a86") + ) + (junction + (at 132.08 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "ba587219-0a83-43a4-aa0d-a7c068539228") + ) + (junction + (at 128.27 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "bb0b2573-b71e-45eb-bdd4-e69e7a3b1820") + ) + (junction + (at 127 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "bcef8167-83fa-4b97-b958-ba34d20281bf") + ) + (junction + (at 308.61 93.98) + (diameter 0) + (color 0 0 0 0) + (uuid "c06ae363-b727-41c9-a659-f74f2de6b719") + ) + (junction + (at 53.34 154.94) + (diameter 0) + (color 0 0 0 0) + (uuid "c0a74cd2-1f1b-4e4e-ab5e-07df97ee573b") + ) + (junction + (at 158.75 35.56) + (diameter 0) + (color 0 0 0 0) + (uuid "c14cad5a-2024-48c0-8126-2d1b6d136b66") + ) + (junction + (at 158.75 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "c2829dca-8e32-4ce5-8d04-352a4f9069fb") + ) + (junction + (at 153.67 204.47) + (diameter 0) + (color 0 0 0 0) + (uuid "c3223040-29ac-4927-81e2-c26839e02673") + ) + (junction + (at 109.22 66.04) + (diameter 0) + (color 0 0 0 0) + (uuid "c3f77916-6731-4427-a5ee-73f9360f94fc") + ) + (junction + (at 109.22 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "c6f18433-d600-4885-b10c-c64d1a423976") + ) + (junction + (at 308.61 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "c7766371-167f-4337-a806-5653b89941aa") + ) + (junction + (at 158.75 138.43) + (diameter 0) + (color 0 0 0 0) + (uuid "c8ce479e-caff-46a5-95bd-e99593519178") + ) + (junction + (at 303.53 43.18) + (diameter 0) + (color 0 0 0 0) + (uuid "c9518f36-0269-49ef-8646-73169a67053b") + ) + (junction + (at 351.79 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "ca062b0a-0281-4081-abf0-10ed8be019b0") + ) + (junction + (at 104.14 138.43) + (diameter 0) + (color 0 0 0 0) + (uuid "cc4f502f-a8c4-4196-82fd-b8fa8029d46d") + ) + (junction + (at 133.35 190.5) + (diameter 0) + (color 0 0 0 0) + (uuid "cc52aa2b-77da-43fe-9f30-8806539cc341") + ) + (junction + (at 127 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "cf226418-1fc4-4564-be03-326d046af72b") + ) + (junction + (at 358.14 93.98) + (diameter 0) + (color 0 0 0 0) + (uuid "cfc5bc9b-b242-4081-8926-b0c0cfdc365f") + ) + (junction + (at 109.22 105.41) + (diameter 0) + (color 0 0 0 0) + (uuid "d02b15b0-2c55-41a6-942b-3c157b441e20") + ) + (junction + (at 158.75 203.2) + (diameter 0) + (color 0 0 0 0) + (uuid "d0537e55-0734-46b6-84bf-3a1fd8294c68") + ) + (junction + (at 109.22 195.58) + (diameter 0) + (color 0 0 0 0) + (uuid "d07f81b9-1279-4cb4-9b74-fd79f1b945a0") + ) + (junction + (at 34.29 255.27) + (diameter 0) + (color 0 0 0 0) + (uuid "d0d814d3-a1d7-486f-87c0-3727b78b4d4a") + ) + (junction + (at 119.38 157.48) + (diameter 0) + (color 0 0 0 0) + (uuid "d19d3023-3e80-4909-977c-36dc367e155d") + ) + (junction + (at 133.35 195.58) + (diameter 0) + (color 0 0 0 0) + (uuid "d2b41c05-f762-42ca-b93b-aa45f07128d3") + ) + (junction + (at 212.09 121.92) + (diameter 0) + (color 0 0 0 0) + (uuid "d2c1f674-d9d2-4259-bc8a-eac1437c083a") + ) + (junction + (at 109.22 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "d2f26c8c-ef77-410c-a1d6-bcb3330e678e") + ) + (junction + (at 353.06 43.18) + (diameter 0) + (color 0 0 0 0) + (uuid "d313352b-dd6e-4629-83ec-33748363eb07") + ) + (junction + (at 120.65 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "d34934d2-ddd9-4828-9fe4-c5eb4ff94f32") + ) + (junction + (at 133.35 105.41) + (diameter 0) + (color 0 0 0 0) + (uuid "d3c83419-f636-42b9-a219-631dd417bdfb") + ) + (junction + (at 332.74 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "d4581619-7f21-44ef-8761-b2e59128a5ae") + ) + (junction + (at 331.47 43.18) + (diameter 0) + (color 0 0 0 0) + (uuid "d4e40cec-caac-4797-9f9c-42fad47b35a9") + ) + (junction + (at 158.75 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "d4fa2b6f-c4a7-40f8-ba79-a60694ec25d2") + ) + (junction + (at 153.67 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "d766eb97-b326-4e96-b770-c6da9782c42b") + ) + (junction + (at 152.4 190.5) + (diameter 0) + (color 0 0 0 0) + (uuid "d8f3ce09-81a9-492f-9205-82b3470c29a5") + ) + (junction + (at 127 190.5) + (diameter 0) + (color 0 0 0 0) + (uuid "d92e1b11-fbcc-4f36-86e6-a35f65897ed7") + ) + (junction + (at 320.04 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "d9a65c36-6e29-4d14-a57b-05ea76513677") + ) + (junction + (at 133.35 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "db65c6c7-c311-4792-96dc-3c68d31dd1b2") + ) + (junction + (at 255.27 55.88) + (diameter 0) + (color 0 0 0 0) + (uuid "dcb573a5-3b34-4c2c-9eb3-ae41a24e2bc3") + ) + (junction + (at 109.22 162.56) + (diameter 0) + (color 0 0 0 0) + (uuid "dccb7b87-3c01-4302-b444-d564f3213bf6") + ) + (junction + (at 344.17 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "e0582934-ad89-48be-b6d3-d387968622c5") + ) + (junction + (at 332.74 102.87) + (diameter 0) + (color 0 0 0 0) + (uuid "e10cfac6-dc57-4401-bb26-bea53213c6c8") + ) + (junction + (at 104.14 91.44) + (diameter 0) + (color 0 0 0 0) + (uuid "e1c3e94d-57cf-4736-8ec2-58a74c65a04e") + ) + (junction + (at 332.74 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "e25307dc-a395-4870-8c5a-b7fa81b4dcc6") + ) + (junction + (at 120.65 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "e3f0d6cf-4eb9-4881-b55c-367c1d2e37d0") + ) + (junction + (at 303.53 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "e6f09e53-ebb3-41c8-a8bf-cf98aed33d52") + ) + (junction + (at 158.75 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "e799a41e-5d21-4d6c-bd55-35bcb2fa3b2e") + ) + (junction + (at 153.67 74.93) + (diameter 0) + (color 0 0 0 0) + (uuid "e8198c18-37ae-4d41-a9c8-3b3ad2fb3780") + ) + (junction + (at 260.35 270.51) + (diameter 0) + (color 0 0 0 0) + (uuid "ea1ac0a4-4d61-4d83-9012-f774e302fa54") + ) + (junction + (at 153.67 30.48) + (diameter 0) + (color 0 0 0 0) + (uuid "ea513a68-aee2-4ee8-bede-b7b5cfaea2c2") + ) + (junction + (at 358.14 29.21) + (diameter 0) + (color 0 0 0 0) + (uuid "eac90802-7e38-413d-ba84-11c15bb0044b") + ) + (junction + (at 332.74 34.29) + (diameter 0) + (color 0 0 0 0) + (uuid "ed52574d-8022-456d-ab74-7e4159546da8") + ) + (junction + (at 128.27 60.96) + (diameter 0) + (color 0 0 0 0) + (uuid "ed57a74c-dbe1-44d1-a0cc-629dbda2c01c") + ) + (junction + (at 120.65 138.43) + (diameter 0) + (color 0 0 0 0) + (uuid "ee309651-0730-41c8-afd2-fafec65c8e02") + ) + (junction + (at 332.74 88.9) + (diameter 0) + (color 0 0 0 0) + (uuid "eeb13fcf-b23d-464d-9e48-864cdacfd214") + ) + (junction + (at 318.77 58.42) + (diameter 0) + (color 0 0 0 0) + (uuid "efa9b7a5-ecf9-491b-9315-1e0c488eb349") + ) + (junction + (at 358.14 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "efc01265-dbfb-4aee-8800-e083812b0caa") + ) + (junction + (at 295.91 213.36) + (diameter 0) + (color 0 0 0 0) + (uuid "f2ab48e5-a9fa-489a-9929-684bdec23cb5") + ) + (junction + (at 332.74 93.98) + (diameter 0) + (color 0 0 0 0) + (uuid "f2dc2964-262b-41da-b182-ced81ff9213b") + ) + (junction + (at 144.78 157.48) + (diameter 0) + (color 0 0 0 0) + (uuid "f502c572-715d-4e28-8b3c-2c22133a5007") + ) + (junction + (at 104.14 124.46) + (diameter 0) + (color 0 0 0 0) + (uuid "f5350528-b0b9-433c-9ec0-7d8e50a9cb47") + ) + (junction + (at 308.61 63.5) + (diameter 0) + (color 0 0 0 0) + (uuid "f8476bd7-cf62-44d3-9bdd-74875aec1629") + ) + (junction + (at 308.61 101.6) + (diameter 0) + (color 0 0 0 0) + (uuid "f854773c-47dd-48d4-93ad-0da94aa654ea") + ) + (junction + (at 406.4 86.36) + (diameter 0) + (color 0 0 0 0) + (uuid "f890003c-566a-43a8-acf1-e8452a98711b") + ) + (junction + (at 332.74 43.18) + (diameter 0) + (color 0 0 0 0) + (uuid "f8c139d2-5e8c-424e-af8d-da20aee7b392") + ) + (junction + (at 158.75 190.5) + (diameter 0) + (color 0 0 0 0) + (uuid "f947106f-80b8-4c4a-b7a3-329f531737f6") + ) + (junction + (at 128.27 44.45) + (diameter 0) + (color 0 0 0 0) + (uuid "faa61997-4930-47cb-84b4-f34693d4eb16") + ) + (junction + (at 353.06 72.39) + (diameter 0) + (color 0 0 0 0) + (uuid "fb199430-92ca-45dd-a006-2a4d834b93f1") + ) + (junction + (at 295.91 224.79) + (diameter 0) + (color 0 0 0 0) + (uuid "fc47e1f8-0712-484c-b7de-b5dcc68de11a") + ) + (junction + (at 406.4 55.88) + (diameter 0) + (color 0 0 0 0) + (uuid "feed9fa9-262b-4f19-bbd9-dd4ee2192a12") + ) + (junction + (at 109.22 157.48) + (diameter 0) + (color 0 0 0 0) + (uuid "ff7170dd-6e72-480c-b348-128120a1a55d") + ) + (no_connect + (at 308.61 190.5) + (uuid "0d7422ec-e0ad-4c41-8637-484d91904b7f") + ) + (no_connect + (at 344.17 215.9) + (uuid "69752a8b-fe0d-48af-be8d-4e0e91be800d") + ) + (no_connect + (at 280.67 179.07) + (uuid "8c789f83-8dd3-4b6d-b0b1-bbd8143d435d") + ) + (no_connect + (at 280.67 181.61) + (uuid "b3a276c4-a06b-4765-8c28-b618a0081aa2") + ) + (no_connect + (at 344.17 213.36) + (uuid "b6b259ce-c899-4545-b73d-f2bdb7e15833") + ) + (no_connect + (at 267.97 179.07) + (uuid "bb71ac78-b326-4cd1-8a72-30e0231f3e4e") + ) + (no_connect + (at 308.61 193.04) + (uuid "c4b1988c-42c8-47f8-8d95-5114dd479060") + ) + (no_connect + (at 267.97 181.61) + (uuid "d4797f12-02dd-4827-b383-7a376ca0acf7") + ) + (no_connect + (at 344.17 210.82) + (uuid "da3d61f9-55b4-4084-a530-faa427448d53") + ) + (no_connect + (at 344.17 208.28) + (uuid "da6f0b6e-0823-4d24-a2d8-153e8b18b32f") + ) + (no_connect + (at 280.67 184.15) + (uuid "e1447078-1b76-4c14-9675-9970e955f15c") + ) + (no_connect + (at 280.67 186.69) + (uuid "f6189988-13d1-40ad-a6f7-7d7ba550adb8") + ) + (wire + (pts + (xy 77.47 271.78) (xy 74.93 271.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "00572998-ccb4-4c97-9b08-ecfcec907a6a") + ) + (wire + (pts + (xy 327.66 72.39) (xy 320.04 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "00840d44-4215-45e1-b9fb-bbdecd4ea555") + ) + (wire + (pts + (xy 303.53 41.91) (xy 303.53 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "00e0a047-9e13-433a-b18d-244e810e09bf") + ) + (wire + (pts + (xy 133.35 73.66) (xy 133.35 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "00f53a07-3486-4e3a-b469-991a713f8829") + ) + (wire + (pts + (xy 351.79 22.86) (xy 351.79 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "010bd468-76f7-4469-8f06-60051dc19159") + ) + (wire + (pts + (xy 168.91 30.48) (xy 173.99 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "01f5db62-cfb1-48a1-ac84-e9fedaa0dec0") + ) + (wire + (pts + (xy 118.11 91.44) (xy 119.38 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "020ffc38-ef89-4ef6-9c5b-6f7e695fbfc1") + ) + (wire + (pts + (xy 295.91 224.79) (xy 300.99 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "02482c27-7a0f-4545-88b6-71be6bb80e2e") + ) + (wire + (pts + (xy 34.29 255.27) (xy 27.94 255.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "02f9aeab-7ca1-4446-8a96-0f022809d701") + ) + (wire + (pts + (xy 107.95 203.2) (xy 109.22 203.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "030e3448-8e7c-4c72-b490-7209f15ee781") + ) + (wire + (pts + (xy 290.83 224.79) (xy 295.91 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "030fbf7e-36d7-4a42-96b3-51f62156a1d9") + ) + (wire + (pts + (xy 128.27 190.5) (xy 133.35 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "038d5d66-e242-406a-9cbf-580c5d745988") + ) + (wire + (pts + (xy 143.51 91.44) (xy 144.78 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "040602a3-1db6-43b5-9094-f7a2f33deb16") + ) + (wire + (pts + (xy 194.31 58.42) (xy 200.66 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "041dffda-2ee4-47f0-90fa-786891fcf75e") + ) + (wire + (pts + (xy 327.66 72.39) (xy 331.47 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "04311b5e-f2c1-4a0a-9082-8551d8ad25ba") + ) + (wire + (pts + (xy 76.2 44.45) (xy 104.14 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0468e2ea-bdde-4b21-9617-503168c72ea9") + ) + (wire + (pts + (xy 332.74 34.29) (xy 332.74 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "04989a3a-6deb-43dd-b255-20b116bafa9f") + ) + (wire + (pts + (xy 358.14 63.5) (xy 358.14 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "051994fe-214e-4d78-802c-1efd0cc4378f") + ) + (wire + (pts + (xy 260.35 262.89) (xy 274.32 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0740d5e6-3745-426c-a1f4-413bd405be3d") + ) + (wire + (pts + (xy 331.47 64.77) (xy 331.47 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "09705ddc-17a5-4e2a-9bf8-74081d0e9c38") + ) + (wire + (pts + (xy 128.27 60.96) (xy 133.35 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "099f0b70-6fc2-4a00-9789-88ef8f484361") + ) + (wire + (pts + (xy 104.14 30.48) (xy 109.22 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "09d3ed1f-8735-467a-bca6-ea185d7357ba") + ) + (wire + (pts + (xy 152.4 24.13) (xy 152.4 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "09d80fa2-0edf-4c31-950b-edc956478773") + ) + (wire + (pts + (xy 128.27 96.52) (xy 128.27 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0a205258-f8d0-4b1e-bb92-2cbf916faea7") + ) + (wire + (pts + (xy 128.27 129.54) (xy 128.27 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0a4774f3-d130-459c-8685-923a74e12fd2") + ) + (wire + (pts + (xy 153.67 129.54) (xy 153.67 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0b224b1e-d564-4ecc-90df-38588f488f7e") + ) + (wire + (pts + (xy 63.5 222.25) (xy 68.58 222.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0b433aeb-2050-48ac-92a0-a96e2c1f7937") + ) + (wire + (pts + (xy 353.06 193.04) (xy 344.17 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0b63d4f2-381c-40df-836d-cf6f4e1c0927") + ) + (wire + (pts + (xy 393.7 55.88) (xy 397.51 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0bb1470f-aa31-40d1-95fa-dfcc6078d6c1") + ) + (wire + (pts + (xy 104.14 60.96) (xy 109.22 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0bd5fa67-c2e2-4d1f-9df5-96afc431c2ea") + ) + (wire + (pts + (xy 133.35 35.56) (xy 133.35 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0c19a6f9-c05d-4f93-b0d2-59467a35fdb3") + ) + (wire + (pts + (xy 158.75 104.14) (xy 158.75 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0c7d3218-197d-41c3-bc12-031e8dec9200") + ) + (wire + (pts + (xy 143.51 124.46) (xy 144.78 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0cbad7f0-9657-477e-8ea4-1ccbf9f1e0e4") + ) + (wire + (pts + (xy 194.31 127) (xy 195.58 127) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0d21da6a-4c2f-4e95-882b-3e660dc5c083") + ) + (wire + (pts + (xy 132.08 66.04) (xy 133.35 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0d4778c3-6650-45a4-9914-adc840266682") + ) + (wire + (pts + (xy 132.08 104.14) (xy 133.35 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0e5c44b0-0251-49d1-9bd8-d83775f5b03d") + ) + (wire + (pts + (xy 356.87 199.39) (xy 353.06 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0f2cdc25-d222-474f-9162-e980b74bd2d9") + ) + (wire + (pts + (xy 133.35 43.18) (xy 133.35 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0f9e2d34-aee8-46f7-9d52-7e232c02eadc") + ) + (wire + (pts + (xy 365.76 184.15) (xy 365.76 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0fd48fc9-04f7-41c9-bc3b-bfb9d32754a1") + ) + (wire + (pts + (xy 168.91 35.56) (xy 173.99 35.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "10028c15-28d4-4385-b35b-6bec3edcc61e") + ) + (wire + (pts + (xy 153.67 252.73) (xy 167.64 252.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "100a5f5a-8b5d-4570-a2e2-798b04439a2b") + ) + (wire + (pts + (xy 128.27 124.46) (xy 127 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "104d3f2c-c6ac-4432-906d-afef001384ba") + ) + (wire + (pts + (xy 104.14 190.5) (xy 109.22 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1113e3f3-029d-42be-8371-ad5fcc3495c3") + ) + (wire + (pts + (xy 128.27 74.93) (xy 132.08 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "113f7c6b-1c25-4864-b0dc-296dd83191c0") + ) + (wire + (pts + (xy 128.27 204.47) (xy 133.35 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "11958cfe-9ecb-46d6-8411-fe92be0cb792") + ) + (wire + (pts + (xy 267.97 86.36) (xy 264.16 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "11b9acac-812f-404c-86bb-bda8dd51e386") + ) + (wire + (pts + (xy 53.34 88.9) (xy 53.34 121.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "14669193-d468-4c00-ac69-f0fe56a51e28") + ) + (wire + (pts + (xy 307.34 71.12) (xy 307.34 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "14ac0439-667e-4155-ada6-54cddaa84b20") + ) + (wire + (pts + (xy 326.39 165.1) (xy 326.39 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "16d03f34-2ef0-47a7-9cba-2f60c4eeb0af") + ) + (wire + (pts + (xy 158.75 129.54) (xy 158.75 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "16ea430c-faf3-4fbe-b6eb-431c437a6afc") + ) + (wire + (pts + (xy 327.66 88.9) (xy 326.39 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "17f20b1a-b0f4-45fe-b973-5bd6be0893a1") + ) + (wire + (pts + (xy 201.93 273.05) (xy 201.93 275.59) + ) + (stroke + (width 0) + (type default) + ) + (uuid "18575ca1-73b1-48e6-912c-44fe863ad717") + ) + (wire + (pts + (xy 356.87 93.98) (xy 358.14 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "18f0eb2f-e1f2-4197-850d-4bf603e467a1") + ) + (wire + (pts + (xy 168.91 99.06) (xy 173.99 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "19014f9a-e12d-4da3-a57b-82e468a06c19") + ) + (wire + (pts + (xy 153.67 30.48) (xy 158.75 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1946743b-7db4-478c-a7a7-bad2360bb087") + ) + (wire + (pts + (xy 318.77 52.07) (xy 318.77 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "194989b9-b6be-4455-b2e4-91423eaecf4d") + ) + (wire + (pts + (xy 281.94 189.23) (xy 280.67 189.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1980dc3d-f7d9-4b47-91f7-46aee888e1f6") + ) + (wire + (pts + (xy 353.06 184.15) (xy 353.06 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1ac1c725-ef80-4eb6-ba40-99453b201483") + ) + (wire + (pts + (xy 332.74 93.98) (xy 332.74 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1b2e7563-8226-4f6c-91e2-e029efbcdf33") + ) + (wire + (pts + (xy 303.53 29.21) (xy 308.61 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1ba5a69a-6c39-41b9-93ea-0bec8060169f") + ) + (wire + (pts + (xy 53.34 222.25) (xy 55.88 222.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c642a00-11aa-4020-a953-b704c51a4233") + ) + (wire + (pts + (xy 133.35 162.56) (xy 133.35 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c779a0e-09ef-4b22-b843-7a6b5fcdceac") + ) + (wire + (pts + (xy 292.1 175.26) (xy 292.1 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c882b4d-b618-41a6-a5de-ac0f87ada2f9") + ) + (wire + (pts + (xy 295.91 209.55) (xy 295.91 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1d4b8a27-5174-43f2-8960-6a6841db4772") + ) + (wire + (pts + (xy 307.34 63.5) (xy 308.61 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1f0b0809-3444-4448-8272-245205679052") + ) + (wire + (pts + (xy 118.11 190.5) (xy 119.38 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1f467a08-c767-4fad-b3de-948e90fdfbac") + ) + (wire + (pts + (xy 358.14 93.98) (xy 358.14 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1f9ee5f8-9998-43b1-bc10-1748dd942c23") + ) + (wire + (pts + (xy 153.67 104.14) (xy 153.67 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1ff294ab-191f-44e7-90e5-affc60c7dc03") + ) + (wire + (pts + (xy 344.17 52.07) (xy 344.17 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "20a4fa1d-3acb-43c0-a0f1-2a249d0204cd") + ) + (wire + (pts + (xy 109.22 44.45) (xy 109.22 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2141e985-9e4b-48d6-b07c-13e2300df29d") + ) + (wire + (pts + (xy 153.67 60.96) (xy 152.4 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "214b42bd-ba79-4212-ac4f-2848e1b7d4c9") + ) + (wire + (pts + (xy 53.34 27.94) (xy 53.34 12.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "223216fb-16a0-4f7b-806e-e559566e2b13") + ) + (wire + (pts + (xy 368.3 66.04) (xy 373.38 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "240184ce-c288-43a7-8c80-7f2e56cb02f0") + ) + (wire + (pts + (xy 144.78 252.73) (xy 146.05 252.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2442e2dc-c301-4fa1-b913-df7545577fb0") + ) + (wire + (pts + (xy 104.14 195.58) (xy 104.14 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "244e23cd-36c5-43fd-a532-c876f8a13b6a") + ) + (wire + (pts + (xy 128.27 30.48) (xy 127 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "24de1726-df22-477e-8122-0bd116df1d2a") + ) + (wire + (pts + (xy 67.31 193.04) (xy 67.31 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2509b33c-9ed3-4e79-825c-14d4c7339e2b") + ) + (wire + (pts + (xy 353.06 29.21) (xy 358.14 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "25aeacec-7d3e-4df0-a566-ade6d32888bd") + ) + (wire + (pts + (xy 120.65 204.47) (xy 109.22 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "26431254-33e1-4502-9480-e7d9aad26e9c") + ) + (wire + (pts + (xy 67.31 63.5) (xy 67.31 68.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2666f0f7-3c9e-4acf-a279-57eb9e4a521c") + ) + (wire + (pts + (xy 327.66 102.87) (xy 331.47 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2682e290-f589-4999-a4be-6ab6190702d1") + ) + (wire + (pts + (xy 119.38 184.15) (xy 119.38 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2694cca7-56e0-4b95-81ad-b971802ff615") + ) + (wire + (pts + (xy 326.39 82.55) (xy 326.39 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "27eb7baf-1bf8-43ba-8e5a-ed7d039a1aef") + ) + (wire + (pts + (xy 356.87 43.18) (xy 358.14 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "27f0528e-727c-401b-adcd-3ddc4d59fa4c") + ) + (wire + (pts + (xy 153.67 105.41) (xy 158.75 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "287af918-d873-45ab-82c4-ff288405e0e2") + ) + (wire + (pts + (xy 152.4 54.61) (xy 152.4 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "28ea5c4b-0288-43b0-8371-dfed5562440d") + ) + (wire + (pts + (xy 307.34 41.91) (xy 307.34 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "29414ec0-6ba4-45ff-8b4d-0a02c814056c") + ) + (wire + (pts + (xy 60.96 227.33) (xy 68.58 227.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "29ae5bd7-7e74-468a-a99c-7c36be3fe7cd") + ) + (wire + (pts + (xy 303.53 58.42) (xy 308.61 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "29d7b89e-c1e0-4e91-b8e7-913cc0a43cbd") + ) + (wire + (pts + (xy 368.3 96.52) (xy 373.38 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2a0e4b60-b3ef-4597-8b1f-47118db9c8ac") + ) + (wire + (pts + (xy 158.75 129.54) (xy 157.48 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2a5227e2-7a85-4d75-a053-12af6776993b") + ) + (wire + (pts + (xy 128.27 157.48) (xy 133.35 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2ac9a3ee-63bc-4158-b6f9-474bf1d8cc67") + ) + (wire + (pts + (xy 214.63 91.44) (xy 215.9 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2adf3b94-a332-421f-ad29-47751d82f983") + ) + (wire + (pts + (xy 327.66 43.18) (xy 331.47 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2af17f5f-25d2-449d-922b-af1ba98a9b99") + ) + (wire + (pts + (xy 303.53 34.29) (xy 303.53 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b0e6db8-ba1b-4b82-813b-57d8e6df2852") + ) + (wire + (pts + (xy 300.99 215.9) (xy 308.61 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b184912-64cb-4b6c-ad02-3d3f04fcacfa") + ) + (wire + (pts + (xy 128.27 203.2) (xy 128.27 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b54888d-59b8-4947-92f0-72e4a7f46601") + ) + (wire + (pts + (xy 143.51 157.48) (xy 144.78 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b7dff9c-e782-42d0-ae3b-8b352a1d7e95") + ) + (wire + (pts + (xy 153.67 74.93) (xy 157.48 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2b8302ad-bd03-483d-b4fa-d67376e10007") + ) + (wire + (pts + (xy 332.74 165.1) (xy 326.39 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2d1d616f-f68a-4dd2-8e96-5dc091f5b9bb") + ) + (wire + (pts + (xy 327.66 71.12) (xy 327.66 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2df019de-470f-4b3b-90e0-f5489531b86e") + ) + (wire + (pts + (xy 255.27 55.88) (xy 255.27 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2eebbc78-c3a9-4dd8-a734-c9b35e3de2ac") + ) + (wire + (pts + (xy 76.2 138.43) (xy 104.14 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2ef5882d-8d67-46d2-a45d-8ece761a9fe7") + ) + (wire + (pts + (xy 118.11 60.96) (xy 119.38 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2efa58fe-1de1-439d-a371-90f1d76687ae") + ) + (wire + (pts + (xy 104.14 204.47) (xy 109.22 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2f05786a-ab75-4e95-98b0-fbea8f14bee4") + ) + (wire + (pts + (xy 356.87 41.91) (xy 356.87 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2f2ecf52-d768-40ce-b042-e62c1aea3310") + ) + (wire + (pts + (xy 327.66 93.98) (xy 327.66 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2f42826e-5150-4f06-a847-087e60fb7cd5") + ) + (wire + (pts + (xy 104.14 66.04) (xy 104.14 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3045d969-5519-4a37-9028-1f15578981f9") + ) + (wire + (pts + (xy 368.3 88.9) (xy 373.38 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "314cf5ee-5bf2-4bb0-ac86-d41fb341de7c") + ) + (wire + (pts + (xy 53.34 234.95) (xy 53.34 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "323d8f30-f347-46da-b8d7-9431016ee894") + ) + (wire + (pts + (xy 406.4 86.36) (xy 406.4 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "327124b4-58f7-4fbc-80c6-bfc988ac8c04") + ) + (wire + (pts + (xy 256.54 86.36) (xy 255.27 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "32be88a2-c846-4240-9a7f-682ea87fb4c2") + ) + (wire + (pts + (xy 308.61 88.9) (xy 309.88 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "32c62383-f589-4ef0-aeea-c74828a36466") + ) + (wire + (pts + (xy 194.31 121.92) (xy 200.66 121.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3324211c-78c9-4f9a-a3f9-299b608517a8") + ) + (wire + (pts + (xy 105.41 224.79) (xy 120.65 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "343f33d6-67bd-40da-9be3-069e1c0f767a") + ) + (wire + (pts + (xy 158.75 66.04) (xy 158.75 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "34c41f77-e555-4d3a-aeed-950196958d9f") + ) + (wire + (pts + (xy 128.27 204.47) (xy 120.65 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "34f8944f-00c8-424c-b008-d09641971de3") + ) + (wire + (pts + (xy 109.22 105.41) (xy 109.22 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3514e124-5112-4baa-9678-a2af66609dc7") + ) + (wire + (pts + (xy 332.74 63.5) (xy 332.74 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "362c7a03-1d6f-41cd-857c-72afdaad04a9") + ) + (wire + (pts + (xy 214.63 262.89) (xy 222.25 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "36fa5d8f-7d2b-4b57-92b5-4957e4991734") + ) + (wire + (pts + (xy 128.27 30.48) (xy 133.35 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "37bdaf4d-e5ed-4ab7-921f-b4436ad52b15") + ) + (wire + (pts + (xy 326.39 160.02) (xy 326.39 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "38766fc7-3090-4919-b50c-045488f1a7ea") + ) + (wire + (pts + (xy 168.91 198.12) (xy 173.99 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "38ecefe1-56d0-4209-8c29-cc55dcfd65cd") + ) + (wire + (pts + (xy 144.78 270.51) (xy 146.05 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "392ba919-c602-45b5-bf91-352c7bda931f") + ) + (wire + (pts + (xy 295.91 223.52) (xy 295.91 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "39821d94-c703-4c1f-bca4-fd950574caf2") + ) + (wire + (pts + (xy 128.27 138.43) (xy 132.08 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "39996dbe-0713-413d-adbd-cecccdd2bc43") + ) + (wire + (pts + (xy 54.61 255.27) (xy 54.61 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "39e03731-a1cf-4771-a132-22cc960ff21a") + ) + (wire + (pts + (xy 326.39 223.52) (xy 326.39 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3a1f0776-bc07-4ca8-8d72-baba7c621d70") + ) + (wire + (pts + (xy 132.08 137.16) (xy 132.08 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3aaf867e-e6df-4923-a7d8-e32bd011858a") + ) + (wire + (pts + (xy 57.15 27.94) (xy 53.34 27.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3b26f7a6-8558-49e8-bd77-af7395243be2") + ) + (wire + (pts + (xy 302.26 162.56) (xy 302.26 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3b3df2de-8840-4b70-8406-b8b1803aa3c2") + ) + (wire + (pts + (xy 168.91 190.5) (xy 173.99 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3b64a3df-57cd-44ae-be2e-5aee2732307b") + ) + (wire + (pts + (xy 68.58 58.42) (xy 64.77 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3befc8d6-da57-40c8-9c97-3651e1637867") + ) + (wire + (pts + (xy 214.63 60.96) (xy 215.9 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3c207d5c-9b1a-44fd-9fc9-50aac89551bf") + ) + (wire + (pts + (xy 186.69 137.16) (xy 186.69 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3c23797d-f571-4c3e-8f60-b82a11ffa2c7") + ) + (wire + (pts + (xy 340.36 165.1) (xy 341.63 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3dbc6e0e-8365-4f48-918d-da726b9759c0") + ) + (wire + (pts + (xy 158.75 96.52) (xy 158.75 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3edc332e-7edc-4d55-8b74-a942ad2569df") + ) + (wire + (pts + (xy 11.43 160.02) (xy 16.51 160.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f6771c3-b99b-4b2d-b4eb-79a9151ac612") + ) + (wire + (pts + (xy 120.65 224.79) (xy 167.64 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f6bc4f8-aab3-428a-9a13-345af08bcc6a") + ) + (wire + (pts + (xy 104.14 74.93) (xy 107.95 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3f6c6d86-f9b3-4d22-a6eb-fd1d8b8bd6c3") + ) + (wire + (pts + (xy 342.9 58.42) (xy 344.17 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3fa4fd6a-0665-40b4-bbc0-633a92147038") + ) + (wire + (pts + (xy 119.38 269.24) (xy 124.46 269.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3fe1441a-4169-4f1f-81e5-e9658c340782") + ) + (wire + (pts + (xy 132.08 44.45) (xy 133.35 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3ff01154-0f1f-41c7-99bf-1a8d5863e41a") + ) + (wire + (pts + (xy 128.27 91.44) (xy 127 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4005ecde-95d8-4234-b404-1bd7fdce10d9") + ) + (wire + (pts + (xy 320.04 72.39) (xy 308.61 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4091474e-2c44-4a6c-bcee-dda51628c9e1") + ) + (wire + (pts + (xy 53.34 187.96) (xy 57.15 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "41a2dcc7-914d-4508-988e-5b34398465a8") + ) + (wire + (pts + (xy 153.67 157.48) (xy 158.75 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "41b118b8-393c-4b5d-9617-70bf1df9de1d") + ) + (wire + (pts + (xy 275.59 43.18) (xy 303.53 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "42994d9b-82f6-455d-9dc0-22bc2b171952") + ) + (wire + (pts + (xy 67.31 160.02) (xy 67.31 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "434fdbdb-da90-4830-a1f3-e7214093075a") + ) + (wire + (pts + (xy 53.34 222.25) (xy 53.34 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "438c35e9-a1cc-4694-8dd9-0c1b26d4460f") + ) + (wire + (pts + (xy 120.65 74.93) (xy 120.65 76.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "442e40d6-7889-4205-94ce-79375a99fad0") + ) + (wire + (pts + (xy 153.67 30.48) (xy 152.4 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "44950b23-326b-45a6-9aca-f698012b3cf0") + ) + (wire + (pts + (xy 327.66 43.18) (xy 320.04 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4520b4c7-5794-4935-a3fb-0decd662b252") + ) + (wire + (pts + (xy 76.2 237.49) (xy 76.2 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "456fc51c-dc4a-4b4d-ac36-65feb9cc967c") + ) + (wire + (pts + (xy 356.87 184.15) (xy 353.06 184.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45d90c84-0ce7-47a9-a1f1-ee52a04ce07c") + ) + (wire + (pts + (xy 128.27 195.58) (xy 128.27 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45dedb85-5ca3-46c9-b662-4b798e507600") + ) + (wire + (pts + (xy 208.28 121.92) (xy 212.09 121.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "45e793ec-9076-4fc8-adaa-757a346285a2") + ) + (wire + (pts + (xy 167.64 252.73) (xy 171.45 252.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4604d52b-6018-47ef-8bec-bc0c99c44f24") + ) + (wire + (pts + (xy 194.31 88.9) (xy 200.66 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4619927c-a942-4a0b-8a04-c4ff24c53c22") + ) + (wire + (pts + (xy 119.38 118.11) (xy 119.38 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "46398402-b4ad-40e7-9132-eb5dfaf9f037") + ) + (wire + (pts + (xy 76.2 170.18) (xy 76.2 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "46c13973-c7fd-4b70-bcfd-2883e09987b9") + ) + (wire + (pts + (xy 267.97 55.88) (xy 264.16 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "474253a7-da54-4818-b7a9-71f4d8331667") + ) + (wire + (pts + (xy 157.48 195.58) (xy 158.75 195.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "478444d3-c625-4a1c-819d-a83c8eaa1a41") + ) + (wire + (pts + (xy 186.69 104.14) (xy 186.69 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "47e1567a-aba5-4771-9ccd-b3a0baacd886") + ) + (wire + (pts + (xy 57.15 121.92) (xy 53.34 121.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4824f072-48b8-45bd-9548-10c34087c92c") + ) + (wire + (pts + (xy 303.53 93.98) (xy 303.53 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "484f61c6-9122-4948-a8ce-3943ab0f46f8") + ) + (wire + (pts + (xy 34.29 255.27) (xy 45.72 255.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "48c2b60f-51ef-408e-bf55-a2fcb99810a8") + ) + (wire + (pts + (xy 128.27 105.41) (xy 120.65 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "491b409f-fc3e-4a53-8a8a-65de8fb5d03a") + ) + (wire + (pts + (xy 327.66 101.6) (xy 327.66 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4aa7b3ce-6622-47ef-a3de-8051381b789c") + ) + (wire + (pts + (xy 394.97 91.44) (xy 394.97 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4b83b75b-2f3c-4762-8db7-b8777e8775b8") + ) + (wire + (pts + (xy 194.31 27.94) (xy 200.66 27.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4b8b48ad-793e-4cb3-aa61-f21b6880ef6e") + ) + (wire + (pts + (xy 353.06 198.12) (xy 344.17 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4c094619-ab7b-4c6c-a85b-9b7313e097af") + ) + (wire + (pts + (xy 208.28 88.9) (xy 212.09 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4ca0f842-eee4-4381-a71a-07d6c418a161") + ) + (wire + (pts + (xy 342.9 29.21) (xy 344.17 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4cc354f3-349f-4e22-80ac-db0e1a4683e7") + ) + (wire + (pts + (xy 107.95 66.04) (xy 109.22 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d057da0-b824-4333-8a99-1e1f5ef281c4") + ) + (wire + (pts + (xy 128.27 171.45) (xy 133.35 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d22eb04-6eb1-4cd0-bb69-db4d93e31461") + ) + (wire + (pts + (xy 364.49 184.15) (xy 365.76 184.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d5db853-8302-4216-95af-07594fd4182b") + ) + (wire + (pts + (xy 153.67 190.5) (xy 152.4 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d7813b5-2763-4f76-afb6-66ab183c07d0") + ) + (wire + (pts + (xy 358.14 41.91) (xy 358.14 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4de3dbf1-1f50-4536-a3de-6f164b008280") + ) + (wire + (pts + (xy 67.31 127) (xy 67.31 133.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4de492be-fa35-4181-b1a0-d12f660220c4") + ) + (wire + (pts + (xy 368.3 58.42) (xy 373.38 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4e3b88a6-9282-404f-a627-b53d67c1d6a3") + ) + (wire + (pts + (xy 12.7 93.98) (xy 16.51 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4ece2561-1e78-4a18-81ba-b9bd8f2f13a3") + ) + (wire + (pts + (xy 12.7 227.33) (xy 16.51 227.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4f3835c8-fcf6-4048-8612-8015e0dcd4ff") + ) + (wire + (pts + (xy 107.95 104.14) (xy 109.22 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4fb14546-7aec-433a-b331-1410b7b79f09") + ) + (wire + (pts + (xy 128.27 171.45) (xy 120.65 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4fc9fdb9-b4ab-4d7f-aa4f-b64e5c43db1c") + ) + (wire + (pts + (xy 201.93 262.89) (xy 207.01 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "502e2e49-77c1-44fd-a49d-ca212d2e10d2") + ) + (wire + (pts + (xy 153.67 44.45) (xy 157.48 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "50377ad4-4feb-4f10-bdf1-dc5cad223099") + ) + (wire + (pts + (xy 109.22 74.93) (xy 109.22 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "503dceb9-83c0-486d-845d-434590dd8cb1") + ) + (wire + (pts + (xy 109.22 138.43) (xy 109.22 137.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "505fbf4a-e196-4fdf-a524-890e7788be33") + ) + (wire + (pts + (xy 153.67 171.45) (xy 133.35 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5092b28e-7175-4b5c-9cae-f3188deb43b4") + ) + (wire + (pts + (xy 107.95 74.93) (xy 109.22 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "50a7769f-7d52-42ce-8319-e2ea1a5b2607") + ) + (wire + (pts + (xy 88.9 30.48) (xy 96.52 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "520534d6-8811-4a7c-ba37-4aae43303cf3") + ) + (wire + (pts + (xy 288.29 88.9) (xy 295.91 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "52630088-6e9c-46f9-a22c-908377256348") + ) + (wire + (pts + (xy 107.95 162.56) (xy 109.22 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5293d348-efda-4d6f-ba3e-60d40f7f5153") + ) + (wire + (pts + (xy 303.53 72.39) (xy 307.34 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "52f4fa6f-6da9-4c1b-8e16-131d294846f9") + ) + (wire + (pts + (xy 128.27 73.66) (xy 128.27 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "53621175-0996-4a36-a988-21b7d8a0d14f") + ) + (wire + (pts + (xy 158.75 137.16) (xy 158.75 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "537b02df-8004-4cef-b698-5857d912f064") + ) + (wire + (pts + (xy 77.47 264.16) (xy 77.47 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5414368b-7fe4-47cd-8d46-d73441f9d254") + ) + (wire + (pts + (xy 128.27 74.93) (xy 120.65 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "544a5e93-6cca-4ddf-a76d-79c4e69921a1") + ) + (wire + (pts + (xy 194.31 33.02) (xy 195.58 33.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "54eb533a-5c11-464a-9666-fba573bdabdf") + ) + (wire + (pts + (xy 105.41 242.57) (xy 105.41 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5512cdc5-a6c1-4c73-bfb8-bbb868b01fbf") + ) + (wire + (pts + (xy 119.38 151.13) (xy 119.38 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "55b7b13a-b9b0-4ccd-8aa5-1a331031720d") + ) + (wire + (pts + (xy 39.37 276.86) (xy 41.91 276.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "55ebb1e4-9ddf-4549-b6b5-c426abe5377d") + ) + (wire + (pts + (xy 133.35 91.44) (xy 135.89 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "56e46cff-bdd2-44c8-afcc-453086a6f5e3") + ) + (wire + (pts + (xy 307.34 101.6) (xy 308.61 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "56f9bd76-40d1-44ce-8b38-3fb19a5b273a") + ) + (wire + (pts + (xy 133.35 66.04) (xy 133.35 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "575e7560-3bfe-4ae4-a032-b53ac765e26e") + ) + (wire + (pts + (xy 250.19 270.51) (xy 232.41 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "57784079-99a6-419f-9ed4-8b4259abe0d7") + ) + (wire + (pts + (xy 222.25 270.51) (xy 232.41 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "57e9198e-a44b-4107-b0f1-83c4a326fcf2") + ) + (wire + (pts + (xy 107.95 138.43) (xy 109.22 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "58405da5-43f2-419b-b9c5-dec6771b822e") + ) + (wire + (pts + (xy 302.26 175.26) (xy 308.61 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "585807fe-2f17-4888-99cb-38b143250cf0") + ) + (wire + (pts + (xy 34.29 245.11) (xy 34.29 255.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "58ca993d-52db-4bc5-8532-31a022eed636") + ) + (wire + (pts + (xy 76.2 74.93) (xy 104.14 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59144b1c-4da5-46fa-a72d-199161a2d2ca") + ) + (wire + (pts + (xy 53.34 154.94) (xy 53.34 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59b4885f-db34-4064-a4bd-c09edde9a073") + ) + (wire + (pts + (xy 109.22 96.52) (xy 109.22 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59cf4da4-4b41-484e-9b47-b673dc51e460") + ) + (wire + (pts + (xy 153.67 96.52) (xy 153.67 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59f03e1f-3643-45e0-9537-78749656c66f") + ) + (wire + (pts + (xy 153.67 170.18) (xy 153.67 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5a0d7fa4-d893-4c59-b39b-6c7fe6013239") + ) + (wire + (pts + (xy 109.22 162.56) (xy 109.22 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5a17b49e-7de6-44d7-a4a9-b52ca9361ec1") + ) + (wire + (pts + (xy 153.67 190.5) (xy 158.75 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5a1f2ce8-bd4c-46a1-add8-b6d881b04d0b") + ) + (wire + (pts + (xy 107.95 195.58) (xy 109.22 195.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5a7aa667-08c1-4b8f-92ed-89086ad1cc5d") + ) + (wire + (pts + (xy 153.67 204.47) (xy 133.35 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5a7ef2db-c342-4630-b6fc-f78da38c4510") + ) + (wire + (pts + (xy 186.69 43.18) (xy 186.69 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5ab74cb4-c7b3-4519-b2d6-f12f646c1f39") + ) + (wire + (pts + (xy 128.27 137.16) (xy 128.27 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5ae4bbc2-41e9-45cc-bb0d-4462dfe64c61") + ) + (wire + (pts + (xy 320.04 43.18) (xy 308.61 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5b938842-1621-4949-9cf1-f7999b97cdd3") + ) + (wire + (pts + (xy 68.58 88.9) (xy 64.77 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5bbf433b-5b94-49d1-9437-4472f4795f35") + ) + (wire + (pts + (xy 152.4 184.15) (xy 152.4 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5c114894-40ee-4736-aa8f-82715ec12109") + ) + (wire + (pts + (xy 353.06 102.87) (xy 332.74 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5cadda7c-b299-4ac3-ac96-d2c587547381") + ) + (wire + (pts + (xy 64.77 121.92) (xy 68.58 121.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5cef1a6c-c2b9-416d-9933-0aaa65e8a44b") + ) + (wire + (pts + (xy 68.58 160.02) (xy 67.31 160.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d30e00d-6484-4dbf-add6-694e23e8fe0b") + ) + (wire + (pts + (xy 201.93 262.89) (xy 201.93 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d52d1d0-0bc3-4bd4-9e94-9ddf02ebdb63") + ) + (wire + (pts + (xy 109.22 204.47) (xy 109.22 203.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d6897cb-1fa5-49ee-ae9a-6d7afa720c11") + ) + (wire + (pts + (xy 358.14 29.21) (xy 360.68 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5dfd3199-4aff-49e1-a425-180c9065c9e5") + ) + (wire + (pts + (xy 104.14 129.54) (xy 104.14 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e492c70-9845-47eb-a348-be4096213a6b") + ) + (wire + (pts + (xy 158.75 74.93) (xy 186.69 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e9b4c3c-01e3-4bb7-9b51-c2c4375d5bd5") + ) + (wire + (pts + (xy 331.47 93.98) (xy 332.74 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5eb8b42d-9c71-421c-8b37-02bf93f7d99a") + ) + (wire + (pts + (xy 67.31 33.02) (xy 67.31 36.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5f4d81be-ba26-430c-8376-9ce8da40ded3") + ) + (wire + (pts + (xy 386.08 72.39) (xy 358.14 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5fafe827-91f6-4546-9b05-4dc99aaf5997") + ) + (wire + (pts + (xy 157.48 66.04) (xy 158.75 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5fce5332-d7fa-4dde-a0d0-7c917ede9a90") + ) + (wire + (pts + (xy 76.2 137.16) (xy 76.2 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "60245791-b643-4800-9df4-5c0d13f2c458") + ) + (wire + (pts + (xy 128.27 138.43) (xy 120.65 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6031c300-09d1-4924-986c-3ed7229b35c6") + ) + (wire + (pts + (xy 267.97 60.96) (xy 266.7 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6086a306-276c-4be3-9c30-f9c3c90a67ac") + ) + (wire + (pts + (xy 295.91 201.93) (xy 300.99 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "60a834de-23bb-4c07-b028-051542fe035d") + ) + (wire + (pts + (xy 168.91 60.96) (xy 173.99 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6150c982-b507-4d5c-89da-c25fb064cc56") + ) + (wire + (pts + (xy 365.76 200.66) (xy 368.3 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "619910f7-af9e-40c3-a2f1-56e50db8bd28") + ) + (wire + (pts + (xy 144.78 184.15) (xy 144.78 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6200ee32-8ea6-4531-a6c5-4a09611503c2") + ) + (wire + (pts + (xy 212.09 121.92) (xy 212.09 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "622f675a-5c37-44dc-9149-af530b96cbee") + ) + (wire + (pts + (xy 386.08 102.87) (xy 358.14 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6289e77e-37f8-4443-84ee-1c65df337971") + ) + (wire + (pts + (xy 275.59 102.87) (xy 303.53 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62c08075-2fed-4e04-8e50-439ffe0cee12") + ) + (wire + (pts + (xy 109.22 74.93) (xy 120.65 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62e0d2e2-fccd-47bc-a566-ec11d4e3f85b") + ) + (wire + (pts + (xy 132.08 195.58) (xy 133.35 195.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6343c716-163d-4c3a-a6f8-db817d5449c2") + ) + (wire + (pts + (xy 267.97 26.67) (xy 264.16 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6364c4b8-57d0-422b-b5f2-f065278d5a44") + ) + (wire + (pts + (xy 208.28 58.42) (xy 212.09 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "63b5bb4f-6985-4edf-b6fe-46601bc96604") + ) + (wire + (pts + (xy 194.31 193.04) (xy 195.58 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "63c438e1-bfdb-41e2-832e-a1dec1cb1a41") + ) + (wire + (pts + (xy 34.29 234.95) (xy 34.29 237.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "63f900ae-270d-4cac-a303-0e582284d745") + ) + (wire + (pts + (xy 144.78 54.61) (xy 144.78 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6433ca9a-5adc-4826-9513-b703dda07526") + ) + (wire + (pts + (xy 143.51 60.96) (xy 144.78 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "659e9139-c296-46e5-b03e-7acf065c78a9") + ) + (wire + (pts + (xy 64.77 187.96) (xy 68.58 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "65db657d-4e49-44b0-89fd-717cbf0f8b9f") + ) + (wire + (pts + (xy 290.83 201.93) (xy 295.91 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "661b0a9f-39ca-4db3-9006-eaed76b6148c") + ) + (wire + (pts + (xy 353.06 199.39) (xy 353.06 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "66a82d2b-d56c-48bf-ac1d-b294926c5bca") + ) + (wire + (pts + (xy 275.59 71.12) (xy 275.59 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6717666b-d98f-4735-a301-cba4c0e7eeba") + ) + (wire + (pts + (xy 133.35 203.2) (xy 133.35 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "67a442b3-5f18-47d7-8796-1415e1801060") + ) + (wire + (pts + (xy 303.53 88.9) (xy 308.61 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "68404f5f-7096-4cbe-9a62-d467f005b101") + ) + (wire + (pts + (xy 297.18 177.8) (xy 308.61 177.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "68d2aa87-7975-4eb3-a0c8-eb65172e73ff") + ) + (wire + (pts + (xy 208.28 27.94) (xy 212.09 27.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "69387a5b-2cbf-4a04-a053-8042ccf56b8b") + ) + (wire + (pts + (xy 76.2 104.14) (xy 76.2 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "694dd439-4a30-4d2f-9be5-6268dfcaeccd") + ) + (wire + (pts + (xy 133.35 104.14) (xy 133.35 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "69723ea4-d39d-411d-b9e7-54f876a88df2") + ) + (wire + (pts + (xy 158.75 157.48) (xy 161.29 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "69a91f84-586e-46f4-9439-3e84797680c7") + ) + (wire + (pts + (xy 195.58 93.98) (xy 195.58 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6a5347b4-3ea3-47ac-9e5f-02c7cd8e7d49") + ) + (wire + (pts + (xy 128.27 44.45) (xy 132.08 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6a55b56e-5df9-425a-80b7-734e588f5015") + ) + (wire + (pts + (xy 68.58 93.98) (xy 67.31 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6a7f3119-fd6a-491c-986e-d9446c26b9f0") + ) + (wire + (pts + (xy 168.91 96.52) (xy 173.99 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6b5c770a-1e66-40f3-9a0f-b3dc1b8bd378") + ) + (wire + (pts + (xy 292.1 167.64) (xy 292.1 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6bf8c054-7e3e-413f-ad98-ffeb0a15db01") + ) + (wire + (pts + (xy 107.95 137.16) (xy 107.95 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6c87f8f0-efe3-48f1-a810-2da3826f9da5") + ) + (wire + (pts + (xy 153.67 171.45) (xy 158.75 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6ca666c3-14dd-4384-b5b6-8a6befc5ee5a") + ) + (wire + (pts + (xy 133.35 44.45) (xy 153.67 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6d2c6632-ee16-4f3f-a813-afcf78569f7e") + ) + (wire + (pts + (xy 255.27 26.67) (xy 256.54 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6d8ba5ce-7ac5-424f-a9a2-6ee71e9a99b8") + ) + (wire + (pts + (xy 12.7 127) (xy 16.51 127) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6e46866e-9337-4625-ac2a-5124a809cb1f") + ) + (wire + (pts + (xy 74.93 269.24) (xy 91.44 269.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6e553b53-d0ee-48fc-b541-7c739d6266e7") + ) + (wire + (pts + (xy 307.34 93.98) (xy 308.61 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6e72c095-53fc-49c2-abca-94344a7f081b") + ) + (wire + (pts + (xy 318.77 82.55) (xy 318.77 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6ebb8e39-d27c-4b3b-a003-2a31ff908b8d") + ) + (wire + (pts + (xy 331.47 63.5) (xy 332.74 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f264b80-7781-4fdc-9ba0-06ff182293f3") + ) + (wire + (pts + (xy 353.06 58.42) (xy 351.79 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f3411e9-958a-4190-82e7-06c9032b769e") + ) + (wire + (pts + (xy 307.34 72.39) (xy 308.61 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f7b7883-98d4-403b-8071-841b3d6a852d") + ) + (wire + (pts + (xy 127 184.15) (xy 127 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6fdd8786-b205-4edf-b190-ee16c5af2c58") + ) + (wire + (pts + (xy 353.06 29.21) (xy 351.79 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6fe0dd74-adb0-47b4-b5e1-f72a99d96c72") + ) + (wire + (pts + (xy 153.67 60.96) (xy 158.75 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "705c8e4f-2907-44b0-bf8a-4e30e4f644f6") + ) + (wire + (pts + (xy 104.14 44.45) (xy 107.95 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7170c1d5-a785-4a4e-bd11-4366e3d42068") + ) + (wire + (pts + (xy 53.34 58.42) (xy 53.34 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "71a6a227-fcf2-4c05-81f8-832fd4f2db4e") + ) + (wire + (pts + (xy 386.08 41.91) (xy 386.08 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "722e62e5-a586-4a34-a39d-d3322146177c") + ) + (wire + (pts + (xy 104.14 171.45) (xy 109.22 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "72db1412-62e4-451e-91a4-d6822709aa43") + ) + (wire + (pts + (xy 308.61 210.82) (xy 290.83 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "730149b3-4ebe-46e2-97b0-1abf13c76542") + ) + (wire + (pts + (xy 132.08 203.2) (xy 133.35 203.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "73c40ca7-a610-43c8-b0f0-65e6a1ecb2c9") + ) + (wire + (pts + (xy 153.67 162.56) (xy 153.67 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74bc8b35-d3f1-4d60-acc3-1b90582f4253") + ) + (wire + (pts + (xy 368.3 93.98) (xy 373.38 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75179c72-6acf-48fd-bac9-11f936261d64") + ) + (wire + (pts + (xy 358.14 71.12) (xy 358.14 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7528b8b5-eb69-4650-8af3-edfd8af79263") + ) + (wire + (pts + (xy 353.06 102.87) (xy 358.14 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75b0a768-4e35-485c-bc0c-6a95d242f9b7") + ) + (wire + (pts + (xy 358.14 58.42) (xy 360.68 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75e3c6d9-3eb8-4d6c-9f42-04b5c2aa231e") + ) + (wire + (pts + (xy 133.35 129.54) (xy 133.35 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "75f0c38e-6ec8-4d1e-be73-357f03289188") + ) + (wire + (pts + (xy 195.58 127) (xy 195.58 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "760527b8-dd3e-4c53-8837-9d4844d7a4c3") + ) + (wire + (pts + (xy 157.48 137.16) (xy 157.48 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "766f76d3-530c-4517-a702-ba5c31e35c82") + ) + (wire + (pts + (xy 308.61 29.21) (xy 309.88 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "76beb541-7098-46f5-97f5-e92e9f0a77bd") + ) + (wire + (pts + (xy 387.35 240.03) (xy 387.35 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "770d069e-2a54-430a-9eb5-65e02858fc9f") + ) + (wire + (pts + (xy 153.67 105.41) (xy 133.35 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7799ffb3-1af6-4111-8376-7468e94516d0") + ) + (wire + (pts + (xy 158.75 43.18) (xy 158.75 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "77fa4bed-df8f-48c4-9ad6-6ed75b810ff6") + ) + (wire + (pts + (xy 208.28 154.94) (xy 212.09 154.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7808262d-0fd9-48d9-aac7-87aa60d5bbf4") + ) + (wire + (pts + (xy 158.75 162.56) (xy 158.75 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7827078c-c8be-4f16-a0cd-963a4bb0deb6") + ) + (wire + (pts + (xy 118.11 157.48) (xy 119.38 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "78627d2d-b33a-4580-ba73-811c2380b333") + ) + (wire + (pts + (xy 351.79 52.07) (xy 351.79 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "78a8ec55-fe4b-44fc-a721-71de3fa385cb") + ) + (wire + (pts + (xy 128.27 66.04) (xy 128.27 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "78d2aaf7-4155-43f2-b16b-14c73f937a3d") + ) + (wire + (pts + (xy 109.22 129.54) (xy 109.22 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7a13f951-fe91-4447-bf90-88add4db3bda") + ) + (wire + (pts + (xy 292.1 162.56) (xy 297.18 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7a1683df-90fd-4bef-a9e7-6899c253aad4") + ) + (wire + (pts + (xy 353.06 101.6) (xy 353.06 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7a71e3bc-364b-4e41-9a04-564c0808729e") + ) + (wire + (pts + (xy 195.58 33.02) (xy 195.58 36.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ad42445-71e4-4a73-bfee-d9f68cb5f7cf") + ) + (wire + (pts + (xy 76.2 105.41) (xy 104.14 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7b0938be-4981-416d-a9fd-824bc8e17ce4") + ) + (wire + (pts + (xy 127 54.61) (xy 127 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7b24cbed-8d5e-4ab3-b574-6db949577915") + ) + (wire + (pts + (xy 57.15 154.94) (xy 53.34 154.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7cf66947-c737-4ba9-91cb-2f4a21574242") + ) + (wire + (pts + (xy 405.13 86.36) (xy 406.4 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7dfddd27-b264-45a8-b2e6-1e5670ce6563") + ) + (wire + (pts + (xy 57.15 88.9) (xy 53.34 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e0ca985-4739-4716-8a7a-ad4f342a78a7") + ) + (wire + (pts + (xy 107.95 73.66) (xy 107.95 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e462c12-51de-43c3-8e23-3cac0c688bb6") + ) + (wire + (pts + (xy 353.06 88.9) (xy 351.79 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7eaaa706-549a-4e21-b276-7bce0265f983") + ) + (wire + (pts + (xy 250.19 270.51) (xy 260.35 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ebc0f79-68fb-449d-a7a4-ac31a68cf01f") + ) + (wire + (pts + (xy 132.08 35.56) (xy 133.35 35.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ebfa51c-5ee7-4871-9363-63fe58caffb2") + ) + (wire + (pts + (xy 212.09 88.9) (xy 212.09 121.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f5584b8-4c4c-422e-8205-4c276467624f") + ) + (wire + (pts + (xy 302.26 162.56) (xy 326.39 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7fba6730-3809-4e59-b49b-db0431497eaf") + ) + (wire + (pts + (xy 128.27 35.56) (xy 128.27 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ffa7de7-38b8-4cf3-915a-6203aba793b6") + ) + (wire + (pts + (xy 157.48 35.56) (xy 158.75 35.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "804deee9-d734-449c-9276-a04c47547664") + ) + (wire + (pts + (xy 332.74 29.21) (xy 335.28 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "80a2446b-5ab7-4b71-8b56-2e265035d0f2") + ) + (wire + (pts + (xy 320.04 43.18) (xy 320.04 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "81f35a6b-d517-4226-871f-738fbc49ef3c") + ) + (wire + (pts + (xy 120.65 105.41) (xy 109.22 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8274b8f6-e44b-4406-bbd0-b3704d3191f6") + ) + (wire + (pts + (xy 168.91 38.1) (xy 173.99 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "82a11718-5892-451b-aef4-04bb740ef424") + ) + (wire + (pts + (xy 128.27 43.18) (xy 128.27 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "82acb556-794f-4743-b976-05b294af999f") + ) + (wire + (pts + (xy 104.14 35.56) (xy 104.14 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "82fe7529-5477-4ae4-9ec8-6a4aef086972") + ) + (wire + (pts + (xy 290.83 209.55) (xy 290.83 210.82) + ) + (stroke + (width 0) + (type default) + ) + (uuid "83b162f1-ee4e-4494-a0ac-afa1cf4238e5") + ) + (wire + (pts + (xy 394.97 31.75) (xy 394.97 34.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "840a49e3-c508-4347-bfe1-e0f51dbbe1f2") + ) + (wire + (pts + (xy 405.13 55.88) (xy 406.4 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "843ca707-403e-4810-9b17-50facd30a714") + ) + (wire + (pts + (xy 255.27 26.67) (xy 255.27 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "847dd254-d6b7-45e9-8bd6-ec43b823ae18") + ) + (wire + (pts + (xy 127 24.13) (xy 127 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8480510e-cfaa-4ce7-92a3-cbed03fb5adf") + ) + (wire + (pts + (xy 132.08 73.66) (xy 132.08 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8557e9ce-3aef-4c28-93a0-9d1e85a0886f") + ) + (wire + (pts + (xy 104.14 124.46) (xy 109.22 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "858de453-7993-4f0f-85f1-026f4cbc9faf") + ) + (wire + (pts + (xy 77.47 245.11) (xy 53.34 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8654c03b-86be-4989-9a44-1322f0ef481e") + ) + (wire + (pts + (xy 297.18 162.56) (xy 302.26 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "86701196-bc9a-412f-bdba-29a83a7fe60b") + ) + (wire + (pts + (xy 406.4 55.88) (xy 406.4 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "86a9e6e3-f118-431d-9a9d-7490d6935a8e") + ) + (wire + (pts + (xy 153.67 66.04) (xy 153.67 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "86b321da-9aa1-40e9-bee9-1a810805896c") + ) + (wire + (pts + (xy 104.14 104.14) (xy 104.14 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "870e4b4e-2c9d-497a-8b7b-dc9eec87bb81") + ) + (wire + (pts + (xy 327.66 29.21) (xy 332.74 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "871b2a12-376b-4fed-90a6-8bddaf76c77b") + ) + (wire + (pts + (xy 266.7 91.44) (xy 266.7 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "871b6bf0-23ef-4986-83c9-f2277e57bc47") + ) + (wire + (pts + (xy 317.5 58.42) (xy 318.77 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8782488a-760c-45b9-a2f7-e27c9cd3a0ab") + ) + (wire + (pts + (xy 157.48 44.45) (xy 158.75 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "87ca18a4-bd81-4e23-8ec2-94ba045115e0") + ) + (wire + (pts + (xy 266.7 31.75) (xy 266.7 35.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "87fdb011-00df-41ab-b423-6ba843c94004") + ) + (wire + (pts + (xy 350.52 200.66) (xy 344.17 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8835146d-87fc-41ab-b1e6-bde9c5854ffe") + ) + (wire + (pts + (xy 166.37 129.54) (xy 173.99 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8897c6d4-970e-49e0-9209-a4322f3c42af") + ) + (wire + (pts + (xy 350.52 181.61) (xy 350.52 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "89589d0c-2410-41e1-9ff7-cb070f166721") + ) + (wire + (pts + (xy 104.14 96.52) (xy 104.14 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8994c977-5b49-4ce3-96da-bebe1d2e06ba") + ) + (wire + (pts + (xy 119.38 54.61) (xy 119.38 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "89b53363-c76d-4fe0-9999-e65394b0877b") + ) + (wire + (pts + (xy 133.35 138.43) (xy 132.08 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8a5368ae-5f8e-4e48-83c9-25be541a3fef") + ) + (wire + (pts + (xy 157.48 74.93) (xy 158.75 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8aed0df2-a474-4756-b7e7-94f8d33504fd") + ) + (wire + (pts + (xy 128.27 190.5) (xy 127 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8b50aee4-8961-4b26-993c-33b55d0a3fec") + ) + (wire + (pts + (xy 68.58 127) (xy 67.31 127) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8b7d80f9-67d7-4f99-97ae-fd53bc55abbe") + ) + (wire + (pts + (xy 327.66 29.21) (xy 326.39 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8b9fc1a8-041e-4789-a6c0-19d27aa8a4c4") + ) + (wire + (pts + (xy 158.75 170.18) (xy 158.75 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c01b493-fc19-43c6-ade7-df421ffb9ed5") + ) + (wire + (pts + (xy 104.14 157.48) (xy 109.22 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c08da68-e1b1-4b30-8a9e-50f065691f46") + ) + (wire + (pts + (xy 195.58 193.04) (xy 195.58 196.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c38aa83-fac8-4fb9-bca0-9f5a4f81c488") + ) + (wire + (pts + (xy 186.69 203.2) (xy 186.69 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c726500-2e8c-4906-930a-5cfb3c553e62") + ) + (wire + (pts + (xy 326.39 162.56) (xy 326.39 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c7f9cac-8832-4cbf-9d44-05920b0377a9") + ) + (wire + (pts + (xy 144.78 151.13) (xy 144.78 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8cfb4a6a-6d09-466f-8bf4-43e166b70b51") + ) + (wire + (pts + (xy 186.69 73.66) (xy 186.69 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8d0fd2be-011a-44e8-bf24-c354b8bb4e0d") + ) + (wire + (pts + (xy 317.5 88.9) (xy 318.77 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8d1d5661-64e4-4210-b993-add84015efe7") + ) + (wire + (pts + (xy 308.61 93.98) (xy 308.61 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8dc779e8-d174-40e9-aecf-83ac8801e9df") + ) + (wire + (pts + (xy 76.2 43.18) (xy 76.2 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8e60b564-6e54-453f-b03b-71f61d377b94") + ) + (wire + (pts + (xy 68.58 193.04) (xy 67.31 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8e63400c-d37f-43d5-8a00-a5a6b7b74565") + ) + (wire + (pts + (xy 12.7 193.04) (xy 16.51 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8e799ebc-1a0b-4046-b2a8-ecfe44385c3e") + ) + (wire + (pts + (xy 104.14 203.2) (xy 104.14 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8ea8995a-9dcc-4672-ae63-95d0d8116c1f") + ) + (wire + (pts + (xy 157.48 162.56) (xy 158.75 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8f7d9a6a-dfa4-4f88-ba98-d855e85db079") + ) + (wire + (pts + (xy 153.67 203.2) (xy 153.67 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8f8f9d7f-45b4-47ac-a0df-e1b5386d0607") + ) + (wire + (pts + (xy 76.2 171.45) (xy 104.14 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "905790ed-0312-4c53-b9e1-3ec858ce6d84") + ) + (wire + (pts + (xy 195.58 160.02) (xy 195.58 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "909b238a-44d1-479b-ab4b-514c398a770b") + ) + (wire + (pts + (xy 332.74 58.42) (xy 335.28 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "90aaecbf-a6c1-4b51-a3cc-7b12d74cdad4") + ) + (wire + (pts + (xy 168.91 157.48) (xy 173.99 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9138ce9a-ab64-437c-b355-bb395b29b076") + ) + (wire + (pts + (xy 88.9 91.44) (xy 96.52 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "92fa210a-3742-4388-946f-7cc43ebf0022") + ) + (wire + (pts + (xy 406.4 146.05) (xy 212.09 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "930f8391-d429-4ceb-aa9b-7225c1611d9d") + ) + (wire + (pts + (xy 153.67 124.46) (xy 158.75 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "93600000-dbee-4122-9d7e-dd22af0695c9") + ) + (wire + (pts + (xy 158.75 91.44) (xy 161.29 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "939ec537-74e5-476d-988e-37a642822f91") + ) + (wire + (pts + (xy 212.09 187.96) (xy 212.09 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "93b5a317-e16f-4aaf-819e-9f8ffcc6bfd7") + ) + (wire + (pts + (xy 387.35 245.11) (xy 389.89 245.11) + ) + (stroke + (width 0) + (type default) + ) + (uuid "942b3b68-7437-484b-bfe3-5a6ca780a84c") + ) + (wire + (pts + (xy 393.7 26.67) (xy 397.51 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9497863c-b7d1-44e4-b16e-88655b123665") + ) + (wire + (pts + (xy 67.31 93.98) (xy 67.31 97.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "955273e5-58c7-481b-88da-39729365c4b2") + ) + (wire + (pts + (xy 297.18 175.26) (xy 297.18 177.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "95b620ac-fbb9-4700-b083-83d9d171d66a") + ) + (wire + (pts + (xy 288.29 201.93) (xy 290.83 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "95c9ae1c-45e3-4161-9730-b3a72471ba96") + ) + (wire + (pts + (xy 353.06 43.18) (xy 332.74 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "95f85d8a-1f4e-4e3f-bc1f-22c10c6e381c") + ) + (wire + (pts + (xy 344.17 82.55) (xy 344.17 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "95f8d69a-35cd-4d65-987d-1c1de028da27") + ) + (wire + (pts + (xy 109.22 44.45) (xy 120.65 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "96077e41-3b9e-46ef-9d64-f9c0b2df8640") + ) + (wire + (pts + (xy 365.76 201.93) (xy 364.49 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "960bf62d-c98b-47c8-bb82-0f8d7fab0564") + ) + (wire + (pts + (xy 153.67 204.47) (xy 158.75 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "96a40230-2f17-4774-ac3e-ab1cbd72d24b") + ) + (wire + (pts + (xy 194.31 187.96) (xy 200.66 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "96b9fb51-a8c1-48f1-a795-3b0d535a5723") + ) + (wire + (pts + (xy 274.32 262.89) (xy 279.4 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "974f2b99-03d3-468e-97ab-5ca59c93ea87") + ) + (wire + (pts + (xy 353.06 88.9) (xy 358.14 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "978e4093-a98a-4735-b592-c58ae88d9549") + ) + (wire + (pts + (xy 308.61 34.29) (xy 308.61 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "978f5807-f879-4a7a-96f4-e7f659efeff2") + ) + (wire + (pts + (xy 303.53 101.6) (xy 303.53 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9841d429-bc98-41f9-a614-e13adb044f85") + ) + (wire + (pts + (xy 68.58 33.02) (xy 67.31 33.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "999c44dd-1c7a-408f-a753-8d7b195fae22") + ) + (wire + (pts + (xy 308.61 72.39) (xy 308.61 71.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "99ff5c4b-ddaf-4393-ae30-48f5f7ef5e0e") + ) + (wire + (pts + (xy 308.61 213.36) (xy 295.91 213.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9a31e0c8-2bd4-4da8-aea3-5a39a80f5847") + ) + (wire + (pts + (xy 167.64 224.79) (xy 167.64 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9a5c20d6-ed3a-435b-ac3d-c2b419208534") + ) + (wire + (pts + (xy 257.81 262.89) (xy 260.35 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9af8e77f-b056-49bc-8a64-527b59e751b5") + ) + (wire + (pts + (xy 264.16 189.23) (xy 267.97 189.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9b55b8ff-fab5-4678-b2d1-163007eb8537") + ) + (wire + (pts + (xy 295.91 213.36) (xy 295.91 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9b6e95e2-08bd-41f8-b7bd-d596d64e1478") + ) + (wire + (pts + (xy 119.38 85.09) (xy 119.38 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9b6f5219-d695-4235-9cd3-71d2f1937920") + ) + (wire + (pts + (xy 60.96 242.57) (xy 105.41 242.57) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9bbc7ddc-b5bc-4766-b1d3-f16ad51d99a1") + ) + (wire + (pts + (xy 57.15 58.42) (xy 53.34 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9c38eee9-531f-414a-a4ff-2c4019fd1402") + ) + (wire + (pts + (xy 118.11 266.7) (xy 124.46 266.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9dde27ef-d46f-4ae7-8442-97233cd8bc3f") + ) + (wire + (pts + (xy 326.39 22.86) (xy 326.39 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9ddf2e48-2c55-4b86-9171-50e86e8faaeb") + ) + (wire + (pts + (xy 308.61 58.42) (xy 309.88 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9e0de8c9-9fc2-4eb2-bb89-f0fbbad1420b") + ) + (wire + (pts + (xy 405.13 26.67) (xy 406.4 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9e682906-d407-4a63-81b5-5dda5a664b83") + ) + (wire + (pts + (xy 167.64 238.76) (xy 167.64 252.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9e8d8469-dafd-4f6c-9470-40d179cb2d7d") + ) + (wire + (pts + (xy 76.2 203.2) (xy 76.2 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f243148-e71e-41c7-a96b-dd11c857af2c") + ) + (wire + (pts + (xy 327.66 58.42) (xy 326.39 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f741997-06bb-4d00-9ccd-f3323433c857") + ) + (wire + (pts + (xy 120.65 224.79) (xy 120.65 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f94f234-c7f3-4c78-903c-fd5b40e214b2") + ) + (wire + (pts + (xy 128.27 124.46) (xy 133.35 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9fd870f4-1cc9-4212-892d-66a24f1f2d86") + ) + (wire + (pts + (xy 365.76 181.61) (xy 364.49 181.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a01d0bb2-7164-456e-bbad-d74a47b2781c") + ) + (wire + (pts + (xy 157.48 104.14) (xy 158.75 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a0a7ac1c-6eb1-45ac-b20d-af6d90e618e0") + ) + (wire + (pts + (xy 109.22 35.56) (xy 109.22 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a14b8c87-a4d6-42c3-8dd1-5d5a0ebc7bda") + ) + (wire + (pts + (xy 365.76 200.66) (xy 365.76 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a17553d9-989e-4dfb-967c-1d0778d6c648") + ) + (wire + (pts + (xy 168.91 124.46) (xy 173.99 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a1ea0b5f-a2a9-4644-9845-fbe168c9635e") + ) + (wire + (pts + (xy 88.9 157.48) (xy 96.52 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a21b2cf7-e5a8-48bc-8e61-05d3f7b6e1b9") + ) + (wire + (pts + (xy 327.66 102.87) (xy 320.04 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a2a7b8d1-bbfb-443c-b067-924962a2d582") + ) + (wire + (pts + (xy 144.78 85.09) (xy 144.78 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a2b8644a-860e-4937-808f-8d0733482775") + ) + (wire + (pts + (xy 158.75 35.56) (xy 158.75 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a33097b4-6607-40a6-8aa1-509e6fddc2bb") + ) + (wire + (pts + (xy 166.37 165.1) (xy 173.99 165.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a3689b7a-468f-4499-b4f1-c426a07452bd") + ) + (wire + (pts + (xy 133.35 137.16) (xy 133.35 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a3cef1b9-bc99-41df-958d-22148f678604") + ) + (wire + (pts + (xy 53.34 12.7) (xy 255.27 12.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a3e9546c-8202-40d4-a020-32d753d7077b") + ) + (wire + (pts + (xy 120.65 44.45) (xy 120.65 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a481e45f-1d9f-445b-bab6-f523e8d089d9") + ) + (wire + (pts + (xy 358.14 34.29) (xy 358.14 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a49e9ff4-4234-43ab-89e5-2b888e651cb5") + ) + (wire + (pts + (xy 358.14 101.6) (xy 358.14 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a5305c7b-a958-49c5-ad82-0917f11a1ca3") + ) + (wire + (pts + (xy 331.47 72.39) (xy 332.74 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a55efa22-7c28-4ebe-8791-e223ee62ca3e") + ) + (wire + (pts + (xy 288.29 58.42) (xy 295.91 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a5a708f4-8c0d-4aa0-b783-a1f9fb0e3a95") + ) + (wire + (pts + (xy 153.67 73.66) (xy 153.67 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a6353919-92be-46e3-85e3-4623cafe5f2b") + ) + (wire + (pts + (xy 353.06 72.39) (xy 332.74 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a6662442-f978-43f7-ac09-99254680027a") + ) + (wire + (pts + (xy 132.08 96.52) (xy 133.35 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a6a30b8e-0da0-4a04-b65f-2f4d143bc150") + ) + (wire + (pts + (xy 132.08 170.18) (xy 133.35 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a7087f73-ce32-4602-ad4e-1b85c67990bf") + ) + (wire + (pts + (xy 120.65 171.45) (xy 109.22 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a72c7cb8-5b33-4a40-87bd-d2f1eaf32949") + ) + (wire + (pts + (xy 303.53 71.12) (xy 303.53 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a8f32861-b4e8-4aaa-9be7-54124f546f94") + ) + (wire + (pts + (xy 109.22 124.46) (xy 110.49 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a8fd7f73-0793-4435-b1b4-decb7a092482") + ) + (wire + (pts + (xy 356.87 34.29) (xy 358.14 34.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a937c218-82d4-457e-bc32-ec976887ccc9") + ) + (wire + (pts + (xy 133.35 195.58) (xy 133.35 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a9485a60-f149-4e45-bb23-b48c7352afc8") + ) + (wire + (pts + (xy 109.22 30.48) (xy 110.49 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a9dfd807-82b4-49af-8fec-d0b3635602b3") + ) + (wire + (pts + (xy 208.28 187.96) (xy 212.09 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a9e42290-4e47-426c-8518-2d20a4b0dbf5") + ) + (wire + (pts + (xy 144.78 270.51) (xy 144.78 264.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aa090460-8da6-4230-8535-0a3d42becebb") + ) + (wire + (pts + (xy 12.7 63.5) (xy 16.51 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aa83c5ba-0370-4a44-8890-57124f0164a2") + ) + (wire + (pts + (xy 267.97 91.44) (xy 266.7 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ab8377b9-1beb-441e-9520-9510c14de240") + ) + (wire + (pts + (xy 53.34 27.94) (xy 53.34 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ab8aae7f-b6e0-4e79-902b-5bc1fce33bd1") + ) + (wire + (pts + (xy 128.27 157.48) (xy 127 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ab9244d6-cc11-404b-8083-665c4e5dc61a") + ) + (wire + (pts + (xy 356.87 101.6) (xy 358.14 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ab972f17-cf01-4413-8f2e-21874488a549") + ) + (wire + (pts + (xy 255.27 12.7) (xy 255.27 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "abbb28a2-fd39-4c96-a1f8-bf300795ef79") + ) + (wire + (pts + (xy 368.3 29.21) (xy 373.38 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "abe49012-551c-4377-8075-f09c41484d12") + ) + (wire + (pts + (xy 166.37 132.08) (xy 173.99 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ac17461d-ba51-4022-9ca8-981e0c226d6e") + ) + (wire + (pts + (xy 300.99 224.79) (xy 300.99 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ace868be-9d37-4f8d-a54a-050dc2573407") + ) + (wire + (pts + (xy 331.47 43.18) (xy 332.74 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ad942112-a2a1-4fc5-ae0a-3b1dba43916d") + ) + (wire + (pts + (xy 119.38 24.13) (xy 119.38 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ae0b362f-9bd0-4e39-9048-ad562f85d335") + ) + (wire + (pts + (xy 124.46 261.62) (xy 120.65 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ae4feeb4-1207-4dce-abfc-1f2815d39274") + ) + (wire + (pts + (xy 158.75 195.58) (xy 158.75 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aed36059-c920-4311-a1da-782e3f49351b") + ) + (wire + (pts + (xy 300.99 209.55) (xy 300.99 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aef28547-d720-4728-9a97-1a161d14a5ba") + ) + (wire + (pts + (xy 331.47 95.25) (xy 331.47 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aefd08e7-0460-4f33-b6b8-a66ad9f668a8") + ) + (wire + (pts + (xy 368.3 36.83) (xy 373.38 36.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "af3a0003-85f6-4224-8f8e-4e1e7c7ebdc4") + ) + (wire + (pts + (xy 158.75 203.2) (xy 158.75 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "afa5d131-ba3f-4f7d-ae30-9f97e1e7b039") + ) + (wire + (pts + (xy 152.4 118.11) (xy 152.4 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "afdb64c7-6592-40da-a930-df3366c3037c") + ) + (wire + (pts + (xy 351.79 82.55) (xy 351.79 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "afe18a0c-e296-4f6c-9eec-b836df86f7b0") + ) + (wire + (pts + (xy 307.34 43.18) (xy 308.61 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b118a72c-60aa-4138-9494-aebea8c1fde6") + ) + (wire + (pts + (xy 327.66 58.42) (xy 332.74 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b281b849-a1af-47f6-9019-fb12575774c2") + ) + (wire + (pts + (xy 44.45 271.78) (xy 46.99 271.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b2a2f93c-b9fb-4dba-99dc-f7ac052b9c80") + ) + (wire + (pts + (xy 318.77 22.86) (xy 318.77 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b32074d3-a561-48f0-afc9-2d254504e33e") + ) + (wire + (pts + (xy 353.06 58.42) (xy 358.14 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b32f4966-b12d-4d09-9dd7-2a35e5a6e7bb") + ) + (wire + (pts + (xy 152.4 85.09) (xy 152.4 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b35c32c5-fcac-4cd2-a46f-8b0c2d6d7557") + ) + (wire + (pts + (xy 186.69 171.45) (xy 158.75 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b3beabed-c64f-43d4-ac56-2c27480c65af") + ) + (wire + (pts + (xy 157.48 203.2) (xy 158.75 203.2) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b41e5ef5-a093-4b44-8fe9-7e207e4dc073") + ) + (wire + (pts + (xy 353.06 43.18) (xy 356.87 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b41f189f-823a-415f-bf63-9e612b846b1f") + ) + (wire + (pts + (xy 158.75 190.5) (xy 161.29 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b478bbfe-f73e-402a-86e2-1af2337576d0") + ) + (wire + (pts + (xy 74.93 264.16) (xy 77.47 264.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b48251be-e17a-470c-b0eb-6b79198bce4a") + ) + (wire + (pts + (xy 128.27 104.14) (xy 128.27 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b4fbcc4f-9f9e-4ba0-8470-6ed8170e617d") + ) + (wire + (pts + (xy 118.11 124.46) (xy 119.38 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b5261094-d089-4bd0-abfe-34afc6181138") + ) + (wire + (pts + (xy 326.39 224.79) (xy 300.99 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b5b8cb7e-3dfd-46ab-b2a0-c85beaec3a2c") + ) + (wire + (pts + (xy 132.08 74.93) (xy 133.35 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b64f6c7b-fbd3-4b17-9e62-6dcba378e406") + ) + (wire + (pts + (xy 261.62 184.15) (xy 267.97 184.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b65ceaf9-020e-4dfb-86ac-77aa5c7fa756") + ) + (wire + (pts + (xy 128.27 162.56) (xy 128.27 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b6dd885f-7c6e-4471-885d-48aeaa829318") + ) + (wire + (pts + (xy 406.4 55.88) (xy 406.4 26.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b6e83b97-6535-4fdb-82aa-c9c7fc27a6f5") + ) + (wire + (pts + (xy 327.66 41.91) (xy 327.66 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b6f5d49b-aa65-4bae-9043-38edebd26dfb") + ) + (wire + (pts + (xy 157.48 73.66) (xy 157.48 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b77a4d7e-b944-459f-b431-9a5e26cf01f9") + ) + (wire + (pts + (xy 107.95 170.18) (xy 109.22 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b7f45742-dfbe-45ca-91aa-cf850eeda440") + ) + (wire + (pts + (xy 109.22 138.43) (xy 120.65 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b8d366be-12b0-403e-91cf-cd5dd0cbee4a") + ) + (wire + (pts + (xy 132.08 162.56) (xy 133.35 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b9aa4136-bdf0-47d3-b7c0-71096e038a54") + ) + (wire + (pts + (xy 166.37 162.56) (xy 173.99 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bc221c05-5809-4398-a69c-cd124ba3c497") + ) + (wire + (pts + (xy 128.27 44.45) (xy 120.65 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bcfa447f-01e7-4ea4-880d-fd783e74ff0d") + ) + (wire + (pts + (xy 356.87 71.12) (xy 358.14 71.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bda48b00-1ada-484b-8a67-b0ebfcce9fe3") + ) + (wire + (pts + (xy 109.22 195.58) (xy 109.22 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bdaece21-1f5c-49f2-a7ec-8be28530823f") + ) + (wire + (pts + (xy 266.7 60.96) (xy 266.7 64.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bdd61e3a-2ab9-4bfa-b577-967326bb556d") + ) + (wire + (pts + (xy 275.59 41.91) (xy 275.59 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "be2d2b27-1f30-429c-b58e-782e4100549d") + ) + (wire + (pts + (xy 317.5 29.21) (xy 318.77 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bf3b6b61-b823-48cb-95db-cfccb683dbd1") + ) + (wire + (pts + (xy 53.34 187.96) (xy 53.34 222.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bfd6a5ad-ade9-4fc5-826b-fef87b68d714") + ) + (wire + (pts + (xy 327.66 63.5) (xy 327.66 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c047db87-cee8-46e7-b90f-7ca04654329e") + ) + (wire + (pts + (xy 365.76 182.88) (xy 365.76 181.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c0c55cfa-74c7-40af-8fa6-3acf078678a5") + ) + (wire + (pts + (xy 356.87 63.5) (xy 358.14 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c11d7039-28e0-49ad-ad7e-038220910fe2") + ) + (wire + (pts + (xy 167.64 224.79) (xy 212.09 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c191be2b-3203-45c0-b6e0-540bf66909e3") + ) + (wire + (pts + (xy 158.75 138.43) (xy 157.48 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c1c67d50-10c3-44d8-82cb-e2eeb5f2f3d4") + ) + (wire + (pts + (xy 222.25 262.89) (xy 232.41 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c218d28a-ff94-48e5-adaf-472d78c22516") + ) + (wire + (pts + (xy 109.22 66.04) (xy 109.22 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c222a776-5eaf-44e4-8789-97ef8564f014") + ) + (wire + (pts + (xy 104.14 105.41) (xy 109.22 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c2365da3-e4b3-430f-826b-975a843ad638") + ) + (wire + (pts + (xy 331.47 102.87) (xy 332.74 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c29dd966-8af4-4461-a1d5-a0d89279d59e") + ) + (wire + (pts + (xy 368.3 34.29) (xy 373.38 34.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c2c86660-21e2-47e4-ab34-598149daaf22") + ) + (wire + (pts + (xy 153.67 270.51) (xy 157.48 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c310f088-bcd5-469c-a6fd-ad50baa4fd5b") + ) + (wire + (pts + (xy 320.04 72.39) (xy 320.04 73.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c345afa5-aee3-4d2d-b5fa-f827e0663d39") + ) + (wire + (pts + (xy 120.65 204.47) (xy 120.65 205.74) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4772298-420c-4cb8-8897-c2711e2213ce") + ) + (wire + (pts + (xy 104.14 43.18) (xy 104.14 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4cb0bb4-086c-46e1-aaae-d8f47c3b2f93") + ) + (wire + (pts + (xy 368.3 63.5) (xy 373.38 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4f3e3a1-86d4-4947-8180-8fae3c8c4baf") + ) + (wire + (pts + (xy 344.17 22.86) (xy 344.17 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c51254f1-e6c0-4cce-be47-92acab3e22c2") + ) + (wire + (pts + (xy 260.35 270.51) (xy 267.97 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c51bba16-774e-4c5e-846a-43078ce5737b") + ) + (wire + (pts + (xy 120.65 138.43) (xy 120.65 139.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c532f309-6580-4da2-a1ef-63ac86dd0835") + ) + (wire + (pts + (xy 275.59 72.39) (xy 303.53 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c5b0fd2a-49be-49e9-aab4-3526a1c39564") + ) + (wire + (pts + (xy 158.75 124.46) (xy 161.29 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c638ad1c-6920-4d0b-9e09-9b3d2f90755a") + ) + (wire + (pts + (xy 158.75 60.96) (xy 161.29 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c68e7e76-eb03-401f-8b49-51d179fef956") + ) + (wire + (pts + (xy 320.04 102.87) (xy 320.04 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c8845da5-186a-4461-aed5-6e6b0e24a0ea") + ) + (wire + (pts + (xy 356.87 201.93) (xy 350.52 201.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c8f19f8a-a377-4701-9b67-a427d14853ca") + ) + (wire + (pts + (xy 168.91 66.04) (xy 173.99 66.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c9291907-744e-4c6c-9bbb-2a6b0cc0df9e") + ) + (wire + (pts + (xy 393.7 91.44) (xy 394.97 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c98eed74-ef86-4fe4-8160-49d4f939af87") + ) + (wire + (pts + (xy 386.08 101.6) (xy 386.08 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c9ee3b40-0cd2-47f9-a99c-0ce6d8d30d05") + ) + (wire + (pts + (xy 290.83 210.82) (xy 290.83 215.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ca30a92d-5b69-48d6-a767-c0b7081a7e1b") + ) + (wire + (pts + (xy 109.22 91.44) (xy 110.49 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ca37b2c0-9326-470a-800f-cb9a931db359") + ) + (wire + (pts + (xy 153.67 43.18) (xy 153.67 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cac6fd61-e397-4a44-ad17-493e050cfc28") + ) + (wire + (pts + (xy 356.87 181.61) (xy 350.52 181.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cb6c89b1-f276-4a43-9249-61894bbd781b") + ) + (wire + (pts + (xy 127 151.13) (xy 127 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cb7ee9bb-acdd-47f0-bf3d-c401309747da") + ) + (wire + (pts + (xy 34.29 234.95) (xy 53.34 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ccb516ee-7e2c-4395-a70b-0b0d25e8f62c") + ) + (wire + (pts + (xy 194.31 93.98) (xy 195.58 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ccc623b6-8978-4a36-b08c-c0b19fe26383") + ) + (wire + (pts + (xy 194.31 160.02) (xy 195.58 160.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cee446b6-5a69-4463-94e8-32818cfa7680") + ) + (wire + (pts + (xy 133.35 30.48) (xy 135.89 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cf2396ce-e7fc-40a9-bdcc-75d381ffb851") + ) + (wire + (pts + (xy 153.67 137.16) (xy 153.67 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d0ccc08f-eafd-4aba-8305-70fae5cdbbf2") + ) + (wire + (pts + (xy 12.7 33.02) (xy 16.51 33.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d0d8080e-c873-49e8-bcab-85cd32863c9a") + ) + (wire + (pts + (xy 212.09 27.94) (xy 212.09 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d0f3117c-cba3-4890-af38-27531b241eea") + ) + (wire + (pts + (xy 168.91 68.58) (xy 173.99 68.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d12774ba-7e6b-49c1-8b7b-5f077d457b42") + ) + (wire + (pts + (xy 133.35 170.18) (xy 133.35 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d141f7f2-fff6-438d-9e0b-fb351307a975") + ) + (wire + (pts + (xy 365.76 182.88) (xy 368.3 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d172ffd9-92ba-478d-b3bb-49e5e0dc81e4") + ) + (wire + (pts + (xy 157.48 96.52) (xy 158.75 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d1bfbaf4-0156-4727-b5b1-f7e76d07f81d") + ) + (wire + (pts + (xy 358.14 88.9) (xy 360.68 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d215656a-5a3a-443a-a757-e473ecc4f84e") + ) + (wire + (pts + (xy 107.95 35.56) (xy 109.22 35.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d282ce34-6a73-400f-baba-dcf5d2682118") + ) + (wire + (pts + (xy 132.08 43.18) (xy 132.08 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d29c3baa-5b15-44ca-be72-f4dd42d986cf") + ) + (wire + (pts + (xy 144.78 118.11) (xy 144.78 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d3adb404-b92c-4359-8163-1676662e4ff6") + ) + (wire + (pts + (xy 303.53 102.87) (xy 308.61 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d487f0d3-b63a-4a26-85e9-f4e17b243228") + ) + (wire + (pts + (xy 194.31 63.5) (xy 195.58 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d527fb43-922f-4440-93ad-7a26a845c59f") + ) + (wire + (pts + (xy 275.59 101.6) (xy 275.59 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d53017c3-f4b3-4dde-9454-094d9424cfe1") + ) + (wire + (pts + (xy 195.58 63.5) (xy 195.58 69.85) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d53bec65-7c1b-4af2-a143-f4386f0f7bae") + ) + (wire + (pts + (xy 186.69 105.41) (xy 158.75 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d5af6987-55cc-4754-b25f-3859ee086c8e") + ) + (wire + (pts + (xy 353.06 41.91) (xy 353.06 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d5f17ad6-b91f-4a89-ba68-7ef6db682de8") + ) + (wire + (pts + (xy 158.75 44.45) (xy 186.69 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d614d969-87ac-4417-82f1-0925db0754d4") + ) + (wire + (pts + (xy 186.69 170.18) (xy 186.69 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d66a1de0-3fa8-4ee5-a732-cd95ad0571c2") + ) + (wire + (pts + (xy 53.34 121.92) (xy 53.34 154.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d699dc59-5601-4099-83ba-ca1c53567979") + ) + (wire + (pts + (xy 120.65 105.41) (xy 120.65 106.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d6e49fa4-07d5-4791-bbcb-3b061aad4d88") + ) + (wire + (pts + (xy 213.36 31.75) (xy 215.9 31.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d737014a-9810-44e2-a875-dcd340d1a7c4") + ) + (wire + (pts + (xy 327.66 34.29) (xy 327.66 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d7aee198-9451-4c7c-bef7-daf7e97181c6") + ) + (wire + (pts + (xy 128.27 105.41) (xy 133.35 105.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d7c726ed-056c-4d1b-9197-31e2de1271f3") + ) + (wire + (pts + (xy 104.14 162.56) (xy 104.14 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d85d5617-cee1-4d03-af58-a1965df9565c") + ) + (wire + (pts + (xy 307.34 34.29) (xy 308.61 34.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d86e441b-f4b7-4c91-9141-018224252791") + ) + (wire + (pts + (xy 153.67 138.43) (xy 157.48 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d8e2ea9c-5e38-447a-a762-339cd95aafaf") + ) + (wire + (pts + (xy 104.14 73.66) (xy 104.14 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d961d6cc-569a-4314-a7a2-2dc747866dec") + ) + (wire + (pts + (xy 297.18 162.56) (xy 297.18 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "da081548-885c-4204-9d87-d1b9462c00e5") + ) + (wire + (pts + (xy 60.96 236.22) (xy 60.96 242.57) + ) + (stroke + (width 0) + (type default) + ) + (uuid "da090def-2bd9-4b44-96ba-2be21d49a038") + ) + (wire + (pts + (xy 133.35 190.5) (xy 135.89 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "da94cb8b-b8b4-412b-8ad0-905c526213b8") + ) + (wire + (pts + (xy 342.9 88.9) (xy 344.17 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "daacc7b5-c28f-40c3-934a-f257facb710f") + ) + (wire + (pts + (xy 109.22 171.45) (xy 109.22 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "db6e7d71-d527-463a-b2fe-47f7769d8277") + ) + (wire + (pts + (xy 107.95 129.54) (xy 109.22 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc50fb6c-5068-4fd2-9d13-65cc384fcc58") + ) + (wire + (pts + (xy 144.78 252.73) (xy 144.78 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc910c3e-2f67-46e2-aada-1dd2079b036d") + ) + (wire + (pts + (xy 332.74 101.6) (xy 332.74 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc9a8626-d030-40c3-b307-29a2555c9e98") + ) + (wire + (pts + (xy 104.14 138.43) (xy 107.95 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc9bea4e-231a-436d-8948-9769744194f8") + ) + (wire + (pts + (xy 127 85.09) (xy 127 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dcb5aee1-d530-45a0-929b-e23a7efddcb6") + ) + (wire + (pts + (xy 303.53 43.18) (xy 307.34 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dcca93f9-d5bf-4efe-83a4-a41a9cb1ccf9") + ) + (wire + (pts + (xy 320.04 102.87) (xy 308.61 102.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd01f430-2c4d-4010-8fa8-14958edbd28e") + ) + (wire + (pts + (xy 68.58 63.5) (xy 67.31 63.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd235bd6-3e09-4ca0-b388-72cb82894a6c") + ) + (wire + (pts + (xy 386.08 71.12) (xy 386.08 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd92984e-01e3-4672-bae5-a77f1fbfa053") + ) + (wire + (pts + (xy 256.54 55.88) (xy 255.27 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dda7858e-051e-4bb4-b5bd-f441fe0d89a4") + ) + (wire + (pts + (xy 332.74 88.9) (xy 335.28 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "de604cd6-36b1-485a-9db9-02c839790c52") + ) + (wire + (pts + (xy 158.75 73.66) (xy 158.75 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "de8672d4-ac76-46d8-8981-e26e71c0b52f") + ) + (wire + (pts + (xy 107.95 43.18) (xy 107.95 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "deee5f43-178b-4e11-a278-ad7f9a8f2bb2") + ) + (wire + (pts + (xy 350.52 201.93) (xy 350.52 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "df96c854-a480-4d80-966e-090eae0cf3bc") + ) + (wire + (pts + (xy 153.67 91.44) (xy 158.75 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dfbc62e7-1685-401d-8345-da92796a4aa0") + ) + (wire + (pts + (xy 212.09 154.94) (xy 212.09 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dfd84416-1876-4777-a268-cc860bb6de6e") + ) + (wire + (pts + (xy 353.06 34.29) (xy 353.06 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e00233c9-896f-49f0-ac00-a4558fca317d") + ) + (wire + (pts + (xy 68.58 154.94) (xy 64.77 154.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e009fa00-3bc7-43f7-8099-9c7bd60de697") + ) + (wire + (pts + (xy 107.95 44.45) (xy 109.22 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e00bb7db-b400-4ae9-81cd-5b92a4caad9e") + ) + (wire + (pts + (xy 389.89 240.03) (xy 387.35 240.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e0832e88-135d-4283-97f1-6e34ee7af98c") + ) + (wire + (pts + (xy 153.67 195.58) (xy 153.67 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e0da4729-25df-4703-9441-73cb3ded4296") + ) + (wire + (pts + (xy 327.66 88.9) (xy 332.74 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e17a9a5b-d0d2-4745-815b-f6d702356462") + ) + (wire + (pts + (xy 133.35 96.52) (xy 133.35 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e1b1f515-b797-4cd7-851c-6de33702c22a") + ) + (wire + (pts + (xy 132.08 129.54) (xy 133.35 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e22cf6d9-4884-4af8-a0bf-e207de704cad") + ) + (wire + (pts + (xy 158.75 30.48) (xy 161.29 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e2356bc3-990b-4c02-91dd-17cb3d4159a7") + ) + (wire + (pts + (xy 157.48 170.18) (xy 158.75 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e262a4d1-b492-41cd-a5c8-ac63c78d971f") + ) + (wire + (pts + (xy 144.78 24.13) (xy 144.78 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e287b035-ae95-4841-8347-25e816c97722") + ) + (wire + (pts + (xy 88.9 60.96) (xy 96.52 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e29d8415-9ee3-481f-b570-aedaa6f2a28b") + ) + (wire + (pts + (xy 288.29 29.21) (xy 295.91 29.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e43bbb64-3ddd-4867-b508-8250c420ed57") + ) + (wire + (pts + (xy 353.06 93.98) (xy 353.06 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e48ea045-ecd3-47f0-8148-f8e4035cf461") + ) + (wire + (pts + (xy 308.61 102.87) (xy 308.61 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e4c337d7-04a9-4e0f-bb4f-0ff53ab951a8") + ) + (wire + (pts + (xy 308.61 63.5) (xy 308.61 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e4caf65b-2b99-4475-a083-7e1668d42ca6") + ) + (wire + (pts + (xy 331.47 35.56) (xy 331.47 34.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e4cbbeaa-0123-419d-8889-59fca95d4f1a") + ) + (wire + (pts + (xy 212.09 146.05) (xy 212.09 154.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e5b575c6-bce0-4640-9062-983a12473953") + ) + (wire + (pts + (xy 128.27 170.18) (xy 128.27 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e652183b-5811-4b30-a601-2263e7cc587d") + ) + (wire + (pts + (xy 133.35 157.48) (xy 135.89 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e6a70034-3ca8-47ea-b4a6-a1027ac6f7fa") + ) + (wire + (pts + (xy 109.22 190.5) (xy 110.49 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e712d8da-afab-4f5b-8ee2-f01a717889c6") + ) + (wire + (pts + (xy 386.08 43.18) (xy 358.14 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e7159eb4-f19f-4091-8f1c-9e3a71116ce5") + ) + (wire + (pts + (xy 332.74 41.91) (xy 332.74 43.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e7248c97-13c0-4bb1-b0e0-96ad7ef3a034") + ) + (wire + (pts + (xy 353.06 63.5) (xy 353.06 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e731dfa0-41c4-4512-b90d-63674e8532c4") + ) + (wire + (pts + (xy 332.74 71.12) (xy 332.74 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e78aff2f-7e14-4dfb-b7a9-9b932c83a3bf") + ) + (wire + (pts + (xy 331.47 34.29) (xy 332.74 34.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e79a54ce-b480-4c7b-9c9d-97aa6efa5ca4") + ) + (wire + (pts + (xy 153.67 35.56) (xy 153.67 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e7e88604-3cfe-4fd9-91ae-e34b88ce3936") + ) + (wire + (pts + (xy 133.35 60.96) (xy 135.89 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e88a0659-1f2a-4526-afcf-aa3cc1893042") + ) + (wire + (pts + (xy 158.75 138.43) (xy 186.69 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e8c99727-2d12-43e8-9f08-caca637b2983") + ) + (wire + (pts + (xy 326.39 52.07) (xy 326.39 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ea007331-faa3-41a4-a3dd-d75e530493f2") + ) + (wire + (pts + (xy 128.27 91.44) (xy 133.35 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ea3b1d33-a3eb-48c0-8d7a-a849ae1feaf5") + ) + (wire + (pts + (xy 143.51 190.5) (xy 144.78 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eaef49b8-7378-4577-8c6f-560225c8799a") + ) + (wire + (pts + (xy 194.31 154.94) (xy 200.66 154.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eb5fe744-f84a-417f-ba8f-02751bc3d342") + ) + (wire + (pts + (xy 104.14 137.16) (xy 104.14 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eb70632f-d791-4e20-b9a0-2d569c83abbd") + ) + (wire + (pts + (xy 212.09 58.42) (xy 212.09 88.9) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ebef4726-3c28-4a18-ac60-cc5ba4d473ed") + ) + (wire + (pts + (xy 168.91 91.44) (xy 173.99 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ebf64746-9c53-41bc-8e13-0856d876443e") + ) + (wire + (pts + (xy 353.06 71.12) (xy 353.06 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ec00dbab-590c-4520-8c42-3c6736ce3ff0") + ) + (wire + (pts + (xy 143.51 30.48) (xy 144.78 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ec3ddac4-05d2-4604-8279-6a614fffbf57") + ) + (wire + (pts + (xy 109.22 60.96) (xy 110.49 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ec7854a7-820a-475e-a06b-ab849b6029a1") + ) + (wire + (pts + (xy 267.97 31.75) (xy 266.7 31.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ede7a10c-af52-4bf8-84a3-d3091abfcc49") + ) + (wire + (pts + (xy 128.27 60.96) (xy 127 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee53f869-e200-4fcd-8326-204a2cdb72b8") + ) + (wire + (pts + (xy 53.34 255.27) (xy 54.61 255.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ef1c1028-4dd5-4b5b-a0a7-d42003643d15") + ) + (wire + (pts + (xy 88.9 190.5) (xy 96.52 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ef5f3a3d-9122-46f8-9920-53a5062dfdf2") + ) + (wire + (pts + (xy 157.48 43.18) (xy 157.48 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f044fa13-b9cc-4bc9-9191-44f0a790eeb1") + ) + (wire + (pts + (xy 279.4 262.89) (xy 287.02 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f0c4ad81-7ec5-496d-a526-63c199bbb323") + ) + (wire + (pts + (xy 60.96 228.6) (xy 60.96 227.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f1229856-937f-4c7e-b0aa-d23731476352") + ) + (wire + (pts + (xy 350.52 190.5) (xy 344.17 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f129c435-6c1e-4318-bfc4-5138e799c157") + ) + (wire + (pts + (xy 303.53 63.5) (xy 303.53 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f138e190-7dad-4d8d-ba2c-b01775fa063f") + ) + (wire + (pts + (xy 76.2 204.47) (xy 104.14 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f13c2016-b812-4363-9361-91862cc77a8c") + ) + (wire + (pts + (xy 54.61 271.78) (xy 54.61 266.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f14c1d66-f5a2-4f3d-bf81-5a5d31b0671d") + ) + (wire + (pts + (xy 290.83 223.52) (xy 290.83 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f2bba19f-18af-46ce-b177-dc798cf336cd") + ) + (wire + (pts + (xy 153.67 124.46) (xy 152.4 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f2c25e65-8e54-446d-9352-a5e25b8c432c") + ) + (wire + (pts + (xy 232.41 262.89) (xy 242.57 262.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f33c7404-00a6-461f-a6c5-0f51870c1bdc") + ) + (wire + (pts + (xy 120.65 171.45) (xy 120.65 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f43fdcd3-6afa-4c37-b3ff-2fe31259c36d") + ) + (wire + (pts + (xy 292.1 198.12) (xy 308.61 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f44d5e7b-67ff-42ba-9051-ef95ab9a459d") + ) + (wire + (pts + (xy 393.7 31.75) (xy 394.97 31.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f490754d-12e9-4cbf-9869-cf2eb2b5d4e7") + ) + (wire + (pts + (xy 88.9 224.79) (xy 96.52 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f4e3cdfb-7b0e-49f5-b1e6-90002b90d886") + ) + (wire + (pts + (xy 393.7 60.96) (xy 394.97 60.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f5125822-d3b7-466c-8610-3ae44e1ca4fc") + ) + (wire + (pts + (xy 186.69 204.47) (xy 158.75 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f520d277-3844-4855-894b-f06b4650d468") + ) + (wire + (pts + (xy 267.97 270.51) (xy 279.4 270.51) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f558dde1-f011-45d6-a876-2d4746525f80") + ) + (wire + (pts + (xy 168.91 195.58) (xy 173.99 195.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f5638b1e-237e-4cff-8683-c229b220aaeb") + ) + (wire + (pts + (xy 109.22 157.48) (xy 110.49 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f5b11aa4-28d5-47a7-a51d-1fd0f0aa1568") + ) + (wire + (pts + (xy 365.76 199.39) (xy 365.76 200.66) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f6112106-133d-41b1-aa0a-853286324842") + ) + (wire + (pts + (xy 308.61 43.18) (xy 308.61 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f6aabd56-d424-48a0-825e-daf647d23214") + ) + (wire + (pts + (xy 133.35 74.93) (xy 153.67 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f7f99557-bfe4-41fa-a29a-619db8457f3e") + ) + (wire + (pts + (xy 104.14 224.79) (xy 105.41 224.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f80b2dc0-d313-4eaf-8d37-567867e133bb") + ) + (wire + (pts + (xy 133.35 138.43) (xy 153.67 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f954c69e-8a51-42d3-89f5-9fde3bd90d29") + ) + (wire + (pts + (xy 261.62 186.69) (xy 267.97 186.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f9a88cf3-ab38-4aee-ae1e-98a341e7e2c6") + ) + (wire + (pts + (xy 133.35 124.46) (xy 135.89 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f9ca0db0-edf7-4ece-9c8e-06d167172fa3") + ) + (wire + (pts + (xy 364.49 199.39) (xy 365.76 199.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fa135eaf-247b-4d3e-8ea3-47f7b98a2225") + ) + (wire + (pts + (xy 104.14 91.44) (xy 109.22 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fa41e5bf-be4c-4ffe-9fc2-30b02063d5af") + ) + (wire + (pts + (xy 153.67 91.44) (xy 152.4 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fa547ea9-7c45-43b5-ab45-8daaeea5b1e5") + ) + (wire + (pts + (xy 394.97 60.96) (xy 394.97 64.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fa97231c-f1ad-4996-a9b3-6f9b6ba497d0") + ) + (wire + (pts + (xy 152.4 151.13) (xy 152.4 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fb2c183b-5a96-4d81-8780-7ccc1521d929") + ) + (wire + (pts + (xy 127 118.11) (xy 127 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fb480108-75a7-4fe0-8a47-8e418b5eae91") + ) + (wire + (pts + (xy 76.2 73.66) (xy 76.2 74.93) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fb59d010-e3e9-4b4f-bda3-e163c25677f5") + ) + (wire + (pts + (xy 68.58 27.94) (xy 64.77 27.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fba41acc-b750-4229-b719-eed9b0a32a00") + ) + (wire + (pts + (xy 88.9 124.46) (xy 96.52 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fc72cf68-e3cc-435e-9355-58f37c0b3dab") + ) + (wire + (pts + (xy 393.7 86.36) (xy 397.51 86.36) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd4f286d-de7d-4c59-8791-b4e4f059a348") + ) + (wire + (pts + (xy 118.11 30.48) (xy 119.38 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd86d81d-e325-45c7-b0d7-5c3b58c07548") + ) + (wire + (pts + (xy 353.06 72.39) (xy 358.14 72.39) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fe2139e2-37bd-4dcf-bef4-6efa19bb0ae3") + ) + (wire + (pts + (xy 153.67 157.48) (xy 152.4 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff02927d-4080-4842-af22-27efed9c2e70") + ) + (wire + (pts + (xy 107.95 96.52) (xy 109.22 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff0e52c3-30e6-4798-bfc7-886b57105658") + ) + (wire + (pts + (xy 104.14 170.18) (xy 104.14 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ffb16add-aade-4d5b-baee-9d95024b2723") + ) + (rectangle + (start 35.56 247.65) + (end 166.37 284.48) + (stroke + (width 0.5) + (type dash) + (color 194 0 0 1) + ) + (fill + (type none) + ) + (uuid 1dc2a9f5-9c3c-441f-85e8-7c727bcc2768) + ) + (circle + (center 167.64 234.95) + (radius 5.08) + (stroke + (width 0.5) + (type dot) + (color 194 0 0 1) + ) + (fill + (type none) + ) + (uuid 1e9152b3-6b27-4417-a404-201473d1e375) + ) + (circle + (center 34.29 241.3) + (radius 5.08) + (stroke + (width 0.5) + (type dot) + (color 194 0 0 1) + ) + (fill + (type none) + ) + (uuid 5cc10355-770f-463f-a77f-2f623ef8ae84) + ) + (text_box "BPF Band Select" + (exclude_from_sim no) + (at 256.54 153.67 0) + (size 135.89 76.2) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + (uuid "3adc5071-0d47-478c-9196-a2d6d15a9f30") + ) + (text_box "Power" + (exclude_from_sim no) + (at 196.85 255.27 0) + (size 101.6 27.94) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + (uuid "71c26b51-ecc5-4619-8280-19caf2320766") + ) + (text_box "Board mounting holes" + (exclude_from_sim no) + (at 383.54 233.68 0) + (size 22.86 17.78) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left top) + ) + (uuid "f1d6dd69-0318-4348-8d0c-20213ee5a508") + ) + (text "16T T37-0 9\"" + (exclude_from_sim no) + (at 334.264 105.918 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "01ce6250-cf42-4f76-9163-b1bb2614828e") + ) + (text "22T T37-1 12\"\n" + (exclude_from_sim no) + (at 123.698 52.324 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "04ac2df1-ae7e-488c-a7ae-48c2cb013f3b") + ) + (text "34T T37-0 18\"" + (exclude_from_sim no) + (at 105.664 77.724 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "062d2bb7-6cac-49f6-b02a-1d443c085404") + ) + (text "18T T37-10 10\"" + (exclude_from_sim no) + (at 124.206 149.606 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "0d096e1d-dc3f-4332-b4a0-3df0fb5637fc") + ) + (text "34T T37-0 18\"" + (exclude_from_sim no) + (at 132.588 47.244 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "0f5ce337-7693-4395-a0e4-df32d92fe810") + ) + (text "20m" + (exclude_from_sim no) + (at 59.69 85.09 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "1442a1c7-8713-4ce6-9447-ab9ef28aa01f") + ) + (text "June 1 2024: VK3PE Corrected wire length for L91 and L95\nJuly 30 2024: VK3PE Added some notes\nAugust 25 2024: KI3P Clarified instructions in red box" + (exclude_from_sim no) + (at 196.342 241.3 0) + (effects + (font + (size 3 3) + (color 255 42 21 1) + ) + (justify left) + ) + (uuid "15c44bdc-76a1-44fa-b74b-3c77635a1dae") + ) + (text "Added for backwards compatibility \nwith V010/V011 LPF boards and V012 \nsecond receiver operation. Only \npopulate if using V012 2nd receiver \nor with V010/V011 LPF boards." + (exclude_from_sim no) + (at 77.978 258.318 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + (color 194 0 0 1) + ) + (justify left bottom) + ) + (uuid "16c702d7-6153-4cde-a3dc-e7ff0e869afd") + ) + (text "22T T37-10 12\"" + (exclude_from_sim no) + (at 123.444 116.332 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "1974dbc3-069b-4593-9c92-b01c35a7ab48") + ) + (text "22T T37-0 12\"" + (exclude_from_sim no) + (at 308.61 105.664 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "27333a49-8b94-47ca-b762-1124a927651e") + ) + (text "26T T37-6 14\"" + (exclude_from_sim no) + (at 307.848 45.974 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "36e33092-95ca-4a1a-b06a-e287bd63d195") + ) + (text "17T T37-0 9\"" + (exclude_from_sim no) + (at 106.934 141.224 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "39fe27ba-30fa-4fab-9cc8-1150981532f0") + ) + (text "9T T37-0 5\"\n" + (exclude_from_sim no) + (at 109.474 207.772 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "3a3ef804-98b6-4103-8d9a-916e5363990b") + ) + (text "16T T37-0 9\"\n" + (exclude_from_sim no) + (at 131.064 108.458 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "3c305dec-eeea-4821-a213-e2ef116430ee") + ) + (text "6m" + (exclude_from_sim no) + (at 59.69 184.15 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "45894874-f2fb-47af-96c7-5a773bc2daa9") + ) + (text "14t FT37-61 14\"" + (exclude_from_sim no) + (at 323.088 19.812 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "46b149cd-d74e-48bc-b56e-42cf72f74d78") + ) + (text "ALL TOROIDS WOUND WITH #28 WIRE 0.32mm" + (exclude_from_sim no) + (at 294.64 121.666 0) + (effects + (font + (size 3 3) + (color 255 27 14 1) + ) + ) + (uuid "4c7e39fd-fc1b-493b-80d5-ffaff26b545b") + ) + (text "27T T37-6 14\"" + (exclude_from_sim no) + (at 123.952 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "5b76859b-42b9-4785-b9e2-b8ca06201421") + ) + (text "38T T37-10 20\"" + (exclude_from_sim no) + (at 322.834 80.772 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "65548de0-06b9-4372-9266-6e42cbf751db") + ) + (text "26T T37-0 14\"" + (exclude_from_sim no) + (at 134.366 77.978 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "68d74f4d-d171-49b7-9bef-ec1bd0990eaf") + ) + (text "13T T37-0 7\"" + (exclude_from_sim no) + (at 134.112 174.498 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "70cb1d48-da91-4e7b-9225-8c7205947b67") + ) + (text "13T T37-0 7\"" + (exclude_from_sim no) + (at 133.35 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "78dca7e5-3277-4dbb-86f0-fab9a49c41a6") + ) + (text "12/10m" + (exclude_from_sim no) + (at 57.15 151.13 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "85baf692-3338-4c82-a87f-b88da927a0d6") + ) + (text "17T T37-10 11\"" + (exclude_from_sim no) + (at 123.444 181.356 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "8d31bceb-06c2-4a6c-82aa-36e4d7f08e9e") + ) + (text "18T T37-10 10\"" + (exclude_from_sim no) + (at 306.832 75.438 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "8f7c50a6-2e39-4065-8a33-7ceef32ce292") + ) + (text "A2 A1 A0 ADDR\n0 0 0 0x20\n0 0 1 0x21\n0 1 0 0x22\n0 1 1 0x23\n1 0 0 0x24\n1 0 1 0x25\n1 1 0 0x26\n1 1 1 0x27" + (exclude_from_sim no) + (at 269.24 226.06 0) + (effects + (font + (face "Courier New") + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "98858c27-7182-4797-8e06-dbd77df0b0c4") + ) + (text "1.5nF+100p" + (exclude_from_sim no) + (at 321.056 101.6 0) + (effects + (font + (size 1.27 1.27) + (color 255 60 32 1) + ) + ) + (uuid "9a068f12-1f7b-4400-8b29-4b111668bc51") + ) + (text "RFCONTROL SIGNALS:\nRxTx: H=Tx, L=Rx" + (exclude_from_sim no) + (at 259.08 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ad2b74a4-a849-4c86-bc2f-688e28884bbf") + ) + (text "From BANDS \nconnector on Main" + (exclude_from_sim no) + (at 257.81 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "b1ab3246-c5e5-47ce-8668-62c8adf7b40f") + ) + (text "25T T37-1 13\"" + (exclude_from_sim no) + (at 323.342 50.546 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "b8a2cb38-78e8-4f9e-838b-7d30dfa33733") + ) + (text "ADDRESS SELECT" + (exclude_from_sim no) + (at 267.97 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "c02fc485-a891-44f2-ab34-0cee43ed319f") + ) + (text "21T T37-0 11\"\n" + (exclude_from_sim no) + (at 106.172 108.712 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "c039a6a9-04ea-4b77-843f-799fec957ee2") + ) + (text "30m" + (exclude_from_sim no) + (at 259.08 82.55 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "c41c2b12-a8cd-4b6c-b6ac-a2af4a22e70a") + ) + (text "16T T37-0 9\"" + (exclude_from_sim no) + (at 108.204 175.006 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "c4a4cb89-8734-4b1e-8afb-088b05d9908a") + ) + (text "17/15m" + (exclude_from_sim no) + (at 59.69 118.11 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "c57b8cf6-30a1-461e-aa29-a51d47dd2ba7") + ) + (text "Solder JP10 and JP11 closed\nif using V012 LPF boards and\nsingle receiver" + (exclude_from_sim no) + (at 130.81 237.49 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + (color 194 0 0 1) + ) + (justify left bottom) + ) + (uuid "c814ce7f-dc1c-46f4-a07b-9c239ce74a8f") + ) + (text "160m" + (exclude_from_sim no) + (at 259.08 22.86 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "ce74f367-813c-4b7e-82dd-c677299a9a16") + ) + (text "7T T37-0 4\"" + (exclude_from_sim no) + (at 134.62 207.518 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "d061bf6a-d207-4233-a44d-13184be8850f") + ) + (text "10T T37-2 6\"" + (exclude_from_sim no) + (at 332.994 75.438 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "d0899d03-f2c1-4254-a036-c069339c0939") + ) + (text "40m" + (exclude_from_sim no) + (at 59.69 54.61 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "e2021364-447f-43a6-9a32-3345dcea20a8") + ) + (text "26T T37-1 14\"" + (exclude_from_sim no) + (at 124.206 21.336 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "e5226392-313c-4fd6-85bd-d0b42d96c643") + ) + (text "20T T37-10 11\"" + (exclude_from_sim no) + (at 106.68 47.244 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "ebef6ca2-635f-4156-9181-aa59d6abeca0") + ) + (text "60m" + (exclude_from_sim no) + (at 259.08 52.07 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "f43a9414-554c-4d96-a9f6-cb9a5fddbd57") + ) + (text "Bypass" + (exclude_from_sim no) + (at 76.454 214.122 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "f447dec4-006d-4783-8f5b-a980900acfe1") + ) + (text "80m" + (exclude_from_sim no) + (at 59.69 24.13 0) + (effects + (font + (size 3 3) + (bold yes) + ) + (justify left bottom) + ) + (uuid "f4e6bbdc-2ce9-4846-80d3-d7d8bf68ebde") + ) + (text "20t T37-10 11\"" + (exclude_from_sim no) + (at 334.01 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "f83d9208-bcb3-4b55-8ed1-37a39b6ac0c4") + ) + (label "160m" + (at 344.17 177.8 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "0297f3b7-e31b-4bc1-bf53-ecb774b838e3") + ) + (label "RRF17" + (at 170.18 60.96 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "03e09ecf-73fa-4189-82c0-af57c4492aff") + ) + (label "RF56" + (at 153.67 190.5 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "044b1827-5e5d-4b9d-8670-38e12e002e55") + ) + (label "~{6m}" + (at 88.9 198.12 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "04a0d980-3863-44a2-88cc-5d0f0f694445") + ) + (label "RRF203" + (at 67.31 130.81 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "04daa615-c2ff-4c85-9ee5-ce32f1d796a6") + ) + (label "60m" + (at 344.17 175.26 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "04fdd947-5009-45e3-9d87-9557e5434c47") + ) + (label "RF93" + (at 153.67 270.51 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "05c1d74b-84f6-4686-a6a2-b96e6043a843") + ) + (label "30m" + (at 214.63 91.44 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "05d01b87-2488-4a96-ad52-19c5de937bc5") + ) + (label "12{slash}10m" + (at 11.43 160.02 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "05f1134b-62cf-4284-88a7-08178483ddee") + ) + (label "RF85" + (at 342.9 88.9 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "05fbf74e-2fb8-4354-9f79-3810461a3d91") + ) + (label "80m" + (at 344.17 180.34 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "06251911-b64b-4fc1-9720-859464354888") + ) + (label "~{40m}" + (at 88.9 68.58 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "09104b0b-3e4f-4f19-9b6e-013f0d587919") + ) + (label "RF44" + (at 130.81 157.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "0adf7705-0492-484e-baab-d415439b0476") + ) + (label "~{20m}" + (at 44.45 93.98 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "0ae857c7-e78f-4945-a33b-b3a100d2b124") + ) + (label "SDA2" + (at 303.53 175.26 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "0aff4d31-b06c-4fed-9358-e722a5d7d1c0") + ) + (label "~{80m}" + (at 88.9 38.1 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "0b9f0793-b6a2-438b-986c-28cd2c611a76") + ) + (label "RRF27" + (at 170.18 91.44 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "0d7108d6-2124-4199-af84-1d52d4f1fad6") + ) + (label "160m" + (at 288.29 34.29 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "0e5fcd37-72e9-4f7a-8205-4896555db040") + ) + (label "RRF87" + (at 369.57 88.9 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "0f58363b-a252-4b2b-b25f-c40403770e1b") + ) + (label "12{slash}10m" + (at 88.9 162.56 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "0f6fe827-b0a3-4d47-963d-c4e0a7ffb843") + ) + (label "160m" + (at 368.3 34.29 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "11bb4d8e-c683-46a8-bf57-07d731ccad50") + ) + (label "RF14" + (at 130.81 60.96 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "139abdba-f0dc-4f96-a6bb-a2b330a31f9d") + ) + (label "RRF48" + (at 196.85 154.94 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "15625098-0d01-4c29-8961-32a83eda21e4") + ) + (label "RF75" + (at 342.9 58.42 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "16cca897-9e60-4b11-ac83-0b5952fe6d2f") + ) + (label "RF91" + (at 157.48 252.73 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "16f96d14-8c8a-4d8f-9140-a6f78fbf8204") + ) + (label "60m" + (at 288.29 63.5 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "17a83cfb-dd9a-4538-901e-4ce51327d920") + ) + (label "RRF30" + (at 64.77 121.92 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "187d1a5d-8a80-424a-b8e2-de3f1cd3dd86") + ) + (label "~{30m}" + (at 288.29 96.52 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "1a72d460-96eb-4116-8dc6-4b9b9eaf199a") + ) + (label "12{slash}10m" + (at 166.37 162.56 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "1c8e3a6d-ae45-4e8b-acbf-3ecdb9da5d05") + ) + (label "RRF40" + (at 64.77 154.94 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "1d101742-04f4-4023-bd7b-aa7219a26347") + ) + (label "RF90" + (at 39.37 255.27 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "1ffd295b-db7b-4b8f-90b1-f3a6d65eedaf") + ) + (label "RRF207" + (at 195.58 67.31 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "23beae88-609b-4aee-88f0-1055baa44bf8") + ) + (label "RF65" + (at 342.9 29.21 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "263ddf0f-a351-406c-b742-9396bcbdf139") + ) + (label "RRF216" + (at 394.97 63.5 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "280892df-6a5c-4034-b7e4-703b1dc948c9") + ) + (label "~{NF}" + (at 44.45 227.33 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "2811f9fb-642b-4a1b-a5e6-98ef63ae1382") + ) + (label "17{slash}15m" + (at 166.37 129.54 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "2813ad66-fdfc-4043-ad6f-dac5683994c8") + ) + (label "~{17{slash}15m}" + (at 88.9 132.08 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "2a5d3e82-4ed8-4474-8337-bdc61cd40176") + ) + (label "RRF28" + (at 196.85 88.9 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "2c8eef5c-548e-4a33-8ecc-0103e29ecc53") + ) + (label "RRF217" + (at 394.97 95.25 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "2d242fce-4a17-4494-b07d-27edf2adaaf4") + ) + (label "~{6m}" + (at 44.45 193.04 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "2fec4bef-d983-48bc-8bf7-cdd36aae1eb4") + ) + (label "~{20m}" + (at 88.9 99.06 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "30115c94-0cdf-4476-b6eb-82986c122f46") + ) + (label "12{slash}10m" + (at 368.3 200.66 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "3028d095-c7ac-465d-aacc-714fd7bb9e2c") + ) + (label "80m" + (at 88.9 35.56 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "3087c65f-b463-4ed4-9d36-7d310a9e7312") + ) + (label "10m" + (at 344.17 200.66 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "31d800fa-e2ff-4455-b76a-b44e87bd92a9") + ) + (label "SCL2" + (at 261.62 186.69 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "32544368-9ce9-439e-90f6-df9d1f96df9a") + ) + (label "RF32" + (at 106.68 124.46 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "32d07d73-24f9-47e6-af9e-860c0a9741b0") + ) + (label "RRF57" + (at 170.18 190.5 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "35087ea4-ae2e-4fc5-8d3f-4f23bdbb7e13") + ) + (label "~{6m}" + (at 168.91 198.12 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "35f8bef5-7432-4717-b2f4-4377a10f0280") + ) + (label "RF12" + (at 106.68 60.96 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "363d84bf-bdf3-4673-aade-33518ccd228f") + ) + (label "RRF37" + (at 170.18 124.46 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "3714ff83-77c6-47c2-924e-3edcd46b142e") + ) + (label "6m" + (at 344.17 203.2 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "3755cd2f-bc09-4488-9248-cf442f450a7a") + ) + (label "RRF68" + (at 396.24 26.67 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "380e32d6-e280-4846-97db-cfa9456fb851") + ) + (label "40m" + (at 168.91 66.04 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "38859cdd-2d57-405e-b895-a11fa0f48ac3") + ) + (label "RF55" + (at 143.51 190.5 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "3959319c-9e32-4ad8-ad1b-f0522f85189b") + ) + (label "RRF11" + (at 91.44 60.96 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "39f1ef45-6dd7-4637-b506-d5d495a06444") + ) + (label "RF53" + (at 118.11 190.5 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "3b23186e-5db6-4172-b2bb-e360d4b766b0") + ) + (label "RRF88" + (at 396.24 86.36 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "3e8581bf-8d8e-4b99-bf77-a8ef98dfa0b9") + ) + (label "RRF202" + (at 67.31 96.52 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "3f7ea31c-596c-46bc-9fe8-88e895cd1ffa") + ) + (label "RF63" + (at 317.5 29.21 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "42495e41-b77a-479f-b24c-b52dcbe69a4c") + ) + (label "RF72" + (at 306.07 58.42 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "4385c308-c7e7-4d32-9811-96aed8277199") + ) + (label "RRF101" + (at 90.17 224.79 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "43a7d635-aa63-496e-853b-c033112540fd") + ) + (label "~{60m}" + (at 243.84 60.96 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "46b61d8e-5a25-4e99-8e65-c687a95aa3ff") + ) + (label "RRF70" + (at 264.16 55.88 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "47417a9a-19d6-418a-a00b-16ad803b4380") + ) + (label "RRF51" + (at 91.44 190.5 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "481d8306-da83-4d58-b829-2bdaf4dfd872") + ) + (label "160m" + (at 213.36 31.75 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "49299ca4-3ecc-46f6-828e-4fd7cf2d36d0") + ) + (label "RRF205" + (at 67.31 196.85 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "49d35fb9-dae2-4568-81fa-97c28d56acbb") + ) + (label "RF25" + (at 143.51 91.44 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "4b3f948b-10c6-4dcf-8353-937ff67c4bda") + ) + (label "RRF93" + (at 144.78 264.16 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "4b60698b-96bd-4c9d-8a2c-62538a47aefa") + ) + (label "RRF47" + (at 170.18 157.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "4cbb5ef9-da57-445c-813e-c9deb2ab9568") + ) + (label "RRF211" + (at 195.58 194.31 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "4f95d376-260a-403e-aa9b-7e4f566eaa40") + ) + (label "RF62" + (at 306.07 29.21 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "5003d6b2-b8e5-4b83-8d50-65bb75c5b495") + ) + (label "~{160m}" + (at 243.84 31.75 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "503409a0-b37a-429f-9791-83bfc63a0317") + ) + (label "80m" + (at 168.91 35.56 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "5145205d-f9bb-4672-a615-fe8f7bfea8d2") + ) + (label "RF82" + (at 306.07 88.9 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "539e26af-c145-41cd-8c8b-1f0f5fef6bdd") + ) + (label "RRF206" + (at 195.58 35.56 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "540e3e61-2e69-4a86-a36e-34edd769830f") + ) + (label "RF36" + (at 153.67 124.46 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "54c6bfb1-46a9-46a7-924b-d527eafac9d8") + ) + (label "RRF201" + (at 67.31 66.04 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "56be3450-7097-4f90-b529-95552612c626") + ) + (label "RRF10" + (at 64.77 58.42 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "5b74e8f0-7a80-4275-931d-8b1da0d04989") + ) + (label "RRF21" + (at 91.44 91.44 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "5d247f48-9c7f-4261-a659-fc4b5757ab93") + ) + (label "NF" + (at 88.9 229.87 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "5f112ef7-0c4f-4521-a61c-64023731dac6") + ) + (label "RRF80" + (at 264.16 86.36 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "5fa6fef2-77f8-4193-9796-a3fb36fefe8c") + ) + (label "RRF60" + (at 264.16 26.67 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "660f5c81-6cf6-4be6-b3d9-c230c594f68d") + ) + (label "~{20m}" + (at 168.91 99.06 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "67cc2e27-7ead-4ebe-982e-377f98eed3ca") + ) + (label "RF3" + (at 118.11 30.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "695fed60-42cf-4585-9d90-41f9041ccfba") + ) + (label "~{12{slash}10m}" + (at 166.37 165.1 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "6b7096fe-3726-4b21-b179-ab7f47a4717a") + ) + (label "RRF1" + (at 91.44 30.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "70f11327-b944-4615-a037-c016bce2765c") + ) + (label "RRF208" + (at 195.58 95.25 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "73944096-f35d-40ee-aee0-db309a31fb49") + ) + (label "~{60m}" + (at 288.29 66.04 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "73b70cb6-307d-4b02-aadc-f619aa504ee1") + ) + (label "~{80m}" + (at 168.91 38.1 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "745dc865-d2a5-4255-81b1-c89da43a6e3a") + ) + (label "RRF100" + (at 64.77 227.33 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "7582f25f-bede-4adb-9f0f-231d9d6d0503") + ) + (label "RF64" + (at 330.2 29.21 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "795d67a5-01a8-433f-8023-cd467b1909dd") + ) + (label "RF4" + (at 130.81 30.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "797dc674-3339-4d84-be4e-89cc8f7eb5c3") + ) + (label "RRF81" + (at 290.83 88.9 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "7b41067b-feb3-408b-abde-86b4720b771b") + ) + (label "NF" + (at 344.17 205.74 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "7b89128b-6ddd-4105-bbf3-0b329dc9fbed") + ) + (label "NF" + (at 12.7 227.33 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "7ff7d811-c2ab-4839-841f-2d69f2892973") + ) + (label "RF5" + (at 143.51 30.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "8171c527-6451-4271-8329-e9febd2d6ab4") + ) + (label "RF24" + (at 130.81 91.44 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "85418e36-09bc-4ea7-8954-7503d0eec20d") + ) + (label "RF35" + (at 143.51 124.46 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "89a6936f-52ae-445b-be8f-21e72f3b4fe8") + ) + (label "~{80m}" + (at 44.45 33.02 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "8a796ff5-9e24-4825-bae1-0d3c1a6c5a47") + ) + (label "RF83" + (at 317.5 88.9 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "8c01ec77-04d5-42f7-be59-9e801051ec83") + ) + (label "40m" + (at 88.9 66.04 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "8e705def-92e5-4bc6-8bda-418ec080fd05") + ) + (label "20m" + (at 168.91 96.52 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "8f69a5a4-48de-4343-81c5-4af7b4cb67e1") + ) + (label "~{60m}" + (at 368.3 66.04 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "906bf8f6-a6a5-414b-a5b5-2a2edd404dbd") + ) + (label "17{slash}15m" + (at 12.7 127 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "938badbb-d8b9-412b-a567-619e52bd2887") + ) + (label "RRF7" + (at 170.18 30.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "93c1ddf4-ac69-4568-921d-2ecf4a72f377") + ) + (label "40m" + (at 344.17 182.88 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "948cb2e1-7f3f-4be3-b145-8f84c35bf067") + ) + (label "RRF67" + (at 369.57 29.21 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "9539d491-9bcc-4c92-a918-63be4b1d829d") + ) + (label "RRF50" + (at 64.77 187.96 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "95922fc5-63c9-4bfd-8569-816dabe32943") + ) + (label "RF43" + (at 118.11 157.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "97591604-988f-43dc-b1ae-57112c68395a") + ) + (label "~{160m}" + (at 368.3 36.83 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "97af8236-1587-4f69-85dc-45b2d74cf335") + ) + (label "RXTX" + (at 86.36 269.24 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "9903f399-fab8-41db-8e69-3f62af4987a2") + ) + (label "RRF58" + (at 196.85 187.96 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "99e6c63d-7ccb-434a-88b0-4f655016954e") + ) + (label "20m" + (at 12.7 93.98 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "9b099cb2-8a8c-42dd-afe5-563ccb5e2d45") + ) + (label "RRF38" + (at 196.85 121.92 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "9c2bad9c-2e4c-47dc-8541-180f020426e5") + ) + (label "RRF209" + (at 195.58 129.54 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "9c7267b6-dffb-48e2-94e8-c5235a7e7054") + ) + (label "RF33" + (at 118.11 124.46 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "9cfa13e0-0229-4adb-97ee-47c6a211f1ab") + ) + (label "RF74" + (at 330.2 58.42 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "9ef53178-6701-4a92-9712-02f420f7ed00") + ) + (label "60m" + (at 214.63 60.96 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "9fb01a85-307c-4764-acf3-d49fc1c5f6e3") + ) + (label "RF6" + (at 153.67 30.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "a0b361dd-e5b4-47b3-88b1-6c864cbd2c25") + ) + (label "RRF0" + (at 64.77 27.94 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "a1e61942-4747-489b-8552-5f81b53f2c0d") + ) + (label "RRF212" + (at 266.7 34.29 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "a1f35b16-95ad-45c4-a299-660e1a783722") + ) + (label "~{17{slash}15m}" + (at 44.45 127 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a2e32024-60c5-47e1-b275-82d3caa3e567") + ) + (label "RRF215" + (at 394.97 33.02 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "a317bc68-0135-40fa-829e-341a74735401") + ) + (label "15m" + (at 344.17 193.04 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a32beffa-a910-4d5c-8c2a-c43e94ed091d") + ) + (label "17{slash}15m" + (at 88.9 129.54 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a37b2a54-b570-4cf1-8270-9a28abf60191") + ) + (label "~{NF}" + (at 88.9 232.41 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a48191de-bea7-434d-b845-7bb298fe2ace") + ) + (label "RF46" + (at 153.67 157.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "a4fdd286-0cb1-4baf-bcda-c1df4666dfc7") + ) + (label "6m" + (at 88.9 195.58 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a71db1c8-0c00-4ba4-9f39-749208491580") + ) + (label "~{RXTX}" + (at 77.47 271.78 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a7feba25-9415-4f01-82af-b8351dddaaec") + ) + (label "17{slash}15m" + (at 368.3 182.88 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "a8034fd8-2bd2-4ddc-8a27-6c73c4879706") + ) + (label "RF22" + (at 106.68 91.44 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "a9ab35d1-f897-4800-89cb-dccae37f3312") + ) + (label "RF34" + (at 130.81 124.46 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "a9fbbacc-ed2f-4e55-84dc-0e4ab48a112d") + ) + (label "RF42" + (at 106.68 157.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "aa2d3eec-4e19-4327-b941-35ea4695efdc") + ) + (label "RF86" + (at 353.06 88.9 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "adc200b8-93cc-4243-b261-41fab3a4034d") + ) + (label "RRF90" + (at 54.61 255.27 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "addee49a-4b5c-40fc-b93c-d1d14ae6695d") + ) + (label "12m" + (at 344.17 198.12 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "af4870e4-9099-44f6-a0a0-a5f08493e353") + ) + (label "40m" + (at 12.7 63.5 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "af49fc2f-e769-4c5f-afd9-f8851a911574") + ) + (label "RRF8" + (at 196.85 27.94 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "af9c7e29-f148-45d5-bedb-b0b054f1a494") + ) + (label "RF76" + (at 353.06 58.42 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "afd689c6-e1aa-4f15-a97e-e0e7237d91cf") + ) + (label "RF26" + (at 153.67 91.44 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "b0d75593-5178-4337-81e6-4043181344c4") + ) + (label "SCL2" + (at 302.26 177.8 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "b0f92526-81d9-4ee3-a105-cfcc5eee5b4f") + ) + (label "6m" + (at 168.91 195.58 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "b12a24fa-f75f-4690-8626-8991ac49309d") + ) + (label "RXTX" + (at 281.94 189.23 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "b32d089b-f4f7-48b9-8595-43623e5897c7") + ) + (label "RF23" + (at 118.11 91.44 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "b4c3be68-02bd-4680-a893-5662da583bf2") + ) + (label "~{12{slash}10m}" + (at 44.45 160.02 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "b569b63e-53c8-4e29-9f7b-cb7d67db4fab") + ) + (label "RRF213" + (at 266.7 63.5 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "b65f6729-48d6-4979-9645-ab5d0a468818") + ) + (label "RRF61" + (at 290.83 29.21 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "b745a12f-d8d2-434b-8f75-aa564025c45e") + ) + (label "30m" + (at 344.17 185.42 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "b931696b-7a9f-4d94-8e39-558612a611cb") + ) + (label "RFIN" + (at 53.34 176.53 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "b93979bc-66c9-4937-a1c9-ef986d2066a2") + ) + (label "RRF71" + (at 290.83 58.42 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "bb55b28e-21e7-4161-b87f-3b21091357a2") + ) + (label "RRF210" + (at 195.58 161.29 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "bcbe95ca-4950-4e48-82f2-757d8b7a613b") + ) + (label "SDA2" + (at 261.62 184.15 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "be8591a7-f1e3-423b-a367-50bdf83582e4") + ) + (label "20m" + (at 344.17 187.96 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "c049246d-e334-4991-ba62-1b778dfa0703") + ) + (label "80m" + (at 12.7 33.02 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "c097a925-6bb2-4347-8f77-0bb229bbfb90") + ) + (label "RF52" + (at 106.68 190.5 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "c1fe84ad-b8f7-4a2d-8933-37698fad4e65") + ) + (label "RF73" + (at 317.5 58.42 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "c289bdf7-e40a-4b2a-9f7d-a2d4d1b2fad6") + ) + (label "~{30m}" + (at 368.3 96.52 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "c53fa21a-1640-479f-a510-86fefd067a73") + ) + (label "RRF92" + (at 144.78 252.73 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "c59b250c-6466-4f3d-84b6-05295eeefdf3") + ) + (label "20m" + (at 88.9 96.52 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "c9698e6e-77e5-440f-8996-dac3b160b557") + ) + (label "17m" + (at 344.17 190.5 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "ca89dab9-09ed-4c03-bab5-343cac3df3c6") + ) + (label "30m" + (at 368.3 93.98 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "caea6a17-1327-4b4b-9855-ef409cc5089c") + ) + (label "~{RXTX}" + (at 119.38 269.24 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "cbff1649-53f5-42f6-a760-cf27587fcceb") + ) + (label "RF84" + (at 330.2 88.9 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "cc32819d-ba6f-47d6-b072-2eec7c8b0feb") + ) + (label "RF45" + (at 143.51 157.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "cdb52ebb-3430-4f78-a4cb-7e394a93cbee") + ) + (label "6m" + (at 12.7 193.04 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "d045f329-888f-43d3-ba21-0b254211c7c7") + ) + (label "RRF91" + (at 54.61 270.51 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "d247f8a1-f4d6-4609-aad5-8fb498fa38e1") + ) + (label "~{40m}" + (at 44.45 63.5 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "d2df90bf-3dd7-4729-9c58-52c31dc7ede4") + ) + (label "RRF41" + (at 91.44 157.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "d424f52d-6adb-4231-88f5-fd441eefa886") + ) + (label "~{17{slash}15m}" + (at 166.37 132.08 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "d4792042-6fad-4aaa-83de-123e4e10bfcf") + ) + (label "RF66" + (at 353.06 29.21 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "d6f60a6d-a93f-4501-806e-5193a6a2cf3c") + ) + (label "RF54" + (at 130.81 190.5 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "d74e98af-0604-423f-9a54-067d84e22fbd") + ) + (label "30m" + (at 288.29 93.98 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "d924bcd9-ce6b-4c06-8cdf-219e77f3f3bd") + ) + (label "RRF250" + (at 64.77 222.25 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "dad07d26-4a28-4671-9524-dd868891e808") + ) + (label "RF92" + (at 45.72 271.78 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "db4c82d1-1d14-4274-9e9e-bd9bc217c270") + ) + (label "RRF78" + (at 396.24 55.88 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "dc7f55f2-444a-49c4-aa4e-4bff0bee501b") + ) + (label "RRF20" + (at 64.77 88.9 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "e0c0c9d7-3201-43fd-b2a4-0c17ad90cd69") + ) + (label "RF16" + (at 153.67 60.96 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "e19a19a0-356f-4815-8b98-796dcc576152") + ) + (label "RRF77" + (at 369.57 58.42 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "e61891e9-122e-4a9a-b49a-0493f260e536") + ) + (label "~{12{slash}10m}" + (at 88.9 165.1 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "e78b2fa4-beab-4342-920f-edefa29443fb") + ) + (label "RRF200" + (at 67.31 35.56 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "e90691fd-9d43-4b1a-93ef-c3c442a52244") + ) + (label "~{40m}" + (at 168.91 68.58 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "ea848601-7a9d-4c6d-aa4b-e972b9b33599") + ) + (label "RFOUT" + (at 212.09 177.8 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "ec0d21c6-99a7-4162-8189-d8255f4f14d2") + ) + (label "~{160m}" + (at 288.29 36.83 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "ec4b6e44-c001-42de-8809-a581e1ba929a") + ) + (label "RRF214" + (at 266.7 93.98 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "ece8b32d-7ec0-4f0d-8610-49fc5d29428b") + ) + (label "RXTX" + (at 118.11 266.7 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "ef90f07d-871c-4338-9b11-d3393e3ccfa8") + ) + (label "RF2" + (at 106.68 30.48 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "f114ab23-fdbb-4ffe-b52c-7dadce9cf64f") + ) + (label "RF13" + (at 118.11 60.96 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "f2f79b3e-a579-423a-8cfb-b13cffd3a763") + ) + (label "RF15" + (at 143.51 60.96 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "f729b08e-2bc8-4931-91df-c19b8d034533") + ) + (label "RRF204" + (at 67.31 163.83 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "f92cbc75-4e06-44e6-bfac-7aa0acb5dfaf") + ) + (label "RRF18" + (at 195.58 58.42 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "f945dde7-bd35-4563-9b6f-81e96b0ac769") + ) + (label "~{30m}" + (at 243.84 91.44 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "faeabd2b-f8c1-4661-aef1-3d70f0d01468") + ) + (label "RRF31" + (at 91.44 124.46 0) + (fields_autoplaced yes) + (effects + (font + (size 0.8 0.8) + ) + (justify left bottom) + ) + (uuid "fee830e2-ba14-4289-baca-a64030e5805f") + ) + (label "60m" + (at 368.3 63.5 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + (bold yes) + ) + (justify left bottom) + ) + (uuid "ff0c757d-d3e0-4f4a-b553-0dcab2b5a92c") + ) + (symbol + (lib_id "power:+3V3") + (at 26.67 83.82 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "00cb6abc-b4d9-4ae0-ab10-22d116f82f22") + (property "Reference" "#PWR019" + (at 26.67 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 26.67 79.6869 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "953445e4-d4bf-47a1-9e2f-e68743b87537") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR019") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:IDC_2x5") + (at 273.05 184.15 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "00cde0dd-0315-4dda-be2a-d07fb3a69253") + (property "Reference" "J4" + (at 274.32 173.6557 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Bands" + (at 274.32 176.0799 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 273.05 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 273.05 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 273.05 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 273.05 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "A-2939" + (at 273.05 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "9" + (uuid "950cb65c-4eb6-4072-83de-d51e37bdf77f") + ) + (pin "5" + (uuid "56aa08bd-5040-4d5f-9da4-f910369d55d7") + ) + (pin "2" + (uuid "dfd30883-2ff8-4b85-80f2-654eadea94e1") + ) + (pin "4" + (uuid "af5529cc-7e6c-4e91-8c04-4da7241f456b") + ) + (pin "6" + (uuid "c9637990-9e33-4930-9598-be18862d5cde") + ) + (pin "10" + (uuid "08201e9b-ab6b-4070-95d0-0c0788d52399") + ) + (pin "7" + (uuid "36caa3bd-1d65-49a9-9da3-0f8a7bf5052b") + ) + (pin "3" + (uuid "5b11ece8-d33d-4a20-bfa4-915948d2d97a") + ) + (pin "1" + (uuid "53bd8dc1-1563-463e-b7e2-feb4d5801c09") + ) + (pin "8" + (uuid "27a132d4-6178-4bce-a053-6525c88689fb") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "J4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 26.67 203.2 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "01dfb6f2-7e2f-4f3d-8593-5796d333d122") + (property "Reference" "#PWR035" + (at 26.67 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 24.13 204.47 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fdac55f1-dedb-47c0-8c6d-86bb9174b8f8") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR035") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 320.04 44.45 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "022e9e96-fdd7-4769-a29a-33099c2b490a") + (property "Reference" "#PWR049" + (at 320.04 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 317.5 45.72 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 320.04 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 320.04 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 320.04 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "cbfb1148-ebdb-432d-b0e9-2bdc2ccaf031") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR049") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 106.68 269.24 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "027da0e5-1951-43d6-8471-66582231b223") + (property "Reference" "U37" + (at 107.95 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 111.76 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 106.68 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 106.68 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 106.68 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 106.68 269.24 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f44d1d41-582c-4f4e-949b-11a1355f3672") + ) + (pin "4" + (uuid "092e16e2-73de-472c-866b-a53e43f21d06") + ) + (pin "3" + (uuid "5b563841-d752-46a6-9db4-b61927319795") + ) + (pin "5" + (uuid "311352c9-e710-4adf-9755-3a30974bfc98") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U37") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 149.86 252.73 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "030690ee-7998-44a7-b008-a80ed9843685") + (property "Reference" "C8" + (at 149.86 259.0333 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 149.86 256.6091 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 153.67 253.6952 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 149.86 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 149.86 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 149.86 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8caedc56-d308-4ba8-97ba-c15a338b9045") + ) + (pin "1" + (uuid "340640ee-d8e5-47a1-ad92-e6fc95289ccb") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 31.75 93.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "03290803-d8b9-4618-ab43-b03802135c40") + (property "Reference" "U8" + (at 33.02 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 36.83 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 31.75 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 31.75 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 31.75 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 31.75 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "da488ece-789e-4ba6-85b1-dfcdcd710fd4") + ) + (pin "4" + (uuid "9bc4e42e-faf9-476e-a94b-39d98a64eff6") + ) + (pin "3" + (uuid "5776f11b-b420-403e-89b2-a66223f8b704") + ) + (pin "5" + (uuid "57ffc76a-47fa-4008-ba30-3a72df56a117") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 394.97 38.1 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "03ab32ec-525e-48af-b239-f6ffe46f1a9e") + (property "Reference" "C24" + (at 401.2733 38.1 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 398.8491 38.1 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 395.9352 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 394.97 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 394.97 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 394.97 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "fee20db7-5bbc-45b5-ad9a-9f3351d0c394") + ) + (pin "1" + (uuid "f6704de9-f317-4271-96c5-58cb887375ea") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 24.13 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "053d8999-0321-4874-990b-35d8fabb9569") + (property "Reference" "L30" + (at 124.4021 22.8628 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 121.9779 22.8628 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 123.19 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "168dd8f2-d79e-4ff2-ba36-ace03fe8c6b8") + ) + (pin "1" + (uuid "5cbbb56c-7cba-4c5b-9f32-ca41f00cb40d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L30") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 327.66 38.1 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0554801b-917f-471a-a171-aac7cdbc18dc") + (property "Reference" "C94" + (at 324.739 36.8879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "5.7 nF" + (at 324.739 39.3121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 328.6252 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 327.66 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 327.66 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 327.66 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "76d15ea2-b026-40d5-a00e-975aa212281b") + ) + (pin "1" + (uuid "f169d150-de73-43a4-bc1c-bef720a26fd6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C94") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 100.33 224.79 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "05f9464f-37c2-4c30-a912-3667590cd082") + (property "Reference" "C701" + (at 100.33 218.4867 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 100.33 220.9109 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 104.14 223.8248 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 100.33 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 100.33 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 100.33 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a4cc2e47-b80f-4bc8-945a-ca7b1f435b86") + ) + (pin "1" + (uuid "65a062b3-dcdd-442c-8b0a-0e49da88aff8") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C701") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 165.1 190.5 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0667bcef-f9b3-4e58-8e85-63f943de44dc") + (property "Reference" "C607" + (at 165.1 184.1967 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 165.1 186.6209 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 168.91 189.5348 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 165.1 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 165.1 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3773cbfa-4679-4781-bb10-7b482336b502") + ) + (pin "1" + (uuid "4ef8d4b4-2884-4fcf-b92a-4c6ff0e87f9b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C607") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 264.16 189.23 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "06b21d06-9b25-4cc0-9059-50540fbe3115") + (property "Reference" "#PWR03" + (at 264.16 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 261.62 190.5 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 264.16 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 264.16 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 264.16 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3a718805-ec50-4bc5-a06f-67c04bdac211") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR03") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 31.75 193.04 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "07af3215-c59f-4eaf-a940-cbb727589073") + (property "Reference" "U17" + (at 33.02 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 36.83 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 31.75 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 31.75 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 31.75 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 31.75 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "80e23957-6553-4d09-b454-633dcefd54ec") + ) + (pin "4" + (uuid "7864ba3c-a699-4a0a-a2b4-0bcf1ac4683a") + ) + (pin "3" + (uuid "6c8337d0-fb43-4051-b92d-58f86e00f8b4") + ) + (pin "5" + (uuid "c4993544-e778-4d24-87bc-dbe713c37d94") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 226.06 50.8 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0820f204-70e8-4a4a-96b1-a4afca5cc8c2") + (property "Reference" "#PWR051" + (at 226.06 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 226.06 46.6669 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 226.06 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 226.06 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9e60deaa-5962-419e-88a2-9087fe869b93") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR051") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 132.08 199.39 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "08eaf519-f18f-4c2a-af2a-200f018a084e") + (property "Reference" "L19" + (at 130.8128 198.1779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 130.8128 200.6021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 132.08 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 132.08 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ed7f2af9-ba76-4f8f-b23b-cf09fd322263") + ) + (pin "1" + (uuid "62793916-ed38-4fbd-acde-34f79e52c00a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 26.67 116.84 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "091534a8-8ce7-43d8-aa16-8f3e67b672e3") + (property "Reference" "#PWR024" + (at 26.67 120.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 26.67 112.7069 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "bb0592dc-1fc9-40cb-be18-2c2e35a52c1e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR024") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 22.86 255.27 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "09242ad9-869f-49fe-aa92-4c769a17bc66") + (property "Reference" "J2" + (at 24.13 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FROM EXCITE" + (at 29.21 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 22.86 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 22.86 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 22.86 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 22.86 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 22.86 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d1ec9935-bd12-4e48-9d03-4e5607d93389") + ) + (pin "2" + (uuid "479f78e4-17a0-4892-ac88-37dfa63510a6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "J2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 67.31 137.16 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0936f7c5-590b-4484-9279-17be9266727a") + (property "Reference" "C12" + (at 61.0067 137.16 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 63.4309 137.16 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 66.3448 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 67.31 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 67.31 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4ea1465a-c511-4814-97e2-4bcf861c7e92") + ) + (pin "1" + (uuid "004066b1-e906-4c9e-b1b8-72a7bad1faf0") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 151.13 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "0a0451a2-04a8-4248-a2f7-a4490749bed2") + (property "Reference" "L39" + (at 149.8021 149.8628 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 147.3779 149.8628 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 148.59 151.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 151.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 151.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ffc9a61b-d7fb-499d-a020-4239381001b4") + ) + (pin "1" + (uuid "a7158ec5-1f88-4904-8898-93a7d67b8568") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L39") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 195.58 135.89 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0a865345-828f-4ad0-886b-85b026902f83") + (property "Reference" "C18" + (at 201.8833 135.89 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 199.4591 135.89 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 196.5452 132.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 195.58 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 195.58 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "086e0726-7c0b-4770-b780-b3f8c3bc503e") + ) + (pin "1" + (uuid "4316bad4-1dd2-4270-af49-bd52c76ca9fc") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 133.35 199.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0bfc0a98-c629-4d47-9d81-a1df73005772") + (property "Reference" "L603" + (at 134.62 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "24 nH" + (at 134.62 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 133.35 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 133.35 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 133.35 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "28e86a1f-6646-4546-afa7-ca709002d64c") + ) + (pin "2" + (uuid "183023bb-71ea-493b-a725-332f617f6f9b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L603") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 267.97 270.51 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0c98e7b1-60ed-4812-8e84-1432fc5886af") + (property "Reference" "#PWR05" + (at 267.97 276.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 267.97 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 267.97 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 267.97 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 267.97 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9378b035-f45f-446c-9729-53c5edbbcfe1") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR05") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 190.5 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0ce5053b-910b-4de3-a992-4eb6fc7076ec") + (property "Reference" "L604" + (at 148.59 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "720 nH" + (at 148.59 187.96 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 148.59 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "96ff6ecd-90ce-4230-b6b5-e183b68fdcbd") + ) + (pin "2" + (uuid "643695f9-d483-447f-87f2-60bfd0519939") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L604") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 313.69 29.21 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0dc34aa4-0aae-4727-8105-bf2b71b60f93") + (property "Reference" "C93" + (at 316.23 22.86 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "580 pF" + (at 317.5 25.4 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 309.88 30.1752 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 313.69 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 313.69 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 313.69 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "dbda545c-948b-4d5f-84e0-73d04363c5b0") + ) + (pin "1" + (uuid "8489036c-e314-4a5d-886e-d4ce200944f3") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C93") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 308.61 67.31 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0dc98d25-a688-4c0b-a891-a5b4bb53bfb6") + (property "Reference" "L191" + (at 309.8772 66.0979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "840 nH" + (at 309.8772 68.5221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 308.61 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 308.61 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 308.61 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5818c050-20f8-4ecc-8755-1550031daf33") + ) + (pin "2" + (uuid "efe04bf8-3f7f-4589-b63e-b4db9109d98a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L191") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 109.22 69.85 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0df7a47d-a967-4cd7-a83a-9d4f55011f3c") + (property "Reference" "L201" + (at 110.4872 68.6379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "560 nH" + (at 110.4872 71.0621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 109.22 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 109.22 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 109.22 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8955d96b-7f49-4487-8cd6-e57c0c56674b") + ) + (pin "2" + (uuid "6170a1d5-a4e6-4894-a1e9-0d55d420c8c6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L201") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 60.96 88.9 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "108992bc-1417-4780-a4df-650cc92f19e7") + (property "Reference" "C300" + (at 60.96 95.2033 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 60.96 92.7791 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 64.77 89.8652 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 60.96 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 60.96 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "46e08f92-c9ab-4a66-b931-235cb8b501be") + ) + (pin "1" + (uuid "b5bac939-b19b-4ecd-b313-59273f0efa75") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C300") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 290.83 262.89 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1143ac05-e0c5-4f2d-80a5-b9dcd2a3cb85") + (property "Reference" "L2" + (at 288.29 264.16 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FB" + (at 288.29 260.35 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 290.83 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 290.83 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 290.83 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "875-HZ1206E601R-10" + (at 290.83 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ec2a0fea-3f85-48dd-9eba-55c6301b8c4c") + ) + (pin "2" + (uuid "90ef6e14-6458-4cf7-aa84-760d5feeabac") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 91.44 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "117c46b9-8f89-4278-8d1e-73cd6825eac4") + (property "Reference" "L302" + (at 123.19 86.7904 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "2.2 uH" + (at 123.19 89.2146 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 123.19 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "51f27494-9d87-496e-bf36-a5a223afa3e3") + ) + (pin "2" + (uuid "46ced13c-cb58-4218-8e6d-c78df12edb82") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L302") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 100.33 124.46 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "11dda471-4080-487e-8d41-1ed5f119d67f") + (property "Reference" "C401" + (at 100.33 118.1567 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 100.33 120.5809 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 104.14 123.4948 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 100.33 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 100.33 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 100.33 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4b2d28c6-2741-477b-95ba-02b311d7785c") + ) + (pin "1" + (uuid "6383ff55-ce23-405b-957c-5f7b72fc8d90") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C401") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 26.67 237.49 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "12fa0e20-feb3-45d2-98bc-85d5977d3603") + (property "Reference" "#PWR040" + (at 26.67 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 24.13 238.76 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4bfb38f0-e0fa-49e5-a195-8707692e67fb") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR040") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 184.15 127 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "140109ab-5429-4d30-b7b0-d005e81f99bb") + (property "Reference" "U13" + (at 184.15 116.5057 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 184.15 118.9299 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 184.15 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 184.15 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 184.15 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 184.15 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "8dda98de-e0b6-4665-9364-cb735f7334c5") + ) + (pin "6" + (uuid "239d98de-7564-4afc-8db4-e7818e742aee") + ) + (pin "4" + (uuid "c2505134-a46b-4949-9337-6273b764da65") + ) + (pin "1" + (uuid "5d0620c3-ade4-4f0b-99aa-353efd2f1751") + ) + (pin "2" + (uuid "65755069-cd69-4075-a229-ce4eeb06d6b3") + ) + (pin "3" + (uuid "6c416425-9a26-4d6c-aa73-796f1ca6abed") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 60.96 154.94 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "151edde7-04bf-4db7-96dc-bc08cecf8033") + (property "Reference" "C500" + (at 60.96 161.2433 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 60.96 158.8191 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 64.77 155.9052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 60.96 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 60.96 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "28943ed1-5acb-4ce8-88a4-942e1a66ec60") + ) + (pin "1" + (uuid "846e3970-a44b-4d05-8699-b17c4fa031fa") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C500") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 327.66 97.79 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "162a39d8-ed52-459e-9a4c-238effe5e5a9") + (property "Reference" "C294" + (at 324.739 96.5779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1.9 nF" + (at 324.739 99.0021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 328.6252 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 327.66 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 327.66 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 327.66 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "585ea207-3635-4d97-93e9-26c6b1e95617") + ) + (pin "1" + (uuid "693b376e-48fb-4481-b20c-1b01e578b8fd") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C294") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 327.66 67.31 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "164d161c-b28d-4332-82d3-8855e6673932") + (property "Reference" "C194" + (at 324.739 66.0979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2.5 nF" + (at 324.739 68.5221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 328.6252 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 327.66 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 327.66 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 327.66 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e0022f0b-3cd6-43e3-b833-fadd848517f1") + ) + (pin "1" + (uuid "7ce323f5-ee0f-41f4-b3f2-f26e4833d945") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C194") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 308.61 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "1654cc3f-0ccd-496e-9ec5-8d917b827884") + (property "Reference" "L91" + (at 309.8772 36.8879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2 uH" + (at 309.8772 39.3121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 308.61 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 308.61 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 308.61 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e17e43c7-c96a-4d04-a721-4cd0f6c8b9c4") + ) + (pin "2" + (uuid "c9b3d236-7ae0-4a00-a54d-761a4f088a78") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L91") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 394.97 100.33 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "166303fd-2161-4690-9d32-b164081ad65f") + (property "Reference" "C26" + (at 401.2733 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 398.8491 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 395.9352 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 394.97 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 394.97 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 394.97 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cd48f1b0-cd17-4027-84c4-64e4929b7ff4") + ) + (pin "1" + (uuid "06fad67e-426b-4e52-a8ac-23c5db83d13e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C26") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 101.6 259.08 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "17545a02-9e98-4859-82ef-5e009984584a") + (property "Reference" "#PWR09" + (at 101.6 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 101.6 254.9469 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 101.6 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 101.6 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 101.6 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "af313dfa-8933-4f21-857f-f2bd158d6fa0") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR09") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 41.91 276.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "18217454-d85a-4719-8b11-1298299bf9a6") + (property "Reference" "#PWR01" + (at 41.91 283.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 39.37 278.13 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 41.91 276.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 41.91 276.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 41.91 276.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "37d8310b-fbb6-4afb-9ecd-d0525fc3d810") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR01") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 78.74 227.33 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1915a154-6250-4565-a35a-161d2edafc70") + (property "Reference" "U21" + (at 78.74 216.8357 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 78.74 219.2599 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 78.74 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 78.74 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 78.74 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 78.74 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "400e2e16-0533-4573-a4ef-013212e9fae5") + ) + (pin "6" + (uuid "4b9c1172-1524-4aea-aab0-476dbff9efaa") + ) + (pin "4" + (uuid "b44974a4-e6a6-4c68-a8c2-a9af0c54a021") + ) + (pin "1" + (uuid "15def029-eb56-4992-90c5-7f71e56d8891") + ) + (pin "2" + (uuid "74a62d78-9e17-4e1e-9fa5-e52093b97c75") + ) + (pin "3" + (uuid "afb08eac-c197-4f91-bb90-d3969b52f356") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 358.14 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "199661ad-f18c-4584-8f5a-8b6d3c2d2d8a") + (property "Reference" "L95" + (at 359.4072 36.8879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2 uH" + (at 359.4072 39.3121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 358.14 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 358.14 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 358.14 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5d7fca93-60fc-432c-aa89-118546c51867") + ) + (pin "2" + (uuid "0fb1edf0-c91e-4849-a923-f287624afb73") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L95") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 231.14 91.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1ae5e12e-1b68-48f1-8498-e0d1481aa237") + (property "Reference" "U29" + (at 232.41 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 236.22 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 231.14 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 231.14 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 231.14 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 231.14 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ba5c0ad2-3ee4-4851-8fea-3dd612e6f085") + ) + (pin "4" + (uuid "2f108dc9-539a-4506-9081-0a51509ead73") + ) + (pin "3" + (uuid "8b6f389d-9a1e-4118-a8b4-1b33ae4a929c") + ) + (pin "5" + (uuid "5eedfa8f-1a9b-46cc-98dc-f66cb9864d6c") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U29") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 195.58 204.47 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1ba6bca7-0a7b-46ee-8a69-e5059ed58633") + (property "Reference" "#PWR038" + (at 195.58 210.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 198.12 205.74 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 195.58 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 195.58 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "dbad6850-e1b7-4c4f-8eeb-d796498c4041") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR038") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 157.48 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "1de2fc91-7aaf-4991-b091-b743e9a048e9") + (property "Reference" "L504" + (at 148.59 152.8304 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "820 nH" + (at 148.59 155.2546 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 148.59 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b8207458-10df-4264-a77b-c85fcc5eb492") + ) + (pin "2" + (uuid "2ac28c07-b01e-460a-a0aa-cab04d0d4607") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L504") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 132.08 69.85 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "1de8e54a-6471-4c1f-9213-0b4be591ada6") + (property "Reference" "L7" + (at 130.8128 68.6379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 130.8128 71.0621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 132.08 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 132.08 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e6f54448-b628-455c-982c-0056ff775bcb") + ) + (pin "1" + (uuid "74b03031-0acc-4bbb-8eb0-7bfe63f06c4e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 165.1 157.48 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2039a4de-5f24-4c16-9b2d-30d756181de1") + (property "Reference" "C507" + (at 165.1 151.1767 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 165.1 153.6009 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 168.91 156.5148 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 165.1 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 165.1 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "fca81156-3560-49c9-b293-7067759cc7b7") + ) + (pin "1" + (uuid "8160a514-5c5e-427d-b15c-05ec8330e8f5") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C507") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 204.47 27.94 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "206ecebd-9079-4e86-a52b-2e2bd32601c1") + (property "Reference" "C108" + (at 204.47 34.2433 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 204.47 31.8191 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 208.28 28.9052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 204.47 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 204.47 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 204.47 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3270330f-de90-4395-82db-245d0cac625f") + ) + (pin "1" + (uuid "8bbd66c0-dfa9-428f-bbad-86dc3845bb0f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C108") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 279.4 266.7 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "20de7694-5a03-4287-901d-80ae7acdc708") + (property "Reference" "C4" + (at 282.321 265.4879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 282.321 267.9121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 280.3652 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 279.4 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 279.4 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 279.4 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "06dc9fc0-70ef-42c3-b278-c9a639bb2d71") + ) + (pin "1" + (uuid "82673adf-e1e9-4783-baa0-e20199f5a17e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 339.09 29.21 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "21671a81-0252-4985-bb40-316118f4494d") + (property "Reference" "C95" + (at 341.63 22.86 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "580 pF" + (at 342.9 25.4 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 335.28 30.1752 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 339.09 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 339.09 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 339.09 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "bdba0e80-95d2-42de-bf8b-593f6c856ff5") + ) + (pin "1" + (uuid "339f4951-860e-41ef-8542-8bf223092d1a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C95") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 307.34 38.1 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "22a1c680-e575-4cfe-b7b3-c95e86ba56fa") + (property "Reference" "L23" + (at 306.0728 36.8879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 307.975 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 307.34 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 307.34 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 307.34 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9b877b3e-fe8f-4454-9566-c4b99348f958") + ) + (pin "1" + (uuid "d5e02e6e-2221-45d1-ba13-6a7edbfecc2a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L23") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 226.06 81.28 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "246c1439-fc41-4bbd-b6dc-07ed7a7a89db") + (property "Reference" "#PWR056" + (at 226.06 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 226.06 77.1469 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 226.06 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 226.06 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 81.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1b638926-51b5-4ff9-b7f2-cc202f053d6f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR056") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 347.98 58.42 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2530615d-d6e3-432f-8008-7138c914b589") + (property "Reference" "L194" + (at 347.98 53.7704 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5.2 uH" + (at 347.98 56.1946 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 347.98 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 347.98 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 347.98 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "478c5c74-44ae-4af2-872b-742cb7b7597f") + ) + (pin "2" + (uuid "c66b13a7-3ac0-4b20-abf9-4368bd87689b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L194") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 78.74 63.5 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "269cb597-4082-427d-abc9-d4fc02aa88cd") + (property "Reference" "U6" + (at 78.74 53.0057 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 78.74 55.4299 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 78.74 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 78.74 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 78.74 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 78.74 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "8c01d4c5-ab5f-435f-8786-6653d5a8f24f") + ) + (pin "6" + (uuid "feee951b-1b6a-4108-b668-5c5b3a4c5ab1") + ) + (pin "4" + (uuid "43f10acf-4f88-4d84-86f0-9d036ddcd0bc") + ) + (pin "1" + (uuid "62cdb78a-abf5-49a8-a17b-2a39fbb8ab76") + ) + (pin "2" + (uuid "a42d1240-5631-47a5-91e7-b677c68c538c") + ) + (pin "3" + (uuid "1db0e7c6-b738-434e-92b8-a83128773bcf") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 158.75 100.33 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "27988936-6ca5-480e-985f-6b862f5fc557") + (property "Reference" "L305" + (at 160.0172 99.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "220 nH" + (at 160.0172 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 158.75 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 158.75 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 158.75 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "94585a89-f422-4300-9766-4977be527d5b") + ) + (pin "2" + (uuid "80484c3b-ed91-493a-b945-03741dfca53a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L305") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 274.32 262.89 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "284138e9-2e5c-40fb-ab1a-4d4e07d5d463") + (property "Reference" "TP15" + (at 275.717 258.3759 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 275.717 260.8001 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 279.4 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 279.4 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 274.32 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 274.32 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ab95491b-dc9d-485a-b0a4-3c4b7f5db483") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "TP15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 358.14 67.31 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "28eb6215-2d59-4c7c-9444-f04ae039039f") + (property "Reference" "L195" + (at 359.4072 66.0979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "840 nH" + (at 359.4072 68.5221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 358.14 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 358.14 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 358.14 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "77ad08cf-6b10-4ee6-b6c0-9b70cfa400b7") + ) + (pin "2" + (uuid "8474805b-2117-4547-a2e1-e625f577901c") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L195") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 364.49 58.42 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2b0e243b-22bb-41bd-ae7f-a4fc390a0fd8") + (property "Reference" "C197" + (at 364.49 52.1167 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 364.49 54.5409 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 368.3 57.4548 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 364.49 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 364.49 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 364.49 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c3f1ed27-d37a-4663-821f-d17cef9ad1bf") + ) + (pin "1" + (uuid "4d8c901b-5088-4cec-a030-2fae6d4dd650") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C197") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 232.41 266.7 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2b4b3561-e3c1-49e4-bbe9-81aab862860c") + (property "Reference" "C2" + (at 235.331 265.4879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 235.331 267.9121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 233.3752 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 232.41 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 232.41 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 232.41 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "24930b84-6fc5-468e-8e1f-6711276253f4") + ) + (pin "1" + (uuid "2a36b7e3-add5-4a3d-93e4-2eb19d964d0d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 184.15 93.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2bf480d9-a69f-4c73-abe2-da343d5943af") + (property "Reference" "U10" + (at 184.15 83.4857 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 184.15 85.9099 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 184.15 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 184.15 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 184.15 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 184.15 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "5ca7e98e-260e-41f1-ba58-a6e5a48307dd") + ) + (pin "6" + (uuid "5c3b8980-f202-4915-bf0c-46dbd153b4eb") + ) + (pin "4" + (uuid "c2a5726a-9c49-472e-8494-446f1b3a571e") + ) + (pin "1" + (uuid "2e8c1ce7-de82-4b72-abf6-3cb0f4fde5cb") + ) + (pin "2" + (uuid "02597375-a52e-4927-877d-7c2c9d679f1c") + ) + (pin "3" + (uuid "17a3fcdd-2da0-4c9b-927c-0eea3c5ca0b4") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 30.48 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2dcd5f2f-3e25-446c-b030-8f7a6de6aa8f") + (property "Reference" "L104" + (at 148.59 25.8304 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5.6 uH" + (at 148.59 28.2546 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 148.59 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9462038f-0610-4e46-b906-3885923b8d7b") + ) + (pin "2" + (uuid "00a96e33-363d-4822-a0ee-1c84c42ea134") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L104") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 67.31 140.97 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2ea0879e-ffa0-4f84-8605-a5e500aecbba") + (property "Reference" "#PWR026" + (at 67.31 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 64.77 142.24 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 67.31 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 67.31 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 140.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3c1f7e6f-dd6a-4649-a2cc-7a5fc969de33") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR026") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 353.06 97.79 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2efa9e26-195a-4a9a-b972-28d695107de7") + (property "Reference" "C296" + (at 350.139 96.5779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1.0 nF" + (at 350.139 99.0021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 354.0252 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 353.06 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 353.06 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 353.06 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d3e2d497-454c-4430-aaf9-df8bae805a97") + ) + (pin "1" + (uuid "c56c57c4-bd69-4005-9377-892496e9e095") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C296") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 67.31 101.6 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2f1272f9-0edd-4cc2-a60c-f4cb6940c2bc") + (property "Reference" "C11" + (at 61.0067 101.6 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 63.4309 101.6 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 66.3448 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 67.31 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 67.31 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b26e0632-6c73-407a-bd7b-98c5af2f59db") + ) + (pin "1" + (uuid "e9ac7b0e-a88d-4527-8b55-b52bd8c9608e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 190.5 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "302ea8aa-d70d-4405-bfa3-f7ef4231b6f8") + (property "Reference" "L602" + (at 123.19 185.42 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "720 nH" + (at 123.19 187.96 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 123.19 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "57e950aa-9857-43aa-be45-acdda4ec25df") + ) + (pin "2" + (uuid "8012bbf2-eedb-4b19-bacd-79329d790e28") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L602") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 195.58 200.66 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "31c594c7-1175-48fe-a2c5-e0393960528d") + (property "Reference" "C20" + (at 201.8833 200.66 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 199.4591 200.66 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 196.5452 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 195.58 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 195.58 200.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b5318879-6c38-4f63-a637-5649e2cb6fa6") + ) + (pin "1" + (uuid "0c7b9221-09ae-45d1-9dc3-245601e07381") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 128.27 39.37 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3317fd17-51a3-406d-b204-92b74a5342dc") + (property "Reference" "C104" + (at 125.349 38.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "3 nF" + (at 125.349 40.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 129.2352 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 128.27 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 128.27 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 128.27 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "066b33e6-1a0d-424b-8b56-0f33dcaa20fd") + ) + (pin "1" + (uuid "90e20e31-d8cb-4388-b0f1-5aaa27a29d53") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C104") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 78.74 127 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3386d1c4-09de-4b19-9a84-6ec59e2fb040") + (property "Reference" "U12" + (at 78.74 116.5057 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 78.74 118.9299 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 78.74 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 78.74 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 78.74 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 78.74 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "c6c02b35-8588-466d-bdac-aaf19e41a131") + ) + (pin "6" + (uuid "dbd2f3eb-de89-48aa-95e8-e5ac79e51646") + ) + (pin "4" + (uuid "d07d8d48-2a1f-42b2-8af0-fc5888080f42") + ) + (pin "1" + (uuid "aeb800ef-3a1d-47f0-bcd4-54972483e38a") + ) + (pin "2" + (uuid "00038536-a0e8-4bee-a58e-2578bdf14872") + ) + (pin "3" + (uuid "49bb81fe-7cb4-4380-92d8-097c339b8543") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 60.96 27.94 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "340aa873-0ce2-45c9-bb11-113223f6f406") + (property "Reference" "C100" + (at 60.96 34.2433 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 60.96 31.8191 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 64.77 28.9052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 60.96 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 60.96 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ca182e0a-410e-4c12-b553-cee98c1327f9") + ) + (pin "1" + (uuid "85c14e63-a458-4812-bc80-8bb6a3ddb09a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C100") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 67.31 208.28 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "355b9f23-22c5-4f2e-8a50-29af5a0c320e") + (property "Reference" "#PWR036" + (at 67.31 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 64.77 209.55 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 67.31 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 67.31 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4240eb95-3e62-48df-95cd-e1ef16064727") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR036") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 118.11 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "362cb966-8d09-491c-b449-8b9ea0e0b9db") + (property "Reference" "L36" + (at 124.4021 116.8428 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 121.9779 116.8428 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 123.19 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "918521ee-814e-4283-b05f-a1fd28b55b23") + ) + (pin "1" + (uuid "8e538190-9371-4bcf-93ff-9651cae251b7") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L36") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 107.95 199.39 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "36755677-301d-4348-a5a9-35d7bf3cb543") + (property "Reference" "L18" + (at 106.6828 198.1779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 106.6828 200.6021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 107.95 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 107.95 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 107.95 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9e8a22a4-49c2-4134-9e70-294cf2ed275b") + ) + (pin "1" + (uuid "0f2f81cf-94cf-4b89-9df5-2b14cfa1cc5c") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 157.48 100.33 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "36a3069e-e169-4353-bf23-42f5ed1a1278") + (property "Reference" "L11" + (at 156.2128 99.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 156.2128 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 157.48 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 157.48 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 157.48 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "55a8fc8e-41e3-42c7-8b99-3a521d52aeda") + ) + (pin "1" + (uuid "ee528cbf-36de-4704-87d1-e3f1fc563f2d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 158.75 39.37 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "372983ad-b4fb-44e0-b520-73b161305821") + (property "Reference" "L105" + (at 160.0172 38.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "1 uH" + (at 160.0172 40.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 158.75 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 158.75 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 158.75 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ab274945-820f-49ec-8ad9-0fd8e2ae337d") + ) + (pin "2" + (uuid "bc41b2de-0013-4104-9e81-8c8b0a2aced1") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L105") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 278.13 91.44 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "38078296-eecd-4899-834c-1db76864f445") + (property "Reference" "U30" + (at 278.13 80.9457 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 278.13 83.3699 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 278.13 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 278.13 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 278.13 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 278.13 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "46101339-e898-4f90-8b42-e403f36c0b8f") + ) + (pin "6" + (uuid "456fe3c8-830c-4831-bae0-8a618877d23e") + ) + (pin "4" + (uuid "f21de1f3-4b6c-442f-a105-1b0325fa350f") + ) + (pin "1" + (uuid "1bdd9bd2-c7d9-4ec9-86e6-23edfdc4afcb") + ) + (pin "2" + (uuid "2507b987-b3e4-481c-a499-7313b7fda6ff") + ) + (pin "3" + (uuid "1b2d3fe4-93d6-44c8-bb47-7ee9029bc733") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U30") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 347.98 82.55 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "387da95c-e087-43cf-9663-ab2afa409367") + (property "Reference" "L47" + (at 349.1921 81.2828 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 346.7679 81.2828 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 347.98 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 347.98 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 347.98 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b9a3124a-c355-45fc-b840-4c2f3f7ad299") + ) + (pin "1" + (uuid "a85c9f87-4dda-46f0-a016-2b609ef0665f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L47") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 85.09 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "395a69ba-e993-4725-8d7c-34ff7a80fcf2") + (property "Reference" "L34" + (at 124.4021 83.8228 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 121.9779 83.8228 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 123.19 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c848bc5f-7c65-4491-a602-0e95dadbd160") + ) + (pin "1" + (uuid "6725fe47-5556-4a1e-ae45-bf5c9df1b342") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L34") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 295.91 219.71 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "39a828b1-cca8-4ef1-a3e8-41e497c8a734") + (property "Reference" "R2" + (at 295.91 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 298.45 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 297.688 219.71 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 295.91 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 295.91 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "652-CR1206FX-2201ELF" + (at 295.91 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d515ee0a-eecf-46d3-9750-0f2046b4e3b8") + ) + (pin "1" + (uuid "99d47e0b-45c2-4cf2-95bb-0ae8141d4d91") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "R2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 368.3 204.47 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3c03ae57-3ece-4b8b-9f8a-b4d6dabba195") + (property "Reference" "R8" + (at 370.586 203.454 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 369.824 205.486 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 370.078 204.47 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 368.3 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 368.3 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "652-CR1206FX-2201ELF" + (at 368.3 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3f1ae628-8b82-4ab6-88cf-af98ab6b68d9") + ) + (pin "1" + (uuid "0e92fb79-10c4-4adc-9596-e0872a5b98df") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "R8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 100.33 30.48 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3c10f987-8639-4071-988d-6efe26b09d58") + (property "Reference" "C101" + (at 100.33 24.1767 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 100.33 26.6009 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 104.14 29.5148 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 100.33 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 100.33 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 100.33 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "de38c835-4486-4346-bc47-e9937e9331ee") + ) + (pin "1" + (uuid "f3b98b76-ac41-4b3d-9674-1c5f5d820bc9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C101") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 290.83 219.71 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3e6c630f-e5f9-4e6c-8150-66d2e0b1ff48") + (property "Reference" "R3" + (at 290.83 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 293.37 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 292.608 219.71 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 290.83 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 290.83 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "652-CR1206FX-2201ELF" + (at 290.83 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8254481f-4daf-4171-b592-f9ff3f561e72") + ) + (pin "1" + (uuid "50bc90c9-1d22-467f-840a-de4a94cdfb86") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "R3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 339.09 58.42 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3e98d564-cfeb-4c75-aec5-b5f28092609b") + (property "Reference" "C195" + (at 341.63 52.07 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "195 pF" + (at 342.9 54.61 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 335.28 59.3852 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 339.09 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 339.09 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 339.09 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f06507b4-ac7d-465a-b677-d16f0f9ba1c9") + ) + (pin "1" + (uuid "83dbe47f-b6f2-4971-8eec-4f7b084fe21b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C195") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 120.65 205.74 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3eee5693-3b33-4272-ab93-91b0664cd303") + (property "Reference" "#PWR037" + (at 120.65 212.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 118.11 207.01 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 120.65 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 120.65 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 120.65 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b5b8c6f3-727e-4f17-8d35-b41f86331494") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR037") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 139.7 91.44 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3eff3fac-6f66-4649-98e2-12865ef74f6b") + (property "Reference" "C305" + (at 142.24 85.09 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "75 pF" + (at 143.51 87.63 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 135.89 92.4052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 139.7 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "08574a50-a5fa-48a6-a6a2-33b7818fbea4") + ) + (pin "1" + (uuid "abb36a0a-128b-433a-ac7b-5ba2d630babc") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C305") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 107.95 166.37 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "3fc4a484-020e-489a-903c-d654724d0e30") + (property "Reference" "L15" + (at 106.6828 165.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 106.6828 167.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 107.95 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 107.95 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 107.95 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cf93b5aa-a028-4fa9-8f35-0d83cff6ee75") + ) + (pin "1" + (uuid "72ab61fc-64d6-4682-977c-a7bf844c6103") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 107.95 69.85 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "4217870b-9a02-4fc3-b6f1-c47ac41f79e2") + (property "Reference" "L6" + (at 106.6828 68.6379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 106.6828 71.0621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 107.95 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 107.95 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 107.95 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2da18157-553c-4e6b-bc9f-9e998bc70cea") + ) + (pin "1" + (uuid "81ae1775-fa97-4804-8daa-0fdcf7550bb0") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D_Zener") + (at 360.68 184.15 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "42231040-d73d-450f-a4aa-16c23d8440b6") + (property "Reference" "D2" + (at 360.68 189.5643 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "BAS70H,115" + (at 360.68 187.1401 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Diode_SMD:D_SOD-123F" + (at 360.68 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 360.68 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 360.68 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "771-BAS70H-T/R" + (at 360.68 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 360.68 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6ff4aeed-ea3b-487f-95ca-182005edd76c") + ) + (pin "1" + (uuid "e85e6fc4-5bb8-436b-a2a7-60af066472d6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "D2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 100.33 157.48 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "42eef67c-d5db-4464-b042-8b8ab2b303f8") + (property "Reference" "C501" + (at 100.33 151.1767 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 100.33 153.6009 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 104.14 156.5148 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 100.33 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 100.33 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 100.33 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d9909e90-a017-4200-a96f-5833049a8978") + ) + (pin "1" + (uuid "034a0f75-28c2-4de2-bdab-d1c8ca904fa4") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C501") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 67.31 105.41 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4334b1d2-7e40-4159-9cc1-78e066a6a59a") + (property "Reference" "#PWR021" + (at 67.31 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 64.77 106.68 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 67.31 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 67.31 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "217d8665-87d6-4a51-89e9-b18611930a4f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR021") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 67.31 172.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "43405475-c55d-44d6-b79b-fe853553a5d8") + (property "Reference" "#PWR031" + (at 67.31 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 64.77 173.99 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 67.31 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 67.31 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b6984124-41dd-49af-92f0-988e0b7838c3") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR031") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 303.53 67.31 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "436e9748-fa8e-4735-8ac7-c2a9bb9fed90") + (property "Reference" "C192" + (at 300.609 66.0979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1.2 nF" + (at 300.609 68.5221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 304.4952 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 303.53 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 303.53 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 303.53 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "759b0bed-e064-4d4b-bae1-15cac7c95943") + ) + (pin "1" + (uuid "6d659dfa-7178-48d5-bf4e-cd2212de949f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C192") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 364.49 29.21 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4409183d-f9c4-4c80-9426-c84713a64077") + (property "Reference" "C97" + (at 364.49 22.9067 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 364.49 25.3309 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 368.3 28.2448 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 364.49 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 364.49 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 364.49 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5fe10b74-ed2a-4231-8f3f-5a36f7f0c080") + ) + (pin "1" + (uuid "f41e6397-ae26-42b2-993e-1d429811b385") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C97") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 60.96 232.41 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "44e300c3-aa52-428a-af9d-e9b679299ffe") + (property "Reference" "C700" + (at 67.2633 232.41 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 64.8391 232.41 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 61.9252 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 60.96 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 60.96 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "890a04c3-5db2-425a-ab17-527cc431e207") + ) + (pin "1" + (uuid "be6e8fda-53e0-4bca-be3b-5c039aef6718") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C700") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 176.53 252.73 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "464e1161-c552-4549-85c1-eface94a999d") + (property "Reference" "J1" + (at 175.26 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TO PA" + (at 179.07 250.19 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 176.53 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 176.53 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 176.53 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 176.53 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 176.53 252.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "77feacc7-34d2-4d9a-9332-47f916273d4f") + ) + (pin "2" + (uuid "3de4e03e-3d48-4c78-96d6-bf88a5207ee9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "J1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 153.67 39.37 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "479cc10c-eb7f-474d-aa86-4e8f23f5d14a") + (property "Reference" "C106" + (at 150.749 38.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1.8 nF" + (at 150.749 40.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 154.6352 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 153.67 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "05db7ff5-cfe4-4c7f-aca0-57339341f5d9") + ) + (pin "1" + (uuid "b0b3bd79-886b-40c1-8307-fbec82e94e73") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C106") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 307.34 67.31 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "486d24cc-18f9-41a5-89c4-c321cc54e2ee") + (property "Reference" "L26" + (at 306.0728 66.0979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 307.975 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 307.34 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 307.34 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 307.34 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e82b1ebe-8f99-42fb-b5f3-5ac27dfb245c") + ) + (pin "1" + (uuid "20cecef6-f20e-41b2-9ced-cafd5eb40ce0") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L26") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 303.53 38.1 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4a142ff2-8397-4255-973c-e82e178b7faf") + (property "Reference" "C92" + (at 300.609 36.8879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "3.1 nF" + (at 300.609 39.3121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 304.4952 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 303.53 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 303.53 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 303.53 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "159fa332-062f-4034-b6cf-8799f9949244") + ) + (pin "1" + (uuid "7ce1b733-796f-49f6-aa0e-503930d0ab71") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C92") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 120.65 76.2 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4a87f4f6-b712-4aff-8e91-36879b99095c") + (property "Reference" "#PWR017" + (at 120.65 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 118.11 77.47 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 120.65 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 120.65 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 120.65 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8b3eb896-327e-4b3f-af65-933bc6145efe") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR017") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 322.58 52.07 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "4c42cd88-9cbf-462c-9769-81a5e94b7fe5") + (property "Reference" "L44" + (at 323.7921 50.8028 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 321.3679 50.8028 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 322.58 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "01520724-9291-497d-8aa7-279674fe40ea") + ) + (pin "1" + (uuid "7031739b-8383-4d35-96d3-211e710e8935") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L44") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 132.08 133.35 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "4c570ce3-c4a7-4a1a-88da-038c4e02892d") + (property "Reference" "L13" + (at 130.8128 132.1379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 130.8128 134.5621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 132.08 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 132.08 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "446b98e7-7f44-4c3d-84fe-1f5ce622b5dd") + ) + (pin "1" + (uuid "c1ec1e2b-a8c5-4dfa-ab5e-c132f4a608d2") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 294.64 262.89 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4cf218c4-ced0-4ce2-a439-c78d8b126480") + (property "Reference" "#PWR06" + (at 294.64 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 294.64 258.7569 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 294.64 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 294.64 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 294.64 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "26585383-1e77-45a7-8568-cbee1fbce634") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR06") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 139.7 30.48 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4d4a82b9-9e58-4a92-bbff-34512080e6b4") + (property "Reference" "C105" + (at 142.24 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "300 pF" + (at 143.51 26.67 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 135.89 31.4452 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 139.7 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "693f31ce-ccc8-469e-8ae0-6596b4d5a7cb") + ) + (pin "1" + (uuid "3aa6265a-89ae-43b5-b059-51b5e7d57ac5") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C105") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 165.1 91.44 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4e29bb14-0fc2-4e33-bdbf-9855216cf64d") + (property "Reference" "C307" + (at 165.1 85.1367 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 165.1 87.5609 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 168.91 90.4748 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 165.1 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 165.1 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e72279ba-651e-4cca-8dbf-ad7e1063af5f") + ) + (pin "1" + (uuid "40f0efa2-d53b-4ef0-acad-0b49d4bba4e9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C307") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 109.22 133.35 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4f165c0c-2fa2-4f38-bfb2-53a2b081179d") + (property "Reference" "L401" + (at 110.4872 132.1379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "150 nH" + (at 110.4872 134.5621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 109.22 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 109.22 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 109.22 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2aaf85bb-b4c3-48c3-8267-8c498db6a95b") + ) + (pin "2" + (uuid "02b737b5-c4cc-47ff-b1ef-d7f7c3d815d1") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L401") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 104.14 166.37 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "528e1f3a-26ba-46fb-92c4-a90428f4a9c8") + (property "Reference" "C502" + (at 101.219 165.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "300 pF" + (at 101.219 167.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 105.1052 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 104.14 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 104.14 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 104.14 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9c58fe45-3818-4c45-91f0-8a7a628b3901") + ) + (pin "1" + (uuid "7521decc-81c0-4fce-ae78-d151ef01f0cb") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C502") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 139.7 124.46 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "550447ec-cea5-48d5-a6ed-d762105080cc") + (property "Reference" "C405" + (at 142.24 118.11 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "51 pF" + (at 143.51 120.65 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 135.89 125.4252 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 139.7 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7da393ab-6528-4d57-8bb0-4f941c93b075") + ) + (pin "1" + (uuid "8cd17308-5594-45e1-b7ab-371caf17f2c0") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C405") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 133.35 69.85 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5581d0fe-c83b-4861-9cfc-97ad9cbd648a") + (property "Reference" "L203" + (at 134.6172 68.6379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "330 nH" + (at 134.6172 71.0621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 133.35 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 133.35 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 133.35 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "91cddf79-73c3-408e-9d00-ce99893e5421") + ) + (pin "2" + (uuid "1d89fd62-236f-451e-993d-ac2a9eb40970") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L203") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 120.65 106.68 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5595847f-b7b6-4ff6-808b-3207b5be856a") + (property "Reference" "#PWR022" + (at 120.65 113.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 118.11 107.95 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 120.65 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 120.65 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 120.65 106.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "93fd0b1f-8bd4-441a-9961-094d828e570d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR022") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 266.7 39.37 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5656cfac-a698-4da7-9a44-f1eb161238be") + (property "Reference" "C21" + (at 260.3967 39.37 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 262.8209 39.37 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 265.7348 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 266.7 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 266.7 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 266.7 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b40747e1-cce9-4f37-802f-eb7dcea0fd45") + ) + (pin "1" + (uuid "c9ecf38d-42e1-4d8a-b1eb-1b697f56ca29") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D_Zener") + (at 360.68 199.39 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "573999de-4183-4817-82a2-9290ce7ed417") + (property "Reference" "D3" + (at 360.68 193.9757 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "BAS70H,115" + (at 360.68 196.3999 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Diode_SMD:D_SOD-123F" + (at 360.68 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 360.68 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 360.68 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "771-BAS70H-T/R" + (at 360.68 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 360.68 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3541d6b1-e252-457a-88cf-30f44445337c") + ) + (pin "1" + (uuid "5e83246d-c005-4f00-aed9-79c32291d506") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "D3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 184.15 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "57a60750-6dd7-45c8-a1c8-beccd27af7fd") + (property "Reference" "L41" + (at 149.8021 182.8828 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 147.3779 182.8828 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 148.59 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b32ce685-046e-455e-9f80-74926024e1f1") + ) + (pin "1" + (uuid "b7cf1f75-d29f-413c-8551-f8e47febd361") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L41") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 222.25 262.89 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "57cd1745-9e0e-484e-a2fd-91ca567d0af0") + (property "Reference" "#PWR08" + (at 222.25 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 222.25 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 222.25 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 222.25 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "941e86c3-9968-46d2-a785-24c7b2de52f1") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR08") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 158.75 199.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "589dc2e4-84a5-42d4-bc1b-59104bb7cda5") + (property "Reference" "L605" + (at 160.0173 198.1779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "39 nH" + (at 160.0173 200.6021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 158.75 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 158.75 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 158.75 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f3716be9-8bc6-4289-885e-f9c21df863d6") + ) + (pin "2" + (uuid "557924e5-843d-4884-a2e0-6c6792e08f16") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L605") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 394.97 104.14 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "58f70335-fa62-408e-8033-a21674418898") + (property "Reference" "#PWR060" + (at 394.97 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 397.51 105.41 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 394.97 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 394.97 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 394.97 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2e6f9c0a-2d26-4ac8-b798-c9efdcd34ec7") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR060") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 49.53 255.27 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5a22e6d1-3773-4d21-8580-b98329300aff") + (property "Reference" "C5" + (at 49.53 261.5733 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 49.53 259.1491 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 53.34 256.2352 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 49.53 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 49.53 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 49.53 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "93f15017-778c-466c-82d7-fbc620e37607") + ) + (pin "1" + (uuid "7d7f9a92-5590-46eb-bd1d-06685f51d5e8") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 210.82 262.89 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5a7a2b5b-e172-40d3-b92e-9388ae0ce3c0") + (property "Reference" "L1" + (at 210.82 258.2404 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uH 20%" + (at 210.82 260.6646 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Inductor_SMD:L_Bourns-SRN6028" + (at 210.82 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 210.82 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "81-1264EY-100MP3" + (at 210.82 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ce17c9ba-c722-458f-a59d-67772083b34f") + ) + (pin "2" + (uuid "42638f1f-46ee-46de-8425-08c7c11b9101") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 165.1 30.48 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5b3c976d-d7ce-4ad4-8e8d-55612780e0f8") + (property "Reference" "C107" + (at 165.1 24.1767 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 165.1 26.6009 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 168.91 29.5148 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 165.1 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 165.1 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3d6ef66d-b500-42fd-aacf-572d5586c8ea") + ) + (pin "1" + (uuid "e382ba63-4f6b-4709-9fec-09280aa342ee") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C107") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 107.95 133.35 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "5c1bbcc3-b8c0-4847-8cb6-1f2d354eee8e") + (property "Reference" "L12" + (at 106.6828 132.1379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 106.6828 134.5621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 107.95 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 107.95 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 107.95 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f766d869-14ca-4b9e-9db4-83b04c869692") + ) + (pin "1" + (uuid "c25cc68d-da1e-4453-bf0a-cbb88de277a6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 124.46 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5cbe3dcb-d830-4263-9273-6ece5a19b86f") + (property "Reference" "L402" + (at 123.19 119.8104 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1.2 uH" + (at 123.19 122.2346 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 123.19 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1a3756fa-9a30-441f-835d-b25931c1e9a1") + ) + (pin "2" + (uuid "52e8dcce-e834-4600-accc-754f33828167") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L402") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 60.96 187.96 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5cfc5011-7f3a-4a51-b96e-9baad7735026") + (property "Reference" "C600" + (at 60.96 194.2633 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 60.96 191.8391 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 64.77 188.9252 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 60.96 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 60.96 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "89eb69d7-9d23-4e1f-b9a0-e30cf58b16d4") + ) + (pin "1" + (uuid "fb79aacd-f381-4de7-a035-dd98d666ad86") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C600") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 153.67 133.35 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5e2c3ffb-8675-498d-9d84-c18055420162") + (property "Reference" "C406" + (at 150.749 132.1379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "390 pF" + (at 150.749 134.5621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 154.6352 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 153.67 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "44fe921a-db14-4d34-bcfb-858af2531c56") + ) + (pin "1" + (uuid "be10a70a-20db-4e96-8260-32cdf3221d44") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C406") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 158.75 69.85 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5ffa8486-1739-46a8-a88e-3387ff2adda7") + (property "Reference" "L205" + (at 160.0172 68.6379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "560 nH" + (at 160.0172 71.0621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 158.75 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 158.75 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 158.75 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "079c4e06-dd52-44ac-80db-40603638e051") + ) + (pin "2" + (uuid "77e8e8bb-d00e-41c3-b9d0-67b480336ab3") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L205") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 302.26 171.45 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "605172b1-2ddf-4c40-9cf3-84891c43c9fd") + (property "Reference" "R5" + (at 300.8742 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 298.45 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 304.038 171.45 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 302.26 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 302.26 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "652-CR1206FX-2201ELF" + (at 302.26 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "01cac5ab-a8aa-471c-b320-1ecf8c5f7c52") + ) + (pin "1" + (uuid "ecece484-4442-48a7-9671-2e8ff91380e9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "R5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 26.67 170.18 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "61b34fe4-25f2-4d87-9f14-9a04dc5b47be") + (property "Reference" "#PWR030" + (at 26.67 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 24.13 171.45 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b5eef9ea-ca94-436b-86de-cbacb7cdf23e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR030") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 288.29 201.93 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "62254d6f-eb80-44c7-8a29-07333f8e13a0") + (property "Reference" "#PWR069" + (at 288.29 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 288.29 197.7969 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 288.29 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 288.29 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 288.29 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "83f8a968-69b4-4491-9fca-6794a1e5661f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR069") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 26.67 73.66 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "636bf7cf-9303-4833-b658-5c50f1fd9bff") + (property "Reference" "#PWR015" + (at 26.67 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 24.13 74.93 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4cad835f-401e-484e-8ed8-53682df8fee5") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR015") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 201.93 275.59 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "640da293-dcff-40de-8902-104dab30dc13") + (property "Reference" "#PWR07" + (at 201.93 281.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 201.93 280.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 201.93 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 201.93 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 201.93 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2852b7ed-262c-414e-8fb7-00d5d6fc0aa6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR07") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 100.33 91.44 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "647833e6-4d69-45c8-ab96-20934a4dcb5f") + (property "Reference" "C301" + (at 100.33 85.1367 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 100.33 87.5609 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 104.14 90.4748 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 100.33 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 100.33 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 100.33 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "0c2c0bb8-de5f-434b-a1de-16dd38201145") + ) + (pin "1" + (uuid "032cc818-91df-47a5-beae-75dc628f3f88") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C301") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D_Zener") + (at 360.68 181.61 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "64cea4ab-f910-414b-8d62-310314f8b469") + (property "Reference" "D1" + (at 360.68 176.1957 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "BAS70H,115" + (at 360.68 178.6199 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Diode_SMD:D_SOD-123F" + (at 360.68 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 360.68 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 360.68 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "771-BAS70H-T/R" + (at 360.68 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 360.68 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "744d261b-09c2-491f-813b-d0c864f1df3a") + ) + (pin "1" + (uuid "7ba1e1fe-0349-40da-9ace-deeaf68f0b97") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "D1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 31.75 127 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "669670cd-433e-4dcd-b441-8840e402e63d") + (property "Reference" "U11" + (at 33.02 119.38 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 36.83 116.84 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 31.75 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 31.75 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 31.75 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 31.75 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "dad485c0-49ff-41db-8c5e-3153b039066a") + ) + (pin "4" + (uuid "aae42e2c-4968-4986-ba87-e6eddb3f0559") + ) + (pin "3" + (uuid "68ea3c32-489c-45ac-918d-27831d50f189") + ) + (pin "5" + (uuid "7fe89660-d754-4bce-a116-3ef8f3bec8ba") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 322.58 58.42 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "66a6bc3e-059a-4577-afd4-2626772a04f3") + (property "Reference" "L192" + (at 322.58 53.7704 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5.2 uH" + (at 322.58 56.1946 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 322.58 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "71318b6c-82b4-4ba0-912f-472aa5cc4949") + ) + (pin "2" + (uuid "dca6bdd8-af6e-48c2-84a2-53562d17aa28") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L192") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 157.48 69.85 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "671861df-59b3-491e-b045-eeaf70ddc460") + (property "Reference" "L8" + (at 156.2128 68.6379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 156.2128 71.0621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 157.48 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 157.48 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 157.48 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "fcd801af-3da8-43ee-91fc-8a0cb402e3d7") + ) + (pin "1" + (uuid "b8aa974c-341b-4d98-a61c-d4e790f7e262") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 60.96 58.42 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "67cc50d5-f49e-442f-b89b-5ef9d2da8790") + (property "Reference" "C200" + (at 60.96 64.7233 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 60.96 62.2991 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 64.77 59.3852 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 60.96 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 60.96 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "00dd8a0e-4b2e-4431-b663-e9dee3b25926") + ) + (pin "1" + (uuid "9eafb398-b849-47eb-b150-28fd5ba35123") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C200") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 162.56 270.51 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "680c0ad1-c835-4dd1-b177-ec55e1c3430e") + (property "Reference" "J6" + (at 161.29 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "FROM LPF" + (at 156.21 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 162.56 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 162.56 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 162.56 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 162.56 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 162.56 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "783ff13c-1b8d-42dc-b37a-4ea78de7fa22") + ) + (pin "2" + (uuid "3ddcbe03-c80f-4804-90a0-09eeee3752df") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "J6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 401.32 55.88 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "695f83f6-0b36-4cb9-bdbe-8733c9eb5034") + (property "Reference" "C198" + (at 401.32 62.1833 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 401.32 59.7591 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 405.13 56.8452 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 401.32 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 401.32 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 401.32 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "586a9c3b-39b5-414e-b917-109423e1316e") + ) + (pin "1" + (uuid "7a60052e-d1bc-4a23-b3e9-34400812114d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C198") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 226.06 101.6 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "69ec8ef5-0364-4d93-9ba3-47f61ef3f2e7") + (property "Reference" "#PWR057" + (at 226.06 107.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 223.52 102.87 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 226.06 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 226.06 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6d8eca32-b242-40b2-9d23-5dde2c1376a3") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR057") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 195.58 77.47 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6b33e24d-5db9-4ab1-98e8-79aabd001917") + (property "Reference" "#PWR018" + (at 195.58 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 198.12 78.74 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 195.58 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 195.58 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0b880e5e-5438-4b4b-8331-d198aefd7d5b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR018") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 67.31 40.64 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6c75c44a-f83e-459a-bf5e-65f1844865df") + (property "Reference" "C9" + (at 61.0067 40.64 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 63.4309 40.64 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 66.3448 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 67.31 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 67.31 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "67b10dd3-a715-432c-aa1a-5775a338085a") + ) + (pin "1" + (uuid "9930bd29-9e26-4200-a57d-af363d495c17") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 307.34 97.79 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "6c9e349c-6f5a-4957-9dfe-13223d097a71") + (property "Reference" "L29" + (at 306.0728 96.5779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 307.975 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 307.34 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 307.34 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 307.34 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cd2cc941-4b7c-477c-b4e2-f78e6433430e") + ) + (pin "1" + (uuid "5d312e9d-3616-46e7-beb7-a1e1886346cf") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L29") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 299.72 58.42 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "6d82c55f-8ad5-4c40-ae9a-af770789f25b") + (property "Reference" "C191" + (at 299.72 52.1167 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 299.72 54.5409 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 303.53 57.4548 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 299.72 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 299.72 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 299.72 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5e85b36e-2f1a-41af-925c-a74ee8f86b58") + ) + (pin "1" + (uuid "797bda05-bfcc-41cc-a909-c498b23f5e47") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C191") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 59.69 222.25 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6df1c031-3459-49a8-87df-ffe98805505a") + (property "Reference" "C27" + (at 59.69 215.9467 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 58.166 218.44 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 55.88 221.2848 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 59.69 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 59.69 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 59.69 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4ff75dd9-0583-4679-925f-bfeaa798a932") + ) + (pin "1" + (uuid "d4fe8c1d-62e3-4fcb-a5c3-6116a8cdedf4") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C27") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 353.06 67.31 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6ee7964a-691c-4c7b-b19f-8e547c61deae") + (property "Reference" "C196" + (at 350.139 66.0979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1.2 nF" + (at 350.139 68.5221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 354.0252 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 353.06 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 353.06 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 353.06 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a3c947ce-c657-4a35-982e-36053931ac17") + ) + (pin "1" + (uuid "b6e9edf6-8c9a-420c-b499-3a401c6c7b6f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C196") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 153.67 69.85 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6ef6b44e-0e9c-4570-bd2e-060cfd91c0a6") + (property "Reference" "C206" + (at 150.749 68.6379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1.2 nF" + (at 150.749 71.0621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 154.6352 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 153.67 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8028559b-4c7c-4528-ad85-53bd682d1a11") + ) + (pin "1" + (uuid "c0c78495-9d04-481f-84b7-05baf8cedeac") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C206") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 336.55 165.1 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6f074b9d-7c8c-45f0-b5ce-a2b055dc2dea") + (property "Reference" "C41" + (at 337.82 158.75 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 337.82 161.29 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 332.74 164.1348 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 336.55 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 336.55 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "581-12065F104K4" + (at 336.55 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 336.55 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "64bb9632-dc09-45da-80eb-7af790f450f0") + ) + (pin "1" + (uuid "da669374-5122-48d6-ba50-4d9fc61c91f0") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C41") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 303.53 97.79 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6fb0e36b-ec48-44af-b4c2-d10a41637426") + (property "Reference" "C292" + (at 300.609 96.5779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1.0 nF" + (at 300.609 99.0021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 304.4952 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 303.53 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 303.53 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 303.53 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "832339d4-a50b-492e-8736-6ee3dcf6d423") + ) + (pin "1" + (uuid "8000ea96-796e-4783-be9d-c9bc733a39f3") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C292") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 368.3 208.28 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "703a4440-59c4-4351-b4d1-e9c65fbb7171") + (property "Reference" "#PWR061" + (at 368.3 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 370.84 209.55 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 368.3 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 368.3 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 368.3 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3ac64eb1-9ad1-4201-a195-787272493f7f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR061") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 139.7 190.5 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7084e76e-8ac7-4ef3-8010-44a4b19e49a1") + (property "Reference" "C605" + (at 142.24 184.15 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "13 pF" + (at 143.51 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 135.89 191.4652 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 139.7 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "fece065d-85e6-42b4-a745-3dca5e5c1c46") + ) + (pin "1" + (uuid "52bb5d81-fca8-4447-a8a6-27e0b00a8cf6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C605") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 109.22 166.37 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "71283322-6da2-415f-ab84-1cf4d78e0f5b") + (property "Reference" "L501" + (at 110.4872 165.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "120 nH" + (at 110.4872 167.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 109.22 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 109.22 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 109.22 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ee8a76f5-4c12-4313-85a0-56c9e5d9a042") + ) + (pin "2" + (uuid "cb16400f-cbb6-461c-b359-2a1b17f0aafe") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L501") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 120.65 45.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "71322b5f-a13f-468a-8001-512420504693") + (property "Reference" "#PWR04" + (at 120.65 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 118.11 46.99 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 120.65 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 120.65 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 120.65 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e78be438-76bc-40e2-8245-65bce6156846") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR04") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 76.2 238.76 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "72ac7ae6-7251-4773-aa4b-7b8d6fbeffd4") + (property "Reference" "#PWR042" + (at 76.2 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 73.66 240.03 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 76.2 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 76.2 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 76.2 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f8187e8a-116e-43c3-979f-fdcf92303ec9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR042") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 107.95 100.33 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "73f9107b-a93e-4971-9496-a539c3b57377") + (property "Reference" "L9" + (at 106.6828 99.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 106.6828 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 107.95 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 107.95 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 107.95 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3491788b-e2f2-48f3-a63d-5ceca46d7414") + ) + (pin "1" + (uuid "792b4fa1-aff0-4fd4-9eee-82f4412a4d51") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 104.14 100.33 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "74ebff50-d064-42be-b954-9e29f6954a63") + (property "Reference" "C302" + (at 101.219 99.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "750 pF" + (at 101.219 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 105.1052 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 104.14 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 104.14 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 104.14 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c49be3d1-9b92-43a2-94bf-233a64b1445f") + ) + (pin "1" + (uuid "e2c2afec-f2bc-4eb6-a76d-e7c6b2b3d899") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C302") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 339.09 88.9 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "75a230d8-da1e-41cc-a516-f28ca132f4f3") + (property "Reference" "C295" + (at 341.63 82.55 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "68 pF" + (at 342.9 85.09 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 335.28 89.8652 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 339.09 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 339.09 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 339.09 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5a9db47d-4f32-4126-8278-8703c443b923") + ) + (pin "1" + (uuid "b3793f09-afe0-411c-91b7-fd0c1954c14d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C295") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 356.87 97.79 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "75cae675-aed2-4389-8183-bc6703e79f8b") + (property "Reference" "L27" + (at 355.6028 96.5779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 357.505 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 356.87 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 356.87 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 356.87 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b1f4166e-ec90-4c3a-9913-fb15f56d4e81") + ) + (pin "1" + (uuid "3f700d86-cb67-4367-8cde-9381d0dcaf35") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L27") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 383.54 91.44 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "772a0927-b91a-4206-9c08-52b7b685a735") + (property "Reference" "U31" + (at 383.54 80.9457 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 383.54 83.3699 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 383.54 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 383.54 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 383.54 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 383.54 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "3ddf8534-d430-461e-9941-6eb558943101") + ) + (pin "6" + (uuid "9475b5f8-d716-4aab-9554-4912b2ddbb39") + ) + (pin "4" + (uuid "495e74ea-98e7-4aea-ab56-4ae628e7aca1") + ) + (pin "1" + (uuid "6476c998-0a2a-42ce-83f4-73547dde3531") + ) + (pin "2" + (uuid "723c3cb1-2a91-48d6-8c61-30a578e1e503") + ) + (pin "3" + (uuid "23e1dd76-300e-46ab-a491-dcfab4d473ce") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U31") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 139.7 157.48 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "78e25187-e904-41d9-ac90-84fdb1bb0789") + (property "Reference" "C505" + (at 142.24 151.13 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "43 pF" + (at 143.51 153.67 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 135.89 158.4452 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 139.7 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "98af917a-f18d-4d92-a91c-20cdaa07f216") + ) + (pin "1" + (uuid "f5784b26-3261-4969-bc36-a8723262a02f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C505") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 184.15 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "79aec0d3-0444-4d02-9fdc-985fb2120860") + (property "Reference" "L40" + (at 124.4021 182.8828 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 121.9779 182.8828 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 123.19 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "83ebd435-d195-467b-8465-48a8bb499a28") + ) + (pin "1" + (uuid "c14c6438-6a27-438d-8d31-09828df791cd") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L40") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 326.39 224.79 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "79d7ddbb-7237-4467-875b-2891fb18596b") + (property "Reference" "#PWR064" + (at 326.39 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 328.93 226.06 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 326.39 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 326.39 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 326.39 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3b3f4ce4-f032-4f3d-8799-2720cc4473fc") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR064") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 78.74 33.02 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7b43ce34-d777-4ac3-ac61-729985c3169b") + (property "Reference" "U3" + (at 78.74 22.5257 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 78.74 24.9499 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 78.74 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 78.74 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 78.74 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 78.74 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "734f62d2-e51b-4aa4-9e42-d3e982752b9b") + ) + (pin "6" + (uuid "fd6feaa6-4636-425c-9501-5a1201abf352") + ) + (pin "4" + (uuid "40a770a9-b865-41b4-8cb6-0ccfe1d80f2d") + ) + (pin "1" + (uuid "a82d2e0b-e059-454b-b220-52845a3d3be3") + ) + (pin "2" + (uuid "b7151b48-a699-4836-8e15-3b0e0e89ac6b") + ) + (pin "3" + (uuid "f16861dc-89ac-435a-be7e-9be59403adad") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 383.54 60.96 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7b7686cc-2fdc-44eb-abdf-aabc3fcaa721") + (property "Reference" "U28" + (at 383.54 50.4657 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 383.54 52.8899 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 383.54 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 383.54 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 383.54 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 383.54 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "e3587d06-74e8-4d61-955f-c38c200385cc") + ) + (pin "6" + (uuid "098e506e-32c7-4540-8bc4-d92d25d8498d") + ) + (pin "4" + (uuid "3d0d7f06-c2ac-4874-9503-8447f29962d6") + ) + (pin "1" + (uuid "97723cc6-0f1f-4b2a-a2cb-c46afc7edf28") + ) + (pin "2" + (uuid "416ba743-ff3e-4b44-ade5-1de085300cbd") + ) + (pin "3" + (uuid "71839a2e-3b25-4da3-8f94-12053f372aea") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U28") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 50.8 271.78 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7baeef63-7dd4-42f4-b206-69a105c95b20") + (property "Reference" "C6" + (at 50.8 278.0833 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 50.8 275.6591 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 54.61 272.7452 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 50.8 271.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 50.8 271.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 50.8 271.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "afd1b9c4-a5f2-4beb-9f96-69f5de431ec3") + ) + (pin "1" + (uuid "f013d041-10d4-4618-999c-6dc4b5069363") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole_Pad") + (at 392.43 240.03 270) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7bb5af28-2ba9-4c78-9aaa-bf1dfe84301a") + (property "Reference" "H1" + (at 396.24 240.03 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 396.24 241.2421 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_4.3mm_M4_DIN965_Pad" + (at 392.43 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 392.43 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 392.43 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 392.43 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 392.43 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b2c7bdea-f875-4a85-a859-3d16ecb29b15") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "H1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 134.62 264.16 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7cad5eee-2e47-47fd-99e3-d025d78e5a65") + (property "Reference" "U36" + (at 134.62 253.6657 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 134.62 256.0899 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 134.62 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 134.62 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 134.62 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 134.62 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "c1fc72be-9971-404d-8fef-2c1afe59fdd4") + ) + (pin "6" + (uuid "170bc5dc-7d97-4478-a210-686fbc33d22e") + ) + (pin "4" + (uuid "27913879-6f3d-4c03-ab24-87e0dda0aaae") + ) + (pin "1" + (uuid "f4c357ac-5895-415a-946c-9c9ed5372a7d") + ) + (pin "2" + (uuid "e89808bc-053b-4381-beab-2d259d7a916f") + ) + (pin "3" + (uuid "47cf028f-ead9-4283-8575-ea3a6472850b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U36") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 195.58 44.45 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7d2f2101-75ea-444a-83d8-c4c8c25896ff") + (property "Reference" "#PWR011" + (at 195.58 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 198.12 45.72 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 195.58 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 195.58 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "efde7888-fc6d-4088-94d9-fe05eec9dfc9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR011") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 67.31 204.47 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7e23e46d-fbc0-43c5-8a43-f59cdf036335") + (property "Reference" "C14" + (at 61.0067 204.47 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 63.4309 204.47 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 66.3448 208.28 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 67.31 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 67.31 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8e6dbea1-cf91-4e9c-87cb-80e12d07ce47") + ) + (pin "1" + (uuid "38c20451-f23c-499b-9ca8-952e7573620c") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 24.13 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "7e68277f-e589-41c6-ba2d-53831651fb13") + (property "Reference" "L31" + (at 149.8021 22.8628 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 147.3779 22.8628 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 148.59 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "49a52f64-317b-4e79-92ca-295eb3741668") + ) + (pin "1" + (uuid "d459ed3b-4554-44b3-9cda-34a6670874a0") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L31") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 67.31 44.45 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7ef35350-3266-4419-9dcb-aaab5e8fc112") + (property "Reference" "#PWR010" + (at 67.31 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 64.77 45.72 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 67.31 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 67.31 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5f1edf5c-9dd1-48ce-af13-8a2f278464f9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR010") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 26.67 53.34 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7f12f7c2-7b26-4458-af19-45d6b8276bb8") + (property "Reference" "#PWR014" + (at 26.67 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 26.67 49.2069 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "4658e493-9b19-4e19-9662-762d6d686eda") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR014") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 184.15 193.04 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7fc91830-fc74-498f-9673-842bfbe12003") + (property "Reference" "U19" + (at 184.15 182.5457 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 184.15 184.9699 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 184.15 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 184.15 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 184.15 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 184.15 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "e426d5bf-c657-4973-a642-93ff0f3aebdd") + ) + (pin "6" + (uuid "3eaf43c8-a689-4454-89b1-f3bb1f3b959c") + ) + (pin "4" + (uuid "888ada58-3f4e-4ad5-9b90-b62fe930f2d7") + ) + (pin "1" + (uuid "6126ea0e-fa12-4b16-859c-cf1fd8f59f01") + ) + (pin "2" + (uuid "9ee37809-c31a-4987-9090-84935eee8ae7") + ) + (pin "3" + (uuid "8e10fbef-a111-412b-bf19-df5c53fbf86a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 266.7 99.06 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "801ba944-f765-4e28-9609-8a53dda70fab") + (property "Reference" "C23" + (at 260.3967 99.06 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 262.8209 99.06 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 265.7348 95.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 266.7 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 266.7 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 266.7 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "bb683667-a5f6-4298-8477-9f31c2b22213") + ) + (pin "1" + (uuid "2ea48faa-f153-41f3-8481-049ff1ba2fa1") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C23") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 347.98 22.86 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "804ad77f-5d5f-458c-b355-352ea1bcabfd") + (property "Reference" "L43" + (at 349.1921 21.5928 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 346.7679 21.5928 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 347.98 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 347.98 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 347.98 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ff4f19b0-ad8b-4113-85e9-339864a656a3") + ) + (pin "1" + (uuid "c856009e-f30b-4dd3-a3e3-490c8afccbe6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L43") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 204.47 121.92 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "80a7a11c-e408-4458-81e7-14c5eec7472e") + (property "Reference" "C408" + (at 204.47 128.2233 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 204.47 125.7991 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 208.28 122.8852 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 204.47 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 204.47 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 204.47 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5736e8d8-f133-4ee4-a817-4d867ae11481") + ) + (pin "1" + (uuid "1e15daa9-a77e-4ace-a236-95436fa8a21c") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C408") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 299.72 88.9 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "80bc6212-469e-4e0b-8067-1a884007189c") + (property "Reference" "C291" + (at 299.72 82.5967 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 299.72 85.0209 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 303.53 87.9348 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 299.72 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 299.72 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 299.72 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "caa54cde-6747-4a13-b4ba-40a730d3d209") + ) + (pin "1" + (uuid "80064950-571f-409e-a19d-7d53d7866809") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C291") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 67.31 168.91 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "81380a7c-55ae-45ee-b903-af1472bd3eba") + (property "Reference" "C13" + (at 61.0067 168.91 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 63.4309 168.91 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 66.3448 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 67.31 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 67.31 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "03ec6f1f-d385-4597-9541-216852168ea8") + ) + (pin "1" + (uuid "dd6f2013-341c-428e-8d5b-19209bc8e81d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 104.14 69.85 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "83e939ae-b2f4-4f7c-9459-14dfa4afc16c") + (property "Reference" "C202" + (at 101.219 68.6379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1.2 nF" + (at 101.219 71.0621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 105.1052 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 104.14 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 104.14 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 104.14 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c7a77c6d-d578-450a-ab7b-c3ffd6c1f6d8") + ) + (pin "1" + (uuid "077db8f7-9495-4ad6-9e5c-814bc29c114b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C202") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 231.14 31.75 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "85253f67-6a4f-4a7d-b4c6-2a6b052ddcee") + (property "Reference" "U23" + (at 232.41 24.13 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 236.22 21.59 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 231.14 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 231.14 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 231.14 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 231.14 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c18d374c-a00c-4875-99ad-55e933c3bbfe") + ) + (pin "4" + (uuid "6d1d35af-6dbc-4c9a-9c3b-5cd04598000c") + ) + (pin "3" + (uuid "38b265c4-f916-4e1e-83b4-7d4f08748e4f") + ) + (pin "5" + (uuid "065e35fd-b2ac-42ab-8e90-e0cc1560a19c") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U23") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 195.58 171.45 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "86e33683-5e97-4a0b-a49d-fe810cac414a") + (property "Reference" "#PWR033" + (at 195.58 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 198.12 172.72 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 195.58 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 195.58 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c3e1d447-f51d-4c6f-8cf2-806c52e25236") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR033") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 100.33 190.5 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "87358c73-aab0-465f-9952-a8e5f26f2f25") + (property "Reference" "C601" + (at 100.33 184.1967 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 100.33 186.6209 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 104.14 189.5348 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 100.33 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 100.33 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 100.33 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "62ce0179-14d7-4d2e-bb2e-c45e6e2d76f0") + ) + (pin "1" + (uuid "7d278053-6f30-426f-8626-57ac82323ad7") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C601") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 67.31 72.39 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8998bd52-3a1b-4f6b-bc99-e34679f08d74") + (property "Reference" "C10" + (at 61.0067 72.39 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 63.4309 72.39 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 66.3448 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 67.31 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 67.31 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6e769b20-d61e-4d84-94a6-245b40dea7f7") + ) + (pin "1" + (uuid "786bd00d-c419-431d-84fb-dee87c86629b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 54.61 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "8a52b8c3-4798-4299-9449-2becbe6d6212") + (property "Reference" "L32" + (at 124.4021 53.3428 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 121.9779 53.3428 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 123.19 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1f67aa82-ed52-48aa-9b55-bf21ddef81e3") + ) + (pin "1" + (uuid "d5fc557d-0cd3-4132-aac4-cd84a249ce82") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L32") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 308.61 97.79 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "8ac17f89-e3c5-4bec-9ded-32603b67dced") + (property "Reference" "L291" + (at 309.8772 96.5779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "245 nH" + (at 309.8772 99.0021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 308.61 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 308.61 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 308.61 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c0a3adbc-0037-4053-a4f1-ba42ec7d4d14") + ) + (pin "2" + (uuid "9d997b0b-e952-4678-ba33-3114dd5fe221") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L291") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 31.75 33.02 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8b2a09c1-dcf6-4264-91b0-ae7cc85c68f2") + (property "Reference" "U2" + (at 33.02 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 36.83 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 31.75 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 31.75 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 31.75 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 31.75 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "39383cba-61a1-4de7-bd3b-5248a354b1df") + ) + (pin "4" + (uuid "6a11dc15-3523-4f2b-baaa-180edbf51107") + ) + (pin "3" + (uuid "be54cda1-9807-4eaa-a855-cd3a96cf0193") + ) + (pin "5" + (uuid "8eec0f02-b5dc-4649-9a7e-88ac24ed4a4c") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 320.04 73.66 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8b8a1187-0eaa-47ad-9c5c-69b6ede0c302") + (property "Reference" "#PWR054" + (at 320.04 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 317.5 74.93 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 320.04 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 320.04 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 320.04 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2813c8d7-87e3-48b8-a8c6-1b5182a9cd88") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR054") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 31.75 63.5 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8b9dfe83-36c5-42ff-9b43-b6ef28db6613") + (property "Reference" "U5" + (at 33.02 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 36.83 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 31.75 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 31.75 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 31.75 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 31.75 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5627a583-6e1e-429f-bb24-7bb3a41cec0c") + ) + (pin "4" + (uuid "5e35edcb-1e60-470f-9f37-664a4b9be79d") + ) + (pin "3" + (uuid "493e5ea7-7246-47ce-9f8b-8f8cf1dc2a51") + ) + (pin "5" + (uuid "c9032056-7905-4767-b6c6-f3dd971859d6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 153.67 100.33 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8cee4f43-7ec5-42f5-8ea2-4de15017af6f") + (property "Reference" "C306" + (at 150.749 99.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "750 pF" + (at 150.749 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 154.6352 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 153.67 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d5a5131f-bc97-40ef-9af9-d1bfc1c5de98") + ) + (pin "1" + (uuid "2d18e86a-ac42-475c-abcf-3c8f5f29c446") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C306") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 204.47 187.96 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8db36bda-b487-479c-9008-dec1002f6f0e") + (property "Reference" "C608" + (at 204.47 194.2633 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 204.47 191.8391 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 208.28 188.9252 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 204.47 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 204.47 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 204.47 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "95cb391f-72db-4bb6-b803-2c83475bc797") + ) + (pin "1" + (uuid "a93f646c-e160-420e-ad3d-f9b0c09baf6f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C608") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 364.49 88.9 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "8e42629a-4d36-4959-be4d-d6a98a8b24e4") + (property "Reference" "C297" + (at 364.49 82.5967 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 364.49 85.0209 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 368.3 87.9348 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 364.49 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 364.49 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 364.49 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "853ee617-d4aa-43ae-927f-3356309b862e") + ) + (pin "1" + (uuid "38058dda-fcd8-4a57-9770-0f4a4217d7ec") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C297") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 26.67 182.88 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "8ed661a5-24c3-4fd8-82d5-3bdd6869ec0a") + (property "Reference" "#PWR034" + (at 26.67 186.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 26.67 178.7469 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "49a05eea-c29d-49dd-870c-97361c2eb345") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR034") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 133.35 39.37 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "8fb2cfa3-923e-4052-b142-52c61df9d503") + (property "Reference" "L103" + (at 134.6172 38.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "560 nH" + (at 134.6172 40.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 133.35 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 133.35 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 133.35 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f406c9b3-367b-4a4b-8424-24a0eedd58d1") + ) + (pin "2" + (uuid "5454fde1-7ec2-4ac2-8a6b-bda61b5dae19") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L103") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 184.15 160.02 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "90606b27-7996-45c3-bfd8-fef9b6531260") + (property "Reference" "U16" + (at 184.15 149.5257 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 184.15 151.9499 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 184.15 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 184.15 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 184.15 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 184.15 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "d13e5487-58d4-4f92-bc64-fe6e54cb5c54") + ) + (pin "6" + (uuid "1d8734ad-5c01-4330-8676-7477592f1549") + ) + (pin "4" + (uuid "3804ea33-3650-4de0-a458-a8e34aa98071") + ) + (pin "1" + (uuid "dbbbcaa8-e9e1-4130-bbfb-fed17d8f6941") + ) + (pin "2" + (uuid "2dfcdedc-4eda-453d-bcc3-60ceb9fad193") + ) + (pin "3" + (uuid "0b231fea-7d6a-49c1-885a-141997b8417b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 347.98 29.21 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "9060a45d-5633-41e7-be50-6521a5c92161") + (property "Reference" "L94" + (at 347.98 24.5604 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "11 uH" + (at 347.98 26.9846 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 347.98 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 347.98 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 347.98 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5bbc7f60-f54e-44bd-82d5-1d19d0aadef5") + ) + (pin "2" + (uuid "e7b4f259-29ba-41d1-ad33-85bb5ec16bbf") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L94") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 60.96 121.92 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9073a28f-c092-4d9a-9f0d-9a9f85f922ef") + (property "Reference" "C400" + (at 60.96 128.2233 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 60.96 125.7991 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 64.77 122.8852 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 60.96 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 60.96 121.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "55d14c3f-d4e3-4426-9f52-5f485a77ede7") + ) + (pin "1" + (uuid "2a896203-6516-4100-b2ed-e0b1b3a7f2d7") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C400") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 60.96 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "915c7783-1619-4ea8-965a-a68f8812ce9c") + (property "Reference" "L202" + (at 123.19 56.3104 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "3.9 uH" + (at 123.19 58.7346 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 123.19 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a7c95eca-688d-425e-9fed-57f60ff5dcae") + ) + (pin "2" + (uuid "262d6f2b-4fd2-4870-bae7-cc770d6db63d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L202") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 157.48 133.35 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "916058a2-f462-4fcd-93fa-970aa03bd325") + (property "Reference" "L14" + (at 156.2128 132.1379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 156.2128 134.5621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 157.48 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 157.48 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 157.48 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "de9ef7fc-b541-4d28-8d8a-d2e922af1bee") + ) + (pin "1" + (uuid "15dffc5c-3f22-4a0a-9d6a-81e64abb4f97") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 195.58 100.33 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "917e1ef3-5a6a-4c37-b497-ef6ff274ff94") + (property "Reference" "C17" + (at 201.8833 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 199.4591 100.33 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 196.5452 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 195.58 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 195.58 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7d10f252-6fc3-4ac5-af76-c3bac8d3d8f2") + ) + (pin "1" + (uuid "6943ebff-3c99-4bf0-a3d4-d8cae38d1b5a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 132.08 100.33 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "93ade777-b30b-4cf4-b9b4-8e33cc99a99e") + (property "Reference" "L10" + (at 130.8128 99.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 130.8128 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 132.08 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 132.08 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "0f4d9c30-d0cd-4de1-918e-5106a10f85b4") + ) + (pin "1" + (uuid "f1c13755-a161-417d-86cc-2e1767d0adea") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 114.3 190.5 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "96ac0541-43c7-4a68-82a4-744af7ef6e66") + (property "Reference" "C603" + (at 116.84 184.15 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "13 pF" + (at 118.11 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 110.49 191.4652 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 114.3 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 114.3 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 114.3 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "335dac49-e0fc-4742-b4c5-3d6668dada73") + ) + (pin "1" + (uuid "5c541902-f930-4634-80dc-e617ef78c300") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C603") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 383.54 31.75 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "99c824b4-280e-47c1-86a4-49ea26aea34e") + (property "Reference" "U25" + (at 383.54 21.2557 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 383.54 23.6799 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 383.54 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 383.54 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 383.54 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 383.54 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "7afd26f0-e442-45fd-b32d-6c5c05615989") + ) + (pin "6" + (uuid "501c691d-0d00-43a6-9091-310d85ebbd65") + ) + (pin "4" + (uuid "1eb301b5-86ac-4e64-a390-3be03a049960") + ) + (pin "1" + (uuid "559e2eb8-1f05-4c0f-aeec-698d507044bd") + ) + (pin "2" + (uuid "bded63cb-c514-4bef-ba10-d07f57d0a674") + ) + (pin "3" + (uuid "eb989cf8-a3bf-44cf-be9d-439cb65b542f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U25") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 299.72 29.21 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "9a42576b-75bc-4018-b766-b23307bb6168") + (property "Reference" "C91" + (at 299.72 22.9067 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 299.72 25.3309 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 303.53 28.2448 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 299.72 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 299.72 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 299.72 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "10340da5-131f-4e54-a51c-46d487a05ba2") + ) + (pin "1" + (uuid "bca44694-c2e0-45d6-99b8-ec266ffc148e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C91") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 64.77 266.7 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9ab010e4-c5a0-466c-98b1-bd8cf08c210f") + (property "Reference" "U1" + (at 64.77 256.2057 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 64.77 258.6299 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 64.77 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 64.77 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 64.77 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 64.77 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "308e1634-b126-4adc-b231-0ac59599925a") + ) + (pin "6" + (uuid "98292076-ab01-4e17-b244-c457aebcb7ea") + ) + (pin "4" + (uuid "00b8ac95-97bf-4c22-aa0c-14963dbf29b9") + ) + (pin "1" + (uuid "6d0876b2-e53c-4aad-b836-12aaa741e638") + ) + (pin "2" + (uuid "9d9f70ac-de50-4f58-acc9-6ef49d37da68") + ) + (pin "3" + (uuid "632228dd-3847-4755-bf81-009b828e6e8a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 295.91 205.74 90) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (uuid "9b4256a6-6110-4240-898c-5ff80af280bd") + (property "Reference" "JP3" + (at 298.45 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 293.3009 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 295.91 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 295.91 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 295.91 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 295.91 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4fad0015-2c59-419f-981b-68ca41e40ab3") + ) + (pin "1" + (uuid "510820ae-42a3-4100-8055-109d097bcb82") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "JP3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 67.31 76.2 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9d07f97b-7975-4aa8-abc3-40e178ae0131") + (property "Reference" "#PWR016" + (at 67.31 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 64.77 77.47 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 67.31 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 67.31 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 67.31 76.2 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1787c3a1-f795-4586-b00b-64e5010b3164") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR016") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 114.3 30.48 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9f8a95e4-030b-4ffd-a7ba-b2f1f410536a") + (property "Reference" "C103" + (at 116.84 24.13 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "300 pF" + (at 118.11 26.67 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 110.49 31.4452 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 114.3 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 114.3 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 114.3 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "85bde469-7221-4b79-a135-84e3d4b74bc5") + ) + (pin "1" + (uuid "fe7bc297-a87a-41af-8e6a-0e61e6be1718") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C103") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 109.22 39.37 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a0d01c02-0427-4b3c-9f0f-b464416bd7af") + (property "Reference" "L101" + (at 110.4872 38.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "1 uH" + (at 110.4872 40.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 109.22 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 109.22 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 109.22 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "12fa2207-f178-4b15-b09a-fa6131d2fac0") + ) + (pin "2" + (uuid "57ab296d-ea37-4d45-8ed9-e32ba11b94e4") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L101") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 114.3 124.46 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a1ee78c8-ef4e-45db-a39b-608734ae35b5") + (property "Reference" "C403" + (at 116.84 118.11 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "51 pF" + (at 118.11 120.65 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 110.49 125.4252 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 114.3 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 114.3 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 114.3 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7bd08496-009a-49e3-96d0-7247cd8958a4") + ) + (pin "1" + (uuid "679ce25b-5ad5-493a-ad8d-f4dae194477e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C403") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 31.75 160.02 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a4c47583-b723-458d-8eef-ed85f0d769a8") + (property "Reference" "U14" + (at 33.02 152.4 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 36.83 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 31.75 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 31.75 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 31.75 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 31.75 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "24a25084-2e85-4826-94c7-e5ee835dd1ec") + ) + (pin "4" + (uuid "2384f52a-974c-4035-a218-58ef000aa9a3") + ) + (pin "3" + (uuid "ba5c3207-4e0b-4487-9fdc-a4b20293ca45") + ) + (pin "5" + (uuid "c8c06ecd-8384-40c3-8d51-7c27e6c83e9a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 322.58 22.86 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "a511e73b-fe2f-4f8f-83e6-870438eb4305") + (property "Reference" "L42" + (at 323.7921 21.5928 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 321.3679 21.5928 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 322.58 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c80b05f4-ffda-41c3-a01d-4a114bffac11") + ) + (pin "1" + (uuid "ff1eb168-5333-42a9-8057-cda84c7f35c7") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L42") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 331.47 68.58 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "a5b9195a-f51d-4909-8c92-985b276e89bb") + (property "Reference" "L25" + (at 330.2028 67.3679 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 332.105 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 331.47 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 331.47 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 331.47 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6c13ae52-25c3-418d-863b-04c0e5bca4be") + ) + (pin "1" + (uuid "18878515-bcfe-4863-bd61-2531d6a7acb3") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L25") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 162.56 275.59 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a70de81e-4073-4d68-b5e6-5a5e9dcfda3f") + (property "Reference" "#PWR02" + (at 162.56 281.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 160.02 276.86 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 162.56 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 162.56 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 162.56 275.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "20776632-a1b5-40a1-9941-8a7549d6fdb6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR02") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 78.74 160.02 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a82c3919-96e9-48be-8ec8-c4ed698f5c7f") + (property "Reference" "U15" + (at 78.74 149.5257 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 78.74 151.9499 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 78.74 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 78.74 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 78.74 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 78.74 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "3d0e8312-a001-4a91-aa6a-cdfaabef3ed5") + ) + (pin "6" + (uuid "82760f6f-fb80-4ee4-93b6-ff09fd4d9454") + ) + (pin "4" + (uuid "a6a42e13-ddc0-4384-b0e4-e25e0d072e2c") + ) + (pin "1" + (uuid "a595acd1-d2ac-48f6-87e1-6f6b8f83232b") + ) + (pin "2" + (uuid "55d4ae9c-030b-4de3-a1a8-e1e87ea2d8b7") + ) + (pin "3" + (uuid "949666f3-7529-4cea-a93d-165cf8fa6559") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 132.08 166.37 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "a8373a46-8b3d-45f8-a1bd-0343a3f96c0e") + (property "Reference" "L16" + (at 130.8128 165.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 130.8128 167.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 132.08 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 132.08 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "10a29139-10c2-444c-a3ba-03d94277d1a5") + ) + (pin "1" + (uuid "60af876f-3e8a-4dc3-afbe-db940fbe782b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 26.67 43.18 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a85ee24b-b168-45be-93d5-80656fffad3d") + (property "Reference" "#PWR013" + (at 26.67 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 24.13 44.45 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "88d66b59-e551-48a1-b66f-cece25bfaecc") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR013") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 300.99 219.71 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a959a0c0-3976-4799-9ab7-cf58e3da2730") + (property "Reference" "R1" + (at 300.99 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 303.53 220.98 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 302.768 219.71 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 300.99 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 300.99 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "652-CR1206FX-2201ELF" + (at 300.99 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "37b42823-271e-4b17-8ab5-c48cd14b7a5e") + ) + (pin "1" + (uuid "427fbf5d-8e74-4c19-95a2-fabd949f862a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "R1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 292.1 171.45 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a9f8ac4a-7acb-45a5-9e25-ac41156bd9ba") + (property "Reference" "R6" + (at 290.7142 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 288.29 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 293.878 171.45 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 292.1 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 292.1 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "652-CR1206FX-2201ELF" + (at 292.1 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4ae32b87-bded-4cec-b8e7-df26a1a96bfa") + ) + (pin "1" + (uuid "1cedb46a-16f3-470c-82d2-e01893bf41aa") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "R6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 114.3 60.96 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "aa74b7bc-4033-4511-ad79-a3e3128f4609") + (property "Reference" "C203" + (at 116.84 54.61 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "180 pF" + (at 118.11 57.15 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 110.49 61.9252 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 114.3 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 114.3 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 114.3 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6c2d8380-3f7a-4c24-8bf0-b99c7293e116") + ) + (pin "1" + (uuid "42fc5d7c-883a-4e39-ac30-cd5c9ec81f9f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C203") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 137.16 274.32 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "aa80efdd-e3c7-4b66-a296-3bdb96241bb5") + (property "Reference" "#PWR071" + (at 137.16 280.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 134.62 275.59 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 137.16 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 137.16 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 137.16 274.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "85f7f641-b1d5-4e85-a38e-f6115ba433ed") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR071") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 128.27 133.35 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ac26ffc5-1284-488b-8fd4-ff89c4d5a43a") + (property "Reference" "C404" + (at 125.349 132.1379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "680 pF" + (at 125.349 134.5621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 129.2352 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 128.27 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 128.27 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 128.27 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "706ba762-acd4-4359-b761-7fb2db9a00cd") + ) + (pin "1" + (uuid "8e3a2466-70a9-4377-aea2-9da24861c674") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C404") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Screw_Terminal_01x02") + (at 207.01 270.51 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "acbc57ee-b3ae-478f-a97d-3ff4071000b2") + (property "Reference" "J3" + (at 209.042 270.5679 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "12-13.8V" + (at 209.042 272.9921 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "TerminalBlock:TerminalBlock_bornier-2_P5.08mm" + (at 207.01 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 207.01 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 207.01 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "538-39880-4302" + (at 207.01 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "99504299-ac90-44a1-a6b1-4db213d5ef7a") + ) + (pin "2" + (uuid "f249257d-93c0-4841-b1af-4eee965e01bb") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "J3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 128.27 100.33 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ad829f47-7d9a-4b19-b211-fbecb5cd57aa") + (property "Reference" "C304" + (at 125.349 99.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1.3 nF" + (at 125.349 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 129.2352 96.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 128.27 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 128.27 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 128.27 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a25de6fe-ab9d-4393-ba53-b8fb598ebf9f") + ) + (pin "1" + (uuid "b46ef9e1-e3bc-4a86-898d-414bf8448e21") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C304") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 195.58 40.64 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b005f619-fa97-4d9c-956c-e371a739640d") + (property "Reference" "C15" + (at 201.8833 40.64 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 199.4591 40.64 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 196.5452 36.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 195.58 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 195.58 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c986f35f-a9e3-4eba-942e-8476a2baaffa") + ) + (pin "1" + (uuid "cdc97bb2-ffd2-474c-a47d-9dfd46c6a6d1") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 31.75 227.33 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b0d8f4d7-db61-4041-84a8-ce12b1cb4114") + (property "Reference" "U20" + (at 33.02 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 36.83 217.17 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 31.75 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 31.75 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 31.75 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 31.75 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ab97b5ff-b00c-4b60-937f-da0c184d34da") + ) + (pin "4" + (uuid "999a7dd1-77e5-43de-adce-7236a60f5b18") + ) + (pin "3" + (uuid "7614642c-442b-4088-830d-90a5c5826e1f") + ) + (pin "5" + (uuid "e17b77fd-afe6-4136-bf96-931f73b07a08") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 157.48 39.37 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "b2e53fcc-1ece-40a2-92ea-4b812b334895") + (property "Reference" "L5" + (at 156.2128 38.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 156.2128 40.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 157.48 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 157.48 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 157.48 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d2f80e41-88d7-4b73-b1a2-d6eddd81df0d") + ) + (pin "1" + (uuid "137a706a-406e-4086-a002-1b1d9211d678") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 132.08 39.37 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "b2fa16d7-67b6-4386-8a2b-6f3b8fbe0b19") + (property "Reference" "L4" + (at 130.8128 38.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 130.8128 40.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 132.08 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 132.08 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "95a164a1-a734-4622-bb41-e32d15c9a7db") + ) + (pin "1" + (uuid "a7c8d71e-9163-41e0-b9ca-ad01df6e98f5") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 104.14 133.35 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b3803943-f473-4db2-a06f-a10d96b3e9d4") + (property "Reference" "C402" + (at 101.219 132.1379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "390 pF" + (at 101.219 134.5621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 105.1052 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 104.14 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 104.14 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 104.14 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8fe59f43-0399-49ad-ad09-3a4f8216ccc4") + ) + (pin "1" + (uuid "ac7ad34d-7344-4820-b698-3e484de1bf2c") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C402") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 204.47 58.42 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b4edd278-864a-46c2-9995-ce8a7cab377f") + (property "Reference" "C208" + (at 204.47 64.7233 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 204.47 62.2991 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 208.28 59.3852 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 204.47 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 204.47 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 204.47 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c6091e4b-9e4a-47cf-8db7-87487bcd4f81") + ) + (pin "1" + (uuid "6cced154-7bd2-4961-abdf-dda4d246ae28") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C208") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 176.53 257.81 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b70b0ec9-9d16-4c70-959e-fbe008fbb4e8") + (property "Reference" "#PWR044" + (at 176.53 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 173.99 259.08 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 176.53 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 176.53 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 176.53 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0fabe346-544c-4c83-b212-ddaef648d075") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR044") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 104.14 39.37 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b8b913e9-96be-4fd3-9f09-32da53ee478e") + (property "Reference" "C102" + (at 101.219 38.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "1.8 nF" + (at 101.219 40.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 105.1052 35.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 104.14 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 104.14 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 104.14 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e4a0b939-4dbd-402f-b3ee-c6d4798039f7") + ) + (pin "1" + (uuid "ea87f7bc-157e-46de-802a-219814253b58") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C102") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 157.48 199.39 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "b8bf12b2-9e3d-4552-8275-1eda5c272464") + (property "Reference" "L20" + (at 156.2128 198.1779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 156.2128 200.6021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 157.48 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 157.48 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 157.48 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "21d8d090-afd5-48fa-8f34-467672d6c5e9") + ) + (pin "1" + (uuid "31e5103b-0ec3-4fc9-92ce-ef3439a3fe6d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 347.98 88.9 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b9a5bb64-483b-4dec-8b15-fc9aeb95723d") + (property "Reference" "L294" + (at 347.98 84.2504 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "3.6 uH" + (at 347.98 86.6746 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 347.98 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 347.98 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 347.98 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "192749c9-6524-4825-8e85-891674985be8") + ) + (pin "2" + (uuid "333d0493-1381-47c3-b481-e1d4eb650be6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L294") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 184.15 63.5 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b9a786ad-818c-473e-8ab8-af4659f26d1e") + (property "Reference" "U7" + (at 184.15 53.0057 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 184.15 55.4299 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 184.15 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 184.15 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 184.15 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 184.15 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "6ad3b4d6-1dd4-4976-9da0-b955af339b19") + ) + (pin "6" + (uuid "c6e8801f-d02b-4e9d-86e0-a3913dcd50e7") + ) + (pin "4" + (uuid "f4e300c0-e3d3-442d-a120-b701fda1df97") + ) + (pin "1" + (uuid "a1ba6658-d3cf-4763-bd12-c2ce2533a1e3") + ) + (pin "2" + (uuid "babbd8f0-8af7-4f4b-bd5f-496ed83c0798") + ) + (pin "3" + (uuid "e8f504b1-e40b-42c3-be8a-a80f5253e298") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 313.69 88.9 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ba13694d-96cc-47cd-8551-26e2bfbe44fe") + (property "Reference" "C293" + (at 316.23 82.55 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "68 pF" + (at 317.5 85.09 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 309.88 89.8652 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 313.69 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 313.69 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 313.69 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "97d7dd56-8859-47ec-8c29-71db46579631") + ) + (pin "1" + (uuid "9e45089b-2935-4fd2-ba92-fb345756a9ad") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C293") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 195.58 139.7 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ba2011ba-a32d-42f0-a8a2-37b8986e1a95") + (property "Reference" "#PWR028" + (at 195.58 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 198.12 140.97 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 195.58 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 195.58 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5ff1504c-d995-4643-9a7c-99b087953942") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR028") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 278.13 60.96 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ba325d62-a64c-441c-938f-5a2a46139c67") + (property "Reference" "U27" + (at 278.13 50.4657 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 278.13 52.8899 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 278.13 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 278.13 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 278.13 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 278.13 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "b981ee71-4a5e-4b81-bff9-6accf3670670") + ) + (pin "6" + (uuid "4209db37-8bb9-4346-b04e-5c9107dc1c61") + ) + (pin "4" + (uuid "c09479fc-b39b-4db3-b138-992c49add882") + ) + (pin "1" + (uuid "2a6d661e-a2df-4929-be4b-c842ae7724fa") + ) + (pin "2" + (uuid "19a6998c-9a3e-400a-8fc8-dff8dfd9716a") + ) + (pin "3" + (uuid "f8b93541-e3f6-44e3-ae0b-17d0c8409c2d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U27") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Polarized") + (at 260.35 266.7 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "baa1f231-e52b-4d64-a4d0-798cf0552ac2") + (property "Reference" "C3" + (at 263.271 264.5989 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "470uF 25V" + (at 263.271 267.0231 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_THT:CP_Radial_D10.0mm_P5.00mm" + (at 261.3152 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 260.35 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 260.35 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "667-ECA-1EM471" + (at 260.35 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "85583bfb-a8b8-4354-989a-3ee627be49e6") + ) + (pin "1" + (uuid "cd4240ca-9063-43b2-b843-d7624a073a5a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 109.22 100.33 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "babcc716-da31-4857-9d17-a97273d23e98") + (property "Reference" "L301" + (at 110.4872 99.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "220 nH" + (at 110.4872 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 109.22 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 109.22 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 109.22 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b2559ee1-939d-403d-93af-6624bdb5cb7f") + ) + (pin "2" + (uuid "f0016aed-ef11-454f-89b5-4395e946d98a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L301") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 368.3 186.69 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "bb2d6c00-36dc-49a6-918c-a6a299258496") + (property "Reference" "R7" + (at 370.586 185.674 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 369.824 187.706 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 370.078 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 368.3 186.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 368.3 186.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "652-CR1206FX-2201ELF" + (at 368.3 186.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "0eb48c25-9d47-48c9-8eac-564967f049fb") + ) + (pin "1" + (uuid "defbb125-812c-4054-aae2-b5e21623b49f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "R7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 26.67 22.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bb3a4ad0-44e6-40e5-a507-9c389eb561cc") + (property "Reference" "#PWR012" + (at 26.67 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 26.67 18.7269 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 22.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "af9e2f80-a050-45af-949d-81fdeb2abd1f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR012") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 60.96 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bb905444-af5f-4686-b46f-008e319d8dc8") + (property "Reference" "L204" + (at 148.59 56.3104 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "3.9 uH" + (at 148.59 58.7346 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 148.59 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "92718142-2539-4c53-b96f-f6492992634b") + ) + (pin "2" + (uuid "69282db0-059d-4a3d-ba0d-ff005bce9ef1") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L204") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 387.35 245.11 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bbe077b9-375f-43f1-a17c-902eb31b6289") + (property "Reference" "#PWR045" + (at 387.35 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 387.35 249.2431 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 387.35 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 387.35 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 387.35 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "140ba323-fa7a-4839-955a-9fff50fc1990") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR045") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 133.35 166.37 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "be36d94c-d46b-46ee-9469-906b2614a1bd") + (property "Reference" "L503" + (at 134.6173 165.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "82 nH" + (at 134.6173 167.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 133.35 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 133.35 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 133.35 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "51c238c2-6eb4-4d95-8b04-a47b17e9e99e") + ) + (pin "2" + (uuid "107ae31a-0140-471a-b9dc-49bd7a1f76e0") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L503") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 114.3 91.44 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "be9ed157-22f3-468a-b2a2-4929ee0539c3") + (property "Reference" "C303" + (at 116.84 85.09 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "75 pF" + (at 118.11 87.63 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 110.49 92.4052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 114.3 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 114.3 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 114.3 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "91c6b11c-b7e0-4040-bf56-076c6ad0f20a") + ) + (pin "1" + (uuid "230b9e47-d137-4173-a692-07b28fc7073b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C303") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 356.87 38.1 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "bf71f69c-bf30-4bba-8a20-10a269f45c3c") + (property "Reference" "L21" + (at 355.6028 36.8879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 357.505 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 356.87 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 356.87 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 356.87 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3612fad7-e290-4765-b2ac-2e7b0aeecdba") + ) + (pin "1" + (uuid "07250391-cab0-467d-b267-e442a39f308d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 26.67 217.17 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "bf87ee13-505d-4c50-aace-c7da56efdb57") + (property "Reference" "#PWR039" + (at 26.67 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 30.226 214.884 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 217.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 217.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 217.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f5aec988-55ef-4b6c-aa08-a73cfb458901") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR039") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 347.98 52.07 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "bfd38731-c79b-4a14-b364-372ead90daaf") + (property "Reference" "L45" + (at 349.1921 50.8028 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 346.7679 50.8028 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 347.98 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 347.98 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 347.98 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d70db2b5-46e4-4d84-9731-e2334a4f10c3") + ) + (pin "1" + (uuid "653cbf09-7f57-46c0-9fe1-5ae481083d0a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L45") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 266.7 72.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c0ccc94e-b404-4332-9340-c75db95c0f9e") + (property "Reference" "#PWR053" + (at 266.7 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 264.16 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 266.7 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 266.7 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 266.7 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0e89e069-c523-4416-8d5f-93e96b92a73e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR053") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 128.27 69.85 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c16e3415-aa85-412f-8790-b6786a872856") + (property "Reference" "C204" + (at 125.349 68.6379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2 nF" + (at 125.349 71.0621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 129.2352 66.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 128.27 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 128.27 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 128.27 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7ba0e5ac-7c98-4132-ad77-94e7f45be536") + ) + (pin "1" + (uuid "d8ca089b-d27b-4c92-be1e-499da6b0c556") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C204") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 331.47 39.37 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "c2304032-9629-42d0-baf5-4a1a9303f25d") + (property "Reference" "L22" + (at 330.2028 38.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 332.105 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 331.47 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 331.47 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 331.47 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1fb829ab-77d6-4702-aa7a-20c110cc463f") + ) + (pin "1" + (uuid "ac857bc4-2e05-46be-a0b5-ef35348a16ff") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 54.61 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "c2ccf770-492a-4cd4-bb4a-af33ef39f849") + (property "Reference" "L33" + (at 149.8021 53.3428 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 147.3779 53.3428 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 148.59 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1da91fc9-7c65-4112-a1a4-038af695b84d") + ) + (pin "1" + (uuid "3b82147d-d1b0-4c8e-b920-2cac8b4a0de2") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L33") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 184.15 33.02 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c4d45f4a-1da6-4bca-bb11-1c89f92514f5") + (property "Reference" "U4" + (at 184.15 22.5257 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 184.15 24.9499 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 184.15 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 184.15 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 184.15 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 184.15 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "85cd47a0-fe4a-4a49-a31b-56b3f06f2b25") + ) + (pin "6" + (uuid "78c96635-2205-443f-9e31-98ae208e1231") + ) + (pin "4" + (uuid "7abcba95-8ede-4f9e-a2cf-199d3bf84bdf") + ) + (pin "1" + (uuid "0df9700a-1b38-4496-b471-e871f3a42e6d") + ) + (pin "2" + (uuid "aa126edf-17a9-40b3-8a88-ea6879c0b490") + ) + (pin "3" + (uuid "00128a23-9eae-4966-acb1-743d4883dab8") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 332.74 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c55acb44-9630-45a4-af8f-3f687105c2e2") + (property "Reference" "L93" + (at 334.0072 36.8879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "1 uH" + (at 334.0072 39.3121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 332.74 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 332.74 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 332.74 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "efc3ec39-5bb2-4259-96f6-ef2a1b3dbf60") + ) + (pin "2" + (uuid "58cff100-51a0-4510-9879-76456e017a44") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L93") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 62.23 276.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c6cf46c6-4c02-4a6e-b90b-373f3531beaf") + (property "Reference" "#PWR072" + (at 62.23 283.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 59.69 278.13 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 62.23 276.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 62.23 276.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 62.23 276.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e2d26622-0715-419a-b039-6e5bb13bd7f2") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR072") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 85.09 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "c8c36259-05f1-4f6f-ac2a-433e6383eeb9") + (property "Reference" "L35" + (at 149.8021 83.8228 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 147.3779 83.8228 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 148.59 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "bce8cf4b-d574-4cae-860a-16077566a039") + ) + (pin "1" + (uuid "5eb2a7a2-0dcf-4c15-92fb-93e46002a0cd") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L35") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 128.27 166.37 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c9760e08-2dae-46cb-b53d-c371da609d72") + (property "Reference" "C504" + (at 125.349 165.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "510 pF" + (at 125.349 167.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 129.2352 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 128.27 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 128.27 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 128.27 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2aab4959-041b-4559-995f-be9e000ced04") + ) + (pin "1" + (uuid "499cec88-3c40-4bdf-92bb-25f33fd5cee7") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C504") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 26.67 149.86 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "cadae2ee-f5ca-4055-9b2d-f98108c16269") + (property "Reference" "#PWR029" + (at 26.67 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 26.67 145.7269 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 149.86 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "055d1061-a3cc-4efa-a4de-ad830578d5f9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR029") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 104.14 199.39 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "cb05ddd4-7ebb-4b93-8b3b-81ae7bce8e2b") + (property "Reference" "C602" + (at 101.219 198.1779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "240 pF" + (at 101.219 200.6021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 105.1052 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 104.14 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 104.14 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 104.14 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "339313d2-16cc-4ffb-899c-ab36bc6766cc") + ) + (pin "1" + (uuid "c980a09a-e3ef-4c52-b3dc-e2d54fcc4755") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C602") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 153.67 166.37 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "cbeb3187-6ac6-47e7-8fbc-9db11f498dd5") + (property "Reference" "C506" + (at 150.749 165.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "300 pF" + (at 150.749 167.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 154.6352 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 153.67 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "4b414250-58e6-441b-89ce-9946bc554f60") + ) + (pin "1" + (uuid "eaa5177d-4354-45da-bf77-ec5c9842dcbd") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C506") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 124.46 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ccef1fa5-27ec-47af-b905-9ba079fb7d99") + (property "Reference" "L404" + (at 148.59 119.8104 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1.2 uH" + (at 148.59 122.2346 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 148.59 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "14bdea16-b6fb-41d9-a730-24c88c771ca7") + ) + (pin "2" + (uuid "b37393ed-0b42-4c0b-b565-1564797980a9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L404") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 332.74 67.31 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "cd2ba727-e3f4-457b-a59f-38bcac593090") + (property "Reference" "L193" + (at 334.0072 66.0979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "400 nH" + (at 334.0072 68.5221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 332.74 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 332.74 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 332.74 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "62cb27e6-ea8d-4845-9ba7-7567ae0d616e") + ) + (pin "2" + (uuid "652de6e6-a096-4ca9-93d5-fa43cd5997f0") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L193") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 226.06 41.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ce0bedb2-f42c-43a8-bcb6-17b3e1a2e40b") + (property "Reference" "#PWR047" + (at 226.06 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 223.52 43.18 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 226.06 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 226.06 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "cfcc6220-5ff5-4a56-bab3-09ed73b31aaa") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR047") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 290.83 205.74 90) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (uuid "ce89803d-b345-4a8a-98ba-4c9650019bbe") + (property "Reference" "JP4" + (at 293.37 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 288.2209 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 290.83 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 290.83 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 290.83 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 290.83 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "499b30df-b447-4849-8ec7-4bf14d7e94d5") + ) + (pin "1" + (uuid "fe77b55e-d799-47c6-846f-32437fef1407") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "JP4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 401.32 26.67 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ce8bfaf7-015e-4e10-8a06-0f0d59a5d425") + (property "Reference" "C98" + (at 401.32 32.9733 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 401.32 30.5491 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 405.13 27.6352 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 401.32 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 401.32 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 401.32 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f52acc4b-4f33-4b4b-afbd-bcc1d47b8d7a") + ) + (pin "1" + (uuid "fb1b4521-e0aa-493a-9f3d-695b9d90de4c") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C98") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 165.1 60.96 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "cf5927cc-079c-4712-88b0-c0fbfa5b66fe") + (property "Reference" "C207" + (at 165.1 54.6567 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 165.1 57.0809 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 168.91 59.9948 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 165.1 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 165.1 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "44f57525-6420-4f78-8322-df3ae3ee6e08") + ) + (pin "1" + (uuid "2ec69f94-a618-4db6-a6d0-8081cf7912c2") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C207") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "74xGxx:74LVC1G04") + (at 231.14 60.96 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "cfefc58e-4108-45d3-9f9c-858348b8351a") + (property "Reference" "U26" + (at 232.41 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SN74LVC1G04DCK" + (at 236.22 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:SOT-SC70" + (at 231.14 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/sn74lvc1g04.pdf" + (at 231.14 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 231.14 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "595-SN74LVC1G04DCKR" + (at 231.14 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "854e9463-6f6c-4624-9e2d-353976223a16") + ) + (pin "4" + (uuid "7c3fa971-afb5-4afe-81bc-18b9d7bc2db8") + ) + (pin "3" + (uuid "166f648f-15ce-4308-9451-cd178845dd8d") + ) + (pin "5" + (uuid "9e73c656-7350-46a0-94b8-79312c793c3e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U26") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 204.47 88.9 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d0ad51f4-1d6a-4bea-baaf-eed16ec36370") + (property "Reference" "C308" + (at 204.47 95.2033 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 204.47 92.7791 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 208.28 89.8652 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 204.47 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 204.47 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 204.47 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8183399d-c2da-4558-8782-a97a6f543e02") + ) + (pin "1" + (uuid "186f44ec-4532-42d3-a786-688f665146c7") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C308") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 195.58 104.14 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d0e40b72-058f-4136-82a0-662354c3e307") + (property "Reference" "#PWR023" + (at 195.58 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 198.12 105.41 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 195.58 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 195.58 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fa7148c8-16c0-4814-9b7f-90dc478ec0dd") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR023") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 109.22 199.39 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d247bb65-7515-4e55-941d-98910a11ff27") + (property "Reference" "L601" + (at 110.4873 198.1779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "39 nH" + (at 110.4873 200.6021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 109.22 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 109.22 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 109.22 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8bbf3059-2a98-47d9-9429-6798b8034e6c") + ) + (pin "2" + (uuid "c1b2cc58-38f8-444f-a66e-771b43838ea1") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L601") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 167.64 234.95 90) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (uuid "d28a7d93-0fe9-44c5-b657-6889bd423f57") + (property "Reference" "JP11" + (at 170.18 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 165.0309 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 167.64 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 167.64 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 167.64 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 167.64 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8c021c01-3b0d-41d1-8a4e-9bc3df391838") + ) + (pin "1" + (uuid "838db0e6-bfe7-4646-bba1-4e8d40149f77") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "JP11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 151.13 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "d32e172e-db59-47b0-be54-8d83b797a810") + (property "Reference" "L38" + (at 124.4021 149.8628 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 121.9779 149.8628 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 123.19 151.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 151.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 151.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "81b03fc6-bee8-4658-a4e6-0a3641207771") + ) + (pin "1" + (uuid "ecae1f61-5ee3-48f2-82d4-bdf236cc698d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L38") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Interface_Expansion:MCP23017_SO") + (at 326.39 195.58 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d3f0f76e-fb15-493e-ae2f-8bcd89392086") + (property "Reference" "U35" + (at 328.5841 168.5757 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "MCP23017_SO" + (at 328.5841 170.9999 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:SOIC-28W_7.5x17.9mm_P1.27mm" + (at 331.47 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf" + (at 331.47 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "" + (at 326.39 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "579-MCP23017-E/SO" + (at 326.39 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 326.39 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "7" + (uuid "096b290c-76b0-4edb-8151-b0fc822f9193") + ) + (pin "16" + (uuid "33e27bc2-446c-4143-b7ab-c0b1b32accb3") + ) + (pin "5" + (uuid "4f796db6-56bb-4af8-a064-8214326fd160") + ) + (pin "12" + (uuid "08cf3573-35ae-4d18-82e8-400f749d69f1") + ) + (pin "9" + (uuid "c14b2515-51e3-4a2c-9be8-e969880314e4") + ) + (pin "17" + (uuid "588dc2b3-c104-4ebd-b3a4-623b5da7a7de") + ) + (pin "23" + (uuid "c168e2ea-66a2-4dd3-a6d1-e47f1141cea0") + ) + (pin "4" + (uuid "228161d4-b6db-4ed1-9f3a-d41b8d72ddc9") + ) + (pin "28" + (uuid "76f59fba-45c3-42bd-bca7-20f9f1e09d83") + ) + (pin "22" + (uuid "300b7123-3328-444f-87c1-a61f0d719eae") + ) + (pin "18" + (uuid "f6146295-b64b-4f89-8b50-0fd86468bc10") + ) + (pin "8" + (uuid "67a655ad-ad8b-46d8-b306-2c149344fd0f") + ) + (pin "24" + (uuid "d7cf4416-ea28-4878-9828-ec6b78b229c0") + ) + (pin "15" + (uuid "d387c5a4-dd33-4f5d-a792-e5d85c5383ad") + ) + (pin "3" + (uuid "0f8894c7-cb79-411a-810a-b8b11baffbf5") + ) + (pin "14" + (uuid "0fcd9ac5-95ac-45cc-85cf-fe1a6f75eee6") + ) + (pin "25" + (uuid "25d7407d-db25-4be0-9bd9-3ccca0e8f263") + ) + (pin "6" + (uuid "b8eec671-380a-450a-a84b-77e0bd751e8a") + ) + (pin "27" + (uuid "cc99382f-7e5a-45c1-aadf-4ee7d41e2cba") + ) + (pin "20" + (uuid "aae41598-1a1a-4b9f-87f6-f43948cdae4b") + ) + (pin "21" + (uuid "2a506398-ae4a-459c-bc6b-59b8ca30d44d") + ) + (pin "10" + (uuid "09bf5714-145c-4674-9b05-0219676ebe3c") + ) + (pin "19" + (uuid "a9d4eeee-ee25-4e7b-9449-33da160dc8dd") + ) + (pin "26" + (uuid "b7902f14-aa59-4ac1-8a53-1d0476e3fb4d") + ) + (pin "1" + (uuid "e3ca8f19-9a1c-4e6c-895a-4ccbe4d6614c") + ) + (pin "2" + (uuid "00caaeac-df89-4195-977c-e570447abc90") + ) + (pin "11" + (uuid "911729ee-cf46-47cd-a845-72a89b820ba7") + ) + (pin "13" + (uuid "b9e9ab2b-f64f-42c6-8016-53b1efc76423") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U35") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 120.65 172.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d3f894ca-ad27-4a96-9cf1-75a87066176d") + (property "Reference" "#PWR032" + (at 120.65 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 118.11 173.99 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 120.65 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 120.65 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 120.65 172.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "be61562f-daec-4a42-a6d7-72f53f0e28b6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR032") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 300.99 205.74 90) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (uuid "d496d9a8-29f5-48e2-b3fb-a158159120a9") + (property "Reference" "JP2" + (at 303.53 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 298.3809 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 300.99 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 300.99 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 300.99 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 300.99 205.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a8a34f2a-6cba-432a-8c1a-6bdb745e21fa") + ) + (pin "1" + (uuid "2cee55fd-8c4f-4d41-82cd-f60497f0d674") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "JP2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 332.74 97.79 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d50232b8-04c4-4204-b9af-12fe95fbc38c") + (property "Reference" "L293" + (at 334.0072 96.5779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "132 nH" + (at 334.0072 99.0021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 332.74 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 332.74 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 332.74 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7ad97561-1757-4d28-81c4-ae43593dc34f") + ) + (pin "2" + (uuid "25d44390-dd5a-43bd-9398-8233c33206c2") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L293") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Polarized") + (at 222.25 266.7 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d66166a2-3b9c-45cf-93cf-abbcf5d7d4d3") + (property "Reference" "C1" + (at 219.329 264.5989 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "470uF 25V" + (at 219.329 267.0231 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_THT:CP_Radial_D10.0mm_P5.00mm" + (at 221.2848 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 222.25 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "667-ECA-1EM471" + (at 222.25 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "875dee1c-4a8d-4e82-b600-d05c0dc063d8") + ) + (pin "1" + (uuid "f7889ebe-5df1-4b7f-89e8-5089b87c8895") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D_Zener") + (at 360.68 201.93 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d6ca9aee-62f2-4196-8c34-72215c3cbc12") + (property "Reference" "D4" + (at 360.68 207.3443 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "BAS70H,115" + (at 360.68 204.9201 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Diode_SMD:D_SOD-123F" + (at 360.68 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 360.68 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 360.68 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "771-BAS70H-T/R" + (at 360.68 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 360.68 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3ae3313b-bb2f-440e-9ec7-154545588d14") + ) + (pin "1" + (uuid "8a72b7cf-ed50-4ff7-ab1a-a9a437aabc21") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "D4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 322.58 29.21 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d8294a63-3e30-48d6-8eef-00b0a23ba99b") + (property "Reference" "L92" + (at 322.58 24.5604 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "11 uH" + (at 322.58 26.9846 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 322.58 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e97303c8-ea3f-4e74-abbe-ef31736ab754") + ) + (pin "2" + (uuid "c6c0a2a0-31e7-4fd1-91fa-878e9400bcda") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L92") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 100.33 60.96 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d844249b-3a7c-45a5-be81-dd76d43ef9d0") + (property "Reference" "C201" + (at 100.33 54.6567 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 100.33 57.0809 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 104.14 59.9948 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 100.33 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 100.33 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 100.33 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c48cd75b-96ed-4839-972d-e2ca6a99b6c1") + ) + (pin "1" + (uuid "d467ac83-0196-4178-80db-27ab6c933705") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C201") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 133.35 100.33 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d8678786-62ca-4e22-9a82-c3957f85e011") + (property "Reference" "L303" + (at 134.6172 99.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "120 nH" + (at 134.6172 101.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 133.35 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 133.35 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 133.35 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "72d66ea1-9b7c-4225-bc4d-758a5032f342") + ) + (pin "2" + (uuid "d817417d-bd0b-492a-a98c-4f9ee14626a5") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L303") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 157.48 166.37 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "d8bd8b61-7048-4834-a4fc-1e0bf34279a3") + (property "Reference" "L17" + (at 156.2128 165.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 156.2128 167.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 157.48 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 157.48 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 157.48 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "fc4926a3-59c9-4126-b673-3675ecd3e4b0") + ) + (pin "1" + (uuid "2a73062b-0475-4df7-a297-cbf80c604ff8") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 394.97 68.58 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d97525c6-ca4f-41d5-832f-ac3e2e5c25e5") + (property "Reference" "C25" + (at 401.2733 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 398.8491 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 395.9352 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 394.97 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 394.97 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 394.97 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1aa1ea74-1e97-42d8-abbe-8c0bebb83227") + ) + (pin "1" + (uuid "2597b47a-bd4a-4765-9939-0b0082844405") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C25") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 165.1 124.46 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d9dab577-f992-4c3c-b141-73805b63326b") + (property "Reference" "C407" + (at 165.1 118.1567 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 165.1 120.5809 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 168.91 123.4948 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 165.1 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 165.1 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cc82a62a-e41f-4d1e-ab41-58759d2053f8") + ) + (pin "1" + (uuid "d22068de-621c-4047-bc9a-c8eaf45d2a2e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C407") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 394.97 41.91 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "da173986-e417-494d-a3ad-bc836756206e") + (property "Reference" "#PWR050" + (at 394.97 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 397.51 43.18 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 394.97 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 394.97 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 394.97 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "49643b19-d878-4297-92dc-0d520ff5c44a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR050") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 266.7 43.18 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dadf5234-01a5-4373-aab4-5d7e6b1c3ec1") + (property "Reference" "#PWR048" + (at 266.7 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 269.24 44.45 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 266.7 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 266.7 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 266.7 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "47c065bd-1b87-4a53-a1ea-3b6648d83693") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR048") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Jumper:SolderJumper_2_Open") + (at 34.29 241.3 90) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (uuid "deaaa031-1c1b-4e8d-b808-68ce254dd200") + (property "Reference" "JP10" + (at 36.83 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "SolderJumper_2_Open" + (at 31.6809 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Footprint" "Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm" + (at 34.29 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 34.29 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 34.29 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 34.29 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "76c93503-c27c-4f89-9d47-c1ac0589ca49") + ) + (pin "1" + (uuid "7b033c6d-1110-4bda-97d0-f324ff5f4666") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "JP10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 266.7 102.87 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "df4aff20-dcc5-418e-851b-40f93f0b7683") + (property "Reference" "#PWR058" + (at 266.7 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 264.16 104.14 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 266.7 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 266.7 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 266.7 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "29c26987-6373-410b-b538-20b2a07c4529") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR058") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 260.35 26.67 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e234d398-0a98-45f3-b4c7-d730e96fa1fb") + (property "Reference" "C90" + (at 260.35 32.9733 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 260.35 30.5491 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 264.16 27.6352 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 260.35 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 260.35 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 260.35 26.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8bb46e1f-5104-4c17-9374-7765d3a34f76") + ) + (pin "1" + (uuid "07b3aef2-725f-4fb7-8bf8-a435529ac2b9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C90") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 278.13 31.75 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e33e1b3d-6510-4215-95bf-bd147ff67155") + (property "Reference" "U24" + (at 278.13 21.2557 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 278.13 23.6799 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 278.13 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 278.13 29.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 278.13 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 278.13 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "1b83b65f-0c02-4715-9546-310eeb05e57a") + ) + (pin "6" + (uuid "95f54d12-f7bf-4ad7-9060-befd3f27ce83") + ) + (pin "4" + (uuid "0952b4b3-a8a3-4f02-b3de-ce6ccbb4724e") + ) + (pin "1" + (uuid "63d00f03-1426-47de-92aa-f142e092ed8a") + ) + (pin "2" + (uuid "5b0e75dc-173e-4bc7-83cc-5f71c9d1530b") + ) + (pin "3" + (uuid "934bc675-1c13-4757-85e3-2a84b5305a77") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 26.67 137.16 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e35fbd42-5eab-4783-93c1-06c58d92870b") + (property "Reference" "#PWR025" + (at 26.67 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 24.13 138.43 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7e14b90d-e5cc-41dc-90a8-8f420a775df6") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR025") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 260.35 86.36 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e49aef5d-4388-4f5b-922f-e92505886ccb") + (property "Reference" "C290" + (at 260.35 92.6633 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 260.35 90.2391 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 264.16 87.3252 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 260.35 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 260.35 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 260.35 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e4128bb4-3848-434d-9d5c-d437fec12362") + ) + (pin "1" + (uuid "ce8a36e3-932e-46ea-b057-3b6b0bf98ffa") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C290") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 195.58 73.66 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e587b21b-d3eb-42b2-987d-148f2f3b5682") + (property "Reference" "C16" + (at 201.8833 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 199.4591 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 196.5452 69.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 195.58 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 195.58 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2cd4fab5-4117-4370-a679-f111dafff504") + ) + (pin "1" + (uuid "2c174b54-8082-4e3f-b768-ff171294e62b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 158.75 166.37 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e6d0ce9b-7ce8-4704-baf7-5faabada4b5f") + (property "Reference" "L505" + (at 160.0172 165.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "120 nH" + (at 160.0172 167.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 158.75 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 158.75 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 158.75 166.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fad4a7ad-82c5-407a-a041-4351be5873b7") + ) + (pin "2" + (uuid "47fc1526-ea65-4fa3-b42c-5200dd31df3a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L505") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 356.87 67.31 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "e6e10eeb-b69b-4bed-bfc3-3acf0bb5d3de") + (property "Reference" "L24" + (at 355.6028 66.0979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 357.505 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 356.87 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 356.87 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 356.87 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "8ea84711-93fe-4ac0-9c1f-2c43ebb08164") + ) + (pin "1" + (uuid "0f9a2135-26fe-42f5-90f2-e79284472d3b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 260.35 55.88 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e7a6663a-c555-41de-9b25-76352346f742") + (property "Reference" "C190" + (at 260.35 62.1833 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 260.35 59.7591 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 264.16 56.8452 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 260.35 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 260.35 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 260.35 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6832d219-95f2-459d-8509-045edd16bbfb") + ) + (pin "1" + (uuid "34d3af27-2772-4ca8-89f7-247911e022a1") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C190") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_Coaxial") + (at 39.37 271.78 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e7e74e87-d298-4828-8ac9-d71603a73abe") + (property "Reference" "J5" + (at 40.64 267.97 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TO RECEIVE" + (at 45.72 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_Coaxial:SMA_Amphenol_901-144_Vertical" + (at 39.37 271.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" " ~" + (at 39.37 271.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 39.37 271.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "712-CONSMA001-G" + (at 39.37 271.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 39.37 271.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "eb0a60c5-a0c5-4b9d-91a8-beae8f058f97") + ) + (pin "2" + (uuid "f53d0270-90cc-4f46-ac25-aaa621d1a395") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "J5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 326.39 160.02 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e80abe49-bda2-46f2-ae29-ccfcb83461a1") + (property "Reference" "#PWR067" + (at 326.39 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 326.39 155.8869 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 326.39 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 326.39 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 326.39 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c093bfe0-5b40-4b15-9723-1c355d716399") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR067") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 153.67 199.39 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e80f0eae-6ef8-49ed-9f7d-e1afe9ed03a5") + (property "Reference" "C606" + (at 150.749 198.1779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "240 pF" + (at 150.749 200.6021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 154.6352 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 153.67 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 153.67 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "14005e00-c069-413a-8f62-e9b9b66874c6") + ) + (pin "1" + (uuid "342a786e-5576-4d50-be62-c136ce0de394") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C606") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 149.86 270.51 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e823f907-72ca-45c4-a98d-96a6950a516d") + (property "Reference" "C7" + (at 149.86 276.8133 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 149.86 274.3891 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 153.67 271.4752 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 149.86 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 149.86 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 149.86 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5b80a7ea-d474-47cd-a2f2-46023e1f97d8") + ) + (pin "1" + (uuid "9b9654de-50ad-4901-8c25-7d50b92b146a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 322.58 88.9 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e86efc4b-9cf7-4429-b2ea-3e995a82d13a") + (property "Reference" "L292" + (at 322.58 84.2504 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "3.6 uH" + (at 322.58 86.6746 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 322.58 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c42ec59a-7eeb-4388-8a89-deabd7fc456a") + ) + (pin "2" + (uuid "abf39fb5-3928-4182-805d-1ca1524d8453") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L292") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 78.74 193.04 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e9978715-2307-49e0-b23b-c2cfc97caf25") + (property "Reference" "U18" + (at 78.74 182.5457 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 78.74 184.9699 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 78.74 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 78.74 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 78.74 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 78.74 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "68c105e6-115b-4885-8a1f-8a00741d016e") + ) + (pin "6" + (uuid "e4911e29-baa8-4330-b8ae-f864d03f75aa") + ) + (pin "4" + (uuid "d97f2495-f300-491b-ac0b-100f44f7c538") + ) + (pin "1" + (uuid "2d4e3061-9231-4f57-a24d-e15aa6d0ca07") + ) + (pin "2" + (uuid "6eec8f6f-e6da-472e-9635-c8e0dc46a58a") + ) + (pin "3" + (uuid "286e3f6b-fdd6-4f14-8120-042f710af042") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "RF_Switch:MASWSS0179") + (at 78.74 93.98 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e9a8c266-a125-43a5-b1c2-3bd57aca697b") + (property "Reference" "U9" + (at 78.74 83.4857 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MASWSS0179" + (at 78.74 85.9099 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:MASWSS0179-SOT-26" + (at 78.74 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://cdn.macom.com/datasheets/MASWSS0179.pdf" + (at 78.74 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 78.74 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "937-MASWSS0179-T" + (at 78.74 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "e6053148-e5cd-4791-ada3-18d5ae8b71c7") + ) + (pin "6" + (uuid "ff8525cf-6001-443f-9036-2ec6ba853f7a") + ) + (pin "4" + (uuid "5912191d-8c6b-4e0f-945d-c8e90fac7776") + ) + (pin "1" + (uuid "f19b1357-1f2a-4044-979f-c611eb1ab06b") + ) + (pin "2" + (uuid "8235cd6d-e0d2-47b5-93bc-c49ab64c1339") + ) + (pin "3" + (uuid "c5a5b817-ad8a-401a-8916-993a3c7f1fbe") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole_Pad") + (at 392.43 245.11 270) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e9b18aef-8346-463f-9517-b47935b51000") + (property "Reference" "H2" + (at 396.24 245.11 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 396.24 246.3221 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_4.3mm_M4_DIN965_Pad" + (at 392.43 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 392.43 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 392.43 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 392.43 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "taydaelectronics.com" "" + (at 392.43 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "aa2a7f3c-838c-4061-82c6-50798682534b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "H2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 195.58 167.64 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "e9ddc879-a4e3-4c02-b3dc-879f499dfb26") + (property "Reference" "C19" + (at 201.8833 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 199.4591 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 196.5452 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 195.58 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 195.58 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 195.58 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "efe9f273-22e9-4c5c-9bdc-27458a8aa303") + ) + (pin "1" + (uuid "d2cc1001-11e7-4b1f-9fd5-e5f094a32bc2") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 401.32 86.36 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ea44e803-da22-432b-98e7-0b878cd1ab98") + (property "Reference" "C298" + (at 401.32 92.6633 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 401.32 90.2391 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 405.13 87.3252 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 401.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 401.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 401.32 86.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "af1a3d12-9e5a-41de-87d5-0a311d090d52") + ) + (pin "1" + (uuid "cbd7134a-27c8-4568-bf45-af36f9ba848a") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C298") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 118.11 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "ea87a49f-e55f-4873-92c6-bc5b13dc3745") + (property "Reference" "L37" + (at 149.8021 116.8428 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 147.3779 116.8428 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 148.59 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 118.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b5e85604-0c4d-48b2-9280-c4d478196f51") + ) + (pin "1" + (uuid "99d56ce1-b605-4288-95f6-901045cf6b3d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L37") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 157.48 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "eb418cdc-f598-4581-ba26-f849497247c5") + (property "Reference" "L502" + (at 123.19 152.8304 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "820 nH" + (at 123.19 155.2546 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 123.19 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1255ca96-a19b-488b-a65f-441b31950320") + ) + (pin "2" + (uuid "d5003dd7-5ede-434d-9d19-da30ae988a9e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L502") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 341.63 165.1 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ecced4af-25bc-412f-b8ef-38e2a1596863") + (property "Reference" "#PWR068" + (at 341.63 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 344.17 166.37 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 341.63 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 341.63 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 341.63 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "062b8b66-d76c-4d6a-899e-4f914f5558f9") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR068") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 204.47 154.94 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "edb91561-3bdf-4bb2-9d9e-13d03f16f9be") + (property "Reference" "C508" + (at 204.47 161.2433 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 204.47 158.8191 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 208.28 155.9052 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 204.47 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 204.47 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 204.47 154.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "20a45c21-0663-40c3-bfa0-7cf088e60eca") + ) + (pin "1" + (uuid "1c304d39-0e67-4cb3-a365-9e7ac9a23b86") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C508") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 358.14 97.79 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ee04b08c-94bf-44e9-922b-84b7c3602958") + (property "Reference" "L295" + (at 359.4072 96.5779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "245 nH" + (at 359.4072 99.0021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 358.14 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 358.14 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 358.14 97.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7efd13f5-895a-4982-bfb5-916fe4323264") + ) + (pin "2" + (uuid "f4c86cf1-01a5-4820-8937-654e49511796") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L295") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 331.47 99.06 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "f1069162-1058-462b-8ea4-113904717e92") + (property "Reference" "L28" + (at 330.2028 97.8479 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 332.105 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 331.47 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 331.47 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 331.47 99.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3b84d180-4019-4ea0-924f-8319c1cc7aec") + ) + (pin "1" + (uuid "1221ccfc-26b3-47dc-bbaf-c8c540318f5f") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L28") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 226.06 71.12 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f247add4-3d0c-445e-8c2c-4a90ce940b5f") + (property "Reference" "#PWR052" + (at 226.06 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 223.52 72.39 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 226.06 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 226.06 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f5df16f6-26f3-4abc-8aa4-fac82c0aac4c") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR052") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 120.65 139.7 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f27a4f11-e67d-4c52-b5f8-e522b6db7970") + (property "Reference" "#PWR027" + (at 120.65 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 118.11 140.97 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 120.65 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 120.65 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 120.65 139.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ed1f7fab-90b7-49d3-8fa9-10ce8a82f14e") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR027") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 22.86 260.35 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f2e33e0a-c28a-4451-aa88-a236a69ae334") + (property "Reference" "#PWR043" + (at 22.86 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 20.32 261.62 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 22.86 260.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 22.86 260.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 22.86 260.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fbda67eb-90da-4b46-8957-b66597a529ed") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR043") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 148.59 91.44 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f3abcc48-4170-49ab-a917-f47e0824bf6c") + (property "Reference" "L304" + (at 148.59 86.7904 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "2.2 uH" + (at 148.59 89.2146 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 148.59 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 148.59 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7d758d61-c992-48fd-8421-0ef7b8c5409f") + ) + (pin "2" + (uuid "14486fb1-7a16-41b3-ab9a-50971995c9e8") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L304") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 313.69 58.42 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f4794f95-b0ed-47a4-9e47-c45de6244d11") + (property "Reference" "C193" + (at 316.23 52.07 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "195 pF" + (at 317.5 54.61 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 309.88 59.3852 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 313.69 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 313.69 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 313.69 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "035420e2-a66b-4e04-96d1-b818f8b635b7") + ) + (pin "1" + (uuid "33a6d14d-9624-46d2-9894-5d80c69603d3") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C193") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 266.7 68.58 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f55b7e11-0011-4f31-8a07-7786e5cecca8") + (property "Reference" "C22" + (at 260.3967 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "0.1uF 50V" + (at 262.8209 68.58 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 265.7348 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 266.7 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 266.7 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "C1206C104K5RACTU" + (at 266.7 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3193238c-3afd-47fb-82d6-5c7bb146a878") + ) + (pin "1" + (uuid "1b1428a1-cc9e-4289-977d-ec4d0482ea77") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:LM1117T-3.3") + (at 250.19 262.89 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f5ab2bfb-797a-43aa-a70c-83f3e74c8bf5") + (property "Reference" "U22" + (at 250.19 256.8407 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM1117T-3.3" + (at 250.19 259.2649 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 250.19 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm1117.pdf" + (at 250.19 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 250.19 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "926-LM1117T-3.3/NOPB" + (at 250.19 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "2147d464-073d-4620-b51e-8e1aa3ecfb7c") + ) + (pin "2" + (uuid "eb6993d5-90f5-4494-b03b-d121bb461761") + ) + (pin "1" + (uuid "d539a7ed-cc7e-4ba0-a07a-4fcdc202dfc3") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "U22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 139.7 60.96 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f727be65-d5d7-4e63-be38-12fac8bef94b") + (property "Reference" "C205" + (at 142.24 54.61 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "180 pF" + (at 143.51 57.15 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 135.89 61.9252 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 139.7 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 139.7 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 139.7 60.96 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e15d36b1-330e-485f-849d-627ec8f83a7e") + ) + (pin "1" + (uuid "2865fdc4-36d5-4157-bdac-54f8ce85c531") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C205") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 322.58 82.55 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "f8fccbd5-8944-4139-bf3b-20061e520932") + (property "Reference" "L46" + (at 323.7921 81.2828 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 321.3679 81.2828 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 322.58 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "48038eb1-0029-4581-ba82-b893b43b7ef9") + ) + (pin "1" + (uuid "15ff1249-fc08-4d60-8d20-35b2fdebc40b") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L46") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 297.18 171.45 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f931086c-1dab-4142-9798-05b9d5bd411f") + (property "Reference" "R4" + (at 295.7942 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "2k2" + (at 293.37 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 298.958 171.45 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 297.18 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 297.18 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "652-CR1206FX-2201ELF" + (at 297.18 171.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1303058a-4c1c-42b5-9968-9d3c2544da0c") + ) + (pin "1" + (uuid "dd80018c-8a4c-4a9a-ab37-b893e6a38384") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "R4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 353.06 38.1 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f9723a76-24e3-4126-b56f-751196871ca8") + (property "Reference" "C96" + (at 350.139 36.8879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "3.1 nF" + (at 350.139 39.3121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 354.0252 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 353.06 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 353.06 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 353.06 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3c4d4c15-63aa-40a9-b954-e863f537ed28") + ) + (pin "1" + (uuid "4c4a70cc-3d72-45e4-a226-a75b3f672d1d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C96") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 158.75 133.35 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f97d3cc1-e3f3-405d-8e7b-d130f186a5d3") + (property "Reference" "L405" + (at 160.0172 132.1379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "150 nH" + (at 160.0172 134.5621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 158.75 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 158.75 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 158.75 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1caf7c30-a74f-455a-ba5b-4d04a2147710") + ) + (pin "2" + (uuid "4d4f1381-40d1-46d4-9369-74827b08f027") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L405") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 123.19 30.48 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fa1c046c-a65a-425c-831c-22f3889ace29") + (property "Reference" "L102" + (at 123.19 25.8304 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "5.6 uH" + (at 123.19 28.2546 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 123.19 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 123.19 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a9db9819-f2d5-40af-b0a9-79dad6950ffe") + ) + (pin "2" + (uuid "faca7b9c-7a54-4a87-9d09-f7da6f51e983") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L102") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 368.3 190.5 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fa49ecaa-3943-40ab-85c0-98418be4e28f") + (property "Reference" "#PWR041" + (at 368.3 196.85 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 370.84 191.77 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 368.3 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 368.3 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 368.3 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0e864b53-f4e2-4dad-ae31-730efae14208") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR041") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 101.6 279.4 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fa7aad51-a534-4cf9-9d0f-a631c796ca39") + (property "Reference" "#PWR070" + (at 101.6 285.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 99.06 280.67 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 101.6 279.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 101.6 279.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 101.6 279.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a74cc7ac-6046-4f3a-aa32-ce0f13242603") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR070") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 128.27 199.39 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fa837279-53fd-4103-afae-e0c78e0e60b6") + (property "Reference" "C604" + (at 125.349 198.1779 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "380 pF" + (at 125.349 200.6021 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 129.2352 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 128.27 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 128.27 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 128.27 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "673e39bf-63cf-4736-bf3f-77109b5cf297") + ) + (pin "1" + (uuid "330c2f2c-2ca4-4ca5-b31d-8155be4d2c73") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C604") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 107.95 39.37 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (uuid "fc86cce0-7dc9-4b73-906b-53981d964017") + (property "Reference" "L3" + (at 106.6828 38.1579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Value" "L" + (at 106.6828 40.5821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Inductor_SMD:L_1206_3216Metric" + (at 107.95 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 107.95 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 107.95 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ddf1610b-3378-4b62-b588-2a708e450daa") + ) + (pin "1" + (uuid "206a355a-f89f-40ce-9dda-9df802298c76") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 26.67 104.14 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fc9238b6-af0b-4a0c-8a24-8beebb2c93ba") + (property "Reference" "#PWR020" + (at 26.67 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 24.13 105.41 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 26.67 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 26.67 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 26.67 104.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f4bdace1-2a2d-4e98-b40a-b0d8baea8fa0") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR020") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 133.35 133.35 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fcdc7294-158f-4f4b-8528-d0f6c297f3b2") + (property "Reference" "L403" + (at 134.6173 132.1379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "82 nH" + (at 134.6173 134.5621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "T41_Library:FT37-toroid-vertical" + (at 133.35 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 133.35 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 133.35 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c48c7900-5288-420b-a295-6fea5563cc7d") + ) + (pin "2" + (uuid "c020a41f-ca5e-40c7-a0db-0fc0b6787113") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "L403") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 320.04 105.41 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fd14d205-b188-4154-9b6b-265b8d6ef962") + (property "Reference" "#PWR059" + (at 320.04 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 322.58 106.68 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 320.04 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 320.04 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 320.04 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "62b17d9a-9c20-4aa2-bcee-8b48dea9a418") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR059") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 394.97 72.39 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fdf69b47-6d36-46ff-8d4d-b9a72881fe00") + (property "Reference" "#PWR055" + (at 394.97 78.74 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 397.51 73.66 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 394.97 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 394.97 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 394.97 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "24db4020-7130-4e72-9056-8ec6f2324a01") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR055") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 114.3 157.48 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ff379642-9b0e-451d-8a65-83105bb5489b") + (property "Reference" "C503" + (at 116.84 151.13 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "43 pF" + (at 118.11 153.67 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 110.49 158.4452 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 114.3 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 114.3 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser Part Number" "" + (at 114.3 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5a31eeae-982d-4659-a2a9-ee70fe10105c") + ) + (pin "1" + (uuid "a5e23b79-3563-4452-b9c2-df4acbd2aa95") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "C503") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 226.06 21.59 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ffb221ad-476d-41e6-886b-5393b7b0a50f") + (property "Reference" "#PWR046" + (at 226.06 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 226.06 17.4569 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 226.06 21.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 226.06 21.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 21.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8f82c6ee-1809-4326-8bf1-323dc8dac50d") + ) + (instances + (project "T41-exciter-filter-board" + (path "/56a77fe5-f7a5-414c-a0f7-d659071572ee" + (reference "#PWR046") + (unit 1) + ) + ) + ) + ) + (sheet_instances + (path "/" + (page "1") + ) + ) +) diff --git a/wiki/raw/T41-main-board-V012.kicad_sch b/wiki/raw/T41-main-board-V012.kicad_sch new file mode 100644 index 0000000..e7876ac --- /dev/null +++ b/wiki/raw/T41-main-board-V012.kicad_sch @@ -0,0 +1,29581 @@ +(kicad_sch + (version 20231120) + (generator "eeschema") + (generator_version "8.0") + (uuid "3c4b9d3b-a516-4fd7-b325-b74c836dee65") + (paper "A3") + (title_block + (title "T41 Main Board") + (date "2024-04-26") + (rev "V012.6") + (comment 1 " Transcribed to KiCAD by OG King-KI3P") + (comment 2 "By Al Peter-AD8GY, Updated by WJ Schmidt-K9HZ") + (comment 3 "Changed part and orientation for Q1") + ) + (lib_symbols + (symbol "Audio:PCM5102" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -10.16 13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "PCM5102" + (at 3.81 13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:TSSOP-20_4.4x6.5mm_P0.65mm" + (at -1.27 19.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/pcm5102.pdf" + (at -1.27 19.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "2VRMS DirectPath, 112dB Audio Stereo DAC with 32-bit, 384kHz PCM Interface, TSSOP-20" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "audio dac 2ch 32bit 384kHz" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TSSOP*4.4x6.5mm*P0.65mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "PCM5102_0_1" + (rectangle + (start -10.16 12.7) + (end 10.16 -15.24) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "PCM5102_1_1" + (pin passive line + (at -2.54 15.24 270) + (length 2.54) + (name "CPVDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -5.08 0) + (length 2.54) + (name "DEMP" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -2.54 0) + (length 2.54) + (name "FLT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 2.54 0) + (length 2.54) + (name "SCK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 5.08 0) + (length 2.54) + (name "BCK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 7.62 0) + (length 2.54) + (name "DIN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 10.16 0) + (length 2.54) + (name "LRCK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -10.16 0) + (length 2.54) + (name "FMT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -12.7 -7.62 0) + (length 2.54) + (name "XSMT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -10.16 180) + (length 2.54) + (name "LDOO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -17.78 90) + (length 2.54) + (name "DGND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 2.54 180) + (length 2.54) + (name "CAPP" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 15.24 270) + (length 2.54) + (name "DVDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -2.54 -17.78 90) + (length 2.54) + (name "CPGND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -5.08 180) + (length 2.54) + (name "CAPM" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 12.7 -12.7 180) + (length 2.54) + (name "VNEG" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 12.7 10.16 180) + (length 2.54) + (name "OUTL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 12.7 7.62 180) + (length 2.54) + (name "OUTR" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 2.54 15.24 270) + (length 2.54) + (name "AVDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 2.54 -17.78 90) + (length 2.54) + (name "AGND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector:Conn_01x02_Socket" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x02_Socket" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x02, script generated" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_locked" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x02_Socket_1_1" + (arc + (start 0 -2.032) + (mid -0.5058 -2.54) + (end 0 -3.048) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -2.54) (xy -0.508 -2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy -0.508 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 0.508) + (mid -0.5058 0) + (end 0 -0.508) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector:Conn_01x03_Socket" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x03_Socket" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x03, script generated" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_locked" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x03_Socket_1_1" + (arc + (start 0 -2.032) + (mid -0.5058 -2.54) + (end 0 -3.048) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -2.54) (xy -0.508 -2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy -0.508 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 2.54) (xy -0.508 2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 0.508) + (mid -0.5058 0) + (end 0 -0.508) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 3.048) + (mid -0.5058 2.54) + (end 0 2.032) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector:TestPoint" + (pin_numbers hide) + (pin_names + (offset 0.762) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "TP" + (at 0 6.858 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "TestPoint" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "test point" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "test point tp" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Pin* Test*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "TestPoint_0_1" + (circle + (center 0 3.302) + (radius 0.762) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "TestPoint_1_1" + (pin passive line + (at 0 0 90) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector_Audio:AudioJack3_SwitchTR" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 8.89 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AudioJack3_SwitchTR" + (at 0 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Audio Jack, 3 Poles (Stereo / TRS), Switched TR Poles (Normalling)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "audio jack receptacle stereo headphones phones TRS connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Jack*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "AudioJack3_SwitchTR_0_1" + (rectangle + (start -5.08 -5.08) + (end -6.35 -7.62) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 0.508 -0.254) (xy 0.762 -0.762) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.778 -5.334) (xy 2.032 -5.842) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -5.08) (xy 0.635 -5.715) (xy 1.27 -5.08) (xy 2.54 -5.08) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 -7.62) (xy 1.778 -7.62) (xy 1.778 -5.334) (xy 1.524 -5.842) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 -2.54) (xy 0.508 -2.54) (xy 0.508 -0.254) (xy 0.254 -0.762) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.905 -5.08) (xy -1.27 -5.715) (xy -0.635 -5.08) (xy -0.635 0) (xy 2.54 0) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 2.54) (xy -2.54 2.54) (xy -2.54 -5.08) (xy -3.175 -5.715) (xy -3.81 -5.08) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 2.54 3.81) + (end -5.08 -10.16) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "AudioJack3_SwitchTR_1_1" + (pin passive line + (at 5.08 0 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "R" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -2.54 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "RN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 2.54 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "S" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -5.08 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "T" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 -7.62 180) + (length 2.54) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "TN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector_Generic:Conn_01x01" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x01" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x01, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x01_1_1" + (rectangle + (start -1.27 0.127) + (end 0 -0.127) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 1.27) + (end 1.27 -1.27) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector_Generic:Conn_01x02" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x02" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x02_1_1" + (rectangle + (start -1.27 -2.413) + (end 0 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 0.127) + (end 0 -0.127) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 1.27) + (end 1.27 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Connector_Generic:Conn_01x03" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x03" + (at 0 -5.08 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, single row, 01x03, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Conn_01x03_1_1" + (rectangle + (start -1.27 -2.413) + (end 0 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 0.127) + (end 0 -0.127) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 2.667) + (end 0 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 3.81) + (end 1.27 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:C" + (pin_numbers hide) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "C_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_0_1" + (polyline + (pts + (xy -2.032 -0.762) (xy 2.032 -0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.032 0.762) (xy 2.032 0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "C_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:C_Polarized" + (pin_numbers hide) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C_Polarized" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Polarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "CP_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_Polarized_0_1" + (rectangle + (start -2.286 0.508) + (end 2.286 1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.778 2.286) (xy -0.762 2.286) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 2.794) (xy -1.27 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 2.286 -0.508) + (end -2.286 -1.016) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "C_Polarized_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:D_Zener" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D_Zener" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Zener diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO-???* *_Diode_* *SingleDiode* D_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "D_Zener_0_1" + (polyline + (pts + (xy 1.27 0) (xy -1.27 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -1.27) (xy -1.27 1.27) (xy -0.762 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 -1.27) (xy 1.27 1.27) (xy -1.27 0) (xy 1.27 -1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "D_Zener_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "K" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:L" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "L" + (at -1.27 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "L" + (at 1.905 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Inductor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "inductor choke coil reactor magnetic" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Choke_* *Coil* Inductor_* L_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "L_0_1" + (arc + (start 0 -2.54) + (mid 0.6323 -1.905) + (end 0 -1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -1.27) + (mid 0.6323 -0.635) + (end 0 0) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 0) + (mid 0.6323 0.635) + (end 0 1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 1.27) + (mid 0.6323 1.905) + (end 0 2.54) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "L_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:LED" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LED" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Light emitting diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "LED diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "LED* LED_SMD:* LED_THT:*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LED_0_1" + (polyline + (pts + (xy -1.27 -1.27) (xy -1.27 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy 1.27 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 -1.27) (xy 1.27 1.27) (xy -1.27 0) (xy 1.27 -1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.048 -0.762) (xy -4.572 -2.286) (xy -3.81 -2.286) (xy -4.572 -2.286) (xy -4.572 -1.524) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.778 -0.762) (xy -3.302 -2.286) (xy -2.54 -2.286) (xy -3.302 -2.286) (xy -3.302 -1.524) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "LED_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "K" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Device:R" + (pin_numbers hide) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "R" + (at 2.032 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "R" + (at 0 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -1.778 0 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "R res resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "R_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "R_0_1" + (rectangle + (start -1.016 -2.54) + (end 1.016 2.54) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "R_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Diode:1N4007" + (pin_numbers hide) + (pin_names hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1N4007" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal" + (at 0 -4.445 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.vishay.com/docs/88503/1n4001.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "1000V 1A General Purpose Rectifier Diode, DO-41" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "D*DO?41*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "1N4007_0_1" + (polyline + (pts + (xy -1.27 1.27) (xy -1.27 -1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 0) (xy -1.27 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 1.27) (xy 1.27 -1.27) (xy -1.27 0) (xy 1.27 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "1N4007_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "K" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "MCU_Microchip_ATtiny:ATtiny85-20S" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -12.7 13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + ) + (property "Value" "ATtiny85-20S" + (at 2.54 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + ) + (property "Footprint" "Package_SO:SOIC-8W_5.3x5.3mm_P1.27mm" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "20MHz, 8kB Flash, 512B SRAM, 512B EEPROM, debugWIRE, SOIC-8W" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "AVR 8bit Microcontroller tinyAVR" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SOIC*5.3x5.3mm*P1.27mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "ATtiny85-20S_0_1" + (rectangle + (start -12.7 -12.7) + (end 12.7 12.7) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "ATtiny85-20S_1_1" + (pin bidirectional line + (at 15.24 -5.08 180) + (length 2.54) + (name "~{RESET}/PB5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 0 180) + (length 2.54) + (name "XTAL1/PB3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -2.54 180) + (length 2.54) + (name "XTAL2/PB4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -15.24 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 7.62 180) + (length 2.54) + (name "AREF/PB0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 5.08 180) + (length 2.54) + (name "PB1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 2.54 180) + (length 2.54) + (name "PB2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 15.24 270) + (length 2.54) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Mechanical:MountingHole_Pad" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "H" + (at 0 6.35 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MountingHole_Pad" + (at 0 4.445 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Mounting Hole with connection" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "mounting hole" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "MountingHole*Pad*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "MountingHole_Pad_0_1" + (circle + (center 0 1.27) + (radius 1.27) + (stroke + (width 1.27) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "MountingHole_Pad_1_1" + (pin input line + (at 0 -2.54 90) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Motor:Fan" + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "M" + (at 2.54 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Fan" + (at 2.54 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + ) + (property "Footprint" "" + (at 0 0.254 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0.254 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Fan" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Fan Motor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "PinHeader*P2.54mm* TerminalBlock*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Fan_0_1" + (arc + (start -2.54 -0.508) + (mid 0.0028 0.9121) + (end 0 3.81) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -5.08) (xy 0 -4.572) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -2.2352) (xy 0 -2.6416) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 4.2672) (xy 0 4.6228) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 4.572) (xy 0 5.08) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 1.016) + (radius 3.2512) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 3.81) + (mid 0.053 0.921) + (end 2.54 -0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 2.54 -0.508) + (mid 0 1.0618) + (end -2.54 -0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Fan_1_1" + (pin passive line + (at 0 7.62 270) + (length 2.54) + (name "+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -5.08 90) + (length 2.54) + (name "-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Regulator_Linear:AP7384-50V" + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AP7384-50V" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline_Wide" + (at 0 5.715 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.diodes.com/assets/Datasheets/AP7384.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "50mA Low Dropout Voltage Regulator, Fixed Output 5V, Wide Input Voltage Range 40V, TO-92" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "50mA LDO Regulator Fixed Positive" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?92*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "AP7384-50V_0_1" + (rectangle + (start -5.08 1.905) + (end 5.08 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "AP7384-50V_1_1" + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "VI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Regulator_Linear:LM1117T-3.3" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM1117T-3.3" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Horizontal_TabDown" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm1117.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "800mA Low-Dropout Linear Regulator, 3.3V fixed output, TO-220" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "linear regulator ldo fixed positive" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?220*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LM1117T-3.3_0_1" + (rectangle + (start -5.08 -5.08) + (end 5.08 1.905) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "LM1117T-3.3_1_1" + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "VI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Regulator_Linear:LM7805_TO220" + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at -3.81 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM7805_TO220" + (at 0 3.175 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 0 5.715 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" + (at 0 -1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Positive 1A 35V Linear Regulator, Fixed Output 5V, TO-220" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Voltage Regulator 1A Positive" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?220*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LM7805_TO220_0_1" + (rectangle + (start -5.08 1.905) + (end 5.08 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "LM7805_TO220_1_1" + (pin power_in line + (at -7.62 0 0) + (length 2.54) + (name "VI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at 7.62 0 180) + (length 2.54) + (name "VO" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Switch:SW_Push" + (pin_numbers hide) + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "SW" + (at 1.27 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "SW_Push" + (at 0 -1.524 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Push button switch, generic, two pins" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "switch normally-open pushbutton push-button" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "SW_Push_0_1" + (circle + (center -2.032 0) + (radius 0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 1.27) (xy 0 3.048) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 1.27) (xy -2.54 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 2.032 0) + (radius 0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 0 180) + (length 2.54) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "T41:IDC_2x3" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 1.27 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "IDC_2x3" + (at 1.27 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, double row, 02x05, top/bottom pin numbering scheme (row 1: 1...pins_per_row, row2: pins_per_row+1 ... num_pins), script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_2x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "IDC_2x3_1_1" + (rectangle + (start -1.27 0) + (end 0 -0.254) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 3.81) + (end 0 1.27) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 5.207) + (end 0 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 6.35) + (end 3.81 -1.27) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (rectangle + (start 3.81 0.127) + (end 2.54 -0.127) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 2.667) + (end 2.54 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 5.207) + (end 2.54 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 5.08 180) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 2.54 180) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 0 180) + (length 3.81) + (name "Pin_6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "T41:IDC_2x5" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 1.27 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "IDC_2x5" + (at 1.27 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, double row, 02x05, top/bottom pin numbering scheme (row 1: 1...pins_per_row, row2: pins_per_row+1 ... num_pins), script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_2x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "IDC_2x5_1_1" + (rectangle + (start -1.27 -4.953) + (end 0 -5.207) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 -2.413) + (end 0 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 1.27) + (end 0 -1.27) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 2.667) + (end 0 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 5.207) + (end 0 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 6.35) + (end 3.81 -6.35) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (rectangle + (start 3.81 -4.953) + (end 2.54 -5.207) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 -2.413) + (end 2.54 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 0.127) + (end 2.54 -0.127) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 2.667) + (end 2.54 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 5.207) + (end 2.54 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 -5.08 180) + (length 3.81) + (name "Pin_10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 5.08 180) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 2.54 180) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 0 180) + (length 3.81) + (name "Pin_6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 -2.54 180) + (length 3.81) + (name "Pin_8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "T41:PCM1808PW" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 0 13.97 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "PCM1808PW" + (at 0 11.43 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:TSSOP-14_4.4x5mm_P0.65mm" + (at 0 -13.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/pcm1808.pdf" + (at 0 -17.78 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "24-Bit, 96-kHz Sampling, Advanced Segment, Audio Stereo Digital-to-Analog Converter, SW Control, TSSOP-14" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "audio dac 2ch 24bit 96kHz" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "SSOP*5.3x10.2mm*P0.65mm*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "PCM1808PW_0_1" + (rectangle + (start -7.62 10.16) + (end 7.62 -10.16) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + ) + (symbol "PCM1808PW_1_1" + (pin input line + (at -10.16 7.62 0) + (length 2.54) + (name "VREF" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 10.16 -2.54 180) + (length 2.54) + (name "MD0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 10.16 0 180) + (length 2.54) + (name "MD1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 10.16 2.54 180) + (length 2.54) + (name "FMT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 10.16 5.08 180) + (length 2.54) + (name "VIN_L" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 10.16 7.62 180) + (length 2.54) + (name "VIN_R" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -10.16 5.08 0) + (length 2.54) + (name "AGND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -10.16 2.54 0) + (length 2.54) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -10.16 0 0) + (length 2.54) + (name "VDD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -10.16 -2.54 0) + (length 2.54) + (name "DGND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -10.16 -5.08 0) + (length 2.54) + (name "SCKI" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -10.16 -7.62 0) + (length 2.54) + (name "LRCK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 10.16 -7.62 180) + (length 2.54) + (name "BCK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 10.16 -5.08 180) + (length 2.54) + (name "DOUT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "T41:Teensy4.1" + (pin_names + (offset 1.016) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 0 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Teensy4.1" + (at 0 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -10.16 10.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at -10.16 10.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Teensy4.1_0_0" + (polyline + (pts + (xy -22.86 -6.35) (xy 22.86 -6.35) + ) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -17.78 -26.67) (xy -17.78 -13.97) + ) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 17.78 -9.525) (xy 17.78 -24.765) + ) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + ) + (text "(250mA max)" + (at 11.43 49.53 0) + (effects + (font + (size 1.016 1.016) + ) + ) + ) + (text "(3.6v to 5.5v)" + (at 11.43 54.61 0) + (effects + (font + (size 1.016 1.016) + ) + ) + ) + (text "Ethernet" + (at 15.875 -17.145 900) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (text "Host" + (at -13.97 -20.32 900) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (text "USB" + (at -15.875 -20.32 900) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin bidirectional line + (at -27.94 31.75 0) + (length 5.08) + (name "8_TX2_IN1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 29.21 0) + (length 5.08) + (name "9_OUT1C" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 26.67 0) + (length 5.08) + (name "10_CS_MQSR" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 24.13 0) + (length 5.08) + (name "11_MOSI_CTX1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 21.59 0) + (length 5.08) + (name "12_MISO_MQSL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -27.94 19.05 0) + (length 5.08) + (name "3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 16.51 0) + (length 5.08) + (name "24_A10_TX6_SCL2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 13.97 0) + (length 5.08) + (name "25_A11_RX6_SDA2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 11.43 0) + (length 5.08) + (name "26_A12_MOSI1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 8.89 0) + (length 5.08) + (name "27_A13_SCK1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 6.35 0) + (length 5.08) + (name "28_RX7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 3.81 0) + (length 5.08) + (name "29_TX7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "21" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 1.27 0) + (length 5.08) + (name "30_CRX3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "22" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 -1.27 0) + (length 5.08) + (name "31_CTX3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "23" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 -3.81 0) + (length 5.08) + (name "32_OUT1B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "24" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 -3.81 180) + (length 5.08) + (name "33_MCLK2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "25" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 -1.27 180) + (length 5.08) + (name "34_RX8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "26" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 1.27 180) + (length 5.08) + (name "35_TX8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "27" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 3.81 180) + (length 5.08) + (name "36_CS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "28" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 6.35 180) + (length 5.08) + (name "37_CS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "29" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 8.89 180) + (length 5.08) + (name "38_CS1_IN1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "30" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 11.43 180) + (length 5.08) + (name "39_MISO1_OUT1A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "31" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 13.97 180) + (length 5.08) + (name "40_A16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "32" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 16.51 180) + (length 5.08) + (name "41_A17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "33" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 21.59 180) + (length 5.08) + (name "13_SCK_LED" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "35" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 24.13 180) + (length 5.08) + (name "14_A0_TX3_SPDIF_OUT" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "36" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 26.67 180) + (length 5.08) + (name "15_A1_RX3_SPDIF_IN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "37" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 29.21 180) + (length 5.08) + (name "16_A2_RX4_SCL1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "38" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 31.75 180) + (length 5.08) + (name "17_A3_TX4_SDA1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "39" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 34.29 180) + (length 5.08) + (name "18_A4_SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "40" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 36.83 180) + (length 5.08) + (name "19_A5_SCL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "41" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 39.37 180) + (length 5.08) + (name "20_A6_TX5_LRCLK1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "42" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 41.91 180) + (length 5.08) + (name "21_A7_RX5_BCLK1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "43" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 44.45 180) + (length 5.08) + (name "22_A8_CTX1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "44" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 46.99 180) + (length 5.08) + (name "23_A9_CRX1_MCLK1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "45" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 27.94 49.53 180) + (length 5.08) + (name "3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "46" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 27.94 52.07 180) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "47" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 27.94 54.61 180) + (length 5.08) + (name "VIN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "48" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 44.45 0) + (length 5.08) + (name "3_LRCLK2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at -27.94 -15.24 0) + (length 5.08) + (name "5V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "55" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 -17.78 0) + (length 5.08) + (name "D-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "56" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 -20.32 0) + (length 5.08) + (name "D+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "57" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -27.94 -22.86 0) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "58" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -27.94 -25.4 0) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "59" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 41.91 0) + (length 5.08) + (name "4_BCLK2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 -22.86 180) + (length 5.08) + (name "R+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "60" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 -20.32 180) + (length 5.08) + (name "LED" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "61" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 -17.78 180) + (length 5.08) + (name "T-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "62" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 -15.24 180) + (length 5.08) + (name "T+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "63" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 27.94 -12.7 180) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "64" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 27.94 -10.16 180) + (length 5.08) + (name "R-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "65" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 39.37 0) + (length 5.08) + (name "5_IN2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 36.83 0) + (length 5.08) + (name "6_OUT1D" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 34.29 0) + (length 5.08) + (name "7_RX2_OUT1A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (symbol "Teensy4.1_0_1" + (rectangle + (start -22.86 60.96) + (end 22.86 -27.94) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + ) + (rectangle + (start -20.32 -1.27) + (end -20.32 -1.27) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + ) + ) + (symbol "Teensy4.1_1_1" + (pin power_in line + (at -27.94 54.61 0) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 52.07 0) + (length 5.08) + (name "0_RX1_CRX2_CS1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 49.53 0) + (length 5.08) + (name "1_TX1_CTX2_MISO1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 27.94 19.05 180) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "34" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -27.94 46.99 0) + (length 5.08) + (name "2_OUT2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "T41:Teensy_Audio_Adaptor" + (pin_names + (offset 1.016) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "U" + (at 3.81 17.78 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Teensy_Audio_Adaptor" + (at 3.81 15.24 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -10.16 -25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at -10.16 -25.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Teensy_Audio_Adaptor_0_1" + (rectangle + (start -19.05 13.97) + (end 19.05 -11.43) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + ) + ) + (symbol "Teensy_Audio_Adaptor_1_0" + (pin output line + (at -7.62 -16.51 90) + (length 5.08) + (name "Q" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -24.13 -5.08 0) + (length 5.08) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -24.13 -7.62 0) + (length 5.08) + (name "SCL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "19" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 0 -16.51 90) + (length 5.08) + (name "I" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -24.13 -2.54 0) + (length 5.08) + (name "MCLK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "23" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin output line + (at 7.62 -16.51 90) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 15.24 -16.51 90) + (length 5.08) + (name "Mic" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (symbol "Teensy_Audio_Adaptor_1_1" + (pin bidirectional line + (at -24.13 2.54 0) + (length 5.08) + (name "LRCLK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "20" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -24.13 0 0) + (length 5.08) + (name "BCLK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "21" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at -24.13 7.62 0) + (length 5.08) + (name "Tx" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -24.13 5.08 0) + (length 5.08) + (name "Rx" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "T41_Library:EA-T220-38E" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "H" + (at 16.51 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + ) + (property "Value" "EA-T220-38E" + (at 16.51 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + ) + (property "Footprint" "EAT22038E" + (at 16.51 -94.92 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ohmite.com/assets/docs/sink_e.pdf?r=false" + (at 16.51 -194.92 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Description" "OHMITE - EA-T220-38E - HEATSINK, TO-220, 38.1MM, BLACK" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Height" "38.35" + (at 16.51 -394.92 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Mouser Part Number" "588-EA-T220-38E" + (at 16.51 -494.92 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Mouser Price/Stock" "https://www.mouser.co.uk/ProductDetail/Ohmite/EA-T220-38E?qs=6weo7U0lPxCX9kcQhGcuZQ%3D%3D" + (at 16.51 -594.92 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Manufacturer_Name" "Ohmite" + (at 16.51 -694.92 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Manufacturer_Part_Number" "EA-T220-38E" + (at 16.51 -794.92 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (symbol "EA-T220-38E_1_1" + (rectangle + (start 5.08 2.54) + (end 15.24 -5.08) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (pin passive line + (at 0 0 0) + (length 5.08) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -2.54 0) + (length 5.08) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "T41_Library:IDC_2x4" + (pin_names + (offset 1.016) hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 1.27 7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "IDC_2x4" + (at 1.27 -7.62 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Generic connector, double row, 02x05, top/bottom pin numbering scheme (row 1: 1...pins_per_row, row2: pins_per_row+1 ... num_pins), script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "Connector*:*_2x??_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "IDC_2x4_1_1" + (rectangle + (start -1.27 -2.413) + (end 0 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 2.54) + (end 0 0) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 5.207) + (end 0 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -1.27 6.35) + (end 3.81 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (rectangle + (start 3.81 -2.413) + (end 2.54 -2.667) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 0.127) + (end 2.54 -0.127) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 2.667) + (end 2.54 2.413) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 3.81 5.207) + (end 2.54 4.953) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 5.08 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 5.08 180) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 2.54 180) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 0 180) + (length 3.81) + (name "Pin_6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 7.62 -2.54 180) + (length 3.81) + (name "Pin_8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Transistor_FET:2N7000" + (pin_names hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" + (at 5.08 1.905 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2N7000" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" + (at 5.08 -1.905 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.vishay.com/docs/70226/70226.pdf" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "0.2A Id, 200V Vds, N-Channel MOSFET, 2.6V Logic Level, TO-92" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "N-Channel MOSFET Logic-Level" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?92*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "2N7000_0_1" + (polyline + (pts + (xy 0.254 0) (xy -2.54 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.254 1.905) (xy 0.254 -1.905) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 -1.27) (xy 0.762 -2.286) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 0.508) (xy 0.762 -0.508) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 2.286) (xy 0.762 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 2.54) (xy 2.54 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 -2.54) (xy 2.54 0) (xy 0.762 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 -1.778) (xy 3.302 -1.778) (xy 3.302 1.778) (xy 0.762 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.016 0) (xy 2.032 0.381) (xy 2.032 -0.381) (xy 1.016 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 2.794 0.508) (xy 2.921 0.381) (xy 3.683 0.381) (xy 3.81 0.254) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 3.302 0.381) (xy 2.921 -0.254) (xy 3.683 -0.254) (xy 3.302 0.381) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 1.651 0) + (radius 2.794) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 2.54 -1.778) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center 2.54 1.778) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "2N7000_1_1" + (pin passive line + (at 2.54 -5.08 90) + (length 2.54) + (name "S" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -5.08 0 0) + (length 2.54) + (name "G" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 5.08 270) + (length 2.54) + (name "D" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "Transistor_FET:IRF4905" + (pin_names hide) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" + (at 5.08 1.905 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "IRF4905" + (at 5.08 0 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 5.08 -1.905 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "http://www.infineon.com/dgdl/irf4905.pdf?fileId=5546d462533600a4015355e32165197c" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "-74A Id, -55V Vds, Single P-Channel HEXFET Power MOSFET, 20mOhm Ron, TO-220AB" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "Single P-Channel HEXFET Power MOSFET" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO?220*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "IRF4905_0_1" + (polyline + (pts + (xy 0.254 0) (xy -2.54 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.254 1.905) (xy 0.254 -1.905) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 -1.27) (xy 0.762 -2.286) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 0.508) (xy 0.762 -0.508) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 2.286) (xy 0.762 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 2.54) (xy 2.54 1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 -2.54) (xy 2.54 0) (xy 0.762 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.762 1.778) (xy 3.302 1.778) (xy 3.302 -1.778) (xy 0.762 -1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.286 0) (xy 1.27 0.381) (xy 1.27 -0.381) (xy 2.286 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 2.794 -0.508) (xy 2.921 -0.381) (xy 3.683 -0.381) (xy 3.81 -0.254) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 3.302 -0.381) (xy 2.921 0.254) (xy 3.683 0.254) (xy 3.302 -0.381) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 1.651 0) + (radius 2.794) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 2.54 -1.778) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (circle + (center 2.54 1.778) + (radius 0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "IRF4905_1_1" + (pin input line + (at -5.08 0 0) + (length 2.54) + (name "G" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 5.08 270) + (length 2.54) + (name "D" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 -5.08 90) + (length 2.54) + (name "S" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:+12P" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12P" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+12P\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+12P_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+12P_1_1" + (pin power_in line + (at 0 0 90) + (length 0) hide + (name "+12P" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:+12V" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+12V\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+12V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+12V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) hide + (name "+12V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:+3V3" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3V3\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+3V3_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+3V3_1_1" + (pin power_in line + (at 0 0 90) + (length 0) hide + (name "+3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:+5V" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+5V\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "+5V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+5V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) hide + (name "+5V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + (symbol "power:GND" + (power) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "GND_1_1" + (pin power_in line + (at 0 0 270) + (length 0) hide + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + ) + ) + (junction + (at 154.94 152.4) + (diameter 0) + (color 0 0 0 0) + (uuid "0239eca1-805c-431e-ab1f-55abee9c46c2") + ) + (junction + (at 153.67 85.09) + (diameter 0) + (color 0 0 0 0) + (uuid "078e7ff1-e21c-459e-accb-c5bcf9d7c58d") + ) + (junction + (at 39.37 110.49) + (diameter 0) + (color 0 0 0 0) + (uuid "11e0187b-b2c1-4e0d-990d-807b83cc740d") + ) + (junction + (at 182.88 219.71) + (diameter 0) + (color 0 0 0 0) + (uuid "1480cfc0-5c3e-40a9-9311-48295f85030d") + ) + (junction + (at 41.91 198.12) + (diameter 0) + (color 0 0 0 0) + (uuid "1879a9de-c29f-4fc8-bb36-5b4463c0ec12") + ) + (junction + (at 236.22 232.41) + (diameter 0) + (color 0 0 0 0) + (uuid "1be99910-ee7b-46c9-85c1-7a1642e42d92") + ) + (junction + (at 107.95 236.22) + (diameter 0) + (color 0 0 0 0) + (uuid "1ed7707b-169c-4ace-9fa0-36fe682a50d7") + ) + (junction + (at 161.29 48.26) + (diameter 0) + (color 0 0 0 0) + (uuid "1f2dd448-ad5a-43fa-80fe-08cedd109ffe") + ) + (junction + (at 107.95 53.34) + (diameter 0) + (color 0 0 0 0) + (uuid "214a78fe-e5e0-4955-834a-ba06c68f0f85") + ) + (junction + (at 165.1 223.52) + (diameter 0) + (color 0 0 0 0) + (uuid "22633509-cff5-4ed5-a469-92ef5694e452") + ) + (junction + (at 156.21 209.55) + (diameter 0) + (color 0 0 0 0) + (uuid "2646d410-314f-4507-a405-ed2877d3f1aa") + ) + (junction + (at 222.25 45.72) + (diameter 0) + (color 0 0 0 0) + (uuid "2777e675-08bd-4396-92c9-3ea6f6abc8c9") + ) + (junction + (at 228.6 67.31) + (diameter 0) + (color 0 0 0 0) + (uuid "29021509-fd53-44c0-9962-0f2ab58f27ae") + ) + (junction + (at 187.96 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "296b9f83-2f7d-48f4-a0e8-684d2f11c183") + ) + (junction + (at 45.72 220.98) + (diameter 0) + (color 0 0 0 0) + (uuid "2dac7344-3055-4b61-837d-ff622742502f") + ) + (junction + (at 194.31 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "2e17bfef-74f0-43ce-a3b9-9cc38018ffe8") + ) + (junction + (at 200.66 109.22) + (diameter 0) + (color 0 0 0 0) + (uuid "30b2e534-8002-4943-9af7-07caa99849c1") + ) + (junction + (at 199.39 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "316b9fec-5c01-454e-8df1-714109ba129b") + ) + (junction + (at 171.45 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "33246895-d02e-444f-9d0a-415e2841a565") + ) + (junction + (at 161.29 52.07) + (diameter 0) + (color 0 0 0 0) + (uuid "364add15-5ef3-44e4-95d0-e2586c363096") + ) + (junction + (at 130.81 48.26) + (diameter 0) + (color 0 0 0 0) + (uuid "3f6d13a0-cc5c-480e-8794-2d4cdc14a2c8") + ) + (junction + (at 50.8 220.98) + (diameter 0) + (color 0 0 0 0) + (uuid "420d7a3b-b380-4934-8855-b7fad5dac582") + ) + (junction + (at 66.04 52.07) + (diameter 0) + (color 0 0 0 0) + (uuid "43cc58a7-f99f-4945-9911-f1c308adfef1") + ) + (junction + (at 138.43 67.31) + (diameter 0) + (color 0 0 0 0) + (uuid "465b888e-78e8-45b9-91bf-05203c6a7863") + ) + (junction + (at 222.25 67.31) + (diameter 0) + (color 0 0 0 0) + (uuid "4b8bf84e-385f-4d06-a486-7b0af18178be") + ) + (junction + (at 115.57 59.69) + (diameter 0) + (color 0 0 0 0) + (uuid "4d17b456-56fa-41ef-8f1e-da3e576446c6") + ) + (junction + (at 128.27 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "4ed6ea7d-b41d-4d12-804c-24878ad0c9c0") + ) + (junction + (at 193.04 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "507750d5-1411-44e9-be4f-c73078210889") + ) + (junction + (at 208.28 209.55) + (diameter 0) + (color 0 0 0 0) + (uuid "512d7c74-9168-4ed4-9b5e-35acbd63ad5f") + ) + (junction + (at 124.46 67.31) + (diameter 0) + (color 0 0 0 0) + (uuid "530ee5cf-d923-4b76-a4a1-e1a0150fc26d") + ) + (junction + (at 210.82 219.71) + (diameter 0) + (color 0 0 0 0) + (uuid "548239d9-96d6-4c98-8b92-4dc693e9997c") + ) + (junction + (at 200.66 125.73) + (diameter 0) + (color 0 0 0 0) + (uuid "557c9fd3-0eb2-4a62-8b19-41df8dcc4df7") + ) + (junction + (at 205.74 209.55) + (diameter 0) + (color 0 0 0 0) + (uuid "5aa34f2e-2999-48d5-8c8c-bfbc4b7f9ad7") + ) + (junction + (at 236.22 240.03) + (diameter 0) + (color 0 0 0 0) + (uuid "5d07673b-5b9f-447f-9f37-5f55dac06864") + ) + (junction + (at 172.72 182.88) + (diameter 0) + (color 0 0 0 0) + (uuid "5e388ff1-53ba-4ce4-8084-769357d82acc") + ) + (junction + (at 41.91 228.6) + (diameter 0) + (color 0 0 0 0) + (uuid "5f4ac3d2-51d5-42d4-aecf-bb00106fccf2") + ) + (junction + (at 154.94 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "5fdf21f4-307b-4d74-afa5-1915169db52e") + ) + (junction + (at 137.16 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "6227d269-a350-496b-a2b2-1a68e223e4d1") + ) + (junction + (at 158.75 93.98) + (diameter 0) + (color 0 0 0 0) + (uuid "63cca2d8-c368-49fe-8bf3-e123b2ead67d") + ) + (junction + (at 82.55 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "63e9b8f9-6f65-461f-918d-dc1238f33fed") + ) + (junction + (at 71.12 219.71) + (diameter 0) + (color 0 0 0 0) + (uuid "6a0ebd5b-9ab7-454e-ab28-5d3feef8fcc9") + ) + (junction + (at 58.42 161.29) + (diameter 0) + (color 0 0 0 0) + (uuid "6a6cf1d6-837a-4bfc-afb6-63bff77165e7") + ) + (junction + (at 102.87 53.34) + (diameter 0) + (color 0 0 0 0) + (uuid "6ca4b67c-4a8f-4c72-933c-024190e9c0f3") + ) + (junction + (at 158.75 209.55) + (diameter 0) + (color 0 0 0 0) + (uuid "73d7269f-d39f-4fff-82e5-1b301d64292a") + ) + (junction + (at 306.07 46.99) + (diameter 0) + (color 0 0 0 0) + (uuid "797c640e-5649-4f06-8c36-564de4f0906c") + ) + (junction + (at 45.72 236.22) + (diameter 0) + (color 0 0 0 0) + (uuid "7cd51be5-b7bd-47e2-9f86-f8d1188e81d6") + ) + (junction + (at 162.56 111.76) + (diameter 0) + (color 0 0 0 0) + (uuid "89798211-3e2e-44a3-a1e4-2321a59b880e") + ) + (junction + (at 264.16 59.69) + (diameter 0) + (color 0 0 0 0) + (uuid "8adfcc33-0f3e-49df-a554-40246d890724") + ) + (junction + (at 185.42 172.72) + (diameter 0) + (color 0 0 0 0) + (uuid "8b54da32-cd92-4ae0-a279-2a38412edfe9") + ) + (junction + (at 156.21 219.71) + (diameter 0) + (color 0 0 0 0) + (uuid "8b78bf8c-7942-4acc-b226-a18953ae5c4a") + ) + (junction + (at 222.25 59.69) + (diameter 0) + (color 0 0 0 0) + (uuid "8e3ccf5e-3272-4e80-a8c9-778ed5501597") + ) + (junction + (at 180.34 238.76) + (diameter 0) + (color 0 0 0 0) + (uuid "8eb7a143-5c53-4d33-a7b8-24575143a521") + ) + (junction + (at 165.1 109.22) + (diameter 0) + (color 0 0 0 0) + (uuid "9183ad8e-6bb7-4bd1-86d5-079a69cac60e") + ) + (junction + (at 161.29 67.31) + (diameter 0) + (color 0 0 0 0) + (uuid "9186e09f-484e-4766-bcc2-108f39d5c155") + ) + (junction + (at 203.2 59.69) + (diameter 0) + (color 0 0 0 0) + (uuid "95717b33-3830-41d3-be87-b51fd233cb9a") + ) + (junction + (at 196.85 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "96380cf6-4df2-46bc-a71f-016ce90e3e39") + ) + (junction + (at 45.72 243.84) + (diameter 0) + (color 0 0 0 0) + (uuid "9da93241-46c2-49b3-beb5-ed6291ed27bb") + ) + (junction + (at 111.76 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "a536b65f-8320-4bb0-8b55-7b7641b57818") + ) + (junction + (at 181.61 172.72) + (diameter 0) + (color 0 0 0 0) + (uuid "a68da249-85e2-45b5-8da2-723cb3e60200") + ) + (junction + (at 236.22 223.52) + (diameter 0) + (color 0 0 0 0) + (uuid "a8022ca3-f31b-4fe6-93a7-c38da4465b13") + ) + (junction + (at 91.44 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "a85f5548-1f3b-4f13-be75-20184e0115ff") + ) + (junction + (at 198.12 177.8) + (diameter 0) + (color 0 0 0 0) + (uuid "aaa86790-1d11-4a85-bd63-eb542c4be9ce") + ) + (junction + (at 240.03 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "ac11f944-2b90-4033-a7b7-aa8467c164c5") + ) + (junction + (at 193.04 67.31) + (diameter 0) + (color 0 0 0 0) + (uuid "acea53f4-066b-42be-8568-b1db057fc412") + ) + (junction + (at 66.04 57.15) + (diameter 0) + (color 0 0 0 0) + (uuid "afe48336-d4e9-44eb-85b2-87a4834c03f7") + ) + (junction + (at 196.85 67.31) + (diameter 0) + (color 0 0 0 0) + (uuid "b2675ce4-a751-402f-bbcd-e5a6986212dd") + ) + (junction + (at 181.61 209.55) + (diameter 0) + (color 0 0 0 0) + (uuid "b29577e9-27db-4b4b-857d-afb86d4dd93a") + ) + (junction + (at 222.25 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "b759e0f5-ff9f-4610-871f-58d29b9ba9c3") + ) + (junction + (at 168.91 54.61) + (diameter 0) + (color 0 0 0 0) + (uuid "bfc720ee-708e-41d6-bf3a-00a557b36f2d") + ) + (junction + (at 66.04 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "c117591a-48bc-4081-81d8-ede361572da9") + ) + (junction + (at 186.69 129.54) + (diameter 0) + (color 0 0 0 0) + (uuid "c3a40a78-ce5d-47ff-af02-430a49c885a9") + ) + (junction + (at 128.27 48.26) + (diameter 0) + (color 0 0 0 0) + (uuid "c714a063-b32f-4012-b148-ae3ea377c1c0") + ) + (junction + (at 226.06 259.08) + (diameter 0) + (color 0 0 0 0) + (uuid "c8eaa132-e8a5-4655-abf3-5a8c552cdcec") + ) + (junction + (at 175.26 172.72) + (diameter 0) + (color 0 0 0 0) + (uuid "cb64ace1-825c-4118-aef3-8e6a310fbe34") + ) + (junction + (at 198.12 261.62) + (diameter 0) + (color 0 0 0 0) + (uuid "ccb5f72b-b833-4ef3-9a47-fbef79c9f813") + ) + (junction + (at 180.34 243.84) + (diameter 0) + (color 0 0 0 0) + (uuid "cd855952-9ea6-4e87-ad50-2e1805276a43") + ) + (junction + (at 88.9 168.91) + (diameter 0) + (color 0 0 0 0) + (uuid "ce0e6433-d11c-4d17-9287-c3a786d03295") + ) + (junction + (at 199.39 261.62) + (diameter 0) + (color 0 0 0 0) + (uuid "ce74f9ee-3682-4c61-9e70-dfb680f86fe3") + ) + (junction + (at 356.87 62.23) + (diameter 0) + (color 0 0 0 0) + (uuid "d2101ab8-d83c-4d6f-9b35-118376df4f76") + ) + (junction + (at 218.44 59.69) + (diameter 0) + (color 0 0 0 0) + (uuid "d547b4aa-3d0b-4e4d-9851-472b5710672c") + ) + (junction + (at 222.25 251.46) + (diameter 0) + (color 0 0 0 0) + (uuid "da16c163-42c0-4e7c-99ad-7f2b9a27ef9a") + ) + (junction + (at 50.8 236.22) + (diameter 0) + (color 0 0 0 0) + (uuid "db6a322d-5c3a-4825-8b92-40ec375509f4") + ) + (junction + (at 240.03 59.69) + (diameter 0) + (color 0 0 0 0) + (uuid "def83167-1728-492d-a792-65f5c6dfed2a") + ) + (junction + (at 82.55 238.76) + (diameter 0) + (color 0 0 0 0) + (uuid "e368875e-6c84-4bad-a93e-2f4e436ad435") + ) + (junction + (at 82.55 53.34) + (diameter 0) + (color 0 0 0 0) + (uuid "e48d5b2b-1d38-4e6d-b72a-394bb787e172") + ) + (junction + (at 264.16 38.1) + (diameter 0) + (color 0 0 0 0) + (uuid "e7965570-eff5-4358-8339-4e6f81e6afa3") + ) + (junction + (at 57.15 104.14) + (diameter 0) + (color 0 0 0 0) + (uuid "ec3918d7-28e0-4971-95cd-45149d83a286") + ) + (junction + (at 142.24 48.26) + (diameter 0) + (color 0 0 0 0) + (uuid "efb9affa-2652-4a0a-8d42-a69af3d2bb9b") + ) + (junction + (at 45.72 198.12) + (diameter 0) + (color 0 0 0 0) + (uuid "f1a7cfbd-f194-4529-8a25-1ad1aabb24e2") + ) + (junction + (at 185.42 209.55) + (diameter 0) + (color 0 0 0 0) + (uuid "f2448b5c-7b6c-4cd3-a6f0-3b0e002c71df") + ) + (junction + (at 87.63 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "f2d5b706-922b-4555-9591-1855c3d5ea70") + ) + (junction + (at 82.55 52.07) + (diameter 0) + (color 0 0 0 0) + (uuid "f5788e1c-dc95-47d1-b16c-f241ab7df066") + ) + (junction + (at 88.9 171.45) + (diameter 0) + (color 0 0 0 0) + (uuid "f5cfe9f7-b3d2-4af9-9259-5b8bb61e2be9") + ) + (junction + (at 227.33 45.72) + (diameter 0) + (color 0 0 0 0) + (uuid "f85d0364-e803-4117-b8d5-2b462e491b24") + ) + (junction + (at 72.39 227.33) + (diameter 0) + (color 0 0 0 0) + (uuid "f8806081-c6ef-435f-a674-5d6618e65229") + ) + (junction + (at 210.82 67.31) + (diameter 0) + (color 0 0 0 0) + (uuid "ff362bcc-2a01-45ba-a240-504191252c9f") + ) + (no_connect + (at 248.92 160.02) + (uuid "009d8398-b31d-426f-95e8-4570e5f82cdb") + ) + (no_connect + (at 153.67 187.96) + (uuid "00a33290-e1b7-405e-bba4-ff60b23b257e") + ) + (no_connect + (at 44.45 53.34) + (uuid "05cd2203-bf39-4f38-8a92-1057033e8496") + ) + (no_connect + (at 354.33 39.37) + (uuid "098acbae-40bf-43a6-af91-675288b93f1d") + ) + (no_connect + (at 43.18 119.38) + (uuid "09d3ea10-8924-4a7a-895e-ed00e5e912e1") + ) + (no_connect + (at 74.93 170.18) + (uuid "113cff83-5629-4881-8b58-bacd5c4a8e65") + ) + (no_connect + (at 270.51 144.78) + (uuid "1389e1dc-8a17-4cea-bf25-ff2775d74930") + ) + (no_connect + (at 248.92 165.1) + (uuid "326cbddd-2b46-4298-b32e-b329c4f4c452") + ) + (no_connect + (at 88.9 127) + (uuid "35260bd5-c36a-4d15-9f4c-cb10ad04923a") + ) + (no_connect + (at 123.19 229.87) + (uuid "3b776231-51c5-4926-bf23-1fe788845511") + ) + (no_connect + (at 378.46 72.39) + (uuid "4ad2c7fc-8685-4682-9dae-d24ebdacb945") + ) + (no_connect + (at 57.15 53.34) + (uuid "5dbb039b-83c4-4fcb-a05f-f5d1eae549bd") + ) + (no_connect + (at 354.33 33.02) + (uuid "60c97fa8-8528-41cd-ba78-9fc6a869c78c") + ) + (no_connect + (at 74.93 157.48) + (uuid "64c862f4-fb7a-4e9c-ae1a-88995721f743") + ) + (no_connect + (at 250.19 185.42) + (uuid "7353f505-8f87-4b6c-838c-f50bb5924e7f") + ) + (no_connect + (at 88.9 116.84) + (uuid "76e090ea-b7de-4dff-97e2-d844d0dc3bfd") + ) + (no_connect + (at 255.27 144.78) + (uuid "7c44faea-e47b-47e5-b705-e618af7a072a") + ) + (no_connect + (at 378.46 85.09) + (uuid "82347eaa-3452-49f5-bc12-5b108ee13b97") + ) + (no_connect + (at 186.69 165.1) + (uuid "837941d5-2e59-4f85-b428-a0612eaa4b56") + ) + (no_connect + (at 264.16 232.41) + (uuid "8dd45729-e25b-4220-92ec-0f3ef2bc9850") + ) + (no_connect + (at 250.19 190.5) + (uuid "979cf7ea-e6d2-4f4f-acdd-47eb64c7e031") + ) + (no_connect + (at 264.16 227.33) + (uuid "a626673a-a69a-4717-b59c-e0ee7dc037a1") + ) + (no_connect + (at 199.39 165.1) + (uuid "a62b9c9a-c584-4ae7-9a74-84d6e6a1d0fa") + ) + (no_connect + (at 55.88 119.38) + (uuid "b78c5e8c-72e5-4dd7-899b-5d7d6c80d6a2") + ) + (no_connect + (at 278.13 144.78) + (uuid "bdb1ddb7-a014-4d49-a205-97f2a73c8988") + ) + (no_connect + (at 262.89 144.78) + (uuid "cf266941-af06-4c0a-a0a7-a3856e7bc1c8") + ) + (no_connect + (at 199.39 148.59) + (uuid "d51918b5-9661-45ca-86b8-18d5f97ce472") + ) + (no_connect + (at 186.69 153.67) + (uuid "d74ab22a-3d08-4736-8cd3-a8f782bd6f24") + ) + (no_connect + (at 199.39 116.84) + (uuid "de1c7941-6547-46bc-a0a9-4878c9512cfb") + ) + (no_connect + (at 354.33 30.48) + (uuid "e0b33954-4624-4b8d-866a-51ffe5896739") + ) + (no_connect + (at 354.33 41.91) + (uuid "e142851c-3896-4127-b9ab-f1bd928f007d") + ) + (no_connect + (at 123.19 224.79) + (uuid "e1503b9d-5053-43e8-9e64-63ee0729dc83") + ) + (wire + (pts + (xy 82.55 238.76) (xy 85.09 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "00bc97b2-4475-4a05-970c-13ef7cb85b48") + ) + (wire + (pts + (xy 82.55 38.1) (xy 91.44 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "012da651-37ae-4870-b0c9-21c13589e694") + ) + (wire + (pts + (xy 138.43 67.31) (xy 161.29 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "018c7cf6-1c44-403e-92e9-5d8bfae7002f") + ) + (wire + (pts + (xy 226.06 259.08) (xy 228.6 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "01bc4744-787c-41d1-9b07-fde47075763c") + ) + (wire + (pts + (xy 49.53 53.34) (xy 49.53 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "025d47e6-0b2f-4e60-a468-51b2c2d08f61") + ) + (wire + (pts + (xy 218.44 20.32) (xy 222.25 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "027be3e8-a084-4921-9b77-7bb862a0d6e0") + ) + (wire + (pts + (xy 36.83 110.49) (xy 39.37 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "02c58252-69ab-4e24-82e4-a27976083866") + ) + (wire + (pts + (xy 88.9 106.68) (xy 76.2 106.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0424b21f-9863-4181-aa3a-179144f08875") + ) + (wire + (pts + (xy 193.04 67.31) (xy 196.85 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "04f1795e-87da-4a76-916b-a590fa5909da") + ) + (wire + (pts + (xy 137.16 38.1) (xy 154.94 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "064ae8cd-07d4-4f09-b5d0-a4a4559d1c62") + ) + (wire + (pts + (xy 222.25 20.32) (xy 222.25 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "06c9b215-6e86-4dbf-9519-6f5e400e1f29") + ) + (wire + (pts + (xy 115.57 227.33) (xy 123.19 227.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0715961e-dcc3-48e1-adfa-659707f4199a") + ) + (wire + (pts + (xy 234.95 130.81) (xy 238.76 130.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "07ca4c04-f258-4632-8ecb-970873bd0edc") + ) + (wire + (pts + (xy 250.19 182.88) (xy 252.73 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "08edfd56-617a-441f-a112-5900e9a6f463") + ) + (wire + (pts + (xy 222.25 251.46) (xy 228.6 251.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "08f9d98f-4bcc-4caf-80a8-0ab2f08fda8d") + ) + (wire + (pts + (xy 157.48 156.21) (xy 157.48 152.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "092eb761-e8ec-47b4-b593-7c6968d57123") + ) + (wire + (pts + (xy 200.66 173.99) (xy 185.42 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "09fad92d-dcd3-4b36-90a9-bf04821ce791") + ) + (wire + (pts + (xy 102.87 53.34) (xy 91.44 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0a5263ee-b77a-47d9-9773-66c7e9d77f63") + ) + (wire + (pts + (xy 148.59 85.09) (xy 153.67 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0a7bbe4b-67e2-436f-8903-e56f33b7011d") + ) + (wire + (pts + (xy 111.76 38.1) (xy 115.57 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0b30ba96-6073-4f2b-a85b-f9858e99f189") + ) + (wire + (pts + (xy 66.04 57.15) (xy 69.85 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0b7858fa-4fdf-4a5f-99d1-0f755060bc0f") + ) + (wire + (pts + (xy 203.2 20.32) (xy 199.39 20.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0baf29cf-fc05-4107-a23a-8dd88bfee5d8") + ) + (wire + (pts + (xy 57.15 109.22) (xy 55.88 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0cc2421d-e9bc-4ec8-b51f-b2acbb005dba") + ) + (wire + (pts + (xy 85.09 228.6) (xy 85.09 218.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0ced0f05-b4bb-4625-97e1-0d4e2275c718") + ) + (wire + (pts + (xy 186.69 128.27) (xy 185.42 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0d628e7e-4930-4234-8cd8-b1dfc68dad3e") + ) + (polyline + (pts + (xy 276.86 182.88) (xy 276.86 144.78) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "0d9c1216-c88f-41d6-ae77-77d3eedab03c") + ) + (wire + (pts + (xy 54.61 161.29) (xy 58.42 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0dd010ef-2f13-493b-92f3-04d709a43331") + ) + (wire + (pts + (xy 124.46 67.31) (xy 138.43 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0dd415bd-5f9a-4030-affa-9a39164ae059") + ) + (wire + (pts + (xy 50.8 220.98) (xy 63.5 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0def2965-ae0b-42b1-aaa7-4a05e003d344") + ) + (wire + (pts + (xy 144.78 142.24) (xy 148.59 142.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0e4e1de7-2200-4d45-97b2-c39b574675f8") + ) + (wire + (pts + (xy 69.85 114.3) (xy 55.88 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "0ea5b878-8394-47ed-82bc-6460b06ae800") + ) + (wire + (pts + (xy 222.25 59.69) (xy 240.03 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "10fe9295-56d4-403d-8cce-bdef49543fd1") + ) + (wire + (pts + (xy 199.39 175.26) (xy 200.66 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "11907b69-918d-4fb1-a889-6658125a31d0") + ) + (polyline + (pts + (xy 262.89 162.56) (xy 265.43 162.56) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "12ef5ec2-00cf-49cc-bb37-b147f1d5c959") + ) + (wire + (pts + (xy 199.39 38.1) (xy 199.39 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1341341c-a057-4052-914e-78ec9b8cb1be") + ) + (wire + (pts + (xy 66.04 38.1) (xy 82.55 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1421b20a-4891-4d51-81b3-37a48f0c4ed8") + ) + (wire + (pts + (xy 201.93 153.67) (xy 199.39 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "14eb8d5e-5bcb-41d2-8137-825cc9a1dfbf") + ) + (wire + (pts + (xy 86.36 166.37) (xy 88.9 166.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "17275713-ae01-4695-baeb-f9be6d30f195") + ) + (wire + (pts + (xy 194.31 38.1) (xy 196.85 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1733e7ad-1b15-496d-b361-435c88d68244") + ) + (wire + (pts + (xy 203.2 38.1) (xy 199.39 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "17f308f5-d87b-4634-98a7-511bfd319c79") + ) + (wire + (pts + (xy 162.56 111.76) (xy 186.69 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1825725b-f657-4e25-bc1f-4c08f1d4d3de") + ) + (wire + (pts + (xy 115.57 59.69) (xy 116.84 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1849b078-ae49-4811-abbe-d782ecf663f0") + ) + (wire + (pts + (xy 91.44 49.53) (xy 91.44 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "18d0c2c6-23cb-4f2a-a095-7b04f17107ba") + ) + (wire + (pts + (xy 171.45 38.1) (xy 187.96 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1916c783-19af-426e-97e9-9364e0408d71") + ) + (wire + (pts + (xy 264.16 237.49) (xy 259.08 237.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "19bb300c-0fda-42b5-8d76-9947f7c38e23") + ) + (wire + (pts + (xy 255.27 223.52) (xy 255.27 229.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1a2a5da3-a0c6-45ed-b079-9367b6387196") + ) + (wire + (pts + (xy 199.39 138.43) (xy 214.63 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1ac93a1c-f86a-4ad0-a335-cb2f101080dc") + ) + (wire + (pts + (xy 198.12 261.62) (xy 199.39 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1af5c862-2e83-493f-a9ca-7b41f69b299f") + ) + (wire + (pts + (xy 57.15 111.76) (xy 55.88 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1af8bba4-f8be-45bf-9c3b-61d655ec385d") + ) + (wire + (pts + (xy 175.26 172.72) (xy 181.61 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1b76752d-8dc1-4a6b-ae11-922567c6e947") + ) + (wire + (pts + (xy 168.91 182.88) (xy 172.72 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1caabf43-e6db-45e9-bf0f-e878c64391a9") + ) + (wire + (pts + (xy 200.66 177.8) (xy 200.66 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1ce0d513-473d-449d-9de8-c9586d34aa55") + ) + (wire + (pts + (xy 162.56 101.6) (xy 163.83 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1d089419-51d6-421e-a088-c1f8459d71e5") + ) + (wire + (pts + (xy 144.78 109.22) (xy 165.1 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1da0be6a-8b71-4b82-8458-20bef8bce318") + ) + (wire + (pts + (xy 82.55 49.53) (xy 82.55 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1dee0c93-abf6-4119-bba9-a1a1e09d7458") + ) + (wire + (pts + (xy 95.25 38.1) (xy 91.44 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1e24e992-3687-4f42-8816-e1467dc08913") + ) + (wire + (pts + (xy 45.72 236.22) (xy 50.8 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1e53add6-a820-47fb-a486-5fefb9c3cafc") + ) + (wire + (pts + (xy 224.79 223.52) (xy 224.79 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1f27e30c-39ae-4b6c-9a1a-d74880bbdae5") + ) + (wire + (pts + (xy 168.91 172.72) (xy 175.26 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1fce2066-2619-4053-800b-83e1f31e8520") + ) + (wire + (pts + (xy 124.46 48.26) (xy 124.46 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "20455df3-e302-4133-a1d1-62dd0aefff5c") + ) + (wire + (pts + (xy 45.72 181.61) (xy 45.72 186.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2105c645-d3d8-4a07-9ef6-3e2e3ef6c98d") + ) + (wire + (pts + (xy 87.63 171.45) (xy 87.63 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "215de846-cac6-4c3d-ae72-0f936260c26b") + ) + (wire + (pts + (xy 214.63 167.64) (xy 212.09 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "21b586b9-6bbb-4ade-a159-1ccf276d1631") + ) + (wire + (pts + (xy 193.04 57.15) (xy 193.04 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "21e3c76b-961b-4620-9091-6110f2cfa945") + ) + (wire + (pts + (xy 148.59 91.44) (xy 148.59 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2227f427-c7c9-41ee-8a28-fb4850f7c740") + ) + (wire + (pts + (xy 195.58 259.08) (xy 195.58 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "224d6812-69bc-49df-8e9b-378a224b4714") + ) + (wire + (pts + (xy 180.34 238.76) (xy 180.34 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "22c7fd19-7895-4c24-b27e-ac4d5fb8034d") + ) + (wire + (pts + (xy 49.53 58.42) (xy 66.04 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "23e10732-697d-4d4c-a8c7-99c3e1917694") + ) + (wire + (pts + (xy 81.28 124.46) (xy 88.9 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2419619e-bf74-40e9-84e1-9feaafda913f") + ) + (wire + (pts + (xy 185.42 125.73) (xy 200.66 125.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "24ee84c1-886a-4fc7-9678-a36c1323266e") + ) + (wire + (pts + (xy 254 154.94) (xy 254 160.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "263f8385-35ce-4d60-a949-1ed35d3f64c6") + ) + (wire + (pts + (xy 124.46 64.77) (xy 124.46 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "26836e32-3942-475d-9e59-dacec24aaf85") + ) + (wire + (pts + (xy 175.26 172.72) (xy 175.26 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "27407d62-89fd-413a-9335-c9af67d320db") + ) + (wire + (pts + (xy 57.15 111.76) (xy 57.15 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "28743abd-2ae0-449f-bd34-46f492509da4") + ) + (wire + (pts + (xy 115.57 227.33) (xy 115.57 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "28a44d81-abf8-4edc-9004-51535a8ffcf4") + ) + (wire + (pts + (xy 144.78 147.32) (xy 148.59 147.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "28a45226-9d67-4592-9d46-70881fa6d655") + ) + (wire + (pts + (xy 144.78 106.68) (xy 148.59 106.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2942eac3-e3d5-4802-bc81-5b2d54d599c2") + ) + (polyline + (pts + (xy 262.89 144.78) (xy 262.89 151.13) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "2a472eb2-86f0-4c81-9c16-b2ac98837482") + ) + (wire + (pts + (xy 185.42 209.55) (xy 195.58 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2a76d6bf-7054-4f28-bc75-b57438a1d481") + ) + (wire + (pts + (xy 161.29 48.26) (xy 165.1 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2a9c4dd5-0113-4b1f-9a38-be78f8ff3d26") + ) + (wire + (pts + (xy 68.58 137.16) (xy 88.9 137.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2c67be65-3930-4522-bf81-3020f1be0c7c") + ) + (wire + (pts + (xy 210.82 251.46) (xy 222.25 251.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2c8a0581-86b5-47f0-8e62-32bd29dffaa3") + ) + (wire + (pts + (xy 158.75 209.55) (xy 165.1 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2cc97a63-53c0-4421-a66b-1e7274ee3a67") + ) + (wire + (pts + (xy 168.91 233.68) (xy 185.42 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2cef6a0f-bc52-4f30-9c49-b90c80daa3d7") + ) + (wire + (pts + (xy 166.37 134.62) (xy 144.78 134.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2dfb4490-08b3-4313-bd76-934feee00605") + ) + (wire + (pts + (xy 123.19 234.95) (xy 123.19 237.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2e532183-646f-4935-a831-70bc369a6777") + ) + (wire + (pts + (xy 34.29 101.6) (xy 34.29 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2eaf62ff-55c6-455b-83b6-50befaabbc7e") + ) + (wire + (pts + (xy 68.58 219.71) (xy 71.12 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2eb4499f-0eff-434d-a496-27c0f8376bd1") + ) + (wire + (pts + (xy 147.32 170.18) (xy 147.32 166.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2ec1b797-7178-4458-8413-f2d01ae95213") + ) + (wire + (pts + (xy 144.78 121.92) (xy 148.59 121.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2ece5369-46b2-4633-80cb-d552b8129f30") + ) + (wire + (pts + (xy 128.27 48.26) (xy 130.81 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2edd34b1-2e9e-43b5-b427-7a44a45dc2ce") + ) + (wire + (pts + (xy 199.39 135.89) (xy 201.93 135.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2efba857-c646-4f2b-80bb-53df46abc49b") + ) + (wire + (pts + (xy 63.5 233.68) (xy 85.09 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2f8290c1-0ae5-4d33-83c8-65c5206468f3") + ) + (wire + (pts + (xy 186.69 129.54) (xy 199.39 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "2fd2d846-bb6a-4fea-bed9-7d1db201f832") + ) + (wire + (pts + (xy 88.9 85.09) (xy 83.82 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3000c14e-d904-4f2e-a8ae-ba89fcfac95b") + ) + (wire + (pts + (xy 199.39 167.64) (xy 204.47 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "30407f92-1225-46d4-8a93-d08889c9f8ee") + ) + (wire + (pts + (xy 60.96 181.61) (xy 60.96 186.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "30b025c5-f0b3-4560-b334-ee814598a833") + ) + (wire + (pts + (xy 105.41 243.84) (xy 105.41 247.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "31989088-fa19-4e15-8f58-d08a95672ade") + ) + (wire + (pts + (xy 185.42 175.26) (xy 185.42 177.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "31b6904e-a68d-4b1a-b864-34d5bbbbc7a3") + ) + (wire + (pts + (xy 59.69 105.41) (xy 59.69 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3222d651-c482-4c56-97d4-d74d1e7b17f6") + ) + (wire + (pts + (xy 73.66 149.86) (xy 88.9 149.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "32c70c0e-5c66-407e-ba07-18e156138022") + ) + (wire + (pts + (xy 264.16 229.87) (xy 255.27 229.87) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3377cb27-a42e-4563-aec1-6ad061ce4d7e") + ) + (wire + (pts + (xy 193.04 38.1) (xy 193.04 49.53) + ) + (stroke + (width 0) + (type default) + ) + (uuid "358aa415-49bf-4b48-8c90-6ca938c8d283") + ) + (wire + (pts + (xy 134.62 193.04) (xy 140.97 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "35b57b8b-9aac-4d1e-87b5-2317a5d84724") + ) + (wire + (pts + (xy 151.13 161.29) (xy 144.78 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3644a792-75a8-4b0b-b4a1-299292ed016d") + ) + (wire + (pts + (xy 41.91 198.12) (xy 45.72 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "370d6bb3-80e4-49e6-9c0a-bcec4fb85077") + ) + (wire + (pts + (xy 76.2 106.68) (xy 76.2 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3714f137-7c20-48ae-a81b-4c1117f86939") + ) + (wire + (pts + (xy 255.27 240.03) (xy 251.46 240.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "37db2082-2e11-4f13-b2fa-a9974298bb44") + ) + (wire + (pts + (xy 31.75 181.61) (xy 31.75 186.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "37e82e10-d4c9-4828-870d-97bf2c14c76d") + ) + (wire + (pts + (xy 186.69 130.81) (xy 186.69 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "383fa33a-f75e-43e0-83a4-61f835367207") + ) + (wire + (pts + (xy 54.61 153.67) (xy 57.15 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "38cbc589-2a40-49ba-8a0d-46f4723a2f58") + ) + (wire + (pts + (xy 41.91 153.67) (xy 35.56 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "393d6648-6a5f-409e-800c-856552c06bcf") + ) + (wire + (pts + (xy 57.15 104.14) (xy 59.69 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3aa62b10-f4d8-4d3f-b3ba-7473f9fb5b03") + ) + (polyline + (pts + (xy 264.16 157.48) (xy 264.16 152.4) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "3bc98fca-4412-4471-bb64-82316b96ef33") + ) + (wire + (pts + (xy 168.91 173.99) (xy 168.91 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3c2dcee6-4b3f-432a-8ea7-43307dc92fce") + ) + (wire + (pts + (xy 105.41 233.68) (xy 107.95 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3c7fd64f-5b54-4adc-989a-67810f212d50") + ) + (wire + (pts + (xy 200.66 125.73) (xy 200.66 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3cb833db-d26f-4416-9616-8432b231c355") + ) + (wire + (pts + (xy 41.91 158.75) (xy 30.48 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3ccef5b3-d99f-4d34-97c4-2d5bf53ac6d7") + ) + (wire + (pts + (xy 132.08 195.58) (xy 140.97 195.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3cec12df-6280-4a66-854d-1c9d7ad5da89") + ) + (wire + (pts + (xy 306.07 46.99) (xy 322.58 46.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3d0cf3a7-1a80-42f8-aa81-59ad760f7b5c") + ) + (wire + (pts + (xy 40.64 220.98) (xy 45.72 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3d8a806b-f8d4-46e8-9c63-7dc88c2c158e") + ) + (wire + (pts + (xy 181.61 209.55) (xy 185.42 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3dd9cfbe-550a-4291-900b-1474acb78899") + ) + (wire + (pts + (xy 111.76 49.53) (xy 111.76 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3df0abd5-d892-4ad1-b22c-937cfcca7dc4") + ) + (wire + (pts + (xy 38.1 144.78) (xy 88.9 144.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "402a429a-4249-4652-a76a-28a56e20c6df") + ) + (wire + (pts + (xy 160.02 171.45) (xy 144.78 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "413efb46-7a85-47aa-8c22-73e5d56c721f") + ) + (wire + (pts + (xy 180.34 243.84) (xy 180.34 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4143394a-3f09-4cd1-aea6-7f5b7795447b") + ) + (wire + (pts + (xy 81.28 121.92) (xy 88.9 121.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "414a9f10-d41a-40a5-b096-763ee6407d3d") + ) + (wire + (pts + (xy 181.61 129.54) (xy 186.69 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4153ce53-9121-4524-b7be-da6fa04ffb53") + ) + (wire + (pts + (xy 40.64 104.14) (xy 40.64 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "416bf6b6-691a-4204-8110-c2b97a6c42aa") + ) + (wire + (pts + (xy 40.64 228.6) (xy 41.91 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "41709e57-5471-48d3-9168-4fbdbadb0d91") + ) + (wire + (pts + (xy 201.93 114.3) (xy 199.39 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "41c54caa-d231-4452-b5b6-7db5de55bd7f") + ) + (wire + (pts + (xy 165.1 104.14) (xy 165.1 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4239ef75-7786-48f7-9cf7-d11b7ef6fa78") + ) + (wire + (pts + (xy 130.81 48.26) (xy 130.81 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "429772b5-2a25-42ff-a70a-d9ecc72a8ce9") + ) + (wire + (pts + (xy 34.29 101.6) (xy 88.9 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "44f36e02-53f8-4cce-a1f2-df5c52d802d2") + ) + (wire + (pts + (xy 327.66 30.48) (xy 331.47 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "467f35f9-7ac3-4cda-bcb1-a77e2add2fc3") + ) + (wire + (pts + (xy 138.43 64.77) (xy 138.43 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "46e2e718-d3a6-4cee-b8cd-57debf4082bb") + ) + (wire + (pts + (xy 91.44 38.1) (xy 91.44 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "472530ab-f333-4c98-8157-e672dfca5870") + ) + (wire + (pts + (xy 77.47 153.67) (xy 80.01 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "47ad5aba-9845-4fb3-86c7-625b5c7e8d94") + ) + (wire + (pts + (xy 33.02 114.3) (xy 33.02 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "489ac9fb-6dd3-4173-a9e7-a0a524671ecc") + ) + (wire + (pts + (xy 82.55 53.34) (xy 85.09 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4a1a271d-dc16-48e6-a13b-e059ce65cf1a") + ) + (wire + (pts + (xy 35.56 139.7) (xy 88.9 139.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4a825c4a-be15-41c2-aa06-dd7217a5e302") + ) + (wire + (pts + (xy 210.82 238.76) (xy 215.9 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4b1d569f-d3f4-4e9a-9e10-5be9b94e7f34") + ) + (wire + (pts + (xy 234.95 135.89) (xy 238.76 135.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4bd96f87-f260-49fc-a563-c8f73fb171ba") + ) + (wire + (pts + (xy 148.59 54.61) (xy 168.91 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4d4dc410-7b2a-46e5-9329-59ab145cc7a1") + ) + (wire + (pts + (xy 165.1 109.22) (xy 186.69 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4da72512-da68-47f6-b4dc-d55dd6fbcbae") + ) + (wire + (pts + (xy 123.19 232.41) (xy 115.57 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4daf9c62-8a8d-4813-9378-aee8d6bc58d0") + ) + (wire + (pts + (xy 196.85 67.31) (xy 196.85 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4e209846-2220-4c5c-834c-777b9d63bcb0") + ) + (wire + (pts + (xy 160.02 168.91) (xy 160.02 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4e66b4b0-a66e-476c-80b9-601330c30cbe") + ) + (wire + (pts + (xy 212.09 209.55) (xy 208.28 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4f10f1a2-237a-4572-abf0-2ba9b6064a5d") + ) + (wire + (pts + (xy 160.02 156.21) (xy 160.02 151.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4f4984fa-fb63-488d-a146-86d2a065d8fd") + ) + (wire + (pts + (xy 30.48 158.75) (xy 30.48 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "4fc0dcce-7d59-42de-bbcb-bb4b4722cfb2") + ) + (wire + (pts + (xy 199.39 20.32) (xy 199.39 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "50bc681b-7509-4a59-8439-3b2c18195b3d") + ) + (wire + (pts + (xy 41.91 156.21) (xy 33.02 156.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "50e974b1-e2e7-4336-bb3c-d269d874d810") + ) + (wire + (pts + (xy 68.58 158.75) (xy 68.58 137.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5138d44c-3926-4be7-8c2d-a0a2dcb7d9ec") + ) + (wire + (pts + (xy 306.07 54.61) (xy 306.07 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5274582f-197e-4b85-bfbe-653441ed6ef6") + ) + (wire + (pts + (xy 179.07 209.55) (xy 181.61 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5311d678-0c8a-438e-836d-8d09ea9d0601") + ) + (wire + (pts + (xy 200.66 125.73) (xy 203.2 125.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5425857d-fc11-4a06-8859-81ea1b28d89c") + ) + (wire + (pts + (xy 64.77 134.62) (xy 88.9 134.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "54b6f013-9cd9-4bfd-a04a-602bf0a87ff9") + ) + (wire + (pts + (xy 151.13 168.91) (xy 151.13 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "54ee2283-cdb9-4cc8-8c93-ba2dbb8c4e7f") + ) + (wire + (pts + (xy 130.81 48.26) (xy 142.24 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "556706b0-a691-465f-b397-afb749de2e31") + ) + (wire + (pts + (xy 160.02 151.13) (xy 144.78 151.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5599604b-0a73-4e8b-9b5d-4b8c4b68396f") + ) + (wire + (pts + (xy 163.83 139.7) (xy 144.78 139.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "55b5e7ea-c209-4e65-986c-aadb7ced8592") + ) + (wire + (pts + (xy 227.33 45.72) (xy 240.03 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5637f307-16cd-4b39-83c5-1e615318f24f") + ) + (wire + (pts + (xy 33.02 132.08) (xy 88.9 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5648e686-1463-4c42-af62-dc5fb09af42d") + ) + (wire + (pts + (xy 222.25 259.08) (xy 226.06 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5662da34-480f-414a-826c-2ce339bf6575") + ) + (wire + (pts + (xy 66.04 57.15) (xy 66.04 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "581c3a64-8928-4072-8e70-895f0ca4fcd0") + ) + (wire + (pts + (xy 260.35 185.42) (xy 260.35 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5890efea-92e8-4152-8615-0bde88755a9a") + ) + (wire + (pts + (xy 311.15 30.48) (xy 314.96 30.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "593b2c44-9db7-4528-a7d4-c83bd9d422d2") + ) + (wire + (pts + (xy 105.41 241.3) (xy 113.03 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "59ebbc36-f722-4ead-b58d-4bf850a85508") + ) + (wire + (pts + (xy 198.12 209.55) (xy 198.12 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5a80ffec-b62c-4930-839c-9d922c019b44") + ) + (wire + (pts + (xy 128.27 38.1) (xy 128.27 39.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5ad36326-4c00-49d0-a1e7-a3efb8828827") + ) + (wire + (pts + (xy 64.77 156.21) (xy 64.77 134.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5b5f4f79-94fe-4a0c-ae0b-cad9c83a41d6") + ) + (wire + (pts + (xy 250.19 180.34) (xy 260.35 180.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5bdc03ad-7d5e-4d15-89e3-4e95594a5f04") + ) + (wire + (pts + (xy 110.49 38.1) (xy 111.76 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5c4de4cc-5111-4f18-99bf-1d6a11920c54") + ) + (wire + (pts + (xy 80.01 170.18) (xy 85.09 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d2a02e6-16be-4d9b-a436-4fd97e1ac8e8") + ) + (wire + (pts + (xy 210.82 233.68) (xy 217.17 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5d8f9743-5e65-4e22-a46e-104edb90c74c") + ) + (wire + (pts + (xy 54.61 151.13) (xy 54.61 147.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5ddfd0cf-bb96-4ca4-8254-411150523da5") + ) + (wire + (pts + (xy 176.53 119.38) (xy 186.69 119.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e90f225-da4b-4149-a370-a0e41f1146bd") + ) + (wire + (pts + (xy 156.21 219.71) (xy 158.75 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "601ed941-4771-4726-b4e0-b2ff5238ba5b") + ) + (wire + (pts + (xy 87.63 171.45) (xy 88.9 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6083dd20-a601-4bc7-84a9-6fcec7709c6f") + ) + (wire + (pts + (xy 74.93 260.35) (xy 74.93 255.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "610a9550-411d-4aaa-92fb-705b6cae2571") + ) + (wire + (pts + (xy 186.69 175.26) (xy 185.42 175.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "610e4c56-5f93-48fc-a50a-4bb4fedf39f2") + ) + (wire + (pts + (xy 186.69 148.59) (xy 186.69 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "61836976-80a3-4669-b15c-ec0e9466ad1f") + ) + (polyline + (pts + (xy 265.43 162.56) (xy 265.43 151.13) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "628add7d-292d-4e49-b71d-7ace9fd0539d") + ) + (polyline + (pts + (xy 26.67 72.39) (xy 26.67 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62af7b0b-ff15-4c47-95c5-33c76d1b28d7") + ) + (wire + (pts + (xy 166.37 138.43) (xy 166.37 134.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62dd3e5d-aa29-43ef-a347-deec7a6bcaf2") + ) + (wire + (pts + (xy 257.81 38.1) (xy 264.16 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "62f7e01d-20f3-43cc-b577-4bd22f3c2ab4") + ) + (wire + (pts + (xy 38.1 161.29) (xy 38.1 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6354cefd-6663-48b1-acdd-8a0443b06ebd") + ) + (wire + (pts + (xy 236.22 223.52) (xy 224.79 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "64fe941a-b229-4872-97ca-316cf55a2d24") + ) + (wire + (pts + (xy 180.34 251.46) (xy 185.42 251.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "66497ec2-5756-4b5f-b67f-dc1cd5699320") + ) + (wire + (pts + (xy 82.55 163.83) (xy 88.9 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6654900a-5866-4b5f-84bc-81bdb78a99b8") + ) + (wire + (pts + (xy 153.67 195.58) (xy 156.21 195.58) + ) + (stroke + (width 0) + (type default) + ) + (uuid "667cc034-1274-4d21-8857-7d2e2c6ec016") + ) + (wire + (pts + (xy 176.53 231.14) (xy 185.42 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6688a0e1-c68c-4593-a8df-dfdf7e50f35b") + ) + (wire + (pts + (xy 80.01 114.3) (xy 88.9 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "66f0b758-fda9-4c3a-b3aa-81475aeade42") + ) + (wire + (pts + (xy 311.15 33.02) (xy 314.96 33.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6742ad22-bc66-4d85-8e34-c2c8f404aca8") + ) + (wire + (pts + (xy 224.79 233.68) (xy 224.79 240.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "68197e53-edf0-4fe4-9ac5-bc0349233792") + ) + (wire + (pts + (xy 222.25 45.72) (xy 227.33 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6867336b-5e3d-4b62-b179-242131ea1833") + ) + (wire + (pts + (xy 306.07 45.72) (xy 306.07 46.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6892e5ed-222c-4033-a096-8f891d4dd28f") + ) + (wire + (pts + (xy 85.09 170.18) (xy 85.09 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "696523e3-2afa-49c1-afef-079960e7982b") + ) + (wire + (pts + (xy 201.93 119.38) (xy 199.39 119.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6997a059-72cf-4c89-a6f3-b091cc8643a4") + ) + (wire + (pts + (xy 200.66 261.62) (xy 200.66 259.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6a561bd2-80dd-4bf3-b8fe-ae63c20d49fe") + ) + (wire + (pts + (xy 144.78 99.06) (xy 148.59 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6aa7ff1b-aa8a-4df0-9022-071e820e2fad") + ) + (wire + (pts + (xy 195.58 189.23) (xy 181.61 189.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6ab75565-1eab-4727-9105-cf9117e82253") + ) + (wire + (pts + (xy 210.82 231.14) (xy 217.17 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6b0560b8-ece2-4f53-bc8b-67e117598070") + ) + (wire + (pts + (xy 41.91 151.13) (xy 38.1 151.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6b18c959-c339-4899-ad52-70c351986bbc") + ) + (wire + (pts + (xy 144.78 104.14) (xy 148.59 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6c68d385-0c49-4518-bb9b-b15bfd909661") + ) + (wire + (pts + (xy 144.78 132.08) (xy 152.4 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6c732d22-6d86-4bca-a0b0-39170cc905d7") + ) + (wire + (pts + (xy 234.95 120.65) (xy 238.76 120.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6cf116f0-d411-4ba1-bdf1-4e8704791964") + ) + (wire + (pts + (xy 161.29 66.04) (xy 161.29 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6d75db03-09f4-4ffe-89c4-f9b4864c0de9") + ) + (wire + (pts + (xy 210.82 219.71) (xy 212.09 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6d93fa98-2ba1-4797-ba1a-28b416913b53") + ) + (wire + (pts + (xy 210.82 246.38) (xy 215.9 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6edf3c83-d50c-4f3d-85d4-a1126546d832") + ) + (wire + (pts + (xy 123.19 38.1) (xy 128.27 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f15281e-d836-43b6-bc0b-003c83c99dbd") + ) + (wire + (pts + (xy 45.72 194.31) (xy 45.72 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6f5e7039-ba7f-42ce-9fb3-e4ae628df0ff") + ) + (wire + (pts + (xy 168.91 181.61) (xy 168.91 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6fdf93d7-f508-4439-89ad-a5a796f0d099") + ) + (wire + (pts + (xy 46.99 53.34) (xy 46.99 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "70dc4953-4111-4dda-988c-ed4745b81a5d") + ) + (wire + (pts + (xy 200.66 111.76) (xy 199.39 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "71321a75-1bd9-4d77-97e6-d08657505100") + ) + (wire + (pts + (xy 234.95 133.35) (xy 238.76 133.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "71a85267-7824-4b95-918a-00eb81d56792") + ) + (wire + (pts + (xy 64.77 38.1) (xy 66.04 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "72aebaaf-181f-4ede-9190-13194b69d154") + ) + (wire + (pts + (xy 205.74 209.55) (xy 198.12 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "736aff6b-fba4-4491-9477-873ebb69871c") + ) + (wire + (pts + (xy 82.55 157.48) (xy 82.55 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74130ae3-12f6-4122-b09e-893b015d04dd") + ) + (wire + (pts + (xy 55.88 116.84) (xy 76.2 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74a35cb3-4997-4735-ad6e-11f23da385b1") + ) + (wire + (pts + (xy 255.27 234.95) (xy 255.27 240.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "74b85a5b-9836-41c8-bec2-05d914a1da25") + ) + (wire + (pts + (xy 186.69 146.05) (xy 181.61 146.05) + ) + (stroke + (width 0) + (type default) + ) + (uuid "760dd05e-8249-468a-b0ce-76298eedde2f") + ) + (wire + (pts + (xy 222.25 38.1) (xy 240.03 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "77be84cf-8dee-4423-9913-601580ac8868") + ) + (wire + (pts + (xy 148.59 124.46) (xy 144.78 124.46) + ) + (stroke + (width 0) + (type default) + ) + (uuid "77f27753-6c29-4031-9cf2-0d8e879e91eb") + ) + (wire + (pts + (xy 152.4 219.71) (xy 156.21 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7a18330d-7042-4de3-97cc-fd7bbf450d0a") + ) + (polyline + (pts + (xy 270.51 144.78) (xy 270.51 149.86) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "7a340735-7715-4049-b217-8ddb88bcc9a8") + ) + (wire + (pts + (xy 85.09 255.27) (xy 85.09 260.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7aa07c61-c7ea-4935-afac-7a5e264da730") + ) + (wire + (pts + (xy 195.58 261.62) (xy 198.12 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7aee4ed5-62d3-416b-afd9-9779610e9d75") + ) + (wire + (pts + (xy 168.91 54.61) (xy 187.96 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7b5e85be-f9c3-4ad2-a429-3ddb28c62c74") + ) + (wire + (pts + (xy 205.74 219.71) (xy 210.82 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7b63f312-2ca3-4da4-baec-82e68325654e") + ) + (wire + (pts + (xy 111.76 38.1) (xy 111.76 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7be9a385-6d87-4e59-9cf9-3c3ba4847d77") + ) + (wire + (pts + (xy 248.92 154.94) (xy 254 154.94) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7c1f1e2a-bd9a-457f-a8fd-646a00fd729e") + ) + (wire + (pts + (xy 87.63 168.91) (xy 88.9 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7ce37ca5-61f0-4d84-b51f-2646990625be") + ) + (wire + (pts + (xy 52.07 53.34) (xy 52.07 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7d6abde1-8e94-47fa-8b76-29e1f46621c1") + ) + (wire + (pts + (xy 107.95 233.68) (xy 107.95 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7d7d3c6b-5d0f-4348-80fe-4acbefef3267") + ) + (wire + (pts + (xy 205.74 212.09) (xy 205.74 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e1df757-2b2c-4471-8e23-59d0c51be741") + ) + (wire + (pts + (xy 142.24 48.26) (xy 161.29 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e493264-5f51-4497-9d27-78a0a82dc2db") + ) + (wire + (pts + (xy 66.04 58.42) (xy 66.04 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e694a8c-ec2a-471e-912e-be0e7652f725") + ) + (wire + (pts + (xy 144.78 127) (xy 148.59 127) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e6cf409-629f-4ca6-9dbe-00111f3b6a46") + ) + (wire + (pts + (xy 185.42 209.55) (xy 185.42 212.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e7b573d-8d8f-40b6-bb0f-19937d1d17af") + ) + (wire + (pts + (xy 196.85 38.1) (xy 196.85 44.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7e8ec979-901c-4865-bbe6-06156f4541ca") + ) + (wire + (pts + (xy 30.48 129.54) (xy 88.9 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f5375a6-f754-4b79-bd26-270a3853db80") + ) + (wire + (pts + (xy 40.64 236.22) (xy 45.72 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7f9a3a66-fcb9-40e2-8b87-126d66639414") + ) + (wire + (pts + (xy 69.85 104.14) (xy 88.9 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "7fb291aa-ee28-401e-b8ea-51c58a157c39") + ) + (polyline + (pts + (xy 266.7 185.42) (xy 278.13 185.42) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "7fea7893-ca08-41eb-be59-6730c88f4fe6") + ) + (wire + (pts + (xy 66.04 52.07) (xy 69.85 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "80de50ed-e9a8-4946-92be-4e6396998341") + ) + (wire + (pts + (xy 199.39 109.22) (xy 200.66 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8163d202-590d-447c-bc38-4d70b89b99ea") + ) + (wire + (pts + (xy 151.13 163.83) (xy 144.78 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "82ea01ab-3492-4cc0-b438-0d3ff91376d2") + ) + (wire + (pts + (xy 153.67 193.04) (xy 156.21 193.04) + ) + (stroke + (width 0) + (type default) + ) + (uuid "835721e1-7cc5-4111-8153-c4d8f1c19a5d") + ) + (wire + (pts + (xy 87.63 175.26) (xy 87.63 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "83706097-2efe-401b-be3f-d41873a74297") + ) + (wire + (pts + (xy 77.47 157.48) (xy 77.47 153.67) + ) + (stroke + (width 0) + (type default) + ) + (uuid "84c12225-05e0-4c9d-b036-2f528646f797") + ) + (wire + (pts + (xy 147.32 158.75) (xy 147.32 152.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "857a9baa-b000-47f7-8052-863745a27996") + ) + (polyline + (pts + (xy 266.7 149.86) (xy 270.51 149.86) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "85a65eb3-c664-4281-a880-c09a32c03cc7") + ) + (wire + (pts + (xy 200.66 172.72) (xy 200.66 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "85cef97e-0ad8-4f59-b1f6-db5809f7b0be") + ) + (wire + (pts + (xy 181.61 189.23) (xy 181.61 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8664c82f-057e-4e43-879f-79eeea1ba9b3") + ) + (wire + (pts + (xy 86.36 172.72) (xy 86.36 166.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "86c0d231-5a21-49df-943c-6682418cc1f2") + ) + (wire + (pts + (xy 82.55 57.15) (xy 77.47 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8756834d-9bfe-46e7-a61e-18ec1cd04307") + ) + (wire + (pts + (xy 107.95 236.22) (xy 107.95 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "87a191db-9b28-4ffd-a4f7-ef076e8603b3") + ) + (wire + (pts + (xy 179.07 219.71) (xy 182.88 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "87d164fe-0515-4dba-8607-600875251a07") + ) + (wire + (pts + (xy 250.19 187.96) (xy 260.35 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8862beee-97b3-4a41-a17c-350b38cb45dc") + ) + (wire + (pts + (xy 60.96 194.31) (xy 60.96 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "888d9583-60f1-4408-b377-50f484a8a772") + ) + (wire + (pts + (xy 88.9 96.52) (xy 52.07 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "888fa776-cd45-486e-9148-a0ad9f49b868") + ) + (wire + (pts + (xy 180.34 135.89) (xy 186.69 135.89) + ) + (stroke + (width 0) + (type default) + ) + (uuid "88e4640e-6931-43d1-887c-5ceac27776b7") + ) + (wire + (pts + (xy 199.39 59.69) (xy 203.2 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8bea8884-2cea-4378-aab0-964a4f4c4936") + ) + (wire + (pts + (xy 147.32 40.64) (xy 171.45 40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c1b2779-34b6-4f60-bbc5-f03dd70d91f0") + ) + (wire + (pts + (xy 234.95 125.73) (xy 238.76 125.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8c57e276-66bb-4485-b345-34e868824cc9") + ) + (wire + (pts + (xy 60.96 161.29) (xy 60.96 173.99) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8cb96930-55c3-46d4-90bf-e25b1ac4f441") + ) + (wire + (pts + (xy 185.42 186.69) (xy 195.58 186.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8cc0a648-02ca-46e0-a893-06a261a153b0") + ) + (wire + (pts + (xy 259.08 237.49) (xy 259.08 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8cf1f8f2-dfaa-4f0b-a70b-2b6bcbdee1e5") + ) + (wire + (pts + (xy 165.1 48.26) (xy 165.1 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8e2984f3-229e-49af-b4c2-8c9510e24cc0") + ) + (wire + (pts + (xy 186.69 151.13) (xy 163.83 151.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8f2f2e65-f62f-4ec8-847d-a9a27a37358a") + ) + (wire + (pts + (xy 144.78 119.38) (xy 148.59 119.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "8f78d680-8469-418f-92e9-5b55ff79f6a6") + ) + (wire + (pts + (xy 31.75 194.31) (xy 31.75 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9001738e-1089-411d-a833-3d8de682b579") + ) + (wire + (pts + (xy 199.39 151.13) (xy 201.93 151.13) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9157be7e-a295-4431-bd8d-bbc9944461f1") + ) + (wire + (pts + (xy 151.13 156.21) (xy 151.13 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "92ab5b39-bfc4-4b9b-8214-6a0c03942136") + ) + (wire + (pts + (xy 154.94 152.4) (xy 157.48 152.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "93dbb355-c296-4ffd-bed4-a7fba49f432e") + ) + (wire + (pts + (xy 185.42 172.72) (xy 186.69 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9515dfa9-2ffe-4aa1-b38c-712b768fa0b9") + ) + (wire + (pts + (xy 69.85 114.3) (xy 69.85 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "95d89b95-900d-49b6-87a3-34ee295eb4a0") + ) + (wire + (pts + (xy 58.42 166.37) (xy 58.42 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "974c41af-41f3-453a-a838-6e0349b6a087") + ) + (wire + (pts + (xy 165.1 223.52) (xy 165.1 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "97666b57-a187-4e49-a779-4368e0ec14bf") + ) + (wire + (pts + (xy 199.39 38.1) (xy 196.85 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "99c2ac5f-dbec-4c06-86b1-53fbbf1eece8") + ) + (wire + (pts + (xy 200.66 226.06) (xy 200.66 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9a81d6ea-704e-45e2-8fb2-e36857315adf") + ) + (polyline + (pts + (xy 264.16 152.4) (xy 255.27 152.4) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "9a888ccc-3971-49cc-98ad-190be444fb88") + ) + (wire + (pts + (xy 236.22 231.14) (xy 236.22 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9aecc728-4149-4481-a603-d81ee0192381") + ) + (wire + (pts + (xy 179.07 191.77) (xy 195.58 191.77) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9bff4de9-8950-4cfb-ac23-a51a260f5f19") + ) + (wire + (pts + (xy 173.99 114.3) (xy 186.69 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9e5a39df-cd4c-4be3-ae4f-1711f89b0134") + ) + (polyline + (pts + (xy 262.89 157.48) (xy 264.16 157.48) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "9f52354a-f8c7-4264-a094-56e152be463d") + ) + (wire + (pts + (xy 185.42 177.8) (xy 198.12 177.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f5e22b0-38e1-461c-81a3-2a7cbf2f2583") + ) + (wire + (pts + (xy 41.91 161.29) (xy 38.1 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9ffb500a-8ad6-4cdd-9f31-4966bfcd7d29") + ) + (wire + (pts + (xy 144.78 114.3) (xy 148.59 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a00eeb5c-b7bd-428e-8ace-6a7eab8019db") + ) + (wire + (pts + (xy 74.93 241.3) (xy 85.09 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a0c77741-4d89-4451-9aaa-96baa9c94baa") + ) + (wire + (pts + (xy 41.91 228.6) (xy 50.8 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a0d93971-8160-496e-8401-80fc87a3f44a") + ) + (wire + (pts + (xy 45.72 220.98) (xy 50.8 220.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a2d2722e-c8ed-438d-826b-cba1fe3da80e") + ) + (wire + (pts + (xy 77.47 172.72) (xy 86.36 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a2f1c920-e02a-4da0-abf7-a28304dee2e8") + ) + (wire + (pts + (xy 162.56 101.6) (xy 162.56 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a3310236-251e-465f-a05b-b0bdc78dd2ea") + ) + (wire + (pts + (xy 144.78 158.75) (xy 147.32 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a46f00ab-ddba-4d20-b260-4b98f48e144f") + ) + (wire + (pts + (xy 322.58 49.53) (xy 322.58 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a4c69fff-1b9c-486f-a14a-c1b79f13cc24") + ) + (polyline + (pts + (xy 284.48 90.17) (xy 284.48 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a5590d02-6c2d-4622-80b3-919b9b5b779c") + ) + (wire + (pts + (xy 128.27 46.99) (xy 128.27 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a6bcbdb8-0b38-41e0-a8be-99402c7fcc82") + ) + (wire + (pts + (xy 40.64 104.14) (xy 57.15 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a6dd8b1e-c8d8-4e79-a996-d2c5efa190e6") + ) + (wire + (pts + (xy 201.93 133.35) (xy 199.39 133.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a7c7c71e-7809-4756-a87b-2cb182675b43") + ) + (wire + (pts + (xy 180.34 133.35) (xy 186.69 133.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a8065147-90e2-494c-906f-8e24c33768f2") + ) + (wire + (pts + (xy 185.42 173.99) (xy 185.42 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a8b7d69a-d201-4b4b-bcf1-a4db958046ec") + ) + (wire + (pts + (xy 205.74 209.55) (xy 208.28 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a98ca0c6-1a7c-410b-a19f-26b7482d0283") + ) + (wire + (pts + (xy 71.12 219.71) (xy 74.93 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a9d2c626-976e-4757-936e-fd156b1297de") + ) + (wire + (pts + (xy 264.16 59.69) (xy 269.24 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a9ea7988-4251-418a-8742-d45f4fa56fb3") + ) + (wire + (pts + (xy 144.78 151.13) (xy 144.78 156.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ab6d03c6-844a-45bd-bfe7-f618085a2d76") + ) + (wire + (pts + (xy 71.12 218.44) (xy 71.12 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "abc33da6-462b-4aa6-88a3-8e751adc485a") + ) + (wire + (pts + (xy 157.48 168.91) (xy 157.48 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ac79e835-1662-451d-82bb-403f678e2905") + ) + (wire + (pts + (xy 107.95 53.34) (xy 102.87 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ad26c99c-f6cd-49c9-8d26-0e550bae57a5") + ) + (wire + (pts + (xy 107.95 236.22) (xy 110.49 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "adadf770-146f-41c8-b585-810e2e8ddc9f") + ) + (wire + (pts + (xy 187.96 54.61) (xy 187.96 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ae410aa2-b7cc-4309-8636-b366da7e3139") + ) + (wire + (pts + (xy 147.32 152.4) (xy 154.94 152.4) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ae83c7f9-a8b8-40a0-ae4f-18f8d4436093") + ) + (wire + (pts + (xy 236.22 223.52) (xy 243.84 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "aebe8145-8a71-4b1f-aa5c-a61556097e43") + ) + (wire + (pts + (xy 128.27 38.1) (xy 137.16 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "afb1d891-420a-461d-a371-420cd63ccf54") + ) + (wire + (pts + (xy 38.1 151.13) (xy 38.1 144.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b010b8a2-40c1-465d-8bf7-826f8f52f88b") + ) + (wire + (pts + (xy 54.61 147.32) (xy 88.9 147.32) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0715963-8a6e-466a-9f03-9f44cb2af62d") + ) + (wire + (pts + (xy 157.48 170.18) (xy 147.32 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0b06bde-6a3a-48cf-9c33-da49ac74e87e") + ) + (wire + (pts + (xy 152.4 209.55) (xy 152.4 212.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b0b3dac8-0381-4ee8-a4ea-f6a2b01cda89") + ) + (wire + (pts + (xy 105.41 255.27) (xy 105.41 260.35) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b12a4742-a3c0-4c55-a483-75aa983add84") + ) + (wire + (pts + (xy 181.61 170.18) (xy 186.69 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b240afad-d25a-40f8-bc41-5906035d8140") + ) + (wire + (pts + (xy 31.75 198.12) (xy 41.91 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b2a5e714-7d8b-47de-aa21-e93b6cc8dff9") + ) + (wire + (pts + (xy 154.94 38.1) (xy 160.02 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b30a6ae9-32d9-4705-afd2-a8064c8e5712") + ) + (wire + (pts + (xy 105.41 236.22) (xy 107.95 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b3420363-2487-4b21-8b03-3e1d7f7368e3") + ) + (wire + (pts + (xy 248.92 162.56) (xy 256.54 162.56) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b3b217ae-eee5-48de-8a7a-e1616074efe6") + ) + (wire + (pts + (xy 167.64 248.92) (xy 165.1 248.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b3c1de85-96c3-45a9-bceb-a0421532363f") + ) + (wire + (pts + (xy 181.61 172.72) (xy 185.42 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b4a39198-7554-400a-aa7a-4ac4b4bbb1f7") + ) + (wire + (pts + (xy 165.1 104.14) (xy 163.83 104.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b513c443-7a4a-4379-b88f-980eb8d72b95") + ) + (polyline + (pts + (xy 278.13 144.78) (xy 278.13 185.42) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "b75cc67f-fc28-48d8-960e-48fbb1c6a830") + ) + (wire + (pts + (xy 80.01 157.48) (xy 82.55 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b760140a-40fb-436d-8e92-036fb269fb28") + ) + (wire + (pts + (xy 137.16 38.1) (xy 137.16 40.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b7d15cb9-7606-4955-b1d0-8b93008e7a88") + ) + (wire + (pts + (xy 210.82 254) (xy 210.82 256.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b7f6d048-50da-476d-be11-f66bf7f86836") + ) + (wire + (pts + (xy 77.47 52.07) (xy 82.55 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b81e8c50-881e-4147-a4f5-c0a3e81435e2") + ) + (wire + (pts + (xy 200.66 109.22) (xy 203.2 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b85327a5-cb97-4884-b8ea-e360ca666095") + ) + (wire + (pts + (xy 228.6 67.31) (xy 240.03 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b86e9b24-5028-4164-9a0e-23aeafe360f7") + ) + (wire + (pts + (xy 163.83 151.13) (xy 163.83 139.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b87255e6-e1f8-4054-b2cd-5642022adc29") + ) + (wire + (pts + (xy 255.27 234.95) (xy 264.16 234.95) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b97c032e-cb9c-45f8-a2c9-7a73138b1443") + ) + (wire + (pts + (xy 33.02 99.06) (xy 88.9 99.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b9abb689-d043-4227-ac1b-e1a5c1956bda") + ) + (wire + (pts + (xy 43.18 109.22) (xy 40.64 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b9ffa115-4ef8-495a-b06c-3b7481777582") + ) + (wire + (pts + (xy 181.61 167.64) (xy 186.69 167.64) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ba1e6780-8186-48a0-858f-8e6a53d98545") + ) + (wire + (pts + (xy 147.32 166.37) (xy 144.78 166.37) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bb66854f-690a-4d7a-841c-ed645f8e312b") + ) + (wire + (pts + (xy 43.18 111.76) (xy 39.37 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bbada028-b85e-471b-9925-c86e820934b0") + ) + (wire + (pts + (xy 63.5 220.98) (xy 63.5 233.68) + ) + (stroke + (width 0) + (type default) + ) + (uuid "be10f429-8bc5-4644-becd-d72598c0fbe7") + ) + (wire + (pts + (xy 176.53 116.84) (xy 186.69 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "bece3c0b-875f-4431-8aca-a4f022f80adb") + ) + (wire + (pts + (xy 144.78 149.86) (xy 148.59 149.86) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c006bc85-93e3-49a5-aa12-43c5539a93a2") + ) + (wire + (pts + (xy 46.99 59.69) (xy 115.57 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c0111be7-0663-4bd8-bfba-e53a2ef87826") + ) + (wire + (pts + (xy 212.09 212.09) (xy 212.09 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c023f1ec-667b-4ec7-a7ef-ef946aa0b0f9") + ) + (polyline + (pts + (xy 262.89 160.02) (xy 266.7 160.02) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "c03ebb0b-bec3-49c8-a5bc-2186afbd5627") + ) + (wire + (pts + (xy 153.67 85.09) (xy 158.75 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c0c42b47-0c2e-43fe-a9c1-1cce661dace6") + ) + (wire + (pts + (xy 107.95 238.76) (xy 105.41 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c11e15e2-f868-439c-9f4a-819b6ab791aa") + ) + (wire + (pts + (xy 161.29 52.07) (xy 161.29 58.42) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c1c767c9-630a-4b59-84f5-dc29be0e95ac") + ) + (wire + (pts + (xy 224.79 240.03) (xy 236.22 240.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c21d93f2-5e60-4f8c-bca3-505d0a0bce10") + ) + (wire + (pts + (xy 39.37 110.49) (xy 57.15 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c2481962-7067-4e1d-a61d-39b90d4a1b50") + ) + (wire + (pts + (xy 154.94 156.21) (xy 151.13 156.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c26c4fd0-3025-4e07-9b5c-5cc9dab351b1") + ) + (wire + (pts + (xy 40.64 243.84) (xy 45.72 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c2af10db-959c-4475-a0c6-f2bb08a7ae8c") + ) + (wire + (pts + (xy 158.75 212.09) (xy 158.75 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c2fdd888-5511-4ecb-9d53-676fc0fa35a3") + ) + (wire + (pts + (xy 175.26 182.88) (xy 175.26 181.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c319eccd-4ed6-4bf1-b91a-6ffdb9f1eb1c") + ) + (wire + (pts + (xy 198.12 177.8) (xy 200.66 177.8) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c4395837-ea32-409d-ba68-1eccd480f3b0") + ) + (wire + (pts + (xy 88.9 93.98) (xy 54.61 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c43b7733-f23d-4cee-a740-9224e08e1368") + ) + (wire + (pts + (xy 43.18 116.84) (xy 34.29 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c527c4a5-8fc5-402f-b721-7cd3b223f277") + ) + (wire + (pts + (xy 172.72 182.88) (xy 175.26 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c621ee91-8e5d-449f-a2af-c3816ff715c9") + ) + (wire + (pts + (xy 144.78 91.44) (xy 148.59 91.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c64a7bc2-2d39-4c87-b690-fb3230031e88") + ) + (wire + (pts + (xy 138.43 54.61) (xy 140.97 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c7209fe3-7090-4c5e-a8ad-d4049698a811") + ) + (wire + (pts + (xy 158.75 93.98) (xy 144.78 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c930fce5-c9ca-4965-bedf-87b8834986c1") + ) + (wire + (pts + (xy 82.55 38.1) (xy 82.55 41.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ca448719-f6bc-46e7-9dce-ef0821bfd316") + ) + (wire + (pts + (xy 255.27 223.52) (xy 251.46 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ca83c553-d1d5-43cd-ba1d-f5d312f3a887") + ) + (wire + (pts + (xy 144.78 101.6) (xy 148.59 101.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cb664e81-ae70-4cd0-b73c-e96a444c4d92") + ) + (wire + (pts + (xy 80.01 109.22) (xy 88.9 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cb7276d2-45f2-4a12-9114-7d7703613fa5") + ) + (wire + (pts + (xy 234.95 128.27) (xy 238.76 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cbb2967d-025a-400a-86ab-8f68f85080dc") + ) + (wire + (pts + (xy 264.16 38.1) (xy 269.24 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cd4741b1-1246-4186-84bf-b3d7eec70044") + ) + (wire + (pts + (xy 82.55 231.14) (xy 82.55 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cd9acfff-42d4-4572-9648-85805eb343de") + ) + (wire + (pts + (xy 200.66 170.18) (xy 199.39 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ce8f2d05-871a-44f1-9fba-772e3e1da305") + ) + (wire + (pts + (xy 165.1 248.92) (xy 165.1 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cef48c9b-cec3-4069-854e-8df74b3754d1") + ) + (wire + (pts + (xy 45.72 243.84) (xy 50.8 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "cfa078d9-1d7d-4a51-ab42-d3e1b1eb03b1") + ) + (wire + (pts + (xy 171.45 40.64) (xy 171.45 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d094f008-6269-4c5f-ac54-cfc5babe2a6e") + ) + (wire + (pts + (xy 144.78 116.84) (xy 148.59 116.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d0ae21e1-7e47-4d46-af36-3884f2b8ac0a") + ) + (wire + (pts + (xy 153.67 190.5) (xy 156.21 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d10eba1c-929a-4705-9321-9e60301c649a") + ) + (wire + (pts + (xy 134.62 190.5) (xy 140.97 190.5) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d1292528-f9c8-4977-83bc-de54b26b4c23") + ) + (wire + (pts + (xy 170.18 38.1) (xy 171.45 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d1d1c518-1329-4962-8f19-04ccce2926fb") + ) + (wire + (pts + (xy 154.94 168.91) (xy 151.13 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d1f5c845-642b-4b92-a916-5dbba0c77faa") + ) + (wire + (pts + (xy 134.62 187.96) (xy 140.97 187.96) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d20d12e8-468d-4370-94b5-e72dd724d353") + ) + (wire + (pts + (xy 85.09 243.84) (xy 85.09 247.65) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d2bc2f9b-f653-4616-9199-0cf40983ed3b") + ) + (wire + (pts + (xy 255.27 59.69) (xy 264.16 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d5f1bd3b-5f57-46c3-8a9a-034ff6ac13ee") + ) + (wire + (pts + (xy 85.09 218.44) (xy 71.12 218.44) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d65f7b78-158c-45c9-8ca3-7e07b30348f1") + ) + (polyline + (pts + (xy 220.98 90.17) (xy 220.98 204.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d6b9dc5a-ca89-45b8-b1b1-f7f30a78428f") + ) + (wire + (pts + (xy 156.21 209.55) (xy 152.4 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d7a0bdda-6131-4549-92a3-456806b32074") + ) + (wire + (pts + (xy 50.8 236.22) (xy 85.09 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d7b7ef5b-d173-4766-8654-feaed3c189da") + ) + (wire + (pts + (xy 58.42 161.29) (xy 60.96 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d7e6f093-67a1-47b6-9dea-0e08b05c7aa9") + ) + (wire + (pts + (xy 214.63 96.52) (xy 144.78 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d7f6e0a1-d880-4018-b88c-d3ac9151aaea") + ) + (wire + (pts + (xy 58.42 161.29) (xy 58.42 163.83) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d8657b4d-d38f-4099-a3a8-6bdb4167f476") + ) + (wire + (pts + (xy 144.78 171.45) (xy 144.78 168.91) + ) + (stroke + (width 0) + (type default) + ) + (uuid "d9528f96-db58-4719-81d1-d0377f9e62d2") + ) + (wire + (pts + (xy 193.04 38.1) (xy 194.31 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "da42bb1a-aa6c-40ca-b9b5-e94297744e16") + ) + (wire + (pts + (xy 105.41 231.14) (xy 115.57 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "da7a8042-ff3f-400e-a1ee-9ddcaefd7453") + ) + (wire + (pts + (xy 77.47 170.18) (xy 77.47 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "da923787-c55d-4bd5-a99e-749be4c49ccd") + ) + (wire + (pts + (xy 85.09 161.29) (xy 88.9 161.29) + ) + (stroke + (width 0) + (type default) + ) + (uuid "daad7cae-b397-4efc-bf24-63de76231c9e") + ) + (wire + (pts + (xy 88.9 168.91) (xy 88.9 171.45) + ) + (stroke + (width 0) + (type default) + ) + (uuid "db3375ff-8cd0-48ca-9ab6-058a4f5034af") + ) + (wire + (pts + (xy 115.57 228.6) (xy 105.41 228.6) + ) + (stroke + (width 0) + (type default) + ) + (uuid "db700962-831d-421f-8216-9145e761d7fa") + ) + (wire + (pts + (xy 168.91 52.07) (xy 168.91 54.61) + ) + (stroke + (width 0) + (type default) + ) + (uuid "db7d9c4c-60a2-41f5-bd70-0e77eade3a12") + ) + (wire + (pts + (xy 180.34 246.38) (xy 185.42 246.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dbb05916-df40-4e3c-af40-f0b2791547d2") + ) + (wire + (pts + (xy 195.58 209.55) (xy 195.58 226.06) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dbdd5eff-3152-461b-baae-dc008b11e949") + ) + (wire + (pts + (xy 200.66 128.27) (xy 199.39 128.27) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dc0dc459-c109-43fc-adf2-35672f7db528") + ) + (wire + (pts + (xy 177.8 238.76) (xy 180.34 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dd54225c-5a93-4ab2-952a-3d590d91a55f") + ) + (wire + (pts + (xy 161.29 48.26) (xy 161.29 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ddf299ec-49e2-4384-af0c-2617298f4172") + ) + (wire + (pts + (xy 356.87 62.23) (xy 359.41 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "de026ed2-780e-481b-bd93-d226a17e4d78") + ) + (wire + (pts + (xy 210.82 67.31) (xy 222.25 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "de222f6d-0fc0-4376-9d9d-d783a879d81c") + ) + (wire + (pts + (xy 234.95 123.19) (xy 238.76 123.19) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dfbbc5f8-8852-416a-b1bb-df79b4892cc8") + ) + (polyline + (pts + (xy 266.7 160.02) (xy 266.7 149.86) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "e0054c13-3ee2-4fbf-9c41-8a5fea8c8a22") + ) + (wire + (pts + (xy 168.91 170.18) (xy 173.99 170.18) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e0065482-2f30-4538-8d5c-f8d77e25fb5a") + ) + (wire + (pts + (xy 148.59 137.16) (xy 144.78 137.16) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e01799c8-7a57-4ca1-b688-6362aa863053") + ) + (wire + (pts + (xy 218.44 59.69) (xy 218.44 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e059b21b-93c9-4056-ba41-92d5644dda9f") + ) + (wire + (pts + (xy 214.63 138.43) (xy 214.63 96.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e0a81f7d-8e3c-45a6-857b-aa01390a37ae") + ) + (wire + (pts + (xy 185.42 238.76) (xy 180.34 238.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e0aabb94-20f2-4139-9c34-983635b23473") + ) + (wire + (pts + (xy 200.66 109.22) (xy 200.66 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e206dbfd-711b-4b97-9b45-f7addb33baea") + ) + (wire + (pts + (xy 72.39 227.33) (xy 74.93 227.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e26e188c-6355-46e8-8dd4-383ef741acd4") + ) + (wire + (pts + (xy 327.66 33.02) (xy 331.47 33.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e29977be-577c-4bf9-8de1-223ea61a431a") + ) + (wire + (pts + (xy 144.78 129.54) (xy 152.4 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3708d7b-32a8-447e-867f-52c19c081aca") + ) + (wire + (pts + (xy 222.25 67.31) (xy 228.6 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3a47d11-9c10-496e-a3b7-7dc118c8548e") + ) + (wire + (pts + (xy 210.82 45.72) (xy 222.25 45.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3a81afe-567e-4786-a1d6-7b4abae2be81") + ) + (wire + (pts + (xy 165.1 223.52) (xy 200.66 223.52) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e3af10fd-979b-45f6-98eb-b99fff59bfaf") + ) + (wire + (pts + (xy 240.03 38.1) (xy 250.19 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e5924541-6a75-4152-bc72-6b5c73164481") + ) + (wire + (pts + (xy 158.75 209.55) (xy 156.21 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e60bfa00-2a69-4967-aabc-14e7a28932c6") + ) + (wire + (pts + (xy 68.58 227.33) (xy 72.39 227.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e65e0a6f-1083-4a0e-8ceb-f71bb9dab6bd") + ) + (wire + (pts + (xy 356.87 57.15) (xy 356.87 62.23) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e688566d-71b3-4b3e-9120-e2b42367bb32") + ) + (wire + (pts + (xy 88.9 91.44) (xy 88.9 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e6a098cf-060d-4069-a7c4-992d3853a843") + ) + (wire + (pts + (xy 199.39 172.72) (xy 200.66 172.72) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e6df9dd1-512b-4797-9ca2-512245950dbf") + ) + (wire + (pts + (xy 161.29 52.07) (xy 162.56 52.07) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e6eeba12-a2aa-4565-bc15-18c403fcec27") + ) + (wire + (pts + (xy 240.03 59.69) (xy 247.65 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e7f93f18-7a0c-47a6-8391-7dc5e7806892") + ) + (wire + (pts + (xy 187.96 38.1) (xy 193.04 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e82b0e8a-15c7-4c31-a744-6945b295a208") + ) + (wire + (pts + (xy 115.57 67.31) (xy 124.46 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e9198b00-5e10-4ed5-b04c-67867d01bf88") + ) + (wire + (pts + (xy 39.37 111.76) (xy 39.37 110.49) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e93a6c5a-f188-4180-81d0-6df756066924") + ) + (wire + (pts + (xy 198.12 259.08) (xy 198.12 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "e98c2ab0-95e1-4a61-be5c-7b30dcc10efa") + ) + (wire + (pts + (xy 186.69 138.43) (xy 166.37 138.43) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ea11cd07-11a8-4693-a7a2-208cbee4e4c4") + ) + (wire + (pts + (xy 74.93 247.65) (xy 74.93 241.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eb915737-c0b8-42d7-b77c-c6a830c1be58") + ) + (wire + (pts + (xy 218.44 59.69) (xy 222.25 59.69) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ebaf72e5-9309-4f4f-9263-54005cb1de9a") + ) + (wire + (pts + (xy 254 160.02) (xy 256.54 160.02) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ebc0cbd1-2145-46b1-a5d1-9ce33dff5512") + ) + (wire + (pts + (xy 161.29 67.31) (xy 193.04 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eca89e5b-8e66-4d09-8de3-fd966549c187") + ) + (wire + (pts + (xy 210.82 67.31) (xy 196.85 67.31) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ece426e4-f10e-4207-a72c-07cd1c007a32") + ) + (wire + (pts + (xy 182.88 219.71) (xy 185.42 219.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ece722f8-60a7-45a9-aeef-8d3cd3557ecd") + ) + (wire + (pts + (xy 57.15 142.24) (xy 88.9 142.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ed0780da-3075-43b3-9fc9-1dfb374393ec") + ) + (wire + (pts + (xy 35.56 153.67) (xy 35.56 139.7) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ed4150c3-7207-4b10-98bf-caf5cf0963b6") + ) + (wire + (pts + (xy 248.92 157.48) (xy 256.54 157.48) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ed62d215-dba6-4952-ada0-43d7d0ad7b72") + ) + (polyline + (pts + (xy 255.27 144.78) (xy 255.27 152.4) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "edf07619-7c66-4738-b037-62402bf3b03f") + ) + (wire + (pts + (xy 144.78 144.78) (xy 148.59 144.78) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee1aa644-df60-4504-b225-1a327909bc7f") + ) + (wire + (pts + (xy 158.75 93.98) (xy 158.75 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee630879-03e1-4936-a70c-25dca04a7d1a") + ) + (wire + (pts + (xy 176.53 236.22) (xy 185.42 236.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ee8254a5-e9dc-417b-b627-55090056e03b") + ) + (wire + (pts + (xy 43.18 114.3) (xy 33.02 114.3) + ) + (stroke + (width 0) + (type default) + ) + (uuid "eec094e2-d102-4da0-bfdb-7c9bdc8546c2") + ) + (polyline + (pts + (xy 265.43 151.13) (xy 262.89 151.13) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "f0f97499-9068-4b40-827c-16c15819579b") + ) + (wire + (pts + (xy 199.39 129.54) (xy 199.39 130.81) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f162bfbd-4c4d-4aba-adbb-e98eb7be3bde") + ) + (wire + (pts + (xy 82.55 231.14) (xy 85.09 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f1841bf4-a60d-434d-8ade-ed01238bd843") + ) + (wire + (pts + (xy 185.42 128.27) (xy 185.42 125.73) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f1c70ef0-863a-495d-9310-0bfa349b9629") + ) + (wire + (pts + (xy 54.61 53.34) (xy 54.61 93.98) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f1c9f039-a115-4ab1-8c72-4ec8ed72eff4") + ) + (wire + (pts + (xy 54.61 156.21) (xy 64.77 156.21) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f2e63331-1280-44e3-bb7e-03c0d3e0074e") + ) + (wire + (pts + (xy 111.76 53.34) (xy 107.95 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f314016b-568f-4920-81d1-a0381bc52cb3") + ) + (wire + (pts + (xy 33.02 156.21) (xy 33.02 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f480829f-dd63-4340-8288-f8d1e5dc11f5") + ) + (wire + (pts + (xy 115.57 232.41) (xy 115.57 231.14) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f4a05251-9f4d-46cd-ba63-459f7512eb14") + ) + (polyline + (pts + (xy 270.51 144.78) (xy 276.86 144.78) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "f522c829-5ede-4f06-a26b-e72662bd5bfd") + ) + (wire + (pts + (xy 82.55 53.34) (xy 82.55 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f7329c1b-b254-42ad-a487-ffaa5d22374e") + ) + (wire + (pts + (xy 180.34 243.84) (xy 185.42 243.84) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f787b8a1-fa38-470f-a280-43ba7901b1cf") + ) + (wire + (pts + (xy 57.15 153.67) (xy 57.15 142.24) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f7fd1a61-d83b-4200-b91a-b5d6a376a6a7") + ) + (wire + (pts + (xy 29.21 38.1) (xy 34.29 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f829fea3-a80e-42f5-a15e-15bfd1c6b362") + ) + (wire + (pts + (xy 236.22 240.03) (xy 243.84 240.03) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f87440b1-7f34-4b16-a0e5-74ffe44a41ab") + ) + (wire + (pts + (xy 80.01 111.76) (xy 88.9 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f895d59a-ce83-4d9d-aab5-1498e3ffb7c1") + ) + (wire + (pts + (xy 231.14 232.41) (xy 236.22 232.41) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f8aef85f-4aae-4afa-84db-ebef648d8536") + ) + (wire + (pts + (xy 199.39 261.62) (xy 200.66 261.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f9a7ee76-6415-4abf-ac9d-eb15e4e41d16") + ) + (polyline + (pts + (xy 266.7 182.88) (xy 276.86 182.88) + ) + (stroke + (width 0) + (type dash) + ) + (uuid "fa8beb94-2a65-4465-a00a-e8d2ac5b64f2") + ) + (wire + (pts + (xy 260.35 180.34) (xy 260.35 182.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fb893f3f-a160-40ae-afcf-e60d434b11e6") + ) + (wire + (pts + (xy 102.87 45.72) (xy 102.87 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fba8f82c-753f-487c-ade0-22ca61c1e1ab") + ) + (wire + (pts + (xy 179.07 212.09) (xy 179.07 209.55) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fbf28f72-2889-4542-94b1-af9198e08c1f") + ) + (wire + (pts + (xy 45.72 198.12) (xy 60.96 198.12) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fc2c9e24-27c7-4f75-997e-10fdeb3e7510") + ) + (wire + (pts + (xy 82.55 52.07) (xy 82.55 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fc69494b-8d41-4ce2-8f1a-5efc7a940e25") + ) + (wire + (pts + (xy 218.44 38.1) (xy 222.25 38.1) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fc78ba7d-d126-4756-ad49-6c6eaaa98a37") + ) + (wire + (pts + (xy 175.26 248.92) (xy 185.42 248.92) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fca85c6f-5724-4ae3-bb56-c8952b9f4476") + ) + (wire + (pts + (xy 359.41 57.15) (xy 356.87 57.15) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fd120123-b8cc-4030-af80-ac85b36e4fa8") + ) + (wire + (pts + (xy 57.15 104.14) (xy 57.15 109.22) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fe016a68-e3f9-4939-8810-92fcda37d020") + ) + (wire + (pts + (xy 81.28 119.38) (xy 88.9 119.38) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fe26b54f-08e0-48af-9f5c-db0e7740283c") + ) + (wire + (pts + (xy 124.46 48.26) (xy 128.27 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "fef8e1b3-00a9-429c-b17a-176ea5a91d66") + ) + (wire + (pts + (xy 203.2 59.69) (xy 203.2 77.47) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff12f196-334d-4890-b63a-d768778b4e4a") + ) + (wire + (pts + (xy 144.78 111.76) (xy 162.56 111.76) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff2e2c7d-5640-4287-bdbf-b3f0f4188b5f") + ) + (wire + (pts + (xy 54.61 158.75) (xy 68.58 158.75) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff33b7e6-b567-4211-a6d5-f06be0bf4b37") + ) + (wire + (pts + (xy 66.04 52.07) (xy 66.04 48.26) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ff5eb73e-ca46-42e0-bead-96a9d100f069") + ) + (circle + (center 277.495 154.94) + (radius 2.54) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + (uuid 0e99c89a-41cf-4276-bf71-bed42eb1d92a) + ) + (circle + (center 265.43 154.94) + (radius 2.54) + (stroke + (width 0) + (type solid) + ) + (fill + (type none) + ) + (uuid acdd8009-2e99-4bed-8820-ae10d1006f4d) + ) + (text_box "Various other" + (exclude_from_sim no) + (at 284.48 12.7 0) + (size 109.22 77.47) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify right top) + ) + (uuid "37fc2224-0b43-4387-853c-8b40b4790778") + ) + (text_box "Voltage selection jumper" + (exclude_from_sim no) + (at 191.77 181.61 0) + (size 26.67 12.7) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify right top) + ) + (uuid "7fd04a4b-7820-4c27-9292-a1590baba279") + ) + (text_box "Heatsinks" + (exclude_from_sim no) + (at 351.79 17.78 0) + (size 33.02 29.21) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + (uuid "9b83217e-c07b-42e9-b279-a7748c04d712") + ) + (text_box "Power section" + (exclude_from_sim no) + (at 170.18 12.7 0) + (size 114.3 77.47) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify right top) + ) + (uuid "ba1ce733-c4b1-41db-93d9-4d90c3c0f04d") + ) + (text_box "Digitize RF input" + (exclude_from_sim no) + (at 26.67 204.47 0) + (size 113.03 64.77) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify right top) + ) + (uuid "baa97cfd-fa8b-48b7-86ff-685367f0cb40") + ) + (text_box "Audio Output" + (exclude_from_sim no) + (at 139.7 204.47 0) + (size 144.78 64.77) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify right top) + ) + (uuid "c26e218d-d61a-4cb7-98fc-a6d1e5ec69c3") + ) + (text_box "Shutdown routine activation" + (exclude_from_sim no) + (at 26.67 21.59 0) + (size 121.92 50.8) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify right top) + ) + (uuid "c58a1389-f54e-47e6-a54d-734ae498e5b5") + ) + (text_box "Voltage\nreversal\nprotection" + (exclude_from_sim no) + (at 158.75 21.59 0) + (size 11.43 50.8) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify right top) + ) + (uuid "e0c9db2f-0877-4a37-8517-dcef6fea5afc") + ) + (text_box "Board mounting holes" + (exclude_from_sim no) + (at 351.79 50.8 0) + (size 33.02 17.78) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + ) + (uuid "f8dff638-d9c8-4d77-a669-507378d79194") + ) + (text "Mounted in 8 pin socket" + (exclude_from_sim no) + (at 38.1 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "1b9b1811-9c41-464a-9c2d-74ad8df0c97e") + ) + (text "MIC INPUT\nRing - PTT\nTop - MONO \n Audio" + (exclude_from_sim no) + (at 224.79 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "227ee8ed-4757-4bcc-b25a-8c8b2732d091") + ) + (text "<-OR->" + (exclude_from_sim no) + (at 164.338 22.098 0) + (effects + (font + (size 3 3) + (thickness 0.8) + (bold yes) + ) + (justify right bottom) + ) + (uuid "2460bf56-fc96-43c1-923e-8901266825ca") + ) + (text "RF IN\nRING - Q - VIN_L\nTIP - U - VIN_R" + (exclude_from_sim no) + (at 120.65 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "2860c20f-86f2-4d9c-8358-790e3eefbc1d") + ) + (text "I/Q OUTPUT\nRing - Q\nTip - I" + (exclude_from_sim no) + (at 223.52 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "5d83fdf7-da10-44c7-b5ac-8e8e50054761") + ) + (text "AUDIO OUT\nRING - RIGHT\nTIP - LEFT" + (exclude_from_sim no) + (at 264.16 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "657a6e99-dd43-4418-bf65-d744142d81ac") + ) + (text "L_out" + (exclude_from_sim no) + (at 260.35 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "6ca4b6f2-6565-49d7-8931-df92eca147c5") + ) + (text "Microcontroller and connectors" + (exclude_from_sim no) + (at 91.44 74.93 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "6e39e595-f0bd-41b9-a8ee-7c7e72fb2549") + ) + (text "\"Empty\" components to add PCB \nfootprints for bottom-side\nmounting option" + (exclude_from_sim no) + (at 219.71 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "87e2f759-d66f-4e9c-b35a-5dc1ba485888") + ) + (text "Off-board wires \nconnect J22 \nand J13 to \nTeensy Audio \nAdaptor" + (exclude_from_sim no) + (at 267.335 163.83 0) + (effects + (font + (size 0.75 0.75) + ) + (justify left bottom) + ) + (uuid "9507db4a-04d6-4c3f-9cb5-d6a27ad9653b") + ) + (text "Choose between \"Shutdown routine activation\"\nand \"Voltage reversal prevention\" sections\n\nPopulate only one!" + (exclude_from_sim no) + (at 123.19 20.32 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + ) + (justify left bottom) + ) + (uuid "9ea0e034-f13b-4a88-9a11-cd9933b24065") + ) + (text "RFCONTROL SIGNALS:\nRxTx: H=Tx, L=Rx\nXmit Mode: H=SSB, L=CW\nCW: H=ON, L=OFF" + (exclude_from_sim no) + (at 184.15 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "c9c3886f-f1bc-4a20-8675-1dcb222b98f8") + ) + (text "Exciter output and microphone input" + (exclude_from_sim no) + (at 247.65 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "d2bfcfe5-f45f-4f16-9669-07d07bd0fa6d") + ) + (text "R_out" + (exclude_from_sim no) + (at 252.73 137.16 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "d6f26caa-ba05-420b-8171-49755fd2a5df") + ) + (text "If using 3V3, replace \nR4 and R5 with 0R?" + (exclude_from_sim no) + (at 200.66 172.974 0) + (effects + (font + (size 1.27 1.27) + (thickness 0.254) + (bold yes) + (color 255 0 0 1) + ) + (justify left) + ) + (uuid "eedad4b0-3d00-458f-8bd9-b705696edfa4") + ) + (label "Key1 in" + (at 134.62 190.5 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "0862031f-e2b4-4d45-87f5-90f88e2a7feb") + ) + (label "A21" + (at 156.21 190.5 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "0aa83aef-8fd9-4ff4-835b-76133498da29") + ) + (label "REF" + (at 73.66 137.16 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "0c027a64-5db0-4d63-a8c5-46399e06c8ec") + ) + (label "T+" + (at 148.59 161.29 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "119493fc-eb52-47db-9063-3ad35bd5b02f") + ) + (label "BAND2 (20m)" + (at 73.66 139.7 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "1ed92b86-677d-4095-8c0c-771877f1ce77") + ) + (label "R-" + (at 160.02 154.94 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "21a86ded-7286-4ee6-bfdc-559ac983f914") + ) + (label "BAND0 (80m)" + (at 73.66 144.78 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "24eec5e4-d696-4cae-a1b2-bd209c0ba68f") + ) + (label "PTT in" + (at 252.73 182.88 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "25390873-6efd-490a-812c-6ab8dc6d0461") + ) + (label "MISO" + (at 168.91 170.18 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "2ca2bf4d-8fa9-418f-85af-797dcf295feb") + ) + (label "RXTX" + (at 148.59 101.6 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "2e373220-9091-4fdb-9583-ee333d4dc812") + ) + (label "ADC_IN" + (at 80.01 109.22 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "30c01771-f5f0-40e7-b167-1bc134044618") + ) + (label "Xmit Mode" + (at 148.59 147.32 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "31f63846-f4f5-4d64-8fc6-63af6c4fc8e3") + ) + (label "SDA1" + (at 148.59 114.3 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "37329bf8-37f5-4ee4-b726-f32757c582fb") + ) + (label "Cal" + (at 148.59 137.16 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3a8d950f-60ef-448e-9cc7-0a6d603b2090") + ) + (label "Key2 in" + (at 134.62 187.96 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3afc3619-bc4f-4b2c-8659-df0fa22c02ab") + ) + (label "Rx" + (at 234.95 123.19 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3d9c2242-52a0-40bf-ac76-9c5600de533b") + ) + (label "BCK" + (at 148.59 104.14 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3ea3ea7a-4dfd-48b7-a5a9-33c4cbf9a599") + ) + (label "PTT in" + (at 177.8 151.13 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "42ec2fb6-3d27-4302-9474-f95802220e23") + ) + (label "PTT in" + (at 134.62 193.04 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "432ccf43-2a94-4af1-af05-ddeb170c9cb4") + ) + (label "Key2 in" + (at 148.59 144.78 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "441c284c-f112-4c34-b15c-ddf872efe09c") + ) + (label "RXTX" + (at 176.53 119.38 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "45ef34ce-4415-451b-8665-60d15c1066ce") + ) + (label "ADC_IN" + (at 113.03 241.3 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "48cba997-8a89-430a-a20d-d34fbbf00ca4") + ) + (label "TEENSY SHUTDOWN COMPLETE" + (at 53.34 96.52 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "4a68ad3f-afc9-4b54-835c-e63d9d5bf258") + ) + (label "CW on{slash}off" + (at 148.59 149.86 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "4a87785b-f588-48bb-9b1a-9024d6b43d58") + ) + (label "C{slash}S" + (at 200.66 170.18 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "4c516a1e-e951-4b89-bbd2-597164d907ac") + ) + (label "SCL2" + (at 73.66 129.54 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "4d26fe1f-6b53-4e0e-ba22-a60242f04184") + ) + (label "SCL" + (at 234.95 135.89 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "553389d1-a550-43de-9ab2-157d37148910") + ) + (label "LRCK" + (at 148.59 106.68 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "5858540e-6e23-4459-92fc-7de1a96cab07") + ) + (label "Matrix" + (at 180.34 138.43 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "60601c1a-f541-436a-b7c4-e0c8604f7f16") + ) + (label "MOSI" + (at 214.63 167.64 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "60ee79be-33d0-419d-af98-fedbce86c3d4") + ) + (label "R+" + (at 160.02 171.45 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "64e3d42e-8c3c-4559-9960-be90b27d10bf") + ) + (label "A22" + (at 156.21 193.04 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "6ca863c5-d12a-4ac1-95df-c34ff872ca22") + ) + (label "INT2" + (at 201.93 135.89 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "6d2f1f9f-9e04-48db-b741-7430ed4fd06f") + ) + (label "SCLK" + (at 148.59 124.46 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "6dbf804a-4aa7-45d0-93f5-abf6ccd3e86e") + ) + (label "BCK" + (at 234.95 128.27 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7008aad9-2ec1-463f-a5d6-450adf263cf6") + ) + (label "Cal" + (at 201.93 119.38 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "70917d3b-3d35-4c54-b2b3-8ef248ec77ff") + ) + (label "SCL" + (at 148.59 109.22 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7103c83d-cc17-415c-9c2c-3f649840f01c") + ) + (label "Key2 in" + (at 201.93 151.13 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "733c3bbf-a738-4723-9749-4a6005eaa19e") + ) + (label "LRCK" + (at 85.09 260.35 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "74fd3ff5-ca80-4a6c-978f-49a0faf522bd") + ) + (label "C{slash}S" + (at 81.28 119.38 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "78b5be81-e67a-435c-a1e0-0e2ee7c5bd1c") + ) + (label "CW on{slash}off" + (at 176.53 116.84 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7ce159a8-f027-4c63-ac3e-a6b1bd15c8bf") + ) + (label "SDA" + (at 234.95 133.35 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7d36b5d6-c967-4f93-afff-f919e0ebdc6c") + ) + (label "LRCK" + (at 176.53 231.14 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7da148d1-fbdd-4ee0-ba04-3c70099936f7") + ) + (label "INT2" + (at 148.59 119.38 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "7e4eaef1-21a4-4501-bdc3-cebb395b5e78") + ) + (label "BCK" + (at 105.41 260.35 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "82e1abe6-23d6-4801-899e-68e5a9d1d779") + ) + (label "INT1" + (at 201.93 133.35 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "865b1ec2-b944-4d23-80c1-e2d3fc2fa72b") + ) + (label "SDA" + (at 148.59 111.76 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "889cfee1-608a-4651-ad6b-625ec3604575") + ) + (label "BAND1 (40m)" + (at 73.66 147.32 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "896fc9cc-85b5-4595-b51d-dd15952074fb") + ) + (label "CLK" + (at 74.93 260.35 180) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify right bottom) + ) + (uuid "8abdcc88-3bd0-4952-a2d9-82fed0c8ae94") + ) + (label "LED" + (at 147.32 170.18 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "8ee412a7-38ac-4c52-bfb6-d563d4f5c0c9") + ) + (label "CLK" + (at 148.59 99.06 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "931234bd-b9a6-4ac8-ab6a-a497572b26fb") + ) + (label "INT1" + (at 148.59 121.92 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "934d7c42-c1f4-43f4-b4b0-75a2916635be") + ) + (label "SCLK" + (at 181.61 167.64 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "96436926-2d9f-4329-bb7d-b3434cce8763") + ) + (label "LRCK" + (at 234.95 125.73 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "99978432-9873-4b42-a061-7795c90ce871") + ) + (label "D+" + (at 81.28 172.72 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "9af2beab-490e-4d9b-8920-5d8cfe3c821b") + ) + (label "MOSI" + (at 81.28 121.92 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "a265c227-2ff6-4d3c-83aa-af047ac20ca6") + ) + (label "SDA2" + (at 73.66 132.08 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "b665a8bd-3103-42a4-a7f9-2a41a8fa4ae9") + ) + (label "MISO" + (at 81.28 124.46 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "b6c2c05d-9aa1-47ff-a263-afebcfd701f2") + ) + (label "BAND3 (15m)" + (at 73.66 142.24 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "b990ef46-8f9f-4cfd-b2a2-4a6e5b651536") + ) + (label "RXTX" + (at 60.96 161.29 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "c00ab4c3-111c-4e18-910a-34fa3fa0a51f") + ) + (label "Key1 in" + (at 148.59 142.24 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "c65e4e29-8f47-4c31-85b4-45a8a827bfce") + ) + (label "Tx" + (at 80.01 111.76 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ca522f77-864b-4e0e-a10d-b027522af889") + ) + (label "DAUDIO_OUT" + (at 73.66 149.86 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "cf593de3-b9d2-441d-97a4-1880935c3b4a") + ) + (label "DAUDIO_OUT" + (at 168.91 233.68 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "d68edbdb-0dd7-4c7f-ac69-7703ba3997fc") + ) + (label "FOR" + (at 73.66 134.62 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "d71fae38-0b32-4093-994d-1583b0c0e306") + ) + (label "A22" + (at 152.4 129.54 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "d7b9f742-3969-4d25-afaa-1ad1b338a172") + ) + (label "BCK" + (at 176.53 236.22 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "d9f62050-645f-42c5-8829-6ab84fac3b84") + ) + (label "A21" + (at 152.4 132.08 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "d9fb50ee-ebd7-4e35-b094-356d5efece21") + ) + (label "Key1 in" + (at 201.93 153.67 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "da26db04-d1f3-4028-b9f9-b672ddd10a95") + ) + (label "SCL1" + (at 180.34 133.35 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "df571941-7cb2-4cad-8129-d33662732939") + ) + (label "SDA1" + (at 180.34 135.89 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "eb847b74-6f0d-4d76-b375-5a161969e1ab") + ) + (label "CLK" + (at 234.95 130.81 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ed65f634-333f-40fc-ba65-8684617fd350") + ) + (label "Xmit Mode" + (at 201.93 114.3 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ed792d33-78ea-498d-9066-9b5220ed5d51") + ) + (label "T-" + (at 148.59 163.83 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "ef25cfab-4a6c-4092-a219-69f50e08e31d") + ) + (label "D-" + (at 82.55 157.48 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "f2394dd7-5987-4a49-a795-812ab4b2b41d") + ) + (label "Tx" + (at 234.95 120.65 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "f6f4f676-e341-4ef1-8956-d5fd4dab33f6") + ) + (label "SCL1" + (at 148.59 116.84 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "f846384e-007f-4c32-a1df-6c7bbe3baa47") + ) + (label "BEGIN TEENSY SHUTDOWN" + (at 63.5 93.98 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "f8924cb9-63ec-46fb-ba6a-333598cfd7ec") + ) + (label "Rx" + (at 80.01 114.3 0) + (fields_autoplaced yes) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "f9659664-d7ab-47eb-a678-c902e0551a3b") + ) + (symbol + (lib_id "Connector:TestPoint") + (at 269.24 59.69 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "034a0cd2-4926-422e-8eb0-b56bd12745b5") + (property "Reference" "TP2" + (at 271.78 55.118 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 271.78 57.658 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 274.32 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 274.32 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 269.24 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 269.24 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-1298" + (at 269.24 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 269.24 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "a543b150-0f31-441d-b84a-f53a041dd9ba") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 185.42 215.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "03f58ad0-81a0-476f-b3e9-dd2c6a8864a4") + (property "Reference" "C25" + (at 189.23 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 16V" + (at 186.69 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 186.3852 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 185.42 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 185.42 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 185.42 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 185.42 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 185.42 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "670cadd7-bb84-4432-8c64-506ef213f97e") + ) + (pin "1" + (uuid "0e21dd00-a475-412f-bfe2-f295b18df071") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C25") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 59.69 105.41 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "042f167a-3c92-4b59-89a4-1b66f9746e7a") + (property "Reference" "#PWR01" + (at 59.69 111.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 63.5 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 59.69 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 59.69 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 59.69 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c242fba7-5eae-4ee2-8a36-305b12d1ce4d") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR01") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Audio:AudioJack3_SwitchTR") + (at 243.84 157.48 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "04582302-d9b5-4de1-979d-20ae5b2bc4ad") + (property "Reference" "J17" + (at 241.935 149.5257 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Ex_Out" + (at 241.935 151.9499 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:Jack_3.5mm_STX-3081_Horizontal" + (at 243.84 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 243.84 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 243.84 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "490-SJ1-3515N " + (at 243.84 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 243.84 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 243.84 157.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "RN" + (uuid "828d9958-195b-40be-9aa9-faf70d4e1fa3") + ) + (pin "T" + (uuid "d4225aef-ccc6-4503-8cc6-c0aad463cb9d") + ) + (pin "S" + (uuid "313d3dea-f9b2-441f-b61f-0099b50d9d57") + ) + (pin "R" + (uuid "1592e4b3-e83c-4026-a330-1b0a59c5c42f") + ) + (pin "TN" + (uuid "1d54d0b9-7887-42e3-bc4c-7726fd9516c2") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Polarized") + (at 193.04 53.34 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "048b6365-a59b-49ee-83db-d30c96c3c008") + (property "Reference" "C6" + (at 190.5 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "470uF 25V" + (at 190.5 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_THT:CP_Radial_D10.0mm_P5.00mm" + (at 192.0748 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 193.04 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 193.04 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "667-ECA-1EM471" + (at 193.04 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 193.04 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 193.04 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "16e91181-0588-48e6-9fea-90a2ea27e44b") + ) + (pin "1" + (uuid "e60d59a8-66ca-438a-89c0-beeccc69c54b") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Transistor_FET:IRF4905") + (at 165.1 40.64 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "049ea973-3f0f-41f1-9efe-e621dcc7cf6d") + (property "Reference" "Q1" + (at 161.29 43.18 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SUP90P06-09L" + (at 161.29 45.72 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 167.005 35.56 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pdf/datasheet/fqp47p06-d.pdf" + (at 165.1 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 165.1 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 165.1 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 165.1 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7642498b-91ba-4155-a218-ecf87e50dedf") + ) + (pin "3" + (uuid "37f298d8-22a0-48d3-9008-2fb0217b357f") + ) + (pin "1" + (uuid "3e2852cc-05a9-4b69-9ffa-3443f40c3c5a") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "Q1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 152.4 215.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "054d7c1b-128d-4d65-8dcb-758e325ad1bb") + (property "Reference" "C14" + (at 146.05 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 142.24 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 153.3652 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 152.4 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 152.4 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 152.4 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 152.4 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 152.4 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5ca3fb3a-8f25-4666-9328-31f8c60b9e46") + ) + (pin "1" + (uuid "4bbecdc0-4644-42cf-bf0e-956ffadfbfbe") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 74.93 251.46 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "06ec42e3-3a94-4abb-b61c-86527ca39f09") + (property "Reference" "R6" + (at 77.47 251.46 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "100R" + (at 80.01 251.46 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 76.708 251.46 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 74.93 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 74.93 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "652-CR1206FX-1000ELF" + (at 74.93 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 74.93 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 74.93 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "cf3fe07d-74df-4c82-9b39-176a81720be3") + ) + (pin "1" + (uuid "b6c7cdd2-ae2c-48d5-baa0-d9f7902db830") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:D_Zener") + (at 165.1 52.07 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (uuid "0761ed86-2063-4721-a88e-27e44366cf15") + (property "Reference" "D5" + (at 166.3121 54.102 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10V" + (at 163.8879 54.102 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Diode_SMD:D_SMA" + (at 165.1 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 165.1 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 165.1 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "78-MMSZ5240C-E3-08" + (at 165.1 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 165.1 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 165.1 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "02f52931-fa5f-4516-9525-987b6764cf2a") + ) + (pin "2" + (uuid "099d8e3b-691e-4f36-a832-cf93323c6645") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "D5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 115.57 63.5 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "07bbfddc-ffeb-4d7b-8dfd-c7a882979834") + (property "Reference" "R2" + (at 118.11 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10K" + (at 118.11 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 113.792 63.5 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 115.57 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 115.57 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "CRCW120610K0FKEB" + (at 115.57 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 115.57 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 115.57 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f14c4c9d-0fb0-4cd1-8876-8ea4abb76b8d") + ) + (pin "1" + (uuid "d5759a88-3c3a-4ef0-acb7-3f7ffa90afff") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 215.9 242.57 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "09fb7e2f-b968-4a8f-8599-3d2f9706ad85") + (property "Reference" "C29" + (at 219.71 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2.2uF 16V" + (at 217.17 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 216.8652 246.38 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 215.9 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 215.9 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C225K5R" + (at 215.9 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 215.9 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 215.9 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "90933072-017f-4b31-952e-21f760534e92") + ) + (pin "1" + (uuid "0c808741-1cc1-4751-846a-ed7b83118c60") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C29") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 82.55 238.76 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0a380bdd-7dc8-48ce-9215-1742b7625531") + (property "Reference" "#PWR017" + (at 82.55 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 78.74 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 82.55 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 82.55 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 82.55 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "97b269d3-557f-49eb-ba49-a7452cb26a8b") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR017") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 45.72 243.84 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0acdcfb7-ea1c-4417-b8d3-28ef4b3ccac8") + (property "Reference" "#PWR020" + (at 45.72 250.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 45.72 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 45.72 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 45.72 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 45.72 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9f908cc2-4ae2-48a0-986a-b50d12f5a800") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR020") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 85.09 53.34 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0b5f006b-5553-4616-8eca-edb21daafe53") + (property "Reference" "#PWR015" + (at 85.09 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 85.09 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 85.09 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 85.09 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 85.09 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fab37f1f-a343-49bf-9e75-cc51905bb74e") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR015") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 240.03 63.5 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "0b805e27-5453-4732-a757-157994f1ce08") + (property "Reference" "C8" + (at 243.84 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 243.84 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 240.9952 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 240.03 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 240.03 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 240.03 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 240.03 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 240.03 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6caec6ee-9f74-4d6d-90c2-c71813dc8df5") + ) + (pin "1" + (uuid "084b5dc4-3c62-49ed-aaba-811e6cdc0966") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Switch:SW_Push") + (at 66.04 43.18 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0fcd2219-81cb-4a63-8d34-2214074f8456") + (property "Reference" "SW1" + (at 71.12 43.18 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "ON-OFF BUTTON" + (at 67.31 40.64 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 71.12 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 71.12 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 66.04 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 66.04 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-4720" + (at 66.04 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 66.04 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5ede3d1e-2d6d-4453-a2ae-4fd321c201b2") + ) + (pin "1" + (uuid "5b3d60a3-c539-4f09-80dd-6bed125f2a52") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "SW1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:IDC_2x5") + (at 191.77 133.35 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "0fcec4c1-373b-40d3-8256-774a50bcbaa8") + (property "Reference" "J5" + (at 193.04 122.8557 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Front Panel" + (at 193.04 124.46 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 191.77 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 191.77 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 191.77 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 191.77 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-2939" + (at 191.77 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 191.77 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b28c1c1d-d7df-4c9e-af27-0a3baaab161c") + ) + (pin "9" + (uuid "7d30653a-58c5-4211-bb6e-bec983813da3") + ) + (pin "1" + (uuid "364d3cdd-24a1-4f13-ad51-a0fa34ced9df") + ) + (pin "6" + (uuid "cf564678-a771-49b2-990d-0ff81ed19092") + ) + (pin "4" + (uuid "90804fd3-67d0-431e-8763-e7bb075f1b69") + ) + (pin "5" + (uuid "a1232ef3-7b92-49c6-ba81-6ef0e81ae9cf") + ) + (pin "3" + (uuid "f6747946-318a-4cfc-b6e6-11e2bab6e67d") + ) + (pin "10" + (uuid "898b064d-1d89-458a-8b1d-b70a9bcdea8e") + ) + (pin "8" + (uuid "ef448979-3908-4151-9345-87ccc4aa3ab9") + ) + (pin "7" + (uuid "11e75348-c493-4e8a-894b-3d11fceb90de") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:LM1117T-3.3") + (at 210.82 59.69 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "1076a160-2fc8-48a7-87c5-54c02c210b9f") + (property "Reference" "U3" + (at 210.82 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM1117T-3.3" + (at 210.82 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 210.82 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm1117.pdf" + (at 210.82 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "926-LM1117T-3.3/NOPB" + (at 210.82 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 210.82 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 210.82 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "4e856064-f410-4982-8b08-a4d5fd7418dd") + ) + (pin "2" + (uuid "013b6a8a-bec8-487e-8373-236b64df5ff6") + ) + (pin "1" + (uuid "17044a74-bf15-4002-809a-5f98903c2125") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:EA-T220-38E") + (at 354.33 39.37 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "12252b89-9b25-4eee-b7c5-b9baa052d438") + (property "Reference" "H8" + (at 370.332 39.4279 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "EA-T220-38E" + (at 370.332 41.8521 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "EAT22038E" + (at 370.84 134.29 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ohmite.com/assets/docs/sink_e.pdf?r=false" + (at 370.84 234.29 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Description" "" + (at 354.33 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Height" "38.35" + (at 370.84 434.29 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Mouser Part Number" "588-EA-T220-38E" + (at 370.84 534.29 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Mouser Price/Stock" "https://www.mouser.co.uk/ProductDetail/Ohmite/EA-T220-38E?qs=6weo7U0lPxCX9kcQhGcuZQ%3D%3D" + (at 370.84 634.29 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Manufacturer_Name" "Ohmite" + (at 370.84 734.29 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Manufacturer_Part_Number" "EA-T220-38E" + (at 370.84 834.29 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (pin "2" + (uuid "82006236-1a6e-4be7-a099-da1b8f528d2c") + ) + (pin "1" + (uuid "9dba621e-083e-4b52-99de-a761f138a259") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 74.93 223.52 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "12e7474b-461c-4021-ae9d-53ee86696986") + (property "Reference" "C27" + (at 76.2 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 16V" + (at 73.66 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 75.8952 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 74.93 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 74.93 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 74.93 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 74.93 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 74.93 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "91cb64bc-b6ca-48f2-9331-195ebd0373d6") + ) + (pin "1" + (uuid "1d0aac11-25e9-4a7a-abb9-2c5aed715fb6") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C27") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 40.64 240.03 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1400b6d8-1dd4-4d51-9294-773f3e105a57") + (property "Reference" "C19" + (at 33.02 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 27.94 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 41.6052 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 40.64 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 40.64 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 40.64 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 40.64 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 40.64 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "591875c6-aec2-418a-9015-d5f34a949143") + ) + (pin "1" + (uuid "b73ece82-cf5c-4e5a-b568-dc5056d90df0") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 196.85 48.26 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "14958baa-fb6b-4ad7-a139-c14d848671a6") + (property "Reference" "C3" + (at 200.66 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 200.66 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 197.8152 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 196.85 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 196.85 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 196.85 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 196.85 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 196.85 48.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "66bb862c-7331-4cac-8b17-d29d0d167aef") + ) + (pin "1" + (uuid "41bf3267-286b-4e00-ba14-d50365760fba") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Transistor_FET:2N7000") + (at 135.89 59.69 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1541e101-b2a0-4519-9759-93108fe121b2") + (property "Reference" "Q2" + (at 129.54 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2N7000" + (at 129.54 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" + (at 140.97 61.595 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.vishay.com/docs/70226/70226.pdf" + (at 135.89 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "" + (at 135.89 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "512-2N7000BU" + (at 135.89 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 135.89 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 135.89 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "311085ef-5102-4f18-9384-b67b528516b4") + ) + (pin "3" + (uuid "d3432b5a-e44e-47f8-a860-696fd27f7d93") + ) + (pin "2" + (uuid "b57da23c-cc23-4645-a799-821352f4abb0") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "Q2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Transistor_FET:2N7000") + (at 121.92 59.69 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "168cdc80-9c09-4687-8c20-9b0517959f34") + (property "Reference" "Q3" + (at 114.3 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2N7000" + (at 114.3 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" + (at 127 61.595 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.vishay.com/docs/70226/70226.pdf" + (at 121.92 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "" + (at 121.92 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "512-2N7000BU" + (at 121.92 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 121.92 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 121.92 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2b6e0eeb-2ca7-412a-b691-66606427fb2a") + ) + (pin "3" + (uuid "e799e75c-13fd-4151-a822-907eed6651cb") + ) + (pin "2" + (uuid "a004041a-ef8f-43ab-a697-3176f708331c") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "Q3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 312.42 73.66 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "193608d9-6fef-469e-87fe-46b038dcf99e") + (property "Reference" "#PWR059" + (at 312.42 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 312.42 77.7931 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 312.42 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 312.42 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 312.42 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d7dc66c2-8fc2-4858-9ae2-1146448e3a51") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR059") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 210.82 85.09 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1a583fd2-0097-4d75-8496-c8908d4bb911") + (property "Reference" "#PWR063" + (at 210.82 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 213.36 86.36 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 210.82 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 210.82 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ce1fa87f-c041-4fa9-b856-d681143b827b") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR063") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 228.6 255.27 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "1a5b6086-3dc2-4ee7-9430-67b58269608b") + (property "Reference" "C21" + (at 232.41 254 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 16V" + (at 229.87 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 229.5652 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 228.6 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 228.6 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 228.6 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 228.6 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 228.6 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "fdbf452e-9af6-4242-a2af-ba0602d2879d") + ) + (pin "1" + (uuid "81fcb4a9-e7c2-4320-8ebc-901569716e60") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C21") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:IDC_2x4") + (at 146.05 193.04 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "1a630add-fa59-41c8-a556-78038bc50105") + (property "Reference" "J3" + (at 147.32 182.5457 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Acc" + (at 147.32 184.9699 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x04_P2.54mm_Vertical" + (at 146.05 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 146.05 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 146.05 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 146.05 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-2948" + (at 146.05 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 146.05 193.04 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "0a33e121-905d-46cb-b433-415133e2353b") + ) + (pin "3" + (uuid "fea65fb9-c64b-4790-a9d5-85355e27480c") + ) + (pin "4" + (uuid "ffe43f27-e592-4e13-bcd4-c88e7d8f1471") + ) + (pin "5" + (uuid "554988e3-b766-4a9f-b294-e4f2246ff439") + ) + (pin "6" + (uuid "de89a52c-f962-4171-9505-76ce4e8489b2") + ) + (pin "7" + (uuid "ee59010e-5ccd-432a-86ac-cc92b5c37dba") + ) + (pin "1" + (uuid "e9d6f549-9ac5-4f4e-a38b-18e4dab30c47") + ) + (pin "8" + (uuid "84e55c03-74d0-43b2-95cc-983669fe7810") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 306.07 50.8 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "1c67ed2f-4970-4b5f-8b0a-99b616b8ea76") + (property "Reference" "C31" + (at 309.88 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 309.88 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 307.0352 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 306.07 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 306.07 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 306.07 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 306.07 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 306.07 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "9230b1cd-8874-4cc3-b4e9-796ba23fd93d") + ) + (pin "1" + (uuid "7bf5948f-abee-4dcc-9ca0-d6afef15a214") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C31") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 180.34 251.46 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "204df534-b26b-4f10-9403-3e3c6e1d6264") + (property "Reference" "#PWR029" + (at 180.34 257.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 180.34 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 180.34 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 180.34 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 180.34 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "205f4760-dd8c-4539-a53c-6c23b0ae63b5") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR029") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 158.75 215.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "248b67de-6a11-4c4c-9793-1538aeea745a") + (property "Reference" "C15" + (at 162.56 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 16V" + (at 160.02 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 159.7152 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 158.75 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 158.75 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 158.75 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 158.75 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 158.75 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "db566d77-790c-4d62-bedb-bcf57b49f947") + ) + (pin "1" + (uuid "55d8d033-57d2-46a4-94a5-078acc1a3792") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 222.25 255.27 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "260bcea9-5fc0-416a-b663-ae3ae3b97aaf") + (property "Reference" "C20" + (at 215.9 254 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 213.36 256.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 223.2152 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 222.25 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 222.25 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 222.25 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 222.25 255.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c71feb69-7ea0-4a33-ac95-9ee156f50d86") + ) + (pin "1" + (uuid "839fca3a-5359-4cf8-84dc-4a972abe9fe0") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 356.87 62.23 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "29aa1a78-21d9-42a8-b3e1-5bbb38a08098") + (property "Reference" "#PWR053" + (at 356.87 68.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 356.87 66.3631 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 356.87 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 356.87 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 356.87 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0656e774-0cb7-41f3-ba01-f21f39574e26") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR053") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Audio:AudioJack3_SwitchTR") + (at 128.27 232.41 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2b532c7a-c08f-4973-b911-b7d3a16b71fb") + (property "Reference" "J15" + (at 130.175 240.3643 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Rec_In" + (at 130.175 237.9401 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:Jack_3.5mm_STX-3081_Horizontal" + (at 128.27 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 128.27 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 128.27 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "490-SJ1-3515N " + (at 128.27 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 128.27 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 128.27 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "RN" + (uuid "858042a2-e3aa-4e6b-9138-94338e6be9d6") + ) + (pin "T" + (uuid "1d223293-7568-4523-b9a5-6930f593d098") + ) + (pin "S" + (uuid "1031e7c2-bb16-434a-a7d6-0fa115f679c8") + ) + (pin "R" + (uuid "f53c3a10-f9cf-4251-97b6-dc89b7c35649") + ) + (pin "TN" + (uuid "0013d194-e1fc-4d97-b65b-bc24b9c3d3b5") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12P") + (at 331.47 30.48 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "2cb1dfd5-7288-413a-9db9-27cff74720a6") + (property "Reference" "#PWR054" + (at 331.47 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12P" + (at 331.47 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 331.47 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 331.47 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 331.47 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "45e9fc6d-b2ea-4841-8cfa-4b9b959dfed0") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR054") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Generic:Conn_01x03") + (at 261.62 160.02 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2d466fcd-f9b5-4408-afc4-ea94a2d518fd") + (property "Reference" "J22" + (at 261.62 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Header" + (at 261.62 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" + (at 261.62 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 261.62 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 261.62 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 261.62 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-6153" + (at 261.62 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 261.62 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "043bc1ad-073b-4690-bf11-d4890bbc9fe2") + ) + (pin "1" + (uuid "c6dde324-76cc-40b0-8c8c-b498ea9b75ad") + ) + (pin "2" + (uuid "cdcdcdc8-62ec-420d-9896-70eb75d0072c") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 110.49 236.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2f320628-02c0-4903-ab38-c37b595f1bfd") + (property "Reference" "#PWR016" + (at 110.49 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 114.3 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 110.49 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 110.49 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 110.49 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6431220f-c4e3-477c-952e-b67995356bed") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR016") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 31.75 190.5 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "2fa9bf70-4335-49bd-9514-e5f893aa39ec") + (property "Reference" "R9" + (at 27.94 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1K" + (at 30.48 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 33.528 190.5 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 31.75 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 31.75 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "CRCW12061K00JNEAC" + (at 31.75 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 31.75 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 31.75 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "42c4965e-b00b-4c44-ba2b-f91ad1cdacea") + ) + (pin "1" + (uuid "2eea3582-1882-497f-91a9-d7c41aa7a015") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Polarized") + (at 222.25 63.5 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "318fc588-08c5-4ef9-be94-44a7f4e985c3") + (property "Reference" "C7" + (at 226.06 61.341 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "470uF 25V" + (at 226.06 63.881 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_THT:CP_Radial_D10.0mm_P5.00mm" + (at 223.2152 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 222.25 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "667-ECA-1EM471" + (at 222.25 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 222.25 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 222.25 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1dc767d0-a614-40b9-b8c8-524781d26b86") + ) + (pin "1" + (uuid "1d70c36f-32c2-40c9-8dd0-a8e4d457e8b9") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 29.21 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "32b1c61e-819e-45ba-b99a-c56d1153f7ba") + (property "Reference" "#PWR013" + (at 29.21 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 29.21 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 29.21 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 29.21 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 29.21 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "564c327b-b14b-4342-b9f7-6060b7979d95") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR013") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Generic:Conn_01x02") + (at 168.91 101.6 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "33a50555-ce9d-4608-b7de-c5d5a9c9d9a2") + (property "Reference" "J18" + (at 170.942 101.6579 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Conn_01x02" + (at 170.942 104.0821 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 168.91 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 168.91 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 168.91 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 168.91 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 168.91 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 168.91 101.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "60329061-03a1-4e86-ac12-03faaa3abd56") + ) + (pin "2" + (uuid "869f908b-ebf2-40d3-9457-3d222f97e5d1") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 31.75 173.99 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "34030f41-a141-4a40-9bf3-76038edbe4d3") + (property "Reference" "#PWR05" + (at 31.75 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 31.75 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 31.75 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 31.75 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 31.75 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e99966ae-4bd7-428b-9f4a-1647e590d616") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR05") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 172.72 182.88 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3692c24b-a112-4467-8ff5-c1624159cb0e") + (property "Reference" "#PWR046" + (at 172.72 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 167.64 185.42 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 172.72 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 172.72 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 172.72 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7a861603-ef93-4c6f-b2cb-7678c292d95b") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR046") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 60.96 190.5 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "369a37c1-145e-402f-bc1f-f24553352674") + (property "Reference" "R14" + (at 57.15 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1K" + (at 59.69 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 62.738 190.5 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 60.96 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "CRCW12061K00JNEAC" + (at 60.96 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 60.96 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 60.96 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "a95d9c30-7423-40c9-bd1f-c526fdead73b") + ) + (pin "1" + (uuid "a7dc6c90-482e-4835-9c4c-c96dabee1850") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 36.83 110.49 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3a0ba0ac-9556-4349-ba4c-e827529a4f88") + (property "Reference" "#PWR02" + (at 36.83 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 36.83 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 36.83 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 36.83 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 36.83 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "01daadea-d2e8-4b51-854a-bdf2e9fa55bd") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR02") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 179.07 191.77 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3aaf3ebc-adf3-4810-9752-fe52b1ba64c9") + (property "Reference" "#PWR048" + (at 179.07 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 179.07 186.69 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 179.07 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 179.07 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 179.07 191.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6c4cd5ff-37e0-4499-9a5f-48b5207188e7") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR048") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 254 38.1 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3ab8583d-be9c-4d25-aaad-051d3aff24ac") + (property "Reference" "L1" + (at 254 33.02 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uH 20%" + (at 254 35.56 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Inductor_SMD:L_Bourns-SRN6028" + (at 254 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 254 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 254 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "81-1264EY-100MP3" + (at 254 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 254 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 254 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "15ebfe7e-59a4-4f5b-8284-2b47bdd1ceb9") + ) + (pin "2" + (uuid "7e349eb3-7b43-4dc4-8628-3d71d7b5e746") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 123.19 237.49 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3c6ec026-de38-4c19-bbe2-9eba9296c814") + (property "Reference" "#PWR018" + (at 123.19 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 123.19 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 123.19 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 123.19 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 123.19 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6742e843-55c8-4bff-ab53-18cc197f5d67") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR018") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12P") + (at 154.94 30.48 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "3cb0059f-2635-40b9-a333-d0b78ee155bf") + (property "Reference" "#PWR010" + (at 154.94 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12P" + (at 154.94 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 154.94 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 154.94 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 154.94 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fc508d7f-bd92-41e7-890f-8f6ccb27dfb9") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR010") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 231.14 232.41 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3ccf0370-fad4-49a0-9e9d-993bfea3406d") + (property "Reference" "#PWR038" + (at 231.14 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 231.14 237.49 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 231.14 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 231.14 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 231.14 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fd1e4dd5-df70-4875-9a0e-68fb2e99d1b7") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR038") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 153.67 85.09 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "3ee3aff3-6f18-4cce-983b-711caabe0410") + (property "Reference" "#PWR039" + (at 153.67 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 153.67 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 153.67 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 153.67 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 153.67 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8593ff04-b552-460d-a55d-b8b3a3f7abd5") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR039") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Diode:1N4007") + (at 119.38 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "40f60462-2920-400a-833a-e903a476d602") + (property "Reference" "D1" + (at 119.38 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1N4007" + (at 119.38 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Diode_SMD:D_SMA" + (at 119.38 42.545 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.vishay.com/docs/88503/1n4001.pdf" + (at 119.38 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 119.38 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "621-S1A-F" + (at 119.38 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 119.38 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 119.38 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6a756c13-83ec-43d0-adb9-e80e9b60648a") + ) + (pin "1" + (uuid "c3efcd63-3ffc-403f-b2c5-44f00e34d79c") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "D1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "MCU_Microchip_ATtiny:ATtiny85-20S") + (at 49.53 38.1 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "40fab2fd-0f32-4d6d-80e8-c00a6a250b7b") + (property "Reference" "U4" + (at 49.53 29.21 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ATtiny85-20S" + (at 49.53 34.29 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_DIP:DIP-8_W7.62mm_Socket" + (at 49.53 38.1 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf" + (at 49.53 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 49.53 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "556-ATTINY85-20PU" + (at 49.53 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-001" + (at 49.53 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 49.53 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "d7f749a3-d6b4-4cad-b4b9-b79173dd59fb") + ) + (pin "3" + (uuid "c558a0ce-46c8-4fb9-8ab5-e5dbe262b448") + ) + (pin "8" + (uuid "0d958356-8f16-494d-9c4f-cb0bf90d3ec9") + ) + (pin "6" + (uuid "e6449a42-5d8f-4334-a931-9d501e789052") + ) + (pin "2" + (uuid "3da959f6-f2af-48ec-bc0d-f3b287bf7501") + ) + (pin "4" + (uuid "d3889020-0eb4-4df3-91d4-f3d16344fe01") + ) + (pin "7" + (uuid "b0bd6bd6-84f6-4aa7-a0f3-327dd7f7f4bc") + ) + (pin "1" + (uuid "26d8fb2a-5a37-4c92-a02b-5f20355023d5") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Generic:Conn_01x02") + (at 265.43 182.88 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "42c70f2a-d19d-4f81-aafa-602a20aa1407") + (property "Reference" "J13" + (at 262.89 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Header" + (at 261.62 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 265.43 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 265.43 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 265.43 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 265.43 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-5773" + (at 265.43 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 265.43 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "0132042a-0ef9-40bc-86c6-99fde0f73638") + ) + (pin "1" + (uuid "58605715-4244-40fd-8508-8efa59b2bbea") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 199.39 261.62 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "433adfec-42c5-4159-b18e-cd4865d56747") + (property "Reference" "#PWR028" + (at 199.39 267.97 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 199.39 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 199.39 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 199.39 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 199.39 261.62 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "88838dc5-ed63-40c3-b6a3-efe4488339fa") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR028") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:AP7384-50V") + (at 102.87 38.1 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "457b9948-5bf4-4862-885d-62728af96b6f") + (property "Reference" "U2" + (at 102.87 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "AP7384-50V" + (at 102.87 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline_Wide" + (at 102.87 32.385 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.diodes.com/assets/Datasheets/AP7384.pdf" + (at 102.87 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 102.87 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "AP7381-50V-A" + (at 102.87 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 102.87 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 102.87 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "55618fa5-66fe-4808-a22d-5276d47385ef") + ) + (pin "1" + (uuid "7686c1d6-2fd1-419c-9a5f-bc896900a04c") + ) + (pin "2" + (uuid "39fb14d6-977a-401f-b287-744f768b0a30") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 50.8 224.79 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "45943541-475a-4f0d-8849-b9bdb47c1e67") + (property "Reference" "C22" + (at 54.61 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 16V" + (at 52.07 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 51.7652 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 50.8 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 50.8 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 50.8 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 50.8 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 50.8 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "75efdd88-a19f-4b01-83be-e2db25085d87") + ) + (pin "1" + (uuid "30c93634-427c-4e89-8a72-f743398f1c15") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C22") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 158.75 93.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4617b3f9-501f-4b78-ba8e-d1777fdea3a2") + (property "Reference" "#PWR040" + (at 158.75 100.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 161.29 93.98 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 158.75 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 158.75 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 158.75 93.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e2a8b49a-e007-4693-83e1-59a0fc7c9b6c") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR040") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 198.12 177.8 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4721ef66-be4e-4c8a-a1a9-a58256c1dd46") + (property "Reference" "#PWR045" + (at 198.12 184.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 201.93 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 198.12 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 198.12 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 198.12 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c2c89b97-ea4e-4301-a43f-576dcbc50fdb") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR045") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Generic:Conn_01x02") + (at 53.34 163.83 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4bec987b-455c-486b-82de-f94384685496") + (property "Reference" "J10" + (at 51.308 163.8879 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Conn_01x02" + (at 51.308 166.3121 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 53.34 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 53.34 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 53.34 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 53.34 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 53.34 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 53.34 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "32fc5d96-d8d1-49cd-af2d-e8416fe72db4") + ) + (pin "1" + (uuid "1fe637db-1bcb-4f0d-bd59-6049c4c744d2") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 173.99 114.3 0) + (mirror y) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4ca35872-d46b-470d-b736-7e51695cf49c") + (property "Reference" "#PWR042" + (at 173.99 120.65 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 170.18 115.57 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 173.99 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 173.99 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 173.99 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6c1fc11e-3bec-4d3f-9064-250c756dbcc5") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR042") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 247.65 240.03 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4d631baa-949e-444b-b64a-5ebef5ef2599") + (property "Reference" "C30" + (at 247.65 233.7267 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uF 16V" + (at 247.65 236.1509 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 251.46 239.0648 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 247.65 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 247.65 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 247.65 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 247.65 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 247.65 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d5920e8e-b4bb-4c08-b4f9-8a85cba20ef6") + ) + (pin "2" + (uuid "ddabd0bc-f839-4e24-9c96-d3bba9cbd039") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C30") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 156.21 195.58 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "4ee7c7ef-6796-4a2d-b0f0-a4c845d2787a") + (property "Reference" "#PWR068" + (at 156.21 201.93 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 160.02 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 156.21 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 156.21 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 156.21 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "62658b9c-fed8-4d05-ae02-50436e6b70fa") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR068") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 264.16 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5373b5cc-b386-4927-8e30-c31b5c0499c7") + (property "Reference" "#PWR06" + (at 264.16 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 264.16 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 264.16 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 264.16 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 264.16 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f6415a35-2d05-49cd-8520-0947a7e54753") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR06") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 45.72 220.98 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5623d55b-4f27-46cd-a560-65fe91a4f23e") + (property "Reference" "#PWR021" + (at 45.72 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 45.72 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 45.72 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 45.72 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 45.72 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e59501fc-9d70-44b5-8274-6687204114d7") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR021") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 80.01 153.67 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "57885f4c-d706-489a-864c-aa32697828bb") + (property "Reference" "#PWR065" + (at 80.01 160.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 76.2 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 80.01 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 80.01 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 80.01 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5f3bd585-6466-4093-a254-3568d5660072") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR065") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41_Library:EA-T220-38E") + (at 354.33 30.48 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "57d953bd-cd7c-4afc-a26f-b53914f07e17") + (property "Reference" "H7" + (at 370.332 30.5379 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "EA-T220-38E" + (at 370.332 32.9621 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "EAT22038E" + (at 370.84 125.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ohmite.com/assets/docs/sink_e.pdf?r=false" + (at 370.84 225.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Description" "" + (at 354.33 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Height" "38.35" + (at 370.84 425.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Mouser Part Number" "588-EA-T220-38E" + (at 370.84 525.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Mouser Price/Stock" "https://www.mouser.co.uk/ProductDetail/Ohmite/EA-T220-38E?qs=6weo7U0lPxCX9kcQhGcuZQ%3D%3D" + (at 370.84 625.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Manufacturer_Name" "Ohmite" + (at 370.84 725.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (property "Manufacturer_Part_Number" "EA-T220-38E" + (at 370.84 825.4 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left top) + (hide yes) + ) + ) + (pin "2" + (uuid "93544d93-edf0-40e9-8170-7dae356f136b") + ) + (pin "1" + (uuid "2d253612-cd32-4cf2-9546-379f8fbbc881") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:IDC_2x5") + (at 46.99 156.21 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "58984bd9-2c09-48a0-adb6-39ee8a7d4187") + (property "Reference" "J12" + (at 48.26 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "BANDS" + (at 48.26 147.32 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 46.99 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 46.99 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 46.99 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 46.99 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-2939" + (at 46.99 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 46.99 156.21 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5910f9a3-774b-4faf-9f74-8ad141491c7f") + ) + (pin "9" + (uuid "c1d340a5-7314-4cf4-97ae-e5513b152782") + ) + (pin "1" + (uuid "65f21261-e304-4e46-81ef-074a0fe69e73") + ) + (pin "6" + (uuid "6d60477c-40b6-4b66-b525-30d3886d5cd3") + ) + (pin "4" + (uuid "3a427655-6f22-47f3-91ef-8efa6953d022") + ) + (pin "5" + (uuid "0c4fd299-b8a7-4404-b63f-27acae1d1266") + ) + (pin "3" + (uuid "436ab6c1-4f40-46da-80c6-fc4190112546") + ) + (pin "10" + (uuid "590ffb35-c5d3-452d-9bfa-a41bcd89151f") + ) + (pin "8" + (uuid "36171067-10d5-44a8-b350-366596c642eb") + ) + (pin "7" + (uuid "4b1989eb-3171-4ba6-801c-24bebb2b0d7e") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 144.78 54.61 90) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "58f319dc-0b9a-495d-84d0-ad895514cc13") + (property "Reference" "R15" + (at 144.78 59.7703 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "150R" + (at 144.78 57.3461 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 144.78 52.832 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 144.78 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 144.78 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "279-CRGCQ1206J150R" + (at 144.78 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 144.78 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 144.78 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "50d908c3-dbbe-4a12-ac97-7c88598fadb1") + ) + (pin "1" + (uuid "58612ac3-1269-4962-9b81-8461df89a20d") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R15") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 177.8 238.76 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "590d596d-40a1-47ef-9b3d-6aea923080e1") + (property "Reference" "#PWR052" + (at 177.8 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 177.8 242.8931 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 177.8 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 177.8 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 177.8 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "d944ea0b-fd5d-4e82-b535-c93453a69fcc") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR052") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 105.41 251.46 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "59a3ab7e-964a-44bd-8f4a-5e44b7ad51df") + (property "Reference" "R11" + (at 107.95 251.46 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "100R" + (at 110.49 251.46 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 107.188 251.46 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 105.41 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 105.41 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "652-CR1206FX-1000ELF" + (at 105.41 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 105.41 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 105.41 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "c25c4f0a-5a04-4901-897e-d68831dd0769") + ) + (pin "1" + (uuid "521c7613-19c9-48be-a5de-38b6a63f0d51") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 148.59 127 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5a099660-52b6-486c-b077-1a66299c19db") + (property "Reference" "#PWR051" + (at 148.59 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 148.59 131.1331 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 148.59 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 148.59 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 148.59 127 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "923d2085-ba1b-4d71-8523-bc431a2d06ed") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR051") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 331.47 33.02 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "5d6a7d2b-bf62-472c-87e5-1c275775bf1d") + (property "Reference" "#PWR056" + (at 331.47 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 331.47 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 331.47 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 331.47 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 331.47 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "cbe8a89d-008f-4012-a4d2-b7ad5b4457c6") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR056") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 205.74 215.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "5e7d88a2-cc55-45f3-8364-d2eebf5de2f0") + (property "Reference" "C16" + (at 199.39 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 196.85 217.17 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 206.7052 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 205.74 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 205.74 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 205.74 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 205.74 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 205.74 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "84b03ec5-a395-4209-8981-104c8e9c52ba") + ) + (pin "1" + (uuid "7dad15f9-a841-4d1f-97fd-a82946161d35") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x02_Socket") + (at 327.66 46.99 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "61ce0ee8-fcfa-4de5-88cc-52c6552dea5b") + (property "Reference" "J2" + (at 328.93 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Fan1" + (at 328.93 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + (at 327.66 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 327.66 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 327.66 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 327.66 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-1312" + (at 327.66 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 327.66 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b18b0b44-ebca-4afb-8be7-1d396a6250ed") + ) + (pin "2" + (uuid "be401a3c-82a6-4b88-8a25-cf6627544454") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 156.21 219.71 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "6437d2d2-79a8-49c3-b85d-c8ea98c58f85") + (property "Reference" "#PWR031" + (at 156.21 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 156.21 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 156.21 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 156.21 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 156.21 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "42896926-dd80-4d97-b12f-8fbe6e47acdd") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR031") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 73.66 57.15 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "65d3772a-25b3-466c-a62f-5621a67147b2") + (property "Reference" "R3" + (at 77.47 53.34 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1K" + (at 77.47 55.88 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 73.66 58.928 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 73.66 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 73.66 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "CRCW12061K00JNEAC" + (at 73.66 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 73.66 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 73.66 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "534bdf77-c2ae-4b59-be6b-df3401bddda8") + ) + (pin "1" + (uuid "9263c384-c6ea-4c12-9684-9b07b98ee7a1") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 82.55 45.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "67ca00dc-d55e-4a65-a695-25b4f9084bd0") + (property "Reference" "C9" + (at 85.09 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 82.55 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 83.5152 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 82.55 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 82.55 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 82.55 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 82.55 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 82.55 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "7003c63e-b4de-465d-9646-f6add224fdb6") + ) + (pin "1" + (uuid "8ed1c0f4-4335-4e90-b959-6fc6cb82ef59") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:TestPoint") + (at 269.24 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "68d16323-ac90-49ad-9e00-a36496cf6221") + (property "Reference" "TP1" + (at 271.78 33.528 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "TestPoint" + (at 271.78 36.068 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 274.32 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 274.32 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 269.24 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 269.24 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-1298" + (at 269.24 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 269.24 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "72c5dbaf-6c7d-4b83-b667-282a060374ca") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "TP1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 181.61 129.54 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "68f35b41-7e42-4cff-a9f7-8f8ee197257e") + (property "Reference" "#PWR044" + (at 181.61 133.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 181.61 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 181.61 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 181.61 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 181.61 129.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0bb52af3-a8ed-4d43-a90e-ac73d4b3df3a") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR044") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 41.91 198.12 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "697f8477-d641-4e08-b2be-903828ecc56a") + (property "Reference" "#PWR014" + (at 41.91 204.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 41.91 203.2 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 41.91 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 41.91 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 41.91 198.12 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "685afae9-e423-4692-8110-17088ea3935a") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR014") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 168.91 177.8 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6aa56558-67e1-4b18-a634-11e0511dda8c") + (property "Reference" "C13" + (at 162.56 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 160.02 179.07 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 169.8752 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 168.91 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 168.91 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 168.91 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 168.91 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 168.91 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5c88e7e2-4830-487a-b92e-1d75b0dbc600") + ) + (pin "1" + (uuid "1c447345-7b2d-4163-a3fe-8e39a6f8b529") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 208.28 167.64 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "6ae627b4-d19f-4928-8bae-009d0c9e7123") + (property "Reference" "R5" + (at 208.28 165.1 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "220R" + (at 208.28 162.56 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 208.28 165.862 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 208.28 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 208.28 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "279-CRGCQ1206J220R" + (at 208.28 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 208.28 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 208.28 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "251c1065-b45c-4b33-8866-50f5a7b13a9f") + ) + (pin "1" + (uuid "10195b1e-527f-45dd-8608-1dbe044e1bca") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Generic:Conn_01x01") + (at 307.34 73.66 180) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "6f95ee96-9f0c-44d5-b33f-b06460e9b3c9") + (property "Reference" "J19" + (at 307.34 68.2457 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x01" + (at 307.34 70.6699 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 307.34 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 307.34 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 307.34 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 307.34 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 307.34 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 307.34 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "8e2c7671-9751-4356-acc0-fb66f8fea071") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J19") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:LM7805_TO220") + (at 210.82 20.32 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "70337f41-dcc5-4ecc-a40d-c82eca24546d") + (property "Reference" "U9" + (at 210.82 13.97 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM7805CT" + (at 210.82 16.51 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 210.82 14.605 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" + (at 210.82 21.59 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 20.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "926-LM7805CT/NOPB" + (at 210.82 20.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 210.82 20.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 210.82 20.32 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "2703fb99-5b18-45d6-ab8d-6eb9902672ab") + ) + (pin "2" + (uuid "6c12d86e-7605-48aa-a7a3-a4ede19a2b6a") + ) + (pin "1" + (uuid "9baccc04-043a-4147-8de3-c5ed57ce99c9") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 45.72 190.5 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "725c821b-cb8a-41f6-a417-320579bdc408") + (property "Reference" "R8" + (at 41.91 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "1K" + (at 44.45 186.69 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 47.498 190.5 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 45.72 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 45.72 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "CRCW12061K00JNEAC" + (at 45.72 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 45.72 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 45.72 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b9484aa5-de84-4f7f-8019-3a9eb3ca933b") + ) + (pin "1" + (uuid "cf29f854-6af7-45c1-9cca-73fece901c65") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:LED") + (at 31.75 177.8 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "72dbc197-f6d0-4e3b-8e57-a766302bba6d") + (property "Reference" "D3" + (at 35.56 178.1175 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "LED" + (at 35.56 180.6575 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Diode_SMD:D_1206_3216Metric" + (at 31.75 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 31.75 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 31.75 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "645-599-0220-007F" + (at 31.75 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 31.75 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 31.75 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "503a8963-3ef8-4836-9e0e-4f8de93e328b") + ) + (pin "1" + (uuid "89b8603c-dd77-4499-b8fa-3b5a549ac324") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "D3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Audio:PCM5102") + (at 198.12 241.3 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "73269b71-beaf-405b-b9b0-1dafd3f65c2c") + (property "Reference" "U5" + (at 196.85 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "PCM5102" + (at 193.04 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Package_SO:TSSOP-20_4.4x6.5mm_P0.65mm" + (at 196.85 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/pcm5102.pdf" + (at 196.85 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 198.12 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "595-PCM5102APWR" + (at 198.12 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 198.12 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 198.12 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "5" + (uuid "b20adeb2-ca94-4358-aa54-142f68dcf810") + ) + (pin "8" + (uuid "1a987550-43a1-4a8b-95ff-c37c8b60ff52") + ) + (pin "2" + (uuid "605b7f77-f3b4-4329-bfef-cf43859639bf") + ) + (pin "6" + (uuid "4d2002c8-8422-45d7-85f6-122815de5ffb") + ) + (pin "14" + (uuid "b711428a-3159-4ade-87c4-511df6f24235") + ) + (pin "1" + (uuid "c175e35f-eac2-404a-bb48-55d84e1fe9aa") + ) + (pin "13" + (uuid "97d44bfe-93a9-49e9-ab1e-e76d326c7ab3") + ) + (pin "9" + (uuid "c17904bf-a419-4a26-b19a-9ebd2204e8f0") + ) + (pin "10" + (uuid "a1829c2e-b6fb-4818-b355-4dce2f2d5367") + ) + (pin "11" + (uuid "51012e24-46b2-44eb-93df-20f45567b28c") + ) + (pin "12" + (uuid "35baa930-5bbf-465e-978b-c24e96bc2ba5") + ) + (pin "3" + (uuid "7828900d-dc89-41b6-81a3-0278ddf6f1b5") + ) + (pin "16" + (uuid "a3680923-bce3-4a4a-951b-d69c4aff339f") + ) + (pin "19" + (uuid "13e9197f-cfcf-49e6-9de1-92c60fa2fe8c") + ) + (pin "7" + (uuid "72645e00-b461-48a6-9e23-c1688ab53cc1") + ) + (pin "4" + (uuid "74e1307a-4a63-4f41-a0cb-305f5032bda2") + ) + (pin "15" + (uuid "54afd196-dcf6-4b40-8e26-9668de7234e0") + ) + (pin "20" + (uuid "c44201f9-e230-461e-beca-ad3e99848627") + ) + (pin "17" + (uuid "321ad53d-a063-4ec3-8f00-4acaa2a8d3aa") + ) + (pin "18" + (uuid "e145ec5b-b586-486f-871e-12c18f4fc7b5") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Audio:AudioJack3_SwitchTR") + (at 245.11 182.88 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "74df9d20-18b2-4f4f-a352-38b7fd9a6a07") + (property "Reference" "J16" + (at 243.205 174.9257 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Mic_In" + (at 243.205 177.3499 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:Jack_3.5mm_STX-3081_Horizontal" + (at 245.11 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 245.11 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 245.11 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "490-SJ1-3515N " + (at 245.11 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 245.11 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 245.11 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "RN" + (uuid "a99a42bc-0ce3-4801-8d5b-2cf511f5d15a") + ) + (pin "T" + (uuid "a4f66af5-5f6f-4a06-a007-7f7ab0adac0e") + ) + (pin "S" + (uuid "d099f1d5-52d3-4b58-81d7-672a9a80c7d0") + ) + (pin "R" + (uuid "835c1f6e-f102-4add-83ca-3b5c9898bc01") + ) + (pin "TN" + (uuid "444dfc78-b262-4e20-978c-9479d658599b") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Audio:AudioJack3_SwitchTR") + (at 269.24 234.95 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "760b170d-c028-47c1-8be8-24c0e5b09144") + (property "Reference" "J14" + (at 271.145 242.9043 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Rec_Out" + (at 271.145 240.4801 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:Jack_3.5mm_STX-3081_Horizontal" + (at 269.24 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 269.24 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 269.24 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "490-SJ1-3515N " + (at 269.24 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 269.24 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 269.24 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "RN" + (uuid "cde70b3b-1073-48b7-8734-215e016e4db0") + ) + (pin "T" + (uuid "17d18100-5d67-45c8-9157-6130595d4df2") + ) + (pin "S" + (uuid "21b5e927-5307-472f-89ed-c20ec978568d") + ) + (pin "R" + (uuid "d9404784-859b-4bcf-9a2d-eb9fba5b2907") + ) + (pin "TN" + (uuid "b5ea5e61-90d5-4f21-96f1-bba097af3692") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J14") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 210.82 264.16 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "768c65ff-675c-4948-b011-07f19dd17e2e") + (property "Reference" "#PWR037" + (at 210.82 270.51 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 214.63 266.7 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 210.82 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 210.82 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5f79e464-4012-4e0c-b687-5d0e51cddd3a") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR037") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 236.22 227.33 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "76950595-98c0-4812-bc47-3c883eede832") + (property "Reference" "C34" + (at 239.141 226.1179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2.2nF" + (at 239.141 228.5421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 237.1852 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 236.22 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 236.22 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C222K5RAC" + (at 236.22 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 236.22 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 236.22 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "938d14bd-94b1-4d97-aae3-3525c76a84b4") + ) + (pin "2" + (uuid "0c31f110-ba62-4335-aeb8-69cfc04b2788") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C34") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:IDC_2x5") + (at 191.77 170.18 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "77f861e2-eb49-403d-acaf-9d702f00110d") + (property "Reference" "J7" + (at 193.04 159.6857 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Display" + (at 193.04 162.1099 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 191.77 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 191.77 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 191.77 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 191.77 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-2939" + (at 191.77 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 191.77 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ef12d97c-4925-4ab7-af1d-85d2d0df222b") + ) + (pin "9" + (uuid "f4e43a59-38d4-4144-ac59-f4d77d500137") + ) + (pin "1" + (uuid "7839f111-d398-4ca0-b412-d17eb80e81a1") + ) + (pin "6" + (uuid "115aa4ba-8ecc-4a1a-bab7-ce3778f67c31") + ) + (pin "4" + (uuid "c93bf54e-4609-44ac-afe8-b91ee26b4c8e") + ) + (pin "5" + (uuid "6fcd61c3-fc0a-44ec-a397-acc399d8e6f3") + ) + (pin "3" + (uuid "2e422c3a-760e-40c8-a10b-60736bd03948") + ) + (pin "10" + (uuid "f5e74fc2-8664-4035-8f1d-ad7c15bbc8c1") + ) + (pin "8" + (uuid "5f76aab2-cbe9-4063-9c88-31b8d8f596af") + ) + (pin "7" + (uuid "81516e11-3dcc-42b2-b3e0-478da4780ccc") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 40.64 224.79 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "7ba304df-37ef-49f1-8f7c-f115152db1b2") + (property "Reference" "C23" + (at 33.02 222.25 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 27.94 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 41.6052 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 40.64 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 40.64 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 40.64 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 40.64 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 40.64 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f0fdc80c-d08c-4077-ac6d-3facff9870a2") + ) + (pin "1" + (uuid "fd2b7ded-9529-4e3a-a26e-989f7c203475") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C23") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:IDC_2x3") + (at 160.02 163.83 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7cfaae50-aa0f-4202-bab8-d65d21b19a00") + (property "Reference" "J23" + (at 162.052 161.3479 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "Ethernet" + (at 162.052 163.7721 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x03_P2.54mm_Vertical" + (at 160.02 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 157.48 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 160.02 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "710-61200621621" + (at 160.02 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 160.02 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 160.02 163.83 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "56279976-1515-4c41-a387-0a41a1c85063") + ) + (pin "2" + (uuid "8dadec33-f823-484a-a58f-5eacbd60e3b6") + ) + (pin "4" + (uuid "d028ed33-590b-4f9e-b906-56763bbbfd92") + ) + (pin "1" + (uuid "3d7ab75d-c346-4e2a-8cb4-dd5d94fd3c8a") + ) + (pin "3" + (uuid "05101d81-8c04-496f-9276-4894a151ba2a") + ) + (pin "5" + (uuid "1656dde1-cc04-4184-b82b-c0f95f3b0eab") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J23") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:IDC_2x5") + (at 48.26 114.3 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7fba9b0a-f038-4eaf-8072-bda16c8c42f9") + (property "Reference" "J11" + (at 49.53 102.87 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ENCODER" + (at 49.53 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 48.26 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 48.26 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 48.26 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 48.26 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-2939" + (at 48.26 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 48.26 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5f19288e-bf0e-4b6a-bda7-52a8821fed84") + ) + (pin "9" + (uuid "9b9e636b-729c-4bfb-83c5-1e553e0a2244") + ) + (pin "1" + (uuid "cc174f77-c2c8-4be0-b295-0419f1571f24") + ) + (pin "6" + (uuid "f98c20a7-0079-4361-9cde-ef2b362a96f7") + ) + (pin "4" + (uuid "f67c27aa-8ce3-4bb2-aea7-aa76ba36c936") + ) + (pin "5" + (uuid "6764f26e-7813-4c9f-b260-64fab26750df") + ) + (pin "3" + (uuid "faa97c44-2d0e-4ef6-94ea-cd9c629e9d88") + ) + (pin "10" + (uuid "d618ff00-0390-44ea-8699-c87300065518") + ) + (pin "8" + (uuid "b8cbc909-aa54-4e2f-a9a1-1344af587a12") + ) + (pin "7" + (uuid "ce17723b-ad16-4a6c-8d9b-7c2007e019e9") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Generic:Conn_01x02") + (at 306.07 33.02 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "80f108ad-e5c0-4b08-a4f5-6e2f9f5cdf44") + (property "Reference" "J1" + (at 306.07 25.0657 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "+12V" + (at 306.07 27.4899 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:PinHeader_1x02_P5.08mm_Vertical" + (at 306.07 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 306.07 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 306.07 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 306.07 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-662" + (at 306.07 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 306.07 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b267b1ec-ced3-4e0e-ab9c-9102eb688a52") + ) + (pin "2" + (uuid "96e6ad28-f12c-4139-a8a1-a30cc455c910") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 72.39 227.33 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "8433829e-6d49-43b2-97b9-33fe9bb30fe0") + (property "Reference" "#PWR023" + (at 72.39 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 72.39 232.41 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 72.39 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 72.39 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 72.39 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5eac83fa-13fc-4b56-8d95-6760c0d4a134") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR023") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 208.28 209.55 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "849e1db9-5cbf-4748-a45b-b9538c59d6bb") + (property "Reference" "#PWR032" + (at 208.28 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 210.82 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 208.28 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 208.28 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 208.28 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "eb01b8bf-04c0-4aae-8703-56aec6d32b0d") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR032") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 203.2 125.73 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "85892485-2b44-4101-950b-6edb17951a92") + (property "Reference" "#PWR043" + (at 203.2 132.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 203.2 123.19 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 203.2 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 203.2 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 203.2 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "32186749-9d1d-4a41-9694-7f3a685809fc") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR043") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 314.96 33.02 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "85aa4352-fd18-4642-9b2a-6256c33b7c86") + (property "Reference" "#PWR057" + (at 314.96 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 314.96 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 314.96 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 314.96 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 314.96 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "709f7c58-53f5-424e-b596-23e2388e836b") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR057") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Generic:Conn_01x01") + (at 307.34 83.82 180) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "85bd22ba-1dab-44c0-95f3-c2d9562b4eac") + (property "Reference" "J20" + (at 307.34 78.4057 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x01" + (at 307.34 80.8299 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 307.34 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 307.34 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 307.34 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 307.34 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 307.34 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 307.34 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b7bd53b1-9aa9-4aa4-a572-ac3111b2808b") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J20") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 181.61 146.05 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "89cbad2e-77d2-4d4d-8eae-888c7371a1c2") + (property "Reference" "#PWR049" + (at 181.61 152.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 181.61 143.51 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 181.61 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 181.61 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 181.61 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3a70daf0-6c77-465c-aea3-e7f6a249d1e1") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR049") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 85.09 251.46 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "8ff7c292-c2ec-44a4-8bc6-f0b37e68c73d") + (property "Reference" "R12" + (at 87.63 251.46 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "100R" + (at 90.17 251.46 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 86.868 251.46 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 85.09 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 85.09 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "652-CR1206FX-1000ELF" + (at 85.09 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 85.09 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 85.09 251.46 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "15e7ec2a-2ae4-4e0c-8ab5-507f290bee0b") + ) + (pin "1" + (uuid "85311655-873b-4e6d-b3cb-28dfd72dd2ee") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:PCM1808PW") + (at 95.25 236.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "91127158-12cf-4f8c-8141-e4fca249e398") + (property "Reference" "U6" + (at 95.25 220.98 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "PCM1808PW" + (at 95.25 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_SO:TSSOP-14_4.4x5mm_P0.65mm" + (at 95.25 250.19 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.ti.com/lit/ds/symlink/pcm1808.pdf" + (at 95.25 254 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 95.25 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "595-PCM1808PW" + (at 95.25 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 95.25 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 95.25 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "13" + (uuid "0ba48d06-b7a7-4775-8495-2cdb55d8d536") + ) + (pin "14" + (uuid "591de6d7-f2ea-422b-839e-77621df9f70f") + ) + (pin "12" + (uuid "2fb4224b-7509-4ab2-a087-4299c445ca2f") + ) + (pin "2" + (uuid "f35bee71-840f-4d76-8241-61629034a9cc") + ) + (pin "3" + (uuid "0d3351a1-ccf6-4fcd-9cfb-0cda1f4bc90e") + ) + (pin "10" + (uuid "c9b12f8d-b36c-4bff-b602-84cba941414d") + ) + (pin "1" + (uuid "6ce70cd0-4357-436e-af39-f1434a724fba") + ) + (pin "5" + (uuid "996874fc-ecc9-4a4f-8d9f-b561ba621f93") + ) + (pin "4" + (uuid "0c74a4d7-dafb-4aec-a0a1-26225ba8ce8f") + ) + (pin "11" + (uuid "23e3b2f1-cde1-4d13-a1c1-cc3211b26753") + ) + (pin "7" + (uuid "a79f3cb4-4421-457b-a181-67e028393930") + ) + (pin "9" + (uuid "0ee5b60d-6651-448f-9396-86cee3b9c158") + ) + (pin "8" + (uuid "41fda257-7afd-454e-b206-1af8bc8d659f") + ) + (pin "6" + (uuid "4a2121bb-8ecf-485f-b918-412fa9d654d9") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole_Pad") + (at 361.95 57.15 270) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "9261f4c5-839a-4c33-a065-5a90ba320edf") + (property "Reference" "H5" + (at 365.76 57.15 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 365.76 58.3621 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_4.3mm_M4_DIN965_Pad" + (at 361.95 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 361.95 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 361.95 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 361.95 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 361.95 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 361.95 57.15 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "fd4342f9-9f35-41f8-808f-009640104266") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 45.72 236.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "93d7474e-0100-402d-bd3b-1066fd889dac") + (property "Reference" "#PWR019" + (at 45.72 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 48.26 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 45.72 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 45.72 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 45.72 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "15bad419-a2c1-48da-ae2a-25c1d973bf3a") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR019") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 210.82 260.35 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "95fc2c1a-24d2-4cfc-ae61-c1b23a2bde24") + (property "Reference" "C28" + (at 213.36 260.35 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2.2uF 16V" + (at 212.09 262.89 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 211.7852 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 210.82 260.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 260.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C225K5R" + (at 210.82 260.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 210.82 260.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 210.82 260.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "59f7afe9-a436-4e89-9cfc-e4244392c3b6") + ) + (pin "1" + (uuid "f4b7f49b-b7a7-4bea-9588-b52b00c5c8d9") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C28") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 50.8 240.03 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "964ab0c0-a191-4437-ae5f-33ff2ec83d1b") + (property "Reference" "C18" + (at 54.61 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 16V" + (at 54.61 241.3 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 51.7652 243.84 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 50.8 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 50.8 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 50.8 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 50.8 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 50.8 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "6ce42bf1-85c7-44af-b2c0-0ba4d17b871e") + ) + (pin "1" + (uuid "6edfafe3-360a-4b41-872b-1c420a369248") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C18") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 154.94 34.29 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "978244e4-b245-4808-b800-43572ad096ee") + (property "Reference" "L2" + (at 153.67 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "10uH 20%" + (at 166.37 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Inductor_SMD:L_Bourns-SRN6028" + (at 154.94 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 154.94 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 154.94 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "81-1264EY-100MP3" + (at 154.94 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 154.94 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 154.94 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "be6bcc21-ddc9-45eb-81c3-a7a2ae2043ee") + ) + (pin "2" + (uuid "7a4d9cb3-90d8-4eec-aa16-bea91316552c") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x03_Socket") + (at 200.66 189.23 0) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "97a6986c-5ad2-46f6-9170-91ba6c1577ab") + (property "Reference" "J8" + (at 201.93 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Display Voltage" + (at 201.93 187.96 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" + (at 200.66 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 200.66 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 200.66 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 200.66 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 200.66 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 200.66 189.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1ed93035-380d-4ef8-9a3b-ae05c64cd235") + ) + (pin "1" + (uuid "f90537ee-366c-4abe-836b-c9815cd8b194") + ) + (pin "3" + (uuid "b471f1f0-3b33-441b-a5fc-4dd27700ca02") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 87.63 175.26 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9830c855-4273-4ad3-8c09-845df975b5f2") + (property "Reference" "#PWR066" + (at 87.63 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 83.82 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 87.63 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 87.63 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 87.63 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "94119294-735c-4026-bbbe-a1e6ba1afacd") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR066") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:LED") + (at 60.96 177.8 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "9cbc6729-70ae-448e-9714-02e3f31ccd5f") + (property "Reference" "D4" + (at 64.77 177.8 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "LED" + (at 64.77 180.6575 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Diode_SMD:D_1206_3216Metric" + (at 60.96 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 60.96 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 60.96 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "645-599-0220-007F" + (at 60.96 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 60.96 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 60.96 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b34e11f5-52e9-404f-8a22-561fb07fbf37") + ) + (pin "1" + (uuid "fc428ab1-9832-4b58-89da-a19945301708") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "D4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Mechanical:MountingHole_Pad") + (at 361.95 62.23 270) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a09693b5-bc9a-478b-8f96-8eee23b0219a") + (property "Reference" "H6" + (at 365.76 62.23 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "~" + (at 365.76 63.4421 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "MountingHole:MountingHole_4.3mm_M4_DIN965_Pad" + (at 361.95 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 361.95 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 361.95 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 361.95 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 361.95 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 361.95 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "f3c13bfd-bd47-455c-849e-91c6447355f7") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "H6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 264.16 59.69 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a1686572-9323-403b-87cf-f144e61430ee") + (property "Reference" "#PWR07" + (at 264.16 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 264.16 54.61 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 264.16 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 264.16 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 264.16 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e3e18a98-c02d-4fe2-8ce3-978058dd97a5") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR07") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 158.75 88.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a1a1ac29-07aa-49f5-9be1-84baf5aff465") + (property "Reference" "C11" + (at 162.56 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 160.02 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 159.7152 92.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 158.75 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 158.75 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 158.75 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 158.75 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 158.75 88.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "16bf3072-96e5-45f6-bf39-206dfbf83e0e") + ) + (pin "1" + (uuid "78fd77c2-0abd-4667-8dd0-7a46e2606f08") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C11") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 185.42 186.69 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "a56a1cf2-28ad-4934-8593-9c970eab29a6") + (property "Reference" "#PWR047" + (at 185.42 190.5 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 185.42 182.88 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 185.42 186.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 185.42 186.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 185.42 186.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2bbfeb65-a17b-455a-8cd1-e034dc38df43") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR047") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C_Polarized") + (at 222.25 41.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "abbf3a1f-cc73-40d3-9eae-4da5531c2e00") + (property "Reference" "C1" + (at 226.06 39.751 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "470uF 25V" + (at 226.06 42.291 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_THT:CP_Radial_D10.0mm_P5.00mm" + (at 223.2152 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 222.25 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 222.25 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "667-ECA-1EM471" + (at 222.25 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 222.25 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 222.25 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "44329590-9fc4-40fa-8e18-c93b6e6bc50a") + ) + (pin "1" + (uuid "fdb88386-193b-49c4-8922-c987a4bd2893") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 259.08 238.76 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "abde7426-de07-4efe-8e48-cd8d6766ffd6") + (property "Reference" "#PWR027" + (at 259.08 245.11 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 257.81 242.57 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 259.08 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 259.08 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 259.08 238.76 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "821338f3-28fc-49e2-9379-a77721bd720b") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR027") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 175.26 177.8 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ac1f4fd7-7776-4a5e-9336-95046aa8f325") + (property "Reference" "C12" + (at 179.07 176.53 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 16V" + (at 176.53 180.34 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 176.2252 181.61 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 175.26 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 175.26 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 175.26 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 175.26 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 175.26 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "f5dcc65c-681a-40f8-9a48-a7605cd5d3a3") + ) + (pin "1" + (uuid "28422591-cc89-401c-b63e-28ac43602d4b") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C12") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 171.45 248.92 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ad2912aa-d806-4ba9-b7ef-789f54368b8c") + (property "Reference" "R7" + (at 171.45 246.38 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "2K2" + (at 171.45 243.84 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 171.45 247.142 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 171.45 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 171.45 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "CRCW12062K20JNEAC" + (at 171.45 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 171.45 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 171.45 248.92 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1afbcd00-741a-4390-94c9-6b50c6062030") + ) + (pin "1" + (uuid "8508b1aa-24b0-4c00-a03c-2565f6178ad9") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 177.8 170.18 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "adaac335-f179-44a2-849e-7d3093795bba") + (property "Reference" "R4" + (at 177.8 167.64 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "220R" + (at 177.8 165.1 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 177.8 168.402 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 177.8 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 177.8 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "279-CRGCQ1206J220R" + (at 177.8 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 177.8 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 177.8 170.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "5a0bc03b-ca63-48b1-8a2e-3db6099931b8") + ) + (pin "1" + (uuid "326edac3-adfd-42f5-8006-2dd10c92107b") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 323.85 73.66 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ae5ee808-4e4f-4405-8334-a97fe422b1f2") + (property "Reference" "#PWR061" + (at 323.85 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 323.85 77.7931 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 323.85 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 323.85 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 323.85 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "924d51bc-f1f7-44fc-abd2-421bdfe1b2b3") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR061") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 128.27 43.18 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b22b4591-7616-411d-9d77-b36e2c51f81f") + (property "Reference" "R1" + (at 130.81 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10K" + (at 130.81 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 126.492 43.18 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 128.27 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 128.27 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "CRCW120610K0FKEB" + (at 128.27 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 128.27 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 128.27 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d8beb851-4379-40f8-a654-10201eb6fcee") + ) + (pin "1" + (uuid "6bb1baa6-1152-4d9a-8113-f6891d247390") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:L") + (at 251.46 59.69 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b2858ee3-b68b-4fcb-afd3-6bc6da45cd05") + (property "Reference" "L3" + (at 251.46 54.61 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uH 20%" + (at 251.46 57.15 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Inductor_SMD:L_Bourns-SRN6028" + (at 251.46 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 251.46 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 251.46 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "81-1264EY-100MP3" + (at 251.46 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 251.46 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 251.46 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "320f005b-acba-4c9a-a693-a70f65d917d9") + ) + (pin "2" + (uuid "cbc44ee1-8305-46bd-92aa-ca5e96138556") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "L3") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 322.58 53.34 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b346306a-5ab6-4aa4-9c35-6a7e54e470ea") + (property "Reference" "#PWR026" + (at 322.58 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 322.58 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 322.58 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 322.58 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "2c281adc-9406-4752-9f0b-4df7583d7ee9") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR026") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 210.82 27.94 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "b66e9758-3181-443e-8b6d-fc58b67666ee") + (property "Reference" "#PWR062" + (at 210.82 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 213.36 29.21 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 210.82 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 210.82 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 27.94 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "860e6b39-80be-4187-a320-63b46a6611ed") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR062") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 306.07 58.42 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b7f0cda8-f943-4dde-a0fa-349572e4bc94") + (property "Reference" "#PWR025" + (at 306.07 64.77 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 306.07 63.5 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 306.07 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 306.07 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 306.07 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "6cb5121b-c231-4b28-9be6-674a8d24f80e") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR025") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 240.03 41.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "bc6ef2cb-a847-4253-b06d-215e6d6af04a") + (property "Reference" "C2" + (at 243.84 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 243.84 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 240.9952 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 240.03 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 240.03 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 240.03 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 240.03 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 240.03 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "1911a329-3138-421e-a60a-e1fbbd818077") + ) + (pin "1" + (uuid "77af9959-3811-4475-9b28-0446fbd54778") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Transistor_FET:IRF4905") + (at 142.24 43.18 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "be5997e2-6c82-4a9f-ad38-eac7aa5e5993") + (property "Reference" "Q4" + (at 139.954 34.544 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "SUP90P06-09L" + (at 138.938 36.576 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 140.335 38.1 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (justify left) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.com/pdf/datasheet/fqp47p06-d.pdf" + (at 142.24 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + (hide yes) + ) + ) + (property "Description" "" + (at 142.24 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 142.24 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 142.24 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 142.24 43.18 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "49a3dce0-1aa5-4725-b25c-417dc76eb2ee") + ) + (pin "3" + (uuid "4ee43b3a-2b5d-4f53-92cb-26a5d293824b") + ) + (pin "1" + (uuid "8cabd143-ed60-4282-9c66-3ab7122539e3") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "Q4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 45.72 173.99 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c0234e41-f097-48c0-8a15-58f9da8314d5") + (property "Reference" "#PWR04" + (at 45.72 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 45.72 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 45.72 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 45.72 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 45.72 173.99 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "79a6ba68-684f-4ed5-8d3e-fd04aae757cb") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR04") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:LM7805_TO220") + (at 210.82 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c18341db-0b6a-426c-a143-af24ef423f00") + (property "Reference" "U1" + (at 210.82 31.75 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM7805CT" + (at 210.82 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 210.82 32.385 0) + (effects + (font + (size 1.27 1.27) + (italic yes) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" + (at 210.82 39.37 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "926-LM7805CT/NOPB" + (at 210.82 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 210.82 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 210.82 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "33a774f5-2bd1-44dc-b1ca-1ff586e7ad73") + ) + (pin "2" + (uuid "3c284809-ec9f-4fda-9b6a-ea325f4881c1") + ) + (pin "1" + (uuid "58463ff0-fbd7-4c76-997c-be6556632ad9") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 194.31 38.1 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c44c51e7-8e1c-49a6-9bf6-fecd02692bf4") + (property "Reference" "#PWR012" + (at 194.31 41.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 194.31 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 194.31 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 194.31 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 194.31 38.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "7a0eb818-4de2-460d-a2fa-09a18aa86b42") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR012") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 156.21 209.55 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c56f9723-e98e-4143-bac7-d1722fb1f709") + (property "Reference" "#PWR030" + (at 156.21 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 158.75 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 156.21 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 156.21 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 156.21 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "e4427925-2326-4cf3-bc26-1d197c7dbc00") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR030") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 314.96 30.48 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c57ef3dd-ae59-4baf-bae5-37103f1e86ef") + (property "Reference" "#PWR055" + (at 314.96 34.29 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 314.96 25.4 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 314.96 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 314.96 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 314.96 30.48 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "b6d3f4fb-9a1c-425b-bc5c-05aa3fd0f932") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR055") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 228.6 67.31 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c645da4c-81a4-40c8-bb9e-d5919b1a7835") + (property "Reference" "#PWR09" + (at 228.6 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 228.6 72.39 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 228.6 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 228.6 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 228.6 67.31 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "0aaf0566-a848-4fb4-a8f7-6cb59593bffa") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR09") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:IDC_2x3") + (at 80.01 165.1 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c66e74fc-65dc-4547-aed1-c27c3ac6634c") + (property "Reference" "J24" + (at 82.042 162.6179 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "USBHost" + (at 82.042 165.0421 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x03_P2.54mm_Vertical" + (at 80.01 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 77.47 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 80.01 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "710-61200621621" + (at 80.01 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 80.01 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 80.01 165.1 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "80f56192-a530-4af8-81e6-3f3b37f6e2cd") + ) + (pin "2" + (uuid "1cc7b23a-96aa-4476-b788-0bff04a06dfd") + ) + (pin "4" + (uuid "96584c41-b262-4b59-8381-79f4f3169372") + ) + (pin "1" + (uuid "bb13ebc9-a7ad-48f9-bb47-dbf31aac1d63") + ) + (pin "3" + (uuid "e3ee5539-a8fc-49d8-be50-b746552a48e8") + ) + (pin "5" + (uuid "82d180c6-6efe-45c5-9ec6-4451f5b9f9c5") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+12V") + (at 306.07 45.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c840b78f-ce59-468a-abcb-036938a9bc41") + (property "Reference" "#PWR024" + (at 306.07 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+12V" + (at 306.07 40.64 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 306.07 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 306.07 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 306.07 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5223b46f-d450-4f7f-93f2-9cf8e51e74d2") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR024") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3V3") + (at 181.61 209.55 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c88df2a5-08a3-40cb-95a3-bfc5090ec968") + (property "Reference" "#PWR035" + (at 181.61 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+3V3" + (at 184.15 207.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 181.61 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 181.61 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 181.61 209.55 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "86cfce66-9b00-4618-9af9-fcd53ad17448") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR035") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 179.07 215.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "c8e9029e-e013-446d-b299-50c3a90b24b5") + (property "Reference" "C24" + (at 172.72 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 168.91 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 180.0352 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 179.07 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 179.07 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 179.07 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 179.07 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 179.07 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "d00e8fe8-7efa-49fc-be08-1d01483c1574") + ) + (pin "1" + (uuid "fdf6931f-0721-411f-9c30-f223a4e77abd") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C24") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 182.88 219.71 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "cb1f2572-3f94-44e7-b2e3-43d7008520f3") + (property "Reference" "#PWR034" + (at 182.88 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 182.88 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 182.88 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 182.88 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 182.88 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "de945683-f06e-4460-aef7-6b310654a676") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR034") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 210.82 219.71 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ccd52c5a-7d7a-4434-a982-0910ef9c530e") + (property "Reference" "#PWR033" + (at 210.82 226.06 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 210.82 224.79 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 210.82 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 210.82 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ef3226e9-11ad-473c-a408-0cabd1e0cf70") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR033") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 226.06 259.08 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ccfb07e8-18cc-4b86-8f92-9d83e95c222e") + (property "Reference" "#PWR036" + (at 226.06 265.43 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 226.06 264.16 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 226.06 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 226.06 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 226.06 259.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "03508cc9-4cc7-42ae-b754-c382536a7df4") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR036") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:Teensy4.1") + (at 116.84 146.05 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "cd7159d6-1211-4e8a-b6c4-524f929682cd") + (property "Reference" "U8" + (at 116.84 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Teensy4.1" + (at 116.84 82.55 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:Teensy41" + (at 106.68 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 106.68 135.89 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 116.84 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 116.84 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 116.84 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "TEENSY41" + (at 116.84 146.05 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "38" + (uuid "79d6abc8-3acb-4a71-a78b-f342d64e4f13") + ) + (pin "61" + (uuid "62113e69-c785-45bf-9487-8d6887cfcb51") + ) + (pin "47" + (uuid "14b0d13d-b294-47b2-a09a-06d4fcf10e4b") + ) + (pin "9" + (uuid "84734a58-5e4a-4140-a4d5-02cb7c3e2e2b") + ) + (pin "18" + (uuid "509b2268-058c-40c3-9c79-2b67d7155d17") + ) + (pin "19" + (uuid "6defa762-c3cb-430b-8b5e-b467ad5e2d27") + ) + (pin "33" + (uuid "08441aa7-9176-4a7e-9988-cb7f1eea3499") + ) + (pin "7" + (uuid "245f6c57-6890-4856-9e68-4407c9f6eb43") + ) + (pin "3" + (uuid "9bcd5e3d-eb8d-4a09-8562-ec67c593fb8d") + ) + (pin "42" + (uuid "90ad113a-5012-429c-946f-865f6c085811") + ) + (pin "35" + (uuid "645e44eb-2392-4860-8b12-d53806e5447b") + ) + (pin "37" + (uuid "83472a33-0483-43ee-bdef-22b941724b79") + ) + (pin "24" + (uuid "cbb40062-01ee-4795-9d0d-39c04bbcf6af") + ) + (pin "31" + (uuid "22d83ad7-d7f2-41f1-855a-0ba8ff3798fa") + ) + (pin "15" + (uuid "6e163a82-365a-451f-81c7-0daf5d03e1b6") + ) + (pin "14" + (uuid "24d1fca7-cb9c-4388-bb9b-2b4cbdf9624d") + ) + (pin "8" + (uuid "ec11a79d-cfcd-4807-afb4-699c536ef888") + ) + (pin "63" + (uuid "21c31415-6ed5-4429-b9a9-5217919e37d7") + ) + (pin "17" + (uuid "c25eaca5-7577-4823-9325-f0c25ab3e404") + ) + (pin "10" + (uuid "8ef49a54-ed86-48fe-9261-05702b66d7d5") + ) + (pin "27" + (uuid "651e8690-27e4-429a-83e6-162e6f7af082") + ) + (pin "34" + (uuid "3ee5d135-389f-41d8-962d-22754d9b80cf") + ) + (pin "16" + (uuid "71be891d-6d83-4524-aabd-54eb7756906a") + ) + (pin "28" + (uuid "9b9db1e5-ab8f-4b71-8065-f88e20c77dc2") + ) + (pin "13" + (uuid "97a3ef3c-d586-48aa-8a2e-942fa5e2dd17") + ) + (pin "6" + (uuid "cef375ed-06e2-4f3e-842b-0504e85532d5") + ) + (pin "23" + (uuid "6ca199fc-a516-419c-8fd0-ef9194ea4b5e") + ) + (pin "25" + (uuid "e6f99728-94da-47ba-803f-3c8948cf9d2f") + ) + (pin "22" + (uuid "95f9f981-a094-411c-a25e-ad2e5876c3e7") + ) + (pin "20" + (uuid "664cbc04-055b-4a76-bd6f-d3df34678382") + ) + (pin "2" + (uuid "462c2874-b509-4205-bb4f-e255d605914a") + ) + (pin "29" + (uuid "61f8e172-108b-490b-a977-fff508940695") + ) + (pin "11" + (uuid "db501c9c-6318-435a-9476-de47252b463a") + ) + (pin "60" + (uuid "c1661b3e-2171-4260-9d47-8f0ddb6a17e0") + ) + (pin "26" + (uuid "aa804c32-3e84-4b47-a555-09462ee2bc91") + ) + (pin "21" + (uuid "6cd33f98-b7fb-4b40-96e8-2d8c723f9b8b") + ) + (pin "43" + (uuid "17184fc5-08ed-4608-8494-ee7a6f0c7032") + ) + (pin "32" + (uuid "2a64f04d-b582-4d0c-ac33-74e0db1cfa21") + ) + (pin "62" + (uuid "7c2b5e04-f907-4471-a3af-8f72b4174ebd") + ) + (pin "36" + (uuid "8850b049-9661-469e-9358-48d6b15d7f01") + ) + (pin "4" + (uuid "1499264a-e9d3-4171-b8ba-388a1f7d9ad1") + ) + (pin "41" + (uuid "0e78b325-a044-47b4-8eaf-5efee3eb1280") + ) + (pin "39" + (uuid "1d818f37-43a9-4839-8481-d0c0d00f5179") + ) + (pin "44" + (uuid "7ba7252c-df38-4b7c-9b2d-87369558d6c3") + ) + (pin "40" + (uuid "16d76d5d-76a4-4a48-b59e-c4db099e539a") + ) + (pin "58" + (uuid "f8ea81a5-5b75-4380-88ef-358213d52a92") + ) + (pin "12" + (uuid "66d243a9-3613-4635-86aa-596dd8e546fe") + ) + (pin "30" + (uuid "83fb9ef5-932a-4a51-9da5-3f18a36f553f") + ) + (pin "46" + (uuid "81cfe92e-62d2-41df-80af-65f2fb4f3695") + ) + (pin "1" + (uuid "056a5f39-50bc-489a-8f45-aea0f9688a38") + ) + (pin "65" + (uuid "e1b845bd-0faa-4c33-a0fc-f17ecd92ac43") + ) + (pin "45" + (uuid "27ec0422-4885-4137-8747-ac8536ecf435") + ) + (pin "64" + (uuid "fe687732-c8c6-4dcb-9c74-cca9ae055d42") + ) + (pin "57" + (uuid "2098e4ca-0790-479f-a890-008604a2bd2e") + ) + (pin "55" + (uuid "61220229-fbd9-4c0f-8260-5eb8b11b5998") + ) + (pin "48" + (uuid "c33db9f5-45b4-4430-8b53-c52daf28309a") + ) + (pin "56" + (uuid "4f9e6311-5a50-41c4-a200-d3ef2a662ad5") + ) + (pin "5" + (uuid "fd06b163-6105-4c2a-bf7f-2a949de52cc0") + ) + (pin "59" + (uuid "f608ae85-a2a2-425d-a20a-5fc1b4f661c2") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U8") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 220.98 233.68 270) + (mirror x) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ce92d987-e9e2-40d2-84dc-53c321021ff6") + (property "Reference" "R10" + (at 220.98 236.22 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "470R" + (at 220.98 238.76 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 220.98 235.458 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 220.98 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 220.98 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "CRCW1206470RJNEAC" + (at 220.98 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 220.98 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 220.98 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2b4f674b-7ee3-4796-b848-07da4273fc34") + ) + (pin "1" + (uuid "4e58de1b-5214-4da4-8891-7a5972699003") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 111.76 45.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ced616dd-d5a2-4fe5-809d-22f3facbc8d7") + (property "Reference" "C5" + (at 115.57 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "1uF 50V" + (at 115.57 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 112.7252 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 111.76 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 111.76 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "187-CL31B105KBHNNNE" + (at 111.76 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 111.76 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 111.76 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b41bd380-583f-47b4-8ad3-43ec768f38c8") + ) + (pin "1" + (uuid "58052d73-959b-4a95-a7c4-fd52e055819f") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C5") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 161.29 62.23 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "d02193b4-5d09-4de3-be9d-5c17f0f4f0f1") + (property "Reference" "R16" + (at 163.068 61.0179 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "100k" + (at 163.068 63.4421 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 159.512 62.23 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 161.29 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 161.29 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "71-CRCW1206100KFKEB" + (at 161.29 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 161.29 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 161.29 62.23 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "56caface-2db5-492c-876f-05b2537882dd") + ) + (pin "2" + (uuid "e1711c82-0112-4103-a834-29f52f97ff2c") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R16") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 73.66 52.07 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d199a61b-5ed8-4d9c-b6c0-65a8751e4408") + (property "Reference" "C10" + (at 81.28 50.8 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 81.28 48.26 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 77.47 51.1048 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 73.66 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 73.66 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 73.66 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 73.66 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 73.66 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "ea621965-380b-4b38-a299-ced01fd1273b") + ) + (pin "1" + (uuid "0a86feda-85eb-45b3-bd2b-a231b318b1bb") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:Teensy_Audio_Adaptor") + (at 262.89 128.27 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board no) + (dnp no) + (uuid "d21c1a65-0f6f-47cc-9588-53831cb1238e") + (property "Reference" "U7" + (at 266.7 125.73 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Teensy_Audio_Adaptor" + (at 256.54 120.65 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 252.73 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 252.73 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 262.89 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 262.89 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-4662" + (at 262.89 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "TEENSY4_AUDIO" + (at 262.89 128.27 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "21" + (uuid "e7e4e595-dc51-433b-a184-15ed77901e6f") + ) + (pin "7" + (uuid "941612fc-1832-4762-a485-61d47f16dfd4") + ) + (pin "20" + (uuid "69857eac-d24d-46d6-a697-bf745f523719") + ) + (pin "19" + (uuid "355f2527-7852-4dc2-a2a0-50928b854e22") + ) + (pin "3" + (uuid "d4b557f7-df0a-4d5e-a7ef-125a2356a26a") + ) + (pin "1" + (uuid "0569ce71-8590-4651-be6f-1f8117ba6aa5") + ) + (pin "2" + (uuid "285349f6-3283-4d3a-89e5-b69a1578c09d") + ) + (pin "23" + (uuid "20b7ffc2-575a-4c22-95d9-15a656377906") + ) + (pin "8" + (uuid "286050b0-e767-474f-8432-e38f33f25fe0") + ) + (pin "18" + (uuid "9ecbdc50-aaa9-49c3-b182-a676a5e39d9d") + ) + (pin "4" + (uuid "65092908-c4e0-4e14-b9f0-99b6b2f461cf") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U7") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 132.08 195.58 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d499cf5f-77f4-4248-9dea-463328a2ce12") + (property "Reference" "#PWR067" + (at 132.08 199.39 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "+5V" + (at 128.27 194.31 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 132.08 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 132.08 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 132.08 195.58 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "9d18b77e-3dd5-4292-b400-fb98cf87cc46") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR067") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 68.58 223.52 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "d67d77ac-cbe8-4424-84e6-c61030ddeefe") + (property "Reference" "C26" + (at 66.04 213.36 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "0.1uF 50V" + (at 60.96 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 69.5452 227.33 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 68.58 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 68.58 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "C1206C104K5RACTU" + (at 68.58 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 68.58 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 68.58 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "2cf9fc30-1bba-436d-875b-e8744841eb4f") + ) + (pin "1" + (uuid "d4f9f356-19d9-41ce-b802-fb572db8cb67") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C26") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 107.95 53.34 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "d8ba317e-972f-405a-9c1e-ddb6553a244a") + (property "Reference" "#PWR011" + (at 107.95 59.69 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 107.95 58.42 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 107.95 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 107.95 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 107.95 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ac4021e7-0aab-4ad9-b37a-47664ec9cf5a") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR011") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 203.2 109.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "dadef526-c2a7-4ee1-9905-8e7efaa489d2") + (property "Reference" "#PWR041" + (at 203.2 115.57 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 207.01 110.49 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 203.2 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 203.2 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 203.2 109.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "5f33419a-eafa-42e1-94ab-bf54e1067fa8") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR041") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Motor:Fan") + (at 378.46 80.01 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board no) + (dnp no) + (fields_autoplaced yes) + (uuid "e174a3c1-cce5-4ce1-9e66-318907ec9025") + (property "Reference" "M1" + (at 382.4732 78.7979 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Fan" + (at 382.4732 81.2221 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 378.46 79.756 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 378.46 79.756 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 378.46 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "664-AD0412HXK96XT1 " + (at 378.46 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 378.46 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 378.46 80.01 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "00268e93-4ce7-4270-bea6-35ab220a5335") + ) + (pin "1" + (uuid "4740e35a-1092-4f80-beff-0ea328203a6d") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "M1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 236.22 236.22 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e2a0fa17-5706-4ddd-8e8d-a5f7398ac7fc") + (property "Reference" "C32" + (at 239.141 235.0079 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "2.2nF" + (at 239.141 237.4321 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 237.1852 240.03 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 236.22 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 236.22 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C222K5RAC" + (at 236.22 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 236.22 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 236.22 236.22 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "de386dc6-4ba6-4141-af10-defbb317f743") + ) + (pin "2" + (uuid "c504b7e9-25f9-4d89-8cf8-c1f1c67b8aab") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C32") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 247.65 223.52 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e2b1f801-9bf9-4d2a-b740-be31186c7334") + (property "Reference" "C33" + (at 247.65 217.2167 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "10uF 16V" + (at 247.65 219.6409 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 251.46 222.5548 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 247.65 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 247.65 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 247.65 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 247.65 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 247.65 223.52 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "00a743c5-4c36-4b92-b014-3af18a4bfdea") + ) + (pin "2" + (uuid "b03c8037-4ada-4711-9c79-bf2f02a44105") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C33") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 227.33 45.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e2d8cdab-7303-40ad-b7cb-d50a49fbb54e") + (property "Reference" "#PWR08" + (at 227.33 52.07 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 227.33 50.8 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 227.33 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 227.33 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 227.33 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "c983237c-14ef-4435-abfb-f6e097cde4d7") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR08") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:IDC_2x3") + (at 191.77 153.67 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e38ffa3f-ef24-43d7-b294-180818bb5eaf") + (property "Reference" "J9" + (at 193.04 142.24 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Keys/PTT" + (at 193.04 144.78 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x03_P2.54mm_Vertical" + (at 191.77 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 191.77 151.13 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 191.77 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 191.77 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 191.77 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 191.77 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "6" + (uuid "a99cd7d0-7066-4f52-9eb5-eda3523bd2d3") + ) + (pin "2" + (uuid "e3f9c6e7-c7aa-4f54-b28b-2d5ec3b50c7f") + ) + (pin "4" + (uuid "2a6775ec-fa7b-49c2-b403-e8d160bd5023") + ) + (pin "1" + (uuid "b1b4aa28-cff6-4d27-984c-95dfebadedcd") + ) + (pin "3" + (uuid "a73e99cb-fee1-4a67-acb4-f7ffe917d8a5") + ) + (pin "5" + (uuid "f9fc2e58-e8ae-40f3-9cc1-2906310eb885") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J9") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 83.82 85.09 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e42dee9f-6d65-40b2-b5f4-6afdd00d7925") + (property "Reference" "#PWR050" + (at 83.82 91.44 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 83.82 89.2231 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 83.82 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 83.82 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 83.82 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "17ba429e-4d48-463a-905b-2339228d0af4") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR050") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 38.1 162.56 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e61512d4-f7ca-4185-972b-90f37d456764") + (property "Reference" "#PWR03" + (at 38.1 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 38.1 167.64 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 38.1 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 38.1 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 38.1 162.56 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "ed7af3e4-b8ed-4bab-ac7d-beb65b540ebe") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR03") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Generic:Conn_01x02") + (at 322.58 33.02 180) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e694a2b0-f737-488a-b824-36210f4ba189") + (property "Reference" "J4" + (at 322.58 25.0657 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "12-13.8V" + (at 322.58 27.4899 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "T41_Library:PinHeader_1x02_P5.08mm_Vertical" + (at 322.58 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 322.58 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 322.58 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 322.58 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-662" + (at 322.58 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 322.58 33.02 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "3392187e-0b02-4037-a7b3-8da1506e8cab") + ) + (pin "2" + (uuid "abefbdcf-0dc0-4d1c-a5d3-947710d23aad") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 91.44 45.72 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "eb62fb1c-b44a-4178-85b1-9e44c8046429") + (property "Reference" "C4" + (at 95.25 44.45 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 16V" + (at 95.25 46.99 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 92.4052 49.53 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 91.44 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 91.44 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 91.44 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 91.44 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 91.44 45.72 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "bac2b85c-fd8f-46f4-bbf5-699b706386b2") + ) + (pin "1" + (uuid "de4d3095-f800-4f59-8c33-11c0c82b3722") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C4") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:LED") + (at 45.72 177.8 90) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "eb6dc20f-9d1e-4d0f-a15d-44ada69bc360") + (property "Reference" "D2" + (at 49.53 178.1175 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "LED" + (at 49.53 180.6575 90) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Diode_SMD:D_1206_3216Metric" + (at 45.72 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 45.72 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 45.72 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "645-599-0220-007F" + (at 45.72 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 45.72 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 45.72 177.8 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "b1b764a5-16c2-4ff5-ab9a-4b310a5fdcba") + ) + (pin "1" + (uuid "66fbe7f7-40c3-4b20-b8e2-d3485b733a33") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "D2") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:C") + (at 212.09 215.9 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "ebc2721e-976e-4c1d-9369-6fe7a85da047") + (property "Reference" "C17" + (at 215.9 214.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "10uF 16V" + (at 213.36 218.44 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Capacitor_SMD:C_1206_3216Metric" + (at 213.0552 219.71 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 212.09 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 212.09 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "80-C1206C106K4P" + (at 212.09 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 212.09 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 212.09 215.9 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "16820c73-827c-4e3a-a88f-ce7b2220c1b1") + ) + (pin "1" + (uuid "f53d132e-718d-45f4-a655-aef91e56a7ee") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "C17") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "T41:IDC_2x5") + (at 191.77 114.3 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f2b148c6-43f3-47e1-a203-bd20dcf7c569") + (property "Reference" "J6" + (at 200.66 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "RF CONTROL" + (at 193.04 105.41 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical" + (at 191.77 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 191.77 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 191.77 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 191.77 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "A-2939" + (at 191.77 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 191.77 114.3 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "3b1ba286-7266-4920-8d1a-70f8a61c1519") + ) + (pin "9" + (uuid "a29b33ae-1f3f-48fa-82cf-f4ac88aacba6") + ) + (pin "1" + (uuid "a47449b8-16bb-4358-99f5-da7149847c2c") + ) + (pin "6" + (uuid "dbc50070-3cf6-44b4-bdf2-33b9f547bd30") + ) + (pin "4" + (uuid "6a541bf2-fbdd-4cce-8e15-8adbf29be1ef") + ) + (pin "5" + (uuid "eec1a9eb-5dae-4e8d-b9a8-79c413ec2d48") + ) + (pin "3" + (uuid "044b085e-75db-4efa-8a4d-5c88b4b7d4ad") + ) + (pin "10" + (uuid "4f846dd2-0d20-45c3-b616-2910acc66af7") + ) + (pin "8" + (uuid "274417f2-666c-4413-92d5-322f289f05fa") + ) + (pin "7" + (uuid "e395fb8c-2cd7-4663-9381-51a35e741be0") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J6") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 41.91 228.6 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f2cd331d-5703-48a6-83cd-1447bd5e9ffc") + (property "Reference" "#PWR022" + (at 41.91 234.95 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 41.91 233.68 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 41.91 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 41.91 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 41.91 228.6 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "57395849-ec7b-4fc3-84d3-789a4e534cc5") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR022") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 58.42 168.91 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f5bce3fe-ef39-4cf5-af46-74d222a7c0a8") + (property "Reference" "#PWR058" + (at 58.42 175.26 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 58.42 173.0431 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 58.42 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 58.42 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 58.42 168.91 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "492c3584-bbfa-4cde-8bcf-71b36aa17751") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR058") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Regulator_Linear:LM1117T-3.3") + (at 210.82 77.47 0) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp yes) + (fields_autoplaced yes) + (uuid "f69845bb-74db-4e47-9f67-0a4377a32cb5") + (property "Reference" "U10" + (at 210.82 71.12 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LM1117T-3.3" + (at 210.82 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" + (at 210.82 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "http://www.ti.com/lit/ds/symlink/lm1117.pdf" + (at 210.82 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 210.82 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "926-LM1117T-3.3/NOPB" + (at 210.82 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 210.82 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 210.82 77.47 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "3" + (uuid "16b17c02-0ca4-431d-a134-e3665ef98485") + ) + (pin "2" + (uuid "c7975eb9-d88f-47b6-b108-58e3f487a857") + ) + (pin "1" + (uuid "c3968d6d-18b1-4e7f-8f28-d19d20e8f88d") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "U10") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 154.94 152.4 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "f7119242-7bc5-4d3e-94a6-351ec54d263c") + (property "Reference" "#PWR064" + (at 154.94 158.75 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 151.13 153.67 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 154.94 152.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 154.94 152.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 154.94 152.4 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "98b4b5ea-6216-4a69-9ae0-28f7634a5f04") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR064") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 312.42 83.82 0) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f8705089-e5c8-4e11-8af4-7626aef18510") + (property "Reference" "#PWR060" + (at 312.42 90.17 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 312.42 87.9531 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 312.42 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 312.42 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 312.42 83.82 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "1d1dfdb9-fbd6-4700-b0da-9e6fcaf00116") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "#PWR060") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Device:R") + (at 220.98 231.14 270) + (unit 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid "fad4bbaf-c2ae-48b9-981d-dae44889d54a") + (property "Reference" "R13" + (at 220.98 228.6 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "470R" + (at 220.98 226.06 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Resistor_SMD:R_1206_3216Metric" + (at 220.98 229.362 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 220.98 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 220.98 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "CRCW1206470RJNEAC" + (at 220.98 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 220.98 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 220.98 231.14 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "2" + (uuid "e1175e21-4e37-4bbb-bd6f-b94d5cd14518") + ) + (pin "1" + (uuid "1bff7f62-fd1c-4723-8bfb-f1aaf97621f5") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "R13") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector_Generic:Conn_01x01") + (at 318.77 73.66 180) + (unit 1) + (exclude_from_sim no) + (in_bom no) + (on_board yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fd11efcb-58fc-4d57-89e5-54962e04522a") + (property "Reference" "J21" + (at 318.77 68.2457 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x01" + (at 318.77 70.6699 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical" + (at 318.77 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 318.77 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "" + (at 318.77 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Mouser" "" + (at 318.77 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Tayda" "" + (at 318.77 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "PJRC.com" "" + (at 318.77 73.66 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (pin "1" + (uuid "07ee30bb-64aa-481d-b107-d4e40f7227cf") + ) + (instances + (project "T41-main-board-V012" + (path "/3c4b9d3b-a516-4fd7-b325-b74c836dee65" + (reference "J21") + (unit 1) + ) + ) + ) + ) + (sheet_instances + (path "/" + (page "1") + ) + ) +) diff --git a/wiki/raw/log.md b/wiki/raw/log.md new file mode 100644 index 0000000..9e582bc --- /dev/null +++ b/wiki/raw/log.md @@ -0,0 +1,11 @@ + +## [2026-06-14] decision | Mapped PE4312 attenuator control bits (MCP23017 U21 → PE4312) +Owner-confirmed + firmware-cross-checked. MCP23017 U21 (0x27): GPIOA → RX attenuator (RF-board +slot U3), GPIOB → TX attenuator (slot U11; U12 is the dual-clock daughter). PE4312 chip is U1 +within the daughterboard sheet. Low 6 GPIO bits = attenuation word: bit0→pin20 C0.5(0.5dB), +bit1→19 C1(1dB), bit2→17 C2(2dB), bit3→16 C4(4dB), bit4→15 C8(8dB), bit5→1 C16(16dB); PE4312 +pin18=GND. Matches firmware SetAttenuator round(2·atten_dB)&0x3F → writeGPIOA(RX)/writeGPIOB(TX) +(RFBoard.cpp:276,67-68,102-103). Note: owner said TX="U12" but schematic shows U11=attenuator +daughter / U12=dualclock daughter — wiki uses U11 (flagged for confirmation). Updated [[rf-board]] +(mapping table + resolved open Q), [[t41-ep-schematics]]; struck item in [[documentation-todos]]. +Remaining: upper MCP bits (GPA6/7,GPB6/7) function still untraced. diff --git a/wiki/roadmap/.gitkeep b/wiki/roadmap/.gitkeep new file mode 100644 index 0000000..a616556 --- /dev/null +++ b/wiki/roadmap/.gitkeep @@ -0,0 +1 @@ +# Roadmap pages: future-development plans, proposals, open questions. diff --git a/wiki/roadmap/development-backlog.md b/wiki/roadmap/development-backlog.md new file mode 100644 index 0000000..525ae41 --- /dev/null +++ b/wiki/roadmap/development-backlog.md @@ -0,0 +1,44 @@ +--- +title: Development Backlog +type: roadmap +status: draft +created: 2026-06-09 +updated: 2026-07-31 +tags: [development, backlog, features, github-issues, index] +source_refs: [] +related: ["[[documentation-todos]]", "[[transmit-spectrum]]", "[[manual-notch]]", "[[usb-audio]]", "[[digital-mode]]", "[[openaudio-library]]"] +--- + +# Development Backlog + +Software-development tasks (features/proposals) for Phoenix, mirroring the open +[GitHub issues](https://github.com/KI3P/Phoenix/issues). Each has its own scoping page +describing **what needs to be done and the current state** — these are *task descriptions, +not solution designs*. The [[documentation-todos]] page tracks wiki/documentation work +separately. + +## Open issues (table as of 2026-06-09; #13 closed out 2026-07-31) + +| Issue | Task | Status in code | Effort | Page | +|---|---|---|---|---| +| [#10](https://github.com/KI3P/Phoenix/issues/10) | See the transmit spectrum | **Largely built** (SSB + dual-VFO); needs verify + edge cases | Low–Med | [[transmit-spectrum]] | +| [#11](https://github.com/KI3P/Phoenix/issues/11) | Manual notch filter | Auto-notch scaffolding exists; manual mode unimplemented | Med | [[manual-notch]] | +| ~~[#13](https://github.com/KI3P/Phoenix/issues/13)~~ | Bi-directional USB audio | **Done (2026-07-31)** — shipped as [[digital-mode]], verified on the bench in both directions | — | [[usb-audio]] *(superseded)* | +| [#14](https://github.com/KI3P/Phoenix/issues/14) | Change OpenAudio library | Foundational; proposal to evaluate | High | [[openaudio-library]] | + +## Two natural tracks + +- **DSP/UI feature track** — [[transmit-spectrum]] (#10) and [[manual-notch]] (#11). Both + *extend existing partial backends*, are independent, and are lower-risk. Good near-term work. +- **Audio-plumbing track** — [[openaudio-library]] (#14). This was originally a two-item track + sequenced #14 → [[usb-audio]] (#13), on the assumption that the library change would enable the + USB audio work. #13 shipped first and without it, as [[digital-mode]]: the stock Teensy + `AudioInputUSB`/`AudioOutputUSB` objects were reused and taken off the I2S-clocked graph rather + than replaced. #14 therefore stands alone, and no longer blocks anything. + +## Notes +- The wiki documentation effort surfaced that **#10 and #11 already have partial backends** — + worth confirming scope before treating either as greenfield. +- Code/comment discrepancies and possible bugs found while documenting live in + [[documentation-todos]] (e.g. the LMS NR channel-routing note, the unit mislabels). Some may + deserve their own issues. diff --git a/wiki/roadmap/documentation-todos.md b/wiki/roadmap/documentation-todos.md new file mode 100644 index 0000000..a12da50 --- /dev/null +++ b/wiki/roadmap/documentation-todos.md @@ -0,0 +1,263 @@ +--- +title: Documentation TODOs & Open Questions +type: roadmap +status: draft +created: 2026-06-08 +updated: 2026-07-29 +tags: [todo, open-questions, discrepancies, wiki-maintenance] +source_refs: [] +related: ["[[index]]", "[[iq-imbalance-correction]]", "[[multirate-decimation]]", "[[noise-reduction]]", "[[fast-convolution-filtering]]", "[[dsp-chain]]", "[[runtime-filter-design]]", "[[sample-rate-switching]]", "[[filter-hil-test]]", "[[tx-filter-hil-test]]"] +--- + +# Documentation TODOs & Open Questions + +Running list of (a) wiki pages still needing work and (b) **code/comment discrepancies and +possible bugs** surfaced while writing the wiki. Items here are leads for future code reading, +hardware testing, or a question to the human. Resolve an item → fix the page, cite the +finding, and strike it from this list. + +This is a planning surface, not a defect tracker — but anything that looks like a **real bug** +is tagged **⚠ possible bug** so it stands out. + +## Code/comment discrepancies & possible bugs + +### Hardware (from T41-EP schematics, ingested 2026-06-14) +- ~~⚠ AD8307 (log) vs linear power math.~~ — **RESOLVED, not a bug (2026-06-14).** Net trace + + schematic-owner confirmation: AD8307 OUT (U14 fwd / U19 rev) → AD7991 CH0/CH1; REF3440 → + Vin3/Vref. The **default digital path already does the correct AD8307 log conversion** + (mV/25 − 84 → dBm → W, `LPFBoard.cpp:640-643`). The linear `(V·10)²/50` belongs to the + `USE_ANALOG_SWR` branch (linear diode detectors on Teensy pins 26/27, off by default). The + flag originated from a **wiki mis-attribution**, now corrected. → [[filter-boards]] +- ~~Phantom second SGTL5000.~~ — **RESOLVED (2026-06-14, schematic owner).** There is **one** + SGTL5000 (Teensy hat, `sgtl5000_teensy`): mic in **+** TX I/Q out. The `pcm5102_mainBoard` + object represents the **PCM5102 speaker DAC** (U5), and **PCM1808** (U6) is RX I/Q in. The + object being typed `AudioControlSGTL5000` is a **harmless mistype** — PCM5102/PCM1808 are + control-less I²S parts, so its `.enable()/.inputSelect()` calls are no-ops; the I²S data path + carries the audio. *Code clarity fix (retype/rename + drop the "two SGTL5000s" comment), not a + functional bug.* → [[hardware-platform]], [[t41-ep-schematics]] +- ~~**Net-tracing leads.**~~ — **ALL RESOLVED 2026-06-14/15** (owner-assisted): ATtiny85 purpose; + PE4312↔MCP23017 mapping; LPF band-code→decoder→relay + external filter board; U21 upper bits + (unused/NC); I²S/MCLK routing (MCLK=23/LRCLK=20/BCLK=21 shared; DAUDIO_OUT=32→PCM5102; + ADC_IN←PCM1808). Per-band LPF L/C→cutoff intentionally **out of scope** (owner). The remaining + non-schematic hardware items (PA bias/rails; per-band SWR cal vs. measured power = bench) are + not net traces. → [[hardware-platform]], [[rf-board]], [[filter-boards]] + +### DSP — I/Q calibration +- ~~**Tone offset vs. FFT bins.**~~ — **RESOLVED (2026-06-14).** The CW tone is set to + `band_center + SR[SampleRate].rate/4` (`HardwareSm.cpp:613`) = 48 kHz at the default 192 kHz + raw rate, so the "48 kHz above/below the LO" comment is correct. The "±6 kHz at 24 kHz" + premise was wrong: the PSD read here is the **192 kHz raw, 1×-zoom 512-bin display FFT** + (cal forces `spectrum_zoom = 0`, `HardwareSm.cpp:498`) → 375 Hz/bin, bin 256 = LO, so + ±Fs/4 = bins 128/384. Wanted = bin 384 (tone is Fs/4 *above* LO), image = bin 128. + → [[iq-imbalance-correction]] +- ~~**Separation metric units.**~~ — **RESOLVED (2026-06-14).** `psdnew` holds + `log10f_fast(magnitude)` (`DSP_FFT.cpp:144,186`), so `(upper − lower)` is a log₁₀ ratio and + the `×10` expresses sideband separation in **dB**. → [[iq-imbalance-correction]] +- **Correction-model completeness.** The RX/TX correction is single-axis (scale I only + + phase shear). Does this leave a residual image vs. a full 2×2 correction matrix, and is it + measurable at the achieved IRR? → [[iq-imbalance-correction]] + +### DSP — noise reduction +- ~~**⚠ possible bug:** `DSP.cpp:687` `arm_scale_f32(data->Q, 2, data->I, …)`~~ — **RESOLVED, + not a bug** (investigated 2026-06-08). `Xanr` writes its result to `data->Q` and leaves + `data->I` holding the pre-NR signal; downstream `InterpolateReceiveData` reads `data->I`, so + the line correctly copies the denoised `Q` into `I` with a 2× makeup gain (cf. ×30 for Kim). + The notch block at `DSP.cpp:930-933` uses the same `Xanr`→`copy(Q,I)` pattern. *Clarity nit + only:* the "Xanr outputs to Q while the chain treats I as primary" convention plus the magic + 2× are fragile — worth a code comment, not a fix. +- ~~**Auto-notch invocation.**~~ — **RESOLVED:** the auto/manual notch is `Xanr(&data, 1)` at + `DSP.cpp:930`, gated by `ED.ANR_notchOn == 1`, right after `NoiseReduction()`, followed by + `arm_copy_f32(data.Q, data.I, …)`. Distinct from the NR-mode `Xanr(&data, 0)` inside + `NoiseReduction`. → [[noise-reduction]] +- ~~**NR sample-rate comments.**~~ — **RESOLVED (2026-06-14).** Stale DD4WH comment, not a real + rate assumption. `Kim1_NR` runs at the **24 kHz** decimated RX rate (raw 192 kHz ÷ DF1·DF2 = + 4·2 = 8, `SDT.h:409-410`) → 24000/256 = **93.75 Hz/bin**. The `46.9Hz [12000Hz/256] @96kHz` + comment (`DSP_Noise.cpp:141,155`) is leftover Convolution-SDR text; the code divides by the + **live** `data->sampleRate_Hz / NR_FFT_L` so it is correct regardless. → [[noise-reduction]] + +### DSP — multirate / filtering +- ~~**TX vs RX filter design.**~~ — **RESOLVED (2026-06-14).** Primarily **heritage**, not a + deliberate determinism/latency choice. The fixed 48-tap tables are legacy DD4WH coefficients + (arrays named/commented "RXfilters", `DSP_FIR.cpp:174-175`) reused wholesale by the TX path; + RX *decimation* was refactored into the harris-formula runtime design. The runtime path's + rate-independence is dormant — `SampleRate` is hardcoded 192 kHz (`Globals.cpp:106`, never + reassigned), so RX recomputes identical coeffs each boot. (RX is a hybrid: decimation + runtime-sized; interpolation fixed 48/32 taps.) → [[multirate-decimation]] + - ⚠ **The "dormant" half of that resolution expired 2026-07-29.** `SampleRate` is now a + reference to the persisted `ED.sampleRate` and is reassigned at run time + ([[sample-rate-switching]]). The heritage explanation for the *asymmetry* still holds. +- **Round-trip group delay.** Measure the RX decimate→convolve→interpolate latency against the + ~10 ms loop budget. → [[multirate-decimation]], [[real-time-constraints]] +- **Spectrum refresh floor.** Reconcile the `.ino`'s 200 ms spectrum figure with the measured + ~80 ms floor and the role of `NCHUNKS`. → [[real-time-constraints]], [[zoom-fft]] +- ~~**Zoom default mismatch.**~~ — **RESOLVED (2026-06-14).** Not a conflict: `Config.h:78 + ZOOM 3` is a **front-panel button-ID** macro (`Config.h:74-96`, dispatched as `case ZOOM:` + in `Loop.cpp:457,818`, which does `ED.spectrum_zoom++`), *not* a zoom level. Power-on zoom is + governed solely by `ED.spectrum_zoom` (default `1` = 2×, `SDT.h:274`; or a restored JSON + value). → [[zoom-fft]] + +### DSP — rate independence (V1.4.0, merged 2026-07-29) +- ~~**Frozen coefficient tables drift with the sample rate.**~~ — **RESOLVED (2026-07-29).** The + CW audio filters, equaliser cells, CW decoder FIR and the two TX stages around the Hilbert are + now generated per rate from recovered analog prototypes. → [[runtime-filter-design]] +- ⚠ **Stale sidetone comment.** `DSP_CWProcessing.cpp:64` still says + `// phs = 2 * PI * freqSideTone / 24000` while the code below it divides by the live + `SR[SampleRate].rate / RXfilters->DF`. Comment-only fix; the code is correct. An earlier + revision of the wiki quoted the comment as if it were the code. → [[cw-processing]] +- **AM DC blocker pole.** Made per-instance (it was a file-scope static shared across all three + `ReceiveFilterConfig`s), but its fixed 0.99 was not obviously revisited now that the rate can + change. → [[runtime-filter-design]], [[dsp-chain]] +- **`bandtable.py` mirrors firmware constants by hand.** Nothing detects a value edited in + `DSP_FIR.cpp`/`Globals.cpp` without updating `code/tools/filter_hil/bandtable.py` — now also + `code/tools/tx_filter_hil/bandtable.py`, whose `TX_AUDIO_CORNER_3DB_HZ` and `TX_STOPBAND_*` were + derived by evaluating the generated tap sets rather than copied. + → [[filter-hil-test]], [[tx-filter-hil-test]] +- **No CAT command for AGC mode.** The one setting [[filter-hil-test]] needs and cannot set; + the suite refuses to run instead. → [[cat-control]] +- **No CAT command for the transmit equaliser** (`ED.equalizerXmt`) to mirror `EQ`. Deliberately + not added, since `S_Xmt[i].pCoeffs` and `S_Rec[i].pCoeffs` are the same array — but it would let + [[tx-filter-hil-test]] zero the cells and so separate the ~200 Hz composite low corner into the + equaliser's contribution and the mic input's AC coupling, which it currently cannot. + → [[cat-control]], [[audio-equalizer]] +- ⚠ **Rate invariance is not one tolerance.** The 48-tap FIR transmit stages hold to ≈1.2 % across + a rate change where the IIR receive stages hold to 0.3 %, because a fixed tap count cannot place + a corner exactly when the normalised cutoff moves. Any future test or spec that quotes a single + rate-invariance figure for "the filters" will be wrong for one half. + → [[runtime-filter-design]], [[tx-filter-hil-test]] +- **Transmit HIL suite not yet run on hardware.** Written, self-tested (48 tests) and validated + against a simulation of the real FIR cascade, but the bench numbers are outstanding — including + whether the 1.6 V default scope offset still matches the exciter's DC bias with the RF board + disconnected. → [[tx-filter-hil-test]] +- **CAT `set_len` / `read_len` must differ**, or the read handler is unreachable — the bug that + made `FW;` write-only. Enforced by convention only; a static assertion over + `valid_commands[]` would catch the next one. → [[cat-control]] +- **Rate-change interlock asymmetry.** `SR` over CAT is rejected while transmitting; the + front-panel menu path is not. Deliberate? → [[sample-rate-switching]], [[cat-control]] +- **Why 176.4 ksps?** Not recorded in the commit message or `code/docs/`. Owner question. + → [[sample-rate-switching]] + +### Units / naming +- ~~**VFO frequency unit mislabeled.**~~ — **FULLY RESOLVED (2026-06-16).** First the `RFBoard.h` + / `Tune.h` docstrings were corrected to centi-Hz (Hz × 100) on 2026-06-14; then the owner + completed the cross-file rename of every `_dHz` *symbol* (`GetTXRXFreq_dHz`, `frequency_dHz`, + etc.) to `_cHz`, eliminating the historical "decihertz" misnomer entirely. Wiki updated to + match. *Reconciled (2026-06-16):* the rename has now merged onto `encoder-i2c-speed` (0 `_dHz` + / 46 `_cHz` in `code/src/PhoenixSketch/`), so source and wiki agree — the earlier branch caveat + is closed. + → [[rf-board]], [[tune-frequency-control]] + +### Stale source comments +> **All items below FIXED IN SOURCE (2026-06-14)** — comment-only edits now **committed and +> merged** onto `encoder-i2c-speed` (commit `c95f932` "Unit and documentation fixes", 2026-06-16). +> The wiki was already correct. +- ~~**CAT protocol: TS-480 vs TS-2000.**~~ — Fixed `CAT.h:25` "TS-2000" → "TS-480" (now + consistent with `CAT.cpp` and `code/docs/ts_480_pc.pdf`; ID020 = TS-480). → [[cat-control]] +- ~~**"EEPROM" is actually LittleFS+SD JSON.**~~ — Fixed the `.ino` header ("Load settings + from flash/SD…", "Storage.cpp/h: settings persistence … not true EEPROM", and the `ED` + blurb now notes the name is historical) and `Storage.cpp:675`. Type name `EEPROMData` left + as-is (historical). → [[persistent-config]] +- ~~**"TuneSm" does not exist.**~~ — Fixed `PhoenixSketch.ino` (TuneSm → HardwareSm in the + philosophy bullet, ASCII diagram, state-machine list, and module list) and `CLAUDE.md` + ("Frequency Control State" section + module/task lines). Both now state Tune.cpp is a + pure-function library and the tune state lives in HardwareSm. + → [[tune-frequency-control]], [[hardware-state-machine]] +- ~~**HardwareSm is hand-written, not generated.**~~ — Made explicit in `PhoenixSketch.ino` + (section intro + HardwareSm entry) and `HardwareSm.cpp` header ("hand-written, NOT generated + by StateSmith"). → [[hardware-state-machine]], [[state-machine-architecture]] +- ~~**`.ino` ModeSm state list.**~~ — Fixed: now "SSB_RECEIVE, SSB_TRANSMIT, CW_RECEIVE, six + CW_TRANSMIT_* keyer sub-states, and the CALIBRATE_* states (… there is no TUNE state)". + → [[mode-state-machine]] + +### DSP — AGC +- ~~**Soft-knee transfer curve.**~~ — **RESOLVED (2026-06-14).** Gain law `DSP.cpp:454` + produces three regions: flat limiting at `out_target` for `volts ≥ max_input`; a + linear-in-log soft knee (`out_target − slope_constant·log10(volts/max_input)`) for + `min_volts ≤ volts < max_input`; and constant `max_gain` below `min_volts`. `var_gain` is the + slope control — total output rise across the active range = `out_target·(1 − 1/var_gain)` + ≈ +3.5 dB at the default `var_gain = 1.5`. → [[agc-design]] +- ~~**n_tau vs MAX_N_TAU.**~~ — **RESOLVED (2026-06-14).** `MAX_N_TAU = 8` is a commented-out + worst-case constant (`SDT.h:615-617`), not used at runtime — it (with `MAX_SAMPLE_RATE` and + `MAX_TAU_ATTACK`) sizes the static `ring_buffsize = 24000·8·0.01+1 = 1921`. Operating + `n_tau = 4` → 96-sample (~4 ms) look-ahead at 24 kHz; ring is over-provisioned ~20×. + → [[agc-design]] + +## Pages still to write or promote + +> **Status (2026-06-08):** every firmware **module** page and all **9 theory spine** pages are +> drafts. What remains is *deeper-dive* content — new pages for subsystems that were only +> referenced, the per-page "Remaining:" gaps below, and hardware-measurement follow-ups. + +### Not yet written (new pages needed) +- ~~**CW processing**~~ — **done** ([[cw-processing]]: audio filter, hybrid correlation+Goertzel + tone detection, adaptive Morse decoder via flat tree + timing histograms, sidetone). Remaining: + reconcile the header "50–500 Hz" vs code "840–2000 Hz" filter-width labels. *(Decoder sample + rate resolved 2026-07-29: the audio rate, `SR[SampleRate].rate / DF`.)* +- ~~**Equalizer**~~ — **done** ([[audio-equalizer]]: parallel 14-band biquad filterbank, RX/TX + gains, alternating-sign reconstruction). Remaining: gain range. *(Band centre frequencies + tabulated 2026-07-29 from `EQ_BAND_FC_HZ[]`, which [[runtime-filter-design]] exposed as named + constants.)* +- ~~**Runtime sample-rate switching**~~ — **done 2026-07-29** ([[sample-rate-switching]]). +- ~~**Run-time filter design**~~ — **done 2026-07-29** ([[runtime-filter-design]]). +- ~~**Filter hardware-in-the-loop test**~~ — **done 2026-07-29** ([[filter-hil-test]]). +- ~~**Synchronous AM (SAM) detection**~~ — **done** ([[synchronous-am-detection]]: 2nd-order PLL + carrier recovery, fade leveler, carrier-offset readout). Remaining: exact zeta/tau constants. +- ~~**TX carrier-null calibration**~~ — **done** ([[tx-carrier-null]]: DC-offset LO-leakage + suppression + the dBc sweep). Remaining: DCOffset units / achievable dBc. +- ~~**Built-in test (BIT)**~~ — **done** ([[built-in-test]]: startup I²C presence flags → + status screen). Remaining: is it re-runnable / extensible to functional checks? +- ~~**Calibration sub-state-machines**~~ — **done** ([[calibration-state-machines]]: 3 identical + minimize-sweep SMs + PowerCalSm curve-fit, with state/event maps). Remaining: per-SM `Vars`; + whether the 3 identical SMs share one diagram. + +**All previously-listed "not yet written" pages are now drafts.** + +### Per-page "Remaining" gaps (deepen existing drafts) +- [[hardware-state-machine]]: full state maps of the 4 cal sub-SMs (above); + `RFCalTransmitIQSingleVFO` external-analyzer flow. +- [[rf-board]]: local Etherkit-Si5351 library modifications vs. upstream. +- [[filter-boards]]: full LPF band↔BCD table; directional-coupler / per-band power calibration. +- [[front-panel]]: per-button id→physical-label map; measured latency win from the branch. +- [[display-subsystem]]: waterfall colour-map / `psdnew`→pixel mapping; touch input; + `primaryMenu[8]` contents. +- [[cat-control]]: verify the `IF` status-string field layout vs. `code/docs/ts_480_pc.pdf`. +- [[persistent-config]]: JSON schema completeness; versioning/migration behaviour. +- Theory: deepen via hardware measurement (group delays, AGC transfer curve, IRR achieved). + +### Theory stubs → drafts +- ~~[[agc-design]]~~ — **done** (wdsp look-ahead AGC, hang state machine). +- ~~[[zoom-fft]]~~ — **done** (raw-192k IIR-decimate zoom; corrected the earlier "operates on + 24 kHz baseband" error — it does not). +- All nine theory spine pages are now drafts. Next: deepen via measurement/hardware, or start + CW-processing and equalizer pages (see below). + +### Firmware module stubs (have "To flesh out" checklists) +- ~~[[mode-state-machine]]~~ — **done** (full state hierarchy, event map, keyer timing, + paddle memory, calibration branch). +- ~~[[tune-frequency-control]]~~ — **done** (was the mis-named "tune-state-machine" stub; + Tune.cpp is a function library, not an SM — page retitled, all links updated). +- ~~[[hardware-state-machine]]~~ — **done** (RFHardwareState/TuneState mappings, T/R + switching, calibration orchestration). Remaining: full state maps of the 4 generated cal + sub-SMs. +- ~~[[ui-state-machine]]~~ — **done** (13 states, full transition map, DFE resolved). All + firmware state-machine pages are now drafts. +- ~~[[rf-board]]~~ — **done** (Si5351 quadrature VFO incl. the <3.2 MHz timed-delay path, + attenuators, T/R switching, cal loopback). Remaining: local Etherkit-lib modifications. +- ~~[[filter-boards]]~~ — **done** (BPF/LPF/back-end relays via shared hardwareRegister, AD7991 + SWR/power math). Remaining: full LPF band↔BCD table; coupler calibration. +- ~~[[front-panel]]~~ — **done** (2×MCP23017, Rotary_V12 encoders, two-tier ISR+1ms-timer + servicing = the encoder-i2c-speed branch design). Remaining: per-button id→label map. +- ~~[[display-subsystem]]~~ — **done** (Pane dirty-flag model, 13 home panes enumerated, + DrawDisplay router, VariableParameter editor + menu model). Remaining: waterfall colour-map / + pixel mapping, touch input, primaryMenu[8] contents. **All firmware module stubs now drafts.** +- ~~[[cat-control]]~~ — **done** (25-command dispatch table, transport, event/ED apply paths). + Remaining: verify `IF` status-string layout vs. `code/docs/ts_480_pc.pdf`. +- ~~[[persistent-config]]~~ — **done** (`ED` field groups, JSON-on-LittleFS+SD persistence, + ParamSave scratch). Remaining: JSON schema completeness + versioning/migration behavior. + +_(The "not yet written" pages are consolidated at the top of this section.)_ + +## How to use this list +When the human asks "what's left to document?" or "what looked wrong in the code?", start +here. When a code discrepancy is confirmed as a bug, note it here AND consider whether it +belongs in the actual issue tracker / a fix branch — the wiki records the *finding*, not the +fix. diff --git a/wiki/roadmap/manual-notch.md b/wiki/roadmap/manual-notch.md new file mode 100644 index 0000000..fa1ed3b --- /dev/null +++ b/wiki/roadmap/manual-notch.md @@ -0,0 +1,60 @@ +--- +title: "Dev: Manual Notch Filter (#11)" +type: roadmap +status: draft +created: 2026-06-09 +updated: 2026-06-09 +tags: [development, feature, notch, noise-reduction, lms, display, front-panel] +source_refs: [] +related: ["[[development-backlog]]", "[[noise-reduction]]", "[[display-subsystem]]", "[[front-panel]]", "[[main-loop]]", "[[persistent-config]]"] +--- + +# Dev: Manual Notch Filter (#11) + +**GitHub issue:** [KI3P/Phoenix#11](https://github.com/KI3P/Phoenix/issues/11) — *"Feature +request: manual notch filters"* + +> Goal (from the issue): add a **manual** notch as an alternative to the autonotch. The notch +> button cycles three states — **no notch / autonotch / manual notch**. In manual mode a line +> on the audio spectrum shows the notch location, moved by turning the **filter** knob. + +Scoping note — what exists vs. what's missing. Not a solution design. + +## Current state — auto-notch scaffolding exists, manual mode does not + +- **Engine:** the notch is the `Xanr` LMS adaptive filter ([[noise-reduction]]). Its signature + `Xanr(data, ANR_notch)` already *names* a manual mode (`0=off, 1=auto, 2=manual` per the + `DSP_Noise.h` doc), but **no `mode 2` / manual code path is implemented** (grep finds none). +- **State flag:** `ED.ANR_notchOn` ([[persistent-config]]) is currently **binary** — the notch + button toggles it 0↔1 (`Loop.cpp:545-548`), and DSP only acts on `== 1` + (`DSP.cpp:930` → `Xanr(&data, 1)`). +- **Display hook:** the home-screen settings pane already reflects `ANR_notchOn` + (`MainBoard_DisplayHome.cpp:1404-1413`). +- **CAT:** `ANR_notchOn` is also settable over CAT (`CAT.cpp:600`, the `NT` command, + [[cat-control]]). + +So the plumbing (button, flag, display indicator, DSP entry point, CAT) is in place for +auto-notch; **manual notch is genuinely new work.** + +## What remains to be done (to scope) +- **3-way state:** extend `ANR_notchOn` / the notch-button handler from 0↔1 to a 3-state cycle + (off / auto / manual). Note this changes a persisted `ED` field's meaning — mind migration + ([[persistent-config]]). +- **Manual DSP path:** implement the `Xanr` manual mode (a fixed-frequency notch) — the engine + hook exists but the behaviour does not. +- **Notch-frequency control:** bind the **filter encoder** ([[front-panel]]) to a notch-freq + parameter while in manual mode (it currently adjusts filter bandwidth — needs mode-aware + routing). +- **Display:** draw a vertical line at the notch frequency on the **audio-spectrum pane** + ([[display-subsystem]]); keep it in sync as the knob moves. +- **State storage:** where the manual notch frequency lives (new `ED` field?). +- **Interaction:** how manual-notch mode coexists with the filter knob's normal job, and with + the other NR options. + +## Reference +Russ's example cited in the issue: + + +## Relevant code & wiki +`DSP_Noise.cpp` (`Xanr`), `DSP.cpp:930`, `Loop.cpp:545`, `MainBoard_DisplayHome.cpp`. Wiki: +[[noise-reduction]], [[front-panel]], [[display-subsystem]], [[persistent-config]]. diff --git a/wiki/roadmap/openaudio-library.md b/wiki/roadmap/openaudio-library.md new file mode 100644 index 0000000..0b2d106 --- /dev/null +++ b/wiki/roadmap/openaudio-library.md @@ -0,0 +1,48 @@ +--- +title: "Dev: Change the OpenAudio Library (#14)" +type: roadmap +status: draft +created: 2026-06-09 +updated: 2026-06-09 +tags: [development, proposal, openaudio, audio-quality, dsp, architecture] +source_refs: [] +related: ["[[development-backlog]]", "[[dsp-chain]]", "[[usb-audio]]", "[[code-heritage]]", "[[real-time-constraints]]"] +--- + +# Dev: Change the OpenAudio Library (#14) + +**GitHub issue:** [KI3P/Phoenix#14](https://github.com/KI3P/Phoenix/issues/14) — *"Proposal: +Change Open Audio library"* + +> Goal (from the issue): adopt a technique to **improve audio quality** by changing the OpenAudio +> library usage. +> Ref: + +Scoping note — a proposal to evaluate, not a solution design. + +## Current state — OpenAudio underpins the whole audio chain + +- The real-time audio I/O and block scheduling rest on the **OpenAudio_ArduinoLibrary** + (`MainBoard_AudioIO`, [[dsp-chain]]) — it provides the 48/96/192 kHz block pipeline the DSP + chain consumes, and the update ISR whose NVIC priority (208) the front-panel servicing is + deliberately kept below ([[front-panel]], [[real-time-constraints]]). +- This is foundational, multi-author heritage code ([[code-heritage]]); a change here touches + buffering, sample rates, and timing assumptions across the DSP chain. + +## What remains to be done (to scope) +- Read the referenced groups.io technique and capture **what specifically** it changes (a + different library? a different OpenAudio configuration? a new block size / sample format?). +- Assess blast radius: which DSP stages, buffer sizes (`READ_BUFFER_SIZE`), and the 10 ms loop + budget ([[real-time-constraints]]) are affected. +- Relationship to USB audio ([[usb-audio]] #13): a library change may be a prerequisite or + enabler — sequence the two together. +- Define how "audio quality" improvement will be **measured** (the in-tree + `Transmit_Audio_Purity_Investigation.md` may be relevant). + +## Risk +Highest-risk / highest-blast-radius of the four open issues — it sits under everything in +[[dsp-chain]]. Worth a careful evaluation page before any implementation. + +## Relevant code & wiki +`MainBoard_AudioIO.cpp/.h`, the OpenAudio library; [[dsp-chain]], [[usb-audio]], +[[real-time-constraints]], [[code-heritage]]. diff --git a/wiki/roadmap/transmit-spectrum.md b/wiki/roadmap/transmit-spectrum.md new file mode 100644 index 0000000..8fb7f4d --- /dev/null +++ b/wiki/roadmap/transmit-spectrum.md @@ -0,0 +1,58 @@ +--- +title: "Dev: Transmit Spectrum Display (#10)" +type: roadmap +status: draft +created: 2026-06-09 +updated: 2026-06-09 +tags: [development, feature, transmit, spectrum, display, dual-vfo] +source_refs: [] +related: ["[[development-backlog]]", "[[dsp-chain]]", "[[zoom-fft]]", "[[tune-frequency-control]]", "[[hardware-state-machine]]", "[[display-subsystem]]"] +--- + +# Dev: Transmit Spectrum Display (#10) + +**GitHub issue:** [KI3P/Phoenix#10](https://github.com/KI3P/Phoenix/issues/10) — *"Feature +request: can we see the transmit spectrum?"* + +> Goal (from the issue): run the receive chain in parallel with the transmit chain and plot the +> transmit spectrum while transmitting. Some TX power leaks into the RX chain through the T/R +> switch, so a parallel RX-PSD can show what's being transmitted. + +This is a **scoping note** — what exists and what remains — not a solution design. + +## Current state — substantially implemented for SSB + dual-VFO + +While documenting the DSP and tuning code we found most of this already exists: +- **Parallel RX-PSD during TX:** `PerformSignalProcessing` calls `TransmitReceiveProcessing()` + in the `SSB_TRANSMIT` state when `HasDualVFOs()` (`DSP.cpp:53-55`). That routine reads the + IQ input, applies RF gain + I/Q correction, and runs `ZoomFFTExe(...)` to compute the + display PSD (`DSP.cpp:768-792`) — i.e. a truncated RX chain, PSD only, no audio demod. +- **Dedicated VFO placement:** `HandleTuneState(TuneSSBTX)` retunes the RX VFO to **freq/3** on + dual-VFO radios specifically "to watch the 3rd harmonic when displaying the transmit + spectrum" (`HardwareSm.cpp:662-666`, documented in [[tune-frequency-control]]). The + fundamental leaking through the T/R switch is too strong, so it monitors the 3rd harmonic. +- A separate filter/zoom config (`RXTXfilters`, `RXTXZoom`) exists for this path. + +So for the **common case (SSB, dual-VFO)** the TX spectrum is computed during transmit. See +[[dsp-chain]] and [[zoom-fft]]. + +## What remains to be done (to scope) +- **Verify the display actually renders it** and how — does the spectrum pane + ([[display-subsystem]]) show the TX PSD distinctly (label, colour, frequency axis) during TX? +- **3rd-harmonic presentation:** since the monitored signal is at freq/3, clarify how the axis + / readout is presented to the user so it isn't misleading. +- **CW transmit:** the dispatch only covers `SSB_TRANSMIT` (and cal states) — CW TX has no + TX-spectrum path. Is that wanted? +- **Single-VFO radios:** the whole path is gated by `HasDualVFOs()`; single-VFO hardware can't + self-monitor this way. Is any fallback desired? +- **Performance:** running a parallel PSD during TX adds load — confirm it fits the + [[real-time-constraints]] budget. + +## Relevant code & wiki +`DSP.cpp` (`TransmitReceiveProcessing`), `HardwareSm.cpp` (`HandleTuneState` TuneSSBTX), +`MainBoard_DisplayHome.cpp` (spectrum pane). Wiki: [[dsp-chain]], [[zoom-fft]], +[[tune-frequency-control]], [[hardware-state-machine]], [[display-subsystem]]. + +## Open questions +- Is this issue effectively *done* for the main case and just needs confirmation, or is the + rendering incomplete? (Needs a check on hardware / the display pane.) diff --git a/wiki/roadmap/usb-audio.md b/wiki/roadmap/usb-audio.md new file mode 100644 index 0000000..feabde8 --- /dev/null +++ b/wiki/roadmap/usb-audio.md @@ -0,0 +1,98 @@ +--- +title: "Dev: Bi-directional USB Audio (#13)" +type: roadmap +status: superseded +created: 2026-06-09 +updated: 2026-07-30 +tags: [development, feature, usb, audio, digital-modes, openaudio, sample-rate, implemented] +source_refs: [] +related: ["[[digital-mode]]", "[[development-backlog]]", "[[dsp-chain]]", "[[openaudio-library]]", "[[cat-control]]", "[[sample-rate-switching]]"] +--- + +# Dev: Bi-directional USB Audio (#13) + +**GitHub issue:** [KI3P/Phoenix#13](https://github.com/KI3P/Phoenix/issues/13) — *"Feature +request: bi-directional USB audio"* + +> Goal (from the issue): add the ability to **send and receive an audio stream over USB** — so a +> PC can pipe RX audio in and TX audio out (e.g. for digital modes / WSJT-X), complementing the +> existing CAT control ([[cat-control]]). +> Ref: + +Scoping note — not a solution design. + +## Status: implemented as [[digital-mode]] (2026-07-30) + +**This scoping page is superseded.** The feature landed as a third operating mode alongside +SSB and CW, and both directions have since been verified on the bench. See **[[digital-mode]]** +for the design, the code map, the measurements and what remains open. + +Answers to the questions this page raised: + +- **USB device composition** — `usb=serialmidiaudio`. Teensyduino has no stock "Dual Serial + + Audio" type, so CAT moves from `SerialUSB1` to the primary `Serial` (via the new `CATSerial` + alias) and `Debug()` compiles out. The composite-descriptor difficulty this page anticipated + was real, and was sidestepped rather than solved. +- **Sample rate / format** — the stock **44.1 kHz** endpoint, unmodified. No Teensy core file + is shadowed. +- **Resampling** — *none*, and none has to be rebuilt on a rate change. Digital mode forces + 176.4 ksps, where the rates line up exactly. + +### Correction to the "possible shortcut" below + +The instinct was right but the tap point was wrong. This page reasoned from the **Fs/8** RX +*audio* rate (22.05 kHz at 176.4 ksps, an exact 1:2 to 44.1 kHz). The implementation instead +taps one stage earlier, at **Fs/4** in `InterpolateReceiveData()` — and Fs/4 at 176.4 ksps +**is 44,100 Hz exactly**. So there is no ratio at all, not even 1:2. One DSP block is exactly +512 samples there, and 86.1328 blocks/s × 512 = 44,100 samples/s exactly. + +A second coincidence at the same rate does the rest: the AudioStream graph clock (Fs/128 = +1378.125 Hz) is exactly 4× the USB audio block rate (344.53 Hz), which is what lets the stock +`AudioInputUSB`/`AudioOutputUSB` objects be reused behind a simple 4:1 pacer. + +Whether 176.4 ksps was *originally* added for this reason remains unrecorded — but it is now +load-bearing for digital mode either way. + +### Correction to an in-tree debug doc + +`code/docs/USB_Audio_TX_Diagnostic_Plan.md:152-158` claims a 0.27 %/s "structural deficit" +between the DSP and USB sample budgets at 192 ksps. **That is an arithmetic error**: it uses +94 blocks/s where the true rate is 192000/2048 = 93.75, and 93.75 × 512 = 48,000 exactly. The +budget balanced all along, so that deficit explains none of the symptoms recorded on the +abandoned `usb_audio` branch. Do not chase it. + +## Historical scoping notes (pre-implementation) + +Kept for context on how the problem was framed before it was solved. + +### Current state (as of 2026-06-09) — in active debugging, not yet a feature + +- The audio codec interface is `MainBoard_AudioIO` ([[dsp-chain]]); a grep finds **no USB-audio + endpoints** (`AudioInputUSB`/`AudioOutputUSB`) wired in there yet. +- There is substantial **investigation already underway** — several debug docs sit in the + working tree (`code/docs/USB_Audio_Debug_Guide.md`, `USB_Audio_RX_Diagnostics.md`, + `USB_Audio_TX_Debug_Report.md`, `USB_Audio_TX_Diagnostic_Plan.md`, `usb_audio_debug_18Jan26.md`, + `Transmit_Audio_Purity_Investigation.md`). **Start here** for context before designing. +- Teensy USB audio shares the USB device with serial; CAT already uses `SerialUSB1` (Dual + Serial). USB Audio + Dual Serial composite descriptor interactions are likely part of the + difficulty being debugged. + +## What remains to be done (to scope) +- Consolidate the findings from the in-tree debug docs into a concrete plan (those docs are the + primary source — read them first). +- Decide the USB device composition (audio + serial coexistence) and sample-rate/format. +- Route USB audio into/out of the DSP chain (RX audio → USB in; USB out → TX modulator), + including resampling to/from the internal rates. ⚠️ **Those rates are no longer fixed** + ([[sample-rate-switching]]): [[dsp-chain]] runs RX audio at **24 kHz @192 ksps / 22.05 kHz + @176.4 ksps**, TX audio at **12 / 11.025 kHz**. Any resampler has to be rebuilt on a rate + change, the same way the filters are ([[runtime-filter-design]]). +- **Possible shortcut:** at 176.4 ksps the RX audio rate is 22.05 kHz — an exact 1:2 of 44.1 kHz, + where 24 kHz needs a 147:160 ratio to reach 44.1. Whether that is *why* 176.4 ksps was added is + unrecorded and an open question for the owner ([[sample-rate-switching]]); if so, this page is + where the connection belongs. +- Relationship to [[openaudio-library]] (#14): a library change may change the USB-audio path, + so sequence the two. + +## Relevant code & docs +`MainBoard_AudioIO.cpp/.h`; the `code/docs/USB_Audio_*` reports; [[dsp-chain]], +[[openaudio-library]]. diff --git a/wiki/sources/.gitkeep b/wiki/sources/.gitkeep new file mode 100644 index 0000000..39ce556 --- /dev/null +++ b/wiki/sources/.gitkeep @@ -0,0 +1 @@ +# One summary page per ingested source lands here (type: source). diff --git a/wiki/sources/t41-ep-schematics.md b/wiki/sources/t41-ep-schematics.md new file mode 100644 index 0000000..3e5e381 --- /dev/null +++ b/wiki/sources/t41-ep-schematics.md @@ -0,0 +1,134 @@ +--- +title: T41-EP Schematics (KiCad, V012-era) +type: source +status: draft +created: 2026-06-14 +updated: 2026-06-14 +tags: [hardware, schematic, kicad, t41-ep, source, bom] +source_refs: [] +related: ["[[hardware-platform]]", "[[i2c-bus-map]]", "[[rf-board]]", "[[filter-boards]]", "[[front-panel]]", "[[display-subsystem]]"] +--- + +# T41-EP Schematics (KiCad, V012-era) + +KiCad schematic files for the T41-EP board set (six dropped into `raw/` on 2026-06-14; the LPF +**filter** board added 2026-06-15 — seven total). These are the **first physical-hardware +source** ingested — until now the `hardware/` pages were inferred from firmware constants. +Schematics are authoritative for what is physically present; where they disagree with code +comments, the schematic wins (and the discrepancy is logged). + +> KiCad `.kicad_sch` are S-expression text. Facts below are extracted from `(property +> "Reference"/"Value" …)` symbol fields and net labels; exact pin-level nets were not fully +> traced. Component **values** (chip part numbers) are reliable; precise wiring claims that +> aren't net-confirmed are marked *(infer)*. +> +> ⚠ **Multiple board revisions exist and reference designators can differ between them** +> (e.g. the RF-board attenuators — see below). The files in `raw/` are the **V12.8 / "V012"** +> generation. The **electrical wiring and firmware are stable across revisions**, so prefer +> citing *function* (e.g. "RX attenuator") over a bare `U#`, and state the revision when a +> designator matters. + +## The six files / boards + +| File (`raw/…`) | Board | Role | +|---|---|---| +| `T41-main-board-V012.kicad_sch` | **Main board** | Teensy 4.1 compute, audio converters, power, all I/O fan-out | +| `T41-RF-board-V012.kicad_sch` | **RF board** | Quadrature mixer, LO + attenuator daughterboards, I/Q baseband amps | +| `T41-RF-board-Attenuator-daughterboard.kicad_sch` | **Attenuator daughterboard** | 2× PE4312 digital step attenuators | +| `DualClockLO.kicad_sch` | **Dual-clock LO daughterboard** | 2× Si5351A quadrature/independent LO | +| `T41-exciter-filter-board.kicad_sch` | **BPF / exciter-filter board** | Switched per-band band-pass filter banks | +| `K9HZ_100W_11band_LPF-Control.kicad_sch` | **LPF / 100 W PA control board** | Band decode, PA bias, antenna switching, SWR/power sensing | +| `K9HZ_100W_11band_LPF-Filter.kicad_sch` | **LPF filter board** | The actual per-band low-pass filters + their switching relays (added 2026-06-15) | + +## Main board (`T41-main-board-V012`) +- **U8 Teensy 4.1** (compute). **U7 Teensy Audio Adaptor** = the lone **SGTL5000** codec + (double-duty: mic in **+** TX I/Q out). **U6 PCM1808PW** (ADC) = **RX I/Q in**. **U5 PCM5102** + (DAC) = **speaker out**. So the audio path is **one SGTL5000 + PCM1808 + PCM5102** (owner- + confirmed). The firmware's `pcm5102_mainBoard` object represents U5 but is mistyped + `AudioControlSGTL5000`; since PCM parts have no I²C, its control calls are no-ops — a code + clarity fix, not a missing chip. → [[hardware-platform]] +- **U4 ATtiny85-20S** + **Q1/Q4 SUP90P06-09L** P-MOSFETs + **SW1 ON-OFF button** = soft + power-switching / housekeeping. +- Regulators: **U1/U9 LM7805** (+5 V), **U3/U10 LM1117-3.3** (+3.3 V), **U2 AP7384**; TO-220 + heatsinks (EA-T220-38E). Rails seen: +12V, +5V, +3V3. +- **Three I²C buses leave the Teensy**: net labels `SDA/SCL`, `SDA1/SCL1`, `SDA2/SCL2` + (= Wire/Wire1/Wire2 — confirms [[i2c-bus-map]]). +- Connectors: **J6 RF CONTROL** (→RF board), **J12 BANDS** (→filter boards), **J5 Front + Panel**, **J7 Display** + **J8 Display Voltage** (the RA8875 module is *off-board* — that is + why no RA8875 appears in the schematic), **J9 Keys/PTT**, **J16 Mic_In**, **J17 Ex_Out** + (TX I/Q to exciter), **J14/J15 Rec_Out/In**, **J11 ENCODER**, **J24 USBHost**, **J23 + Ethernet**, **J3 Acc**, **J4 12-13.8 V**. + +## RF board (`T41-RF-board-V012`) +- **U12 = T41_DualClock_Daughter** (the dual-Si5351 LO board) and **U3 + U11 = + T41_Attenuator_Daughter** (two PE4312 attenuator boards → RX and TX paths). +- **TR1 ADT1-1, TR2 ADT2-1T** RF transformers (mixer/balun); **U2 PSA-8A+** and **U13 + MAR-3SM+** MMIC gain blocks; **U7/U9 MASWSS0179** RF switches (T/R, cal loopback); + **U1/U4 74CBTLV3253** analog muxes (I/Q switching) *(infer: quadrature routing)*. +- I/Q baseband op-amps: **U6/U8 MC33078, U106 AD8599, U107 OPA2209, U16 LM358B**. +- **U21 MCP23017** (= 0x27, the RF-board GPIO that latches switch/attenuator control). +- Coax/headers: **J1 IQ_Out, J5 IQ_In** (to/from main-board codecs), **J2 RF_IN, J6 RF_OUT, + J3 RFControl**. + +## Attenuator daughterboard (`…Attenuator-daughterboard`) +- One **PE4312** per board (chip ref `U1` in this sheet) — 6-bit digital step attenuator, + **31.5 dB / 0.5 dB**. The hardware behind `SetRXAttenuation`/`SetTXAttenuation` ([[rf-board]]). +- **Designators are revision-dependent** (the wiring/firmware never changed): in **V12.8** (this + `raw/` schematic, PE4312 on daughterboards) **RX = U11, TX = U3** (U12 = dual-clock daughter); + in **prior revisions** (PE4312 on the RF board) **RX = U3, TX = U12**. +- **Control mapping (electrical, revision-independent; owner-confirmed 2026-06-14):** MCP23017 + (U21, 0x27) **GPIOA → RX attenuator**, **GPIOB → TX attenuator**, low 6 bits = attenuation + word: bit0→pin20 (C0.5), bit1→19 (C1), bit2→17 (C2), bit3→16 (C4), bit4→15 (C8), bit5→1 (C16); + PE4312 pin 18 = GND. Matches firmware `round(2·dB)&0x3F` exactly. → [[rf-board]] + +## Dual-clock LO daughterboard (`DualClockLO`) +- **2× Si5351A-B-GM** clock generators, **25 MHz reference** (ECS-TX053 TCXO + crystal), + 2k2 I²C pull-ups, **qwiic** connector. Confirms the dual-VFO 0x60/0x61 Si5351 hardware + ([[rf-board]], [[i2c-bus-map]]). + +## BPF / exciter-filter board (`T41-exciter-filter-board`) +- ~**22× MASWSS0179** RF switches + **SN74LVC1G04** inverters switch **per-band band-pass + L-C filter banks** (RX image rejection + TX). **U35 MCP23017** (= 0x24) does band select. +- Connectors: **J1 TO PA, J2 FROM EXCITE, J5 TO RECEIVE, J6 FROM LPF, J4 Bands**. + +## LPF / 100 W PA control board (`K9HZ_100W_11band_LPF-Control`) +- **Decode chain (owner net-trace 2026-06-15):** MCP23017 (U15, 0x25) → **U12 CD74HC4514** + 4→16 decoder (band BCD on GPIOB[0:3], A0–A3 = pins 2,3,21,22) → inverting **U9/U10 ULN2803** + → **external** band-LPF relays via **J24/J25** (selected line driven LOW; NF=Y15 bypass). + Antenna: GPIOB[4:5] → **U2 74HC237** → **U4 ULN2803** → **K4–K7**. 100 W PA: GPIOB[7] → spare + U4 channel → **K2/K3**. BPF RX/TX routing: GPIOA[0:1] → **U5/U6** (BPF between J15–J18). So the + on-board **K2–K7 are PA (K2/K3) + antenna (K4–K7)** — *not* the band LPFs (those are external). + Full BCD table + detail in [[filter-boards]]. +- **Power/SWR sensing** (net-traced + owner-confirmed 2026-06-14): the directional coupler + feeds **two AD8307 log detectors** — **U14 = forward, U19 = reflected** — whose log outputs + (`FWD_V`/`REF_V`) go to the **AD7991** I²C ADC (CH0/CH1). The ADC's reference is the + **REF3440 4.096 V** on Vin3/Vref (net `REF` = the *reference*, not "reflected"). The default + firmware path correctly converts these log voltages mV/25 − 84 → dBm → W + (`LPFBoard.cpp:640-643`); the linear `(V·10)²/50` formula is the separate `USE_ANALOG_SWR` + diode-detector path. → [[filter-boards]] +- PA control: **Q1 IRF630, L7808, TC4428**. Back-end connectors: **ANT-1…ANT-4**, **FROM + 100 W PA / TO 100 W PA**, **TO/FROM 20 W PA**, **TO XVTR**, **TR CTL**, **Bands**, + **KEY OUT**. + +## LPF filter board (`K9HZ_100W_11band_LPF-Filter`, added 2026-06-15) +The board holding the actual filters that the control board selects. +- **24× HF41F/12-ZS** relays = **2 per band** (input + output switch). **One dedicated LPF per + band** (11 bands) + a **BNF straight-through bypass** — not band-groups. +- Selected by **band-named control nets** `B160M…B6M, BNF` arriving on **J26/J27** (LPF CTRL + LOW/HI) from the control board's J24/J25. Each net appears 3× (2 relay coils + 1 connector pin). +- Each filter is a **7th-order LC ladder**: 3 series inductors (symmetric, outer pair equal + + distinct middle) + shunt caps. **33 inductors** (3 × 11); inductance descends with frequency + (5.21/4.73 µH at 160 m → 0.188/0.170 µH at 6 m). Caps 27 pF–2200 pF. +- Closes the band-select loop: control-board **U12 CD74HC4514 output Yn (n = band BCD)** → this + board's **B** relays → that band's filter. → [[filter-boards]] + +## What this source changed +- **Resolved:** one physical SGTL5000 (not two); RA8875 is off-board; PE4312 = the 31.5 dB/ + 0.5 dB attenuators; AD8307+AD7991 = the power/SWR chain; dual Si5351 confirmed. +- **Resolved (owner, 2026-06-14):** one SGTL5000 total (mic+TX I/Q); `pcm5102_mainBoard` = + the PCM5102 speaker DAC, mistyped `AudioControlSGTL5000` (no-op control calls). Code clarity + fix, not a bug. → [[hardware-platform]] +- **False alarm cleared (net trace, 2026-06-14):** the suspected "AD8307 log vs linear power + math" bug was a wiki error. The default digital path already does the correct log conversion; + the linear formula is the unrelated analog-diode path. → [[filter-boards]] +- Many component-level details added to [[rf-board]] and [[filter-boards]]. diff --git a/wiki/theory/.gitkeep b/wiki/theory/.gitkeep new file mode 100644 index 0000000..4fa392b --- /dev/null +++ b/wiki/theory/.gitkeep @@ -0,0 +1 @@ +# Theory pages: DSP/SDR concepts, the book, calibration, domain knowledge. diff --git a/wiki/theory/agc-design.md b/wiki/theory/agc-design.md new file mode 100644 index 0000000..4071e55 --- /dev/null +++ b/wiki/theory/agc-design.md @@ -0,0 +1,130 @@ +--- +title: AGC Design (wdsp look-ahead AGC) +type: concept +status: draft +created: 2026-06-08 +updated: 2026-06-14 +tags: [agc, gain-control, attack, decay, hang, look-ahead, wdsp] +source_refs: [] +related: ["[[theory-overview]]", "[[dsp-chain]]", "[[noise-reduction]]", "[[persistent-config]]"] +--- + +# AGC Design (wdsp look-ahead AGC) + +Automatic Gain Control keeps audio output roughly constant as received signal strength +varies over tens of dB. Phoenix uses the **wdsp** AGC (Warren Pratt NR0V's DSP library, +ported via DD4WH — [[code-heritage]]); the struct comment says so outright (`SDT.h:589`) and +the variable names match wdsp exactly. It's a **look-ahead** AGC with a hang state machine, +not a simple envelope-times-gain multiplier. + +Implementation: `AGCConfig` (`SDT.h:588`), `InitializeAGC()` (`DSP.cpp:238`), `AGC()` +(`DSP.cpp:313`). It runs at the decimated 24 kHz rate (`DSP.cpp:750`), positioned +**after the channel filter but before demodulation**: +`ConvolutionFilter → AGC → Demodulate` (`DSP.cpp:911-919`). So it acts on the **complex, +single-sideband-filtered baseband**, and its level detector uses the true analytic-signal +magnitude `sqrt(I²+Q²)` — the instantaneous envelope — which is exactly the right quantity to +ride gain on. [[noise-reduction]] runs *later*, on the demodulated audio. + +## The pieces of a good AGC *(general DSP)* + +1. **Envelope follower.** Track the signal magnitude with a one-pole leaky integrator. Each + time constant `τ` maps to a per-sample coefficient `α = 1 − exp(−1/(fs·τ))` — exactly the + form used throughout `InitializeAGC` (`DSP.cpp:275-299`). +2. **Fast attack, slow decay.** Gain must drop *instantly* when a strong signal arrives (or + it clips), but recover *slowly* (or the background "pumps"). Hence `tau_attack = 1 ms` vs. + `tau_decay = 50 ms … 2 s` depending on mode (`SDT.h:590-591`). +3. **Look-ahead.** If you compute gain from the signal you're *outputting*, attack is always + one step late → an overshoot transient escapes. wdsp delays the audio in a **ring buffer** + so the gain control can "see" a peak *before* it reaches the output and clamp it with zero + overshoot. This is the defining feature of this AGC. +4. **Hang.** After a signal stops (between syllables, between CW elements), hold the gain for + a "hang time" instead of immediately ramping up — otherwise the noise floor roars back + between words. Engaged only above `hang_thresh`. + +## How Phoenix implements it + +- **Delay-line / look-ahead.** A complex `ring` buffer with `out_index` lagging `in_index` by + `attack_buffsize = ceil(fs · n_tau · tau_attack)` samples (`DSP.cpp:273-274, 331-340`). The + output is the *delayed* sample; the gain is derived from the **peak over the look-ahead + window** `ring_max` (`DSP.cpp:350-363`). With `n_tau = 4`, `tau_attack = 1 ms`, fs = 24 kHz, + the look-ahead is `ceil(24000·4·0.001) = 96 samples` (~4 ms = 4 attack time-constants). + `n_tau` also corrects the target for the finite-buffer settling: `out_target = + out_targ·(1 − e^(−n_tau))·0.9999` (4 τ ⇒ within 1.8 % of `out_targ`). +- **`n_tau` vs `MAX_N_TAU`.** `MAX_N_TAU` is **not a live symbol** — it appears only as a + commented note `// #define MAX_N_TAU (8)` (with `MAX_SAMPLE_RATE 24000`, `MAX_TAU_ATTACK + 0.01`, `SDT.h:615-617`). Those three are the worst-case constants the static ring is + hand-sized for: `ring_buffsize = 24000·8·0.01 + 1 = 1921` samples (`SDT.h:618`). The ring is + thus over-provisioned ~20× vs the operating 96-sample look-ahead, so `n_tau`, `tau_attack`, or + fs can be raised up to those maxima without reallocating. The *operating* value is `n_tau = 4`. +- **Envelope magnitude.** `pmode = 1` → true magnitude `sqrt(I² + Q²)` of the complex sample + (`DSP.cpp:343-345`); `pmode = 0` would use the cheaper max(|I|,|Q|). +- **Two back-averages.** `fast_backaverage` and `hang_backaverage` (leaky integrators, + `DSP.cpp:347-348`) feed the decay/hang decisions. +- **State machine** (`DSP.cpp:368+`): state 0 attack, plus fast-decay, hang, and normal-decay + branches. A sudden drop larger than `pop_ratio × fast_backaverage` triggers a **fast-decay** + state (transient/"pop" handling, `DSP.cpp:374-376`); otherwise it either **hangs** + (`hang_backaverage > hang_level`) or does **normal decay**. +- **Max gain** comes from the per-band threshold: `max_gain = 10^(AGC_thresh/20)` + (`DSP.cpp:272`) — `AGC_thresh` lives per band in the `band` struct ([[persistent-config]]). + +## The gain law / soft-knee transfer curve + +Per output sample the gain multiplier is a single expression (`DSP.cpp:454`): +```c +mult = (out_target - slope_constant * fmin(0.0, log10f_fast(inv_max_input * volts))) / volts; +``` +where `volts` is the look-ahead peak envelope (`ring_max`-tracked), clamped to a floor of +`min_volts` (`DSP.cpp:447-448`). The init constants (`DSP.cpp:282-291`, defaults `SDT.h:594-596`: +`out_targ = max_input = 1.0`, `var_gain = 1.5`): +- `out_target = out_targ·(1 − e^(−n_tau))·0.9999 ≈ 0.9816` — the target output amplitude. +- `min_volts = out_target / (var_gain·max_gain)` — input floor below which AGC stops acting. +- `slope_constant = out_target·(1 − 1/var_gain) / log10(out_target / (max_input·var_gain·max_gain))`. + +Because the *output* amplitude is `volts·mult`, the multiply by `volts` cancels and the curve +becomes clean in three regions (input envelope → output amplitude): + +| Region | Input `volts` | Output `volts·mult` | Behaviour | +|---|---|---|---| +| **Limiting** | ≥ `max_input` (1.0) | `out_target` (flat) | `fmin` clamps the log term to 0 → output pinned at `out_target` regardless of input. Full compression. | +| **Soft knee** | `min_volts … max_input` | `out_target − slope_constant·log10(volts/max_input)` | **Linear-in-log(input)**: output falls by `slope_constant` per decade of input. | +| **Linear / max-gain** | < `min_volts` | `volts·max_gain` | `volts` clamped to `min_volts` → constant gain = `max_gain`; AGC inactive (`agc_action = 0`). | + +The knee is continuous: at `volts = min_volts` the soft-knee formula gives output +`= out_target/var_gain` and gain exactly `= max_gain`; at `volts = max_input` it gives +`out_target`. So **`var_gain` is the wdsp "slope" control**: the total output rise across the +whole active range is `out_target·(1 − 1/var_gain)`. With `var_gain = 1.5` that is +`0.9816·0.333 ≈ 0.327`, i.e. output climbs from `out_target/1.5 ≈ 0.654` at the max-gain point +to `≈ 0.982` at the limiting threshold — about **+3.5 dB** of deliberate output variation across +the AGC's range (a gentle knee, not a hard limiter). `var_gain = 1` would zero `slope_constant` +→ a hard knee (flat output right down to `min_volts`). `max_gain = 10^(AGC_thresh/20)` sets the +floor gain and hence the knee position via `min_volts`. + +## User-facing modes (`InitializeAGC`, `DSP.cpp:243-270`) + +| `ED.agc` | hangtime | tau_decay | hang_thresh | +|---|---|---|---| +| `AGCOff` | — | — (fixed gain ×20, `DSP.cpp:323`) | — | +| `AGCLong` | 2.0 s | 2.0 s | — | +| `AGCSlow` | 1.0 s | 0.5 s | — | +| `AGCMed` | 0.0 s | 0.25 s | — | +| `AGCFast` | 0.0 s | 0.05 s | 1.0 | + +`AGCOff` bypasses the whole machine and applies a constant `fixed_gain = 20.0`. + +## Ordering in the RX chain +`ConvolutionFilter → AGC → Demodulate → BandEQ → NoiseReduction` (`DSP.cpp:911-927`). AGC +acts on the **complex filtered signal before demodulation**, so it sees the clean +analytic-signal envelope rather than post-demod audio that NR/EQ have already reshaped. (My +earlier draft said NR ran before AGC — that was wrong; corrected 2026-06-08.) + +## Open questions +- Whether `AGC_thresh` is exposed live on the front panel / menus and its dB range. + +## Resolved +- **Soft-knee transfer curve.** Documented above: three regions (flat limiting ≥ `max_input`; + linear-in-log soft knee `min_volts…max_input` falling `slope_constant`/decade; constant + `max_gain` below `min_volts`). `var_gain` is the slope knob — total output rise across the + range = `out_target·(1 − 1/var_gain)` ≈ +3.5 dB at `var_gain = 1.5`. *(resolved 2026-06-14)* +- **`n_tau` vs `MAX_N_TAU`.** `MAX_N_TAU = 8` is a commented-out worst-case constant (not used + at runtime) baked into the static `ring_buffsize = 24000·8·0.01+1 = 1921` allocation; the + operating `n_tau = 4` gives a 96-sample (~4 ms) look-ahead at 24 kHz. *(resolved 2026-06-14)* diff --git a/wiki/theory/audio-equalizer.md b/wiki/theory/audio-equalizer.md new file mode 100644 index 0000000..2f730b2 --- /dev/null +++ b/wiki/theory/audio-equalizer.md @@ -0,0 +1,114 @@ +--- +title: Audio Equalizer (14-band parallel filterbank) +type: concept +status: draft +created: 2026-06-09 +updated: 2026-07-29 +tags: [equalizer, eq, filterbank, biquad, audio, tx, rx, sample-rate] +source_refs: [] +related: ["[[theory-overview]]", "[[dsp-chain]]", "[[ssb-phasing-method]]", "[[display-subsystem]]", "[[persistent-config]]", "[[front-panel]]", "[[runtime-filter-design]]", "[[filter-hil-test]]", "[[cat-control]]", "[[tx-filter-hil-test]]"] +--- + +# Audio Equalizer (14-band parallel filterbank) + +Phoenix has a **14-band graphic equalizer** applied to both receive audio and transmit audio, +letting the operator shape tone (e.g. tailor TX audio for punch, or RX audio for comfort). +Implemented in `BandEQ()` / `ApplyEQBandFilter()` (`DSP_FFT.cpp:787-836`). + +## How a graphic EQ works here *(general DSP)* +This is a **parallel constant-band filterbank**, not a chain of shelving filters: the audio is +run through **14 fixed band-pass biquad filters in parallel**, each output scaled by its band's +gain "slider", and the 14 scaled outputs are **summed** back into one signal. Moving a slider +boosts/cuts only that band's contribution to the sum. + +``` +audio ─┬─ band1 BPF ─×g1─┐ + ├─ band2 BPF ─×g2─┤ + │ ... ├─ Σ ─→ equalized audio + └─ band14 BPF ─×g14┘ +``` + +## The 14 bands + +Centre frequencies, from `EQ_BAND_FC_HZ[]` (`DSP_FIR.cpp:1247-1251`): + +| # | 0 | 1 | 2 | 3 | 4 | 5 | 6 | +|---|---|---|---|---|---|---|---| +| **Hz** | 198.4 | 250 | 315 | 400 | 500 | 630 | 793 | + +| # | 7 | 8 | 9 | 10 | 11 | 12 | 13 | +|---|---|---|---|---|---|---|---| +| **Hz** | 1000 | 1259 | 1587 | 2000 | 2500 | 3150 | 4000 | + +Roughly ⅓-octave spacing (the R40 series), i.e. a standard graphic-EQ layout. Each cell is +**four bandpass sections** whose resonances straddle the centre, stored as (frequency-ratio, Q) +pairs in `EQ_BAND_PROTO[14][4]` (`:1263-1278`), with a per-section gain putting the peak at +unity (`EQ_BAND_GAIN[]`, `:1254-1259`). + +## Implementation +- **Band filters:** `EQ_Coeffs[14]` (`DSP_FIR.cpp:184`) — 14 biquad-cascade coefficient sets + (`EQ_Band1Coeffs…EQ_Band14Coeffs`), `eqNumStages = 4` each, run with + `arm_biquad_cascade_df2T_f32`. +- ⚠️ **The coefficients are generated, not stored.** They used to be frozen tables designed for + 24 ksps audio, so at 176.4 ksps the 4000 Hz cell peaked at **3675 Hz**. They are now + regenerated from the analog prototype on every rate change + (`CalcBandpassCascadeCoeffs`, `InitializeReceiveAudioFilterCoeffs` `:1344-1347`) — + see [[runtime-filter-design]] for how the prototypes were recovered from the shipped tables + (every biquad had `b1 = 0`, `b2 = −b0`, i.e. zeros at `z = ±1`, the bilinear image of an + analog bandpass) and why prewarping is what makes them rate-independent. Verified to within + **0.01 dB** of the original tables in simulation, and to **0.3 %** of centre across the rate + change on the bench ([[filter-hil-test]]). +- **Separate RX/TX instances, shared coefficients:** `S_Rec[14]` and `S_Xmt[14]` filter states + both point at the same `EQ_Coeffs[i]` (`DSP_FFT.cpp:396-397`) — same bands, independent filter + memory for the two paths. One set of coefficients serves both because the receive and transmit + chains run at the same audio rate. ⚠️ That separation was **broken in practice** until 2026-07: + `ApplyEQBandFilter` scrubbed the *receive* instance's state even on the transmit path + ([[runtime-filter-design]]). + - *Testability corollary:* because the coefficients are literally the same array, verifying the + transmit cells' centre frequencies independently would add nothing — the only state a transmit + instance owns is its `pState`. This is why [[tx-filter-hil-test]] does **not** sweep them and + why no `EQ`-equivalent CAT command for `equalizerXmt` was added ([[cat-control]]). The transmit + cells are still exercised there as part of the composite passband: nothing in the transmit + chain is a deliberate high pass, so **the ~200 Hz low corner of the transmitted audio is set by + cell 0** (198.4 Hz) and moves if the cells are mis-generated. +- **Per-band gains:** `ED.equalizerRec[14]` (RX) and `ED.equalizerXmt[14]` (TX), + [[persistent-config]]. Stored as integers, scaled `/100` (100 = unity), default all 100 (flat). +- **The summation** (`ApplyEQBandFilter`): each band filters `data->I` → `eqFiltBuffer`, scales + by `sign × gain`, and **accumulates** into `eqSumBuffer`; `BandEQ` zeroes the accumulator, + loops all 14 bands, then copies the sum back to `data->I`. +- **Alternating sign:** even-numbered bands are summed with `sign = −1` + (`DSP_FFT.cpp:788-789`). This phase-alternation across adjacent overlapping band-pass filters + is what makes the filterbank **reconstruct flat** at unity gain (adjacent bands would + otherwise add constructively and bump the response). +- **NaN guard:** the per-band filter state is checked and zeroed if it goes non-finite + (`DSP_FFT.cpp:797-798`) — same cold-boot/feedback robustness theme as elsewhere in the DSP. + +## Where it runs in the chain +- **RX:** `BandEQ(&data, &RXfilters, RX)` runs after demodulation (`DSP.cpp:924`, the RX order + in [[dsp-chain]]). +- **TX:** the same engine with `TXRX = TX` shapes the microphone audio in the transmit chain + ([[ssb-phasing-method]]) using the `equalizerXmt` gains. + +## User interface +Edited on the dedicated equalizer screen `MainBoard_DisplayEqualizer` (the UISm `EQUALIZER` +state, [[display-subsystem]]); the operator selects a band and adjusts its gain with the +front-panel encoder ([[front-panel]]). A toggle switches between editing the RX and TX curves. + +Also settable over CAT: **`EQbbvvv;`** sets receive cell `bb` = 00–13 to level `vvv` = 000–100, +`EQbb;` reads one back ([[cat-control]]). Added for [[filter-hil-test]], which sweeps one cell at +100 with the rest at 0. + +## Open questions +- Gain range of the `equalizerRec/Xmt` sliders (just 0–100, or boost above 100?). The CAT `EQ` + command clamps to 000–100, which suggests no boost — worth confirming against the encoder path. +- Confirm the RX-vs-TX edit toggle path (`ToggleRXTXEqualizerEdit` referenced in `Loop.cpp`). +- What the *original* analog design was. The prototypes in `EQ_BAND_PROTO` are floats recovered + by inverse bilinear transform from the shipped tables, not a formula anyone has identified; + if it is a known filterbank standard, the 56-entry table could collapse to a generator + ([[runtime-filter-design]]). + +## Resolved +- **The 14 band centre frequencies.** Tabulated above from `EQ_BAND_FC_HZ[]` + (`DSP_FIR.cpp:1247-1251`), which the run-time filter generation exposed as named constants — + they were previously only implicit in the frozen `EQ_Band*Coeffs` tables. *(resolved + 2026-07-29)* diff --git a/wiki/theory/fast-convolution-filtering.md b/wiki/theory/fast-convolution-filtering.md new file mode 100644 index 0000000..889f101 --- /dev/null +++ b/wiki/theory/fast-convolution-filtering.md @@ -0,0 +1,72 @@ +--- +title: Fast-Convolution (FFT Overlap) Filtering +type: concept +status: draft +created: 2026-06-08 +updated: 2026-06-08 +tags: [fft, convolution, overlap-save, filtering, channel-filter] +source_refs: [] +related: ["[[theory-overview]]", "[[iq-quadrature-sampling]]", "[[ssb-phasing-method]]", "[[multirate-decimation]]", "[[zoom-fft]]", "[[dsp-chain]]", "[[code-heritage]]"] +--- + +# Fast-Convolution (FFT Overlap) Filtering + +This is the radio's main **channel filter** and the reason the ancestor project was called +the *Teensy Convolution SDR* ([[code-heritage]]). Instead of a long time-domain FIR, Phoenix +filters by **multiplying in the frequency domain** — cheap, and trivially reconfigurable +(change the mask, not the taps). + +Implementation: `ConvolutionFilter()` (`DSP_FFT.cpp:685`), mask built by `InitFilterMask()` +/ `UpdateFIRFilterMask()` (`DSP_FFT.cpp:334`). + +## Why FFT filtering *(general DSP)* + +Convolution in time = multiplication in frequency. Filtering a block with an `N`-tap FIR +costs `O(N·L)` per `L` samples directly, but `O(L log L)` via FFT → multiply → IFFT. For the +sharp, narrow SSB/CW channel filters a radio wants (hundreds of taps), the FFT route wins +and lets the passband shape be an arbitrary, **complex, asymmetric mask** — which is what +makes single-sideband selection fall out for free ([[ssb-phasing-method]]). + +The equivalent FIR length here is `m_NumTaps = FFT_LENGTH/2 + 1 = 257` (`SDT.h:423`). + +## Overlap-save, as implemented + +Phoenix uses **50%-overlap overlap-save** with a 512-point complex FFT over 256-sample +blocks (block size = `READ_BUFFER_SIZE/DF = 2048/8 = 256`, at 24 kHz). Per block +(`DSP_FFT.cpp:705-772`): + +1. **Assemble 512-sample buffer**: first half = *previous* block's I/Q + (`last_sample_buffer_L/R`), second half = current block. The overlap carries the filter's + memory across block boundaries so there's no edge discontinuity. +2. **Forward FFT**: `FFT512Forward()` in place, interleaved `[re,im,…]`. +3. **Apply mask**: `arm_cmplx_mult_cmplx_f32(buffer, FIR_filter_mask, iFFT_buffer, 512)` — + one complex multiply per bin. The mask encodes bandwidth, low/high cut, **and** sideband. +4. **(Tap the spectrum)**: the magnitude² of the masked bins feeds the audio spectrum + display (`DSP_FFT.cpp:745-761`). +5. **Inverse FFT**: `FFT512Reverse()`. +6. **Discard-and-keep**: throw away the first 256 complex samples (the time-aliased part), + keep the last 256 as clean output (`DSP_FFT.cpp:768-772`). This discard is the defining + move of overlap-**save**. + +## The filter mask = the radio's selectivity + +`FIR_filter_mask` is a length-512 **complex** array. Because the baseband is complex +([[iq-quadrature-sampling]]), the mask need not be symmetric about DC, so: +- **Bandwidth / passband** comes from which bins are non-zero (driven by the band's + `FHiCut_Hz` / `FLoCut_Hz`, `DSP_FFT.cpp:362-364`). +- **Sideband (USB/LSB)** comes from *which half* (positive vs. negative bins) is passed. +- Recomputed only when filter settings change (`UpdateFIRFilterMask`), not per block — the + efficiency payoff over time-domain variable filters. + +## Gotchas captured in the code +- The overlap history buffers `last_sample_buffer_L/R` are `static DMAMEM`, which the Teensy + 4.x does **not** zero at cold boot. Uninitialized NaN/Inf there poisons the first FFT + frame and the NR feedback state, so they are explicitly `CLEAR_VAR`'d in + `InitializeFilters()` (`DSP_FFT.cpp:380-387`). This is a real bug that was fixed — see the + cold-power-cycle NR dropout history. + +## Connections +- Runs at the decimated 24 kHz rate — see [[multirate-decimation]] for how we get there and + back. +- The same FFT machinery, with extra IIR decimation up front, drives the [[zoom-fft]] + spectrum display. diff --git a/wiki/theory/iq-imbalance-correction.md b/wiki/theory/iq-imbalance-correction.md new file mode 100644 index 0000000..52ff5d5 --- /dev/null +++ b/wiki/theory/iq-imbalance-correction.md @@ -0,0 +1,139 @@ +--- +title: I/Q Imbalance Correction & Image Rejection +type: concept +status: draft +created: 2026-06-08 +updated: 2026-07-29 +tags: [iq, imbalance, image-rejection, calibration, amplitude, phase, sample-rate] +source_refs: [] +related: ["[[theory-overview]]", "[[iq-quadrature-sampling]]", "[[ssb-phasing-method]]", "[[hardware-state-machine]]", "[[dsp-chain]]", "[[persistent-config]]", "[[sample-rate-switching]]"] +--- + +# I/Q Imbalance Correction & Image Rejection + +Quadrature SDR assumes I and Q have **equal gain** and are **exactly 90° apart**. Real +mixers and codecs aren't perfect, so a fraction of the *unwanted* sideband leaks through as +an **image** — a mirror-frequency ghost. Since Phoenix selects sidebands purely by phase +cancellation ([[ssb-phasing-method]]), image suppression *is* sideband suppression, and it +lives or dies on how accurately I/Q is balanced. Phoenix corrects the residual error in +software, per band. + +## Why imbalance creates an image *(general DSP)* + +Write the complex baseband ([[iq-quadrature-sampling]]) as `z = I + jQ`. With a gain error +`g` on Q and a phase error `φ`, the measured signal is a mix of the true signal `z` and its +conjugate `z*`. The conjugate term is the **image**: a tone meant to sit at `+f` also appears +at `−f`. The leakage power relative to the wanted signal — the **image-rejection ratio +(IRR)** — depends on both errors. Rules of thumb: + +| Want IRR | Need amplitude error ≲ | Need phase error ≲ | +|---|---|---| +| ~40 dB | ~1 % (0.09 dB) | ~1° | +| ~50 dB | ~0.3 % | ~0.3° | +| ~60 dB | ~0.1 % | ~0.1° | + +Either error alone caps the IRR, so both must be corrected. The errors drift with +**frequency** (mixer/codec response), which is why Phoenix calibrates **per band**. + +## The correction model in code + +`ApplyIQCorrection()` (`DSP.cpp:206`) is deliberately a *simplified single-axis* model — its +own comment admits "to be honest: we only correct the amplitude of the I channel": + +```c +arm_scale_f32(data->I, amp_factor, data->I, data->N); // 1) amplitude: scale I only +IQPhaseCorrection(data->I, data->Q, phs_factor, data->N); // 2) phase: cross-mix channels +``` + +`IQPhaseCorrection()` (`DSP.cpp:186`) applies a small-angle **shear** — adding a fraction of +one channel into the other rotates the relative phase: +```c +if (factor < 0) Q += factor * I; // mix a bit of I into Q +else I += factor * Q; // mix a bit of Q into I +``` +So `amp_factor` (nominal **1.0**) trims gain, `phs_factor` (nominal **0.0**) trims phase. For +small errors this is a good linear approximation of the exact 2×2 correction matrix. + +Applied early in the chain, right after RF gain and before decimation/filtering +(`ReceiveProcessing`, `DSP.cpp:787`). + +## Per-band storage + +Four arrays in the `ED` struct ([[persistent-config]], `SDT.h:302-305`), one slot per band: +- **RX**: `IQAmpCorrectionFactor[]` (init 1), `IQPhaseCorrectionFactor[]` (init 0) +- **TX**: `IQXAmpCorrectionFactor[]`, `IQXPhaseCorrectionFactor[]` + +They survive power cycles and are restored at startup. + +## How calibration estimates the factors + +The RX routine (`HardwareSm_ReceiveIQCalibration.cpp`, driven by `ReceiveIQCalSm` +([[calibration-state-machines]]) in +[[hardware-state-machine]]) sets the **RX LO to the band center** and injects a **CW test +tone exactly `SampleRate/4` above it** via the cal loopback: +```c +SetRXVFOFrequency( band_center*100 ); // HardwareSm.cpp:609 — LO = band center +SetCWVFOFrequency( (band_center + SR[SampleRate].rate/4)*100 ); // line 613 — tone = LO + Fs/4 +``` +Both the tone placement and the bin arithmetic below are written in terms of `Fs`, so they +follow the rate automatically ([[sample-rate-switching]]). Worked here at the default +**192 ksps** (`SR[].rate = 192000`), where `Fs/4 = 48 kHz` — **this is what "48 kHz above/below +the LO" in the code comment means**; it is not arbitrary, it is the [[iq-quadrature-sampling]] +Fs/4 offset. At 176.4 ksps the same expressions give 44.1 kHz, and every bin index below is +unchanged, because the tone offset and the bin width scale together. + +The measurement uses the **512-bin spectrum-display FFT** (`psdnew[SPECTRUM_RES]`, +`SPECTRUM_RES = 512`), *not* the 24 kHz baseband. Cal forces **`spectrum_zoom = 0` (1×)** +(`HardwareSm.cpp:498`) so the FFT spans the full raw **192 kHz** → bin width = 192000/512 = +**375 Hz**, and the display is fftshifted with **bin 256 = LO** (confirmed by the TX routine +reading the carrier at `psdnew[256]`). The tone at LO+Fs/4 therefore lands at +bin 256 + 48000/375 = **bin 384** (the *wanted* product); its conjugate image mirrors to +bin 256 − 128 = **bin 128**. The objective maximized is the **sideband separation**: +```c +float32_t upper = psdnew[384]; // wanted tone (LO + Fs/4) — line 195 +float32_t lower = psdnew[128]; // image (LO − Fs/4) — line 196 +sideband_separation = (upper - lower) * 10; // line 197 +``` +The `×10` converts the metric to **decibels**: `psdnew` already holds a log10 magnitude +(`DSP_FFT.cpp:144,186` write `log10f_fast(...)`), so `(upper − lower)` is a base-10 +log *ratio* and ×10 turns it into dB (power-style 10·log₁₀). Maximizing it drives the image +(bin 128) down relative to the wanted tone (bin 384). +It then runs a **3-pass coordinate search** (`AdjustRXIQCalSetting`, line 142), alternating +amplitude (even iterations) and phase (odd): + +| Pass | Iterations | Step `Delta` | Range | +|---|---|---|---| +| Coarse | 0 (amp), 1 (phase) | 0.02 / 0.01 | full sweep | +| Medium | 2, 3 | 0.01 / 0.01 | ± a few steps about the coarse optimum | +| Fine | 4, 5 | 0.001 / 0.001 | ± steps about the medium optimum | + +Each pass **re-centers** on the previous optimum (`center[nextIndex] = maxSBS_parameter`, +line 154) and shrinks the step — a classic narrowing grid/coordinate descent. During the +search, measurements are IIR-smoothed (0.5/0.5) to fight noise; a final un-smoothed +measurement is taken at the optimum (line 198-204). The machine **auto-advances through all +bands** (`AdjustRXIQBand`, line 112), ~60 ms acquisition per point (line 98). + +The TX routine (`HardwareSm_TransmitIQCalibration.cpp`) is structurally the same, maximizing +sideband separation and writing the `IQX*` arrays. + +## Distinct from carrier null + +Image (sideband) correction is **not** the same as **carrier null / LO leakage**, which is a +DC-offset / leakage problem handled separately by `TransmitCarrierCalSm` +([[hardware-state-machine]]). Image = conjugate term; carrier = additive DC/LO feedthrough. + +## Open questions +- Whether the single-axis (I-only amplitude) model leaves a residual vs. a full 2×2 matrix, + and the achieved IRR per band (needs hardware measurement). + +## Resolved +- **Tone offset = Fs/4, not "~6 kHz".** The tone is placed `SR[SampleRate].rate/4` above the + band-center LO = 48 kHz at the default 192 kHz raw rate (`HardwareSm.cpp:613`). The earlier + "bins 128/384 at 24 kHz ⇒ ±6 kHz" reasoning was wrong: the PSD here is the 192 kHz raw, + 1×-zoom 512-bin display FFT (375 Hz/bin, bin 256 = LO), so ±Fs/4 = ±128 bins = bins 128/384. + The code comment is correct. *(resolved 2026-06-14)* +- **`×10` and `psdnew` units.** `psdnew` is `log10f_fast(magnitude)` (`DSP_FFT.cpp:144,186`), + so the bin difference is a log₁₀ ratio; ×10 expresses sideband separation in **dB**. + *(resolved 2026-06-14)* +- **Wanted/image bin direction.** Wanted product = **bin 384** (tone is Fs/4 *above* the LO), + image = **bin 128**; `(upper−lower)` is maximized to suppress the image. *(resolved 2026-06-14)* diff --git a/wiki/theory/iq-quadrature-sampling.md b/wiki/theory/iq-quadrature-sampling.md new file mode 100644 index 0000000..85a2d92 --- /dev/null +++ b/wiki/theory/iq-quadrature-sampling.md @@ -0,0 +1,69 @@ +--- +title: I/Q Quadrature Sampling & Complex Baseband +type: concept +status: draft +created: 2026-06-08 +updated: 2026-06-08 +tags: [iq, quadrature, complex-baseband, image, analytic-signal] +source_refs: [] +related: ["[[theory-overview]]", "[[ssb-phasing-method]]", "[[iq-imbalance-correction]]", "[[fast-convolution-filtering]]", "[[rf-board]]", "[[dsp-chain]]"] +--- + +# I/Q Quadrature Sampling & Complex Baseband + +The foundation of the whole radio. Phoenix is a **direct-conversion quadrature receiver**: +it mixes the RF signal down to (near) 0 Hz using two local-oscillator copies 90° apart, +producing two real streams **I** (in-phase) and **Q** (quadrature) that together form one +**complex** baseband signal `z[n] = I[n] + jQ[n]`. + +## Why complex? Sign of frequency + +*(general DSP)* A single real mixer folds frequencies symmetrically about the LO: a signal +at LO+5 kHz and one at LO−5 kHz both land at 5 kHz and become inseparable (the **image** +problem). Sampling in **quadrature** keeps the two apart because the complex exponential +`e^{jωn}` distinguishes positive from negative ω, whereas a real cosine cannot. + +Concretely, for a tone at offset `f` from the LO: +- `I[n] = cos(2π f n / fs)` +- `Q[n] = sin(2π f n / fs)` + +The **sign of `f`** survives only in the *relative phase* of Q vs. I (Q leads or lags I by +90°). A real-only receiver throws that away; the quadrature receiver keeps it, so signals +above and below the LO occupy **positive vs. negative frequencies** of the complex spectrum +and can be filtered independently. This is exactly what [[ssb-phasing-method]] exploits to +pick one sideband, and what the asymmetric filter mask in +[[fast-convolution-filtering]] does in the frequency domain. + +## How Phoenix represents it in code + +The unit of work is a `DataBlock` (`SDT.h:365`): +```c +struct DataBlock { uint32_t N; uint32_t sampleRate_Hz; float32_t *I; float32_t *Q; }; +``` +I and Q are carried as **separate parallel float arrays** throughout the chain (not an +interleaved complex array) until the FFT, where they are interleaved `[re,im,re,im,…]` for +the CMSIS-DSP complex FFT (`ConvolutionFilter`, `DSP_FFT.cpp:707-718`). + +- The hardware quadrature LO is the Si5351 on the [[rf-board]]; the codec digitizes I and Q + at **192 kHz** (`Globals.cpp:106`). +- A block is **2048 samples** (`READ_BUFFER_SIZE`, `SDT.h:175-178`), ≈10.7 ms — matching the + loop's [[real-time-constraints]]. +- After decimation to 24 kHz the notional sampled span is **−12 kHz … +12 kHz** around the + LO (`DSP_FFT.cpp:737`); the negative half is real RF, not a mathematical artifact. + +## The catch: imperfect quadrature + +The above assumes I and Q have exactly equal gain and exactly 90° separation. Real mixers +don't — amplitude/phase imbalance lets a fraction of the unwanted sideband leak through as +an **image**. Phoenix corrects this per band before filtering (`ApplyIQCorrection`, +`DSP.h:111`). See [[iq-imbalance-correction]]. + +## Spectral bookkeeping (worth memorizing) +At 24 kHz over a 512-point FFT, each bin is **24000/512 = 46.875 Hz** (`DSP_FFT.cpp:740`). +Positive frequencies occupy bins 1…129, negative frequencies bins 1023…895 +(`DSP_FFT.cpp:743-744`). The display plots DC…6 kHz = ¼ of the span = 128 bins. + +## See also +- [[ssb-phasing-method]] — using the sign-of-frequency property to select a sideband. +- [[fast-convolution-filtering]] — the complex frequency-domain filter that does it. +- [[zoom-fft]] — zooming the complex baseband for the spectrum display. diff --git a/wiki/theory/multirate-decimation.md b/wiki/theory/multirate-decimation.md new file mode 100644 index 0000000..833052d --- /dev/null +++ b/wiki/theory/multirate-decimation.md @@ -0,0 +1,155 @@ +--- +title: Multirate Decimation & Interpolation +type: concept +status: draft +created: 2026-06-08 +updated: 2026-07-29 +tags: [decimation, interpolation, multirate, polyphase, fir, sample-rate] +source_refs: [] +related: ["[[theory-overview]]", "[[fast-convolution-filtering]]", "[[iq-quadrature-sampling]]", "[[dsp-chain]]", "[[real-time-constraints]]", "[[sample-rate-switching]]", "[[runtime-filter-design]]", "[[tx-filter-hil-test]]"] +--- + +# Multirate Decimation & Interpolation + +Phoenix digitizes at **192 or 176.4 kHz** ([[sample-rate-switching]]) but does its channel +filtering at a much lower rate, then +brings audio back up to the output rate. Working at the lower rate is what makes the sharp +SSB/CW channel filter affordable: a narrow filter needs a transition band that is a *large +fraction* of Nyquist, which costs few taps at low fs and many at high fs. + +## Decimation = anti-alias filter + downsample *(general DSP)* + +Dropping the sample rate by `M` folds everything above the new Nyquist (`fs/M / 2`) back into +band. So you must **low-pass first** to kill anything that would alias onto the signal of +interest, *then* keep every `M`-th sample. Interpolation is the mirror image: insert `M−1` +zeros (which creates spectral **images**) then low-pass to remove them. + +CMSIS's `arm_fir_decimate_f32` / `arm_fir_interpolate_f32` are **polyphase**: they compute +only the samples that survive, so cost ∝ `numTaps × outputRate`, not input rate. + +## What Phoenix does + +| Path | Stages | Net | Result @192k | @176.4k | Where | +|---|---|---|---|---|---| +| **RX** | ÷4 then ÷2 | **÷8** | 192 → 24 kHz | 176.4 → 22.05 kHz | `DecimateRxStage1/2`, `SDT.h:407-411` | +| RX out | ×2 then ×4 | ×8 | 24 → 192 kHz | 22.05 → 176.4 kHz | `FIR_int1/2`, `InterpolateReceiveData` `DSP.cpp:697` | +| **TX** | ÷4·÷2·÷2 | **÷16** | 192 → 12 kHz | 176.4 → 11.025 kHz | `TransmitFilterConfig`, `SDT.h:537-553` | +| TX out | ×2·×2·×4 | ×16 | 12 → 192 kHz | 11.025 → 176.4 kHz | same struct | + +RX decimation filters are **designed at runtime** (`InitializeDecimationFilter`, +`DSP_FIR.cpp:1284`) to a 9 kHz passband and **90 dB** stopband (`SDT.h:412-413`). TX instead +uses fixed precomputed 48-tap coefficient sets (`coeffs192K_10K_LPF_FIR`, etc., +`SDT.h:528-533`, `DSP_FFT.cpp:425-442`) — an asymmetry explained below. + +### Why RX designs taps at runtime but TX uses fixed tables +This is **primarily heritage / an incremental refactor, not a deliberate determinism or +latency choice.** The evidence: + +- **The fixed tables are legacy, and shared.** The arrays are named and commented for the + *receive* path — `// 48 Tap Kaiser 192KHz 8KHz Fc RXfilters Dec and Interpolation` + (`DSP_FIR.cpp:174-175`) — yet they are consumed by the **TX** chain + (`coeffs192K_10K_LPF_FIR` at `DSP_FFT.cpp:425`, etc.). They are the original DD4WH + Convolution-SDR coefficient sets ([[code-heritage]]). The RX *decimation* path was later + re-parametrized into `InitializeDecimationFilter` (harris tap-count + Kaiser design, + heap-allocated `malloc`, `DSP_FIR.cpp:1295-1300`); the TX path was built by **reusing the + legacy fixed tables wholesale**. + +- **The runtime path's structural benefit — rate independence — is now live.** ⚠️ *Corrected + 2026-07-29:* this section previously said the benefit was "dormant" because `SampleRate` was + "set once to `SAMPLE_RATE_192K` and **never reassigned** anywhere in the firmware". **That is + no longer true.** `SampleRate` is a reference to the persisted `ED.sampleRate` + (`Globals.cpp:106-109`) and is reassigned by `ChangeSampleRate()` + (`MainBoard_AudioIO.cpp:519`) from a menu or over CAT — see [[sample-rate-switching]]. + `InitializeDecimationFilter` derives both `n_dec_taps` and the coefficients from + `SR[SampleRate].rate`, so RX genuinely does retune, and the whole DSP chain is rebuilt on + each change. `InitializeDecimationFilter` now also **frees its previous allocations**, which + it did not need to do while this path ran once per boot. + +- **Net trade-off as it stands:** TX = no heap, fully deterministic; RX = small heap + allocations, recomputed on every rate change rather than to a constant result. + +**Nuance:** "RX designs at runtime, TX is fixed" over-simplifies, and after +[[runtime-filter-design]] it is the wrong axis entirely. RX is itself a hybrid — only RX +*decimation* is fully runtime (harris-sized); RX *interpolation* uses **fixed tap counts (48 and +32)** with coefficients still computed at runtime by `CalcFIRCoeffs` (`DSP_FFT.cpp:401-403`). + +The framing that actually predicts behaviour is **how a stage's corner is specified**: + +| Specification | Behaviour under a rate change | Action taken | +|---|---|---| +| **Fraction of Fs** — decimation, interpolation, Hilbert, [[zoom-fft]] | corner scales with Fs, which is *correct* for anti-alias/anti-image | left alone | +| **Absolute Hz** — CW audio, equaliser cells, CW decoder FIR, the two TX stages around the Hilbert | corner drifts by the rate ratio, which is a **bug** | regenerated per rate ([[runtime-filter-design]]) | + +⚠️ "Regenerated per rate" does not mean "identical at every rate". The two Hz-specified **TX** +stages are 48-tap FIRs, and a fixed tap count cannot place a corner exactly when the normalised +cutoff moves — they hold to **≈1.2 %**, against 0.3 % for the IIR receive stages. See +[[runtime-filter-design]]. + +### Where the TX fold point lands, per rate + +`TXDecimateBy2Again` is the stage whose stopband matters most, because it halves the audio rate +and so folds everything above a quarter of it back into the transmitted audio: + +| Fs | Audio rate | Output Nyquist (fold point) | An 8 kHz mic tone reappears at | +|---|---|---|---| +| 192 ksps | 24 kHz | **6 kHz** | 4000 Hz | +| 176.4 ksps | 22.05 kHz | **5512 Hz** | 3025 Hz | + +The fold frequency scales with Fs, so a bench test has to recompute where to look at each rate — +which is what [[tx-filter-hil-test]] does. The pre-2026-07 table was flat to 0.425·Fs, i.e. it +did not attenuate that region at all. + +## The filter-length formula (and why two stages) + +`InitializeDecimationFilter` sizes each filter with the fred-harris estimate *(general DSP)*: +```c +n_fpass = BW / fs; // normalized passband edge +n_fstop = (fs/M - BW) / fs; // normalized stopband edge (protect BW past new Nyquist) +n_dec_taps = 1 + att_dB / (22 * (n_fstop - n_fpass)); // N ≈ A_stop / (22·Δf) +``` +The tap count is inversely proportional to the **normalized transition width** `Δf`. That is +the whole argument for splitting the rate change: + +Working it for Phoenix's RX (BW = 9 kHz, att = 90 dB): + +| Approach | M, fs in | Δf (norm.) | ~taps | runs at | cost ∝ taps×outRate | +|---|---|---|---|---|---| +| Stage 1 | 4, 192 kHz | 0.156 | ≈27 | 48 kHz out | ≈1.3 M | +| Stage 2 | 2, 48 kHz | 0.125 | ≈33 | 24 kHz out | ≈0.8 M | +| **Two-stage total** | | | ≈60 | | **≈2.1 M** | +| Single ÷8 | 8, 192 kHz | 0.031 | ≈132 | 24 kHz out | ≈3.2 M | + +*(Worked at 192 ksps. The normalized quantities `Δf` and the tap counts are unchanged at +176.4 ksps — BW is absolute so `n_fpass` shifts slightly, but the argument and the ≈5× ratio +hold.)* + +A single ÷8 stage needs a far sharper (5×) filter because its transition band is squeezed +against the *final* 12 kHz Nyquist while still running at 192 kHz. Splitting lets the first +stage be lazy (wide transition, the new Nyquist is still 24 kHz) and only the last stage be +sharp — fewer taps, less memory, lower MAC load. *(Tap counts above are computed from the +formula, not read from code; exact values depend on integer rounding.)* + +## Implementation conventions +- **State-vector size = `numTaps + blockSize − 1`** (a CMSIS requirement) appears everywhere + here; see the annotated allocations in `SDT.h:494-508` and `DSP_FIR.cpp:1295-1296`. +- After ÷8, the RX block is 2048/8 = **256 samples** at 24 kHz — exactly the block size the + [[fast-convolution-filtering]] FFT expects. +- The whole cascade's group delay counts against the ~10 ms loop budget + ([[real-time-constraints]]). + +## Open questions +- Measured group delay of the RX decimate→filter→interpolate round trip. + +## Resolved +- **TX fixed taps vs RX runtime harris.** Primarily **heritage**, not a deliberate + determinism/latency choice: the fixed 48-tap tables are legacy DD4WH coefficients (the arrays + are even named/commented "RXfilters", `DSP_FIR.cpp:174-175`) reused wholesale by the TX path, + while RX *decimation* was refactored into the parametrized harris-formula design. RX is + itself a hybrid (decimation runtime-sized; interpolation fixed 48/32 taps, + `DSP_FFT.cpp:401-403`). *(resolved 2026-06-14)* + - ⚠️ **Superseded in part 2026-07-29.** The original resolution added that the rate-independence + was "dormant — `SampleRate` is fixed at 192 kHz, so RX recomputes the same coeffs every + boot". `rx-dsp-176k-stage-test` made the rate switchable at run time + ([[sample-rate-switching]]) and regenerated the Hz-specified filters + ([[runtime-filter-design]]), so that clause no longer holds. The heritage explanation for + the *asymmetry* still stands; the "dormant" characterisation does not. diff --git a/wiki/theory/noise-reduction.md b/wiki/theory/noise-reduction.md new file mode 100644 index 0000000..c2c2cde --- /dev/null +++ b/wiki/theory/noise-reduction.md @@ -0,0 +1,122 @@ +--- +title: Noise Reduction Algorithms +type: concept +status: draft +created: 2026-06-08 +updated: 2026-06-14 +tags: [noise-reduction, nr, spectral-subtraction, lms, kim, ephraim-malah, auto-notch] +source_refs: [] +related: ["[[theory-overview]]", "[[agc-design]]", "[[dsp-chain]]", "[[fast-convolution-filtering]]"] +--- + +# Noise Reduction Algorithms + +Phoenix offers **three** selectable noise-reduction algorithms plus off, dispatched by +`NoiseReduction()` (`DSP.cpp:672`) on `ED.nrOptionSelect`. They span two completely +different families: **frequency-domain spectral gain** (Kim, Spectral) and a +**time-domain adaptive filter** (LMS). Implementations live in `DSP_Noise.cpp`. In the RX +chain NR runs on the **demodulated audio**, i.e. **after** AGC and demodulation and the band +EQ: `ConvolutionFilter → AGC → Demodulate → BandEQ → NoiseReduction` (`DSP.cpp:911-927`). + +| Option | Function | Family | Line | +|---|---|---|---| +| `NROff` | — | none | — | +| `NRKim` | `Kim1_NR()` | spectral subtraction (Kim & Ruwisch style), ×30 post-scale | `DSP.cpp:677` | +| `NRSpectral` | `SpectralNoiseReduction()` | decision-directed MMSE (Ephraim-Malah) | `DSP.cpp:682` | +| `NRLMS` | `Xanr()` | LMS adaptive filter / auto-notch | `DSP.cpp:685` | + +## 1. Spectral-gain NR *(general DSP)* + +Both `NRKim` and `NRSpectral` work the same way at a high level: take a short-time FFT of the +audio, **estimate the noise floor per frequency bin**, then apply a **real gain `0…1` per +bin** that attenuates bins dominated by noise and passes bins dominated by signal, then +inverse-FFT. They differ in how the gain is computed. + +### Kim1_NR (`DSP_Noise.cpp:134`) +- **256-point FFT** (`NR_FFT_L = 256`), **128-sample frame step** → 50% overlap, **Hann + window** (`line 192-194`), processed two half-blocks per call (`for k in 0..1`). +- Runs at the **24 kHz decimated RX rate** (raw 192 kHz ÷ DF1·DF2 = 4·2 = 8; `SDT.h:409-410`), + so the **bin bandwidth is 24000/256 = 93.75 Hz**. The in-code comment + `// bin BW is 46.9Hz [12000Hz / 256 bins] @96kHz` (`DSP_Noise.cpp:141,155`) is a **stale + DD4WH heritage artifact** — those are the *old* Convolution-SDR numbers (96 kHz input, + 12 kHz NR rate). The running code is rate-agnostic: it divides by the **live** + `data->sampleRate_Hz / NR_FFT_L` (`line 155-156`), so it is correct at 24 kHz despite the + comment. See [[code-heritage]]. +- A **VAD (voice-activity) bin range** is computed from the band's `FLoCut/FHiCut` + (`line 143-172`) so the gain is only shaped across the actual channel passband — bins + outside the audio filter are left alone. +- Smoothing/aggressiveness constants: `NR_alpha = 0.95`, `NR_KIM_K = 1.0`, `NR_PSI = 3.0` + (`DSP_Noise.cpp:43-44`). +- The DSP applies a **×30 gain** to the result afterward (`DSP.cpp:678-679`) to make up the + algorithm's level loss. + +### SpectralNoiseReduction (`DSP_Noise.cpp:387`) +The sophisticated one. Its own comment cites the literature: *"Based on Romanin et al. 2009, +Schmitt et al. 2002, and Gerkmann & Hendriks 2002"* (`line 361`). That is the +**decision-directed MMSE** lineage: +- **A-posteriori and a-priori SNR** per bin (`NR_SNR_post`, `NR_SNR_prio`), the a-priori SNR + smoothed by the decision-directed rule (`NR_alpha`). +- **Minimum-statistics / Gerkmann-Hendriks noise estimation** (`NR_Nest`). +- Per-bin gain `NR_G` with hysteresis (`NR_Hk_old`, `NR_Gts`). +This is the same family as the wdsp/DD4WH "spectral NR" and gives the least musical-noise of +the three. *(general DSP)* The classic failure mode of naive spectral subtraction is +**musical noise** — isolated random surviving bins that warble; the MMSE/decision-directed +approach exists specifically to suppress it. + +## 2. LMS adaptive filter — `Xanr()` (`DSP_Noise.cpp:302`) + +A single structure that does **both** noise reduction and auto-notch, selected by the +`ANR_notch` argument. It's an **adaptive line enhancer (ALE)**: predict the current sample +from a **decorrelation-delayed** copy of the signal using a 64-tap LMS filter. + +```c +y = Σ w[j]·d[idx]; // adaptive prediction (idx = in + j + ANR_delay) +error = d - y; // what the predictor could NOT predict +data->Q[i] = ANR_notch ? error // NOTCH: keep the unpredictable part → tone removed + : y; // NR: keep the predictable part → tonal/coherent kept +``` + +*(general DSP)* Over a decorrelation delay, **narrowband (tone-like)** components stay +correlated and are predictable; **broadband noise** is not. So `y` (prediction) isolates +tones and `error` (residual) removes them — hence the same engine is **auto-notch** for +heterodyne whistles/carriers (mode 1) and a coherent-signal enhancer (mode 0). It appears +**twice** in the RX chain: as `Xanr(data, 0)` inside `NoiseReduction()` (NR mode, +`DSP.cpp:685`), and as `Xanr(&data, 1)` (notch) at `DSP.cpp:930`, gated by `ED.ANR_notchOn`, +each followed by a copy of the result `Q → I` (see I/O contract below). + +### I/O contract (important, and a little surprising) +`Xanr` **reads `data->I`, writes its output to `data->Q`, and never modifies `data->I`**. But +everything downstream (`InterpolateReceiveData`, `DSP.cpp:700`) treats **`I`** as the primary +channel. So each `Xanr` call is followed by a `Q → I` copy that also folds in a makeup gain: +- NR mode: `arm_scale_f32(data->Q, 2, data->I, N)` (`DSP.cpp:687`) — 2× makeup, Q→I. +- Notch: `arm_copy_f32(data.Q, data.I, N)` (`DSP.cpp:932`) — plain Q→I. + +This *looks* like a `Q`/`I` mix-up but is correct (verified 2026-06-08): without it the +denoised signal in `Q` would be discarded. The commented-out `//arm_scale_f32(data->I, 1.5, +data->I,…)` next to line 687 is the buggy in-place variant they abandoned — it would have +scaled the *un-denoised* `I`. Treat the "Xanr outputs to Q" convention as a documented +gotcha. + +Parameters (`DSP_Noise.cpp:51-59`): `ANR_taps = 64`, `ANR_delay = 16`, step +`ANR_two_mu = 1e-4`, delay-line `ANR_DLINE_SIZE = 512`. The update is a **leaky normalized +LMS**: `w[j] = c0·w[j] + c1·d[idx]` with `c0 = 1 − 2µ·ngamma` (adaptive leakage) and +`c1 = 2µ·error/σ` (normalization by input energy `σ`, `line 345-350`). The leakage `ngamma` +is driven by an adaptive index `ANR_lidx` clamped to 120…200 (`line 337-343`) — this is the +wdsp "leak" control that trades convergence speed against stability. + +## Robustness notes captured in the code +- **NaN latch hazard.** `Xanr` sanitizes each input sample (`line 311-314`): a single + non-finite sample would otherwise be baked **permanently** into the adaptive weights and + never wash out. The spectral buffers are `DMAMEM` and `CLEAR_VAR`'d at init + (`DSP_Noise.cpp:112`) — the same cold-boot uninitialized-DMAMEM class of bug noted for the + convolution overlap buffers in [[fast-convolution-filtering]] (and fixed in the + "NR audio dropout after cold power cycle" change). + +## Open questions +- Where `ED.ANR_notchOn` and the manual-vs-auto notch choice are set in the UI. + +_Resolved 2026-06-08: the `DSP.cpp:687` `Q→I` 2× scale is correct, not a typo (see I/O +contract above); auto-notch is `Xanr(&data,1)` at `DSP.cpp:930`._ +_Resolved 2026-06-14: NR runs at the **24 kHz** decimated rate → 93.75 Hz/bin (256-pt FFT). +The `12000Hz … @96kHz` bin-BW comment is stale DD4WH text; the code uses the live sample rate +(`data->sampleRate_Hz / NR_FFT_L`) so it is correct regardless of the comment._ diff --git a/wiki/theory/ssb-phasing-method.md b/wiki/theory/ssb-phasing-method.md new file mode 100644 index 0000000..feaa0c3 --- /dev/null +++ b/wiki/theory/ssb-phasing-method.md @@ -0,0 +1,116 @@ +--- +title: SSB by the Phasing (Hilbert) Method +type: concept +status: draft +created: 2026-06-08 +updated: 2026-07-29 +tags: [ssb, phasing, hilbert, usb, lsb, demodulation, modulation, sample-rate, hil] +source_refs: [] +related: ["[[theory-overview]]", "[[iq-quadrature-sampling]]", "[[fast-convolution-filtering]]", "[[dsp-chain]]", "[[mode-state-machine]]", "[[tx-filter-hil-test]]", "[[runtime-filter-design]]", "[[iq-imbalance-correction]]"] +--- + +# SSB by the Phasing (Hilbert) Method + +Phoenix generates and demodulates single-sideband by the **phasing method** — *not* the +filter method and *not* the Weaver/third-method. The defining evidence is the ±45° Hilbert +FIR pair on transmit (`DSP_FFT.cpp:851`) and the asymmetric complex filter mask on receive. + +## The principle *(general DSP)* + +A real audio tone `cos(ω_a t)` contains **both** +ω_a and −ω_a. To transmit only one +sideband you must suppress one of them. The phasing method builds the **analytic signal** +— a complex signal whose spectrum is one-sided — by pairing the audio with its **Hilbert +transform** (a 90° phase shift at all frequencies): + +``` +analytic(t) = audio(t) + j·Hilbert{audio(t)} +``` + +Mixing this complex signal up against the quadrature LO places the audio on exactly one side +of the carrier. Choosing **+** or **−** for the j term (equivalently, swapping I/Q or +negating one) flips between **USB and LSB**. No steep analog/IF crystal filter is needed — +the sideband rejection comes from phase cancellation, which is why image/imbalance accuracy +matters so much ([[iq-imbalance-correction]]). + +## Transmit path in Phoenix + +`TransmitProcessing()` (`DSP.h:83`) → the relevant stage `HilbertTransform()` +(`DSP_FFT.cpp:851`): + +```c +// Operates at 12 kHz, 128-sample blocks +arm_fir_f32(&FIR_Hilbert_L, data->I, data->I, 128); // +45° FIR (coeffs_45) +arm_fir_f32(&FIR_Hilbert_R, data->Q, data->Q, 128); // −45° FIR (coeffs_neg_45) +``` + +Key implementation details: +- Rather than one 90° shifter plus a delay, Phoenix uses a **+45°/−45° pair** of 100-tap + FIRs (`FIR_Hilbert_coeffs_45` / `_neg_45`, `SDT.h:531-532`). Their *difference* is 90°, + and being symmetric about 0° keeps both branches' amplitude/group-delay matched — the + standard practical way to build a wideband Hilbert pair. +- Audio is decimated 192 kHz → **12 kHz** first (`TransmitFilterConfig` ÷4·÷2·÷2, + `SDT.h:537-553`); the Hilbert works over ~5 kHz BW at 12 kHz (`DSP_FFT.cpp:852`). +- Sideband choice is a one-line sign flip: `SidebandSelection()` negates I for USB, LSB is + the default (`DSP_FFT.cpp:864-869`). +- The quadrature pair is then interpolated back to 192 kHz and sent to the codec → Si5351 + quadrature mixer on the [[rf-board]]. + +⚠️ **The Hilbert table is deliberately *not* regenerated per sample rate**, and that is correct +rather than an oversight. A Hilbert transformer's usable band is a **fraction of its sample +rate**, so one fixed 100-tap table is the same design at any rate — its band edges are *meant* to +scale with Fs, exactly like an anti-alias filter's ([[runtime-filter-design]]). At 176.4 ksps the +Hilbert runs at 11.025 kHz instead of 12 kHz and its ~5 kHz band shrinks in proportion, which +costs nothing because the transmit audio bandwidth is only 2.76 kHz. This is why +[[tx-filter-hil-test]] checks sideband suppression against a **floor** rather than for rate +invariance in hertz: requiring the suppression curve to hold still would fail correct firmware. + +## Measuring sideband suppression on the bench + +The transmit output is complex baseband, so suppression is directly observable: capture I and Q +**synchronously**, form `I + jQ`, and read the ratio of the line at `+f` to the one at `−f`. Both +come out of a single capture. Two separate single-channel captures would have no defined phase +relationship between them and the ratio would be meaningless — the sideband information lives +entirely in the phase *between* the channels. + +The `SidebandSelection()` sign flip also has a use the firmware never intended: because +commanding USB conjugates the transmitted signal, it moves the tone to the other side of DC. +Swapping the two scope probes does the same thing, so a single capture cannot tell the two apart — +but the **change** between LSB and USB can, since nobody rewires the bench mid-measurement. That +is how [[tx-filter-hil-test]] resolves which probe is on I without being told. + +Note this measurement cannot separate the Hilbert pair's phase accuracy from +[[iq-imbalance-correction]]'s per-band amplitude/phase correction, or from a plain gain difference +between the two exciter outputs. From the exciter's terminals all three look identical. + +## Receive path — phasing done in the frequency domain + +On RX, Phoenix doesn't run a separate time-domain Hilbert. Instead, sideband selection is +folded into the **fast-convolution filter mask** ([[fast-convolution-filtering]]). Because +the baseband is complex ([[iq-quadrature-sampling]]), one sideband is the positive-frequency +half and the other is the negative-frequency half of the FFT. The complex `FIR_filter_mask` +(`InitFilterMask`, `DSP_FFT.cpp`) passes only the wanted half. + +By the time `Demodulate()` (`DSP.cpp:629`) runs, the unwanted sideband is already gone, so +for USB/LSB it simply copies the real part to both output channels: +```c +case LSB: case USB: + arm_copy_f32(data->I, data->Q, data->N); // real part is the audio + break; +``` +(AM/SAM take different branches — magnitude estimation / synchronous detection.) The LSB vs. +USB distinction shows up earlier, in which FFT bins the mask keeps and which half the PSD is +read from (`DSP_FFT.cpp:748-754`). + +## Why this matters +- **Sideband rejection = phase accuracy.** Any I/Q amplitude/phase error reintroduces the + opposite sideband as an image → [[iq-imbalance-correction]], and the RX/TX I/Q calibration + routines in [[hardware-state-machine]]. +- Operating mode (USB/LSB/CW/AM/SAM) is owned by [[mode-state-machine]] via + `ED.modulation[ED.activeVFO]`. + +## Contrast with alternatives *(general DSP)* +- **Filter method**: generate DSB, cut one sideband with a steep filter. Simple but needs a + high-Q filter; Phoenix avoids it. +- **Weaver / third method**: mix audio to a low IF, low-pass, mix again. No wideband Hilbert + needed, but two extra mixers. Phoenix is **not** Weaver — confirm if any module hints + otherwise before claiming it. diff --git a/wiki/theory/synchronous-am-detection.md b/wiki/theory/synchronous-am-detection.md new file mode 100644 index 0000000..e28081b --- /dev/null +++ b/wiki/theory/synchronous-am-detection.md @@ -0,0 +1,72 @@ +--- +title: Synchronous AM Detection (SAM) +type: concept +status: draft +created: 2026-06-09 +updated: 2026-06-09 +tags: [sam, am, synchronous-detection, pll, carrier, demodulation, fading] +source_refs: [] +related: ["[[theory-overview]]", "[[ssb-phasing-method]]", "[[iq-quadrature-sampling]]", "[[dsp-chain]]", "[[display-subsystem]]", "[[code-heritage]]"] +--- + +# Synchronous AM Detection (SAM) + +Phoenix offers **SAM** as a demodulation mode alongside plain AM. `AMDecodeSAM()` +(`DSP.cpp:567`) is the classic DD4WH/wdsp synchronous detector ([[code-heritage]]), selected by +the `SAM` case in `Demodulate()` ([[dsp-chain]]). + +## Why synchronous detection *(general DSP)* +Plain **envelope AM** (the `AM` case uses a magnitude estimator, `AlphaBetaMag`) distorts badly +under **selective fading**, where the carrier fades independently of the sidebands — the +recovered audio tears up as the carrier drops. **Synchronous AM** instead **regenerates a clean, +steady carrier** locked to the incoming one with a PLL, then mixes coherently. Replacing the +faded carrier with a local steady reference makes detection robust to fading and reduces +distortion — the same reason BFO/product detection beats envelope detection. + +## How Phoenix does it — a 2nd-order PLL + +For each sample (`DSP.cpp:585-613`): +1. **NCO:** generate `Sin`/`Cos` at the current loop phase `phzerror` + (`arm_sin_f32`/`arm_cos_f32`). +2. **Mix** the complex baseband ([[iq-quadrature-sampling]]) against the NCO to get the in-phase + correlation `corr[0]` and quadrature error `corr[1]`, and the coherent `audio`. +3. **Phase detector:** `det = atan2(corr[1], corr[0])` (via `ApproxAtan2`) — the phase error + between the local NCO and the received carrier. +4. **Loop filter + NCO update** (2nd-order): + ``` + omega2 += g2 * det; // integrator → tracks frequency offset (clamped ±pll_fmax) + fil_out = g1 * det + omega2; // proportional + integral + phzerror += (prev fil_out); // NCO accumulates phase, wrapped mod 2π + ``` + The loop gains `g1`, `g2` are derived from the PLL **bandwidth `omegaN = 200`** and damping + `zeta`, and the frequency estimate `omega2` is clamped to **±`pll_fmax = 4000 Hz`** + (`DSP.cpp:579-582`). + +When locked, `omega2` *is* the carrier frequency offset, and the coherent `audio` is the +demodulated output. + +## Fade leveler +An optional **fade leveler** (`fade_leveler`) tracks two DC averages with time constants +`tauR`/`tauI` and re-inserts the difference (`DSP.cpp:594-598`) to even out amplitude as the +signal fades. + +## Carrier-offset readout +The detected offset is published for the UI: +``` +SAM_carrier = omega2 · fs / (2·2π); +SAM_carrier_freq_offset = 0.95·prev + 0.05·(10·SAM_carrier); // smoothed +``` +`GetSAMCarrierOffset()` returns it, and the home-screen **SAM-offset pane** displays it +([[display-subsystem]]) — so the operator can see how far the PLL has pulled and zero-beat the +tuning. + +## Relationship to other modes +- **AM** (envelope) vs **SAM** (synchronous) are both AM-family demods in `Demodulate()`. +- Distinct from SSB ([[ssb-phasing-method]]), which needs no carrier recovery (the sideband + *is* the signal). + +## Open questions +- Exact `zeta` value and the `tauR`/`tauI` fade-leveler constants (and `zeta_help`). +- Why the `×10` factor in the smoothed `SAM_carrier_freq_offset` (display scaling?). +- Whether SAM supports selectable sideband (DSB vs single-sideband SAM) — check the `corr` + combination. diff --git a/wiki/theory/theory-overview.md b/wiki/theory/theory-overview.md new file mode 100644 index 0000000..feb112b --- /dev/null +++ b/wiki/theory/theory-overview.md @@ -0,0 +1,81 @@ +--- +title: DSP / SDR Theory — Overview +type: overview +status: draft +created: 2026-06-08 +updated: 2026-07-29 +tags: [dsp, sdr, theory, iq, ssb, filtering, sample-rate] +source_refs: [] +related: ["[[iq-quadrature-sampling]]", "[[ssb-phasing-method]]", "[[fast-convolution-filtering]]", "[[multirate-decimation]]", "[[iq-imbalance-correction]]", "[[agc-design]]", "[[zoom-fft]]", "[[dsp-chain]]", "[[sample-rate-switching]]", "[[runtime-filter-design]]"] +--- + +# DSP / SDR Theory — Overview + +This is the **theory** spine for Phoenix: version-independent signal-processing concepts, +constructed from the codebase plus standard DSP fundamentals. (We do **not** have an +electronic copy of the Purdum & Peter T41 book; nothing here is sourced from it.) + +**Convention.** Claims that come from the code are cited as `file:line`. Claims that are +general DSP theory are marked *(general DSP)*. Where the two meet, the code citation pins +the specific choice and the theory explains why it works. + +## The signal path, end to end + +Phoenix is a **direct-conversion quadrature SDR**. The Si5351 produces a local oscillator at +(near) the operating frequency in two copies 90° apart; mixing the antenna signal against +them yields a complex **I/Q baseband** signal that is digitized and processed entirely in +software. Defaults (`Globals.cpp:106`, `SDT.h`): + +| Quantity | Value | Where | +|---|---|---| +| I/O sample rate | **192 kHz** default, **176.4 kHz** selectable | `SampleRate` → `ED.sampleRate`, `Globals.cpp:106-109`, `SDT.h:287` | +| Block size | **2048** samples (≈10.7 ms @192k) | `READ_BUFFER_SIZE = 128×16`, `SDT.h:175-178` | +| RX decimation | ÷4 then ÷2 = **÷8** → 24 / 22.05 kHz | `ReceiveFilterConfig`, `SDT.h:409-411` | +| TX decimation | ÷4·÷2·÷2 = **÷16** → 12 / 11.025 kHz | `TransmitFilterConfig`, `SDT.h:537-553` | +| FFT length | **512** | `FFT_LENGTH = SPECTRUM_RES`, `SDT.h:145-146` | + +⚠️ The rate is **no longer fixed at boot** — it is user-selectable and persisted +([[sample-rate-switching]]). Every derived figure on this page and its children that is quoted +in Hz rather than as a fraction of Fs is a *192 ksps* figure; at 176.4 ksps multiply by +`176400/192000 = 0.91875`. + +This block size is exactly the ~10 ms real-time budget the firmware is built around — see +[[real-time-constraints]]. + +## Core concepts (each its own page) + +1. **[[iq-quadrature-sampling]]** — why complex baseband; how I/Q encodes both magnitude and + *sign* of frequency offset, enabling a single receiver to separate signals above and + below the LO. The foundation everything else rests on. +2. **[[ssb-phasing-method]]** — Phoenix demodulates and generates SSB by the **phasing + (Hilbert)** method, *not* Weaver or the filter method. RX `Demodulate()` and TX's ±45° + Hilbert FIR pair (`DSP_FFT.cpp:851`). +3. **[[fast-convolution-filtering]]** — the main channel filter is **FFT overlap fast + convolution** (the "Convolution SDR" namesake). `m_NumTaps = FFT_LENGTH/2+1` (`SDT.h:423`). +4. **[[multirate-decimation]]** — two-stage polyphase decimation/interpolation, and why + dropping to 24 kHz makes the channel filter cheap. +5. **[[iq-imbalance-correction]]** — per-band amplitude/phase correction for image rejection; + the theory behind RX/TX I/Q calibration. +6. **[[agc-design]]** — the wdsp-derived AGC (attack/decay, hang). +7. **[[zoom-fft]]** — spectrum-display zoom via IIR decimation before the FFT. +8. **[[noise-reduction]]** — Kim / MMSE-spectral / LMS-notch noise reduction. +9. **[[synchronous-am-detection]]** — SAM: a PLL recovers the carrier for fade-robust AM. +10. **[[audio-equalizer]]** — 14-band parallel filterbank shaping RX and TX audio. + +Plus CW receive (filter + adaptive Morse decoder) in [[cw-processing]] (a firmware page). + +**Rate independence** cuts across all of these: a filter specified as a *fraction of Fs* is +already correct at any rate, while one specified in *Hz* drifts with the rate unless it is +regenerated. [[runtime-filter-design]] is the page on which stages are which, and why +prewarping the bilinear transform is what makes the difference. + +## How theory maps to firmware + +The implementation lives in [[dsp-chain]] (`DSP.cpp`, `DSP_FFT.cpp`, `DSP_FIR.cpp`, +`DSP_Noise.cpp`, `DSP_CWProcessing.cpp`). The RX entry point is `ReceiveProcessing()` +(`DSP.h:63`); TX is `TransmitProcessing()` (`DSP.h:83`). + +## Heritage note +The FFT-convolution core descends from DD4WH's Teensy Convolution SDR — see +[[code-heritage]]. The AGC notes "taken from wdsp" (`SDT.h:589`), i.e. Warren Pratt NR0V's +DSP library, a common lineage in this community. diff --git a/wiki/theory/tx-carrier-null.md b/wiki/theory/tx-carrier-null.md new file mode 100644 index 0000000..46b3ac4 --- /dev/null +++ b/wiki/theory/tx-carrier-null.md @@ -0,0 +1,58 @@ +--- +title: TX Carrier Null (LO leakage suppression) +type: concept +status: draft +created: 2026-06-09 +updated: 2026-06-09 +tags: [carrier-null, lo-leakage, dc-offset, transmit, calibration] +source_refs: [] +related: ["[[theory-overview]]", "[[iq-imbalance-correction]]", "[[ssb-phasing-method]]", "[[hardware-state-machine]]", "[[rf-board]]", "[[persistent-config]]"] +--- + +# TX Carrier Null (LO leakage suppression) + +On a direct-conversion *transmitter*, a residual **carrier** can leak through at the LO +frequency even when the modulating audio is silent. Phoenix nulls it by injecting a small, +calibrated **DC offset** into the baseband I/Q. This is a **distinct** problem from I/Q image +([[iq-imbalance-correction]]): image = the *opposite sideband* (a conjugate term); carrier = +*LO feedthrough* sitting exactly at the suppressed-carrier frequency. + +## Why a DC offset nulls the carrier *(general DSP)* +After the quadrature mixer, a **constant (DC) component** on the baseband I/Q up-converts to a +tone at exactly the **LO/carrier frequency**. LO leakage and converter DC offsets put an +unwanted DC there. Adding an equal-and-opposite DC offset to I and Q cancels it — so the +transmitted carrier is suppressed. Two knobs (`DCOffsetI`, `DCOffsetQ`) cover both quadrature +axes of the leakage vector. + +## How Phoenix applies it +In the transmit output path, a per-band DC offset is added to the I and Q sample streams just +before they go to the codec (`DSP.cpp:1065-1067`): +```c +arm_offset_q15(sp_L2, ED.DCOffsetI[band], sp_L2, USB_BUFFER_SIZE); // I + offset +arm_offset_q15(sp_R2, ED.DCOffsetQ[band], sp_R2, USB_BUFFER_SIZE); // Q + offset +``` +`ED.DCOffsetI/Q[NUMBER_OF_BANDS]` are int16 per-band values in [[persistent-config]] (default +0). + +## Calibration — `TransmitCarrierCalSm` +The values are found by the transmit-carrier calibration routine +(`HardwareSm_TransmitCarrierCalibration.cpp`, driven by the `TransmitCarrierCalSm` sub-machine +in [[hardware-state-machine]]; state map in [[calibration-state-machines]]). It **sweeps `DCOffsetI` then `DCOffsetQ` to maximize carrier +suppression (dBc)** — the same narrowing coordinate-descent used for I/Q balance +([[iq-imbalance-correction]]): step each offset, measure the residual carrier via the RX path +(`GetTXCarrierVals`), keep the value giving the deepest null (`maxDBC` / `maxDBC_parameter`), +and auto-advance through all bands. Per-band because LO leakage varies with frequency. + +## The three TX calibrations, compared +| Calibration | Corrects | Knob(s) | `ED` field | +|---|---|---|---| +| TX I/Q balance | opposite-sideband **image** | amp + phase | `IQXAmp/XPhaseCorrectionFactor` | +| **TX carrier null** | **LO leakage / carrier** | DC offset I, Q | `DCOffsetI/Q` | +| Power | PA output level | attenuation/gain | `PowerCal_*` | + +All three are orchestrated by [[hardware-state-machine]] and run against the same TX hardware +([[rf-board]]). + +## Open questions +- Units/scale of `DCOffsetI/Q` (raw q15 counts) and the achievable suppression in dBc. +- How the residual carrier is measured during cal (which RX bin / path). diff --git a/wiki/theory/zoom-fft.md b/wiki/theory/zoom-fft.md new file mode 100644 index 0000000..1dc2105 --- /dev/null +++ b/wiki/theory/zoom-fft.md @@ -0,0 +1,99 @@ +--- +title: Zoom FFT (Spectrum Display) +type: concept +status: draft +created: 2026-06-08 +updated: 2026-07-29 +tags: [fft, zoom, spectrum, waterfall, decimation, display, psd, sample-rate] +source_refs: [] +related: ["[[theory-overview]]", "[[fast-convolution-filtering]]", "[[multirate-decimation]]", "[[display-subsystem]]", "[[dsp-chain]]", "[[real-time-constraints]]", "[[sample-rate-switching]]", "[[runtime-filter-design]]"] +--- + +# Zoom FFT (Spectrum Display) + +The main spectrum/waterfall can **zoom** to show a narrower span at finer resolution without +a bigger FFT. The trick: low-pass and decimate the complex baseband *before* the FFT, so the +same 512 bins cover proportionally less bandwidth. Implementation: `ZoomFFTExe()` +(`DSP_FFT.cpp:581`), set up by `ZoomFFTPrep()` (`DSP_FFT.cpp:546`); output goes to the global +`psdnew` array consumed by the [[display-subsystem]]. + +## Two different spectra — don't confuse them +- **Band spectrum / waterfall** — `ZoomFFTExe` → `psdnew`. Computed from the **raw I/Q** + (192 or 176.4 kHz, full RF span), zoomable. *This page.* +- **Audio-passband spectrum** — computed inside `ConvolutionFilter` → `audioYPixel`, at the + audio processing rate (24 kHz / 46.875 Hz per bin at 192 ksps). See + [[fast-convolution-filtering]]. Its displayed axis span is `Fs/32` + (`MainBoard_DisplayHome.cpp:1301-1303`) — 6.0 kHz at 192 ksps, 5.5 kHz at 176.4 ksps. + +They run at different rates and serve different display panes. + +## Why decimate to zoom *(general DSP)* + +A 512-point FFT always produces 512 bins; the bin width is `Fsample/512`. To get *finer* bins +without a larger (slower) FFT, **lower the sample rate** feeding the FFT — but first low-pass +to prevent aliasing ([[multirate-decimation]]). Decimating by `2^zoom` divides both the span +and the bin width by `2^zoom`: you see less of the band, in more detail. + +## Zoom levels (`DSP_FFT.cpp:562-568`, `SDT.h:138-144`) + +`zoom_M = 1 << spectrum_zoom` (`DSP_FFT.cpp:548`): + +| `spectrum_zoom` | `zoom_M` | Effective Fsample | PSD bin width | @176.4 ksps | +|---|---|---|---|---| +| 0 (`ZOOM_1`) | 1 | 192 kHz | **375 Hz** | 344.5 Hz | +| 1 (`ZOOM_2`) | 2 | 96 kHz | 187.5 Hz | 172.3 Hz | +| 2 (`ZOOM_4`) | 4 | 48 kHz | 93.75 Hz | 86.1 Hz | +| 3 (`ZOOM_8`) | 8 | 24 kHz | 46.875 Hz | 43.1 Hz | +| 4 (`ZOOM_16`) | 16 | 12 kHz | 23.4375 Hz | 21.5 Hz | + +Note the base (zoom 1) resolution is **375 Hz/bin** = 192000/512, *not* the 46.875 Hz of the +audio FFT — a common point of confusion since both use a 512-point transform. + +⚠️ **These are Fs-relative, and Fs is now user-selectable** ([[sample-rate-switching]]). The +zoom filters are deliberately *not* regenerated on a rate change, because their corners are +specified as a fraction of Fs and scaling with Fs is correct for anti-alias filtering +([[runtime-filter-design]]). What does change is the numbers in this table — hence the +spectrum's frequency ticks are now positioned via `FreqToBin()` at round frequencies rather +than from a fixed pixel table ([[display-subsystem]]). + +## How it's implemented + +1. **Zoom 1 fast path**: no decimation, `CalcPSD512(I, Q)` directly (`DSP_FFT.cpp:583-586`). +2. **Otherwise**: anti-alias **IIR biquad** low-pass (`biquadZoomI/Q`, 4 stages) then + `decimate_f32` by `zoom_M` (`DSP_FFT.cpp:591-595`). The code notes it deliberately uses an + **IIR** filter, not the FIR decimator used in the audio chain — for a *magnitude* PSD + display, the IIR's non-linear phase doesn't matter, and it's cheaper. Per-zoom cutoff + coefficients come from `mag_coeffs[spectrum_zoom]` (`DSP_FFT.cpp:552`). +3. **Amplitude compensation**: each decimated sample is scaled by + `zoomMultiplierCoeff[spectrum_zoom]` (`DSP_FFT.cpp:604`) to keep PSD amplitude stable as + zoom changes (decimation + filtering otherwise alter the level). +4. **Ring-buffer accumulation for high zoom**: at zoom ≥ 8 a single 2048-sample call yields + `2048/zoom_M < 512` decimated samples, so they are accumulated into `FFT_ring_buffer_x/y` + across multiple calls; the PSD is computed only when 512 have collected + (`DSP_FFT.cpp:605-617`). `ZoomFFTExe` returns `false` on calls where no PSD was produced. + +## Timing interaction +Because high zoom needs several loop passes to fill the ring buffer before a PSD appears, the +**effective spectrum update rate slows with zoom** — directly relevant to the +[[spectrum-refresh-floor]] finding (redraw period ≈ `NCHUNKS × T_loop`, governed by `NCHUNKS` +and the per-frame draw cost, not `SPECTRUM_REFRESH_MS`). See [[real-time-constraints]]. + +## Defaults +Power-on zoom is governed **solely** by `ED.spectrum_zoom`, which defaults to **1** (`ZOOM_2`, +2× → 96 kHz span / 187.5 Hz bins; `SDT.h:274`), unless a saved value is restored from JSON +config (`Storage.cpp:276,501`, `… | ED.spectrum_zoom` fallback). + +`Config.h:78 #define ZOOM 3` is **unrelated** — it is the **front-panel button ID** for the +ZOOM button (button function index 3, under the "Front panel button functions" block, +`Config.h:74-96`), consumed as `case ZOOM:` in the event dispatch (`Loop.cpp:457,818`) where +pressing it does `ED.spectrum_zoom++`. It is not a zoom *level*. So there is no real +discrepancy — the earlier TODO conflated a button identifier with the zoom default. + +## Open questions +- Confirm how `mag_coeffs` cutoffs are chosen per zoom (passband vs. the new Nyquist). +- Exact relationship between `psdnew` bins and on-screen pixels in the [[display-subsystem]]. + +## Resolved +- **`Config.h ZOOM 3` vs `ED.spectrum_zoom = 1`.** Not a conflict: `ZOOM` is a button-ID + macro (`Config.h:74-96`, used in `Loop.cpp:457`), `ED.spectrum_zoom` is the actual zoom + level (default 1 = 2×). Power-on zoom = 1. *(resolved 2026-06-14)*